From 6f8b50562cf12e4ed2b0767cf568f1183c063b61 Mon Sep 17 00:00:00 2001 From: Dante Ventieri Date: Fri, 19 May 2023 09:56:45 -0300 Subject: [PATCH 1/3] get v6.0.1 from rubik/radon --- .gitattributes | 1 + .gitignore | 1 + .travis.yml | 12 +- CHANGELOG | 122 +- Makefile | 25 +- Pipfile | 1 - Pipfile.lock | 166 +- README.rst | 98 +- docs/_themes/solar/layout.html | 2 +- docs/commandline.rst | 241 +- docs/conf.py | 4 +- docs/flake8.rst | 3 + docs/intro.rst | 4 +- poetry.lock | 745 +++++++ pyproject.toml | 31 + radon/__init__.py | 2 +- radon/__main__.py | 4 + radon/cli/__init__.py | 254 ++- radon/cli/colors.py | 44 +- radon/cli/harvest.py | 239 +- radon/cli/tools.py | 287 ++- radon/complexity.py | 59 +- radon/contrib/__init__.py | 0 radon/contrib/flake8.py | 72 + radon/metrics.py | 82 +- radon/raw.py | 65 +- radon/tests/conftest.py | 31 + radon/tests/data/example.ipynb | 2837 ++++++++++++++++++++++++ radon/tests/run.py | 13 +- radon/tests/test_cli.py | 157 +- radon/tests/test_cli_colors.py | 22 + radon/tests/test_cli_harvest.py | 139 +- radon/tests/test_cli_tools.py | 576 +++-- radon/tests/test_complexity_utils.py | 27 +- radon/tests/test_complexity_visitor.py | 591 +++-- radon/tests/test_halstead.py | 105 +- radon/tests/test_ipynb.py | 141 ++ radon/tests/test_other_metrics.py | 87 +- radon/tests/test_raw.py | 407 ++-- radon/visitors.py | 181 +- requirements.txt | 6 +- setup.py | 22 +- test_requirements.txt | 5 +- tox.ini | 2 +- 44 files changed, 6893 insertions(+), 1020 deletions(-) create mode 100644 .gitattributes create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 radon/__main__.py create mode 100644 radon/contrib/__init__.py create mode 100644 radon/contrib/flake8.py create mode 100644 radon/tests/conftest.py create mode 100644 radon/tests/data/example.ipynb create mode 100644 radon/tests/test_cli_colors.py create mode 100644 radon/tests/test_ipynb.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a894e29 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.ipynb linguist-detectable=false diff --git a/.gitignore b/.gitignore index 6aa9507..812af12 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ dist .tox docs/_build .coveralls.yml +.pytest_cache diff --git a/.travis.yml b/.travis.yml index 1aa7d43..a55d193 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,16 @@ language: python -sudo: false +os: linux +dist: xenial python: - "2.7" - - "3.3" - - "3.4" - - "3.5" - "3.6" - - "pypy-5.3.1" + - "3.7" + - "3.8" + - "3.9" + - "pypy3.5" install: - pip install . - pip install -r test_requirements.txt - - ls script: - make tests - make cov diff --git a/CHANGELOG b/CHANGELOG index cb8d1e9..0b1238d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,123 @@ +6.0.1 (Mar 26, 2023) +-------------------- + +- Prevent tomllib error when the `toml` module is not available + +6.0.0 (Mar 26, 2023) +-------------------- + +- Fix typo in changelog, by @cclauss: #229 +- Add support for `match` pattern in Python 3.10+, by @DolajoCZ: #227 +- Fix typo in Markdown export, reported by @huornlmj: #231 +- Remove unnecessary "future" dependency, by @mgorny: #234 +- Add `pyproject.toml` support, by @ajslater: #236 +- Allow Mando v0.7.1, by @ajslater: #237 +- Fix HCHarvester JSON results format, by @benabel: #240 + +5.1.0 (Aug 08, 2021) +-------------------- + +- Allow forcing colored output on/off, thanks @msabramo: #218 +- Synchronize trove classifiers with tested versions, thanks @D3X: #222 + +5.0.1 (Jun 08, 2021) +-------------------- + +- Drop support for flake8 < 3.x (removes `flake8-polyfill` dependency), by + @joxl: #219 + +4.5.2 (May 23, 2021) +-------------------- + +- Add back `flake8-polyfill` dependency because conditional extra does not work + as intended, reported by @joxl: #217 + +4.5.1 (May 09, 2021) +-------------------- + +- Fix CC calculation for try-except-else blocks with multiple statements, + thanks @justWerns: #212 +- Fix CC type field in Markdown output, thanks @4l1fe: #213 + +4.5.0 (Mar 09, 2021) +-------------------- + +- Add ``--md`` option to ``cc`` command to export results as Markdown (thanks + to @kanekotic): #205 +- Add async function support to Halstead visitor (thanks to @rharish101): #208 + +4.4.0 (Mar 07, 2021) +-------------------- + +- Use utf-8 as the default encoding on Python 3.0+: #203 +- Allow custom config file path through the RADONCFG env var: #207 + +4.3.2 (Sep 18, 2020) +-------------------- + +- Move `Flake8Checker` to separate, isolated module (thanks to @tribals): #200 + +4.3.1 (Sep 12, 2020) +-------------------- + +- Separate `flake8-polyfill` to extra requirements (thanks to @tribals): #189 + +4.2.0 (Jan 28, 2020) +-------------------- + +- Fix for Python 2.7 (thanks to @edwinelisia): #191 +- Pin Colorama to different versions depending on the Python version (thanks to + @douardda): #193 + +4.1.0 (Jan 28, 2020) +-------------------- + +- Support Python 3.8 (thanks to @brnsnt): #185 + +4.0.0 (Sep 19, 2019) +-------------------- + +- Support file configuration overrides, thanks @tonybaloney: #179 +- Add support for analyzing Jupyter notebooks, thanks @tonybaloney: #181 + +3.0.1 (Feb 03, 2019) +-------------------- + +- Automatically exclude binary files, instead of producing an error: #166 + +3.0.0 (Jan 26, 2019) +-------------------- + +- Include files with no extension but a Python shebang (thanks @hawkeyej): #155 +- Fix calculation of total complexity for classes: #156 +- Update Colorama dependency to avoid conflicts with pytest: #164 +- Fix raw metrics, which were completely broken + +2.4.0 (Oct 11, 2018) +-------------------- + +- Add a `__main__` module (thanks @douardda): #153 +- Add --output-file option (thanks @douardda): #154 + +2.3.1 (Oct 02, 2018) +-------------------- + +- Quickfix for Python 2.7 +- Add official Python 3.7 support + +2.3.0 (Oct 02, 2018) +-------------------- + +- Add Halstead command and harvester (thanks @rwbogl): #136 +- Add --json, --exclude, --ignore to `radon hal` (thanks @rwbogl): #138 +- Add --functions to `radon hal` (thanks @rwbogl): #147 +- Add documentation for the `radon hal` subcommand (thanks @rwbogl): #150 + +2.2.0 (Jan 11, 2018) +-------------------- + +- Add an option to show closures when Radon is used from flake8: #135 + 2.1.1 (Sep 07, 2017) -------------------- @@ -88,7 +208,7 @@ ------------------ - Add ``--xml`` option to `cc` command: #49. -- Officialy support Python 3.4. +- Officially support Python 3.4. - Remove pathfinder: #59. - Reduce drastically unit-testing time: #56. - Update documentation (http://radon.readthedocs.org/en/latest/): #60. diff --git a/Makefile b/Makefile index 7a2cd3b..4438eeb 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,25 @@ -.PHONY: tests cov htmlcov pep8 pylint docs dev-deps test-deps publish coveralls +.PHONY: format lint f tests cov htmlcov pep8 pylint docs dev-deps test-deps publish coveralls + +source_dirs = radon +isort = isort -rc $(source_dirs) +black = black --line-length 79 --skip-string-normalization \ + --target-version py27 $(source_dirs) +flake8 = flake8 $(source_dirs) + +format: + $(isort) + $(black) + +lint: + $(flake8) + +f: format lint tests: python radon/tests/run.py cov: - coverage erase && coverage run --include "radon/*" --omit "radon/__init__.py,radon/cli.py,radon/tests/*" radon/tests/run.py + coverage erase && coverage run --branch --include "radon/*" --omit "radon/__init__.py,radon/cli.py,radon/tests/*" radon/tests/run.py coverage report -m htmlcov: cov @@ -20,10 +35,12 @@ docs: cd docs && make html test-deps: - pip install -r test_requirements.pip + pip install -r test_requirements.txt publish: - python setup.py sdist bdist_wheel upload + rm -rf dist/* + python setup.py sdist bdist_wheel + twine upload dist/* python setup.py develop coveralls: test-deps cov diff --git a/Pipfile b/Pipfile index 373ffea..29bef3c 100644 --- a/Pipfile +++ b/Pipfile @@ -12,4 +12,3 @@ pytest-mock = "*" [packages] mando = ">=0.3,<0.4" colorama = ">=0.3,<0.4" -flake8-polyfill = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 535ee56..116e260 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -3,6 +3,7 @@ "hash": { "sha256": "d1770e050ee8f186459b846d478570545743da69832155b1ac48b9fcedf00f1e" }, + "pipfile-spec": 6, "requires": {}, "sources": [ { @@ -13,90 +14,175 @@ }, "default": { "colorama": { - "hash": "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", + "hashes": [ + "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", + "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1" + ], "version": "==0.3.9" }, "flake8": { - "hash": "sha256:83905eadba99f73fbfe966598aaf1682b3eb6755d2263c5b33a4e8367d60b0d1", - "version": "==3.3.0" + "hashes": [ + "sha256:1aa8990be1e689d96c745c5682b687ea49f2e05a443aff1f8251092b0014e378", + "sha256:3b9f848952dddccf635be78098ca75010f073bfe14d2c6bda867154bea728d2a" + ], + "version": "==3.9.1" }, "flake8-polyfill": { - "hash": "sha256:da3d14a829cb1ec6377b2065e3f3892cf64b81a24ad15bbdf003c7bfee01723f", + "hashes": [ + "sha256:c77056b1e2cfce7b39d7634370062baf02438962a7d176ea717627b83b17f609", + "sha256:da3d14a829cb1ec6377b2065e3f3892cf64b81a24ad15bbdf003c7bfee01723f" + ], "version": "==1.0.1" }, "mando": { - "hash": "sha256:ef1e10b7004b84c41cb272516640f1d387fcd1e16ba48fb96d6a6eba131faef3", + "hashes": [ + "sha256:4626fe3d74bb23e3a64dda59843d1641f0bf01097f61ff817d3f2e1db21cb4b3", + "sha256:ef1e10b7004b84c41cb272516640f1d387fcd1e16ba48fb96d6a6eba131faef3" + ], "version": "==0.3.3" }, "mccabe": { - "hash": "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], "version": "==0.6.1" }, "pycodestyle": { - "hash": "sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9", - "version": "==2.3.1" + "hashes": [ + "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", + "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" + ], + "version": "==2.7.0" }, "pyflakes": { - "hash": "sha256:cc5eadfb38041f8366128786b4ca12700ed05bbf1403d808e89d57d67a3875a7", - "version": "==1.5.0" + "hashes": [ + "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", + "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" + ], + "version": "==2.3.1" } }, "develop": { "appdirs": { - "hash": "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e", - "version": "==1.4.3" + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" }, "coverage": { - "hash": "sha256:248783c221af8961278ea706b585586f92c61a024109acde675487632b775971", + "hashes": [ + "sha256:04db33c2a3e5b0cd5bc0ef9f93542eb8fabdd3cd6a80d37a428c92fedbf15e32", + "sha256:0c04f94d5a554e14608987e9877c2dc085c3a667aacb4431fa53f407a64b6cf6", + "sha256:1697d13f21c9c4167d843f2cb66de9b77ebaa657162a31aa71040373b7706e0a", + "sha256:1d36700875b3cc177f9537e012b67505ebb6c56a1d31b2e9e5061d75b981d5a6", + "sha256:216199d5d336c2aa3a64cc5831f23f6c01e1b5710fd56f8d0e77a88f3c230191", + "sha256:248783c221af8961278ea706b585586f92c61a024109acde675487632b775971", + "sha256:2b5c6f27e10fbd156ee7ca6eab3d5511ff9b2f7d485c1a2a431056b8107b9c72", + "sha256:34dd62690a511f0e4eb50ea717f5d4b076ebe86f4b5f4c7e9ed7874e30ed3519", + "sha256:3f1419a0ff97e54966c6b52895547761bd39c755b072c5043998d64a6e680ca3", + "sha256:46b484aaac58be8fcecc363ee3a3eaeb3a8e146a8b370d7d1c18cfaad72ef3a5", + "sha256:4d5311e2fa2e071b852e6c46844958f900febe3663cd741b5743c9e42b38648b", + "sha256:5d143d7bb6fb501f7dfa61af42f8255d8f6324d292e1abf04b5193a4a0c6864a", + "sha256:5eea9b318c58b4444b86d0b6270f4aad0df3c8860be4b9eb71191fa29d6e5f05", + "sha256:7bc8032c543cc4bddff32881e7a27542e6218dbeb8b9ec5e9d69f3213d6e11ef", + "sha256:88c4c15347bc813a7a23c66e13d7a9dc968a0f9d59136fb1d97ebe869db5b88b", + "sha256:8d1e770d7018217a014e06d8a6a67e47b5603d60d96d4b8879bb45aba1eea7de", + "sha256:902f0e340d80e90927dc4afe47d3b8390e1abad9366becb3b1fd609c50eae340", + "sha256:993d3edd6f84bdf969b2c14f5edca2a3c746c6c524593815a2918a1de4548076", + "sha256:9f32c7495e60db1657edb5088e27cfbdb2d30c01f047e72892713629fc0d96ae", + "sha256:a1ef25289f5415f01aadb552ddb3002a18d1c9fc11517a082cf5cb67a766f6a5", + "sha256:b4d5459ff96f2ea612dc92d7a2a6b8232919600cf7e1859629e26310718e9b6f", + "sha256:b52e45af6992d6c1b733a54b60fc96a371a5d5d7ef3efa14ad34f884bf1738d6", + "sha256:bed5bcb2b87cc4bcb3fa295413eb34a4128438f360957922e45901630b299b32", + "sha256:c16edfee46eee75f7fe630bb20a981521a77c03a11a6346f00de30ba8000358e", + "sha256:c26be7636819ae80e339288dc4f594d82d18a6a38879937872ead97b34892a8c", + "sha256:cef649ab5eeb6798bc4b384d4ecb4432e1c6a8f0554b946c83880865ceb8f28c", + "sha256:de832b9b062bf9ff079aeca7689c9cc26b26077a5bb35a945aa942509e3c29d7", + "sha256:e026a40b2842afdf29bba9c16a5b6bc496dcbcca602cc3ed7ad3b934d54f73ae", + "sha256:f3dfee8792241623740e7e2f34a88e6c8c510f7086b2fa695d0387ad815e0d0a", + "sha256:f75d0c7c1a7904d56daa4961299a084278fd12332bd115bcc55efac61d4271c8" + ], "version": "==4.4" }, + "distlib": { + "hashes": [ + "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb", + "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1" + ], + "version": "==0.3.1" + }, + "filelock": { + "hashes": [ + "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", + "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" + ], + "version": "==3.0.12" + }, "mock": { - "hash": "sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1", + "hashes": [ + "sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1", + "sha256:b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba" + ], "version": "==2.0.0" }, - "packaging": { - "hash": "sha256:99276dc6e3a7851f32027a68f1095cd3f77c148091b092ea867a351811cfe388", - "version": "==16.8" - }, "pbr": { - "hash": "sha256:86f0e548dfbdc1ad12559725a66b5e1ca0b2e0744940da1ec89991fd11a2b32b", - "version": "==3.0.0" + "hashes": [ + "sha256:5fad80b613c402d5b7df7bd84812548b2a61e9977387a80a5fc5c396492b13c9", + "sha256:b236cde0ac9a6aedd5e3c34517b423cd4fd97ef723849da6b0d2231142d89c00" + ], + "version": "==5.5.1" }, "pluggy": { - "hash": "sha256:d2766caddfbbc8ef641d47da556d2ae3056860ce4d553aa04009e42b76a09951", - "version": "==0.4.0" + "hashes": [ + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + ], + "version": "==0.13.1" }, "py": { - "hash": "sha256:81b5e37db3cc1052de438375605fb5d3b3e97f950f415f9143f04697c684d7eb", - "version": "==1.4.33" - }, - "pyparsing": { - "hash": "sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010", - "version": "==2.2.0" + "hashes": [ + "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", + "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" + ], + "version": "==1.10.0" }, "pytest": { - "hash": "sha256:66f332ae62593b874a648b10a8cb106bfdacd2c6288ed7dec3713c3a808a6017", + "hashes": [ + "sha256:66f332ae62593b874a648b10a8cb106bfdacd2c6288ed7dec3713c3a808a6017", + "sha256:b70696ebd1a5e6b627e7e3ac1365a4bc60aaf3495e843c1e70448966c5224cab" + ], "version": "==3.0.7" }, "pytest-mock": { - "hash": "sha256:29bf62c12a67dc0e7f6d02efa2404f0b4d068b38cd64f22a06c8a16cb545a03e", + "hashes": [ + "sha256:29bf62c12a67dc0e7f6d02efa2404f0b4d068b38cd64f22a06c8a16cb545a03e", + "sha256:83a17cbcd4dbc7c6c9dc885a0d598f9acd11f2d5142e0718ed32e14538670c1f" + ], "version": "==1.6.0" }, - "setuptools": { - "hash": "sha256:19d753940f8cdbee7548da318f8b56159aead279ef811a6efc8b8a33d89c86a4", - "version": "==35.0.2" - }, "six": { - "hash": "sha256:0ff78c403d9bccf5a425a6d31a12aa6b47f1c21ca4dc2573a7e2f32a97335eb1", - "version": "==1.10.0" + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "version": "==1.15.0" }, "tox": { - "hash": "sha256:0f37ea637ead4a5bbae91531b0bf8fd327c7152e20255e5960ee180598228d21", + "hashes": [ + "sha256:0f37ea637ead4a5bbae91531b0bf8fd327c7152e20255e5960ee180598228d21", + "sha256:9c3bdc06fe411d24015e8bbbab9d03dc5243a970154496aac13f9283682435f9" + ], "version": "==2.7.0" }, "virtualenv": { - "hash": "sha256:39d88b533b422825d644087a21e78c45cf5af0ef7a99a1fc9fbb7b481e5c85b0", - "version": "==15.1.0" + "hashes": [ + "sha256:09c61377ef072f43568207dc8e46ddeac6bcdcaf288d49011bda0e7f4d38c4a2", + "sha256:a935126db63128861987a7d5d30e23e8ec045a73840eeccb467c148514e29535" + ], + "markers": "python_version != '3.2'", + "version": "==20.4.4" } } -} \ No newline at end of file +} diff --git a/README.rst b/README.rst index ff1af02..ed5e44e 100644 --- a/README.rst +++ b/README.rst @@ -1,27 +1,23 @@ Radon ===== -.. image:: https://img.shields.io/codacy/623b84f5f6e6708c486f371e10da3610.svg +.. image:: https://img.shields.io/codacy/grade/623b84f5f6e6708c486f371e10da3610.svg?style=for-the-badge :alt: Codacy badge :target: https://www.codacy.com/app/rubik/radon/dashboard -.. image:: https://img.shields.io/travis/rubik/radon/master.svg +.. image:: https://img.shields.io/travis/rubik/radon/master.svg?style=for-the-badge :alt: Travis-CI badge :target: https://travis-ci.org/rubik/radon -.. image:: https://img.shields.io/coveralls/rubik/radon/master.svg +.. image:: https://img.shields.io/coveralls/rubik/radon/master.svg?style=for-the-badge :alt: Coveralls badge :target: https://coveralls.io/r/rubik/radon?branch=master -.. image:: https://img.shields.io/pypi/v/radon.svg +.. image:: https://img.shields.io/pypi/v/radon.svg?style=for-the-badge :alt: PyPI latest version badge :target: https://pypi.python.org/pypi/radon -.. image:: https://img.shields.io/pypi/format/radon.svg - :alt: Download format - :target: http://pythonwheels.com/ - -.. image:: https://img.shields.io/pypi/l/radon.svg +.. image:: https://img.shields.io/pypi/l/radon.svg?style=for-the-badge :alt: Radon license :target: https://pypi.python.org/pypi/radon @@ -39,9 +35,10 @@ Radon can compute: Requirements ------------ -Radon will run from **Python 2.7** to **Python 3.6** with a single code base -and without the need of tools like 2to3 or six. It can also run on **PyPy** -without any problems (currently PyPy 5.8.0 is used in tests). +Radon will run from **Python 2.7** to **Python 3.8** (except Python versions +from 3.0 to 3.3) with a single code base and without the need of tools like +2to3 or six. It can also run on **PyPy** without any problems (currently PyPy +3.5 v7.3.1 is used in tests). Radon depends on as few packages as possible. Currently only `mando` is strictly required (for the CLI interface). `colorama` is also listed as a @@ -61,6 +58,13 @@ With Pip: $ pip install radon +If you want to configure Radon from `pyproject.toml` and you run Python <3.11, +you'll need the extra `toml` dependency: + +.. code-block:: sh + + $ pip install radon[toml] + Or download the source and run the setup file: .. code-block:: sh @@ -133,6 +137,11 @@ one. If you are looking for more complete solutions, read the following sections. +Codacy +++++++++++++ + +`Codacy `_ uses Radon `by default `_ to calculate metrics from the source code. + Code Climate ++++++++++++ @@ -141,13 +150,74 @@ To understand how to add Radon's checks to your Code Climate Platform, head over to their documentation: https://docs.codeclimate.com/v1.0/docs/radon -Coala Analyzer +coala Analyzer ++++++++++++++ -Radon is also supported in `coala `_. To add Radon's +Radon is also supported in `coala `_. To add Radon's checks to coala, simply add the ``RadonBear`` to one of the sections in your ``.coafile``. +CodeFactor +++++++++++++ + +`CodeFactor `_ uses Radon `out-of-the-box `_ to calculate Cyclomatic Complexity. + +Usage with Jupyter Notebooks +---------------------------- + +Radon can be used with ``.ipynb`` files to inspect code metrics for Python cells. Any ``%`` macros will be ignored in the metrics. + +.. note:: + + Jupyter Notebook support requires the optional ``nbformat`` package. To install, run ``pip install nbformat``. + +To enable scanning of Jupyter notebooks, add the ``--include-ipynb`` flag. + +To enable reporting of individual cells, add the ``--ipynb-cells`` flag. + +Quick example: + +.. code-block:: sh + + $ radon raw --include-ipynb --ipynb-cells . + example.ipynb + LOC: 63 + LLOC: 37 + SLOC: 37 + Comments: 3 + Single comments: 2 + Multi: 10 + Blank: 14 + - Comment Stats + (C % L): 5% + (C % S): 8% + (C + M % L): 21% + example.ipynb:[0] + LOC: 0 + LLOC: 0 + SLOC: 0 + Comments: 0 + Single comments: 0 + Multi: 0 + Blank: 0 + - Comment Stats + (C % L): 0% + (C % S): 0% + (C + M % L): 0% + example.ipynb:[1] + LOC: 2 + LLOC: 2 + SLOC: 2 + Comments: 0 + Single comments: 0 + Multi: 0 + Blank: 0 + - Comment Stats + (C % L): 0% + (C % S): 0% + (C + M % L): 0% + + Links ----- diff --git a/docs/_themes/solar/layout.html b/docs/_themes/solar/layout.html index f575370..6ce9f9b 100644 --- a/docs/_themes/solar/layout.html +++ b/docs/_themes/solar/layout.html @@ -5,7 +5,7 @@ {%- endblock -%} {%- block extrahead -%} - + {%- endblock -%} diff --git a/docs/commandline.rst b/docs/commandline.rst index 639b626..f6beb48 100644 --- a/docs/commandline.rst +++ b/docs/commandline.rst @@ -1,11 +1,12 @@ Command-line Usage ================== -Radon currently has three commands: +Radon currently has four commands: * :command:`cc`: compute Cyclomatic Complexity * :command:`raw`: compute raw metrics * :command:`mi`: compute Maintainability Index + * :command:`hal`: compute Halstead complexity metrics .. note:: On some systems, such as Windows, the default encoding is not UTF-8. If you @@ -13,6 +14,42 @@ Radon currently has three commands: with Radon, you'll have to set the `RADONFILESENCODING` environment variable to `UTF-8`. +Radon configuration files +------------------------- + +When using radon regularly, you may want to specify default argument values in a configuration file. +For example, all of the radon commands have a ``--exclude`` and ``--ignore`` argument on the command-line. + +Radon will look for the following files to determine default arguments: + +* ``radon.cfg`` +* ``pyproject.toml`` (with optional `toml` install on Python <3.11) +* ``setup.cfg`` +* ``~/.radon.cfg`` + +Any radon configuration will be given in the INI-format, under the section ``[radon]``. + +For example: + +.. code-block:: ini + + [radon] + exclude = test_*.py + cc_min = B + +Usage with Jupyter Notebooks +---------------------------- + +Radon can be used with ``.ipynb`` files to inspect code metrics for Python cells. Any ``%`` macros will be ignored in the metrics. + +.. note:: + + Jupyter Notebook support requires the optional ``nbformat`` package. To install, run ``pip install nbformat``. + +To enable scanning of Jupyter notebooks, add the ``--include-ipynb`` flag with any of the commands. + +To enable reporting of individual cells, add the ``--ipynb-cells`` flag with any of the commands. + The :command:`cc` command ------------------------- @@ -56,11 +93,15 @@ Options .. option:: -x, --max - Set the maximum complexity rank to display. + Set the maximum complexity rank to display, defaults to ``F``. + + Value can be set in a configuration file using the ``cc_max`` property. .. option:: -n, --min - Set the minimum complexity rank to display. + Set the minimum complexity rank to display, defaults to ``A``. + + Value can be set in a configuration file using the ``cc_min`` property. .. option:: -a, --average @@ -68,26 +109,36 @@ Options Complexity. This option is influenced by :option:`-x, --max` and :option:`-n, --min` options. + Value can be set in a configuration file using the ``average`` property. + .. option:: --total-average Like :option:`-a, --average`, but it is not influenced by `min` and `max`. Every analyzed block is counted, no matter whether it is displayed or not. + Value can be set in a configuration file using the ``total_average`` property. + .. option:: -s, --show-complexity If given, show the complexity score along with its rank. + Value can be set in a configuration file using the ``show_complexity`` property. + .. option:: -e, --exclude Exclude files only when their path matches one of these glob patterns. Usually needs quoting at the command line. + Value can be set in a configuration file using the ``exclude`` property. + .. option:: -i, --ignore Ignore directories when their name matches one of these glob patterns: radon won't even descend into them. By default, hidden directories (starting with '.') are ignored. + Value can be set in a configuration file using the ``ignore`` property. + .. option:: -o, --order The ordering function for the results. Can be one of: @@ -96,6 +147,8 @@ Options * `LINES`: order by line numbers; * `ALPHA`: order by block names (alphabetically). + Value can be set in a configuration file using the ``order`` property. + .. option:: -j, --json If given, the results will be converted into JSON. This is useful in case @@ -106,11 +159,36 @@ Options If given, the results will be converted into XML. Note that not all the information is kept. This is specifically targeted to Jenkin's plugin CCM. +.. option:: --md + + If given, the results will be converted into Markdown. Note that not all the + information is kept. + .. option:: --no-assert Does not count assert statements when computing complexity. This is because Python can be run with an optimize flag which removes assert statements. + Value can be set in a configuration file using the ``no_assert`` property. + +.. option:: --include-ipynb + + Include the Python cells within IPython Notebooks in the reporting. + + Value can be set in a configuration file using the ``include_ipynb`` property. + +.. option:: --ipynb-cells + + Report on individual cells in any .ipynb files. + + Value can be set in a configuration file using the ``ipynb_cells`` property. + +.. option:: -O, --output-file + + Save output to the specified output file. + + Value can be set in a configuration file using the ``output_file`` property. + Examples ++++++++ @@ -177,23 +255,31 @@ Options .. option:: -x, --max - Set the maximum MI to display. + Set the maximum MI to display. Expects a letter between A-F. Defaults to ``C``. + + Value can be set in a configuration file using the ``mi_max`` property. .. option:: -n, --min - Set the minimum MI to display. + Set the minimum MI to display. Expects a letter between A-F. Defaults to ``A``. + + Value can be set in a configuration file using the ``mi_min`` property. .. option:: -e, --exclude Exclude files only when their path matches one of these glob patterns. Usually needs quoting at the command line. + Value can be set in a configuration file using the ``exclude`` property. + .. option:: -i, --ignore Ignore directories when their name matches one of these glob patterns: radon won't even descend into them. By default, hidden directories (starting with '.') are ignored. + Value can be set in a configuration file using the ``ignore`` property. + .. option:: -m, --multi If given, Radon will not count multiline strings as comments. @@ -201,14 +287,36 @@ Options docstrings, but one should be aware that their use is not limited to that and sometimes it would be wrong to count them as comment lines. + Value can be set in a configuration file using the ``multi`` property. + .. option:: -s, --show If given, the actual MI value is shown in results, alongside the rank. + Value can be set in a configuration file using the ``show_mi`` property. + .. option:: -j, --json Format results in JSON. +.. option:: --include-ipynb + + Include the Python cells within IPython Notebooks in the reporting. + + Value can be set in a configuration file using the ``include_ipynb`` property. + +.. option:: --ipynb-cells + + Report on individual cells in any .ipynb files. + + Value can be set in a configuration file using the ``ipynb_cells`` property. + +.. option:: -O, --output-file + + Save output to the specified output file. + + Value can be set in a configuration file using the ``output_file`` property. + Examples ++++++++ @@ -266,12 +374,16 @@ Options Exclude files only when their path matches one of these glob patterns. Usually needs quoting at the command line. + Value can be set in a configuration file using the ``exclude`` property. + .. option:: -i, --ignore Ignore directories when their name matches one of these glob patterns: radon won't even descend into them. By default, hidden directories (starting with '.') are ignored. + Value can be set in a configuration file using the ``ignore`` property. + .. option:: -s, --summary If given, at the end of the analysis a summary of the gathered @@ -279,7 +391,26 @@ Options .. option:: -j, --json - If given, the results will be converted into JSON. + If given, the results will be converted into JSON. Note that the JSON export + does not include the summary (enabled with the option `-s, --summary`). + +.. option:: -O, --output-file + + Save output to the specified output file. + + Value can be set in a configuration file using the ``output_file`` property. + +.. option:: --include-ipynb + + Include the Python cells within IPython Notebooks in the reporting. + + Value can be set in a configuration file using the ``include_ipynb`` property. + +.. option:: --ipynb-cells + + Report on individual cells in any .ipynb files. + + Value can be set in a configuration file using the ``ipynb_cells`` property. Examples ++++++++ @@ -297,3 +428,101 @@ every subdirectory. Like the previous example, but excluding from the analysis every path that matches ``path1/tests/*``. + + +The :command:`hal` command +-------------------------- + +.. program:: hal + +This command analyzes Python source files and computes their Halstead +complexity metrics. Files can be analyzed as wholes, or in terms of their +top-level functions with the :option:`-f` flag. + +Excluding files or directories is supported through glob patterns with the +:option:`-e` flag. Every positional argument is interpreted as a path. The +program walks through its children and analyzes Python files. + +Options ++++++++ + +.. option:: -f, --functions + + Compute the metrics on the *function* level, as opposed to the *file* level. + + Value can be set in a configuration file using the ``functions`` property. + +.. option:: -e, --exclude + + Exclude files when their path matches one of these glob patterns. Usually + needs quoting at the command line. + + Value can be set in a configuration file using the ``exclude`` property. + +.. option:: -i, --ignore + + Refuse to descend into directories that match any of these glob patterns. By + default, hidden directories (starting with '.') are ignored. + + Value can be set in a configuration file using the ``ignore`` property. + +.. option:: -j, --json + + Convert results into JSON. This is useful for exporting results to another + application. + +.. option:: -O, --output-file + + Save output to the specified output file. + + Value can be set in a configuration file using the ``output_file`` property. + +.. option:: --include-ipynb + + Include the Python cells within IPython Notebooks in the reporting. + + Value can be set in a configuration file using the ``include_ipynb`` property. + +.. option:: --ipynb-cells + + Report on individual cells in any .ipynb files. + + Value can be set in a configuration file using the ``ipynb_cells`` property. + +Examples +++++++++ + +:: + + $ radon hal file.py + +Radon will analyze the given file. + + +:: + + $ radon hal path/ + +Radon will walk through the subdirectories of ``path/`` and analyze all child +nodes (every Python file it encounters). + +:: + + $ radon hal -e 'path/tests*,path/docs/*' path/ + +As in the above example, Radon will walk the directories, excluding paths +matching ``path/tests/*`` and ``path/docs/*``. + +.. warning:: + + Remember to quote the patterns, otherwise your shell might expand them! + +Depending on the single cases, a more suitable alternative might be this:: + + $ radon hal -i "docs,tests" path + +:: + + $ radon hal - < path/to/file.py + +Setting the path to "-" will cause Radon to analyze code from stdin. diff --git a/docs/conf.py b/docs/conf.py index 5e8298a..2f1da1a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,6 +13,7 @@ import os import sys +import time import datetime sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) @@ -46,9 +47,10 @@ # General information about the project. project = u'Radon' +build_date = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))) copyright = u'{0}, Michele Lacchia'.format('-'.join(map(str, range(2012, - datetime.datetime.now().year + 1)))) + build_date.year + 1)))) # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/docs/flake8.rst b/docs/flake8.rst index e36724b..5c73f40 100644 --- a/docs/flake8.rst +++ b/docs/flake8.rst @@ -19,6 +19,9 @@ following options: Instruct radon not to count `assert` statements towards cyclomatic complexity. The default behaviour is the opposite. +.. option:: --radon-show-closures + + Instruct radon to add closures/inner classes to the output. For more information visit the `Flake8 documentation `_. diff --git a/docs/intro.rst b/docs/intro.rst index abd53de..435fd2f 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -22,6 +22,8 @@ Complexity. Statements have the following effects on Cyclomatic Complexity: if +1 An `if` statement is a single decision. elif +1 The `elif` statement adds another decision. else +0 The `else` statement does not cause a new decision. The decision is at the `if`. + case pattern +1 The `case pattern` statement is a single decision. + case _ +0 The `case _` statement does not cause a new decision. The decision is at the `case pattern`. for +1 There is a decision at the start of the loop. while +1 There is a decision at the `while` statement. except +1 Each `except` branch adds a new conditional path of execution. @@ -137,7 +139,7 @@ Further Reading 2. Don M. Coleman, Dan Ash, Bruce Lowther, Paul W. Oman. Using Metrics to Evaluate Software System Maintainability. IEEE Computer 27(8), 1994. (`doi - `_, `postprint + `__, `postprint `_) 3. `Maintainability Index Range and Meaning diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..4f55625 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,745 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "argparse" +version = "1.4.0" +description = "Python command-line parsing library" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "argparse-1.4.0-py2.py3-none-any.whl", hash = "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314"}, + {file = "argparse-1.4.0.tar.gz", hash = "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4"}, +] + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + +[[package]] +name = "cachetools" +version = "5.3.0" +description = "Extensible memoizing collections and decorators" +category = "dev" +optional = false +python-versions = "~=3.7" +files = [ + {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, + {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, +] + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "chardet" +version = "5.1.0" +description = "Universal encoding detector for Python 3" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, + {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, +] + +[[package]] +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] + +[package.extras] +unicode-backport = ["unicodedata2"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "6.5.0" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "coveralls" +version = "3.3.1" +description = "Show coverage stats online via coveralls.io" +category = "dev" +optional = false +python-versions = ">= 3.5" +files = [ + {file = "coveralls-3.3.1-py2.py3-none-any.whl", hash = "sha256:f42015f31d386b351d4226389b387ae173207058832fbf5c8ec4b40e27b16026"}, + {file = "coveralls-3.3.1.tar.gz", hash = "sha256:b32a8bb5d2df585207c119d6c01567b81fba690c9c10a753bfe27a335bfc43ea"}, +] + +[package.dependencies] +coverage = ">=4.1,<6.0.0 || >6.1,<6.1.1 || >6.1.1,<7.0" +docopt = ">=0.6.1" +requests = ">=1.0.0" + +[package.extras] +yaml = ["PyYAML (>=3.10)"] + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastjsonschema" +version = "2.16.3" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.16.3-py3-none-any.whl", hash = "sha256:04fbecc94300436f628517b05741b7ea009506ce8f946d40996567c669318490"}, + {file = "fastjsonschema-2.16.3.tar.gz", hash = "sha256:4a30d6315a68c253cfa8f963b9697246315aa3db89f98b97235e345dedfb0b8e"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.10.4" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.10.4-py3-none-any.whl", hash = "sha256:6d332dc5c896f18ba93a21d987155e97c434a96d3fe4042ca70d0b3b46e3b470"}, + {file = "filelock-3.10.4.tar.gz", hash = "sha256:9fc1734dbddcdcd4aaa02c160dd94db5272b92dfa859b44ec8df28e160b751f0"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.1.0" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, + {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, +] + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter-core" +version = "4.12.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_core-4.12.0-py3-none-any.whl", hash = "sha256:a54672c539333258495579f6964144924e0aa7b07f7069947bef76d7ea5cb4c1"}, + {file = "jupyter_core-4.12.0.tar.gz", hash = "sha256:87f39d7642412ae8a52291cc68e71ac01dfa2c735df2701f8108251d51b4f460"}, +] + +[package.dependencies] +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = "*" + +[package.extras] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "mando" +version = "0.7.1" +description = "Create Python CLI apps with little to no effort at all!" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "mando-0.7.1-py2.py3-none-any.whl", hash = "sha256:26ef1d70928b6057ee3ca12583d73c63e05c49de8972d620c278a7b206581a8a"}, + {file = "mando-0.7.1.tar.gz", hash = "sha256:18baa999b4b613faefb00eac4efadcf14f510b59b924b66e08289aa1de8c3500"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +restructuredtext = ["rst2ansi"] + +[[package]] +name = "nbformat" +version = "5.8.0" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nbformat-5.8.0-py3-none-any.whl", hash = "sha256:d910082bd3e0bffcf07eabf3683ed7dda0727a326c446eeb2922abe102e65162"}, + {file = "nbformat-5.8.0.tar.gz", hash = "sha256:46dac64c781f1c34dfd8acba16547024110348f9fc7eab0f31981c2a3dc48d1f"}, +] + +[package.dependencies] +fastjsonschema = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.8\""} +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "platformdirs" +version = "3.1.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, + {file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pyproject-api" +version = "1.5.1" +description = "API to interact with the python pyproject.toml based projects" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_api-1.5.1-py3-none-any.whl", hash = "sha256:4698a3777c2e0f6b624f8a4599131e2a25376d90fe8d146d7ac74c67c6f97c43"}, + {file = "pyproject_api-1.5.1.tar.gz", hash = "sha256:435f46547a9ff22cf4208ee274fca3e2869aeb062a4834adfc99a4dd64af3cf9"}, +] + +[package.dependencies] +packaging = ">=23" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.2.2)", "importlib-metadata (>=6)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.17.1)", "wheel (>=0.38.4)"] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "7.2.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, + {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-mock" +version = "3.10.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "pywin32" +version = "305" +description = "Python for Window Extensions" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, + {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, + {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, + {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, + {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, + {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, + {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, + {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, + {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, + {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, + {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, + {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, + {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, + {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, +] + +[[package]] +name = "requests" +version = "2.27.1" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tox" +version = "4.4.7" +description = "tox is a generic virtualenv management and test command line tool" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tox-4.4.7-py3-none-any.whl", hash = "sha256:da10ca1d809b99fae80b706b9dc9656b1daf505a395ac427d130a8a85502d08f"}, + {file = "tox-4.4.7.tar.gz", hash = "sha256:52c92a96e2c3fd47c5301e9c26f5a871466133d5376958c1ed95ef4ff4629cbe"}, +] + +[package.dependencies] +cachetools = ">=5.3" +chardet = ">=5.1" +colorama = ">=0.4.6" +filelock = ">=3.9" +importlib-metadata = {version = ">=6", markers = "python_version < \"3.8\""} +packaging = ">=23" +platformdirs = ">=2.6.2" +pluggy = ">=1" +pyproject-api = ">=1.5" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} +virtualenv = ">=20.17.1" + +[package.extras] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-argparse-cli (>=1.11)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx-copybutton (>=0.5.1)", "sphinx-inline-tabs (>=2022.1.2b11)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.2.2)", "devpi-process (>=0.3)", "diff-cover (>=7.4)", "distlib (>=0.3.6)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.12.2)", "psutil (>=5.9.4)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-xdist (>=3.1)", "re-assert (>=1.1)", "time-machine (>=2.9)", "wheel (>=0.38.4)"] + +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.21.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.8\""} +platformdirs = ">=2.4,<4" + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.7,<4.0" +content-hash = "0430cee4974c816cfa9a45c682b3cdd277d8aafd4ad2488d1a1e877c6adbc121" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0e869cf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,31 @@ +[tool.poetry] +name = "radon" +version = "6.0.1" +description = "Code Metrics in Python" +authors = ["Michele Lacchia "] +license = "MIT" +readme = "README.rst" + +[tool.poetry.dependencies] +python = ">=3.7,<4.0" +mando = ">=0.6,<0.8" +colorama = [ + {version = ">=0.4.1", markers = "python_version > \"3.4\""}, + {version = "==0.4.1", markers = "python_version <= \"3.4\""} +] + +[tool.poetry.group.dev.dependencies] +coverage = "*" +coveralls = "*" +pytest = [ + {version = ">=2.7", markers = "python_version < \"3.0\""}, + {version = ">5.0", markers = "python_version >= \"3.0\""} +] +pytest-mock = "*" +argparse = "*" +nbformat = "*" +tox = "^4.4.7" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/radon/__init__.py b/radon/__init__.py index e77ee3f..e48beae 100644 --- a/radon/__init__.py +++ b/radon/__init__.py @@ -1,7 +1,7 @@ '''This module contains the main() function, which is the entry point for the command line interface.''' -__version__ = '2.1.1' +__version__ = '6.0.1' def main(): diff --git a/radon/__main__.py b/radon/__main__.py new file mode 100644 index 0000000..4963f2f --- /dev/null +++ b/radon/__main__.py @@ -0,0 +1,4 @@ +"""Module allowing for ``python -m radon ...``.""" +from radon import main + +main() diff --git a/radon/cli/__init__.py b/radon/cli/__init__.py index d74cc7a..3af5138 100644 --- a/radon/cli/__init__.py +++ b/radon/cli/__init__.py @@ -1,22 +1,119 @@ '''In this module the CLI interface is created.''' -import sys import inspect +import os +import sys +from contextlib import contextmanager + from mando import Program +try: + # Python 3.11+ + import tomllib + TOMLLIB_PRESENT = True +except ImportError: + try: + # Support for Python <3.11 + import tomli as tomllib + TOMLLIB_PRESENT = True + except ImportError: + TOMLLIB_PRESENT = False import radon.complexity as cc_mod from radon.cli.colors import BRIGHT, RED, RESET -from radon.cli.harvest import CCHarvester, RawHarvester, MIHarvester +from radon.cli.harvest import ( + CCHarvester, + HCHarvester, + MIHarvester, + RawHarvester, +) + +if sys.version_info[0] == 2: + import ConfigParser as configparser +else: + import configparser + +CONFIG_SECTION_NAME = 'radon' + + +class FileConfig(object): + ''' + Yield default options by reading local configuration files. + ''' + + def __init__(self): + self.file_cfg = self.file_config() + + def get_value(self, key, type, default): + if not self.file_cfg.has_option(CONFIG_SECTION_NAME, key): + return default + if type == int: + return self.file_cfg.getint( + CONFIG_SECTION_NAME, key, fallback=default + ) + if type == bool: + return self.file_cfg.getboolean( + CONFIG_SECTION_NAME, key, fallback=default + ) + else: + return self.file_cfg.get( + CONFIG_SECTION_NAME, key, fallback=default + ) + + @staticmethod + def toml_config(): + if not TOMLLIB_PRESENT: + return {} + + try: + with open("pyproject.toml", "rb") as pyproject_file: + pyproject = tomllib.load(pyproject_file) + config_dict = pyproject["tool"] + except tomllib.TOMLDecodeError as exc: + raise exc + except Exception: + config_dict = {} + return config_dict + + @staticmethod + def file_config(): + '''Return any file configuration discovered''' + config = configparser.ConfigParser() + for path in (os.getenv('RADONCFG', None), 'radon.cfg'): + if path is not None and os.path.exists(path): + config.read_file(open(path)) + config.read_dict(FileConfig.toml_config()) + config.read(['setup.cfg', os.path.expanduser('~/.radon.cfg')]) + return config + + +_cfg = FileConfig() program = Program(version=sys.modules['radon'].__version__) @program.command @program.arg('paths', nargs='+') -def cc(paths, min='A', max='F', show_complexity=False, average=False, - exclude=None, ignore=None, order='SCORE', json=False, no_assert=False, - show_closures=False, total_average=False, xml=False, codeclimate=False): +def cc( + paths, + min=_cfg.get_value('cc_min', str, 'A'), + max=_cfg.get_value('cc_max', str, 'F'), + show_complexity=_cfg.get_value('show_complexity', bool, False), + average=_cfg.get_value('average', bool, False), + exclude=_cfg.get_value('exclude', str, None), + ignore=_cfg.get_value('ignore', str, None), + order=_cfg.get_value('order', str, 'SCORE'), + json=False, + no_assert=_cfg.get_value('no_assert', bool, False), + show_closures=_cfg.get_value('show_closures', bool, False), + total_average=_cfg.get_value('total_average', bool, False), + xml=False, + md=False, + codeclimate=False, + output_file=_cfg.get_value('output_file', str, None), + include_ipynb=_cfg.get_value('include_ipynb', bool, False), + ipynb_cells=_cfg.get_value('ipynb_cells', bool, False), +): '''Analyze the given Python modules and compute Cyclomatic Complexity (CC). @@ -43,10 +140,14 @@ def cc(paths, min='A', max='F', show_complexity=False, average=False, ALPHA. :param -j, --json: Format results in JSON. :param --xml: Format results in XML (compatible with CCM). + :param --md: Format results in Markdown. :param --codeclimate: Format results for Code Climate. :param --no-assert: Do not count `assert` statements when computing complexity. :param --show-closures: Add closures/inner classes to the output. + :param -O, --output-file : The output file (default to stdout). + :param --include-ipynb: Include IPython Notebook files + :param --ipynb-cells: Include reports for individual IPYNB cells ''' config = Config( min=min.upper(), @@ -59,14 +160,33 @@ def cc(paths, min='A', max='F', show_complexity=False, average=False, order=getattr(cc_mod, order.upper(), getattr(cc_mod, 'SCORE')), no_assert=no_assert, show_closures=show_closures, + include_ipynb=include_ipynb, + ipynb_cells=ipynb_cells, ) harvester = CCHarvester(paths, config) - log_result(harvester, json=json, xml=xml, codeclimate=codeclimate) + with outstream(output_file) as stream: + log_result( + harvester, + json=json, + xml=xml, + md=md, + codeclimate=codeclimate, + stream=stream, + ) @program.command @program.arg('paths', nargs='+') -def raw(paths, exclude=None, ignore=None, summary=False, json=False): +def raw( + paths, + exclude=_cfg.get_value('exclude', str, None), + ignore=_cfg.get_value('ignore', str, None), + summary=False, + json=False, + output_file=_cfg.get_value('output_file', str, None), + include_ipynb=_cfg.get_value('include_ipynb', bool, False), + ipynb_cells=_cfg.get_value('ipynb_cells', bool, False), +): '''Analyze the given Python modules and compute raw metrics. :param paths: The paths where to find modules or packages to analyze. More @@ -78,21 +198,40 @@ def raw(paths, exclude=None, ignore=None, summary=False, json=False): hidden directories (starting with '.') are ignored. :param -s, --summary: If given, at the end of the analysis display the summary of the gathered metrics. Default to False. - :param -j, --json: Format results in JSON. + :param -j, --json: Format results in JSON. Note that the JSON export does + not include the summary (enabled with `-s, --summary`). + :param -O, --output-file : The output file (default to stdout). + :param --include-ipynb: Include IPython Notebook files + :param --ipynb-cells: Include reports for individual IPYNB cells ''' config = Config( exclude=exclude, ignore=ignore, summary=summary, + include_ipynb=include_ipynb, + ipynb_cells=ipynb_cells, ) harvester = RawHarvester(paths, config) - log_result(harvester, json=json) + with outstream(output_file) as stream: + log_result(harvester, json=json, stream=stream) @program.command @program.arg('paths', nargs='+') -def mi(paths, min='A', max='C', multi=True, exclude=None, ignore=None, - show=False, json=False, sort=False): +def mi( + paths, + min=_cfg.get_value('mi_min', str, 'A'), + max=_cfg.get_value('mi_max', str, 'C'), + multi=_cfg.get_value('multi', bool, True), + exclude=_cfg.get_value('exclude', str, None), + ignore=_cfg.get_value('ignore', str, None), + show=_cfg.get_value('show_mi', bool, False), + json=False, + sort=False, + output_file=_cfg.get_value('output_file', str, None), + include_ipynb=_cfg.get_value('include_ipynb', bool, False), + ipynb_cells=_cfg.get_value('ipynb_cells', bool, False), +): '''Analyze the given Python modules and compute the Maintainability Index. The maintainability index (MI) is a compound metric, with the primary aim @@ -113,6 +252,9 @@ def mi(paths, min='A', max='C', multi=True, exclude=None, ignore=None, :param -s, --show: If given, the actual MI value is shown in results. :param -j, --json: Format results in JSON. :param --sort: If given, results are sorted in ascending order. + :param -O, --output-file : The output file (default to stdout). + :param --include-ipynb: Include IPython Notebook files + :param --ipynb-cells: Include reports for individual IPYNB cells ''' config = Config( min=min.upper(), @@ -122,10 +264,59 @@ def mi(paths, min='A', max='C', multi=True, exclude=None, ignore=None, multi=multi, show=show, sort=sort, + include_ipynb=include_ipynb, + ipynb_cells=ipynb_cells, ) harvester = MIHarvester(paths, config) - log_result(harvester, json=json) + with outstream(output_file) as stream: + log_result(harvester, json=json, stream=stream) + + +@program.command +@program.arg("paths", nargs="+") +def hal( + paths, + exclude=_cfg.get_value('exclude', str, None), + ignore=_cfg.get_value('ignore', str, None), + json=False, + functions=_cfg.get_value('functions', bool, False), + output_file=_cfg.get_value('output_file', str, None), + include_ipynb=_cfg.get_value('include_ipynb', bool, False), + ipynb_cells=_cfg.get_value('ipynb_cells', bool, False), +): + """ + Analyze the given Python modules and compute their Halstead metrics. + + The Halstead metrics are a series of measurements meant to quantitatively + measure the complexity of code, including the difficulty a programmer would + have in writing it. + + :param paths: The paths where to find modules or packages to analyze. More + than one path is allowed. + :param -e, --exclude : Exclude files only when their path matches one + of these glob patterns. Usually needs quoting at the command line. + :param -i, --ignore : Ignore directories when their name matches one + of these glob patterns: radon won't even descend into them. By default, + hidden directories (starting with '.') are ignored. + :param -j, --json: Format results in JSON. + :param -f, --functions: Analyze files by top-level functions instead of as + a whole. + :param -O, --output-file : The output file (default to stdout). + :param --include-ipynb: Include IPython Notebook files + :param --ipynb-cells: Include reports for individual IPYNB cells + """ + config = Config( + exclude=exclude, + ignore=ignore, + by_function=functions, + include_ipynb=include_ipynb, + ipynb_cells=ipynb_cells, + ) + + harvester = HCHarvester(paths, config) + with outstream(output_file) as stream: + log_result(harvester, json=json, xml=False, md=False, stream=stream) class Config(object): @@ -179,20 +370,28 @@ def log_result(harvester, **kwargs): passed to the :func:`~radon.cli.log` function. ''' if kwargs.get('json'): - log(harvester.as_json(), noformat=True) + log(harvester.as_json(), noformat=True, **kwargs) elif kwargs.get('xml'): - log(harvester.as_xml(), noformat=True) + log(harvester.as_xml(), noformat=True, **kwargs) elif kwargs.get('codeclimate'): - log_list(harvester.as_codeclimate_issues(), delimiter='\0', - noformat=True) + log_list( + harvester.as_codeclimate_issues(), + delimiter='\0', + noformat=True, + **kwargs + ) + elif kwargs.get('md'): + log(harvester.as_md(), noformat=True, **kwargs) else: - for msg, args, kwargs in harvester.to_terminal(): - if kwargs.get('error', False): - log(msg) - log_error(args[0], indent=1) + for msg, h_args, h_kwargs in harvester.to_terminal(): + kw = kwargs.copy() + kw.update(h_kwargs) + if h_kwargs.get('error', False): + log(msg, **kw) + log_error(h_args[0], indent=1) continue msg = [msg] if not isinstance(msg, (list, tuple)) else msg - log_list(msg, *args, **kwargs) + log_list(msg, *h_args, **kw) def log(msg, *args, **kwargs): @@ -207,7 +406,8 @@ def log(msg, *args, **kwargs): indent = 4 * kwargs.get('indent', 0) delimiter = kwargs.get('delimiter', '\n') m = msg if kwargs.get('noformat', False) else msg.format(*args) - sys.stdout.write(' ' * indent + m + delimiter) + stream = kwargs.get('stream', sys.stdout) + stream.write(' ' * indent + m + delimiter) def log_list(lst, *args, **kwargs): @@ -221,3 +421,13 @@ def log_list(lst, *args, **kwargs): def log_error(msg, *args, **kwargs): '''Log an error message. Arguments are the same as log().''' log('{0}{1}ERROR{2}: {3}'.format(BRIGHT, RED, RESET, msg), *args, **kwargs) + + +@contextmanager +def outstream(outfile=None): + '''Encapsulate output stream creation as a context manager''' + if outfile: + with open(outfile, 'w') as outstream: + yield outstream + else: + yield sys.stdout diff --git a/radon/cli/colors.py b/radon/cli/colors.py index 747fe92..b1c6e4e 100644 --- a/radon/cli/colors.py +++ b/radon/cli/colors.py @@ -2,26 +2,48 @@ terminal. ''' +import os import sys + + +def color_enabled(): + COLOR_ENV = os.getenv('COLOR', 'auto') + if COLOR_ENV == 'auto' and sys.stdout.isatty(): + return True + if COLOR_ENV == 'yes': + return True + return False + + try: import colorama - colorama.init(strip=(not sys.stdout.isatty())) - GREEN, YELLOW, RED = (colorama.Fore.GREEN, colorama.Fore.YELLOW, - colorama.Fore.RED) - MAGENTA, CYAN, WHITE = (colorama.Fore.MAGENTA, colorama.Fore.CYAN, - colorama.Fore.WHITE) + + colorama.init(strip=not color_enabled()) + GREEN, YELLOW, RED = ( + colorama.Fore.GREEN, + colorama.Fore.YELLOW, + colorama.Fore.RED, + ) + MAGENTA, CYAN, WHITE = ( + colorama.Fore.MAGENTA, + colorama.Fore.CYAN, + colorama.Fore.WHITE, + ) BRIGHT, RESET = colorama.Style.BRIGHT, colorama.Style.RESET_ALL except ImportError: # pragma: no cover # No colorama, so let's fallback to no-color mode GREEN = YELLOW = RED = MAGENTA = CYAN = WHITE = BRIGHT = RESET = '' -RANKS_COLORS = {'A': GREEN, 'B': GREEN, - 'C': YELLOW, 'D': YELLOW, - 'E': RED, 'F': RED} +RANKS_COLORS = { + 'A': GREEN, + 'B': GREEN, + 'C': YELLOW, + 'D': YELLOW, + 'E': RED, + 'F': RED, +} -LETTERS_COLORS = {'F': MAGENTA, - 'C': CYAN, - 'M': WHITE} +LETTERS_COLORS = {'F': MAGENTA, 'C': CYAN, 'M': WHITE} MI_RANKS = {'A': GREEN, 'B': YELLOW, 'C': RED} TEMPLATE = '{0}{1} {reset}{2}:{3} {4} - {5}{6}{reset}' diff --git a/radon/cli/harvest.py b/radon/cli/harvest.py index ddce660..ff8c87f 100644 --- a/radon/cli/harvest.py +++ b/radon/cli/harvest.py @@ -1,15 +1,42 @@ '''This module holds the base Harvester class and all its subclassess.''' -import json import collections +import json +import sys +from builtins import super + +from radon.cli.colors import MI_RANKS, RANKS_COLORS, RESET +from radon.cli.tools import ( + _open, + cc_to_dict, + cc_to_terminal, + dict_to_codeclimate_issues, + dict_to_xml, + dict_to_md, + iter_filenames, + raw_to_dict, + strip_ipython, +) +from radon.complexity import ( + add_inner_blocks, + cc_rank, + cc_visit, + sorted_results, +) +from radon.metrics import h_visit, mi_rank, mi_visit from radon.raw import analyze -from radon.metrics import mi_visit, mi_rank -from radon.complexity import (cc_visit, sorted_results, cc_rank, - add_inner_blocks) -from radon.cli.colors import RANKS_COLORS, MI_RANKS, RESET -from radon.cli.tools import (iter_filenames, _open, cc_to_dict, dict_to_xml, - dict_to_codeclimate_issues, cc_to_terminal, - raw_to_dict) + +if sys.version_info[0] < 3: + from StringIO import StringIO +else: + from io import StringIO + +try: + import nbformat + + SUPPORTS_IPYNB = True +except ImportError: + SUPPORTS_IPYNB = False class Harvester(object): @@ -25,7 +52,7 @@ class Harvester(object): implemented. 3. **Reporting**: the methods *as_json* and *as_xml* return a string - with the corresponding format. The method *to_terminal* is a generator + with the corrisponding format. The method *to_terminal* is a generator that yields the lines to be printed in the terminal. This class is meant to be subclasses and cannot be used directly, since @@ -46,8 +73,9 @@ def __init__(self, paths, config): def _iter_filenames(self): '''A wrapper around :func:`~radon.cli.tools.iter_filenames`.''' - return iter_filenames(self.paths, self.config.exclude, - self.config.ignore) + return iter_filenames( + self.paths, self.config.exclude, self.config.ignore + ) def gobble(self, fobj): '''Subclasses must implement this method to define behavior. @@ -66,7 +94,36 @@ def run(self): for name in self._iter_filenames(): with _open(name) as fobj: try: - yield (name, self.gobble(fobj)) + if name.endswith('.ipynb'): + if SUPPORTS_IPYNB and self.config.include_ipynb: + nb = nbformat.read( + fobj, as_version=nbformat.NO_CONVERT + ) + cells = [ + cell.source + for cell in nb.cells + if cell.cell_type == 'code' + ] + # Whole document + doc = "\n".join(cells) + yield ( + name, + self.gobble(StringIO(strip_ipython(doc))), + ) + + if self.config.ipynb_cells: + # Individual cells + cellid = 0 + for source in cells: + yield ( + "{0}:[{1}]".format(name, cellid), + self.gobble( + StringIO(strip_ipython(source)) + ), + ) + cellid += 1 + else: + yield (name, self.gobble(fobj)) except Exception as e: yield (name, {'error': str(e)}) @@ -79,6 +136,7 @@ def results(self): `results` is accessed multiple times after the first one, a list will be returned. ''' + def caching_iterator(it, r): '''An iterator that caches another iterator.''' for t in it: @@ -97,6 +155,10 @@ def as_xml(self): '''Format the results as XML.''' raise NotImplementedError + def as_md(self): + '''Format the results as Markdown.''' + raise NotImplementedError + def as_codeclimate_issues(self): '''Format the results as Code Climate issues.''' raise NotImplementedError @@ -127,8 +189,11 @@ def _to_dicts(self): if 'error' in data: result[key] = data continue - values = [v for v in map(cc_to_dict, data) - if self.config.min <= v['rank'] <= self.config.max] + values = [ + v + for v in map(cc_to_dict, data) + if self.config.min <= v['rank'] <= self.config.max + ] if values: result[key] = values return result @@ -143,21 +208,29 @@ def as_xml(self): ''' return dict_to_xml(self._to_dicts()) + def as_md(self): + '''Format the results as Markdown.''' + return dict_to_md(self._to_dicts()) + def as_codeclimate_issues(self): '''Format the result as Code Climate issues.''' return dict_to_codeclimate_issues(self._to_dicts(), self.config.min) def to_terminal(self): '''Yield lines to be printed in a terminal.''' - average_cc = .0 + average_cc = 0.0 analyzed = 0 for name, blocks in self.results: if 'error' in blocks: yield name, (blocks['error'],), {'error': True} continue - res, cc, n = cc_to_terminal(blocks, self.config.show_complexity, - self.config.min, self.config.max, - self.config.total_average) + res, cc, n = cc_to_terminal( + blocks, + self.config.show_complexity, + self.config.min, + self.config.max, + self.config.total_average, + ) average_cc += cc analyzed += n if res: @@ -167,17 +240,30 @@ def to_terminal(self): if (self.config.average or self.config.total_average) and analyzed: cc = average_cc / analyzed ranked_cc = cc_rank(cc) - yield ('\n{0} blocks (classes, functions, methods) analyzed.', - (analyzed,), {}) - yield ('Average complexity: {0}{1} ({2}){3}', - (RANKS_COLORS[ranked_cc], ranked_cc, cc, RESET), {}) + yield ( + '\n{0} blocks (classes, functions, methods) analyzed.', + (analyzed,), + {}, + ) + yield ( + 'Average complexity: {0}{1} ({2}){3}', + (RANKS_COLORS[ranked_cc], ranked_cc, cc, RESET), + {}, + ) class RawHarvester(Harvester): '''A class that analyzes Python modules' raw metrics.''' - headers = ['LOC', 'LLOC', 'SLOC', 'Comments', 'Single comments', 'Multi', - 'Blank'] + headers = [ + 'LOC', + 'LLOC', + 'SLOC', + 'Comments', + 'Single comments', + 'Multi', + 'Blank', + ] def gobble(self, fobj): '''Analyze the content of the file object.''' @@ -202,13 +288,21 @@ def to_terminal(self): loc, comments = mod['loc'], mod['comments'] yield '- Comment Stats', (), {'indent': 1} - yield ('(C % L): {0:.0%}', (comments / (float(loc) or 1),), - {'indent': 2}) - yield ('(C % S): {0:.0%}', (comments / (float(mod['sloc']) or 1),), - {'indent': 2}) - yield ('(C + M % L): {0:.0%}', - ((comments + mod['multi']) / (float(loc) or 1),), - {'indent': 2}) + yield ( + '(C % L): {0:.0%}', + (comments / (float(loc) or 1),), + {'indent': 2}, + ) + yield ( + '(C % S): {0:.0%}', + (comments / (float(mod['sloc']) or 1),), + {'indent': 2}, + ) + yield ( + '(C + M % L): {0:.0%}', + ((comments + mod['multi']) / (float(loc) or 1),), + {'indent': 2}, + ) if self.config.summary: _get = lambda k, v=0: sum_metrics.get(k, v) @@ -230,8 +324,10 @@ def to_terminal(self): ) yield ( '(C + M % L): {0:.0%}', - (float(_get('Comments', 0) + _get('Multi')) / - (_get('LOC', 1) or 1),), + ( + float(_get('Comments', 0) + _get('Multi')) + / (_get('LOC', 1) or 1), + ), {'indent': 2}, ) @@ -249,8 +345,10 @@ def gobble(self, fobj): def filtered_results(self): '''Filter results with respect with their rank.''' for key, value in self.results: - if ('error' in value or - self.config.min <= value['rank'] <= self.config.max): + if ( + 'error' in value + or self.config.min <= value['rank'] <= self.config.max + ): yield (key, value) def _sort(self, results): @@ -278,3 +376,74 @@ def to_terminal(self): if self.config.show: to_show = ' ({0:.2f})'.format(mi['mi']) yield '{0} - {1}{2}{3}{4}', (name, color, rank, to_show, RESET), {} + + +class HCHarvester(Harvester): + """Computes the Halstead Complexity of Python modules.""" + + def __init__(self, paths, config): + super().__init__(paths, config) + self.by_function = config.by_function + + def gobble(self, fobj): + """Analyze the content of the file object.""" + code = fobj.read() + return h_visit(code) + + def as_json(self): + """Format the results as JSON.""" + result_dict = self._to_dicts() + return json.dumps(result_dict) + + def to_terminal(self): + """Yield lines to be printed to the terminal.""" + if self.by_function: + for name, res in self.results: + yield "{}:".format(name), (), {} + for (name, report) in res.functions: + yield "{}:".format(name), (), {"indent": 1} + for msg in hal_report_to_terminal(report, 1): + yield msg + else: + for name, res in self.results: + yield "{}:".format(name), (), {} + for msg in hal_report_to_terminal(res.total, 0): + yield msg + + def _to_dicts(self): + '''Format the results as a dictionary of dictionaries.''' + result = {} + for filename, results in self.results: + if 'error' in results: + result[filename] = results + else: + result[filename] = {} + for k, v in results._asdict().items(): + if k == "functions": + result[filename]["functions"] = {key: val._asdict() for key, val in v} + else: + result[filename][k] = v._asdict() + + return result + + +def hal_report_to_terminal(report, base_indent=0): + """Yield lines from the HalsteadReport to print to the terminal.""" + yield "h1: {}".format(report.h1), (), {"indent": 1 + base_indent} + yield "h2: {}".format(report.h2), (), {"indent": 1 + base_indent} + yield "N1: {}".format(report.N1), (), {"indent": 1 + base_indent} + yield "N2: {}".format(report.N2), (), {"indent": 1 + base_indent} + yield "vocabulary: {}".format(report.vocabulary), (), { + "indent": 1 + base_indent + } + yield "length: {}".format(report.length), (), {"indent": 1 + base_indent} + yield "calculated_length: {}".format(report.calculated_length), (), { + "indent": 1 + base_indent + } + yield "volume: {}".format(report.volume), (), {"indent": 1 + base_indent} + yield "difficulty: {}".format(report.difficulty), (), { + "indent": 1 + base_indent + } + yield "effort: {}".format(report.effort), (), {"indent": 1 + base_indent} + yield "time: {}".format(report.time), (), {"indent": 1 + base_indent} + yield "bugs: {}".format(report.bugs), (), {"indent": 1 + base_indent} diff --git a/radon/cli/tools.py b/radon/cli/tools.py index 2d3214c..2c3b28f 100644 --- a/radon/cli/tools.py +++ b/radon/cli/tools.py @@ -4,25 +4,33 @@ environment variable RADONFILESENCODING ''' -import os -import re -import sys +import fnmatch +import hashlib import json import locale -import hashlib -import fnmatch +import os import platform +import re +import sys import xml.etree.cElementTree as et from contextlib import contextmanager -from radon.visitors import Function + +from radon.cli.colors import (BRIGHT, LETTERS_COLORS, RANKS_COLORS, RESET, + TEMPLATE) from radon.complexity import cc_rank -from radon.cli.colors import (LETTERS_COLORS, RANKS_COLORS, TEMPLATE, BRIGHT, - RESET) +from radon.visitors import Function +try: + import nbformat + + SUPPORTS_IPYNB = True +except ImportError: + SUPPORTS_IPYNB = False # PyPy doesn't support encoding parameter in `open()` function and works with # UTF-8 encoding by default if platform.python_implementation() == 'PyPy': + @contextmanager def _open(path): '''Mock of the built-in `open()` function. If `path` is `-` then @@ -33,25 +41,34 @@ def _open(path): else: with open(path) as f: yield f + + else: + if sys.version_info[:2] >= (3, 0): + default_encoding = 'utf-8' + else: + default_encoding = locale.getpreferredencoding(False) # Add customized file encoding to fix #86. # By default `open()` function uses `locale.getpreferredencoding(False)` # encoding (see https://docs.python.org/3/library/functions.html#open). # This code allows to change `open()` encoding by setting an environment # variable. - _encoding = os.getenv('RADONFILESENCODING', - locale.getpreferredencoding(False)) + _encoding = os.getenv( + 'RADONFILESENCODING', default_encoding + ) if sys.version_info[:2] < (2, 7): - # This open function treats line-endings slightly differently than + # This open function treats line-endings slighly differently than # io.open. But the latter is implemented in pure Python in version 2.6, # so we'll live with the differences instead of taking a hit on the # speed. Radon does a lot of file reading, so the difference in speed # is significant. from codecs import open as _open_function elif sys.version_info[:2] < (3, 0): - from io import open as _io_open_function, TextIOWrapper - from codecs import lookup, BOM_UTF8 + from codecs import BOM_UTF8, lookup + from io import TextIOWrapper + from io import open as _io_open_function + cookie_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)') blank_re = re.compile(r'^[ \t\f]*(?:[#\r\n]|$)') @@ -61,8 +78,11 @@ def _get_normal_name(orig_enc): enc = orig_enc[:12].lower().replace('_', '-') if enc == 'utf-8' or enc.startswith('utf-8-'): return 'utf-8' - if enc in ('latin-1', 'iso-8859-1', 'iso-latin-1') or \ - enc.startswith(('latin-1-', 'iso-8859-1-', 'iso-latin-1-')): + if enc in ( + 'latin-1', + 'iso-8859-1', + 'iso-latin-1', + ) or enc.startswith(('latin-1-', 'iso-8859-1-', 'iso-latin-1-')): return 'iso-8859-1' return orig_enc @@ -123,8 +143,9 @@ def find_cookie(line): if filename is None: msg = 'unknown encoding: ' + encoding else: - msg = ('unknown encoding for {!r}: ' - '{}'.format(filename, encoding)) + msg = 'unknown encoding for {!r}: ' '{}'.format( + filename, encoding + ) raise SyntaxError(msg) if bom_found: @@ -133,8 +154,9 @@ def find_cookie(line): if filename is None: msg = 'encoding problem: utf-8' else: - msg = ('encoding problem for ' - '{!r}: utf-8'.format(filename)) + msg = 'encoding problem for ' '{!r}: utf-8'.format( + filename + ) raise SyntaxError(msg) encoding += '-sig' return encoding @@ -182,7 +204,7 @@ def _open_function(filename, encoding=None): text = TextIOWrapper(buffer, encoding, line_buffering=True) text.mode = 'r' return text - except: + except Exception: buffer.close() raise @@ -201,6 +223,24 @@ def _open(path): yield f +def _is_python_file(filename): + '''Check if a file is a Python source file.''' + if ( + filename == '-' + or filename.endswith('.py') + or (SUPPORTS_IPYNB and filename.endswith('.ipynb')) + ): + return True + try: + with open(filename) as fobj: + first_line = fobj.readline() + if first_line.startswith('#!') and 'python' in first_line: + return True + except Exception: + return False + return False + + def iter_filenames(paths, exclude=None, ignore=None): '''A generator that yields all sub-paths of the ones specified in `paths`. Optional `exclude` filters can be passed as a comma-separated @@ -212,8 +252,17 @@ def iter_filenames(paths, exclude=None, ignore=None): if set(paths) == set(('-',)): yield '-' return + exclude = exclude.split(',') if exclude else [] + ignore = '.*,{0}'.format(ignore).split(',') if ignore else ['.*'] for path in paths: - if os.path.isfile(path): + if ( + os.path.isfile(path) + and _is_python_file(path) + and ( + not exclude + or not any(fnmatch.fnmatch(path, p) for p in exclude) + ) + ): yield path continue for filename in explore_directories(path, exclude, ignore): @@ -224,15 +273,13 @@ def explore_directories(start, exclude, ignore): '''Explore files and directories under `start`. `explore` and `ignore` arguments are the same as in :func:`iter_filenames`. ''' - e = '*[!p][!y]' - exclude = '{0},{1}'.format(e, exclude).split(',') if exclude else [e] - ignore = '.*,{0}'.format(ignore).split(',') if ignore else ['.*'] for root, dirs, files in os.walk(start): dirs[:] = list(filter_out(dirs, ignore)) fullpaths = (os.path.normpath(os.path.join(root, p)) for p in files) for filename in filter_out(fullpaths, exclude): - if (not os.path.basename(filename).startswith('.') and - filename.endswith('.py')): + if not os.path.basename(filename).startswith( + '.' + ) and _is_python_file(filename): yield filename @@ -246,6 +293,7 @@ def filter_out(strings, patterns): def cc_to_dict(obj): '''Convert an object holding CC results into a dictionary. This is meant for JSON dumping.''' + def get_type(obj): '''The object can be of type *method*, *function* or *class*.''' if isinstance(obj, Function): @@ -295,12 +343,40 @@ def dict_to_xml(results): et.SubElement(metric, 'classification').text = block['rank'] et.SubElement(metric, 'file').text = filename - et.SubElement(metric, 'startLineNumber').text = \ - str(block['lineno']) + et.SubElement(metric, 'startLineNumber').text = str( + block['lineno'] + ) et.SubElement(metric, 'endLineNumber').text = str(block['endline']) return et.tostring(ccm).decode('utf-8') +def dict_to_md(results): + md_string = ''' +| Filename | Name | Type | Start:End Line | Complexity | Classification | +| -------- | ---- | ---- | -------------- | ---------- | -------------- | +''' + type_letter_map = {'class': 'C', + 'method': 'M', + 'function': 'F'} + for filename, blocks in results.items(): + for block in blocks: + raw_classname = block.get("classname") + raw_name = block.get("name") + name = "{}.{}".format( + raw_classname, + raw_name) if raw_classname else block["name"] + type = type_letter_map[block["type"]] + md_string += "| {} | {} | {} | {}:{} | {} | {} |\n".format( + filename, + name, + type, + block["lineno"], + block["endline"], + block["complexity"], + block["rank"]) + return md_string + + def dict_to_codeclimate_issues(results, threshold='B'): '''Convert a dictionary holding CC analysis results into Code Climate issue json.''' @@ -324,34 +400,54 @@ def dict_to_codeclimate_issues(results, threshold='B'): remediation_points = 1000000 fingerprint = get_fingerprint(path, ['error']) codeclimate_issues.append( - format_cc_issue(path, description, error_content, - error_category, beginline, endline, - remediation_points, fingerprint)) + format_cc_issue( + path, + description, + error_content, + error_category, + beginline, + endline, + remediation_points, + fingerprint, + ) + ) else: for offender in info: beginline = offender['lineno'] endline = offender['endline'] complexity = offender['complexity'] category = 'Complexity' - description = ('Cyclomatic complexity is too high in {0} {1}. ' - '({2})'.format(offender['type'], - offender['name'], - complexity)) + description = ( + 'Cyclomatic complexity is too high in {0} {1}. ' + '({2})'.format( + offender['type'], offender['name'], complexity + ) + ) remediation_points = get_remediation_points( - complexity, threshold) - fingerprint = get_fingerprint(path, [offender['type'], - offender['name']]) + complexity, threshold + ) + fingerprint = get_fingerprint( + path, [offender['type'], offender['name']] + ) if remediation_points > 0: codeclimate_issues.append( - format_cc_issue(path, description, content, category, - beginline, endline, - remediation_points, fingerprint)) + format_cc_issue( + path, + description, + content, + category, + beginline, + endline, + remediation_points, + fingerprint, + ) + ) return codeclimate_issues def cc_to_terminal(results, show_complexity, min, max, total_average): - '''Transform Cyclomatic Complexity results into a 3-elements tuple: + '''Transfom Cyclomatic Complexity results into a 3-elements tuple: ``(res, total_cc, counted)`` @@ -370,7 +466,7 @@ def cc_to_terminal(results, show_complexity, min, max, total_average): ''' res = [] counted = 0 - total_cc = .0 + total_cc = 0.0 for line in results: ranked = cc_rank(line.complexity) if min <= ranked <= max: @@ -392,29 +488,39 @@ def _format_line(block, ranked, show_complexity=False): letter_colored = LETTERS_COLORS[block.letter] + block.letter rank_colored = RANKS_COLORS[ranked] + ranked compl = '' if not show_complexity else ' ({0})'.format(block.complexity) - return TEMPLATE.format(BRIGHT, letter_colored, block.lineno, - block.col_offset, block.fullname, rank_colored, - compl, reset=RESET) - - -def format_cc_issue(path, description, content, category, beginline, endline, - remediation_points, fingerprint): + return TEMPLATE.format( + BRIGHT, + letter_colored, + block.lineno, + block.col_offset, + block.fullname, + rank_colored, + compl, + reset=RESET, + ) + + +def format_cc_issue( + path, + description, + content, + category, + beginline, + endline, + remediation_points, + fingerprint, +): '''Return properly formatted Code Climate issue json.''' issue = { 'type': 'issue', 'check_name': 'Complexity', 'description': description, - 'content': { - 'body': content, - }, + 'content': {'body': content,}, 'categories': [category], 'fingerprint': fingerprint, 'location': { 'path': path, - 'lines': { - 'begin': beginline, - 'end': endline, - }, + 'lines': {'begin': beginline, 'end': endline,}, }, 'remediation_points': remediation_points, } @@ -442,36 +548,37 @@ def get_remediation_points(complexity, grade_threshold): def get_content(): '''Return explanation string for Code Climate issue document.''' - content = ['##Cyclomatic Complexity', - 'Cyclomatic Complexity corresponds to the number of decisions ' - 'a block of code contains plus 1. This number (also called ' - 'McCabe number) is equal to the number of linearly independent ' - 'paths through the code. This number can be used as a guide ' - 'when testing conditional logic in blocks.\n', - 'Radon analyzes the AST tree of a Python program to compute ' - 'Cyclomatic Complexity. Statements have the following effects ' - 'on Cyclomatic Complexity:\n\n', - '| Construct | Effect on CC | Reasoning |', - '| --------- | ------------ | --------- |', - '| if | +1 | An *if* statement is a single decision. |', - '| elif| +1| The *elif* statement adds another decision. |', - '| else| +0| The *else* statement does not cause a new ' - 'decision. The decision is at the *if*. |', - '| for| +1| There is a decision at the start of the loop. |', - '| while| +1| There is a decision at the *while* statement. |', - '| except| +1| Each *except* branch adds a new conditional ' - 'path of execution. |', - '| finally| +0| The finally block is unconditionally ' - 'executed. |', - '| with| +1| The *with* statement roughly corresponds to a ' - 'try/except block (see PEP 343 for details). |', - '| assert| +1| The *assert* statement internally roughly ' - 'equals a conditional statement. |', - '| Comprehension| +1| A list/set/dict comprehension of ' - 'generator expression is equivalent to a for loop. |', - '| Boolean Operator| +1| Every boolean operator (and, or) ' - 'adds a decision point. |\n', - 'Source: http://radon.readthedocs.org/en/latest/intro.html'] + content = [ + '##Cyclomatic Complexity', + 'Cyclomatic Complexity corresponds to the number of decisions ' + 'a block of code contains plus 1. This number (also called ' + 'McCabe number) is equal to the number of linearly independent ' + 'paths through the code. This number can be used as a guide ' + 'when testing conditional logic in blocks.\n', + 'Radon analyzes the AST tree of a Python program to compute ' + 'Cyclomatic Complexity. Statements have the following effects ' + 'on Cyclomatic Complexity:\n\n', + '| Construct | Effect on CC | Reasoning |', + '| --------- | ------------ | --------- |', + '| if | +1 | An *if* statement is a single decision. |', + '| elif| +1| The *elif* statement adds another decision. |', + '| else| +0| The *else* statement does not cause a new ' + 'decision. The decision is at the *if*. |', + '| for| +1| There is a decision at the start of the loop. |', + '| while| +1| There is a decision at the *while* statement. |', + '| except| +1| Each *except* branch adds a new conditional ' + 'path of execution. |', + '| finally| +0| The finally block is unconditionally ' 'executed. |', + '| with| +1| The *with* statement roughly corresponds to a ' + 'try/except block (see PEP 343 for details). |', + '| assert| +1| The *assert* statement internally roughly ' + 'equals a conditional statement. |', + '| Comprehension| +1| A list/set/dict comprehension of ' + 'generator expression is equivalent to a for loop. |', + '| Boolean Operator| +1| Every boolean operator (and, or) ' + 'adds a decision point. |\n', + 'Source: http://radon.readthedocs.org/en/latest/intro.html', + ] return '\n'.join(content) @@ -482,3 +589,9 @@ def get_fingerprint(path, additional_parts): key = '|'.join(parts) m.update(key.encode('utf-8')) return m.hexdigest() + + +def strip_ipython(code): + return '\n'.join( + [line for line in code.split('\n') if not line.startswith('%')] + ) diff --git a/radon/complexity.py b/radon/complexity.py index 1902c9e..8cf3ff1 100644 --- a/radon/complexity.py +++ b/radon/complexity.py @@ -3,9 +3,8 @@ ''' import math -from flake8_polyfill import options -from radon.visitors import GET_COMPLEXITY, ComplexityVisitor, code2ast +from radon.visitors import GET_COMPLEXITY, ComplexityVisitor, code2ast # sorted_block ordering functions SCORE = lambda block: -GET_COMPLEXITY(block) @@ -40,7 +39,9 @@ def cc_rank(cc): ''' if cc < 0: raise ValueError('Complexity must be a non-negative value') - return chr(min(int(math.ceil(cc / 10.) or 1) - (1, 0)[5 - cc < 0], 5) + 65) + return chr( + min(int(math.ceil(cc / 10.0) or 1) - (1, 0)[5 - cc < 0], 5) + 65 + ) def average_complexity(blocks): @@ -52,7 +53,7 @@ def average_complexity(blocks): size = len(blocks) if size == 0: return 0 - return sum((GET_COMPLEXITY(block) for block in blocks), .0) / len(blocks) + return sum((GET_COMPLEXITY(block) for block in blocks), 0.0) / len(blocks) def sorted_results(blocks, order=SCORE): @@ -105,53 +106,3 @@ def cc_visit_ast(ast_node, **kwargs): the keyword arguments are directly passed to the visitor. ''' return ComplexityVisitor.from_ast(ast_node, **kwargs).blocks - - -class Flake8Checker(object): - '''Entry point for the Flake8 tool.''' - - name = 'radon' - version = __import__('radon').__version__ - _code = 'R701' - _error_tmpl = 'R701 %r is too complex (%d)' - no_assert = False - max_cc = -1 - - def __init__(self, tree, filename): - '''Accept the AST tree and a filename (unused).''' - self.tree = tree - - @classmethod - def add_options(cls, parser): # pragma: no cover - '''Add custom options to the global parser.''' - options.register( - parser, - '--radon-max-cc', default=-1, action='store', - type='int', help='Radon complexity threshold', - parse_from_config=True - ) - options.register( - parser, - '--radon-no-assert', dest='no_assert', action='store_true', - default=False, help='Radon will ignore assert statements', - parse_from_config=True, - ) - - @classmethod - def parse_options(cls, options): # pragma: no cover - '''Save actual options as class attributes.''' - cls.max_cc = options.radon_max_cc - cls.no_assert = options.no_assert - - def run(self): - '''Run the ComplexityVisitor over the AST tree.''' - if self.max_cc < 0: - if not self.no_assert: - return - self.max_cc = 10 - visitor = ComplexityVisitor.from_ast(self.tree, - no_assert=self.no_assert) - for block in visitor.blocks: - if block.complexity > self.max_cc: - text = self._error_tmpl % (block.name, block.complexity) - yield block.lineno, block.col_offset, text, type(self) diff --git a/radon/contrib/__init__.py b/radon/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/radon/contrib/flake8.py b/radon/contrib/flake8.py new file mode 100644 index 0000000..2376f4d --- /dev/null +++ b/radon/contrib/flake8.py @@ -0,0 +1,72 @@ +from radon.complexity import add_inner_blocks +from radon.visitors import ComplexityVisitor + + +class Flake8Checker(object): + '''Entry point for the Flake8 tool.''' + + name = 'radon' + version = __import__('radon').__version__ + _code = 'R701' + _error_tmpl = 'R701 %r is too complex (%d)' + no_assert = False + show_closures = False + max_cc = -1 + + def __init__(self, tree, filename): + '''Accept the AST tree and a filename (unused).''' + self.tree = tree + + @classmethod + def add_options(cls, option_manager): # pragma: no cover + '''Add custom options to the global parser.''' + option_manager.add_option( + '--radon-max-cc', + default=-1, + action='store', + type=int, + help='Radon complexity threshold', + parse_from_config=True, + ) + option_manager.add_option( + '--radon-no-assert', + dest='no_assert', + action='store_true', + default=False, + help='Radon will ignore assert statements', + parse_from_config=True, + ) + option_manager.add_option( + '--radon-show-closures', + dest='show_closures', + action='store_true', + default=False, + help='Add closures/inner classes to the output', + parse_from_config=True, + ) + + @classmethod + def parse_options(cls, options): # pragma: no cover + '''Save actual options as class attributes.''' + cls.max_cc = options.radon_max_cc + cls.no_assert = options.no_assert + cls.show_closures = options.show_closures + + def run(self): + '''Run the ComplexityVisitor over the AST tree.''' + if self.max_cc < 0: + if not self.no_assert: + return + self.max_cc = 10 + visitor = ComplexityVisitor.from_ast( + self.tree, no_assert=self.no_assert + ) + + blocks = visitor.blocks + if self.show_closures: + blocks = add_inner_blocks(blocks) + + for block in blocks: + if block.complexity > self.max_cc: + text = self._error_tmpl % (block.name, block.complexity) + yield block.lineno, block.col_offset, text, type(self) diff --git a/radon/metrics.py b/radon/metrics.py index 9a86f6b..7c6ec63 100644 --- a/radon/metrics.py +++ b/radon/metrics.py @@ -3,16 +3,23 @@ ''' import ast -import math import collections -from radon.visitors import HalsteadVisitor, ComplexityVisitor -from radon.raw import analyze +import math +from radon.raw import analyze +from radon.visitors import ComplexityVisitor, HalsteadVisitor # Halstead metrics -Halstead = collections.namedtuple('Halstead', 'h1 h2 N1 N2 vocabulary length ' - 'calculated_length volume ' - 'difficulty effort time bugs') +HalsteadReport = collections.namedtuple( + 'HalsteadReport', + 'h1 h2 N1 N2 vocabulary length ' + 'calculated_length volume ' + 'difficulty effort time bugs', +) + +# `total` is a HalsteadReport for the entire scanned file, while `functions` is +# a list of `HalsteadReport`s for each function in the file. +Halstead = collections.namedtuple("Halstead", "total functions") def h_visit(code): @@ -23,8 +30,10 @@ def h_visit(code): def h_visit_ast(ast_node): - '''Visit the AST node using the :class:`~radon.visitors.HalsteadVisitor` - visitor. A namedtuple with the following fields is returned: + ''' + Visit the AST node using the :class:`~radon.visitors.HalsteadVisitor` + visitor. The results are `HalsteadReport` namedtuples with the following + fields: * h1: the number of distinct operators * h2: the number of distinct operands @@ -38,8 +47,27 @@ def h_visit_ast(ast_node): * effort: E = D * V * time: T = E / 18 seconds * bugs: B = V / 3000 - an estimate of the errors in the implementation + + The actual return of this function is a namedtuple with the following + fields: + + * total: a `HalsteadReport` namedtuple for the entire scanned file + * functions: a list of `HalsteadReport`s for each toplevel function + + Nested functions are not tracked. ''' visitor = HalsteadVisitor.from_ast(ast_node) + total = halstead_visitor_report(visitor) + functions = [ + (v.context, halstead_visitor_report(v)) + for v in visitor.function_visitors + ] + + return Halstead(total, functions) + + +def halstead_visitor_report(visitor): + """Return a HalsteadReport from a HalsteadVisitor instance.""" h1, h2 = visitor.distinct_operators, visitor.distinct_operands N1, N2 = visitor.operators, visitor.operands h = h1 + h2 @@ -51,9 +79,19 @@ def h_visit_ast(ast_node): volume = N * math.log(h, 2) if h != 0 else 0 difficulty = (h1 * N2) / float(2 * h2) if h2 != 0 else 0 effort = difficulty * volume - return Halstead( - h1, h2, N1, N2, h, N, length, volume, difficulty, effort, - effort / 18., volume / 3000. + return HalsteadReport( + h1, + h2, + N1, + N2, + h, + N, + length, + volume, + difficulty, + effort, + effort / 18.0, + volume / 3000.0, ) @@ -64,14 +102,19 @@ def mi_compute(halstead_volume, complexity, sloc, comments): is preferred. ''' if any(metric <= 0 for metric in (halstead_volume, sloc)): - return 100. + return 100.0 sloc_scale = math.log(sloc) volume_scale = math.log(halstead_volume) comments_scale = math.sqrt(2.46 * math.radians(comments)) # Non-normalized MI - nn_mi = (171 - 5.2 * volume_scale - .23 * complexity - 16.2 * sloc_scale + - 50 * math.sin(comments_scale)) - return min(max(0., nn_mi * 100 / 171.), 100.) + nn_mi = ( + 171 + - 5.2 * volume_scale + - 0.23 * complexity + - 16.2 * sloc_scale + + 50 * math.sin(comments_scale) + ) + return min(max(0.0, nn_mi * 100 / 171.0), 100.0) def mi_parameters(code, count_multi=True): @@ -91,9 +134,12 @@ def mi_parameters(code, count_multi=True): raw = analyze(code) comments_lines = raw.comments + (raw.multi if count_multi else 0) comments = comments_lines / float(raw.sloc) * 100 if raw.sloc != 0 else 0 - return (h_visit_ast(ast_node).volume, - ComplexityVisitor.from_ast(ast_node).total_complexity, raw.lloc, - comments) + return ( + h_visit_ast(ast_node).total.volume, + ComplexityVisitor.from_ast(ast_node).total_complexity, + raw.lloc, + comments, + ) def mi_visit(code, multi): diff --git a/radon/raw.py b/radon/raw.py index ab6658b..1ac2bc1 100644 --- a/radon/raw.py +++ b/radon/raw.py @@ -4,21 +4,35 @@ that is used. ''' -import tokenize -import operator import collections +import operator +import tokenize + try: import StringIO as io except ImportError: # pragma: no cover import io -__all__ = ['OP', 'COMMENT', 'TOKEN_NUMBER', 'NL', 'EM', 'Module', '_generate', - '_less_tokens', '_find', '_logical', 'analyze'] +__all__ = [ + 'OP', + 'COMMENT', + 'TOKEN_NUMBER', + 'NL', + 'NEWLINE', + 'EM', + 'Module', + '_generate', + '_fewer_tokens', + '_find', + '_logical', + 'analyze', +] COMMENT = tokenize.COMMENT OP = tokenize.OP NL = tokenize.NL +NEWLINE = tokenize.NEWLINE EM = tokenize.ENDMARKER # Helper for map() @@ -31,9 +45,10 @@ # multi = Multi-line strings (assumed to be docstrings) # blank = Blank lines (or whitespace-only lines) # single_comments = Single-line comments or docstrings -Module = collections.namedtuple('Module', ['loc', 'lloc', 'sloc', - 'comments', 'multi', 'blank', - 'single_comments']) +Module = collections.namedtuple( + 'Module', + ['loc', 'lloc', 'sloc', 'comments', 'multi', 'blank', 'single_comments'], +) def _generate(code): @@ -44,7 +59,7 @@ def _generate(code): return list(tokenize.generate_tokens(io.StringIO(code).readline)) -def _less_tokens(tokens, remove): +def _fewer_tokens(tokens, remove): '''Process the output of `tokenize.generate_tokens` removing the tokens specified in `remove`. ''' @@ -132,33 +147,39 @@ def _logical(tokens): if cond: return 0 # Only a comment -> 2 ''' + def aux(sub_tokens): '''The actual function which does the job.''' # Get the tokens and, in the meantime, remove comments - processed = list(_less_tokens(sub_tokens, [COMMENT])) + processed = list(_fewer_tokens(sub_tokens, [COMMENT, NL, NEWLINE])) try: # Verify whether a colon is present among the tokens and that # it is the last token. token_pos = _find(processed, OP, ':') + # We subtract 2 from the total because the last token is always + # ENDMARKER. There are two cases: if the colon is at the end, it + # means that there is only one logical line; if it isn't then there + # are two. return 2 - (token_pos == len(processed) - 2) except ValueError: # The colon is not present # If the line is only composed by comments, newlines and endmarker # then it does not count as a logical line. # Otherwise it count as 1. - if not list(_less_tokens(processed, [NL, EM])): + if not list(_fewer_tokens(processed, [NL, NEWLINE, EM])): return 0 return 1 + return sum(aux(sub) for sub in _split_tokens(tokens, OP, ';')) def is_single_token(token_number, tokens): - '''Is this a single token matching token_number followed by ENDMARKER or NL - tokens. + '''Is this a single token matching token_number followed by ENDMARKER, NL + or NEWLINE tokens. ''' - return (TOKEN_NUMBER(tokens[0]) == token_number and - all(TOKEN_NUMBER(t) in (tokenize.ENDMARKER, tokenize.NL) - for t in tokens[1:])) + return TOKEN_NUMBER(tokens[0]) == token_number and all( + TOKEN_NUMBER(t) in (EM, NL, NEWLINE) for t in tokens[1:] + ) def analyze(source): @@ -192,8 +213,9 @@ def analyze(source): lineno += len(parsed_lines) - comments += sum(1 for t in tokens - if TOKEN_NUMBER(t) == tokenize.COMMENT) + comments += sum( + 1 for t in tokens if TOKEN_NUMBER(t) == tokenize.COMMENT + ) # Identify single line comments, conservatively if is_single_token(tokenize.COMMENT, tokens): @@ -209,20 +231,15 @@ def analyze(source): else: multi += sum(1 for l in parsed_lines if l) # Skip empty lines blank += sum(1 for l in parsed_lines if not l) - else: # Everything else is either code or blank lines - for parsed_line in parsed_lines: if parsed_line: sloc += 1 else: blank += 1 - # Process a logical line - # Split it on semicolons because they increase the number of - # logical lines - for sub_tokens in _split_tokens(tokens, OP, ';'): - lloc += _logical(sub_tokens) + # Process logical lines separately + lloc += _logical(tokens) loc = sloc + blank + multi + single_comments return Module(loc, lloc, sloc, comments, multi, blank, single_comments) diff --git a/radon/tests/conftest.py b/radon/tests/conftest.py new file mode 100644 index 0000000..a65e5e4 --- /dev/null +++ b/radon/tests/conftest.py @@ -0,0 +1,31 @@ +import os +import textwrap + +import pytest + + +@pytest.fixture +def log_mock(mocker): + return mocker.patch('radon.cli.log_result') + + +class RadonConfig(object): + def __init__(self): + self._fname = os.path.join(os.path.dirname(__file__), 'radon.cfg') + + def write(self, text): + _cfg = textwrap.dedent(text) + with open(self._fname, 'w') as cfg_f: + cfg_f.write("# Autogenerated from pytest \n[radon]\n") + cfg_f.write(_cfg) + + def __del__(self): + with open(self._fname, 'w') as cfg_f: + cfg_f.write('# Session completed') + + +@pytest.fixture(scope="session") +def radon_config(): + r = RadonConfig() + yield r + del r diff --git a/radon/tests/data/example.ipynb b/radon/tests/data/example.ipynb new file mode 100644 index 0000000..645c2d8 --- /dev/null +++ b/radon/tests/data/example.ipynb @@ -0,0 +1,2837 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plotting with Matplotlib" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IPython works with the [Matplotlib](http://matplotlib.org/) plotting library, which integrates Matplotlib with IPython's display system and event loop handling." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## matplotlib mode" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To make plots using Matplotlib, you must first enable IPython's matplotlib mode.\n", + "\n", + "To do this, run the `%matplotlib` magic command to enable plotting in the current Notebook.\n", + "\n", + "This magic takes an optional argument that specifies which Matplotlib backend should be used. Most of the time, in the Notebook, you will want to use the `inline` backend, which will embed plots inside the Notebook:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also use Matplotlib GUI backends in the Notebook, such as the Qt backend (`%matplotlib qt`). This will use Matplotlib's interactive Qt UI in a floating window to the side of your browser. Of course, this only works if your browser is running on the same system as the Notebook Server. You can always call the `display` function to paste figures into the Notebook document." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a simple plot" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With matplotlib enabled, plotting should just work." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": [ + "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\n", + "AAAASUVORK5CYII=\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "image/png": { + "height": 392, + "width": 602 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "x = np.linspace(0, 3*np.pi, 500)\n", + "plt.plot(x, np.sin(x**2))\n", + "plt.title('A simple chirp');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These images can be resized by dragging the handle in the lower right corner. Double clicking will return them to their original size." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One thing to be aware of is that by default, the `Figure` object is cleared at the end of each cell, so you will need to issue all plotting commands for a single figure in a single cell." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading Matplotlib demos with %load" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IPython's `%load` magic can be used to load any Matplotlib demo by its URL:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": [ + "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\n", + "WZKkfJXcNH3XXXdNKUnjWrVqFe+99x4AW2+9ddX+TWvTokULunbtCrDGO+atj8rSZm37M82fP5+J\n", + "EyfW+z2XL19edbZX9TKquuqfNX/+/DVeFtjYmuL7SpKUbyyp1DhC2A24ODH9OzAphTSSJDWZ//3v\n", + "f7U23S6UTa7fe++9qg3hG7If1ZZbbgnAJ5980qDPW7p0Ka+//jpLliyplaNyb6iBAweucX+mBx98\n", + "kEcffbTen1eZL4RAr1696nzO3nvvzSabbAJk9q1KFpIbItvfV5KkfGNJpQ0XQlvgNmreLfILYHSj\n", + "7qAqSVIOePfdd2schxAKpqSaMWNG1eOGlFRbb701AB9//HG9X/Pf//6XoUOH8s1vfpMDDjiAVatW\n", + "Va09/vjjVY933HHHOl9fXl7O5MmTOeaYY+r9mdVLtMrMSS1btuS0004DMpusP/zww+t835UrV9a4\n", + "y2Fd0vi+kiTlG0sqNYYrgeSmFScT45w0wkiS1JT+9a9/1Tju0KED2223XUppGlf1kqo+m6ZXqryz\n", + "4X/+8596v+baa6/lf//7HwCzZ8+u2v9p1apV3H777VXP69KlS52vv/766ykvL29QafP+++8D0Llz\n", + "56qzv+pyyimnsPvuuwNw00038cUXX6z1fa+//nrmzZtXdbx48eJaz0nj+0qSlG8sqbRhQjgE+FFi\n", + "+idivC+NOJIkNbVkSVVZ0BSCypIqhNCgkmqPPfYA4NNPP11noVPps88+q3p8/PHH0759ewAmTZpE\n", + "RUUFRx11VI1M1T300ENcd911TJo0qUF34HvrrbcAqgqoNSkqKmLSpElst912zJs3j1NOOYVFixbV\n", + "+dzbbruNyZMn06FDByBz9tWdd95Z62TyNL6vJEn5xpJK6y+E7sDUxPR9YEwKaSRJyopkSVUom6bD\n", + "6rsW9ujRg0033bTer9thhx3o3LkzMUbefPPNer2mspQ54IADOP300/n000+ZOHEiU6ZM4cYbb2T8\n", + "+PH07t2bhx56iJtvvpnPP/+cmTNncv7553P22WczderUBhVpsLqk2meffdb53B49enD//fczbNgw\n", + "pk2bxkEHHcQdd9zBrFmzmD17No8++ijHHnssU6ZM4e6776Zjx9U3N77hhhvo378/gwcPrtprKo3v\n", + "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\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "image/png": { + "height": 403, + "width": 596 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# %load http://matplotlib.org/mpl_examples/showcase/integral_demo.py\n", + "\"\"\"\n", + "Plot demonstrating the integral as the area under a curve.\n", + "\n", + "Although this is a simple example, it demonstrates some important tweaks:\n", + "\n", + " * A simple line plot with custom color and line width.\n", + " * A shaded region created using a Polygon patch.\n", + " * A text label with mathtext rendering.\n", + " * figtext calls to label the x- and y-axes.\n", + " * Use of axis spines to hide the top and right spines.\n", + " * Custom tick placement and labels.\n", + "\"\"\"\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.patches import Polygon\n", + "\n", + "\n", + "def func(x):\n", + " return (x - 3) * (x - 5) * (x - 7) + 85\n", + "\n", + "\n", + "a, b = 2, 9 # integral limits\n", + "x = np.linspace(0, 10)\n", + "y = func(x)\n", + "\n", + "fig, ax = plt.subplots()\n", + "plt.plot(x, y, 'r', linewidth=2)\n", + "plt.ylim(ymin=0)\n", + "\n", + "# Make the shaded region\n", + "ix = np.linspace(a, b)\n", + "iy = func(ix)\n", + "verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]\n", + "poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')\n", + "ax.add_patch(poly)\n", + "\n", + "plt.text(0.5 * (a + b), 30, r\"$\\int_a^b f(x)\\mathrm{d}x$\",\n", + " horizontalalignment='center', fontsize=20)\n", + "\n", + "plt.figtext(0.9, 0.05, '$x$')\n", + "plt.figtext(0.1, 0.9, '$y$')\n", + "\n", + "ax.spines['right'].set_visible(False)\n", + "ax.spines['top'].set_visible(False)\n", + "ax.xaxis.set_ticks_position('bottom')\n", + "\n", + "ax.set_xticks((a, b))\n", + "ax.set_xticklabels(('$a$', '$b$'))\n", + "ax.set_yticks([])\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Matplotlib 1.4 introduces an interactive backend for use in the notebook,\n", + "called 'nbagg'. You can enable this with `%matplotlib notebook`.\n", + "\n", + "With this backend, you will get interactive panning and zooming of matplotlib figures in your browser." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib notebook" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " fig.waiting = false;\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width);\n", + " canvas.attr('height', height);\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('