├── docs ├── changelog.md ├── conduct.md ├── contributing.md ├── requirements.txt ├── index.md ├── Makefile ├── make.bat ├── conf.py └── example.ipynb ├── tests └── test_dcdcpy.py ├── CHANGELOG.md ├── src └── dcdcpy │ ├── __init__.py │ ├── dcdcpy.py │ └── data │ └── docs_bic.csv ├── pyproject.toml ├── LICENSE ├── CONTRIBUTING.md ├── .gitignore ├── CONDUCT.md ├── README.md └── poetry.lock /docs/changelog.md: -------------------------------------------------------------------------------- 1 | ```{include} ../CHANGELOG.md 2 | ``` -------------------------------------------------------------------------------- /docs/conduct.md: -------------------------------------------------------------------------------- 1 | ```{include} ../CONDUCT.md 2 | ``` -------------------------------------------------------------------------------- /tests/test_dcdcpy.py: -------------------------------------------------------------------------------- 1 | from dcdcpy import dcdcpy 2 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | ```{include} ../CONTRIBUTING.md 2 | ``` -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | myst-nb 2 | sphinx-autoapi 3 | sphinx-rtd-theme -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | 5 | ## v0.1.0 (16/11/2021) 6 | 7 | - First release of `dcdcpy`! -------------------------------------------------------------------------------- /src/dcdcpy/__init__.py: -------------------------------------------------------------------------------- 1 | # read version from installed package 2 | from importlib.metadata import version 3 | from .dcdcpy import DataConnector 4 | 5 | __version__ = version("dcdcpy") 6 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ```{include} ../README.md 2 | ``` 3 | 4 | ```{toctree} 5 | :maxdepth: 1 6 | :hidden: 7 | 8 | example.ipynb 9 | changelog.md 10 | contributing.md 11 | conduct.md 12 | autoapi/index 13 | ``` -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | 3 | # You can set these variables from the command line. 4 | SPHINXOPTS = 5 | SPHINXBUILD = python -msphinx 6 | SPHINXPROJ = dcdcpy 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "dcdcpy" 3 | version = "0.1.0" 4 | description = "DataCamp Data Connector utilities in Python." 5 | authors = [ 6 | "Richard Cotton ", 7 | "Ramnath Vaidyanathan " 8 | ] 9 | license = "MIT" 10 | readme = "README.md" 11 | 12 | [tool.poetry.dependencies] 13 | python = ">=3.8,<3.10" 14 | awswrangler = "^2.12.1" 15 | boto3 = "^1.17.22" 16 | pandas = "^1.2.4" 17 | Jinja2 = "^3.0.1" 18 | pyathena = "^2.3.0" 19 | 20 | [tool.poetry.dev-dependencies] 21 | black = {version = "^21.10b0", allow-prereleases = true} 22 | environs = "^9.3.5" 23 | 24 | [build-system] 25 | requires = ["poetry-core>=1.0.0"] 26 | build-backend = "poetry.core.masonry.api" 27 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=python -msphinx 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | set SPHINXPROJ=dcdcpy 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The Sphinx module was not found. Make sure you have Sphinx installed, 20 | echo.then set the SPHINXBUILD environment variable to point to the full 21 | echo.path of the 'sphinx-build' executable. Alternatively you may add the 22 | echo.Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021, DataCamp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Project information ----------------------------------------------------- 8 | 9 | project = u"dcdcpy" 10 | copyright = u"2021, Richard Cotton" 11 | author = u"Richard Cotton" 12 | 13 | # -- General configuration --------------------------------------------------- 14 | 15 | # Add any Sphinx extension module names here, as strings. They can be 16 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 17 | # ones. 18 | extensions = [ 19 | "myst_nb", 20 | "autoapi.extension", 21 | "sphinx.ext.napoleon", 22 | "sphinx.ext.viewcode", 23 | ] 24 | autoapi_dirs = ["../src"] 25 | 26 | # List of patterns, relative to source directory, that match files and 27 | # directories to ignore when looking for source files. 28 | # This pattern also affects html_static_path and html_extra_path. 29 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] 30 | 31 | # -- Options for HTML output ------------------------------------------------- 32 | 33 | # The theme to use for HTML and HTML Help pages. See the documentation for 34 | # a list of builtin themes. 35 | # 36 | html_theme = "sphinx_rtd_theme" 37 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are welcome, and they are greatly appreciated! Every little bit 4 | helps, and credit will always be given. 5 | 6 | ## Types of Contributions 7 | 8 | ### Report Bugs 9 | 10 | If you are reporting a bug, please include: 11 | 12 | * Your operating system name and version. 13 | * Any details about your local setup that might be helpful in troubleshooting. 14 | * Detailed steps to reproduce the bug. 15 | 16 | ### Fix Bugs 17 | 18 | Look through the GitHub issues for bugs. Anything tagged with "bug" and "help 19 | wanted" is open to whoever wants to implement it. 20 | 21 | ### Implement Features 22 | 23 | Look through the GitHub issues for features. Anything tagged with "enhancement" 24 | and "help wanted" is open to whoever wants to implement it. 25 | 26 | ### Write Documentation 27 | 28 | You can never have enough documentation! Please feel free to contribute to any 29 | part of the documentation, such as the official docs, docstrings, or even 30 | on the web in blog posts, articles, and such. 31 | 32 | ### Submit Feedback 33 | 34 | If you are proposing a feature: 35 | 36 | * Explain in detail how it would work. 37 | * Keep the scope as narrow as possible, to make it easier to implement. 38 | * Remember that this is a volunteer-driven project, and that contributions 39 | are welcome :) 40 | 41 | ## Get Started! 42 | 43 | Ready to contribute? Here's how to set up `dcdcpy` for local development. 44 | 45 | 1. Download a copy of `dcdcpy` locally. 46 | 2. Install `dcdcpy` using `poetry`: 47 | 48 | ```console 49 | $ poetry install 50 | ``` 51 | 52 | 3. Use `git` (or similar) to create a branch for local development and make your changes: 53 | 54 | ```console 55 | $ git checkout -b name-of-your-bugfix-or-feature 56 | ``` 57 | 58 | 4. When you're done making changes, check that your changes conform to any code formatting requirements and pass any tests. 59 | 60 | 5. Commit your changes and open a pull request. 61 | 62 | ## Pull Request Guidelines 63 | 64 | Before you submit a pull request, check that it meets these guidelines: 65 | 66 | 1. The pull request should include additional tests if appropriate. 67 | 2. If the pull request adds functionality, the docs should be updated. 68 | 3. The pull request should work for all currently supported operating systems and versions of Python. 69 | 70 | ## Code of Conduct 71 | 72 | Please note that the `dcdcpy` project is released with a 73 | Code of Conduct. By contributing to this project you agree to abide by its terms. 74 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | # Mac OS 132 | .DS_Store 133 | 134 | # Secrets 135 | .env -------------------------------------------------------------------------------- /CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant homepage](http://contributor-covenant.org/version/1/4), version 1.4. 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dcdcpy 2 | 3 | 4 | [![Lifecycle: deprecated](https://img.shields.io/badge/lifecycle-deprecated-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html#deprecated) 5 | 6 | 7 | DataCamp Data Connector utilities in Python. 8 | 9 | This package contains utilities to work with DataCamp Data Connector. It is designed to be used by administrators and managers of DataCamp groups. Some prior experience of writing reports with Python is recommended. 10 | 11 | ## DEPRECATION WARNING 12 | Warning, this package is no longer actively maintained! Please see the [announcement](https://enterprise-docs.datacamp.com/data-connector/data-connector-faq/deprecating-dcdcpy-and-dcdcr) for more information and alternatives. 13 | 14 | ## Installation 15 | 16 | You can install the development version with: 17 | 18 | ```bash 19 | $ pip install git+https://github.com/datacamp/dcdcpy.git#egg=dcdcpy 20 | ``` 21 | 22 | ## Getting Started 23 | 24 | Before you begin, you need to enable Data Connector in your DataCamp group, and 25 | set S3 credentials as environment variables, as described in this [this Support article](https://enterprise-docs.datacamp.com/data-connector/using-the-data-connector/analyzing-data/python-with-dcdcpy). 26 | If in doubt, speak to your Customer Success Manager. 27 | 28 | ## Accessing Data 29 | 30 | You can access any of the tables in the data connector by initializing the `DataConnector` class and accessing the tables as methods using autocomplete. 31 | 32 | By default the connector is set up to access data for the latest date. However, you can also pass a `date` argument to `DataConnector` to initialize it to access data for a specific date. This is useful when you want to create reports and want to pin your analysis to data as on a specific date. 33 | ## Usage 34 | 35 | ```python 36 | from dcdcpy.dcdcpy import DataConnector 37 | dc = DataConnector() 38 | dc.assessment_dim() 39 | ``` 40 | 41 | You can also print the documentation for each table by printing the method without invoking it. 42 | 43 | ```python 44 | dc.assessment_dim 45 | ``` 46 | 47 | --- 48 | ### Assessment Dim 49 | 50 | #### Description 51 | 52 | The assessment dimension provides descriptive data about a specific assessment. 53 | 54 | 55 | #### Columns 56 | 57 | assessment_id 58 | 59 | > The unique id of the assessment id. 60 | 61 | title 62 | 63 | > The title of the assessment. 64 | 65 | slug 66 | 67 | > The slug of The assessment. 68 | 69 | technology 70 | 71 | > The assessment technology (e.g., Python, R, SQL) 72 | 73 | 74 | id 75 | 76 | > [DEPRECATED] Use assessment_id instead. 77 | 78 | --- 79 | 80 | 81 | All the data accessors are memoized and will cache the results in memory when they are run for the first time. This should speed up analysis considerably since the data is already cached in memory. 82 | ## Contributing 83 | 84 | Interested in contributing? Check out the contributing guidelines. Please note that this project is released with a Code of Conduct. By contributing to this project, you agree to abide by its terms. 85 | 86 | ## License 87 | 88 | `dcdcpy` was created by Richard Cotton and Ramnath Vaidyanathan. It is licensed under the terms of the MIT license. 89 | 90 | ## Credits 91 | 92 | `dcdcpy` was created with [`cookiecutter`](https://cookiecutter.readthedocs.io/en/latest/) and the `py-pkgs-cookiecutter` [template](https://github.com/py-pkgs/py-pkgs-cookiecutter). 93 | -------------------------------------------------------------------------------- /src/dcdcpy/dcdcpy.py: -------------------------------------------------------------------------------- 1 | import boto3 2 | import pandas as pd 3 | import os 4 | import awswrangler as wr 5 | import pkg_resources 6 | from functools import lru_cache 7 | from jinja2 import Template 8 | from pyathena import connect 9 | from IPython.display import display, Markdown 10 | from warnings import warn 11 | 12 | 13 | def get_env_var_s3_bucket(): 14 | env_var = os.getenv("AWS_S3_BUCKET_NAME", os.getenv("AWS_BUCKET")) 15 | if env_var is None: 16 | raise EnvironmentError("The environment variable 'AWS_BUCKET' has not been set.") 17 | return env_var 18 | 19 | 20 | def get_env_var_region(): 21 | env_var = os.getenv("AWS_DEFAULT_REGION", os.getenv("AWS_REGION")) 22 | if env_var is None: 23 | raise EnvironmentError("The environment variable 'AWS_REGION' has not been set.") 24 | return env_var 25 | 26 | def get_env_var_aws_access_key(): 27 | env_var = os.getenv("AWS_ACCESS_KEY_ID") 28 | if env_var is None: 29 | raise EnvironmentError("The environment variable 'AWS_ACCESS_KEY_ID' has not been set.") 30 | return env_var 31 | 32 | def get_env_var_aws_secret(): 33 | env_var = os.getenv("AWS_SECRET_ACCESS_KEY") 34 | if env_var is None: 35 | raise EnvironmentError("The environment variable 'AWS_SECRET_ACCESS_KEY' has not been set.") 36 | return env_var 37 | 38 | def get_env_var_athena_s3_staging_dir(): 39 | env_var = os.getenv("AWS_ATHENA_S3_STAGING_DIR") 40 | if env_var is None: 41 | raise EnvironmentError("The environment variable 'AWS_ATHENA_S3_STAGING_DIR' has not been set.") 42 | return env_var 43 | 44 | 45 | 46 | @lru_cache(maxsize=None) 47 | def list_tables_s3(): 48 | s3 = boto3.resource("s3") 49 | my_bucket = s3.Bucket(get_env_var_s3_bucket()) 50 | return [ 51 | obj.key.split("/")[1].split(".")[0] 52 | for obj in my_bucket.objects.filter(Delimiter="/", Prefix=f"latest/") 53 | ] 54 | 55 | 56 | @lru_cache(maxsize=None) 57 | def get_docs_bic(): 58 | stream = pkg_resources.resource_stream(__name__, "data/docs_bic.csv") 59 | docs_bic = pd.read_csv(stream) 60 | tables = docs_bic.table_name.unique().tolist() 61 | data = {} 62 | 63 | for table in tables: 64 | doc = docs_bic.query("table_name == @table") 65 | data[table] = { 66 | "table_name": doc["table_name"].tolist()[0], 67 | "table_title": " ".join( 68 | [w.title() for w in doc["table_name"].tolist()[0].split("_")] 69 | ), 70 | "table_description": doc["table_description"].tolist()[0], 71 | "columns": doc[["column", "description"]].to_dict(orient="records"), 72 | } 73 | return data 74 | 75 | 76 | @lru_cache(maxsize=None) 77 | def read_table_s3(table_name, conn=None, date="latest"): 78 | return wr.s3.read_csv(f"s3://{get_env_var_s3_bucket()}/{date}/{table_name}.csv") 79 | 80 | 81 | @lru_cache(maxsize=None) 82 | def read_table_athena(table_name, conn, date="latest"): 83 | s3_bucket = get_env_var_s3_bucket() 84 | return pd.read_sql_query(f'SELECT * FROM "{s3_bucket}"."{table_name}"', conn) 85 | 86 | 87 | HELP_DOCS = get_docs_bic() 88 | 89 | TEMPLATE = """ 90 | ### {{ table_title }} 91 | 92 | #### Description 93 | 94 | {{ table_description }} 95 | 96 | #### Columns 97 | {%- for column in columns %} 98 | 99 | {{ column['column'] }} 100 | 101 | > {{ column['description'] }} 102 | 103 | {%- endfor -%} 104 | """ 105 | 106 | 107 | def display_help(table_name): 108 | tpl = Template(TEMPLATE) 109 | out = tpl.render(HELP_DOCS[table_name]) 110 | return display(Markdown(out)) 111 | 112 | 113 | class ReadTable: 114 | def __init__(self, table_name, date="latest", source="s3", conn=None): 115 | self.table_name = table_name 116 | self.conn = conn 117 | self.date = date 118 | if source == "s3": 119 | self.table = read_table_s3 120 | else: 121 | self.table = read_table_athena 122 | 123 | def __call__(self, *args, **kwargs): 124 | return self.table(self.table_name, self.conn, self.date) 125 | 126 | # def __repr__(self): 127 | # tpl = Template(TEMPLATE) 128 | # out = tpl.render(HELP_DOCS[self.table_name]) 129 | # return out 130 | 131 | def _repr_html_(self): 132 | tpl = Template(TEMPLATE) 133 | out = tpl.render(HELP_DOCS[self.table_name]) 134 | return display(Markdown(out)) 135 | 136 | 137 | class DataConnector: 138 | def __init__(self, date="latest", source="s3"): 139 | warn('This package is no longer actively maintained or supported by DataCamp, ' 140 | 'please see https://enterprise-docs.datacamp.com/data-connector/data-connector-faq/deprecating-dcdcpy-and-dcdcr ' 141 | 'for more information.') 142 | self.date = date 143 | self.source = source 144 | self.tables = list_tables_s3() 145 | if self.source == "s3": 146 | self.conn = None 147 | else: 148 | self.conn = connect( 149 | s3_staging_dir=get_env_var_athena_s3_staging_dir(), 150 | region_name=get_env_var_region(), 151 | ) 152 | for table in self.tables: 153 | setattr( 154 | self, 155 | table.replace("learning_", ""), 156 | ReadTable(table, date=self.date, conn=self.conn, source=self.source), 157 | ) 158 | -------------------------------------------------------------------------------- /docs/example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Example usage\n", 8 | "\n", 9 | "To use `dcdcpy` in a project, first add your environment variables to an `.env` file." 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "%load_ext autoreload\n", 19 | "%autoreload 2" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 2, 25 | "metadata": {}, 26 | "outputs": [ 27 | { 28 | "data": { 29 | "text/plain": [ 30 | "True" 31 | ] 32 | }, 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "output_type": "execute_result" 36 | } 37 | ], 38 | "source": [ 39 | "from dotenv import load_dotenv\n", 40 | "load_dotenv()" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": {}, 47 | "outputs": [ 48 | { 49 | "data": { 50 | "text/html": [ 51 | "
\n", 52 | "\n", 65 | "\n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | "
assessment_idtitleslugtechnologyid
01874Understanding and Interpreting Dataunderstanding-and-interpreting-dataTheory1874
11688Machine Learning Fundamentals in Rmachine-learning-fundamentals-with-rR1688
21714Machine Learning Fundamentals in Pythonmachine-learning-fundamentals-with-pythonPython1714
31735Importing & Cleaning Data with Rimporting-cleaning-data-with-rR1735
41649R Programmingr-programmingR1649
\n", 119 | "
" 120 | ], 121 | "text/plain": [ 122 | " assessment_id title \\\n", 123 | "0 1874 Understanding and Interpreting Data \n", 124 | "1 1688 Machine Learning Fundamentals in R \n", 125 | "2 1714 Machine Learning Fundamentals in Python \n", 126 | "3 1735 Importing & Cleaning Data with R \n", 127 | "4 1649 R Programming \n", 128 | "\n", 129 | " slug technology id \n", 130 | "0 understanding-and-interpreting-data Theory 1874 \n", 131 | "1 machine-learning-fundamentals-with-r R 1688 \n", 132 | "2 machine-learning-fundamentals-with-python Python 1714 \n", 133 | "3 importing-cleaning-data-with-r R 1735 \n", 134 | "4 r-programming R 1649 " 135 | ] 136 | }, 137 | "execution_count": 3, 138 | "metadata": {}, 139 | "output_type": "execute_result" 140 | } 141 | ], 142 | "source": [ 143 | "from dcdcpy import DataConnector\n", 144 | "dc = DataConnector()\n", 145 | "dc.assessment_dim().head()" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 4, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "data": { 155 | "text/markdown": [ 156 | "\n", 157 | "### Assessment Dim\n", 158 | "\n", 159 | "#### Description\n", 160 | "\n", 161 | "The assessment dimension provides descriptive data about a specific assessment.\n", 162 | "\n", 163 | "\n", 164 | "#### Columns\n", 165 | "\n", 166 | "assessment_id\n", 167 | "\n", 168 | "> The unique id of the assessment id.\n", 169 | "\n", 170 | "title\n", 171 | "\n", 172 | "> The title of the assessment.\n", 173 | "\n", 174 | "slug\n", 175 | "\n", 176 | "> The slug of The assessment.\n", 177 | "\n", 178 | "technology\n", 179 | "\n", 180 | "> The assessment technology (e.g., Python, R, SQL)\n", 181 | "\n", 182 | "\n", 183 | "id\n", 184 | "\n", 185 | "> [DEPRECATED] Use assessment_id instead.\n" 186 | ], 187 | "text/plain": [ 188 | "" 189 | ] 190 | }, 191 | "metadata": {}, 192 | "output_type": "display_data" 193 | }, 194 | { 195 | "data": { 196 | "text/plain": [ 197 | "" 198 | ] 199 | }, 200 | "execution_count": 4, 201 | "metadata": {}, 202 | "output_type": "execute_result" 203 | } 204 | ], 205 | "source": [ 206 | "dc.assessment_dim" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 5, 212 | "metadata": {}, 213 | "outputs": [ 214 | { 215 | "name": "stdout", 216 | "output_type": "stream", 217 | "text": [ 218 | "0.1.0\n" 219 | ] 220 | } 221 | ], 222 | "source": [ 223 | "import dcdcpy\n", 224 | "print(dcdcpy.__version__)" 225 | ] 226 | } 227 | ], 228 | "metadata": { 229 | "kernelspec": { 230 | "display_name": "Python 3", 231 | "language": "python", 232 | "name": "python3" 233 | }, 234 | "language_info": { 235 | "codemirror_mode": { 236 | "name": "ipython", 237 | "version": 3 238 | }, 239 | "file_extension": ".py", 240 | "mimetype": "text/x-python", 241 | "name": "python", 242 | "nbconvert_exporter": "python", 243 | "pygments_lexer": "ipython3", 244 | "version": "3.9.8" 245 | } 246 | }, 247 | "nbformat": 4, 248 | "nbformat_minor": 4 249 | } 250 | -------------------------------------------------------------------------------- /src/dcdcpy/data/docs_bic.csv: -------------------------------------------------------------------------------- 1 | table_name,table_description,column,description 2 | assessment_dim,"The assessment dimension provides descriptive data about a specific assessment. 3 | ",assessment_id,The unique id of the assessment id. 4 | assessment_dim,"The assessment dimension provides descriptive data about a specific assessment. 5 | ",title,The title of the assessment. 6 | assessment_dim,"The assessment dimension provides descriptive data about a specific assessment. 7 | ",slug,The slug of The assessment. 8 | assessment_dim,"The assessment dimension provides descriptive data about a specific assessment. 9 | ",technology,"The assessment technology (e.g., Python, R, SQL) 10 | " 11 | assessment_dim,"The assessment dimension provides descriptive data about a specific assessment. 12 | ",id,"[DEPRECATED] Use assessment_id instead. 13 | " 14 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 15 | ",chapter_id,The unique id of the chapter id. 16 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 17 | ",title,The title of the chapter. 18 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 19 | ",slug,The slug of the chapter. 20 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 21 | ",xp,"The maxmimum number of XP a user can get by completing the chapter. 22 | " 23 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 24 | ",technology,"The course technology (e.g., Tableau, SQL, Python, R, ...). 25 | " 26 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 27 | ",topic,"The course topic (e.g., Data visualization, Programmaing, Machine Learning, ...). 28 | " 29 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 30 | ",nb_exercises,"The number of exercises in the chapter. 31 | " 32 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 33 | ",course_title,"The title of the course the chapter belongs to. 34 | " 35 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 36 | ",course_slug,"The slug of the course the chapter belongs to. 37 | " 38 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 39 | ",course_xp,"The maximum number of XP a user can get by completing the course the chapter belongs to. 40 | " 41 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 42 | ",course_description,"The description of the course the chapter belongs to. 43 | " 44 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 45 | ",course_short_description,"A shorter description of the course the chapter belongs to. 46 | " 47 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 48 | ",course_launched_date,"The date on which the course went live. 49 | " 50 | chapter_dim,"The chapter dimension provides descriptive data about a specific chapter. Because the model considers users’ progress on all chapters (i.e., even chapters that are no longer available), there is a specific row with the id = -1. This row is used in the chapter fact table to refer to a deleted chapter. 51 | ",id,"[DEPRECATED] Use chapter_id instead. 52 | " 53 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 54 | ",course_id,The unique id of the course. 55 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 56 | ",title,The title of the course. 57 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 58 | ",technology,"The course technology (e.g., Tableau, SQL, Python, R, ...). 59 | " 60 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 61 | ",topic,"The course topic (e.g., Data visualization, Programmaing, Machine Learning, ...). 62 | " 63 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 64 | ",xp,"The maxmimum number of XP a user can get by following the course. 65 | " 66 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 67 | ",nb_hours_needed,"Time needed in hours to complete the course. 68 | " 69 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 70 | ",slug,"The slug of the course 71 | " 72 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 73 | ",description,"A description of the course. 74 | " 75 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 76 | ",short_description,"A short description of the course. 77 | " 78 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 79 | ",launched_date,"The date on which the course went live. 80 | " 81 | course_dim,"The course dimension provides descriptive data about a specific course. Because the model considers users’ progress on all courses (i.e., even courses that are no longer available), there is a specific row with the id = -1. This row is used in the course fact table to refer to a deleted course. 82 | ",id,"[DEPRECATED] Use course_id instead. 83 | " 84 | docs,A table with all table and column documentation.,table_name,The name of the table. 85 | docs,A table with all table and column documentation.,table_description,The description of the table. 86 | docs,A table with all table and column documentation.,column,The name of the column. 87 | docs,A table with all table and column documentation.,comment,The description of the column. 88 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 89 | ",exercise_id,The unique id of the exercise id. 90 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 91 | ",title,The title of the exercise. 92 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 93 | ",type,"The type of exercise type (e.g., NormalExercise, VideoExercise, MultipleChoiceExercise, ...) 94 | " 95 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 96 | ",number,"The number of the exercise in the chapter, accounting for subexercises. 97 | This can be used to sort exercises in order." 98 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 99 | ",xp,"The maxmimum number of XP a user can get by completing the exercise. 100 | " 101 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 102 | ",technology,"The course technology (e.g., Tableau, SQL, Python, R, ...) 103 | " 104 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 105 | ",topic,"The course topic (e.g., Data visualization, Programmaing, Machine Learning, ...) 106 | " 107 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 108 | ",course_title,"The course title the exercise belongs to. 109 | " 110 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 111 | ",course_slug,"The course slug the exercise belongs to 112 | " 113 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 114 | ",course_xp,"The maximum number of XP a user can get by completing the course the exercise belongs to. 115 | " 116 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 117 | ",course_description,"The course description the exercise belongs to. 118 | " 119 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 120 | ",course_short_description,"A shorter version of the course description the exercise belongs to. 121 | " 122 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 123 | ",course_launched_date,"Date at which the course went live. 124 | " 125 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 126 | ",chapter_title,"The chapter title the exercise belongs to. 127 | " 128 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 129 | ",chapter_slug,"The chapter slug the exercise belongs to. 130 | " 131 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 132 | ",chapter_xp,"The maximum number of XP a user can get by completing the chapter the exercise belongs to. 133 | " 134 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 135 | ",chapter_nb_exercises,"The number of exercises in the chapter the exercise belongs to. 136 | " 137 | exercise_dim,"The exercise dimension provides descriptive data about a specific exercise. Because the model considers users’ progress on all exercises (i.e., even exercises that are no longer available), there is a specific row with the id = -1. This row is used in the exercise fact table to refer to a deleted exercise. 138 | ",id,"[DEPRECATED] Use exercise_id instead. 139 | " 140 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 141 | ",user_id,"The unique id of the user id. References user_dim.id 142 | " 143 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 144 | ",assessment_id,"The unique id of the assessment. References assessment_dim.id 145 | " 146 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 147 | ",date_id,"The identifier of the date when the user worked on the assessment References dim_date.id 148 | " 149 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 150 | ",started_at,"The timestamp when the user started the assessment (as registered by the DataCamp application) 151 | " 152 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 153 | ",completed_at,"The timestamp when the user completed the assessment (as registered by the DataCamp application). It is NULL when the user did not complete the assessment. 154 | " 155 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 156 | ",score,The user score for the assessment. 157 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 158 | ",score_group,"The user score group for the assessment. A score of < 70 is ""Novice"", 70 - 100 as ""Intermediate Lower"", 100 - 130 as ""Intermediate"", 130 - 160 as ""Intermediate Upper"", and > 160 as ""Advanced"". 159 | " 160 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 161 | ",percentile,The percentile the user belongs in. 162 | learning_assessment_fact,"The assessment fact table provides data about the users’ assessment results: score and percentile obtained and time spent on each assessment. 163 | ",time_spent,"The time (in seconds) the user spent on the assessment. 164 | " 165 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 166 | ",user_id,"The unique id of the user. References to user_dim.user_id. 167 | " 168 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 169 | ",chapter_id,"The unique id of the chapter. References to chapter_dim.chapter_id. 170 | " 171 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 172 | ",date_id,"The date on which the user worked on the chapter. References to dim_date.id 173 | " 174 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 175 | ",started_at,"The timestamp when the user started the chapter (as registered by the DataCamp application). 176 | " 177 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 178 | ",completed_at,"The timestamp when the user completed the chapter (as registered by the DataCamp application). 179 | " 180 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 181 | ",time_spent,"The time (in seconds) the user spent on the chapter. 182 | " 183 | learning_chapter_fact,"The chapter fact table provides data about the users’ progress: XP gained and time spent on each chapter. The table provides data for chapters that can be no longer available (and deleted from our database). In this case, the chapter_id value is set to -1 and links to a “deleted chapter” row in the chapter_dim table. 184 | ",xp,"The XP the user gained by working on the chapter. 185 | " 186 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 187 | ",user_id,"The unique id of the user id. References user_dim.user_id 188 | " 189 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 190 | ",course_id,"The unique id of the course. References course_dim.id 191 | " 192 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 193 | ",date_id,"The unique id of the date on which the user worked on the course. References to dim_date.id 194 | " 195 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 196 | ",started_at,"The timestamp when the user started the course (as registered by the DataCamp application). 197 | " 198 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 199 | ",completed_at,"The timestamp when the user started the course (as registered by the DataCamp application). It is NULL when the user has NOT completed the course yet. 200 | " 201 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 202 | ",time_spent,"The time (in seconds) the user spent on the course. 203 | " 204 | learning_course_fact,"The course fact table provides data about the users’ progress: XP gained and time spent on each course. The table provides data for courses that can be no longer available (and deleted from our database). In this case, the course value is set to -1 and links to a “deleted course” row in the course_dim table. 205 | ",xp,"The XP the user gained by working on the course. 206 | " 207 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 208 | ",user_id,The unique user id. Reference to user_dim.id. 209 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 210 | ",exercise_id,The unique exercise_id. Reference to exercise_dim.id. 211 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 212 | ",date_id,The date id. Reference to date_dim.id. 213 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 214 | ",started_at,"The timestamp at which the user started the exercise (as registered by the DataCamp application). 215 | " 216 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 217 | ",completed_at,"The timestamp at which the user completed the exercise (as registered by the DataCamp application). 218 | " 219 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 220 | ",time_spent,"How much time (in seconds) the user spent on the exercise? 221 | " 222 | learning_exercise_fact,"The exercise fact table provides data about the users’ progress: XP gained and time spent on each exercise. The table provides data for exercises that can be no longer available (and deleted from our database). In this case, the exercise_id value is set to -1 and links to a ""deleted exercise"""" row in the exercise_dim table.Fact table for exercise content. It provides engagement and xp measurements on exercise. 223 | ",xp,"How many XP did the user gain by completing the exercise? 224 | " 225 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,user_id,"The user id (internal main-app id) [PK], [FK to user_dim.id]" 226 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,practice_id,"The practice id the user started (internal mobile_app pools id). [PK], [FK to practice_dim.id]" 227 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,date_id,"The date at which the user worked on the practice [PK], [FK to dim_date.id]" 228 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,started_at,The date at which the user started the practice 229 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,completed_at,The date at which the user completed the practice. It is NULL when the user did not complete the practice 230 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,is_mobile,Whether the user did the practice on mobile or in the browser 231 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,time_spent,How much time (in seconds) the user spent on the practice 232 | learning_practice_fact,Fact table for project content. It provides engagement and xp measurements on projects. This table includes practices (aka challenges) after practice replaced challenges,xp,How many XP did the user gain by completing the practice 233 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 234 | ",user_id,"The unique id of the user. References user_dim.user_id 235 | " 236 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 237 | ",project_id,"The unique id of the project. References project_dim.project_id 238 | " 239 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 240 | ",date_id,"The id of the date on which the user worked on the project. References date_dim.date_id 241 | " 242 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 243 | ",started_at,"The timestamp when the user started the project (as registered by the DataCamp application). 244 | " 245 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 246 | ",completed_at,"The timestamp when the user completed the project (as registered by the DataCamp application). It is NULL when the user has NOT completed the project yet. 247 | " 248 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 249 | ",time_spent,"The time (in seconds) the user spent on the project. 250 | " 251 | learning_project_fact,"The project fact table provides data about the users’ project progress: time spent and XP gained. 252 | ",xp,"The XP the user gained by working on the project. 253 | " 254 | learning_track_content_fact,Fact table for track content.,group_id,The id of the group. 255 | learning_track_content_fact,Fact table for track content.,user_id,The id of the user. 256 | learning_track_content_fact,Fact table for track content.,track_version_id,The id of the track version. 257 | learning_track_content_fact,Fact table for track content.,content_id,"The id of the content, a concatenation of content type and id." 258 | learning_track_content_fact,Fact table for track content.,started_at,The timestamp when the user enrolled in the track. 259 | learning_track_content_fact,Fact table for track content.,completed_at,The timestamp when the user completed the track. 260 | learning_track_content_fact,Fact table for track content.,xp,The xp gained by completing the content. 261 | learning_track_content_fact,Fact table for track content.,nb_seconds,The total number of seconds spent on the content. 262 | learning_track_fact,Fact table for tracks.,group_id,The id of the group. 263 | learning_track_fact,Fact table for tracks.,user_id,The id of the user. 264 | learning_track_fact,Fact table for tracks.,track_version_id,The id of the track version. 265 | learning_track_fact,Fact table for tracks.,started_at,The timestamp when the user enrolled in the track. 266 | learning_track_fact,Fact table for tracks.,completed_at,The timestamp when the user completed the track. 267 | learning_track_fact,Fact table for tracks.,is_currently_active,A boolean indicating if the user is currently active in the track 268 | practice_dim,List of all practices,practice_id,The practice id (internal mobile_app.pools id) [PK] 269 | practice_dim,List of all practices,title,The practice name 270 | practice_dim,List of all practices,status,"The practice status (HIDDEN, LIVE)" 271 | practice_dim,List of all practices,technology,The practice's technology type 272 | practice_dim,List of all practices,xp,Xp gained by completing the practice 273 | practice_dim,List of all practices,id,"[DEPRECATED] Use practice_id instead. 274 | " 275 | project_dim,"The project dimension provides descriptive data about a specific project. 276 | ",project_id,The unique id of the project. 277 | project_dim,"The project dimension provides descriptive data about a specific project. 278 | ",title,The title of the course. 279 | project_dim,"The project dimension provides descriptive data about a specific project. 280 | ",technology,"The course technology (R, Python, SQL)" 281 | project_dim,"The project dimension provides descriptive data about a specific project. 282 | ",xp,"The maxmimum number of XP a user can get by completing the project. 283 | " 284 | project_dim,"The project dimension provides descriptive data about a specific project. 285 | ",nb_hours_needed,"The number of hours needed to complete the project. 286 | " 287 | project_dim,"The project dimension provides descriptive data about a specific project. 288 | ",is_guided,"A boolean indicating whether the project is guided or not. 289 | " 290 | project_dim,"The project dimension provides descriptive data about a specific project. 291 | ",description,"A description of the project. 292 | " 293 | project_dim,"The project dimension provides descriptive data about a specific project. 294 | ",short_description,"A short description of the project. 295 | " 296 | project_dim,"The project dimension provides descriptive data about a specific project. 297 | ",id,"[DEPRECATED] Use project_id instead. 298 | " 299 | team_dim,List of all enterprise teams,id,The team id (internal enterprise-app id) [PK] 300 | team_dim,List of all enterprise teams,name,The team name 301 | team_dim,List of all enterprise teams,slug,The team slug 302 | team_dim,List of all enterprise teams,created_date,The team's creation date 303 | team_dim,List of all enterprise teams,updated_date,The team's updated date 304 | team_dim,List of all enterprise teams,deleted_date,The team's deleted date 305 | track_content_dim,"List of content in all live tracks. This table has one row per 306 | track_version and content item. It currently only includes courses and 307 | projects. Note that a content item can belong to multiple tracks, and 308 | different versions of a track might contain different content items.",track_version_id,The id of the track version. 309 | track_content_dim,"List of content in all live tracks. This table has one row per 310 | track_version and content item. It currently only includes courses and 311 | projects. Note that a content item can belong to multiple tracks, and 312 | different versions of a track might contain different content items.",track_id,The id of the track. 313 | track_content_dim,"List of content in all live tracks. This table has one row per 314 | track_version and content item. It currently only includes courses and 315 | projects. Note that a content item can belong to multiple tracks, and 316 | different versions of a track might contain different content items.",content_id,"The id of the content, a concatenation of content type and id." 317 | track_content_dim,"List of content in all live tracks. This table has one row per 318 | track_version and content item. It currently only includes courses and 319 | projects. Note that a content item can belong to multiple tracks, and 320 | different versions of a track might contain different content items.",content_type,The content type (course / project). 321 | track_content_dim,"List of content in all live tracks. This table has one row per 322 | track_version and content item. It currently only includes courses and 323 | projects. Note that a content item can belong to multiple tracks, and 324 | different versions of a track might contain different content items.",content_title,The title of the content. 325 | track_content_dim,"List of content in all live tracks. This table has one row per 326 | track_version and content item. It currently only includes courses and 327 | projects. Note that a content item can belong to multiple tracks, and 328 | different versions of a track might contain different content items.",position,The position of the content in the track version. 329 | track_content_dim,"List of content in all live tracks. This table has one row per 330 | track_version and content item. It currently only includes courses and 331 | projects. Note that a content item can belong to multiple tracks, and 332 | different versions of a track might contain different content items.",xp,The total xp earned on completion of content. 333 | track_dim,"List of all versions of live tracks, along with their title, technology, 334 | and descriptions. This table has one row for every track version, for 335 | tracks that are live.",track_version_id,The id of the track version. 336 | track_dim,"List of all versions of live tracks, along with their title, technology, 337 | and descriptions. This table has one row for every track version, for 338 | tracks that are live.",track_id,The id of the track. 339 | track_dim,"List of all versions of live tracks, along with their title, technology, 340 | and descriptions. This table has one row for every track version, for 341 | tracks that are live.",version_number,The version of the track. 342 | track_dim,"List of all versions of live tracks, along with their title, technology, 343 | and descriptions. This table has one row for every track version, for 344 | tracks that are live.",title,The title concatenated with subtitle of the track version. 345 | track_dim,"List of all versions of live tracks, along with their title, technology, 346 | and descriptions. This table has one row for every track version, for 347 | tracks that are live.",technology,The technology of the track. 348 | track_dim,"List of all versions of live tracks, along with their title, technology, 349 | and descriptions. This table has one row for every track version, for 350 | tracks that are live.",category,The category of the track. 351 | track_dim,"List of all versions of live tracks, along with their title, technology, 352 | and descriptions. This table has one row for every track version, for 353 | tracks that are live.",short_description,A short description of the track 354 | track_dim,"List of all versions of live tracks, along with their title, technology, 355 | and descriptions. This table has one row for every track version, for 356 | tracks that are live.",published_live_at,The timestamp for when the track version was published live. 357 | track_dim,"List of all versions of live tracks, along with their title, technology, 358 | and descriptions. This table has one row for every track version, for 359 | tracks that are live.",archived_at,The timestamp for when the track version was archived. 360 | track_dim,"List of all versions of live tracks, along with their title, technology, 361 | and descriptions. This table has one row for every track version, for 362 | tracks that are live.",is_current_version,A boolean indicating if this is the current version. 363 | track_dim,"List of all versions of live tracks, along with their title, technology, 364 | and descriptions. This table has one row for every track version, for 365 | tracks that are live.",is_custom,A boolean indicating if this is a custom track. 366 | track_dim,"List of all versions of live tracks, along with their title, technology, 367 | and descriptions. This table has one row for every track version, for 368 | tracks that are live.",nb_courses,The number of courses in the track version. 369 | track_dim,"List of all versions of live tracks, along with their title, technology, 370 | and descriptions. This table has one row for every track version, for 371 | tracks that are live.",nb_projects,The number of projects in the track version. 372 | track_dim,"List of all versions of live tracks, along with their title, technology, 373 | and descriptions. This table has one row for every track version, for 374 | tracks that are live.",xp,The total xp gained on completion of the track. 375 | user_dim,List of all enterprise users,user_id,The user id (internal main-app id) [PK] 376 | user_dim,List of all enterprise users,first_name,The user first name 377 | user_dim,List of all enterprise users,last_name,The user last name 378 | user_dim,List of all enterprise users,email,The user email 379 | user_dim,List of all enterprise users,slug,The slug to the user profile 380 | user_dim,List of all enterprise users,registered_at,When the user registered 381 | user_dim,List of all enterprise users,deleted_at,When the user was deleted 382 | user_dim,List of all enterprise users,last_visit_at,When the user visited (browsed) the plarform for the last time 383 | user_dim,List of all enterprise users,last_time_spent_at,"When the user spent time on the platform (campus, challenges, projects, mobile) for the last time" 384 | user_dim,List of all enterprise users,onboarding_completed_at,When the user completed their onboarding 385 | user_dim,List of all enterprise users,first_content_completed_at,When the user completed their first content 386 | user_dim,List of all enterprise users,id,"[DEPRECATED] Use user_id instead 387 | " 388 | user_team_bridge,Bridge table to link users to their teams,user_id,The user id (internal main-app id) [PK] 389 | user_team_bridge,Bridge table to link users to their teams,team_id,The team id (internal enterprise-app id) [PK] 390 | user_team_bridge,Bridge table to link users to their teams,joined_team_date,Date at which the user joined the team 391 | user_team_bridge,Bridge table to link users to their teams,left_team_date,Date at which the user left the team 392 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "asn1crypto" 3 | version = "1.4.0" 4 | description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" 5 | category = "main" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [[package]] 10 | name = "awswrangler" 11 | version = "2.12.1" 12 | description = "Pandas on AWS." 13 | category = "main" 14 | optional = false 15 | python-versions = ">=3.6.2,<3.10" 16 | 17 | [package.dependencies] 18 | boto3 = ">=1.16.8,<2.0.0" 19 | botocore = ">=1.19.8,<2.0.0" 20 | jsonpath-ng = ">=1.5.3,<2.0.0" 21 | numpy = ">=1.18.0,<2.0.0" 22 | openpyxl = ">=3.0.0,<3.1.0" 23 | opensearch-py = ">=1.0.0,<2.0.0" 24 | pandas = {version = ">=1.2.0,<2.0.0", markers = "python_full_version >= \"3.7.1\" and python_full_version < \"4.0.0\""} 25 | pg8000 = ">=1.16.0,<1.22.0" 26 | progressbar2 = ">=3.53.3,<4.0.0" 27 | pyarrow = ">=2.0.0,<5.1.0" 28 | pymysql = ">=0.9.0,<1.1.0" 29 | redshift-connector = ">=2.0.887,<2.1.0" 30 | requests-aws4auth = ">=1.1.1,<2.0.0" 31 | 32 | [package.extras] 33 | sqlserver = ["pyodbc (>=4.0.32,<4.1.0)"] 34 | 35 | [[package]] 36 | name = "beautifulsoup4" 37 | version = "4.10.0" 38 | description = "Screen-scraping library" 39 | category = "main" 40 | optional = false 41 | python-versions = ">3.0.0" 42 | 43 | [package.dependencies] 44 | soupsieve = ">1.2" 45 | 46 | [package.extras] 47 | html5lib = ["html5lib"] 48 | lxml = ["lxml"] 49 | 50 | [[package]] 51 | name = "black" 52 | version = "21.10b0" 53 | description = "The uncompromising code formatter." 54 | category = "dev" 55 | optional = false 56 | python-versions = ">=3.6.2" 57 | 58 | [package.dependencies] 59 | click = ">=7.1.2" 60 | mypy-extensions = ">=0.4.3" 61 | pathspec = ">=0.9.0,<1" 62 | platformdirs = ">=2" 63 | regex = ">=2020.1.8" 64 | tomli = ">=0.2.6,<2.0.0" 65 | typing-extensions = ">=3.10.0.0" 66 | 67 | [package.extras] 68 | colorama = ["colorama (>=0.4.3)"] 69 | d = ["aiohttp (>=3.7.4)"] 70 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 71 | python2 = ["typed-ast (>=1.4.3)"] 72 | uvloop = ["uvloop (>=0.15.2)"] 73 | 74 | [[package]] 75 | name = "boto3" 76 | version = "1.20.7" 77 | description = "The AWS SDK for Python" 78 | category = "main" 79 | optional = false 80 | python-versions = ">= 3.6" 81 | 82 | [package.dependencies] 83 | botocore = ">=1.23.7,<1.24.0" 84 | jmespath = ">=0.7.1,<1.0.0" 85 | s3transfer = ">=0.5.0,<0.6.0" 86 | 87 | [package.extras] 88 | crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] 89 | 90 | [[package]] 91 | name = "botocore" 92 | version = "1.23.7" 93 | description = "Low-level, data-driven core of boto 3." 94 | category = "main" 95 | optional = false 96 | python-versions = ">= 3.6" 97 | 98 | [package.dependencies] 99 | jmespath = ">=0.7.1,<1.0.0" 100 | python-dateutil = ">=2.1,<3.0.0" 101 | urllib3 = ">=1.25.4,<1.27" 102 | 103 | [package.extras] 104 | crt = ["awscrt (==0.12.5)"] 105 | 106 | [[package]] 107 | name = "certifi" 108 | version = "2021.10.8" 109 | description = "Python package for providing Mozilla's CA Bundle." 110 | category = "main" 111 | optional = false 112 | python-versions = "*" 113 | 114 | [[package]] 115 | name = "charset-normalizer" 116 | version = "2.0.7" 117 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 118 | category = "main" 119 | optional = false 120 | python-versions = ">=3.5.0" 121 | 122 | [package.extras] 123 | unicode_backport = ["unicodedata2"] 124 | 125 | [[package]] 126 | name = "click" 127 | version = "8.0.3" 128 | description = "Composable command line interface toolkit" 129 | category = "dev" 130 | optional = false 131 | python-versions = ">=3.6" 132 | 133 | [package.dependencies] 134 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 135 | 136 | [[package]] 137 | name = "colorama" 138 | version = "0.4.4" 139 | description = "Cross-platform colored terminal text." 140 | category = "dev" 141 | optional = false 142 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 143 | 144 | [[package]] 145 | name = "decorator" 146 | version = "5.1.0" 147 | description = "Decorators for Humans" 148 | category = "main" 149 | optional = false 150 | python-versions = ">=3.5" 151 | 152 | [[package]] 153 | name = "environs" 154 | version = "9.3.5" 155 | description = "simplified environment variable parsing" 156 | category = "dev" 157 | optional = false 158 | python-versions = ">=3.6" 159 | 160 | [package.dependencies] 161 | marshmallow = ">=3.0.0" 162 | python-dotenv = "*" 163 | 164 | [package.extras] 165 | dev = ["pytest", "dj-database-url", "dj-email-url", "django-cache-url", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "tox"] 166 | django = ["dj-database-url", "dj-email-url", "django-cache-url"] 167 | lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] 168 | tests = ["pytest", "dj-database-url", "dj-email-url", "django-cache-url"] 169 | 170 | [[package]] 171 | name = "et-xmlfile" 172 | version = "1.1.0" 173 | description = "An implementation of lxml.xmlfile for the standard library" 174 | category = "main" 175 | optional = false 176 | python-versions = ">=3.6" 177 | 178 | [[package]] 179 | name = "idna" 180 | version = "3.3" 181 | description = "Internationalized Domain Names in Applications (IDNA)" 182 | category = "main" 183 | optional = false 184 | python-versions = ">=3.5" 185 | 186 | [[package]] 187 | name = "jinja2" 188 | version = "3.0.3" 189 | description = "A very fast and expressive template engine." 190 | category = "main" 191 | optional = false 192 | python-versions = ">=3.6" 193 | 194 | [package.dependencies] 195 | MarkupSafe = ">=2.0" 196 | 197 | [package.extras] 198 | i18n = ["Babel (>=2.7)"] 199 | 200 | [[package]] 201 | name = "jmespath" 202 | version = "0.10.0" 203 | description = "JSON Matching Expressions" 204 | category = "main" 205 | optional = false 206 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 207 | 208 | [[package]] 209 | name = "jsonpath-ng" 210 | version = "1.5.3" 211 | description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." 212 | category = "main" 213 | optional = false 214 | python-versions = "*" 215 | 216 | [package.dependencies] 217 | decorator = "*" 218 | ply = "*" 219 | six = "*" 220 | 221 | [[package]] 222 | name = "lxml" 223 | version = "4.6.4" 224 | description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." 225 | category = "main" 226 | optional = false 227 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" 228 | 229 | [package.extras] 230 | cssselect = ["cssselect (>=0.7)"] 231 | html5 = ["html5lib"] 232 | htmlsoup = ["beautifulsoup4"] 233 | source = ["Cython (>=0.29.7)"] 234 | 235 | [[package]] 236 | name = "markupsafe" 237 | version = "2.0.1" 238 | description = "Safely add untrusted strings to HTML/XML markup." 239 | category = "main" 240 | optional = false 241 | python-versions = ">=3.6" 242 | 243 | [[package]] 244 | name = "marshmallow" 245 | version = "3.14.1" 246 | description = "A lightweight library for converting complex datatypes to and from native Python datatypes." 247 | category = "dev" 248 | optional = false 249 | python-versions = ">=3.6" 250 | 251 | [package.extras] 252 | dev = ["pytest", "pytz", "simplejson", "mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)", "tox"] 253 | docs = ["sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.7)"] 254 | lint = ["mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)"] 255 | tests = ["pytest", "pytz", "simplejson"] 256 | 257 | [[package]] 258 | name = "mypy-extensions" 259 | version = "0.4.3" 260 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 261 | category = "dev" 262 | optional = false 263 | python-versions = "*" 264 | 265 | [[package]] 266 | name = "numpy" 267 | version = "1.21.4" 268 | description = "NumPy is the fundamental package for array computing with Python." 269 | category = "main" 270 | optional = false 271 | python-versions = ">=3.7,<3.11" 272 | 273 | [[package]] 274 | name = "openpyxl" 275 | version = "3.0.9" 276 | description = "A Python library to read/write Excel 2010 xlsx/xlsm files" 277 | category = "main" 278 | optional = false 279 | python-versions = ">=3.6" 280 | 281 | [package.dependencies] 282 | et-xmlfile = "*" 283 | 284 | [[package]] 285 | name = "opensearch-py" 286 | version = "1.0.0" 287 | description = "Python low-level client for OpenSearch" 288 | category = "main" 289 | optional = false 290 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" 291 | 292 | [package.dependencies] 293 | certifi = "*" 294 | urllib3 = ">=1.21.1,<2" 295 | 296 | [package.extras] 297 | async = ["aiohttp (>=3,<4)"] 298 | develop = ["requests (>=2.0.0,<3.0.0)", "coverage", "mock", "pyyaml", "pytest", "pytest-cov", "black", "jinja2"] 299 | requests = ["requests (>=2.4.0,<3.0.0)"] 300 | 301 | [[package]] 302 | name = "packaging" 303 | version = "21.2" 304 | description = "Core utilities for Python packages" 305 | category = "main" 306 | optional = false 307 | python-versions = ">=3.6" 308 | 309 | [package.dependencies] 310 | pyparsing = ">=2.0.2,<3" 311 | 312 | [[package]] 313 | name = "pandas" 314 | version = "1.3.4" 315 | description = "Powerful data structures for data analysis, time series, and statistics" 316 | category = "main" 317 | optional = false 318 | python-versions = ">=3.7.1" 319 | 320 | [package.dependencies] 321 | numpy = [ 322 | {version = ">=1.17.3", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, 323 | {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, 324 | {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, 325 | ] 326 | python-dateutil = ">=2.7.3" 327 | pytz = ">=2017.3" 328 | 329 | [package.extras] 330 | test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] 331 | 332 | [[package]] 333 | name = "pathspec" 334 | version = "0.9.0" 335 | description = "Utility library for gitignore style pattern matching of file paths." 336 | category = "dev" 337 | optional = false 338 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 339 | 340 | [[package]] 341 | name = "pg8000" 342 | version = "1.21.3" 343 | description = "PostgreSQL interface library" 344 | category = "main" 345 | optional = false 346 | python-versions = ">=3.6" 347 | 348 | [package.dependencies] 349 | scramp = ">=1.4.1" 350 | 351 | [[package]] 352 | name = "platformdirs" 353 | version = "2.4.0" 354 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 355 | category = "dev" 356 | optional = false 357 | python-versions = ">=3.6" 358 | 359 | [package.extras] 360 | docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] 361 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 362 | 363 | [[package]] 364 | name = "ply" 365 | version = "3.11" 366 | description = "Python Lex & Yacc" 367 | category = "main" 368 | optional = false 369 | python-versions = "*" 370 | 371 | [[package]] 372 | name = "progressbar2" 373 | version = "3.55.0" 374 | description = "A Python Progressbar library to provide visual (yet text based) progress to long running operations." 375 | category = "main" 376 | optional = false 377 | python-versions = "*" 378 | 379 | [package.dependencies] 380 | python-utils = ">=2.3.0" 381 | six = "*" 382 | 383 | [package.extras] 384 | docs = ["sphinx (>=1.7.4)"] 385 | tests = ["flake8 (>=3.7.7)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "freezegun (>=0.3.11)", "sphinx (>=1.8.5)"] 386 | 387 | [[package]] 388 | name = "pyarrow" 389 | version = "5.0.0" 390 | description = "Python library for Apache Arrow" 391 | category = "main" 392 | optional = false 393 | python-versions = ">=3.6" 394 | 395 | [package.dependencies] 396 | numpy = ">=1.16.6" 397 | 398 | [[package]] 399 | name = "pyathena" 400 | version = "2.3.0" 401 | description = "Python DB API 2.0 (PEP 249) client for Amazon Athena" 402 | category = "main" 403 | optional = false 404 | python-versions = ">=3.6.1,<4.0.0" 405 | 406 | [package.dependencies] 407 | boto3 = ">=1.4.4" 408 | botocore = ">=1.5.52" 409 | tenacity = ">=4.1.0" 410 | 411 | [package.extras] 412 | pandas = ["pandas (>=1.0.0)", "pyarrow (>=1.0.0)"] 413 | sqlalchemy = ["sqlalchemy (>=1.0.0,<2.0.0)"] 414 | 415 | [[package]] 416 | name = "pymysql" 417 | version = "1.0.2" 418 | description = "Pure Python MySQL Driver" 419 | category = "main" 420 | optional = false 421 | python-versions = ">=3.6" 422 | 423 | [package.extras] 424 | ed25519 = ["PyNaCl (>=1.4.0)"] 425 | rsa = ["cryptography"] 426 | 427 | [[package]] 428 | name = "pyparsing" 429 | version = "2.4.7" 430 | description = "Python parsing module" 431 | category = "main" 432 | optional = false 433 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 434 | 435 | [[package]] 436 | name = "python-dateutil" 437 | version = "2.8.2" 438 | description = "Extensions to the standard Python datetime module" 439 | category = "main" 440 | optional = false 441 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 442 | 443 | [package.dependencies] 444 | six = ">=1.5" 445 | 446 | [[package]] 447 | name = "python-dotenv" 448 | version = "0.19.2" 449 | description = "Read key-value pairs from a .env file and set them as environment variables" 450 | category = "dev" 451 | optional = false 452 | python-versions = ">=3.5" 453 | 454 | [package.extras] 455 | cli = ["click (>=5.0)"] 456 | 457 | [[package]] 458 | name = "python-utils" 459 | version = "2.5.6" 460 | description = "Python Utils is a module with some convenient utilities not included with the standard Python install" 461 | category = "main" 462 | optional = false 463 | python-versions = "*" 464 | 465 | [package.dependencies] 466 | six = "*" 467 | 468 | [[package]] 469 | name = "pytz" 470 | version = "2021.3" 471 | description = "World timezone definitions, modern and historical" 472 | category = "main" 473 | optional = false 474 | python-versions = "*" 475 | 476 | [[package]] 477 | name = "redshift-connector" 478 | version = "2.0.889" 479 | description = "Redshift interface library" 480 | category = "main" 481 | optional = false 482 | python-versions = ">=3.5" 483 | 484 | [package.dependencies] 485 | beautifulsoup4 = ">=4.7.0,<5.0.0" 486 | boto3 = ">=1.16.8,<2.0.0" 487 | botocore = ">=1.19.8,<2.0.0" 488 | lxml = ">=4.6.2" 489 | packaging = "*" 490 | pytz = ">=2020.1,<2021.9" 491 | requests = ">=2.23.0,<2.26.1" 492 | scramp = ">=1.2.0,<1.5.0" 493 | 494 | [package.extras] 495 | full = ["numpy", "pandas"] 496 | 497 | [[package]] 498 | name = "regex" 499 | version = "2021.11.10" 500 | description = "Alternative regular expression module, to replace re." 501 | category = "dev" 502 | optional = false 503 | python-versions = "*" 504 | 505 | [[package]] 506 | name = "requests" 507 | version = "2.26.0" 508 | description = "Python HTTP for Humans." 509 | category = "main" 510 | optional = false 511 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 512 | 513 | [package.dependencies] 514 | certifi = ">=2017.4.17" 515 | charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} 516 | idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} 517 | urllib3 = ">=1.21.1,<1.27" 518 | 519 | [package.extras] 520 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 521 | use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] 522 | 523 | [[package]] 524 | name = "requests-aws4auth" 525 | version = "1.1.1" 526 | description = "AWS4 authentication for Requests" 527 | category = "main" 528 | optional = false 529 | python-versions = "*" 530 | 531 | [package.dependencies] 532 | requests = "*" 533 | six = "*" 534 | 535 | [[package]] 536 | name = "s3transfer" 537 | version = "0.5.0" 538 | description = "An Amazon S3 Transfer Manager" 539 | category = "main" 540 | optional = false 541 | python-versions = ">= 3.6" 542 | 543 | [package.dependencies] 544 | botocore = ">=1.12.36,<2.0a.0" 545 | 546 | [package.extras] 547 | crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] 548 | 549 | [[package]] 550 | name = "scramp" 551 | version = "1.4.1" 552 | description = "An implementation of the SCRAM protocol." 553 | category = "main" 554 | optional = false 555 | python-versions = ">=3.6" 556 | 557 | [package.dependencies] 558 | asn1crypto = ">=1.4.0" 559 | 560 | [[package]] 561 | name = "six" 562 | version = "1.16.0" 563 | description = "Python 2 and 3 compatibility utilities" 564 | category = "main" 565 | optional = false 566 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 567 | 568 | [[package]] 569 | name = "soupsieve" 570 | version = "2.3.1" 571 | description = "A modern CSS selector implementation for Beautiful Soup." 572 | category = "main" 573 | optional = false 574 | python-versions = ">=3.6" 575 | 576 | [[package]] 577 | name = "tenacity" 578 | version = "8.0.1" 579 | description = "Retry code until it succeeds" 580 | category = "main" 581 | optional = false 582 | python-versions = ">=3.6" 583 | 584 | [package.extras] 585 | doc = ["reno", "sphinx", "tornado (>=4.5)"] 586 | 587 | [[package]] 588 | name = "tomli" 589 | version = "1.2.2" 590 | description = "A lil' TOML parser" 591 | category = "dev" 592 | optional = false 593 | python-versions = ">=3.6" 594 | 595 | [[package]] 596 | name = "typing-extensions" 597 | version = "4.0.0" 598 | description = "Backported and Experimental Type Hints for Python 3.6+" 599 | category = "dev" 600 | optional = false 601 | python-versions = ">=3.6" 602 | 603 | [[package]] 604 | name = "urllib3" 605 | version = "1.26.7" 606 | description = "HTTP library with thread-safe connection pooling, file post, and more." 607 | category = "main" 608 | optional = false 609 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 610 | 611 | [package.extras] 612 | brotli = ["brotlipy (>=0.6.0)"] 613 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 614 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 615 | 616 | [metadata] 617 | lock-version = "1.1" 618 | python-versions = ">=3.8,<3.10" 619 | content-hash = "b693b00e70123dcbec0193b972ea479a6ce2d083d62010791d98cc3a8ce6b4a7" 620 | 621 | [metadata.files] 622 | asn1crypto = [ 623 | {file = "asn1crypto-1.4.0-py2.py3-none-any.whl", hash = "sha256:4bcdf33c861c7d40bdcd74d8e4dd7661aac320fcdf40b9a3f95b4ee12fde2fa8"}, 624 | {file = "asn1crypto-1.4.0.tar.gz", hash = "sha256:f4f6e119474e58e04a2b1af817eb585b4fd72bdd89b998624712b5c99be7641c"}, 625 | ] 626 | awswrangler = [ 627 | {file = "awswrangler-2.12.1-py3-none-any.whl", hash = "sha256:5d02deba6d052251c4ef3a56e77e2e1615fb32f661e41b7f4ad8cc794930a0cb"}, 628 | {file = "awswrangler-2.12.1.tar.gz", hash = "sha256:03a68f8a9f01dbb3e3a8eab6eb0b549de4790d1e851567f6020723d808d8e56d"}, 629 | ] 630 | beautifulsoup4 = [ 631 | {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, 632 | {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, 633 | ] 634 | black = [ 635 | {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, 636 | {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, 637 | ] 638 | boto3 = [ 639 | {file = "boto3-1.20.7-py3-none-any.whl", hash = "sha256:d3750ebf56b25ec54f0bbb10c1fa73c973770fba28e9bc04ba13f59d4a025812"}, 640 | {file = "boto3-1.20.7.tar.gz", hash = "sha256:cd386635d01c3474c6a2c028af4b7d36d9a45d29bfc1f7766189daefe3bbf533"}, 641 | ] 642 | botocore = [ 643 | {file = "botocore-1.23.7-py3-none-any.whl", hash = "sha256:39f9880eee40e170f8098a7cabe6de8689faa2f0313a03972f7a7c0ccc8b0e84"}, 644 | {file = "botocore-1.23.7.tar.gz", hash = "sha256:50c3bd89849f257915f2d161e056ce55ff318712077565113c435547bfea4073"}, 645 | ] 646 | certifi = [ 647 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, 648 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, 649 | ] 650 | charset-normalizer = [ 651 | {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, 652 | {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, 653 | ] 654 | click = [ 655 | {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, 656 | {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, 657 | ] 658 | colorama = [ 659 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 660 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 661 | ] 662 | decorator = [ 663 | {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, 664 | {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, 665 | ] 666 | environs = [ 667 | {file = "environs-9.3.5-py2.py3-none-any.whl", hash = "sha256:f5a3ca00afd32a82e098597c7dc8899bea5ed451d31055e518e8c7681cdf1c2b"}, 668 | {file = "environs-9.3.5.tar.gz", hash = "sha256:47128992b854cf7e279e62127100767d765a1ead8d22f355e63c00661550131b"}, 669 | ] 670 | et-xmlfile = [ 671 | {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, 672 | {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, 673 | ] 674 | idna = [ 675 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 676 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 677 | ] 678 | jinja2 = [ 679 | {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, 680 | {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, 681 | ] 682 | jmespath = [ 683 | {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, 684 | {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, 685 | ] 686 | jsonpath-ng = [ 687 | {file = "jsonpath-ng-1.5.3.tar.gz", hash = "sha256:a273b182a82c1256daab86a313b937059261b5c5f8c4fa3fc38b882b344dd567"}, 688 | {file = "jsonpath_ng-1.5.3-py2-none-any.whl", hash = "sha256:f75b95dbecb8a0f3b86fd2ead21c2b022c3f5770957492b9b6196ecccfeb10aa"}, 689 | {file = "jsonpath_ng-1.5.3-py3-none-any.whl", hash = "sha256:292a93569d74029ba75ac2dc3d3630fc0e17b2df26119a165fa1d498ca47bf65"}, 690 | ] 691 | lxml = [ 692 | {file = "lxml-4.6.4-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bbf2dc330bd44bfc0254ab37677ec60f7c7ecea55ad8ba1b8b2ea7bf20c265f5"}, 693 | {file = "lxml-4.6.4-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b667c51682fe9b9788c69465956baa8b6999531876ccedcafc895c74ad716cd8"}, 694 | {file = "lxml-4.6.4-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:72e730d33fe2e302fd07285f14624fca5e5e2fb2bb4fb2c3941e318c41c443d1"}, 695 | {file = "lxml-4.6.4-cp27-cp27m-win32.whl", hash = "sha256:433df8c7dde0f9e41cbf4f36b0829d50a378116ef5e962ba3881f2f5f025c7be"}, 696 | {file = "lxml-4.6.4-cp27-cp27m-win_amd64.whl", hash = "sha256:35752ee40f7bbf6adc9ff4e1f4b84794a3593736dcce80db32e3c2aa85e294ac"}, 697 | {file = "lxml-4.6.4-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ff5bb2a198ea67403bb6818705e9a4f90e0313f2215428ec51001ce56d939fb"}, 698 | {file = "lxml-4.6.4-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9b87727561c1150c0cc91c5d9d389448b37a7d15f0ba939ed3d1acb2f11bf6c5"}, 699 | {file = "lxml-4.6.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:45fdb2899c755138722797161547a40b3e2a06feda620cc41195ee7e97806d81"}, 700 | {file = "lxml-4.6.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:38b9de0de3aa689fe9fb9877ae1be1e83b8cf9621f7e62049d0436b9ecf4ad64"}, 701 | {file = "lxml-4.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:662523cd2a0246740225c7e32531f2e766544122e58bee70e700a024cfc0cf81"}, 702 | {file = "lxml-4.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:4aa349c5567651f34d4eaae7de6ed5b523f6d70a288f9c6fbac22d13a0784e04"}, 703 | {file = "lxml-4.6.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08eb9200d88b376a8ed5e50f1dc1d1a45b49305169674002a3b5929943390591"}, 704 | {file = "lxml-4.6.4-cp310-cp310-win32.whl", hash = "sha256:bdc224f216ead849e902151112efef6e96c41ee1322e15d4e5f7c8a826929aee"}, 705 | {file = "lxml-4.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:ab6db93a2b6b66cbf62b4e4a7135f476e708e8c5c990d186584142c77d7f975a"}, 706 | {file = "lxml-4.6.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50790313df028aa05cf22be9a8da033b86c42fa32523e4fd944827b482b17bf0"}, 707 | {file = "lxml-4.6.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6764998345552b1dfc9326a932d2bad6367c6b37a176bb73ada6b9486bf602f7"}, 708 | {file = "lxml-4.6.4-cp35-cp35m-win32.whl", hash = "sha256:543b239b191bb3b6d9bef5f09f1fb2be5b7eb09ab4d386aa655e4d53fbe9ff47"}, 709 | {file = "lxml-4.6.4-cp35-cp35m-win_amd64.whl", hash = "sha256:a75c1ad05eedb1a3ff2a34a52a4f0836cfaa892e12796ba39a7732c82701eff4"}, 710 | {file = "lxml-4.6.4-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:47e955112ce64241fdb357acf0216081f9f3255b3ac9c502ca4b3323ec1ca558"}, 711 | {file = "lxml-4.6.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:20d7c8d90d449c6a353b15ee0459abae8395dbe59ad01e406ccbf30cd81c6f98"}, 712 | {file = "lxml-4.6.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:240db6f3228d26e3c6f4fad914b9ddaaf8707254e8b3efd564dc680c8ec3c264"}, 713 | {file = "lxml-4.6.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:351482da8dd028834028537f08724b1de22d40dcf3bb723b469446564f409074"}, 714 | {file = "lxml-4.6.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e678a643177c0e5ec947b645fa7bc84260dfb9b6bf8fb1fdd83008dfc2ca5928"}, 715 | {file = "lxml-4.6.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:15d0381feb56f08f78c5cc4fc385ddfe0bde1456e37f54a9322833371aec4060"}, 716 | {file = "lxml-4.6.4-cp36-cp36m-win32.whl", hash = "sha256:4ba74afe5ee5cb5e28d83b513a6e8f0875fda1dc1a9aea42cc0065f029160d2a"}, 717 | {file = "lxml-4.6.4-cp36-cp36m-win_amd64.whl", hash = "sha256:9c91a73971a922c13070fd8fa5a114c858251791ba2122a941e6aa781c713e44"}, 718 | {file = "lxml-4.6.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:6020c70ff695106bf80651953a23e37718ef1fee9abd060dcad8e32ab2dc13f3"}, 719 | {file = "lxml-4.6.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f5dd358536b8a964bf6bd48de038754c1609e72e5f17f5d21efe2dda17594dbf"}, 720 | {file = "lxml-4.6.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7ae7089d81fc502df4b217ad77f03c54039fe90dac0acbe70448d7e53bfbc57e"}, 721 | {file = "lxml-4.6.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:80d10d53d3184837445ff8562021bdd37f57c4cadacbf9d8726cc16220a00d54"}, 722 | {file = "lxml-4.6.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e95da348d57eb448d226a44b868ff2ca5786fbcbe417ac99ff62d0a7d724b9c7"}, 723 | {file = "lxml-4.6.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ffd65cfa33fed01735c82aca640fde4cc63f0414775cba11e06f84fae2085a6e"}, 724 | {file = "lxml-4.6.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:877666418598f6cb289546c77ff87590cfd212f903b522b0afa0b9fb73b3ccfb"}, 725 | {file = "lxml-4.6.4-cp37-cp37m-win32.whl", hash = "sha256:e91d24623e747eeb2d8121f4a94c6a7ad27dc48e747e2dc95bfe88632bd028a2"}, 726 | {file = "lxml-4.6.4-cp37-cp37m-win_amd64.whl", hash = "sha256:4ec9a80dd5704ecfde54319b6964368daf02848c8954d3bacb9b64d1c7659159"}, 727 | {file = "lxml-4.6.4-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:2901625f4a878a055d275beedc20ba9cb359cefc4386a967222fee29eb236038"}, 728 | {file = "lxml-4.6.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b567178a74a2261345890eac66fbf394692a6e002709d329f28a673ca6042473"}, 729 | {file = "lxml-4.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4717123f7c11c81e0da69989e5a64079c3f402b0efeb4c6241db6c369d657bd8"}, 730 | {file = "lxml-4.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:cf201bf5594d1aab139fe53e3fca457e4f8204a5bbd65d48ab3b82a16f517868"}, 731 | {file = "lxml-4.6.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a77a3470ba37e11872c75ca95baf9b3312133a3d5a5dc720803b23098c653976"}, 732 | {file = "lxml-4.6.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:619c6d2b552bba00491e96c0518aad94002651c108a0f7364ff2d7798812c00e"}, 733 | {file = "lxml-4.6.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:601f0ab75538b280aaf1e720eb9d68d4fa104ac274e1e9e6971df488f4dcdb0f"}, 734 | {file = "lxml-4.6.4-cp38-cp38-win32.whl", hash = "sha256:75d3c5bbc0ddbad03bb68b9be638599f67e4b98ed3dcd0fec9f6f39e41ee96cb"}, 735 | {file = "lxml-4.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:4341d135f5660db10184963d9c3418c3e28d7f868aaf8b11a323ebf85813f7f4"}, 736 | {file = "lxml-4.6.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:9db24803fa71e3305fe4a7812782b708da21a0b774b130dd1860cf40a6d7a3ee"}, 737 | {file = "lxml-4.6.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:afd60230ad9d8bcba005945ec3a343722f09e0b7f8ae804246e5d2cfc6bd71a6"}, 738 | {file = "lxml-4.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:0c15e1cd55055956e77b0732270f1c6005850696bc3ef3e03d01e78af84eaa42"}, 739 | {file = "lxml-4.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6d422b3c729737d8a39279a25fa156c983a56458f8b2f97661ee6fb22b80b1d6"}, 740 | {file = "lxml-4.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2eb90f6ec3c236ef2f1bb38aee7c0d23e77d423d395af6326e7cca637519a4cb"}, 741 | {file = "lxml-4.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:51a0e5d243687596f46e24e464121d4b232ad772e2d1785b2a2c0eb413c285d4"}, 742 | {file = "lxml-4.6.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d43bd68714049c84e297c005456a15ecdec818f7b5aa5868c8b0a865cfb78a44"}, 743 | {file = "lxml-4.6.4-cp39-cp39-win32.whl", hash = "sha256:ee9e4b07b0eba4b6a521509e9e1877476729c1243246b6959de697ebea739643"}, 744 | {file = "lxml-4.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:48eaac2991b3036175b42ee8d3c23f4cca13f2be8426bf29401a690ab58c88f4"}, 745 | {file = "lxml-4.6.4-pp37-pypy37_pp73-macosx_10_14_x86_64.whl", hash = "sha256:2b06a91cf7b8acea7793006e4ae50646cef0fe35ce5acd4f5cb1c77eb228e4a1"}, 746 | {file = "lxml-4.6.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:523f195948a1ba4f9f5b7294d83c6cd876547dc741820750a7e5e893a24bbe38"}, 747 | {file = "lxml-4.6.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b0ca0ada9d3bc18bd6f611bd001a28abdd49ab9698bd6d717f7f5394c8e94628"}, 748 | {file = "lxml-4.6.4-pp38-pypy38_pp73-macosx_10_14_x86_64.whl", hash = "sha256:197b7cb7a753cf553a45115739afd8458464a28913da00f5c525063f94cd3f48"}, 749 | {file = "lxml-4.6.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:6298f5b42a26581206ef63fffa97c754245d329414108707c525512a5197f2ba"}, 750 | {file = "lxml-4.6.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0b12c95542f04d10cba46b3ff28ea52ea56995b78cf918f0b11b05e75812bb79"}, 751 | {file = "lxml-4.6.4.tar.gz", hash = "sha256:daf9bd1fee31f1c7a5928b3e1059e09a8d683ea58fb3ffc773b6c88cb8d1399c"}, 752 | ] 753 | markupsafe = [ 754 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 755 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 756 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 757 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 758 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 759 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 760 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 761 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 762 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 763 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 764 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 765 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 766 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 767 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 768 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 769 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 770 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 771 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 772 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 773 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 774 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 775 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 776 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 777 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 778 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 779 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 780 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 781 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 782 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 783 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 784 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 785 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 786 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 787 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 788 | ] 789 | marshmallow = [ 790 | {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, 791 | {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, 792 | ] 793 | mypy-extensions = [ 794 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 795 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 796 | ] 797 | numpy = [ 798 | {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, 799 | {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, 800 | {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, 801 | {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823"}, 802 | {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca"}, 803 | {file = "numpy-1.21.4-cp310-cp310-win_amd64.whl", hash = "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a"}, 804 | {file = "numpy-1.21.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63"}, 805 | {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41"}, 806 | {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377"}, 807 | {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73"}, 808 | {file = "numpy-1.21.4-cp37-cp37m-win32.whl", hash = "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f"}, 809 | {file = "numpy-1.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469"}, 810 | {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e"}, 811 | {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f"}, 812 | {file = "numpy-1.21.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f"}, 813 | {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333"}, 814 | {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6"}, 815 | {file = "numpy-1.21.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce"}, 816 | {file = "numpy-1.21.4-cp38-cp38-win32.whl", hash = "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd"}, 817 | {file = "numpy-1.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd"}, 818 | {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d"}, 819 | {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4"}, 820 | {file = "numpy-1.21.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162"}, 821 | {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880"}, 822 | {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c"}, 823 | {file = "numpy-1.21.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0"}, 824 | {file = "numpy-1.21.4-cp39-cp39-win32.whl", hash = "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2"}, 825 | {file = "numpy-1.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8"}, 826 | {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, 827 | {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, 828 | ] 829 | openpyxl = [ 830 | {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"}, 831 | {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"}, 832 | ] 833 | opensearch-py = [ 834 | {file = "opensearch-py-1.0.0.tar.gz", hash = "sha256:fa952836cabfa1b2fb05f852edc1a373342494345e89fd52b7124daf4d296bb4"}, 835 | {file = "opensearch_py-1.0.0-py2.py3-none-any.whl", hash = "sha256:17afebc25dc890b96c4e9ec8692dcfdb6842c028ce8c2d252e8f55c587960177"}, 836 | ] 837 | packaging = [ 838 | {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, 839 | {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"}, 840 | ] 841 | pandas = [ 842 | {file = "pandas-1.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9707bdc1ea9639c886b4d3be6e2a45812c1ac0c2080f94c31b71c9fa35556f9b"}, 843 | {file = "pandas-1.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c2f44425594ae85e119459bb5abb0748d76ef01d9c08583a667e3339e134218e"}, 844 | {file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a"}, 845 | {file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63"}, 846 | {file = "pandas-1.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:4acc28364863127bca1029fb72228e6f473bb50c32e77155e80b410e2068eeac"}, 847 | {file = "pandas-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5"}, 848 | {file = "pandas-1.3.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f"}, 849 | {file = "pandas-1.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f"}, 850 | {file = "pandas-1.3.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae"}, 851 | {file = "pandas-1.3.4-cp37-cp37m-win32.whl", hash = "sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec"}, 852 | {file = "pandas-1.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b"}, 853 | {file = "pandas-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4"}, 854 | {file = "pandas-1.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7"}, 855 | {file = "pandas-1.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b"}, 856 | {file = "pandas-1.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5"}, 857 | {file = "pandas-1.3.4-cp38-cp38-win32.whl", hash = "sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c"}, 858 | {file = "pandas-1.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a"}, 859 | {file = "pandas-1.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9"}, 860 | {file = "pandas-1.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab"}, 861 | {file = "pandas-1.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9"}, 862 | {file = "pandas-1.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143"}, 863 | {file = "pandas-1.3.4-cp39-cp39-win32.whl", hash = "sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd"}, 864 | {file = "pandas-1.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd"}, 865 | {file = "pandas-1.3.4.tar.gz", hash = "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc"}, 866 | ] 867 | pathspec = [ 868 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 869 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 870 | ] 871 | pg8000 = [ 872 | {file = "pg8000-1.21.3-py3-none-any.whl", hash = "sha256:d001ccaee61c4edf9788bb7837589addd218e5b4d27b075a3ec1315a3934edc0"}, 873 | {file = "pg8000-1.21.3.tar.gz", hash = "sha256:f73f1d477cda12a7b784be73c8a0c06c71e4284ef90cae4883cbc7c524b95fbf"}, 874 | ] 875 | platformdirs = [ 876 | {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, 877 | {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, 878 | ] 879 | ply = [ 880 | {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, 881 | {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, 882 | ] 883 | progressbar2 = [ 884 | {file = "progressbar2-3.55.0-py2.py3-none-any.whl", hash = "sha256:e98fee031da31ab9138fd8dd838ac80eafba82764eb75a43d25e3ca622f47d14"}, 885 | {file = "progressbar2-3.55.0.tar.gz", hash = "sha256:86835d1f1a9317ab41aeb1da5e4184975e2306586839d66daf63067c102f8f04"}, 886 | ] 887 | pyarrow = [ 888 | {file = "pyarrow-5.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:e9ec80f4a77057498cf4c5965389e42e7f6a618b6859e6dd615e57505c9167a6"}, 889 | {file = "pyarrow-5.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1453c2411b5062ba6bf6832dbc4df211ad625f678c623a2ee177aee158f199b"}, 890 | {file = "pyarrow-5.0.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:9e04d3621b9f2f23898eed0d044203f66c156d880f02c5534a7f9947ebb1a4af"}, 891 | {file = "pyarrow-5.0.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:64f30aa6b28b666a925d11c239344741850eb97c29d3aa0f7187918cf82494f7"}, 892 | {file = "pyarrow-5.0.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:99c8b0f7e2ce2541dd4c0c0101d9944bb8e592ae3295fe7a2f290ab99222666d"}, 893 | {file = "pyarrow-5.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:456a4488ae810a0569d1adf87dbc522bcc9a0e4a8d1809b934ca28c163d8edce"}, 894 | {file = "pyarrow-5.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c5493d2414d0d690a738aac8dd6d38518d1f9b870e52e24f89d8d7eb3afd4161"}, 895 | {file = "pyarrow-5.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1832709281efefa4f199c639e9f429678286329860188e53beeda71750775923"}, 896 | {file = "pyarrow-5.0.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:b6387d2058d95fa48ccfedea810a768187affb62f4a3ef6595fa30bf9d1a65cf"}, 897 | {file = "pyarrow-5.0.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bbe2e439bec2618c74a3bb259700c8a7353dc2ea0c5a62686b6cf04a50ab1e0d"}, 898 | {file = "pyarrow-5.0.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5c0d1b68e67bb334a5af0cecdf9b6a702aaa4cc259c5cbb71b25bbed40fcedaf"}, 899 | {file = "pyarrow-5.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e937ce4a40ea0cc7896faff96adecadd4485beb53fbf510b46858e29b2e75ae"}, 900 | {file = "pyarrow-5.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:7560332e5846f0e7830b377c14c93624e24a17f91c98f0b25dafb0ca1ea6ba02"}, 901 | {file = "pyarrow-5.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53e550dec60d1ab86cba3afa1719dc179a8bc9632a0e50d9fe91499cf0a7f2bc"}, 902 | {file = "pyarrow-5.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2d26186ca9748a1fb89ae6c1fa04fb343a4279b53f118734ea8096f15d66c820"}, 903 | {file = "pyarrow-5.0.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7c4edd2bacee3eea6c8c28bddb02347f9d41a55ec9692c71c6de6e47c62a7f0d"}, 904 | {file = "pyarrow-5.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:601b0aabd6fb066429e706282934d4d8d38f53bdb8d82da9576be49f07eedf5c"}, 905 | {file = "pyarrow-5.0.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ff21711f6ff3b0bc90abc8ca8169e676faeb2401ddc1a0bc1c7dc181708a3406"}, 906 | {file = "pyarrow-5.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ed135a99975380c27077f9d0e210aea8618ed9fadcec0e71f8a3190939557afe"}, 907 | {file = "pyarrow-5.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:6e1f0e4374061116f40e541408a8a170c170d0a070b788717e18165ebfdd2a54"}, 908 | {file = "pyarrow-5.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:4341ac0f552dc04c450751e049976940c7f4f8f2dae03685cc465ebe0a61e231"}, 909 | {file = "pyarrow-5.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3fc856f107ca2fb3c9391d7ea33bbb33f3a1c2b4a0e2b41f7525c626214cc03"}, 910 | {file = "pyarrow-5.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:357605665fbefb573d40939b13a684c2490b6ed1ab4a5de8dd246db4ab02e5a4"}, 911 | {file = "pyarrow-5.0.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f4db312e9ba80e730cefcae0a05b63ea5befc7634c28df56682b628ad8e1c25c"}, 912 | {file = "pyarrow-5.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1d9485741e497ccc516cb0a0c8f56e22be55aea815be185c3f9a681323b0e614"}, 913 | {file = "pyarrow-5.0.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:b3115df938b8d7a7372911a3cb3904196194bcea8bb48911b4b3eafee3ab8d90"}, 914 | {file = "pyarrow-5.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d8adda1892ef4553c4804af7f67cce484f4d6371564e2d8374b8e2bc85293e2"}, 915 | {file = "pyarrow-5.0.0.tar.gz", hash = "sha256:24e64ea33eed07441cc0e80c949e3a1b48211a1add8953268391d250f4d39922"}, 916 | ] 917 | pyathena = [ 918 | {file = "PyAthena-2.3.0-py3-none-any.whl", hash = "sha256:aa48d4675825d180e712ffa645308f7a3e8b3918efe2d77211812b847c8b6fd0"}, 919 | {file = "PyAthena-2.3.0.tar.gz", hash = "sha256:856afea495efd5b8e8c80cc06e6e4c9e77e662898aed1f528a787be54731d421"}, 920 | ] 921 | pymysql = [ 922 | {file = "PyMySQL-1.0.2-py3-none-any.whl", hash = "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641"}, 923 | {file = "PyMySQL-1.0.2.tar.gz", hash = "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36"}, 924 | ] 925 | pyparsing = [ 926 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 927 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 928 | ] 929 | python-dateutil = [ 930 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 931 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 932 | ] 933 | python-dotenv = [ 934 | {file = "python-dotenv-0.19.2.tar.gz", hash = "sha256:a5de49a31e953b45ff2d2fd434bbc2670e8db5273606c1e737cc6b93eff3655f"}, 935 | {file = "python_dotenv-0.19.2-py2.py3-none-any.whl", hash = "sha256:32b2bdc1873fd3a3c346da1c6db83d0053c3c62f28f1f38516070c4c8971b1d3"}, 936 | ] 937 | python-utils = [ 938 | {file = "python-utils-2.5.6.tar.gz", hash = "sha256:352d5b1febeebf9b3cdb9f3c87a3b26ef22d3c9e274a8ec1e7048ecd2fac4349"}, 939 | {file = "python_utils-2.5.6-py2.py3-none-any.whl", hash = "sha256:18fbc1a1df9a9061e3059a48ebe5c8a66b654d688b0e3ecca8b339a7f168f208"}, 940 | ] 941 | pytz = [ 942 | {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, 943 | {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, 944 | ] 945 | redshift-connector = [ 946 | {file = "redshift_connector-2.0.889-py3-none-any.whl", hash = "sha256:9f58781f8229c6684aa748a3832c11b8e638a5c9e74df4322c056d95e3785dbc"}, 947 | ] 948 | regex = [ 949 | {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"}, 950 | {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"}, 951 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"}, 952 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"}, 953 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"}, 954 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"}, 955 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"}, 956 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"}, 957 | {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"}, 958 | {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"}, 959 | {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"}, 960 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"}, 961 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"}, 962 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"}, 963 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"}, 964 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"}, 965 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"}, 966 | {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"}, 967 | {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"}, 968 | {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"}, 969 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"}, 970 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"}, 971 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"}, 972 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"}, 973 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"}, 974 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"}, 975 | {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"}, 976 | {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"}, 977 | {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"}, 978 | {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"}, 979 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"}, 980 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"}, 981 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"}, 982 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"}, 983 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"}, 984 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"}, 985 | {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"}, 986 | {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"}, 987 | {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"}, 988 | {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"}, 989 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"}, 990 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"}, 991 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"}, 992 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"}, 993 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"}, 994 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"}, 995 | {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"}, 996 | {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"}, 997 | {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"}, 998 | ] 999 | requests = [ 1000 | {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, 1001 | {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, 1002 | ] 1003 | requests-aws4auth = [ 1004 | {file = "requests-aws4auth-1.1.1.tar.gz", hash = "sha256:c0883346ce30b5018903a67da88df72f73ff06e1a320845bba9cd85e811ba0ba"}, 1005 | {file = "requests_aws4auth-1.1.1-py2.py3-none-any.whl", hash = "sha256:dfd9f930ffde48a756b72b55698a8522875ea6358dcffbcc44a66700ace31783"}, 1006 | ] 1007 | s3transfer = [ 1008 | {file = "s3transfer-0.5.0-py3-none-any.whl", hash = "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"}, 1009 | {file = "s3transfer-0.5.0.tar.gz", hash = "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c"}, 1010 | ] 1011 | scramp = [ 1012 | {file = "scramp-1.4.1-py3-none-any.whl", hash = "sha256:93c9cc2ffe54a451e02981c07a5a23cbd830701102789939cfb4ff91efd6ca8c"}, 1013 | {file = "scramp-1.4.1.tar.gz", hash = "sha256:f964801077be9be2a1416ffe255d2d78834b3d9d5c8ce5d28f76a856f209f70e"}, 1014 | ] 1015 | six = [ 1016 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1017 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1018 | ] 1019 | soupsieve = [ 1020 | {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"}, 1021 | {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"}, 1022 | ] 1023 | tenacity = [ 1024 | {file = "tenacity-8.0.1-py3-none-any.whl", hash = "sha256:f78f4ea81b0fabc06728c11dc2a8c01277bfc5181b321a4770471902e3eb844a"}, 1025 | {file = "tenacity-8.0.1.tar.gz", hash = "sha256:43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f"}, 1026 | ] 1027 | tomli = [ 1028 | {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, 1029 | {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, 1030 | ] 1031 | typing-extensions = [ 1032 | {file = "typing_extensions-4.0.0-py3-none-any.whl", hash = "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"}, 1033 | {file = "typing_extensions-4.0.0.tar.gz", hash = "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed"}, 1034 | ] 1035 | urllib3 = [ 1036 | {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, 1037 | {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, 1038 | ] 1039 | --------------------------------------------------------------------------------