mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 05:11:16 +00:00
Bug 1713377
: Change vendoring to use wheels where possible r=ahal,glandium
Vendoring wheels has three benefits: * There's far less files, so Firefox checkouts will be smaller. * It works around `zipp` not allowing `pip install` from extracted source `tar.gz` files. Now, we should be able to use the pip resolver against vendored packages, which will be needed for future mach virtualenv work. * `./mach vendor python` takes far less time to execute. Since we need the raw Python to be available to add to the `sys.path`, we extract the wheels before putting them in tree. Due to the structure of some wheels being less nested than of a source `tar.gz`, `common_virtualenv_packages` needed to be adjusted accordingly. `install_pip_package()` had to be tweaked as well since you can't `pip install` an extracted wheel. So, we "re-bundle" the wheel before installing from a vendored package. Replace python packages with wheels where possible This contains the vendoring changes caused by the last patch. For reviewing, there's a couple things to note: * A bunch of files are deleted, since there's generally less files in a wheel than in a source archive. * There's a new `.dist-info` directory for each extracted wheel, so expect roughly 5 or 6 new files for each wheel'd package. * There should be no source code changes other than moves from package names changing from having `-` to having `_`. Differential Revision: https://phabricator.services.mozilla.com/D116512
This commit is contained in:
parent
859e2bdc3d
commit
6d154c1ed3
@ -39,18 +39,18 @@ mozilla.pth:testing/web-platform/tests/tools/wptrunner
|
||||
mozilla.pth:testing/xpcshell
|
||||
mozilla.pth:third_party/python/appdirs
|
||||
mozilla.pth:third_party/python/atomicwrites
|
||||
mozilla.pth:third_party/python/attrs/src
|
||||
mozilla.pth:third_party/python/attrs
|
||||
mozilla.pth:third_party/python/blessings
|
||||
mozilla.pth:third_party/python/cbor2
|
||||
mozilla.pth:third_party/python/chardet
|
||||
mozilla.pth:third_party/python/Click
|
||||
mozilla.pth:third_party/python/compare-locales
|
||||
mozilla.pth:third_party/python/compare_locales
|
||||
mozilla.pth:third_party/python/cookies
|
||||
mozilla.pth:third_party/python/cram
|
||||
mozilla.pth:third_party/python/diskcache
|
||||
mozilla.pth:third_party/python/distro
|
||||
mozilla.pth:third_party/python/dlmanager
|
||||
mozilla.pth:third_party/python/ecdsa/src
|
||||
mozilla.pth:third_party/python/ecdsa
|
||||
mozilla.pth:third_party/python/esprima
|
||||
mozilla.pth:third_party/python/fluent.migrate
|
||||
mozilla.pth:third_party/python/fluent.syntax
|
||||
@ -59,14 +59,14 @@ mozilla.pth:third_party/python/gyp/pylib
|
||||
mozilla.pth:third_party/python/idna
|
||||
mozilla.pth:third_party/python/importlib_metadata
|
||||
mozilla.pth:third_party/python/iso8601
|
||||
mozilla.pth:third_party/python/Jinja2/src
|
||||
mozilla.pth:third_party/python/Jinja2
|
||||
mozilla.pth:third_party/python/jsmin
|
||||
mozilla.pth:third_party/python/json-e
|
||||
mozilla.pth:third_party/python/jsonschema
|
||||
mozilla.pth:third_party/python/MarkupSafe/src
|
||||
mozilla.pth:third_party/python/mohawk
|
||||
mozilla.pth:third_party/python/more-itertools
|
||||
mozilla.pth:third_party/python/mozilla-version
|
||||
mozilla.pth:third_party/python/more_itertools
|
||||
mozilla.pth:third_party/python/mozilla_version
|
||||
mozilla.pth:third_party/python/pathspec
|
||||
mozilla.pth:third_party/python/pep487/lib
|
||||
mozilla.pth:third_party/python/pluggy
|
||||
@ -77,7 +77,7 @@ mozilla.pth:third_party/python/pyasn1-modules
|
||||
mozilla.pth:third_party/python/pylru
|
||||
mozilla.pth:third_party/python/pyrsistent
|
||||
mozilla.pth:third_party/python/pystache
|
||||
mozilla.pth:third_party/python/pytest/src
|
||||
mozilla.pth:third_party/python/pytest
|
||||
mozilla.pth:third_party/python/python-hglib
|
||||
mozilla.pth:third_party/python/pytoml
|
||||
mozilla.pth:third_party/python/PyYAML/lib3/
|
||||
@ -86,13 +86,13 @@ mozilla.pth:third_party/python/requests
|
||||
mozilla.pth:third_party/python/requests-unixsocket
|
||||
mozilla.pth:third_party/python/responses
|
||||
mozilla.pth:third_party/python/rsa
|
||||
mozilla.pth:third_party/python/sentry-sdk
|
||||
mozilla.pth:third_party/python/sentry_sdk
|
||||
mozilla.pth:third_party/python/six
|
||||
mozilla.pth:third_party/python/slugid
|
||||
mozilla.pth:third_party/python/taskcluster
|
||||
mozilla.pth:third_party/python/taskcluster-urls
|
||||
mozilla.pth:third_party/python/typing_extensions/src_py3
|
||||
mozilla.pth:third_party/python/urllib3/src
|
||||
mozilla.pth:third_party/python/typing_extensions
|
||||
mozilla.pth:third_party/python/urllib3
|
||||
mozilla.pth:third_party/python/voluptuous
|
||||
mozilla.pth:third_party/python/yamllint
|
||||
mozilla.pth:third_party/python/zipp
|
||||
|
56
python/mozbuild/mozbuild/vendor/vendor_python.py
vendored
56
python/mozbuild/mozbuild/vendor/vendor_python.py
vendored
@ -26,7 +26,7 @@ class VendorPython(MozbuildObject):
|
||||
pip_compile = os.path.join(self.virtualenv_manager.bin_path, "pip-compile")
|
||||
if not os.path.exists(pip_compile):
|
||||
path = os.path.normpath(
|
||||
os.path.join(self.topsrcdir, "third_party", "python", "pip-tools")
|
||||
os.path.join(self.topsrcdir, "third_party", "python", "pip_tools")
|
||||
)
|
||||
self.virtualenv_manager.install_pip_package(path, vendored=True)
|
||||
spec = os.path.join(vendor_dir, "requirements.in")
|
||||
@ -64,8 +64,10 @@ class VendorPython(MozbuildObject):
|
||||
"--no-deps",
|
||||
"--dest",
|
||||
tmp,
|
||||
"--no-binary",
|
||||
":all:",
|
||||
"--abi",
|
||||
"none",
|
||||
"--platform",
|
||||
"any",
|
||||
]
|
||||
)
|
||||
self._extract(tmp, vendor_dir, keep_extra_files)
|
||||
@ -99,16 +101,46 @@ class VendorPython(MozbuildObject):
|
||||
if not keep_extra_files:
|
||||
ignore = ("*/doc", "*/docs", "*/test", "*/tests")
|
||||
finder = FileFinder(src)
|
||||
for path, _ in finder.find("*"):
|
||||
base, ext = os.path.splitext(path)
|
||||
# packages extract into package-version directory name and we strip the version
|
||||
tld = mozfile.extract(os.path.join(finder.base, path), dest, ignore=ignore)[
|
||||
0
|
||||
]
|
||||
target = os.path.join(dest, tld.rpartition("-")[0])
|
||||
mozfile.remove(target) # remove existing version of vendored package
|
||||
mozfile.move(tld, target)
|
||||
for archive, _ in finder.find("*"):
|
||||
_, ext = os.path.splitext(archive)
|
||||
archive_path = os.path.join(finder.base, archive)
|
||||
if ext == ".whl":
|
||||
# Archive is named like "$package-name-1.0-py2.py3-none-any.whl", and should
|
||||
# have four dashes that aren't part of the package name.
|
||||
package_name, version, spec, abi, platform_and_suffix = archive.rsplit(
|
||||
"-", 4
|
||||
)
|
||||
target_package_dir = os.path.join(dest, package_name)
|
||||
mozfile.remove(target_package_dir)
|
||||
os.mkdir(target_package_dir)
|
||||
|
||||
# Extract all the contents of the wheel into the package subdirectory.
|
||||
# We're expecting at least a code directory and a ".dist-info" directory,
|
||||
# though there may be a ".data" directory as well.
|
||||
mozfile.extract(archive_path, target_package_dir, ignore=ignore)
|
||||
_denormalize_symlinks(target_package_dir)
|
||||
else:
|
||||
# Archive is named like "$package-name-1.0.tar.gz", and the rightmost
|
||||
# dash should separate the package name from the rest of the archive
|
||||
# specifier.
|
||||
package_name, archive_postfix = archive.rsplit("-", 1)
|
||||
package_dir = os.path.join(dest, package_name)
|
||||
mozfile.remove(package_dir)
|
||||
|
||||
# The archive should only contain one top-level directory, which has
|
||||
# the source files. We extract this directory directly to
|
||||
# the vendor directory.
|
||||
extracted_files = mozfile.extract(archive_path, dest, ignore=ignore)
|
||||
assert len(extracted_files) == 1
|
||||
extracted_package_dir = extracted_files[0]
|
||||
|
||||
# The extracted package dir includes the version in the name,
|
||||
# which we don't we don't want.
|
||||
mozfile.move(extracted_package_dir, package_dir)
|
||||
_denormalize_symlinks(package_dir)
|
||||
|
||||
|
||||
def _denormalize_symlinks(target):
|
||||
# If any files inside the vendored package were symlinks, turn them into normal files
|
||||
# because hg.mozilla.org forbids symlinks in the repository.
|
||||
link_finder = FileFinder(target)
|
||||
|
@ -494,6 +494,9 @@ class VirtualenvManager(VirtualenvHelper):
|
||||
If vendored is True, no package index will be used and no dependencies
|
||||
will be installed.
|
||||
"""
|
||||
import mozfile
|
||||
from mozfile import TemporaryDirectory
|
||||
|
||||
if sys.executable.startswith(self.bin_path):
|
||||
# If we're already running in this interpreter, we can optimize in
|
||||
# the case that the package requirement is already satisfied.
|
||||
@ -504,7 +507,8 @@ class VirtualenvManager(VirtualenvHelper):
|
||||
if req.satisfied_by is not None:
|
||||
return
|
||||
|
||||
args = ["install", package]
|
||||
args = ["install"]
|
||||
vendored_dist_info_dir = None
|
||||
|
||||
if vendored:
|
||||
args.extend(
|
||||
@ -523,7 +527,22 @@ class VirtualenvManager(VirtualenvHelper):
|
||||
"--no-build-isolation",
|
||||
]
|
||||
)
|
||||
vendored_dist_info_dir = next(
|
||||
(d for d in os.listdir(package) if d.endswith(".dist-info")), None
|
||||
)
|
||||
|
||||
with TemporaryDirectory() as tmp:
|
||||
if vendored_dist_info_dir:
|
||||
# This is a vendored wheel. We have to re-pack it in order for pip
|
||||
# to install it.
|
||||
wheel_file = os.path.join(
|
||||
tmp, "{}-1.0-py3-none-any.whl".format(os.path.basename(package))
|
||||
)
|
||||
shutil.make_archive(wheel_file, "zip", package)
|
||||
mozfile.move("{}.zip".format(wheel_file), wheel_file)
|
||||
package = wheel_file
|
||||
|
||||
args.append(package)
|
||||
return self._run_pip(args)
|
||||
|
||||
def install_pip_requirements(
|
||||
|
635
third_party/python/Click/CHANGES.rst
vendored
635
third_party/python/Click/CHANGES.rst
vendored
@ -1,635 +0,0 @@
|
||||
Click Changelog
|
||||
===============
|
||||
|
||||
|
||||
Version 7.0
|
||||
-----------
|
||||
|
||||
Released 2018-09-25
|
||||
|
||||
- Drop support for Python 2.6 and 3.3. (`#967`_, `#976`_)
|
||||
- Wrap ``click.Choice``'s missing message. (`#202`_, `#1000`_)
|
||||
- Add native ZSH autocompletion support. (`#323`_, `#865`_)
|
||||
- Document that ANSI color info isn't parsed from bytearrays in
|
||||
Python 2. (`#334`_)
|
||||
- Document byte-stripping behavior of ``CliRunner``. (`#334`_,
|
||||
`#1010`_)
|
||||
- Usage errors now hint at the ``--help`` option. (`#393`_, `#557`_)
|
||||
- Implement streaming pager. (`#409`_, `#889`_)
|
||||
- Extract bar formatting to its own method. (`#414`_)
|
||||
- Add ``DateTime`` type for converting input in given date time
|
||||
formats. (`#423`_)
|
||||
- ``secho``'s first argument can now be ``None``, like in ``echo``.
|
||||
(`#424`_)
|
||||
- Fixes a ``ZeroDivisionError`` in ``ProgressBar.make_step``, when the
|
||||
arg passed to the first call of ``ProgressBar.update`` is 0.
|
||||
(`#447`_, `#1012`_)
|
||||
- Show progressbar only if total execution time is visible. (`#487`_)
|
||||
- Added the ability to hide commands and options from help. (`#500`_)
|
||||
- Document that options can be ``required=True``. (`#514`_, `#1022`_)
|
||||
- Non-standalone calls to ``Context.exit`` return the exit code,
|
||||
rather than calling ``sys.exit``. (`#533`_, `#667`_, `#1098`_)
|
||||
- ``click.getchar()`` returns Unicode in Python 3 on Windows,
|
||||
consistent with other platforms. (`#537`_, `#821`_, `#822`_,
|
||||
`#1088`_, `#1108`_)
|
||||
- Added ``FloatRange`` type. (`#538`_, `#553`_)
|
||||
- Added support for bash completion of ``type=click.Choice`` for
|
||||
``Options`` and ``Arguments``. (`#535`_, `#681`_)
|
||||
- Only allow one positional arg for ``Argument`` parameter
|
||||
declaration. (`#568`_, `#574`_, `#1014`_)
|
||||
- Add ``case_sensitive=False`` as an option to Choice. (`#569`_)
|
||||
- ``click.getchar()`` correctly raises ``KeyboardInterrupt`` on "^C"
|
||||
and ``EOFError`` on "^D" on Linux. (`#583`_, `#1115`_)
|
||||
- Fix encoding issue with ``click.getchar(echo=True)`` on Linux.
|
||||
(`#1115`_)
|
||||
- ``param_hint`` in errors now derived from param itself. (`#598`_,
|
||||
`#704`_, `#709`_)
|
||||
- Add a test that ensures that when an argument is formatted into a
|
||||
usage error, its metavar is used, not its name. (`#612`_)
|
||||
- Allow setting ``prog_name`` as extra in ``CliRunner.invoke``.
|
||||
(`#616`_, `#999`_)
|
||||
- Help text taken from docstrings truncates at the ``\f`` form feed
|
||||
character, useful for hiding Sphinx-style parameter documentation.
|
||||
(`#629`_, `#1091`_)
|
||||
- ``launch`` now works properly under Cygwin. (`#650`_)
|
||||
- Update progress after iteration. (`#651`_, `#706`_)
|
||||
- ``CliRunner.invoke`` now may receive ``args`` as a string
|
||||
representing a Unix shell command. (`#664`_)
|
||||
- Make ``Argument.make_metavar()`` default to type metavar. (`#675`_)
|
||||
- Add documentation for ``ignore_unknown_options``. (`#684`_)
|
||||
- Add bright colors support for ``click.style`` and fix the reset
|
||||
option for parameters ``fg`` and ``bg``. (`#703`_, `#809`_)
|
||||
- Add ``show_envvar`` for showing environment variables in help.
|
||||
(`#710`_)
|
||||
- Avoid ``BrokenPipeError`` during interpreter shutdown when stdout or
|
||||
stderr is a closed pipe. (`#712`_, `#1106`_)
|
||||
- Document customizing option names. (`#725`_, `#1016`_)
|
||||
- Disable ``sys._getframes()`` on Python interpreters that don't
|
||||
support it. (`#728`_)
|
||||
- Fix bug in test runner when calling ``sys.exit`` with ``None``.
|
||||
(`#739`_)
|
||||
- Clarify documentation on command line options. (`#741`_, `#1003`_)
|
||||
- Fix crash on Windows console. (`#744`_)
|
||||
- Fix bug that caused bash completion to give improper completions on
|
||||
chained commands. (`#754`_, `#774`_)
|
||||
- Added support for dynamic bash completion from a user-supplied
|
||||
callback. (`#755`_)
|
||||
- Added support for bash completions containing spaces. (`#773`_)
|
||||
- Allow autocompletion function to determine whether or not to return
|
||||
completions that start with the incomplete argument. (`#790`_,
|
||||
`#806`_)
|
||||
- Fix option naming routine to match documentation and be
|
||||
deterministic. (`#793`_, `#794`_)
|
||||
- Fix path validation bug. (`#795`_, `#1020`_)
|
||||
- Add test and documentation for ``Option`` naming: functionality.
|
||||
(`#799`_)
|
||||
- Update doc to match arg name for ``path_type``. (`#801`_)
|
||||
- Raw strings added so correct escaping occurs. (`#807`_)
|
||||
- Fix 16k character limit of ``click.echo`` on Windows. (`#816`_,
|
||||
`#819`_)
|
||||
- Overcome 64k character limit when writing to binary stream on
|
||||
Windows 7. (`#825`_, `#830`_)
|
||||
- Add bool conversion for "t" and "f". (`#842`_)
|
||||
- ``NoSuchOption`` errors take ``ctx`` so that ``--help`` hint gets
|
||||
printed in error output. (`#860`_)
|
||||
- Fixed the behavior of Click error messages with regards to Unicode
|
||||
on 2.x and 3.x. Message is now always Unicode and the str and
|
||||
Unicode special methods work as you expect on that platform.
|
||||
(`#862`_)
|
||||
- Progress bar now uses stderr by default. (`#863`_)
|
||||
- Add support for auto-completion documentation. (`#866`_, `#869`_)
|
||||
- Allow ``CliRunner`` to separate stdout and stderr. (`#868`_)
|
||||
- Fix variable precedence. (`#873`_, `#874`_)
|
||||
- Fix invalid escape sequences. (`#877`_)
|
||||
- Fix ``ResourceWarning`` that occurs during some tests. (`#878`_)
|
||||
- When detecting a misconfigured locale, don't fail if the ``locale``
|
||||
command fails. (`#880`_)
|
||||
- Add ``case_sensitive=False`` as an option to ``Choice`` types.
|
||||
(`#887`_)
|
||||
- Force stdout/stderr writable. This works around issues with badly
|
||||
patched standard streams like those from Jupyter. (`#918`_)
|
||||
- Fix completion of subcommand options after last argument (`#919`_,
|
||||
`#930`_)
|
||||
- ``_AtomicFile`` now uses the ``realpath`` of the original filename
|
||||
so that changing the working directory does not affect it.
|
||||
(`#920`_)
|
||||
- Fix incorrect completions when defaults are present (`#925`_,
|
||||
`#930`_)
|
||||
- Add copy option attrs so that custom classes can be re-used.
|
||||
(`#926`_, `#994`_)
|
||||
- "x" and "a" file modes now use stdout when file is ``"-"``.
|
||||
(`#929`_)
|
||||
- Fix missing comma in ``__all__`` list. (`#935`_)
|
||||
- Clarify how parameters are named. (`#949`_, `#1009`_)
|
||||
- Stdout is now automatically set to non blocking. (`#954`_)
|
||||
- Do not set options twice. (`#962`_)
|
||||
- Move ``fcntl`` import. (`#965`_)
|
||||
- Fix Google App Engine ``ImportError``. (`#995`_)
|
||||
- Better handling of help text for dynamic default option values.
|
||||
(`#996`_)
|
||||
- Fix ``get_winter_size()`` so it correctly returns ``(0,0)``.
|
||||
(`#997`_)
|
||||
- Add test case checking for custom param type. (`#1001`_)
|
||||
- Allow short width to address cmd formatting. (`#1002`_)
|
||||
- Add details about Python version support. (`#1004`_)
|
||||
- Added deprecation flag to commands. (`#1005`_)
|
||||
- Fixed issues where ``fd`` was undefined. (`#1007`_)
|
||||
- Fix formatting for short help. (`#1008`_)
|
||||
- Document how ``auto_envvar_prefix`` works with command groups.
|
||||
(`#1011`_)
|
||||
- Don't add newlines by default for progress bars. (`#1013`_)
|
||||
- Use Python sorting order for ZSH completions. (`#1047`_, `#1059`_)
|
||||
- Document that parameter names are converted to lowercase by default.
|
||||
(`#1055`_)
|
||||
- Subcommands that are named by the function now automatically have
|
||||
the underscore replaced with a dash. If you register a function
|
||||
named ``my_command`` it becomes ``my-command`` in the command line
|
||||
interface.
|
||||
- Hide hidden commands and options from completion. (`#1058`_,
|
||||
`#1061`_)
|
||||
- Fix absolute import blocking Click from being vendored into a
|
||||
project on Windows. (`#1068`_, `#1069`_)
|
||||
- Fix issue where a lowercase ``auto_envvar_prefix`` would not be
|
||||
converted to uppercase. (`#1105`_)
|
||||
|
||||
.. _#202: https://github.com/pallets/click/issues/202
|
||||
.. _#323: https://github.com/pallets/click/issues/323
|
||||
.. _#334: https://github.com/pallets/click/issues/334
|
||||
.. _#393: https://github.com/pallets/click/issues/393
|
||||
.. _#409: https://github.com/pallets/click/issues/409
|
||||
.. _#414: https://github.com/pallets/click/pull/414
|
||||
.. _#423: https://github.com/pallets/click/pull/423
|
||||
.. _#424: https://github.com/pallets/click/pull/424
|
||||
.. _#447: https://github.com/pallets/click/issues/447
|
||||
.. _#487: https://github.com/pallets/click/pull/487
|
||||
.. _#500: https://github.com/pallets/click/pull/500
|
||||
.. _#514: https://github.com/pallets/click/issues/514
|
||||
.. _#533: https://github.com/pallets/click/pull/533
|
||||
.. _#535: https://github.com/pallets/click/issues/535
|
||||
.. _#537: https://github.com/pallets/click/issues/537
|
||||
.. _#538: https://github.com/pallets/click/pull/538
|
||||
.. _#553: https://github.com/pallets/click/pull/553
|
||||
.. _#557: https://github.com/pallets/click/pull/557
|
||||
.. _#568: https://github.com/pallets/click/issues/568
|
||||
.. _#569: https://github.com/pallets/click/issues/569
|
||||
.. _#574: https://github.com/pallets/click/issues/574
|
||||
.. _#583: https://github.com/pallets/click/issues/583
|
||||
.. _#598: https://github.com/pallets/click/issues/598
|
||||
.. _#612: https://github.com/pallets/click/pull/612
|
||||
.. _#616: https://github.com/pallets/click/issues/616
|
||||
.. _#629: https://github.com/pallets/click/pull/629
|
||||
.. _#650: https://github.com/pallets/click/pull/650
|
||||
.. _#651: https://github.com/pallets/click/issues/651
|
||||
.. _#664: https://github.com/pallets/click/pull/664
|
||||
.. _#667: https://github.com/pallets/click/issues/667
|
||||
.. _#675: https://github.com/pallets/click/pull/675
|
||||
.. _#681: https://github.com/pallets/click/pull/681
|
||||
.. _#684: https://github.com/pallets/click/pull/684
|
||||
.. _#703: https://github.com/pallets/click/issues/703
|
||||
.. _#704: https://github.com/pallets/click/issues/704
|
||||
.. _#706: https://github.com/pallets/click/pull/706
|
||||
.. _#709: https://github.com/pallets/click/pull/709
|
||||
.. _#710: https://github.com/pallets/click/pull/710
|
||||
.. _#712: https://github.com/pallets/click/pull/712
|
||||
.. _#719: https://github.com/pallets/click/issues/719
|
||||
.. _#725: https://github.com/pallets/click/issues/725
|
||||
.. _#728: https://github.com/pallets/click/pull/728
|
||||
.. _#739: https://github.com/pallets/click/pull/739
|
||||
.. _#741: https://github.com/pallets/click/issues/741
|
||||
.. _#744: https://github.com/pallets/click/issues/744
|
||||
.. _#754: https://github.com/pallets/click/issues/754
|
||||
.. _#755: https://github.com/pallets/click/pull/755
|
||||
.. _#773: https://github.com/pallets/click/pull/773
|
||||
.. _#774: https://github.com/pallets/click/pull/774
|
||||
.. _#790: https://github.com/pallets/click/issues/790
|
||||
.. _#793: https://github.com/pallets/click/issues/793
|
||||
.. _#794: https://github.com/pallets/click/pull/794
|
||||
.. _#795: https://github.com/pallets/click/issues/795
|
||||
.. _#799: https://github.com/pallets/click/pull/799
|
||||
.. _#801: https://github.com/pallets/click/pull/801
|
||||
.. _#806: https://github.com/pallets/click/pull/806
|
||||
.. _#807: https://github.com/pallets/click/pull/807
|
||||
.. _#809: https://github.com/pallets/click/pull/809
|
||||
.. _#816: https://github.com/pallets/click/pull/816
|
||||
.. _#819: https://github.com/pallets/click/pull/819
|
||||
.. _#821: https://github.com/pallets/click/issues/821
|
||||
.. _#822: https://github.com/pallets/click/issues/822
|
||||
.. _#825: https://github.com/pallets/click/issues/825
|
||||
.. _#830: https://github.com/pallets/click/pull/830
|
||||
.. _#842: https://github.com/pallets/click/pull/842
|
||||
.. _#860: https://github.com/pallets/click/issues/860
|
||||
.. _#862: https://github.com/pallets/click/issues/862
|
||||
.. _#863: https://github.com/pallets/click/pull/863
|
||||
.. _#865: https://github.com/pallets/click/pull/865
|
||||
.. _#866: https://github.com/pallets/click/issues/866
|
||||
.. _#868: https://github.com/pallets/click/pull/868
|
||||
.. _#869: https://github.com/pallets/click/pull/869
|
||||
.. _#873: https://github.com/pallets/click/issues/873
|
||||
.. _#874: https://github.com/pallets/click/pull/874
|
||||
.. _#877: https://github.com/pallets/click/pull/877
|
||||
.. _#878: https://github.com/pallets/click/pull/878
|
||||
.. _#880: https://github.com/pallets/click/pull/880
|
||||
.. _#883: https://github.com/pallets/click/pull/883
|
||||
.. _#887: https://github.com/pallets/click/pull/887
|
||||
.. _#889: https://github.com/pallets/click/pull/889
|
||||
.. _#918: https://github.com/pallets/click/pull/918
|
||||
.. _#919: https://github.com/pallets/click/issues/919
|
||||
.. _#920: https://github.com/pallets/click/pull/920
|
||||
.. _#925: https://github.com/pallets/click/issues/925
|
||||
.. _#926: https://github.com/pallets/click/issues/926
|
||||
.. _#929: https://github.com/pallets/click/pull/929
|
||||
.. _#930: https://github.com/pallets/click/pull/930
|
||||
.. _#935: https://github.com/pallets/click/pull/935
|
||||
.. _#949: https://github.com/pallets/click/issues/949
|
||||
.. _#954: https://github.com/pallets/click/pull/954
|
||||
.. _#962: https://github.com/pallets/click/pull/962
|
||||
.. _#965: https://github.com/pallets/click/pull/965
|
||||
.. _#967: https://github.com/pallets/click/pull/967
|
||||
.. _#976: https://github.com/pallets/click/pull/976
|
||||
.. _#990: https://github.com/pallets/click/pull/990
|
||||
.. _#991: https://github.com/pallets/click/pull/991
|
||||
.. _#993: https://github.com/pallets/click/pull/993
|
||||
.. _#994: https://github.com/pallets/click/pull/994
|
||||
.. _#995: https://github.com/pallets/click/pull/995
|
||||
.. _#996: https://github.com/pallets/click/pull/996
|
||||
.. _#997: https://github.com/pallets/click/pull/997
|
||||
.. _#999: https://github.com/pallets/click/pull/999
|
||||
.. _#1000: https://github.com/pallets/click/pull/1000
|
||||
.. _#1001: https://github.com/pallets/click/pull/1001
|
||||
.. _#1002: https://github.com/pallets/click/pull/1002
|
||||
.. _#1003: https://github.com/pallets/click/pull/1003
|
||||
.. _#1004: https://github.com/pallets/click/pull/1004
|
||||
.. _#1005: https://github.com/pallets/click/pull/1005
|
||||
.. _#1007: https://github.com/pallets/click/pull/1007
|
||||
.. _#1008: https://github.com/pallets/click/pull/1008
|
||||
.. _#1009: https://github.com/pallets/click/pull/1009
|
||||
.. _#1010: https://github.com/pallets/click/pull/1010
|
||||
.. _#1011: https://github.com/pallets/click/pull/1011
|
||||
.. _#1012: https://github.com/pallets/click/pull/1012
|
||||
.. _#1013: https://github.com/pallets/click/pull/1013
|
||||
.. _#1014: https://github.com/pallets/click/pull/1014
|
||||
.. _#1016: https://github.com/pallets/click/pull/1016
|
||||
.. _#1020: https://github.com/pallets/click/pull/1020
|
||||
.. _#1022: https://github.com/pallets/click/pull/1022
|
||||
.. _#1027: https://github.com/pallets/click/pull/1027
|
||||
.. _#1047: https://github.com/pallets/click/pull/1047
|
||||
.. _#1055: https://github.com/pallets/click/pull/1055
|
||||
.. _#1058: https://github.com/pallets/click/pull/1058
|
||||
.. _#1059: https://github.com/pallets/click/pull/1059
|
||||
.. _#1061: https://github.com/pallets/click/pull/1061
|
||||
.. _#1068: https://github.com/pallets/click/issues/1068
|
||||
.. _#1069: https://github.com/pallets/click/pull/1069
|
||||
.. _#1088: https://github.com/pallets/click/issues/1088
|
||||
.. _#1091: https://github.com/pallets/click/pull/1091
|
||||
.. _#1098: https://github.com/pallets/click/pull/1098
|
||||
.. _#1105: https://github.com/pallets/click/pull/1105
|
||||
.. _#1106: https://github.com/pallets/click/pull/1106
|
||||
.. _#1108: https://github.com/pallets/click/pull/1108
|
||||
.. _#1115: https://github.com/pallets/click/pull/1115
|
||||
|
||||
|
||||
Version 6.7
|
||||
-----------
|
||||
|
||||
(bugfix release; released on January 6th 2017)
|
||||
|
||||
- Make ``click.progressbar`` work with ``codecs.open`` files. See #637.
|
||||
- Fix bug in bash completion with nested subcommands. See #639.
|
||||
- Fix test runner not saving caller env correctly. See #644.
|
||||
- Fix handling of SIGPIPE. See #626
|
||||
- Deal with broken Windows environments such as Google App Engine's. See #711.
|
||||
|
||||
Version 6.6
|
||||
-----------
|
||||
|
||||
(bugfix release; released on April 4th 2016)
|
||||
|
||||
- Fix bug in ``click.Path`` where it would crash when passed a ``-``. See #551.
|
||||
|
||||
Version 6.4
|
||||
-----------
|
||||
|
||||
(bugfix release; released on March 24th 2016)
|
||||
|
||||
- Fix bug in bash completion where click would discard one or more trailing
|
||||
arguments. See #471.
|
||||
|
||||
Version 6.3
|
||||
-----------
|
||||
|
||||
(bugfix release; released on February 22 2016)
|
||||
|
||||
- Fix argument checks for interpreter invoke with ``-m`` and ``-c``
|
||||
on Windows.
|
||||
- Fixed a bug that cased locale detection to error out on Python 3.
|
||||
|
||||
Version 6.2
|
||||
-----------
|
||||
|
||||
(bugfix release, released on November 27th 2015)
|
||||
|
||||
- Correct fix for hidden progress bars.
|
||||
|
||||
Version 6.1
|
||||
-----------
|
||||
|
||||
(bugfix release, released on November 27th 2015)
|
||||
|
||||
- Resolved an issue with invisible progress bars no longer rendering.
|
||||
- Disable chain commands with subcommands as they were inherently broken.
|
||||
- Fix ``MissingParameter`` not working without parameters passed.
|
||||
|
||||
Version 6.0
|
||||
-----------
|
||||
|
||||
(codename "pow pow", released on November 24th 2015)
|
||||
|
||||
- Optimized the progressbar rendering to not render when it did not
|
||||
actually change.
|
||||
- Explicitly disallow ``nargs=-1`` with a set default.
|
||||
- The context is now closed before it's popped from the stack.
|
||||
- Added support for short aliases for the false flag on toggles.
|
||||
- Click will now attempt to aid you with debugging locale errors
|
||||
better by listing with the help of the OS what locales are
|
||||
available.
|
||||
- Click used to return byte strings on Python 2 in some unit-testing
|
||||
situations. This has been fixed to correctly return unicode strings
|
||||
now.
|
||||
- For Windows users on Python 2, Click will now handle Unicode more
|
||||
correctly handle Unicode coming in from the system. This also has
|
||||
the disappointing side effect that filenames will now be always
|
||||
unicode by default in the ``Path`` type which means that this can
|
||||
introduce small bugs for code not aware of this.
|
||||
- Added a ``type`` parameter to ``Path`` to force a specific string type
|
||||
on the value.
|
||||
- For users running Python on Windows the ``echo`` and ``prompt`` functions
|
||||
now work with full unicode functionality in the Python windows console
|
||||
by emulating an output stream. This also applies to getting the
|
||||
virtual output and input streams via ``click.get_text_stream(...)``.
|
||||
- Unittests now always force a certain virtual terminal width.
|
||||
- Added support for allowing dashes to indicate standard streams to the
|
||||
``Path`` type.
|
||||
- Multi commands in chain mode no longer propagate arguments left over
|
||||
from parsing to the callbacks. It's also now disallowed through an
|
||||
exception when optional arguments are attached to multi commands if chain
|
||||
mode is enabled.
|
||||
- Relaxed restriction that disallowed chained commands to have other
|
||||
chained commands as child commands.
|
||||
- Arguments with positive nargs can now have defaults implemented.
|
||||
Previously this configuration would often result in slightly unexpected
|
||||
values be returned.
|
||||
|
||||
Version 5.1
|
||||
-----------
|
||||
|
||||
(bugfix release, released on 17th August 2015)
|
||||
|
||||
- Fix a bug in ``pass_obj`` that would accidentally pass the context too.
|
||||
|
||||
Version 5.0
|
||||
-----------
|
||||
|
||||
(codename "tok tok", released on 16th August 2015)
|
||||
|
||||
- Removed various deprecated functionality.
|
||||
- Atomic files now only accept the ``w`` mode.
|
||||
- Change the usage part of help output for very long commands to wrap
|
||||
their arguments onto the next line, indented by 4 spaces.
|
||||
- Fix a bug where return code and error messages were incorrect when
|
||||
using ``CliRunner``.
|
||||
- added ``get_current_context``.
|
||||
- added a ``meta`` dictionary to the context which is shared across the
|
||||
linked list of contexts to allow click utilities to place state there.
|
||||
- introduced ``Context.scope``.
|
||||
- The ``echo`` function is now threadsafe: It calls the ``write`` method of the
|
||||
underlying object only once.
|
||||
- ``prompt(hide_input=True)`` now prints a newline on ``^C``.
|
||||
- Click will now warn if users are using ``unicode_literals``.
|
||||
- Click will now ignore the ``PAGER`` environment variable if it is empty or
|
||||
contains only whitespace.
|
||||
- The ``click-contrib`` GitHub organization was created.
|
||||
|
||||
Version 4.1
|
||||
-----------
|
||||
|
||||
(bugfix release, released on July 14th 2015)
|
||||
|
||||
- Fix a bug where error messages would include a trailing ``None`` string.
|
||||
- Fix a bug where Click would crash on docstrings with trailing newlines.
|
||||
- Support streams with encoding set to ``None`` on Python 3 by barfing with
|
||||
a better error.
|
||||
- Handle ^C in less-pager properly.
|
||||
- Handle return value of ``None`` from ``sys.getfilesystemencoding``
|
||||
- Fix crash when writing to unicode files with ``click.echo``.
|
||||
- Fix type inference with multiple options.
|
||||
|
||||
Version 4.0
|
||||
-----------
|
||||
|
||||
(codename "zoom zoom", released on March 31st 2015)
|
||||
|
||||
- Added ``color`` parameters to lots of interfaces that directly or indirectly
|
||||
call into echoing. This previously was always autodetection (with the
|
||||
exception of the ``echo_via_pager`` function). Now you can forcefully
|
||||
enable or disable it, overriding the auto detection of Click.
|
||||
- Added an ``UNPROCESSED`` type which does not perform any type changes which
|
||||
simplifies text handling on 2.x / 3.x in some special advanced usecases.
|
||||
- Added ``NoSuchOption`` and ``BadOptionUsage`` exceptions for more generic
|
||||
handling of errors.
|
||||
- Added support for handling of unprocessed options which can be useful in
|
||||
situations where arguments are forwarded to underlying tools.
|
||||
- Added ``max_content_width`` parameter to the context which can be used to
|
||||
change the maximum width of help output. By default Click will not format
|
||||
content for more than 80 characters width.
|
||||
- Added support for writing prompts to stderr.
|
||||
- Fix a bug when showing the default for multiple arguments.
|
||||
- Added support for custom subclasses to ``option`` and ``argument``.
|
||||
- Fix bug in ``clear()`` on Windows when colorama is installed.
|
||||
- Reject ``nargs=-1`` for options properly. Options cannot be variadic.
|
||||
- Fixed an issue with bash completion not working properly for commands with
|
||||
non ASCII characters or dashes.
|
||||
- Added a way to manually update the progressbar.
|
||||
- Changed the formatting of missing arguments. Previously the internal
|
||||
argument name was shown in error messages, now the metavar is shown if
|
||||
passed. In case an automated metavar is selected, it's stripped of
|
||||
extra formatting first.
|
||||
|
||||
Version 3.3
|
||||
-----------
|
||||
|
||||
(bugfix release, released on September 8th 2014)
|
||||
|
||||
- Fixed an issue with error reporting on Python 3 for invalid forwarding
|
||||
of commands.
|
||||
|
||||
Version 3.2
|
||||
-----------
|
||||
|
||||
(bugfix release, released on August 22nd 2014)
|
||||
|
||||
- Added missing ``err`` parameter forwarding to the ``secho`` function.
|
||||
- Fixed default parameters not being handled properly by the context
|
||||
invoke method. This is a backwards incompatible change if the function
|
||||
was used improperly. See :ref:`upgrade-to-3.2` for more information.
|
||||
- Removed the `invoked_subcommands` attribute largely. It is not possible
|
||||
to provide it to work error free due to how the parsing works so this
|
||||
API has been deprecated. See :ref:`upgrade-to-3.2` for more information.
|
||||
- Restored the functionality of `invoked_subcommand` which was broken as
|
||||
a regression in 3.1.
|
||||
|
||||
Version 3.1
|
||||
-----------
|
||||
|
||||
(bugfix release, released on August 13th 2014)
|
||||
|
||||
- Fixed a regression that caused contexts of subcommands to be
|
||||
created before the parent command was invoked which was a
|
||||
regression from earlier Click versions.
|
||||
|
||||
Version 3.0
|
||||
-----------
|
||||
|
||||
(codename "clonk clonk", released on August 12th 2014)
|
||||
|
||||
- formatter now no longer attempts to accomodate for terminals
|
||||
smaller than 50 characters. If that happens it just assumes
|
||||
a minimal width.
|
||||
- added a way to not swallow exceptions in the test system.
|
||||
- added better support for colors with pagers and ways to
|
||||
override the autodetection.
|
||||
- the CLI runner's result object now has a traceback attached.
|
||||
- improved automatic short help detection to work better with
|
||||
dots that do not terminate sentences.
|
||||
- when definining options without actual valid option strings
|
||||
now, Click will give an error message instead of silently
|
||||
passing. This should catch situations where users wanted to
|
||||
created arguments instead of options.
|
||||
- Restructured Click internally to support vendoring.
|
||||
- Added support for multi command chaining.
|
||||
- Added support for defaults on options with ``multiple`` and
|
||||
options and arguments with ``nargs != 1``.
|
||||
- label passed to ``progressbar`` is no longer rendered with
|
||||
whitespace stripped.
|
||||
- added a way to disable the standalone mode of the ``main``
|
||||
method on a Click command to be able to handle errors better.
|
||||
- added support for returning values from command callbacks.
|
||||
- added simplifications for printing to stderr from ``echo``.
|
||||
- added result callbacks for groups.
|
||||
- entering a context multiple times defers the cleanup until
|
||||
the last exit occurs.
|
||||
- added ``open_file``.
|
||||
|
||||
Version 2.6
|
||||
-----------
|
||||
|
||||
(bugfix release, released on August 11th 2014)
|
||||
|
||||
- Fixed an issue where the wrapped streams on Python 3 would be reporting
|
||||
incorrect values for seekable.
|
||||
|
||||
Version 2.5
|
||||
-----------
|
||||
|
||||
(bugfix release, released on July 28th 2014)
|
||||
|
||||
- Fixed a bug with text wrapping on Python 3.
|
||||
|
||||
Version 2.4
|
||||
-----------
|
||||
|
||||
(bugfix release, released on July 4th 2014)
|
||||
|
||||
- Corrected a bug in the change of the help option in 2.3.
|
||||
|
||||
Version 2.3
|
||||
-----------
|
||||
|
||||
(bugfix release, released on July 3rd 2014)
|
||||
|
||||
- Fixed an incorrectly formatted help record for count options.
|
||||
- Add support for ansi code stripping on Windows if colorama
|
||||
is not available.
|
||||
- restored the Click 1.0 handling of the help parameter for certain
|
||||
edge cases.
|
||||
|
||||
Version 2.2
|
||||
-----------
|
||||
|
||||
(bugfix release, released on June 26th 2014)
|
||||
|
||||
- fixed tty detection on PyPy.
|
||||
- fixed an issue that progress bars were not rendered when the
|
||||
context manager was entered.
|
||||
|
||||
Version 2.1
|
||||
-----------
|
||||
|
||||
(bugfix release, released on June 14th 2014)
|
||||
|
||||
- fixed the :func:`launch` function on windows.
|
||||
- improved the colorama support on windows to try hard to not
|
||||
screw up the console if the application is interrupted.
|
||||
- fixed windows terminals incorrectly being reported to be 80
|
||||
characters wide instead of 79
|
||||
- use colorama win32 bindings if available to get the correct
|
||||
dimensions of a windows terminal.
|
||||
- fixed an issue with custom function types on Python 3.
|
||||
- fixed an issue with unknown options being incorrectly reported
|
||||
in error messages.
|
||||
|
||||
Version 2.0
|
||||
-----------
|
||||
|
||||
(codename "tap tap tap", released on June 6th 2014)
|
||||
|
||||
- added support for opening stdin/stdout on Windows in
|
||||
binary mode correctly.
|
||||
- added support for atomic writes to files by going through
|
||||
a temporary file.
|
||||
- introduced :exc:`BadParameter` which can be used to easily perform
|
||||
custom validation with the same error messages as in the type system.
|
||||
- added :func:`progressbar`; a function to show progress bars.
|
||||
- added :func:`get_app_dir`; a function to calculate the home folder
|
||||
for configs.
|
||||
- Added transparent handling for ANSI codes into the :func:`echo`
|
||||
function through ``colorama``.
|
||||
- Added :func:`clear` function.
|
||||
- Breaking change: parameter callbacks now get the parameter object
|
||||
passed as second argument. There is legacy support for old callbacks
|
||||
which will warn but still execute the script.
|
||||
- Added :func:`style`, :func:`unstyle` and :func:`secho` for ANSI
|
||||
styles.
|
||||
- Added an :func:`edit` function that invokes the default editor.
|
||||
- Added an :func:`launch` function that launches browsers and applications.
|
||||
- nargs of -1 for arguments can now be forced to be a single item through
|
||||
the required flag. It defaults to not required.
|
||||
- setting a default for arguments now implicitly makes it non required.
|
||||
- changed "yN" / "Yn" to "y/N" and "Y/n" in confirmation prompts.
|
||||
- added basic support for bash completion.
|
||||
- added :func:`getchar` to fetch a single character from the terminal.
|
||||
- errors now go to stderr as intended.
|
||||
- fixed various issues with more exotic parameter formats like DOS/Windows
|
||||
style arguments.
|
||||
- added :func:`pause` which works similar to the Windows ``pause`` cmd
|
||||
built-in but becomes an automatic noop if the application is not run
|
||||
through a terminal.
|
||||
- added a bit of extra information about missing choice parameters.
|
||||
- changed how the help function is implemented to allow global overriding
|
||||
of the help option.
|
||||
- added support for token normalization to implement case insensitive handling.
|
||||
- added support for providing defaults for context settings.
|
||||
|
||||
Version 1.1
|
||||
-----------
|
||||
|
||||
(bugfix release, released on May 23rd 2014)
|
||||
|
||||
- fixed a bug that caused text files in Python 2 to not accept
|
||||
native strings.
|
||||
|
||||
Version 1.0
|
||||
-----------
|
||||
|
||||
(no codename, released on May 21st 2014)
|
||||
|
||||
- Initial release.
|
61
third_party/python/Click/CONTRIBUTING.rst
vendored
61
third_party/python/Click/CONTRIBUTING.rst
vendored
@ -1,61 +0,0 @@
|
||||
==========================
|
||||
How to contribute to Click
|
||||
==========================
|
||||
|
||||
Thanks for considering contributing to Click.
|
||||
|
||||
Support questions
|
||||
=================
|
||||
|
||||
Please, don't use the issue tracker for this. Check whether the
|
||||
``#pocoo`` IRC channel on Freenode can help with your issue. If your problem
|
||||
is not strictly Click-specific, ``#python`` on Freenode is generally more
|
||||
active. `StackOverflow <https://stackoverflow.com/>`_ is also worth
|
||||
considering.
|
||||
|
||||
Reporting issues
|
||||
================
|
||||
|
||||
- Under which versions of Python does this happen? This is even more important
|
||||
if your issue is encoding related.
|
||||
|
||||
- Under which versions of Click does this happen? Check if this issue is fixed
|
||||
in the repository.
|
||||
|
||||
Submitting patches
|
||||
==================
|
||||
|
||||
- Include tests if your patch is supposed to solve a bug, and explain clearly
|
||||
under which circumstances the bug happens. Make sure the test fails without
|
||||
your patch.
|
||||
|
||||
- Try to follow `PEP8 <http://legacy.python.org/dev/peps/pep-0008/>`_, but you
|
||||
may ignore the line-length-limit if following it would make the code uglier.
|
||||
|
||||
- For features: Consider whether your feature would be a better fit for an
|
||||
`external package <https://click.palletsprojects.com/en/7.x/contrib/>`_
|
||||
|
||||
- For docs and bug fixes: Submit against the latest maintenance branch instead of master!
|
||||
|
||||
Running the testsuite
|
||||
---------------------
|
||||
|
||||
You probably want to set up a `virtualenv
|
||||
<https://virtualenv.readthedocs.io/en/latest/index.html>`_.
|
||||
|
||||
The minimal requirement for running the testsuite is ``py.test``. You can
|
||||
install it with::
|
||||
|
||||
pip install pytest
|
||||
|
||||
Then you can run the testsuite with::
|
||||
|
||||
py.test
|
||||
|
||||
For a more isolated test environment, you can also install ``tox`` instead of
|
||||
``pytest``. You can install it with::
|
||||
|
||||
pip install tox
|
||||
|
||||
The ``tox`` command will then run all tests against multiple combinations of
|
||||
Python versions and dependency versions.
|
@ -1,3 +1,31 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: Click
|
||||
Version: 7.0
|
||||
Summary: Composable command line interface toolkit
|
||||
Home-page: https://palletsprojects.com/p/click/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
Maintainer: Pallets Team
|
||||
Maintainer-email: contact@palletsprojects.com
|
||||
License: BSD
|
||||
Project-URL: Documentation, https://click.palletsprojects.com/
|
||||
Project-URL: Code, https://github.com/pallets/click
|
||||
Project-URL: Issue tracker, https://github.com/pallets/click/issues
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
|
||||
|
||||
\$ click\_
|
||||
==========
|
||||
|
||||
@ -89,3 +117,5 @@ Links
|
||||
* Windows: https://ci.appveyor.com/project/pallets/click
|
||||
|
||||
* Test coverage: https://codecov.io/gh/pallets/click
|
||||
|
||||
|
22
third_party/python/Click/Click-7.0.dist-info/RECORD
vendored
Normal file
22
third_party/python/Click/Click-7.0.dist-info/RECORD
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
Click-7.0.dist-info/LICENSE.txt,sha256=4hIxn676T0Wcisk3_chVcECjyrivKTZsoqSNI5AlIlw,1876
|
||||
Click-7.0.dist-info/METADATA,sha256=-r8jeke3Zer4diRvT1MjFZuiJ6yTT_qFP39svLqdaLI,3516
|
||||
Click-7.0.dist-info/RECORD,,
|
||||
Click-7.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110
|
||||
Click-7.0.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6
|
||||
click/__init__.py,sha256=HjGThQ7tef9kkwCV371TBnrf0SAi6fKfU_jtEnbYTvQ,2789
|
||||
click/_bashcomplete.py,sha256=iaNUmtxag0YPfxba3TDYCNietiTMQIrvhRLj-H8okFU,11014
|
||||
click/_compat.py,sha256=vYmvoj4opPxo-c-2GMQQjYT_r_QkOKybkfGoeVrt0dA,23399
|
||||
click/_termui_impl.py,sha256=xHmLtOJhKUCVD6168yucJ9fknUJPAMs0eUTPgVUO-GQ,19611
|
||||
click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198
|
||||
click/_unicodefun.py,sha256=QHy2_5jYlX-36O-JVrTHNnHOqg8tquUR0HmQFev7Ics,4364
|
||||
click/_winconsole.py,sha256=PPWVak8Iikm_gAPsxMrzwsVFCvHgaW3jPaDWZ1JBl3U,8965
|
||||
click/core.py,sha256=q8FLcDZsagBGSRe5Y9Hi_FGvAeZvusNfoO5EkhkSQ8Y,75305
|
||||
click/decorators.py,sha256=idKt6duLUUfAFftrHoREi8MJSd39XW36pUVHthdglwk,11226
|
||||
click/exceptions.py,sha256=CNpAjBAE7qjaV4WChxQeak95e5yUOau8AsvT-8m6wss,7663
|
||||
click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889
|
||||
click/globals.py,sha256=oQkou3ZQ5DgrbVM6BwIBirwiqozbjfirzsLGAlLRRdg,1514
|
||||
click/parser.py,sha256=m-nGZz4VwprM42_qtFlWFGo7yRJQxkBlRcZodoH593Y,15510
|
||||
click/termui.py,sha256=o_ZXB2jyvL2Rce7P_bFGq452iyBq9ykJyRApIPMCZO0,23207
|
||||
click/testing.py,sha256=aYGqY_iWLu2p4k7lkuJ6t3fqpf6aPGqTsyLzNY_ngKg,13062
|
||||
click/types.py,sha256=2Q929p-aBP_ZYuMFJqJR-Ipucofv3fmDc5JzBDPmzJU,23287
|
||||
click/utils.py,sha256=6-D0WkAxvv9FkgHXSHwDIv0l9Gdx9Mm6Z5vuKNLIfZI,15763
|
6
third_party/python/Click/Click-7.0.dist-info/WHEEL
vendored
Normal file
6
third_party/python/Click/Click-7.0.dist-info/WHEEL
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.31.1)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py2-none-any
|
||||
Tag: py3-none-any
|
||||
|
1
third_party/python/Click/Click-7.0.dist-info/top_level.txt
vendored
Normal file
1
third_party/python/Click/Click-7.0.dist-info/top_level.txt
vendored
Normal file
@ -0,0 +1 @@
|
||||
click
|
11
third_party/python/Click/MANIFEST.in
vendored
11
third_party/python/Click/MANIFEST.in
vendored
@ -1,11 +0,0 @@
|
||||
include CHANGES.rst
|
||||
include CONTRIBUTING.rst
|
||||
include LICENSE.rst
|
||||
include README.rst
|
||||
include tox.ini
|
||||
graft artwork
|
||||
graft docs
|
||||
prune docs/_build
|
||||
graft examples
|
||||
graft tests
|
||||
global-exclude *.py[co] .DS_Store
|
119
third_party/python/Click/PKG-INFO
vendored
119
third_party/python/Click/PKG-INFO
vendored
@ -1,119 +0,0 @@
|
||||
Metadata-Version: 1.2
|
||||
Name: Click
|
||||
Version: 7.0
|
||||
Summary: Composable command line interface toolkit
|
||||
Home-page: https://palletsprojects.com/p/click/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
Maintainer: Pallets Team
|
||||
Maintainer-email: contact@palletsprojects.com
|
||||
License: BSD
|
||||
Project-URL: Documentation, https://click.palletsprojects.com/
|
||||
Project-URL: Code, https://github.com/pallets/click
|
||||
Project-URL: Issue tracker, https://github.com/pallets/click/issues
|
||||
Description: \$ click\_
|
||||
==========
|
||||
|
||||
Click is a Python package for creating beautiful command line interfaces
|
||||
in a composable way with as little code as necessary. It's the "Command
|
||||
Line Interface Creation Kit". It's highly configurable but comes with
|
||||
sensible defaults out of the box.
|
||||
|
||||
It aims to make the process of writing command line tools quick and fun
|
||||
while also preventing any frustration caused by the inability to
|
||||
implement an intended CLI API.
|
||||
|
||||
Click in three points:
|
||||
|
||||
- Arbitrary nesting of commands
|
||||
- Automatic help page generation
|
||||
- Supports lazy loading of subcommands at runtime
|
||||
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
Install and update using `pip`_:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
$ pip install click
|
||||
|
||||
Click supports Python 3.4 and newer, Python 2.7, and PyPy.
|
||||
|
||||
.. _pip: https://pip.pypa.io/en/stable/quickstart/
|
||||
|
||||
|
||||
A Simple Example
|
||||
----------------
|
||||
|
||||
What does it look like? Here is an example of a simple Click program:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import click
|
||||
|
||||
@click.command()
|
||||
@click.option("--count", default=1, help="Number of greetings.")
|
||||
@click.option("--name", prompt="Your name",
|
||||
help="The person to greet.")
|
||||
def hello(count, name):
|
||||
"""Simple program that greets NAME for a total of COUNT times."""
|
||||
for _ in range(count):
|
||||
click.echo("Hello, %s!" % name)
|
||||
|
||||
if __name__ == '__main__':
|
||||
hello()
|
||||
|
||||
And what it looks like when run:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
$ python hello.py --count=3
|
||||
Your name: Click
|
||||
Hello, Click!
|
||||
Hello, Click!
|
||||
Hello, Click!
|
||||
|
||||
|
||||
Donate
|
||||
------
|
||||
|
||||
The Pallets organization develops and supports Click and other popular
|
||||
packages. In order to grow the community of contributors and users, and
|
||||
allow the maintainers to devote more time to the projects, `please
|
||||
donate today`_.
|
||||
|
||||
.. _please donate today: https://palletsprojects.com/donate
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* Website: https://palletsprojects.com/p/click/
|
||||
* Documentation: https://click.palletsprojects.com/
|
||||
* License: `BSD <https://github.com/pallets/click/blob/master/LICENSE.rst>`_
|
||||
* Releases: https://pypi.org/project/click/
|
||||
* Code: https://github.com/pallets/click
|
||||
* Issue tracker: https://github.com/pallets/click/issues
|
||||
* Test status:
|
||||
|
||||
* Linux, Mac: https://travis-ci.org/pallets/click
|
||||
* Windows: https://ci.appveyor.com/project/pallets/click
|
||||
|
||||
* Test coverage: https://codecov.io/gh/pallets/click
|
||||
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
|
75
third_party/python/Click/artwork/logo.svg
vendored
75
third_party/python/Click/artwork/logo.svg
vendored
@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="237.36929"
|
||||
height="110.7928"
|
||||
id="svg4837"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="New document 8">
|
||||
<defs
|
||||
id="defs4839" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="259.76814"
|
||||
inkscape:cy="40.769955"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="10"
|
||||
fit-margin-left="10"
|
||||
fit-margin-right="10"
|
||||
fit-margin-bottom="10"
|
||||
inkscape:window-width="1676"
|
||||
inkscape:window-height="1006"
|
||||
inkscape:window-x="4"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata4842">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-255.43458,-207.38101)">
|
||||
<path
|
||||
style="fill:#000000"
|
||||
d="m 466.33424,306.48462 0,-1.6892 3.16724,0 3.16723,0 0,1.6892 0,1.68919 -3.16723,0 -3.16724,0 0,-1.68919 z m -3.37839,-5.06759 0,-3.37839 1.47804,0 1.47805,0 0,3.37839 0,3.37839 -1.47805,0 -1.47804,0 0,-3.37839 z m 10.13516,0 0,-3.37839 1.47804,0 1.47805,0 0,3.37839 0,3.37839 -1.47805,0 -1.47804,0 0,-3.37839 z m -30.82778,-28.92744 0,-28.92744 1.68919,0 c 1.68919,0 1.68919,0 1.68919,1.68919 0,1.6892 0,1.6892 1.6892,1.6892 1.68919,0 1.68919,0 1.68919,1.68919 0,1.6892 0,1.6892 1.6892,1.6892 1.68919,0 1.68919,0 1.68919,1.68919 0,1.6892 0,1.6892 -1.68919,1.6892 -1.6892,0 -1.6892,0 -1.6892,-1.6892 0,-1.68919 0,-1.68919 -1.68919,-1.68919 l -1.6892,0 0,23.85986 0,23.85985 1.6892,0 c 1.68919,0 1.68919,0 1.68919,1.6892 l 0,1.68919 -3.37839,0 -3.37838,0 0,-28.92744 z m 7.00029,25.22951 c -0.13394,-0.13393 -0.24352,-0.87696 -0.24352,-1.65118 0,-1.36423 0.0529,-1.40766 1.71469,-1.40766 l 1.71468,0 -0.13106,1.58362 c -0.12024,1.45279 -0.24178,1.5892 -1.47117,1.65118 -0.73706,0.0372 -1.44968,-0.042 -1.58362,-0.17596 z m 10.14204,-0.0392 c -0.13814,-0.22352 -0.20454,-1.7545 -0.14756,-3.40219 l 0.10361,-2.99581 1.60373,0 1.60374,0 -0.12334,3.27282 -0.12334,3.27281 -1.33284,0.12938 c -0.73305,0.0712 -1.44586,-0.0535 -1.584,-0.27702 z m 10.30707,-3.03247 0,-3.36553 1.47803,0 1.47805,0 0,3.30997 0,3.30996 -1.47805,0.0556 -1.47803,0.0556 0,-3.36553 z m -17.03271,-0.26872 c -0.15484,-0.15483 -0.28153,-0.91497 -0.28153,-1.68919 0,-1.36073 0.0563,-1.40766 1.68919,-1.40766 1.6892,0 1.6892,0 1.6892,1.6892 0,1.63289 -0.0469,1.68919 -1.40766,1.68919 -0.77422,0 -1.53436,-0.12669 -1.6892,-0.28154 z m 3.09686,-4.99719 c 0,-1.44286 0.0402,-1.47804 1.68919,-1.47804 1.64898,0 1.68919,0.0352 1.68919,1.47804 0,1.44285 -0.0402,1.47805 -1.68919,1.47805 -1.64898,0 -1.68919,-0.0352 -1.68919,-1.47805 z m 10.55746,-1.68919 0,-3.16724 6.75677,0 6.75678,0 0,-1.68919 c 0,-1.64898 0.0351,-1.6892 1.47804,-1.6892 l 1.47804,0 0,3.15652 0,3.15651 -6.6512,0.1163 -6.65119,0.1163 -0.13108,1.58361 c -0.12394,1.49763 -0.20994,1.58363 -1.58361,1.58363 l -1.45255,0 0,-3.16724 z m 10.13516,-8.44597 c 0,-1.40766 0.0704,-1.47804 1.47804,-1.47804 1.40766,0 1.47805,0.0704 1.47805,1.47804 0,1.40766 -0.0704,1.47804 -1.47805,1.47804 -1.40766,0 -1.47804,-0.0704 -1.47804,-1.47804 z m -3.37839,-3.37839 c 0,-1.40766 0.0704,-1.47804 1.47804,-1.47804 1.40767,0 1.47805,0.0704 1.47805,1.47804 0,1.40767 -0.0704,1.47805 -1.47805,1.47805 -1.40765,0 -1.47804,-0.0704 -1.47804,-1.47805 z m -3.37838,-3.37839 c 0,-1.40765 0.0704,-1.47804 1.47803,-1.47804 1.40767,0 1.47805,0.0704 1.47805,1.47804 0,1.40767 -0.0704,1.47805 -1.47805,1.47805 -1.40765,0 -1.47803,-0.0704 -1.47803,-1.47805 z m -3.37839,-3.48871 c 0,-1.52897 0.0553,-1.58931 1.47804,-1.61346 1.43567,-0.0244 1.47804,0.0211 1.47804,1.58838 0,1.56241 -0.0467,1.61345 -1.47804,1.61345 -1.42721,0 -1.47804,-0.0546 -1.47804,-1.58837 z m -3.37839,-3.47921 c 0,-1.64897 0.0351,-1.68919 1.47804,-1.68919 1.44285,0 1.47805,0.0402 1.47805,1.68919 0,1.64898 -0.0352,1.6892 -1.47805,1.6892 -1.44285,0 -1.47804,-0.0403 -1.47804,-1.6892 z m -3.45076,-3.37839 c 0.15328,-1.60738 0.23052,-1.68919 1.59478,-1.68919 1.3911,0 1.43368,0.0502 1.43368,1.68919 0,1.67253 -0.0157,1.6892 -1.59478,1.6892 l -1.59477,0 0.16109,-1.6892 z m -3.30601,-3.37838 c 0,-1.64898 0.0351,-1.6892 1.47804,-1.6892 1.44285,0 1.47804,0.0402 1.47804,1.6892 0,1.64897 -0.0352,1.68919 -1.47804,1.68919 -1.44286,0 -1.47804,-0.0402 -1.47804,-1.68919 z m -3.72061,-3.27282 c 0.12395,-1.49762 0.21706,-1.59073 1.71468,-1.71468 l 1.58363,-0.13107 0,1.71469 0,1.71468 -1.71469,0 -1.71468,0 0.13106,-1.58362 z"
|
||||
id="path4856"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000"
|
||||
d="m 271.34527,247.46047 c 0,-1.32826 -0.94153,-2.12734 -3.05297,-2.59109 -4.04056,-0.88746 -3.19986,-3.08429 1.01754,-2.65894 9.32239,0.94022 10.81407,-3.50307 2.60795,-7.76831 -2.71012,-1.40862 -5.36388,-3.27897 -5.89726,-4.15634 -1.47604,-2.42802 -0.0246,-6.42458 2.80076,-7.7119 1.48697,-0.67751 2.52398,-1.98054 2.52398,-3.17144 0,-1.13017 0.66136,-2.02144 1.5,-2.02144 0.825,0 1.5,0.85122 1.5,1.89159 0,1.19765 0.94321,2.12832 2.57104,2.53688 3.91591,0.98283 2.39946,3.10499 -1.95093,2.73019 -6.99788,-0.60291 -8.93527,3.8291 -2.87011,6.5657 9.0905,4.10163 11.015,9.73021 4.5,13.16112 -1.2375,0.65169 -2.25,2.06905 -2.25,3.1497 0,1.08065 -0.675,1.96482 -1.5,1.96482 -0.825,0 -1.5,-0.86425 -1.5,-1.92054 z m 38.357,-3.07104 c -4.57947,-1.84804 -6.77791,-8.48491 -4.32736,-13.06381 2.11183,-3.94599 10.30093,-6.28597 13.9414,-3.98367 2.2687,1.43477 0.36183,2.48777 -3.94232,2.177 -6.96682,-0.50302 -10.61631,6.27447 -5.91184,10.97894 1.71218,1.71218 2.95483,2.02243 6.5,1.62284 3.13626,-0.35351 4.38312,-0.13272 4.38312,0.77613 0,2.4062 -6.21813,3.27822 -10.643,1.49257 z m 21.1997,-1.23093 c -1.16379,-1.66155 -1.5567,-4.81653 -1.5567,-12.5 l 0,-10.27749 -2.5,0 c -1.55556,0 -2.5,-0.56667 -2.5,-1.5 0,-1.08333 1.11111,-1.5 4,-1.5 l 4,0 0.0153,11.25 c 0.008,6.1875 0.41056,11.87411 0.89363,12.63691 0.54214,0.85607 1.88505,1.19446 3.50856,0.88411 2.94677,-0.56331 4.58181,0.98192 2.46061,2.32547 -2.5829,1.63598 -6.70984,0.98184 -8.32141,-1.319 z m 20.4433,0.22251 c -1.55556,-1.55556 -2,-3.33333 -2,-8 0,-5.73333 -0.11111,-6 -2.5,-6 -1.55556,0 -2.5,-0.56667 -2.5,-1.5 0,-1.08333 1.11111,-1.5 4,-1.5 l 4,0 0.0153,6.75 c 0.0183,8.04891 0.82623,9.70461 4.40219,9.02102 2.94677,-0.56331 4.58181,0.98192 2.46061,2.32547 -2.3358,1.47948 -5.78176,0.99986 -7.87811,-1.09649 z m 18.357,1.00842 c -4.57947,-1.84804 -6.77791,-8.48491 -4.32736,-13.06381 2.11183,-3.94599 10.30093,-6.28597 13.9414,-3.98367 2.2687,1.43477 0.36183,2.48777 -3.94232,2.177 -6.96682,-0.50302 -10.61631,6.27447 -5.91184,10.97894 1.71218,1.71218 2.95483,2.02243 6.5,1.62284 3.13626,-0.35351 4.38312,-0.13272 4.38312,0.77613 0,2.4062 -6.21813,3.27822 -10.643,1.49257 z m 15.86478,-12.67646 c 0.20032,-9.84119 0.6282,-13.78431 1.52822,-14.08333 0.9358,-0.31091 1.25628,1.80502 1.275,8.41804 l 0.025,8.83333 4.01111,-4.25 c 2.32594,-2.46446 4.92367,-4.25 6.18321,-4.25 1.8968,0 1.6121,0.57059 -2.24643,4.50214 l -4.41851,4.50213 4.92271,4.99787 c 3.84161,3.90023 4.49929,4.99786 2.99467,4.99786 -1.06044,0 -4.08102,-2.12058 -6.71241,-4.71241 l -4.78435,-4.71241 0,4.71241 c 0,3.56082 -0.37346,4.71241 -1.52822,4.71241 -1.30999,0 -1.48849,-1.95179 -1.25,-13.66804 z m -37.85759,-9.82527 c -0.34636,-0.90262 -0.15025,-2.12063 0.43581,-2.70669 1.52361,-1.52361 4.41041,-0.13109 4.01242,1.93549 -0.4433,2.30188 -3.64766,2.85743 -4.44823,0.7712 z"
|
||||
id="path4887"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;stroke:none"
|
||||
d="m 411.32164,243.39982 c 7.38153,0.15924 14.76525,0.0821 22.14736,0.0136 -3.6814,3.83663 -9.42739,1.45689 -14.06576,2.07921 -3.69684,-0.007 -7.3939,0.0151 -11.09,0.0923 1.0029,-0.72825 2.00505,-1.45754 3.0084,-2.18514 z"
|
||||
id="path4889"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 8.5 KiB |
12
third_party/python/Click/examples/README
vendored
12
third_party/python/Click/examples/README
vendored
@ -1,12 +0,0 @@
|
||||
Click Examples
|
||||
|
||||
This folder contains various Click examples. Note that
|
||||
all of these are not runnable by themselves but should be
|
||||
installed into a virtualenv.
|
||||
|
||||
This is done this way so that scripts also properly work
|
||||
on Windows and in virtualenvs without accidentally executing
|
||||
through the wrong interpreter.
|
||||
|
||||
For more information about this see the documentation:
|
||||
https://click.palletsprojects.com/en/7.x/setuptools/
|
17
third_party/python/Click/examples/aliases/README
vendored
17
third_party/python/Click/examples/aliases/README
vendored
@ -1,17 +0,0 @@
|
||||
$ aliases_
|
||||
|
||||
aliases is a fairly advanced example that shows how
|
||||
to implement command aliases with Click. It uses a
|
||||
subclass of the default group to customize how commands
|
||||
are located.
|
||||
|
||||
It supports both aliases read from a config file as well
|
||||
as automatic abbreviations.
|
||||
|
||||
The aliases from the config are read from the aliases.ini
|
||||
file. Try `aliases st` and `aliases ci`!
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ aliases --help
|
@ -1,2 +0,0 @@
|
||||
[aliases]
|
||||
ci=commit
|
111
third_party/python/Click/examples/aliases/aliases.py
vendored
111
third_party/python/Click/examples/aliases/aliases.py
vendored
@ -1,111 +0,0 @@
|
||||
import os
|
||||
import click
|
||||
|
||||
try:
|
||||
import ConfigParser as configparser
|
||||
except ImportError:
|
||||
import configparser
|
||||
|
||||
|
||||
class Config(object):
|
||||
"""The config in this example only holds aliases."""
|
||||
|
||||
def __init__(self):
|
||||
self.path = os.getcwd()
|
||||
self.aliases = {}
|
||||
|
||||
def read_config(self, filename):
|
||||
parser = configparser.RawConfigParser()
|
||||
parser.read([filename])
|
||||
try:
|
||||
self.aliases.update(parser.items('aliases'))
|
||||
except configparser.NoSectionError:
|
||||
pass
|
||||
|
||||
|
||||
pass_config = click.make_pass_decorator(Config, ensure=True)
|
||||
|
||||
|
||||
class AliasedGroup(click.Group):
|
||||
"""This subclass of a group supports looking up aliases in a config
|
||||
file and with a bit of magic.
|
||||
"""
|
||||
|
||||
def get_command(self, ctx, cmd_name):
|
||||
# Step one: bulitin commands as normal
|
||||
rv = click.Group.get_command(self, ctx, cmd_name)
|
||||
if rv is not None:
|
||||
return rv
|
||||
|
||||
# Step two: find the config object and ensure it's there. This
|
||||
# will create the config object is missing.
|
||||
cfg = ctx.ensure_object(Config)
|
||||
|
||||
# Step three: lookup an explicit command aliase in the config
|
||||
if cmd_name in cfg.aliases:
|
||||
actual_cmd = cfg.aliases[cmd_name]
|
||||
return click.Group.get_command(self, ctx, actual_cmd)
|
||||
|
||||
# Alternative option: if we did not find an explicit alias we
|
||||
# allow automatic abbreviation of the command. "status" for
|
||||
# instance will match "st". We only allow that however if
|
||||
# there is only one command.
|
||||
matches = [x for x in self.list_commands(ctx)
|
||||
if x.lower().startswith(cmd_name.lower())]
|
||||
if not matches:
|
||||
return None
|
||||
elif len(matches) == 1:
|
||||
return click.Group.get_command(self, ctx, matches[0])
|
||||
ctx.fail('Too many matches: %s' % ', '.join(sorted(matches)))
|
||||
|
||||
|
||||
def read_config(ctx, param, value):
|
||||
"""Callback that is used whenever --config is passed. We use this to
|
||||
always load the correct config. This means that the config is loaded
|
||||
even if the group itself never executes so our aliases stay always
|
||||
available.
|
||||
"""
|
||||
cfg = ctx.ensure_object(Config)
|
||||
if value is None:
|
||||
value = os.path.join(os.path.dirname(__file__), 'aliases.ini')
|
||||
cfg.read_config(value)
|
||||
return value
|
||||
|
||||
|
||||
@click.command(cls=AliasedGroup)
|
||||
@click.option('--config', type=click.Path(exists=True, dir_okay=False),
|
||||
callback=read_config, expose_value=False,
|
||||
help='The config file to use instead of the default.')
|
||||
def cli():
|
||||
"""An example application that supports aliases."""
|
||||
|
||||
|
||||
@cli.command()
|
||||
def push():
|
||||
"""Pushes changes."""
|
||||
click.echo('Push')
|
||||
|
||||
|
||||
@cli.command()
|
||||
def pull():
|
||||
"""Pulls changes."""
|
||||
click.echo('Pull')
|
||||
|
||||
|
||||
@cli.command()
|
||||
def clone():
|
||||
"""Clones a repository."""
|
||||
click.echo('Clone')
|
||||
|
||||
|
||||
@cli.command()
|
||||
def commit():
|
||||
"""Commits pending changes."""
|
||||
click.echo('Commit')
|
||||
|
||||
|
||||
@cli.command()
|
||||
@pass_config
|
||||
def status(config):
|
||||
"""Shows the status."""
|
||||
click.echo('Status for %s' % config.path)
|
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-aliases',
|
||||
version='1.0',
|
||||
py_modules=['aliases'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
aliases=aliases:cli
|
||||
''',
|
||||
)
|
@ -1,12 +0,0 @@
|
||||
$ bashcompletion
|
||||
|
||||
bashcompletion is a simple example of an application that
|
||||
tries to autocomplete commands, arguments and options.
|
||||
|
||||
This example requires Click 2.0 or higher.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ eval "$(_BASHCOMPLETION_COMPLETE=source bashcompletion)"
|
||||
$ bashcompletion --help
|
@ -1,45 +0,0 @@
|
||||
import click
|
||||
import os
|
||||
|
||||
|
||||
@click.group()
|
||||
def cli():
|
||||
pass
|
||||
|
||||
|
||||
def get_env_vars(ctx, args, incomplete):
|
||||
# Completions returned as strings do not have a description displayed.
|
||||
for key in os.environ.keys():
|
||||
if incomplete in key:
|
||||
yield key
|
||||
|
||||
|
||||
@cli.command(help='A command to print environment variables')
|
||||
@click.argument("envvar", type=click.STRING, autocompletion=get_env_vars)
|
||||
def cmd1(envvar):
|
||||
click.echo('Environment variable: %s' % envvar)
|
||||
click.echo('Value: %s' % os.environ[envvar])
|
||||
|
||||
|
||||
@click.group(help='A group that holds a subcommand')
|
||||
def group():
|
||||
pass
|
||||
|
||||
|
||||
def list_users(ctx, args, incomplete):
|
||||
# You can generate completions with descriptions by returning
|
||||
# tuples in the form (completion, description).
|
||||
users = [('bob', 'butcher'),
|
||||
('alice', 'baker'),
|
||||
('jerry', 'candlestick maker')]
|
||||
# Ths will allow completion matches based on matches within the description string too!
|
||||
return [user for user in users if incomplete in user[0] or incomplete in user[1]]
|
||||
|
||||
|
||||
@group.command(help='Choose a user')
|
||||
@click.argument("user", type=click.STRING, autocompletion=list_users)
|
||||
def subcmd(user):
|
||||
click.echo('Chosen user is %s' % user)
|
||||
|
||||
|
||||
cli.add_command(group)
|
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-bashcompletion',
|
||||
version='1.0',
|
||||
py_modules=['bashcompletion'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
bashcompletion=bashcompletion:cli
|
||||
''',
|
||||
)
|
11
third_party/python/Click/examples/colors/README
vendored
11
third_party/python/Click/examples/colors/README
vendored
@ -1,11 +0,0 @@
|
||||
$ colors_
|
||||
|
||||
colors is a simple example that shows how you can
|
||||
colorize text.
|
||||
|
||||
For this to work on Windows, colorama is required.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ colors
|
@ -1,28 +0,0 @@
|
||||
import click
|
||||
|
||||
|
||||
all_colors = 'black', 'red', 'green', 'yellow', 'blue', 'magenta', \
|
||||
'cyan', 'white', 'bright_black', 'bright_red', \
|
||||
'bright_green', 'bright_yellow', 'bright_blue', \
|
||||
'bright_magenta', 'bright_cyan', 'bright_white'
|
||||
|
||||
|
||||
@click.command()
|
||||
def cli():
|
||||
"""This script prints some colors. If colorama is installed this will
|
||||
also work on Windows. It will also automatically remove all ANSI
|
||||
styles if data is piped into a file.
|
||||
|
||||
Give it a try!
|
||||
"""
|
||||
for color in all_colors:
|
||||
click.echo(click.style('I am colored %s' % color, fg=color))
|
||||
for color in all_colors:
|
||||
click.echo(click.style('I am colored %s and bold' % color,
|
||||
fg=color, bold=True))
|
||||
for color in all_colors:
|
||||
click.echo(click.style('I am reverse colored %s' % color, fg=color,
|
||||
reverse=True))
|
||||
|
||||
click.echo(click.style('I am blinking', blink=True))
|
||||
click.echo(click.style('I am underlined', underline=True))
|
@ -1,17 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-colors',
|
||||
version='1.0',
|
||||
py_modules=['colors'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
# Colorama is only required for Windows.
|
||||
'colorama',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
colors=colors:cli
|
||||
''',
|
||||
)
|
16
third_party/python/Click/examples/complex/README
vendored
16
third_party/python/Click/examples/complex/README
vendored
@ -1,16 +0,0 @@
|
||||
$ complex_
|
||||
|
||||
complex is an example of building very complex cli
|
||||
applications that load subcommands dynamically from
|
||||
a plugin folder and other things.
|
||||
|
||||
All the commands are implemented as plugins in the
|
||||
`complex.commands` package. If a python module is
|
||||
placed named "cmd_foo" it will show up as "foo"
|
||||
command and the `cli` object within it will be
|
||||
loaded as nested Click command.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ complex --help
|
@ -1,65 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import click
|
||||
|
||||
|
||||
CONTEXT_SETTINGS = dict(auto_envvar_prefix='COMPLEX')
|
||||
|
||||
|
||||
class Context(object):
|
||||
|
||||
def __init__(self):
|
||||
self.verbose = False
|
||||
self.home = os.getcwd()
|
||||
|
||||
def log(self, msg, *args):
|
||||
"""Logs a message to stderr."""
|
||||
if args:
|
||||
msg %= args
|
||||
click.echo(msg, file=sys.stderr)
|
||||
|
||||
def vlog(self, msg, *args):
|
||||
"""Logs a message to stderr only if verbose is enabled."""
|
||||
if self.verbose:
|
||||
self.log(msg, *args)
|
||||
|
||||
|
||||
pass_context = click.make_pass_decorator(Context, ensure=True)
|
||||
cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
||||
'commands'))
|
||||
|
||||
|
||||
class ComplexCLI(click.MultiCommand):
|
||||
|
||||
def list_commands(self, ctx):
|
||||
rv = []
|
||||
for filename in os.listdir(cmd_folder):
|
||||
if filename.endswith('.py') and \
|
||||
filename.startswith('cmd_'):
|
||||
rv.append(filename[4:-3])
|
||||
rv.sort()
|
||||
return rv
|
||||
|
||||
def get_command(self, ctx, name):
|
||||
try:
|
||||
if sys.version_info[0] == 2:
|
||||
name = name.encode('ascii', 'replace')
|
||||
mod = __import__('complex.commands.cmd_' + name,
|
||||
None, None, ['cli'])
|
||||
except ImportError:
|
||||
return
|
||||
return mod.cli
|
||||
|
||||
|
||||
@click.command(cls=ComplexCLI, context_settings=CONTEXT_SETTINGS)
|
||||
@click.option('--home', type=click.Path(exists=True, file_okay=False,
|
||||
resolve_path=True),
|
||||
help='Changes the folder to operate on.')
|
||||
@click.option('-v', '--verbose', is_flag=True,
|
||||
help='Enables verbose mode.')
|
||||
@pass_context
|
||||
def cli(ctx, verbose, home):
|
||||
"""A complex command line interface."""
|
||||
ctx.verbose = verbose
|
||||
if home is not None:
|
||||
ctx.home = home
|
@ -1,13 +0,0 @@
|
||||
import click
|
||||
from complex.cli import pass_context
|
||||
|
||||
|
||||
@click.command('init', short_help='Initializes a repo.')
|
||||
@click.argument('path', required=False, type=click.Path(resolve_path=True))
|
||||
@pass_context
|
||||
def cli(ctx, path):
|
||||
"""Initializes a repository."""
|
||||
if path is None:
|
||||
path = ctx.home
|
||||
ctx.log('Initialized the repository in %s',
|
||||
click.format_filename(path))
|
@ -1,10 +0,0 @@
|
||||
import click
|
||||
from complex.cli import pass_context
|
||||
|
||||
|
||||
@click.command('status', short_help='Shows file changes.')
|
||||
@pass_context
|
||||
def cli(ctx):
|
||||
"""Shows file changes in the current working directory."""
|
||||
ctx.log('Changed files: none')
|
||||
ctx.vlog('bla bla bla, debug info')
|
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-complex',
|
||||
version='1.0',
|
||||
packages=['complex', 'complex.commands'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
complex=complex.cli:cli
|
||||
''',
|
||||
)
|
@ -1 +0,0 @@
|
||||
processed-*
|
@ -1,13 +0,0 @@
|
||||
$ imagepipe_
|
||||
|
||||
imagepipe is an example application that implements some
|
||||
multi commands that chain image processing instructions
|
||||
together.
|
||||
|
||||
This requires pillow.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ imagepipe open -i example01.jpg resize -w 128 display
|
||||
$ imagepipe open -i example02.jpg blur save
|
Binary file not shown.
Before Width: | Height: | Size: 50 KiB |
Binary file not shown.
Before Width: | Height: | Size: 38 KiB |
@ -1,266 +0,0 @@
|
||||
import click
|
||||
from functools import update_wrapper
|
||||
from PIL import Image, ImageFilter, ImageEnhance
|
||||
|
||||
|
||||
@click.group(chain=True)
|
||||
def cli():
|
||||
"""This script processes a bunch of images through pillow in a unix
|
||||
pipe. One commands feeds into the next.
|
||||
|
||||
Example:
|
||||
|
||||
\b
|
||||
imagepipe open -i example01.jpg resize -w 128 display
|
||||
imagepipe open -i example02.jpg blur save
|
||||
"""
|
||||
|
||||
|
||||
@cli.resultcallback()
|
||||
def process_commands(processors):
|
||||
"""This result callback is invoked with an iterable of all the chained
|
||||
subcommands. As in this example each subcommand returns a function
|
||||
we can chain them together to feed one into the other, similar to how
|
||||
a pipe on unix works.
|
||||
"""
|
||||
# Start with an empty iterable.
|
||||
stream = ()
|
||||
|
||||
# Pipe it through all stream processors.
|
||||
for processor in processors:
|
||||
stream = processor(stream)
|
||||
|
||||
# Evaluate the stream and throw away the items.
|
||||
for _ in stream:
|
||||
pass
|
||||
|
||||
|
||||
def processor(f):
|
||||
"""Helper decorator to rewrite a function so that it returns another
|
||||
function from it.
|
||||
"""
|
||||
def new_func(*args, **kwargs):
|
||||
def processor(stream):
|
||||
return f(stream, *args, **kwargs)
|
||||
return processor
|
||||
return update_wrapper(new_func, f)
|
||||
|
||||
|
||||
def generator(f):
|
||||
"""Similar to the :func:`processor` but passes through old values
|
||||
unchanged and does not pass through the values as parameter.
|
||||
"""
|
||||
@processor
|
||||
def new_func(stream, *args, **kwargs):
|
||||
for item in stream:
|
||||
yield item
|
||||
for item in f(*args, **kwargs):
|
||||
yield item
|
||||
return update_wrapper(new_func, f)
|
||||
|
||||
|
||||
def copy_filename(new, old):
|
||||
new.filename = old.filename
|
||||
return new
|
||||
|
||||
|
||||
@cli.command('open')
|
||||
@click.option('-i', '--image', 'images', type=click.Path(),
|
||||
multiple=True, help='The image file to open.')
|
||||
@generator
|
||||
def open_cmd(images):
|
||||
"""Loads one or multiple images for processing. The input parameter
|
||||
can be specified multiple times to load more than one image.
|
||||
"""
|
||||
for image in images:
|
||||
try:
|
||||
click.echo('Opening "%s"' % image)
|
||||
if image == '-':
|
||||
img = Image.open(click.get_binary_stdin())
|
||||
img.filename = '-'
|
||||
else:
|
||||
img = Image.open(image)
|
||||
yield img
|
||||
except Exception as e:
|
||||
click.echo('Could not open image "%s": %s' % (image, e), err=True)
|
||||
|
||||
|
||||
@cli.command('save')
|
||||
@click.option('--filename', default='processed-%04d.png', type=click.Path(),
|
||||
help='The format for the filename.',
|
||||
show_default=True)
|
||||
@processor
|
||||
def save_cmd(images, filename):
|
||||
"""Saves all processed images to a series of files."""
|
||||
for idx, image in enumerate(images):
|
||||
try:
|
||||
fn = filename % (idx + 1)
|
||||
click.echo('Saving "%s" as "%s"' % (image.filename, fn))
|
||||
yield image.save(fn)
|
||||
except Exception as e:
|
||||
click.echo('Could not save image "%s": %s' %
|
||||
(image.filename, e), err=True)
|
||||
|
||||
|
||||
@cli.command('display')
|
||||
@processor
|
||||
def display_cmd(images):
|
||||
"""Opens all images in an image viewer."""
|
||||
for image in images:
|
||||
click.echo('Displaying "%s"' % image.filename)
|
||||
image.show()
|
||||
yield image
|
||||
|
||||
|
||||
@cli.command('resize')
|
||||
@click.option('-w', '--width', type=int, help='The new width of the image.')
|
||||
@click.option('-h', '--height', type=int, help='The new height of the image.')
|
||||
@processor
|
||||
def resize_cmd(images, width, height):
|
||||
"""Resizes an image by fitting it into the box without changing
|
||||
the aspect ratio.
|
||||
"""
|
||||
for image in images:
|
||||
w, h = (width or image.size[0], height or image.size[1])
|
||||
click.echo('Resizing "%s" to %dx%d' % (image.filename, w, h))
|
||||
image.thumbnail((w, h))
|
||||
yield image
|
||||
|
||||
|
||||
@cli.command('crop')
|
||||
@click.option('-b', '--border', type=int, help='Crop the image from all '
|
||||
'sides by this amount.')
|
||||
@processor
|
||||
def crop_cmd(images, border):
|
||||
"""Crops an image from all edges."""
|
||||
for image in images:
|
||||
box = [0, 0, image.size[0], image.size[1]]
|
||||
|
||||
if border is not None:
|
||||
for idx, val in enumerate(box):
|
||||
box[idx] = max(0, val - border)
|
||||
click.echo('Cropping "%s" by %dpx' % (image.filename, border))
|
||||
yield copy_filename(image.crop(box), image)
|
||||
else:
|
||||
yield image
|
||||
|
||||
|
||||
def convert_rotation(ctx, param, value):
|
||||
if value is None:
|
||||
return
|
||||
value = value.lower()
|
||||
if value in ('90', 'r', 'right'):
|
||||
return (Image.ROTATE_90, 90)
|
||||
if value in ('180', '-180'):
|
||||
return (Image.ROTATE_180, 180)
|
||||
if value in ('-90', '270', 'l', 'left'):
|
||||
return (Image.ROTATE_270, 270)
|
||||
raise click.BadParameter('invalid rotation "%s"' % value)
|
||||
|
||||
|
||||
def convert_flip(ctx, param, value):
|
||||
if value is None:
|
||||
return
|
||||
value = value.lower()
|
||||
if value in ('lr', 'leftright'):
|
||||
return (Image.FLIP_LEFT_RIGHT, 'left to right')
|
||||
if value in ('tb', 'topbottom', 'upsidedown', 'ud'):
|
||||
return (Image.FLIP_LEFT_RIGHT, 'top to bottom')
|
||||
raise click.BadParameter('invalid flip "%s"' % value)
|
||||
|
||||
|
||||
@cli.command('transpose')
|
||||
@click.option('-r', '--rotate', callback=convert_rotation,
|
||||
help='Rotates the image (in degrees)')
|
||||
@click.option('-f', '--flip', callback=convert_flip,
|
||||
help='Flips the image [LR / TB]')
|
||||
@processor
|
||||
def transpose_cmd(images, rotate, flip):
|
||||
"""Transposes an image by either rotating or flipping it."""
|
||||
for image in images:
|
||||
if rotate is not None:
|
||||
mode, degrees = rotate
|
||||
click.echo('Rotate "%s" by %ddeg' % (image.filename, degrees))
|
||||
image = copy_filename(image.transpose(mode), image)
|
||||
if flip is not None:
|
||||
mode, direction = flip
|
||||
click.echo('Flip "%s" %s' % (image.filename, direction))
|
||||
image = copy_filename(image.transpose(mode), image)
|
||||
yield image
|
||||
|
||||
|
||||
@cli.command('blur')
|
||||
@click.option('-r', '--radius', default=2, show_default=True,
|
||||
help='The blur radius.')
|
||||
@processor
|
||||
def blur_cmd(images, radius):
|
||||
"""Applies gaussian blur."""
|
||||
blur = ImageFilter.GaussianBlur(radius)
|
||||
for image in images:
|
||||
click.echo('Blurring "%s" by %dpx' % (image.filename, radius))
|
||||
yield copy_filename(image.filter(blur), image)
|
||||
|
||||
|
||||
@cli.command('smoothen')
|
||||
@click.option('-i', '--iterations', default=1, show_default=True,
|
||||
help='How many iterations of the smoothen filter to run.')
|
||||
@processor
|
||||
def smoothen_cmd(images, iterations):
|
||||
"""Applies a smoothening filter."""
|
||||
for image in images:
|
||||
click.echo('Smoothening "%s" %d time%s' %
|
||||
(image.filename, iterations, iterations != 1 and 's' or '',))
|
||||
for x in xrange(iterations):
|
||||
image = copy_filename(image.filter(ImageFilter.BLUR), image)
|
||||
yield image
|
||||
|
||||
|
||||
@cli.command('emboss')
|
||||
@processor
|
||||
def emboss_cmd(images):
|
||||
"""Embosses an image."""
|
||||
for image in images:
|
||||
click.echo('Embossing "%s"' % image.filename)
|
||||
yield copy_filename(image.filter(ImageFilter.EMBOSS), image)
|
||||
|
||||
|
||||
@cli.command('sharpen')
|
||||
@click.option('-f', '--factor', default=2.0,
|
||||
help='Sharpens the image.', show_default=True)
|
||||
@processor
|
||||
def sharpen_cmd(images, factor):
|
||||
"""Sharpens an image."""
|
||||
for image in images:
|
||||
click.echo('Sharpen "%s" by %f' % (image.filename, factor))
|
||||
enhancer = ImageEnhance.Sharpness(image)
|
||||
yield copy_filename(enhancer.enhance(max(1.0, factor)), image)
|
||||
|
||||
|
||||
@cli.command('paste')
|
||||
@click.option('-l', '--left', default=0, help='Offset from left.')
|
||||
@click.option('-r', '--right', default=0, help='Offset from right.')
|
||||
@processor
|
||||
def paste_cmd(images, left, right):
|
||||
"""Pastes the second image on the first image and leaves the rest
|
||||
unchanged.
|
||||
"""
|
||||
imageiter = iter(images)
|
||||
image = next(imageiter, None)
|
||||
to_paste = next(imageiter, None)
|
||||
|
||||
if to_paste is None:
|
||||
if image is not None:
|
||||
yield image
|
||||
return
|
||||
|
||||
click.echo('Paste "%s" on "%s"' %
|
||||
(to_paste.filename, image.filename))
|
||||
mask = None
|
||||
if to_paste.mode == 'RGBA' or 'transparency' in to_paste.info:
|
||||
mask = to_paste
|
||||
image.paste(to_paste, (left, right), mask)
|
||||
image.filename += '+' + to_paste.filename
|
||||
yield image
|
||||
|
||||
for image in imageiter:
|
||||
yield image
|
@ -1,16 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-imagepipe',
|
||||
version='1.0',
|
||||
py_modules=['imagepipe'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
'pillow',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
imagepipe=imagepipe:cli
|
||||
''',
|
||||
)
|
10
third_party/python/Click/examples/inout/README
vendored
10
third_party/python/Click/examples/inout/README
vendored
@ -1,10 +0,0 @@
|
||||
$ inout_
|
||||
|
||||
inout is a simple example of an application that
|
||||
can read from files and write to files but also
|
||||
accept input from stdin or write to stdout.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ inout input_file.txt output_file.txt
|
30
third_party/python/Click/examples/inout/inout.py
vendored
30
third_party/python/Click/examples/inout/inout.py
vendored
@ -1,30 +0,0 @@
|
||||
import click
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.argument('input', type=click.File('rb'), nargs=-1)
|
||||
@click.argument('output', type=click.File('wb'))
|
||||
def cli(input, output):
|
||||
"""This script works similar to the Unix `cat` command but it writes
|
||||
into a specific file (which could be the standard output as denoted by
|
||||
the ``-`` sign).
|
||||
|
||||
\b
|
||||
Copy stdin to stdout:
|
||||
inout - -
|
||||
|
||||
\b
|
||||
Copy foo.txt and bar.txt to stdout:
|
||||
inout foo.txt bar.txt -
|
||||
|
||||
\b
|
||||
Write stdin into the file foo.txt
|
||||
inout - foo.txt
|
||||
"""
|
||||
for f in input:
|
||||
while True:
|
||||
chunk = f.read(1024)
|
||||
if not chunk:
|
||||
break
|
||||
output.write(chunk)
|
||||
output.flush()
|
15
third_party/python/Click/examples/inout/setup.py
vendored
15
third_party/python/Click/examples/inout/setup.py
vendored
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-inout',
|
||||
version='0.1',
|
||||
py_modules=['inout'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
inout=inout:cli
|
||||
''',
|
||||
)
|
14
third_party/python/Click/examples/naval/README
vendored
14
third_party/python/Click/examples/naval/README
vendored
@ -1,14 +0,0 @@
|
||||
$ naval_
|
||||
|
||||
naval is a simple example of an application that
|
||||
is ported from the docopt example of the same name.
|
||||
|
||||
Unlike the original this one also runs some code and
|
||||
prints messages and it's command line interface was
|
||||
changed slightly to make more sense with established
|
||||
POSIX semantics.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ naval --help
|
70
third_party/python/Click/examples/naval/naval.py
vendored
70
third_party/python/Click/examples/naval/naval.py
vendored
@ -1,70 +0,0 @@
|
||||
import click
|
||||
|
||||
|
||||
@click.group()
|
||||
@click.version_option()
|
||||
def cli():
|
||||
"""Naval Fate.
|
||||
|
||||
This is the docopt example adopted to Click but with some actual
|
||||
commands implemented and not just the empty parsing which really
|
||||
is not all that interesting.
|
||||
"""
|
||||
|
||||
|
||||
@cli.group()
|
||||
def ship():
|
||||
"""Manages ships."""
|
||||
|
||||
|
||||
@ship.command('new')
|
||||
@click.argument('name')
|
||||
def ship_new(name):
|
||||
"""Creates a new ship."""
|
||||
click.echo('Created ship %s' % name)
|
||||
|
||||
|
||||
@ship.command('move')
|
||||
@click.argument('ship')
|
||||
@click.argument('x', type=float)
|
||||
@click.argument('y', type=float)
|
||||
@click.option('--speed', metavar='KN', default=10,
|
||||
help='Speed in knots.')
|
||||
def ship_move(ship, x, y, speed):
|
||||
"""Moves SHIP to the new location X,Y."""
|
||||
click.echo('Moving ship %s to %s,%s with speed %s' % (ship, x, y, speed))
|
||||
|
||||
|
||||
@ship.command('shoot')
|
||||
@click.argument('ship')
|
||||
@click.argument('x', type=float)
|
||||
@click.argument('y', type=float)
|
||||
def ship_shoot(ship, x, y):
|
||||
"""Makes SHIP fire to X,Y."""
|
||||
click.echo('Ship %s fires to %s,%s' % (ship, x, y))
|
||||
|
||||
|
||||
@cli.group('mine')
|
||||
def mine():
|
||||
"""Manages mines."""
|
||||
|
||||
|
||||
@mine.command('set')
|
||||
@click.argument('x', type=float)
|
||||
@click.argument('y', type=float)
|
||||
@click.option('ty', '--moored', flag_value='moored',
|
||||
default=True,
|
||||
help='Moored (anchored) mine. Default.')
|
||||
@click.option('ty', '--drifting', flag_value='drifting',
|
||||
help='Drifting mine.')
|
||||
def mine_set(x, y, ty):
|
||||
"""Sets a mine at a specific coordinate."""
|
||||
click.echo('Set %s mine at %s,%s' % (ty, x, y))
|
||||
|
||||
|
||||
@mine.command('remove')
|
||||
@click.argument('x', type=float)
|
||||
@click.argument('y', type=float)
|
||||
def mine_remove(x, y):
|
||||
"""Removes a mine at a specific coordinate."""
|
||||
click.echo('Removed mine at %s,%s' % (x, y))
|
15
third_party/python/Click/examples/naval/setup.py
vendored
15
third_party/python/Click/examples/naval/setup.py
vendored
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-naval',
|
||||
version='2.0',
|
||||
py_modules=['naval'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
naval=naval:cli
|
||||
''',
|
||||
)
|
@ -1,9 +0,0 @@
|
||||
$ repo_
|
||||
|
||||
repo is a simple example of an application that looks
|
||||
and works similar to hg or git.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ repo --help
|
151
third_party/python/Click/examples/repo/repo.py
vendored
151
third_party/python/Click/examples/repo/repo.py
vendored
@ -1,151 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import posixpath
|
||||
|
||||
import click
|
||||
|
||||
|
||||
class Repo(object):
|
||||
|
||||
def __init__(self, home):
|
||||
self.home = home
|
||||
self.config = {}
|
||||
self.verbose = False
|
||||
|
||||
def set_config(self, key, value):
|
||||
self.config[key] = value
|
||||
if self.verbose:
|
||||
click.echo(' config[%s] = %s' % (key, value), file=sys.stderr)
|
||||
|
||||
def __repr__(self):
|
||||
return '<Repo %r>' % self.home
|
||||
|
||||
|
||||
pass_repo = click.make_pass_decorator(Repo)
|
||||
|
||||
|
||||
@click.group()
|
||||
@click.option('--repo-home', envvar='REPO_HOME', default='.repo',
|
||||
metavar='PATH', help='Changes the repository folder location.')
|
||||
@click.option('--config', nargs=2, multiple=True,
|
||||
metavar='KEY VALUE', help='Overrides a config key/value pair.')
|
||||
@click.option('--verbose', '-v', is_flag=True,
|
||||
help='Enables verbose mode.')
|
||||
@click.version_option('1.0')
|
||||
@click.pass_context
|
||||
def cli(ctx, repo_home, config, verbose):
|
||||
"""Repo is a command line tool that showcases how to build complex
|
||||
command line interfaces with Click.
|
||||
|
||||
This tool is supposed to look like a distributed version control
|
||||
system to show how something like this can be structured.
|
||||
"""
|
||||
# Create a repo object and remember it as as the context object. From
|
||||
# this point onwards other commands can refer to it by using the
|
||||
# @pass_repo decorator.
|
||||
ctx.obj = Repo(os.path.abspath(repo_home))
|
||||
ctx.obj.verbose = verbose
|
||||
for key, value in config:
|
||||
ctx.obj.set_config(key, value)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('src')
|
||||
@click.argument('dest', required=False)
|
||||
@click.option('--shallow/--deep', default=False,
|
||||
help='Makes a checkout shallow or deep. Deep by default.')
|
||||
@click.option('--rev', '-r', default='HEAD',
|
||||
help='Clone a specific revision instead of HEAD.')
|
||||
@pass_repo
|
||||
def clone(repo, src, dest, shallow, rev):
|
||||
"""Clones a repository.
|
||||
|
||||
This will clone the repository at SRC into the folder DEST. If DEST
|
||||
is not provided this will automatically use the last path component
|
||||
of SRC and create that folder.
|
||||
"""
|
||||
if dest is None:
|
||||
dest = posixpath.split(src)[-1] or '.'
|
||||
click.echo('Cloning repo %s to %s' % (src, os.path.abspath(dest)))
|
||||
repo.home = dest
|
||||
if shallow:
|
||||
click.echo('Making shallow checkout')
|
||||
click.echo('Checking out revision %s' % rev)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.confirmation_option()
|
||||
@pass_repo
|
||||
def delete(repo):
|
||||
"""Deletes a repository.
|
||||
|
||||
This will throw away the current repository.
|
||||
"""
|
||||
click.echo('Destroying repo %s' % repo.home)
|
||||
click.echo('Deleted!')
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.option('--username', prompt=True,
|
||||
help='The developer\'s shown username.')
|
||||
@click.option('--email', prompt='E-Mail',
|
||||
help='The developer\'s email address')
|
||||
@click.password_option(help='The login password.')
|
||||
@pass_repo
|
||||
def setuser(repo, username, email, password):
|
||||
"""Sets the user credentials.
|
||||
|
||||
This will override the current user config.
|
||||
"""
|
||||
repo.set_config('username', username)
|
||||
repo.set_config('email', email)
|
||||
repo.set_config('password', '*' * len(password))
|
||||
click.echo('Changed credentials.')
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.option('--message', '-m', multiple=True,
|
||||
help='The commit message. If provided multiple times each '
|
||||
'argument gets converted into a new line.')
|
||||
@click.argument('files', nargs=-1, type=click.Path())
|
||||
@pass_repo
|
||||
def commit(repo, files, message):
|
||||
"""Commits outstanding changes.
|
||||
|
||||
Commit changes to the given files into the repository. You will need to
|
||||
"repo push" to push up your changes to other repositories.
|
||||
|
||||
If a list of files is omitted, all changes reported by "repo status"
|
||||
will be committed.
|
||||
"""
|
||||
if not message:
|
||||
marker = '# Files to be committed:'
|
||||
hint = ['', '', marker, '#']
|
||||
for file in files:
|
||||
hint.append('# U %s' % file)
|
||||
message = click.edit('\n'.join(hint))
|
||||
if message is None:
|
||||
click.echo('Aborted!')
|
||||
return
|
||||
msg = message.split(marker)[0].rstrip()
|
||||
if not msg:
|
||||
click.echo('Aborted! Empty commit message')
|
||||
return
|
||||
else:
|
||||
msg = '\n'.join(message)
|
||||
click.echo('Files to be committed: %s' % (files,))
|
||||
click.echo('Commit message:\n' + msg)
|
||||
|
||||
|
||||
@cli.command(short_help='Copies files.')
|
||||
@click.option('--force', is_flag=True,
|
||||
help='forcibly copy over an existing managed file')
|
||||
@click.argument('src', nargs=-1, type=click.Path())
|
||||
@click.argument('dst', type=click.Path())
|
||||
@pass_repo
|
||||
def copy(repo, src, dst, force):
|
||||
"""Copies one or multiple files to a new location. This copies all
|
||||
files from SRC to DST.
|
||||
"""
|
||||
for fn in src:
|
||||
click.echo('Copy from %s -> %s' % (fn, dst))
|
15
third_party/python/Click/examples/repo/setup.py
vendored
15
third_party/python/Click/examples/repo/setup.py
vendored
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-repo',
|
||||
version='0.1',
|
||||
py_modules=['repo'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
repo=repo:cli
|
||||
''',
|
||||
)
|
@ -1,9 +0,0 @@
|
||||
$ termui_
|
||||
|
||||
termui showcases the different terminal UI helpers that
|
||||
Click provides.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ termui --help
|
@ -1,17 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-termui',
|
||||
version='1.0',
|
||||
py_modules=['termui'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
# Colorama is only required for Windows.
|
||||
'colorama',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
termui=termui:cli
|
||||
''',
|
||||
)
|
156
third_party/python/Click/examples/termui/termui.py
vendored
156
third_party/python/Click/examples/termui/termui.py
vendored
@ -1,156 +0,0 @@
|
||||
# coding: utf-8
|
||||
import click
|
||||
import math
|
||||
import time
|
||||
import random
|
||||
|
||||
try:
|
||||
range_type = xrange
|
||||
except NameError:
|
||||
range_type = range
|
||||
|
||||
|
||||
@click.group()
|
||||
def cli():
|
||||
"""This script showcases different terminal UI helpers in Click."""
|
||||
pass
|
||||
|
||||
|
||||
@cli.command()
|
||||
def colordemo():
|
||||
"""Demonstrates ANSI color support."""
|
||||
for color in 'red', 'green', 'blue':
|
||||
click.echo(click.style('I am colored %s' % color, fg=color))
|
||||
click.echo(click.style('I am background colored %s' % color, bg=color))
|
||||
|
||||
|
||||
@cli.command()
|
||||
def pager():
|
||||
"""Demonstrates using the pager."""
|
||||
lines = []
|
||||
for x in range_type(200):
|
||||
lines.append('%s. Hello World!' % click.style(str(x), fg='green'))
|
||||
click.echo_via_pager('\n'.join(lines))
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.option('--count', default=8000, type=click.IntRange(1, 100000),
|
||||
help='The number of items to process.')
|
||||
def progress(count):
|
||||
"""Demonstrates the progress bar."""
|
||||
items = range_type(count)
|
||||
|
||||
def process_slowly(item):
|
||||
time.sleep(0.002 * random.random())
|
||||
|
||||
def filter(items):
|
||||
for item in items:
|
||||
if random.random() > 0.3:
|
||||
yield item
|
||||
|
||||
with click.progressbar(items, label='Processing accounts',
|
||||
fill_char=click.style('#', fg='green')) as bar:
|
||||
for item in bar:
|
||||
process_slowly(item)
|
||||
|
||||
def show_item(item):
|
||||
if item is not None:
|
||||
return 'Item #%d' % item
|
||||
|
||||
with click.progressbar(filter(items), label='Committing transaction',
|
||||
fill_char=click.style('#', fg='yellow'),
|
||||
item_show_func=show_item) as bar:
|
||||
for item in bar:
|
||||
process_slowly(item)
|
||||
|
||||
with click.progressbar(length=count, label='Counting',
|
||||
bar_template='%(label)s %(bar)s | %(info)s',
|
||||
fill_char=click.style(u'█', fg='cyan'),
|
||||
empty_char=' ') as bar:
|
||||
for item in bar:
|
||||
process_slowly(item)
|
||||
|
||||
with click.progressbar(length=count, width=0, show_percent=False,
|
||||
show_eta=False,
|
||||
fill_char=click.style('#', fg='magenta')) as bar:
|
||||
for item in bar:
|
||||
process_slowly(item)
|
||||
|
||||
# 'Non-linear progress bar'
|
||||
steps = [math.exp( x * 1. / 20) - 1 for x in range(20)]
|
||||
count = int(sum(steps))
|
||||
with click.progressbar(length=count, show_percent=False,
|
||||
label='Slowing progress bar',
|
||||
fill_char=click.style(u'█', fg='green')) as bar:
|
||||
for item in steps:
|
||||
time.sleep(item)
|
||||
bar.update(item)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('url')
|
||||
def open(url):
|
||||
"""Opens a file or URL In the default application."""
|
||||
click.launch(url)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('url')
|
||||
def locate(url):
|
||||
"""Opens a file or URL In the default application."""
|
||||
click.launch(url, locate=True)
|
||||
|
||||
|
||||
@cli.command()
|
||||
def edit():
|
||||
"""Opens an editor with some text in it."""
|
||||
MARKER = '# Everything below is ignored\n'
|
||||
message = click.edit('\n\n' + MARKER)
|
||||
if message is not None:
|
||||
msg = message.split(MARKER, 1)[0].rstrip('\n')
|
||||
if not msg:
|
||||
click.echo('Empty message!')
|
||||
else:
|
||||
click.echo('Message:\n' + msg)
|
||||
else:
|
||||
click.echo('You did not enter anything!')
|
||||
|
||||
|
||||
@cli.command()
|
||||
def clear():
|
||||
"""Clears the entire screen."""
|
||||
click.clear()
|
||||
|
||||
|
||||
@cli.command()
|
||||
def pause():
|
||||
"""Waits for the user to press a button."""
|
||||
click.pause()
|
||||
|
||||
|
||||
@cli.command()
|
||||
def menu():
|
||||
"""Shows a simple menu."""
|
||||
menu = 'main'
|
||||
while 1:
|
||||
if menu == 'main':
|
||||
click.echo('Main menu:')
|
||||
click.echo(' d: debug menu')
|
||||
click.echo(' q: quit')
|
||||
char = click.getchar()
|
||||
if char == 'd':
|
||||
menu = 'debug'
|
||||
elif char == 'q':
|
||||
menu = 'quit'
|
||||
else:
|
||||
click.echo('Invalid input')
|
||||
elif menu == 'debug':
|
||||
click.echo('Debug menu')
|
||||
click.echo(' b: back')
|
||||
char = click.getchar()
|
||||
if char == 'b':
|
||||
menu = 'main'
|
||||
else:
|
||||
click.echo('Invalid input')
|
||||
elif menu == 'quit':
|
||||
return
|
@ -1,12 +0,0 @@
|
||||
$ validation_
|
||||
|
||||
validation is a simple example of an application that
|
||||
performs custom validation of parameters in different
|
||||
ways.
|
||||
|
||||
This example requires Click 2.0 or higher.
|
||||
|
||||
Usage:
|
||||
|
||||
$ pip install --editable .
|
||||
$ validation --help
|
@ -1,15 +0,0 @@
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='click-example-validation',
|
||||
version='1.0',
|
||||
py_modules=['validation'],
|
||||
include_package_data=True,
|
||||
install_requires=[
|
||||
'click',
|
||||
],
|
||||
entry_points='''
|
||||
[console_scripts]
|
||||
validation=validation:cli
|
||||
''',
|
||||
)
|
@ -1,44 +0,0 @@
|
||||
import click
|
||||
try:
|
||||
from urllib import parse as urlparse
|
||||
except ImportError:
|
||||
import urlparse
|
||||
|
||||
|
||||
def validate_count(ctx, param, value):
|
||||
if value < 0 or value % 2 != 0:
|
||||
raise click.BadParameter('Should be a positive, even integer.')
|
||||
return value
|
||||
|
||||
|
||||
class URL(click.ParamType):
|
||||
name = 'url'
|
||||
|
||||
def convert(self, value, param, ctx):
|
||||
if not isinstance(value, tuple):
|
||||
value = urlparse.urlparse(value)
|
||||
if value.scheme not in ('http', 'https'):
|
||||
self.fail('invalid URL scheme (%s). Only HTTP URLs are '
|
||||
'allowed' % value.scheme, param, ctx)
|
||||
return value
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.option('--count', default=2, callback=validate_count,
|
||||
help='A positive even number.')
|
||||
@click.option('--foo', help='A mysterious parameter.')
|
||||
@click.option('--url', help='A URL', type=URL())
|
||||
@click.version_option()
|
||||
def cli(count, foo, url):
|
||||
"""Validation.
|
||||
|
||||
This example validates parameters in different ways. It does it
|
||||
through callbacks, through a custom type as well as by validating
|
||||
manually in the function.
|
||||
"""
|
||||
if foo is not None and foo != 'wat':
|
||||
raise click.BadParameter('If a value is provided it needs to be the '
|
||||
'value "wat".', param_hint=['--foo'])
|
||||
click.echo('count: %s' % count)
|
||||
click.echo('foo: %s' % foo)
|
||||
click.echo('url: %s' % repr(url))
|
25
third_party/python/Click/setup.cfg
vendored
25
third_party/python/Click/setup.cfg
vendored
@ -1,25 +0,0 @@
|
||||
[metadata]
|
||||
license_file = LICENSE.rst
|
||||
|
||||
[bdist_wheel]
|
||||
universal = 1
|
||||
|
||||
[tool:pytest]
|
||||
testpaths = tests
|
||||
|
||||
[coverage:run]
|
||||
branch = True
|
||||
source =
|
||||
click
|
||||
tests
|
||||
|
||||
[coverage:paths]
|
||||
source =
|
||||
click
|
||||
.tox/*/lib/python*/site-packages/click
|
||||
.tox/pypy/site-packages/click
|
||||
|
||||
[egg_info]
|
||||
tag_build =
|
||||
tag_date = 0
|
||||
|
44
third_party/python/Click/setup.py
vendored
44
third_party/python/Click/setup.py
vendored
@ -1,44 +0,0 @@
|
||||
import io
|
||||
import re
|
||||
from setuptools import setup
|
||||
|
||||
with io.open("README.rst", "rt", encoding="utf8") as f:
|
||||
readme = f.read()
|
||||
|
||||
with io.open("click/__init__.py", "rt", encoding="utf8") as f:
|
||||
version = re.search(r"__version__ = \'(.*?)\'", f.read()).group(1)
|
||||
|
||||
setup(
|
||||
name="Click",
|
||||
version=version,
|
||||
url="https://palletsprojects.com/p/click/",
|
||||
project_urls={
|
||||
"Documentation": "https://click.palletsprojects.com/",
|
||||
"Code": "https://github.com/pallets/click",
|
||||
"Issue tracker": "https://github.com/pallets/click/issues",
|
||||
},
|
||||
license="BSD",
|
||||
author="Armin Ronacher",
|
||||
author_email="armin.ronacher@active-4.com",
|
||||
maintainer="Pallets Team",
|
||||
maintainer_email="contact@palletsprojects.com",
|
||||
description="Composable command line interface toolkit",
|
||||
long_description=readme,
|
||||
packages=["click"],
|
||||
include_package_data=True,
|
||||
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
|
||||
classifiers=[
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: BSD License",
|
||||
"Operating System :: OS Independent",
|
||||
"Programming Language :: Python",
|
||||
"Programming Language :: Python :: 2",
|
||||
"Programming Language :: Python :: 2.7",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.4",
|
||||
"Programming Language :: Python :: 3.5",
|
||||
"Programming Language :: Python :: 3.6",
|
||||
"Programming Language :: Python :: 3.7",
|
||||
],
|
||||
)
|
39
third_party/python/Click/tox.ini
vendored
39
third_party/python/Click/tox.ini
vendored
@ -1,39 +0,0 @@
|
||||
[tox]
|
||||
envlist =
|
||||
py{37,36,35,34,27,py3,py}
|
||||
docs-html
|
||||
coverage-report
|
||||
skip_missing_interpreters = true
|
||||
|
||||
[testenv]
|
||||
passenv = LANG
|
||||
deps =
|
||||
pytest
|
||||
coverage
|
||||
colorama
|
||||
commands = coverage run -p -m pytest {posargs}
|
||||
|
||||
[testenv:docs-html]
|
||||
deps = -r docs/requirements.txt
|
||||
commands = sphinx-build -W -b html -d {envtmpdir}/doctrees docs {envtmpdir}/html
|
||||
|
||||
[testenv:docs-linkcheck]
|
||||
deps = -r docs/requirements.txt
|
||||
commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees docs {envtmpdir}/linkcheck
|
||||
|
||||
[testenv:coverage-report]
|
||||
deps = coverage
|
||||
skip_install = true
|
||||
commands =
|
||||
coverage combine
|
||||
coverage report
|
||||
coverage html
|
||||
|
||||
[testenv:codecov]
|
||||
passenv = CI TRAVIS TRAVIS_* APPVEYOR APPVEYOR_*
|
||||
deps = codecov
|
||||
skip_install = true
|
||||
commands =
|
||||
coverage combine
|
||||
coverage report
|
||||
codecov
|
784
third_party/python/Jinja2/CHANGES.rst
vendored
784
third_party/python/Jinja2/CHANGES.rst
vendored
@ -1,784 +0,0 @@
|
||||
.. currentmodule:: jinja2
|
||||
|
||||
Version 2.11.3
|
||||
--------------
|
||||
|
||||
Released 2021-01-31
|
||||
|
||||
- Improve the speed of the ``urlize`` filter by reducing regex
|
||||
backtracking. Email matching requires a word character at the start
|
||||
of the domain part, and only word characters in the TLD. :pr:`1343`
|
||||
|
||||
|
||||
Version 2.11.2
|
||||
--------------
|
||||
|
||||
Released 2020-04-13
|
||||
|
||||
- Fix a bug that caused callable objects with ``__getattr__``, like
|
||||
:class:`~unittest.mock.Mock` to be treated as a
|
||||
:func:`contextfunction`. :issue:`1145`
|
||||
- Update ``wordcount`` filter to trigger :class:`Undefined` methods
|
||||
by wrapping the input in :func:`soft_unicode`. :pr:`1160`
|
||||
- Fix a hang when displaying tracebacks on Python 32-bit.
|
||||
:issue:`1162`
|
||||
- Showing an undefined error for an object that raises
|
||||
``AttributeError`` on access doesn't cause a recursion error.
|
||||
:issue:`1177`
|
||||
- Revert changes to :class:`~loaders.PackageLoader` from 2.10 which
|
||||
removed the dependency on setuptools and pkg_resources, and added
|
||||
limited support for namespace packages. The changes caused issues
|
||||
when using Pytest. Due to the difficulty in supporting Python 2 and
|
||||
:pep:`451` simultaneously, the changes are reverted until 3.0.
|
||||
:pr:`1182`
|
||||
- Fix line numbers in error messages when newlines are stripped.
|
||||
:pr:`1178`
|
||||
- The special ``namespace()`` assignment object in templates works in
|
||||
async environments. :issue:`1180`
|
||||
- Fix whitespace being removed before tags in the middle of lines when
|
||||
``lstrip_blocks`` is enabled. :issue:`1138`
|
||||
- :class:`~nativetypes.NativeEnvironment` doesn't evaluate
|
||||
intermediate strings during rendering. This prevents early
|
||||
evaluation which could change the value of an expression.
|
||||
:issue:`1186`
|
||||
|
||||
|
||||
Version 2.11.1
|
||||
--------------
|
||||
|
||||
Released 2020-01-30
|
||||
|
||||
- Fix a bug that prevented looking up a key after an attribute
|
||||
(``{{ data.items[1:] }}``) in an async template. :issue:`1141`
|
||||
|
||||
|
||||
Version 2.11.0
|
||||
--------------
|
||||
|
||||
Released 2020-01-27
|
||||
|
||||
- Drop support for Python 2.6, 3.3, and 3.4. This will be the last
|
||||
version to support Python 2.7 and 3.5.
|
||||
- Added a new ``ChainableUndefined`` class to support getitem and
|
||||
getattr on an undefined object. :issue:`977`
|
||||
- Allow ``{%+`` syntax (with NOP behavior) when ``lstrip_blocks`` is
|
||||
disabled. :issue:`748`
|
||||
- Added a ``default`` parameter for the ``map`` filter. :issue:`557`
|
||||
- Exclude environment globals from
|
||||
:func:`meta.find_undeclared_variables`. :issue:`931`
|
||||
- Float literals can be written with scientific notation, like
|
||||
2.56e-3. :issue:`912`, :pr:`922`
|
||||
- Int and float literals can be written with the '_' separator for
|
||||
legibility, like 12_345. :pr:`923`
|
||||
- Fix a bug causing deadlocks in ``LRUCache.setdefault``. :pr:`1000`
|
||||
- The ``trim`` filter takes an optional string of characters to trim.
|
||||
:pr:`828`
|
||||
- A new ``jinja2.ext.debug`` extension adds a ``{% debug %}`` tag to
|
||||
quickly dump the current context and available filters and tests.
|
||||
:issue:`174`, :pr:`798, 983`
|
||||
- Lexing templates with large amounts of whitespace is much faster.
|
||||
:issue:`857`, :pr:`858`
|
||||
- Parentheses around comparisons are preserved, so
|
||||
``{{ 2 * (3 < 5) }}`` outputs "2" instead of "False".
|
||||
:issue:`755`, :pr:`938`
|
||||
- Add new ``boolean``, ``false``, ``true``, ``integer`` and ``float``
|
||||
tests. :pr:`824`
|
||||
- The environment's ``finalize`` function is only applied to the
|
||||
output of expressions (constant or not), not static template data.
|
||||
:issue:`63`
|
||||
- When providing multiple paths to ``FileSystemLoader``, a template
|
||||
can have the same name as a directory. :issue:`821`
|
||||
- Always return :class:`Undefined` when omitting the ``else`` clause
|
||||
in a ``{{ 'foo' if bar }}`` expression, regardless of the
|
||||
environment's ``undefined`` class. Omitting the ``else`` clause is a
|
||||
valid shortcut and should not raise an error when using
|
||||
:class:`StrictUndefined`. :issue:`710`, :pr:`1079`
|
||||
- Fix behavior of ``loop`` control variables such as ``length`` and
|
||||
``revindex0`` when looping over a generator. :issue:`459, 751, 794`,
|
||||
:pr:`993`
|
||||
- Async support is only loaded the first time an environment enables
|
||||
it, in order to avoid a slow initial import. :issue:`765`
|
||||
- In async environments, the ``|map`` filter will await the filter
|
||||
call if needed. :pr:`913`
|
||||
- In for loops that access ``loop`` attributes, the iterator is not
|
||||
advanced ahead of the current iteration unless ``length``,
|
||||
``revindex``, ``nextitem``, or ``last`` are accessed. This makes it
|
||||
less likely to break ``groupby`` results. :issue:`555`, :pr:`1101`
|
||||
- In async environments, the ``loop`` attributes ``length`` and
|
||||
``revindex`` work for async iterators. :pr:`1101`
|
||||
- In async environments, values from attribute/property access will
|
||||
be awaited if needed. :pr:`1101`
|
||||
- :class:`~loader.PackageLoader` doesn't depend on setuptools or
|
||||
pkg_resources. :issue:`970`
|
||||
- ``PackageLoader`` has limited support for :pep:`420` namespace
|
||||
packages. :issue:`1097`
|
||||
- Support :class:`os.PathLike` objects in
|
||||
:class:`~loader.FileSystemLoader` and :class:`~loader.ModuleLoader`.
|
||||
:issue:`870`
|
||||
- :class:`~nativetypes.NativeTemplate` correctly handles quotes
|
||||
between expressions. ``"'{{ a }}', '{{ b }}'"`` renders as the tuple
|
||||
``('1', '2')`` rather than the string ``'1, 2'``. :issue:`1020`
|
||||
- Creating a :class:`~nativetypes.NativeTemplate` directly creates a
|
||||
:class:`~nativetypes.NativeEnvironment` instead of a default
|
||||
:class:`Environment`. :issue:`1091`
|
||||
- After calling ``LRUCache.copy()``, the copy's queue methods point to
|
||||
the correct queue. :issue:`843`
|
||||
- Compiling templates always writes UTF-8 instead of defaulting to the
|
||||
system encoding. :issue:`889`
|
||||
- ``|wordwrap`` filter treats existing newlines as separate paragraphs
|
||||
to be wrapped individually, rather than creating short intermediate
|
||||
lines. :issue:`175`
|
||||
- Add ``break_on_hyphens`` parameter to ``|wordwrap`` filter.
|
||||
:issue:`550`
|
||||
- Cython compiled functions decorated as context functions will be
|
||||
passed the context. :pr:`1108`
|
||||
- When chained comparisons of constants are evaluated at compile time,
|
||||
the result follows Python's behavior of returning ``False`` if any
|
||||
comparison returns ``False``, rather than only the last one.
|
||||
:issue:`1102`
|
||||
- Tracebacks for exceptions in templates show the correct line numbers
|
||||
and source for Python >= 3.7. :issue:`1104`
|
||||
- Tracebacks for template syntax errors in Python 3 no longer show
|
||||
internal compiler frames. :issue:`763`
|
||||
- Add a ``DerivedContextReference`` node that can be used by
|
||||
extensions to get the current context and local variables such as
|
||||
``loop``. :issue:`860`
|
||||
- Constant folding during compilation is applied to some node types
|
||||
that were previously overlooked. :issue:`733`
|
||||
- ``TemplateSyntaxError.source`` is not empty when raised from an
|
||||
included template. :issue:`457`
|
||||
- Passing an ``Undefined`` value to ``get_template`` (such as through
|
||||
``extends``, ``import``, or ``include``), raises an
|
||||
``UndefinedError`` consistently. ``select_template`` will show the
|
||||
undefined message in the list of attempts rather than the empty
|
||||
string. :issue:`1037`
|
||||
- ``TemplateSyntaxError`` can be pickled. :pr:`1117`
|
||||
|
||||
|
||||
Version 2.10.3
|
||||
--------------
|
||||
|
||||
Released 2019-10-04
|
||||
|
||||
- Fix a typo in Babel entry point in ``setup.py`` that was preventing
|
||||
installation.
|
||||
|
||||
|
||||
Version 2.10.2
|
||||
--------------
|
||||
|
||||
Released 2019-10-04
|
||||
|
||||
- Fix Python 3.7 deprecation warnings.
|
||||
- Using ``range`` in the sandboxed environment uses ``xrange`` on
|
||||
Python 2 to avoid memory use. :issue:`933`
|
||||
- Use Python 3.7's better traceback support to avoid a core dump when
|
||||
using debug builds of Python 3.7. :issue:`1050`
|
||||
|
||||
|
||||
Version 2.10.1
|
||||
--------------
|
||||
|
||||
Released 2019-04-06
|
||||
|
||||
- ``SandboxedEnvironment`` securely handles ``str.format_map`` in
|
||||
order to prevent code execution through untrusted format strings.
|
||||
The sandbox already handled ``str.format``.
|
||||
|
||||
|
||||
Version 2.10
|
||||
------------
|
||||
|
||||
Released 2017-11-08
|
||||
|
||||
- Added a new extension node called ``OverlayScope`` which can be used
|
||||
to create an unoptimized scope that will look up all variables from
|
||||
a derived context.
|
||||
- Added an ``in`` test that works like the in operator. This can be
|
||||
used in combination with ``reject`` and ``select``.
|
||||
- Added ``previtem`` and ``nextitem`` to loop contexts, providing
|
||||
access to the previous/next item in the loop. If such an item does
|
||||
not exist, the value is undefined.
|
||||
- Added ``changed(*values)`` to loop contexts, providing an easy way
|
||||
of checking whether a value has changed since the last iteration (or
|
||||
rather since the last call of the method)
|
||||
- Added a ``namespace`` function that creates a special object which
|
||||
allows attribute assignment using the ``set`` tag. This can be used
|
||||
to carry data across scopes, e.g. from a loop body to code that
|
||||
comes after the loop.
|
||||
- Added a ``trimmed`` modifier to ``{% trans %}`` to strip linebreaks
|
||||
and surrounding whitespace. Also added a new policy to enable this
|
||||
for all ``trans`` blocks.
|
||||
- The ``random`` filter is no longer incorrectly constant folded and
|
||||
will produce a new random choice each time the template is rendered.
|
||||
:pr:`478`
|
||||
- Added a ``unique`` filter. :pr:`469`
|
||||
- Added ``min`` and ``max`` filters. :pr:`475`
|
||||
- Added tests for all comparison operators: ``eq``, ``ne``, ``lt``,
|
||||
``le``, ``gt``, ``ge``. :pr:`665`
|
||||
- ``import`` statement cannot end with a trailing comma. :pr:`617`,
|
||||
:pr:`618`
|
||||
- ``indent`` filter will not indent blank lines by default. :pr:`685`
|
||||
- Add ``reverse`` argument for ``dictsort`` filter. :pr:`692`
|
||||
- Add a ``NativeEnvironment`` that renders templates to native Python
|
||||
types instead of strings. :pr:`708`
|
||||
- Added filter support to the block ``set`` tag. :pr:`489`
|
||||
- ``tojson`` filter marks output as safe to match documented behavior.
|
||||
:pr:`718`
|
||||
- Resolved a bug where getting debug locals for tracebacks could
|
||||
modify template context.
|
||||
- Fixed a bug where having many ``{% elif ... %}`` blocks resulted in
|
||||
a "too many levels of indentation" error. These blocks now compile
|
||||
to native ``elif ..:`` instead of ``else: if ..:`` :issue:`759`
|
||||
|
||||
|
||||
Version 2.9.6
|
||||
-------------
|
||||
|
||||
Released 2017-04-03
|
||||
|
||||
- Fixed custom context behavior in fast resolve mode :issue:`675`
|
||||
|
||||
|
||||
Version 2.9.5
|
||||
-------------
|
||||
|
||||
Released 2017-01-28
|
||||
|
||||
- Restored the original repr of the internal ``_GroupTuple`` because
|
||||
this caused issues with ansible and it was an unintended change.
|
||||
:issue:`654`
|
||||
- Added back support for custom contexts that override the old
|
||||
``resolve`` method since it was hard for people to spot that this
|
||||
could cause a regression.
|
||||
- Correctly use the buffer for the else block of for loops. This
|
||||
caused invalid syntax errors to be caused on 2.x and completely
|
||||
wrong behavior on Python 3 :issue:`669`
|
||||
- Resolve an issue where the ``{% extends %}`` tag could not be used
|
||||
with async environments. :issue:`668`
|
||||
- Reduce memory footprint slightly by reducing our unicode database
|
||||
dump we use for identifier matching on Python 3 :issue:`666`
|
||||
- Fixed autoescaping not working for macros in async compilation mode.
|
||||
:issue:`671`
|
||||
|
||||
|
||||
Version 2.9.4
|
||||
-------------
|
||||
|
||||
Released 2017-01-10
|
||||
|
||||
- Solved some warnings for string literals. :issue:`646`
|
||||
- Increment the bytecode cache version which was not done due to an
|
||||
oversight before.
|
||||
- Corrected bad code generation and scoping for filtered loops.
|
||||
:issue:`649`
|
||||
- Resolved an issue where top-level output silencing after known
|
||||
extend blocks could generate invalid code when blocks where
|
||||
contained in if statements. :issue:`651`
|
||||
- Made the ``truncate.leeway`` default configurable to improve
|
||||
compatibility with older templates.
|
||||
|
||||
|
||||
Version 2.9.3
|
||||
-------------
|
||||
|
||||
Released 2017-01-08
|
||||
|
||||
- Restored the use of blocks in macros to the extend that was possible
|
||||
before. On Python 3 it would render a generator repr instead of the
|
||||
block contents. :issue:`645`
|
||||
- Set a consistent behavior for assigning of variables in inner scopes
|
||||
when the variable is also read from an outer scope. This now sets
|
||||
the intended behavior in all situations however it does not restore
|
||||
the old behavior where limited assignments to outer scopes was
|
||||
possible. For more information and a discussion see :issue:`641`
|
||||
- Resolved an issue where ``block scoped`` would not take advantage of
|
||||
the new scoping rules. In some more exotic cases a variable
|
||||
overriden in a local scope would not make it into a block.
|
||||
- Change the code generation of the ``with`` statement to be in line
|
||||
with the new scoping rules. This resolves some unlikely bugs in edge
|
||||
cases. This also introduces a new internal ``With`` node that can be
|
||||
used by extensions.
|
||||
|
||||
|
||||
Version 2.9.2
|
||||
-------------
|
||||
|
||||
Released 2017-01-08
|
||||
|
||||
- Fixed a regression that caused for loops to not be able to use the
|
||||
same variable for the target as well as source iterator.
|
||||
:issue:`640`
|
||||
- Add support for a previously unknown behavior of macros. It used to
|
||||
be possible in some circumstances to explicitly provide a caller
|
||||
argument to macros. While badly buggy and unintended it turns out
|
||||
that this is a common case that gets copy pasted around. To not
|
||||
completely break backwards compatibility with the most common cases
|
||||
it's now possible to provide an explicit keyword argument for caller
|
||||
if it's given an explicit default. :issue:`642`
|
||||
|
||||
|
||||
Version 2.9.1
|
||||
-------------
|
||||
|
||||
Released 2017-01-07
|
||||
|
||||
- Resolved a regression with call block scoping for macros. Nested
|
||||
caller blocks that used the same identifiers as outer macros could
|
||||
refer to the wrong variable incorrectly.
|
||||
|
||||
|
||||
Version 2.9
|
||||
-----------
|
||||
|
||||
Released 2017-01-07, codename Derivation
|
||||
|
||||
- Change cache key definition in environment. This fixes a performance
|
||||
regression introduced in 2.8.
|
||||
- Added support for ``generator_stop`` on supported Python versions
|
||||
(Python 3.5 and later)
|
||||
- Corrected a long standing issue with operator precedence of math
|
||||
operations not being what was expected.
|
||||
- Added support for Python 3.6 async iterators through a new async
|
||||
mode.
|
||||
- Added policies for filter defaults and similar things.
|
||||
- Urlize now sets "rel noopener" by default.
|
||||
- Support attribute fallback for old-style classes in 2.x.
|
||||
- Support toplevel set statements in extend situations.
|
||||
- Restored behavior of Cycler for Python 3 users.
|
||||
- Subtraction now follows the same behavior as other operators on
|
||||
undefined values.
|
||||
- ``map`` and friends will now give better error messages if you
|
||||
forgot to quote the parameter.
|
||||
- Depend on MarkupSafe 0.23 or higher.
|
||||
- Improved the ``truncate`` filter to support better truncation in
|
||||
case the string is barely truncated at all.
|
||||
- Change the logic for macro autoescaping to be based on the runtime
|
||||
autoescaping information at call time instead of macro define time.
|
||||
- Ported a modified version of the ``tojson`` filter from Flask to
|
||||
Jinja and hooked it up with the new policy framework.
|
||||
- Block sets are now marked ``safe`` by default.
|
||||
- On Python 2 the asciification of ASCII strings can now be disabled
|
||||
with the ``compiler.ascii_str`` policy.
|
||||
- Tests now no longer accept an arbitrary expression as first argument
|
||||
but a restricted one. This means that you can now properly use
|
||||
multiple tests in one expression without extra parentheses. In
|
||||
particular you can now write ``foo is divisibleby 2 or foo is
|
||||
divisibleby 3`` as you would expect.
|
||||
- Greatly changed the scoping system to be more consistent with what
|
||||
template designers and developers expect. There is now no more magic
|
||||
difference between the different include and import constructs.
|
||||
Context is now always propagated the same way. The only remaining
|
||||
differences is the defaults for ``with context`` and ``without
|
||||
context``.
|
||||
- The ``with`` and ``autoescape`` tags are now built-in.
|
||||
- Added the new ``select_autoescape`` function which helps configuring
|
||||
better autoescaping easier.
|
||||
- Fixed a runtime error in the sandbox when attributes of async
|
||||
generators were accessed.
|
||||
|
||||
|
||||
Version 2.8.1
|
||||
-------------
|
||||
|
||||
Released 2016-12-29
|
||||
|
||||
- Fixed the ``for_qs`` flag for ``urlencode``.
|
||||
- Fixed regression when applying ``int`` to non-string values.
|
||||
- SECURITY: if the sandbox mode is used format expressions are now
|
||||
sandboxed with the same rules as in Jinja. This solves various
|
||||
information leakage problems that can occur with format strings.
|
||||
|
||||
|
||||
Version 2.8
|
||||
-----------
|
||||
|
||||
Released 2015-07-26, codename Replacement
|
||||
|
||||
- Added ``target`` parameter to urlize function.
|
||||
- Added support for ``followsymlinks`` to the file system loader.
|
||||
- The truncate filter now counts the length.
|
||||
- Added equalto filter that helps with select filters.
|
||||
- Changed cache keys to use absolute file names if available instead
|
||||
of load names.
|
||||
- Fixed loop length calculation for some iterators.
|
||||
- Changed how Jinja enforces strings to be native strings in Python 2
|
||||
to work when people break their default encoding.
|
||||
- Added ``make_logging_undefined`` which returns an undefined
|
||||
object that logs failures into a logger.
|
||||
- If unmarshalling of cached data fails the template will be reloaded
|
||||
now.
|
||||
- Implemented a block ``set`` tag.
|
||||
- Default cache size was increased to 400 from a low 50.
|
||||
- Fixed ``is number`` test to accept long integers in all Python
|
||||
versions.
|
||||
- Changed ``is number`` to accept Decimal as a number.
|
||||
- Added a check for default arguments followed by non-default
|
||||
arguments. This change makes ``{% macro m(x, y=1, z) %}`` a syntax
|
||||
error. The previous behavior for this code was broken anyway
|
||||
(resulting in the default value being applied to ``y``).
|
||||
- Add ability to use custom subclasses of
|
||||
``jinja2.compiler.CodeGenerator`` and ``jinja2.runtime.Context`` by
|
||||
adding two new attributes to the environment
|
||||
(``code_generator_class`` and ``context_class``). :pr:`404`
|
||||
- Added support for context/environment/evalctx decorator functions on
|
||||
the finalize callback of the environment.
|
||||
- Escape query strings for urlencode properly. Previously slashes were
|
||||
not escaped in that place.
|
||||
- Add 'base' parameter to 'int' filter.
|
||||
|
||||
|
||||
Version 2.7.3
|
||||
-------------
|
||||
|
||||
Released 2014-06-06
|
||||
|
||||
- Security issue: Corrected the security fix for the cache folder.
|
||||
This fix was provided by RedHat.
|
||||
|
||||
|
||||
Version 2.7.2
|
||||
-------------
|
||||
|
||||
Released 2014-01-10
|
||||
|
||||
- Prefix loader was not forwarding the locals properly to inner
|
||||
loaders. This is now fixed.
|
||||
- Security issue: Changed the default folder for the filesystem cache
|
||||
to be user specific and read and write protected on UNIX systems.
|
||||
See `Debian bug 734747`_ for more information.
|
||||
|
||||
.. _Debian bug 734747: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734747
|
||||
|
||||
|
||||
Version 2.7.1
|
||||
-------------
|
||||
|
||||
Released 2013-08-07
|
||||
|
||||
- Fixed a bug with ``call_filter`` not working properly on environment
|
||||
and context filters.
|
||||
- Fixed lack of Python 3 support for bytecode caches.
|
||||
- Reverted support for defining blocks in included templates as this
|
||||
broke existing templates for users.
|
||||
- Fixed some warnings with hashing of undefineds and nodes if Python
|
||||
is run with warnings for Python 3.
|
||||
- Added support for properly hashing undefined objects.
|
||||
- Fixed a bug with the title filter not working on already uppercase
|
||||
strings.
|
||||
|
||||
|
||||
Version 2.7
|
||||
-----------
|
||||
|
||||
Released 2013-05-20, codename Translation
|
||||
|
||||
- Choice and prefix loaders now dispatch source and template lookup
|
||||
separately in order to work in combination with module loaders as
|
||||
advertised.
|
||||
- Fixed filesizeformat.
|
||||
- Added a non-silent option for babel extraction.
|
||||
- Added ``urlencode`` filter that automatically quotes values for URL
|
||||
safe usage with utf-8 as only supported encoding. If applications
|
||||
want to change this encoding they can override the filter.
|
||||
- Added ``keep-trailing-newline`` configuration to environments and
|
||||
templates to optionally preserve the final trailing newline.
|
||||
- Accessing ``last`` on the loop context no longer causes the iterator
|
||||
to be consumed into a list.
|
||||
- Python requirement changed: 2.6, 2.7 or >= 3.3 are required now,
|
||||
supported by same source code, using the "six" compatibility
|
||||
library.
|
||||
- Allow ``contextfunction`` and other decorators to be applied to
|
||||
``__call__``.
|
||||
- Added support for changing from newline to different signs in the
|
||||
``wordwrap`` filter.
|
||||
- Added support for ignoring memcache errors silently.
|
||||
- Added support for keeping the trailing newline in templates.
|
||||
- Added finer grained support for stripping whitespace on the left
|
||||
side of blocks.
|
||||
- Added ``map``, ``select``, ``reject``, ``selectattr`` and
|
||||
``rejectattr`` filters.
|
||||
- Added support for ``loop.depth`` to figure out how deep inside a
|
||||
recursive loop the code is.
|
||||
- Disabled py_compile for pypy and python 3.
|
||||
|
||||
|
||||
Version 2.6
|
||||
-----------
|
||||
|
||||
Released 2011-07-24, codename Convolution
|
||||
|
||||
- Internal attributes now raise an internal attribute error now
|
||||
instead of returning an undefined. This fixes problems when passing
|
||||
undefined objects to Python semantics expecting APIs.
|
||||
- Traceback support now works properly for PyPy. (Tested with 1.4)
|
||||
- Implemented operator intercepting for sandboxed environments. This
|
||||
allows application developers to disable builtin operators for
|
||||
better security. (For instance limit the mathematical operators to
|
||||
actual integers instead of longs)
|
||||
- Groupby filter now supports dotted notation for grouping by
|
||||
attributes of attributes.
|
||||
- Scoped blocks now properly treat toplevel assignments and imports.
|
||||
Previously an import suddenly "disappeared" in a scoped block.
|
||||
- Automatically detect newer Python interpreter versions before
|
||||
loading code from bytecode caches to prevent segfaults on invalid
|
||||
opcodes. The segfault in earlier Jinja versions here was not a
|
||||
Jinja bug but a limitation in the underlying Python interpreter. If
|
||||
you notice Jinja segfaulting in earlier versions after an upgrade
|
||||
of the Python interpreter you don't have to upgrade, it's enough to
|
||||
flush the bytecode cache. This just no longer makes this necessary,
|
||||
Jinja will automatically detect these cases now.
|
||||
- The sum filter can now sum up values by attribute. This is a
|
||||
backwards incompatible change. The argument to the filter previously
|
||||
was the optional starting index which defaults to zero. This now
|
||||
became the second argument to the function because it's rarely used.
|
||||
- Like sum, sort now also makes it possible to order items by
|
||||
attribute.
|
||||
- Like sum and sort, join now also is able to join attributes of
|
||||
objects as string.
|
||||
- The internal eval context now has a reference to the environment.
|
||||
- Added a mapping test to see if an object is a dict or an object with
|
||||
a similar interface.
|
||||
|
||||
|
||||
Version 2.5.5
|
||||
-------------
|
||||
|
||||
Released 2010-10-18
|
||||
|
||||
- Built documentation is no longer part of release.
|
||||
|
||||
|
||||
Version 2.5.4
|
||||
-------------
|
||||
|
||||
Released 2010-10-17
|
||||
|
||||
- Fixed extensions not loading properly with overlays.
|
||||
- Work around a bug in cpython for the debugger that causes segfaults
|
||||
on 64bit big-endian architectures.
|
||||
|
||||
|
||||
Version 2.5.3
|
||||
-------------
|
||||
|
||||
Released 2010-10-17
|
||||
|
||||
- Fixed an operator precedence error introduced in 2.5.2. Statements
|
||||
like "-foo.bar" had their implicit parentheses applied around the
|
||||
first part of the expression ("(-foo).bar") instead of the more
|
||||
correct "-(foo.bar)".
|
||||
|
||||
|
||||
Version 2.5.2
|
||||
-------------
|
||||
|
||||
Released 2010-08-18
|
||||
|
||||
- Improved setup.py script to better work with assumptions people
|
||||
might still have from it (``--with-speedups``).
|
||||
- Fixed a packaging error that excluded the new debug support.
|
||||
|
||||
|
||||
Version 2.5.1
|
||||
-------------
|
||||
|
||||
Released 2010-08-17
|
||||
|
||||
- StopIteration exceptions raised by functions called from templates
|
||||
are now intercepted and converted to undefineds. This solves a lot
|
||||
of debugging grief. (StopIteration is used internally to abort
|
||||
template execution)
|
||||
- Improved performance of macro calls slightly.
|
||||
- Babel extraction can now properly extract newstyle gettext calls.
|
||||
- Using the variable ``num`` in newstyle gettext for something else
|
||||
than the pluralize count will no longer raise a :exc:`KeyError`.
|
||||
- Removed builtin markup class and switched to markupsafe. For
|
||||
backwards compatibility the pure Python implementation still exists
|
||||
but is pulled from markupsafe by the Jinja developers. The debug
|
||||
support went into a separate feature called "debugsupport" and is
|
||||
disabled by default because it is only relevant for Python 2.4
|
||||
- Fixed an issue with unary operators having the wrong precedence.
|
||||
|
||||
|
||||
Version 2.5
|
||||
-----------
|
||||
|
||||
Released 2010-05-29, codename Incoherence
|
||||
|
||||
- Improved the sort filter (should have worked like this for a long
|
||||
time) by adding support for case insensitive searches.
|
||||
- Fixed a bug for getattribute constant folding.
|
||||
- Support for newstyle gettext translations which result in a nicer
|
||||
in-template user interface and more consistent catalogs.
|
||||
- It's now possible to register extensions after an environment was
|
||||
created.
|
||||
|
||||
|
||||
Version 2.4.1
|
||||
-------------
|
||||
|
||||
Released 2010-04-20
|
||||
|
||||
- Fixed an error reporting bug for undefined.
|
||||
|
||||
|
||||
Version 2.4
|
||||
-----------
|
||||
|
||||
Released 2010-04-13, codename Correlation
|
||||
|
||||
- The environment template loading functions now transparently pass
|
||||
through a template object if it was passed to it. This makes it
|
||||
possible to import or extend from a template object that was passed
|
||||
to the template.
|
||||
- Added a ``ModuleLoader`` that can load templates from
|
||||
precompiled sources. The environment now features a method to
|
||||
compile the templates from a configured loader into a zip file or
|
||||
folder.
|
||||
- The _speedups C extension now supports Python 3.
|
||||
- Added support for autoescaping toggling sections and support for
|
||||
evaluation contexts.
|
||||
- Extensions have a priority now.
|
||||
|
||||
|
||||
Version 2.3.1
|
||||
-------------
|
||||
|
||||
Released 2010-02-19
|
||||
|
||||
- Fixed an error reporting bug on all python versions
|
||||
- Fixed an error reporting bug on Python 2.4
|
||||
|
||||
|
||||
Version 2.3
|
||||
-----------
|
||||
|
||||
Released 2010-02-10, codename 3000 Pythons
|
||||
|
||||
- Fixes issue with code generator that causes unbound variables to be
|
||||
generated if set was used in if-blocks and other small identifier
|
||||
problems.
|
||||
- Include tags are now able to select between multiple templates and
|
||||
take the first that exists, if a list of templates is given.
|
||||
- Fixed a problem with having call blocks in outer scopes that have an
|
||||
argument that is also used as local variable in an inner frame
|
||||
:issue:`360`.
|
||||
- Greatly improved error message reporting :pr:`339`
|
||||
- Implicit tuple expressions can no longer be totally empty. This
|
||||
change makes ``{% if %}`` a syntax error now. :issue:`364`
|
||||
- Added support for translator comments if extracted via babel.
|
||||
- Added with-statement extension.
|
||||
- Experimental Python 3 support.
|
||||
|
||||
|
||||
Version 2.2.1
|
||||
-------------
|
||||
|
||||
Released 2009-09-14
|
||||
|
||||
- Fixes some smaller problems for Jinja on Jython.
|
||||
|
||||
|
||||
Version 2.2
|
||||
-----------
|
||||
|
||||
Released 2009-09-13, codename Kong
|
||||
|
||||
- Include statements can now be marked with ``ignore missing`` to skip
|
||||
non existing templates.
|
||||
- Priority of ``not`` raised. It's now possible to write ``not foo in
|
||||
bar`` as an alias to ``foo not in bar`` like in python. Previously
|
||||
the grammar required parentheses (``not (foo in bar)``) which was
|
||||
odd.
|
||||
- Fixed a bug that caused syntax errors when defining macros or using
|
||||
the ``{% call %}`` tag inside loops.
|
||||
- Fixed a bug in the parser that made ``{{ foo[1, 2] }}`` impossible.
|
||||
- Made it possible to refer to names from outer scopes in included
|
||||
templates that were unused in the callers frame :issue:`327`
|
||||
- Fixed a bug that caused internal errors if names where used as
|
||||
iteration variable and regular variable *after* the loop if that
|
||||
variable was unused *before* the loop. :pr:`331`
|
||||
- Added support for optional ``scoped`` modifier to blocks.
|
||||
- Added support for line-comments.
|
||||
- Added the ``meta`` module.
|
||||
- Renamed (undocumented) attribute "overlay" to "overlayed" on the
|
||||
environment because it was clashing with a method of the same name.
|
||||
- Speedup extension is now disabled by default.
|
||||
|
||||
|
||||
Version 2.1.1
|
||||
-------------
|
||||
|
||||
Released 2008-12-25
|
||||
|
||||
- Fixed a translation error caused by looping over empty recursive
|
||||
loops.
|
||||
|
||||
|
||||
Version 2.1
|
||||
-----------
|
||||
|
||||
Released 2008-11-23, codename Yasuzō
|
||||
|
||||
- Fixed a bug with nested loops and the special loop variable. Before
|
||||
the change an inner loop overwrote the loop variable from the outer
|
||||
one after iteration.
|
||||
- Fixed a bug with the i18n extension that caused the explicit
|
||||
pluralization block to look up the wrong variable.
|
||||
- Fixed a limitation in the lexer that made ``{{ foo.0.0 }}``
|
||||
impossible.
|
||||
- Index based subscribing of variables with a constant value returns
|
||||
an undefined object now instead of raising an index error. This was
|
||||
a bug caused by eager optimizing.
|
||||
- The i18n extension looks up ``foo.ugettext`` now followed by
|
||||
``foo.gettext`` if an translations object is installed. This makes
|
||||
dealing with custom translations classes easier.
|
||||
- Fixed a confusing behavior with conditional extending. loops were
|
||||
partially executed under some conditions even though they were not
|
||||
part of a visible area.
|
||||
- Added ``sort`` filter that works like ``dictsort`` but for arbitrary
|
||||
sequences.
|
||||
- Fixed a bug with empty statements in macros.
|
||||
- Implemented a bytecode cache system.
|
||||
- The template context is now weakref-able
|
||||
- Inclusions and imports "with context" forward all variables now, not
|
||||
only the initial context.
|
||||
- Added a cycle helper called ``cycler``.
|
||||
- Added a joining helper called ``joiner``.
|
||||
- Added a ``compile_expression`` method to the environment that allows
|
||||
compiling of Jinja expressions into callable Python objects.
|
||||
- Fixed an escaping bug in urlize
|
||||
|
||||
|
||||
Version 2.0
|
||||
-----------
|
||||
|
||||
Released 2008-07-17, codename Jinjavitus
|
||||
|
||||
- The subscribing of objects (looking up attributes and items) changed
|
||||
from slightly. It's now possible to give attributes or items a
|
||||
higher priority by either using dot-notation lookup or the bracket
|
||||
syntax. This also changed the AST slightly. ``Subscript`` is gone
|
||||
and was replaced with ``Getitem`` and ``Getattr``.
|
||||
- Added support for preprocessing and token stream filtering for
|
||||
extensions. This would allow extensions to allow simplified gettext
|
||||
calls in template data and something similar.
|
||||
- Added ``TemplateStream.dump``.
|
||||
- Added missing support for implicit string literal concatenation.
|
||||
``{{ "foo" "bar" }}`` is equivalent to ``{{ "foobar" }}``
|
||||
- ``else`` is optional for conditional expressions. If not given it
|
||||
evaluates to ``false``.
|
||||
- Improved error reporting for undefined values by providing a
|
||||
position.
|
||||
- ``filesizeformat`` filter uses decimal prefixes now per default and
|
||||
can be set to binary mode with the second parameter.
|
||||
- Fixed bug in finalizer
|
||||
|
||||
|
||||
Version 2.0rc1
|
||||
--------------
|
||||
|
||||
Released 2008-06-09
|
||||
|
||||
- First release of Jinja 2.
|
@ -1,3 +1,41 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: Jinja2
|
||||
Version: 2.11.3
|
||||
Summary: A very fast and expressive template engine.
|
||||
Home-page: https://palletsprojects.com/p/jinja/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
Maintainer: Pallets
|
||||
Maintainer-email: contact@palletsprojects.com
|
||||
License: BSD-3-Clause
|
||||
Project-URL: Documentation, https://jinja.palletsprojects.com/
|
||||
Project-URL: Code, https://github.com/pallets/jinja
|
||||
Project-URL: Issue tracker, https://github.com/pallets/jinja/issues
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
|
||||
Description-Content-Type: text/x-rst
|
||||
Requires-Dist: MarkupSafe (>=0.23)
|
||||
Provides-Extra: i18n
|
||||
Requires-Dist: Babel (>=0.8) ; extra == 'i18n'
|
||||
|
||||
Jinja
|
||||
=====
|
||||
|
||||
@ -64,3 +102,5 @@ Links
|
||||
- Issue tracker: https://github.com/pallets/jinja/issues
|
||||
- Test status: https://dev.azure.com/pallets/jinja/_build
|
||||
- Official chat: https://discord.gg/t6rrQZH
|
||||
|
||||
|
33
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/RECORD
vendored
Normal file
33
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/RECORD
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
jinja2/__init__.py,sha256=LZUXmxJc2GIchfSAeMWsxCWiQYO-w1-736f2Q3I8ms8,1549
|
||||
jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191
|
||||
jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775
|
||||
jinja2/asyncfilters.py,sha256=XJtYXTxFvcJ5xwk6SaDL4S0oNnT0wPYvXBCSzc482fI,4250
|
||||
jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209
|
||||
jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139
|
||||
jinja2/compiler.py,sha256=Ta9W1Lit542wItAHXlDcg0sEOsFDMirCdlFPHAurg4o,66284
|
||||
jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458
|
||||
jinja2/debug.py,sha256=neR7GIGGjZH3_ILJGVUYy3eLQCCaWJMXOb7o0kGInWc,8529
|
||||
jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126
|
||||
jinja2/environment.py,sha256=XDSLKc4SqNLMOwTSq3TbWEyA5WyXfuLuVD0wAVjEFwM,50629
|
||||
jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425
|
||||
jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441
|
||||
jinja2/filters.py,sha256=9ORilsZrUoydSI9upz8_qGy7gozDWLYoFmlIBFSVRnQ,41439
|
||||
jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211
|
||||
jinja2/lexer.py,sha256=nUFLRKhhKmmEWkLI65nQePgcQs7qsRdjVYZETMt_v0g,30331
|
||||
jinja2/loaders.py,sha256=C-fST_dmFjgWkp0ZuCkrgICAoOsoSIF28wfAFink0oU,17666
|
||||
jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131
|
||||
jinja2/nativetypes.py,sha256=Ul__gtVw4xH-0qvUvnCNHedQeNDwmEuyLJztzzSPeRg,2753
|
||||
jinja2/nodes.py,sha256=Mk1oJPVgIjnQw9WOqILvcu3rLepcFZ0ahxQm2mbwDwc,31095
|
||||
jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457
|
||||
jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660
|
||||
jinja2/runtime.py,sha256=0y-BRyIEZ9ltByL2Id6GpHe1oDRQAwNeQvI0SKobNMw,30618
|
||||
jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127
|
||||
jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799
|
||||
jinja2/utils.py,sha256=Wy4yC3IByqUWwnKln6SdaixdzgK74P6F5nf-gQZrYnU,22436
|
||||
jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240
|
||||
Jinja2-2.11.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
|
||||
Jinja2-2.11.3.dist-info/METADATA,sha256=PscpJ1C3RSp8xcjV3fAuTz13rKbGxmzJXnMQFH-WKhs,3535
|
||||
Jinja2-2.11.3.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
|
||||
Jinja2-2.11.3.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61
|
||||
Jinja2-2.11.3.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
|
||||
Jinja2-2.11.3.dist-info/RECORD,,
|
6
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/WHEEL
vendored
Normal file
6
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/WHEEL
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.36.2)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py2-none-any
|
||||
Tag: py3-none-any
|
||||
|
3
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/entry_points.txt
vendored
Normal file
3
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/entry_points.txt
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[babel.extractors]
|
||||
jinja2 = jinja2.ext:babel_extract [i18n]
|
||||
|
1
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/top_level.txt
vendored
Normal file
1
third_party/python/Jinja2/Jinja2-2.11.3.dist-info/top_level.txt
vendored
Normal file
@ -0,0 +1 @@
|
||||
jinja2
|
9
third_party/python/Jinja2/MANIFEST.in
vendored
9
third_party/python/Jinja2/MANIFEST.in
vendored
@ -1,9 +0,0 @@
|
||||
include CHANGES.rst
|
||||
include tox.ini
|
||||
graft artwork
|
||||
graft docs
|
||||
prune docs/_build
|
||||
graft examples
|
||||
graft ext
|
||||
graft tests
|
||||
global-exclude *.pyc
|
102
third_party/python/Jinja2/PKG-INFO
vendored
102
third_party/python/Jinja2/PKG-INFO
vendored
@ -1,102 +0,0 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: Jinja2
|
||||
Version: 2.11.3
|
||||
Summary: A very fast and expressive template engine.
|
||||
Home-page: https://palletsprojects.com/p/jinja/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
Maintainer: Pallets
|
||||
Maintainer-email: contact@palletsprojects.com
|
||||
License: BSD-3-Clause
|
||||
Project-URL: Documentation, https://jinja.palletsprojects.com/
|
||||
Project-URL: Code, https://github.com/pallets/jinja
|
||||
Project-URL: Issue tracker, https://github.com/pallets/jinja/issues
|
||||
Description: Jinja
|
||||
=====
|
||||
|
||||
Jinja is a fast, expressive, extensible templating engine. Special
|
||||
placeholders in the template allow writing code similar to Python
|
||||
syntax. Then the template is passed data to render the final document.
|
||||
|
||||
It includes:
|
||||
|
||||
- Template inheritance and inclusion.
|
||||
- Define and import macros within templates.
|
||||
- HTML templates can use autoescaping to prevent XSS from untrusted
|
||||
user input.
|
||||
- A sandboxed environment can safely render untrusted templates.
|
||||
- AsyncIO support for generating templates and calling async
|
||||
functions.
|
||||
- I18N support with Babel.
|
||||
- Templates are compiled to optimized Python code just-in-time and
|
||||
cached, or can be compiled ahead-of-time.
|
||||
- Exceptions point to the correct line in templates to make debugging
|
||||
easier.
|
||||
- Extensible filters, tests, functions, and even syntax.
|
||||
|
||||
Jinja's philosophy is that while application logic belongs in Python if
|
||||
possible, it shouldn't make the template designer's job difficult by
|
||||
restricting functionality too much.
|
||||
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
Install and update using `pip`_:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
$ pip install -U Jinja2
|
||||
|
||||
.. _pip: https://pip.pypa.io/en/stable/quickstart/
|
||||
|
||||
|
||||
In A Nutshell
|
||||
-------------
|
||||
|
||||
.. code-block:: jinja
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Members{% endblock %}
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for user in users %}
|
||||
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
- Website: https://palletsprojects.com/p/jinja/
|
||||
- Documentation: https://jinja.palletsprojects.com/
|
||||
- Releases: https://pypi.org/project/Jinja2/
|
||||
- Code: https://github.com/pallets/jinja
|
||||
- Issue tracker: https://github.com/pallets/jinja/issues
|
||||
- Test status: https://dev.azure.com/pallets/jinja/_build
|
||||
- Official chat: https://discord.gg/t6rrQZH
|
||||
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
|
||||
Description-Content-Type: text/x-rst
|
||||
Provides-Extra: i18n
|
132
third_party/python/Jinja2/artwork/jinjalogo.svg
vendored
132
third_party/python/Jinja2/artwork/jinjalogo.svg
vendored
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 18 KiB |
@ -1,18 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
|
||||
env = Environment(
|
||||
line_statement_prefix="#", variable_start_string="${", variable_end_string="}"
|
||||
)
|
||||
print(
|
||||
env.from_string(
|
||||
"""\
|
||||
<ul>
|
||||
# for item in range(10)
|
||||
<li class="${loop.cycle('odd', 'even')}">${item}</li>
|
||||
# endfor
|
||||
</ul>\
|
||||
"""
|
||||
).render()
|
||||
)
|
@ -1,8 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
from jinja2.loaders import FileSystemLoader
|
||||
|
||||
env = Environment(loader=FileSystemLoader("templates"))
|
||||
tmpl = env.get_template("broken.html")
|
||||
print(tmpl.render(seq=[3, 2, 4, 5, 3, 2, 0, 2, 1]))
|
@ -1,15 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
from jinja2.loaders import DictLoader
|
||||
|
||||
env = Environment(
|
||||
loader=DictLoader(
|
||||
{
|
||||
"a": "[A[{% block body %}{% endblock %}]]",
|
||||
"b": "{% extends 'a' %}{% block body %}[B]{% endblock %}",
|
||||
"c": "{% extends 'b' %}{% block body %}###{{ super() }}###{% endblock %}",
|
||||
}
|
||||
)
|
||||
)
|
||||
print(env.get_template("c").render())
|
@ -1,6 +0,0 @@
|
||||
{% from 'subbroken.html' import may_break %}
|
||||
<ul>
|
||||
{% for item in seq %}
|
||||
<li>{{ may_break(item) }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
@ -1,3 +0,0 @@
|
||||
{% macro may_break(item) -%}
|
||||
[{{ item / 0 }}]
|
||||
{%- endmacro %}
|
31
third_party/python/Jinja2/examples/basic/test.py
vendored
31
third_party/python/Jinja2/examples/basic/test.py
vendored
@ -1,31 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
from jinja2.loaders import DictLoader
|
||||
|
||||
env = Environment(
|
||||
loader=DictLoader(
|
||||
{
|
||||
"child.html": u"""\
|
||||
{% extends master_layout or 'master.html' %}
|
||||
{% include helpers = 'helpers.html' %}
|
||||
{% macro get_the_answer() %}42{% endmacro %}
|
||||
{% title = 'Hello World' %}
|
||||
{% block body %}
|
||||
{{ get_the_answer() }}
|
||||
{{ helpers.conspirate() }}
|
||||
{% endblock %}
|
||||
""",
|
||||
"master.html": u"""\
|
||||
<!doctype html>
|
||||
<title>{{ title }}</title>
|
||||
{% block body %}{% endblock %}
|
||||
""",
|
||||
"helpers.html": u"""\
|
||||
{% macro conspirate() %}23{% endmacro %}
|
||||
""",
|
||||
}
|
||||
)
|
||||
)
|
||||
tmpl = env.get_template("child.html")
|
||||
print(tmpl.render())
|
@ -1,29 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
|
||||
env = Environment(
|
||||
line_statement_prefix="%", variable_start_string="${", variable_end_string="}"
|
||||
)
|
||||
tmpl = env.from_string(
|
||||
"""\
|
||||
% macro foo()
|
||||
${caller(42)}
|
||||
% endmacro
|
||||
<ul>
|
||||
% for item in seq
|
||||
<li>${item}</li>
|
||||
% endfor
|
||||
</ul>
|
||||
% call(var) foo()
|
||||
[${var}]
|
||||
% endcall
|
||||
% filter escape
|
||||
<hello world>
|
||||
% for item in [1, 2, 3]
|
||||
- ${item}
|
||||
% endfor
|
||||
% endfilter
|
||||
"""
|
||||
)
|
||||
print(tmpl.render(seq=range(10)))
|
@ -1,15 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
|
||||
tmpl = Environment().from_string(
|
||||
"""\
|
||||
<ul>
|
||||
{%- for item in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] if item % 2 == 0 %}
|
||||
<li>{{ loop.index }} / {{ loop.length }}: {{ item }}</li>
|
||||
{%- endfor %}
|
||||
</ul>
|
||||
if condition: {{ 1 if foo else 0 }}
|
||||
"""
|
||||
)
|
||||
print(tmpl.render(foo=True))
|
@ -1,20 +0,0 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from jinja2 import Environment
|
||||
|
||||
env = Environment(extensions=["jinja2.ext.i18n"])
|
||||
env.globals["gettext"] = {"Hello %(user)s!": "Hallo %(user)s!"}.__getitem__
|
||||
env.globals["ngettext"] = lambda s, p, n: {
|
||||
"%(count)s user": "%(count)d Benutzer",
|
||||
"%(count)s users": "%(count)d Benutzer",
|
||||
}[n == 1 and s or p]
|
||||
print(
|
||||
env.from_string(
|
||||
"""\
|
||||
{% trans %}Hello {{ user }}!{% endtrans %}
|
||||
{% trans count=users|count -%}
|
||||
{{ count }} user{% pluralize %}{{ count }} users
|
||||
{% endtrans %}
|
||||
"""
|
||||
).render(user="someone", users=[1, 2, 3])
|
||||
)
|
138
third_party/python/Jinja2/ext/Vim/jinja.vim
vendored
138
third_party/python/Jinja2/ext/Vim/jinja.vim
vendored
@ -1,138 +0,0 @@
|
||||
" Vim syntax file
|
||||
" Language: Jinja template
|
||||
" Maintainer: Armin Ronacher <armin.ronacher@active-4.com>
|
||||
" Last Change: 2008 May 9
|
||||
" Version: 1.1
|
||||
"
|
||||
" Known Bugs:
|
||||
" because of odd limitations dicts and the modulo operator
|
||||
" appear wrong in the template.
|
||||
"
|
||||
" Changes:
|
||||
"
|
||||
" 2008 May 9: Added support for Jinja 2 changes (new keyword rules)
|
||||
|
||||
" .vimrc variable to disable html highlighting
|
||||
if !exists('g:jinja_syntax_html')
|
||||
let g:jinja_syntax_html=1
|
||||
endif
|
||||
|
||||
" For version 5.x: Clear all syntax items
|
||||
" For version 6.x: Quit when a syntax file was already loaded
|
||||
if !exists("main_syntax")
|
||||
if v:version < 600
|
||||
syntax clear
|
||||
elseif exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
let main_syntax = 'jinja'
|
||||
endif
|
||||
|
||||
" Pull in the HTML syntax.
|
||||
if g:jinja_syntax_html
|
||||
if v:version < 600
|
||||
so <sfile>:p:h/html.vim
|
||||
else
|
||||
runtime! syntax/html.vim
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
endif
|
||||
|
||||
syntax case match
|
||||
|
||||
" Jinja template built-in tags and parameters (without filter, macro, is and raw, they
|
||||
" have special threatment)
|
||||
syn keyword jinjaStatement containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained and if else in not or recursive as import
|
||||
|
||||
syn keyword jinjaStatement containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained is filter skipwhite nextgroup=jinjaFilter
|
||||
syn keyword jinjaStatement containedin=jinjaTagBlock contained macro skipwhite nextgroup=jinjaFunction
|
||||
syn keyword jinjaStatement containedin=jinjaTagBlock contained block skipwhite nextgroup=jinjaBlockName
|
||||
|
||||
" Variable Names
|
||||
syn match jinjaVariable containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
syn keyword jinjaSpecial containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained false true none False True None loop super caller varargs kwargs
|
||||
|
||||
" Filters
|
||||
syn match jinjaOperator "|" containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained skipwhite nextgroup=jinjaFilter
|
||||
syn match jinjaFilter contained /[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
syn match jinjaFunction contained /[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
syn match jinjaBlockName contained /[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
|
||||
" Jinja template constants
|
||||
syn region jinjaString containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained start=/"/ skip=/\(\\\)\@<!\(\(\\\\\)\@>\)*\\"/ end=/"/
|
||||
syn region jinjaString containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained start=/'/ skip=/\(\\\)\@<!\(\(\\\\\)\@>\)*\\'/ end=/'/
|
||||
syn match jinjaNumber containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[0-9]\+\(\.[0-9]\+\)\?/
|
||||
|
||||
" Operators
|
||||
syn match jinjaOperator containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[+\-*\/<>=!,:]/
|
||||
syn match jinjaPunctuation containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[()\[\]]/
|
||||
syn match jinjaOperator containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /\./ nextgroup=jinjaAttribute
|
||||
syn match jinjaAttribute contained /[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
|
||||
" Jinja template tag and variable blocks
|
||||
syn region jinjaNested matchgroup=jinjaOperator start="(" end=")" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
|
||||
syn region jinjaNested matchgroup=jinjaOperator start="\[" end="\]" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
|
||||
syn region jinjaNested matchgroup=jinjaOperator start="{" end="}" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
|
||||
syn region jinjaTagBlock matchgroup=jinjaTagDelim start=/{%-\?/ end=/-\?%}/ containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaRaw,jinjaString,jinjaNested,jinjaComment
|
||||
|
||||
syn region jinjaVarBlock matchgroup=jinjaVarDelim start=/{{-\?/ end=/-\?}}/ containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaRaw,jinjaString,jinjaNested,jinjaComment
|
||||
|
||||
" Jinja template 'raw' tag
|
||||
syn region jinjaRaw matchgroup=jinjaRawDelim start="{%\s*raw\s*%}" end="{%\s*endraw\s*%}" containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaString,jinjaComment
|
||||
|
||||
" Jinja comments
|
||||
syn region jinjaComment matchgroup=jinjaCommentDelim start="{#" end="#}" containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaString,jinjaComment
|
||||
" help support folding for some setups
|
||||
setlocal commentstring={#%s#}
|
||||
setlocal comments=s:{#,e:#}
|
||||
|
||||
" Block start keywords. A bit tricker. We only highlight at the start of a
|
||||
" tag block and only if the name is not followed by a comma or equals sign
|
||||
" which usually means that we have to deal with an assignment.
|
||||
syn match jinjaStatement containedin=jinjaTagBlock contained /\({%-\?\s*\)\@<=\<[a-zA-Z_][a-zA-Z0-9_]*\>\(\s*[,=]\)\@!/
|
||||
|
||||
" and context modifiers
|
||||
syn match jinjaStatement containedin=jinjaTagBlock contained /\<with\(out\)\?\s\+context\>/
|
||||
|
||||
|
||||
" Define the default highlighting.
|
||||
" For version 5.7 and earlier: only when not done already
|
||||
" For version 5.8 and later: only when an item doesn't have highlighting yet
|
||||
if v:version >= 508 || !exists("did_jinja_syn_inits")
|
||||
if v:version < 508
|
||||
let did_jinja_syn_inits = 1
|
||||
command -nargs=+ HiLink hi link <args>
|
||||
else
|
||||
command -nargs=+ HiLink hi def link <args>
|
||||
endif
|
||||
|
||||
HiLink jinjaPunctuation jinjaOperator
|
||||
HiLink jinjaAttribute jinjaVariable
|
||||
HiLink jinjaFunction jinjaFilter
|
||||
|
||||
HiLink jinjaTagDelim jinjaTagBlock
|
||||
HiLink jinjaVarDelim jinjaVarBlock
|
||||
HiLink jinjaCommentDelim jinjaComment
|
||||
HiLink jinjaRawDelim jinja
|
||||
|
||||
HiLink jinjaSpecial Special
|
||||
HiLink jinjaOperator Normal
|
||||
HiLink jinjaRaw Normal
|
||||
HiLink jinjaTagBlock PreProc
|
||||
HiLink jinjaVarBlock PreProc
|
||||
HiLink jinjaStatement Statement
|
||||
HiLink jinjaFilter Function
|
||||
HiLink jinjaBlockName Function
|
||||
HiLink jinjaVariable Identifier
|
||||
HiLink jinjaString Constant
|
||||
HiLink jinjaNumber Constant
|
||||
HiLink jinjaComment Comment
|
||||
|
||||
delcommand HiLink
|
||||
endif
|
||||
|
||||
let b:current_syntax = "jinja"
|
||||
|
||||
if main_syntax ==# 'jinja'
|
||||
unlet main_syntax
|
||||
endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user