diff --git a/.vscode/settings.json b/.vscode/settings.json index ebf2ca965..8902672fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -118,5 +118,8 @@ "python.analysis.typeCheckingMode": "basic", "jupyter.notebookFileRoot": "${fileDirname}", "C_Cpp.clang_format_fallbackStyle": "Google", - "editor.defaultFormatter": "ms-python.black-formatter" + "editor.defaultFormatter": "ms-python.black-formatter", + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 09dc4efac..a52826cc2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,20 +1,19 @@ -# How to Contribute +# Contributing -This guide describes how to contribute to Temporian, and will help you set up your environment and create your first submission. +Temporian is an open source project - we warmly welcome and appreciate any kind of contribution! 🤝🏼 -## Contributor License Agreement +This guide describes how to contribute, and will help you set up your environment and create your first submission. -Contributions to this project must be accompanied by a Contributor License Agreement. +Check out the open [GitHub issues](https://github.com/google/temporian/issues) to see what we're working on, and what we need help with. +Look especially for the `good first issue` label, which indicates issues that are suitable for new contributors. -You (or your employer) retain the copyright to your contribution, this simply gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or sign a new one. - -You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably won't need to do it again. +If you'd like help or additional guidance to contribute, please join our [Discord](https://discord.gg/x8rm9YYy). ## Code reviews All submissions, including submissions by project members, require review. We use GitHub Pull Requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. -All new contributions must pass all the tests and checks performed by GitHub actions, and any changes to docstrings must respect the [docstring guidelines](docs/docstring_guidelines.md). +All new contributions must pass all the tests and checks performed by GitHub actions, and any changes to docstrings must respect the [docstring guidelines](tools/docstring_guidelines.md). ## Development @@ -50,7 +49,7 @@ Before installing the package you need to install [bazel](https://bazel.build/in brew install bazelisk ``` -Navigate to the project's root and run: +Navigate to the project's root and create a Poetry environment with the correct PyEnv version and all needed dependencies with: ```shell pyenv which python | xargs poetry env use @@ -65,6 +64,8 @@ poetry shell ### Testing +All tests must pass for your contribution to be accepted. + Run all tests with bazel: ```shell @@ -78,6 +79,14 @@ If developing and testing C++ code, the `--compilation_mode=dbg` flag enables ad Note that these tests also include docstring examples, using the builtin `doctest` module. See the [Adding code examples](#adding-code-examples) section for more information. +### Running the documentation server + +Live preview your local changes to the documentation with + +```shell +mkdocs serve -f docs/mkdocs.yml +``` + ### Benchmarking and profiling Benchmarking and profiling of pre-configured scripts is available as follow: @@ -101,14 +110,36 @@ consumption. bazel run -c opt --config=linux //benchmark:benchmark_time ``` -### Running docs server +### Developing a new operator -Live preview your local changes to the documentation with +We provide a utility script that generates placeholder files, modifies existing ones, and prints needed modifications to develop and make available a new operator. From the project's root, run: ```shell -mkdocs serve -f docs/mkdocs.yml +tools/create_operator.py --operator ``` +so for example, to create the `EventSet.map()` operator, you'd run `tools/create_operator.py --operator map`. + +Here are some key files you'll need to modify (and write the operator's logic in): + +- [temporian/core/event_set_ops.py](temporian/core/event_set_ops.py) or [temporian/**init**.py](temporian/__init__.py), depending on if the operator is available in the `EventSet` class (like `EventSet.since_last()`) or in the global `tp` module (like `tp.glue()`). +- Write the operator's core logic in `temporian/core/operators/.py`. + - The core logic is that related to the operator's definition in the graph, checks, and normalization during initialization. It doesn't interact with the actual data contained within the `EventSet`. + - Example: [temporian/core/operators/since_last.py](temporian/core/operators/since_last.py). +- Write the operator's implementation in `temporian/implementation/numpy/operators/.py`. + - The implementation is what actually executes the operator's logic on an `EventSet`'s data. + - Example of a Python-only operator: [temporian/implementation/numpy/operators/since_last.py](temporian/implementation/numpy/operators/since_last.py). + - Example of a C++ operator: [temporian/implementation/numpy/operators/resample.py](temporian/implementation/numpy/operators/resample.py) and [temporian/implementation/numpy_cc/operators/resample.cc](temporian/implementation/numpy_cc/operators/resample.cc). +- Write unit tests for the operator in `temporian/core/operators/test/test_.py`. + - Example: [temporian/core/operators/test/test_since_last.py](temporian/core/operators/test/test_since_last.py). +- Add the operator to the docs in `docs/src/reference/temporian/operators/.md`. + - The docs are generated automatically by [mkdocstrings](https://mkdocstrings.github.io/python/) from the operator's docstring. + - Example: [docs/src/reference/temporian/operators/since_last.md](docs/src/reference/temporian/operators/since_last.md). + +Groups of operator with a similar implementation as grouped together. For instance, `temporian/core/operators/window` contains moving window operators (e.g., `EventSet.simple_moving_average()`) and `temporian/core/operators/binary` contains operators taking two features as input (e.g. `EventSet.subtract()`). + +Read the script's output to see in detail all other files that need to be modified to finish setting up the operator! + ### Adding code examples Any doctest code examples in `temporian/*.py` or `docs/*.md`, will be executed and tested using the python's built-in [doctest](https://docs.python.org/3/library/doctest.html) module. @@ -166,31 +197,10 @@ bazel test --config=linux //temporian/test:doc_test --test_output=streamed In case of unexpected outputs, the result is printed and compared to the expected values, so that they can be fixed. -### Developing a new operator - -We provide a utility script that generates placeholder files, modifies existing ones, and prints needed modifications to develop and make available a new operator. From the project's root, run: - -```shell -tools/create_operator.py --operator -``` - -so for example, to create the `EventSet.map()` operator, you'd run `tools/create_operator.py --operator map`. +## Contributor License Agreement -Here are some key files you'll need to modify (and write the operator's logic in): -- [temporian/core/event_set_ops.py](temporian/core/event_set_ops.py) or [temporian/__init__.py](temporian/__init__.py), depending on if the operator is available in the `EventSet` class (like `EventSet.since_last()`) or in the global `tp` module (like `tp.glue()`). -- Write the operator's core logic in `temporian/core/operators/.py`. - - The core logic is that related to the operator's definition in the graph, checks, and normalization during initialization. It doesn't interact with the actual data contained within the `EventSet`. - - Example: [temporian/core/operators/since_last.py](temporian/core/operators/since_last.py). -- Write the operator's implementation in `temporian/implementation/numpy/operators/.py`. - - The implementation is what actually executes the operator's logic on an `EventSet`'s data. - - Example of a Python-only operator: [temporian/implementation/numpy/operators/since_last.py](temporian/implementation/numpy/operators/since_last.py). - - Example of a C++ operator: [temporian/implementation/numpy/operators/resample.py](temporian/implementation/numpy/operators/resample.py) and [temporian/implementation/numpy_cc/operators/resample.cc](temporian/implementation/numpy_cc/operators/resample.cc). -- Write unit tests for the operator in `temporian/core/operators/test/test_.py`. - - Example: [temporian/core/operators/test/test_since_last.py](temporian/core/operators/test/test_since_last.py). -- Add the operator to the docs in `docs/src/reference/temporian/operators/.md`. - - The docs are generated automatically by [mkdocstrings](https://mkdocstrings.github.io/python/) from the operator's docstring. - - Example: [docs/src/reference/temporian/operators/since_last.md](docs/src/reference/temporian/operators/since_last.md). +Contributions to this project must be accompanied by a Contributor License Agreement. -Groups of operator with a similar implementation as grouped together. For instance, `temporian/core/operators/window` contains moving window operators (e.g., `EventSet.simple_moving_average()`) and `temporian/core/operators/binary` contains operators taking two features as input (e.g. `EventSet.subtract()`). +You (or your employer) retain the copyright to your contribution, this simply gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or sign a new one. -Read the script's output to see in detail all other files that need to be modified to finish setting up the operator! +You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably won't need to do it again. diff --git a/README.md b/README.md index 283994e71..ae82ef178 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Temporian is to [temporal data](https://temporian.readthedocs.io/en/stable/user_ Python, on large datasets using [Apache Beam](https://beam.apache.org/). --> -## QuickStart +## Quickstart ### Installation @@ -120,13 +120,15 @@ the major concepts, operators, conventions, and practices of Temporian. For a hands-on learning experience, work through the [Tutorials](https://temporian.readthedocs.io/en/stable/tutorials/) or refer to the [API reference](https://temporian.readthedocs.io/en/stable/reference/). +If you need help, have a question, want to contribute, or just want to be a part of the Temporian community, we encourage you to join our [Discord](https://discord.gg/x8rm9YYy) server! 🤝🏼 + ## Documentation The documentation 📚 is available at [temporian.readthedocs.io](https://temporian.readthedocs.io/en/stable/). The [Getting Started guide](https://temporian.readthedocs.io/en/stable/getting_started/) is the best way to start. ## Contributing -Contributions to Temporian are welcome! Check out the [contributing guide](CONTRIBUTING.md) to get started. +Contributions to Temporian are welcome! Check out the [Contributing guide](https://temporian.readthedocs.io/en/stable/contributing/) to get started. ## Credits diff --git a/docs/gen_contributing.py b/docs/gen_contributing.py new file mode 100644 index 000000000..b43f84edc --- /dev/null +++ b/docs/gen_contributing.py @@ -0,0 +1,25 @@ +""" +Generates a docs/contributing.md on the fly from the CONTRIBUTING.md and fixes some of the links. + +Source: https://github.com/tryolabs/norfair/blob/master/docs/gen_index.py +""" + +import re + +import mkdocs_gen_files + +# read CONTRIBUTING on the root of the repo +with open("CONTRIBUTING.md", "r", encoding="utf-8") as f: + content = f.read() + +# fix links to relative paths under temporian/, benchmark/, docs/ and tools/ +for dir in ["temporian", "benchmark", "docs", "tools"]: + content = re.sub( + rf"\({dir}\/([\w\/-]+)", + rf"(https://github.com/google/temporian/blob/main/{dir}/\1", + content, + ) + +# write the file +with mkdocs_gen_files.open("contributing.md", "w") as fd: # + print(content, file=fd) diff --git a/docs/gen_index.py b/docs/gen_index.py index da59593c0..d89e2b7ab 100644 --- a/docs/gen_index.py +++ b/docs/gen_index.py @@ -3,6 +3,7 @@ Source: https://github.com/tryolabs/norfair/blob/master/docs/gen_index.py """ + import re import mkdocs_gen_files diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 45ce66c92..8df2404c5 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -55,9 +55,10 @@ nav: - Home: index.md - Getting Started: getting_started.ipynb - User Guide: user_guide.ipynb - - Recipes: recipes/ - Tutorials: tutorials/ + - Recipes: recipes/ - API Reference: reference/ # generated by gen-files + literate-nav + - Contributing: contributing.md - Release notes: CHANGELOG.md extra: @@ -89,6 +90,8 @@ plugins: scripts: # Generate the index page from the README.md. - gen_index.py + # Generate the contributing page from the CONTRIBUTING.md. + - gen_contributing.py # Generate the ref pages and navigation. - gen_ref_pages.py - literate-nav: @@ -150,9 +153,12 @@ markdown_extensions: - name: mermaid class: mermaid format: !!python/name:pymdownx.superfences.fence_code_format + - mdx_truly_sane_lists # recognize 2 spaces as indentation inside lists watch: - - ../README.md - ../temporian - ./gen_ref_pages.py + - ../README.md - ./gen_index.py + - ../CONTRIBUTING.md + - ./gen_contributing.py diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 53ee92b8f..cea5d761b 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -1,14 +1,13 @@ -[data-md-color-scheme="temporian"] { - --md-primary-fg-color--light: #24201D; - --md-primary-fg-color--dark: #24201D; - background-color: red; - --md-default-bg-color: red; +[data-md-color-scheme="default"] { } /* Change background color when dark mode */ [data-md-color-scheme="slate"] { --md-default-bg-color: #121212; --md-code-bg-color: #212121; + /* make font a bit brighter than mkdocs-material's default */ + --md-typeset-color: #f0f0f0; + --md-code-fg-color: #f0f0f0; } /* Hide Temporian text in header. Uncomment if we swap the logo in the header for the full-text one. diff --git a/poetry.lock b/poetry.lock index a2c7449d9..fe318f25e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2099,8 +2099,6 @@ description = "Clang Python Bindings, mirrored from the official LLVM repo: http optional = false python-versions = "*" files = [ - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, @@ -2181,16 +2179,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2347,6 +2335,20 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "mdx-truly-sane-lists" +version = "1.3" +description = "Extension for Python-Markdown that makes lists truly sane. Custom indents for nested lists and fix for messy linebreaks." +optional = false +python-versions = "*" +files = [ + {file = "mdx_truly_sane_lists-1.3-py3-none-any.whl", hash = "sha256:b9546a4c40ff8f1ab692f77cee4b6bfe8ddf9cccf23f0a24e71f3716fe290a37"}, + {file = "mdx_truly_sane_lists-1.3.tar.gz", hash = "sha256:b661022df7520a1e113af7c355c62216b384c867e4f59fb8ee7ad511e6e77f45"}, +] + +[package.dependencies] +Markdown = ">=2.6" + [[package]] name = "memory-profiler" version = "0.61.0" @@ -3475,7 +3477,6 @@ files = [ {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6422b6763b016f2ef2beedded0e546d6aa6ba87910f9244d86e0ac7690f75c96"}, {file = "pymongo-4.5.0-cp312-cp312-win32.whl", hash = "sha256:77cfff95c1fafd09e940b3fdcb7b65f11442662fad611d0e69b4dd5d17a81c60"}, {file = "pymongo-4.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e57d859b972c75ee44ea2ef4758f12821243e99de814030f69a3decb2aa86807"}, - {file = "pymongo-4.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8443f3a8ab2d929efa761c6ebce39a6c1dca1c9ac186ebf11b62c8fe1aef53f4"}, {file = "pymongo-4.5.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2b0176f9233a5927084c79ff80b51bd70bfd57e4f3d564f50f80238e797f0c8a"}, {file = "pymongo-4.5.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89b3f2da57a27913d15d2a07d58482f33d0a5b28abd20b8e643ab4d625e36257"}, {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:5caee7bd08c3d36ec54617832b44985bd70c4cbd77c5b313de6f7fce0bb34f93"}, @@ -3652,7 +3653,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -3660,16 +3660,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -3686,7 +3678,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -3694,7 +3685,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -4941,4 +4931,4 @@ tensorflow = ["tensorflow"] [metadata] lock-version = "2.0" python-versions = "^3.8,<3.12" -content-hash = "b4b91d1be8c805bc006469c67cc732a6239e560626f75fc3e54e965adc1aec2d" +content-hash = "8a7fda426fe02c28de477a459b5beefcb126cd4f775d9777ca98cfb65a6b17c1" diff --git a/pyproject.toml b/pyproject.toml index 7f8fe2b30..39c97665c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,7 @@ colorama = "^0.4.6" tensorflow = "^2.12.0" selenium = "^4.11.2" coverage = "^7.3.1" +mdx-truly-sane-lists = "^1.3" [tool.poetry.extras] beam = ["apache-beam"]