From 95c248e221a6c2c9291e89d79536f66945032379 Mon Sep 17 00:00:00 2001 From: Artem Rys Date: Mon, 18 Oct 2021 17:49:15 +0200 Subject: [PATCH] docs: initial docs --- .github/workflows/docs.yml | 15 ++++++ .gitignore | 3 +- .licenserc.yaml | 3 +- README.md | 74 +-------------------------- docs/Makefile | 20 -------- docs/conf.py | 51 ------------------- docs/{example.rst => example.md} | 85 ++++++++++++++------------------ docs/how_to_use.md | 58 ++++++++++++++++++++++ docs/how_to_use.rst | 49 ------------------ docs/index.md | 38 ++++++++++++++ docs/index.rst | 24 --------- docs/make.bat | 35 ------------- docs/overview.rst | 33 ------------- docs/troubleshooting.md | 15 ++++++ docs/troubleshooting.rst | 14 ------ mkdocs.yml | 25 ++++++++++ poetry.lock | 20 -------- 17 files changed, 193 insertions(+), 369 deletions(-) create mode 100644 .github/workflows/docs.yml delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py rename docs/{example.rst => example.md} (52%) create mode 100644 docs/how_to_use.md delete mode 100644 docs/how_to_use.rst create mode 100644 docs/index.md delete mode 100644 docs/index.rst delete mode 100644 docs/make.bat delete mode 100644 docs/overview.rst create mode 100644 docs/troubleshooting.md delete mode 100644 docs/troubleshooting.rst create mode 100644 mkdocs.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..e289d4015 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,15 @@ +name: docs +on: + push: + branches: + - main +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.7 + - run: pip install mkdocs mkdocs-material + - run: mkdocs gh-deploy --force diff --git a/.gitignore b/.gitignore index 488163ff9..bd3bdabb6 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ output # splunk_add_on_ucc_framework/package/default/data/ui/views/redirect.xml # splunk_add_on_ucc_framework/uccrestbuilder/builder.py .gitmodules -.pytest_cache/** \ No newline at end of file +.pytest_cache/** +site/ diff --git a/.licenserc.yaml b/.licenserc.yaml index 477562768..c4f9c4efc 100644 --- a/.licenserc.yaml +++ b/.licenserc.yaml @@ -23,7 +23,6 @@ header: - ".github/" - ".vscode/" - "dist" - - "licenses" - "**/*.md" - "LICENSE" - "NOTICE" @@ -33,6 +32,8 @@ header: - "splunk_add_on_ucc_framework/arf_dir_templates/modular_alert_package.settings" - "splunk_add_on_ucc_framework/modular_alert_builder/build_core/arf_template/**" - "tests/**" + - "README.md" + - "mkdocs.yml" - ".*" comment: on-failure diff --git a/README.md b/README.md index 94d88dfc6..d141d4e4f 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,17 @@ -# SPDX-FileCopyrightText: 2020 Splunk Inc. - # splunk-add-on-ucc-framework ![PyPI](https://img.shields.io/pypi/v/splunk-add-on-ucc-framework) ![Python](https://img.shields.io/pypi/pyversions/splunk-add-on-ucc-framework.svg) -A framework to generate UI based Splunk Add-ons. It includes UI, Rest handler, Modular input, Oauth, Alert action templates. - -> Note: after UCC 5.2 Python 2 specific libraries are not supported anymore. -> This means if the add-on has `package/lib/py2/requirements.txt` they will -> not be installed while running `ucc-gen` command. Therefore modular inputs -> that are supposed to run on Python 2 will not be supported by UCC. - -Available as a Github action here: https://github.com/splunk/addonfactory-ucc-generator-action - ## What is UCC? UCC stands for Universal Configuration Console. It is a service for generating Splunk Add-ons which is easily customizable and flexible. UCC provides basic UI template for creating Addon's UI. It is helpful to control the activity by using hooks and other functionalities. +## Usage -## Features - -- Generate UCC based addons for your Splunk Technology Add-ons - -## UCC 5 - -UCC 5 has potentially breaking changes to add-ons using hook extension in the UX. Previously such hooks were limited to un-optimized js files placed in the package. -Add-ons may now package such extensions with webpack. - -## Requirements - -- Addon package and globalConfig.json file - -> Note: You may refer the globalConfig.json file [here](https://github.com/splunk/addonfactory-ucc-generator/blob/main/tests/data/package_global_config_configuration/globalConfig.json) - - -## Installation - -"splunk-add-on-ucc-framework" can be installed via `pip` from `PyPI`: - -```bash -$ pip3 install splunk-add-on-ucc-framework -``` +For full usage instructions, please visit the Splunk Connect for Syslog [documentation](https://splunk.github.io/addonfactory-ucc-generator/). ## pre-commit Please visit `pre-commit` quick start [section](https://pre-commit.com/#quick-start). - -## How to use - -To build the UCC based addon follow the below steps: - -1. Install the `splunk-add-on-ucc-framework` via `pip3`. -2. Run the `ucc-gen` command. -3. Make sure that `package` folder and `globalConfig.json` file are present in the addon folder. -4. The final addon package will be generated, in the `output` folder. - - -## Workflow - -By the running the `ucc-gen` command, the following steps are executed: -1. Cleaning out the `output` folder. -2. Retrieve the package ID of addon. -3. Copy UCC template directory under `output/` directory. -4. Copy `globalConfig.json` file to `output//appserver/static/js/build` directory. -5. Collect and install Addon's requirements into `output//lib` directory of addon's package. -6. For the addon's requirements, packages are installed according to following table: - - | File Name | Description | Output directory in UCC build | - |----------------------|-------------------------------------|-------------------------------| - | lib/requirements.txt | Python3 compatible packages | output//lib | - -7. Replace tokens in views. -8. Copy addon's `package/*` to `output//*` directory. -9. If an addon requires some additional configurations in packaging than implement the steps in additional_packaging.py - -## Params - -splunk-add-on-ucc-framework supports the following params: - -| Name | Description | -|------------|----------------------------------------------------------------------------------------------------------| -| source | Folder containing the app.manifest and app source | -| config | Path to the configuration file, Defaults to GlobalConfig.json in the parent directory of source provided | -| ta-version | Optional override Current version of TA, Default version is version specified in globalConfig.json a Splunkbase compatible version of SEMVER will be used by default | diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d4bb2cbb9..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index d8da57c46..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,51 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = "addonfactory-ucc-generator" -copyright = "2021, Splunk, Inc." -author = "Splunk, Inc." - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] diff --git a/docs/example.rst b/docs/example.md similarity index 52% rename from docs/example.rst rename to docs/example.md index ee553736b..72e975224 100644 --- a/docs/example.rst +++ b/docs/example.md @@ -1,40 +1,30 @@ UCC usage ========= -Let's assume that you want to create a Splunk add-on with UI to specify Splunk -index that is going to be used in the add-on. Let's also assume that you do not -want to show indexes that are for internal use only (like, :code:`_internal`). +Let's assume that you want to create a Splunk add-on with UI to specify +Splunk index that is going to be used in the add-on. Let's also assume +that you do not want to show indexes that are for internal use only +(like, `_internal`). -For this you can create a :code:`globalConfig.json` file and specify that you -want one configuration tab called "Global Settings", one UI component on that -tab that will handle index management and store selected index in specific -add-on configuration file. +For this you can create a globalConfig.json file and specify that you +want one configuration tab called "Global Settings", one UI component on +that tab that will handle index management and store selected index in +specific add-on configuration file. -.. literalinclude:: example/globalConfig.json - :language: JSON +You also need a package folder and `app.manifest` inside it. -You also need a :code:`package` folder and :code:`app.manifest` inside it. +As well as `README.txt` and `LICENSE.txt` files inside package folder. Those +files may be empty to simplify the showcase of UCC. -.. literalinclude:: example/app.manifest - :language: JSON +To be able to utilise UI features of an add-on you need to create lib +folder in package folder and create `requirements.txt`. -As well as :code:`README.txt` and :code:`LICENSE.txt` files inside -:code:`package` folder. Those files may be empty to simplify the showcase of UCC. +Now you are ready to run `ucc-gen` command. If you don't have it +installed, please refer to installation section. -To be able to utilise UI features of an add-on you need to create :code:`lib` -folder in :code:`package` folder and create :code:`requirements.txt`. - -.. literalinclude:: example/requirements.txt - :language: text - -Now you are ready to run :code:`ucc-gen` command. If you don't have it installed, -please refer to :ref:`installation` section. - -The structure of the add-on before running :code:`ucc-gen` command should be +The structure of the add-on before running `ucc-gen` command should be like this: -:: - ├── globalConfig.json └── package ├── LICENSE.txt @@ -43,19 +33,16 @@ like this: └── lib └── requirements.txt +Let's assume we want to generate an add-on with version 1.0.0, to +achieve that we run: -Let's assume we want to generate an add-on with version :code:`1.0.0`, to achieve -that we run: +``` +ucc-gen --ta-version=1.0.0 +``` -.. code-block:: console - - ucc-gen --ta-version=1.0.0 - -After that, :code:`output` folder should be created. It should contain -:code:`Splunk_TA_choose_index` folder. And the structure of -:code:`Splunk_TA_choose_index` is following: - -:: +After that, output folder should be created. It should contain +`Splunk_TA_choose_index` folder. And the structure of +`Splunk_TA_choose_index` is following: Splunk_TA_choose_index ├── LICENSE.txt @@ -100,22 +87,22 @@ After that, :code:`output` folder should be created. It should contain └── web.conf Now it's time to package our add-on and install it to Splunk. To install -:code:`slim` refer to :ref:`steps`. +slim refer to steps. To package this particular add-on run: -.. code-block:: console - - slim package output/Splunk_TA_choose_index +``` +slim package output/Splunk_TA_choose_index +``` -After it runs, you should see an archive created in the root folder of your -add-on. In our case, it should have name: -:code:`Splunk_TA_choose_index-1.0.0.tar.gz`. +After it runs, you should see an archive created in the root folder of +your add-on. In our case, it should have name: +`Splunk_TA_choose_index-1.0.0.tar.gz`. -This is an archive that can be loaded into Splunk through -"Apps > Manage Apps > Install app from file" interface. +This is an archive that can be loaded into Splunk through "Apps > +Manage Apps > Install app from file" interface. -Once you load it and restart Splunk, you can go to -"Apps > Splunk Add-on to choose index" and see interface like this one. +Once you load it and restart Splunk, you can go to "Apps > Splunk +Add-on to choose index" and see interface like this one. -.. image:: images/splunk_add_on_choose_index.png \ No newline at end of file +![image](images/splunk_add_on_choose_index.png) diff --git a/docs/how_to_use.md b/docs/how_to_use.md new file mode 100644 index 000000000..7614cb730 --- /dev/null +++ b/docs/how_to_use.md @@ -0,0 +1,58 @@ +How To Use +========== + +Prerequisites +------------- + +- `globalConfig.json` +- `package` folder +- `git` for automatic versioning (when no `ta-version` argument is + specified) + +Example of globalConfig.json and package folder can be found at +. + +Steps +----- + +- Install `splunk-add-on-ucc-framework` if it is not installed. +- Run the `ucc-gen` command. +- The final addon package will be generated, in the `output` folder. + +ucc-gen supports the following params: + +- source - [optional] folder containing the `app.manifest` and app + source. +- config - [optional] path to the configuration file, defaults to + `globalConfig.json` in the parent directory of source provided. +- ta-version - [optional] override current version of TA, default + version is version specified in `globalConfig.json`. Splunkbase + compatible version of SEMVER will be used by default. + +``` +pip install splunk-packaging-toolkit +slim package output/ +``` + +After completing the packaging slim should also output path to the +package for distribution. + +What ucc-gen does +----------------- + +- Cleans the output folder. +- Retrieve the package ID of addon. +- Copy UCC template directory under `output/` directory. +- Copy globalConfig.json file to + `output//appserver/static/js/build` directory. +- Collect and install Addon's requirements into + `output//lib` directory of addon's package. +- For the addon's requirements, packages are installed according to + following table: + - `lib/requirements.txt` - install Python3 compatible packages into + `output//lib` +- Replace tokens in views. +- Copy addon's `package/*` to `output//*` directory. +- If an addon requires some additional configurations in packaging + than implement the steps in `additional_packaging.py` + diff --git a/docs/how_to_use.rst b/docs/how_to_use.rst deleted file mode 100644 index fa8f19e1a..000000000 --- a/docs/how_to_use.rst +++ /dev/null @@ -1,49 +0,0 @@ -How To Use -========== - -Prerequisites -------------- - -* :code:`globalConfig.json` -* :code:`package` folder -* :code:`git` for automatic versioning (when no :code:`ta-version` argument is specified) - -Example of :code:`globalConfig.json` and :code:`package` folder can be found at https://github.com/splunk/splunk-add-on-for-ucc-example. - -.. _steps: - -Steps ------ - -* Install :code:`splunk-add-on-ucc-framework` if it is not installed. -* Run the :code:`ucc-gen` command. -* The final addon package will be generated, in the :code:`output` folder. - -:code:`ucc-gen` supports the following params: - -* :code:`source` - [optional] folder containing the app.manifest and app source. -* :code:`config` - [optional] path to the configuration file, defaults to :code:`globalConfig.json` in the parent directory of source provided. -* :code:`ta-version` - [optional] override current version of TA, default version is version specified in :code:`globalConfig.json`. Splunkbase compatible version of SEMVER will be used by default. - -.. code-block:: console - - pip install splunk-packaging-toolkit - slim package output/ - -After completing the packaging slim should also output path to the package for distribution. - -What ucc-gen does ------------------ - -* Cleans the :code:`output` folder. -* Retrieve the package ID of addon. -* Copy UCC template directory under :code:`output/` directory. -* Copy :code:`globalConfig.json` file to :code:`output//appserver/static/js/build` directory. -* Collect and install Addon's requirements into :code:`output//lib` directory of addon's package. -* For the addon's requirements, packages are installed according to following table: - - * :code:`lib/requirements.txt` - install Python3 compatible packages into :code:`output//lib` - -* Replace tokens in views. -* Copy addon's :code:`package/*` to :code:`output//*` directory. -* If an addon requires some additional configurations in packaging than implement the steps in :code:`additional_packaging.py` \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..0b922a217 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,38 @@ +Overview +======== + +splunk-add-on-ucc-framework is a framework to generate UI based Splunk +Add-ons. It includes UI, Rest handler, Modular input, Oauth, Alert +action templates. + +> After UCC 5.2 Python 2 specific libraries are not supported anymore. +> : This means if the add-on has package/lib/py2/requirements.txt they +> will not be installed while running ucc-gen command. Therefore +> modular inputs that are supposed to run on Python 2 will not be +> supported by UCC. +> + +Available as a Github action here: + + +What is UCC? +------------ + +UCC stands for Universal Configuration Console. The purpose of having a +framework for add-on generation is to simplify the process of add-on +creation for the developers. UCC 5.X uses SplunkUI which is a new UI +framework based on React. + +Features +-------- + +- Generate UCC based addons for your Splunk Technology Add-ons + +Installation +------------ + +splunk-add-on-ucc-framework can be installed via pip from PyPI: + +``` +pip3 install splunk-add-on-ucc-framework +``` diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 6bb89a4f0..000000000 --- a/docs/index.rst +++ /dev/null @@ -1,24 +0,0 @@ -.. addonfactory-ucc-generator documentation master file, created by - sphinx-quickstart on Thu May 20 13:22:45 2021. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to addonfactory-ucc-generator's documentation! -====================================================== - -.. toctree:: - :maxdepth: 2 - :caption: Table of Contents - - overview - how_to_use - example - troubleshooting - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 2119f5109..000000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/overview.rst b/docs/overview.rst deleted file mode 100644 index 866918342..000000000 --- a/docs/overview.rst +++ /dev/null @@ -1,33 +0,0 @@ -Overview -======== -splunk-add-on-ucc-framework is a framework to generate UI based Splunk Add-ons. -It includes UI, Rest handler, Modular input, Oauth, Alert action templates. - -.. note:: - After UCC 5.2 Python 2 specific libraries are not supported anymore. - This means if the add-on has :code:`package/lib/py2/requirements.txt` they will - not be installed while running :code:`ucc-gen` command. Therefore modular inputs - that are supposed to run on Python 2 will not be supported by UCC. - -Available as a Github action here: https://github.com/splunk/addonfactory-ucc-generator-action - -What is UCC? ------------- -UCC stands for Universal Configuration Console. -The purpose of having a framework for add-on generation is to simplify the -process of add-on creation for the developers. -UCC 5.X uses SplunkUI which is a new UI framework based on React. - -Features --------- -* Generate UCC based addons for your Splunk Technology Add-ons - -.. _installation: - -Installation ------------- -splunk-add-on-ucc-framework can be installed via pip from PyPI: - -.. code-block:: console - - pip3 install splunk-add-on-ucc-framework diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 000000000..5d774a641 --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,15 @@ +Troubleshooting +=============== + +Splunk calls your modular input only once +----------------------------------------- + +In case Splunk calls your modular input only once however you are +specifying an interval within it should call your script - check +`use_single_instance` variable in `get_scheme` method of your modular +input class. It should be set False so that Splunk can schedule the +input accordingly. + +To be able to understand that Splunk does not schedule your modular +input script, search for "index=_internal ExecProcessor" and look for +"interval: run once" near your script name. diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst deleted file mode 100644 index 1e3209653..000000000 --- a/docs/troubleshooting.rst +++ /dev/null @@ -1,14 +0,0 @@ -Troubleshooting -=============== - -Splunk calls your modular input only once ------------------------------------------ - -In case Splunk calls your modular input only once however you are specifying an -interval within it should call your script - check :code:`use_single_instance` -variable in :code:`get_scheme` method of your modular input class. It should be -set :code:`False` so that Splunk can schedule the input accordingly. - -To be able to understand that Splunk does not schedule your modular input script, -search for :code:`"index=_internal ExecProcessor"` and look for -:code:`"interval: run once"` near your script name. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..2e90296f5 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,25 @@ +site_name: Splunk Add-on UCC Framework + +extra: + version: + provider: mike + +markdown_extensions: + - toc: + permalink: True + - smarty + - fenced_code + - sane_lists + - codehilite + +theme: + name: "material" + palette: + primary: "black" + accent: "orange" + +nav: + - Home: "index.md" + - "How to use": "how_to_use.md" + - Example: "example.md" + - Troubleshooting: "troubleshooting.md" diff --git a/poetry.lock b/poetry.lock index 491195607..291a66d0f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -455,22 +455,12 @@ jsonschema = [ {file = "jsonschema-4.1.0.tar.gz", hash = "sha256:9dd7c33b4a96138dc37bb86b3610d3b12d30d96433d4d73435ca3025804154a8"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -479,21 +469,14 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -503,9 +486,6 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},