initial commit
This commit is contained in:
parent
64f9b46ede
commit
f5447bfcaf
24
.dockerignore
Normal file
24
.dockerignore
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
*.egg-info
|
||||||
|
*.py[co]
|
||||||
|
*Dockerfile
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
.circleci
|
||||||
|
.coverage*
|
||||||
|
.env*
|
||||||
|
.git
|
||||||
|
.mypy_cache
|
||||||
|
.picopt_timestamp
|
||||||
|
.pytest_cache
|
||||||
|
.ropeproject
|
||||||
|
.ruff_cache
|
||||||
|
.venv*
|
||||||
|
MANIFEST
|
||||||
|
NEWS
|
||||||
|
TODO.md
|
||||||
|
__pycache__
|
||||||
|
docker-compose*
|
||||||
|
monkeytype.sqlite3
|
||||||
|
node_modules
|
||||||
|
test-results
|
||||||
|
version.sh
|
101
.eslintrc.cjs
Normal file
101
.eslintrc.cjs
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
es2022: true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
"eslint:recommended",
|
||||||
|
// LANGS
|
||||||
|
"plugin:json/recommended",
|
||||||
|
"plugin:mdx/recommended",
|
||||||
|
"plugin:yaml/recommended",
|
||||||
|
// CODE QUALITY
|
||||||
|
"plugin:sonarjs/recommended",
|
||||||
|
"plugin:unicorn/all",
|
||||||
|
// PRACTICES
|
||||||
|
"plugin:array-func/recommended",
|
||||||
|
"plugin:eslint-comments/recommended",
|
||||||
|
"plugin:no-use-extend-native/recommended",
|
||||||
|
"plugin:optimize-regex/all",
|
||||||
|
"plugin:promise/recommended",
|
||||||
|
"plugin:import/recommended",
|
||||||
|
"plugin:switch-case/recommended",
|
||||||
|
// PRETTIER
|
||||||
|
"plugin:prettier/recommended",
|
||||||
|
"prettier", // prettier-config
|
||||||
|
// SECURITY
|
||||||
|
"plugin:no-unsanitized/DOM",
|
||||||
|
"plugin:security/recommended-legacy",
|
||||||
|
],
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ["*.md"],
|
||||||
|
rules: {
|
||||||
|
"prettier/prettier": ["warn", { parser: "markdown" }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: "latest",
|
||||||
|
ecmaFeatures: {
|
||||||
|
impliedStrict: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
"array-func",
|
||||||
|
"eslint-comments",
|
||||||
|
"json",
|
||||||
|
"import",
|
||||||
|
"no-constructor-bind",
|
||||||
|
"no-secrets",
|
||||||
|
"no-unsanitized",
|
||||||
|
"no-use-extend-native",
|
||||||
|
"optimize-regex",
|
||||||
|
"prettier",
|
||||||
|
"promise",
|
||||||
|
"simple-import-sort",
|
||||||
|
"switch-case",
|
||||||
|
"security",
|
||||||
|
"sonarjs",
|
||||||
|
"unicorn",
|
||||||
|
"yaml",
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
"array-func/prefer-array-from": "off", // for modern browsers the spread operator, as preferred by unicorn, works fine.
|
||||||
|
"max-params": ["warn", 4],
|
||||||
|
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||||
|
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||||
|
"no-constructor-bind/no-constructor-bind": "error",
|
||||||
|
"no-constructor-bind/no-constructor-state": "error",
|
||||||
|
"no-secrets/no-secrets": "error",
|
||||||
|
"eslint-comments/no-unused-disable": 1,
|
||||||
|
"prettier/prettier": "warn",
|
||||||
|
"security/detect-object-injection": "off",
|
||||||
|
"simple-import-sort/exports": "warn",
|
||||||
|
"simple-import-sort/imports": "warn",
|
||||||
|
"space-before-function-paren": "off",
|
||||||
|
"switch-case/newline-between-switch-case": "off", // Malfunctioning
|
||||||
|
"unicorn/switch-case-braces": ["warn", "avoid"],
|
||||||
|
"unicorn/prefer-node-protocol": 0,
|
||||||
|
"unicorn/prevent-abbreviations": "off",
|
||||||
|
"unicorn/filename-case": [
|
||||||
|
"error",
|
||||||
|
{ case: "kebabCase", ignore: [".*.md"] },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
ignorePatterns: [
|
||||||
|
"*~",
|
||||||
|
"**/__pycache__",
|
||||||
|
".git",
|
||||||
|
"!.circleci",
|
||||||
|
".mypy_cache",
|
||||||
|
".pytest_cache",
|
||||||
|
".venv*",
|
||||||
|
"dist",
|
||||||
|
"package-lock.json",
|
||||||
|
"test-results",
|
||||||
|
"typings",
|
||||||
|
],
|
||||||
|
};
|
89
.gitignore
vendored
Normal file
89
.gitignore
vendored
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
*$py.class
|
||||||
|
*.cover
|
||||||
|
*.egg
|
||||||
|
*.egg-info/
|
||||||
|
*.log
|
||||||
|
*.manifest
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
*.py,cover
|
||||||
|
*.py[cod]
|
||||||
|
*.sage.py
|
||||||
|
*.so
|
||||||
|
*.spec
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
.Python
|
||||||
|
.cache
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.dmypy.json
|
||||||
|
.docker-token
|
||||||
|
.eggs/
|
||||||
|
.env
|
||||||
|
.env-*
|
||||||
|
.eslintcache
|
||||||
|
.hypothesis/
|
||||||
|
.installed.cfg
|
||||||
|
.ipynb_checkpoints
|
||||||
|
.mypy_cache/
|
||||||
|
.nox/
|
||||||
|
.npm
|
||||||
|
.pypi-token
|
||||||
|
.pypirc
|
||||||
|
.pyre/
|
||||||
|
.pytest_cache/
|
||||||
|
.python-version
|
||||||
|
.ropeproject
|
||||||
|
.ruff_cache/
|
||||||
|
.scrapy
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
.tox/
|
||||||
|
.venv*
|
||||||
|
.webassets-cache
|
||||||
|
ENV/
|
||||||
|
MANIFEST
|
||||||
|
TODO.md
|
||||||
|
__pycache__/
|
||||||
|
__pypackages__/
|
||||||
|
__snapshots__
|
||||||
|
build
|
||||||
|
build/
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
coverage.xml
|
||||||
|
develop-eggs/
|
||||||
|
dist
|
||||||
|
dist/
|
||||||
|
dmypy.json
|
||||||
|
docs/_build/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
env.bak/
|
||||||
|
env/
|
||||||
|
htmlcov/
|
||||||
|
instance/
|
||||||
|
ipython_config.py
|
||||||
|
jspm_packages/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
local_settings.py
|
||||||
|
monkeytype.sqlite3
|
||||||
|
node_modules
|
||||||
|
node_modules/
|
||||||
|
nosetests.xml
|
||||||
|
parts/
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
pip-log.txt
|
||||||
|
pip-wheel-metadata/
|
||||||
|
profile_default/
|
||||||
|
requirements.txt
|
||||||
|
sdist/
|
||||||
|
share/python-wheels/
|
||||||
|
target/
|
||||||
|
test-results
|
||||||
|
var/
|
||||||
|
venv.bak/
|
||||||
|
venv/
|
||||||
|
wheels/
|
10
.prettierignore
Normal file
10
.prettierignore
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.circleci
|
||||||
|
.git
|
||||||
|
.mypy_cache
|
||||||
|
.pytest_cache
|
||||||
|
.ruff_cache
|
||||||
|
.venv*
|
||||||
|
/node_modules
|
||||||
|
/test-results
|
||||||
|
__pycache__
|
||||||
|
dist
|
9
.remarkignore
Normal file
9
.remarkignore
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
.circleci
|
||||||
|
.git
|
||||||
|
.mypy_cache
|
||||||
|
.pytest_cache
|
||||||
|
.ruff_cache
|
||||||
|
.venv*
|
||||||
|
/node_modules
|
||||||
|
/test-results
|
||||||
|
__pycache__
|
1
.shellcheckrc
Normal file
1
.shellcheckrc
Normal file
@ -0,0 +1 @@
|
|||||||
|
external-sources=true
|
24
LICENSE
24
LICENSE
@ -1,3 +1,4 @@
|
|||||||
|
<<<<<<< HEAD
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
@ -672,3 +673,26 @@ may consider it more useful to permit linking proprietary applications with
|
|||||||
the library. If this is what you want to do, use the GNU Lesser General
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License. But first, please read
|
Public License instead of this License. But first, please read
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
|
=======
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 AJ Slater
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
>>>>>>> a5e3e42 (initial commit)
|
||||||
|
111
Makefile
Normal file
111
Makefile
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
.PHONY: install-deps
|
||||||
|
## Update pip and install poetry
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install --upgrade poetry
|
||||||
|
|
||||||
|
.PHONY: install
|
||||||
|
## Install for production
|
||||||
|
## @category Install
|
||||||
|
install-prod: install-deps
|
||||||
|
poetry install --no-root --only-root
|
||||||
|
npm install
|
||||||
|
|
||||||
|
.PHONY: install-dev
|
||||||
|
## Install dev requirements
|
||||||
|
## @category Install
|
||||||
|
install-dev: install-deps
|
||||||
|
poetry install --no-root --only-root --with dev
|
||||||
|
npm install
|
||||||
|
|
||||||
|
.PHONY: install-all
|
||||||
|
## Install with all extras
|
||||||
|
## @category Install
|
||||||
|
install-all: install-deps
|
||||||
|
poetry install --no-root --all-extras
|
||||||
|
npm install
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
## Clean pycaches
|
||||||
|
## @category Build
|
||||||
|
clean:
|
||||||
|
./bin/clean-pycache.sh
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
## Build package
|
||||||
|
## @category Build
|
||||||
|
build:
|
||||||
|
poetry build
|
||||||
|
|
||||||
|
.PHONY: publish
|
||||||
|
## Publish package to pypi
|
||||||
|
## @category Deploy
|
||||||
|
publish:
|
||||||
|
poetry publish
|
||||||
|
|
||||||
|
.PHONY: update
|
||||||
|
## Update dependencies
|
||||||
|
## @category Update
|
||||||
|
update:
|
||||||
|
./bin/update-deps.sh
|
||||||
|
|
||||||
|
.PHONY: update-builder
|
||||||
|
## Update builder requirements
|
||||||
|
## @category Update
|
||||||
|
update-builder:
|
||||||
|
./bin/update-builder-requirement.sh
|
||||||
|
|
||||||
|
## Show version. Use V variable to set version
|
||||||
|
## @category Update
|
||||||
|
V :=
|
||||||
|
.PHONY: version
|
||||||
|
## Show or set project version
|
||||||
|
## @category Update
|
||||||
|
version:
|
||||||
|
bin/version.sh $(V)
|
||||||
|
|
||||||
|
.PHONY: kill-eslint_d
|
||||||
|
## Kill eslint daemon
|
||||||
|
## @category Lint
|
||||||
|
kill-eslint_d:
|
||||||
|
bin/kill-eslint_d.sh
|
||||||
|
|
||||||
|
.PHONY: fix
|
||||||
|
## Fix front and back end lint errors
|
||||||
|
## @category Lint
|
||||||
|
fix: fix-backend
|
||||||
|
|
||||||
|
.PHONY: fix-backend
|
||||||
|
## Fix only backend lint errors
|
||||||
|
## @category Lint
|
||||||
|
fix-backend:
|
||||||
|
./bin/fix-lint-backend.sh
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
## Lint front and back end
|
||||||
|
## @category Lint
|
||||||
|
lint: lint-backend
|
||||||
|
|
||||||
|
.PHONY: lint-backend
|
||||||
|
## Lint the backend
|
||||||
|
## @category Lint
|
||||||
|
lint-backend:
|
||||||
|
./bin/lint-backend.sh
|
||||||
|
|
||||||
|
## Test
|
||||||
|
## @category Test
|
||||||
|
T :=
|
||||||
|
.PHONY: test
|
||||||
|
## Run Tests. Use T variable to run specific tests
|
||||||
|
## @category Test
|
||||||
|
test:
|
||||||
|
./bin/test.sh $(T)
|
||||||
|
|
||||||
|
.PHONY: news
|
||||||
|
## Show recent NEWS
|
||||||
|
## @category Deploy
|
||||||
|
news:
|
||||||
|
head -40 NEWS.md
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
|
||||||
|
include bin/makefile-help.mk
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# ajs boilerplate
|
||||||
|
|
||||||
|
Scripts for developing python apps with javascript frontends.
|
||||||
|
|
||||||
|
Run scripts with make. Run make without a target for documentation.
|
3
bin/clean-pycache.sh
Executable file
3
bin/clean-pycache.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# remove all pycache dirs
|
||||||
|
find . -name "__pycache__" -print0 | xargs -0 rm -rf
|
25
bin/fix-lint-backend.sh
Executable file
25
bin/fix-lint-backend.sh
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Fix common linting errors
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
################
|
||||||
|
# Ignore files #
|
||||||
|
################
|
||||||
|
bin/sortignore.sh
|
||||||
|
|
||||||
|
####################
|
||||||
|
###### Python ######
|
||||||
|
###################
|
||||||
|
poetry run ruff --fix .
|
||||||
|
poetry run ruff format .
|
||||||
|
# poetry run djlint templates --profile=django --reformat
|
||||||
|
|
||||||
|
############################################
|
||||||
|
##### Javascript, JSON, Markdown, YAML #####
|
||||||
|
############################################
|
||||||
|
npm run fix
|
||||||
|
|
||||||
|
###################
|
||||||
|
###### Shell ######
|
||||||
|
###################
|
||||||
|
shellharden --replace ./**/*.sh
|
4
bin/kill-eslint_d.sh
Executable file
4
bin/kill-eslint_d.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# eslint_d can get into a bad state if git switches branches underneath it
|
||||||
|
pkill eslint_d
|
||||||
|
rm .eslintcache
|
39
bin/lint-backend.sh
Executable file
39
bin/lint-backend.sh
Executable file
@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Lint checks
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
####################
|
||||||
|
###### Python ######
|
||||||
|
####################
|
||||||
|
poetry run ruff .
|
||||||
|
poetry run ruff format --check .
|
||||||
|
poetry run pyright
|
||||||
|
poetry run vulture .
|
||||||
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
|
# Radon is only of interest to development
|
||||||
|
poetry run radon mi --min B .
|
||||||
|
poetry run radon cc --min C .
|
||||||
|
fi
|
||||||
|
# poetry run djlint templates --profile=django --lint
|
||||||
|
|
||||||
|
############################################
|
||||||
|
##### Javascript, JSON, Markdown, YAML #####
|
||||||
|
############################################
|
||||||
|
npm run lint
|
||||||
|
npm run remark-check
|
||||||
|
|
||||||
|
################################
|
||||||
|
###### Docker, Shell, Etc ######
|
||||||
|
################################
|
||||||
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
|
# Hadolint & shfmt are difficult to install on linux
|
||||||
|
# shellcheck disable=2035
|
||||||
|
# hadolint *Dockerfile
|
||||||
|
shellharden ./**/*.sh
|
||||||
|
# subdirs aren't copied into docker builder
|
||||||
|
# .env files aren't copied into docker
|
||||||
|
shellcheck --external-sources ./**/*.sh
|
||||||
|
# circleci config validate .circleci/config.yml
|
||||||
|
fi
|
||||||
|
./bin/roman.sh -i .prettierignore .
|
||||||
|
poetry run codespell .
|
105
bin/makefile-help.mk
Normal file
105
bin/makefile-help.mk
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# Inspired from
|
||||||
|
# https://github.com/Mischback/django-calingen/blob/3f0e6db6/Makefile
|
||||||
|
# and https://gist.github.com/klmr/575726c7e05d8780505a
|
||||||
|
|
||||||
|
# fancy colors
|
||||||
|
cyan := "$$(tput setaf 6)"
|
||||||
|
green := "$$(tput setaf 2)"
|
||||||
|
red := "$$(tput setaf 1)"
|
||||||
|
yel := "$$(tput setaf 3)"
|
||||||
|
gray := "$$(tput setaf 8)"
|
||||||
|
grayb := "$$(printf "\033[1m"; tput setaf 8)"
|
||||||
|
end := "$$(tput sgr0)"
|
||||||
|
TARGET_STYLED_HELP_NAME = "$(cyan)TARGET$(end)"
|
||||||
|
ARGUMENTS_HELP_NAME = "$(green)ARGUMENT$(end)=$(red)VALUE$(end)"
|
||||||
|
|
||||||
|
# This mountrous sed is compatible with both GNU sed and BSD sed (for macOS).
|
||||||
|
# That's why "-E", "|", "+", "\s", "?", and "\t" aren't used. See the details
|
||||||
|
# about BSD sed vs. GNU sed: https://riptutorial.com/sed/topic/9436
|
||||||
|
|
||||||
|
target_regex := [a-zA-Z0-9%_\/%-][a-zA-Z0-9%_\/%-]*
|
||||||
|
variable_regex := [^:= ][^:= ]*
|
||||||
|
variable_assignment_regex := [ ]*:*[+:!\?]*= *
|
||||||
|
value_regex := .*
|
||||||
|
category_annotation_regex := @category *
|
||||||
|
category_regex := [^<][^<]*
|
||||||
|
|
||||||
|
# We first parse and markup with these ad-hoc tags, and then we turn the markup
|
||||||
|
# into a colorful output.
|
||||||
|
target_tag_start := <target-definition>
|
||||||
|
target_tag_end := </target-definition>
|
||||||
|
target_variable_tag_start := <target-variable>
|
||||||
|
target_variable_tag_end := </target-variable>
|
||||||
|
variable_tag_start := <variable>
|
||||||
|
variable_tag_end := </variable>
|
||||||
|
global_variable_tag_start := <global-variable>
|
||||||
|
global_variable_tag_end := </global-variable>
|
||||||
|
value_tag_start := <value>
|
||||||
|
value_tag_end := </value>
|
||||||
|
prerequisites_tag_start := <prerequisites>
|
||||||
|
prerequisites_tag_end := </prerequisites>
|
||||||
|
doc_tag_start := <doc>
|
||||||
|
doc_tag_indented_start := <doc-indent>
|
||||||
|
doc_tag_indented_end := </doc-indent>
|
||||||
|
doc_tag_end := </doc>
|
||||||
|
category_tag_start := <category-other>
|
||||||
|
category_tag_end := </category-other>
|
||||||
|
default_category_tag_start := <category-default>
|
||||||
|
default_category_tag_end := </category-default>
|
||||||
|
|
||||||
|
DEFAULT_CATEGORY = General
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
.PHONY: help
|
||||||
|
help:
|
||||||
|
@echo "Usage: make [$(TARGET_STYLED_HELP_NAME) [$(TARGET_STYLED_HELP_NAME) ...]] [$(ARGUMENTS_HELP_NAME) [$(ARGUMENTS_HELP_NAME) ...]]"
|
||||||
|
@cat ${MAKEFILE_LIST} \
|
||||||
|
| tr '\t' ' ' \
|
||||||
|
| sed -n -e "/^## / { \
|
||||||
|
h; \
|
||||||
|
s/.*/##/; \
|
||||||
|
:doc" \
|
||||||
|
-e "H; \
|
||||||
|
n; \
|
||||||
|
s|^## *\(.*\)|$(doc_tag_start)$(doc_tag_indented_start)\1$(doc_tag_indented_end)$(doc_tag_end)|; \
|
||||||
|
s|^## *\(.*\)|$(doc_tag_start)\1$(doc_tag_end)|; \
|
||||||
|
t doc" \
|
||||||
|
-e "s| *#[^#].*||; " \
|
||||||
|
-e "s|^\(define *\)\($(variable_regex)\)$(variable_assignment_regex)\($(value_regex)\)|$(global_variable_tag_start)\2$(global_variable_tag_end)$(value_tag_start)\3$(value_tag_end)|;" \
|
||||||
|
-e "s|^\($(variable_regex)\)$(variable_assignment_regex)\($(value_regex)\)|$(global_variable_tag_start)\1$(global_variable_tag_end)$(value_tag_start)\2$(value_tag_end)|;" \
|
||||||
|
-e "s|^\($(target_regex)\) *: *\(\($(variable_regex)\)$(variable_assignment_regex)\($(value_regex)\)\)|$(target_variable_tag_start)\1$(target_variable_tag_end)$(variable_tag_start)\3$(variable_tag_end)$(value_tag_start)\4$(value_tag_end)|;" \
|
||||||
|
-e "s|^\($(target_regex)\) *: *\($(target_regex)\( *$(target_regex)\)*\) *\(\| *\( *$(target_regex)\)*\)|$(target_tag_start)\1$(target_tag_end)$(prerequisites_tag_start)\2$(prerequisites_tag_end)|;" \
|
||||||
|
-e "s|^\($(target_regex)\) *: *\($(target_regex)\( *$(target_regex)\)*\)|$(target_tag_start)\1$(target_tag_end)$(prerequisites_tag_start)\2$(prerequisites_tag_end)|;" \
|
||||||
|
-e "s|^\($(target_regex)\) *: *\(\| *\( *$(target_regex)\)*\)|$(target_tag_start)\1$(target_tag_end)|;" \
|
||||||
|
-e "s|^\($(target_regex)\) *: *|$(target_tag_start)\1$(target_tag_end)|;" \
|
||||||
|
-e " \
|
||||||
|
G; \
|
||||||
|
s|## *\(.*\) *##|$(doc_tag_start)\1$(doc_tag_end)|; \
|
||||||
|
s|\\n||g;" \
|
||||||
|
-e "/$(category_annotation_regex)/!s|.*|$(default_category_tag_start)$(DEFAULT_CATEGORY)$(default_category_tag_end)&|" \
|
||||||
|
-e "s|^\(.*\)$(doc_tag_start)$(category_annotation_regex)\($(category_regex)\)$(doc_tag_end)|$(category_tag_start)\2$(category_tag_end)\1|" \
|
||||||
|
-e "p; \
|
||||||
|
}" \
|
||||||
|
| sort \
|
||||||
|
| sed -n \
|
||||||
|
-e "s|$(default_category_tag_start)|$(category_tag_start)|" \
|
||||||
|
-e "s|$(default_category_tag_end)|$(category_tag_end)|" \
|
||||||
|
-e "{G; s|\($(category_tag_start)$(category_regex)$(category_tag_end)\)\(.*\)\n\1|\2|; s|\n.*||; H; }" \
|
||||||
|
-e "s|$(category_tag_start)||" \
|
||||||
|
-e "s|$(category_tag_end)|:\n|" \
|
||||||
|
-e "s|$(target_variable_tag_start)|$(target_tag_start)|" \
|
||||||
|
-e "s|$(target_variable_tag_end)|$(target_tag_end)|" \
|
||||||
|
-e "s|$(target_tag_start)| $(cyan)|" \
|
||||||
|
-e "s|$(target_tag_end)|$(end) |" \
|
||||||
|
-e "s|$(prerequisites_tag_start).*$(prerequisites_tag_end)||" \
|
||||||
|
-e "s|$(variable_tag_start)|$(green)|g" \
|
||||||
|
-e "s|$(variable_tag_end)|$(end)|" \
|
||||||
|
-e "s|$(global_variable_tag_start)| $(green)|g" \
|
||||||
|
-e "s|$(global_variable_tag_end)|$(end)|" \
|
||||||
|
-e "s|$(value_tag_start)| (default: $(red)|" \
|
||||||
|
-e "s|$(value_tag_end)|$(end))|" \
|
||||||
|
-e "s|$(doc_tag_indented_start)|$(grayb)|g" \
|
||||||
|
-e "s|$(doc_tag_indented_end)|$(end)|g" \
|
||||||
|
-e "s|$(doc_tag_start)|\n |g" \
|
||||||
|
-e "s|$(doc_tag_end)||g" \
|
||||||
|
-e "p"
|
48
bin/roman.sh
Executable file
48
bin/roman.sh
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Find all shell scripts without a first line comment.
|
||||||
|
# Created due to working with @defunctzombie
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
# set options
|
||||||
|
if [ "$1" = "-i" ]; then
|
||||||
|
shift
|
||||||
|
ignorefile=$1
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check for paths
|
||||||
|
if [ "$1" = "" ]; then
|
||||||
|
echo "Usage: $0 [options] <path> [path...]"
|
||||||
|
echo "Options:"
|
||||||
|
echo -e "\t-i <ignorefile>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v ggrep &> /dev/null; then
|
||||||
|
GREP_CMD=$(command -v ggrep)
|
||||||
|
else
|
||||||
|
GREP_CMD=$(command -v grep)
|
||||||
|
fi
|
||||||
|
# get files
|
||||||
|
fns=$(find "$@" -type f -name "*.sh")
|
||||||
|
if [ "$ignorefile" ]; then
|
||||||
|
fns=$(echo "$fns" | "$GREP_CMD" -vf "$ignorefile")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# find nonconforming files
|
||||||
|
good=1
|
||||||
|
while read -ra fn; do
|
||||||
|
# sc doesn't understand that fn isn't an array
|
||||||
|
# shellcheck disable=2128
|
||||||
|
bad=$(sed -n '2 p' < "$fn" | "$GREP_CMD" -v '^# +*')
|
||||||
|
if [ "$bad" ]; then
|
||||||
|
# shellcheck disable=2128
|
||||||
|
echo "🔪 $fn"
|
||||||
|
good=0
|
||||||
|
fi
|
||||||
|
done < <(echo "$fns")
|
||||||
|
|
||||||
|
if [ "$good" = 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo 👍
|
7
bin/sortignore.sh
Executable file
7
bin/sortignore.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Sort all ignore files in place and remove duplicates
|
||||||
|
for f in .*ignore; do
|
||||||
|
if [ ! -L "$f" ]; then
|
||||||
|
sort --mmap --unique --output="$f" "$f"
|
||||||
|
fi
|
||||||
|
done
|
7
bin/test.sh
Executable file
7
bin/test.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Run all tests
|
||||||
|
set -euxo pipefail
|
||||||
|
mkdir -p test-results
|
||||||
|
LOGLEVEL=DEBUG poetry run pytest "$@"
|
||||||
|
# pytest-cov leaves .coverage.$HOST.$PID.$RAND files around while coverage itself doesn't
|
||||||
|
poetry run coverage erase || true
|
4
bin/update-builder-requirement.sh
Executable file
4
bin/update-builder-requirement.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Update the builder-requirements.txt with installed versions.
|
||||||
|
set -euo pipefail
|
||||||
|
pip3 freeze | grep poetry== | sed 's/==/>=/' > builder-requirements.txt
|
7
bin/update-deps.sh
Executable file
7
bin/update-deps.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Update python and npm dependencies
|
||||||
|
set -euo pipefail
|
||||||
|
poetry update
|
||||||
|
poetry show --outdated
|
||||||
|
npm update
|
||||||
|
npm outdated
|
11
bin/version.sh
Executable file
11
bin/version.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Get version or set version in Frontend & API.
|
||||||
|
set -euo pipefail
|
||||||
|
VERSION="${1:-}"
|
||||||
|
if [ "$VERSION" = "" ]; then
|
||||||
|
poetry version | awk '{print $2};'
|
||||||
|
else
|
||||||
|
poetry version "$VERSION"
|
||||||
|
cd frontend
|
||||||
|
npm version --allow-same-version "$VERSION"
|
||||||
|
fi
|
1
builder-requirements.txt
Normal file
1
builder-requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
poetry>=1.5.0
|
6
comicfn2dict.py
Executable file
6
comicfn2dict.py
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Test runner."""
|
||||||
|
|
||||||
|
from comicfn2dict.cli import main
|
||||||
|
|
||||||
|
main()
|
4
comicfn2dict.sh
Executable file
4
comicfn2dict.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Run comicbox file parser test
|
||||||
|
set -euo pipefail
|
||||||
|
poetry run ./comicfn2dict.py "$@"
|
3
comicfn2dict/__init__.py
Normal file
3
comicfn2dict/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"""Comic Filename to Dict parser and unparser."""
|
||||||
|
from .parse import comicfn2dict # noqa: F401
|
||||||
|
from .unparse import dict2comicfn # noqa: F401
|
22
comicfn2dict/cli.py
Executable file
22
comicfn2dict/cli.py
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Simple cli for comicfn2dict."""
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
from pathlib import Path
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
from comicfn2dict.parse import comicfn2dict
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Test parser."""
|
||||||
|
description = "Comic book archive read/write tool."
|
||||||
|
parser = ArgumentParser(description=description)
|
||||||
|
parser.add_argument("path", help="Path of comic filename to parse", type=Path)
|
||||||
|
args = parser.parse_args()
|
||||||
|
name = args.path.name
|
||||||
|
metadata = comicfn2dict(name)
|
||||||
|
pprint(metadata) # noqa:T203
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
3
comicfn2dict/comicfn2dict.py
Normal file
3
comicfn2dict/comicfn2dict.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"""API import source."""
|
||||||
|
from comicfn2dict.parse import comicfn2dict # noqa: F401
|
||||||
|
from comicfn2dict.unparse import dict2comicfn # noqa: F401
|
226
comicfn2dict/parse.py
Normal file
226
comicfn2dict/parse.py
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
"""Parse comic book archive names using the simple 'parse' parser."""
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
from comicfn2dict.regex import (
|
||||||
|
DASH_SPLIT_RE,
|
||||||
|
EXTRA_SPACES_RE,
|
||||||
|
ISSUE_ANYWHERE_RE,
|
||||||
|
ISSUE_BEGIN_RE,
|
||||||
|
ISSUE_COUNT_RE,
|
||||||
|
ISSUE_END_RE,
|
||||||
|
ISSUE_NUMBER_RE,
|
||||||
|
ISSUE_TOKEN_RE,
|
||||||
|
NON_SPACE_DIVIDER_RE,
|
||||||
|
ORIGINAL_FORMAT_RE,
|
||||||
|
ORIGINAL_FORMAT_SCAN_INFO_RE,
|
||||||
|
REMAINING_GROUP_RE,
|
||||||
|
SCAN_INFO_RE,
|
||||||
|
VOLUME_RE,
|
||||||
|
YEAR_BEGIN_RE,
|
||||||
|
YEAR_END_RE,
|
||||||
|
YEAR_TOKEN_RE,
|
||||||
|
)
|
||||||
|
|
||||||
|
_REMAINING_GROUP_KEYS = ("series", "title")
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_ext(name, suffix, metadata):
|
||||||
|
"""Pop the extension from the pathname."""
|
||||||
|
data = name.removesuffix(suffix)
|
||||||
|
ext = suffix.lstrip(".")
|
||||||
|
if ext:
|
||||||
|
metadata["ext"] = ext
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def _clean_dividers(data):
|
||||||
|
"""Replace non space dividers and clean extra spaces out of string."""
|
||||||
|
data = NON_SPACE_DIVIDER_RE.sub(" ", data)
|
||||||
|
return EXTRA_SPACES_RE.sub(" ", data)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_data_list(path, metadata):
|
||||||
|
"""Prepare data list from a path or string."""
|
||||||
|
if isinstance(path, str):
|
||||||
|
path = path.strip()
|
||||||
|
path = Path(path)
|
||||||
|
data = _parse_ext(path.name, path.suffix, metadata)
|
||||||
|
data = _clean_dividers(data)
|
||||||
|
return DASH_SPLIT_RE.split(data)
|
||||||
|
|
||||||
|
|
||||||
|
def _paren_strip(value: str):
|
||||||
|
"""Strip spaces and parens."""
|
||||||
|
return value.strip().strip("()").strip()
|
||||||
|
|
||||||
|
|
||||||
|
def _splicey_dicey(data_list, index, match, match_group: Union[int, str] = 0):
|
||||||
|
"""Replace a string token from a list with two strings and the value removed.
|
||||||
|
|
||||||
|
And return the value.
|
||||||
|
"""
|
||||||
|
value = match.group(match_group)
|
||||||
|
data = data_list.pop(index)
|
||||||
|
data_ends = []
|
||||||
|
if data_before := data[: match.start()].strip():
|
||||||
|
data_ends.append(data_before)
|
||||||
|
if data_after := data[match.end() :].strip():
|
||||||
|
data_ends.append(data_after)
|
||||||
|
data_list[index:index] = data_ends
|
||||||
|
return _paren_strip(value)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_original_format_and_scan_info(data_list, metadata):
|
||||||
|
"""Parse (ORIGINAL_FORMAT-SCAN_INFO)."""
|
||||||
|
original_format = None
|
||||||
|
scan_info = None
|
||||||
|
index = 0
|
||||||
|
match = None
|
||||||
|
for data in data_list:
|
||||||
|
match = ORIGINAL_FORMAT_SCAN_INFO_RE.search(data)
|
||||||
|
if match:
|
||||||
|
original_format = match.group("original_format")
|
||||||
|
try:
|
||||||
|
scan_info = match.group("scan_info")
|
||||||
|
except IndexError:
|
||||||
|
scan_info = None
|
||||||
|
break
|
||||||
|
index += 1
|
||||||
|
if original_format:
|
||||||
|
metadata["original_format"] = _paren_strip(original_format)
|
||||||
|
match_group = 1
|
||||||
|
if scan_info:
|
||||||
|
metadata["scan_info"] = _paren_strip(scan_info)
|
||||||
|
match_group = 0
|
||||||
|
_splicey_dicey(data_list, index, match, match_group=match_group)
|
||||||
|
else:
|
||||||
|
index = 0
|
||||||
|
return index
|
||||||
|
|
||||||
|
|
||||||
|
def _pop_value_from_token(
|
||||||
|
data_list: list,
|
||||||
|
metadata: dict,
|
||||||
|
regex: re.Pattern,
|
||||||
|
key: str,
|
||||||
|
index: int = 0,
|
||||||
|
):
|
||||||
|
"""Search token for value, splice and assign to metadata."""
|
||||||
|
data = data_list[index]
|
||||||
|
match = regex.search(data)
|
||||||
|
if match:
|
||||||
|
value = _splicey_dicey(data_list, index, match, key)
|
||||||
|
metadata[key] = value
|
||||||
|
return match
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_item(
|
||||||
|
data_list,
|
||||||
|
metadata,
|
||||||
|
regex,
|
||||||
|
key,
|
||||||
|
start_index: int = 0,
|
||||||
|
):
|
||||||
|
"""Parse a value from the data list into metadata and alter the data list."""
|
||||||
|
index = start_index
|
||||||
|
dl_len = end_index = len(data_list)
|
||||||
|
if index >= end_index:
|
||||||
|
index = 0
|
||||||
|
while index < end_index:
|
||||||
|
match = _pop_value_from_token(data_list, metadata, regex, key, index)
|
||||||
|
if match:
|
||||||
|
break
|
||||||
|
index += 1
|
||||||
|
if index > dl_len and start_index > 0:
|
||||||
|
index = 0
|
||||||
|
end_index = start_index
|
||||||
|
return index
|
||||||
|
|
||||||
|
|
||||||
|
def _pop_issue_from_text_fields(data_list, metadata, index):
|
||||||
|
"""Search issue from ends of text fields."""
|
||||||
|
if "issue" not in metadata:
|
||||||
|
_pop_value_from_token(data_list, metadata, ISSUE_END_RE, "issue", index=index)
|
||||||
|
if "issue" not in metadata:
|
||||||
|
_pop_value_from_token(data_list, metadata, ISSUE_BEGIN_RE, "issue", index=index)
|
||||||
|
return data_list.pop(index)
|
||||||
|
|
||||||
|
|
||||||
|
def _assign_remaining_groups(data_list, metadata):
|
||||||
|
"""Assign series and title."""
|
||||||
|
index = 0
|
||||||
|
for key in _REMAINING_GROUP_KEYS:
|
||||||
|
try:
|
||||||
|
data = data_list[index]
|
||||||
|
except (IndexError, TypeError):
|
||||||
|
break
|
||||||
|
match = REMAINING_GROUP_RE.search(data) if data else None
|
||||||
|
if match:
|
||||||
|
value = _pop_issue_from_text_fields(data_list, metadata, index)
|
||||||
|
value = _paren_strip(value)
|
||||||
|
if value:
|
||||||
|
metadata[key] = value
|
||||||
|
else:
|
||||||
|
index += 1
|
||||||
|
|
||||||
|
|
||||||
|
def _pickup_issue(remainders, metadata):
|
||||||
|
"""Get issue from remaining tokens or anywhere in a pinch."""
|
||||||
|
if "issue" in metadata:
|
||||||
|
return
|
||||||
|
_parse_item(remainders, metadata, ISSUE_TOKEN_RE, "issue")
|
||||||
|
if "issue" in metadata:
|
||||||
|
return
|
||||||
|
_parse_item(remainders, metadata, ISSUE_ANYWHERE_RE, "issue")
|
||||||
|
|
||||||
|
|
||||||
|
def comicfn2dict(path):
|
||||||
|
"""Parse the filename with a hierarchy of regexes."""
|
||||||
|
metadata = {}
|
||||||
|
data_list = _get_data_list(path, metadata)
|
||||||
|
|
||||||
|
# Parse paren tokens
|
||||||
|
_parse_item(data_list, metadata, ISSUE_COUNT_RE, "issue_count")
|
||||||
|
_parse_item(data_list, metadata, YEAR_TOKEN_RE, "year")
|
||||||
|
of_index = _parse_original_format_and_scan_info(data_list, metadata)
|
||||||
|
if "original_format" not in metadata:
|
||||||
|
of_index = _parse_item(
|
||||||
|
data_list, metadata, ORIGINAL_FORMAT_RE, "original_format"
|
||||||
|
)
|
||||||
|
if "scan_info" not in metadata:
|
||||||
|
# Start searching for scan_info after original format.
|
||||||
|
_parse_item(
|
||||||
|
data_list,
|
||||||
|
metadata,
|
||||||
|
SCAN_INFO_RE,
|
||||||
|
"scan_info",
|
||||||
|
start_index=of_index + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Parse regular tokens
|
||||||
|
_parse_item(data_list, metadata, VOLUME_RE, "volume")
|
||||||
|
_parse_item(data_list, metadata, ISSUE_NUMBER_RE, "issue")
|
||||||
|
|
||||||
|
# Pickup year if not gotten.
|
||||||
|
if "year" not in metadata:
|
||||||
|
_parse_item(data_list, metadata, YEAR_BEGIN_RE, "year")
|
||||||
|
if "year" not in metadata:
|
||||||
|
_parse_item(data_list, metadata, YEAR_END_RE, "year")
|
||||||
|
|
||||||
|
# Pickup issue if it's a standalone token
|
||||||
|
if "issue" not in metadata:
|
||||||
|
_parse_item(data_list, metadata, ISSUE_TOKEN_RE, "issue")
|
||||||
|
|
||||||
|
# Series and Title. Also looks for issue.
|
||||||
|
_assign_remaining_groups(data_list, metadata)
|
||||||
|
|
||||||
|
# Final try for issue number.
|
||||||
|
_pickup_issue(data_list, metadata)
|
||||||
|
|
||||||
|
# Add Remainders
|
||||||
|
if data_list:
|
||||||
|
metadata["remainders"] = tuple(data_list)
|
||||||
|
|
||||||
|
return metadata
|
74
comicfn2dict/regex.py
Normal file
74
comicfn2dict/regex.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
"""Parsing regexes."""
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def re_compile(exp, parenthify=False):
|
||||||
|
"""Compile regex with options."""
|
||||||
|
if parenthify:
|
||||||
|
exp = r"\(" + exp + r"\)"
|
||||||
|
return re.compile(exp, flags=re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
|
ORIGINAL_FORMAT_PATTERNS = (
|
||||||
|
r"Anthology",
|
||||||
|
r"(One|1)[-\s]Shot",
|
||||||
|
r"Annual",
|
||||||
|
r"Annotation[s]?",
|
||||||
|
r"Box[-\s]Set",
|
||||||
|
r"Digital",
|
||||||
|
r"Director[’']?s\sCut", # noqa: RUF001
|
||||||
|
r"Giant([-\s]Size(d)?)?",
|
||||||
|
r"Graphic\sNovel",
|
||||||
|
r"Hard[-\s]?Cover",
|
||||||
|
r"HC",
|
||||||
|
r"HD-Upscaled",
|
||||||
|
r"King[-\s]Size(d)?",
|
||||||
|
r"Magazine",
|
||||||
|
r"Manga?",
|
||||||
|
r"Omnibus",
|
||||||
|
r"PDF([-\s]Rip)?",
|
||||||
|
r"Preview",
|
||||||
|
r"Prologue",
|
||||||
|
r"Scanlation",
|
||||||
|
r"Script",
|
||||||
|
r"Sketch",
|
||||||
|
r"TPB",
|
||||||
|
r"Trade[-\s]Paper[-\s]?Back",
|
||||||
|
r"Web([-\s]?Comic)?",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# CLEAN
|
||||||
|
NON_SPACE_DIVIDER_RE = re_compile(r"[_\+]")
|
||||||
|
DASH_SPLIT_RE = re_compile(r"\s-\s")
|
||||||
|
EXTRA_SPACES_RE = re_compile(r"\s\s+")
|
||||||
|
|
||||||
|
# PAREN GROUPS
|
||||||
|
ISSUE_COUNT_RE = re_compile(r"of\s*(?P<issue_count>\d+)", parenthify=True)
|
||||||
|
_YEAR_RE_EXP = r"(?P<year>[12]\d{3})"
|
||||||
|
YEAR_TOKEN_RE = re_compile(_YEAR_RE_EXP, parenthify=True)
|
||||||
|
YEAR_BEGIN_RE = re_compile(r"^" + _YEAR_RE_EXP + r"\b")
|
||||||
|
YEAR_END_RE = re_compile(r"\b" + _YEAR_RE_EXP + r"$")
|
||||||
|
_OF_PATTERNS = r"|".join(ORIGINAL_FORMAT_PATTERNS)
|
||||||
|
_ORIGINAL_FORMAT_RE_EXP = r"(?P<original_format>" + _OF_PATTERNS + r")"
|
||||||
|
ORIGINAL_FORMAT_RE = re_compile(_ORIGINAL_FORMAT_RE_EXP, parenthify=True)
|
||||||
|
_SCAN_INFO_RE_EXP = r"(?P<scan_info>[^()]+?)"
|
||||||
|
SCAN_INFO_RE = re_compile(_SCAN_INFO_RE_EXP, parenthify=True)
|
||||||
|
_ORIGINAL_FORMAT_SCAN_INFO_RE_EXP = (
|
||||||
|
_ORIGINAL_FORMAT_RE_EXP + r"(?:-" + _SCAN_INFO_RE_EXP + r")?"
|
||||||
|
)
|
||||||
|
ORIGINAL_FORMAT_SCAN_INFO_RE = re_compile(
|
||||||
|
_ORIGINAL_FORMAT_SCAN_INFO_RE_EXP, parenthify=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# REGULAR TOKENS
|
||||||
|
VOLUME_RE = re_compile(r"((?:v(?:ol(?:ume)?)?\.?)\s*(?P<volume>\d+))")
|
||||||
|
_ISSUE_RE_EXP = r"(?P<issue>[\d½]+\.?\d*\w*)"
|
||||||
|
ISSUE_NUMBER_RE = re_compile(r"(#" + _ISSUE_RE_EXP + r")")
|
||||||
|
ISSUE_TOKEN_RE = re_compile(r"^(" + _ISSUE_RE_EXP + r")$")
|
||||||
|
ISSUE_END_RE = re_compile(r"\b(" + _ISSUE_RE_EXP + r")$")
|
||||||
|
ISSUE_BEGIN_RE = re_compile(r"^(" + _ISSUE_RE_EXP + r")\b")
|
||||||
|
ISSUE_ANYWHERE_RE = re_compile(r"\b(" + _ISSUE_RE_EXP + r")\b")
|
||||||
|
|
||||||
|
# LONG STRINGS
|
||||||
|
REMAINING_GROUP_RE = re_compile(r"^[\w].*[^\)]")
|
50
comicfn2dict/unparse.py
Normal file
50
comicfn2dict/unparse.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
"""Unparse comic filenames."""
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
|
||||||
|
def issue_formatter(issue):
|
||||||
|
"""Formatter to zero pad issues."""
|
||||||
|
i = 0
|
||||||
|
issue = issue.lstrip("0")
|
||||||
|
for c in issue:
|
||||||
|
if not c.isdigit():
|
||||||
|
break
|
||||||
|
i += 1
|
||||||
|
pad = 3 + len(issue) - i
|
||||||
|
return "#{:0>" + str(pad) + "}"
|
||||||
|
|
||||||
|
|
||||||
|
_PAREN_FMT = "({})"
|
||||||
|
_FILENAME_FORMAT_TAGS = (
|
||||||
|
("series", "{}"),
|
||||||
|
("volume", "v{}"),
|
||||||
|
("issue", issue_formatter),
|
||||||
|
("issue_count", "(of {:03})"),
|
||||||
|
("year", _PAREN_FMT),
|
||||||
|
("title", "{}"),
|
||||||
|
("original_format", _PAREN_FMT),
|
||||||
|
("scan_info", _PAREN_FMT),
|
||||||
|
)
|
||||||
|
_EMPTY_VALUES = (None, "")
|
||||||
|
|
||||||
|
|
||||||
|
def dict2comicfn(md, ext=True):
|
||||||
|
"""Get our preferred basename from a metadata dict."""
|
||||||
|
if not md:
|
||||||
|
return None
|
||||||
|
tokens = []
|
||||||
|
for tag, fmt in _FILENAME_FORMAT_TAGS:
|
||||||
|
val = md.get(tag)
|
||||||
|
if val in _EMPTY_VALUES:
|
||||||
|
continue
|
||||||
|
final_fmt = fmt(val) if isinstance(fmt, Callable) else fmt
|
||||||
|
token = final_fmt.format(val).strip()
|
||||||
|
if token:
|
||||||
|
tokens.append(token)
|
||||||
|
fn = " ".join(tokens)
|
||||||
|
if remainders := md.get("remainders"):
|
||||||
|
remainder = " ".join(remainders)
|
||||||
|
fn += f" - {remainder}"
|
||||||
|
if ext:
|
||||||
|
fn += "." + md.get("ext", "cbz")
|
||||||
|
return fn
|
15915
package-lock.json
generated
Normal file
15915
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
77
package.json
Normal file
77
package.json
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "linting",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"fix": "eslint_d --cache --fix --ignore-pattern frontend --ext .cjs,.mjs,.js,.json,.yaml,.md . && prettier --write .",
|
||||||
|
"lint": "eslint_d --cache --ignore-pattern frontend --ext .cjs,.mjs,.js,.json,.yaml,.md . && prettier --check .",
|
||||||
|
"remark-check": "remark .",
|
||||||
|
"remark-fix": "remark . --output"
|
||||||
|
},
|
||||||
|
"prettier": {
|
||||||
|
"plugins": [
|
||||||
|
"@prettier/plugin-xml",
|
||||||
|
"prettier-plugin-nginx",
|
||||||
|
"prettier-plugin-packagejson",
|
||||||
|
"prettier-plugin-sh"
|
||||||
|
],
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": [
|
||||||
|
"*.md"
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"proseWrap": "always"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"remarkConfig": {
|
||||||
|
"plugins": [
|
||||||
|
"preset-lint-consistent",
|
||||||
|
"preset-lint-recommended",
|
||||||
|
"preset-lint-markdown-style-guide",
|
||||||
|
"preset-prettier"
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"ignorePath": ".gitignore"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@fsouza/prettierd": "^0.25.1",
|
||||||
|
"@prettier/plugin-xml": "^3.0.0",
|
||||||
|
"eslint": "^8.34.0",
|
||||||
|
"eslint-config-prettier": "^9.0.0",
|
||||||
|
"eslint-plugin-array-func": "^4.0.0",
|
||||||
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||||
|
"eslint-plugin-import": "^2.25.4",
|
||||||
|
"eslint-plugin-json": "^3.1.0",
|
||||||
|
"eslint-plugin-mdx": "^3.0.0",
|
||||||
|
"eslint-plugin-no-constructor-bind": "^2.0.4",
|
||||||
|
"eslint-plugin-no-secrets": "^0.8.9",
|
||||||
|
"eslint-plugin-no-unsanitized": "^4.0.0",
|
||||||
|
"eslint-plugin-no-use-extend-native": "^0.5.0",
|
||||||
|
"eslint-plugin-only-warn": "^1.0.2",
|
||||||
|
"eslint-plugin-optimize-regex": "^1.2.0",
|
||||||
|
"eslint-plugin-prettier": "^5.0.0-alpha.2",
|
||||||
|
"eslint-plugin-promise": "^6.0.0",
|
||||||
|
"eslint-plugin-scanjs-rules": "^0.2.1",
|
||||||
|
"eslint-plugin-security": "^2.1.0",
|
||||||
|
"eslint-plugin-simple-import-sort": "^10.0.0",
|
||||||
|
"eslint-plugin-sonarjs": "^0.23.0",
|
||||||
|
"eslint-plugin-switch-case": "^1.1.2",
|
||||||
|
"eslint-plugin-unicorn": "^50.0.1",
|
||||||
|
"eslint-plugin-yaml": "^0.5.0",
|
||||||
|
"eslint_d": "^13.0.0",
|
||||||
|
"prettier": "^3.0.0",
|
||||||
|
"prettier-plugin-nginx": "^1.0.3",
|
||||||
|
"prettier-plugin-packagejson": "^2.4.4",
|
||||||
|
"prettier-plugin-sh": "^0.13.0",
|
||||||
|
"remark-cli": "^12.0.0",
|
||||||
|
"remark-preset-lint-consistent": "^5.1.1",
|
||||||
|
"remark-preset-lint-markdown-style-guide": "^5.1.2",
|
||||||
|
"remark-preset-lint-recommended": "^6.1.2",
|
||||||
|
"remark-preset-prettier": "^2.0.1",
|
||||||
|
"toml": "^3.0.0"
|
||||||
|
}
|
||||||
|
}
|
880
poetry.lock
generated
Normal file
880
poetry.lock
generated
Normal file
@ -0,0 +1,880 @@
|
|||||||
|
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "click"
|
||||||
|
version = "8.1.7"
|
||||||
|
description = "Composable command line interface toolkit"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
|
||||||
|
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "codespell"
|
||||||
|
version = "2.2.6"
|
||||||
|
description = "Codespell"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"},
|
||||||
|
{file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"]
|
||||||
|
hard-encoding-detection = ["chardet"]
|
||||||
|
toml = ["tomli"]
|
||||||
|
types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colorama"
|
||||||
|
version = "0.4.6"
|
||||||
|
description = "Cross-platform colored terminal text."
|
||||||
|
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 = "7.3.4"
|
||||||
|
description = "Code coverage measurement for Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aff2bd3d585969cc4486bfc69655e862028b689404563e6b549e6a8244f226df"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4353923f38d752ecfbd3f1f20bf7a3546993ae5ecd7c07fd2f25d40b4e54571"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea473c37872f0159294f7073f3fa72f68b03a129799f3533b2bb44d5e9fa4f82"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5214362abf26e254d749fc0c18af4c57b532a4bfde1a057565616dd3b8d7cc94"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99b7d3f7a7adfa3d11e3a48d1a91bb65739555dd6a0d3fa68aa5852d962e5b1"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:74397a1263275bea9d736572d4cf338efaade2de9ff759f9c26bcdceb383bb49"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f154bd866318185ef5865ace5be3ac047b6d1cc0aeecf53bf83fe846f4384d5d"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e0d84099ea7cba9ff467f9c6f747e3fc3906e2aadac1ce7b41add72e8d0a3712"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-win32.whl", hash = "sha256:3f477fb8a56e0c603587b8278d9dbd32e54bcc2922d62405f65574bd76eba78a"},
|
||||||
|
{file = "coverage-7.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:c75738ce13d257efbb6633a049fb2ed8e87e2e6c2e906c52d1093a4d08d67c6b"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:997aa14b3e014339d8101b9886063c5d06238848905d9ad6c6eabe533440a9a7"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9c5bc5db3eb4cd55ecb8397d8e9b70247904f8eca718cc53c12dcc98e59fc8"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27ee94f088397d1feea3cb524e4313ff0410ead7d968029ecc4bc5a7e1d34fbf"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ce03e25e18dd9bf44723e83bc202114817f3367789052dc9e5b5c79f40cf59d"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85072e99474d894e5df582faec04abe137b28972d5e466999bc64fc37f564a03"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a877810ef918d0d345b783fc569608804f3ed2507bf32f14f652e4eaf5d8f8d0"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9ac17b94ab4ca66cf803f2b22d47e392f0977f9da838bf71d1f0db6c32893cb9"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36d75ef2acab74dc948d0b537ef021306796da551e8ac8b467810911000af66a"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-win32.whl", hash = "sha256:47ee56c2cd445ea35a8cc3ad5c8134cb9bece3a5cb50bb8265514208d0a65928"},
|
||||||
|
{file = "coverage-7.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:11ab62d0ce5d9324915726f611f511a761efcca970bd49d876cf831b4de65be5"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:33e63c578f4acce1b6cd292a66bc30164495010f1091d4b7529d014845cd9bee"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:782693b817218169bfeb9b9ba7f4a9f242764e180ac9589b45112571f32a0ba6"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4277ddaad9293454da19121c59f2d850f16bcb27f71f89a5c4836906eb35ef"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d892a19ae24b9801771a5a989fb3e850bd1ad2e2b6e83e949c65e8f37bc67a1"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3024ec1b3a221bd10b5d87337d0373c2bcaf7afd86d42081afe39b3e1820323b"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1c3e9d2bbd6f3f79cfecd6f20854f4dc0c6e0ec317df2b265266d0dc06535f1"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e91029d7f151d8bf5ab7d8bfe2c3dbefd239759d642b211a677bc0709c9fdb96"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6879fe41c60080aa4bb59703a526c54e0412b77e649a0d06a61782ecf0853ee1"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-win32.whl", hash = "sha256:fd2f8a641f8f193968afdc8fd1697e602e199931012b574194052d132a79be13"},
|
||||||
|
{file = "coverage-7.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:d1d0ce6c6947a3a4aa5479bebceff2c807b9f3b529b637e2b33dea4468d75fc7"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:36797b3625d1da885b369bdaaa3b0d9fb8865caed3c2b8230afaa6005434aa2f"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfed0ec4b419fbc807dec417c401499ea869436910e1ca524cfb4f81cf3f60e7"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f97ff5a9fc2ca47f3383482858dd2cb8ddbf7514427eecf5aa5f7992d0571429"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:607b6c6b35aa49defaebf4526729bd5238bc36fe3ef1a417d9839e1d96ee1e4c"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8e258dcc335055ab59fe79f1dec217d9fb0cdace103d6b5c6df6b75915e7959"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a02ac7c51819702b384fea5ee033a7c202f732a2a2f1fe6c41e3d4019828c8d3"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b710869a15b8caf02e31d16487a931dbe78335462a122c8603bb9bd401ff6fb2"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6a23ae9348a7a92e7f750f9b7e828448e428e99c24616dec93a0720342f241d"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-win32.whl", hash = "sha256:758ebaf74578b73f727acc4e8ab4b16ab6f22a5ffd7dd254e5946aba42a4ce76"},
|
||||||
|
{file = "coverage-7.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:309ed6a559bc942b7cc721f2976326efbfe81fc2b8f601c722bff927328507dc"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aefbb29dc56317a4fcb2f3857d5bce9b881038ed7e5aa5d3bcab25bd23f57328"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:183c16173a70caf92e2dfcfe7c7a576de6fa9edc4119b8e13f91db7ca33a7923"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4184dcbe4f98d86470273e758f1d24191ca095412e4335ff27b417291f5964"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93698ac0995516ccdca55342599a1463ed2e2d8942316da31686d4d614597ef9"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb220b3596358a86361139edce40d97da7458412d412e1e10c8e1970ee8c09ab"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5b14abde6f8d969e6b9dd8c7a013d9a2b52af1235fe7bebef25ad5c8f47fa18"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:610afaf929dc0e09a5eef6981edb6a57a46b7eceff151947b836d869d6d567c1"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed790728fb71e6b8247bd28e77e99d0c276dff952389b5388169b8ca7b1c28"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-win32.whl", hash = "sha256:c15fdfb141fcf6a900e68bfa35689e1256a670db32b96e7a931cab4a0e1600e5"},
|
||||||
|
{file = "coverage-7.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:38d0b307c4d99a7aca4e00cad4311b7c51b7ac38fb7dea2abe0d182dd4008e05"},
|
||||||
|
{file = "coverage-7.3.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b1e0f25ae99cf247abfb3f0fac7ae25739e4cd96bf1afa3537827c576b4847e5"},
|
||||||
|
{file = "coverage-7.3.4.tar.gz", hash = "sha256:020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
toml = ["tomli"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cssbeautifier"
|
||||||
|
version = "1.14.11"
|
||||||
|
description = "CSS unobfuscator and beautifier."
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "cssbeautifier-1.14.11.tar.gz", hash = "sha256:40544c2b62bbcb64caa5e7f37a02df95654e5ce1bcacadac4ca1f3dc89c31513"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
editorconfig = ">=0.12.2"
|
||||||
|
jsbeautifier = "*"
|
||||||
|
six = ">=1.13.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "deepdiff"
|
||||||
|
version = "6.7.1"
|
||||||
|
description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"},
|
||||||
|
{file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
ordered-set = ">=4.0.2,<4.2.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"]
|
||||||
|
optimize = ["orjson"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "djlint"
|
||||||
|
version = "1.34.1"
|
||||||
|
description = "HTML Template Linter and Formatter"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8.0,<4.0.0"
|
||||||
|
files = [
|
||||||
|
{file = "djlint-1.34.1-py3-none-any.whl", hash = "sha256:96ff1c464fb6f061130ebc88663a2ea524d7ec51f4b56221a2b3f0320a3cfce8"},
|
||||||
|
{file = "djlint-1.34.1.tar.gz", hash = "sha256:db93fa008d19eaadb0454edf1704931d14469d48508daba2df9941111f408346"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
click = ">=8.0.1,<9.0.0"
|
||||||
|
colorama = ">=0.4.4,<0.5.0"
|
||||||
|
cssbeautifier = ">=1.14.4,<2.0.0"
|
||||||
|
html-tag-names = ">=0.1.2,<0.2.0"
|
||||||
|
html-void-elements = ">=0.1.0,<0.2.0"
|
||||||
|
jsbeautifier = ">=1.14.4,<2.0.0"
|
||||||
|
json5 = ">=0.9.11,<0.10.0"
|
||||||
|
pathspec = ">=0.12.0,<0.13.0"
|
||||||
|
PyYAML = ">=6.0,<7.0"
|
||||||
|
regex = ">=2023.0.0,<2024.0.0"
|
||||||
|
tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""}
|
||||||
|
tqdm = ">=4.62.2,<5.0.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "editorconfig"
|
||||||
|
version = "0.12.3"
|
||||||
|
description = "EditorConfig File Locator and Interpreter for Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "EditorConfig-0.12.3-py3-none-any.whl", hash = "sha256:6b0851425aa875b08b16789ee0eeadbd4ab59666e9ebe728e526314c4a2e52c1"},
|
||||||
|
{file = "EditorConfig-0.12.3.tar.gz", hash = "sha256:57f8ce78afcba15c8b18d46b5170848c88d56fd38f05c2ec60dbbfcb8996e89e"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "exceptiongroup"
|
||||||
|
version = "1.2.0"
|
||||||
|
description = "Backport of PEP 654 (exception groups)"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
|
||||||
|
{file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
test = ["pytest (>=6)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "greenlet"
|
||||||
|
version = "3.0.2"
|
||||||
|
description = "Lightweight in-process concurrent programming"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51"},
|
||||||
|
{file = "greenlet-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1"},
|
||||||
|
{file = "greenlet-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c"},
|
||||||
|
{file = "greenlet-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-win32.whl", hash = "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30"},
|
||||||
|
{file = "greenlet-3.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-win32.whl", hash = "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6"},
|
||||||
|
{file = "greenlet-3.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-win32.whl", hash = "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590"},
|
||||||
|
{file = "greenlet-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0"},
|
||||||
|
{file = "greenlet-3.0.2.tar.gz", hash = "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["Sphinx"]
|
||||||
|
test = ["objgraph", "psutil"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "html-tag-names"
|
||||||
|
version = "0.1.2"
|
||||||
|
description = "List of known HTML tag names"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7,<4.0"
|
||||||
|
files = [
|
||||||
|
{file = "html-tag-names-0.1.2.tar.gz", hash = "sha256:04924aca48770f36b5a41c27e4d917062507be05118acb0ba869c97389084297"},
|
||||||
|
{file = "html_tag_names-0.1.2-py3-none-any.whl", hash = "sha256:eeb69ef21078486b615241f0393a72b41352c5219ee648e7c61f5632d26f0420"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "html-void-elements"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "List of HTML void tag names."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7,<4.0"
|
||||||
|
files = [
|
||||||
|
{file = "html-void-elements-0.1.0.tar.gz", hash = "sha256:931b88f84cd606fee0b582c28fcd00e41d7149421fb673e1e1abd2f0c4f231f0"},
|
||||||
|
{file = "html_void_elements-0.1.0-py3-none-any.whl", hash = "sha256:784cf39db03cdeb017320d9301009f8f3480f9d7b254d0974272e80e0cb5e0d2"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iniconfig"
|
||||||
|
version = "2.0.0"
|
||||||
|
description = "brain-dead simple config-ini parsing"
|
||||||
|
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 = "jsbeautifier"
|
||||||
|
version = "1.14.11"
|
||||||
|
description = "JavaScript unobfuscator and beautifier."
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "jsbeautifier-1.14.11.tar.gz", hash = "sha256:6b632581ea60dd1c133cd25a48ad187b4b91f526623c4b0fb5443ef805250505"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
editorconfig = ">=0.12.2"
|
||||||
|
six = ">=1.13.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "json5"
|
||||||
|
version = "0.9.14"
|
||||||
|
description = "A Python implementation of the JSON5 data format."
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"},
|
||||||
|
{file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["hypothesis"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mando"
|
||||||
|
version = "0.7.1"
|
||||||
|
description = "Create Python CLI apps with little to no effort at all!"
|
||||||
|
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 = "msgpack"
|
||||||
|
version = "1.0.7"
|
||||||
|
description = "MessagePack serializer"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"},
|
||||||
|
{file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"},
|
||||||
|
{file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"},
|
||||||
|
{file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"},
|
||||||
|
{file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"},
|
||||||
|
{file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"},
|
||||||
|
{file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "neovim"
|
||||||
|
version = "0.3.1"
|
||||||
|
description = "Transition packgage for pynvim"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "neovim-0.3.1.tar.gz", hash = "sha256:a6a0e7a5b4433bf4e6ddcbc5c5ff44170be7d84259d002b8e8d8fb4ee78af60f"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pynvim = ">=0.3.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nodeenv"
|
||||||
|
version = "1.8.0"
|
||||||
|
description = "Node.js virtual environment builder"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
|
||||||
|
files = [
|
||||||
|
{file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"},
|
||||||
|
{file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
setuptools = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ordered-set"
|
||||||
|
version = "4.1.0"
|
||||||
|
description = "An OrderedSet is a custom MutableSet that remembers its order, so that every"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"},
|
||||||
|
{file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["black", "mypy", "pytest"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "packaging"
|
||||||
|
version = "23.2"
|
||||||
|
description = "Core utilities for Python packages"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
|
||||||
|
{file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pathspec"
|
||||||
|
version = "0.12.1"
|
||||||
|
description = "Utility library for gitignore style pattern matching of file paths."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
|
||||||
|
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pluggy"
|
||||||
|
version = "1.3.0"
|
||||||
|
description = "plugin and hook calling mechanisms for python"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"},
|
||||||
|
{file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["pre-commit", "tox"]
|
||||||
|
testing = ["pytest", "pytest-benchmark"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pynvim"
|
||||||
|
version = "0.5.0"
|
||||||
|
description = "Python client for Neovim"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "pynvim-0.5.0-py2.py3-none-any.whl", hash = "sha256:2ac197ef0cdfff53719184a45c33cfb7cef88d1c9bf7f0525c21b3239cb5365f"},
|
||||||
|
{file = "pynvim-0.5.0.tar.gz", hash = "sha256:e80a11f6f5d194c6a47bea4135b90b55faca24da3544da7cf4a5f7ba8fb09215"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
greenlet = ">=3.0"
|
||||||
|
msgpack = ">=0.5.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
pyuv = ["pyuv (>=1.0.0)"]
|
||||||
|
test = ["pytest"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyright"
|
||||||
|
version = "1.1.342"
|
||||||
|
description = "Command line wrapper for pyright"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "pyright-1.1.342-py3-none-any.whl", hash = "sha256:9a7b95b3a2a90ef7b4297221173956f7f2db2a6cf4f0c7493f2a2349d38305fc"},
|
||||||
|
{file = "pyright-1.1.342.tar.gz", hash = "sha256:c8e9785b9080c1aaf2a2efad706249ec65e15abd5f542ee455956acfd404d273"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
nodeenv = ">=1.6.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
all = ["twine (>=3.4.1)"]
|
||||||
|
dev = ["twine (>=3.4.1)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest"
|
||||||
|
version = "7.4.3"
|
||||||
|
description = "pytest: simple powerful testing with Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
|
||||||
|
{file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||||
|
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
|
||||||
|
iniconfig = "*"
|
||||||
|
packaging = "*"
|
||||||
|
pluggy = ">=0.12,<2.0"
|
||||||
|
tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest-cov"
|
||||||
|
version = "4.1.0"
|
||||||
|
description = "Pytest plugin for measuring coverage."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
|
||||||
|
{file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
coverage = {version = ">=5.2.1", extras = ["toml"]}
|
||||||
|
pytest = ">=4.6"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest-gitignore"
|
||||||
|
version = "1.3"
|
||||||
|
description = "py.test plugin to ignore the same files as git"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "pytest-gitignore-1.3.tar.gz", hash = "sha256:e62a59ad42731504926a0f7b66b0dd829b587ac9c07e304834ae050c82aca1e3"},
|
||||||
|
{file = "pytest_gitignore-1.3-py2.py3-none-any.whl", hash = "sha256:a7ed6d47c3aa10807ecb76c5b52716dce512bc704d68717b238c65f6b59b6cb1"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pytest = ">=2.7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pyyaml"
|
||||||
|
version = "6.0.1"
|
||||||
|
description = "YAML parser and emitter for Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
files = [
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
|
||||||
|
{file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
|
||||||
|
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
|
||||||
|
{file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
|
||||||
|
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
|
||||||
|
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
|
||||||
|
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
|
||||||
|
{file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
|
||||||
|
{file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
|
||||||
|
{file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
|
||||||
|
{file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
|
||||||
|
{file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
|
||||||
|
{file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
|
||||||
|
{file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
|
||||||
|
{file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
|
||||||
|
{file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
|
||||||
|
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
|
||||||
|
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
|
||||||
|
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
|
||||||
|
{file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
|
||||||
|
{file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
|
||||||
|
{file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
|
||||||
|
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "radon"
|
||||||
|
version = "6.0.1"
|
||||||
|
description = "Code Metrics in Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "radon-6.0.1-py2.py3-none-any.whl", hash = "sha256:632cc032364a6f8bb1010a2f6a12d0f14bc7e5ede76585ef29dc0cecf4cd8859"},
|
||||||
|
{file = "radon-6.0.1.tar.gz", hash = "sha256:d1ac0053943a893878940fedc8b19ace70386fc9c9bf0a09229a44125ebf45b5"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
colorama = {version = ">=0.4.1", markers = "python_version > \"3.4\""}
|
||||||
|
mando = ">=0.6,<0.8"
|
||||||
|
tomli = {version = ">=2.0.1", optional = true, markers = "extra == \"toml\""}
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
toml = ["tomli (>=2.0.1)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "2023.10.3"
|
||||||
|
description = "Alternative regular expression module, to replace re."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"},
|
||||||
|
{file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"},
|
||||||
|
{file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"},
|
||||||
|
{file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"},
|
||||||
|
{file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"},
|
||||||
|
{file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"},
|
||||||
|
{file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"},
|
||||||
|
{file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ruff"
|
||||||
|
version = "0.1.9"
|
||||||
|
description = "An extremely fast Python linter and code formatter, written in Rust."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "ruff-0.1.9-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e6a212f436122ac73df851f0cf006e0c6612fe6f9c864ed17ebefce0eff6a5fd"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:28d920e319783d5303333630dae46ecc80b7ba294aeffedf946a02ac0b7cc3db"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:104aa9b5e12cb755d9dce698ab1b97726b83012487af415a4512fedd38b1459e"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e63bf5a4a91971082a4768a0aba9383c12392d0d6f1e2be2248c1f9054a20da"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d0738917c203246f3e275b37006faa3aa96c828b284ebfe3e99a8cb413c8c4b"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69dac82d63a50df2ab0906d97a01549f814b16bc806deeac4f064ff95c47ddf5"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2aec598fb65084e41a9c5d4b95726173768a62055aafb07b4eff976bac72a592"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:744dfe4b35470fa3820d5fe45758aace6269c578f7ddc43d447868cfe5078bcb"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479ca4250cab30f9218b2e563adc362bd6ae6343df7c7b5a7865300a5156d5a6"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:aa8344310f1ae79af9ccd6e4b32749e93cddc078f9b5ccd0e45bd76a6d2e8bb6"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:837c739729394df98f342319f5136f33c65286b28b6b70a87c28f59354ec939b"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e6837202c2859b9f22e43cb01992373c2dbfeae5c0c91ad691a4a2e725392464"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:331aae2cd4a0554667ac683243b151c74bd60e78fb08c3c2a4ac05ee1e606a39"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-win32.whl", hash = "sha256:8151425a60878e66f23ad47da39265fc2fad42aed06fb0a01130e967a7a064f4"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-win_amd64.whl", hash = "sha256:c497d769164df522fdaf54c6eba93f397342fe4ca2123a2e014a5b8fc7df81c7"},
|
||||||
|
{file = "ruff-0.1.9-py3-none-win_arm64.whl", hash = "sha256:0e17f53bcbb4fff8292dfd84cf72d767b5e146f009cccd40c2fad27641f8a7a9"},
|
||||||
|
{file = "ruff-0.1.9.tar.gz", hash = "sha256:b041dee2734719ddbb4518f762c982f2e912e7f28b8ee4fe1dee0b15d1b6e800"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "setuptools"
|
||||||
|
version = "69.0.2"
|
||||||
|
description = "Easily download, build, install, upgrade, and uninstall Python packages"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"},
|
||||||
|
{file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
|
||||||
|
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "six"
|
||||||
|
version = "1.16.0"
|
||||||
|
description = "Python 2 and 3 compatibility utilities"
|
||||||
|
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 = "toml"
|
||||||
|
version = "0.10.2"
|
||||||
|
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
files = [
|
||||||
|
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||||
|
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tomli"
|
||||||
|
version = "2.0.1"
|
||||||
|
description = "A lil' TOML parser"
|
||||||
|
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 = "tqdm"
|
||||||
|
version = "4.66.1"
|
||||||
|
description = "Fast, Extensible Progress Meter"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"},
|
||||||
|
{file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
|
||||||
|
notebook = ["ipywidgets (>=6)"]
|
||||||
|
slack = ["slack-sdk"]
|
||||||
|
telegram = ["requests"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "types-python-dateutil"
|
||||||
|
version = "2.8.19.14"
|
||||||
|
description = "Typing stubs for python-dateutil"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"},
|
||||||
|
{file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "vulture"
|
||||||
|
version = "2.10"
|
||||||
|
description = "Find dead code"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "vulture-2.10-py2.py3-none-any.whl", hash = "sha256:568a4176db7468d0157817ae3bb1847a19f1ddc629849af487f9d3b279bff77d"},
|
||||||
|
{file = "vulture-2.10.tar.gz", hash = "sha256:2a5c3160bffba77595b6e6dfcc412016bd2a09cd4b66cdf7fbba913684899f6f"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
toml = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wheel"
|
||||||
|
version = "0.42.0"
|
||||||
|
description = "A built-package format for Python"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"},
|
||||||
|
{file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
test = ["pytest (>=6.0.0)", "setuptools (>=65)"]
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
lock-version = "2.0"
|
||||||
|
python-versions = "^3.9"
|
||||||
|
content-hash = "8bec070b355fa8b409f8d9dfb9dae82433b11c3f65fc17dd14652e9e25e62f7a"
|
199
pyproject.toml
Normal file
199
pyproject.toml
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
[tool.poetry]
|
||||||
|
name = ""
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Parse common comic filenames and return a dict of metadata attributes. Includes a cli."
|
||||||
|
license = "GPL-3.0-only"
|
||||||
|
authors = ["AJ Slater <aj@slater.net>"]
|
||||||
|
readme = "README.md"
|
||||||
|
homepage = "https://github.com/ajslater/comicfn2dict"
|
||||||
|
repository = "https://github.com/ajslater/comicfn2dict"
|
||||||
|
documentation = "https://github.com/ajslater/comicfn2dict"
|
||||||
|
keywords = []
|
||||||
|
classifiers = [
|
||||||
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
|
||||||
|
"Natural Language :: English",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
|
]
|
||||||
|
packages = [{ include = "" }, { include = "tests", format = "sdist" }]
|
||||||
|
exclude = ["*/**/*~"]
|
||||||
|
include = []
|
||||||
|
|
||||||
|
[tool.poetry.dependencies]
|
||||||
|
python = "^3.9"
|
||||||
|
|
||||||
|
[tool.poetry.group.dev.dependencies]
|
||||||
|
neovim = "^0.3.1"
|
||||||
|
djlint = "^1.19.17"
|
||||||
|
wheel = "^0.42.0"
|
||||||
|
|
||||||
|
[tool.poetry.group.test.dependencies]
|
||||||
|
coverage = { extras = ["toml"], version = "^7.0" }
|
||||||
|
deepdiff = "^6.3.1"
|
||||||
|
pytest-cov = "^4.1.0"
|
||||||
|
pytest-gitignore = "^1.3"
|
||||||
|
|
||||||
|
[tool.poetry.group.lint.dependencies]
|
||||||
|
codespell = "^2.1.0"
|
||||||
|
pyright = "^1.1.232"
|
||||||
|
radon = { version = "^6.0.1", extras = ["toml"] }
|
||||||
|
ruff = "^0.1.2"
|
||||||
|
types-python-dateutil = "^2.8.19"
|
||||||
|
vulture = "^2.3"
|
||||||
|
|
||||||
|
[tool.poetry.scripts]
|
||||||
|
#prog = "prog.run:main"
|
||||||
|
|
||||||
|
[tool.poetry.urls]
|
||||||
|
"News" = "https://github.com/ajslater/comicfn2dict/NEWS.md"
|
||||||
|
"Report Issues" = "https://github.com/ajslater/comicfn2dict/issues"
|
||||||
|
|
||||||
|
[tool.codespell]
|
||||||
|
skip = './cache,./dist,./test-results,.git,.mypy_cache,.pytest_cache,.venv*,node_modules,package-lock.json,poetry.lock,run.spec'
|
||||||
|
builtin = 'clear,rare,code'
|
||||||
|
check-hidden = true
|
||||||
|
# Remove 'coverd' when this issue is resolved
|
||||||
|
# https://github.com/codespell-project/codespell/issues/1212
|
||||||
|
ignore-words-list = 'thead,ro,jupyter,coverd,searched,ws'
|
||||||
|
|
||||||
|
[tool.coverage.html]
|
||||||
|
directory = "test-results/coverage"
|
||||||
|
|
||||||
|
[tool.coverage.run]
|
||||||
|
source = ["comicfn2dict"]
|
||||||
|
branch = true
|
||||||
|
concurrency = ["multiprocessing"]
|
||||||
|
omit = [
|
||||||
|
".git/*",
|
||||||
|
".mypy_cache/*",
|
||||||
|
".pytest_cache/*",
|
||||||
|
".venv*/*",
|
||||||
|
"*__pycache__*",
|
||||||
|
"dist/*",
|
||||||
|
"node_modules/*",
|
||||||
|
"test-results/*",
|
||||||
|
"typings/*"
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.pyright]
|
||||||
|
exclude = [
|
||||||
|
"**/__pycache__",
|
||||||
|
"**/node_modules",
|
||||||
|
".git",
|
||||||
|
".mypy_cache",
|
||||||
|
".pytest_cache",
|
||||||
|
".venv*",
|
||||||
|
"cache",
|
||||||
|
"dist",
|
||||||
|
"package-lock.json",
|
||||||
|
"poetry.lock",
|
||||||
|
"test-results",
|
||||||
|
"typings",
|
||||||
|
]
|
||||||
|
useLibraryCodeForTypes = true
|
||||||
|
reportMissingImports = true
|
||||||
|
reportImportCycles = true
|
||||||
|
pythonVersion = "3.9"
|
||||||
|
pythonPlatform = "All"
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
junit_family = "xunit2"
|
||||||
|
# --black
|
||||||
|
addopts = """
|
||||||
|
--junit-xml=test-results/pytest/results.xml
|
||||||
|
-ra
|
||||||
|
--strict-config
|
||||||
|
--strict-markers
|
||||||
|
--cov
|
||||||
|
--cov-append
|
||||||
|
--cov-report=html
|
||||||
|
--cov-report=term
|
||||||
|
--ignore=.git
|
||||||
|
--ignore=cache
|
||||||
|
--ignore=frontend
|
||||||
|
--ignore=typings
|
||||||
|
"""
|
||||||
|
|
||||||
|
[tool.radon]
|
||||||
|
exclude = "*~,.git/*,.mypy_cache/*,.pytest_cache/*,.venv*,__pycache__/*,cache/*,dist/*,node_modules/*,test-results/*,typings/*"
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
extend-exclude = ["typings"]
|
||||||
|
extend-ignore = ["S101", "D203", "D213",
|
||||||
|
# Format ignores
|
||||||
|
"W191", "E501", "E111", "E114", "E117", "D206", "D300", "Q000", "Q001",
|
||||||
|
"Q002", "Q003", "COM812", "COM819", "ISC001", "ISC002"
|
||||||
|
]
|
||||||
|
extend-select = [
|
||||||
|
"A",
|
||||||
|
"ARG",
|
||||||
|
"B",
|
||||||
|
"B9",
|
||||||
|
"C",
|
||||||
|
"C4",
|
||||||
|
"C90",
|
||||||
|
"D",
|
||||||
|
"DJ",
|
||||||
|
"DTZ",
|
||||||
|
"E",
|
||||||
|
"EM",
|
||||||
|
"EXE",
|
||||||
|
"F",
|
||||||
|
"I",
|
||||||
|
"ICN",
|
||||||
|
"INP",
|
||||||
|
"ISC",
|
||||||
|
"PIE",
|
||||||
|
"PL",
|
||||||
|
"PT",
|
||||||
|
"PTH",
|
||||||
|
"PYI",
|
||||||
|
"Q",
|
||||||
|
"N",
|
||||||
|
"RET",
|
||||||
|
"RSE",
|
||||||
|
"RUF",
|
||||||
|
"S",
|
||||||
|
"SIM",
|
||||||
|
"SLF",
|
||||||
|
"T10",
|
||||||
|
"T20",
|
||||||
|
"TCH",
|
||||||
|
"TID",
|
||||||
|
"TRY",
|
||||||
|
"UP",
|
||||||
|
"W",
|
||||||
|
"YTT"
|
||||||
|
# "ANN", "ERA", "COM"
|
||||||
|
]
|
||||||
|
external = ["V101"]
|
||||||
|
# format = "grouped"
|
||||||
|
# show-source = true
|
||||||
|
target-version = "py39"
|
||||||
|
task-tags = ["TODO", "FIXME", "XXX", "http", "HACK"]
|
||||||
|
|
||||||
|
[tool.ruff.per-file-ignores]
|
||||||
|
"tests/*" = ["SLF001", "T201", "T203"]
|
||||||
|
|
||||||
|
[tool.ruff.pycodestyle]
|
||||||
|
ignore-overlong-task-comments = true
|
||||||
|
|
||||||
|
[tool.vulture]
|
||||||
|
exclude = [
|
||||||
|
".git/",
|
||||||
|
".mypy_cache/",
|
||||||
|
".pytest_cache/",
|
||||||
|
"*.venv*",
|
||||||
|
"*/__pycache__",
|
||||||
|
"dist/",
|
||||||
|
"node_modules/",
|
||||||
|
"test_results/",
|
||||||
|
"typings/",
|
||||||
|
]
|
||||||
|
min_confidence = 61
|
||||||
|
sort_by_size = true
|
1
tests/__init__.py
Normal file
1
tests/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""comicfn2dict tests."""
|
245
tests/comic_filenames.py
Normal file
245
tests/comic_filenames.py
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
"""Test filenames with human parsed correct results."""
|
||||||
|
|
||||||
|
TEST_COMIC_FIELDS = {
|
||||||
|
"series": "Long Series Name",
|
||||||
|
"issue": "001",
|
||||||
|
"year": "2000",
|
||||||
|
"original_format": "TPB",
|
||||||
|
"scan_info": "Releaser",
|
||||||
|
"title": "Title",
|
||||||
|
"ext": "cbz",
|
||||||
|
}
|
||||||
|
TEST_COMIC_FIELDS_VOL = {
|
||||||
|
"series": "Long Series Name",
|
||||||
|
"volume": "1",
|
||||||
|
"issue": "001",
|
||||||
|
"year": "2000",
|
||||||
|
"title": "Title",
|
||||||
|
"original_format": "TPB",
|
||||||
|
"scan_info": "Releaser",
|
||||||
|
"ext": "cbz",
|
||||||
|
}
|
||||||
|
TEST_COMIC_VOL_ONLY = {
|
||||||
|
"series": "Long Series Name",
|
||||||
|
"volume": "1",
|
||||||
|
"title": "Title",
|
||||||
|
"original_format": "TPB",
|
||||||
|
"year": "2000",
|
||||||
|
"scan_info": "Releaser & Releaser-Releaser",
|
||||||
|
"ext": "cbr",
|
||||||
|
}
|
||||||
|
|
||||||
|
FNS = {
|
||||||
|
"Night of 1000 Wolves 001 (2013).cbz": {
|
||||||
|
"series": "Night of 1000 Wolves",
|
||||||
|
"issue": "001",
|
||||||
|
"year": "2013",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"19687 Sandman 53.cbz": {
|
||||||
|
"series": "19687 Sandman",
|
||||||
|
"issue": "53",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"33475 OMAC v3 2.cbr": {
|
||||||
|
"series": "33475 OMAC",
|
||||||
|
"volume": "3",
|
||||||
|
"issue": "2",
|
||||||
|
"ext": "cbr",
|
||||||
|
},
|
||||||
|
"Long Series Name 001 (2000) Title (TPB) (Releaser).cbz": TEST_COMIC_FIELDS,
|
||||||
|
"Long Series Name #001 (2000) Title (TPB) (Releaser).cbz": TEST_COMIC_FIELDS,
|
||||||
|
"Long Series Name (2000) 001 Title (TPB) (Releaser).cbz": TEST_COMIC_FIELDS,
|
||||||
|
"Long Series Name (2000) #001 Title (TPB) (Releaser).cbz": TEST_COMIC_FIELDS,
|
||||||
|
"Long Series Name v1 (2000) #001 "
|
||||||
|
"Title (TPB) (Releaser).cbz": TEST_COMIC_FIELDS_VOL,
|
||||||
|
"Long Series Name 001 (2000) (TPB-Releaser) Title.cbz": TEST_COMIC_FIELDS,
|
||||||
|
"Long Series Name Vol 1 "
|
||||||
|
"(2000) (TPB) (Releaser & Releaser-Releaser) Title.cbr": TEST_COMIC_VOL_ONLY,
|
||||||
|
"Ultimate Craziness (2019) (Digital) (Friends-of-Bill).cbr": {
|
||||||
|
"series": "Ultimate Craziness",
|
||||||
|
"year": "2019",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "Digital",
|
||||||
|
"scan_info": "Friends-of-Bill",
|
||||||
|
},
|
||||||
|
"Jimmy Stocks Love Chain (2005) (digital) (The Magicians-Empire).cbr": {
|
||||||
|
"series": "Jimmy Stocks Love Chain",
|
||||||
|
"year": "2005",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "digital",
|
||||||
|
"scan_info": "The Magicians-Empire",
|
||||||
|
},
|
||||||
|
"Arkenstone Vol. 01 - The Smell of Burnt Toast (2020) (digital) (My-brother).cbr": {
|
||||||
|
"series": "Arkenstone",
|
||||||
|
"volume": "01",
|
||||||
|
"year": "2020",
|
||||||
|
"ext": "cbr",
|
||||||
|
"scan_info": "My-brother",
|
||||||
|
"title": "The Smell of Burnt Toast",
|
||||||
|
"original_format": "digital",
|
||||||
|
},
|
||||||
|
"Bardude - The Last Thing I Remember.cbz": {
|
||||||
|
"series": "Bardude",
|
||||||
|
"title": "The Last Thing I Remember",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"Drunkguy - The Man Without Fear - 01.cbz": {
|
||||||
|
"series": "Drunkguy",
|
||||||
|
"title": "The Man Without Fear",
|
||||||
|
"issue": "01",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"The_Arkenstone_v03_(2002)_(Digital)_(DR_&_Quenya-Elves).cbr": {
|
||||||
|
"series": "The Arkenstone",
|
||||||
|
"volume": "03",
|
||||||
|
"year": "2002",
|
||||||
|
"ext": "cbr",
|
||||||
|
"scan_info": "DR & Quenya-Elves",
|
||||||
|
"original_format": "Digital",
|
||||||
|
},
|
||||||
|
"Kartalk v01 001 - Fear the Brakes (2004) (digital) (Son of Ultron-EMpire).cbr": {
|
||||||
|
"series": "Kartalk",
|
||||||
|
"volume": "01",
|
||||||
|
"issue": "001",
|
||||||
|
"year": "2004",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "digital",
|
||||||
|
"scan_info": "Son of Ultron-EMpire",
|
||||||
|
"title": "Fear the Brakes",
|
||||||
|
},
|
||||||
|
"Kartalk Library Edition v01 (1992) (digital) (Son of Ultron-Empire).cbr": {
|
||||||
|
"series": "Kartalk Library Edition",
|
||||||
|
"volume": "01",
|
||||||
|
"year": "1992",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "digital",
|
||||||
|
"scan_info": "Son of Ultron-Empire",
|
||||||
|
},
|
||||||
|
"Kind of Deadly v02 - Last Bullet (2006) (Digital) (Zone-Empire).cbr": {
|
||||||
|
"series": "Kind of Deadly",
|
||||||
|
"volume": "02",
|
||||||
|
"year": "2006",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "Digital",
|
||||||
|
"scan_info": "Zone-Empire",
|
||||||
|
"title": "Last Bullet",
|
||||||
|
},
|
||||||
|
"Jeremy John - A Big Long Title (2017) (digital-Minutement).cbz": {
|
||||||
|
"series": "Jeremy John",
|
||||||
|
"title": "A Big Long Title",
|
||||||
|
"year": "2017",
|
||||||
|
"ext": "cbz",
|
||||||
|
"original_format": "digital",
|
||||||
|
"scan_info": "Minutement",
|
||||||
|
},
|
||||||
|
"Jeremy John 001 (2006) (digital (Minutemen-Faessla).cbz": {
|
||||||
|
"series": "Jeremy John",
|
||||||
|
"issue": "001",
|
||||||
|
"year": "2006",
|
||||||
|
"ext": "cbz",
|
||||||
|
"scan_info": "Minutemen-Faessla",
|
||||||
|
# "original_format": "digital",
|
||||||
|
"remainders": ("(digital",),
|
||||||
|
},
|
||||||
|
"Jeremy John 003 (2007) (4 covers) (digital) (Minutemen-Faessla).cbz": {
|
||||||
|
"series": "Jeremy John",
|
||||||
|
"issue": "003",
|
||||||
|
"year": "2007",
|
||||||
|
"ext": "cbz",
|
||||||
|
"scan_info": "Minutemen-Faessla",
|
||||||
|
"original_format": "digital",
|
||||||
|
"remainders": ("(4 covers)",),
|
||||||
|
},
|
||||||
|
"Jeremy John v01 - Uninterested! (2007) (Digital) (Asgard-Empire).cbr": {
|
||||||
|
"series": "Jeremy John",
|
||||||
|
"volume": "01",
|
||||||
|
"year": "2007",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "Digital",
|
||||||
|
"scan_info": "Asgard-Empire",
|
||||||
|
"title": "Uninterested!",
|
||||||
|
},
|
||||||
|
"King of Skittles 01 (of 05) (2020) (digital) (Son of Ultron-Empire).cbr": {
|
||||||
|
"series": "King of Skittles",
|
||||||
|
"issue": "01",
|
||||||
|
"issue_count": "05",
|
||||||
|
"year": "2020",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "digital",
|
||||||
|
"scan_info": "Son of Ultron-Empire",
|
||||||
|
},
|
||||||
|
"Darkwad 011 (2019) (Digital) (Zone-Empire).cbr": {
|
||||||
|
"series": "Darkwad",
|
||||||
|
"issue": "011",
|
||||||
|
"year": "2019",
|
||||||
|
"ext": "cbr",
|
||||||
|
"original_format": "Digital",
|
||||||
|
"scan_info": "Zone-Empire",
|
||||||
|
},
|
||||||
|
"Darkwad by Carlos Zemo v01 - Knuckle Fight (2009) (Digital) (Zone-Empire).cbr": {
|
||||||
|
"series": "Darkwad by Carlos Zemo",
|
||||||
|
"volume": "01",
|
||||||
|
"year": "2009",
|
||||||
|
"ext": "cbr",
|
||||||
|
"title": "Knuckle Fight",
|
||||||
|
"original_format": "Digital",
|
||||||
|
"scan_info": "Zone-Empire",
|
||||||
|
},
|
||||||
|
"The Walking Dead #002 (2003).cbz": {
|
||||||
|
"series": "The Walking Dead",
|
||||||
|
"issue": "002",
|
||||||
|
"year": "2003",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"The Walking Dead #3.cbz": {
|
||||||
|
"series": "The Walking Dead",
|
||||||
|
"issue": "3",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"The Walking Dead 4.cbz": {
|
||||||
|
"series": "The Walking Dead",
|
||||||
|
"issue": "4",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"A Fractional Comic 1.1.cbz": {
|
||||||
|
"series": "A Fractional Comic",
|
||||||
|
"issue": "1.1",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"A Fractional Comic 8.54.cbz": {
|
||||||
|
"series": "A Fractional Comic",
|
||||||
|
"issue": "8.54",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"Earth X #½.cbz": {
|
||||||
|
"series": "Earth X",
|
||||||
|
"issue": "½",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"Avengers #001½.cbz": {
|
||||||
|
"series": "Avengers",
|
||||||
|
"issue": "001½",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"The Amazing Spider-Man #78.BEY.cbz": {
|
||||||
|
"series": "The Amazing Spider-Man",
|
||||||
|
"issue": "78.BEY",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"The Amazing Spider-Man #54.LR.cbz": {
|
||||||
|
"series": "The Amazing Spider-Man",
|
||||||
|
"issue": "54.LR",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"Wolverine & the X-Men #27AU.cbz": {
|
||||||
|
"series": "Wolverine & the X-Men",
|
||||||
|
"issue": "27AU",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
"Fantastic Four #5AU.cbz": {
|
||||||
|
"series": "Fantastic Four",
|
||||||
|
"issue": "5AU",
|
||||||
|
"ext": "cbz",
|
||||||
|
},
|
||||||
|
}
|
25
tests/test_comicfn2dict.py
Normal file
25
tests/test_comicfn2dict.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
"""Tests for filename parsing."""
|
||||||
|
from pprint import pprint
|
||||||
|
from types import MappingProxyType
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from deepdiff.diff import DeepDiff
|
||||||
|
|
||||||
|
from comicfn2dict import comicfn2dict
|
||||||
|
from tests.comic_filenames import FNS
|
||||||
|
|
||||||
|
ALL_FIELDS = frozenset({"series", "volume", "issue", "issue_count", "year", "ext"})
|
||||||
|
FIELD_SCHEMA = MappingProxyType({key: None for key in ALL_FIELDS})
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("item", FNS.items())
|
||||||
|
def test_parse_filename(item):
|
||||||
|
"""Test filename parsing."""
|
||||||
|
fn, defined_fields = item
|
||||||
|
md = comicfn2dict(fn)
|
||||||
|
diff = DeepDiff(defined_fields, md, ignore_order=True)
|
||||||
|
print(fn)
|
||||||
|
pprint(defined_fields)
|
||||||
|
pprint(md)
|
||||||
|
pprint(diff)
|
||||||
|
assert not diff
|
Loading…
Reference in New Issue
Block a user