diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..db11503 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1,4 @@ +_workflows/* +_actions/* +_* +icons.sh diff --git a/docs/.pages b/docs/.pages index ddb7912..d28dbd1 100644 --- a/docs/.pages +++ b/docs/.pages @@ -7,6 +7,6 @@ nav: - Administrative Guide: guide-adm - Development Guide: guide-dev - Glossary: glossary/ -# - Examples: stacks +# - License: license.md - Tags: tags - Links: links diff --git a/docs/components/hope/stack.md b/docs/components/hope/stack.md new file mode 100644 index 0000000..6e78241 --- /dev/null +++ b/docs/components/hope/stack.md @@ -0,0 +1,14 @@ +# Technology stack and platform +## Modern and robust technology stack + +Our open-source software is crafted with a modern technology stack, designed for high performance, flexibility, and ease of contribution. We've thoughtfully selected technology stack that emphasizes scalability, security, and strong community support. + +Our backend is powered by Python Django, providing a reliable and scalable foundation where both RESTful and Graph APIs are implemented for fast and easy data exchange and integrations with other parts of the HOPE ecosystem. + +The frontend is built using React and HTML5 to create a responsive, dynamic user interface that delivers a seamless experience. The Database is PostgreSQL which provides efficient and reliable data storage. + +The code is packaged using Docker so it can be shipped and reusable. We use Kubernetes and Helm charts for deployments to any environment. + +We use GitHub for managing code and version control, along with the GitHub Actions for build pipelines for efficient and automated workflows. + +Transparency and collaboration are at the core of our approach. Our entire tech stack is open-source and documented, making it easy for anyone to understand and deploy HOPE. Our mission is to build and foster an inclusive community where developers of all skill levels can contribute. Our technology stack embodies our commitment to building a product that is both innovative and accessible to the open-source community diff --git a/docs/components/index.md b/docs/components/index.md index caac268..73cf49a 100644 --- a/docs/components/index.md +++ b/docs/components/index.md @@ -4,10 +4,12 @@ title: Hope (core) # Ecosystem components -The whole ecosystem is composed by many different components each one available as one or more docker artefacts +HOPE is designed with a modular architecture, giving users the flexibility to customize and extend the platform according to their unique needs. It’s built to be scalable, adaptable, and interoperable, making it simple to integrate with other systems and platforms, ensuring smooth workflows and easy expansion as your needs grow. +The source code for HOPE is fully open-source and available for anyone to explore, contribute to, or customize. Our codebase is hosted on GitHub, making it easy to access, review, and collaborate on. -- HOPE (core) + +- [HOPE](hope/index.md) - [Aurora](components/aurora.md) - [Kobo](components/kobo.md) - [Payment Gateway](pg/index.md) diff --git a/docs/guide-adm/.pages b/docs/guide-adm/.pages index cae5262..f5a64c7 100644 --- a/docs/guide-adm/.pages +++ b/docs/guide-adm/.pages @@ -1,2 +1,3 @@ nav: - - ... + - Dependencies: dependencies.md + - Docker: docker.md diff --git a/docs/guide-adm/hope/dependencies.md b/docs/guide-adm/dependencies.md similarity index 100% rename from docs/guide-adm/hope/dependencies.md rename to docs/guide-adm/dependencies.md diff --git a/docs/guide-adm/hope/docker.md b/docs/guide-adm/docker.md similarity index 100% rename from docs/guide-adm/hope/docker.md rename to docs/guide-adm/docker.md diff --git a/docs/guide-adm/hope/.pages b/docs/guide-adm/hope/.pages deleted file mode 100644 index 6e78cd5..0000000 --- a/docs/guide-adm/hope/.pages +++ /dev/null @@ -1,4 +0,0 @@ -nav: - - Dependencies: dependencies.md - - Settings: settings.md - - Docker: docker.md diff --git a/docs/guide-adm/hope/settings.md b/docs/guide-adm/settings.md similarity index 100% rename from docs/guide-adm/hope/settings.md rename to docs/guide-adm/settings.md diff --git a/docs/guide-dev/.pages b/docs/guide-dev/.pages index cae5262..51dd0a8 100644 --- a/docs/guide-dev/.pages +++ b/docs/guide-dev/.pages @@ -1,2 +1,14 @@ nav: - - ... + - index.md + - setup.md + - pr.md + - lint.md +# +#arrange: +# - index.md +# - setup.md + +collapse: true + +toc: + baselevel: 1 diff --git a/docs/guide-dev/contribute.md b/docs/guide-dev/contribute.md new file mode 100644 index 0000000..4fbf649 --- /dev/null +++ b/docs/guide-dev/contribute.md @@ -0,0 +1,67 @@ +--- +title: Development Guide +--- +# Development Guide + +## Setup development environment + + +### Prerequisites + +- This project uses PDM as package manager (see https://github.com/pdm-project/pdm). +- A Postgres DB v15+ +- A Redis server +- An Elastic Search server + + +## Technology Stack + +- Python +- Postgres +- Redis +- ElasticSearch + + +## To start developing: + +### Pull Requests + +Every pull requests should contain tests to coverage the functionality. + +- Coverage of 95% on written lines is required in order to merge. +- Two reviews are needed before merging PRs + + +### Get started + +1. Install [pdm](https://github.com/pdm-project/pdm#installation) amd create virtualenv +1. Crate virtual env + 1. `pdm venv create` +1. Register the created venv for the project with + 1. `pdm use` +1. Activate your venv + 1. `pdm venv activate` +1. Check your environment + 1. eg. $`python --version` -> see that it uses Python 3.12.* + 1. eg. $`which python` -> see that it matches you python executable in the venv you have created: $```echo `pwd`/.venv/bin/python``` +1. Install the package + 1. `pdm install` +1. Setup PYTHONPATH + 1. `export PYTHONPATH="$PYTHONPATH:./src"` +1. Check and configure your environment: + 1. `./manage.py env --check` and configure the missing variables. + You can generate a list for your development environment with the command `./manage.py env --develop --config --pattern='export {key}={value}'` +1. Once the environment has been set up run the initial migrations + 1. `./manage.py migrate` +1. Make sure to set up environment variables: +1. Test using runserver $`./manage.py runserver` and logging in the admin `http://locslhost:8000/admin` + + +### Code quality + +To enhance readability of code and increase code standars we use the following +- pep8 - https://peps.python.org/pep-0008/ +- flake8 - https://flake8.pycqa.org/en/latest/ +- isort - https://pycqa.github.io/isort/ +- black - https://black.readthedocs.io/en/stable/ +- mypy - https://mypy-lang.org/ diff --git a/docs/guide-dev/dod.md b/docs/guide-dev/dod.md index ae36bc1..e6cbb65 100644 --- a/docs/guide-dev/dod.md +++ b/docs/guide-dev/dod.md @@ -2,5 +2,5 @@ 1. Pull Request Reviewed by 2 Core Developers -2. Unit Test coverage 95% -2. +1. Unit Test coverage 95% +1. Co diff --git a/docs/guide-dev/index.md b/docs/guide-dev/index.md index 9c21e9a..5d49ac6 100644 --- a/docs/guide-dev/index.md +++ b/docs/guide-dev/index.md @@ -1,72 +1,7 @@ ---- -title: Development Guide ---- -# Development Guide +We’re excited that you’re interested in contributing to HOPE! -## Setup development environment +Whether you’re a seasoned developer or new to open-source, your contributions +are welcome and appreciated. This guide will walk you through the process of +contributing and help you get started. - -### Prerequisites - -- This project uses PDM as package manager (see https://github.com/pdm-project/pdm). -- A Postgres DB v15+ -- A Redis server -- An Elastic Search server - - -## Technology Stack - -- Python -- Django -- Django REST Framework -- GraphQL -- Postgres -- Celery -- Redis -- ElasticSearch -- Kubernates - - -## To start developing: - -### Pull Requests - -Every pull requests should contain tests to coverage the functionality. - -- Coverage of 95% on written lines is required in order to merge. -- Two reviews are needed before merging PRs - - -### Get started - -1. Install [pdm](https://github.com/pdm-project/pdm#installation) amd create virtualenv -1. Crate virtual env - 1. `pdm venv create` -1. Register the created venv for the project with - 1. `pdm use` -1. Activate your venv - 1. `pdm venv activate` -1. Check your environment - 1. eg. $`python --version` -> see that it uses Python 3.12.* - 1. eg. $`which python` -> see that it matches you python executable in the venv you have created: $```echo `pwd`/.venv/bin/python``` -1. Install the package - 1. `pdm install` -1. Setup PYTHONPATH - 1. `export PYTHONPATH="$PYTHONPATH:./src"` -1. Check and configure your environment: - 1. `./manage.py env --check` and configure the missing variables. - You can generate a list for your development environment with the command `./manage.py env --develop --config --pattern='export {key}={value}'` -1. Once the environment has been set up run the initial migrations - 1. `./manage.py migrate` -1. Make sure to set up environment variables: -1. Test using runserver $`./manage.py runserver` and logging in the admin `http://locslhost:8000/admin` - - -### Code quality - -To enhance readability of code and increase code standars we use the following -- pep8 - https://peps.python.org/pep-0008/ -- flake8 - https://flake8.pycqa.org/en/latest/ -- isort - https://pycqa.github.io/isort/ -- black - https://black.readthedocs.io/en/stable/ -- mypy - https://mypy-lang.org/ +To start contributing please start [configuring your development environment](setup.md) diff --git a/docs/guide-dev/lint.md b/docs/guide-dev/lint.md new file mode 100644 index 0000000..6427f58 --- /dev/null +++ b/docs/guide-dev/lint.md @@ -0,0 +1,9 @@ +# Code quality + +To enhance readability of code and increase code standards we use the following + +- pep8 - +- flake8 - +- isort - +- black - +- mypy - diff --git a/docs/guide-dev/pr.md b/docs/guide-dev/pr.md new file mode 100644 index 0000000..0ae7f57 --- /dev/null +++ b/docs/guide-dev/pr.md @@ -0,0 +1,11 @@ + +# Pull Requests + +Every pull request should contain tests to coverage the functionality, +only PR following below rules will be considered for merging: + + +- Coverage of 95% on written lines is required in order to merge. +- Two reviews are needed before merging PRs +- Pass all our [code quality checks](lint.md) +- Pull Request related to ticket must diff --git a/docs/guide-dev/setup.md b/docs/guide-dev/setup.md new file mode 100644 index 0000000..e6032f7 --- /dev/null +++ b/docs/guide-dev/setup.md @@ -0,0 +1,36 @@ +--- +title: Setup +--- + +## Prerequisites + +This project uses PDM as package manager (see https://github.com/pdm-project/pdm), +and relies on the following components: + +- A Postgres DB v15+ +- A Redis server +- An ElasticSearch server + + +## Get started + +1. Install [pdm](https://github.com/pdm-project/pdm#installation) amd create virtualenv +1. Crate virtual env + 1. `pdm venv create` +1. Register the created venv for the project with + 1. `pdm use` +1. Activate your venv + 1. `pdm venv activate` +1. Check your environment + 1. eg. $`python --version` -> see that it uses Python 3.12.* + 1. eg. $`which python` -> see that it matches you python executable in the venv you have created: $```echo `pwd`/.venv/bin/python``` +1. Install the package + 1. `pdm install` +1. Setup PYTHONPATH + 1. `export PYTHONPATH="$PYTHONPATH:./src"` +1. Check and configure your environment: + 1. `./manage.py env --check` and configure the missing variables. + You can generate a list for your development environment with the command `./manage.py env --develop --config --pattern='export {key}={value}'` +1. Once the environment has been set up run the initial migrations + 1. `./manage.py upgrade` +1. Test using runserver $`./manage.py runserver` and logging in the admin `http://locslhost:8000/admin` diff --git a/docs/guide-user/_screenshots/pm/1.png b/docs/guide-user/_screenshots/pm/1.png new file mode 100644 index 0000000..bb6b9e9 Binary files /dev/null and b/docs/guide-user/_screenshots/pm/1.png differ diff --git a/docs/guide-user/_screenshots/pm/2.png b/docs/guide-user/_screenshots/pm/2.png new file mode 100644 index 0000000..419c5eb Binary files /dev/null and b/docs/guide-user/_screenshots/pm/2.png differ diff --git a/docs/guide-user/_screenshots/pm/3.png b/docs/guide-user/_screenshots/pm/3.png new file mode 100644 index 0000000..c6261f0 Binary files /dev/null and b/docs/guide-user/_screenshots/pm/3.png differ diff --git a/docs/guide-user/_screenshots/pm/4.png b/docs/guide-user/_screenshots/pm/4.png new file mode 100644 index 0000000..c8fe471 Binary files /dev/null and b/docs/guide-user/_screenshots/pm/4.png differ diff --git a/docs/guide-user/_screenshots/pm/5.png b/docs/guide-user/_screenshots/pm/5.png new file mode 100644 index 0000000..64da6ed Binary files /dev/null and b/docs/guide-user/_screenshots/pm/5.png differ diff --git a/docs/guide-user/program.md b/docs/guide-user/program.md index a69310b..8166d08 100644 --- a/docs/guide-user/program.md +++ b/docs/guide-user/program.md @@ -2,6 +2,70 @@ title: Program Module --- -# Program +# Program -![Image](_screenshots/program.png) +The Programme Management module is used for defining objectives and basic programme information to be matched with assistance records for reporting purposes. This module involves defining the framework within which all aspects of a humanitarian cash transfer can be created and managed. Creating a programme involves defining a programme name, code, duration, sector, scope, description, geographical area of implementation and frequency of payment. The Programme set up process also includes a step to assign Partners to the Programme. This step is optional and should only be used by country offices willing to “segregate” the view of partners or UNICEF sections to PII of a given programme (commonly referred to as Ringfencing). In this area Partner access can be restricted further by administrative areas. In case no ringfencing is required Partners would be assigned access to the whole business area. + +#### Why is Programme Management Important? + +Creating a programme in HOPE is the first step towards delivering assistance to beneficiaries in the form of interventions. + +What Do I Need to Do Before Creating a Programme in Hope? + +- Make sure the programme name is unique. +- Make sure the start and end date are correct. +- Know the allocated budget amount for the programme. +- Make sure your are familiar with the concept of programme data collection type + +## How to setup a new Programme + +#### Start + +Select the ‘Programme Management’ tab in the legend, then select ‘Create Programme’ + +![Image](_screenshots/pm/1.png) + +#### Provides infos + +Fill in the required fields for the new Programme. + +![Image](_screenshots/pm/2.png) + + +!!! note + + The data collection type parameter defines the structure of beneficiary data used in the Programme. + +1. Full Collection: Full individual data is collected. This type indicates that data has been collected for all of the household members. (Individuals with details collected = size of household). +1. Partial Individuals: Partial individual data collected. This type indicates that data has been collected for the Head of Household, collector, and at least one other individual. However, data collection has not covered every member of the household. (Individuals with details collected are less than the size of household). +1. Size only: Size only collected This type is assigned when only the size of the household (count of individuals) has been collected without collecting specific details about the household members. +1. Size/age/gender disaggregated: No individual data available. This data collection type is assigned when no data has been collected for any individual other than the head of the household. +1. Frontline Worker: This type is used for population where only individual information is collected to pay incentives for workers, and it can be named by the section implementing the programme. + + +#### Configure Partners + +Upon clicking “Next”, the programme partners page will appear where you can select a programme partner from a drop-down list and grant access to the entire business area or limit access by administrative areas. Users are also able to assign more than one partner to a programme. + +![Image](_screenshots/pm/3.png) + +#### Complete setup + +After clicking the save button, a page with the summary of the programme details will be displayed. + +Three actions can occur in the Programme Details page: + +1. To activate the programme, click on the activate button. +1. To change programme settings, click on the Edit button. +1. To remove the programme, click on the remove button. (Note that you can only remove a programme in draft status) + +![Image](_screenshots/pm/4.png) + +#### Activate the Program + +After the programme is activated, the following actions can be performed on the programme: + +1. Edit Programme: to update programme’s details. +1. Finish Programme: to deactivate the programme after it has been completed. + +![Image](_screenshots/pm/5.png) diff --git a/docs/license.md b/docs/license.md new file mode 100644 index 0000000..8287b61 --- /dev/null +++ b/docs/license.md @@ -0,0 +1,2 @@ + +{{ gitsnippet('git@github.com:unicef/hope.git', 'LICENSE', '## Installation') }} diff --git a/mkdocs.yml b/mkdocs.yml index 1705466..66efac9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -107,12 +107,18 @@ theme: plugins: - alias -# - gen-files: -# scripts: + - gen-files: + scripts: # - docs/_scripts/build_glossary.py -# - docs/_scripts/get_settings.py + - docs/_scripts/get_settings.py - autorefs - - awesome-pages + - awesome-pages: + filename: .pages + collapse_single_pages: true + strict: false + order: asc + sort_type: natural + order_by: title - ezglossary: templates: docs/_theme/glossary inline_refs: none diff --git a/pdm.lock b/pdm.lock index 8dfe94e..402df95 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:329dfeaf8a6d25d93b561a9cb0903d6048e91e770e92d664a4ce4ae5a769f4bd" +content_hash = "sha256:ab0d6aa8b9ceccf43a4d69361000119201d49896c6634862699595aee23bcd83" [[metadata.targets]] requires_python = "==3.12.*" @@ -38,6 +38,20 @@ files = [ {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +requires_python = ">=3.6.0" +summary = "Screen-scraping library" +groups = ["default"] +dependencies = [ + "soupsieve>1.2", +] +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + [[package]] name = "bracex" version = "2.5" @@ -49,6 +63,48 @@ files = [ {file = "bracex-2.5.tar.gz", hash = "sha256:0725da5045e8d37ea9592ab3614d8b561e22c3c5fde3964699be672e072ab611"}, ] +[[package]] +name = "brotli" +version = "1.1.0" +summary = "Python bindings for the Brotli compression library" +groups = ["default"] +marker = "platform_python_implementation == \"CPython\"" +files = [ + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, + {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, +] + +[[package]] +name = "brotlicffi" +version = "1.1.0.0" +requires_python = ">=3.7" +summary = "Python CFFI bindings to the Brotli library" +groups = ["default"] +marker = "platform_python_implementation != \"CPython\"" +dependencies = [ + "cffi>=1.0.0", +] +files = [ + {file = "brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613"}, + {file = "brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13"}, +] + [[package]] name = "cairocffi" version = "1.7.1" @@ -219,6 +275,51 @@ files = [ {file = "fancycompleter-0.9.1.tar.gz", hash = "sha256:09e0feb8ae242abdfd7ef2ba55069a46f011814a80fe5476be48f51b00247272"}, ] +[[package]] +name = "fonttools" +version = "4.53.1" +requires_python = ">=3.8" +summary = "Tools to manipulate font files" +groups = ["default"] +files = [ + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, +] + +[[package]] +name = "fonttools" +version = "4.53.1" +extras = ["woff"] +requires_python = ">=3.8" +summary = "Tools to manipulate font files" +groups = ["default"] +dependencies = [ + "brotli>=1.0.1; platform_python_implementation == \"CPython\"", + "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\"", + "fonttools==4.53.1", + "zopfli>=0.1.4", +] +files = [ + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -232,6 +333,35 @@ files = [ {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] +[[package]] +name = "gitdb" +version = "4.0.11" +requires_python = ">=3.7" +summary = "Git Object Database" +groups = ["default"] +dependencies = [ + "smmap<6,>=3.0.1", +] +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[[package]] +name = "gitpython" +version = "3.1.43" +requires_python = ">=3.7" +summary = "GitPython is a Python library used to interact with Git repositories" +groups = ["default"] +dependencies = [ + "gitdb<5,>=4.0.1", + "typing-extensions>=3.7.4.3; python_version < \"3.8\"", +] +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + [[package]] name = "griffe" version = "1.2.0" @@ -247,6 +377,21 @@ files = [ {file = "griffe-1.2.0.tar.gz", hash = "sha256:1c9f6ef7455930f3f9b0c4145a961c90385d1e2cbc496f7796fbff560ec60d31"}, ] +[[package]] +name = "html5lib" +version = "1.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "HTML parser based on the WHATWG HTML specification" +groups = ["default"] +dependencies = [ + "six>=1.9", + "webencodings", +] +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + [[package]] name = "idna" version = "3.8" @@ -258,6 +403,35 @@ files = [ {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] +[[package]] +name = "importlib-metadata" +version = "8.4.0" +requires_python = ">=3.8" +summary = "Read metadata from Python packages" +groups = ["default"] +dependencies = [ + "typing-extensions>=3.6.4; python_version < \"3.8\"", + "zipp>=0.5", +] +files = [ + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, +] + +[[package]] +name = "importlib-resources" +version = "6.4.4" +requires_python = ">=3.8" +summary = "Read resources from Python packages" +groups = ["default"] +dependencies = [ + "zipp>=3.1.0; python_version < \"3.10\"", +] +files = [ + {file = "importlib_resources-6.4.4-py3-none-any.whl", hash = "sha256:dda242603d1c9cd836c3368b1174ed74cb4049ecd209e7a1a0104620c18c5c11"}, + {file = "importlib_resources-6.4.4.tar.gz", hash = "sha256:20600c8b7361938dc0bb2d5ec0297802e575df486f5a544fa414da65e13721f7"}, +] + [[package]] name = "jinja2" version = "3.1.4" @@ -330,6 +504,26 @@ files = [ {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] +[[package]] +name = "mike" +version = "2.1.3" +summary = "Manage multiple versions of your MkDocs-powered documentation" +groups = ["default"] +dependencies = [ + "importlib-metadata", + "importlib-resources", + "jinja2>=2.7", + "mkdocs>=1.0", + "pyparsing>=3.0", + "pyyaml-env-tag", + "pyyaml>=5.1", + "verspec", +] +files = [ + {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, + {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, +] + [[package]] name = "mkdocs" version = "1.6.0" @@ -508,6 +702,21 @@ files = [ {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, ] +[[package]] +name = "mkdocs-gitsnippet-plugin" +version = "1.2.0" +requires_python = ">=2.7.9,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +summary = "Mkdocs plugin that allow to inject snippet or all markdown content from a given remote git repository." +groups = ["default"] +dependencies = [ + "gitpython", + "mkdocs>=0.17", +] +files = [ + {file = "mkdocs-gitsnippet-plugin-1.2.0.tar.gz", hash = "sha256:f1f653629407515a83ce2c2213a2342649f11c795fb468edd8c85625bdb6cd93"}, + {file = "mkdocs_gitsnippet_plugin-1.2.0-py3-none-any.whl", hash = "sha256:3f3a0eb4d70bc7d51f6b3803be4e6b6014a84546e231223cb9cd02bfb8d2d79e"}, +] + [[package]] name = "mkdocs-include-markdown-plugin" version = "6.2.2" @@ -573,6 +782,22 @@ files = [ {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] +[[package]] +name = "mkdocs-pdf-export-plugin" +version = "0.5.10" +requires_python = ">=3.5" +summary = "An MkDocs plugin to export content pages as PDF files" +groups = ["default"] +dependencies = [ + "beautifulsoup4>=4.6.3", + "mkdocs>=0.17", + "weasyprint>=0.44", +] +files = [ + {file = "mkdocs-pdf-export-plugin-0.5.10.tar.gz", hash = "sha256:77ba89ebea6f565286fb04360e3d9810567e27302383c9e2b6fa386f8ecca7d9"}, + {file = "mkdocs_pdf_export_plugin-0.5.10-py3-none-any.whl", hash = "sha256:e6e58f8bdedb300423336b00ea1846516f471b529ea85cb7f254fa2a2ee577d8"}, +] + [[package]] name = "mkdocs-simple-hooks" version = "0.1.5" @@ -741,6 +966,17 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pydyf" +version = "0.11.0" +requires_python = ">=3.8" +summary = "A low-level PDF generator." +groups = ["default"] +files = [ + {file = "pydyf-0.11.0-py3-none-any.whl", hash = "sha256:0aaf9e2ebbe786ec7a78ec3fbffa4cdcecde53fd6f563221d53c6bc1328848a3"}, + {file = "pydyf-0.11.0.tar.gz", hash = "sha256:394dddf619cca9d0c55715e3c55ea121a9bf9cbc780cdc1201a2427917b86b64"}, +] + [[package]] name = "pygments" version = "2.18.0" @@ -777,6 +1013,28 @@ files = [ {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, ] +[[package]] +name = "pyparsing" +version = "3.1.4" +requires_python = ">=3.6.8" +summary = "pyparsing module - Classes and methods to define and execute parsing grammars" +groups = ["default"] +files = [ + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, +] + +[[package]] +name = "pyphen" +version = "0.16.0" +requires_python = ">=3.8" +summary = "Pure Python module to hyphenate text" +groups = ["default"] +files = [ + {file = "pyphen-0.16.0-py3-none-any.whl", hash = "sha256:b4a4c6d7d5654b698b5fc68123148bb799b3debe0175d1d5dc3edfe93066fc4c"}, + {file = "pyphen-0.16.0.tar.gz", hash = "sha256:2c006b3ddf072c9571ab97606d9ab3c26a92eaced4c0d59fd1d26988f308f413"}, +] + [[package]] name = "pyreadline" version = "2.1" @@ -896,6 +1154,28 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "smmap" +version = "5.0.1" +requires_python = ">=3.7" +summary = "A pure Python implementation of a sliding window memory map manager" +groups = ["default"] +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +requires_python = ">=3.8" +summary = "A modern CSS selector implementation for Beautiful Soup." +groups = ["default"] +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + [[package]] name = "tinycss2" version = "1.3.0" @@ -921,6 +1201,16 @@ files = [ {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] +[[package]] +name = "verspec" +version = "0.1.0" +summary = "Flexible version handling" +groups = ["default"] +files = [ + {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, + {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, +] + [[package]] name = "watchdog" version = "5.0.0" @@ -958,6 +1248,27 @@ files = [ {file = "wcmatch-9.0.tar.gz", hash = "sha256:567d66b11ad74384954c8af86f607857c3bdf93682349ad32066231abd556c92"}, ] +[[package]] +name = "weasyprint" +version = "62.3" +requires_python = ">=3.9" +summary = "The Awesome Document Factory" +groups = ["default"] +dependencies = [ + "Pillow>=9.1.0", + "Pyphen>=0.9.1", + "cffi>=0.6", + "cssselect2>=0.1", + "fonttools[woff]>=4.0.0", + "html5lib>=1.1", + "pydyf>=0.10.0", + "tinycss2>=1.3.0", +] +files = [ + {file = "weasyprint-62.3-py3-none-any.whl", hash = "sha256:d31048646ce15084e135b33e334a61f526aa68d2f679fcc109ed0e0f5edaed21"}, + {file = "weasyprint-62.3.tar.gz", hash = "sha256:8d8680d732f7fa0fcbc587692a5a5cb095c3525627066918d6e203cbf42b7fcd"}, +] + [[package]] name = "webencodings" version = "0.5.1" @@ -981,3 +1292,34 @@ files = [ {file = "wmctrl-0.5-py2.py3-none-any.whl", hash = "sha256:ae695c1863a314c899e7cf113f07c0da02a394b968c4772e1936219d9234ddd7"}, {file = "wmctrl-0.5.tar.gz", hash = "sha256:7839a36b6fe9e2d6fd22304e5dc372dbced2116ba41283ea938b2da57f53e962"}, ] + +[[package]] +name = "zipp" +version = "3.20.1" +requires_python = ">=3.8" +summary = "Backport of pathlib-compatible object wrapper for zip files" +groups = ["default"] +files = [ + {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, + {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, +] + +[[package]] +name = "zopfli" +version = "0.2.3" +requires_python = ">=3.8" +summary = "Zopfli module for python" +groups = ["default"] +files = [ + {file = "zopfli-0.2.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2073b07c3ec4fcbc895bb02565a90f9f31373233979f6be398e82eacbd1105f3"}, + {file = "zopfli-0.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1f25f1bb6440ed90a1d458772fa6ce53632f5fb61e435b12ae6b9b39af98d758"}, + {file = "zopfli-0.2.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d8a73bee07cf7f2c73e08508bf788bfdf28a527da353b5d3e2a0ee4aaf770c"}, + {file = "zopfli-0.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d40373db61883f6fc8b7040c9196a16f737e3063632afd15e8b3f25e871a30e8"}, + {file = "zopfli-0.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c467a300ba46f55aa0ea958ea388e350eefd039cf15764bf4cd737d5eeb8a6"}, + {file = "zopfli-0.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c3c61787a90439cf68f751b2a1ab789b0805876c0cd9b58398adc212d1eeace5"}, + {file = "zopfli-0.2.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e4675ca4c7b1215b8a53cec1831cbdb6914f91ea2f183817a06fc7b38e27642"}, + {file = "zopfli-0.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f48de4818c10c539fdd01276512043ae4ae738e0301e9cace1dd38f4bcffad6a"}, + {file = "zopfli-0.2.3-cp312-cp312-win32.whl", hash = "sha256:7769f6ca73f37dff92159127bd25b0cc7d81d3feb819d355dc7ac01ad05c673d"}, + {file = "zopfli-0.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:1c5fd29730024f5fb0e2623e3853ca422bd3cf57042389c8e0e771dc47f88084"}, + {file = "zopfli-0.2.3.zip", hash = "sha256:dbc9841bedd736041eb5e6982cd92da93bee145745f5422f3795f6f258cdc6ef"}, +] diff --git a/pyproject.toml b/pyproject.toml index 056e909..0d0d0bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,9 @@ dependencies = [ "pillow>=10.4.0", "requests>=2.32.3", "django-environ>=0.11.2", + "mkdocs-pdf-export-plugin>=0.5.10", + "mike>=2.1.3", + "mkdocs-gitsnippet-plugin>=1.2.0", ] requires-python = "==3.12.*" readme = "README.md"