├── .github └── workflows │ └── push.yml ├── .gitignore ├── .sonarcloud.properties ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── fixtures ├── basic │ ├── 03.ass │ ├── 05.5.ass │ ├── 05.ass │ ├── [VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv │ ├── [VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv │ └── [VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv └── exclude │ ├── [ANE] Soredemo Machi wa Mawatte Iru - EP01 [BD 1920x1080 H.264 FLAC].CASO-SC.ass │ ├── [ANE] Soredemo Machi wa Mawatte Iru - EP02 [BD 1920x1080 H.264 FLAC].CASO-SC.ass │ ├── [ANK-Raws] それでも町は廻っている (Ep_05 Creditless ED) (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv │ ├── [ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv │ └── [ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv ├── poetry.lock ├── pyproject.toml ├── renovate.json ├── resubname.py ├── snapshots ├── __init__.py └── snap_test_resubname.py └── test_resubname.py /.github/workflows/push.yml: -------------------------------------------------------------------------------- 1 | on: push 2 | name: Main workflow 3 | jobs: 4 | black: 5 | name: black 6 | runs-on: ubuntu-latest 7 | container: python:3.8 8 | 9 | steps: 10 | - uses: actions/checkout@master 11 | - name: Check Python version 12 | run: | 13 | python -V 14 | - run: pip install poetry 15 | - run: poetry install 16 | - run: poetry run black --check . 17 | pytest: 18 | name: Test on ${{ matrix.container }} 19 | runs-on: ubuntu-latest 20 | container: ${{ matrix.container }} 21 | strategy: 22 | matrix: 23 | container: 24 | - python:3.8 25 | - python:3.7 26 | - python:3.6 27 | steps: 28 | - uses: actions/checkout@master 29 | - name: Check Python version 30 | run: | 31 | python -V 32 | - run: pip install poetry 33 | - run: poetry install 34 | - run: poetry run pytest --cov=resubname --cov-report xml --cov-report term-missing 35 | - uses: codecov/codecov-action@v5.1.2 36 | with: 37 | token: ${{secrets.CODECOV_TOKEN}} 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /.sonarcloud.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.pythonPath": ".venv/bin/python", 3 | "python.formatting.provider": "black", 4 | "editor.codeActionsOnSave": { 5 | "source.organizeImports": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2019, Wu Haotian 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # resubname 2 | 3 | Rename subtitle filenames to match videos. 4 | 5 | ## Install with `pipx` 6 | 7 | Using [pipx](https://pipxproject.github.io/pipx/) to install `resubname` is recommended. 8 | 9 | ```bash 10 | pipx install resubname 11 | ``` 12 | 13 | ## Example 14 | 15 | ```bash 16 | > ls 17 | 03.ass '[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv' 18 | 05.5.ass '[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv' 19 | 05.ass '[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv' 20 | 21 | > resubname *.ass *.mkv 22 | 03.ass -> [VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].ass 23 | 05.5.ass -> [VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].ass 24 | 05.ass -> [VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].ass 25 | > ls 26 | '[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].ass' 27 | '[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv' 28 | '[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].ass' 29 | '[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv' 30 | '[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].ass' 31 | '[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv' 32 | ``` 33 | 34 | And you can exclude certain files: 35 | 36 | ```bash 37 | > ls 38 | '[ANE] Soredemo Machi wa Mawatte Iru - EP01 [BD 1920x1080 H.264 FLAC].CASO-SC.ass' 39 | '[ANE] Soredemo Machi wa Mawatte Iru - EP02 [BD 1920x1080 H.264 FLAC].CASO-SC.ass' 40 | '[ANK-Raws] それでも町は廻っている (Ep_05 Creditless ED) (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv' 41 | '[ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv' 42 | '[ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv' 43 | > resubname *.ass *.mkv -e creditless --dryrun 44 | [ANE] Soredemo Machi wa Mawatte Iru - EP01 [BD 1920x1080 H.264 FLAC].CASO-SC.ass -> [ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).ass 45 | [ANE] Soredemo Machi wa Mawatte Iru - EP02 [BD 1920x1080 H.264 FLAC].CASO-SC.ass -> [ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).ass 46 | ``` 47 | 48 | ## Help 49 | 50 | ``` 51 | resubname -h 52 | ``` 53 | 54 | ## Changelog 55 | 56 | ### v0.3.0 57 | 58 | - Display videos & subtitles number when their number dismatch. 59 | - Add support for more video formats. 60 | - Add `--version` support. 61 | 62 | ### v0.2.0 63 | 64 | - Show videos and subtitiles file list when their number dismatch. 65 | - Stop complain about "Unknown suffix" for folders. Will just ignore them. 66 | 67 | ### v0.1.0 68 | 69 | - Initial Release 70 | -------------------------------------------------------------------------------- /fixtures/basic/03.ass: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/basic/03.ass -------------------------------------------------------------------------------- /fixtures/basic/05.5.ass: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/basic/05.5.ass -------------------------------------------------------------------------------- /fixtures/basic/05.ass: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/basic/05.ass -------------------------------------------------------------------------------- /fixtures/basic/[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/basic/[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv -------------------------------------------------------------------------------- /fixtures/basic/[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/basic/[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv -------------------------------------------------------------------------------- /fixtures/basic/[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/basic/[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv -------------------------------------------------------------------------------- /fixtures/exclude/[ANE] Soredemo Machi wa Mawatte Iru - EP01 [BD 1920x1080 H.264 FLAC].CASO-SC.ass: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/exclude/[ANE] Soredemo Machi wa Mawatte Iru - EP01 [BD 1920x1080 H.264 FLAC].CASO-SC.ass -------------------------------------------------------------------------------- /fixtures/exclude/[ANE] Soredemo Machi wa Mawatte Iru - EP02 [BD 1920x1080 H.264 FLAC].CASO-SC.ass: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/exclude/[ANE] Soredemo Machi wa Mawatte Iru - EP02 [BD 1920x1080 H.264 FLAC].CASO-SC.ass -------------------------------------------------------------------------------- /fixtures/exclude/[ANK-Raws] それでも町は廻っている (Ep_05 Creditless ED) (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/exclude/[ANK-Raws] それでも町は廻っている (Ep_05 Creditless ED) (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv -------------------------------------------------------------------------------- /fixtures/exclude/[ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/exclude/[ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv -------------------------------------------------------------------------------- /fixtures/exclude/[ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/fixtures/exclude/[ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "appdirs" 3 | version = "1.4.4" 4 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 5 | category = "dev" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [[package]] 10 | name = "atomicwrites" 11 | version = "1.4.1" 12 | description = "Atomic file writes." 13 | category = "dev" 14 | optional = false 15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 16 | 17 | [[package]] 18 | name = "attrs" 19 | version = "22.2.0" 20 | description = "Classes Without Boilerplate" 21 | category = "dev" 22 | optional = false 23 | python-versions = ">=3.6" 24 | 25 | [package.extras] 26 | cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] 27 | dev = ["attrs[docs,tests]"] 28 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] 29 | tests = ["attrs[tests-no-zope]", "zope.interface"] 30 | 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]"] 31 | 32 | [[package]] 33 | name = "black" 34 | version = "19.10b0" 35 | description = "The uncompromising code formatter." 36 | category = "dev" 37 | optional = false 38 | python-versions = ">=3.6" 39 | 40 | [package.dependencies] 41 | appdirs = "*" 42 | attrs = ">=18.1.0" 43 | click = ">=6.5" 44 | pathspec = ">=0.6,<1" 45 | regex = "*" 46 | toml = ">=0.9.4" 47 | typed-ast = ">=1.4.0" 48 | 49 | [package.extras] 50 | d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] 51 | 52 | [[package]] 53 | name = "click" 54 | version = "8.0.4" 55 | description = "Composable command line interface toolkit" 56 | category = "dev" 57 | optional = false 58 | python-versions = ">=3.6" 59 | 60 | [package.dependencies] 61 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 62 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 63 | 64 | [[package]] 65 | name = "colorama" 66 | version = "0.4.5" 67 | description = "Cross-platform colored terminal text." 68 | category = "dev" 69 | optional = false 70 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 71 | 72 | [[package]] 73 | name = "coverage" 74 | version = "6.2" 75 | description = "Code coverage measurement for Python" 76 | category = "dev" 77 | optional = false 78 | python-versions = ">=3.6" 79 | 80 | [package.dependencies] 81 | tomli = {version = "*", optional = true, markers = "extra == \"toml\""} 82 | 83 | [package.extras] 84 | toml = ["tomli"] 85 | 86 | [[package]] 87 | name = "fastdiff" 88 | version = "0.3.0" 89 | description = "A fast native implementation of diff algorithm with a pure python fallback" 90 | category = "dev" 91 | optional = false 92 | python-versions = "*" 93 | 94 | [package.dependencies] 95 | wasmer = ">=1.0.0" 96 | wasmer-compiler-cranelift = ">=1.0.0" 97 | 98 | [[package]] 99 | name = "importlib-metadata" 100 | version = "4.8.3" 101 | description = "Read metadata from Python packages" 102 | category = "dev" 103 | optional = false 104 | python-versions = ">=3.6" 105 | 106 | [package.dependencies] 107 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 108 | zipp = ">=0.5" 109 | 110 | [package.extras] 111 | docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] 112 | perf = ["ipython"] 113 | testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy", "pytest-perf (>=0.9.2)"] 114 | 115 | [[package]] 116 | name = "iniconfig" 117 | version = "1.1.1" 118 | description = "iniconfig: brain-dead simple config-ini parsing" 119 | category = "dev" 120 | optional = false 121 | python-versions = "*" 122 | 123 | [[package]] 124 | name = "packaging" 125 | version = "21.3" 126 | description = "Core utilities for Python packages" 127 | category = "dev" 128 | optional = false 129 | python-versions = ">=3.6" 130 | 131 | [package.dependencies] 132 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 133 | 134 | [[package]] 135 | name = "pathspec" 136 | version = "0.9.0" 137 | description = "Utility library for gitignore style pattern matching of file paths." 138 | category = "dev" 139 | optional = false 140 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 141 | 142 | [[package]] 143 | name = "pluggy" 144 | version = "1.0.0" 145 | description = "plugin and hook calling mechanisms for python" 146 | category = "dev" 147 | optional = false 148 | python-versions = ">=3.6" 149 | 150 | [package.dependencies] 151 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 152 | 153 | [package.extras] 154 | dev = ["pre-commit", "tox"] 155 | testing = ["pytest", "pytest-benchmark"] 156 | 157 | [[package]] 158 | name = "py" 159 | version = "1.11.0" 160 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 161 | category = "dev" 162 | optional = false 163 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 164 | 165 | [[package]] 166 | name = "pyparsing" 167 | version = "3.0.7" 168 | description = "Python parsing module" 169 | category = "dev" 170 | optional = false 171 | python-versions = ">=3.6" 172 | 173 | [package.extras] 174 | diagrams = ["jinja2", "railroad-diagrams"] 175 | 176 | [[package]] 177 | name = "pytest" 178 | version = "6.2.5" 179 | description = "pytest: simple powerful testing with Python" 180 | category = "dev" 181 | optional = false 182 | python-versions = ">=3.6" 183 | 184 | [package.dependencies] 185 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 186 | attrs = ">=19.2.0" 187 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 188 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 189 | iniconfig = "*" 190 | packaging = "*" 191 | pluggy = ">=0.12,<2.0" 192 | py = ">=1.8.2" 193 | toml = "*" 194 | 195 | [package.extras] 196 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 197 | 198 | [[package]] 199 | name = "pytest-cov" 200 | version = "3.0.0" 201 | description = "Pytest plugin for measuring coverage." 202 | category = "dev" 203 | optional = false 204 | python-versions = ">=3.6" 205 | 206 | [package.dependencies] 207 | coverage = {version = ">=5.2.1", extras = ["toml"]} 208 | pytest = ">=4.6" 209 | 210 | [package.extras] 211 | testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] 212 | 213 | [[package]] 214 | name = "regex" 215 | version = "2023.8.8" 216 | description = "Alternative regular expression module, to replace re." 217 | category = "dev" 218 | optional = false 219 | python-versions = ">=3.6" 220 | 221 | [[package]] 222 | name = "six" 223 | version = "1.17.0" 224 | description = "Python 2 and 3 compatibility utilities" 225 | category = "dev" 226 | optional = false 227 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 228 | 229 | [[package]] 230 | name = "snapshottest" 231 | version = "0.6.0" 232 | description = "Snapshot testing for pytest, unittest, Django, and Nose" 233 | category = "dev" 234 | optional = false 235 | python-versions = "*" 236 | 237 | [package.dependencies] 238 | fastdiff = ">=0.1.4,<1" 239 | six = ">=1.10.0" 240 | termcolor = "*" 241 | 242 | [package.extras] 243 | nose = ["nose"] 244 | pytest = ["pytest"] 245 | test = ["django (>=1.10.6)", "nose", "pytest (>=4.6)", "pytest-cov", "six"] 246 | 247 | [[package]] 248 | name = "termcolor" 249 | version = "1.1.0" 250 | description = "ANSII Color formatting for output in terminal." 251 | category = "dev" 252 | optional = false 253 | python-versions = "*" 254 | 255 | [[package]] 256 | name = "toml" 257 | version = "0.10.2" 258 | description = "Python Library for Tom's Obvious, Minimal Language" 259 | category = "dev" 260 | optional = false 261 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 262 | 263 | [[package]] 264 | name = "tomli" 265 | version = "1.2.3" 266 | description = "A lil' TOML parser" 267 | category = "dev" 268 | optional = false 269 | python-versions = ">=3.6" 270 | 271 | [[package]] 272 | name = "typed-ast" 273 | version = "1.5.5" 274 | description = "a fork of Python 2 and 3 ast modules with type comment support" 275 | category = "dev" 276 | optional = false 277 | python-versions = ">=3.6" 278 | 279 | [[package]] 280 | name = "typing-extensions" 281 | version = "4.1.1" 282 | description = "Backported and Experimental Type Hints for Python 3.6+" 283 | category = "dev" 284 | optional = false 285 | python-versions = ">=3.6" 286 | 287 | [[package]] 288 | name = "wasmer" 289 | version = "1.1.0" 290 | description = "Python extension to run WebAssembly binaries" 291 | category = "dev" 292 | optional = false 293 | python-versions = "*" 294 | 295 | [[package]] 296 | name = "wasmer-compiler-cranelift" 297 | version = "1.1.0" 298 | description = "The Cranelift compiler for the `wasmer` package (to compile WebAssembly module)" 299 | category = "dev" 300 | optional = false 301 | python-versions = "*" 302 | 303 | [[package]] 304 | name = "zipp" 305 | version = "3.6.0" 306 | description = "Backport of pathlib-compatible object wrapper for zip files" 307 | category = "dev" 308 | optional = false 309 | python-versions = ">=3.6" 310 | 311 | [package.extras] 312 | docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] 313 | testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] 314 | 315 | [metadata] 316 | lock-version = "1.1" 317 | python-versions = "^3.6" 318 | content-hash = "028794d1d61a022a4b9594e9a2c696e42c411f0d00a13478a36494f0dde61c73" 319 | 320 | [metadata.files] 321 | appdirs = [ 322 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 323 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 324 | ] 325 | atomicwrites = [ 326 | {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, 327 | ] 328 | attrs = [ 329 | {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, 330 | {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, 331 | ] 332 | black = [ 333 | {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, 334 | {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, 335 | ] 336 | click = [ 337 | {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, 338 | {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, 339 | ] 340 | colorama = [ 341 | {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, 342 | {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, 343 | ] 344 | coverage = [ 345 | {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, 346 | {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, 347 | {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, 348 | {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, 349 | {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, 350 | {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, 351 | {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, 352 | {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, 353 | {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, 354 | {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, 355 | {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, 356 | {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, 357 | {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, 358 | {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, 359 | {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, 360 | {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, 361 | {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, 362 | {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, 363 | {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, 364 | {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, 365 | {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, 366 | {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, 367 | {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, 368 | {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, 369 | {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, 370 | {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, 371 | {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, 372 | {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, 373 | {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, 374 | {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, 375 | {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, 376 | {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, 377 | {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, 378 | {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, 379 | {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, 380 | {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, 381 | {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, 382 | {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, 383 | {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, 384 | {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, 385 | {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, 386 | {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, 387 | {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, 388 | {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, 389 | {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, 390 | {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, 391 | {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, 392 | ] 393 | fastdiff = [ 394 | {file = "fastdiff-0.3.0-py2.py3-none-any.whl", hash = "sha256:ca5f61f6ddf5a1564ddfd98132ad28e7abe4a88a638a8b014a2214f71e5918ec"}, 395 | {file = "fastdiff-0.3.0.tar.gz", hash = "sha256:4dfa09c47832a8c040acda3f1f55fc0ab4d666f0e14e6951e6da78d59acd945a"}, 396 | ] 397 | importlib-metadata = [ 398 | {file = "importlib_metadata-4.8.3-py3-none-any.whl", hash = "sha256:65a9576a5b2d58ca44d133c42a241905cc45e34d2c06fd5ba2bafa221e5d7b5e"}, 399 | {file = "importlib_metadata-4.8.3.tar.gz", hash = "sha256:766abffff765960fcc18003801f7044eb6755ffae4521c8e8ce8e83b9c9b0668"}, 400 | ] 401 | iniconfig = [ 402 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 403 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 404 | ] 405 | packaging = [ 406 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 407 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 408 | ] 409 | pathspec = [ 410 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 411 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 412 | ] 413 | pluggy = [ 414 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 415 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 416 | ] 417 | py = [ 418 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 419 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 420 | ] 421 | pyparsing = [ 422 | {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, 423 | {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, 424 | ] 425 | pytest = [ 426 | {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, 427 | {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, 428 | ] 429 | pytest-cov = [ 430 | {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, 431 | {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, 432 | ] 433 | regex = [ 434 | {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, 435 | {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, 436 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, 437 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, 438 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, 439 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, 440 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, 441 | {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, 442 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, 443 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, 444 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, 445 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, 446 | {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, 447 | {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, 448 | {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, 449 | {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, 450 | {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, 451 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, 452 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, 453 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, 454 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, 455 | {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, 456 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, 457 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, 458 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, 459 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, 460 | {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, 461 | {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, 462 | {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, 463 | {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, 464 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, 465 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, 466 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, 467 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, 468 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, 469 | {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, 470 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, 471 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, 472 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, 473 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, 474 | {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, 475 | {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, 476 | {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, 477 | {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, 478 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, 479 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, 480 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, 481 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, 482 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, 483 | {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, 484 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, 485 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, 486 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, 487 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, 488 | {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, 489 | {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, 490 | {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, 491 | {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, 492 | {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, 493 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, 494 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, 495 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, 496 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, 497 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, 498 | {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, 499 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, 500 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, 501 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, 502 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, 503 | {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, 504 | {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, 505 | {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, 506 | {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, 507 | {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, 508 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, 509 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, 510 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, 511 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, 512 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, 513 | {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, 514 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, 515 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, 516 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, 517 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, 518 | {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, 519 | {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, 520 | {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, 521 | {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, 522 | ] 523 | six = [ 524 | {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, 525 | {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, 526 | ] 527 | snapshottest = [ 528 | {file = "snapshottest-0.6.0-py2.py3-none-any.whl", hash = "sha256:9b177cffe0870c589df8ddbee0a770149c5474b251955bdbde58b7f32a4ec429"}, 529 | {file = "snapshottest-0.6.0.tar.gz", hash = "sha256:bbcaf81d92d8e330042e5c928e13d9f035e99e91b314fe55fda949c2f17b653c"}, 530 | ] 531 | termcolor = [ 532 | {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, 533 | ] 534 | toml = [ 535 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 536 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 537 | ] 538 | tomli = [ 539 | {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, 540 | {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, 541 | ] 542 | typed-ast = [ 543 | {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, 544 | {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, 545 | {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, 546 | {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, 547 | {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, 548 | {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, 549 | {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, 550 | {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, 551 | {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, 552 | {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, 553 | {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, 554 | {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, 555 | {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, 556 | {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, 557 | {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, 558 | {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, 559 | {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, 560 | {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, 561 | {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, 562 | {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, 563 | {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, 564 | {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, 565 | {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, 566 | {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, 567 | {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, 568 | {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, 569 | {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, 570 | {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, 571 | {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, 572 | {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, 573 | {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, 574 | {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, 575 | {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, 576 | {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, 577 | {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, 578 | {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, 579 | {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, 580 | {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, 581 | {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, 582 | {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, 583 | {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, 584 | ] 585 | typing-extensions = [ 586 | {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, 587 | {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, 588 | ] 589 | wasmer = [ 590 | {file = "wasmer-1.1.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:c2af4b907ae2dabcac41e316e811d5937c93adf1f8b05c5d49427f8ce0f37630"}, 591 | {file = "wasmer-1.1.0-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:ab1ae980021e5ec0bf0c6cdd3b979b1d15a5f3eb2b8a32da8dcb1156e4a1e484"}, 592 | {file = "wasmer-1.1.0-cp310-none-win_amd64.whl", hash = "sha256:d0d93aec6215893d33e803ef0a8d37bf948c585dd80ba0e23a83fafee820bc03"}, 593 | {file = "wasmer-1.1.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1e63d16bd6e2e2272d8721647831de5c537e0bb08002ee6d7abf167ec02d5178"}, 594 | {file = "wasmer-1.1.0-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:85e6a5bf44853e8e6a12e947ee3412da9e84f7ce49fc165ba5dbd293e9c5c405"}, 595 | {file = "wasmer-1.1.0-cp37-none-win_amd64.whl", hash = "sha256:a182a6eca9b46d895b4985fc822fab8da3d2f84fab74ca27e55a7430a7fcf336"}, 596 | {file = "wasmer-1.1.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:214d9a3cfb577ea9449eb2b5f13adceae34c55365e4c3d930066beb86a7f67bc"}, 597 | {file = "wasmer-1.1.0-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b9e5605552bd7d2bc6337519b176defe83bc69b98abf3caaaefa4f7ec231d18a"}, 598 | {file = "wasmer-1.1.0-cp38-none-win_amd64.whl", hash = "sha256:20b5190112e2e94a8947967f2bc683c9685855d0f34130d8434c87a55216a3bd"}, 599 | {file = "wasmer-1.1.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:ee442f0970f40ec5e32011c92fd753fb2061da0faa13de13fafc730c31be34e3"}, 600 | {file = "wasmer-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aa112198b743cff2e391230436813fb4b244a24443e37866522b7197e3a034da"}, 601 | {file = "wasmer-1.1.0-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:c0b37117f6d3ff51ee96431c7d224d99799b08d174e30fcd0fcd7e2e3cb8140c"}, 602 | {file = "wasmer-1.1.0-cp39-none-win_amd64.whl", hash = "sha256:a0a4730ec4907a4cb0d9d4a77ea2608c2c814f22a22b73fc80be0f110e014836"}, 603 | {file = "wasmer-1.1.0-py3-none-any.whl", hash = "sha256:2caf8c67feae9cd4246421551036917811c446da4f27ad4c989521ef42751931"}, 604 | ] 605 | wasmer-compiler-cranelift = [ 606 | {file = "wasmer_compiler_cranelift-1.1.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:9869910179f39696a020edc5689f7759257ac1cce569a7a0fcf340c59788baad"}, 607 | {file = "wasmer_compiler_cranelift-1.1.0-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:405546ee864ac158a4107f374dfbb1c8d6cfb189829bdcd13050143a4bd98f28"}, 608 | {file = "wasmer_compiler_cranelift-1.1.0-cp310-none-win_amd64.whl", hash = "sha256:bdf75af9ef082e6aeb752550f694273340ece970b65099e0746db0f972760d11"}, 609 | {file = "wasmer_compiler_cranelift-1.1.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:7d9c782b7721789b16e303b7e70c59df370896dd62b77e2779e3a44b4e1aa20c"}, 610 | {file = "wasmer_compiler_cranelift-1.1.0-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:ff7dd5bd69030b63521c24583bf0f5457cd2580237340b91ce35370f72a4a1cc"}, 611 | {file = "wasmer_compiler_cranelift-1.1.0-cp37-none-win_amd64.whl", hash = "sha256:447285402e366a34667a674db70458c491acd6940b797c175c0b0027f48e64bb"}, 612 | {file = "wasmer_compiler_cranelift-1.1.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:55a524985179f6b7b88ac973e8fac5a2574d3b125a966fba75fedd5a2525e484"}, 613 | {file = "wasmer_compiler_cranelift-1.1.0-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:bd03db5a916ead51b442c66acad38847dfe127cf90b2019b1680f1920c4f8d06"}, 614 | {file = "wasmer_compiler_cranelift-1.1.0-cp38-none-win_amd64.whl", hash = "sha256:157d87cbd1d04adbad55b50cb4bedc28e444caf74797fd96df17390667e58699"}, 615 | {file = "wasmer_compiler_cranelift-1.1.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:ff25fc99ebafa04a6c271d08a90d17b927930e3019a2b333c7cfb48ba32c6f71"}, 616 | {file = "wasmer_compiler_cranelift-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9697ae082317a56776df8ff7df8c922eac38488ef38d3478fe5f0ca144c185ab"}, 617 | {file = "wasmer_compiler_cranelift-1.1.0-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:2a4349b1ddd727bd46bc5ede741839dcfc5153c52f064a83998c4150d5d4a85c"}, 618 | {file = "wasmer_compiler_cranelift-1.1.0-cp39-none-win_amd64.whl", hash = "sha256:32fe38614fccc933da77ee4372904a5fa9c12b859209a2e4048a8284c4c371f2"}, 619 | {file = "wasmer_compiler_cranelift-1.1.0-py3-none-any.whl", hash = "sha256:200fea80609cfb088457327acf66d5aa61f4c4f66b5a71133ada960b534c7355"}, 620 | ] 621 | zipp = [ 622 | {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, 623 | {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, 624 | ] 625 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "resubname" 3 | version = "0.3.0" 4 | description = "Rename subtitle filenames to match videos." 5 | authors = ["Wu Haotian "] 6 | license = "BSD-3-Clause" 7 | readme = "README.md" 8 | repository = "https://github.com/whtsky/resubname" 9 | 10 | [tool.poetry.dependencies] 11 | python = "^3.6" 12 | 13 | [tool.poetry.dev-dependencies] 14 | black = "^19.3b0" 15 | pytest = "^6.2.5" 16 | pytest-cov = "^3.0.0" 17 | snapshottest = "^0.6.0" 18 | 19 | [build-system] 20 | requires = ["poetry>=0.12"] 21 | build-backend = "poetry.masonry.api" 22 | 23 | [tool.poetry.scripts] 24 | resubname = "resubname:cli" 25 | 26 | 27 | 28 | [tool.black] 29 | exclude = ''' 30 | 31 | ( 32 | /( 33 | \.eggs # exclude a few common directories in the 34 | | \.git # root of the project 35 | | \.hg 36 | | \.mypy_cache 37 | | \.tox 38 | | \.venv 39 | | _build 40 | | buck-out 41 | | build 42 | | dist 43 | | snapshots 44 | )/ 45 | ) 46 | ''' -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@whtsky"] 3 | } 4 | -------------------------------------------------------------------------------- /resubname.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | from pathlib import Path 5 | from typing import List 6 | 7 | import pkg_resources 8 | 9 | try: 10 | __version__ = pkg_resources.get_distribution("resubname").version 11 | except pkg_resources.DistributionNotFound: 12 | __version__ = "dev" 13 | 14 | VIDEO_SUFFIXES = [ 15 | ".webm", 16 | ".mkv", 17 | ".flv", 18 | ".vob", 19 | ".ogv", 20 | ".ogg", 21 | ".drc", 22 | ".gif", 23 | ".gifv", 24 | ".mng", 25 | ".avi", 26 | ".mov", 27 | ".qt", 28 | ".wmv", 29 | ".yuv", 30 | ".rm", 31 | ".rmvb", 32 | ".asf", 33 | ".amv", 34 | ".mp4", 35 | ".m4p", 36 | ".m4v", 37 | ".mpg", 38 | ".mp2", 39 | ".mpeg", 40 | ".mpe", 41 | ".mpv", 42 | ".mpg", 43 | ".m2v", 44 | ".svi", 45 | ".3gp", 46 | ".3g2", 47 | ".mxf", 48 | ".roq", 49 | ".nsv", 50 | ".flv", 51 | ".f4v", 52 | ".f4p", 53 | ".f4a", 54 | ".f4b", 55 | ] 56 | SUBTITLE_SUFFIXES = [".ass", ".ssa", ".srt"] 57 | 58 | 59 | def preprocess_paths(paths: List[str]) -> List[Path]: 60 | pwd = Path(".") 61 | rv = [] 62 | for path in paths: 63 | if "*" in path: 64 | rv += list(pwd.glob(path)) 65 | else: 66 | path = Path(path) 67 | if path.is_dir(): 68 | rv += list(path.iterdir()) 69 | else: 70 | rv.append(path) 71 | return rv 72 | 73 | 74 | def should_exclude(file: Path, exclude_keywords: List[str]): 75 | name = file.name.lower() 76 | for keyword in exclude_keywords: 77 | if keyword in name: 78 | return True 79 | return False 80 | 81 | 82 | def main(files: List[Path], exclude_keywords: List[str], dryrun: bool = True): 83 | exclude_keywords = [s.lower() for s in exclude_keywords] 84 | videos: List[Path] = [] 85 | subtitles: List[Path] = [] 86 | for file in files: 87 | if should_exclude(file, exclude_keywords): 88 | continue 89 | if file.is_dir(): 90 | continue 91 | suffix = file.suffix.lower() 92 | if suffix in VIDEO_SUFFIXES: 93 | videos.append(file) 94 | elif suffix in SUBTITLE_SUFFIXES: 95 | subtitles.append(file) 96 | videos.sort() 97 | subtitles.sort() 98 | if len(videos) != len(subtitles): 99 | raise Exception( 100 | "Videos({video_len}) and subtitles({subtitle_len}) number dismatch.\n\nVideos:\n{videos}\n\nSubtitles:\n{subtitles}".format( 101 | video_len=len(videos), 102 | subtitle_len=len(subtitles), 103 | videos="\n".join([f"\t{f.name}" for f in videos]), 104 | subtitles="\n".join([f"\t{f.name}" for f in subtitles]), 105 | ) 106 | ) 107 | for index, subtitle in enumerate(subtitles): 108 | new_filename = subtitle.with_name(videos[index].stem + subtitle.suffix) 109 | if str(subtitle) != str(new_filename): 110 | print(f"{str(subtitle)} -> {new_filename}") 111 | if not dryrun: 112 | subtitle.rename(new_filename) 113 | else: 114 | print(f"{str(subtitle)} Unchanged.") 115 | 116 | 117 | def cli(args=None): 118 | import argparse 119 | 120 | parser = argparse.ArgumentParser( 121 | description="Rename subtitles based on video file names" 122 | ) 123 | 124 | parser.add_argument( 125 | "-v", 126 | "--version", 127 | action="version", 128 | version="%(prog)s {version}".format(version=__version__), 129 | ) 130 | 131 | parser.add_argument("--dryrun", action="store_true", help="Don't rename files") 132 | parser.add_argument( 133 | "-e", 134 | "--exclude", 135 | type=str, 136 | action="append", 137 | default=[], 138 | help="exclude files contain certain keywords", 139 | ) 140 | 141 | parser.add_argument( 142 | "files", type=str, nargs=argparse.ONE_OR_MORE, help="video & subtitle files" 143 | ) 144 | 145 | args = parser.parse_args(args) 146 | 147 | main(preprocess_paths(args.files), args.exclude, args.dryrun) 148 | 149 | 150 | if __name__ == "__main__": 151 | cli() 152 | -------------------------------------------------------------------------------- /snapshots/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whtsky/resubname/040a3d7605a007af837dfaca0e695e84bb4a52a4/snapshots/__init__.py -------------------------------------------------------------------------------- /snapshots/snap_test_resubname.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # snapshottest: v1 - https://goo.gl/zC4yUc 3 | from __future__ import unicode_literals 4 | 5 | from snapshottest import Snapshot 6 | 7 | 8 | snapshots = Snapshot() 9 | 10 | snapshots['test_exclude 1'] = [ 11 | '[ANK-Raws] それでも町は廻っている (Ep_05 Creditless ED) (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv', 12 | '[ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).ass', 13 | '[ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv', 14 | '[ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).ass', 15 | '[ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).mkv' 16 | ] 17 | 18 | snapshots['test_dryrun 1'] = '''/03.ass -> /[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].ass 19 | /05.5.ass -> /[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].ass 20 | /05.ass -> /[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].ass 21 | ''' 22 | 23 | snapshots['test_exclude 2'] = '''/[ANE] Soredemo Machi wa Mawatte Iru - EP01 [BD 1920x1080 H.264 FLAC].CASO-SC.ass -> /[ANK-Raws] それでも町は廻っている 01 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).ass 24 | /[ANE] Soredemo Machi wa Mawatte Iru - EP02 [BD 1920x1080 H.264 FLAC].CASO-SC.ass -> /[ANK-Raws] それでも町は廻っている 02 (BDrip 1920x1080 HEVC-YUV420P10 FLAC).ass 25 | ''' 26 | 27 | snapshots['test_rename 1'] = [ 28 | '03.ass', 29 | '05.5.ass', 30 | '05.ass', 31 | '[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv', 32 | '[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv', 33 | '[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv' 34 | ] 35 | 36 | snapshots['test_rename 2'] = [ 37 | '[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].ass', 38 | '[VCB-Studio] GIRLS und PANZER [03][Ma10p_1080p][x265_flac].mkv', 39 | '[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].ass', 40 | '[VCB-Studio] GIRLS und PANZER [05.5][Ma10p_1080p][x265_flac].mkv', 41 | '[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].ass', 42 | '[VCB-Studio] GIRLS und PANZER [05][Ma10p_1080p][x265_flac].mkv' 43 | ] 44 | -------------------------------------------------------------------------------- /test_resubname.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | import pytest 3 | import shutil 4 | from uuid import uuid4 5 | 6 | 7 | from resubname import cli 8 | 9 | FIXTURES_PATH = Path(__file__).parent / "fixtures" 10 | 11 | 12 | def sorted_glob(p: Path, pattern="*"): 13 | """ 14 | return sorted filenames for matched files. 15 | """ 16 | names = [x.name for x in p.glob(pattern)] 17 | names.sort() 18 | return names 19 | 20 | 21 | def copy_fixtures(src: Path, tmp_path: Path) -> Path: 22 | fixture_path = tmp_path / uuid4().hex 23 | shutil.copytree(src, fixture_path) 24 | return fixture_path 25 | 26 | 27 | def test_rename(capsys, tmp_path: Path, snapshot): 28 | fixtures = copy_fixtures(FIXTURES_PATH / "basic", tmp_path) 29 | files_before = sorted_glob(fixtures) 30 | snapshot.assert_match(files_before) 31 | cli([str(fixtures)]) 32 | files_after = sorted_glob(fixtures) 33 | assert files_after != files_before 34 | snapshot.assert_match(files_after) 35 | 36 | 37 | def test_dryrun(capsys, tmp_path: Path, snapshot): 38 | fixtures = copy_fixtures(FIXTURES_PATH / "basic", tmp_path) 39 | files_before = sorted_glob(fixtures) 40 | cli([str(fixtures), "--dryrun"]) 41 | files_after = sorted_glob(fixtures) 42 | assert files_after == files_before 43 | 44 | out, err = capsys.readouterr() 45 | snapshot.assert_match(out.replace(str(fixtures.resolve()), "")) 46 | 47 | 48 | def test_raise_when_subtitle_and_videos_number_dismatch(): 49 | path = FIXTURES_PATH / "exclude" 50 | with pytest.raises(Exception): 51 | cli([str(path)]) 52 | 53 | 54 | def test_exclude(capsys, tmp_path: Path, snapshot): 55 | fixtures = copy_fixtures(FIXTURES_PATH / "exclude", tmp_path) 56 | files_before = sorted_glob(fixtures) 57 | cli([str(fixtures), "-e", "creditless"]) 58 | files_after = sorted_glob(fixtures) 59 | assert files_after != files_before 60 | snapshot.assert_match(files_after) 61 | 62 | out, err = capsys.readouterr() 63 | snapshot.assert_match(out.replace(str(fixtures.resolve()), "")) 64 | --------------------------------------------------------------------------------