├── .DS_Store ├── .gitignore ├── .python-version ├── Makefile ├── README.md ├── app ├── __init__.py ├── config.py ├── pipeline.py └── validacoes │ ├── __init__.py │ ├── colunas_estao_presentes.py │ ├── colunas_estao_presentes_na_mesma_ordem.py │ ├── existem_colunas_a_mais.py │ ├── existem_colunas_a_menos.py │ ├── quantidade_de_linhas.py │ └── tipos_dados.py ├── data ├── .DS_Store ├── input │ ├── arquivo_recebido_1.xlsx │ ├── arquivo_recebido_2.xlsx │ ├── arquivo_recebido_3.xlsx │ ├── arquivo_recebido_4.xlsx │ └── arquivo_recebido_5.xlsx └── modelo │ └── arquivo_modelo.xlsx ├── docs ├── images │ ├── antes.png │ └── depois.png └── index.md ├── mkdocs.yml ├── poetry.lock ├── pyproject.toml └── requirements.txt /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | cover/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | db.sqlite3-journal 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | .pybuilder/ 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | # For a library or package, you might want to ignore these files since the code is 91 | # intended to run in multiple environments; otherwise, check them in: 92 | # .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # poetry 102 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 103 | # This is especially recommended for binary packages to ensure reproducibility, and is more 104 | # commonly ignored for libraries. 105 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 106 | #poetry.lock 107 | 108 | # pdm 109 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 110 | #pdm.lock 111 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 112 | # in version control. 113 | # https://pdm.fming.dev/#use-with-ide 114 | .pdm.toml 115 | 116 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 117 | __pypackages__/ 118 | 119 | # Celery stuff 120 | celerybeat-schedule 121 | celerybeat.pid 122 | 123 | # SageMath parsed files 124 | *.sage.py 125 | 126 | # Environments 127 | .env 128 | .venv 129 | env/ 130 | venv/ 131 | ENV/ 132 | env.bak/ 133 | venv.bak/ 134 | 135 | # Spyder project settings 136 | .spyderproject 137 | .spyproject 138 | 139 | # Rope project settings 140 | .ropeproject 141 | 142 | # mkdocs documentation 143 | /site 144 | 145 | # mypy 146 | .mypy_cache/ 147 | .dmypy.json 148 | dmypy.json 149 | 150 | # Pyre type checker 151 | .pyre/ 152 | 153 | # pytype static type analyzer 154 | .pytype/ 155 | 156 | # Cython debug symbols 157 | cython_debug/ 158 | 159 | # PyCharm 160 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 161 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 162 | # and can be added to the global gitignore or merged into this file. For a more nuclear 163 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 164 | #.idea/ 165 | 166 | ### Python Patch ### 167 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 168 | poetry.toml 169 | 170 | # ruff 171 | .ruff_cache/ 172 | 173 | # LSP config files 174 | pyrightconfig.json 175 | 176 | # End of https://www.toptal.com/developers/gitignore/api/python 177 | 178 | # Generated using ignr.py - github.com/Antrikshy/ignr.py 179 | 180 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.11.3 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | kill: 2 | kill -9 $(shell lsof -t -i :8000) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Excel Structure Validator 2 | 3 | ## Descrição 4 | 5 | O Excel Structure Validator é um projeto Python destinado a validar a estrutura de arquivos Excel. Ele compara arquivos Excel recebidos com um modelo pré-definido para assegurar que os dados cumpram com os padrões estabelecidos. O projeto é ideal para cenários onde a qualidade e a consistência dos dados são críticas para análises subsequentes, como importações para o Power BI, análises de dados, entre outros. 6 | 7 | ## Case do projeto 8 | 9 | [Linkedin](https://www.linkedin.com/posts/lucianovasconcelosf_valida%C3%A7%C3%A3o-automatica-de-arquivos-excel-activity-7104481940606509056-fXly?utm_source=share&utm_medium=member_desktop) 10 | 11 | ## Documentação do projeto 12 | 13 | [Documentação](https://lvgalvao.github.io/ExcelStructureValidator/) 14 | 15 | ## Funcionalidades 16 | 17 | * Valida a quantidade de linhas 18 | * Verifica a existência de colunas a mais ou a menos 19 | * Compara a ordem das colunas com o arquivo modelo 20 | * Valida os tipos de dados das colunas 21 | 22 | ## Requisitos 23 | 24 | * Python 3.x 25 | * Pandas 26 | * Loguru 27 | * Poetry (opcional) 28 | 29 | ## Instalação 30 | 31 | ### Usando pip 32 | 33 | 1. Clone este repositório 34 | 35 | 2. Navegue até o diretório do projeto e instale as dependências usando pip: 36 | 37 | ```bash 38 | pip install -r requirements.txt 39 | ``` 40 | 41 | 42 | ### Usando Poetry (Opcional) 43 | 44 | 1. Clone este repositório 45 | 46 | 2. Navegue até o diretório do projeto e instale as dependências usando poetry: 47 | 48 | ```bash 49 | poetry install 50 | ``` 51 | 52 | Para ativar o ambiente virtual do projeto: 53 | 54 | ```go 55 | poetry shell 56 | ``` 57 | 58 | ## Estrutura do Projeto 59 | 60 | ```bash 61 | ├── README.md 62 | ├── app 63 | │ ├── __init__.py 64 | │ ├── config.py 65 | │ ├── pipeline.py 66 | │ └── validacoes 67 | │ ├── __init__.py 68 | │ ├── colunas_estao_presentes.py 69 | │ ├── colunas_estao_presentes_na_mesma_ordem.py 70 | │ ├── existem_colunas_a_mais.py 71 | │ ├── existem_colunas_a_menos.py 72 | │ ├── quantidade_de_linhas.py 73 | │ └── tipos_dados.py 74 | ├── data 75 | │ ├── input 76 | │ │ ├── arquivo_recebido_1.xlsx 77 | │ │ ├── arquivo_recebido_2.xlsx 78 | │ │ ├── arquivo_recebido_3.xlsx 79 | │ │ ├── arquivo_recebido_4.xlsx 80 | │ │ └── arquivo_recebido_5.xlsx 81 | │ ├── modelo 82 | │ │ └── arquivo_modelo.xlsx 83 | │ ├── output_corretos 84 | │ └── output_revisar 85 | ├── docs 86 | │ └── index.md 87 | ├── mkdocs.yml 88 | ├── poetry.lock 89 | ├── pyproject.toml 90 | ├── requirements.txt 91 | `````` 92 | 93 | ## Uso 94 | 95 | 1. Coloque o arquivo modelo Excel em `data/modelo/` 96 | 97 | 2. Coloque os arquivos Excel que você deseja validar em `data/input/` 98 | 99 | 3. Execute o script `pipeline.py` para iniciar o processo de validação: 100 | 101 | ```bash 102 | python3 -m app.pipeline 103 | ``` 104 | 105 | ou se você estiver usando Poetry: 106 | 107 | ```bash 108 | task run 109 | ``` 110 | 111 | 4. Verifique os logs e os arquivos Excel movidos para os diretórios `output_corretos` ou `output_revisar`. 112 | 113 | 114 | ## Logs 115 | 116 | Os logs são gerados para cada arquivo e são armazenados no mesmo diretório de destino dos arquivos Excel (`output_corretos` ou `output_revisar`), dependendo do resultado da validação. 117 | 118 | ## Contato 119 | 120 | Sinta-se à vontade para entrar em contato comigo se você tiver alguma dúvida ou sugestão sobre o projeto. 121 | email: lvgalvaofilho@gmail.com -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/app/__init__.py -------------------------------------------------------------------------------- /app/config.py: -------------------------------------------------------------------------------- 1 | # Diretório do modelo Excel 2 | MODEL_DIR = './data/modelo/arquivo_modelo.xlsx' 3 | 4 | # Diretório de onde ler os arquivos Excel 5 | INPUT_DIR = './data/input/' 6 | 7 | # Diretório com os arquivos corretos 8 | OUTPUT_CORRETOS = './data/output_corretos/' 9 | 10 | # Diretório com os arquivos para revisão 11 | OUTPUT_REVISAO = './data/output_revisar/' 12 | -------------------------------------------------------------------------------- /app/pipeline.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import time 4 | 5 | import pandas as pd 6 | from loguru import logger 7 | 8 | from .config import INPUT_DIR, MODEL_DIR, OUTPUT_CORRETOS, OUTPUT_REVISAO 9 | from .validacoes import ( 10 | validar_quantidade_de_linhas, validar_se_existem_colunas_a_mais, 11 | validar_se_existem_colunas_a_menos, 12 | validar_se_todas_as_colunas_estao_presentes, 13 | validar_se_todas_as_colunas_estao_presentes_na_mesma_ordem, 14 | validar_tipos_dados) 15 | 16 | # Lendo o arquivo modelo 17 | excel_modelo = pd.read_excel(f'{MODEL_DIR}') 18 | 19 | # Lista para armazenar os nomes dos arquivos 20 | file_names = [] 21 | 22 | # Preenche a lista com os nomes dos arquivos no diretório 'input' 23 | for filename in os.listdir(INPUT_DIR): 24 | if filename.endswith('.xlsx'): 25 | file_names.append(filename) 26 | 27 | # Ordena a lista de nomes de arquivos em ordem alfabética 28 | file_names.sort() 29 | 30 | # Lê os arquivos em ordem alfabética e armazena em uma lista 31 | arquivos_recebidos = [ 32 | (filename, pd.read_excel(os.path.join(INPUT_DIR, filename))) 33 | for filename in file_names 34 | ] 35 | 36 | # Lista de funções de validação 37 | validacoes = [ 38 | validar_quantidade_de_linhas, 39 | validar_se_existem_colunas_a_mais, 40 | validar_se_existem_colunas_a_menos, 41 | validar_se_todas_as_colunas_estao_presentes, 42 | validar_se_todas_as_colunas_estao_presentes_na_mesma_ordem, 43 | validar_tipos_dados, 44 | ] 45 | 46 | # Execução das funções de validação 47 | for i, (filename, arquivo) in enumerate(arquivos_recebidos, start=1): 48 | log_file_name = ( 49 | f'auditoria:{filename[:-5]}-data:{time.strftime("%Y-%m-%d")}.log' 50 | ) 51 | 52 | logger.remove() 53 | logger.add( 54 | log_file_name, 55 | level='INFO', 56 | format='{time:YYYY-MM-DDTHH} | {level} | {message}', 57 | ) 58 | 59 | logger.info(f'Iniciando o processo de validação do arquivo {filename}.') 60 | 61 | resultados = [] 62 | testes_falhos = [] 63 | 64 | for idx, validacao in enumerate(validacoes, start=1): 65 | resultado, msg = validacao(excel_modelo, arquivo) 66 | 67 | if resultado: 68 | logger.info( 69 | f'Arquivo {filename} - Teste {idx}. {validacao.__name__}: {msg}' 70 | ) 71 | else: 72 | logger.error( 73 | f'Arquivo {filename} - Teste {idx}. {validacao.__name__}: {msg}' 74 | ) 75 | testes_falhos.append(idx) 76 | 77 | resultados.append(resultado) 78 | 79 | origem_excel = os.path.join(INPUT_DIR, filename) 80 | origem_log = ( 81 | log_file_name # Assume que o log foi criado no diretório atual 82 | ) 83 | 84 | if all(resultados): 85 | logger.info( 86 | f'Arquivo {filename} - Testes finalizados. Todos os testes passaram. Pode subir o {filename} pro Power BI!' 87 | ) 88 | 89 | # Mover arquivos para o diretório OUTPUT_CORRETOS 90 | destino_excel = os.path.join(OUTPUT_CORRETOS, filename) 91 | destino_log = os.path.join(OUTPUT_CORRETOS, log_file_name) 92 | 93 | shutil.move(origem_excel, destino_excel) 94 | shutil.move(origem_log, destino_log) 95 | else: 96 | testes_falhos_str = ', '.join(map(str, testes_falhos)) 97 | logger.critical( 98 | f'Arquivo {filename} - Testes {testes_falhos_str} falharam. Um ou mais testes não passaram, não subir o {filename} pro Power BI.' 99 | ) 100 | 101 | # Mover arquivos para o diretório OUTPUT_REVISAO 102 | destino_excel = os.path.join(OUTPUT_REVISAO, filename) 103 | destino_log = os.path.join(OUTPUT_REVISAO, log_file_name) 104 | 105 | shutil.move(origem_excel, destino_excel) 106 | shutil.move(origem_log, destino_log) 107 | -------------------------------------------------------------------------------- /app/validacoes/__init__.py: -------------------------------------------------------------------------------- 1 | from .colunas_estao_presentes import \ 2 | validar_se_todas_as_colunas_estao_presentes 3 | from .colunas_estao_presentes_na_mesma_ordem import \ 4 | validar_se_todas_as_colunas_estao_presentes_na_mesma_ordem 5 | from .existem_colunas_a_mais import validar_se_existem_colunas_a_mais 6 | from .existem_colunas_a_menos import validar_se_existem_colunas_a_menos 7 | from .quantidade_de_linhas import validar_quantidade_de_linhas 8 | from .tipos_dados import validar_tipos_dados 9 | -------------------------------------------------------------------------------- /app/validacoes/colunas_estao_presentes.py: -------------------------------------------------------------------------------- 1 | # Arquivo colunas_estao_presentes.py 2 | 3 | from typing import Tuple 4 | 5 | from pandas import DataFrame 6 | 7 | 8 | def validar_se_todas_as_colunas_estao_presentes( 9 | excel_modelo: DataFrame, arquivo: DataFrame 10 | ) -> Tuple[bool, str]: 11 | """ 12 | Verifica se todas as colunas do modelo estão presentes no arquivo recebido. 13 | """ 14 | if set(excel_modelo.columns) == set(arquivo.columns): 15 | return True, 'Todas as colunas estão presentes.' 16 | else: 17 | return False, 'Algumas colunas não estão presentes.' 18 | -------------------------------------------------------------------------------- /app/validacoes/colunas_estao_presentes_na_mesma_ordem.py: -------------------------------------------------------------------------------- 1 | # Arquivo colunas_estao_presentes_na_mesma_ordem.py 2 | 3 | from typing import Tuple 4 | 5 | from pandas import DataFrame 6 | 7 | 8 | def validar_se_todas_as_colunas_estao_presentes_na_mesma_ordem( 9 | excel_modelo: DataFrame, arquivo: DataFrame 10 | ) -> Tuple[bool, str]: 11 | """ 12 | Verifica se as colunas do modelo estão na mesma ordem em relação ao arquivo recebido. 13 | """ 14 | if excel_modelo.columns.equals(arquivo.columns): 15 | return True, 'As colunas estão na mesma ordem.' 16 | else: 17 | return False, 'As colunas não estão na mesma ordem.' 18 | -------------------------------------------------------------------------------- /app/validacoes/existem_colunas_a_mais.py: -------------------------------------------------------------------------------- 1 | # Arquivo existem_colunas_a_mais.py 2 | 3 | from typing import Tuple 4 | 5 | from pandas import DataFrame 6 | 7 | 8 | def validar_se_existem_colunas_a_mais( 9 | excel_modelo: DataFrame, arquivo: DataFrame 10 | ) -> Tuple[bool, str]: 11 | """ 12 | Verifica se o arquivo recebido tem colunas a mais em relação ao modelo. 13 | """ 14 | colunas_a_mais = set(arquivo.columns) - set(excel_modelo.columns) 15 | return len(colunas_a_mais) == 0, list(colunas_a_mais) 16 | -------------------------------------------------------------------------------- /app/validacoes/existem_colunas_a_menos.py: -------------------------------------------------------------------------------- 1 | # Arquivo existem_colunas_a_menos.py 2 | 3 | from typing import Tuple 4 | 5 | from pandas import DataFrame 6 | 7 | 8 | def validar_se_existem_colunas_a_menos( 9 | excel_modelo: DataFrame, arquivo: DataFrame 10 | ) -> Tuple[bool, str]: 11 | """ 12 | Verifica se o arquivo recebido tem colunas a menos em relação ao modelo. 13 | """ 14 | colunas_a_mais = set(excel_modelo.columns) - set(arquivo.columns) 15 | return len(colunas_a_mais) == 0, list(colunas_a_mais) 16 | -------------------------------------------------------------------------------- /app/validacoes/quantidade_de_linhas.py: -------------------------------------------------------------------------------- 1 | # Arquivo quantidade_de_linhas.py 2 | 3 | from typing import Tuple 4 | 5 | from pandas import DataFrame 6 | 7 | 8 | def validar_quantidade_de_linhas( 9 | excel_modelo: DataFrame, arquivo: DataFrame 10 | ) -> Tuple[bool, str]: 11 | """ 12 | Verifica se o arquivo recebido tem o mesmo número de linhas em relação ao modelo. 13 | """ 14 | num_linhas_df1 = len(excel_modelo) 15 | num_linhas_df2 = len(arquivo) 16 | return num_linhas_df1 == num_linhas_df2, num_linhas_df2 - num_linhas_df1 17 | -------------------------------------------------------------------------------- /app/validacoes/tipos_dados.py: -------------------------------------------------------------------------------- 1 | # Arquivo tipos_dados.py 2 | 3 | from typing import Tuple 4 | 5 | from pandas import DataFrame 6 | 7 | 8 | def validar_tipos_dados( 9 | excel_modelo: DataFrame, arquivo: DataFrame 10 | ) -> Tuple[bool, str]: 11 | """ 12 | Verifica se o arquivo recebido tem os mesmos datatype em relação ao modelo. 13 | """ 14 | colunas_comuns = set(excel_modelo.columns).intersection( 15 | set(arquivo.columns) 16 | ) 17 | colunas_com_tipos_diferentes = [ 18 | col 19 | for col in colunas_comuns 20 | if excel_modelo[col].dtype != arquivo[col].dtype 21 | ] 22 | return len(colunas_com_tipos_diferentes) == 0, colunas_com_tipos_diferentes 23 | -------------------------------------------------------------------------------- /data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/.DS_Store -------------------------------------------------------------------------------- /data/input/arquivo_recebido_1.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/input/arquivo_recebido_1.xlsx -------------------------------------------------------------------------------- /data/input/arquivo_recebido_2.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/input/arquivo_recebido_2.xlsx -------------------------------------------------------------------------------- /data/input/arquivo_recebido_3.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/input/arquivo_recebido_3.xlsx -------------------------------------------------------------------------------- /data/input/arquivo_recebido_4.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/input/arquivo_recebido_4.xlsx -------------------------------------------------------------------------------- /data/input/arquivo_recebido_5.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/input/arquivo_recebido_5.xlsx -------------------------------------------------------------------------------- /data/modelo/arquivo_modelo.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/data/modelo/arquivo_modelo.xlsx -------------------------------------------------------------------------------- /docs/images/antes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/docs/images/antes.png -------------------------------------------------------------------------------- /docs/images/depois.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvgalvao/ExcelStructureValidator/9a83dc6b0b51577ea588550fc77a19bbbdc95a33/docs/images/depois.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ## Descrição 2 | 3 | O Excel Structure Validator é um projeto Python destinado a validar a estrutura de arquivos Excel. Ele compara arquivos Excel recebidos com um modelo pré-definido para assegurar que os dados cumpram com os padrões estabelecidos. 4 | 5 | ## Fluxo 6 | 7 | ```mermaid 8 | flowchart LR 9 | A[Folder: Input]-->|Compara Schema| B(Folder: Modelo) 10 | B --> C{Validator} 11 | C -->|Arquivo correto| D[Folder: Output Correto] 12 | C -->|Log com detalhes| D[Folder: Output Correto] 13 | C -->|Arquivo incorreto| E[Folder: Output Incorreto] 14 | C -->|Log com detalhes| E[Folder: Output Incorreto] 15 | ``` 16 | 17 | ## Aplicação 18 | 19 | O projeto é ideal para cenários onde a qualidade e a consistência dos dados são críticas para análises subsequentes, como importações para o Power BI, análises de dados, entre outros. 20 | 21 | Antes de iniciar avalie os arquivos em excel dentro da pasta data/input e data/modelo para entender o comportamento do projeto. Para facilitar, criei arquivos simples com 4 até 6 colunas e poucas linhas, porém o conceito se aplica a qualquer modelo e/ou quantidade de colunas/linhas. 22 | 23 | ### Antes de rodar o script 24 | 25 | ![Antes](images/antes.png) 26 | 27 | ### Depois de rodar o script e com o resultado da auditoria 28 | 29 | ![Depois](images/depois.png) 30 | 31 | ## Validações 32 | 33 | São 6 validações que o nosso projeto está configurado 34 | 35 | ### ::: app.validacoes.colunas_estao_presentes_na_mesma_ordem.validar_se_todas_as_colunas_estao_presentes_na_mesma_ordem 36 | 37 | ### ::: app.validacoes.colunas_estao_presentes.validar_se_todas_as_colunas_estao_presentes 38 | 39 | ### ::: app.validacoes.existem_colunas_a_mais.validar_se_existem_colunas_a_mais 40 | 41 | ### ::: app.validacoes.existem_colunas_a_menos.validar_se_existem_colunas_a_menos 42 | 43 | ### ::: app.validacoes.quantidade_de_linhas.validar_quantidade_de_linhas 44 | 45 | ### ::: app.validacoes.tipos_dados.validar_tipos_dados 46 | 47 | Caso qualquer validação seja identificada como invalido, ele marca o arquivo como invalido. 48 | 49 | ## Tabela modelo 50 | 51 | O arquivo modelo é o arquivo Excel que deve seguir como template. Ele contém a estrutura que os arquivos Excel recebidos devem seguir. Ele deve ser colocado no diretório `data/modelo/`. 52 | 53 | | Coluna A type: Int | Coluna B type: Int | Coluna C type: Int | Coluna D type: Int | Coluna E type: Int | 54 | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | 55 | | 44 | 47 | 64 | 67 | 67 | 56 | | 9 | 83 | 21 | 36 | 87 | 57 | | 70 | 88 | 88 | 12 | 58 | 58 | | 65 | 39 | 87 | 46 | 88 | 59 | | 81 | 37 | 25 | 77 | 72 | 60 | | 9 | 20 | 80 | 69 | 79 | 61 | | 47 | 64 | 82 | 99 | 88 | 62 | | 49 | 29 | 19 | 19 | 14 | 63 | | 39 | 32 | 65 | 9 | 57 | 64 | | 32 | 31 | 74 | 23 | 35 | 65 | 66 | 67 | ## Folder input 68 | 69 | No folder input você encontra 5 arquivos, cada um deles com uma divergencia do Modelo 70 | 71 | ### Arquivo 1 72 | 73 | O arquivo 1 é um arquivo Excel que contém a **estrutura correta.** 74 | 75 | | Coluna A type: Int | Coluna B type: Int | Coluna C type: Int | Coluna D type: Int | Coluna E type: Int | 76 | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | 77 | | 75 | 55 | 28 | 34 | 0 | 78 | | 0 | 36 | 53 | 5 | 38 | 79 | | 17 | 79 | 4 | 42 | 58 | 80 | | 31 | 1 | 65 | 41 | 57 | 81 | | 35 | 11 | 46 | 82 | 91 | 82 | | 0 | 14 | 99 | 53 | 12 | 83 | | 42 | 84 | 75 | 68 | 6 | 84 | | 68 | 47 | 3 | 76 | 52 | 85 | | 78 | 15 | 20 | 99 | 58 | 86 | | 23 | 79 | 13 | 85 | 48 | 87 | 88 | 89 | ### Arquivo 2 90 | 91 | O arquivo 2 é um arquivo Excel que contém a estrutura incorreta, **apresenta uma coluna a menos.** 92 | 93 | | Coluna A type: Int | Coluna B type: Int | Coluna C type: Int | Coluna D type: Int | 94 | | ------------------ | ------------------ | ------------------ | ------------------ | 95 | | 49 | 69 | 41 | 35 | 96 | | 64 | 95 | 69 | 94 | 97 | | 0 | 50 | 36 | 34 | 98 | | 48 | 93 | 3 | 98 | 99 | | 42 | 77 | 21 | 73 | 100 | | 0 | 10 | 43 | 58 | 101 | | 23 | 59 | 2 | 98 | 102 | | 62 | 35 | 94 | 67 | 103 | | 82 | 46 | 99 | 20 | 104 | | 81 | 50 | 27 | 14 | 105 | 106 | 107 | ### Arquivo 3 108 | 109 | O arquivo 3 é um arquivo Excel que contém a estrutura incorreta, **apresenta uma coluna a mais, coluna f.** 110 | 111 | | Coluna A type: Int | Coluna B type: Int | Coluna C type: Int | Coluna D type: Int | Coluna E type: Int | Coluna F type: Int | 112 | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | 113 | | 41 | 58 | 65 | 36 | 10 | 86 | 114 | | 43 | 11 | 2 | 51 | 80 | 32 | 115 | | 54 | 0 | 38 | 19 | 46 | 42 | 116 | | 56 | 60 | 77 | 30 | 24 | 2 | 117 | | 3 | 94 | 98 | 13 | 40 | 72 | 118 | | 19 | 95 | 72 | 26 | 66 | 52 | 119 | | 67 | 61 | 14 | 96 | 4 | 67 | 120 | | 11 | 86 | 77 | 75 | 56 | 16 | 121 | | 24 | 29 | 21 | 25 | 80 | 60 | 122 | | 61 | 83 | 33 | 32 | 70 | 85 | 123 | 124 | 125 | ### Arquivo 4 126 | 127 | O arquivo 4 é um arquivo Excel que contém a estrutura incorreta, **a ordem das colunas está diferente.** 128 | 129 | | Coluna A type: Int | Coluna B type: Int | Coluna C type: Int | Coluna E type: Int | Coluna D type: Int | 130 | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | 131 | | 31 | 13 | 71 | 56 | 24 | 132 | | 79 | 41 | 18 | 40 | 54 | 133 | | 79 | 11 | 38 | 93 | 1 | 134 | | 95 | 44 | 88 | 24 | 67 | 135 | | 82 | 3 | 76 | 35 | 86 | 136 | | 61 | 69 | 87 | 43 | 32 | 137 | | 11 | 84 | 10 | 54 | 37 | 138 | | 28 | 2 | 27 | 83 | 89 | 139 | | 23 | 53 | 51 | 46 | 20 | 140 | | 53 | 29 | 67 | 35 | 39 | 141 | 142 | 143 | ### Arquivo 5 144 | 145 | O arquivo 5 é um arquivo Excel que contém a estrutura incorreta, o número de linhas está diferente. **A linha 12 foi adicionada.** 146 | 147 | | Coluna A type: Int | Coluna B type: Int | Coluna C type: Int | Coluna D type: Int | Coluna E type: Int | 148 | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | 149 | | 9 | 73 | 41 | 23 | 3 | 150 | | 46 | 90 | 50 | 3 | 31 | 151 | | 9 | 10 | 27 | 45 | 71 | 152 | | 39 | 61 | 85 | 97 | 44 | 153 | | 34 | 34 | 88 | 33 | 5 | 154 | | 36 | 0 | 75 | 34 | 69 | 155 | | 53 | 80 | 62 | 8 | 61 | 156 | | 1 | 81 | 35 | 91 | 40 | 157 | | 36 | 48 | 25 | 67 | 35 | 158 | | 66 | 43 | 24 | 4 | 12 | 159 | | 30 | 29 | 33 | 18 | 17 | 160 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Excel Structure Validator 2 | theme: 3 | name: material 4 | palette: 5 | primary: deep blue 6 | language: pt 7 | 8 | repo_name: "lvgalvao/ExcelStructureValidator" 9 | repo_url: "https://github.com/lvgalvao/ExcelStructureValidator" 10 | 11 | markdown_extensions: 12 | - pymdownx.superfences: 13 | custom_fences: 14 | - name: mermaid 15 | class: mermaid 16 | 17 | plugins: 18 | - search 19 | - mkdocstrings: 20 | default_handler: python 21 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "babel" 5 | version = "2.12.1" 6 | description = "Internationalization utilities" 7 | optional = false 8 | python-versions = ">=3.7" 9 | files = [ 10 | {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, 11 | {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, 12 | ] 13 | 14 | [[package]] 15 | name = "black" 16 | version = "22.1.0" 17 | description = "The uncompromising code formatter." 18 | optional = false 19 | python-versions = ">=3.6.2" 20 | files = [ 21 | {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, 22 | {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, 23 | {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, 24 | {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, 25 | {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, 26 | {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, 27 | {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, 28 | {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, 29 | {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, 30 | {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, 31 | {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, 32 | {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, 33 | {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, 34 | {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, 35 | {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, 36 | {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, 37 | {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, 38 | {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, 39 | {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, 40 | {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, 41 | {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, 42 | {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, 43 | {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, 44 | ] 45 | 46 | [package.dependencies] 47 | click = ">=8.0.0" 48 | mypy-extensions = ">=0.4.3" 49 | pathspec = ">=0.9.0" 50 | platformdirs = ">=2" 51 | tomli = ">=1.1.0" 52 | 53 | [package.extras] 54 | colorama = ["colorama (>=0.4.3)"] 55 | d = ["aiohttp (>=3.7.4)"] 56 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 57 | uvloop = ["uvloop (>=0.15.2)"] 58 | 59 | [[package]] 60 | name = "blue" 61 | version = "0.9.1" 62 | description = "Blue -- Some folks like black but I prefer blue." 63 | optional = false 64 | python-versions = "*" 65 | files = [ 66 | {file = "blue-0.9.1-py3-none-any.whl", hash = "sha256:037742c072c58a2ff024f59fb9164257b907f97f8f862008db3b013d1f27cc22"}, 67 | {file = "blue-0.9.1.tar.gz", hash = "sha256:76b4f26884a8425042356601d80773db6e0e14bebaa7a59d7c54bf8cef2e2af5"}, 68 | ] 69 | 70 | [package.dependencies] 71 | black = "22.1.0" 72 | flake8 = ">=3.8,<5.0.0" 73 | 74 | [[package]] 75 | name = "certifi" 76 | version = "2023.7.22" 77 | description = "Python package for providing Mozilla's CA Bundle." 78 | optional = false 79 | python-versions = ">=3.6" 80 | files = [ 81 | {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, 82 | {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, 83 | ] 84 | 85 | [[package]] 86 | name = "charset-normalizer" 87 | version = "3.2.0" 88 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 89 | optional = false 90 | python-versions = ">=3.7.0" 91 | files = [ 92 | {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, 93 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, 94 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, 95 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, 96 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, 97 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, 98 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, 99 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, 100 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, 101 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, 102 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, 103 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, 104 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, 105 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, 106 | {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, 107 | {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, 108 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, 109 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, 110 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, 111 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, 112 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, 113 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, 114 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, 115 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, 116 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, 117 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, 118 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, 119 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, 120 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, 121 | {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, 122 | {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, 123 | {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, 124 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, 125 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, 126 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, 127 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, 128 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, 129 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, 130 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, 131 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, 132 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, 133 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, 134 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, 135 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, 136 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, 137 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, 138 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, 139 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, 140 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, 141 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, 142 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, 143 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, 144 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, 145 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, 146 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, 147 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, 148 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, 149 | {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, 150 | {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, 151 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, 152 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, 153 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, 154 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, 155 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, 156 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, 157 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, 158 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, 159 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, 160 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, 161 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, 162 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, 163 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, 164 | {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, 165 | {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, 166 | {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, 167 | ] 168 | 169 | [[package]] 170 | name = "click" 171 | version = "8.1.7" 172 | description = "Composable command line interface toolkit" 173 | optional = false 174 | python-versions = ">=3.7" 175 | files = [ 176 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 177 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 178 | ] 179 | 180 | [package.dependencies] 181 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 182 | 183 | [[package]] 184 | name = "colorama" 185 | version = "0.4.6" 186 | description = "Cross-platform colored terminal text." 187 | optional = false 188 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 189 | files = [ 190 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 191 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 192 | ] 193 | 194 | [[package]] 195 | name = "et-xmlfile" 196 | version = "1.1.0" 197 | description = "An implementation of lxml.xmlfile for the standard library" 198 | optional = false 199 | python-versions = ">=3.6" 200 | files = [ 201 | {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, 202 | {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, 203 | ] 204 | 205 | [[package]] 206 | name = "flake8" 207 | version = "4.0.1" 208 | description = "the modular source code checker: pep8 pyflakes and co" 209 | optional = false 210 | python-versions = ">=3.6" 211 | files = [ 212 | {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, 213 | {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, 214 | ] 215 | 216 | [package.dependencies] 217 | mccabe = ">=0.6.0,<0.7.0" 218 | pycodestyle = ">=2.8.0,<2.9.0" 219 | pyflakes = ">=2.4.0,<2.5.0" 220 | 221 | [[package]] 222 | name = "ghp-import" 223 | version = "2.1.0" 224 | description = "Copy your docs directly to the gh-pages branch." 225 | optional = false 226 | python-versions = "*" 227 | files = [ 228 | {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, 229 | {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, 230 | ] 231 | 232 | [package.dependencies] 233 | python-dateutil = ">=2.8.1" 234 | 235 | [package.extras] 236 | dev = ["flake8", "markdown", "twine", "wheel"] 237 | 238 | [[package]] 239 | name = "griffe" 240 | version = "0.36.2" 241 | description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." 242 | optional = false 243 | python-versions = ">=3.8" 244 | files = [ 245 | {file = "griffe-0.36.2-py3-none-any.whl", hash = "sha256:ba71895a3f5f606b18dcd950e8a1f8e7332a37f90f24caeb002546593f2e0eee"}, 246 | {file = "griffe-0.36.2.tar.gz", hash = "sha256:333ade7932bb9096781d83092602625dfbfe220e87a039d2801259a1bd41d1c2"}, 247 | ] 248 | 249 | [package.dependencies] 250 | colorama = ">=0.4" 251 | 252 | [[package]] 253 | name = "idna" 254 | version = "3.4" 255 | description = "Internationalized Domain Names in Applications (IDNA)" 256 | optional = false 257 | python-versions = ">=3.5" 258 | files = [ 259 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 260 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 261 | ] 262 | 263 | [[package]] 264 | name = "isort" 265 | version = "5.12.0" 266 | description = "A Python utility / library to sort Python imports." 267 | optional = false 268 | python-versions = ">=3.8.0" 269 | files = [ 270 | {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, 271 | {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, 272 | ] 273 | 274 | [package.extras] 275 | colors = ["colorama (>=0.4.3)"] 276 | pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] 277 | plugins = ["setuptools"] 278 | requirements-deprecated-finder = ["pip-api", "pipreqs"] 279 | 280 | [[package]] 281 | name = "jinja2" 282 | version = "3.1.2" 283 | description = "A very fast and expressive template engine." 284 | optional = false 285 | python-versions = ">=3.7" 286 | files = [ 287 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 288 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 289 | ] 290 | 291 | [package.dependencies] 292 | MarkupSafe = ">=2.0" 293 | 294 | [package.extras] 295 | i18n = ["Babel (>=2.7)"] 296 | 297 | [[package]] 298 | name = "loguru" 299 | version = "0.7.0" 300 | description = "Python logging made (stupidly) simple" 301 | optional = false 302 | python-versions = ">=3.5" 303 | files = [ 304 | {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, 305 | {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, 306 | ] 307 | 308 | [package.dependencies] 309 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} 310 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} 311 | 312 | [package.extras] 313 | dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] 314 | 315 | [[package]] 316 | name = "makefile" 317 | version = "1.1.0" 318 | description = "makefile is python package to read makefile variables" 319 | optional = false 320 | python-versions = "*" 321 | files = [ 322 | {file = "makefile-1.1.0-py3-none-any.whl", hash = "sha256:0ce3c081041b8e933dd1a60ed54e9c12a1296a98f6f2c3808a375778b760d02d"}, 323 | {file = "makefile-1.1.0.tar.gz", hash = "sha256:e311d56f4535793f48416e0d7134f4d77c7633ee10bed8e00f0dc2962cecff66"}, 324 | ] 325 | 326 | [[package]] 327 | name = "markdown" 328 | version = "3.4.4" 329 | description = "Python implementation of John Gruber's Markdown." 330 | optional = false 331 | python-versions = ">=3.7" 332 | files = [ 333 | {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, 334 | {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, 335 | ] 336 | 337 | [package.extras] 338 | docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] 339 | testing = ["coverage", "pyyaml"] 340 | 341 | [[package]] 342 | name = "markupsafe" 343 | version = "2.1.3" 344 | description = "Safely add untrusted strings to HTML/XML markup." 345 | optional = false 346 | python-versions = ">=3.7" 347 | files = [ 348 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, 349 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, 350 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, 351 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, 352 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, 353 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, 354 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, 355 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, 356 | {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, 357 | {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, 358 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, 359 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, 360 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, 361 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, 362 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, 363 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, 364 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, 365 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, 366 | {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, 367 | {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, 368 | {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, 369 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, 370 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, 371 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, 372 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, 373 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, 374 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, 375 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, 376 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, 377 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, 378 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, 379 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, 380 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, 381 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, 382 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, 383 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, 384 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, 385 | {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, 386 | {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, 387 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, 388 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, 389 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, 390 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, 391 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, 392 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, 393 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, 394 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, 395 | {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, 396 | {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, 397 | {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, 398 | ] 399 | 400 | [[package]] 401 | name = "mccabe" 402 | version = "0.6.1" 403 | description = "McCabe checker, plugin for flake8" 404 | optional = false 405 | python-versions = "*" 406 | files = [ 407 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 408 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 409 | ] 410 | 411 | [[package]] 412 | name = "mergedeep" 413 | version = "1.3.4" 414 | description = "A deep merge function for 🐍." 415 | optional = false 416 | python-versions = ">=3.6" 417 | files = [ 418 | {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, 419 | {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, 420 | ] 421 | 422 | [[package]] 423 | name = "mkdocs" 424 | version = "1.5.3" 425 | description = "Project documentation with Markdown." 426 | optional = false 427 | python-versions = ">=3.7" 428 | files = [ 429 | {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, 430 | {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, 431 | ] 432 | 433 | [package.dependencies] 434 | click = ">=7.0" 435 | colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} 436 | ghp-import = ">=1.0" 437 | jinja2 = ">=2.11.1" 438 | markdown = ">=3.2.1" 439 | markupsafe = ">=2.0.1" 440 | mergedeep = ">=1.3.4" 441 | packaging = ">=20.5" 442 | pathspec = ">=0.11.1" 443 | platformdirs = ">=2.2.0" 444 | pyyaml = ">=5.1" 445 | pyyaml-env-tag = ">=0.1" 446 | watchdog = ">=2.0" 447 | 448 | [package.extras] 449 | i18n = ["babel (>=2.9.0)"] 450 | min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] 451 | 452 | [[package]] 453 | name = "mkdocs-autorefs" 454 | version = "0.5.0" 455 | description = "Automatically link across pages in MkDocs." 456 | optional = false 457 | python-versions = ">=3.8" 458 | files = [ 459 | {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, 460 | {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, 461 | ] 462 | 463 | [package.dependencies] 464 | Markdown = ">=3.3" 465 | mkdocs = ">=1.1" 466 | 467 | [[package]] 468 | name = "mkdocs-material" 469 | version = "9.4.1" 470 | description = "Documentation that simply works" 471 | optional = false 472 | python-versions = ">=3.8" 473 | files = [ 474 | {file = "mkdocs_material-9.4.1-py3-none-any.whl", hash = "sha256:27e74b5b14b8b797074759beb85876ca6425e60c78f70e76be0c209627eb5199"}, 475 | {file = "mkdocs_material-9.4.1.tar.gz", hash = "sha256:1495273cfce13ab52bcfcc49fa6fac779ae75818dfe566ed149d9d3aea7d8439"}, 476 | ] 477 | 478 | [package.dependencies] 479 | babel = ">=2.10,<3.0" 480 | colorama = ">=0.4,<1.0" 481 | jinja2 = ">=3.0,<4.0" 482 | markdown = ">=3.2,<4.0" 483 | mkdocs = ">=1.5.3,<2.0" 484 | mkdocs-material-extensions = ">=1.2,<2.0" 485 | paginate = ">=0.5,<1.0" 486 | pygments = ">=2.16,<3.0" 487 | pymdown-extensions = ">=10.2,<11.0" 488 | regex = ">=2022.4,<2023.0" 489 | requests = ">=2.26,<3.0" 490 | 491 | [package.extras] 492 | git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] 493 | imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] 494 | recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] 495 | 496 | [[package]] 497 | name = "mkdocs-material-extensions" 498 | version = "1.2" 499 | description = "Extension pack for Python Markdown and MkDocs Material." 500 | optional = false 501 | python-versions = ">=3.7" 502 | files = [ 503 | {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, 504 | {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, 505 | ] 506 | 507 | [[package]] 508 | name = "mkdocstrings" 509 | version = "0.23.0" 510 | description = "Automatic documentation from sources, for MkDocs." 511 | optional = false 512 | python-versions = ">=3.8" 513 | files = [ 514 | {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, 515 | {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, 516 | ] 517 | 518 | [package.dependencies] 519 | Jinja2 = ">=2.11.1" 520 | Markdown = ">=3.3" 521 | MarkupSafe = ">=1.1" 522 | mkdocs = ">=1.2" 523 | mkdocs-autorefs = ">=0.3.1" 524 | pymdown-extensions = ">=6.3" 525 | 526 | [package.extras] 527 | crystal = ["mkdocstrings-crystal (>=0.3.4)"] 528 | python = ["mkdocstrings-python (>=0.5.2)"] 529 | python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] 530 | 531 | [[package]] 532 | name = "mkdocstrings-python" 533 | version = "1.7.0" 534 | description = "A Python handler for mkdocstrings." 535 | optional = false 536 | python-versions = ">=3.8" 537 | files = [ 538 | {file = "mkdocstrings_python-1.7.0-py3-none-any.whl", hash = "sha256:85c5f009a5a0ebb6076b7818c82a2bb0eebd0b54662628fa8b25ee14a6207951"}, 539 | {file = "mkdocstrings_python-1.7.0.tar.gz", hash = "sha256:5dac2712bd38a3ff0812b8650a68b232601d1474091b380a8b5bc102c8c0d80a"}, 540 | ] 541 | 542 | [package.dependencies] 543 | griffe = ">=0.35" 544 | mkdocstrings = ">=0.20" 545 | 546 | [[package]] 547 | name = "mslex" 548 | version = "0.3.0" 549 | description = "shlex for windows" 550 | optional = false 551 | python-versions = ">=3.5" 552 | files = [ 553 | {file = "mslex-0.3.0-py2.py3-none-any.whl", hash = "sha256:380cb14abf8fabf40e56df5c8b21a6d533dc5cbdcfe42406bbf08dda8f42e42a"}, 554 | {file = "mslex-0.3.0.tar.gz", hash = "sha256:4a1ac3f25025cad78ad2fe499dd16d42759f7a3801645399cce5c404415daa97"}, 555 | ] 556 | 557 | [[package]] 558 | name = "mypy-extensions" 559 | version = "1.0.0" 560 | description = "Type system extensions for programs checked with the mypy type checker." 561 | optional = false 562 | python-versions = ">=3.5" 563 | files = [ 564 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 565 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 566 | ] 567 | 568 | [[package]] 569 | name = "numpy" 570 | version = "1.25.2" 571 | description = "Fundamental package for array computing in Python" 572 | optional = false 573 | python-versions = ">=3.9" 574 | files = [ 575 | {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, 576 | {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, 577 | {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, 578 | {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, 579 | {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, 580 | {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, 581 | {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, 582 | {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, 583 | {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, 584 | {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, 585 | {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, 586 | {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, 587 | {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, 588 | {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, 589 | {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, 590 | {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, 591 | {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, 592 | {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, 593 | {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, 594 | {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, 595 | {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, 596 | {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, 597 | {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, 598 | {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, 599 | {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, 600 | ] 601 | 602 | [[package]] 603 | name = "openpyxl" 604 | version = "3.1.2" 605 | description = "A Python library to read/write Excel 2010 xlsx/xlsm files" 606 | optional = false 607 | python-versions = ">=3.6" 608 | files = [ 609 | {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, 610 | {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, 611 | ] 612 | 613 | [package.dependencies] 614 | et-xmlfile = "*" 615 | 616 | [[package]] 617 | name = "packaging" 618 | version = "23.1" 619 | description = "Core utilities for Python packages" 620 | optional = false 621 | python-versions = ">=3.7" 622 | files = [ 623 | {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, 624 | {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, 625 | ] 626 | 627 | [[package]] 628 | name = "paginate" 629 | version = "0.5.6" 630 | description = "Divides large result sets into pages for easier browsing" 631 | optional = false 632 | python-versions = "*" 633 | files = [ 634 | {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, 635 | ] 636 | 637 | [[package]] 638 | name = "pandas" 639 | version = "2.0.3" 640 | description = "Powerful data structures for data analysis, time series, and statistics" 641 | optional = false 642 | python-versions = ">=3.8" 643 | files = [ 644 | {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, 645 | {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, 646 | {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, 647 | {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, 648 | {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, 649 | {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, 650 | {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, 651 | {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, 652 | {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, 653 | {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, 654 | {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, 655 | {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, 656 | {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, 657 | {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, 658 | {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, 659 | {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, 660 | {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, 661 | {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, 662 | {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, 663 | {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, 664 | {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, 665 | {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, 666 | {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, 667 | {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, 668 | {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, 669 | ] 670 | 671 | [package.dependencies] 672 | numpy = [ 673 | {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, 674 | {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, 675 | ] 676 | python-dateutil = ">=2.8.2" 677 | pytz = ">=2020.1" 678 | tzdata = ">=2022.1" 679 | 680 | [package.extras] 681 | all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] 682 | aws = ["s3fs (>=2021.08.0)"] 683 | clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] 684 | compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] 685 | computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] 686 | excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] 687 | feather = ["pyarrow (>=7.0.0)"] 688 | fss = ["fsspec (>=2021.07.0)"] 689 | gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] 690 | hdf5 = ["tables (>=3.6.1)"] 691 | html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] 692 | mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] 693 | output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] 694 | parquet = ["pyarrow (>=7.0.0)"] 695 | performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] 696 | plot = ["matplotlib (>=3.6.1)"] 697 | postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] 698 | spss = ["pyreadstat (>=1.1.2)"] 699 | sql-other = ["SQLAlchemy (>=1.4.16)"] 700 | test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] 701 | xml = ["lxml (>=4.6.3)"] 702 | 703 | [[package]] 704 | name = "pathspec" 705 | version = "0.11.2" 706 | description = "Utility library for gitignore style pattern matching of file paths." 707 | optional = false 708 | python-versions = ">=3.7" 709 | files = [ 710 | {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, 711 | {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, 712 | ] 713 | 714 | [[package]] 715 | name = "platformdirs" 716 | version = "3.10.0" 717 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 718 | optional = false 719 | python-versions = ">=3.7" 720 | files = [ 721 | {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, 722 | {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, 723 | ] 724 | 725 | [package.extras] 726 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] 727 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] 728 | 729 | [[package]] 730 | name = "psutil" 731 | version = "5.9.5" 732 | description = "Cross-platform lib for process and system monitoring in Python." 733 | optional = false 734 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 735 | files = [ 736 | {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, 737 | {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, 738 | {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, 739 | {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, 740 | {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, 741 | {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, 742 | {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, 743 | {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, 744 | {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, 745 | {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, 746 | {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, 747 | {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, 748 | {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, 749 | {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, 750 | ] 751 | 752 | [package.extras] 753 | test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] 754 | 755 | [[package]] 756 | name = "pycodestyle" 757 | version = "2.8.0" 758 | description = "Python style guide checker" 759 | optional = false 760 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 761 | files = [ 762 | {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, 763 | {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, 764 | ] 765 | 766 | [[package]] 767 | name = "pyflakes" 768 | version = "2.4.0" 769 | description = "passive checker of Python programs" 770 | optional = false 771 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 772 | files = [ 773 | {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, 774 | {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, 775 | ] 776 | 777 | [[package]] 778 | name = "pygments" 779 | version = "2.16.1" 780 | description = "Pygments is a syntax highlighting package written in Python." 781 | optional = false 782 | python-versions = ">=3.7" 783 | files = [ 784 | {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, 785 | {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, 786 | ] 787 | 788 | [package.extras] 789 | plugins = ["importlib-metadata"] 790 | 791 | [[package]] 792 | name = "pymdown-extensions" 793 | version = "10.3" 794 | description = "Extension pack for Python Markdown." 795 | optional = false 796 | python-versions = ">=3.8" 797 | files = [ 798 | {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, 799 | {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, 800 | ] 801 | 802 | [package.dependencies] 803 | markdown = ">=3.2" 804 | pyyaml = "*" 805 | 806 | [package.extras] 807 | extra = ["pygments (>=2.12)"] 808 | 809 | [[package]] 810 | name = "python-dateutil" 811 | version = "2.8.2" 812 | description = "Extensions to the standard Python datetime module" 813 | optional = false 814 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 815 | files = [ 816 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 817 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 818 | ] 819 | 820 | [package.dependencies] 821 | six = ">=1.5" 822 | 823 | [[package]] 824 | name = "pytz" 825 | version = "2023.3" 826 | description = "World timezone definitions, modern and historical" 827 | optional = false 828 | python-versions = "*" 829 | files = [ 830 | {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, 831 | {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, 832 | ] 833 | 834 | [[package]] 835 | name = "pyyaml" 836 | version = "6.0.1" 837 | description = "YAML parser and emitter for Python" 838 | optional = false 839 | python-versions = ">=3.6" 840 | files = [ 841 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 842 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 843 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 844 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 845 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 846 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 847 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 848 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 849 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 850 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 851 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 852 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 853 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 854 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 855 | {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, 856 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, 857 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, 858 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, 859 | {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, 860 | {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, 861 | {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, 862 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, 863 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, 864 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, 865 | {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, 866 | {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, 867 | {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, 868 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, 869 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, 870 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, 871 | {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, 872 | {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, 873 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, 874 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, 875 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, 876 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, 877 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, 878 | {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, 879 | {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, 880 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 881 | ] 882 | 883 | [[package]] 884 | name = "pyyaml-env-tag" 885 | version = "0.1" 886 | description = "A custom YAML tag for referencing environment variables in YAML files. " 887 | optional = false 888 | python-versions = ">=3.6" 889 | files = [ 890 | {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, 891 | {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, 892 | ] 893 | 894 | [package.dependencies] 895 | pyyaml = "*" 896 | 897 | [[package]] 898 | name = "regex" 899 | version = "2022.10.31" 900 | description = "Alternative regular expression module, to replace re." 901 | optional = false 902 | python-versions = ">=3.6" 903 | files = [ 904 | {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, 905 | {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, 906 | {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, 907 | {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, 908 | {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, 909 | {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, 910 | {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, 911 | {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, 912 | {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, 913 | {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, 914 | {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, 915 | {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, 916 | {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, 917 | {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, 918 | {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, 919 | {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, 920 | {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, 921 | {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, 922 | {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, 923 | {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, 924 | {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, 925 | {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, 926 | {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, 927 | {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, 928 | {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, 929 | {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, 930 | {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, 931 | {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, 932 | {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, 933 | {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, 934 | {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, 935 | {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, 936 | {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, 937 | {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, 938 | {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, 939 | {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, 940 | {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, 941 | {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, 942 | {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, 943 | {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, 944 | {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, 945 | {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, 946 | {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, 947 | {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, 948 | {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, 949 | {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, 950 | {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, 951 | {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, 952 | {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, 953 | {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, 954 | {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, 955 | {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, 956 | {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, 957 | {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, 958 | {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, 959 | {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, 960 | {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, 961 | {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, 962 | {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, 963 | {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, 964 | {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, 965 | {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, 966 | {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, 967 | {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, 968 | {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, 969 | {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, 970 | {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, 971 | {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, 972 | {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, 973 | {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, 974 | {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, 975 | {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, 976 | {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, 977 | {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, 978 | {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, 979 | {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, 980 | {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, 981 | {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, 982 | {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, 983 | {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, 984 | {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, 985 | {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, 986 | {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, 987 | {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, 988 | {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, 989 | {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, 990 | {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, 991 | {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, 992 | ] 993 | 994 | [[package]] 995 | name = "requests" 996 | version = "2.31.0" 997 | description = "Python HTTP for Humans." 998 | optional = false 999 | python-versions = ">=3.7" 1000 | files = [ 1001 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, 1002 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, 1003 | ] 1004 | 1005 | [package.dependencies] 1006 | certifi = ">=2017.4.17" 1007 | charset-normalizer = ">=2,<4" 1008 | idna = ">=2.5,<4" 1009 | urllib3 = ">=1.21.1,<3" 1010 | 1011 | [package.extras] 1012 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1013 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1014 | 1015 | [[package]] 1016 | name = "six" 1017 | version = "1.16.0" 1018 | description = "Python 2 and 3 compatibility utilities" 1019 | optional = false 1020 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1021 | files = [ 1022 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1023 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "taskipy" 1028 | version = "1.12.0" 1029 | description = "tasks runner for python projects" 1030 | optional = false 1031 | python-versions = ">=3.6,<4.0" 1032 | files = [ 1033 | {file = "taskipy-1.12.0-py3-none-any.whl", hash = "sha256:38306fbc952a7ca314b8f842a74b2fc38535cdab21031fe89e714a83e6259a84"}, 1034 | {file = "taskipy-1.12.0.tar.gz", hash = "sha256:e3dd7c53f7c9c4fd17dc908b1037f545afc452907eb0953b84e91c0a9a9d809d"}, 1035 | ] 1036 | 1037 | [package.dependencies] 1038 | colorama = ">=0.4.4,<0.5.0" 1039 | mslex = {version = ">=0.3.0,<0.4.0", markers = "sys_platform == \"win32\""} 1040 | psutil = ">=5.7.2,<6.0.0" 1041 | tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} 1042 | 1043 | [[package]] 1044 | name = "tomli" 1045 | version = "2.0.1" 1046 | description = "A lil' TOML parser" 1047 | optional = false 1048 | python-versions = ">=3.7" 1049 | files = [ 1050 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 1051 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "tzdata" 1056 | version = "2023.3" 1057 | description = "Provider of IANA time zone data" 1058 | optional = false 1059 | python-versions = ">=2" 1060 | files = [ 1061 | {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, 1062 | {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "urllib3" 1067 | version = "2.0.5" 1068 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1069 | optional = false 1070 | python-versions = ">=3.7" 1071 | files = [ 1072 | {file = "urllib3-2.0.5-py3-none-any.whl", hash = "sha256:ef16afa8ba34a1f989db38e1dbbe0c302e4289a47856990d0682e374563ce35e"}, 1073 | {file = "urllib3-2.0.5.tar.gz", hash = "sha256:13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594"}, 1074 | ] 1075 | 1076 | [package.extras] 1077 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 1078 | secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] 1079 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 1080 | zstd = ["zstandard (>=0.18.0)"] 1081 | 1082 | [[package]] 1083 | name = "watchdog" 1084 | version = "3.0.0" 1085 | description = "Filesystem events monitoring" 1086 | optional = false 1087 | python-versions = ">=3.7" 1088 | files = [ 1089 | {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, 1090 | {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, 1091 | {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, 1092 | {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, 1093 | {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, 1094 | {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, 1095 | {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, 1096 | {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, 1097 | {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, 1098 | {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, 1099 | {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, 1100 | {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, 1101 | {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, 1102 | {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, 1103 | {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, 1104 | {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, 1105 | {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, 1106 | {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, 1107 | {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, 1108 | {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, 1109 | {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, 1110 | {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, 1111 | {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, 1112 | {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, 1113 | {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, 1114 | {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, 1115 | {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, 1116 | ] 1117 | 1118 | [package.extras] 1119 | watchmedo = ["PyYAML (>=3.10)"] 1120 | 1121 | [[package]] 1122 | name = "win32-setctime" 1123 | version = "1.1.0" 1124 | description = "A small Python utility to set file creation time on Windows" 1125 | optional = false 1126 | python-versions = ">=3.5" 1127 | files = [ 1128 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 1129 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 1130 | ] 1131 | 1132 | [package.extras] 1133 | dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] 1134 | 1135 | [metadata] 1136 | lock-version = "2.0" 1137 | python-versions = "3.11.3" 1138 | content-hash = "26895e61c58a89ff2f074047b88c33a453b323d05a624cd8b6501d5cc489991b" 1139 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "excelstructurevalidator" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Luciano Filho "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "3.11.3" 10 | pandas = "^2.0.3" 11 | openpyxl = "^3.1.2" 12 | taskipy = "^1.12.0" 13 | blue = "^0.9.1" 14 | isort = "^5.12.0" 15 | loguru = "^0.7.0" 16 | mkdocs = "^1.5.3" 17 | makefile = "^1.1.0" 18 | pymdown-extensions = "^10.3" 19 | mkdocs-material = "^9.4.1" 20 | pygments = "^2.16.1" 21 | mkdocstrings-python = "^1.7.0" 22 | 23 | 24 | [build-system] 25 | requires = ["poetry-core"] 26 | build-backend = "poetry.core.masonry.api" 27 | 28 | [tool.taskipy.tasks] 29 | lint = "blue . && isort ." 30 | run = "python3 -m app.pipeline" 31 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | black==22.1.0 2 | blue==0.9.1 3 | click==8.1.7 4 | colorama==0.4.6 5 | et-xmlfile==1.1.0 6 | flake8==4.0.1 7 | isort==5.12.0 8 | loguru==0.7.0 9 | mccabe==0.6.1 10 | mypy-extensions==1.0.0 11 | numpy==1.25.2 12 | openpyxl==3.1.2 13 | pandas==2.0.3 14 | pathspec==0.11.2 15 | platformdirs==3.10.0 16 | psutil==5.9.5 17 | pycodestyle==2.8.0 18 | pyflakes==2.4.0 19 | python-dateutil==2.8.2 20 | pytz==2023.3 21 | six==1.16.0 22 | taskipy==1.12.0 23 | tomli==2.0.1 24 | tzdata==2023.3 25 | Babel==2.12.1 26 | black==22.1.0 27 | blue==0.9.1 28 | certifi==2023.7.22 29 | charset-normalizer==3.2.0 30 | click==8.1.7 31 | colorama==0.4.6 32 | et-xmlfile==1.1.0 33 | flake8==4.0.1 34 | ghp-import==2.1.0 35 | griffe==0.36.2 36 | idna==3.4 37 | isort==5.12.0 38 | Jinja2==3.1.2 39 | loguru==0.7.0 40 | makefile==1.1.0 41 | Markdown==3.4.4 42 | MarkupSafe==2.1.3 43 | mccabe==0.6.1 44 | mergedeep==1.3.4 45 | mkdocs==1.5.3 46 | mkdocs-autorefs==0.5.0 47 | mkdocs-material==9.4.1 48 | mkdocs-material-extensions==1.2 49 | mkdocstrings==0.23.0 50 | mkdocstrings-python==1.7.0 51 | mypy-extensions==1.0.0 52 | numpy==1.25.2 53 | openpyxl==3.1.2 54 | packaging==23.1 55 | paginate==0.5.6 56 | pandas==2.0.3 57 | pathspec==0.11.2 58 | platformdirs==3.10.0 59 | psutil==5.9.5 60 | pycodestyle==2.8.0 61 | pyflakes==2.4.0 62 | Pygments==2.16.1 63 | pymdown-extensions==10.3 64 | python-dateutil==2.8.2 65 | pytz==2023.3 66 | PyYAML==6.0.1 67 | pyyaml_env_tag==0.1 68 | regex==2022.10.31 69 | requests==2.31.0 70 | six==1.16.0 71 | taskipy==1.12.0 72 | tomli==2.0.1 73 | tzdata==2023.3 74 | urllib3==2.0.5 75 | watchdog==3.0.0 76 | --------------------------------------------------------------------------------