tag.\n\n\nVersion 1.1.5\n-------------\n\n\nVersion 1.1.4\n-------------\n\n\nVersion 1.1.3 (July 10, 2012)\n-----------------------------\n\n* Fix parsing bare URLs when parse_email=True.\n\n\nVersion 1.1.2 (June 1, 2012)\n----------------------------\n\n* Fix hang in style attribute sanitizer. (#61)\n\n* Allow ``/`` in style attribute values.\n\n\nVersion 1.1.1 (February 17, 2012)\n---------------------------------\n\n* Fix tokenizer for html5lib 0.9.5.\n\n\nVersion 1.1.0 (October 24, 2011)\n--------------------------------\n\n* ``linkify()`` now understands port numbers. (#38)\n\n* Documented character encoding behavior. (#41)\n\n* Add an optional target argument to ``linkify()``.\n\n* Add ``delinkify()`` method. (#45)\n\n* Support subdomain whitelist for ``delinkify()``. (#47, #48)\n\n\nVersion 1.0.4 (September 2, 2011)\n---------------------------------\n\n* Switch to SemVer git tags.\n\n* Make ``linkify()`` smarter about trailing punctuation. (#30)\n\n* Pass ``exc_info`` to logger during rendering issues.\n\n* Add wildcard key for attributes. (#19)\n\n* Make ``linkify()`` use the ``HTMLSanitizer`` tokenizer. (#36)\n\n* Fix URLs wrapped in parentheses. (#23)\n\n* Make ``linkify()`` UTF-8 safe. (#33)\n\n\nVersion 1.0.3 (June 14, 2011)\n-----------------------------\n\n* ``linkify()`` works with 3rd level domains. (#24)\n\n* ``clean()`` supports vendor prefixes in style values. (#31, #32)\n\n* Fix ``linkify()`` email escaping.\n\n\nVersion 1.0.2 (June 6, 2011)\n----------------------------\n\n* ``linkify()`` supports email addresses.\n\n* ``clean()`` supports callables in attributes filter.\n\n\nVersion 1.0.1 (April 12, 2011)\n------------------------------\n\n* ``linkify()`` doesn't drop trailing slashes. (#21)\n* ``linkify()`` won't linkify 'libgl.so.1'. (#22)\n",
+ "description_content_type": "text/x-rst",
+ "home_page": "https://github.com/mozilla/bleach",
+ "maintainer": "Will Kahn-Greene",
+ "maintainer_email": "willkg@mozilla.com",
+ "license": "Apache Software License",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Environment :: Web Environment",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: Apache Software License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3 :: Only",
+ "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"
+ ],
+ "requires_dist": [
+ "six >=1.9.0",
+ "webencodings",
+ "tinycss2 <1.3,>=1.1.0 ; extra == 'css'"
+ ],
+ "requires_python": ">=3.8",
+ "provides_extra": [
+ "css"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl",
+ "archive_info": {
+ "hash": "sha256=96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
+ "hashes": {
+ "sha256": "96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "charset-normalizer",
+ "version": "3.3.2",
+ "summary": "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.",
+ "description": "Charset Detection, for Everyone 👋
\r\n\r\n\r\n The Real First Universal Charset Detector
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n Featured Packages
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n In other language (unofficial port - by the community)
\r\n \r\n \r\n \r\n
\r\n\r\n> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`,\r\n> I'm trying to resolve the issue by taking a new approach.\r\n> All IANA character set names for which the Python core library provides codecs are supported.\r\n\r\n\r\n >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<<\r\n
\r\n\r\nThis project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**.\r\n\r\n| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) |\r\n|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:|\r\n| `Fast` | ❌ | ✅ | ✅ |\r\n| `Universal**` | ❌ | ✅ | ❌ |\r\n| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ |\r\n| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ |\r\n| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ |\r\n| `Native Python` | ✅ | ✅ | ❌ |\r\n| `Detect spoken language` | ❌ | ✅ | N/A |\r\n| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ |\r\n| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB |\r\n| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 |\r\n\r\n\r\n\r\n
\r\n\r\n*\\*\\* : They are clearly using specific code for a specific encoding even if covering most of used one*
\r\nDid you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html)\r\n\r\n## ⚡ Performance\r\n\r\nThis package offer better performance than its counterpart Chardet. Here are some numbers.\r\n\r\n| Package | Accuracy | Mean per file (ms) | File per sec (est) |\r\n|-----------------------------------------------|:--------:|:------------------:|:------------------:|\r\n| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec |\r\n| charset-normalizer | **98 %** | **10 ms** | 100 file/sec |\r\n\r\n| Package | 99th percentile | 95th percentile | 50th percentile |\r\n|-----------------------------------------------|:---------------:|:---------------:|:---------------:|\r\n| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms |\r\n| charset-normalizer | 100 ms | 50 ms | 5 ms |\r\n\r\nChardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload.\r\n\r\n> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows.\r\n> And yes, these results might change at any time. The dataset can be updated to include more files.\r\n> The actual delays heavily depends on your CPU capabilities. The factors should remain the same.\r\n> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability\r\n> (eg. Supported Encoding) Challenge-them if you want.\r\n\r\n## ✨ Installation\r\n\r\nUsing pip:\r\n\r\n```sh\r\npip install charset-normalizer -U\r\n```\r\n\r\n## 🚀 Basic Usage\r\n\r\n### CLI\r\nThis package comes with a CLI.\r\n\r\n```\r\nusage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD]\r\n file [file ...]\r\n\r\nThe Real First Universal Charset Detector. Discover originating encoding used\r\non text file. Normalize text to unicode.\r\n\r\npositional arguments:\r\n files File(s) to be analysed\r\n\r\noptional arguments:\r\n -h, --help show this help message and exit\r\n -v, --verbose Display complementary information about file if any.\r\n Stdout will contain logs about the detection process.\r\n -a, --with-alternative\r\n Output complementary possibilities if any. Top-level\r\n JSON WILL be a list.\r\n -n, --normalize Permit to normalize input file. If not set, program\r\n does not write anything.\r\n -m, --minimal Only output the charset detected to STDOUT. Disabling\r\n JSON output.\r\n -r, --replace Replace file when trying to normalize it instead of\r\n creating a new one.\r\n -f, --force Replace file without asking if you are sure, use this\r\n flag with caution.\r\n -t THRESHOLD, --threshold THRESHOLD\r\n Define a custom maximum amount of chaos allowed in\r\n decoded content. 0. <= chaos <= 1.\r\n --version Show version information and exit.\r\n```\r\n\r\n```bash\r\nnormalizer ./data/sample.1.fr.srt\r\n```\r\n\r\nor\r\n\r\n```bash\r\npython -m charset_normalizer ./data/sample.1.fr.srt\r\n```\r\n\r\n🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format.\r\n\r\n```json\r\n{\r\n \"path\": \"/home/default/projects/charset_normalizer/data/sample.1.fr.srt\",\r\n \"encoding\": \"cp1252\",\r\n \"encoding_aliases\": [\r\n \"1252\",\r\n \"windows_1252\"\r\n ],\r\n \"alternative_encodings\": [\r\n \"cp1254\",\r\n \"cp1256\",\r\n \"cp1258\",\r\n \"iso8859_14\",\r\n \"iso8859_15\",\r\n \"iso8859_16\",\r\n \"iso8859_3\",\r\n \"iso8859_9\",\r\n \"latin_1\",\r\n \"mbcs\"\r\n ],\r\n \"language\": \"French\",\r\n \"alphabets\": [\r\n \"Basic Latin\",\r\n \"Latin-1 Supplement\"\r\n ],\r\n \"has_sig_or_bom\": false,\r\n \"chaos\": 0.149,\r\n \"coherence\": 97.152,\r\n \"unicode_path\": null,\r\n \"is_preferred\": true\r\n}\r\n```\r\n\r\n### Python\r\n*Just print out normalized text*\r\n```python\r\nfrom charset_normalizer import from_path\r\n\r\nresults = from_path('./my_subtitle.srt')\r\n\r\nprint(str(results.best()))\r\n```\r\n\r\n*Upgrade your code without effort*\r\n```python\r\nfrom charset_normalizer import detect\r\n```\r\n\r\nThe above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible.\r\n\r\nSee the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/)\r\n\r\n## 😇 Why\r\n\r\nWhen I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a\r\nreliable alternative using a completely different method. Also! I never back down on a good challenge!\r\n\r\nI **don't care** about the **originating charset** encoding, because **two different tables** can\r\nproduce **two identical rendered string.**\r\nWhat I want is to get readable text, the best I can. \r\n\r\nIn a way, **I'm brute forcing text decoding.** How cool is that ? 😎\r\n\r\nDon't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode.\r\n\r\n## 🍰 How\r\n\r\n - Discard all charset encoding table that could not fit the binary content.\r\n - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding.\r\n - Extract matches with the lowest mess detected.\r\n - Additionally, we measure coherence / probe for a language.\r\n\r\n**Wait a minute**, what is noise/mess and coherence according to **YOU ?**\r\n\r\n*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then\r\n**I established** some ground rules about **what is obvious** when **it seems like** a mess.\r\n I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to\r\n improve or rewrite it.\r\n\r\n*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought\r\nthat intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design.\r\n\r\n## ⚡ Known limitations\r\n\r\n - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters))\r\n - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content.\r\n\r\n## ⚠️ About Python EOLs\r\n\r\n**If you are running:**\r\n\r\n- Python >=2.7,<3.5: Unsupported\r\n- Python 3.5: charset-normalizer < 2.1\r\n- Python 3.6: charset-normalizer < 3.1\r\n- Python 3.7: charset-normalizer < 4.0\r\n\r\nUpgrade your Python interpreter as soon as possible.\r\n\r\n## 👤 Contributing\r\n\r\nContributions, issues and feature requests are very much welcome.
\r\nFeel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute.\r\n\r\n## 📝 License\r\n\r\nCopyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
\r\nThis project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed.\r\n\r\nCharacters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/)\r\n\r\n## 💼 For Enterprise\r\n\r\nProfessional support for charset-normalizer is available as part of the [Tidelift\r\nSubscription][1]. Tidelift gives software development teams a single source for\r\npurchasing and maintaining their software, with professional grade assurances\r\nfrom the experts who know it best, while seamlessly integrating with existing\r\ntools.\r\n\r\n[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme\r\n\r\n# Changelog\r\nAll notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\r\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\r\n\r\n## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31)\r\n\r\n### Fixed\r\n- Unintentional memory usage regression when using large payload that match several encoding (#376)\r\n- Regression on some detection case showcased in the documentation (#371)\r\n\r\n### Added\r\n- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife)\r\n\r\n## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22)\r\n\r\n### Changed\r\n- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8\r\n- Improved the general detection reliability based on reports from the community\r\n\r\n## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30)\r\n\r\n### Added\r\n- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer`\r\n- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323)\r\n\r\n### Removed\r\n- (internal) Redundant utils.is_ascii function and unused function is_private_use_only\r\n- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant\r\n\r\n### Changed\r\n- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection\r\n- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8\r\n\r\n### Fixed\r\n- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \\_\\_lt\\_\\_ (#350)\r\n\r\n## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07)\r\n\r\n### Changed\r\n- Typehint for function `from_path` no longer enforce `PathLike` as its first argument\r\n- Minor improvement over the global detection reliability\r\n\r\n### Added\r\n- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries\r\n- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True)\r\n- Explicit support for Python 3.12\r\n\r\n### Fixed\r\n- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289)\r\n\r\n## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06)\r\n\r\n### Added\r\n- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262)\r\n\r\n### Removed\r\n- Support for Python 3.6 (PR #260)\r\n\r\n### Changed\r\n- Optional speedup provided by mypy/c 1.0.1\r\n\r\n## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18)\r\n\r\n### Fixed\r\n- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233)\r\n\r\n### Changed\r\n- Speedup provided by mypy/c 0.990 on Python >= 3.7\r\n\r\n## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20)\r\n\r\n### Added\r\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\r\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\r\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\r\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\r\n\r\n### Changed\r\n- Build with static metadata using 'build' frontend\r\n- Make the language detection stricter\r\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\r\n\r\n### Fixed\r\n- CLI with opt --normalize fail when using full path for files\r\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\r\n- Sphinx warnings when generating the documentation\r\n\r\n### Removed\r\n- Coherence detector no longer return 'Simple English' instead return 'English'\r\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\r\n- Breaking: Method `first()` and `best()` from CharsetMatch\r\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\r\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\r\n- Breaking: Top-level function `normalize`\r\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\r\n- Support for the backport `unicodedata2`\r\n\r\n## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18)\r\n\r\n### Added\r\n- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results\r\n- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES\r\n- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio\r\n\r\n### Changed\r\n- Build with static metadata using 'build' frontend\r\n- Make the language detection stricter\r\n\r\n### Fixed\r\n- CLI with opt --normalize fail when using full path for files\r\n- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it\r\n\r\n### Removed\r\n- Coherence detector no longer return 'Simple English' instead return 'English'\r\n- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese'\r\n\r\n## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21)\r\n\r\n### Added\r\n- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl)\r\n\r\n### Removed\r\n- Breaking: Method `first()` and `best()` from CharsetMatch\r\n- UTF-7 will no longer appear as \"detected\" without a recognized SIG/mark (is unreliable/conflict with ASCII)\r\n\r\n### Fixed\r\n- Sphinx warnings when generating the documentation\r\n\r\n## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15)\r\n\r\n### Changed\r\n- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1\r\n\r\n### Removed\r\n- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches\r\n- Breaking: Top-level function `normalize`\r\n- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch\r\n- Support for the backport `unicodedata2`\r\n\r\n## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19)\r\n\r\n### Deprecated\r\n- Function `normalize` scheduled for removal in 3.0\r\n\r\n### Changed\r\n- Removed useless call to decode in fn is_unprintable (#206)\r\n\r\n### Fixed\r\n- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204)\r\n\r\n## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19)\r\n\r\n### Added\r\n- Output the Unicode table version when running the CLI with `--version` (PR #194)\r\n\r\n### Changed\r\n- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175)\r\n- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183)\r\n\r\n### Fixed\r\n- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175)\r\n- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181)\r\n\r\n### Removed\r\n- Support for Python 3.5 (PR #192)\r\n\r\n### Deprecated\r\n- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194)\r\n\r\n## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12)\r\n\r\n### Fixed\r\n- ASCII miss-detection on rare cases (PR #170) \r\n\r\n## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30)\r\n\r\n### Added\r\n- Explicit support for Python 3.11 (PR #164)\r\n\r\n### Changed\r\n- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165)\r\n\r\n## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04)\r\n\r\n### Fixed\r\n- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154)\r\n\r\n### Changed\r\n- Skipping the language-detection (CD) on ASCII (PR #155)\r\n\r\n## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03)\r\n\r\n### Changed\r\n- Moderating the logging impact (since 2.0.8) for specific environments (PR #147)\r\n\r\n### Fixed\r\n- Wrong logging level applied when setting kwarg `explain` to True (PR #146)\r\n\r\n## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24)\r\n### Changed\r\n- Improvement over Vietnamese detection (PR #126)\r\n- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124)\r\n- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122)\r\n- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129)\r\n- Code style as refactored by Sourcery-AI (PR #131) \r\n- Minor adjustment on the MD around european words (PR #133)\r\n- Remove and replace SRTs from assets / tests (PR #139)\r\n- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135)\r\n- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135)\r\n\r\n### Fixed\r\n- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137)\r\n- Avoid using too insignificant chunk (PR #137)\r\n\r\n### Added\r\n- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135)\r\n- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141)\r\n\r\n## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11)\r\n### Added\r\n- Add support for Kazakh (Cyrillic) language detection (PR #109)\r\n\r\n### Changed\r\n- Further, improve inferring the language from a given single-byte code page (PR #112)\r\n- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116)\r\n- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113)\r\n- Various detection improvement (MD+CD) (PR #117)\r\n\r\n### Removed\r\n- Remove redundant logging entry about detected language(s) (PR #115)\r\n\r\n### Fixed\r\n- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102)\r\n\r\n## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18)\r\n### Fixed\r\n- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100)\r\n- Fix CLI crash when using --minimal output in certain cases (PR #103)\r\n\r\n### Changed\r\n- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101)\r\n\r\n## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14)\r\n### Changed\r\n- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81)\r\n- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82)\r\n- The Unicode detection is slightly improved (PR #93)\r\n- Add syntax sugar \\_\\_bool\\_\\_ for results CharsetMatches list-container (PR #91)\r\n\r\n### Removed\r\n- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92)\r\n\r\n### Fixed\r\n- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95)\r\n- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96)\r\n- The MANIFEST.in was not exhaustive (PR #78)\r\n\r\n## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30)\r\n### Fixed\r\n- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70)\r\n- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68)\r\n- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72)\r\n- Submatch factoring could be wrong in rare edge cases (PR #72)\r\n- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72)\r\n- Fix line endings from CRLF to LF for certain project files (PR #67)\r\n\r\n### Changed\r\n- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76)\r\n- Allow fallback on specified encoding if any (PR #71)\r\n\r\n## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16)\r\n### Changed\r\n- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63)\r\n- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64)\r\n\r\n## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15)\r\n### Fixed\r\n- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) \r\n\r\n### Changed\r\n- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57)\r\n\r\n## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13)\r\n### Fixed\r\n- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55)\r\n- Using explain=False permanently disable the verbose output in the current runtime (PR #47)\r\n- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47)\r\n- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52)\r\n\r\n### Changed\r\n- Public function normalize default args values were not aligned with from_bytes (PR #53)\r\n\r\n### Added\r\n- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47)\r\n\r\n## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02)\r\n### Changed\r\n- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet.\r\n- Accent has been made on UTF-8 detection, should perform rather instantaneous.\r\n- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible.\r\n- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time)\r\n- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+\r\n- utf_7 detection has been reinstated.\r\n\r\n### Removed\r\n- This package no longer require anything when used with Python 3.5 (Dropped cached_property)\r\n- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian.\r\n- The exception hook on UnicodeDecodeError has been removed.\r\n\r\n### Deprecated\r\n- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0\r\n\r\n### Fixed\r\n- The CLI output used the relative path of the file(s). Should be absolute.\r\n\r\n## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28)\r\n### Fixed\r\n- Logger configuration/usage no longer conflict with others (PR #44)\r\n\r\n## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21)\r\n### Removed\r\n- Using standard logging instead of using the package loguru.\r\n- Dropping nose test framework in favor of the maintained pytest.\r\n- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text.\r\n- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version.\r\n- Stop support for UTF-7 that does not contain a SIG.\r\n- Dropping PrettyTable, replaced with pure JSON output in CLI.\r\n\r\n### Fixed\r\n- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process.\r\n- Not searching properly for the BOM when trying utf32/16 parent codec.\r\n\r\n### Changed\r\n- Improving the package final size by compressing frequencies.json.\r\n- Huge improvement over the larges payload.\r\n\r\n### Added\r\n- CLI now produces JSON consumable output.\r\n- Return ASCII if given sequences fit. Given reasonable confidence.\r\n\r\n## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13)\r\n\r\n### Fixed\r\n- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40)\r\n\r\n## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12)\r\n\r\n### Fixed\r\n- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39)\r\n\r\n## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12)\r\n\r\n### Fixed\r\n- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38)\r\n\r\n## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09)\r\n\r\n### Changed\r\n- Amend the previous release to allow prettytable 2.0 (PR #35)\r\n\r\n## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08)\r\n\r\n### Fixed\r\n- Fix error while using the package with a python pre-release interpreter (PR #33)\r\n\r\n### Changed\r\n- Dependencies refactoring, constraints revised.\r\n\r\n### Added\r\n- Add python 3.9 and 3.10 to the supported interpreters\r\n\r\nMIT License\r\n\r\nCopyright (c) 2019 TAHRI Ahmed R.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "encoding",
+ "charset",
+ "charset-detector",
+ "detector",
+ "normalization",
+ "unicode",
+ "chardet",
+ "detect"
+ ],
+ "home_page": "https://github.com/Ousret/charset_normalizer",
+ "author": "Ahmed TAHRI",
+ "author_email": "ahmed.tahri@cloudnursery.dev",
+ "license": "MIT",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "License :: OSI Approved :: MIT License",
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "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 :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Topic :: Text Processing :: Linguistic",
+ "Topic :: Utilities",
+ "Typing :: Typed"
+ ],
+ "requires_python": ">=3.7.0",
+ "project_url": [
+ "Bug Reports, https://github.com/Ousret/charset_normalizer/issues",
+ "Documentation, https://charset-normalizer.readthedocs.io/en/latest"
+ ],
+ "provides_extra": [
+ "unicode_backport"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/9c/b9/79691036d4a8f9857e74d1728b23f34f583b81350a27492edda58d5604e1/fastjsonschema-2.19.1-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0",
+ "hashes": {
+ "sha256": "3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "fastjsonschema",
+ "version": "2.19.1",
+ "summary": "Fastest Python implementation of JSON schema",
+ "description": "===========================\nFast JSON schema for Python\n===========================\n\n|PyPI| |Pythons|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/fastjsonschema.svg\n :alt: PyPI version\n :target: https://pypi.python.org/pypi/fastjsonschema\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/fastjsonschema.svg\n :alt: Supported Python versions\n :target: https://pypi.python.org/pypi/fastjsonschema\n\nSee `documentation `_.\n",
+ "home_page": "https://github.com/horejsek/python-fastjsonschema",
+ "author": "Michal Horejsek",
+ "author_email": "fastjsonschema@horejsek.com",
+ "license": "BSD",
+ "classifier": [
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.3",
+ "Programming Language :: Python :: 3.4",
+ "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",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries :: Python Modules"
+ ],
+ "requires_dist": [
+ "colorama ; extra == 'devel'",
+ "jsonschema ; extra == 'devel'",
+ "json-spec ; extra == 'devel'",
+ "pylint ; extra == 'devel'",
+ "pytest ; extra == 'devel'",
+ "pytest-benchmark ; extra == 'devel'",
+ "pytest-cache ; extra == 'devel'",
+ "validictory ; extra == 'devel'"
+ ],
+ "provides_extra": [
+ "devel"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761",
+ "hashes": {
+ "sha256": "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "h11",
+ "version": "0.14.0",
+ "summary": "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1",
+ "description": "h11\n===\n\n.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master\n :target: https://travis-ci.org/python-hyper/h11\n :alt: Automated test status\n\n.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/python-hyper/h11\n :alt: Test coverage\n\n.. image:: https://readthedocs.org/projects/h11/badge/?version=latest\n :target: http://h11.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\nThis is a little HTTP/1.1 library written from scratch in Python,\nheavily inspired by `hyper-h2 `_.\n\nIt's a \"bring-your-own-I/O\" library; h11 contains no IO code\nwhatsoever. This means you can hook h11 up to your favorite network\nAPI, and that could be anything you want: synchronous, threaded,\nasynchronous, or your own implementation of `RFC 6214\n`_ -- h11 won't judge you.\n(Compare this to the current state of the art, where every time a `new\nnetwork API `_ comes along then someone\ngets to start over reimplementing the entire HTTP protocol from\nscratch.) Cory Benfield made an `excellent blog post describing the\nbenefits of this approach\n`_, or if you like video\nthen here's his `PyCon 2016 talk on the same theme\n`_.\n\nThis also means that h11 is not immediately useful out of the box:\nit's a toolkit for building programs that speak HTTP, not something\nthat could directly replace ``requests`` or ``twisted.web`` or\nwhatever. But h11 makes it much easier to implement something like\n``requests`` or ``twisted.web``.\n\nAt a high level, working with h11 goes like this:\n\n1) First, create an ``h11.Connection`` object to track the state of a\n single HTTP/1.1 connection.\n\n2) When you read data off the network, pass it to\n ``conn.receive_data(...)``; you'll get back a list of objects\n representing high-level HTTP \"events\".\n\n3) When you want to send a high-level HTTP event, create the\n corresponding \"event\" object and pass it to ``conn.send(...)``;\n this will give you back some bytes that you can then push out\n through the network.\n\nFor example, a client might instantiate and then send a\n``h11.Request`` object, then zero or more ``h11.Data`` objects for the\nrequest body (e.g., if this is a POST), and then a\n``h11.EndOfMessage`` to indicate the end of the message. Then the\nserver would then send back a ``h11.Response``, some ``h11.Data``, and\nits own ``h11.EndOfMessage``. If either side violates the protocol,\nyou'll get a ``h11.ProtocolError`` exception.\n\nh11 is suitable for implementing both servers and clients, and has a\npleasantly symmetric API: the events you send as a client are exactly\nthe ones that you receive as a server and vice-versa.\n\n`Here's an example of a tiny HTTP client\n`_\n\nIt also has `a fine manual `_.\n\nFAQ\n---\n\n*Whyyyyy?*\n\nI wanted to play with HTTP in `Curio\n`__ and `Trio\n`__, which at the time didn't have any\nHTTP libraries. So I thought, no big deal, Python has, like, a dozen\ndifferent implementations of HTTP, surely I can find one that's\nreusable. I didn't find one, but I did find Cory's call-to-arms\nblog-post. So I figured, well, fine, if I have to implement HTTP from\nscratch, at least I can make sure no-one *else* has to ever again.\n\n*Should I use it?*\n\nMaybe. You should be aware that it's a very young project. But, it's\nfeature complete and has an exhaustive test-suite and complete docs,\nso the next step is for people to try using it and see how it goes\n:-). If you do then please let us know -- if nothing else we'll want\nto talk to you before making any incompatible changes!\n\n*What are the features/limitations?*\n\nRoughly speaking, it's trying to be a robust, complete, and non-hacky\nimplementation of the first \"chapter\" of the HTTP/1.1 spec: `RFC 7230:\nHTTP/1.1 Message Syntax and Routing\n`_. That is, it mostly focuses on\nimplementing HTTP at the level of taking bytes on and off the wire,\nand the headers related to that, and tries to be anal about spec\nconformance. It doesn't know about higher-level concerns like URL\nrouting, conditional GETs, cross-origin cookie policies, or content\nnegotiation. But it does know how to take care of framing,\ncross-version differences in keep-alive handling, and the \"obsolete\nline folding\" rule, so you can focus your energies on the hard /\ninteresting parts for your application, and it tries to support the\nfull specification in the sense that any useful HTTP/1.1 conformant\napplication should be able to use h11.\n\nIt's pure Python, and has no dependencies outside of the standard\nlibrary.\n\nIt has a test suite with 100.0% coverage for both statements and\nbranches.\n\nCurrently it supports Python 3 (testing on 3.7-3.10) and PyPy 3.\nThe last Python 2-compatible version was h11 0.11.x.\n(Originally it had a Cython wrapper for `http-parser\n`_ and a beautiful nested state\nmachine implemented with ``yield from`` to postprocess the output. But\nI had to take these out -- the new *parser* needs fewer lines-of-code\nthan the old *parser wrapper*, is written in pure Python, uses no\nexotic language syntax, and has more features. It's sad, really; that\nold state machine was really slick. I just need a few sentences here\nto mourn that.)\n\nI don't know how fast it is. I haven't benchmarked or profiled it yet,\nso it's probably got a few pointless hot spots, and I've been trying\nto err on the side of simplicity and robustness instead of\nmicro-optimization. But at the architectural level I tried hard to\navoid fundamentally bad decisions, e.g., I believe that all the\nparsing algorithms remain linear-time even in the face of pathological\ninput like slowloris, and there are no byte-by-byte loops. (I also\nbelieve that it maintains bounded memory usage in the face of\narbitrary/pathological input.)\n\nThe whole library is ~800 lines-of-code. You can read and understand\nthe whole thing in less than an hour. Most of the energy invested in\nthis so far has been spent on trying to keep things simple by\nminimizing special-cases and ad hoc state manipulation; even though it\nis now quite small and simple, I'm still annoyed that I haven't\nfigured out how to make it even smaller and simpler. (Unfortunately,\nHTTP does not lend itself to simplicity.)\n\nThe API is ~feature complete and I don't expect the general outlines\nto change much, but you can't judge an API's ergonomics until you\nactually document and use it, so I'd expect some changes in the\ndetails.\n\n*How do I try it?*\n\n.. code-block:: sh\n\n $ pip install h11\n $ git clone git@github.com:python-hyper/h11\n $ cd h11/examples\n $ python basic-client.py\n\nand go from there.\n\n*License?*\n\nMIT\n\n*Code of conduct?*\n\nContributors are requested to follow our `code of conduct\n`_ in\nall project spaces.\n",
+ "home_page": "https://github.com/python-hyper/h11",
+ "author": "Nathaniel J. Smith",
+ "author_email": "njs@pobox.com",
+ "license": "MIT",
+ "classifier": [
+ "Development Status :: 3 - Alpha",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3 :: Only",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Topic :: Internet :: WWW/HTTP",
+ "Topic :: System :: Networking"
+ ],
+ "requires_dist": [
+ "typing-extensions ; python_version < \"3.8\""
+ ],
+ "requires_python": ">=3.7"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/20/9f/bc63f0f0737ad7a60800bfd472a4836661adae21f9c2535f3957b1e54ceb/jedi-0.19.1-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0",
+ "hashes": {
+ "sha256": "e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "jedi",
+ "version": "0.19.1",
+ "platform": [
+ "any"
+ ],
+ "summary": "An autocompletion tool for Python that can be used for text editors.",
+ "description": "####################################################################################\nJedi - an awesome autocompletion, static analysis and refactoring library for Python\n####################################################################################\n\n.. image:: http://isitmaintained.com/badge/open/davidhalter/jedi.svg\n :target: https://github.com/davidhalter/jedi/issues\n :alt: The percentage of open issues and pull requests\n\n.. image:: http://isitmaintained.com/badge/resolution/davidhalter/jedi.svg\n :target: https://github.com/davidhalter/jedi/issues\n :alt: The resolution time is the median time an issue or pull request stays open.\n\n.. image:: https://github.com/davidhalter/jedi/workflows/ci/badge.svg?branch=master\n :target: https://github.com/davidhalter/jedi/actions\n :alt: Tests\n\n.. image:: https://pepy.tech/badge/jedi\n :target: https://pepy.tech/project/jedi\n :alt: PyPI Downloads\n\n\nJedi is a static analysis tool for Python that is typically used in\nIDEs/editors plugins. Jedi has a focus on autocompletion and goto\nfunctionality. Other features include refactoring, code search and finding\nreferences.\n\nJedi has a simple API to work with. There is a reference implementation as a\n`VIM-Plugin `_. Autocompletion in your\nREPL is also possible, IPython uses it natively and for the CPython REPL you\ncan install it. Jedi is well tested and bugs should be rare.\n\nJedi can currently be used with the following editors/projects:\n\n- Vim (jedi-vim_, YouCompleteMe_, deoplete-jedi_, completor.vim_)\n- `Visual Studio Code`_ (via `Python Extension `_)\n- Emacs (Jedi.el_, company-mode_, elpy_, anaconda-mode_, ycmd_)\n- Sublime Text (SublimeJEDI_ [ST2 + ST3], anaconda_ [only ST3])\n- TextMate_ (Not sure if it's actually working)\n- Kate_ version 4.13+ supports it natively, you have to enable it, though. [`see\n `_]\n- Atom_ (autocomplete-python-jedi_)\n- `GNOME Builder`_ (with support for GObject Introspection)\n- Gedit (gedi_)\n- wdb_ - Web Debugger\n- `Eric IDE`_\n- `IPython 6.0.0+ `_\n- `xonsh shell `_ has `jedi extension `_\n\nand many more!\n\nThere are a few language servers that use Jedi:\n\n- `jedi-language-server `_\n- `python-language-server `_ (currently unmaintained)\n- `python-lsp-server `_ (fork from python-language-server)\n- `anakin-language-server `_\n\nHere are some pictures taken from jedi-vim_:\n\n.. image:: https://github.com/davidhalter/jedi/raw/master/docs/_screenshots/screenshot_complete.png\n\nCompletion for almost anything:\n\n.. image:: https://github.com/davidhalter/jedi/raw/master/docs/_screenshots/screenshot_function.png\n\nDocumentation:\n\n.. image:: https://github.com/davidhalter/jedi/raw/master/docs/_screenshots/screenshot_pydoc.png\n\n\nGet the latest version from `github `_\n(master branch should always be kind of stable/working).\n\nDocs are available at `https://jedi.readthedocs.org/en/latest/\n`_. Pull requests with enhancements\nand/or fixes are awesome and most welcome. Jedi uses `semantic versioning\n`_.\n\nIf you want to stay **up-to-date** with releases, please **subscribe** to this\nmailing list: https://groups.google.com/g/jedi-announce. To subscribe you can\nsimply send an empty email to ``jedi-announce+subscribe@googlegroups.com``.\n\nIssues & Questions\n==================\n\nYou can file issues and questions in the `issue tracker\n`. Alternatively you can also ask on\n`Stack Overflow `_ with\nthe label ``python-jedi``.\n\nInstallation\n============\n\n`Check out the docs `_.\n\nFeatures and Limitations\n========================\n\nJedi's features are listed here:\n`Features `_.\n\nYou can run Jedi on Python 3.6+ but it should also\nunderstand code that is older than those versions. Additionally you should be\nable to use `Virtualenvs `_\nvery well.\n\nTips on how to use Jedi efficiently can be found `here\n`_.\n\nAPI\n---\n\nYou can find a comprehensive documentation for the\n`API here `_.\n\nAutocompletion / Goto / Documentation\n-------------------------------------\n\nThere are the following commands:\n\n- ``jedi.Script.goto``\n- ``jedi.Script.infer``\n- ``jedi.Script.help``\n- ``jedi.Script.complete``\n- ``jedi.Script.get_references``\n- ``jedi.Script.get_signatures``\n- ``jedi.Script.get_context``\n\nThe returned objects are very powerful and are really all you might need.\n\nAutocompletion in your REPL (IPython, etc.)\n-------------------------------------------\n\nJedi is a dependency of IPython. Autocompletion in IPython with Jedi is\ntherefore possible without additional configuration.\n\nHere is an `example video `_ how REPL completion\ncan look like.\nFor the ``python`` shell you can enable tab completion in a `REPL\n`_.\n\nStatic Analysis\n---------------\n\nFor a lot of forms of static analysis, you can try to use\n``jedi.Script(...).get_names``. It will return a list of names that you can\nthen filter and work with. There is also a way to list the syntax errors in a\nfile: ``jedi.Script.get_syntax_errors``.\n\n\nRefactoring\n-----------\n\nJedi supports the following refactorings:\n\n- ``jedi.Script.inline``\n- ``jedi.Script.rename``\n- ``jedi.Script.extract_function``\n- ``jedi.Script.extract_variable``\n\nCode Search\n-----------\n\nThere is support for module search with ``jedi.Script.search``, and project\nsearch for ``jedi.Project.search``. The way to search is either by providing a\nname like ``foo`` or by using dotted syntax like ``foo.bar``. Additionally you\ncan provide the API type like ``class foo.bar.Bar``. There are also the\nfunctions ``jedi.Script.complete_search`` and ``jedi.Project.complete_search``.\n\nDevelopment\n===========\n\nThere's a pretty good and extensive `development documentation\n`_.\n\nTesting\n=======\n\nThe test suite uses ``pytest``::\n\n pip install pytest\n\nIf you want to test only a specific Python version (e.g. Python 3.8), it is as\neasy as::\n\n python3.8 -m pytest\n\nFor more detailed information visit the `testing documentation\n`_.\n\nAcknowledgements\n================\n\nThanks a lot to all the\n`contributors `_!\n\n\n.. _jedi-vim: https://github.com/davidhalter/jedi-vim\n.. _youcompleteme: https://github.com/ycm-core/YouCompleteMe\n.. _deoplete-jedi: https://github.com/zchee/deoplete-jedi\n.. _completor.vim: https://github.com/maralla/completor.vim\n.. _Jedi.el: https://github.com/tkf/emacs-jedi\n.. _company-mode: https://github.com/syohex/emacs-company-jedi\n.. _elpy: https://github.com/jorgenschaefer/elpy\n.. _anaconda-mode: https://github.com/proofit404/anaconda-mode\n.. _ycmd: https://github.com/abingham/emacs-ycmd\n.. _sublimejedi: https://github.com/srusskih/SublimeJEDI\n.. _anaconda: https://github.com/DamnWidget/anaconda\n.. _wdb: https://github.com/Kozea/wdb\n.. _TextMate: https://github.com/lawrenceakka/python-jedi.tmbundle\n.. _Kate: https://kate-editor.org\n.. _Atom: https://atom.io/\n.. _autocomplete-python-jedi: https://atom.io/packages/autocomplete-python-jedi\n.. _GNOME Builder: https://wiki.gnome.org/Apps/Builder\n.. _Visual Studio Code: https://code.visualstudio.com/\n.. _gedi: https://github.com/isamert/gedi\n.. _Eric IDE: https://eric-ide.python-projects.org\n\n\n.. :changelog:\n\nChangelog\n---------\n\nUnreleased\n++++++++++\n\n0.19.1 (2023-10-02)\n+++++++++++++++++++\n\n- Python 3.12 support (Thanks Peter!)\n\n0.19.0 (2023-07-29)\n+++++++++++++++++++\n\n- Python 3.11 support\n- Massive improvements in performance for ``Interpreter`` (e.g. IPython) users.\n This especially affects ``pandas`` users with large datasets.\n- Add ``jedi.settings.allow_unsafe_interpreter_executions`` to make it easier\n for IPython users to avoid unsafe executions.\n\n0.18.2 (2022-11-21)\n+++++++++++++++++++\n\n- Added dataclass-equivalent for attrs.define\n- Find fixtures from Pytest entrypoints; Examples of pytest plugins installed\n like this are pytest-django, pytest-sugar and Faker.\n- Fixed Project.search, when a venv was involved, which is why for example\n `:Pyimport django.db` did not work in some cases in jedi-vim.\n- And many smaller bugfixes\n\n0.18.1 (2021-11-17)\n+++++++++++++++++++\n\n- Implict namespaces are now a separate types in ``Name().type``\n- Python 3.10 support\n- Mostly bugfixes\n\n0.18.0 (2020-12-25)\n+++++++++++++++++++\n\n- Dropped Python 2 and Python 3.5\n- Using ``pathlib.Path()`` as an output instead of ``str`` in most places:\n - ``Project.path``\n - ``Script.path``\n - ``Definition.module_path``\n - ``Refactoring.get_renames``\n - ``Refactoring.get_changed_files``\n- Functions with ``@property`` now return ``property`` instead of ``function``\n in ``Name().type``\n- Started using annotations\n- Better support for the walrus operator\n- Project attributes are now read accessible\n- Removed all deprecations\n\nThis is likely going to be the last minor release before 1.0.\n\n0.17.2 (2020-07-17)\n+++++++++++++++++++\n\n- Added an option to pass environment variables to ``Environment``\n- ``Project(...).path`` exists now\n- Support for Python 3.9\n- A few bugfixes\n\nThis will be the last release that supports Python 2 and Python 3.5.\n``0.18.0`` will be Python 3.6+.\n\n0.17.1 (2020-06-20)\n+++++++++++++++++++\n\n- Django ``Model`` meta class support\n- Django Manager support (completion on Managers/QuerySets)\n- Added Django Stubs to Jedi, thanks to all contributors of the\n `Django Stubs `_ project\n- Added ``SyntaxError.get_message``\n- Python 3.9 support\n- Bugfixes (mostly towards Generics)\n\n0.17.0 (2020-04-14)\n+++++++++++++++++++\n\n- Added ``Project`` support. This allows a user to specify which folders Jedi\n should work with.\n- Added support for Refactoring. The following refactorings have been\n implemented: ``Script.rename``, ``Script.inline``,\n ``Script.extract_variable`` and ``Script.extract_function``.\n- Added ``Script.get_syntax_errors`` to display syntax errors in the current\n script.\n- Added code search capabilities both for individual files and projects. The\n new functions are ``Project.search``, ``Project.complete_search``,\n ``Script.search`` and ``Script.complete_search``.\n- Added ``Script.help`` to make it easier to display a help window to people.\n Now returns pydoc information as well for Python keywords/operators. This\n means that on the class keyword it will now return the docstring of Python's\n builtin function ``help('class')``.\n- The API documentation is now way more readable and complete. Check it out\n under https://jedi.readthedocs.io. A lot of it has been rewritten.\n- Removed Python 3.4 support\n- Many bugfixes\n\nThis is likely going to be the last minor version that supports Python 2 and\nPython3.5. Bugfixes will be provided in 0.17.1+. The next minor/major version\nwill probably be Jedi 1.0.0.\n\n0.16.0 (2020-01-26)\n+++++++++++++++++++\n\n- **Added** ``Script.get_context`` to get information where you currently are.\n- Completions/type inference of **Pytest fixtures**.\n- Tensorflow, Numpy and Pandas completions should now be about **4-10x faster**\n after the first time they are used.\n- Dict key completions are working now. e.g. ``d = {1000: 3}; d[10`` will\n expand to ``1000``.\n- Completion for \"proxies\" works now. These are classes that have a\n ``__getattr__(self, name)`` method that does a ``return getattr(x, name)``.\n after loading them initially.\n- Goto on a function/attribute in a class now goes to the definition in its\n super class.\n- Big **Script API Changes**:\n - The line and column parameters of ``jedi.Script`` are now deprecated\n - ``completions`` deprecated, use ``complete`` instead\n - ``goto_assignments`` deprecated, use ``goto`` instead\n - ``goto_definitions`` deprecated, use ``infer`` instead\n - ``call_signatures`` deprecated, use ``get_signatures`` instead\n - ``usages`` deprecated, use ``get_references`` instead\n - ``jedi.names`` deprecated, use ``jedi.Script(...).get_names()``\n- ``BaseName.goto_assignments`` renamed to ``BaseName.goto``\n- Add follow_imports to ``Name.goto``. Now its signature matches\n ``Script.goto``.\n- **Python 2 support deprecated**. For this release it is best effort. Python 2\n has reached the end of its life and now it's just about a smooth transition.\n Bugs for Python 2 will not be fixed anymore and a third of the tests are\n already skipped.\n- Removed ``settings.no_completion_duplicates``. It wasn't tested and nobody\n was probably using it anyway.\n- Removed ``settings.use_filesystem_cache`` and\n ``settings.additional_dynamic_modules``, they have no usage anymore. Pretty\n much nobody was probably using them.\n\n0.15.2 (2019-12-20)\n+++++++++++++++++++\n\n- Signatures are now detected a lot better\n- Add fuzzy completions with ``Script(...).completions(fuzzy=True)``\n- Files bigger than one MB (about 20kLOC) get cropped to avoid getting\n stuck completely.\n- Many small Bugfixes\n- A big refactoring around contexts/values\n\n0.15.1 (2019-08-13)\n+++++++++++++++++++\n\n- Small bugfix and removal of a print statement\n\n0.15.0 (2019-08-11)\n+++++++++++++++++++\n\n- Added file path completions, there's a **new** ``Completion.type`` now:\n ``path``. Example: ``'/ho`` -> ``'/home/``\n- ``*args``/``**kwargs`` resolving. If possible Jedi replaces the parameters\n with the actual alternatives.\n- Better support for enums/dataclasses\n- When using Interpreter, properties are now executed, since a lot of people\n have complained about this. Discussion in #1299, #1347.\n\nNew APIs:\n\n- ``Name.get_signatures() -> List[Signature]``. Signatures are similar to\n ``CallSignature``. ``Name.params`` is therefore deprecated.\n- ``Signature.to_string()`` to format signatures.\n- ``Signature.params -> List[ParamName]``, ParamName has the\n following additional attributes ``infer_default()``, ``infer_annotation()``,\n ``to_string()``, and ``kind``.\n- ``Name.execute() -> List[Name]``, makes it possible to infer\n return values of functions.\n\n\n0.14.1 (2019-07-13)\n+++++++++++++++++++\n\n- CallSignature.index should now be working a lot better\n- A couple of smaller bugfixes\n\n0.14.0 (2019-06-20)\n+++++++++++++++++++\n\n- Added ``goto_*(prefer_stubs=True)`` as well as ``goto_*(prefer_stubs=True)``\n- Stubs are used now for type inference\n- Typeshed is used for better type inference\n- Reworked Name.full_name, should have more correct return values\n\n0.13.3 (2019-02-24)\n+++++++++++++++++++\n\n- Fixed an issue with embedded Python, see https://github.com/davidhalter/jedi-vim/issues/870\n\n0.13.2 (2018-12-15)\n+++++++++++++++++++\n\n- Fixed a bug that led to Jedi spawning a lot of subprocesses.\n\n0.13.1 (2018-10-02)\n+++++++++++++++++++\n\n- Bugfixes, because tensorflow completions were still slow.\n\n0.13.0 (2018-10-02)\n+++++++++++++++++++\n\n- A small release. Some bug fixes.\n- Remove Python 3.3 support. Python 3.3 support has been dropped by the Python\n foundation.\n- Default environments are now using the same Python version as the Python\n process. In 0.12.x, we used to load the latest Python version on the system.\n- Added ``include_builtins`` as a parameter to usages.\n- ``goto_assignments`` has a new ``follow_builtin_imports`` parameter that\n changes the previous behavior slightly.\n\n0.12.1 (2018-06-30)\n+++++++++++++++++++\n\n- This release forces you to upgrade parso. If you don't, nothing will work\n anymore. Otherwise changes should be limited to bug fixes. Unfortunately Jedi\n still uses a few internals of parso that make it hard to keep compatibility\n over multiple releases. Parso >=0.3.0 is going to be needed.\n\n0.12.0 (2018-04-15)\n+++++++++++++++++++\n\n- Virtualenv/Environment support\n- F-String Completion/Goto Support\n- Cannot crash with segfaults anymore\n- Cleaned up import logic\n- Understand async/await and autocomplete it (including async generators)\n- Better namespace completions\n- Passing tests for Windows (including CI for Windows)\n- Remove Python 2.6 support\n\n0.11.1 (2017-12-14)\n+++++++++++++++++++\n\n- Parso update - the caching layer was broken\n- Better usages - a lot of internal code was ripped out and improved.\n\n0.11.0 (2017-09-20)\n+++++++++++++++++++\n\n- Split Jedi's parser into a separate project called ``parso``.\n- Avoiding side effects in REPL completion.\n- Numpy docstring support should be much better.\n- Moved the `settings.*recursion*` away, they are no longer usable.\n\n0.10.2 (2017-04-05)\n+++++++++++++++++++\n\n- Python Packaging sucks. Some files were not included in 0.10.1.\n\n0.10.1 (2017-04-05)\n+++++++++++++++++++\n\n- Fixed a few very annoying bugs.\n- Prepared the parser to be factored out of Jedi.\n\n0.10.0 (2017-02-03)\n+++++++++++++++++++\n\n- Actual semantic completions for the complete Python syntax.\n- Basic type inference for ``yield from`` PEP 380.\n- PEP 484 support (most of the important features of it). Thanks Claude! (@reinhrst)\n- Added ``get_line_code`` to ``Name`` and ``Completion`` objects.\n- Completely rewritten the type inference engine.\n- A new and better parser for (fast) parsing diffs of Python code.\n\n0.9.0 (2015-04-10)\n++++++++++++++++++\n\n- The import logic has been rewritten to look more like Python's. There is now\n an ``InferState.modules`` import cache, which resembles ``sys.modules``.\n- Integrated the parser of 2to3. This will make refactoring possible. It will\n also be possible to check for error messages (like compiling an AST would give)\n in the future.\n- With the new parser, the type inference also completely changed. It's now\n simpler and more readable.\n- Completely rewritten REPL completion.\n- Added ``jedi.names``, a command to do static analysis. Thanks to that\n sourcegraph guys for sponsoring this!\n- Alpha version of the linter.\n\n\n0.8.1 (2014-07-23)\n+++++++++++++++++++\n\n- Bugfix release, the last release forgot to include files that improve\n autocompletion for builtin libraries. Fixed.\n\n0.8.0 (2014-05-05)\n+++++++++++++++++++\n\n- Memory Consumption for compiled modules (e.g. builtins, sys) has been reduced\n drastically. Loading times are down as well (it takes basically as long as an\n import).\n- REPL completion is starting to become usable.\n- Various small API changes. Generally this release focuses on stability and\n refactoring of internal APIs.\n- Introducing operator precedence, which makes calculating correct Array\n indices and ``__getattr__`` strings possible.\n\n0.7.0 (2013-08-09)\n++++++++++++++++++\n\n- Switched from LGPL to MIT license.\n- Added an Interpreter class to the API to make autocompletion in REPL\n possible.\n- Added autocompletion support for namespace packages.\n- Add sith.py, a new random testing method.\n\n0.6.0 (2013-05-14)\n++++++++++++++++++\n\n- Much faster parser with builtin part caching.\n- A test suite, thanks @tkf.\n\n0.5 versions (2012)\n+++++++++++++++++++\n\n- Initial development.\n\n\n",
+ "keywords": [
+ "python",
+ "completion",
+ "refactoring",
+ "vim"
+ ],
+ "home_page": "https://github.com/davidhalter/jedi",
+ "author": "David Halter",
+ "author_email": "davidhalter88@gmail.com",
+ "maintainer": "David Halter",
+ "maintainer_email": "davidhalter88@gmail.com",
+ "license": "MIT",
+ "classifier": [
+ "Development Status :: 4 - Beta",
+ "Environment :: Plugins",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python :: 3",
+ "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",
+ "Programming Language :: Python :: 3.12",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Topic :: Text Editors :: Integrated Development Environments (IDE)",
+ "Topic :: Utilities"
+ ],
+ "requires_dist": [
+ "parso (<0.9.0,>=0.8.3)",
+ "Jinja2 (==2.11.3) ; extra == 'docs'",
+ "MarkupSafe (==1.1.1) ; extra == 'docs'",
+ "Pygments (==2.8.1) ; extra == 'docs'",
+ "alabaster (==0.7.12) ; extra == 'docs'",
+ "babel (==2.9.1) ; extra == 'docs'",
+ "chardet (==4.0.0) ; extra == 'docs'",
+ "commonmark (==0.8.1) ; extra == 'docs'",
+ "docutils (==0.17.1) ; extra == 'docs'",
+ "future (==0.18.2) ; extra == 'docs'",
+ "idna (==2.10) ; extra == 'docs'",
+ "imagesize (==1.2.0) ; extra == 'docs'",
+ "mock (==1.0.1) ; extra == 'docs'",
+ "packaging (==20.9) ; extra == 'docs'",
+ "pyparsing (==2.4.7) ; extra == 'docs'",
+ "pytz (==2021.1) ; extra == 'docs'",
+ "readthedocs-sphinx-ext (==2.1.4) ; extra == 'docs'",
+ "recommonmark (==0.5.0) ; extra == 'docs'",
+ "requests (==2.25.1) ; extra == 'docs'",
+ "six (==1.15.0) ; extra == 'docs'",
+ "snowballstemmer (==2.1.0) ; extra == 'docs'",
+ "sphinx-rtd-theme (==0.4.3) ; extra == 'docs'",
+ "sphinx (==1.8.5) ; extra == 'docs'",
+ "sphinxcontrib-serializinghtml (==1.1.4) ; extra == 'docs'",
+ "sphinxcontrib-websupport (==1.2.4) ; extra == 'docs'",
+ "urllib3 (==1.26.4) ; extra == 'docs'",
+ "flake8 (==5.0.4) ; extra == 'qa'",
+ "mypy (==0.971) ; extra == 'qa'",
+ "types-setuptools (==67.2.0.1) ; extra == 'qa'",
+ "Django ; extra == 'testing'",
+ "attrs ; extra == 'testing'",
+ "colorama ; extra == 'testing'",
+ "docopt ; extra == 'testing'",
+ "pytest (<7.0.0) ; extra == 'testing'"
+ ],
+ "requires_python": ">=3.6",
+ "project_url": [
+ "Documentation, https://jedi.readthedocs.io/en/latest/"
+ ],
+ "provides_extra": [
+ "docs",
+ "qa",
+ "testing"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c",
+ "hashes": {
+ "sha256": "87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "jsonschema-specifications",
+ "version": "2023.12.1",
+ "summary": "The JSON Schema meta-schemas and vocabularies, exposed as a Registry",
+ "description": "=============================\n``jsonschema-specifications``\n=============================\n\n|PyPI| |Pythons| |CI| |ReadTheDocs|\n\nJSON support files from the `JSON Schema Specifications `_ (metaschemas, vocabularies, etc.), packaged for runtime access from Python as a `referencing-based Schema Registry `_.\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema-specifications.svg\n :alt: PyPI version\n :target: https://pypi.org/project/jsonschema-specifications/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema-specifications.svg\n :alt: Supported Python versions\n :target: https://pypi.org/project/jsonschema-specifications/\n\n.. |CI| image:: https://github.com/python-jsonschema/jsonschema-specifications/workflows/CI/badge.svg\n :alt: Build status\n :target: https://github.com/python-jsonschema/jsonschema-specifications/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/jsonschema-specifications/badge/?version=stable&style=flat\n :alt: ReadTheDocs status\n :target: https://jsonschema-specifications.readthedocs.io/en/stable/\n",
+ "description_content_type": "text/x-rst",
+ "keywords": [
+ "data validation",
+ "json",
+ "json schema",
+ "jsonschema",
+ "validation"
+ ],
+ "author": "Julian Berman",
+ "author_email": "Julian+jsonschema-specifications@GrayVines.com",
+ "license": "MIT",
+ "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.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 :: File Formats :: JSON :: JSON Schema"
+ ],
+ "requires_dist": [
+ "importlib-resources>=1.4.0; python_version < '3.9'",
+ "referencing>=0.31.0"
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Documentation, https://jsonschema-specifications.readthedocs.io/",
+ "Homepage, https://github.com/python-jsonschema/jsonschema-specifications",
+ "Issues, https://github.com/python-jsonschema/jsonschema-specifications/issues/",
+ "Funding, https://github.com/sponsors/Julian",
+ "Tidelift, https://tidelift.com/subscription/pkg/pypi-jsonschema-specifications?utm_source=pypi-jsonschema-specifications&utm_medium=referral&utm_campaign=pypi-link",
+ "Source, https://github.com/python-jsonschema/jsonschema-specifications"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/f0/74/c95adcdf032956d9ef6c89a9b8a5152bf73915f8c633f3e3d88d06bd699c/mistune-3.0.2-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205",
+ "hashes": {
+ "sha256": "71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "mistune",
+ "version": "3.0.2",
+ "summary": "A sane and fast Markdown parser with useful plugins and renderers",
+ "description": "Mistune v3\n==========\n\nA fast yet powerful Python Markdown parser with renderers and plugins.\n\nOverview\n--------\n\nConvert Markdown to HTML with ease:\n\n.. code-block:: python\n\n import mistune\n mistune.html(your_markdown_text)\n\nUseful Links\n------------\n\n1. GitHub: https://github.com/lepture/mistune\n2. Docs: https://mistune.lepture.com/\n\nLicense\n-------\n\nMistune is licensed under BSD. Please see LICENSE for licensing details.\n",
+ "description_content_type": "text/x-rst",
+ "author_email": "Hsiaoming Yang ",
+ "license": "BSD-3-Clause",
+ "classifier": [
+ "Development Status :: 4 - Beta",
+ "Environment :: Console",
+ "Environment :: Web Environment",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "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 :: 3.11",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Topic :: Text Processing :: Markup"
+ ],
+ "requires_python": ">=3.7",
+ "project_url": [
+ "Documentation, https://mistune.lepture.com/",
+ "Source, https://github.com/lepture/mistune",
+ "Donate, https://github.com/sponsors/lepture"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/66/e8/00517a23d3eeaed0513e718fbc94aab26eaa1758f5690fc8578839791c79/nbclient-0.10.0-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f",
+ "hashes": {
+ "sha256": "f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "nbclient",
+ "version": "0.10.0",
+ "summary": "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor.",
+ "description": "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jupyter/nbclient/main?filepath=binder%2Frun_nbclient.ipynb)\n[![Build Status](https://github.com/jupyter/nbclient/workflows/CI/badge.svg)](https://github.com/jupyter/nbclient/actions)\n[![Documentation Status](https://readthedocs.org/projects/nbclient/badge/?version=latest)](https://nbclient.readthedocs.io/en/latest/?badge=latest)\n[![Python 3.7](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/)\n[![Python 3.8](https://img.shields.io/badge/python-3.8-blue.svg)](https://www.python.org/downloads/release/python-380/)\n[![Python 3.9](https://img.shields.io/badge/python-3.9-blue.svg)](https://www.python.org/downloads/release/python-390/)\n[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)\n[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\n# nbclient\n\n**NBClient** lets you **execute** notebooks.\n\nA client library for programmatic notebook execution, **NBClient** is a tool for running Jupyter Notebooks in\ndifferent execution contexts, including the command line.\n\n## Interactive Demo\n\nTo demo **NBClient** interactively, click this Binder badge to start the demo:\n\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jupyter/nbclient/main?filepath=binder%2Frun_nbclient.ipynb)\n\n## Installation\n\nIn a terminal, run:\n\n```\npython3 -m pip install nbclient\n```\n\n## Documentation\n\nSee [ReadTheDocs](https://nbclient.readthedocs.io/en/latest/) for more in-depth details about the project and the\n[API Reference](https://nbclient.readthedocs.io/en/latest/reference/index.html).\n\n## Python Version Support\n\nThis library currently supports Python 3.6+ versions. As minor Python\nversions are officially sunset by the Python org, nbclient will similarly\ndrop support in the future.\n\n## Origins\n\nThis library used to be part of the [nbconvert](https://nbconvert.readthedocs.io/en/latest/) project. NBClient extracted nbconvert's `ExecutePreprocessor`into its own library for easier updating and importing by downstream libraries and applications.\n\n## Relationship to JupyterClient\n\nNBClient and JupyterClient are distinct projects.\n\n`jupyter_client` is a client library for the jupyter protocol. Specifically, `jupyter_client` provides the Python API\nfor starting, managing and communicating with Jupyter kernels.\n\nWhile, nbclient allows notebooks to be run in different execution contexts.\n\n## About the Jupyter Development Team\n\nThe Jupyter Development Team is the set of all contributors to the Jupyter project.\nThis includes all of the Jupyter subprojects.\n\nThe core team that coordinates development on GitHub can be found here:\nhttps://github.com/jupyter/.\n\n## Our Copyright Policy\n\nJupyter uses a shared copyright model. Each contributor maintains copyright\nover their contributions to Jupyter. But, it is important to note that these\ncontributions are typically only changes to the repositories. Thus, the Jupyter\nsource code, in its entirety is not the copyright of any single person or\ninstitution. Instead, it is the collective copyright of the entire Jupyter\nDevelopment Team. If individual contributors want to maintain a record of what\nchanges/contributions they have specific copyright on, they should indicate\ntheir copyright in the commit message of the change, when they commit the\nchange to one of the Jupyter repositories.\n\nWith this in mind, the following banner should be used in any source code file\nto indicate the copyright and license terms:\n\n```\n# Copyright (c) Jupyter Development Team.\n# Distributed under the terms of the Modified BSD License.\n```\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "executor",
+ "jupyter",
+ "notebook",
+ "pipeline"
+ ],
+ "author_email": "Jupyter Development Team ",
+ "license": "BSD 3-Clause License\n\nCopyright (c) 2020-, Jupyter Development Team\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
+ "classifier": [
+ "Intended Audience :: Developers",
+ "Intended Audience :: Science/Research",
+ "Intended Audience :: System Administrators",
+ "License :: OSI Approved :: BSD License",
+ "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"
+ ],
+ "requires_dist": [
+ "jupyter-client>=6.1.12",
+ "jupyter-core!=5.0.*,>=4.12",
+ "nbformat>=5.1",
+ "traitlets>=5.4",
+ "pre-commit; extra == 'dev'",
+ "autodoc-traits; extra == 'docs'",
+ "mock; extra == 'docs'",
+ "moto; extra == 'docs'",
+ "myst-parser; extra == 'docs'",
+ "nbclient[test]; extra == 'docs'",
+ "sphinx-book-theme; extra == 'docs'",
+ "sphinx>=1.7; extra == 'docs'",
+ "sphinxcontrib-spelling; extra == 'docs'",
+ "flaky; extra == 'test'",
+ "ipykernel>=6.19.3; extra == 'test'",
+ "ipython; extra == 'test'",
+ "ipywidgets; extra == 'test'",
+ "nbconvert>=7.0.0; extra == 'test'",
+ "pytest-asyncio; extra == 'test'",
+ "pytest-cov>=4.0; extra == 'test'",
+ "pytest<8,>=7.0; extra == 'test'",
+ "testpath; extra == 'test'",
+ "xmltodict; extra == 'test'"
+ ],
+ "requires_python": ">=3.8.0",
+ "project_url": [
+ "Documentation, https://nbclient.readthedocs.io",
+ "Funding, https://numfocus.org/",
+ "Homepage, https://jupyter.org",
+ "Source, https://github.com/jupyter/nbclient",
+ "Tracker, https://github.com/jupyter/nbclient/issues"
+ ],
+ "provides_extra": [
+ "dev",
+ "docs",
+ "test"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc",
+ "hashes": {
+ "sha256": "93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "pandocfilters",
+ "version": "1.5.1",
+ "summary": "Utilities for writing pandoc filters in python",
+ "description": "pandocfilters\n=============\n\nA python module for writing `pandoc `_ filters\n\nWhat are pandoc filters?\n--------------------------\nPandoc filters\nare pipes that read a JSON serialization of the Pandoc AST\nfrom stdin, transform it in some way, and write it to stdout.\nThey can be used with pandoc (>= 1.12) either using pipes ::\n\n pandoc -t json -s | ./caps.py | pandoc -f json\n\nor using the ``--filter`` (or ``-F``) command-line option. ::\n\n pandoc --filter ./caps.py -s\n\nFor more on pandoc filters, see the pandoc documentation under ``--filter``\nand `the tutorial on writing filters`__.\n\n__ http://johnmacfarlane.net/pandoc/scripting.html\n\nFor an alternative library for writing pandoc filters, with\na more \"Pythonic\" design, see `panflute`__.\n\n__ https://github.com/sergiocorreia/panflute\n\nCompatibility\n----------------\nPandoc 1.16 introduced link and image `attributes` to the existing\n`caption` and `target` arguments, requiring a change in pandocfilters\nthat breaks backwards compatibility. Consequently, you should use:\n\n- pandocfilters version <= 1.2.4 for pandoc versions 1.12--1.15, and\n- pandocfilters version >= 1.3.0 for pandoc versions >= 1.16.\n\nPandoc 1.17.3 (pandoc-types 1.17.*) introduced a new JSON format.\npandocfilters 1.4.0 should work with both the old and the new\nformat.\n\nInstalling\n--------------\nRun this inside the present directory::\n\n python setup.py install\n\nOr install from PyPI::\n\n pip install pandocfilters\n\nAvailable functions\n----------------------\nThe main functions ``pandocfilters`` exports are\n\n- ``walk(x, action, format, meta)``\n\n Walk a tree, applying an action to every object. Returns a modified\n tree. An action is a function of the form\n ``action(key, value, format, meta)``, where:\n\n - ``key`` is the type of the pandoc object (e.g. 'Str', 'Para')\n - ``value`` is the contents of the object (e.g. a string for 'Str', a list of\n inline elements for 'Para')\n - ``format`` is the target output format (as supplied by the\n ``format`` argument of ``walk``)\n - ``meta`` is the document's metadata\n\n The return of an action is either:\n\n - ``None``: this means that the object should remain unchanged\n - a pandoc object: this will replace the original object\n - a list of pandoc objects: these will replace the original object;\n the list is merged with the neighbors of the original objects\n (spliced into the list the original object belongs to); returning\n an empty list deletes the object\n\n- ``toJSONFilter(action)``\n\n Like ``toJSONFilters``, but takes a single action as argument.\n\n- ``toJSONFilters(actions)``\n\n Generate a JSON-to-JSON filter from stdin to stdout\n\n The filter:\n\n - reads a JSON-formatted pandoc document from stdin\n - transforms it by walking the tree and performing the actions\n - returns a new JSON-formatted pandoc document to stdout\n\n The argument ``actions`` is a list of functions of the form\n ``action(key, value, format, meta)``, as described in more detail\n under ``walk``.\n\n This function calls ``applyJSONFilters``, with the ``format``\n argument provided by the first command-line argument, if present.\n (Pandoc sets this by default when calling filters.)\n\n- ``applyJSONFilters(actions, source, format=\"\")``\n\n Walk through JSON structure and apply filters\n\n This:\n\n - reads a JSON-formatted pandoc document from a source string\n - transforms it by walking the tree and performing the actions\n - returns a new JSON-formatted pandoc document as a string\n\n The ``actions`` argument is a list of functions (see ``walk`` for a\n full description).\n\n The argument ``source`` is a string encoded JSON object.\n\n The argument ``format`` is a string describing the output format.\n\n Returns a new JSON-formatted pandoc document.\n\n- ``stringify(x)``\n\n Walks the tree x and returns concatenated string content, leaving out\n all formatting.\n\n- ``attributes(attrs)``\n\n Returns an attribute list, constructed from the dictionary attrs.\n\nHow to use\n----------\nMost users will only need ``toJSONFilter``. Here is a simple example\nof its use::\n\n #!/usr/bin/env python\n\n \"\"\"\n Pandoc filter to convert all regular text to uppercase.\n Code, link URLs, etc. are not affected.\n \"\"\"\n\n from pandocfilters import toJSONFilter, Str\n\n def caps(key, value, format, meta):\n if key == 'Str':\n return Str(value.upper())\n\n if __name__ == \"__main__\":\n toJSONFilter(caps)\n\nExamples\n--------\n\nThe examples subdirectory in the source repository contains the\nfollowing filters. These filters should provide a useful starting point\nfor developing your own pandocfilters.\n\n``abc.py``\n Pandoc filter to process code blocks with class ``abc`` containing ABC\n notation into images. Assumes that abcm2ps and ImageMagick's convert\n are in the path. Images are put in the abc-images directory.\n\n``caps.py``\n Pandoc filter to convert all regular text to uppercase. Code, link\n URLs, etc. are not affected.\n\n``blockdiag.py``\n Pandoc filter to process code blocks with class \"blockdiag\" into\n generated images. Needs utils from http://blockdiag.com.\n\n``comments.py``\n Pandoc filter that causes everything between\n ```` and ```` to be ignored.\n The comment lines must appear on lines by themselves, with blank\n lines surrounding\n\n``deemph.py``\n Pandoc filter that causes emphasized text to be displayed in ALL\n CAPS.\n\n``deflists.py``\n Pandoc filter to convert definition lists to bullet lists with the\n defined terms in strong emphasis (for compatibility with standard\n markdown).\n\n``gabc.py``\n Pandoc filter to convert code blocks with class \"gabc\" to LaTeX\n \\\\gabcsnippet commands in LaTeX output, and to images in HTML output.\n\n``graphviz.py``\n Pandoc filter to process code blocks with class ``graphviz`` into\n graphviz-generated images.\n\n``lilypond.py``\n Pandoc filter to process code blocks with class \"ly\" containing\n Lilypond notation.\n\n``metavars.py``\n Pandoc filter to allow interpolation of metadata fields into a\n document. ``%{fields}`` will be replaced by the field's value, assuming\n it is of the type ``MetaInlines`` or ``MetaString``.\n\n``myemph.py``\n Pandoc filter that causes emphasis to be rendered using the custom\n macro ``\\myemph{...}`` rather than ``\\emph{...}`` in latex. Other output\n formats are unaffected.\n\n``plantuml.py``\n Pandoc filter to process code blocks with class ``plantuml`` to images.\n Needs `plantuml.jar` from http://plantuml.com/.\n\n``ditaa.py``\n Pandoc filter to process code blocks with class ``ditaa`` to images.\n Needs `ditaa.jar` from http://ditaa.sourceforge.net/.\n\n``theorem.py``\n Pandoc filter to convert divs with ``class=\"theorem\"`` to LaTeX theorem\n environments in LaTeX output, and to numbered theorems in HTML\n output.\n\n``tikz.py``\n Pandoc filter to process raw latex tikz environments into images.\n Assumes that pdflatex is in the path, and that the standalone\n package is available. Also assumes that ImageMagick's convert is in\n the path. Images are put in the ``tikz-images`` directory.\n\nAPI documentation\n-----------------\n\nBy default most filters use ``get_filename4code`` to\ncreate a directory ``...-images`` to save temporary\nfiles. This directory doesn't get removed as it can be used as a cache so that\nlater pandoc runs don't have to recreate files if they already exist. The\ndirectory is generated in the current directory.\n\nIf you prefer to have a clean directory after running pandoc filters, you\ncan set an environment variable ``PANDOCFILTER_CLEANUP`` to any non-empty value such as `1`\nwhich forces the code to create a temporary directory that will be removed\nby the end of execution.\n",
+ "keywords": [
+ "pandoc"
+ ],
+ "home_page": "http://github.com/jgm/pandocfilters",
+ "author": "John MacFarlane",
+ "author_email": "fiddlosopher@gmail.com",
+ "license": "BSD-3-Clause",
+ "classifier": [
+ "Development Status :: 3 - Alpha",
+ "Environment :: Console",
+ "Intended Audience :: End Users/Desktop",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Topic :: Text Processing :: Filters",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.4",
+ "Programming Language :: Python :: 3.5",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9"
+ ],
+ "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6",
+ "hashes": {
+ "sha256": "a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "prompt-toolkit",
+ "version": "3.0.43",
+ "summary": "Library for building powerful interactive command lines in Python",
+ "description": "Python Prompt Toolkit\n=====================\n\n|AppVeyor| |PyPI| |RTD| |License| |Codecov|\n\n.. image :: https://github.com/prompt-toolkit/python-prompt-toolkit/raw/master/docs/images/logo_400px.png\n\n``prompt_toolkit`` *is a library for building powerful interactive command line applications in Python.*\n\nRead the `documentation on readthedocs\n`_.\n\n\nGallery\n*******\n\n`ptpython `_ is an interactive\nPython Shell, build on top of ``prompt_toolkit``.\n\n.. image :: https://github.com/prompt-toolkit/python-prompt-toolkit/raw/master/docs/images/ptpython.png\n\n`More examples `_\n\n\nprompt_toolkit features\n***********************\n\n``prompt_toolkit`` could be a replacement for `GNU readline\n`_, but it can be much\nmore than that.\n\nSome features:\n\n- **Pure Python**.\n- Syntax highlighting of the input while typing. (For instance, with a Pygments lexer.)\n- Multi-line input editing.\n- Advanced code completion.\n- Both Emacs and Vi key bindings. (Similar to readline.)\n- Even some advanced Vi functionality, like named registers and digraphs.\n- Reverse and forward incremental search.\n- Works well with Unicode double width characters. (Chinese input.)\n- Selecting text for copy/paste. (Both Emacs and Vi style.)\n- Support for `bracketed paste `_.\n- Mouse support for cursor positioning and scrolling.\n- Auto suggestions. (Like `fish shell `_.)\n- Multiple input buffers.\n- No global state.\n- Lightweight, the only dependencies are Pygments and wcwidth.\n- Runs on Linux, OS X, FreeBSD, OpenBSD and Windows systems.\n- And much more...\n\nFeel free to create tickets for bugs and feature requests, and create pull\nrequests if you have nice patches that you would like to share with others.\n\n\nInstallation\n************\n\n::\n\n pip install prompt_toolkit\n\nFor Conda, do:\n\n::\n\n conda install -c https://conda.anaconda.org/conda-forge prompt_toolkit\n\n\nAbout Windows support\n*********************\n\n``prompt_toolkit`` is cross platform, and everything that you build on top\nshould run fine on both Unix and Windows systems. Windows support is best on\nrecent Windows 10 builds, for which the command line window supports vt100\nescape sequences. (If not supported, we fall back to using Win32 APIs for color\nand cursor movements).\n\nIt's worth noting that the implementation is a \"best effort of what is\npossible\". Both Unix and Windows terminals have their limitations. But in\ngeneral, the Unix experience will still be a little better.\n\nFor Windows, it's recommended to use either `cmder\n`_ or `conemu `_.\n\nGetting started\n***************\n\nThe most simple example of the library would look like this:\n\n.. code:: python\n\n from prompt_toolkit import prompt\n\n if __name__ == '__main__':\n answer = prompt('Give me some input: ')\n print('You said: %s' % answer)\n\nFor more complex examples, have a look in the ``examples`` directory. All\nexamples are chosen to demonstrate only one thing. Also, don't be afraid to\nlook at the source code. The implementation of the ``prompt`` function could be\na good start.\n\nPhilosophy\n**********\n\nThe source code of ``prompt_toolkit`` should be **readable**, **concise** and\n**efficient**. We prefer short functions focusing each on one task and for which\nthe input and output types are clearly specified. We mostly prefer composition\nover inheritance, because inheritance can result in too much functionality in\nthe same object. We prefer immutable objects where possible (objects don't\nchange after initialization). Reusability is important. We absolutely refrain\nfrom having a changing global state, it should be possible to have multiple\nindependent instances of the same code in the same process. The architecture\nshould be layered: the lower levels operate on primitive operations and data\nstructures giving -- when correctly combined -- all the possible flexibility;\nwhile at the higher level, there should be a simpler API, ready-to-use and\nsufficient for most use cases. Thinking about algorithms and efficiency is\nimportant, but avoid premature optimization.\n\n\n`Projects using prompt_toolkit `_\n***********************************************\n\nSpecial thanks to\n*****************\n\n- `Pygments `_: Syntax highlighter.\n- `wcwidth `_: Determine columns needed for a wide characters.\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/prompt_toolkit.svg\n :target: https://pypi.python.org/pypi/prompt-toolkit/\n :alt: Latest Version\n\n.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true\n :target: https://ci.appveyor.com/project/prompt-toolkit/python-prompt-toolkit/\n\n.. |RTD| image:: https://readthedocs.org/projects/python-prompt-toolkit/badge/\n :target: https://python-prompt-toolkit.readthedocs.io/en/master/\n\n.. |License| image:: https://img.shields.io/github/license/prompt-toolkit/python-prompt-toolkit.svg\n :target: https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/LICENSE\n\n.. |Codecov| image:: https://codecov.io/gh/prompt-toolkit/python-prompt-toolkit/branch/master/graphs/badge.svg?style=flat\n :target: https://codecov.io/gh/prompt-toolkit/python-prompt-toolkit/\n\n",
+ "description_content_type": "text/x-rst",
+ "home_page": "https://github.com/prompt-toolkit/python-prompt-toolkit",
+ "author": "Jonathan Slenders",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "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 :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3 :: Only",
+ "Programming Language :: Python",
+ "Topic :: Software Development"
+ ],
+ "requires_dist": [
+ "wcwidth"
+ ],
+ "requires_python": ">=3.7.0"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a",
+ "hashes": {
+ "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.3",
+ "name": "Pygments",
+ "version": "2.18.0",
+ "summary": "Pygments is a syntax highlighting package written in Python.",
+ "description": "Pygments\n~~~~~~~~\n\nPygments is a syntax highlighting package written in Python.\n\nIt is a generic syntax highlighter suitable for use in code hosting, forums,\nwikis or other applications that need to prettify source code. Highlights\nare:\n\n* a wide range of over 500 languages and other text formats is supported\n* special attention is paid to details, increasing quality by a fair amount\n* support for new languages and formats are added easily\n* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image\n formats that PIL supports and ANSI sequences\n* it is usable as a command-line tool and as a library\n\nCopyright 2006-2024 by the Pygments team, see ``AUTHORS``.\nLicensed under the BSD, see ``LICENSE`` for details.\n",
+ "description_content_type": "text/x-rst",
+ "keywords": [
+ "syntax",
+ "highlighting"
+ ],
+ "author_email": "Georg Brandl ",
+ "maintainer": "Matthäus G. Chajdas",
+ "maintainer_email": "Georg Brandl , Jean Abou Samra ",
+ "license": "BSD-2-Clause",
+ "classifier": [
+ "Development Status :: 6 - Mature",
+ "Intended Audience :: Developers",
+ "Intended Audience :: End Users/Desktop",
+ "Intended Audience :: System Administrators",
+ "License :: OSI Approved :: BSD License",
+ "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 :: Text Processing :: Filters",
+ "Topic :: Utilities"
+ ],
+ "requires_dist": [
+ "colorama>=0.4.6; extra == 'windows-terminal'"
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Homepage, https://pygments.org",
+ "Documentation, https://pygments.org/docs",
+ "Source, https://github.com/pygments/pygments",
+ "Bug Tracker, https://github.com/pygments/pygments/issues",
+ "Changelog, https://github.com/pygments/pygments/blob/master/CHANGES"
+ ],
+ "provides_extra": [
+ "plugins",
+ "windows-terminal"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427",
+ "hashes": {
+ "sha256": "a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "python-dateutil",
+ "version": "2.9.0.post0",
+ "summary": "Extensions to the standard Python datetime module",
+ "description": "dateutil - powerful extensions to datetime\n==========================================\n\n|pypi| |support| |licence|\n\n|gitter| |readthedocs|\n\n|travis| |appveyor| |pipelines| |coverage|\n\n.. |pypi| image:: https://img.shields.io/pypi/v/python-dateutil.svg?style=flat-square\n :target: https://pypi.org/project/python-dateutil/\n :alt: pypi version\n\n.. |support| image:: https://img.shields.io/pypi/pyversions/python-dateutil.svg?style=flat-square\n :target: https://pypi.org/project/python-dateutil/\n :alt: supported Python version\n\n.. |travis| image:: https://img.shields.io/travis/dateutil/dateutil/master.svg?style=flat-square&label=Travis%20Build\n :target: https://travis-ci.org/dateutil/dateutil\n :alt: travis build status\n\n.. |appveyor| image:: https://img.shields.io/appveyor/ci/dateutil/dateutil/master.svg?style=flat-square&logo=appveyor\n :target: https://ci.appveyor.com/project/dateutil/dateutil\n :alt: appveyor build status\n\n.. |pipelines| image:: https://dev.azure.com/pythondateutilazure/dateutil/_apis/build/status/dateutil.dateutil?branchName=master\n :target: https://dev.azure.com/pythondateutilazure/dateutil/_build/latest?definitionId=1&branchName=master\n :alt: azure pipelines build status\n\n.. |coverage| image:: https://codecov.io/gh/dateutil/dateutil/branch/master/graphs/badge.svg?branch=master\n :target: https://codecov.io/gh/dateutil/dateutil?branch=master\n :alt: Code coverage\n\n.. |gitter| image:: https://badges.gitter.im/dateutil/dateutil.svg\n :alt: Join the chat at https://gitter.im/dateutil/dateutil\n :target: https://gitter.im/dateutil/dateutil\n\n.. |licence| image:: https://img.shields.io/pypi/l/python-dateutil.svg?style=flat-square\n :target: https://pypi.org/project/python-dateutil/\n :alt: licence\n\n.. |readthedocs| image:: https://img.shields.io/readthedocs/dateutil/latest.svg?style=flat-square&label=Read%20the%20Docs\n :alt: Read the documentation at https://dateutil.readthedocs.io/en/latest/\n :target: https://dateutil.readthedocs.io/en/latest/\n\nThe `dateutil` module provides powerful extensions to\nthe standard `datetime` module, available in Python.\n\nInstallation\n============\n`dateutil` can be installed from PyPI using `pip` (note that the package name is\ndifferent from the importable name)::\n\n pip install python-dateutil\n\nDownload\n========\ndateutil is available on PyPI\nhttps://pypi.org/project/python-dateutil/\n\nThe documentation is hosted at:\nhttps://dateutil.readthedocs.io/en/stable/\n\nCode\n====\nThe code and issue tracker are hosted on GitHub:\nhttps://github.com/dateutil/dateutil/\n\nFeatures\n========\n\n* Computing of relative deltas (next month, next year,\n next Monday, last week of month, etc);\n* Computing of relative deltas between two given\n date and/or datetime objects;\n* Computing of dates based on very flexible recurrence rules,\n using a superset of the `iCalendar `_\n specification. Parsing of RFC strings is supported as well.\n* Generic parsing of dates in almost any string format;\n* Timezone (tzinfo) implementations for tzfile(5) format\n files (/etc/localtime, /usr/share/zoneinfo, etc), TZ\n environment string (in all known formats), iCalendar\n format files, given ranges (with help from relative deltas),\n local machine timezone, fixed offset timezone, UTC timezone,\n and Windows registry-based time zones.\n* Internal up-to-date world timezone information based on\n Olson's database.\n* Computing of Easter Sunday dates for any given year,\n using Western, Orthodox or Julian algorithms;\n* A comprehensive test suite.\n\nQuick example\n=============\nHere's a snapshot, just to give an idea about the power of the\npackage. For more examples, look at the documentation.\n\nSuppose you want to know how much time is left, in\nyears/months/days/etc, before the next easter happening on a\nyear with a Friday 13th in August, and you want to get today's\ndate out of the \"date\" unix system command. Here is the code:\n\n.. code-block:: python3\n\n >>> from dateutil.relativedelta import *\n >>> from dateutil.easter import *\n >>> from dateutil.rrule import *\n >>> from dateutil.parser import *\n >>> from datetime import *\n >>> now = parse(\"Sat Oct 11 17:13:46 UTC 2003\")\n >>> today = now.date()\n >>> year = rrule(YEARLY,dtstart=now,bymonth=8,bymonthday=13,byweekday=FR)[0].year\n >>> rdelta = relativedelta(easter(year), today)\n >>> print(\"Today is: %s\" % today)\n Today is: 2003-10-11\n >>> print(\"Year with next Aug 13th on a Friday is: %s\" % year)\n Year with next Aug 13th on a Friday is: 2004\n >>> print(\"How far is the Easter of that year: %s\" % rdelta)\n How far is the Easter of that year: relativedelta(months=+6)\n >>> print(\"And the Easter of that year is: %s\" % (today+rdelta))\n And the Easter of that year is: 2004-04-11\n\nBeing exactly 6 months ahead was **really** a coincidence :)\n\nContributing\n============\n\nWe welcome many types of contributions - bug reports, pull requests (code, infrastructure or documentation fixes). For more information about how to contribute to the project, see the ``CONTRIBUTING.md`` file in the repository.\n\n\nAuthor\n======\nThe dateutil module was written by Gustavo Niemeyer \nin 2003.\n\nIt is maintained by:\n\n* Gustavo Niemeyer 2003-2011\n* Tomi Pieviläinen 2012-2014\n* Yaron de Leeuw 2014-2016\n* Paul Ganssle 2015-\n\nStarting with version 2.4.1 and running until 2.8.2, all source and binary\ndistributions will be signed by a PGP key that has, at the very least, been\nsigned by the key which made the previous release. A table of release signing\nkeys can be found below:\n\n=========== ============================\nReleases Signing key fingerprint\n=========== ============================\n2.4.1-2.8.2 `6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB`_\n=========== ============================\n\nNew releases *may* have signed tags, but binary and source distributions\nuploaded to PyPI will no longer have GPG signatures attached.\n\nContact\n=======\nOur mailing list is available at `dateutil@python.org `_. As it is hosted by the PSF, it is subject to the `PSF code of\nconduct `_.\n\nLicense\n=======\n\nAll contributions after December 1, 2017 released under dual license - either `Apache 2.0 License `_ or the `BSD 3-Clause License `_. Contributions before December 1, 2017 - except those those explicitly relicensed - are released only under the BSD 3-Clause License.\n\n\n.. _6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB:\n https://pgp.mit.edu/pks/lookup?op=vindex&search=0xCD54FCE3D964BEFB\n",
+ "description_content_type": "text/x-rst",
+ "home_page": "https://github.com/dateutil/dateutil",
+ "author": "Gustavo Niemeyer",
+ "author_email": "gustavo@niemeyer.net",
+ "maintainer": "Paul Ganssle",
+ "maintainer_email": "dateutil@python.org",
+ "license": "Dual License",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "License :: OSI Approved :: Apache Software License",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.3",
+ "Programming Language :: Python :: 3.4",
+ "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",
+ "Programming Language :: Python :: 3.12",
+ "Topic :: Software Development :: Libraries"
+ ],
+ "requires_dist": [
+ "six >=1.5"
+ ],
+ "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7",
+ "project_url": [
+ "Documentation, https://dateutil.readthedocs.io/en/stable/",
+ "Source, https://github.com/dateutil/dateutil"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/35/a6/145655273568ee78a581e734cf35beb9e33a370b29c5d3c8fee3744de29f/python_json_logger-2.0.7-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd",
+ "hashes": {
+ "sha256": "f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "python-json-logger",
+ "version": "2.0.7",
+ "summary": "A python library adding a json log formatter",
+ "description": "![Build Status](https://github.com/madzak/python-json-logger/actions/workflows/build.yml/badge.svg)\n[![License](https://img.shields.io/pypi/l/python-json-logger.svg)](https://pypi.python.org/pypi/python-json-logger/)\n[![Version](https://img.shields.io/pypi/v/python-json-logger.svg)](https://pypi.python.org/pypi/python-json-logger/)\n\nOverview\n=======\nThis library is provided to allow standard python logging to output log data as json objects. With JSON we can make our logs more readable by machines and we can stop writing custom parsers for syslog type records.\n\nNews\n=======\nHi, I see this package is quiet alive and I am sorry for ignoring it so long. I will be stepping up my maintenance of this package so please allow me a week to get things back in order (and most likely a new minor version) and I'll post and update here once I am caught up.\n\nInstalling\n==========\nPip:\n\n pip install python-json-logger\n\nPypi:\n\n https://pypi.python.org/pypi/python-json-logger\n\nManual:\n\n python setup.py install\n\nUsage\n=====\n\n## Integrating with Python's logging framework\n\nJson outputs are provided by the JsonFormatter logging formatter. You can add the custom formatter like below:\n\n**Please note: version 0.1.0 has changed the import structure, please update to the following example for proper importing**\n\n```python\n import logging\n from pythonjsonlogger import jsonlogger\n\n logger = logging.getLogger()\n\n logHandler = logging.StreamHandler()\n formatter = jsonlogger.JsonFormatter()\n logHandler.setFormatter(formatter)\n logger.addHandler(logHandler)\n```\n\n## Customizing fields\n\nThe fmt parser can also be overidden if you want to have required fields that differ from the default of just `message`.\n\nThese two invocations are equivalent:\n\n```python\nclass CustomJsonFormatter(jsonlogger.JsonFormatter):\n def parse(self):\n return self._fmt.split(';')\n\nformatter = CustomJsonFormatter('one;two')\n\n# is equivalent to:\n\nformatter = jsonlogger.JsonFormatter('%(one)s %(two)s')\n```\n\nYou can also add extra fields to your json output by specifying a dict in place of message, as well as by specifying an `extra={}` argument.\n\nContents of these dictionaries will be added at the root level of the entry and may override basic fields.\n\nYou can also use the `add_fields` method to add to or generally normalize the set of default set of fields, it is called for every log event. For example, to unify default fields with those provided by [structlog](http://www.structlog.org/) you could do something like this:\n\n```python\nclass CustomJsonFormatter(jsonlogger.JsonFormatter):\n def add_fields(self, log_record, record, message_dict):\n super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict)\n if not log_record.get('timestamp'):\n # this doesn't use record.created, so it is slightly off\n now = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')\n log_record['timestamp'] = now\n if log_record.get('level'):\n log_record['level'] = log_record['level'].upper()\n else:\n log_record['level'] = record.levelname\n\nformatter = CustomJsonFormatter('%(timestamp)s %(level)s %(name)s %(message)s')\n```\n\nItems added to the log record will be included in *every* log message, no matter what the format requires.\n\n## Adding custom object serialization\n\nFor custom handling of object serialization you can specify default json object translator or provide a custom encoder\n\n```python\ndef json_translate(obj):\n if isinstance(obj, MyClass):\n return {\"special\": obj.special}\n\nformatter = jsonlogger.JsonFormatter(json_default=json_translate,\n json_encoder=json.JSONEncoder)\nlogHandler.setFormatter(formatter)\n\nlogger.info({\"special\": \"value\", \"run\": 12})\nlogger.info(\"classic message\", extra={\"special\": \"value\", \"run\": 12})\n```\n\n## Using a Config File\n\nTo use the module with a config file using the [`fileConfig` function](https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig), use the class `pythonjsonlogger.jsonlogger.JsonFormatter`. Here is a sample config file.\n\n```ini\n[loggers]\nkeys = root,custom\n\n[logger_root]\nhandlers =\n\n[logger_custom]\nlevel = INFO\nhandlers = custom\nqualname = custom\n\n[handlers]\nkeys = custom\n\n[handler_custom]\nclass = StreamHandler\nlevel = INFO\nformatter = json\nargs = (sys.stdout,)\n\n[formatters]\nkeys = json\n\n[formatter_json]\nformat = %(message)s\nclass = pythonjsonlogger.jsonlogger.JsonFormatter\n```\n\nExample Output\n==============\n\nSample JSON with a full formatter (basically the log message from the unit test). Every log message will appear on 1 line like a typical logger.\n\n```json\n{\n \"threadName\": \"MainThread\",\n \"name\": \"root\",\n \"thread\": 140735202359648,\n \"created\": 1336281068.506248,\n \"process\": 41937,\n \"processName\": \"MainProcess\",\n \"relativeCreated\": 9.100914001464844,\n \"module\": \"tests\",\n \"funcName\": \"testFormatKeys\",\n \"levelno\": 20,\n \"msecs\": 506.24799728393555,\n \"pathname\": \"tests/tests.py\",\n \"lineno\": 60,\n \"asctime\": [\"12-05-05 22:11:08,506248\"],\n \"message\": \"testing logging format\",\n \"filename\": \"tests.py\",\n \"levelname\": \"INFO\",\n \"special\": \"value\",\n \"run\": 12\n}\n```\n\nExternal Examples\n=================\n\n- [Wesley Tanaka - Structured log files in Python using python-json-logger](http://web.archive.org/web/20201130054012/https://wtanaka.com/node/8201)\n\n- [Archive](https://web.archive.org/web/20201130054012/https://wtanaka.com/node/8201)\n",
+ "description_content_type": "text/markdown",
+ "home_page": "http://github.com/madzak/python-json-logger",
+ "author": "Zakaria Zajac",
+ "author_email": "zak@madzak.com",
+ "license": "BSD",
+ "classifier": [
+ "Development Status :: 6 - Mature",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "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 :: System :: Logging"
+ ],
+ "requires_python": ">=3.6"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl",
+ "archive_info": {
+ "hash": "sha256=0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
+ "hashes": {
+ "sha256": "0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "PyYAML",
+ "version": "6.0.1",
+ "platform": [
+ "Any"
+ ],
+ "summary": "YAML parser and emitter for Python",
+ "description": "YAML is a data serialization format designed for human readability\r\nand interaction with scripting languages. PyYAML is a YAML parser\r\nand emitter for Python.\r\n\r\nPyYAML features a complete YAML 1.1 parser, Unicode support, pickle\r\nsupport, capable extension API, and sensible error messages. PyYAML\r\nsupports standard YAML tags and provides Python-specific tags that\r\nallow to represent an arbitrary Python object.\r\n\r\nPyYAML is applicable for a broad range of tasks from complex\r\nconfiguration files to object serialization and persistence.\r\n",
+ "home_page": "https://pyyaml.org/",
+ "download_url": "https://pypi.org/project/PyYAML/",
+ "author": "Kirill Simonov",
+ "author_email": "xi@resolvent.net",
+ "license": "MIT",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Cython",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "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",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Topic :: Text Processing :: Markup"
+ ],
+ "requires_python": ">=3.6",
+ "project_url": [
+ "Bug Tracker, https://github.com/yaml/pyyaml/issues",
+ "CI, https://github.com/yaml/pyyaml/actions",
+ "Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation",
+ "Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core",
+ "Source Code, https://github.com/yaml/pyyaml"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de",
+ "hashes": {
+ "sha256": "eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.3",
+ "name": "referencing",
+ "version": "0.35.1",
+ "summary": "JSON Referencing + Python",
+ "description": "===============\n``referencing``\n===============\n\n|PyPI| |Pythons| |CI| |ReadTheDocs| |pre-commit|\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/referencing.svg\n :alt: PyPI version\n :target: https://pypi.org/project/referencing/\n\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/referencing.svg\n :alt: Supported Python versions\n :target: https://pypi.org/project/referencing/\n\n.. |CI| image:: https://github.com/python-jsonschema/referencing/workflows/CI/badge.svg\n :alt: Build status\n :target: https://github.com/python-jsonschema/referencing/actions?query=workflow%3ACI\n\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat\n :alt: ReadTheDocs status\n :target: https://referencing.readthedocs.io/en/stable/\n\n.. |pre-commit| image:: https://results.pre-commit.ci/badge/github/python-jsonschema/referencing/main.svg\n :alt: pre-commit.ci status\n :target: https://results.pre-commit.ci/latest/github/python-jsonschema/referencing/main\n\n\nAn implementation-agnostic implementation of JSON reference resolution.\n\nSee `the documentation `_ for more details.\n",
+ "description_content_type": "text/x-rst",
+ "keywords": [
+ "asyncapi",
+ "json",
+ "jsonschema",
+ "openapi",
+ "referencing"
+ ],
+ "author_email": "Julian Berman ",
+ "classifier": [
+ "Development Status :: 3 - Alpha",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "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 :: File Formats :: JSON",
+ "Topic :: File Formats :: JSON :: JSON Schema"
+ ],
+ "requires_dist": [
+ "attrs>=22.2.0",
+ "rpds-py>=0.7.0"
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Documentation, https://referencing.readthedocs.io/",
+ "Homepage, https://github.com/python-jsonschema/referencing",
+ "Issues, https://github.com/python-jsonschema/referencing/issues/",
+ "Funding, https://github.com/sponsors/Julian",
+ "Tidelift, https://tidelift.com/subscription/pkg/pypi-referencing?utm_source=pypi-referencing&utm_medium=referral&utm_campaign=pypi-link",
+ "Changelog, https://referencing.readthedocs.io/en/stable/changes/",
+ "Source, https://github.com/python-jsonschema/referencing"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9",
+ "hashes": {
+ "sha256": "2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "rfc3986-validator",
+ "version": "0.1.1",
+ "platform": [
+ "UNKNOWN"
+ ],
+ "summary": "Pure python rfc3986 validator",
+ "description": "# rfc3986-validator\n\nA pure python RFC3986 validator\n\n\n[![image](https://img.shields.io/pypi/v/rfc3986_validator.svg)](https://pypi.python.org/pypi/rfc3986_validator)\n[![Build Status](https://travis-ci.org/naimetti/rfc3986-validator.svg?branch=master)](https://travis-ci.org/naimetti/rfc3986-validator)\n\n# Install\n\n```shell script\npip install rfc3986-validator\n```\n\n# Usage\n\n```pycon\n>>> from rfc3986_validator import validate_rfc3986\n>>> validate_rfc3986('http://foo.bar?q=Spaces should be encoded')\nFalse\n\n>>> validate_rfc3986('http://foo.com/blah_blah_(wikipedia)')\nTrue\n```\n\nIt also support validate [URI-reference](https://tools.ietf.org/html/rfc3986#page-49) rule \n\n```pycon\n>>> validate_rfc3986('//foo.com/blah_blah', rule='URI_reference')\nTrue\n```\n\n - Free software: MIT license\n\n\n\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "rfc3986",
+ "validator"
+ ],
+ "home_page": "https://github.com/naimetti/rfc3986-validator",
+ "author": "Nicolas Aimetti",
+ "author_email": "naimetti@yahoo.com.ar",
+ "license": "MIT license",
+ "classifier": [
+ "Development Status :: 2 - Pre-Alpha",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Natural Language :: English",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.5",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8"
+ ],
+ "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/01/7d/8552e329973a198e5e150cc6be068f5cbae797a89e64c02bbd47bd397dee/rpds_py-0.18.1-cp312-none-win_amd64.whl",
+ "archive_info": {
+ "hash": "sha256=720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72",
+ "hashes": {
+ "sha256": "720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.3",
+ "name": "rpds-py",
+ "version": "0.18.1",
+ "summary": "Python bindings to Rust's persistent data structures (rpds)",
+ "description": "===========\r\n``rpds.py``\r\n===========\r\n\r\n|PyPI| |Pythons| |CI|\r\n\r\n.. |PyPI| image:: https://img.shields.io/pypi/v/rpds-py.svg\r\n :alt: PyPI version\r\n :target: https://pypi.org/project/rpds-py/\r\n\r\n.. |Pythons| image:: https://img.shields.io/pypi/pyversions/rpds-py.svg\r\n :alt: Supported Python versions\r\n :target: https://pypi.org/project/rpds-py/\r\n\r\n.. |CI| image:: https://github.com/crate-py/rpds/workflows/CI/badge.svg\r\n :alt: Build status\r\n :target: https://github.com/crate-py/rpds/actions?query=workflow%3ACI\r\n\r\n.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat\r\n :alt: ReadTheDocs status\r\n :target: https://referencing.readthedocs.io/en/stable/\r\n\r\n\r\nPython bindings to the `Rust rpds crate `_ for persistent data structures.\r\n\r\nWhat's here is quite minimal (in transparency, it was written initially to support replacing ``pyrsistent`` in the `referencing library `_).\r\nIf you see something missing (which is very likely), a PR is definitely welcome to add it.\r\n\r\nInstallation\r\n------------\r\n\r\nThe distribution on PyPI is named ``rpds.py`` (equivalently ``rpds-py``), and thus can be installed via e.g.:\r\n\r\n.. code:: sh\r\n\r\n $ pip install rpds-py\r\n\r\nNote that if you install ``rpds-py`` from source, you will need a Rust toolchain installed, as it is a build-time dependency.\r\nAn example of how to do so in a ``Dockerfile`` can be found `here `_.\r\n\r\nIf you believe you are on a common platform which should have wheels built (i.e. and not need to compile from source), feel free to file an issue or pull request modifying the GitHub action used here to build wheels via ``maturin``.\r\n\r\nUsage\r\n-----\r\n\r\nMethods in general are named similarly to their ``rpds`` counterparts (rather than ``pyrsistent``\\ 's conventions, though probably a full drop-in ``pyrsistent``\\ -compatible wrapper module is a good addition at some point).\r\n\r\n.. code:: python\r\n\r\n >>> from rpds import HashTrieMap, HashTrieSet, List\r\n\r\n >>> m = HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\"})\r\n >>> m.insert(\"spam\", 37) == HashTrieMap({\"foo\": \"bar\", \"baz\": \"quux\", \"spam\": 37})\r\n True\r\n >>> m.remove(\"foo\") == HashTrieMap({\"baz\": \"quux\"})\r\n True\r\n\r\n >>> s = HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\"})\r\n >>> s.insert(\"spam\") == HashTrieSet({\"foo\", \"bar\", \"baz\", \"quux\", \"spam\"})\r\n True\r\n >>> s.remove(\"foo\") == HashTrieSet({\"bar\", \"baz\", \"quux\"})\r\n True\r\n\r\n >>> L = List([1, 3, 5])\r\n >>> L.push_front(-1) == List([-1, 1, 3, 5])\r\n True\r\n >>> L.rest == List([3, 5])\r\n True\r\n\n",
+ "description_content_type": "text/x-rst; charset=UTF-8",
+ "keywords": [
+ "data structures",
+ "rust",
+ "persistent"
+ ],
+ "author_email": "Julian Berman ",
+ "license": "MIT",
+ "classifier": [
+ "Development Status :: 3 - Alpha",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Rust",
+ "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",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy"
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Documentation, https://rpds.readthedocs.io/",
+ "Homepage, https://github.com/crate-py/rpds",
+ "Issues, https://github.com/crate-py/rpds/issues/",
+ "Funding, https://github.com/sponsors/Julian",
+ "Tidelift, https://tidelift.com/subscription/pkg/pypi-rpds-py?utm_source=pypi-rpds-py&utm_medium=referral&utm_campaign=pypi-link",
+ "Source, https://github.com/crate-py/rpds"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d",
+ "hashes": {
+ "sha256": "450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "urllib3",
+ "version": "2.2.1",
+ "summary": "HTTP library with thread-safe connection pooling, file post, and more.",
+ "description": "\n\n![urllib3](https://github.com/urllib3/urllib3/raw/main/docs/_static/banner_github.svg)\n\n
\n\n\n \n \n \n \n \n
\n \n \n \n
\n\nurllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the\nPython ecosystem already uses urllib3 and you should too.\nurllib3 brings many critical features that are missing from the Python\nstandard libraries:\n\n- Thread safety.\n- Connection pooling.\n- Client-side SSL/TLS verification.\n- File uploads with multipart encoding.\n- Helpers for retrying requests and dealing with HTTP redirects.\n- Support for gzip, deflate, brotli, and zstd encoding.\n- Proxy support for HTTP and SOCKS.\n- 100% test coverage.\n\nurllib3 is powerful and easy to use:\n\n```python3\n>>> import urllib3\n>>> resp = urllib3.request(\"GET\", \"http://httpbin.org/robots.txt\")\n>>> resp.status\n200\n>>> resp.data\nb\"User-agent: *\\nDisallow: /deny\\n\"\n```\n\n## Installing\n\nurllib3 can be installed with [pip](https://pip.pypa.io):\n\n```bash\n$ python -m pip install urllib3\n```\n\nAlternatively, you can grab the latest source code from [GitHub](https://github.com/urllib3/urllib3):\n\n```bash\n$ git clone https://github.com/urllib3/urllib3.git\n$ cd urllib3\n$ pip install .\n```\n\n\n## Documentation\n\nurllib3 has usage and reference documentation at [urllib3.readthedocs.io](https://urllib3.readthedocs.io).\n\n\n## Community\n\nurllib3 has a [community Discord channel](https://discord.gg/urllib3) for asking questions and\ncollaborating with other contributors. Drop by and say hello 👋\n\n\n## Contributing\n\nurllib3 happily accepts contributions. Please see our\n[contributing documentation](https://urllib3.readthedocs.io/en/latest/contributing.html)\nfor some tips on getting started.\n\n\n## Security Disclosures\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure with maintainers.\n\n\n## Maintainers\n\n- [@sethmlarson](https://github.com/sethmlarson) (Seth M. Larson)\n- [@pquentin](https://github.com/pquentin) (Quentin Pradet)\n- [@illia-v](https://github.com/illia-v) (Illia Volochii)\n- [@theacodes](https://github.com/theacodes) (Thea Flowers)\n- [@haikuginger](https://github.com/haikuginger) (Jess Shapiro)\n- [@lukasa](https://github.com/lukasa) (Cory Benfield)\n- [@sigmavirus24](https://github.com/sigmavirus24) (Ian Stapleton Cordasco)\n- [@shazow](https://github.com/shazow) (Andrey Petrov)\n\n👋\n\n\n## Sponsorship\n\nIf your company benefits from this library, please consider [sponsoring its\ndevelopment](https://urllib3.readthedocs.io/en/latest/sponsors.html).\n\n\n## For Enterprise\n\nProfessional support for urllib3 is available as part of the [Tidelift\nSubscription][1]. Tidelift gives software development teams a single source for\npurchasing and maintaining their software, with professional grade assurances\nfrom the experts who know it best, while seamlessly integrating with existing\ntools.\n\n[1]: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "filepost",
+ "http",
+ "httplib",
+ "https",
+ "pooling",
+ "ssl",
+ "threadsafe",
+ "urllib"
+ ],
+ "author_email": "Andrey Petrov ",
+ "maintainer_email": "Seth Michael Larson , Quentin Pradet , Illia Volochii ",
+ "classifier": [
+ "Environment :: Web Environment",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "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 :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Topic :: Internet :: WWW/HTTP",
+ "Topic :: Software Development :: Libraries"
+ ],
+ "requires_dist": [
+ "brotli>=1.0.9; (platform_python_implementation == 'CPython') and extra == 'brotli'",
+ "brotlicffi>=0.8.0; (platform_python_implementation != 'CPython') and extra == 'brotli'",
+ "h2<5,>=4; extra == 'h2'",
+ "pysocks!=1.5.7,<2.0,>=1.5.6; extra == 'socks'",
+ "zstandard>=0.18.0; extra == 'zstd'"
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst",
+ "Documentation, https://urllib3.readthedocs.io",
+ "Code, https://github.com/urllib3/urllib3",
+ "Issue tracker, https://github.com/urllib3/urllib3/issues"
+ ],
+ "provides_extra": [
+ "brotli",
+ "h2",
+ "socks",
+ "zstd"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl",
+ "archive_info": {
+ "hash": "sha256=b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f",
+ "hashes": {
+ "sha256": "b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "argon2-cffi-bindings",
+ "version": "21.2.0",
+ "platform": [
+ "UNKNOWN"
+ ],
+ "summary": "Low-level CFFI bindings for Argon2",
+ "description": "# Low-level Python CFFI Bindings for Argon2\n\n*argon2-cffi-bindings* provides low-level [*CFFI*](https://cffi.readthedocs.io/) bindings to the [*Argon2*] password hashing algorithm including a vendored version of them.\n\n\nThe currently vendored *Argon2* commit ID is [**`f57e61e`**](https://github.com/P-H-C/phc-winner-argon2/commit/f57e61e19229e23c4445b85494dbf7c07de721cb).\n\n\n> If you want to hash passwords in an application, this package is **not** for you.\n> Have a look at [*argon2-cffi*] with its high-level abstractions!\n\nThese bindings have been extracted from [*argon2-cffi*] and it remains its main consumer.\nHowever, they may be used by other packages that want to use the *Argon2* library without dealing with C-related complexities.\n\n\n## Usage\n\n*argon2-cffi-bindings* is available from [PyPI](https://pypi.org/project/argon2-cffi-bindings/).\nThe provided *CFFI* bindings are compiled in API mode.\n\nBest effort is given to provide binary wheels for as many platforms as possible.\n\n\n### Disabling Vendored Code\n\nA copy of [*Argon2*] is vendored and used by default, but can be disabled if *argon2-cffi-bindings* is installed using:\n\n```console\n$ env ARGON2_CFFI_USE_SYSTEM=1 \\\n python -m pip install --no-binary=argon2-cffi-bindings argon2-cffi-bindings\n```\n\n\n### Overriding Automatic *SSE2* Detection\n\nUsually the build process tries to guess whether or not it should use [*SSE2*](https://en.wikipedia.org/wiki/SSE2)-optimized code (see [`_ffi_build.py`](https://github.com/hynek/argon2-cffi-bindings/blob/main/src/_argon2_cffi_bindings/_ffi_build.py) for details).\nThis can go wrong and is problematic for cross-compiling.\n\nTherefore you can use the `ARGON2_CFFI_USE_SSE2` environment variable to control the process:\n\n- If you set it to ``1``, *argon2-cffi-bindings* will build **with** SSE2 support.\n- If you set it to ``0``, *argon2-cffi-bindings* will build **without** SSE2 support.\n- If you set it to anything else, it will be ignored and *argon2-cffi-bindings* will try to guess.\n\nHowever, if our heuristics fail you, we would welcome a bug report.\n\n\n### Python API\n\nSince this package is intended to be an implementation detail, it uses a private module name to prevent your users from using it by accident.\n\nTherefore you have to import the symbols from `_argon2_cffi_bindings`:\n\n```python\nfrom _argon2_cffi_bindings import ffi, lib\n```\n\nPlease refer to [*cffi* documentation](https://cffi.readthedocs.io/en/latest/using.html) on how to use the `ffi` and `lib` objects.\n\nThe list of symbols that are provided can be found in the [`_ffi_build.py` file](https://github.com/hynek/argon2-cffi-bindings/blob/main/src/_argon2_cffi_bindings/_ffi_build.py).\n\n[*Argon2*]: https://github.com/p-h-c/phc-winner-argon2\n[*argon2-cffi*]: https://argon2-cffi.readthedocs.io/\n\n\n## Project Information\n\n*argon2-cffi-bindings* is available under the MIT license, available from [PyPI](https://pypi.org/project/argon2-cffi-bindings/), the source code and documentation can be found on [GitHub](https://github.com/hynek/argon2-cffi-bindings).\n\n*argon2-cffi-bindings* targets Python 3.6 and later, including PyPy3.\n\n\n### Credits & License\n\n*argon2-cffi-bindings* is written and maintained by [Hynek Schlawack](https://hynek.me/about/).\nIt is released under the [MIT license](https://github.com/hynek/argon2-cffi/blob/main/LICENSE>).\n\nThe development is kindly supported by [Variomedia AG](https://www.variomedia.de/).\n\nThe authors of *Argon2* were very helpful to get the library to compile on ancient versions of Visual Studio for ancient versions of Python.\n\nThe documentation quotes frequently in verbatim from the *Argon2* [paper](https://www.password-hashing.net/argon2-specs.pdf) to avoid mistakes by rephrasing.\n\n\n#### Vendored Code\n\nThe original *Argon2* repo can be found at .\n\nExcept for the components listed below, the *Argon2* code in this repository is copyright (c) 2015 Daniel Dinu, Dmitry Khovratovich (main authors), Jean-Philippe Aumasson and Samuel Neves, and under [CC0] license.\n\nThe string encoding routines in src/encoding.c are copyright (c) 2015 Thomas Pornin, and under [CC0] license.\n\nThe [*BLAKE2*](https://www.blake2.net) code in ``src/blake2/`` is copyright (c) Samuel Neves, 2013-2015, and under [CC0] license.\n\n[CC0]: https://creativecommons.org/publicdomain/zero/1.0/\n\n\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "password",
+ "hash",
+ "hashing",
+ "security",
+ "bindings",
+ "cffi"
+ ],
+ "home_page": "https://github.com/hynek/argon2-cffi-bindings",
+ "author": "Hynek Schlawack",
+ "author_email": "hs@ox.cx",
+ "maintainer": "Hynek Schlawack",
+ "maintainer_email": "hs@ox.cx",
+ "license": "MIT",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Natural Language :: English",
+ "Operating System :: MacOS :: MacOS X",
+ "Operating System :: Microsoft :: Windows",
+ "Operating System :: POSIX",
+ "Operating System :: Unix",
+ "Programming Language :: Python :: 3",
+ "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 :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Programming Language :: Python",
+ "Topic :: Security :: Cryptography",
+ "Topic :: Security",
+ "Topic :: Software Development :: Libraries :: Python Modules"
+ ],
+ "requires_dist": [
+ "cffi (>=1.0.1)",
+ "pytest ; extra == 'dev'",
+ "cogapp ; extra == 'dev'",
+ "pre-commit ; extra == 'dev'",
+ "wheel ; extra == 'dev'",
+ "pytest ; extra == 'tests'"
+ ],
+ "requires_python": ">=3.6",
+ "project_url": [
+ "Source Code, https://github.com/hynek/argon2-cffi-bindings",
+ "Funding, https://github.com/sponsors/hynek",
+ "Tidelift, https://tidelift.com/subscription/pkg/pypi-argon2-cffi?utm_source=pypi-argon2-cffi&utm_medium=pypi",
+ "Ko-fi, https://ko-fi.com/the_hynek"
+ ],
+ "provides_extra": [
+ "dev",
+ "tests"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed",
+ "hashes": {
+ "sha256": "b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "beautifulsoup4",
+ "version": "4.12.3",
+ "summary": "Screen-scraping library",
+ "description": "Beautiful Soup is a library that makes it easy to scrape information\nfrom web pages. It sits atop an HTML or XML parser, providing Pythonic\nidioms for iterating, searching, and modifying the parse tree.\n\n# Quick start\n\n```\n>>> from bs4 import BeautifulSoup\n>>> soup = BeautifulSoup(\"SomebadHTML\")\n>>> print(soup.prettify())\n\n \n
\n Some\n \n bad\n \n HTML\n \n \n
\n \n\n>>> soup.find(text=\"bad\")\n'bad'\n>>> soup.i\nHTML\n#\n>>> soup = BeautifulSoup(\"SomebadXML\", \"xml\")\n#\n>>> print(soup.prettify())\n\n\n Some\n \n bad\n \n XML\n \n\n```\n\nTo go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/).\n\n# Links\n\n* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/)\n* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)\n* [Discussion group](https://groups.google.com/group/beautifulsoup/)\n* [Development](https://code.launchpad.net/beautifulsoup/)\n* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/)\n* [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG)\n\n# Note on Python 2 sunsetting\n\nBeautiful Soup's support for Python 2 was discontinued on December 31,\n2020: one year after the sunset date for Python 2 itself. From this\npoint onward, new Beautiful Soup development will exclusively target\nPython 3. The final release of Beautiful Soup 4 to support Python 2\nwas 4.9.3.\n\n# Supporting the project\n\nIf you use Beautiful Soup as part of your professional work, please consider a\n[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme).\nThis will support many of the free software projects your organization\ndepends on, not just Beautiful Soup.\n\nIf you use Beautiful Soup for personal projects, the best way to say\nthank you is to read\n[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I\nwrote about what Beautiful Soup has taught me about software\ndevelopment.\n\n# Building the documentation\n\nThe bs4/doc/ directory contains full documentation in Sphinx\nformat. Run `make html` in that directory to create HTML\ndocumentation.\n\n# Running the unit tests\n\nBeautiful Soup supports unit test discovery using Pytest:\n\n```\n$ pytest\n```\n\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "HTML",
+ "XML",
+ "parse",
+ "soup"
+ ],
+ "author_email": "Leonard Richardson ",
+ "license": "MIT License",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Topic :: Text Processing :: Markup :: HTML",
+ "Topic :: Text Processing :: Markup :: SGML",
+ "Topic :: Text Processing :: Markup :: XML"
+ ],
+ "requires_dist": [
+ "soupsieve>1.2",
+ "cchardet; extra == 'cchardet'",
+ "chardet; extra == 'chardet'",
+ "charset-normalizer; extra == 'charset-normalizer'",
+ "html5lib; extra == 'html5lib'",
+ "lxml; extra == 'lxml'"
+ ],
+ "requires_python": ">=3.6.0",
+ "project_url": [
+ "Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/",
+ "Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/"
+ ],
+ "provides_extra": [
+ "cchardet",
+ "chardet",
+ "charset-normalizer",
+ "html5lib",
+ "lxml"
+ ]
+ }
+ },
+ {
+ "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": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "colorama",
+ "version": "0.4.6",
+ "summary": "Cross-platform colored terminal text.",
+ "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 `_ |\n`Github for source `_ |\n`Colorama for enterprise on Tidelift `_\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 `_\nthe fabulous `Blessings `_,\nor the incredible `_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 [ ; ... \n\nWhere ```` is an integer, and ```` is a single letter. Zero or\nmore params are passed to a ````. 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 [ ; ... ``\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",
+ "description_content_type": "text/x-rst",
+ "keywords": [
+ "ansi",
+ "color",
+ "colour",
+ "crossplatform",
+ "terminal",
+ "text",
+ "windows",
+ "xplatform"
+ ],
+ "author_email": "Jonathan Hartley ",
+ "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"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186",
+ "hashes": {
+ "sha256": "b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "decorator",
+ "version": "5.1.1",
+ "platform": [
+ "All"
+ ],
+ "summary": "Decorators for Humans",
+ "description": "Decorators for Humans\n=====================\n\nThe goal of the decorator module is to make it easy to define\nsignature-preserving function decorators and decorator factories.\nIt also includes an implementation of multiple dispatch and other niceties\n(please check the docs). It is released under a two-clauses\nBSD license, i.e. basically you can do whatever you want with it but I am not\nresponsible.\n\nInstallation\n-------------\n\nIf you are lazy, just perform\n\n ``$ pip install decorator``\n\nwhich will install just the module on your system.\n\nIf you prefer to install the full distribution from source, including\nthe documentation, clone the `GitHub repo`_ or download the tarball_, unpack it and run\n\n ``$ pip install .``\n\nin the main directory, possibly as superuser.\n\n.. _tarball: https://pypi.org/project/decorator/#files\n.. _GitHub repo: https://github.com/micheles/decorator\n\nTesting\n--------\n\nIf you have the source code installation you can run the tests with\n\n `$ python src/tests/test.py -v`\n\nor (if you have setuptools installed)\n\n `$ python setup.py test`\n\nNotice that you may run into trouble if in your system there\nis an older version of the decorator module; in such a case remove the\nold version. It is safe even to copy the module `decorator.py` over\nan existing one, since we kept backward-compatibility for a long time.\n\nRepository\n---------------\n\nThe project is hosted on GitHub. You can look at the source here:\n\n https://github.com/micheles/decorator\n\nDocumentation\n---------------\n\nThe documentation has been moved to https://github.com/micheles/decorator/blob/master/docs/documentation.md\n\nFrom there you can get a PDF version by simply using the print\nfunctionality of your browser.\n\nHere is the documentation for previous versions of the module:\n\nhttps://github.com/micheles/decorator/blob/4.3.2/docs/tests.documentation.rst\nhttps://github.com/micheles/decorator/blob/4.2.1/docs/tests.documentation.rst\nhttps://github.com/micheles/decorator/blob/4.1.2/docs/tests.documentation.rst\nhttps://github.com/micheles/decorator/blob/4.0.0/documentation.rst\nhttps://github.com/micheles/decorator/blob/3.4.2/documentation.rst\n\nFor the impatient\n-----------------\n\nHere is an example of how to define a family of decorators tracing slow\noperations:\n\n.. code-block:: python\n\n from decorator import decorator\n\n @decorator\n def warn_slow(func, timelimit=60, *args, **kw):\n t0 = time.time()\n result = func(*args, **kw)\n dt = time.time() - t0\n if dt > timelimit:\n logging.warn('%s took %d seconds', func.__name__, dt)\n else:\n logging.info('%s took %d seconds', func.__name__, dt)\n return result\n\n @warn_slow # warn if it takes more than 1 minute\n def preprocess_input_files(inputdir, tempdir):\n ...\n\n @warn_slow(timelimit=600) # warn if it takes more than 10 minutes\n def run_calculation(tempdir, outdir):\n ...\n\nEnjoy!\n\n\n",
+ "keywords": [
+ "decorators",
+ "generic",
+ "utility"
+ ],
+ "home_page": "https://github.com/micheles/decorator",
+ "author": "Michele Simionato",
+ "author_email": "michele.simionato@gmail.com",
+ "license": "new BSD License",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "Natural Language :: English",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "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 :: Implementation :: CPython",
+ "Topic :: Software Development :: Libraries",
+ "Topic :: Utilities"
+ ],
+ "requires_python": ">=3.5"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61",
+ "hashes": {
+ "sha256": "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "defusedxml",
+ "version": "0.7.1",
+ "platform": [
+ "all"
+ ],
+ "summary": "XML bomb protection for Python stdlib modules",
+ "description": "===================================================\ndefusedxml -- defusing XML bombs and other exploits\n===================================================\n\n.. image:: https://img.shields.io/pypi/v/defusedxml.svg\n :target: https://pypi.org/project/defusedxml/\n :alt: Latest Version\n\n.. image:: https://img.shields.io/pypi/pyversions/defusedxml.svg\n :target: https://pypi.org/project/defusedxml/\n :alt: Supported Python versions\n\n.. image:: https://travis-ci.org/tiran/defusedxml.svg?branch=master\n :target: https://travis-ci.org/tiran/defusedxml\n :alt: Travis CI\n\n.. image:: https://codecov.io/github/tiran/defusedxml/coverage.svg?branch=master\n :target: https://codecov.io/github/tiran/defusedxml?branch=master\n :alt: codecov\n\n.. image:: https://img.shields.io/pypi/dm/defusedxml.svg\n :target: https://pypistats.org/packages/defusedxml\n :alt: PyPI downloads\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n :alt: Code style: black\n\n..\n\n \"It's just XML, what could probably go wrong?\"\n\nChristian Heimes \n\nSynopsis\n========\n\nThe results of an attack on a vulnerable XML library can be fairly dramatic.\nWith just a few hundred **Bytes** of XML data an attacker can occupy several\n**Gigabytes** of memory within **seconds**. An attacker can also keep\nCPUs busy for a long time with a small to medium size request. Under some\ncircumstances it is even possible to access local files on your\nserver, to circumvent a firewall, or to abuse services to rebound attacks to\nthird parties.\n\nThe attacks use and abuse less common features of XML and its parsers. The\nmajority of developers are unacquainted with features such as processing\ninstructions and entity expansions that XML inherited from SGML. At best\nthey know about ```` from experience with HTML but they are not\naware that a document type definition (DTD) can generate an HTTP request\nor load a file from the file system.\n\nNone of the issues is new. They have been known for a long time. Billion\nlaughs was first reported in 2003. Nevertheless some XML libraries and\napplications are still vulnerable and even heavy users of XML are\nsurprised by these features. It's hard to say whom to blame for the\nsituation. It's too short sighted to shift all blame on XML parsers and\nXML libraries for using insecure default settings. After all they\nproperly implement XML specifications. Application developers must not rely\nthat a library is always configured for security and potential harmful data\nby default.\n\n\n.. contents:: Table of Contents\n :depth: 2\n\n\nAttack vectors\n==============\n\nbillion laughs / exponential entity expansion\n---------------------------------------------\n\nThe `Billion Laughs`_ attack -- also known as exponential entity expansion --\nuses multiple levels of nested entities. The original example uses 9 levels\nof 10 expansions in each level to expand the string ``lol`` to a string of\n3 * 10 :sup:`9` bytes, hence the name \"billion laughs\". The resulting string\noccupies 3 GB (2.79 GiB) of memory; intermediate strings require additional\nmemory. Because most parsers don't cache the intermediate step for every\nexpansion it is repeated over and over again. It increases the CPU load even\nmore.\n\nAn XML document of just a few hundred bytes can disrupt all services on a\nmachine within seconds.\n\nExample XML::\n\n \n \n \n \n ]>\n &d;\n\n\nquadratic blowup entity expansion\n---------------------------------\n\nA quadratic blowup attack is similar to a `Billion Laughs`_ attack; it abuses\nentity expansion, too. Instead of nested entities it repeats one large entity\nwith a couple of thousand chars over and over again. The attack isn't as\nefficient as the exponential case but it avoids triggering countermeasures of\nparsers against heavily nested entities. Some parsers limit the depth and\nbreadth of a single entity but not the total amount of expanded text\nthroughout an entire XML document.\n\nA medium-sized XML document with a couple of hundred kilobytes can require a\ncouple of hundred MB to several GB of memory. When the attack is combined\nwith some level of nested expansion an attacker is able to achieve a higher\nratio of success.\n\n::\n\n \n ]>\n &a;&a;&a;... repeat\n\n\nexternal entity expansion (remote)\n----------------------------------\n\nEntity declarations can contain more than just text for replacement. They can\nalso point to external resources by public identifiers or system identifiers.\nSystem identifiers are standard URIs. When the URI is a URL (e.g. a\n``http://`` locator) some parsers download the resource from the remote\nlocation and embed them into the XML document verbatim.\n\nSimple example of a parsed external entity::\n\n \n ]>\n ⅇ\n\nThe case of parsed external entities works only for valid XML content. The\nXML standard also supports unparsed external entities with a\n``NData declaration``.\n\nExternal entity expansion opens the door to plenty of exploits. An attacker\ncan abuse a vulnerable XML library and application to rebound and forward\nnetwork requests with the IP address of the server. It highly depends\non the parser and the application what kind of exploit is possible. For\nexample:\n\n* An attacker can circumvent firewalls and gain access to restricted\n resources as all the requests are made from an internal and trustworthy\n IP address, not from the outside.\n* An attacker can abuse a service to attack, spy on or DoS your servers but\n also third party services. The attack is disguised with the IP address of\n the server and the attacker is able to utilize the high bandwidth of a big\n machine.\n* An attacker can exhaust additional resources on the machine, e.g. with\n requests to a service that doesn't respond or responds with very large\n files.\n* An attacker may gain knowledge, when, how often and from which IP address\n an XML document is accessed.\n* An attacker could send mail from inside your network if the URL handler\n supports ``smtp://`` URIs.\n\n\nexternal entity expansion (local file)\n--------------------------------------\n\nExternal entities with references to local files are a sub-case of external\nentity expansion. It's listed as an extra attack because it deserves extra\nattention. Some XML libraries such as lxml disable network access by default\nbut still allow entity expansion with local file access by default. Local\nfiles are either referenced with a ``file://`` URL or by a file path (either\nrelative or absolute).\n\nAn attacker may be able to access and download all files that can be read by\nthe application process. This may include critical configuration files, too.\n\n::\n\n \n ]>\n ⅇ\n\n\nDTD retrieval\n-------------\n\nThis case is similar to external entity expansion, too. Some XML libraries\nlike Python's xml.dom.pulldom retrieve document type definitions from remote\nor local locations. Several attack scenarios from the external entity case\napply to this issue as well.\n\n::\n\n \n \n \n \n text\n \n\n\nPython XML Libraries\n====================\n\n.. csv-table:: vulnerabilities and features\n :header: \"kind\", \"sax\", \"etree\", \"minidom\", \"pulldom\", \"xmlrpc\", \"lxml\", \"genshi\"\n :widths: 24, 7, 8, 8, 7, 8, 8, 8\n :stub-columns: 0\n\n \"billion laughs\", \"**True**\", \"**True**\", \"**True**\", \"**True**\", \"**True**\", \"False (1)\", \"False (5)\"\n \"quadratic blowup\", \"**True**\", \"**True**\", \"**True**\", \"**True**\", \"**True**\", \"**True**\", \"False (5)\"\n \"external entity expansion (remote)\", \"**True**\", \"False (3)\", \"False (4)\", \"**True**\", \"false\", \"False (1)\", \"False (5)\"\n \"external entity expansion (local file)\", \"**True**\", \"False (3)\", \"False (4)\", \"**True**\", \"false\", \"**True**\", \"False (5)\"\n \"DTD retrieval\", \"**True**\", \"False\", \"False\", \"**True**\", \"false\", \"False (1)\", \"False\"\n \"gzip bomb\", \"False\", \"False\", \"False\", \"False\", \"**True**\", \"**partly** (2)\", \"False\"\n \"xpath support (7)\", \"False\", \"False\", \"False\", \"False\", \"False\", \"**True**\", \"False\"\n \"xsl(t) support (7)\", \"False\", \"False\", \"False\", \"False\", \"False\", \"**True**\", \"False\"\n \"xinclude support (7)\", \"False\", \"**True** (6)\", \"False\", \"False\", \"False\", \"**True** (6)\", \"**True**\"\n \"C library\", \"expat\", \"expat\", \"expat\", \"expat\", \"expat\", \"libxml2\", \"expat\"\n\n1. Lxml is protected against billion laughs attacks and doesn't do network\n lookups by default.\n2. libxml2 and lxml are not directly vulnerable to gzip decompression bombs\n but they don't protect you against them either.\n3. xml.etree doesn't expand entities and raises a ParserError when an entity\n occurs.\n4. minidom doesn't expand entities and simply returns the unexpanded entity\n verbatim.\n5. genshi.input of genshi 0.6 doesn't support entity expansion and raises a\n ParserError when an entity occurs.\n6. Library has (limited) XInclude support but requires an additional step to\n process inclusion.\n7. These are features but they may introduce exploitable holes, see\n `Other things to consider`_\n\n\nSettings in standard library\n----------------------------\n\n\nxml.sax.handler Features\n........................\n\nfeature_external_ges (http://xml.org/sax/features/external-general-entities)\n disables external entity expansion\n\nfeature_external_pes (http://xml.org/sax/features/external-parameter-entities)\n the option is ignored and doesn't modify any functionality\n\nDOM xml.dom.xmlbuilder.Options\n..............................\n\nexternal_parameter_entities\n ignored\n\nexternal_general_entities\n ignored\n\nexternal_dtd_subset\n ignored\n\nentities\n unsure\n\n\ndefusedxml\n==========\n\nThe `defusedxml package`_ (`defusedxml on PyPI`_)\ncontains several Python-only workarounds and fixes\nfor denial of service and other vulnerabilities in Python's XML libraries.\nIn order to benefit from the protection you just have to import and use the\nlisted functions / classes from the right defusedxml module instead of the\noriginal module. Merely `defusedxml.xmlrpc`_ is implemented as monkey patch.\n\nInstead of::\n\n >>> from xml.etree.ElementTree import parse\n >>> et = parse(xmlfile)\n\nalter code to::\n\n >>> from defusedxml.ElementTree import parse\n >>> et = parse(xmlfile)\n\nAdditionally the package has an **untested** function to monkey patch\nall stdlib modules with ``defusedxml.defuse_stdlib()``.\n\nAll functions and parser classes accept three additional keyword arguments.\nThey return either the same objects as the original functions or compatible\nsubclasses.\n\nforbid_dtd (default: False)\n disallow XML with a ```` processing instruction and raise a\n *DTDForbidden* exception when a DTD processing instruction is found.\n\nforbid_entities (default: True)\n disallow XML with ```` declarations inside the DTD and raise an\n *EntitiesForbidden* exception when an entity is declared.\n\nforbid_external (default: True)\n disallow any access to remote or local resources in external entities\n or DTD and raising an *ExternalReferenceForbidden* exception when a DTD\n or entity references an external resource.\n\n\ndefusedxml (package)\n--------------------\n\nDefusedXmlException, DTDForbidden, EntitiesForbidden,\nExternalReferenceForbidden, NotSupportedError\n\ndefuse_stdlib() (*experimental*)\n\n\ndefusedxml.cElementTree\n-----------------------\n\n**NOTE** ``defusedxml.cElementTree`` is deprecated and will be removed in a\nfuture release. Import from ``defusedxml.ElementTree`` instead.\n\nparse(), iterparse(), fromstring(), XMLParser\n\n\ndefusedxml.ElementTree\n-----------------------\n\nparse(), iterparse(), fromstring(), XMLParser\n\n\ndefusedxml.expatreader\n----------------------\n\ncreate_parser(), DefusedExpatParser\n\n\ndefusedxml.sax\n--------------\n\nparse(), parseString(), make_parser()\n\n\ndefusedxml.expatbuilder\n-----------------------\n\nparse(), parseString(), DefusedExpatBuilder, DefusedExpatBuilderNS\n\n\ndefusedxml.minidom\n------------------\n\nparse(), parseString()\n\n\ndefusedxml.pulldom\n------------------\n\nparse(), parseString()\n\n\ndefusedxml.xmlrpc\n-----------------\n\nThe fix is implemented as monkey patch for the stdlib's xmlrpc package (3.x)\nor xmlrpclib module (2.x). The function `monkey_patch()` enables the fixes,\n`unmonkey_patch()` removes the patch and puts the code in its former state.\n\nThe monkey patch protects against XML related attacks as well as\ndecompression bombs and excessively large requests or responses. The default\nsetting is 30 MB for requests, responses and gzip decompression. You can\nmodify the default by changing the module variable `MAX_DATA`. A value of\n`-1` disables the limit.\n\n\ndefusedxml.lxml\n---------------\n\n**DEPRECATED** The module is deprecated and will be removed in a future\nrelease.\n\nThe module acts as an *example* how you could protect code that uses\nlxml.etree. It implements a custom Element class that filters out\nEntity instances, a custom parser factory and a thread local storage for\nparser instances. It also has a check_docinfo() function which inspects\na tree for internal or external DTDs and entity declarations. In order to\ncheck for entities lxml > 3.0 is required.\n\nparse(), fromstring()\nRestrictedElement, GlobalParserTLS, getDefaultParser(), check_docinfo()\n\n\ndefusedexpat\n============\n\nThe `defusedexpat package`_ (`defusedexpat on PyPI`_)\ncomes with binary extensions and a\n`modified expat`_ library instead of the standard `expat parser`_. It's\nbasically a stand-alone version of the patches for Python's standard\nlibrary C extensions.\n\nModifications in expat\n----------------------\n\nnew definitions::\n\n XML_BOMB_PROTECTION\n XML_DEFAULT_MAX_ENTITY_INDIRECTIONS\n XML_DEFAULT_MAX_ENTITY_EXPANSIONS\n XML_DEFAULT_RESET_DTD\n\nnew XML_FeatureEnum members::\n\n XML_FEATURE_MAX_ENTITY_INDIRECTIONS\n XML_FEATURE_MAX_ENTITY_EXPANSIONS\n XML_FEATURE_IGNORE_DTD\n\nnew XML_Error members::\n\n XML_ERROR_ENTITY_INDIRECTIONS\n XML_ERROR_ENTITY_EXPANSION\n\nnew API functions::\n\n int XML_GetFeature(XML_Parser parser,\n enum XML_FeatureEnum feature,\n long *value);\n int XML_SetFeature(XML_Parser parser,\n enum XML_FeatureEnum feature,\n long value);\n int XML_GetFeatureDefault(enum XML_FeatureEnum feature,\n long *value);\n int XML_SetFeatureDefault(enum XML_FeatureEnum feature,\n long value);\n\nXML_FEATURE_MAX_ENTITY_INDIRECTIONS\n Limit the amount of indirections that are allowed to occur during the\n expansion of a nested entity. A counter starts when an entity reference\n is encountered. It resets after the entity is fully expanded. The limit\n protects the parser against exponential entity expansion attacks (aka\n billion laughs attack). When the limit is exceeded the parser stops and\n fails with `XML_ERROR_ENTITY_INDIRECTIONS`.\n A value of 0 disables the protection.\n\n Supported range\n 0 .. UINT_MAX\n Default\n 40\n\nXML_FEATURE_MAX_ENTITY_EXPANSIONS\n Limit the total length of all entity expansions throughout the entire\n document. The lengths of all entities are accumulated in a parser variable.\n The setting protects against quadratic blowup attacks (lots of expansions\n of a large entity declaration). When the sum of all entities exceeds\n the limit, the parser stops and fails with `XML_ERROR_ENTITY_EXPANSION`.\n A value of 0 disables the protection.\n\n Supported range\n 0 .. UINT_MAX\n Default\n 8 MiB\n\nXML_FEATURE_RESET_DTD\n Reset all DTD information after the block has been parsed. When\n the flag is set (default: false) all DTD information after the\n endDoctypeDeclHandler has been called. The flag can be set inside the\n endDoctypeDeclHandler. Without DTD information any entity reference in\n the document body leads to `XML_ERROR_UNDEFINED_ENTITY`.\n\n Supported range\n 0, 1\n Default\n 0\n\n\nHow to avoid XML vulnerabilities\n================================\n\nBest practices\n--------------\n\n* Don't allow DTDs\n* Don't expand entities\n* Don't resolve externals\n* Limit parse depth\n* Limit total input size\n* Limit parse time\n* Favor a SAX or iterparse-like parser for potential large data\n* Validate and properly quote arguments to XSL transformations and\n XPath queries\n* Don't use XPath expression from untrusted sources\n* Don't apply XSL transformations that come untrusted sources\n\n(based on Brad Hill's `Attacking XML Security`_)\n\n\nOther things to consider\n========================\n\nXML, XML parsers and processing libraries have more features and possible\nissue that could lead to DoS vulnerabilities or security exploits in\napplications. I have compiled an incomplete list of theoretical issues that\nneed further research and more attention. The list is deliberately pessimistic\nand a bit paranoid, too. It contains things that might go wrong under daffy\ncircumstances.\n\n\nattribute blowup / hash collision attack\n----------------------------------------\n\nXML parsers may use an algorithm with quadratic runtime O(n :sup:`2`) to\nhandle attributes and namespaces. If it uses hash tables (dictionaries) to\nstore attributes and namespaces the implementation may be vulnerable to\nhash collision attacks, thus reducing the performance to O(n :sup:`2`) again.\nIn either case an attacker is able to forge a denial of service attack with\nan XML document that contains thousands upon thousands of attributes in\na single node.\n\nI haven't researched yet if expat, pyexpat or libxml2 are vulnerable.\n\n\ndecompression bomb\n------------------\n\nThe issue of decompression bombs (aka `ZIP bomb`_) apply to all XML libraries\nthat can parse compressed XML stream like gzipped HTTP streams or LZMA-ed\nfiles. For an attacker it can reduce the amount of transmitted data by three\nmagnitudes or more. Gzip is able to compress 1 GiB zeros to roughly 1 MB,\nlzma is even better::\n\n $ dd if=/dev/zero bs=1M count=1024 | gzip > zeros.gz\n $ dd if=/dev/zero bs=1M count=1024 | lzma -z > zeros.xy\n $ ls -sh zeros.*\n 1020K zeros.gz\n 148K zeros.xy\n\nNone of Python's standard XML libraries decompress streams except for\n``xmlrpclib``. The module is vulnerable \nto decompression bombs.\n\nlxml can load and process compressed data through libxml2 transparently.\nlibxml2 can handle even very large blobs of compressed data efficiently\nwithout using too much memory. But it doesn't protect applications from\ndecompression bombs. A carefully written SAX or iterparse-like approach can\nbe safe.\n\n\nProcessing Instruction\n----------------------\n\n`PI`_'s like::\n\n \n\nmay impose more threats for XML processing. It depends if and how a\nprocessor handles processing instructions. The issue of URL retrieval with\nnetwork or local file access apply to processing instructions, too.\n\n\nOther DTD features\n------------------\n\n`DTD`_ has more features like ````. I haven't researched how\nthese features may be a security threat.\n\n\nXPath\n-----\n\nXPath statements may introduce DoS vulnerabilities. Code should never execute\nqueries from untrusted sources. An attacker may also be able to create an XML\ndocument that makes certain XPath queries costly or resource hungry.\n\n\nXPath injection attacks\n-----------------------\n\nXPath injeciton attacks pretty much work like SQL injection attacks.\nArguments to XPath queries must be quoted and validated properly, especially\nwhen they are taken from the user. The page `Avoid the dangers of XPath injection`_\nlist some ramifications of XPath injections.\n\nPython's standard library doesn't have XPath support. Lxml supports\nparameterized XPath queries which does proper quoting. You just have to use\nits xpath() method correctly::\n\n # DON'T\n >>> tree.xpath(\"/tag[@id='%s']\" % value)\n\n # instead do\n >>> tree.xpath(\"/tag[@id=$tagid]\", tagid=name)\n\n\nXInclude\n--------\n\n`XML Inclusion`_ is another way to load and include external files::\n\n \n \n \n\nThis feature should be disabled when XML files from an untrusted source are\nprocessed. Some Python XML libraries and libxml2 support XInclude but don't\nhave an option to sandbox inclusion and limit it to allowed directories.\n\n\nXMLSchema location\n------------------\n\nA validating XML parser may download schema files from the information in a\n``xsi:schemaLocation`` attribute.\n\n::\n\n \n \n\n\nXSL Transformation\n------------------\n\nYou should keep in mind that XSLT is a Turing complete language. Never\nprocess XSLT code from unknown or untrusted source! XSLT processors may\nallow you to interact with external resources in ways you can't even imagine.\nSome processors even support extensions that allow read/write access to file\nsystem, access to JRE objects or scripting with Jython.\n\nExample from `Attacking XML Security`_ for Xalan-J::\n\n \n \n \n \n \n \n \n \n\n\nRelated CVEs\n============\n\nCVE-2013-1664\n Unrestricted entity expansion induces DoS vulnerabilities in Python XML\n libraries (XML bomb)\n\nCVE-2013-1665\n External entity expansion in Python XML libraries inflicts potential\n security flaws and DoS vulnerabilities\n\n\nOther languages / frameworks\n=============================\n\nSeveral other programming languages and frameworks are vulnerable as well. A\ncouple of them are affected by the fact that libxml2 up to 2.9.0 has no\nprotection against quadratic blowup attacks. Most of them have potential\ndangerous default settings for entity expansion and external entities, too.\n\nPerl\n----\n\nPerl's XML::Simple is vulnerable to quadratic entity expansion and external\nentity expansion (both local and remote).\n\n\nRuby\n----\n\nRuby's REXML document parser is vulnerable to entity expansion attacks\n(both quadratic and exponential) but it doesn't do external entity\nexpansion by default. In order to counteract entity expansion you have to\ndisable the feature::\n\n REXML::Document.entity_expansion_limit = 0\n\nlibxml-ruby and hpricot don't expand entities in their default configuration.\n\n\nPHP\n---\n\nPHP's SimpleXML API is vulnerable to quadratic entity expansion and loads\nentities from local and remote resources. The option ``LIBXML_NONET`` disables\nnetwork access but still allows local file access. ``LIBXML_NOENT`` seems to\nhave no effect on entity expansion in PHP 5.4.6.\n\n\nC# / .NET / Mono\n----------------\n\nInformation in `XML DoS and Defenses (MSDN)`_ suggest that .NET is\nvulnerable with its default settings. The article contains code snippets\nhow to create a secure XML reader::\n\n XmlReaderSettings settings = new XmlReaderSettings();\n settings.ProhibitDtd = false;\n settings.MaxCharactersFromEntities = 1024;\n settings.XmlResolver = null;\n XmlReader reader = XmlReader.Create(stream, settings);\n\n\nJava\n----\n\nUntested. The documentation of Xerces and its `Xerces SecurityMananger`_\nsounds like Xerces is also vulnerable to billion laugh attacks with its\ndefault settings. It also does entity resolving when an\n``org.xml.sax.EntityResolver`` is configured. I'm not yet sure about the\ndefault setting here.\n\nJava specialists suggest to have a custom builder factory::\n\n DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();\n builderFactory.setXIncludeAware(False);\n builderFactory.setExpandEntityReferences(False);\n builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, True);\n # either\n builderFactory.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", True);\n # or if you need DTDs\n builderFactory.setFeature(\"http://xml.org/sax/features/external-general-entities\", False);\n builderFactory.setFeature(\"http://xml.org/sax/features/external-parameter-entities\", False);\n builderFactory.setFeature(\"http://apache.org/xml/features/nonvalidating/load-external-dtd\", False);\n builderFactory.setFeature(\"http://apache.org/xml/features/nonvalidating/load-dtd-grammar\", False);\n\n\nTODO\n====\n\n* DOM: Use xml.dom.xmlbuilder options for entity handling\n* SAX: take feature_external_ges and feature_external_pes (?) into account\n* test experimental monkey patching of stdlib modules\n* improve documentation\n\n\nLicense\n=======\n\nCopyright (c) 2013-2017 by Christian Heimes \n\nLicensed to PSF under a Contributor Agreement.\n\nSee https://www.python.org/psf/license for licensing details.\n\n\nAcknowledgements\n================\n\nBrett Cannon (Python Core developer)\n review and code cleanup\n\nAntoine Pitrou (Python Core developer)\n code review\n\nAaron Patterson, Ben Murphy and Michael Koziarski (Ruby community)\n Many thanks to Aaron, Ben and Michael from the Ruby community for their\n report and assistance.\n\nThierry Carrez (OpenStack)\n Many thanks to Thierry for his report to the Python Security Response\n Team on behalf of the OpenStack security team.\n\nCarl Meyer (Django)\n Many thanks to Carl for his report to PSRT on behalf of the Django security\n team.\n\nDaniel Veillard (libxml2)\n Many thanks to Daniel for his insight and assistance with libxml2.\n\nsemantics GmbH (https://www.semantics.de/)\n Many thanks to my employer semantics for letting me work on the issue\n during working hours as part of semantics's open source initiative.\n\n\nReferences\n==========\n\n* `XML DoS and Defenses (MSDN)`_\n* `Billion Laughs`_ on Wikipedia\n* `ZIP bomb`_ on Wikipedia\n* `Configure SAX parsers for secure processing`_\n* `Testing for XML Injection`_\n\n.. _defusedxml package: https://github.com/tiran/defusedxml\n.. _defusedxml on PyPI: https://pypi.python.org/pypi/defusedxml\n.. _defusedexpat package: https://github.com/tiran/defusedexpat\n.. _defusedexpat on PyPI: https://pypi.python.org/pypi/defusedexpat\n.. _modified expat: https://github.com/tiran/expat\n.. _expat parser: http://expat.sourceforge.net/\n.. _Attacking XML Security: https://www.isecpartners.com/media/12976/iSEC-HILL-Attacking-XML-Security-bh07.pdf\n.. _Billion Laughs: https://en.wikipedia.org/wiki/Billion_laughs\n.. _XML DoS and Defenses (MSDN): https://msdn.microsoft.com/en-us/magazine/ee335713.aspx\n.. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb\n.. _DTD: https://en.wikipedia.org/wiki/Document_Type_Definition\n.. _PI: https://en.wikipedia.org/wiki/Processing_Instruction\n.. _Avoid the dangers of XPath injection: http://www.ibm.com/developerworks/xml/library/x-xpathinjection/index.html\n.. _Configure SAX parsers for secure processing: http://www.ibm.com/developerworks/xml/library/x-tipcfsx/index.html\n.. _Testing for XML Injection: https://www.owasp.org/index.php/Testing_for_XML_Injection_(OWASP-DV-008)\n.. _Xerces SecurityMananger: https://xerces.apache.org/xerces2-j/javadocs/xerces2/org/apache/xerces/util/SecurityManager.html\n.. _XML Inclusion: https://www.w3.org/TR/xinclude/#include_element\n\nChangelog\n=========\n\ndefusedxml 0.7.1\n---------------------\n\n*Release date: 08-Mar-2021*\n\n- Fix regression ``defusedxml.ElementTree.ParseError`` (#63)\n The ``ParseError`` exception is now the same class object as\n ``xml.etree.ElementTree.ParseError`` again.\n\n\ndefusedxml 0.7.0\n----------------\n\n*Release date: 4-Mar-2021*\n\n- No changes\n\n\ndefusedxml 0.7.0rc2\n-------------------\n\n*Release date: 12-Jan-2021*\n\n- Re-add and deprecate ``defusedxml.cElementTree``\n- Use GitHub Actions instead of TravisCI\n- Restore ``ElementTree`` attribute of ``xml.etree`` module after patching\n\ndefusedxml 0.7.0rc1\n-------------------\n\n*Release date: 04-May-2020*\n\n- Add support for Python 3.9\n- ``defusedxml.cElementTree`` is not available with Python 3.9.\n- Python 2 is deprecate. Support for Python 2 will be removed in 0.8.0.\n\n\ndefusedxml 0.6.0\n----------------\n\n*Release date: 17-Apr-2019*\n\n- Increase test coverage.\n- Add badges to README.\n\n\ndefusedxml 0.6.0rc1\n-------------------\n\n*Release date: 14-Apr-2019*\n\n- Test on Python 3.7 stable and 3.8-dev\n- Drop support for Python 3.4\n- No longer pass *html* argument to XMLParse. It has been deprecated and\n ignored for a long time. The DefusedXMLParser still takes a html argument.\n A deprecation warning is issued when the argument is False and a TypeError\n when it's True.\n- defusedxml now fails early when pyexpat stdlib module is not available or\n broken.\n- defusedxml.ElementTree.__all__ now lists ParseError as public attribute.\n- The defusedxml.ElementTree and defusedxml.cElementTree modules had a typo\n and used XMLParse instead of XMLParser as an alias for DefusedXMLParser.\n Both the old and fixed name are now available.\n\n\ndefusedxml 0.5.0\n----------------\n\n*Release date: 07-Feb-2017*\n\n- No changes\n\n\ndefusedxml 0.5.0.rc1\n--------------------\n\n*Release date: 28-Jan-2017*\n\n- Add compatibility with Python 3.6\n- Drop support for Python 2.6, 3.1, 3.2, 3.3\n- Fix lxml tests (XMLSyntaxError: Detected an entity reference loop)\n\n\ndefusedxml 0.4.1\n----------------\n\n*Release date: 28-Mar-2013*\n\n- Add more demo exploits, e.g. python_external.py and Xalan XSLT demos.\n- Improved documentation.\n\n\ndefusedxml 0.4\n--------------\n\n*Release date: 25-Feb-2013*\n\n- As per http://seclists.org/oss-sec/2013/q1/340 please REJECT\n CVE-2013-0278, CVE-2013-0279 and CVE-2013-0280 and use CVE-2013-1664,\n CVE-2013-1665 for OpenStack/etc.\n- Add missing parser_list argument to sax.make_parser(). The argument is\n ignored, though. (thanks to Florian Apolloner)\n- Add demo exploit for external entity attack on Python's SAX parser, XML-RPC\n and WebDAV.\n\n\ndefusedxml 0.3\n--------------\n\n*Release date: 19-Feb-2013*\n\n- Improve documentation\n\n\ndefusedxml 0.2\n--------------\n\n*Release date: 15-Feb-2013*\n\n- Rename ExternalEntitiesForbidden to ExternalReferenceForbidden\n- Rename defusedxml.lxml.check_dtd() to check_docinfo()\n- Unify argument names in callbacks\n- Add arguments and formatted representation to exceptions\n- Add forbid_external argument to all functions and classes\n- More tests\n- LOTS of documentation\n- Add example code for other languages (Ruby, Perl, PHP) and parsers (Genshi)\n- Add protection against XML and gzip attacks to xmlrpclib\n\ndefusedxml 0.1\n--------------\n\n*Release date: 08-Feb-2013*\n\n- Initial and internal release for PSRT review\n\n\n",
+ "keywords": [
+ "xml",
+ "bomb",
+ "DoS"
+ ],
+ "home_page": "https://github.com/tiran/defusedxml",
+ "download_url": "https://pypi.python.org/pypi/defusedxml",
+ "author": "Christian Heimes",
+ "author_email": "christian@python.org",
+ "maintainer": "Christian Heimes",
+ "maintainer_email": "christian@python.org",
+ "license": "PSFL",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: Python Software Foundation License",
+ "Natural Language :: English",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
+ "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",
+ "Topic :: Text Processing :: Markup :: XML"
+ ],
+ "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780",
+ "hashes": {
+ "sha256": "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "jupyterlab_pygments",
+ "version": "0.3.0",
+ "summary": "Pygments theme using JupyterLab CSS variables",
+ "description": "# JupyterLab Pygments Theme\n\nThis package contains a syntax coloring theme for [pygments](http://pygments.org/) making use of\nthe JupyterLab CSS variables.\n\nThe goal is to enable the use of JupyterLab's themes with pygments-generated HTML.\n\n## Screencast\n\nIn the following screencast, we demonstrate how Pygments-highlighted code can make use of the JupyterLab theme.\n\n![pygments screencast](pygments.gif)\n\n## Installation\n\n`jupyterlab_pygments` can be installed with the conda package manager\n\n```\nconda install -c conda-forge jupyterlab_pygments\n```\n\nor from pypi\n\n```\npip install jupyterlab_pygments\n```\n\n## Dependencies\n\n- `jupyterlab_pygments` requires [pygments](http://pygments.org) version `2.4.1`.\n- The CSS variables used by the theme correspond to the CodeMirror syntex coloring\n theme defined in the NPM package [@jupyterlab/codemirror](https://www.npmjs.com/package/@jupyterlab/codemirror). Supported versions for `@jupyterlab/codemirror`'s CSS include `0.19.1`, `^1.0`, and, `^2.0`.\n\n## Limitations\n\nPygments-generated HTML and CSS classes are not granular enough to reproduce\nall of the details of codemirror (the JavaScript text editor used by JupyterLab).\n\nThis includes the ability to differentiate properties from general names.\n\n## License\n\n`jupyterlab_pygments` uses a shared copyright model that enables all contributors to maintain the\ncopyright on their contributions. All code is licensed under the terms of the revised [BSD license](LICENSE).\n",
+ "description_content_type": "text/markdown",
+ "author_email": "Jupyter Development Team ",
+ "license": "Copyright (c) 2015 Project Jupyter Contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
+ "classifier": [
+ "Framework :: Jupyter",
+ "Framework :: Jupyter :: JupyterLab",
+ "Framework :: Jupyter :: JupyterLab :: 4",
+ "Framework :: Jupyter :: JupyterLab :: Extensions",
+ "Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt",
+ "License :: OSI Approved :: BSD License",
+ "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"
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Homepage, https://github.com/jupyterlab/jupyterlab_pygments",
+ "Bug Tracker, https://github.com/jupyterlab/jupyterlab_pygments/issues",
+ "Repository, https://github.com/jupyterlab/jupyterlab_pygments.git"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa",
+ "hashes": {
+ "sha256": "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "rfc3339-validator",
+ "version": "0.1.4",
+ "platform": [
+ "UNKNOWN"
+ ],
+ "summary": "A pure python RFC3339 validator",
+ "description": "# rfc3339-validator\n\nA pure python RFC3339 validator\n\n\n[![image](https://img.shields.io/pypi/v/rfc3339_validator.svg)](https://pypi.python.org/pypi/rfc3339_validator)\n[![Build Status](https://travis-ci.org/naimetti/rfc3339-validator.svg?branch=master)](https://travis-ci.org/naimetti/rfc3339-validator)\n\n# Install\n\n```shell script\npip install rfc3339-validator\n```\n\n# Usage\n\n```python\nfrom rfc3339_validator import validate_rfc3339\n\nvalidate_rfc3339('1424-45-93T15:32:12.9023368Z')\n>>> False\n\nvalidate_rfc3339('2001-10-23T15:32:12.9023368Z')\n>>> True\n```\n\n\n - Free software: MIT license\n\n\n",
+ "description_content_type": "text/markdown",
+ "keywords": [
+ "rfc3339",
+ "validator"
+ ],
+ "home_page": "https://github.com/naimetti/rfc3339-validator",
+ "author": "Nicolas Aimetti",
+ "author_email": "naimetti@yahoo.com.ar",
+ "license": "MIT license",
+ "classifier": [
+ "Development Status :: 2 - Pre-Alpha",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Natural Language :: English",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.5",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8"
+ ],
+ "requires_dist": [
+ "six"
+ ],
+ "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695",
+ "hashes": {
+ "sha256": "d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "stack-data",
+ "version": "0.6.3",
+ "summary": "Extract data from python stack frames and tracebacks for informative displays",
+ "description": "# stack_data\n\n[![Tests](https://github.com/alexmojaki/stack_data/actions/workflows/pytest.yml/badge.svg)](https://github.com/alexmojaki/stack_data/actions/workflows/pytest.yml) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/stack_data/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/stack_data?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/stack_data.svg)](https://pypi.python.org/pypi/stack_data)\n\nThis is a library that extracts data from stack frames and tracebacks, particularly to display more useful tracebacks than the default. It powers the tracebacks in IPython and [futurecoder](https://futurecoder.io/):\n\n![futurecoder example](https://futurecoder.io/static/img/features/traceback.png)\n\nYou can install it from PyPI:\n\n pip install stack_data\n \n## Basic usage\n\nHere's some code we'd like to inspect:\n\n```python\ndef foo():\n result = []\n for i in range(5):\n row = []\n result.append(row)\n print_stack()\n for j in range(5):\n row.append(i * j)\n return result\n```\n\nNote that `foo` calls a function `print_stack()`. In reality we can imagine that an exception was raised at this line, or a debugger stopped there, but this is easy to play with directly. Here's a basic implementation:\n\n```python\nimport inspect\nimport stack_data\n\n\ndef print_stack():\n frame = inspect.currentframe().f_back\n frame_info = stack_data.FrameInfo(frame)\n print(f\"{frame_info.code.co_name} at line {frame_info.lineno}\")\n print(\"-----------\")\n for line in frame_info.lines:\n print(f\"{'-->' if line.is_current else ' '} {line.lineno:4} | {line.render()}\")\n```\n\n(Beware that this has a major bug - it doesn't account for line gaps, which we'll learn about later)\n\nThe output of one call to `print_stack()` looks like:\n\n```\nfoo at line 9\n-----------\n 6 | for i in range(5):\n 7 | row = []\n 8 | result.append(row)\n--> 9 | print_stack()\n 10 | for j in range(5):\n```\n\nThe code for `print_stack()` is fairly self-explanatory. If you want to learn more details about a particular class or method I suggest looking through some docstrings. `FrameInfo` is a class that accepts either a frame or a traceback object and provides a bunch of nice attributes and properties (which are cached so you don't need to worry about performance). In particular `frame_info.lines` is a list of `Line` objects. `line.render()` returns the source code of that line suitable for display. Without any arguments it simply strips any common leading indentation. Later on we'll see a more powerful use for it.\n\nYou can see that `frame_info.lines` includes some lines of surrounding context. By default it includes 3 pieces of context before the main line and 1 piece after. We can configure the amount of context by passing options:\n\n```python\noptions = stack_data.Options(before=1, after=0)\nframe_info = stack_data.FrameInfo(frame, options)\n```\n\nThen the output looks like:\n\n```\nfoo at line 9\n-----------\n 8 | result.append(row)\n--> 9 | print_stack()\n```\n\nNote that these parameters are not the number of *lines* before and after to include, but the number of *pieces*. A piece is a range of one or more lines in a file that should logically be grouped together. A piece contains either a single simple statement or a part of a compound statement (loops, if, try/except, etc) that doesn't contain any other statements. Most pieces are a single line, but a multi-line statement or `if` condition is a single piece. In the example above, all pieces are one line, because nothing is spread across multiple lines. If we change our code to include some multiline bits:\n\n\n```python\ndef foo():\n result = []\n for i in range(5):\n row = []\n result.append(\n row\n )\n print_stack()\n for j in range(\n 5\n ):\n row.append(i * j)\n return result\n```\n\nand then run the original code with the default options, then the output is:\n\n```\nfoo at line 11\n-----------\n 6 | for i in range(5):\n 7 | row = []\n 8 | result.append(\n 9 | row\n 10 | )\n--> 11 | print_stack()\n 12 | for j in range(\n 13 | 5\n 14 | ):\n```\n\nNow lines 8-10 and lines 12-14 are each a single piece. Note that the output is essentially the same as the original in terms of the amount of code. The division of files into pieces means that the edge of the context is intuitive and doesn't crop out parts of statements or expressions. For example, if context was measured in lines instead of pieces, the last line of the above would be `for j in range(` which is much less useful.\n\nHowever, if a piece is very long, including all of it could be cumbersome. For this, `Options` has a parameter `max_lines_per_piece`, which is 6 by default. Suppose we have a piece in our code that's longer than that:\n\n```python\n row = [\n 1,\n 2,\n 3,\n 4,\n 5,\n ]\n```\n\n`frame_info.lines` will truncate this piece so that instead of 7 `Line` objects it will produce 5 `Line` objects and one `LINE_GAP` in the middle, making 6 objects in total for the piece. Our code doesn't currently handle gaps, so it will raise an exception. We can modify it like so:\n\n```python\n for line in frame_info.lines:\n if line is stack_data.LINE_GAP:\n print(\" (...)\")\n else:\n print(f\"{'-->' if line.is_current else ' '} {line.lineno:4} | {line.render()}\")\n```\n\nNow the output looks like:\n\n```\nfoo at line 15\n-----------\n 6 | for i in range(5):\n 7 | row = [\n 8 | 1,\n 9 | 2,\n (...)\n 12 | 5,\n 13 | ]\n 14 | result.append(row)\n--> 15 | print_stack()\n 16 | for j in range(5):\n```\n\nAlternatively, you can flip the condition around and check `if isinstance(line, stack_data.Line):`. Either way, you should always check for line gaps, or your code may appear to work at first but fail when it encounters a long piece.\n\nNote that the executing piece, i.e. the piece containing the current line being executed (line 15 in this case) is never truncated, no matter how long it is.\n\nThe lines of context never stray outside `frame_info.scope`, which is the innermost function or class definition containing the current line. For example, this is the output for a short function which has neither 3 lines before nor 1 line after the current line:\n\n```\nbar at line 6\n-----------\n 4 | def bar():\n 5 | foo()\n--> 6 | print_stack()\n```\n\nSometimes it's nice to ensure that the function signature is always showing. This can be done with `Options(include_signature=True)`. The result looks like this:\n\n```\nfoo at line 14\n-----------\n 9 | def foo():\n (...)\n 11 | for i in range(5):\n 12 | row = []\n 13 | result.append(row)\n--> 14 | print_stack()\n 15 | for j in range(5):\n```\n\nTo avoid wasting space, pieces never start or end with a blank line, and blank lines between pieces are excluded. So if our code looks like this:\n\n\n```python\n for i in range(5):\n row = []\n\n result.append(row)\n print_stack()\n\n for j in range(5):\n```\n\nThe output doesn't change much, except you can see jumps in the line numbers:\n\n```\n 11 | for i in range(5):\n 12 | row = []\n 14 | result.append(row)\n--> 15 | print_stack()\n 17 | for j in range(5):\n```\n\n## Variables\n\nYou can also inspect variables and other expressions in a frame, e.g:\n\n```python\n for var in frame_info.variables:\n print(f\"{var.name} = {repr(var.value)}\")\n```\n\nwhich may output:\n\n```python\nresult = [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8], [0, 3, 6, 9, 12], []]\ni = 4\nrow = []\nj = 4\n```\n\n`frame_info.variables` returns a list of `Variable` objects, which have attributes `name`, `value`, and `nodes`, which is a list of all AST representing that expression.\n\nA `Variable` may refer to an expression other than a simple variable name. It can be any expression evaluated by the library [`pure_eval`](https://github.com/alexmojaki/pure_eval) which it deems 'interesting' (see those docs for more info). This includes expressions like `foo.bar` or `foo[bar]`. In these cases `name` is the source code of that expression. `pure_eval` ensures that it only evaluates expressions that won't have any side effects, e.g. where `foo.bar` is a normal attribute rather than a descriptor such as a property.\n\n`frame_info.variables` is a list of all the interesting expressions found in `frame_info.scope`, e.g. the current function, which may include expressions not visible in `frame_info.lines`. You can restrict the list by using `frame_info.variables_in_lines` or even `frame_info.variables_in_executing_piece`. For more control you can use `frame_info.variables_by_lineno`. See the docstrings for more information.\n\n## Rendering lines with ranges and markers\n\nSometimes you may want to insert special characters into the text for display purposes, e.g. HTML or ANSI color codes. `stack_data` provides a few tools to make this easier.\n\nLet's say we have a `Line` object where `line.text` (the original raw source code of that line) is `\"foo = bar\"`, so `line.text[6:9]` is `\"bar\"`, and we want to emphasise that part by inserting HTML at positions 6 and 9 in the text. Here's how we can do that directly:\n\n```python\nmarkers = [\n stack_data.MarkerInLine(position=6, is_start=True, string=\"\"),\n stack_data.MarkerInLine(position=9, is_start=False, string=\"\"),\n]\nline.render(markers) # returns \"foo = bar\"\n```\n\nHere `is_start=True` indicates that the marker is the first of a pair. This helps `line.render()` sort and insert the markers correctly so you don't end up with malformed HTML like `foo.bar` where tags overlap.\n\nSince we're inserting HTML, we should actually use `line.render(markers, escape_html=True)` which will escape special HTML characters in the Python source (but not the markers) so for example `foo = bar < spam` would be rendered as `foo = bar < spam`.\n\nUsually though you wouldn't create markers directly yourself. Instead you would start with one or more ranges and then convert them, like so:\n\n```python\nranges = [\n stack_data.RangeInLine(start=0, end=3, data=\"foo\"),\n stack_data.RangeInLine(start=6, end=9, data=\"bar\"),\n]\n\ndef convert_ranges(r):\n if r.data == \"bar\":\n return \"\", \"\" \n\n# This results in `markers` being the same as in the above example.\nmarkers = stack_data.markers_from_ranges(ranges, convert_ranges)\n```\n\n`RangeInLine` has a `data` attribute which can be any object. `markers_from_ranges` accepts a converter function to which it passes all the `RangeInLine` objects. If the converter function returns a pair of strings, it creates two markers from them. Otherwise it should return `None` to indicate that the range should be ignored, as with the first range containing `\"foo\"` in this example.\n\nThe reason this is useful is because there are built in tools to create these ranges for you. For example, if we change our `print_stack()` function to contain this:\n\n```python\ndef convert_variable_ranges(r):\n variable, _node = r.data\n return f'', ''\n\nmarkers = stack_data.markers_from_ranges(line.variable_ranges, convert_variable_ranges)\nprint(f\"{'-->' if line.is_current else ' '} {line.lineno:4} | {line.render(markers, escape_html=True)}\")\n```\n\nThen the output becomes:\n\n```\nfoo at line 15\n-----------\n 9 | def foo():\n (...)\n 11 | for i in range(5):\n 12 | row = []\n 14 | result.append(row)\n--> 15 | print_stack()\n 17 | for j in range(5):\n```\n\n`line.variable_ranges` is a list of RangeInLines for each Variable that appears at least partially in this line. The data attribute of the range is a pair `(variable, node)` where node is the particular AST node from the list `variable.nodes` that corresponds to this range.\n\nYou can also use `line.token_ranges` (e.g. if you want to do your own syntax highlighting) or `line.executing_node_ranges` if you want to highlight the currently executing node identified by the [`executing`](https://github.com/alexmojaki/executing) library. Or if you want to make your own range from an AST node, use `line.range_from_node(node, data)`. See the docstrings for more info.\n\n### Syntax highlighting with Pygments\n\nIf you'd like pretty colored text without the work, you can let [Pygments](https://pygments.org/) do it for you. Just follow these steps:\n\n1. `pip install pygments` separately as it's not a dependency of `stack_data`.\n2. Create a pygments formatter object such as `HtmlFormatter` or `Terminal256Formatter`.\n3. Pass the formatter to `Options` in the argument `pygments_formatter`.\n4. Use `line.render(pygmented=True)` to get your formatted text. In this case you can't pass any markers to `render`.\n\nIf you want, you can also highlight the executing node in the frame in combination with the pygments syntax highlighting. For this you will need:\n\n1. A pygments style - either a style class or a string that names it. See the [documentation on styles](https://pygments.org/docs/styles/) and the [styles gallery](https://blog.yjl.im/2015/08/pygments-styles-gallery.html).\n2. A modification to make to the style for the executing node, which is a string such as `\"bold\"` or `\"bg:#ffff00\"` (yellow background). See the [documentation on style rules](https://pygments.org/docs/styles/#style-rules).\n3. Pass these two things to `stack_data.style_with_executing_node(style, modifier)` to get a new style class.\n4. Pass the new style to your formatter when you create it.\n\nNote that this doesn't work with `TerminalFormatter` which just uses the basic ANSI colors and doesn't use the style passed to it in general.\n\n## Getting the full stack\n\nCurrently `print_stack()` doesn't actually print the stack, it just prints one frame. Instead of `frame_info = FrameInfo(frame, options)`, let's do this:\n\n```python\nfor frame_info in FrameInfo.stack_data(frame, options):\n```\n\nNow the output looks something like this:\n\n```\n at line 18\n-----------\n 14 | for j in range(5):\n 15 | row.append(i * j)\n 16 | return result\n--> 18 | bar()\n\nbar at line 5\n-----------\n 4 | def bar():\n--> 5 | foo()\n\nfoo at line 13\n-----------\n 10 | for i in range(5):\n 11 | row = []\n 12 | result.append(row)\n--> 13 | print_stack()\n 14 | for j in range(5):\n```\n\nHowever, just as `frame_info.lines` doesn't always yield `Line` objects, `FrameInfo.stack_data` doesn't always yield `FrameInfo` objects, and we must modify our code to handle that. Let's look at some different sample code:\n\n```python\ndef factorial(x):\n return x * factorial(x - 1)\n\n\ntry:\n print(factorial(5))\nexcept:\n print_stack()\n```\n\nIn this code we've forgotten to include a base case in our `factorial` function so it will fail with a `RecursionError` and there'll be many frames with similar information. Similar to the built in Python traceback, `stack_data` avoids showing all of these frames. Instead you will get a `RepeatedFrames` object which summarises the information. See its docstring for more details.\n\nHere is our updated implementation:\n\n```python\ndef print_stack():\n for frame_info in FrameInfo.stack_data(sys.exc_info()[2]):\n if isinstance(frame_info, FrameInfo):\n print(f\"{frame_info.code.co_name} at line {frame_info.lineno}\")\n print(\"-----------\")\n for line in frame_info.lines:\n print(f\"{'-->' if line.is_current else ' '} {line.lineno:4} | {line.render()}\")\n\n for var in frame_info.variables:\n print(f\"{var.name} = {repr(var.value)}\")\n\n print()\n else:\n print(f\"... {frame_info.description} ...\\n\")\n```\n\nAnd the output:\n\n```\n at line 9\n-----------\n 4 | def factorial(x):\n 5 | return x * factorial(x - 1)\n 8 | try:\n--> 9 | print(factorial(5))\n 10 | except:\n\nfactorial at line 5\n-----------\n 4 | def factorial(x):\n--> 5 | return x * factorial(x - 1)\nx = 5\n\nfactorial at line 5\n-----------\n 4 | def factorial(x):\n--> 5 | return x * factorial(x - 1)\nx = 4\n\n... factorial at line 5 (996 times) ...\n\nfactorial at line 5\n-----------\n 4 | def factorial(x):\n--> 5 | return x * factorial(x - 1)\nx = -993\n```\n\nIn addition to handling repeated frames, we've passed a traceback object to `FrameInfo.stack_data` instead of a frame.\n\nIf you want, you can pass `collapse_repeated_frames=False` to `FrameInfo.stack_data` (not to `Options`) and it will just yield `FrameInfo` objects for the full stack.\n",
+ "description_content_type": "text/markdown",
+ "home_page": "http://github.com/alexmojaki/stack_data",
+ "author": "Alex Hall",
+ "author_email": "alex.mojaki@gmail.com",
+ "license": "MIT",
+ "classifier": [
+ "Intended Audience :: Developers",
+ "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",
+ "Programming Language :: Python :: 3.12",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Topic :: Software Development :: Debuggers"
+ ],
+ "requires_dist": [
+ "executing >=1.2.0",
+ "asttokens >=2.1.0",
+ "pure-eval",
+ "pytest ; extra == 'tests'",
+ "typeguard ; extra == 'tests'",
+ "pygments ; extra == 'tests'",
+ "littleutils ; extra == 'tests'",
+ "cython ; extra == 'tests'"
+ ],
+ "provides_extra": [
+ "tests"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/2c/4d/0db5b8a613d2a59bbc29bc5bb44a2f8070eb9ceab11c50d477502a8a0092/tinycss2-1.3.0-py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7",
+ "hashes": {
+ "sha256": "54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "tinycss2",
+ "version": "1.3.0",
+ "summary": "A tiny CSS parser",
+ "description": "tinycss2 is a low-level CSS parser and generator written in Python: it can\nparse strings, return objects representing tokens and blocks, and generate CSS\nstrings corresponding to these objects.\n\nBased on the CSS Syntax Level 3 specification, tinycss2 knows the grammar of\nCSS but doesn't know specific rules, properties or values supported in various\nCSS modules.\n\n* Free software: BSD license\n* For Python 3.8+, tested on CPython and PyPy\n* Documentation: https://doc.courtbouillon.org/tinycss2\n* Changelog: https://github.com/Kozea/tinycss2/releases\n* Code, issues, tests: https://github.com/Kozea/tinycss2\n* Code of conduct: https://www.courtbouillon.org/code-of-conduct\n* Professional support: https://www.courtbouillon.org\n* Donation: https://opencollective.com/courtbouillon\n\ntinycss2 has been created and developed by Kozea (https://kozea.fr).\nProfessional support, maintenance and community management is provided by\nCourtBouillon (https://www.courtbouillon.org).\n\nCopyrights are retained by their contributors, no copyright assignment is\nrequired to contribute to tinycss2. Unless explicitly stated otherwise, any\ncontribution intentionally submitted for inclusion is licensed under the BSD\n3-clause license, without any additional terms or conditions. For full\nauthorship information, see the version control history.\n\n",
+ "description_content_type": "text/x-rst",
+ "keywords": [
+ "css",
+ "parser"
+ ],
+ "author_email": "Simon Sapin ",
+ "maintainer_email": "CourtBouillon ",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "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 :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Topic :: Text Processing"
+ ],
+ "requires_dist": [
+ "webencodings >=0.4",
+ "sphinx ; extra == \"doc\"",
+ "sphinx_rtd_theme ; extra == \"doc\"",
+ "pytest ; extra == \"test\"",
+ "ruff ; extra == \"test\""
+ ],
+ "requires_python": ">=3.8",
+ "project_url": [
+ "Changelog, https://github.com/Kozea/tinycss2/releases",
+ "Code, https://github.com/Kozea/tinycss2/",
+ "Documentation, https://doc.courtbouillon.org/tinycss2/",
+ "Donation, https://opencollective.com/courtbouillon",
+ "Homepage, https://www.courtbouillon.org/tinycss2",
+ "Issues, https://github.com/Kozea/tinycss2/issues"
+ ],
+ "provides_extra": [
+ "doc",
+ "test"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl",
+ "archive_info": {
+ "hash": "sha256=051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24",
+ "hashes": {
+ "sha256": "051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "asttokens",
+ "version": "2.4.1",
+ "summary": "Annotate AST trees with source code positions",
+ "description": "ASTTokens\n=========\n\n.. image:: https://img.shields.io/pypi/v/asttokens.svg\n :target: https://pypi.python.org/pypi/asttokens/\n.. image:: https://img.shields.io/pypi/pyversions/asttokens.svg\n :target: https://pypi.python.org/pypi/asttokens/\n.. image:: https://github.com/gristlabs/asttokens/actions/workflows/build-and-test.yml/badge.svg\n :target: https://github.com/gristlabs/asttokens/actions/workflows/build-and-test.yml\n.. image:: https://readthedocs.org/projects/asttokens/badge/?version=latest\n :target: http://asttokens.readthedocs.io/en/latest/index.html\n.. image:: https://coveralls.io/repos/github/gristlabs/asttokens/badge.svg\n :target: https://coveralls.io/github/gristlabs/asttokens\n\n.. Start of user-guide\n\nThe ``asttokens`` module annotates Python abstract syntax trees (ASTs) with the positions of tokens\nand text in the source code that generated them.\n\nIt makes it possible for tools that work with logical AST nodes to find the particular text that\nresulted in those nodes, for example for automated refactoring or highlighting.\n\nInstallation\n------------\nasttokens is available on PyPI: https://pypi.python.org/pypi/asttokens/::\n\n pip install asttokens\n\nThe code is on GitHub: https://github.com/gristlabs/asttokens.\n\nThe API Reference is here: http://asttokens.readthedocs.io/en/latest/api-index.html.\n\nUsage\n-----\nASTTokens works with both Python2 and Python3.\n\nASTTokens can annotate both trees built by `ast `_,\nAND those built by `astroid `_.\n\nHere's an example:\n\n.. code-block:: python\n\n import asttokens, ast\n source = \"Robot('blue').walk(steps=10*n)\"\n atok = asttokens.ASTTokens(source, parse=True)\n\nOnce the tree has been marked, nodes get ``.first_token``, ``.last_token`` attributes, and\nthe ``ASTTokens`` object offers helpful methods:\n\n.. code-block:: python\n\n attr_node = next(n for n in ast.walk(atok.tree) if isinstance(n, ast.Attribute))\n print(atok.get_text(attr_node))\n start, end = attr_node.last_token.startpos, attr_node.last_token.endpos\n print(atok.text[:start] + 'RUN' + atok.text[end:])\n\nWhich produces this output:\n\n.. code-block:: text\n\n Robot('blue').walk\n Robot('blue').RUN(steps=10*n)\n\nThe ``ASTTokens`` object also offers methods to walk and search the list of tokens that make up\nthe code (or a particular AST node), which is more useful and powerful than dealing with the text\ndirectly.\n\n\nContribute\n----------\n\nTo contribute:\n\n1. Fork this repository, and clone your fork.\n2. Install the package with test dependencies (ideally in a virtualenv) with::\n\n pip install -e '.[test]'\n\n3. Run tests in your current interpreter with the command ``pytest`` or ``python -m pytest``.\n4. Run tests across all supported interpreters with the ``tox`` command. You will need to have the interpreters installed separately. We recommend ``pyenv`` for that. Use ``tox -p auto`` to run the tests in parallel.\n5. By default certain tests which take a very long time to run are skipped, but they are run on travis CI. To run them locally, set the environment variable ``ASTTOKENS_SLOW_TESTS``. For example run ``ASTTOKENS_SLOW_TESTS=1 tox`` to run the full suite of tests.\n",
+ "keywords": [
+ "code",
+ "ast",
+ "parse",
+ "tokenize",
+ "refactor"
+ ],
+ "home_page": "https://github.com/gristlabs/asttokens",
+ "author": "Dmitry Sagalovskiy, Grist Labs",
+ "author_email": "dmitry@getgrist.com",
+ "license": "Apache 2.0",
+ "classifier": [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Topic :: Software Development :: Code Generators",
+ "Topic :: Software Development :: Compilers",
+ "Topic :: Software Development :: Interpreters",
+ "Topic :: Software Development :: Pre-processors",
+ "Environment :: Console",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python :: 2",
+ "Programming Language :: Python :: 2.7",
+ "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",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy"
+ ],
+ "requires_dist": [
+ "six >=1.12.0",
+ "typing ; python_version < \"3.5\"",
+ "astroid <2,>=1 ; (python_version < \"3\") and extra == 'astroid'",
+ "astroid <4,>=2 ; (python_version >= \"3\") and extra == 'astroid'",
+ "pytest ; extra == 'test'",
+ "astroid <2,>=1 ; (python_version < \"3\") and extra == 'test'",
+ "astroid <4,>=2 ; (python_version >= \"3\") and extra == 'test'"
+ ],
+ "provides_extra": [
+ "astroid",
+ "test"
+ ]
+ }
+ },
+ {
+ "download_info": {
+ "url": "https://files.pythonhosted.org/packages/e9/63/e285470a4880a4f36edabe4810057bd4b562c6ddcc165eacf9c3c7210b40/cffi-1.16.0-cp312-cp312-win_amd64.whl",
+ "archive_info": {
+ "hash": "sha256=68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235",
+ "hashes": {
+ "sha256": "68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"
+ }
+ }
+ },
+ "is_direct": false,
+ "is_yanked": false,
+ "requested": false,
+ "metadata": {
+ "metadata_version": "2.1",
+ "name": "cffi",
+ "version": "1.16.0",
+ "summary": "Foreign Function Interface for Python calling C code.",
+ "description": "\r\nCFFI\r\n====\r\n\r\nForeign Function Interface for Python calling C code.\r\nPlease see the `Documentation