From 436c868283175913e3b60d5bfdbf4370f14490c0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 5 Feb 2025 06:49:26 +0100 Subject: [PATCH] Adding upstream version 0.3.1. Signed-off-by: Daniel Baumann --- .github/workflows/pythonpublish.yml | 31 +++++++++++++ .gitignore | 2 + CHANGES | 1 + LICENSE | 7 +++ MANIFEST.in | 5 +++ README.md | 52 +++++++++++++++++++++ VERSION | 1 + pyfzf.gif | Bin 0 -> 39207 bytes pyfzf/__init__.py | 6 +++ pyfzf/pyfzf.py | 67 ++++++++++++++++++++++++++++ setup.py | 61 +++++++++++++++++++++++++ 11 files changed, 233 insertions(+) create mode 100644 .github/workflows/pythonpublish.yml create mode 100644 .gitignore create mode 100644 CHANGES create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 README.md create mode 100644 VERSION create mode 100644 pyfzf.gif create mode 100644 pyfzf/__init__.py create mode 100755 pyfzf/pyfzf.py create mode 100755 setup.py diff --git a/.github/workflows/pythonpublish.yml b/.github/workflows/pythonpublish.yml new file mode 100644 index 0000000..d5f3859 --- /dev/null +++ b/.github/workflows/pythonpublish.yml @@ -0,0 +1,31 @@ +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: Upload Python Package + +on: + release: + types: [created] + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v1 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d646835 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +__pycache__/ diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..f10c387 --- /dev/null +++ b/CHANGES @@ -0,0 +1 @@ +2015.11.16: Initial release diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..10c68a5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2015 Nagarjuna Kumarappan + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..bf684b1 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,5 @@ +include VERSION +include README.md +include CHANGES +recursive-include pyfzf * + diff --git a/README.md b/README.md new file mode 100644 index 0000000..3fe0c2a --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +pyfzf +===== + +![](https://img.shields.io/badge/license-MIT-green.svg?style=flat) +![https://pypi.python.org/pypi/pyfzf](https://img.shields.io/pypi/dm/pyfzf.svg?style=flat) + +##### A python wrapper for *junegunn*'s awesome [fzf](https://github.com/junegunn/fzf). + +![](https://raw.githubusercontent.com/nk412/pyfzf/master/pyfzf.gif) + +Requirements +------------ + +* Python 3.6+ +* [fzf](https://github.com/junegunn/fzf) + +*Note*: fzf must be installed and available on PATH. + +Installation +------------ + pip install pyfzf + +Usage +----- + >>> from pyfzf.pyfzf import FzfPrompt + >>> fzf = FzfPrompt() + +If `fzf` is not available on PATH, you can specify a location + + >>> fzf = FzfPrompt('/path/to/fzf') + +Simply pass a list of options to the prompt function to invoke fzf. + + >>> fzf.prompt(range(0,10)) + +You can pass additional arguments to fzf as a second argument + + >>> fzf.prompt(range(0,10), '--multi --cycle') + +Input items are written to a temporary file which is then passed to fzf. +The items are delimited with `\n` by default, you can also change the delimiter +(useful for multiline items) + + >>> fzf.prompt(range(0,10), '--read0', '\0') + +License +------- +MIT + +Thanks +------ +@brookite for adding Windows support in v0.3.0 \ No newline at end of file diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..9e11b32 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.3.1 diff --git a/pyfzf.gif b/pyfzf.gif new file mode 100644 index 0000000000000000000000000000000000000000..a27cf8dc27b905bf573bd2fda9357d0c4c2b315d GIT binary patch literal 39207 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 + +from shutil import which +import os +import tempfile + + +# constants +FZF_URL = "https://github.com/junegunn/fzf" + + +class FzfPrompt: + def __init__(self, executable_path=None): + if executable_path: + self.executable_path = executable_path + elif not which("fzf") and not executable_path: + raise SystemError( + f"Cannot find 'fzf' installed on PATH. ({FZF_URL})") + else: + self.executable_path = "fzf" + + def prompt(self, choices=None, fzf_options="", delimiter='\n'): + # convert lists to strings [ 1, 2, 3 ] => "1\n2\n3" + choices_str = delimiter.join(map(str, choices)) + selection = [] + + with tempfile.NamedTemporaryFile(delete=False) as input_file: + with tempfile.NamedTemporaryFile(delete=False) as output_file: + # Create an temp file with list entries as lines + input_file.write(choices_str.encode('utf-8')) + input_file.flush() + + # Invoke fzf externally and write to output file + os.system( + f"{self.executable_path} {fzf_options} < \"{input_file.name}\" > \"{output_file.name}\"") + + # get selected options + with open(output_file.name, encoding="utf-8") as f: + for line in f: + selection.append(line.strip('\n')) + + os.unlink(input_file.name) + os.unlink(output_file.name) + + return selection diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..da96dee --- /dev/null +++ b/setup.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# coding: utf-8 +# Copyright (c) 2015 Nagarjuna Kumarappan +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Author: Nagarjuna Kumarappan + +import os +from setuptools import setup +from distutils.command.install import INSTALL_SCHEMES + +for scheme in INSTALL_SCHEMES.values(): + scheme['data'] = scheme['purelib'] + +prjdir = os.path.dirname(__file__) + +def read(filename): + return open(os.path.join(prjdir, filename)).read() + +LONG_DESC = read('README.md') + '\nCHANGES\n=======\n\n' + read('CHANGES') + +setup(name='pyfzf', + include_package_data=True, + version=read('VERSION').strip('\n'), + description="Python wrapper for junegunn's fuzzyfinder (fzf)", + long_description=LONG_DESC, + author='Nagarjuna Kumarappan', + license='MIT', + author_email='nagarjuna.412@gmail.com', + url='https://github.com/nk412/pyfzf', + install_requires=[], + py_modules=['pyfzf'], + packages=['pyfzf'], + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Topic :: Terminals' + ] + ) +