Buckets:
ktongue/docker_container / .vscode-server /extensions /ms-python.black-formatter-2025.2.0 /component-detection-pip-report.json
| {"version":"1","pip_version":"25.0.1","install":[{"download_info":{"url":"https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl","archive_info":{"hash":"sha256=c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a","hashes":{"sha256":"c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.4","name":"attrs","version":"25.1.0","summary":"Classes Without Boilerplate","description_content_type":"text/markdown","keywords":["attribute","boilerplate","class"],"author_email":"Hynek Schlawack <hs@ox.cx>","license_expression":"MIT","license_file":["LICENSE"],"classifier":["Development Status :: 5 - Production/Stable","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Typing :: Typed"],"requires_dist":["cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark'","hypothesis; extra == 'benchmark'","mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark'","pympler; extra == 'benchmark'","pytest-codspeed; extra == 'benchmark'","pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark'","pytest-xdist[psutil]; extra == 'benchmark'","pytest>=4.3.0; extra == 'benchmark'","cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov'","coverage[toml]>=5.3; extra == 'cov'","hypothesis; extra == 'cov'","mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov'","pympler; extra == 'cov'","pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov'","pytest-xdist[psutil]; extra == 'cov'","pytest>=4.3.0; extra == 'cov'","cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev'","hypothesis; extra == 'dev'","mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev'","pre-commit-uv; extra == 'dev'","pympler; extra == 'dev'","pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev'","pytest-xdist[psutil]; extra == 'dev'","pytest>=4.3.0; extra == 'dev'","cogapp; extra == 'docs'","furo; extra == 'docs'","myst-parser; extra == 'docs'","sphinx; extra == 'docs'","sphinx-notfound-page; extra == 'docs'","sphinxcontrib-towncrier; extra == 'docs'","towncrier<24.7; extra == 'docs'","cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests'","hypothesis; extra == 'tests'","mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests'","pympler; extra == 'tests'","pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests'","pytest-xdist[psutil]; extra == 'tests'","pytest>=4.3.0; extra == 'tests'","mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy'","pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy'"],"requires_python":">=3.8","project_url":["Documentation, https://www.attrs.org/","Changelog, https://www.attrs.org/en/stable/changelog.html","GitHub, https://github.com/python-attrs/attrs","Funding, https://github.com/sponsors/hynek","Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi"],"provides_extra":["benchmark","cov","dev","docs","tests","tests-mypy"],"description":"<p align=\"center\">\n <a href=\"https://www.attrs.org/\">\n <img src=\"https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg\" width=\"35%\" alt=\"attrs\" />\n </a>\n</p>\n\n\n*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)).\n[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020!\n\nIts main goal is to help you to write **concise** and **correct** software without slowing down your code.\n\n\n## Sponsors\n\n*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek).\nEspecially those generously supporting us at the *The Organization* tier and higher:\n\n<!-- sponsor-break-begin -->\n\n<p align=\"center\">\n\n<!-- [[[cog\nimport pathlib, tomllib\n\nfor sponsor in tomllib.loads(pathlib.Path(\"pyproject.toml\").read_text())[\"tool\"][\"sponcon\"][\"sponsors\"]:\n print(f'<a href=\"{sponsor[\"url\"]}\"><img title=\"{sponsor[\"title\"]}\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/{sponsor[\"img\"]}\" width=\"190\" /></a>')\n]]] -->\n<a href=\"https://www.variomedia.de/\"><img title=\"Variomedia AG\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/Variomedia.svg\" width=\"190\" /></a>\n<a href=\"https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek\"><img title=\"Tidelift\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/Tidelift.svg\" width=\"190\" /></a>\n<a href=\"https://klaviyo.com/\"><img title=\"Klaviyo\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/Klaviyo.svg\" width=\"190\" /></a>\n<a href=\"https://www.emsys-renewables.com/\"><img title=\"emsys renewables\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/emsys-renewables.svg\" width=\"190\" /></a>\n<a href=\"https://filepreviews.io/\"><img title=\"FilePreviews\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/FilePreviews.svg\" width=\"190\" /></a>\n<a href=\"https://privacy-solutions.org/\"><img title=\"Privacy Solutions\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/Privacy-Solutions.svg\" width=\"190\" /></a>\n<a href=\"https://polar.sh/\"><img title=\"Polar\" src=\"https://www.attrs.org/en/25.1.0/_static/sponsors/Polar.svg\" width=\"190\" /></a>\n<!-- [[[end]]] -->\n\n</p>\n\n<!-- sponsor-break-end -->\n\n<p align=\"center\">\n <strong>Please consider <a href=\"https://github.com/sponsors/hynek\">joining them</a> to help make <em>attrs</em>’s maintenance more sustainable!</strong>\n</p>\n\n<!-- teaser-end -->\n\n## Example\n\n*attrs* gives you a class decorator and a way to declaratively define the attributes on that class:\n\n<!-- code-begin -->\n\n```pycon\n>>> from attrs import asdict, define, make_class, Factory\n\n>>> @define\n... class SomeClass:\n... a_number: int = 42\n... list_of_numbers: list[int] = Factory(list)\n...\n... def hard_math(self, another_number):\n... return self.a_number + sum(self.list_of_numbers) * another_number\n\n\n>>> sc = SomeClass(1, [1, 2, 3])\n>>> sc\nSomeClass(a_number=1, list_of_numbers=[1, 2, 3])\n\n>>> sc.hard_math(3)\n19\n>>> sc == SomeClass(1, [1, 2, 3])\nTrue\n>>> sc != SomeClass(2, [3, 2, 1])\nTrue\n\n>>> asdict(sc)\n{'a_number': 1, 'list_of_numbers': [1, 2, 3]}\n\n>>> SomeClass()\nSomeClass(a_number=42, list_of_numbers=[])\n\n>>> C = make_class(\"C\", [\"a\", \"b\"])\n>>> C(\"foo\", \"bar\")\nC(a='foo', b='bar')\n```\n\nAfter *declaring* your attributes, *attrs* gives you:\n\n- a concise and explicit overview of the class's attributes,\n- a nice human-readable `__repr__`,\n- equality-checking methods,\n- an initializer,\n- and much more,\n\n*without* writing dull boilerplate code again and again and *without* runtime performance penalties.\n\n---\n\nThis example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0.\nThe classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**.\n\nCheck out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation!\n\n\n### Hate Type Annotations!?\n\nNo problem!\nTypes are entirely **optional** with *attrs*.\nSimply assign `attrs.field()` to the attributes instead of annotating them with types:\n\n```python\nfrom attrs import define, field\n\n@define\nclass SomeClass:\n a_number = field(default=42)\n list_of_numbers = field(factory=list)\n```\n\n\n## Data Classes\n\nOn the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*).\nIn practice it does a lot more and is more flexible.\nFor instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger.\n\nFor more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice.\n\n\n## Project Information\n\n- [**Changelog**](https://www.attrs.org/en/stable/changelog.html)\n- [**Documentation**](https://www.attrs.org/)\n- [**PyPI**](https://pypi.org/project/attrs/)\n- [**Source Code**](https://github.com/python-attrs/attrs)\n- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md)\n- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs)\n- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs)\n\n\n### *attrs* for Enterprise\n\nAvailable as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek).\n\nThe maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications.\nSave time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.\n\n## Release Information\n\n### Changes\n\n- This release only ensures correct PyPI licensing metadata.\n [#1386](https://github.com/python-attrs/attrs/issues/1386)\n\n\n\n---\n\n[Full changelog →](https://www.attrs.org/en/stable/changelog.html)\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl","archive_info":{"hash":"sha256=95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717","hashes":{"sha256":"95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.4","name":"black","version":"25.1.0","summary":"The uncompromising code formatter.","description_content_type":"text/markdown","keywords":["automation","autopep8","formatter","gofmt","pyfmt","rustfmt","yapf"],"author_email":"Łukasz Langa <lukasz@langa.pl>","license_expression":"MIT","license_file":["AUTHORS.md","LICENSE"],"classifier":["Development Status :: 5 - Production/Stable","Environment :: Console","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Topic :: Software Development :: Libraries :: Python Modules","Topic :: Software Development :: Quality Assurance"],"requires_dist":["click>=8.0.0","mypy-extensions>=0.4.3","packaging>=22.0","pathspec>=0.9.0","platformdirs>=2","tomli>=1.1.0; python_version < '3.11'","typing-extensions>=4.0.1; python_version < '3.11'","colorama>=0.4.3; extra == 'colorama'","aiohttp>=3.10; extra == 'd'","ipython>=7.8.0; extra == 'jupyter'","tokenize-rt>=3.2.0; extra == 'jupyter'","uvloop>=0.15.2; extra == 'uvloop'"],"requires_python":">=3.9","project_url":["Documentation, https://black.readthedocs.io/","Changelog, https://github.com/psf/black/blob/main/CHANGES.md","Repository, https://github.com/psf/black","Issues, https://github.com/psf/black/issues"],"provides_extra":["colorama","d","jupyter","uvloop"],"description":"[](https://black.readthedocs.io/en/stable/)\n\n<h2 align=\"center\">The Uncompromising Code Formatter</h2>\n\n<p align=\"center\">\n<a href=\"https://github.com/psf/black/actions\"><img alt=\"Actions Status\" src=\"https://github.com/psf/black/workflows/Test/badge.svg\"></a>\n<a href=\"https://black.readthedocs.io/en/stable/?badge=stable\"><img alt=\"Documentation Status\" src=\"https://readthedocs.org/projects/black/badge/?version=stable\"></a>\n<a href=\"https://coveralls.io/github/psf/black?branch=main\"><img alt=\"Coverage Status\" src=\"https://coveralls.io/repos/github/psf/black/badge.svg?branch=main\"></a>\n<a href=\"https://github.com/psf/black/blob/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://black.readthedocs.io/en/stable/_static/license.svg\"></a>\n<a href=\"https://pypi.org/project/black/\"><img alt=\"PyPI\" src=\"https://img.shields.io/pypi/v/black\"></a>\n<a href=\"https://pepy.tech/project/black\"><img alt=\"Downloads\" src=\"https://static.pepy.tech/badge/black\"></a>\n<a href=\"https://anaconda.org/conda-forge/black/\"><img alt=\"conda-forge\" src=\"https://img.shields.io/conda/dn/conda-forge/black.svg?label=conda-forge\"></a>\n<a href=\"https://github.com/psf/black\"><img alt=\"Code style: black\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"></a>\n</p>\n\n> “Any color you like.”\n\n_Black_ is the uncompromising Python code formatter. By using it, you agree to cede\ncontrol over minutiae of hand-formatting. In return, _Black_ gives you speed,\ndeterminism, and freedom from `pycodestyle` nagging about formatting. You will save time\nand mental energy for more important matters.\n\nBlackened code looks the same regardless of the project you're reading. Formatting\nbecomes transparent after a while and you can focus on the content instead.\n\n_Black_ makes code review faster by producing the smallest diffs possible.\n\nTry it out now using the [Black Playground](https://black.vercel.app). Watch the\n[PyCon 2019 talk](https://youtu.be/esZLCuWs_2Y) to learn more.\n\n---\n\n**[Read the documentation on ReadTheDocs!](https://black.readthedocs.io/en/stable)**\n\n---\n\n## Installation and usage\n\n### Installation\n\n_Black_ can be installed by running `pip install black`. It requires Python 3.9+ to run.\nIf you want to format Jupyter Notebooks, install with `pip install \"black[jupyter]\"`.\n\nIf you can't wait for the latest _hotness_ and want to install from GitHub, use:\n\n`pip install git+https://github.com/psf/black`\n\n### Usage\n\nTo get started right away with sensible defaults:\n\n```sh\nblack {source_file_or_directory}\n```\n\nYou can run _Black_ as a package if running it as a script doesn't work:\n\n```sh\npython -m black {source_file_or_directory}\n```\n\nFurther information can be found in our docs:\n\n- [Usage and Configuration](https://black.readthedocs.io/en/stable/usage_and_configuration/index.html)\n\n_Black_ is already [successfully used](https://github.com/psf/black#used-by) by many\nprojects, small and big. _Black_ has a comprehensive test suite, with efficient parallel\ntests, and our own auto formatting and parallel Continuous Integration runner. Now that\nwe have become stable, you should not expect large formatting changes in the future.\nStylistic changes will mostly be responses to bug reports and support for new Python\nsyntax. For more information please refer to\n[The Black Code Style](https://black.readthedocs.io/en/stable/the_black_code_style/index.html).\n\nAlso, as a safety measure which slows down processing, _Black_ will check that the\nreformatted code still produces a valid AST that is effectively equivalent to the\noriginal (see the\n[Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#ast-before-and-after-formatting)\nsection for details). If you're feeling confident, use `--fast`.\n\n## The _Black_ code style\n\n_Black_ is a PEP 8 compliant opinionated formatter. _Black_ reformats entire files in\nplace. Style configuration options are deliberately limited and rarely added. It doesn't\ntake previous formatting into account (see\n[Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#pragmatism)\nfor exceptions).\n\nOur documentation covers the current _Black_ code style, but planned changes to it are\nalso documented. They're both worth taking a look at:\n\n- [The _Black_ Code Style: Current style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html)\n- [The _Black_ Code Style: Future style](https://black.readthedocs.io/en/stable/the_black_code_style/future_style.html)\n\nChanges to the _Black_ code style are bound by the Stability Policy:\n\n- [The _Black_ Code Style: Stability Policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy)\n\nPlease refer to this document before submitting an issue. What seems like a bug might be\nintended behaviour.\n\n### Pragmatism\n\nEarly versions of _Black_ used to be absolutist in some respects. They took after its\ninitial author. This was fine at the time as it made the implementation simpler and\nthere were not many users anyway. Not many edge cases were reported. As a mature tool,\n_Black_ does make some exceptions to rules it otherwise holds.\n\n- [The _Black_ code style: Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#pragmatism)\n\nPlease refer to this document before submitting an issue just like with the document\nabove. What seems like a bug might be intended behaviour.\n\n## Configuration\n\n_Black_ is able to read project-specific default values for its command line options\nfrom a `pyproject.toml` file. This is especially useful for specifying custom\n`--include` and `--exclude`/`--force-exclude`/`--extend-exclude` patterns for your\nproject.\n\nYou can find more details in our documentation:\n\n- [The basics: Configuration via a file](https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#configuration-via-a-file)\n\nAnd if you're looking for more general configuration documentation:\n\n- [Usage and Configuration](https://black.readthedocs.io/en/stable/usage_and_configuration/index.html)\n\n**Pro-tip**: If you're asking yourself \"Do I need to configure anything?\" the answer is\n\"No\". _Black_ is all about sensible defaults. Applying those defaults will have your\ncode in compliance with many other _Black_ formatted projects.\n\n## Used by\n\nThe following notable open-source projects trust _Black_ with enforcing a consistent\ncode style: pytest, tox, Pyramid, Django, Django Channels, Hypothesis, attrs,\nSQLAlchemy, Poetry, PyPA applications (Warehouse, Bandersnatch, Pipenv, virtualenv),\npandas, Pillow, Twisted, LocalStack, every Datadog Agent Integration, Home Assistant,\nZulip, Kedro, OpenOA, FLORIS, ORBIT, WOMBAT, and many more.\n\nThe following organizations use _Black_: Dropbox, KeepTruckin, Lyft, Mozilla,\nQuora, Duolingo, QuantumBlack, Tesla, Archer Aviation.\n\nAre we missing anyone? Let us know.\n\n## Testimonials\n\n**Mike Bayer**, [author of `SQLAlchemy`](https://www.sqlalchemy.org/):\n\n> I can't think of any single tool in my entire programming career that has given me a\n> bigger productivity increase by its introduction. I can now do refactorings in about\n> 1% of the keystrokes that it would have taken me previously when we had no way for\n> code to format itself.\n\n**Dusty Phillips**,\n[writer](https://smile.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=dusty+phillips):\n\n> _Black_ is opinionated so you don't have to be.\n\n**Hynek Schlawack**, [creator of `attrs`](https://www.attrs.org/), core developer of\nTwisted and CPython:\n\n> An auto-formatter that doesn't suck is all I want for Xmas!\n\n**Carl Meyer**, [Django](https://www.djangoproject.com/) core developer:\n\n> At least the name is good.\n\n**Kenneth Reitz**, creator of [`requests`](https://requests.readthedocs.io/en/latest/)\nand [`pipenv`](https://readthedocs.org/projects/pipenv/):\n\n> This vastly improves the formatting of our code. Thanks a ton!\n\n## Show your style\n\nUse the badge in your project's README.md:\n\n```md\n[](https://github.com/psf/black)\n```\n\nUsing the badge in README.rst:\n\n```\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n```\n\nLooks like this:\n[](https://github.com/psf/black)\n\n## License\n\nMIT\n\n## Contributing\n\nWelcome! Happy to see you willing to make the project better. You can get started by\nreading this:\n\n- [Contributing: The basics](https://black.readthedocs.io/en/latest/contributing/the_basics.html)\n\nYou can also take a look at the rest of the contributing docs or talk with the\ndevelopers:\n\n- [Contributing documentation](https://black.readthedocs.io/en/latest/contributing/index.html)\n- [Chat on Discord](https://discord.gg/RtVdv86PrH)\n\n## Change log\n\nThe log has become rather long. It moved to its own file.\n\nSee [CHANGES](https://black.readthedocs.io/en/latest/change_log.html).\n\n## Authors\n\nThe author list is quite long nowadays, so it lives in its own file.\n\nSee [AUTHORS.md](./AUTHORS.md)\n\n## Code of Conduct\n\nEveryone participating in the _Black_ project, and in particular in the issue tracker,\npull requests, and social media activity, is expected to treat other people with respect\nand more generally to follow the guidelines articulated in the\n[Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/).\n\nAt the same time, humor is encouraged. In fact, basic familiarity with Monty Python's\nFlying Circus is expected. We are not savages.\n\nAnd if you _really_ need to slap somebody, do it with a fish while dancing.\n# Change Log\n\n## 25.1.0\n\n### Highlights\n\nThis release introduces the new 2025 stable style (#4558), stabilizing\nthe following changes:\n\n- Normalize casing of Unicode escape characters in strings to lowercase (#2916)\n- Fix inconsistencies in whether certain strings are detected as docstrings (#4095)\n- Consistently add trailing commas to typed function parameters (#4164)\n- Remove redundant parentheses in if guards for case blocks (#4214)\n- Add parentheses to if clauses in case blocks when the line is too long (#4269)\n- Whitespace before `# fmt: skip` comments is no longer normalized (#4146)\n- Fix line length computation for certain expressions that involve the power operator (#4154)\n- Check if there is a newline before the terminating quotes of a docstring (#4185)\n- Fix type annotation spacing between `*` and more complex type variable tuple (#4440)\n\nThe following changes were not in any previous release:\n\n- Remove parentheses around sole list items (#4312)\n- Generic function definitions are now formatted more elegantly: parameters are\n split over multiple lines first instead of type parameter definitions (#4553)\n\n### Stable style\n\n- Fix formatting cells in IPython notebooks with magic methods and starting or trailing\n empty lines (#4484)\n- Fix crash when formatting `with` statements containing tuple generators/unpacking\n (#4538)\n\n### Preview style\n\n- Fix/remove string merging changing f-string quotes on f-strings with internal quotes\n (#4498)\n- Collapse multiple empty lines after an import into one (#4489)\n- Prevent `string_processing` and `wrap_long_dict_values_in_parens` from removing\n parentheses around long dictionary values (#4377)\n- Move `wrap_long_dict_values_in_parens` from the unstable to preview style (#4561)\n\n### Packaging\n\n- Store license identifier inside the `License-Expression` metadata field, see\n [PEP 639](https://peps.python.org/pep-0639/). (#4479)\n\n### Performance\n\n- Speed up the `is_fstring_start` function in Black's tokenizer (#4541)\n\n### Integrations\n\n- If using stdin with `--stdin-filename` set to a force excluded path, stdin won't be\n formatted. (#4539)\n\n## 24.10.0\n\n### Highlights\n\n- Black is now officially tested with Python 3.13 and provides Python 3.13\n mypyc-compiled wheels. (#4436) (#4449)\n- Black will issue an error when used with Python 3.12.5, due to an upstream memory\n safety issue in Python 3.12.5 that can cause Black's AST safety checks to fail. Please\n use Python 3.12.6 or Python 3.12.4 instead. (#4447)\n- Black no longer supports running with Python 3.8 (#4452)\n\n### Stable style\n\n- Fix crashes involving comments in parenthesised return types or `X | Y` style unions.\n (#4453)\n- Fix skipping Jupyter cells with unknown `%%` magic (#4462)\n\n### Preview style\n\n- Fix type annotation spacing between * and more complex type variable tuple (i.e. `def\n fn(*args: *tuple[*Ts, T]) -> None: pass`) (#4440)\n\n### Caching\n\n- Fix bug where the cache was shared between runs with and without `--unstable` (#4466)\n\n### Packaging\n\n- Upgrade version of mypyc used to 1.12 beta (#4450) (#4449)\n- `blackd` now requires a newer version of aiohttp. (#4451)\n\n### Output\n\n- Added Python target version information on parse error (#4378)\n- Add information about Black version to internal error messages (#4457)\n\n## 24.8.0\n\n### Stable style\n\n- Fix crash when `# fmt: off` is used before a closing parenthesis or bracket. (#4363)\n\n### Packaging\n\n- Packaging metadata updated: docs are explictly linked, the issue tracker is now also\n linked. This improves the PyPI listing for Black. (#4345)\n\n### Parser\n\n- Fix regression where Black failed to parse a multiline f-string containing another\n multiline string (#4339)\n- Fix regression where Black failed to parse an escaped single quote inside an f-string\n (#4401)\n- Fix bug with Black incorrectly parsing empty lines with a backslash (#4343)\n- Fix bugs with Black's tokenizer not handling `\\{` inside f-strings very well (#4422)\n- Fix incorrect line numbers in the tokenizer for certain tokens within f-strings\n (#4423)\n\n### Performance\n\n- Improve performance when a large directory is listed in `.gitignore` (#4415)\n\n### _Blackd_\n\n- Fix blackd (and all extras installs) for docker container (#4357)\n\n## 24.4.2\n\nThis is a bugfix release to fix two regressions in the new f-string parser introduced in\n24.4.1.\n\n### Parser\n\n- Fix regression where certain complex f-strings failed to parse (#4332)\n\n### Performance\n\n- Fix bad performance on certain complex string literals (#4331)\n\n## 24.4.1\n\n### Highlights\n\n- Add support for the new Python 3.12 f-string syntax introduced by PEP 701 (#3822)\n\n### Stable style\n\n- Fix crash involving indented dummy functions containing newlines (#4318)\n\n### Parser\n\n- Add support for type parameter defaults, a new syntactic feature added to Python 3.13\n by PEP 696 (#4327)\n\n### Integrations\n\n- Github Action now works even when `git archive` is skipped (#4313)\n\n## 24.4.0\n\n### Stable style\n\n- Fix unwanted crashes caused by AST equivalency check (#4290)\n\n### Preview style\n\n- `if` guards in `case` blocks are now wrapped in parentheses when the line is too long.\n (#4269)\n- Stop moving multiline strings to a new line unless inside brackets (#4289)\n\n### Integrations\n\n- Add a new option `use_pyproject` to the GitHub Action `psf/black`. This will read the\n Black version from `pyproject.toml`. (#4294)\n\n## 24.3.0\n\n### Highlights\n\nThis release is a milestone: it fixes Black's first CVE security vulnerability. If you\nrun Black on untrusted input, or if you habitually put thousands of leading tab\ncharacters in your docstrings, you are strongly encouraged to upgrade immediately to fix\n[CVE-2024-21503](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503).\n\nThis release also fixes a bug in Black's AST safety check that allowed Black to make\nincorrect changes to certain f-strings that are valid in Python 3.12 and higher.\n\n### Stable style\n\n- Don't move comments along with delimiters, which could cause crashes (#4248)\n- Strengthen AST safety check to catch more unsafe changes to strings. Previous versions\n of Black would incorrectly format the contents of certain unusual f-strings containing\n nested strings with the same quote type. Now, Black will crash on such strings until\n support for the new f-string syntax is implemented. (#4270)\n- Fix a bug where line-ranges exceeding the last code line would not work as expected\n (#4273)\n\n### Performance\n\n- Fix catastrophic performance on docstrings that contain large numbers of leading tab\n characters. This fixes\n [CVE-2024-21503](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503).\n (#4278)\n\n### Documentation\n\n- Note what happens when `--check` is used with `--quiet` (#4236)\n\n## 24.2.0\n\n### Stable style\n\n- Fixed a bug where comments where mistakenly removed along with redundant parentheses\n (#4218)\n\n### Preview style\n\n- Move the `hug_parens_with_braces_and_square_brackets` feature to the unstable style\n due to an outstanding crash and proposed formatting tweaks (#4198)\n- Fixed a bug where base expressions caused inconsistent formatting of \\*\\* in tenary\n expression (#4154)\n- Checking for newline before adding one on docstring that is almost at the line limit\n (#4185)\n- Remove redundant parentheses in `case` statement `if` guards (#4214).\n\n### Configuration\n\n- Fix issue where _Black_ would ignore input files in the presence of symlinks (#4222)\n- _Black_ now ignores `pyproject.toml` that is missing a `tool.black` section when\n discovering project root and configuration. Since _Black_ continues to use version\n control as an indicator of project root, this is expected to primarily change behavior\n for users in a monorepo setup (desirably). If you wish to preserve previous behavior,\n simply add an empty `[tool.black]` to the previously discovered `pyproject.toml`\n (#4204)\n\n### Output\n\n- Black will swallow any `SyntaxWarning`s or `DeprecationWarning`s produced by the `ast`\n module when performing equivalence checks (#4189)\n\n### Integrations\n\n- Add a JSONSchema and provide a validate-pyproject entry-point (#4181)\n\n## 24.1.1\n\nBugfix release to fix a bug that made Black unusable on certain file systems with strict\nlimits on path length.\n\n### Preview style\n\n- Consistently add trailing comma on typed parameters (#4164)\n\n### Configuration\n\n- Shorten the length of the name of the cache file to fix crashes on file systems that\n do not support long paths (#4176)\n\n## 24.1.0\n\n### Highlights\n\nThis release introduces the new 2024 stable style (#4106), stabilizing the following\nchanges:\n\n- Add parentheses around `if`-`else` expressions (#2278)\n- Dummy class and function implementations consisting only of `...` are formatted more\n compactly (#3796)\n- If an assignment statement is too long, we now prefer splitting on the right-hand side\n (#3368)\n- Hex codes in Unicode escape sequences are now standardized to lowercase (#2916)\n- Allow empty first lines at the beginning of most blocks (#3967, #4061)\n- Add parentheses around long type annotations (#3899)\n- Enforce newline after module docstrings (#3932, #4028)\n- Fix incorrect magic trailing comma handling in return types (#3916)\n- Remove blank lines before class docstrings (#3692)\n- Wrap multiple context managers in parentheses if combined in a single `with` statement\n (#3489)\n- Fix bug in line length calculations for power operations (#3942)\n- Add trailing commas to collection literals even if there's a comment after the last\n entry (#3393)\n- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from\n subscript expressions with more than 1 element (#3209)\n- Add extra blank lines in stubs in a few cases (#3564, #3862)\n- Accept raw strings as docstrings (#3947)\n- Split long lines in case blocks (#4024)\n- Stop removing spaces from walrus operators within subscripts (#3823)\n- Fix incorrect formatting of certain async statements (#3609)\n- Allow combining `# fmt: skip` with other comments (#3959)\n\nThere are already a few improvements in the `--preview` style, which are slated for the\n2025 stable style. Try them out and\n[share your feedback](https://github.com/psf/black/issues). In the past, the preview\nstyle has included some features that we were not able to stabilize. This year, we're\nadding a separate `--unstable` style for features with known problems. Now, the\n`--preview` style only includes features that we actually expect to make it into next\nyear's stable style.\n\n### Stable style\n\nSeveral bug fixes were made in features that are moved to the stable style in this\nrelease:\n\n- Fix comment handling when parenthesising conditional expressions (#4134)\n- Fix bug where spaces were not added around parenthesized walruses in subscripts,\n unlike other binary operators (#4109)\n- Remove empty lines before docstrings in async functions (#4132)\n- Address a missing case in the change to allow empty lines at the beginning of all\n blocks, except immediately before a docstring (#4130)\n- For stubs, fix logic to enforce empty line after nested classes with bodies (#4141)\n\n### Preview style\n\n- Add `--unstable` style, covering preview features that have known problems that would\n block them from going into the stable style. Also add the `--enable-unstable-feature`\n flag; for example, use\n `--enable-unstable-feature hug_parens_with_braces_and_square_brackets` to apply this\n preview feature throughout 2024, even if a later Black release downgrades the feature\n to unstable (#4096)\n- Format module docstrings the same as class and function docstrings (#4095)\n- Fix crash when using a walrus in a dictionary (#4155)\n- Fix unnecessary parentheses when wrapping long dicts (#4135)\n- Stop normalizing spaces before `# fmt: skip` comments (#4146)\n\n### Configuration\n\n- Print warning when configuration in `pyproject.toml` contains an invalid key (#4165)\n- Fix symlink handling, properly ignoring symlinks that point outside of root (#4161)\n- Fix cache mtime logic that resulted in false positive cache hits (#4128)\n- Remove the long-deprecated `--experimental-string-processing` flag. This feature can\n currently be enabled with `--preview --enable-unstable-feature string_processing`.\n (#4096)\n\n### Integrations\n\n- Revert the change to run Black's pre-commit integration only on specific git hooks\n (#3940) for better compatibility with older versions of pre-commit (#4137)\n\n## 23.12.1\n\n### Packaging\n\n- Fixed a bug that included dependencies from the `d` extra by default (#4108)\n\n## 23.12.0\n\n### Highlights\n\nIt's almost 2024, which means it's time for a new edition of _Black_'s stable style!\nTogether with this release, we'll put out an alpha release 24.1a1 showcasing the draft\n2024 stable style, which we'll finalize in the January release. Please try it out and\n[share your feedback](https://github.com/psf/black/issues/4042).\n\nThis release (23.12.0) will still produce the 2023 style. Most but not all of the\nchanges in `--preview` mode will be in the 2024 stable style.\n\n### Stable style\n\n- Fix bug where `# fmt: off` automatically dedents when used with the `--line-ranges`\n option, even when it is not within the specified line range. (#4084)\n- Fix feature detection for parenthesized context managers (#4104)\n\n### Preview style\n\n- Prefer more equal signs before a break when splitting chained assignments (#4010)\n- Standalone form feed characters at the module level are no longer removed (#4021)\n- Additional cases of immediately nested tuples, lists, and dictionaries are now\n indented less (#4012)\n- Allow empty lines at the beginning of all blocks, except immediately before a\n docstring (#4060)\n- Fix crash in preview mode when using a short `--line-length` (#4086)\n- Keep suites consisting of only an ellipsis on their own lines if they are not\n functions or class definitions (#4066) (#4103)\n\n### Configuration\n\n- `--line-ranges` now skips _Black_'s internal stability check in `--safe` mode. This\n avoids a crash on rare inputs that have many unformatted same-content lines. (#4034)\n\n### Packaging\n\n- Upgrade to mypy 1.7.1 (#4049) (#4069)\n- Faster compiled wheels are now available for CPython 3.12 (#4070)\n\n### Integrations\n\n- Enable 3.12 CI (#4035)\n- Build docker images in parallel (#4054)\n- Build docker images with 3.12 (#4055)\n\n## 23.11.0\n\n### Highlights\n\n- Support formatting ranges of lines with the new `--line-ranges` command-line option\n (#4020)\n\n### Stable style\n\n- Fix crash on formatting bytes strings that look like docstrings (#4003)\n- Fix crash when whitespace followed a backslash before newline in a docstring (#4008)\n- Fix standalone comments inside complex blocks crashing Black (#4016)\n- Fix crash on formatting code like `await (a ** b)` (#3994)\n- No longer treat leading f-strings as docstrings. This matches Python's behaviour and\n fixes a crash (#4019)\n\n### Preview style\n\n- Multiline dicts and lists that are the sole argument to a function are now indented\n less (#3964)\n- Multiline unpacked dicts and lists as the sole argument to a function are now also\n indented less (#3992)\n- In f-string debug expressions, quote types that are visible in the final string are\n now preserved (#4005)\n- Fix a bug where long `case` blocks were not split into multiple lines. Also enable\n general trailing comma rules on `case` blocks (#4024)\n- Keep requiring two empty lines between module-level docstring and first function or\n class definition (#4028)\n- Add support for single-line format skip with other comments on the same line (#3959)\n\n### Configuration\n\n- Consistently apply force exclusion logic before resolving symlinks (#4015)\n- Fix a bug in the matching of absolute path names in `--include` (#3976)\n\n### Performance\n\n- Fix mypyc builds on arm64 on macOS (#4017)\n\n### Integrations\n\n- Black's pre-commit integration will now run only on git hooks appropriate for a code\n formatter (#3940)\n\n## 23.10.1\n\n### Highlights\n\n- Maintenance release to get a fix out for GitHub Action edge case (#3957)\n\n### Preview style\n\n- Fix merging implicit multiline strings that have inline comments (#3956)\n- Allow empty first line after block open before a comment or compound statement (#3967)\n\n### Packaging\n\n- Change Dockerfile to hatch + compile black (#3965)\n\n### Integrations\n\n- The summary output for GitHub workflows is now suppressible using the `summary`\n parameter. (#3958)\n- Fix the action failing when Black check doesn't pass (#3957)\n\n### Documentation\n\n- It is known Windows documentation CI is broken\n https://github.com/psf/black/issues/3968\n\n## 23.10.0\n\n### Stable style\n\n- Fix comments getting removed from inside parenthesized strings (#3909)\n\n### Preview style\n\n- Fix long lines with power operators getting split before the line length (#3942)\n- Long type hints are now wrapped in parentheses and properly indented when split across\n multiple lines (#3899)\n- Magic trailing commas are now respected in return types. (#3916)\n- Require one empty line after module-level docstrings. (#3932)\n- Treat raw triple-quoted strings as docstrings (#3947)\n\n### Configuration\n\n- Fix cache versioning logic when `BLACK_CACHE_DIR` is set (#3937)\n\n### Parser\n\n- Fix bug where attributes named `type` were not accepted inside `match` statements\n (#3950)\n- Add support for PEP 695 type aliases containing lambdas and other unusual expressions\n (#3949)\n\n### Output\n\n- Black no longer attempts to provide special errors for attempting to format Python 2\n code (#3933)\n- Black will more consistently print stacktraces on internal errors in verbose mode\n (#3938)\n\n### Integrations\n\n- The action output displayed in the job summary is now wrapped in Markdown (#3914)\n\n## 23.9.1\n\nDue to various issues, the previous release (23.9.0) did not include compiled mypyc\nwheels, which make Black significantly faster. These issues have now been fixed, and\nthis release should come with compiled wheels once again.\n\nThere will be no wheels for Python 3.12 due to a bug in mypyc. We will provide 3.12\nwheels in a future release as soon as the mypyc bug is fixed.\n\n### Packaging\n\n- Upgrade to mypy 1.5.1 (#3864)\n\n### Performance\n\n- Store raw tuples instead of NamedTuples in Black's cache, improving performance and\n decreasing the size of the cache (#3877)\n\n## 23.9.0\n\n### Preview style\n\n- More concise formatting for dummy implementations (#3796)\n- In stub files, add a blank line between a statement with a body (e.g an\n `if sys.version_info > (3, x):`) and a function definition on the same level (#3862)\n- Fix a bug whereby spaces were removed from walrus operators within subscript(#3823)\n\n### Configuration\n\n- Black now applies exclusion and ignore logic before resolving symlinks (#3846)\n\n### Performance\n\n- Avoid importing `IPython` if notebook cells do not contain magics (#3782)\n- Improve caching by comparing file hashes as fallback for mtime and size (#3821)\n\n### _Blackd_\n\n- Fix an issue in `blackd` with single character input (#3558)\n\n### Integrations\n\n- Black now has an\n [official pre-commit mirror](https://github.com/psf/black-pre-commit-mirror). Swapping\n `https://github.com/psf/black` to `https://github.com/psf/black-pre-commit-mirror` in\n your `.pre-commit-config.yaml` will make Black about 2x faster (#3828)\n- The `.black.env` folder specified by `ENV_PATH` will now be removed on the completion\n of the GitHub Action (#3759)\n\n## 23.7.0\n\n### Highlights\n\n- Runtime support for Python 3.7 has been removed. Formatting 3.7 code will still be\n supported until further notice (#3765)\n\n### Stable style\n\n- Fix a bug where an illegal trailing comma was added to return type annotations using\n PEP 604 unions (#3735)\n- Fix several bugs and crashes where comments in stub files were removed or mishandled\n under some circumstances (#3745)\n- Fix a crash with multi-line magic comments like `type: ignore` within parentheses\n (#3740)\n- Fix error in AST validation when _Black_ removes trailing whitespace in a type comment\n (#3773)\n\n### Preview style\n\n- Implicitly concatenated strings used as function args are no longer wrapped inside\n parentheses (#3640)\n- Remove blank lines between a class definition and its docstring (#3692)\n\n### Configuration\n\n- The `--workers` argument to _Black_ can now be specified via the `BLACK_NUM_WORKERS`\n environment variable (#3743)\n- `.pytest_cache`, `.ruff_cache` and `.vscode` are now excluded by default (#3691)\n- Fix _Black_ not honouring `pyproject.toml` settings when running `--stdin-filename`\n and the `pyproject.toml` found isn't in the current working directory (#3719)\n- _Black_ will now error if `exclude` and `extend-exclude` have invalid data types in\n `pyproject.toml`, instead of silently doing the wrong thing (#3764)\n\n### Packaging\n\n- Upgrade mypyc from 0.991 to 1.3 (#3697)\n- Remove patching of Click that mitigated errors on Python 3.6 with `LANG=C` (#3768)\n\n### Parser\n\n- Add support for the new PEP 695 syntax in Python 3.12 (#3703)\n\n### Performance\n\n- Speed up _Black_ significantly when the cache is full (#3751)\n- Avoid importing `IPython` in a case where we wouldn't need it (#3748)\n\n### Output\n\n- Use aware UTC datetimes internally, avoids deprecation warning on Python 3.12 (#3728)\n- Change verbose logging to exactly mirror _Black_'s logic for source discovery (#3749)\n\n### _Blackd_\n\n- The `blackd` argument parser now shows the default values for options in their help\n text (#3712)\n\n### Integrations\n\n- Black is now tested with\n [`PYTHONWARNDEFAULTENCODING = 1`](https://docs.python.org/3/library/io.html#io-encoding-warning)\n (#3763)\n- Update GitHub Action to display black output in the job summary (#3688)\n\n### Documentation\n\n- Add a CITATION.cff file to the root of the repository, containing metadata on how to\n cite this software (#3723)\n- Update the _classes_ and _exceptions_ documentation in Developer reference to match\n the latest code base (#3755)\n\n## 23.3.0\n\n### Highlights\n\nThis release fixes a longstanding confusing behavior in Black's GitHub action, where the\nversion of the action did not determine the version of Black being run (issue #3382). In\naddition, there is a small bug fix around imports and a number of improvements to the\npreview style.\n\nPlease try out the\n[preview style](https://black.readthedocs.io/en/stable/the_black_code_style/future_style.html#preview-style)\nwith `black --preview` and tell us your feedback. All changes in the preview style are\nexpected to become part of Black's stable style in January 2024.\n\n### Stable style\n\n- Import lines with `# fmt: skip` and `# fmt: off` no longer have an extra blank line\n added when they are right after another import line (#3610)\n\n### Preview style\n\n- Add trailing commas to collection literals even if there's a comment after the last\n entry (#3393)\n- `async def`, `async for`, and `async with` statements are now formatted consistently\n compared to their non-async version. (#3609)\n- `with` statements that contain two context managers will be consistently wrapped in\n parentheses (#3589)\n- Let string splitters respect [East Asian Width](https://www.unicode.org/reports/tr11/)\n (#3445)\n- Now long string literals can be split after East Asian commas and periods (`、` U+3001\n IDEOGRAPHIC COMMA, `。` U+3002 IDEOGRAPHIC FULL STOP, & `,` U+FF0C FULLWIDTH COMMA)\n besides before spaces (#3445)\n- For stubs, enforce one blank line after a nested class with a body other than just\n `...` (#3564)\n- Improve handling of multiline strings by changing line split behavior (#1879)\n\n### Parser\n\n- Added support for formatting files with invalid type comments (#3594)\n\n### Integrations\n\n- Update GitHub Action to use the version of Black equivalent to action's version if\n version input is not specified (#3543)\n- Fix missing Python binary path in autoload script for vim (#3508)\n\n### Documentation\n\n- Document that only the most recent release is supported for security issues;\n vulnerabilities should be reported through Tidelift (#3612)\n\n## 23.1.0\n\n### Highlights\n\nThis is the first release of 2023, and following our\n[stability policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy),\nit comes with a number of improvements to our stable style, including improvements to\nempty line handling, removal of redundant parentheses in several contexts, and output\nthat highlights implicitly concatenated strings better.\n\nThere are also many changes to the preview style; try out `black --preview` and give us\nfeedback to help us set the stable style for next year.\n\nIn addition to style changes, Black now automatically infers the supported Python\nversions from your `pyproject.toml` file, removing the need to set Black's target\nversions separately.\n\n### Stable style\n\n- Introduce the 2023 stable style, which incorporates most aspects of last year's\n preview style (#3418). Specific changes:\n - Enforce empty lines before classes and functions with sticky leading comments\n (#3302) (22.12.0)\n - Reformat empty and whitespace-only files as either an empty file (if no newline is\n present) or as a single newline character (if a newline is present) (#3348)\n (22.12.0)\n - Implicitly concatenated strings used as function args are now wrapped inside\n parentheses (#3307) (22.12.0)\n - Correctly handle trailing commas that are inside a line's leading non-nested parens\n (#3370) (22.12.0)\n - `--skip-string-normalization` / `-S` now prevents docstring prefixes from being\n normalized as expected (#3168) (since 22.8.0)\n - When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from\n subscript expressions with more than 1 element (#3209) (22.8.0)\n - Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside\n parentheses (#3162) (22.8.0)\n - Fix a string merging/split issue when a comment is present in the middle of\n implicitly concatenated strings on its own line (#3227) (22.8.0)\n - Docstring quotes are no longer moved if it would violate the line length limit\n (#3044, #3430) (22.6.0)\n - Parentheses around return annotations are now managed (#2990) (22.6.0)\n - Remove unnecessary parentheses around awaited objects (#2991) (22.6.0)\n - Remove unnecessary parentheses in `with` statements (#2926) (22.6.0)\n - Remove trailing newlines after code block open (#3035) (22.6.0)\n - Code cell separators `#%%` are now standardised to `# %%` (#2919) (22.3.0)\n - Remove unnecessary parentheses from `except` statements (#2939) (22.3.0)\n - Remove unnecessary parentheses from tuple unpacking in `for` loops (#2945) (22.3.0)\n - Avoid magic-trailing-comma in single-element subscripts (#2942) (22.3.0)\n- Fix a crash when a colon line is marked between `# fmt: off` and `# fmt: on` (#3439)\n\n### Preview style\n\n- Format hex codes in unicode escape sequences in string literals (#2916)\n- Add parentheses around `if`-`else` expressions (#2278)\n- Improve performance on large expressions that contain many strings (#3467)\n- Fix a crash in preview style with assert + parenthesized string (#3415)\n- Fix crashes in preview style with walrus operators used in function return annotations\n and except clauses (#3423)\n- Fix a crash in preview advanced string processing where mixed implicitly concatenated\n regular and f-strings start with an empty span (#3463)\n- Fix a crash in preview advanced string processing where a standalone comment is placed\n before a dict's value (#3469)\n- Fix an issue where extra empty lines are added when a decorator has `# fmt: skip`\n applied or there is a standalone comment between decorators (#3470)\n- Do not put the closing quotes in a docstring on a separate line, even if the line is\n too long (#3430)\n- Long values in dict literals are now wrapped in parentheses; correspondingly\n unnecessary parentheses around short values in dict literals are now removed; long\n string lambda values are now wrapped in parentheses (#3440)\n- Fix two crashes in preview style involving edge cases with docstrings (#3451)\n- Exclude string type annotations from improved string processing; fix crash when the\n return type annotation is stringified and spans across multiple lines (#3462)\n- Wrap multiple context managers in parentheses when targeting Python 3.9+ (#3489)\n- Fix several crashes in preview style with walrus operators used in `with` statements\n or tuples (#3473)\n- Fix an invalid quote escaping bug in f-string expressions where it produced invalid\n code. Implicitly concatenated f-strings with different quotes can now be merged or\n quote-normalized by changing the quotes used in expressions. (#3509)\n- Fix crash on `await (yield)` when Black is compiled with mypyc (#3533)\n\n### Configuration\n\n- Black now tries to infer its `--target-version` from the project metadata specified in\n `pyproject.toml` (#3219)\n\n### Packaging\n\n- Upgrade mypyc from `0.971` to `0.991` so mypycified _Black_ can be built on armv7\n (#3380)\n - This also fixes some crashes while using compiled Black with a debug build of\n CPython\n- Drop specific support for the `tomli` requirement on 3.11 alpha releases, working\n around a bug that would cause the requirement not to be installed on any non-final\n Python releases (#3448)\n- Black now depends on `packaging` version `22.0` or later. This is required for new\n functionality that needs to parse part of the project metadata (#3219)\n\n### Output\n\n- Calling `black --help` multiple times will return the same help contents each time\n (#3516)\n- Verbose logging now shows the values of `pyproject.toml` configuration variables\n (#3392)\n- Fix false symlink detection messages in verbose output due to using an incorrect\n relative path to the project root (#3385)\n\n### Integrations\n\n- Move 3.11 CI to normal flow now that all dependencies support 3.11 (#3446)\n- Docker: Add new `latest_prerelease` tag automation to follow latest black alpha\n release on docker images (#3465)\n\n### Documentation\n\n- Expand `vim-plug` installation instructions to offer more explicit options (#3468)\n\n## 22.12.0\n\n### Preview style\n\n- Enforce empty lines before classes and functions with sticky leading comments (#3302)\n- Reformat empty and whitespace-only files as either an empty file (if no newline is\n present) or as a single newline character (if a newline is present) (#3348)\n- Implicitly concatenated strings used as function args are now wrapped inside\n parentheses (#3307)\n- For assignment statements, prefer splitting the right hand side if the left hand side\n fits on a single line (#3368)\n- Correctly handle trailing commas that are inside a line's leading non-nested parens\n (#3370)\n\n### Configuration\n\n- Fix incorrectly applied `.gitignore` rules by considering the `.gitignore` location\n and the relative path to the target file (#3338)\n- Fix incorrectly ignoring `.gitignore` presence when more than one source directory is\n specified (#3336)\n\n### Parser\n\n- Parsing support has been added for walruses inside generator expression that are\n passed as function args (for example,\n `any(match := my_re.match(text) for text in texts)`) (#3327).\n\n### Integrations\n\n- Vim plugin: Optionally allow using the system installation of Black via\n `let g:black_use_virtualenv = 0`(#3309)\n\n## 22.10.0\n\n### Highlights\n\n- Runtime support for Python 3.6 has been removed. Formatting 3.6 code will still be\n supported until further notice.\n\n### Stable style\n\n- Fix a crash when `# fmt: on` is used on a different block level than `# fmt: off`\n (#3281)\n\n### Preview style\n\n- Fix a crash when formatting some dicts with parenthesis-wrapped long string keys\n (#3262)\n\n### Configuration\n\n- `.ipynb_checkpoints` directories are now excluded by default (#3293)\n- Add `--skip-source-first-line` / `-x` option to ignore the first line of source code\n while formatting (#3299)\n\n### Packaging\n\n- Executables made with PyInstaller will no longer crash when formatting several files\n at once on macOS. Native x86-64 executables for macOS are available once again.\n (#3275)\n- Hatchling is now used as the build backend. This will not have any effect for users\n who install Black with its wheels from PyPI. (#3233)\n- Faster compiled wheels are now available for CPython 3.11 (#3276)\n\n### _Blackd_\n\n- Windows style (CRLF) newlines will be preserved (#3257).\n\n### Integrations\n\n- Vim plugin: add flag (`g:black_preview`) to enable/disable the preview style (#3246)\n- Update GitHub Action to support formatting of Jupyter Notebook files via a `jupyter`\n option (#3282)\n- Update GitHub Action to support use of version specifiers (e.g. `<23`) for Black\n version (#3265)\n\n## 22.8.0\n\n### Highlights\n\n- Python 3.11 is now supported, except for _blackd_ as aiohttp does not support 3.11 as\n of publishing (#3234)\n- This is the last release that supports running _Black_ on Python 3.6 (formatting 3.6\n code will continue to be supported until further notice)\n- Reword the stability policy to say that we may, in rare cases, make changes that\n affect code that was not previously formatted by _Black_ (#3155)\n\n### Stable style\n\n- Fix an infinite loop when using `# fmt: on/off` in the middle of an expression or code\n block (#3158)\n- Fix incorrect handling of `# fmt: skip` on colon (`:`) lines (#3148)\n- Comments are no longer deleted when a line had spaces removed around power operators\n (#2874)\n\n### Preview style\n\n- Single-character closing docstring quotes are no longer moved to their own line as\n this is invalid. This was a bug introduced in version 22.6.0. (#3166)\n- `--skip-string-normalization` / `-S` now prevents docstring prefixes from being\n normalized as expected (#3168)\n- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from\n subscript expressions with more than 1 element (#3209)\n- Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside\n parentheses (#3162)\n- Fix a string merging/split issue when a comment is present in the middle of implicitly\n concatenated strings on its own line (#3227)\n\n### _Blackd_\n\n- `blackd` now supports enabling the preview style via the `X-Preview` header (#3217)\n\n### Configuration\n\n- Black now uses the presence of debug f-strings to detect target version (#3215)\n- Fix misdetection of project root and verbose logging of sources in cases involving\n `--stdin-filename` (#3216)\n- Immediate `.gitignore` files in source directories given on the command line are now\n also respected, previously only `.gitignore` files in the project root and\n automatically discovered directories were respected (#3237)\n\n### Documentation\n\n- Recommend using BlackConnect in IntelliJ IDEs (#3150)\n\n### Integrations\n\n- Vim plugin: prefix messages with `Black: ` so it's clear they come from Black (#3194)\n- Docker: changed to a /opt/venv installation + added to PATH to be available to\n non-root users (#3202)\n\n### Output\n\n- Change from deprecated `asyncio.get_event_loop()` to create our event loop which\n removes DeprecationWarning (#3164)\n- Remove logging from internal `blib2to3` library since it regularly emits error logs\n about failed caching that can and should be ignored (#3193)\n\n### Parser\n\n- Type comments are now included in the AST equivalence check consistently so accidental\n deletion raises an error. Though type comments can't be tracked when running on PyPy\n 3.7 due to standard library limitations. (#2874)\n\n### Performance\n\n- Reduce Black's startup time when formatting a single file by 15-30% (#3211)\n\n## 22.6.0\n\n### Style\n\n- Fix unstable formatting involving `#fmt: skip` and `# fmt:skip` comments (notice the\n lack of spaces) (#2970)\n\n### Preview style\n\n- Docstring quotes are no longer moved if it would violate the line length limit (#3044)\n- Parentheses around return annotations are now managed (#2990)\n- Remove unnecessary parentheses around awaited objects (#2991)\n- Remove unnecessary parentheses in `with` statements (#2926)\n- Remove trailing newlines after code block open (#3035)\n\n### Integrations\n\n- Add `scripts/migrate-black.py` script to ease introduction of Black to a Git project\n (#3038)\n\n### Output\n\n- Output Python version and implementation as part of `--version` flag (#2997)\n\n### Packaging\n\n- Use `tomli` instead of `tomllib` on Python 3.11 builds where `tomllib` is not\n available (#2987)\n\n### Parser\n\n- [PEP 654](https://peps.python.org/pep-0654/#except) syntax (for example,\n `except *ExceptionGroup:`) is now supported (#3016)\n- [PEP 646](https://peps.python.org/pep-0646) syntax (for example,\n `Array[Batch, *Shape]` or `def fn(*args: *T) -> None`) is now supported (#3071)\n\n### Vim Plugin\n\n- Fix `strtobool` function. It didn't parse true/on/false/off. (#3025)\n\n## 22.3.0\n\n### Preview style\n\n- Code cell separators `#%%` are now standardised to `# %%` (#2919)\n- Remove unnecessary parentheses from `except` statements (#2939)\n- Remove unnecessary parentheses from tuple unpacking in `for` loops (#2945)\n- Avoid magic-trailing-comma in single-element subscripts (#2942)\n\n### Configuration\n\n- Do not format `__pypackages__` directories by default (#2836)\n- Add support for specifying stable version with `--required-version` (#2832).\n- Avoid crashing when the user has no homedir (#2814)\n- Avoid crashing when md5 is not available (#2905)\n- Fix handling of directory junctions on Windows (#2904)\n\n### Documentation\n\n- Update pylint config documentation (#2931)\n\n### Integrations\n\n- Move test to disable plugin in Vim/Neovim, which speeds up loading (#2896)\n\n### Output\n\n- In verbose mode, log when _Black_ is using user-level config (#2861)\n\n### Packaging\n\n- Fix Black to work with Click 8.1.0 (#2966)\n- On Python 3.11 and newer, use the standard library's `tomllib` instead of `tomli`\n (#2903)\n- `black-primer`, the deprecated internal devtool, has been removed and copied to a\n [separate repository](https://github.com/cooperlees/black-primer) (#2924)\n\n### Parser\n\n- Black can now parse starred expressions in the target of `for` and `async for`\n statements, e.g `for item in *items_1, *items_2: pass` (#2879).\n\n## 22.1.0\n\nAt long last, _Black_ is no longer a beta product! This is the first non-beta release\nand the first release covered by our new\n[stability policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy).\n\n### Highlights\n\n- **Remove Python 2 support** (#2740)\n- Introduce the `--preview` flag (#2752)\n\n### Style\n\n- Deprecate `--experimental-string-processing` and move the functionality under\n `--preview` (#2789)\n- For stubs, one blank line between class attributes and methods is now kept if there's\n at least one pre-existing blank line (#2736)\n- Black now normalizes string prefix order (#2297)\n- Remove spaces around power operators if both operands are simple (#2726)\n- Work around bug that causes unstable formatting in some cases in the presence of the\n magic trailing comma (#2807)\n- Use parentheses for attribute access on decimal float and int literals (#2799)\n- Don't add whitespace for attribute access on hexadecimal, binary, octal, and complex\n literals (#2799)\n- Treat blank lines in stubs the same inside top-level `if` statements (#2820)\n- Fix unstable formatting with semicolons and arithmetic expressions (#2817)\n- Fix unstable formatting around magic trailing comma (#2572)\n\n### Parser\n\n- Fix mapping cases that contain as-expressions, like `case {\"key\": 1 | 2 as password}`\n (#2686)\n- Fix cases that contain multiple top-level as-expressions, like `case 1 as a, 2 as b`\n (#2716)\n- Fix call patterns that contain as-expressions with keyword arguments, like\n `case Foo(bar=baz as quux)` (#2749)\n- Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700)\n- Unparenthesized tuples on annotated assignments (e.g\n `values: Tuple[int, ...] = 1, 2, 3`) now implies 3.8+ (#2708)\n- Fix handling of standalone `match()` or `case()` when there is a trailing newline or a\n comment inside of the parentheses. (#2760)\n- `from __future__ import annotations` statement now implies Python 3.7+ (#2690)\n\n### Performance\n\n- Speed-up the new backtracking parser about 4X in general (enabled when\n `--target-version` is set to 3.10 and higher). (#2728)\n- _Black_ is now compiled with [mypyc](https://github.com/mypyc/mypyc) for an overall 2x\n speed-up. 64-bit Windows, MacOS, and Linux (not including musl) are supported. (#1009,\n #2431)\n\n### Configuration\n\n- Do not accept bare carriage return line endings in pyproject.toml (#2408)\n- Add configuration option (`python-cell-magics`) to format cells with custom magics in\n Jupyter Notebooks (#2744)\n- Allow setting custom cache directory on all platforms with environment variable\n `BLACK_CACHE_DIR` (#2739).\n- Enable Python 3.10+ by default, without any extra need to specify\n `--target-version=py310`. (#2758)\n- Make passing `SRC` or `--code` mandatory and mutually exclusive (#2804)\n\n### Output\n\n- Improve error message for invalid regular expression (#2678)\n- Improve error message when parsing fails during AST safety check by embedding the\n underlying SyntaxError (#2693)\n- No longer color diff headers white as it's unreadable in light themed terminals\n (#2691)\n- Text coloring added in the final statistics (#2712)\n- Verbose mode also now describes how a project root was discovered and which paths will\n be formatted. (#2526)\n\n### Packaging\n\n- All upper version bounds on dependencies have been removed (#2718)\n- `typing-extensions` is no longer a required dependency in Python 3.10+ (#2772)\n- Set `click` lower bound to `8.0.0` (#2791)\n\n### Integrations\n\n- Update GitHub action to support containerized runs (#2748)\n\n### Documentation\n\n- Change protocol in pip installation instructions to `https://` (#2761)\n- Change HTML theme to Furo primarily for its responsive design and mobile support\n (#2793)\n- Deprecate the `black-primer` tool (#2809)\n- Document Python support policy (#2819)\n\n## 21.12b0\n\n### _Black_\n\n- Fix determination of f-string expression spans (#2654)\n- Fix bad formatting of error messages about EOF in multi-line statements (#2343)\n- Functions and classes in blocks now have more consistent surrounding spacing (#2472)\n\n#### Jupyter Notebook support\n\n- Cell magics are now only processed if they are known Python cell magics. Earlier, all\n cell magics were tokenized, leading to possible indentation errors e.g. with\n `%%writefile`. (#2630)\n- Fix assignment to environment variables in Jupyter Notebooks (#2642)\n\n#### Python 3.10 support\n\n- Point users to using `--target-version py310` if we detect 3.10-only syntax (#2668)\n- Fix `match` statements with open sequence subjects, like `match a, b:` or\n `match a, *b:` (#2639) (#2659)\n- Fix `match`/`case` statements that contain `match`/`case` soft keywords multiple\n times, like `match re.match()` (#2661)\n- Fix `case` statements with an inline body (#2665)\n- Fix styling of starred expressions inside `match` subject (#2667)\n- Fix parser error location on invalid syntax in a `match` statement (#2649)\n- Fix Python 3.10 support on platforms without ProcessPoolExecutor (#2631)\n- Improve parsing performance on code that uses `match` under `--target-version py310`\n up to ~50% (#2670)\n\n### Packaging\n\n- Remove dependency on `regex` (#2644) (#2663)\n\n## 21.11b1\n\n### _Black_\n\n- Bumped regex version minimum to 2021.4.4 to fix Pattern class usage (#2621)\n\n## 21.11b0\n\n### _Black_\n\n- Warn about Python 2 deprecation in more cases by improving Python 2 only syntax\n detection (#2592)\n- Add experimental PyPy support (#2559)\n- Add partial support for the match statement. As it's experimental, it's only enabled\n when `--target-version py310` is explicitly specified (#2586)\n- Add support for parenthesized with (#2586)\n- Declare support for Python 3.10 for running Black (#2562)\n\n### Integrations\n\n- Fixed vim plugin with Python 3.10 by removing deprecated distutils import (#2610)\n- The vim plugin now parses `skip_magic_trailing_comma` from pyproject.toml (#2613)\n\n## 21.10b0\n\n### _Black_\n\n- Document stability policy, that will apply for non-beta releases (#2529)\n- Add new `--workers` parameter (#2514)\n- Fixed feature detection for positional-only arguments in lambdas (#2532)\n- Bumped typed-ast version minimum to 1.4.3 for 3.10 compatibility (#2519)\n- Fixed a Python 3.10 compatibility issue where the loop argument was still being passed\n even though it has been removed (#2580)\n- Deprecate Python 2 formatting support (#2523)\n\n### _Blackd_\n\n- Remove dependency on aiohttp-cors (#2500)\n- Bump required aiohttp version to 3.7.4 (#2509)\n\n### _Black-Primer_\n\n- Add primer support for --projects (#2555)\n- Print primer summary after individual failures (#2570)\n\n### Integrations\n\n- Allow to pass `target_version` in the vim plugin (#1319)\n- Install build tools in docker file and use multi-stage build to keep the image size\n down (#2582)\n\n## 21.9b0\n\n### Packaging\n\n- Fix missing modules in self-contained binaries (#2466)\n- Fix missing toml extra used during installation (#2475)\n\n## 21.8b0\n\n### _Black_\n\n- Add support for formatting Jupyter Notebook files (#2357)\n- Move from `appdirs` dependency to `platformdirs` (#2375)\n- Present a more user-friendly error if .gitignore is invalid (#2414)\n- The failsafe for accidentally added backslashes in f-string expressions has been\n hardened to handle more edge cases during quote normalization (#2437)\n- Avoid changing a function return type annotation's type to a tuple by adding a\n trailing comma (#2384)\n- Parsing support has been added for unparenthesized walruses in set literals, set\n comprehensions, and indices (#2447).\n- Pin `setuptools-scm` build-time dependency version (#2457)\n- Exclude typing-extensions version 3.10.0.1 due to it being broken on Python 3.10\n (#2460)\n\n### _Blackd_\n\n- Replace sys.exit(-1) with raise ImportError as it plays more nicely with tools that\n scan installed packages (#2440)\n\n### Integrations\n\n- The provided pre-commit hooks no longer specify `language_version` to avoid overriding\n `default_language_version` (#2430)\n\n## 21.7b0\n\n### _Black_\n\n- Configuration files using TOML features higher than spec v0.5.0 are now supported\n (#2301)\n- Add primer support and test for code piped into black via STDIN (#2315)\n- Fix internal error when `FORCE_OPTIONAL_PARENTHESES` feature is enabled (#2332)\n- Accept empty stdin (#2346)\n- Provide a more useful error when parsing fails during AST safety checks (#2304)\n\n### Docker\n\n- Add new `latest_release` tag automation to follow latest black release on docker\n images (#2374)\n\n### Integrations\n\n- The vim plugin now searches upwards from the directory containing the current buffer\n instead of the current working directory for pyproject.toml. (#1871)\n- The vim plugin now reads the correct string normalization option in pyproject.toml\n (#1869)\n- The vim plugin no longer crashes Black when there's boolean values in pyproject.toml\n (#1869)\n\n## 21.6b0\n\n### _Black_\n\n- Fix failure caused by `fmt: skip` and indentation (#2281)\n- Account for += assignment when deciding whether to split string (#2312)\n- Correct max string length calculation when there are string operators (#2292)\n- Fixed option usage when using the `--code` flag (#2259)\n- Do not call `uvloop.install()` when _Black_ is used as a library (#2303)\n- Added `--required-version` option to require a specific version to be running (#2300)\n- Fix incorrect custom breakpoint indices when string group contains fake f-strings\n (#2311)\n- Fix regression where `R` prefixes would be lowercased for docstrings (#2285)\n- Fix handling of named escapes (`\\N{...}`) when `--experimental-string-processing` is\n used (#2319)\n\n### Integrations\n\n- The official Black action now supports choosing what version to use, and supports the\n major 3 OSes. (#1940)\n\n## 21.5b2\n\n### _Black_\n\n- A space is no longer inserted into empty docstrings (#2249)\n- Fix handling of .gitignore files containing non-ASCII characters on Windows (#2229)\n- Respect `.gitignore` files in all levels, not only `root/.gitignore` file (apply\n `.gitignore` rules like `git` does) (#2225)\n- Restored compatibility with Click 8.0 on Python 3.6 when LANG=C used (#2227)\n- Add extra uvloop install + import support if in python env (#2258)\n- Fix --experimental-string-processing crash when matching parens are not found (#2283)\n- Make sure to split lines that start with a string operator (#2286)\n- Fix regular expression that black uses to identify f-expressions (#2287)\n\n### _Blackd_\n\n- Add a lower bound for the `aiohttp-cors` dependency. Only 0.4.0 or higher is\n supported. (#2231)\n\n### Packaging\n\n- Release self-contained x86_64 MacOS binaries as part of the GitHub release pipeline\n (#2198)\n- Always build binaries with the latest available Python (#2260)\n\n### Documentation\n\n- Add discussion of magic comments to FAQ page (#2272)\n- `--experimental-string-processing` will be enabled by default in the future (#2273)\n- Fix typos discovered by codespell (#2228)\n- Fix Vim plugin installation instructions. (#2235)\n- Add new Frequently Asked Questions page (#2247)\n- Fix encoding + symlink issues preventing proper build on Windows (#2262)\n\n## 21.5b1\n\n### _Black_\n\n- Refactor `src/black/__init__.py` into many files (#2206)\n\n### Documentation\n\n- Replaced all remaining references to the\n [`master`](https://github.com/psf/black/tree/main) branch with the\n [`main`](https://github.com/psf/black/tree/main) branch. Some additional changes in\n the source code were also made. (#2210)\n- Significantly reorganized the documentation to make much more sense. Check them out by\n heading over to [the stable docs on RTD](https://black.readthedocs.io/en/stable/).\n (#2174)\n\n## 21.5b0\n\n### _Black_\n\n- Set `--pyi` mode if `--stdin-filename` ends in `.pyi` (#2169)\n- Stop detecting target version as Python 3.9+ with pre-PEP-614 decorators that are\n being called but with no arguments (#2182)\n\n### _Black-Primer_\n\n- Add `--no-diff` to black-primer to suppress formatting changes (#2187)\n\n## 21.4b2\n\n### _Black_\n\n- Fix crash if the user configuration directory is inaccessible. (#2158)\n\n- Clarify\n [circumstances](https://github.com/psf/black/blob/master/docs/the_black_code_style.md#pragmatism)\n in which _Black_ may change the AST (#2159)\n\n- Allow `.gitignore` rules to be overridden by specifying `exclude` in `pyproject.toml`\n or on the command line. (#2170)\n\n### _Packaging_\n\n- Install `primer.json` (used by `black-primer` by default) with black. (#2154)\n\n## 21.4b1\n\n### _Black_\n\n- Fix crash on docstrings ending with \"\\\\ \". (#2142)\n\n- Fix crash when atypical whitespace is cleaned out of dostrings (#2120)\n\n- Reflect the `--skip-magic-trailing-comma` and `--experimental-string-processing` flags\n in the name of the cache file. Without this fix, changes in these flags would not take\n effect if the cache had already been populated. (#2131)\n\n- Don't remove necessary parentheses from assignment expression containing assert /\n return statements. (#2143)\n\n### _Packaging_\n\n- Bump pathspec to >= 0.8.1 to solve invalid .gitignore exclusion handling\n\n## 21.4b0\n\n### _Black_\n\n- Fixed a rare but annoying formatting instability created by the combination of\n optional trailing commas inserted by `Black` and optional parentheses looking at\n pre-existing \"magic\" trailing commas. This fixes issue #1629 and all of its many many\n duplicates. (#2126)\n\n- `Black` now processes one-line docstrings by stripping leading and trailing spaces,\n and adding a padding space when needed to break up \"\"\"\". (#1740)\n\n- `Black` now cleans up leading non-breaking spaces in comments (#2092)\n\n- `Black` now respects `--skip-string-normalization` when normalizing multiline\n docstring quotes (#1637)\n\n- `Black` no longer removes all empty lines between non-function code and decorators\n when formatting typing stubs. Now `Black` enforces a single empty line. (#1646)\n\n- `Black` no longer adds an incorrect space after a parenthesized assignment expression\n in if/while statements (#1655)\n\n- Added `--skip-magic-trailing-comma` / `-C` to avoid using trailing commas as a reason\n to split lines (#1824)\n\n- fixed a crash when PWD=/ on POSIX (#1631)\n\n- fixed \"I/O operation on closed file\" when using --diff (#1664)\n\n- Prevent coloured diff output being interleaved with multiple files (#1673)\n\n- Added support for PEP 614 relaxed decorator syntax on python 3.9 (#1711)\n\n- Added parsing support for unparenthesized tuples and yield expressions in annotated\n assignments (#1835)\n\n- added `--extend-exclude` argument (PR #2005)\n\n- speed up caching by avoiding pathlib (#1950)\n\n- `--diff` correctly indicates when a file doesn't end in a newline (#1662)\n\n- Added `--stdin-filename` argument to allow stdin to respect `--force-exclude` rules\n (#1780)\n\n- Lines ending with `fmt: skip` will now be not formatted (#1800)\n\n- PR #2053: Black no longer relies on typed-ast for Python 3.8 and higher\n\n- PR #2053: Python 2 support is now optional, install with\n `python3 -m pip install black[python2]` to maintain support.\n\n- Exclude `venv` directory by default (#1683)\n\n- Fixed \"Black produced code that is not equivalent to the source\" when formatting\n Python 2 docstrings (#2037)\n\n### _Packaging_\n\n- Self-contained native _Black_ binaries are now provided for releases via GitHub\n Releases (#1743)\n\n## 20.8b1\n\n### _Packaging_\n\n- explicitly depend on Click 7.1.2 or newer as `Black` no longer works with versions\n older than 7.0\n\n## 20.8b0\n\n### _Black_\n\n- re-implemented support for explicit trailing commas: now it works consistently within\n any bracket pair, including nested structures (#1288 and duplicates)\n\n- `Black` now reindents docstrings when reindenting code around it (#1053)\n\n- `Black` now shows colored diffs (#1266)\n\n- `Black` is now packaged using 'py3' tagged wheels (#1388)\n\n- `Black` now supports Python 3.8 code, e.g. star expressions in return statements\n (#1121)\n\n- `Black` no longer normalizes capital R-string prefixes as those have a\n community-accepted meaning (#1244)\n\n- `Black` now uses exit code 2 when specified configuration file doesn't exit (#1361)\n\n- `Black` now works on AWS Lambda (#1141)\n\n- added `--force-exclude` argument (#1032)\n\n- removed deprecated `--py36` option (#1236)\n\n- fixed `--diff` output when EOF is encountered (#526)\n\n- fixed `# fmt: off` handling around decorators (#560)\n\n- fixed unstable formatting with some `# type: ignore` comments (#1113)\n\n- fixed invalid removal on organizing brackets followed by indexing (#1575)\n\n- introduced `black-primer`, a CI tool that allows us to run regression tests against\n existing open source users of Black (#1402)\n\n- introduced property-based fuzzing to our test suite based on Hypothesis and\n Hypothersmith (#1566)\n\n- implemented experimental and disabled by default long string rewrapping (#1132),\n hidden under a `--experimental-string-processing` flag while it's being worked on;\n this is an undocumented and unsupported feature, you lose Internet points for\n depending on it (#1609)\n\n### Vim plugin\n\n- prefer virtualenv packages over global packages (#1383)\n\n## 19.10b0\n\n- added support for PEP 572 assignment expressions (#711)\n\n- added support for PEP 570 positional-only arguments (#943)\n\n- added support for async generators (#593)\n\n- added support for pre-splitting collections by putting an explicit trailing comma\n inside (#826)\n\n- added `black -c` as a way to format code passed from the command line (#761)\n\n- --safe now works with Python 2 code (#840)\n\n- fixed grammar selection for Python 2-specific code (#765)\n\n- fixed feature detection for trailing commas in function definitions and call sites\n (#763)\n\n- `# fmt: off`/`# fmt: on` comment pairs placed multiple times within the same block of\n code now behave correctly (#1005)\n\n- _Black_ no longer crashes on Windows machines with more than 61 cores (#838)\n\n- _Black_ no longer crashes on standalone comments prepended with a backslash (#767)\n\n- _Black_ no longer crashes on `from` ... `import` blocks with comments (#829)\n\n- _Black_ no longer crashes on Python 3.7 on some platform configurations (#494)\n\n- _Black_ no longer fails on comments in from-imports (#671)\n\n- _Black_ no longer fails when the file starts with a backslash (#922)\n\n- _Black_ no longer merges regular comments with type comments (#1027)\n\n- _Black_ no longer splits long lines that contain type comments (#997)\n\n- removed unnecessary parentheses around `yield` expressions (#834)\n\n- added parentheses around long tuples in unpacking assignments (#832)\n\n- added parentheses around complex powers when they are prefixed by a unary operator\n (#646)\n\n- fixed bug that led _Black_ format some code with a line length target of 1 (#762)\n\n- _Black_ no longer introduces quotes in f-string subexpressions on string boundaries\n (#863)\n\n- if _Black_ puts parenthesis around a single expression, it moves comments to the\n wrapped expression instead of after the brackets (#872)\n\n- `blackd` now returns the version of _Black_ in the response headers (#1013)\n\n- `blackd` can now output the diff of formats on source code when the `X-Diff` header is\n provided (#969)\n\n## 19.3b0\n\n- new option `--target-version` to control which Python versions _Black_-formatted code\n should target (#618)\n\n- deprecated `--py36` (use `--target-version=py36` instead) (#724)\n\n- _Black_ no longer normalizes numeric literals to include `_` separators (#696)\n\n- long `del` statements are now split into multiple lines (#698)\n\n- type comments are no longer mangled in function signatures\n\n- improved performance of formatting deeply nested data structures (#509)\n\n- _Black_ now properly formats multiple files in parallel on Windows (#632)\n\n- _Black_ now creates cache files atomically which allows it to be used in parallel\n pipelines (like `xargs -P8`) (#673)\n\n- _Black_ now correctly indents comments in files that were previously formatted with\n tabs (#262)\n\n- `blackd` now supports CORS (#622)\n\n## 18.9b0\n\n- numeric literals are now formatted by _Black_ (#452, #461, #464, #469):\n\n - numeric literals are normalized to include `_` separators on Python 3.6+ code\n\n - added `--skip-numeric-underscore-normalization` to disable the above behavior and\n leave numeric underscores as they were in the input\n\n - code with `_` in numeric literals is recognized as Python 3.6+\n\n - most letters in numeric literals are lowercased (e.g., in `1e10`, `0x01`)\n\n - hexadecimal digits are always uppercased (e.g. `0xBADC0DE`)\n\n- added `blackd`, see\n [its documentation](https://github.com/psf/black/blob/18.9b0/README.md#blackd) for\n more info (#349)\n\n- adjacent string literals are now correctly split into multiple lines (#463)\n\n- trailing comma is now added to single imports that don't fit on a line (#250)\n\n- cache is now populated when `--check` is successful for a file which speeds up\n consecutive checks of properly formatted unmodified files (#448)\n\n- whitespace at the beginning of the file is now removed (#399)\n\n- fixed mangling [pweave](http://mpastell.com/pweave/) and\n [Spyder IDE](https://www.spyder-ide.org/) special comments (#532)\n\n- fixed unstable formatting when unpacking big tuples (#267)\n\n- fixed parsing of `__future__` imports with renames (#389)\n\n- fixed scope of `# fmt: off` when directly preceding `yield` and other nodes (#385)\n\n- fixed formatting of lambda expressions with default arguments (#468)\n\n- fixed `async for` statements: _Black_ no longer breaks them into separate lines (#372)\n\n- note: the Vim plugin stopped registering `,=` as a default chord as it turned out to\n be a bad idea (#415)\n\n## 18.6b4\n\n- hotfix: don't freeze when multiple comments directly precede `# fmt: off` (#371)\n\n## 18.6b3\n\n- typing stub files (`.pyi`) now have blank lines added after constants (#340)\n\n- `# fmt: off` and `# fmt: on` are now much more dependable:\n\n - they now work also within bracket pairs (#329)\n\n - they now correctly work across function/class boundaries (#335)\n\n - they now work when an indentation block starts with empty lines or misaligned\n comments (#334)\n\n- made Click not fail on invalid environments; note that Click is right but the\n likelihood we'll need to access non-ASCII file paths when dealing with Python source\n code is low (#277)\n\n- fixed improper formatting of f-strings with quotes inside interpolated expressions\n (#322)\n\n- fixed unnecessary slowdown when long list literals where found in a file\n\n- fixed unnecessary slowdown on AST nodes with very many siblings\n\n- fixed cannibalizing backslashes during string normalization\n\n- fixed a crash due to symbolic links pointing outside of the project directory (#338)\n\n## 18.6b2\n\n- added `--config` (#65)\n\n- added `-h` equivalent to `--help` (#316)\n\n- fixed improper unmodified file caching when `-S` was used\n\n- fixed extra space in string unpacking (#305)\n\n- fixed formatting of empty triple quoted strings (#313)\n\n- fixed unnecessary slowdown in comment placement calculation on lines without comments\n\n## 18.6b1\n\n- hotfix: don't output human-facing information on stdout (#299)\n\n- hotfix: don't output cake emoji on non-zero return code (#300)\n\n## 18.6b0\n\n- added `--include` and `--exclude` (#270)\n\n- added `--skip-string-normalization` (#118)\n\n- added `--verbose` (#283)\n\n- the header output in `--diff` now actually conforms to the unified diff spec\n\n- fixed long trivial assignments being wrapped in unnecessary parentheses (#273)\n\n- fixed unnecessary parentheses when a line contained multiline strings (#232)\n\n- fixed stdin handling not working correctly if an old version of Click was used (#276)\n\n- _Black_ now preserves line endings when formatting a file in place (#258)\n\n## 18.5b1\n\n- added `--pyi` (#249)\n\n- added `--py36` (#249)\n\n- Python grammar pickle caches are stored with the formatting caches, making _Black_\n work in environments where site-packages is not user-writable (#192)\n\n- _Black_ now enforces a PEP 257 empty line after a class-level docstring (and/or\n fields) and the first method\n\n- fixed invalid code produced when standalone comments were present in a trailer that\n was omitted from line splitting on a large expression (#237)\n\n- fixed optional parentheses being removed within `# fmt: off` sections (#224)\n\n- fixed invalid code produced when stars in very long imports were incorrectly wrapped\n in optional parentheses (#234)\n\n- fixed unstable formatting when inline comments were moved around in a trailer that was\n omitted from line splitting on a large expression (#238)\n\n- fixed extra empty line between a class declaration and the first method if no class\n docstring or fields are present (#219)\n\n- fixed extra empty line between a function signature and an inner function or inner\n class (#196)\n\n## 18.5b0\n\n- call chains are now formatted according to the\n [fluent interfaces](https://en.wikipedia.org/wiki/Fluent_interface) style (#67)\n\n- data structure literals (tuples, lists, dictionaries, and sets) are now also always\n exploded like imports when they don't fit in a single line (#152)\n\n- slices are now formatted according to PEP 8 (#178)\n\n- parentheses are now also managed automatically on the right-hand side of assignments\n and return statements (#140)\n\n- math operators now use their respective priorities for delimiting multiline\n expressions (#148)\n\n- optional parentheses are now omitted on expressions that start or end with a bracket\n and only contain a single operator (#177)\n\n- empty parentheses in a class definition are now removed (#145, #180)\n\n- string prefixes are now standardized to lowercase and `u` is removed on Python 3.6+\n only code and Python 2.7+ code with the `unicode_literals` future import (#188, #198,\n #199)\n\n- typing stub files (`.pyi`) are now formatted in a style that is consistent with PEP\n 484 (#207, #210)\n\n- progress when reformatting many files is now reported incrementally\n\n- fixed trailers (content with brackets) being unnecessarily exploded into their own\n lines after a dedented closing bracket (#119)\n\n- fixed an invalid trailing comma sometimes left in imports (#185)\n\n- fixed non-deterministic formatting when multiple pairs of removable parentheses were\n used (#183)\n\n- fixed multiline strings being unnecessarily wrapped in optional parentheses in long\n assignments (#215)\n\n- fixed not splitting long from-imports with only a single name\n\n- fixed Python 3.6+ file discovery by also looking at function calls with unpacking.\n This fixed non-deterministic formatting if trailing commas where used both in function\n signatures with stars and function calls with stars but the former would be\n reformatted to a single line.\n\n- fixed crash on dealing with optional parentheses (#193)\n\n- fixed \"is\", \"is not\", \"in\", and \"not in\" not considered operators for splitting\n purposes\n\n- fixed crash when dead symlinks where encountered\n\n## 18.4a4\n\n- don't populate the cache on `--check` (#175)\n\n## 18.4a3\n\n- added a \"cache\"; files already reformatted that haven't changed on disk won't be\n reformatted again (#109)\n\n- `--check` and `--diff` are no longer mutually exclusive (#149)\n\n- generalized star expression handling, including double stars; this fixes\n multiplication making expressions \"unsafe\" for trailing commas (#132)\n\n- _Black_ no longer enforces putting empty lines behind control flow statements (#90)\n\n- _Black_ now splits imports like \"Mode 3 + trailing comma\" of isort (#127)\n\n- fixed comment indentation when a standalone comment closes a block (#16, #32)\n\n- fixed standalone comments receiving extra empty lines if immediately preceding a\n class, def, or decorator (#56, #154)\n\n- fixed `--diff` not showing entire path (#130)\n\n- fixed parsing of complex expressions after star and double stars in function calls\n (#2)\n\n- fixed invalid splitting on comma in lambda arguments (#133)\n\n- fixed missing splits of ternary expressions (#141)\n\n## 18.4a2\n\n- fixed parsing of unaligned standalone comments (#99, #112)\n\n- fixed placement of dictionary unpacking inside dictionary literals (#111)\n\n- Vim plugin now works on Windows, too\n\n- fixed unstable formatting when encountering unnecessarily escaped quotes in a string\n (#120)\n\n## 18.4a1\n\n- added `--quiet` (#78)\n\n- added automatic parentheses management (#4)\n\n- added [pre-commit](https://pre-commit.com) integration (#103, #104)\n\n- fixed reporting on `--check` with multiple files (#101, #102)\n\n- fixed removing backslash escapes from raw strings (#100, #105)\n\n## 18.4a0\n\n- added `--diff` (#87)\n\n- add line breaks before all delimiters, except in cases like commas, to better comply\n with PEP 8 (#73)\n\n- standardize string literals to use double quotes (almost) everywhere (#75)\n\n- fixed handling of standalone comments within nested bracketed expressions; _Black_\n will no longer produce super long lines or put all standalone comments at the end of\n the expression (#22)\n\n- fixed 18.3a4 regression: don't crash and burn on empty lines with trailing whitespace\n (#80)\n\n- fixed 18.3a4 regression: `# yapf: disable` usage as trailing comment would cause\n _Black_ to not emit the rest of the file (#95)\n\n- when CTRL+C is pressed while formatting many files, _Black_ no longer freaks out with\n a flurry of asyncio-related exceptions\n\n- only allow up to two empty lines on module level and only single empty lines within\n functions (#74)\n\n## 18.3a4\n\n- `# fmt: off` and `# fmt: on` are implemented (#5)\n\n- automatic detection of deprecated Python 2 forms of print statements and exec\n statements in the formatted file (#49)\n\n- use proper spaces for complex expressions in default values of typed function\n arguments (#60)\n\n- only return exit code 1 when --check is used (#50)\n\n- don't remove single trailing commas from square bracket indexing (#59)\n\n- don't omit whitespace if the previous factor leaf wasn't a math operator (#55)\n\n- omit extra space in kwarg unpacking if it's the first argument (#46)\n\n- omit extra space in\n [Sphinx auto-attribute comments](http://www.sphinx-doc.org/en/stable/ext/autodoc.html#directive-autoattribute)\n (#68)\n\n## 18.3a3\n\n- don't remove single empty lines outside of bracketed expressions (#19)\n\n- added ability to pipe formatting from stdin to stdin (#25)\n\n- restored ability to format code with legacy usage of `async` as a name (#20, #42)\n\n- even better handling of numpy-style array indexing (#33, again)\n\n## 18.3a2\n\n- changed positioning of binary operators to occur at beginning of lines instead of at\n the end, following\n [a recent change to PEP 8](https://github.com/python/peps/commit/c59c4376ad233a62ca4b3a6060c81368bd21e85b)\n (#21)\n\n- ignore empty bracket pairs while splitting. This avoids very weirdly looking\n formattings (#34, #35)\n\n- remove a trailing comma if there is a single argument to a call\n\n- if top level functions were separated by a comment, don't put four empty lines after\n the upper function\n\n- fixed unstable formatting of newlines with imports\n\n- fixed unintentional folding of post scriptum standalone comments into last statement\n if it was a simple statement (#18, #28)\n\n- fixed missing space in numpy-style array indexing (#33)\n\n- fixed spurious space after star-based unary expressions (#31)\n\n## 18.3a1\n\n- added `--check`\n\n- only put trailing commas in function signatures and calls if it's safe to do so. If\n the file is Python 3.6+ it's always safe, otherwise only safe if there are no `*args`\n or `**kwargs` used in the signature or call. (#8)\n\n- fixed invalid spacing of dots in relative imports (#6, #13)\n\n- fixed invalid splitting after comma on unpacked variables in for-loops (#23)\n\n- fixed spurious space in parenthesized set expressions (#7)\n\n- fixed spurious space after opening parentheses and in default arguments (#14, #17)\n\n- fixed spurious space after unary operators when the operand was a complex expression\n (#15)\n\n## 18.3a0\n\n- first published version, Happy 🍰 Day 2018!\n\n- alpha quality\n\n- date-versioned (see: <https://calver.org/>)\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/c8/d5/867e75361fc45f6de75fe277dd085627a9db5ebb511a87f27dc1396b5351/cattrs-24.1.2-py3-none-any.whl","archive_info":{"hash":"sha256=67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0","hashes":{"sha256":"67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.3","name":"cattrs","version":"24.1.2","summary":"Composable complex class support for attrs and dataclasses.","description_content_type":"text/markdown","keywords":["attrs","dataclasses","serialization"],"author_email":"Tin Tvrtkovic <tinchester@gmail.com>","license":"MIT","license_file":["LICENSE"],"classifier":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Typing :: Typed"],"requires_dist":["attrs>=23.1.0","exceptiongroup>=1.1.1; python_version < '3.11'","typing-extensions!=4.6.3,>=4.1.0; python_version < '3.11'","pymongo>=4.4.0; extra == 'bson'","cbor2>=5.4.6; extra == 'cbor2'","msgpack>=1.0.5; extra == 'msgpack'","msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec'","orjson>=3.9.2; (implementation_name == 'cpython') and extra == 'orjson'","pyyaml>=6.0; extra == 'pyyaml'","tomlkit>=0.11.8; extra == 'tomlkit'","ujson>=5.7.0; extra == 'ujson'"],"requires_python":">=3.8","project_url":["Homepage, https://catt.rs","Changelog, https://catt.rs/en/latest/history.html","Bug Tracker, https://github.com/python-attrs/cattrs/issues","Repository, https://github.com/python-attrs/cattrs","Documentation, https://catt.rs/en/stable/"],"provides_extra":["bson","cbor2","msgpack","msgspec","orjson","pyyaml","tomlkit","ujson"],"description":"# *cattrs*: Flexible Object Serialization and Validation\n\n*Because validation belongs to the edges.*\n\n[](https://catt.rs/)\n[](https://github.com/hynek/stamina/blob/main/LICENSE)\n[](https://pypi.python.org/pypi/cattrs)\n[](https://github.com/python-attrs/cattrs)\n[](https://pepy.tech/project/cattrs)\n[](https://github.com/python-attrs/cattrs/actions/workflows/main.yml)\n\n---\n\n<!-- begin-teaser -->\n\n**cattrs** is a Swiss Army knife for (un)structuring and validating data in Python.\nIn practice, that means it converts **unstructured dictionaries** into **proper classes** and back, while **validating** their contents.\n\n<!-- end-teaser -->\n\n\n## Example\n\n<!-- begin-example -->\n\n_cattrs_ works best with [_attrs_](https://www.attrs.org/) classes, and [dataclasses](https://docs.python.org/3/library/dataclasses.html) where simple (un-)structuring works out of the box, even for nested data, without polluting your data model with serialization details:\n\n```python\n>>> from attrs import define\n>>> from cattrs import structure, unstructure\n>>> @define\n... class C:\n... a: int\n... b: list[str]\n>>> instance = structure({'a': 1, 'b': ['x', 'y']}, C)\n>>> instance\nC(a=1, b=['x', 'y'])\n>>> unstructure(instance)\n{'a': 1, 'b': ['x', 'y']}\n```\n\n<!-- end-teaser -->\n<!-- end-example -->\n\nHave a look at [*Why *cattrs*?*](https://catt.rs/en/latest/why.html) for more examples!\n\n<!-- begin-why -->\n\n## Features\n\n### Recursive Unstructuring\n\n- _attrs_ classes and dataclasses are converted into dictionaries in a way similar to `attrs.asdict()`, or into tuples in a way similar to `attrs.astuple()`.\n- Enumeration instances are converted to their values.\n- Other types are let through without conversion. This includes types such as integers, dictionaries, lists and instances of non-_attrs_ classes.\n- Custom converters for any type can be registered using `register_unstructure_hook`.\n\n\n### Recursive Structuring\n\nConverts unstructured data into structured data, recursively, according to your specification given as a type.\nThe following types are supported:\n\n- `typing.Optional[T]` and its 3.10+ form, `T | None`.\n- `list[T]`, `typing.List[T]`, `typing.MutableSequence[T]`, `typing.Sequence[T]` convert to a lists.\n- `tuple` and `typing.Tuple` (both variants, `tuple[T, ...]` and `tuple[X, Y, Z]`).\n- `set[T]`, `typing.MutableSet[T]`, and `typing.Set[T]` convert to a sets.\n- `frozenset[T]`, and `typing.FrozenSet[T]` convert to a frozensets.\n- `dict[K, V]`, `typing.Dict[K, V]`, `typing.MutableMapping[K, V]`, and `typing.Mapping[K, V]` convert to a dictionaries.\n- [`typing.TypedDict`](https://docs.python.org/3/library/typing.html#typing.TypedDict), ordinary and generic.\n- [`typing.NewType`](https://docs.python.org/3/library/typing.html#newtype)\n- [PEP 695 type aliases](https://docs.python.org/3/library/typing.html#type-aliases) on 3.12+\n- _attrs_ classes with simple attributes and the usual `__init__`[^simple].\n- All _attrs_ classes and dataclasses with the usual `__init__`, if their complex attributes have type metadata.\n- Unions of supported _attrs_ classes, given that all of the classes have a unique field.\n- Unions of anything, if you provide a disambiguation function for it.\n- Custom converters for any type can be registered using `register_structure_hook`.\n\n[^simple]: Simple attributes are attributes that can be assigned unstructured data, like numbers, strings, and collections of unstructured data.\n\n\n### Batteries Included\n\n_cattrs_ comes with pre-configured converters for a number of serialization libraries, including JSON (standard library, [_orjson_](https://pypi.org/project/orjson/), [UltraJSON](https://pypi.org/project/ujson/)), [_msgpack_](https://pypi.org/project/msgpack/), [_cbor2_](https://pypi.org/project/cbor2/), [_bson_](https://pypi.org/project/bson/), [PyYAML](https://pypi.org/project/PyYAML/), [_tomlkit_](https://pypi.org/project/tomlkit/) and [_msgspec_](https://pypi.org/project/msgspec/) (supports only JSON at this time).\n\nFor details, see the [cattrs.preconf package](https://catt.rs/en/stable/preconf.html).\n\n\n## Design Decisions\n\n_cattrs_ is based on a few fundamental design decisions:\n\n- Un/structuring rules are separate from the models.\n This allows models to have a one-to-many relationship with un/structuring rules, and to create un/structuring rules for models which you do not own and you cannot change.\n (_cattrs_ can be configured to use un/structuring rules from models using the [`use_class_methods` strategy](https://catt.rs/en/latest/strategies.html#using-class-specific-structure-and-unstructure-methods).)\n- Invent as little as possible; reuse existing ordinary Python instead.\n For example, _cattrs_ did not have a custom exception type to group exceptions until the sanctioned Python [`exceptiongroups`](https://docs.python.org/3/library/exceptions.html#ExceptionGroup).\n A side-effect of this design decision is that, in a lot of cases, when you're solving _cattrs_ problems you're actually learning Python instead of learning _cattrs_.\n- Resist the temptation to guess.\n If there are two ways of solving a problem, _cattrs_ should refuse to guess and let the user configure it themselves.\n\nA foolish consistency is the hobgoblin of little minds, so these decisions can and are sometimes broken, but they have proven to be a good foundation.\n\n\n<!-- end-why -->\n\n## Credits\n\nMajor credits to Hynek Schlawack for creating [attrs](https://attrs.org) and its predecessor, [characteristic](https://github.com/hynek/characteristic).\n\n_cattrs_ is tested with [Hypothesis](http://hypothesis.readthedocs.io/en/latest/), by David R. MacIver.\n\n_cattrs_ is benchmarked using [perf](https://github.com/haypo/perf) and [pytest-benchmark](https://pytest-benchmark.readthedocs.io/en/latest/index.html).\n\nThis package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [`audreyr/cookiecutter-pypackage`](https://github.com/audreyr/cookiecutter-pypackage) project template.\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl","archive_info":{"hash":"sha256=63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2","hashes":{"sha256":"63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.3","name":"click","version":"8.1.8","summary":"Composable command line interface toolkit","description_content_type":"text/markdown","maintainer_email":"Pallets <contact@palletsprojects.com>","classifier":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: BSD License","Operating System :: OS Independent","Programming Language :: Python","Typing :: Typed"],"requires_dist":["colorama; platform_system == 'Windows'","importlib-metadata; python_version < '3.8'"],"requires_python":">=3.7","project_url":["Changes, https://click.palletsprojects.com/changes/","Chat, https://discord.gg/pallets","Documentation, https://click.palletsprojects.com/","Donate, https://palletsprojects.com/donate","Source, https://github.com/pallets/click/"],"description":"# $ click_\n\nClick is a Python package for creating beautiful command line interfaces\nin a composable way with as little code as necessary. It's the \"Command\nLine Interface Creation Kit\". It's highly configurable but comes with\nsensible defaults out of the box.\n\nIt aims to make the process of writing command line tools quick and fun\nwhile also preventing any frustration caused by the inability to\nimplement an intended CLI API.\n\nClick in three points:\n\n- Arbitrary nesting of commands\n- Automatic help page generation\n- Supports lazy loading of subcommands at runtime\n\n\n## A Simple Example\n\n```python\nimport click\n\n@click.command()\n@click.option(\"--count\", default=1, help=\"Number of greetings.\")\n@click.option(\"--name\", prompt=\"Your name\", help=\"The person to greet.\")\ndef hello(count, name):\n \"\"\"Simple program that greets NAME for a total of COUNT times.\"\"\"\n for _ in range(count):\n click.echo(f\"Hello, {name}!\")\n\nif __name__ == '__main__':\n hello()\n```\n\n```\n$ python hello.py --count=3\nYour name: Click\nHello, Click!\nHello, Click!\nHello, Click!\n```\n\n\n## Donate\n\nThe Pallets organization develops and supports Click and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, [please\ndonate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl","archive_info":{"hash":"sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6","hashes":{"sha256":"4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"colorama","version":"0.4.6","summary":"Cross-platform colored terminal text.","description_content_type":"text/x-rst","keywords":["ansi","color","colour","crossplatform","terminal","text","windows","xplatform"],"author_email":"Jonathan Hartley <tartley@tartley.com>","license_file":["LICENSE.txt"],"classifier":["Development Status :: 5 - Production/Stable","Environment :: Console","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.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Topic :: Terminals"],"requires_python":"!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7","project_url":["Homepage, https://github.com/tartley/colorama"],"description":".. image:: https://img.shields.io/pypi/v/colorama.svg\n :target: https://pypi.org/project/colorama/\n :alt: Latest Version\n\n.. image:: https://img.shields.io/pypi/pyversions/colorama.svg\n :target: https://pypi.org/project/colorama/\n :alt: Supported Python versions\n\n.. image:: https://github.com/tartley/colorama/actions/workflows/test.yml/badge.svg\n :target: https://github.com/tartley/colorama/actions/workflows/test.yml\n :alt: Build Status\n\nColorama\n========\n\nMakes ANSI escape character sequences (for producing colored terminal text and\ncursor positioning) work under MS Windows.\n\n.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif\n :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=2MZ9D2GMLYCUJ&item_name=Colorama¤cy_code=USD\n :alt: Donate with Paypal\n\n`PyPI for releases <https://pypi.org/project/colorama/>`_ |\n`Github for source <https://github.com/tartley/colorama>`_ |\n`Colorama for enterprise on Tidelift <https://github.com/tartley/colorama/blob/master/ENTERPRISE.md>`_\n\nIf you find Colorama useful, please |donate| to the authors. Thank you!\n\nInstallation\n------------\n\nTested on CPython 2.7, 3.7, 3.8, 3.9 and 3.10 and Pypy 2.7 and 3.8.\n\nNo requirements other than the standard library.\n\n.. code-block:: bash\n\n pip install colorama\n # or\n conda install -c anaconda colorama\n\nDescription\n-----------\n\nANSI escape character sequences have long been used to produce colored terminal\ntext and cursor positioning on Unix and Macs. Colorama makes this work on\nWindows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which\nwould appear as gobbledygook in the output), and converting them into the\nappropriate win32 calls to modify the state of the terminal. On other platforms,\nColorama does nothing.\n\nThis has the upshot of providing a simple cross-platform API for printing\ncolored terminal text from Python, and has the happy side-effect that existing\napplications or libraries which use ANSI sequences to produce colored output on\nLinux or Macs can now also work on Windows, simply by calling\n``colorama.just_fix_windows_console()`` (since v0.4.6) or ``colorama.init()``\n(all versions, but may have other side-effects – see below).\n\nAn alternative approach is to install ``ansi.sys`` on Windows machines, which\nprovides the same behaviour for all applications running in terminals. Colorama\nis intended for situations where that isn't easy (e.g., maybe your app doesn't\nhave an installer.)\n\nDemo scripts in the source code repository print some colored text using\nANSI sequences. Compare their output under Gnome-terminal's built in ANSI\nhandling, versus on Windows Command-Prompt using Colorama:\n\n.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png\n :width: 661\n :height: 357\n :alt: ANSI sequences on Ubuntu under gnome-terminal.\n\n.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png\n :width: 668\n :height: 325\n :alt: Same ANSI sequences on Windows, using Colorama.\n\nThese screenshots show that, on Windows, Colorama does not support ANSI 'dim\ntext'; it looks the same as 'normal text'.\n\nUsage\n-----\n\nInitialisation\n..............\n\nIf the only thing you want from Colorama is to get ANSI escapes to work on\nWindows, then run:\n\n.. code-block:: python\n\n from colorama import just_fix_windows_console\n just_fix_windows_console()\n\nIf you're on a recent version of Windows 10 or better, and your stdout/stderr\nare pointing to a Windows console, then this will flip the magic configuration\nswitch to enable Windows' built-in ANSI support.\n\nIf you're on an older version of Windows, and your stdout/stderr are pointing to\na Windows console, then this will wrap ``sys.stdout`` and/or ``sys.stderr`` in a\nmagic file object that intercepts ANSI escape sequences and issues the\nappropriate Win32 calls to emulate them.\n\nIn all other circumstances, it does nothing whatsoever. Basically the idea is\nthat this makes Windows act like Unix with respect to ANSI escape handling.\n\nIt's safe to call this function multiple times. It's safe to call this function\non non-Windows platforms, but it won't do anything. It's safe to call this\nfunction when one or both of your stdout/stderr are redirected to a file – it\nwon't do anything to those streams.\n\nAlternatively, you can use the older interface with more features (but also more\npotential footguns):\n\n.. code-block:: python\n\n from colorama import init\n init()\n\nThis does the same thing as ``just_fix_windows_console``, except for the\nfollowing differences:\n\n- It's not safe to call ``init`` multiple times; you can end up with multiple\n layers of wrapping and broken ANSI support.\n\n- Colorama will apply a heuristic to guess whether stdout/stderr support ANSI,\n and if it thinks they don't, then it will wrap ``sys.stdout`` and\n ``sys.stderr`` in a magic file object that strips out ANSI escape sequences\n before printing them. This happens on all platforms, and can be convenient if\n you want to write your code to emit ANSI escape sequences unconditionally, and\n let Colorama decide whether they should actually be output. But note that\n Colorama's heuristic is not particularly clever.\n\n- ``init`` also accepts explicit keyword args to enable/disable various\n functionality – see below.\n\nTo stop using Colorama before your program exits, simply call ``deinit()``.\nThis will restore ``stdout`` and ``stderr`` to their original values, so that\nColorama is disabled. To resume using Colorama again, call ``reinit()``; it is\ncheaper than calling ``init()`` again (but does the same thing).\n\nMost users should depend on ``colorama >= 0.4.6``, and use\n``just_fix_windows_console``. The old ``init`` interface will be supported\nindefinitely for backwards compatibility, but we don't plan to fix any issues\nwith it, also for backwards compatibility.\n\nColored Output\n..............\n\nCross-platform printing of colored text can then be done using Colorama's\nconstant shorthand for ANSI escape sequences. These are deliberately\nrudimentary, see below.\n\n.. code-block:: python\n\n from colorama import Fore, Back, Style\n print(Fore.RED + 'some red text')\n print(Back.GREEN + 'and with a green background')\n print(Style.DIM + 'and in dim text')\n print(Style.RESET_ALL)\n print('back to normal now')\n\n...or simply by manually printing ANSI sequences from your own code:\n\n.. code-block:: python\n\n print('\\033[31m' + 'some red text')\n print('\\033[39m') # and reset to default color\n\n...or, Colorama can be used in conjunction with existing ANSI libraries\nsuch as the venerable `Termcolor <https://pypi.org/project/termcolor/>`_\nthe fabulous `Blessings <https://pypi.org/project/blessings/>`_,\nor the incredible `_Rich <https://pypi.org/project/rich/>`_.\n\nIf you wish Colorama's Fore, Back and Style constants were more capable,\nthen consider using one of the above highly capable libraries to generate\ncolors, etc, and use Colorama just for its primary purpose: to convert\nthose ANSI sequences to also work on Windows:\n\nSIMILARLY, do not send PRs adding the generation of new ANSI types to Colorama.\nWe are only interested in converting ANSI codes to win32 API calls, not\nshortcuts like the above to generate ANSI characters.\n\n.. code-block:: python\n\n from colorama import just_fix_windows_console\n from termcolor import colored\n\n # use Colorama to make Termcolor work on Windows too\n just_fix_windows_console()\n\n # then use Termcolor for all colored text output\n print(colored('Hello, World!', 'green', 'on_red'))\n\nAvailable formatting constants are::\n\n Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.\n Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.\n Style: DIM, NORMAL, BRIGHT, RESET_ALL\n\n``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will\nperform this reset automatically on program exit.\n\nThese are fairly well supported, but not part of the standard::\n\n Fore: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX\n Back: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX\n\nCursor Positioning\n..................\n\nANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for\nan example of how to generate them.\n\nInit Keyword Args\n.................\n\n``init()`` accepts some ``**kwargs`` to override default behaviour.\n\ninit(autoreset=False):\n If you find yourself repeatedly sending reset sequences to turn off color\n changes at the end of every print, then ``init(autoreset=True)`` will\n automate that:\n\n .. code-block:: python\n\n from colorama import init\n init(autoreset=True)\n print(Fore.RED + 'some red text')\n print('automatically back to default color again')\n\ninit(strip=None):\n Pass ``True`` or ``False`` to override whether ANSI codes should be\n stripped from the output. The default behaviour is to strip if on Windows\n or if output is redirected (not a tty).\n\ninit(convert=None):\n Pass ``True`` or ``False`` to override whether to convert ANSI codes in the\n output into win32 calls. The default behaviour is to convert if on Windows\n and output is to a tty (terminal).\n\ninit(wrap=True):\n On Windows, Colorama works by replacing ``sys.stdout`` and ``sys.stderr``\n with proxy objects, which override the ``.write()`` method to do their work.\n If this wrapping causes you problems, then this can be disabled by passing\n ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or\n ``strip`` or ``convert`` are True.\n\n When wrapping is disabled, colored printing on non-Windows platforms will\n continue to work as normal. To do cross-platform colored output, you can\n use Colorama's ``AnsiToWin32`` proxy directly:\n\n .. code-block:: python\n\n import sys\n from colorama import init, AnsiToWin32\n init(wrap=False)\n stream = AnsiToWin32(sys.stderr).stream\n\n # Python 2\n print >>stream, Fore.BLUE + 'blue text on stderr'\n\n # Python 3\n print(Fore.BLUE + 'blue text on stderr', file=stream)\n\nRecognised ANSI Sequences\n.........................\n\nANSI sequences generally take the form::\n\n ESC [ <param> ; <param> ... <command>\n\nWhere ``<param>`` is an integer, and ``<command>`` is a single letter. Zero or\nmore params are passed to a ``<command>``. If no params are passed, it is\ngenerally synonymous with passing a single zero. No spaces exist in the\nsequence; they have been inserted here simply to read more easily.\n\nThe only ANSI sequences that Colorama converts into win32 calls are::\n\n ESC [ 0 m # reset all (colors and brightness)\n ESC [ 1 m # bright\n ESC [ 2 m # dim (looks same as normal brightness)\n ESC [ 22 m # normal brightness\n\n # FOREGROUND:\n ESC [ 30 m # black\n ESC [ 31 m # red\n ESC [ 32 m # green\n ESC [ 33 m # yellow\n ESC [ 34 m # blue\n ESC [ 35 m # magenta\n ESC [ 36 m # cyan\n ESC [ 37 m # white\n ESC [ 39 m # reset\n\n # BACKGROUND\n ESC [ 40 m # black\n ESC [ 41 m # red\n ESC [ 42 m # green\n ESC [ 43 m # yellow\n ESC [ 44 m # blue\n ESC [ 45 m # magenta\n ESC [ 46 m # cyan\n ESC [ 47 m # white\n ESC [ 49 m # reset\n\n # cursor positioning\n ESC [ y;x H # position cursor at x across, y down\n ESC [ y;x f # position cursor at x across, y down\n ESC [ n A # move cursor n lines up\n ESC [ n B # move cursor n lines down\n ESC [ n C # move cursor n characters forward\n ESC [ n D # move cursor n characters backward\n\n # clear the screen\n ESC [ mode J # clear the screen\n\n # clear the line\n ESC [ mode K # clear the line\n\nMultiple numeric params to the ``'m'`` command can be combined into a single\nsequence::\n\n ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background\n\nAll other ANSI sequences of the form ``ESC [ <param> ; <param> ... <command>``\nare silently stripped from the output on Windows.\n\nAny other form of ANSI sequence, such as single-character codes or alternative\ninitial characters, are not recognised or stripped. It would be cool to add\nthem though. Let me know if it would be useful for you, via the Issues on\nGitHub.\n\nStatus & Known Problems\n-----------------------\n\nI've personally only tested it on Windows XP (CMD, Console2), Ubuntu\n(gnome-terminal, xterm), and OS X.\n\nSome valid ANSI sequences aren't recognised.\n\nIf you're hacking on the code, see `README-hacking.md`_. ESPECIALLY, see the\nexplanation there of why we do not want PRs that allow Colorama to generate new\ntypes of ANSI codes.\n\nSee outstanding issues and wish-list:\nhttps://github.com/tartley/colorama/issues\n\nIf anything doesn't work for you, or doesn't do what you expected or hoped for,\nI'd love to hear about it on that issues list, would be delighted by patches,\nand would be happy to grant commit access to anyone who submits a working patch\nor two.\n\n.. _README-hacking.md: README-hacking.md\n\nLicense\n-------\n\nCopyright Jonathan Hartley & Arnon Yaari, 2013-2020. BSD 3-Clause license; see\nLICENSE file.\n\nProfessional support\n--------------------\n\n.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png\n :alt: Tidelift\n :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme\n\n.. list-table::\n :widths: 10 100\n\n * - |tideliftlogo|\n - Professional support for colorama is available as part of the\n `Tidelift Subscription`_.\n Tidelift gives software development teams a single source for purchasing\n and maintaining their software, with professional grade assurances from\n the experts who know it best, while seamlessly integrating with existing\n tools.\n\n.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme\n\nThanks\n------\n\nSee the CHANGELOG for more thanks!\n\n* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5.\n* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``,\n providing a solution to issue #7's setuptools/distutils debate,\n and other fixes.\n* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``.\n* Matthew McCormick for politely pointing out a longstanding crash on non-Win.\n* Ben Hoyt, for a magnificent fix under 64-bit Windows.\n* Jesse at Empty Square for submitting a fix for examples in the README.\n* User 'jamessp', an observant documentation fix for cursor positioning.\n* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7\n fix.\n* Julien Stuyck, for wisely suggesting Python3 compatible updates to README.\n* Daniel Griffith for multiple fabulous patches.\n* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty\n output.\n* Roger Binns, for many suggestions, valuable feedback, & bug reports.\n* Tim Golden for thought and much appreciated feedback on the initial idea.\n* User 'Zearin' for updates to the README file.\n* John Szakmeister for adding support for light colors\n* Charles Merriam for adding documentation to demos\n* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes\n* Florian Bruhin for a fix when stdout or stderr are None\n* Thomas Weininger for fixing ValueError on Windows\n* Remi Rampin for better Github integration and fixes to the README file\n* Simeon Visser for closing a file handle using 'with' and updating classifiers\n to include Python 3.3 and 3.4\n* Andy Neff for fixing RESET of LIGHT_EX colors.\n* Jonathan Hartley for the initial idea and implementation.\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl","archive_info":{"hash":"sha256=3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b","hashes":{"sha256":"3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"exceptiongroup","version":"1.2.2","summary":"Backport of PEP 654 (exception groups)","description_content_type":"text/x-rst","author_email":"Alex Grönholm <alex.gronholm@nextday.fi>","classifier":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Programming Language :: Python","Programming Language :: Python :: 3 :: Only","Typing :: Typed"],"requires_dist":["pytest >= 6 ; extra == \"test\""],"requires_python":">=3.7","project_url":["Changelog, https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst","Issue Tracker, https://github.com/agronholm/exceptiongroup/issues","Source code, https://github.com/agronholm/exceptiongroup"],"provides_extra":["test"],"description":".. image:: https://github.com/agronholm/exceptiongroup/actions/workflows/test.yml/badge.svg\n :target: https://github.com/agronholm/exceptiongroup/actions/workflows/test.yml\n :alt: Build Status\n.. image:: https://coveralls.io/repos/github/agronholm/exceptiongroup/badge.svg?branch=main\n :target: https://coveralls.io/github/agronholm/exceptiongroup?branch=main\n :alt: Code Coverage\n\nThis is a backport of the ``BaseExceptionGroup`` and ``ExceptionGroup`` classes from\nPython 3.11.\n\nIt contains the following:\n\n* The ``exceptiongroup.BaseExceptionGroup`` and ``exceptiongroup.ExceptionGroup``\n classes\n* A utility function (``exceptiongroup.catch()``) for catching exceptions possibly\n nested in an exception group\n* Patches to the ``TracebackException`` class that properly formats exception groups\n (installed on import)\n* An exception hook that handles formatting of exception groups through\n ``TracebackException`` (installed on import)\n* Special versions of some of the functions from the ``traceback`` module, modified to\n correctly handle exception groups even when monkey patching is disabled, or blocked by\n another custom exception hook:\n\n * ``traceback.format_exception()``\n * ``traceback.format_exception_only()``\n * ``traceback.print_exception()``\n * ``traceback.print_exc()``\n* A backported version of ``contextlib.suppress()`` from Python 3.12.1 which also\n handles suppressing exceptions inside exception groups\n\nIf this package is imported on Python 3.11 or later, the built-in implementations of the\nexception group classes are used instead, ``TracebackException`` is not monkey patched\nand the exception hook won't be installed.\n\nSee the `standard library documentation`_ for more information on exception groups.\n\n.. _standard library documentation: https://docs.python.org/3/library/exceptions.html\n\nCatching exceptions\n===================\n\nDue to the lack of the ``except*`` syntax introduced by `PEP 654`_ in earlier Python\nversions, you need to use ``exceptiongroup.catch()`` to catch exceptions that are\npotentially nested inside an exception group. This function returns a context manager\nthat calls the given handler for any exceptions matching the sole argument.\n\nThe argument to ``catch()`` must be a dict (or any ``Mapping``) where each key is either\nan exception class or an iterable of exception classes. Each value must be a callable\nthat takes a single positional argument. The handler will be called at most once, with\nan exception group as an argument which will contain all the exceptions that are any\nof the given types, or their subclasses. The exception group may contain nested groups\ncontaining more matching exceptions.\n\nThus, the following Python 3.11+ code:\n\n.. code-block:: python\n\n try:\n ...\n except* (ValueError, KeyError) as excgroup:\n for exc in excgroup.exceptions:\n print('Caught exception:', type(exc))\n except* RuntimeError:\n print('Caught runtime error')\n\nwould be written with this backport like this:\n\n.. code-block:: python\n\n from exceptiongroup import BaseExceptionGroup, catch\n\n def value_key_err_handler(excgroup: BaseExceptionGroup) -> None:\n for exc in excgroup.exceptions:\n print('Caught exception:', type(exc))\n\n def runtime_err_handler(exc: BaseExceptionGroup) -> None:\n print('Caught runtime error')\n\n with catch({\n (ValueError, KeyError): value_key_err_handler,\n RuntimeError: runtime_err_handler\n }):\n ...\n\n**NOTE**: Just like with ``except*``, you cannot handle ``BaseExceptionGroup`` or\n``ExceptionGroup`` with ``catch()``.\n\nSuppressing exceptions\n======================\n\nThis library contains a backport of the ``contextlib.suppress()`` context manager from\nPython 3.12.1. It allows you to selectively ignore certain exceptions, even when they're\ninside exception groups:\n\n.. code-block:: python\n\n from exceptiongroup import suppress\n\n with suppress(RuntimeError):\n raise ExceptionGroup(\"\", [RuntimeError(\"boo\")])\n\nNotes on monkey patching\n========================\n\nTo make exception groups render properly when an unhandled exception group is being\nprinted out, this package does two things when it is imported on any Python version\nearlier than 3.11:\n\n#. The ``traceback.TracebackException`` class is monkey patched to store extra\n information about exception groups (in ``__init__()``) and properly format them (in\n ``format()``)\n#. An exception hook is installed at ``sys.excepthook``, provided that no other hook is\n already present. This hook causes the exception to be formatted using\n ``traceback.TracebackException`` rather than the built-in rendered.\n\nIf ``sys.exceptionhook`` is found to be set to something else than the default when\n``exceptiongroup`` is imported, no monkeypatching is done at all.\n\nTo prevent the exception hook and patches from being installed, set the environment\nvariable ``EXCEPTIONGROUP_NO_PATCH`` to ``1``.\n\nFormatting exception groups\n---------------------------\n\nNormally, the monkey patching applied by this library on import will cause exception\ngroups to be printed properly in tracebacks. But in cases when the monkey patching is\nblocked by a third party exception hook, or monkey patching is explicitly disabled,\nyou can still manually format exceptions using the special versions of the ``traceback``\nfunctions, like ``format_exception()``, listed at the top of this page. They work just\nlike their counterparts in the ``traceback`` module, except that they use a separately\npatched subclass of ``TracebackException`` to perform the rendering.\n\nParticularly in cases where a library installs its own exception hook, it is recommended\nto use these special versions to do the actual formatting of exceptions/tracebacks.\n\n.. _PEP 654: https://www.python.org/dev/peps/pep-0654/\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/8d/37/2351e48cb3309673492d3a8c59d407b75fb6630e560eb27ecd4da03adc9a/lsprotocol-2023.0.1-py3-none-any.whl","archive_info":{"hash":"sha256=c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2","hashes":{"sha256":"c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"lsprotocol","version":"2023.0.1","summary":"Python implementation of the Language Server Protocol.","description_content_type":"text/markdown","author_email":"Microsoft Corporation <lsprotocol-help@microsoft.com>","maintainer_email":"Brett Cannon <brett@python.org>, Karthik Nadig <kanadig@microsoft.com>","classifier":["Development Status :: 5 - Production/Stable","License :: OSI Approved :: MIT License","Programming Language :: Python","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy"],"requires_dist":["attrs>=21.3.0","cattrs!=23.2.1"],"requires_python":">=3.7","project_url":["Issues, https://github.com/microsoft/lsprotocol/issues","Source, https://github.com/microsoft/lsprotocol"],"description":"# Language Server Protocol Types implementation for Python\n\n`lsprotocol` is a python implementation of object types used in the Language Server Protocol (LSP). This repository contains the code generator and the generated types for LSP.\n\n## Overview\n\nLSP is used by editors to communicate with various tools to enables services like code completion, documentation on hover, formatting, code analysis, etc. The intent of this library is to allow you to build on top of the types used by LSP. This repository will be kept up to date with the latest version of LSP as it is updated.\n\n## Installation\n\n`python -m pip install lsprotocol`\n\n## Usage\n\n### Using LSP types\n\n```python\nfrom lsprotocol import types\n\nposition = types.Position(line=10, character=3)\n```\n\n### Using built-in type converters\n\n```python\n# test.py\nimport json\nfrom lsprotocol import converters, types\n\nposition = types.Position(line=10, character=3)\nconverter = converters.get_converter()\nprint(json.dumps(converter.unstructure(position, unstructure_as=types.Position)))\n```\n\nOutput:\n\n```console\n> python test.py\n{\"line\": 10, \"character\": 3}\n```\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl","archive_info":{"hash":"sha256=4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d","hashes":{"sha256":"4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"mypy-extensions","version":"1.0.0","summary":"Type system extensions for programs checked with the mypy type checker.","home_page":"https://github.com/python/mypy_extensions","author":"The mypy developers","author_email":"jukka.lehtosalo@iki.fi","license":"MIT License","license_file":["LICENSE"],"classifier":["Development Status :: 5 - Production/Stable","Environment :: Console","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Programming Language :: Python :: 3","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Topic :: Software Development"],"requires_python":">=3.5","description":"Mypy Extensions\n===============\n\nThe \"mypy_extensions\" module defines extensions to the standard \"typing\" module\nthat are supported by the mypy type checker and the mypyc compiler.\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl","archive_info":{"hash":"sha256=09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759","hashes":{"sha256":"09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.3","name":"packaging","version":"24.2","summary":"Core utilities for Python packages","description_content_type":"text/x-rst","author_email":"Donald Stufft <donald@stufft.io>","classifier":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: Apache Software License","License :: OSI Approved :: BSD License","Programming Language :: Python","Programming Language :: Python :: 3","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Typing :: Typed"],"requires_python":">=3.8","project_url":["Documentation, https://packaging.pypa.io/","Source, https://github.com/pypa/packaging"],"description":"packaging\n=========\n\n.. start-intro\n\nReusable core utilities for various Python Packaging\n`interoperability specifications <https://packaging.python.org/specifications/>`_.\n\nThis library provides utilities that implement the interoperability\nspecifications which have clearly one correct behaviour (eg: :pep:`440`)\nor benefit greatly from having a single shared implementation (eg: :pep:`425`).\n\n.. end-intro\n\nThe ``packaging`` project includes the following: version handling, specifiers,\nmarkers, requirements, tags, utilities.\n\nDocumentation\n-------------\n\nThe `documentation`_ provides information and the API for the following:\n\n- Version Handling\n- Specifiers\n- Markers\n- Requirements\n- Tags\n- Utilities\n\nInstallation\n------------\n\nUse ``pip`` to install these utilities::\n\n pip install packaging\n\nThe ``packaging`` library uses calendar-based versioning (``YY.N``).\n\nDiscussion\n----------\n\nIf you run into bugs, you can file them in our `issue tracker`_.\n\nYou can also join ``#pypa`` on Freenode to ask questions or get involved.\n\n\n.. _`documentation`: https://packaging.pypa.io/\n.. _`issue tracker`: https://github.com/pypa/packaging/issues\n\n\nCode of Conduct\n---------------\n\nEveryone interacting in the packaging project's codebases, issue trackers, chat\nrooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.\n\n.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md\n\nContributing\n------------\n\nThe ``CONTRIBUTING.rst`` file outlines how to contribute to this project as\nwell as how to report a potential security issue. The documentation for this\nproject also covers information about `project development`_ and `security`_.\n\n.. _`project development`: https://packaging.pypa.io/en/latest/development/\n.. _`security`: https://packaging.pypa.io/en/latest/security/\n\nProject History\n---------------\n\nPlease review the ``CHANGELOG.rst`` file or the `Changelog documentation`_ for\nrecent changes and project history.\n\n.. _`Changelog documentation`: https://packaging.pypa.io/en/latest/changelog/\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl","archive_info":{"hash":"sha256=a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08","hashes":{"sha256":"a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"pathspec","version":"0.12.1","summary":"Utility library for gitignore style pattern matching of file paths.","description_content_type":"text/x-rst","author_email":"\"Caleb P. Burns\" <cpburnz@gmail.com>","classifier":["Development Status :: 4 - Beta","Intended Audience :: Developers","License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 3","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Topic :: Software Development :: Libraries :: Python Modules","Topic :: Utilities"],"requires_python":">=3.8","project_url":["Documentation, https://python-path-specification.readthedocs.io/en/latest/index.html","Issue Tracker, https://github.com/cpburnz/python-pathspec/issues","Source Code, https://github.com/cpburnz/python-pathspec"],"description":"\nPathSpec\n========\n\n*pathspec* is a utility library for pattern matching of file paths. So\nfar this only includes Git's wildmatch pattern matching which itself is\nderived from Rsync's wildmatch. Git uses wildmatch for its `gitignore`_\nfiles.\n\n.. _`gitignore`: http://git-scm.com/docs/gitignore\n\n\nTutorial\n--------\n\nSay you have a \"Projects\" directory and you want to back it up, but only\ncertain files, and ignore others depending on certain conditions::\n\n\t>>> import pathspec\n\t>>> # The gitignore-style patterns for files to select, but we're including\n\t>>> # instead of ignoring.\n\t>>> spec_text = \"\"\"\n\t...\n\t... # This is a comment because the line begins with a hash: \"#\"\n\t...\n\t... # Include several project directories (and all descendants) relative to\n\t... # the current directory. To reference a directory you must end with a\n\t... # slash: \"/\"\n\t... /project-a/\n\t... /project-b/\n\t... /project-c/\n\t...\n\t... # Patterns can be negated by prefixing with exclamation mark: \"!\"\n\t...\n\t... # Ignore temporary files beginning or ending with \"~\" and ending with\n\t... # \".swp\".\n\t... !~*\n\t... !*~\n\t... !*.swp\n\t...\n\t... # These are python projects so ignore compiled python files from\n\t... # testing.\n\t... !*.pyc\n\t...\n\t... # Ignore the build directories but only directly under the project\n\t... # directories.\n\t... !/*/build/\n\t...\n\t... \"\"\"\n\nWe want to use the ``GitWildMatchPattern`` class to compile our patterns. The\n``PathSpec`` class provides an interface around pattern implementations::\n\n\t>>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, spec_text.splitlines())\n\nThat may be a mouthful but it allows for additional patterns to be implemented\nin the future without them having to deal with anything but matching the paths\nsent to them. ``GitWildMatchPattern`` is the implementation of the actual\npattern which internally gets converted into a regular expression. ``PathSpec``\nis a simple wrapper around a list of compiled patterns.\n\nTo make things simpler, we can use the registered name for a pattern class\ninstead of always having to provide a reference to the class itself. The\n``GitWildMatchPattern`` class is registered as **gitwildmatch**::\n\n\t>>> spec = pathspec.PathSpec.from_lines('gitwildmatch', spec_text.splitlines())\n\nIf we wanted to manually compile the patterns we can just do the following::\n\n\t>>> patterns = map(pathspec.patterns.GitWildMatchPattern, spec_text.splitlines())\n\t>>> spec = PathSpec(patterns)\n\n``PathSpec.from_lines()`` is simply a class method which does just that.\n\nIf you want to load the patterns from file, you can pass the file instance\ndirectly as well::\n\n\t>>> with open('patterns.list', 'r') as fh:\n\t>>> spec = pathspec.PathSpec.from_lines('gitwildmatch', fh)\n\nYou can perform matching on a whole directory tree with::\n\n\t>>> matches = spec.match_tree('path/to/directory')\n\nOr you can perform matching on a specific set of file paths with::\n\n\t>>> matches = spec.match_files(file_paths)\n\nOr check to see if an individual file matches::\n\n\t>>> is_matched = spec.match_file(file_path)\n\nThere is a specialized class, ``pathspec.GitIgnoreSpec``, which more closely\nimplements the behavior of **gitignore**. This uses ``GitWildMatchPattern``\npattern by default and handles some edge cases differently from the generic\n``PathSpec`` class. ``GitIgnoreSpec`` can be used without specifying the pattern\nfactory::\n\n\t>>> spec = pathspec.GitIgnoreSpec.from_lines(spec_text.splitlines())\n\n\nLicense\n-------\n\n*pathspec* is licensed under the `Mozilla Public License Version 2.0`_. See\n`LICENSE`_ or the `FAQ`_ for more information.\n\nIn summary, you may use *pathspec* with any closed or open source project\nwithout affecting the license of the larger work so long as you:\n\n- give credit where credit is due,\n\n- and release any custom changes made to *pathspec*.\n\n.. _`Mozilla Public License Version 2.0`: http://www.mozilla.org/MPL/2.0\n.. _`LICENSE`: LICENSE\n.. _`FAQ`: http://www.mozilla.org/MPL/2.0/FAQ.html\n\n\nSource\n------\n\nThe source code for *pathspec* is available from the GitHub repo\n`cpburnz/python-pathspec`_.\n\n.. _`cpburnz/python-pathspec`: https://github.com/cpburnz/python-pathspec\n\n\nInstallation\n------------\n\n*pathspec* is available for install through `PyPI`_::\n\n\tpip install pathspec\n\n*pathspec* can also be built from source. The following packages will be\nrequired:\n\n- `build`_ (>=0.6.0)\n\n*pathspec* can then be built and installed with::\n\n\tpython -m build\n\tpip install dist/pathspec-*-py3-none-any.whl\n\n.. _`PyPI`: http://pypi.python.org/pypi/pathspec\n.. _`build`: https://pypi.org/project/build/\n\n\nDocumentation\n-------------\n\nDocumentation for *pathspec* is available on `Read the Docs`_.\n\n.. _`Read the Docs`: https://python-path-specification.readthedocs.io\n\n\nOther Languages\n---------------\n\nThe related project `pathspec-ruby`_ (by *highb*) provides a similar library as\na `Ruby gem`_.\n\n.. _`pathspec-ruby`: https://github.com/highb/pathspec-ruby\n.. _`Ruby gem`: https://rubygems.org/gems/pathspec\n\n\n\nChange History\n==============\n\n\n0.12.1 (2023-12-10)\n-------------------\n\nBug fixes:\n\n- `Issue #84`_: PathSpec.match_file() returns None since 0.12.0.\n\n\n.. _`Issue #84`: https://github.com/cpburnz/python-pathspec/issues/84\n\n\n0.12.0 (2023-12-09)\n-------------------\n\nMajor changes:\n\n- Dropped support of EOL Python 3.7. See `Pull #82`_.\n\n\nAPI changes:\n\n- Signature of protected method `pathspec.pathspec.PathSpec._match_file()` (with a leading underscore) has been changed from `def _match_file(patterns: Iterable[Pattern], file: str) -> bool` to `def _match_file(patterns: Iterable[Tuple[int, Pattern]], file: str) -> Tuple[Optional[bool], Optional[int]]`.\n\nNew features:\n\n- Added `pathspec.pathspec.PathSpec.check_*()` methods. These methods behave similarly to `.match_*()` but return additional information in the `pathspec.util.CheckResult` objects (e.g., `CheckResult.index` indicates the index of the last pattern that matched the file).\n- Added `pathspec.pattern.RegexPattern.pattern` attribute which stores the original, uncompiled pattern.\n\nBug fixes:\n\n- `Issue #81`_: GitIgnoreSpec behaviors differ from git.\n- `Pull #83`_: Fix ReadTheDocs builds.\n\nImprovements:\n\n- Mark Python 3.12 as supported. See `Pull #82`_.\n- Improve test debugging.\n- Improve type hint on *on_error* parameter on `pathspec.pathspec.PathSpec.match_tree_entries()`.\n- Improve type hint on *on_error* parameter on `pathspec.util.iter_tree_entries()`.\n\n\n.. _`Issue #81`: https://github.com/cpburnz/python-pathspec/issues/81\n.. _`Pull #82`: https://github.com/cpburnz/python-pathspec/pull/82\n.. _`Pull #83`: https://github.com/cpburnz/python-pathspec/pull/83\n\n\n0.11.2 (2023-07-28)\n-------------------\n\nNew features:\n\n- `Issue #80`_: match_files with negated path spec. `pathspec.PathSpec.match_*()` now have a `negate` parameter to make using *.gitignore* logic easier and more efficient.\n\nBug fixes:\n\n- `Pull #76`_: Add edge case: patterns that end with an escaped space\n- `Issue #77`_/`Pull #78`_: Negate with caret symbol as with the exclamation mark.\n\n\n.. _`Pull #76`: https://github.com/cpburnz/python-pathspec/pull/76\n.. _`Issue #77`: https://github.com/cpburnz/python-pathspec/issues/77\n.. _`Pull #78`: https://github.com/cpburnz/python-pathspec/pull/78/\n.. _`Issue #80`: https://github.com/cpburnz/python-pathspec/issues/80\n\n\n0.11.1 (2023-03-14)\n-------------------\n\nBug fixes:\n\n- `Issue #74`_: Include directory should override exclude file.\n\nImprovements:\n\n- `Pull #75`_: Fix partially unknown PathLike type.\n- Convert `os.PathLike` to a string properly using `os.fspath`.\n\n\n.. _`Issue #74`: https://github.com/cpburnz/python-pathspec/issues/74\n.. _`Pull #75`: https://github.com/cpburnz/python-pathspec/pull/75\n\n\n0.11.0 (2023-01-24)\n-------------------\n\nMajor changes:\n\n- Changed build backend to `flit_core.buildapi`_ from `setuptools.build_meta`_. Building with `setuptools` through `setup.py` is still supported for distributions that need it. See `Issue #72`_.\n\nImprovements:\n\n- `Issue #72`_/`Pull #73`_: Please consider switching the build-system to flit_core to ease setuptools bootstrap.\n\n\n.. _`flit_core.buildapi`: https://flit.pypa.io/en/latest/index.html\n.. _`Issue #72`: https://github.com/cpburnz/python-pathspec/issues/72\n.. _`Pull #73`: https://github.com/cpburnz/python-pathspec/pull/73\n\n\n0.10.3 (2022-12-09)\n-------------------\n\nNew features:\n\n- Added utility function `pathspec.util.append_dir_sep()` to aid in distinguishing between directories and files on the file-system. See `Issue #65`_.\n\nBug fixes:\n\n- `Issue #66`_/`Pull #67`_: Package not marked as py.typed.\n- `Issue #68`_: Exports are considered private.\n- `Issue #70`_/`Pull #71`_: 'Self' string literal type is Unknown in pyright.\n\nImprovements:\n\n- `Issue #65`_: Checking directories via match_file() does not work on Path objects.\n\n\n.. _`Issue #65`: https://github.com/cpburnz/python-pathspec/issues/65\n.. _`Issue #66`: https://github.com/cpburnz/python-pathspec/issues/66\n.. _`Pull #67`: https://github.com/cpburnz/python-pathspec/pull/67\n.. _`Issue #68`: https://github.com/cpburnz/python-pathspec/issues/68\n.. _`Issue #70`: https://github.com/cpburnz/python-pathspec/issues/70\n.. _`Pull #71`: https://github.com/cpburnz/python-pathspec/pull/71\n\n\n0.10.2 (2022-11-12)\n-------------------\n\nBug fixes:\n\n- Fix failing tests on Windows.\n- Type hint on *root* parameter on `pathspec.pathspec.PathSpec.match_tree_entries()`.\n- Type hint on *root* parameter on `pathspec.pathspec.PathSpec.match_tree_files()`.\n- Type hint on *root* parameter on `pathspec.util.iter_tree_entries()`.\n- Type hint on *root* parameter on `pathspec.util.iter_tree_files()`.\n- `Issue #64`_: IndexError with my .gitignore file when trying to build a Python package.\n\nImprovements:\n\n- `Pull #58`_: CI: add GitHub Actions test workflow.\n\n\n.. _`Pull #58`: https://github.com/cpburnz/python-pathspec/pull/58\n.. _`Issue #64`: https://github.com/cpburnz/python-pathspec/issues/64\n\n\n0.10.1 (2022-09-02)\n-------------------\n\nBug fixes:\n\n- Fix documentation on `pathspec.pattern.RegexPattern.match_file()`.\n- `Pull #60`_: Remove redundant wheel dep from pyproject.toml.\n- `Issue #61`_: Dist failure for Fedora, CentOS, EPEL.\n- `Issue #62`_: Since version 0.10.0 pure wildcard does not work in some cases.\n\nImprovements:\n\n- Restore support for legacy installations using `setup.py`. See `Issue #61`_.\n\n\n.. _`Pull #60`: https://github.com/cpburnz/python-pathspec/pull/60\n.. _`Issue #61`: https://github.com/cpburnz/python-pathspec/issues/61\n.. _`Issue #62`: https://github.com/cpburnz/python-pathspec/issues/62\n\n\n0.10.0 (2022-08-30)\n-------------------\n\nMajor changes:\n\n- Dropped support of EOL Python 2.7, 3.5, 3.6. See `Issue #47`_.\n- The *gitwildmatch* pattern `dir/*` is now handled the same as `dir/`. This means `dir/*` will now match all descendants rather than only direct children. See `Issue #19`_.\n- Added `pathspec.GitIgnoreSpec` class (see new features).\n- Changed build system to `pyproject.toml`_ and build backend to `setuptools.build_meta`_ which may have unforeseen consequences.\n- Renamed GitHub project from `python-path-specification`_ to `python-pathspec`_. See `Issue #35`_.\n\nAPI changes:\n\n- Deprecated: `pathspec.util.match_files()` is an old function no longer used.\n- Deprecated: `pathspec.match_files()` is an old function no longer used.\n- Deprecated: `pathspec.util.normalize_files()` is no longer used.\n- Deprecated: `pathspec.util.iter_tree()` is an alias for `pathspec.util.iter_tree_files()`.\n- Deprecated: `pathspec.iter_tree()` is an alias for `pathspec.util.iter_tree_files()`.\n-\tDeprecated: `pathspec.pattern.Pattern.match()` is no longer used. Use or implement\n\t`pathspec.pattern.Pattern.match_file()`.\n\nNew features:\n\n- Added class `pathspec.gitignore.GitIgnoreSpec` (with alias `pathspec.GitIgnoreSpec`) to implement *gitignore* behavior not possible with standard `PathSpec` class. The particular *gitignore* behavior implemented is prioritizing patterns matching the file directly over matching an ancestor directory.\n\nBug fixes:\n\n- `Issue #19`_: Files inside an ignored sub-directory are not matched.\n- `Issue #41`_: Incorrectly (?) matches files inside directories that do match.\n- `Pull #51`_: Refactor deprecated unittest aliases for Python 3.11 compatibility.\n- `Issue #53`_: Symlink pathspec_meta.py breaks Windows.\n- `Issue #54`_: test_util.py uses os.symlink which can fail on Windows.\n- `Issue #55`_: Backslashes at start of pattern not handled correctly.\n- `Pull #56`_: pyproject.toml: include subpackages in setuptools config\n- `Issue #57`_: `!` doesn't exclude files in directories if the pattern doesn't have a trailing slash.\n\nImprovements:\n\n- Support Python 3.10, 3.11.\n- Modernize code to Python 3.7.\n- `Issue #52`_: match_files() is not a pure generator function, and it impacts tree_*() gravely.\n\n\n.. _`python-path-specification`: https://github.com/cpburnz/python-path-specification\n.. _`python-pathspec`: https://github.com/cpburnz/python-pathspec\n.. _`pyproject.toml`: https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/\n.. _`setuptools.build_meta`: https://setuptools.pypa.io/en/latest/build_meta.html\n.. _`Issue #19`: https://github.com/cpburnz/python-pathspec/issues/19\n.. _`Issue #35`: https://github.com/cpburnz/python-pathspec/issues/35\n.. _`Issue #41`: https://github.com/cpburnz/python-pathspec/issues/41\n.. _`Issue #47`: https://github.com/cpburnz/python-pathspec/issues/47\n.. _`Pull #51`: https://github.com/cpburnz/python-pathspec/pull/51\n.. _`Issue #52`: https://github.com/cpburnz/python-pathspec/issues/52\n.. _`Issue #53`: https://github.com/cpburnz/python-pathspec/issues/53\n.. _`Issue #54`: https://github.com/cpburnz/python-pathspec/issues/54\n.. _`Issue #55`: https://github.com/cpburnz/python-pathspec/issues/55\n.. _`Pull #56`: https://github.com/cpburnz/python-pathspec/pull/56\n.. _`Issue #57`: https://github.com/cpburnz/python-pathspec/issues/57\n\n\n0.9.0 (2021-07-17)\n------------------\n\n- `Issue #44`_/`Pull #50`_: Raise `GitWildMatchPatternError` for invalid git patterns.\n- `Pull #45`_: Fix for duplicate leading double-asterisk, and edge cases.\n- `Issue #46`_: Fix matching absolute paths.\n- API change: `util.normalize_files()` now returns a `Dict[str, List[pathlike]]` instead of a `Dict[str, pathlike]`.\n- Added type hinting.\n\n.. _`Issue #44`: https://github.com/cpburnz/python-pathspec/issues/44\n.. _`Pull #45`: https://github.com/cpburnz/python-pathspec/pull/45\n.. _`Issue #46`: https://github.com/cpburnz/python-pathspec/issues/46\n.. _`Pull #50`: https://github.com/cpburnz/python-pathspec/pull/50\n\n\n0.8.1 (2020-11-07)\n------------------\n\n- `Pull #43`_: Add support for addition operator.\n\n.. _`Pull #43`: https://github.com/cpburnz/python-pathspec/pull/43\n\n\n0.8.0 (2020-04-09)\n------------------\n\n- `Issue #30`_: Expose what patterns matched paths. Added `util.detailed_match_files()`.\n- `Issue #31`_: `match_tree()` doesn't return symlinks.\n- `Issue #34`_: Support `pathlib.Path`\\ s.\n- Add `PathSpec.match_tree_entries` and `util.iter_tree_entries()` to support directories and symlinks.\n- API change: `match_tree()` has been renamed to `match_tree_files()`. The old name `match_tree()` is still available as an alias.\n- API change: `match_tree_files()` now returns symlinks. This is a bug fix but it will change the returned results.\n\n.. _`Issue #30`: https://github.com/cpburnz/python-pathspec/issues/30\n.. _`Issue #31`: https://github.com/cpburnz/python-pathspec/issues/31\n.. _`Issue #34`: https://github.com/cpburnz/python-pathspec/issues/34\n\n\n0.7.0 (2019-12-27)\n------------------\n\n- `Pull #28`_: Add support for Python 3.8, and drop Python 3.4.\n- `Pull #29`_: Publish bdist wheel.\n\n.. _`Pull #28`: https://github.com/cpburnz/python-pathspec/pull/28\n.. _`Pull #29`: https://github.com/cpburnz/python-pathspec/pull/29\n\n\n0.6.0 (2019-10-03)\n------------------\n\n- `Pull #24`_: Drop support for Python 2.6, 3.2, and 3.3.\n- `Pull #25`_: Update README.rst.\n- `Pull #26`_: Method to escape gitwildmatch.\n\n.. _`Pull #24`: https://github.com/cpburnz/python-pathspec/pull/24\n.. _`Pull #25`: https://github.com/cpburnz/python-pathspec/pull/25\n.. _`Pull #26`: https://github.com/cpburnz/python-pathspec/pull/26\n\n\n0.5.9 (2018-09-15)\n------------------\n\n- Fixed file system error handling.\n\n\n0.5.8 (2018-09-15)\n------------------\n\n- Improved type checking.\n- Created scripts to test Python 2.6 because Tox removed support for it.\n- Improved byte string handling in Python 3.\n- `Issue #22`_: Handle dangling symlinks.\n\n.. _`Issue #22`: https://github.com/cpburnz/python-pathspec/issues/22\n\n\n0.5.7 (2018-08-14)\n------------------\n\n- `Issue #21`_: Fix collections deprecation warning.\n\n.. _`Issue #21`: https://github.com/cpburnz/python-pathspec/issues/21\n\n\n0.5.6 (2018-04-06)\n------------------\n\n- Improved unit tests.\n- Improved type checking.\n- `Issue #20`_: Support current directory prefix.\n\n.. _`Issue #20`: https://github.com/cpburnz/python-pathspec/issues/20\n\n\n0.5.5 (2017-09-09)\n------------------\n\n- Add documentation link to README.\n\n\n0.5.4 (2017-09-09)\n------------------\n\n- `Pull #17`_: Add link to Ruby implementation of *pathspec*.\n- Add sphinx documentation.\n\n.. _`Pull #17`: https://github.com/cpburnz/python-pathspec/pull/17\n\n\n0.5.3 (2017-07-01)\n------------------\n\n- `Issue #14`_: Fix byte strings for Python 3.\n- `Pull #15`_: Include \"LICENSE\" in source package.\n- `Issue #16`_: Support Python 2.6.\n\n.. _`Issue #14`: https://github.com/cpburnz/python-pathspec/issues/14\n.. _`Pull #15`: https://github.com/cpburnz/python-pathspec/pull/15\n.. _`Issue #16`: https://github.com/cpburnz/python-pathspec/issues/16\n\n\n0.5.2 (2017-04-04)\n------------------\n\n- Fixed change log.\n\n\n0.5.1 (2017-04-04)\n------------------\n\n- `Pull #13`_: Add equality methods to `PathSpec` and `RegexPattern`.\n\n.. _`Pull #13`: https://github.com/cpburnz/python-pathspec/pull/13\n\n\n0.5.0 (2016-08-22)\n------------------\n\n- `Issue #12`_: Add `PathSpec.match_file()`.\n- Renamed `gitignore.GitIgnorePattern` to `patterns.gitwildmatch.GitWildMatchPattern`.\n- Deprecated `gitignore.GitIgnorePattern`.\n\n.. _`Issue #12`: https://github.com/cpburnz/python-pathspec/issues/12\n\n\n0.4.0 (2016-07-15)\n------------------\n\n- `Issue #11`_: Support converting patterns into regular expressions without compiling them.\n- API change: Subclasses of `RegexPattern` should implement `pattern_to_regex()`.\n\n.. _`Issue #11`: https://github.com/cpburnz/python-pathspec/issues/11\n\n\n0.3.4 (2015-08-24)\n------------------\n\n- `Pull #7`_: Fixed non-recursive links.\n- `Pull #8`_: Fixed edge cases in gitignore patterns.\n- `Pull #9`_: Fixed minor usage documentation.\n- Fixed recursion detection.\n- Fixed trivial incompatibility with Python 3.2.\n\n.. _`Pull #7`: https://github.com/cpburnz/python-pathspec/pull/7\n.. _`Pull #8`: https://github.com/cpburnz/python-pathspec/pull/8\n.. _`Pull #9`: https://github.com/cpburnz/python-pathspec/pull/9\n\n\n0.3.3 (2014-11-21)\n------------------\n\n- Improved documentation.\n\n\n0.3.2 (2014-11-08)\n------------------\n\n- `Pull #5`_: Use tox for testing.\n- `Issue #6`_: Fixed matching Windows paths.\n- Improved documentation.\n- API change: `spec.match_tree()` and `spec.match_files()` now return iterators instead of sets.\n\n.. _`Pull #5`: https://github.com/cpburnz/python-pathspec/pull/5\n.. _`Issue #6`: https://github.com/cpburnz/python-pathspec/issues/6\n\n\n0.3.1 (2014-09-17)\n------------------\n\n- Updated README.\n\n\n0.3.0 (2014-09-17)\n------------------\n\n- `Pull #3`_: Fixed trailing slash in gitignore patterns.\n- `Pull #4`_: Fixed test for trailing slash in gitignore patterns.\n- Added registered patterns.\n\n.. _`Pull #3`: https://github.com/cpburnz/python-pathspec/pull/3\n.. _`Pull #4`: https://github.com/cpburnz/python-pathspec/pull/4\n\n\n0.2.2 (2013-12-17)\n------------------\n\n- Fixed setup.py.\n\n\n0.2.1 (2013-12-17)\n------------------\n\n- Added tests.\n- Fixed comment gitignore patterns.\n- Fixed relative path gitignore patterns.\n\n\n0.2.0 (2013-12-07)\n------------------\n\n- Initial release.\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl","archive_info":{"hash":"sha256=73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb","hashes":{"sha256":"73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.3","name":"platformdirs","version":"4.3.6","summary":"A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.","description_content_type":"text/x-rst","keywords":["appdirs","application","cache","directory","log","user"],"maintainer_email":"Bernát Gábor <gaborjbernat@gmail.com>, Julian Berman <Julian@GrayVines.com>, Ofek Lev <oss@ofek.dev>, Ronny Pfannschmidt <opensource@ronnypfannschmidt.de>","license_expression":"MIT","license_file":["LICENSE"],"classifier":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Topic :: Software Development :: Libraries :: Python Modules"],"requires_dist":["furo>=2024.8.6; extra == 'docs'","proselint>=0.14; extra == 'docs'","sphinx-autodoc-typehints>=2.4; extra == 'docs'","sphinx>=8.0.2; extra == 'docs'","appdirs==1.4.4; extra == 'test'","covdefaults>=2.3; extra == 'test'","pytest-cov>=5; extra == 'test'","pytest-mock>=3.14; extra == 'test'","pytest>=8.3.2; extra == 'test'","mypy>=1.11.2; extra == 'type'"],"requires_python":">=3.8","project_url":["Changelog, https://github.com/tox-dev/platformdirs/releases","Documentation, https://platformdirs.readthedocs.io","Homepage, https://github.com/tox-dev/platformdirs","Source, https://github.com/tox-dev/platformdirs","Tracker, https://github.com/tox-dev/platformdirs/issues"],"provides_extra":["docs","test","type"],"description":"The problem\n===========\n\n.. image:: https://badge.fury.io/py/platformdirs.svg\n :target: https://badge.fury.io/py/platformdirs\n.. image:: https://img.shields.io/pypi/pyversions/platformdirs.svg\n :target: https://pypi.python.org/pypi/platformdirs/\n.. image:: https://github.com/tox-dev/platformdirs/actions/workflows/check.yaml/badge.svg\n :target: https://github.com/platformdirs/platformdirs/actions\n.. image:: https://static.pepy.tech/badge/platformdirs/month\n :target: https://pepy.tech/project/platformdirs\n\nWhen writing desktop application, finding the right location to store user data\nand configuration varies per platform. Even for single-platform apps, there\nmay by plenty of nuances in figuring out the right location.\n\nFor example, if running on macOS, you should use::\n\n ~/Library/Application Support/<AppName>\n\nIf on Windows (at least English Win) that should be::\n\n C:\\Documents and Settings\\<User>\\Application Data\\Local Settings\\<AppAuthor>\\<AppName>\n\nor possibly::\n\n C:\\Documents and Settings\\<User>\\Application Data\\<AppAuthor>\\<AppName>\n\nfor `roaming profiles <https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc766489(v=ws.10)>`_ but that is another story.\n\nOn Linux (and other Unices), according to the `XDG Basedir Spec`_, it should be::\n\n ~/.local/share/<AppName>\n\n.. _XDG Basedir Spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html\n\n``platformdirs`` to the rescue\n==============================\n\nThis kind of thing is what the ``platformdirs`` package is for.\n``platformdirs`` will help you choose an appropriate:\n\n- user data dir (``user_data_dir``)\n- user config dir (``user_config_dir``)\n- user cache dir (``user_cache_dir``)\n- site data dir (``site_data_dir``)\n- site config dir (``site_config_dir``)\n- user log dir (``user_log_dir``)\n- user documents dir (``user_documents_dir``)\n- user downloads dir (``user_downloads_dir``)\n- user pictures dir (``user_pictures_dir``)\n- user videos dir (``user_videos_dir``)\n- user music dir (``user_music_dir``)\n- user desktop dir (``user_desktop_dir``)\n- user runtime dir (``user_runtime_dir``)\n\nAnd also:\n\n- Is slightly opinionated on the directory names used. Look for \"OPINION\" in\n documentation and code for when an opinion is being applied.\n\nExample output\n==============\n\nOn macOS:\n\n.. code-block:: pycon\n\n >>> from platformdirs import *\n >>> appname = \"SuperApp\"\n >>> appauthor = \"Acme\"\n >>> user_data_dir(appname, appauthor)\n '/Users/trentm/Library/Application Support/SuperApp'\n >>> site_data_dir(appname, appauthor)\n '/Library/Application Support/SuperApp'\n >>> user_cache_dir(appname, appauthor)\n '/Users/trentm/Library/Caches/SuperApp'\n >>> user_log_dir(appname, appauthor)\n '/Users/trentm/Library/Logs/SuperApp'\n >>> user_documents_dir()\n '/Users/trentm/Documents'\n >>> user_downloads_dir()\n '/Users/trentm/Downloads'\n >>> user_pictures_dir()\n '/Users/trentm/Pictures'\n >>> user_videos_dir()\n '/Users/trentm/Movies'\n >>> user_music_dir()\n '/Users/trentm/Music'\n >>> user_desktop_dir()\n '/Users/trentm/Desktop'\n >>> user_runtime_dir(appname, appauthor)\n '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'\n\nOn Windows:\n\n.. code-block:: pycon\n\n >>> from platformdirs import *\n >>> appname = \"SuperApp\"\n >>> appauthor = \"Acme\"\n >>> user_data_dir(appname, appauthor)\n 'C:\\\\Users\\\\trentm\\\\AppData\\\\Local\\\\Acme\\\\SuperApp'\n >>> user_data_dir(appname, appauthor, roaming=True)\n 'C:\\\\Users\\\\trentm\\\\AppData\\\\Roaming\\\\Acme\\\\SuperApp'\n >>> user_cache_dir(appname, appauthor)\n 'C:\\\\Users\\\\trentm\\\\AppData\\\\Local\\\\Acme\\\\SuperApp\\\\Cache'\n >>> user_log_dir(appname, appauthor)\n 'C:\\\\Users\\\\trentm\\\\AppData\\\\Local\\\\Acme\\\\SuperApp\\\\Logs'\n >>> user_documents_dir()\n 'C:\\\\Users\\\\trentm\\\\Documents'\n >>> user_downloads_dir()\n 'C:\\\\Users\\\\trentm\\\\Downloads'\n >>> user_pictures_dir()\n 'C:\\\\Users\\\\trentm\\\\Pictures'\n >>> user_videos_dir()\n 'C:\\\\Users\\\\trentm\\\\Videos'\n >>> user_music_dir()\n 'C:\\\\Users\\\\trentm\\\\Music'\n >>> user_desktop_dir()\n 'C:\\\\Users\\\\trentm\\\\Desktop'\n >>> user_runtime_dir(appname, appauthor)\n 'C:\\\\Users\\\\trentm\\\\AppData\\\\Local\\\\Temp\\\\Acme\\\\SuperApp'\n\nOn Linux:\n\n.. code-block:: pycon\n\n >>> from platformdirs import *\n >>> appname = \"SuperApp\"\n >>> appauthor = \"Acme\"\n >>> user_data_dir(appname, appauthor)\n '/home/trentm/.local/share/SuperApp'\n >>> site_data_dir(appname, appauthor)\n '/usr/local/share/SuperApp'\n >>> site_data_dir(appname, appauthor, multipath=True)\n '/usr/local/share/SuperApp:/usr/share/SuperApp'\n >>> user_cache_dir(appname, appauthor)\n '/home/trentm/.cache/SuperApp'\n >>> user_log_dir(appname, appauthor)\n '/home/trentm/.local/state/SuperApp/log'\n >>> user_config_dir(appname)\n '/home/trentm/.config/SuperApp'\n >>> user_documents_dir()\n '/home/trentm/Documents'\n >>> user_downloads_dir()\n '/home/trentm/Downloads'\n >>> user_pictures_dir()\n '/home/trentm/Pictures'\n >>> user_videos_dir()\n '/home/trentm/Videos'\n >>> user_music_dir()\n '/home/trentm/Music'\n >>> user_desktop_dir()\n '/home/trentm/Desktop'\n >>> user_runtime_dir(appname, appauthor)\n '/run/user/{os.getuid()}/SuperApp'\n >>> site_config_dir(appname)\n '/etc/xdg/SuperApp'\n >>> os.environ[\"XDG_CONFIG_DIRS\"] = \"/etc:/usr/local/etc\"\n >>> site_config_dir(appname, multipath=True)\n '/etc/SuperApp:/usr/local/etc/SuperApp'\n\nOn Android::\n\n >>> from platformdirs import *\n >>> appname = \"SuperApp\"\n >>> appauthor = \"Acme\"\n >>> user_data_dir(appname, appauthor)\n '/data/data/com.myApp/files/SuperApp'\n >>> user_cache_dir(appname, appauthor)\n '/data/data/com.myApp/cache/SuperApp'\n >>> user_log_dir(appname, appauthor)\n '/data/data/com.myApp/cache/SuperApp/log'\n >>> user_config_dir(appname)\n '/data/data/com.myApp/shared_prefs/SuperApp'\n >>> user_documents_dir()\n '/storage/emulated/0/Documents'\n >>> user_downloads_dir()\n '/storage/emulated/0/Downloads'\n >>> user_pictures_dir()\n '/storage/emulated/0/Pictures'\n >>> user_videos_dir()\n '/storage/emulated/0/DCIM/Camera'\n >>> user_music_dir()\n '/storage/emulated/0/Music'\n >>> user_desktop_dir()\n '/storage/emulated/0/Desktop'\n >>> user_runtime_dir(appname, appauthor)\n '/data/data/com.myApp/cache/SuperApp/tmp'\n\nNote: Some android apps like Termux and Pydroid are used as shells. These\napps are used by the end user to emulate Linux environment. Presence of\n``SHELL`` environment variable is used by Platformdirs to differentiate\nbetween general android apps and android apps used as shells. Shell android\napps also support ``XDG_*`` environment variables.\n\n\n``PlatformDirs`` for convenience\n================================\n\n.. code-block:: pycon\n\n >>> from platformdirs import PlatformDirs\n >>> dirs = PlatformDirs(\"SuperApp\", \"Acme\")\n >>> dirs.user_data_dir\n '/Users/trentm/Library/Application Support/SuperApp'\n >>> dirs.site_data_dir\n '/Library/Application Support/SuperApp'\n >>> dirs.user_cache_dir\n '/Users/trentm/Library/Caches/SuperApp'\n >>> dirs.user_log_dir\n '/Users/trentm/Library/Logs/SuperApp'\n >>> dirs.user_documents_dir\n '/Users/trentm/Documents'\n >>> dirs.user_downloads_dir\n '/Users/trentm/Downloads'\n >>> dirs.user_pictures_dir\n '/Users/trentm/Pictures'\n >>> dirs.user_videos_dir\n '/Users/trentm/Movies'\n >>> dirs.user_music_dir\n '/Users/trentm/Music'\n >>> dirs.user_desktop_dir\n '/Users/trentm/Desktop'\n >>> dirs.user_runtime_dir\n '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'\n\nPer-version isolation\n=====================\n\nIf you have multiple versions of your app in use that you want to be\nable to run side-by-side, then you may want version-isolation for these\ndirs::\n\n >>> from platformdirs import PlatformDirs\n >>> dirs = PlatformDirs(\"SuperApp\", \"Acme\", version=\"1.0\")\n >>> dirs.user_data_dir\n '/Users/trentm/Library/Application Support/SuperApp/1.0'\n >>> dirs.site_data_dir\n '/Library/Application Support/SuperApp/1.0'\n >>> dirs.user_cache_dir\n '/Users/trentm/Library/Caches/SuperApp/1.0'\n >>> dirs.user_log_dir\n '/Users/trentm/Library/Logs/SuperApp/1.0'\n >>> dirs.user_documents_dir\n '/Users/trentm/Documents'\n >>> dirs.user_downloads_dir\n '/Users/trentm/Downloads'\n >>> dirs.user_pictures_dir\n '/Users/trentm/Pictures'\n >>> dirs.user_videos_dir\n '/Users/trentm/Movies'\n >>> dirs.user_music_dir\n '/Users/trentm/Music'\n >>> dirs.user_desktop_dir\n '/Users/trentm/Desktop'\n >>> dirs.user_runtime_dir\n '/Users/trentm/Library/Caches/TemporaryItems/SuperApp/1.0'\n\nBe wary of using this for configuration files though; you'll need to handle\nmigrating configuration files manually.\n\nWhy this Fork?\n==============\n\nThis repository is a friendly fork of the wonderful work started by\n`ActiveState <https://github.com/ActiveState/appdirs>`_ who created\n``appdirs``, this package's ancestor.\n\nMaintaining an open source project is no easy task, particularly\nfrom within an organization, and the Python community is indebted\nto ``appdirs`` (and to Trent Mick and Jeff Rouse in particular) for\ncreating an incredibly useful simple module, as evidenced by the wide\nnumber of users it has attracted over the years.\n\nNonetheless, given the number of long-standing open issues\nand pull requests, and no clear path towards `ensuring\nthat maintenance of the package would continue or grow\n<https://github.com/ActiveState/appdirs/issues/79>`_, this fork was\ncreated.\n\nContributions are most welcome.\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/11/19/b74a10dd24548e96e8c80226cbacb28b021bc3a168a7d2709fb0d0185348/pygls-1.3.1-py3-none-any.whl","archive_info":{"hash":"sha256=6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e","hashes":{"sha256":"6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"pygls","version":"1.3.1","summary":"A pythonic generic language server (pronounced like 'pie glass')","description_content_type":"text/markdown","home_page":"https://github.com/openlawlibrary/pygls","author":"Open Law Library","author_email":"info@openlawlib.org","maintainer":"Tom BH","maintainer_email":"tom@tombh.co.uk","license":"Apache-2.0","classifier":["License :: OSI Approved :: Apache Software License","Programming Language :: Python :: 3","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12"],"requires_dist":["cattrs (>=23.1.2)","lsprotocol (==2023.0.1)","websockets (>=11.0.3) ; extra == \"ws\""],"requires_python":">=3.8","project_url":["Documentation, https://pygls.readthedocs.io/en/latest","Repository, https://github.com/openlawlibrary/pygls"],"provides_extra":["ws"],"description":"[](https://pypi.org/project/pygls/)   [](https://pygls.readthedocs.io/en/latest/)\n\n# pygls: The Generic Language Server Framework\n\n_pygls_ (pronounced like \"pie glass\") is a pythonic generic implementation of the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/specification) for use as a foundation for writing your own [Language Servers](https://langserver.org/) in just a few lines of code.\n\n## Quickstart\n```python\nfrom pygls.server import LanguageServer\nfrom lsprotocol.types import (\n TEXT_DOCUMENT_COMPLETION,\n CompletionItem,\n CompletionList,\n CompletionParams,\n)\n\nserver = LanguageServer(\"example-server\", \"v0.1\")\n\n@server.feature(TEXT_DOCUMENT_COMPLETION)\ndef completions(params: CompletionParams):\n items = []\n document = server.workspace.get_document(params.text_document.uri)\n current_line = document.lines[params.position.line].strip()\n if current_line.endswith(\"hello.\"):\n items = [\n CompletionItem(label=\"world\"),\n CompletionItem(label=\"friend\"),\n ]\n return CompletionList(is_incomplete=False, items=items)\n\nserver.start_io()\n```\n\nWhich might look something like this when you trigger autocompletion in your editor:\n\n\n\n## Docs and Tutorial\n\nThe full documentation and a tutorial are available at <https://pygls.readthedocs.io/en/latest/>.\n\n## Projects based on _pygls_\n\nWe keep a table of all known _pygls_ [implementations](https://github.com/openlawlibrary/pygls/blob/master/Implementations.md). Please submit a Pull Request with your own or any that you find are missing.\n\n## Alternatives\n\nThe main alternative to _pygls_ is Microsoft's [NodeJS-based Generic Language Server Framework](https://github.com/microsoft/vscode-languageserver-node). Being from Microsoft it is focussed on extending VSCode, although in theory it could be used to support any editor. So this is where pygls might be a better choice if you want to support more editors, as pygls is not focussed around VSCode.\n\nThere are also other Language Servers with \"general\" in their descriptons, or at least intentions. They are however only general in the sense of having powerful _configuration_. They achieve generality in so much as configuration is able to, as opposed to what programming (in _pygls'_ case) can achieve.\n * https://github.com/iamcco/diagnostic-languageserver\n * https://github.com/mattn/efm-langserver\n * https://github.com/jose-elias-alvarez/null-ls.nvim (Neovim only)\n\n## Tests\nAll Pygls sub-tasks require the Poetry `poe` plugin: https://github.com/nat-n/poethepoet\n\n* `poetry install --all-extras`\n* `poetry run poe test`\n* `poetry run poe test-pyodide`\n\n\n## Contributing\n\nYour contributions to _pygls_ are most welcome ❤️ Please review the [Contributing](https://github.com/openlawlibrary/pygls/blob/master/CONTRIBUTING.md) and [Code of Conduct](https://github.com/openlawlibrary/pygls/blob/master/CODE_OF_CONDUCT.md) documents for how to get started.\n\n## Donating\n\n[Open Law Library](http://www.openlawlib.org/) is a 501(c)(3) tax exempt organization. Help us maintain our open source projects and open the law to all with [sponsorship](https://github.com/sponsors/openlawlibrary).\n\n### Supporters\n\nWe would like to give special thanks to the following supporters:\n* [mpourmpoulis](https://github.com/mpourmpoulis)\n\n## License\n\nApache-2.0\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl","archive_info":{"hash":"sha256=cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc","hashes":{"sha256":"cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.3","name":"tomli","version":"2.2.1","summary":"A lil' TOML parser","description_content_type":"text/markdown","keywords":["toml"],"author_email":"Taneli Hukkinen <hukkin@users.noreply.github.com>","classifier":["License :: OSI Approved :: MIT License","Operating System :: MacOS","Operating System :: Microsoft :: Windows","Operating System :: POSIX :: Linux","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Topic :: Software Development :: Libraries :: Python Modules","Typing :: Typed"],"requires_python":">=3.8","project_url":["Changelog, https://github.com/hukkin/tomli/blob/master/CHANGELOG.md","Homepage, https://github.com/hukkin/tomli"],"description":"[](https://github.com/hukkin/tomli/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)\n[](https://codecov.io/gh/hukkin/tomli)\n[](https://pypi.org/project/tomli)\n\n# Tomli\n\n> A lil' TOML parser\n\n**Table of Contents** *generated with [mdformat-toc](https://github.com/hukkin/mdformat-toc)*\n\n<!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 -->\n\n- [Intro](#intro)\n- [Installation](#installation)\n- [Usage](#usage)\n - [Parse a TOML string](#parse-a-toml-string)\n - [Parse a TOML file](#parse-a-toml-file)\n - [Handle invalid TOML](#handle-invalid-toml)\n - [Construct `decimal.Decimal`s from TOML floats](#construct-decimaldecimals-from-toml-floats)\n - [Building a `tomli`/`tomllib` compatibility layer](#building-a-tomlitomllib-compatibility-layer)\n- [FAQ](#faq)\n - [Why this parser?](#why-this-parser)\n - [Is comment preserving round-trip parsing supported?](#is-comment-preserving-round-trip-parsing-supported)\n - [Is there a `dumps`, `write` or `encode` function?](#is-there-a-dumps-write-or-encode-function)\n - [How do TOML types map into Python types?](#how-do-toml-types-map-into-python-types)\n- [Performance](#performance)\n - [Pure Python](#pure-python)\n - [Mypyc generated wheel](#mypyc-generated-wheel)\n\n<!-- mdformat-toc end -->\n\n## Intro<a name=\"intro\"></a>\n\nTomli is a Python library for parsing [TOML](https://toml.io).\nIt is fully compatible with [TOML v1.0.0](https://toml.io/en/v1.0.0).\n\nA version of Tomli, the `tomllib` module,\nwas added to the standard library in Python 3.11\nvia [PEP 680](https://www.python.org/dev/peps/pep-0680/).\nTomli continues to provide a backport on PyPI for Python versions\nwhere the standard library module is not available\nand that have not yet reached their end-of-life.\n\nTomli uses [mypyc](https://github.com/mypyc/mypyc)\nto generate binary wheels for most of the widely used platforms,\nso Python 3.11+ users may prefer it over `tomllib` for improved performance.\nPure Python wheels are available on any platform and should perform the same as `tomllib`.\n\n## Installation<a name=\"installation\"></a>\n\n```bash\npip install tomli\n```\n\n## Usage<a name=\"usage\"></a>\n\n### Parse a TOML string<a name=\"parse-a-toml-string\"></a>\n\n```python\nimport tomli\n\ntoml_str = \"\"\"\n[[players]]\nname = \"Lehtinen\"\nnumber = 26\n\n[[players]]\nname = \"Numminen\"\nnumber = 27\n\"\"\"\n\ntoml_dict = tomli.loads(toml_str)\nassert toml_dict == {\n \"players\": [{\"name\": \"Lehtinen\", \"number\": 26}, {\"name\": \"Numminen\", \"number\": 27}]\n}\n```\n\n### Parse a TOML file<a name=\"parse-a-toml-file\"></a>\n\n```python\nimport tomli\n\nwith open(\"path_to_file/conf.toml\", \"rb\") as f:\n toml_dict = tomli.load(f)\n```\n\nThe file must be opened in binary mode (with the `\"rb\"` flag).\nBinary mode will enforce decoding the file as UTF-8 with universal newlines disabled,\nboth of which are required to correctly parse TOML.\n\n### Handle invalid TOML<a name=\"handle-invalid-toml\"></a>\n\n```python\nimport tomli\n\ntry:\n toml_dict = tomli.loads(\"]] this is invalid TOML [[\")\nexcept tomli.TOMLDecodeError:\n print(\"Yep, definitely not valid.\")\n```\n\nNote that error messages are considered informational only.\nThey should not be assumed to stay constant across Tomli versions.\n\n### Construct `decimal.Decimal`s from TOML floats<a name=\"construct-decimaldecimals-from-toml-floats\"></a>\n\n```python\nfrom decimal import Decimal\nimport tomli\n\ntoml_dict = tomli.loads(\"precision-matters = 0.982492\", parse_float=Decimal)\nassert isinstance(toml_dict[\"precision-matters\"], Decimal)\nassert toml_dict[\"precision-matters\"] == Decimal(\"0.982492\")\n```\n\nNote that `decimal.Decimal` can be replaced with another callable that converts a TOML float from string to a Python type.\nThe `decimal.Decimal` is, however, a practical choice for use cases where float inaccuracies can not be tolerated.\n\nIllegal types are `dict` and `list`, and their subtypes.\nA `ValueError` will be raised if `parse_float` produces illegal types.\n\n### Building a `tomli`/`tomllib` compatibility layer<a name=\"building-a-tomlitomllib-compatibility-layer\"></a>\n\nPython versions 3.11+ ship with a version of Tomli:\nthe `tomllib` standard library module.\nTo build code that uses the standard library if available,\nbut still works seamlessly with Python 3.6+,\ndo the following.\n\nInstead of a hard Tomli dependency, use the following\n[dependency specifier](https://packaging.python.org/en/latest/specifications/dependency-specifiers/)\nto only require Tomli when the standard library module is not available:\n\n```\ntomli >= 1.1.0 ; python_version < \"3.11\"\n```\n\nThen, in your code, import a TOML parser using the following fallback mechanism:\n\n```python\nimport sys\n\nif sys.version_info >= (3, 11):\n import tomllib\nelse:\n import tomli as tomllib\n\ntomllib.loads(\"['This parses fine with Python 3.6+']\")\n```\n\n## FAQ<a name=\"faq\"></a>\n\n### Why this parser?<a name=\"why-this-parser\"></a>\n\n- it's lil'\n- pure Python with zero dependencies\n- the fastest pure Python parser [\\*](#pure-python):\n 18x as fast as [tomlkit](https://pypi.org/project/tomlkit/),\n 2.1x as fast as [toml](https://pypi.org/project/toml/)\n- outputs [basic data types](#how-do-toml-types-map-into-python-types) only\n- 100% spec compliant: passes all tests in\n [BurntSushi/toml-test](https://github.com/BurntSushi/toml-test)\n test suite\n- thoroughly tested: 100% branch coverage\n\n### Is comment preserving round-trip parsing supported?<a name=\"is-comment-preserving-round-trip-parsing-supported\"></a>\n\nNo.\n\nThe `tomli.loads` function returns a plain `dict` that is populated with builtin types and types from the standard library only.\nPreserving comments requires a custom type to be returned so will not be supported,\nat least not by the `tomli.loads` and `tomli.load` functions.\n\nLook into [TOML Kit](https://github.com/sdispater/tomlkit) if preservation of style is what you need.\n\n### Is there a `dumps`, `write` or `encode` function?<a name=\"is-there-a-dumps-write-or-encode-function\"></a>\n\n[Tomli-W](https://github.com/hukkin/tomli-w) is the write-only counterpart of Tomli, providing `dump` and `dumps` functions.\n\nThe core library does not include write capability, as most TOML use cases are read-only, and Tomli intends to be minimal.\n\n### How do TOML types map into Python types?<a name=\"how-do-toml-types-map-into-python-types\"></a>\n\n| TOML type | Python type | Details |\n| ---------------- | ------------------- | ------------------------------------------------------------ |\n| Document Root | `dict` | |\n| Key | `str` | |\n| String | `str` | |\n| Integer | `int` | |\n| Float | `float` | |\n| Boolean | `bool` | |\n| Offset Date-Time | `datetime.datetime` | `tzinfo` attribute set to an instance of `datetime.timezone` |\n| Local Date-Time | `datetime.datetime` | `tzinfo` attribute set to `None` |\n| Local Date | `datetime.date` | |\n| Local Time | `datetime.time` | |\n| Array | `list` | |\n| Table | `dict` | |\n| Inline Table | `dict` | |\n\n## Performance<a name=\"performance\"></a>\n\nThe `benchmark/` folder in this repository contains a performance benchmark for comparing the various Python TOML parsers.\n\nBelow are the results for commit [0724e2a](https://github.com/hukkin/tomli/tree/0724e2ab1858da7f5e05a9bffdb24c33589d951c).\n\n### Pure Python<a name=\"pure-python\"></a>\n\n```console\nfoo@bar:~/dev/tomli$ python --version\nPython 3.12.7\nfoo@bar:~/dev/tomli$ pip freeze\nattrs==21.4.0\nclick==8.1.7\npytomlpp==1.0.13\nqtoml==0.3.1\nrtoml==0.11.0\ntoml==0.10.2\ntomli @ file:///home/foo/dev/tomli\ntomlkit==0.13.2\nfoo@bar:~/dev/tomli$ python benchmark/run.py\nParsing data.toml 5000 times:\n------------------------------------------------------\n parser | exec time | performance (more is better)\n-----------+------------+-----------------------------\n rtoml | 0.647 s | baseline (100%)\n pytomlpp | 0.891 s | 72.62%\n tomli | 3.14 s | 20.56%\n toml | 6.69 s | 9.67%\n qtoml | 8.27 s | 7.82%\n tomlkit | 56.1 s | 1.15%\n```\n\n### Mypyc generated wheel<a name=\"mypyc-generated-wheel\"></a>\n\n```console\nfoo@bar:~/dev/tomli$ python benchmark/run.py\nParsing data.toml 5000 times:\n------------------------------------------------------\n parser | exec time | performance (more is better)\n-----------+------------+-----------------------------\n rtoml | 0.668 s | baseline (100%)\n pytomlpp | 0.893 s | 74.81%\n tomli | 1.96 s | 34.18%\n toml | 6.64 s | 10.07%\n qtoml | 8.26 s | 8.09%\n tomlkit | 52.9 s | 1.26%\n```\n\n"}},{"download_info":{"url":"https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl","archive_info":{"hash":"sha256=04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d","hashes":{"sha256":"04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}}},"is_direct":false,"is_yanked":false,"requested":true,"metadata":{"metadata_version":"2.1","name":"typing_extensions","version":"4.12.2","summary":"Backported and Experimental Type Hints for Python 3.8+","description_content_type":"text/markdown","keywords":["annotations","backport","checker","checking","function","hinting","hints","type","typechecking","typehinting","typehints","typing"],"author_email":"\"Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee\" <levkivskyi@gmail.com>","classifier":["Development Status :: 5 - Production/Stable","Environment :: Console","Intended Audience :: Developers","License :: OSI Approved :: Python Software Foundation License","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Topic :: Software Development"],"requires_python":">=3.8","project_url":["Bug Tracker, https://github.com/python/typing_extensions/issues","Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md","Documentation, https://typing-extensions.readthedocs.io/","Home, https://github.com/python/typing_extensions","Q & A, https://github.com/python/typing/discussions","Repository, https://github.com/python/typing_extensions"],"description":"# Typing Extensions\n\n[](https://gitter.im/python/typing)\n\n[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) –\n[PyPI](https://pypi.org/project/typing-extensions/)\n\n## Overview\n\nThe `typing_extensions` module serves two related purposes:\n\n- Enable use of new type system features on older Python versions. For example,\n `typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows\n users on previous Python versions to use it too.\n- Enable experimentation with new type system PEPs before they are accepted and\n added to the `typing` module.\n\n`typing_extensions` is treated specially by static type checkers such as\nmypy and pyright. Objects defined in `typing_extensions` are treated the same\nway as equivalent forms in `typing`.\n\n`typing_extensions` uses\n[Semantic Versioning](https://semver.org/). The\nmajor version will be incremented only for backwards-incompatible changes.\nTherefore, it's safe to depend\non `typing_extensions` like this: `typing_extensions >=x.y, <(x+1)`,\nwhere `x.y` is the first version that includes all features you need.\n\n## Included items\n\nSee [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a\ncomplete listing of module contents.\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md)\nfor how to contribute to `typing_extensions`.\n\n"}}],"environment":{"implementation_name":"cpython","implementation_version":"3.9.21","os_name":"posix","platform_machine":"x86_64","platform_release":"6.8.0-1021-azure","platform_system":"Linux","platform_version":"#25~22.04.1-Ubuntu SMP Thu Jan 16 21:37:09 UTC 2025","python_full_version":"3.9.21","platform_python_implementation":"CPython","python_version":"3.9","sys_platform":"linux"}} | |
Xet Storage Details
- Size:
- 194 kB
- Xet hash:
- b84f9f339d5b9087cafa956a5c919f2e00e289683ed9cc6009850e81c7d6547d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.