# PyMavryk
[![PyPI version](https://badge.fury.io/py/pytezos.svg?)](https://badge.fury.io/py/pytezos)
[![Tests](https://github.com/mavryk-network/pymavryk/workflows/Tests/badge.svg?)](https://github.com/mavryk-network/pymavryk/actions?query=workflow%3ATests)
[![Docker images](https://github.com/mavryk-network/pymavryk/workflows/Dockerhub/badge.svg?)](https://hub.docker.com/r/mavrykdynamics/pymavryk)
[![Made With](https://img.shields.io/badge/made%20with-python-blue.svg?)](ttps://www.python.org)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/baking-bad/pytezos/master?filepath=michelson_quickstart.ipynb)
* RPC query engine
* Cryptography
* Building and parsing operations
* Smart contract interaction
* Local forging/packing & vice versa
* Working with Michelson AST
#### PyMavryk CLI
* Generating contract parameter/storage schema
* Activating and revealing accounts
* Deploying contracts (+ GitHub integration)
#### Michelson REPL
* Builtin interpreter (reimplemented)
* Set of extra helpers (stack visualization, blockchain context mocking)
#### Michelson Jupyter kernel
* Custom interpreter with runtime type checker
* Syntax highlighting, autocomplete with `Tab`
* In-place docstrings with `Shift+Tab`
* Macros support
* Verbose execution logging
* Debug helpers
#### Michelson integration testing framework
* Writing integration tests using `unittest` package
* Simulating contract execution using remote intepreter (via RPC) or builtin one
## Installation
Make sure you have Python 3.8 to 3.11 installed and set as default in the system.
You also need to install cryptographic packages before installing the library/building the project:
#### Linux
##### Ubuntu, Debian and other apt-based distributions
```shell
$ sudo apt install libsodium-dev libsecp256k1-dev libgmp-dev pkg-config
```
##### Arch Linux
```shell
$ sudo pacman -Syu --needed libsodium libsecp256k1 gmp
```
#### MacOS
[Homebrew](https://brew.sh/) needs to be installed.
```shell
$ brew tap cuber/homebrew-libsecp256k1
$ brew install libsodium libsecp256k1 gmp pkg-config
```
##### M1 (ARM)
In case `secp256k1` or `gmp` cannot find either include or lib paths, try explicitly set environment vars:
```
CFLAGS="-I/opt/homebrew/Cellar/gmp/6.2.1_1/include/ -L/opt/homebrew/Cellar/gmp/6.2.1_1/lib/" LIB_DIR="/opt/homebrew/Cellar/libsecp256k1/0.1/lib" INCLUDE_DIR=/opt/homebrew/Cellar/libsecp256k1/0.1/include pip3 install --user pymavryk
```
For running tests you might also need to export `LD_LIBRARY_PATH`:
```
export LD_LIBRARY_PATH=/opt/homebrew/lib/
```
#### Windows
The recommended way is to use WSL and then follow the instructions for Linux,
but if you feel lucky you can try to install natively:
1. Install MinGW from [https://osdn.net/projects/mingw/](https://osdn.net/projects/mingw/)
2. Make sure `C:\MinGW\bin` is added to your `PATH`
3. Download the latest libsodium-X.Y.Z-msvc.zip from [https://download.libsodium.org/libsodium/releases/](https://download.libsodium.org/libsodium/releases/).
4. Extract the Win64/Release/v143/dynamic/libsodium.dll from the zip file
5. Copy libsodium.dll to C:\Windows\System32\libsodium.dll
### From PyPi
```shell
$ pip install wheel setuptools pkginfo cryptography
$ pip install pymavryk
```
### [Google Colab](https://colab.research.google.com)
`````python
>>> !apt install libsodium-dev libsecp256k1-dev libgmp-dev
>>> !pip install pymavryk
`````
### Docker container
Verified & minified images for CI/CD https://hub.docker.com/r/mavrykdynamics/pymavryk/tags
```shell
$ # 1. Use image from registry
$ docker pull mavrykdynamics/pymavryk
$ # or build it yourself
$ docker build . -t pymavryk
$ # 2. Use included docker-compose.yml
$ docker-compose up -d notebook
```
### Building from sources
Requirements:
* Python 3.8+
* libsodium, libsecp256k1, gmp
* make
```shell
$ # prepare environment
$ make install
# # run full CI with tests
$ make
```
## Quick start
Read [quick start guide](https://pymavryk.mavryk.org/quick_start.html)
Learn how to [enable Jupyter with Michelson](./src/michelson_kernel/README.md)
## API reference
Check out a complete [API reference](https://pymavryk.mavryk.org/contents.html)
### Inline documentation
If you are working in Jupyter/Google Colab or any other interactive console,
you can display documentation for a particular class/method:
```python
>>> from pymavryk import pymavryk
>>> pymavryk
```
### Publications
* Pymavryk 2.0 release with embedded docs and smart contract interaction engine
https://medium.com/coinmonks/high-level-interface-for-michelson-contracts-and-not-only-7264db76d7ae
* Materials from TQuorum:Berlin workshop - building an app on top of PyMavryk and ConseilPy
https://medium.com/coinmonks/atomic-tips-berlin-workshop-materials-c5c8ee3f46aa
* Materials from the EETH hackathon - setting up a local development infrastructure, deploying and interacting with a contract
https://medium.com/tezoscommons/preparing-for-the-tezos-hackathon-with-baking-bad-45f2d5fca519
* Introducing integration testing engine
https://medium.com/tezoscommons/testing-michelson-contracts-with-pytezos-513718499e93
### Contact
* Telegram chat: [@baking_bad_chat](https://t.me/baking_bad_chat)
* Slack channel: [#baking-bad](https://tezos-dev.slack.com/archives/CV5NX7F2L)
## Credits
* The project was initially started by Arthur Breitman, now it's maintained by Mavryk Dynamics team, based on the forked of Baking Bad.
* Michelson test set from the Mavryk repo is used to ensure the interpreter workability
* Michelson structured documentation by Nomadic Labs is used for inline help
Raw data
{
"_id": null,
"home_page": "https://pymavryk.mavryk.org",
"name": "pymavryk",
"maintainer": "Tristan Allaire",
"docs_url": null,
"requires_python": "<3.13,>=3.8.1",
"maintainer_email": "tristan@mavryk.io",
"keywords": "mavryk, blockchain, sdk, michelson, repl, cryptocurrencies, smart-contracts, jupyter, ipython, docker, crypto",
"author": "Michael Zaikin",
"author_email": "mz@baking-bad.org",
"download_url": "https://files.pythonhosted.org/packages/5d/11/19aa6f3d3cf10f1288478e51d1a4aa8b9d9915e4134df9a4cb0dd458d349/pymavryk-3.12.1.tar.gz",
"platform": null,
"description": "# PyMavryk\n\n[![PyPI version](https://badge.fury.io/py/pytezos.svg?)](https://badge.fury.io/py/pytezos)\n[![Tests](https://github.com/mavryk-network/pymavryk/workflows/Tests/badge.svg?)](https://github.com/mavryk-network/pymavryk/actions?query=workflow%3ATests)\n[![Docker images](https://github.com/mavryk-network/pymavryk/workflows/Dockerhub/badge.svg?)](https://hub.docker.com/r/mavrykdynamics/pymavryk)\n[![Made With](https://img.shields.io/badge/made%20with-python-blue.svg?)](ttps://www.python.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/baking-bad/pytezos/master?filepath=michelson_quickstart.ipynb)\n\n\n* RPC query engine\n* Cryptography\n* Building and parsing operations\n* Smart contract interaction\n* Local forging/packing & vice versa\n* Working with Michelson AST\n\n#### PyMavryk CLI\n* Generating contract parameter/storage schema\n* Activating and revealing accounts\n* Deploying contracts (+ GitHub integration)\n\n#### Michelson REPL\n* Builtin interpreter (reimplemented)\n* Set of extra helpers (stack visualization, blockchain context mocking)\n\n#### Michelson Jupyter kernel\n* Custom interpreter with runtime type checker\n* Syntax highlighting, autocomplete with `Tab`\n* In-place docstrings with `Shift+Tab`\n* Macros support\n* Verbose execution logging\n* Debug helpers\n\n#### Michelson integration testing framework\n* Writing integration tests using `unittest` package\n* Simulating contract execution using remote intepreter (via RPC) or builtin one\n\n\n## Installation\n\nMake sure you have Python 3.8 to 3.11 installed and set as default in the system. \n\nYou also need to install cryptographic packages before installing the library/building the project:\n\n#### Linux\n\n##### Ubuntu, Debian and other apt-based distributions\n```shell\n$ sudo apt install libsodium-dev libsecp256k1-dev libgmp-dev pkg-config\n```\n\n##### Arch Linux\n```shell\n$ sudo pacman -Syu --needed libsodium libsecp256k1 gmp\n```\n#### MacOS\n\n[Homebrew](https://brew.sh/) needs to be installed.\n```shell\n$ brew tap cuber/homebrew-libsecp256k1\n$ brew install libsodium libsecp256k1 gmp pkg-config\n```\n\n##### M1 (ARM)\n\nIn case `secp256k1` or `gmp` cannot find either include or lib paths, try explicitly set environment vars:\n```\nCFLAGS=\"-I/opt/homebrew/Cellar/gmp/6.2.1_1/include/ -L/opt/homebrew/Cellar/gmp/6.2.1_1/lib/\" LIB_DIR=\"/opt/homebrew/Cellar/libsecp256k1/0.1/lib\" INCLUDE_DIR=/opt/homebrew/Cellar/libsecp256k1/0.1/include pip3 install --user pymavryk\n```\n\nFor running tests you might also need to export `LD_LIBRARY_PATH`:\n```\nexport LD_LIBRARY_PATH=/opt/homebrew/lib/\n```\n\n#### Windows\n\nThe recommended way is to use WSL and then follow the instructions for Linux,\nbut if you feel lucky you can try to install natively:\n\n1. Install MinGW from [https://osdn.net/projects/mingw/](https://osdn.net/projects/mingw/)\n2. Make sure `C:\\MinGW\\bin` is added to your `PATH`\n3. Download the latest libsodium-X.Y.Z-msvc.zip from [https://download.libsodium.org/libsodium/releases/](https://download.libsodium.org/libsodium/releases/).\n4. Extract the Win64/Release/v143/dynamic/libsodium.dll from the zip file\n5. Copy libsodium.dll to C:\\Windows\\System32\\libsodium.dll\n\n### From PyPi\n\n```shell\n$ pip install wheel setuptools pkginfo cryptography\n$ pip install pymavryk\n```\n\n### [Google Colab](https://colab.research.google.com)\n\n`````python\n>>> !apt install libsodium-dev libsecp256k1-dev libgmp-dev\n>>> !pip install pymavryk\n`````\n\n### Docker container\nVerified & minified images for CI/CD https://hub.docker.com/r/mavrykdynamics/pymavryk/tags\n```shell\n$ # 1. Use image from registry\n$ docker pull mavrykdynamics/pymavryk\n$ # or build it yourself\n$ docker build . -t pymavryk\n$ # 2. Use included docker-compose.yml\n$ docker-compose up -d notebook\n```\n\n### Building from sources\n\nRequirements:\n* Python 3.8+\n* libsodium, libsecp256k1, gmp\n* make\n\n```shell\n$ # prepare environment\n$ make install\n# # run full CI with tests\n$ make\n```\n\n## Quick start\nRead [quick start guide](https://pymavryk.mavryk.org/quick_start.html) \nLearn how to [enable Jupyter with Michelson](./src/michelson_kernel/README.md)\n\n## API reference\nCheck out a complete [API reference](https://pymavryk.mavryk.org/contents.html)\n\n### Inline documentation\nIf you are working in Jupyter/Google Colab or any other interactive console, \nyou can display documentation for a particular class/method:\n\n```python\n>>> from pymavryk import pymavryk\n>>> pymavryk\n```\n\n### Publications\n\n* Pymavryk 2.0 release with embedded docs and smart contract interaction engine \nhttps://medium.com/coinmonks/high-level-interface-for-michelson-contracts-and-not-only-7264db76d7ae\n\n* Materials from TQuorum:Berlin workshop - building an app on top of PyMavryk and ConseilPy \nhttps://medium.com/coinmonks/atomic-tips-berlin-workshop-materials-c5c8ee3f46aa\n\n* Materials from the EETH hackathon - setting up a local development infrastructure, deploying and interacting with a contract \nhttps://medium.com/tezoscommons/preparing-for-the-tezos-hackathon-with-baking-bad-45f2d5fca519\n\n* Introducing integration testing engine \nhttps://medium.com/tezoscommons/testing-michelson-contracts-with-pytezos-513718499e93\n\n### Contact\n* Telegram chat: [@baking_bad_chat](https://t.me/baking_bad_chat)\n* Slack channel: [#baking-bad](https://tezos-dev.slack.com/archives/CV5NX7F2L)\n\n## Credits\n* The project was initially started by Arthur Breitman, now it's maintained by Mavryk Dynamics team, based on the forked of Baking Bad.\n* Michelson test set from the Mavryk repo is used to ensure the interpreter workability\n* Michelson structured documentation by Nomadic Labs is used for inline help\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python toolkit for Mavryk",
"version": "3.12.1",
"project_urls": {
"Homepage": "https://pymavryk.mavryk.org",
"Repository": "https://github.com/mavryk-network/pymavryk"
},
"split_keywords": [
"mavryk",
" blockchain",
" sdk",
" michelson",
" repl",
" cryptocurrencies",
" smart-contracts",
" jupyter",
" ipython",
" docker",
" crypto"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f18410d870408ce653cb375dcc66d9c625f08708c2d7cdce33a09451f911252c",
"md5": "ff12c34752bc37a08c4b9d835099c791",
"sha256": "a3d0b1651ba95caa62ec2f762789f7e46d58c34822bb91e1902a083ed783a517"
},
"downloads": -1,
"filename": "pymavryk-3.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ff12c34752bc37a08c4b9d835099c791",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.13,>=3.8.1",
"size": 209479,
"upload_time": "2024-08-27T13:18:32",
"upload_time_iso_8601": "2024-08-27T13:18:32.099999Z",
"url": "https://files.pythonhosted.org/packages/f1/84/10d870408ce653cb375dcc66d9c625f08708c2d7cdce33a09451f911252c/pymavryk-3.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5d1119aa6f3d3cf10f1288478e51d1a4aa8b9d9915e4134df9a4cb0dd458d349",
"md5": "33a0b5814b19d853fb71fc18ec7542f9",
"sha256": "98c1da62cb3c07f42bb31c5d8ce00d74b16c9f1d2aa6dacea1864296cd8987a5"
},
"downloads": -1,
"filename": "pymavryk-3.12.1.tar.gz",
"has_sig": false,
"md5_digest": "33a0b5814b19d853fb71fc18ec7542f9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.13,>=3.8.1",
"size": 165458,
"upload_time": "2024-08-27T13:18:33",
"upload_time_iso_8601": "2024-08-27T13:18:33.833572Z",
"url": "https://files.pythonhosted.org/packages/5d/11/19aa6f3d3cf10f1288478e51d1a4aa8b9d9915e4134df9a4cb0dd458d349/pymavryk-3.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-27 13:18:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "mavryk-network",
"github_project": "pymavryk",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "anyio",
"specs": [
[
"==",
"4.1.0"
]
]
},
{
"name": "appnope",
"specs": [
[
"==",
"0.1.3"
]
]
},
{
"name": "argon2-cffi-bindings",
"specs": [
[
"==",
"21.2.0"
]
]
},
{
"name": "argon2-cffi",
"specs": [
[
"==",
"23.1.0"
]
]
},
{
"name": "arrow",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "asttokens",
"specs": [
[
"==",
"2.4.1"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"23.1.0"
]
]
},
{
"name": "backcall",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "base58",
"specs": [
[
"==",
"2.1.1"
]
]
},
{
"name": "beautifulsoup4",
"specs": [
[
"==",
"4.12.2"
]
]
},
{
"name": "bleach",
"specs": [
[
"==",
"6.1.0"
]
]
},
{
"name": "cached-property",
"specs": [
[
"==",
"1.5.2"
]
]
},
{
"name": "cattrs",
"specs": [
[
"==",
"23.2.2"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2023.11.17"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.3.2"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.7"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "comm",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"41.0.5"
]
]
},
{
"name": "cytoolz",
"specs": [
[
"==",
"0.12.2"
]
]
},
{
"name": "debugpy",
"specs": [
[
"==",
"1.8.0"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.1.1"
]
]
},
{
"name": "defusedxml",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "deprecation",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "docker",
"specs": [
[
"==",
"6.1.3"
]
]
},
{
"name": "entrypoints",
"specs": [
[
"==",
"0.4"
]
]
},
{
"name": "eth-hash",
"specs": [
[
"==",
"0.5.2"
]
]
},
{
"name": "eth-typing",
"specs": [
[
"==",
"3.5.2"
]
]
},
{
"name": "eth-utils",
"specs": [
[
"==",
"2.3.1"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "executing",
"specs": [
[
"==",
"2.0.1"
]
]
},
{
"name": "fastecdsa",
"specs": [
[
"==",
"2.3.0"
]
]
},
{
"name": "fastjsonschema",
"specs": [
[
"==",
"2.19.0"
]
]
},
{
"name": "fqdn",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.6"
]
]
},
{
"name": "importlib-metadata",
"specs": [
[
"==",
"6.8.0"
]
]
},
{
"name": "importlib-resources",
"specs": [
[
"==",
"6.1.1"
]
]
},
{
"name": "ipykernel",
"specs": [
[
"==",
"6.26.0"
]
]
},
{
"name": "ipython-genutils",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "ipython",
"specs": [
[
"==",
"8.12.3"
]
]
},
{
"name": "isoduration",
"specs": [
[
"==",
"20.11.0"
]
]
},
{
"name": "jedi",
"specs": [
[
"==",
"0.19.1"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.2"
]
]
},
{
"name": "jsonpointer",
"specs": [
[
"==",
"2.4"
]
]
},
{
"name": "jsonschema-specifications",
"specs": [
[
"==",
"2023.11.1"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.20.0"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.20.0"
]
]
},
{
"name": "jupyter-client",
"specs": [
[
"==",
"7.4.9"
]
]
},
{
"name": "jupyter-core",
"specs": [
[
"==",
"5.5.0"
]
]
},
{
"name": "jupyter-events",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "jupyter-server-terminals",
"specs": [
[
"==",
"0.4.4"
]
]
},
{
"name": "jupyter-server",
"specs": [
[
"==",
"2.10.1"
]
]
},
{
"name": "jupyterlab-pygments",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"2.1.3"
]
]
},
{
"name": "matplotlib-inline",
"specs": [
[
"==",
"0.1.6"
]
]
},
{
"name": "mistune",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "mnemonic",
"specs": [
[
"==",
"0.20"
]
]
},
{
"name": "mypy-extensions",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "nbclassic",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "nbclient",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "nbconvert",
"specs": [
[
"==",
"7.11.0"
]
]
},
{
"name": "nbformat",
"specs": [
[
"==",
"5.9.2"
]
]
},
{
"name": "nest-asyncio",
"specs": [
[
"==",
"1.5.8"
]
]
},
{
"name": "netstruct",
"specs": [
[
"==",
"1.1.2"
]
]
},
{
"name": "notebook-shim",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "notebook",
"specs": [
[
"==",
"6.5.6"
]
]
},
{
"name": "overrides",
"specs": [
[
"==",
"7.4.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"23.2"
]
]
},
{
"name": "pandocfilters",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "parso",
"specs": [
[
"==",
"0.8.3"
]
]
},
{
"name": "pexpect",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "pickleshare",
"specs": [
[
"==",
"0.7.5"
]
]
},
{
"name": "pkgutil-resolve-name",
"specs": [
[
"==",
"1.3.10"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "ply",
"specs": [
[
"==",
"3.11"
]
]
},
{
"name": "prometheus-client",
"specs": [
[
"==",
"0.19.0"
]
]
},
{
"name": "prompt-toolkit",
"specs": [
[
"==",
"3.0.41"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"5.9.6"
]
]
},
{
"name": "ptyprocess",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "pure-eval",
"specs": [
[
"==",
"0.2.2"
]
]
},
{
"name": "py-ecc",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "py",
"specs": [
[
"==",
"1.11.0"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.21"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.17.2"
]
]
},
{
"name": "pysodium",
"specs": [
[
"==",
"0.7.14"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.8.2"
]
]
},
{
"name": "python-json-logger",
"specs": [
[
"==",
"2.0.7"
]
]
},
{
"name": "pywin32",
"specs": [
[
"==",
"306"
]
]
},
{
"name": "pywinpty",
"specs": [
[
"==",
"2.0.12"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "pyzmq",
"specs": [
[
"==",
"24.0.1"
]
]
},
{
"name": "referencing",
"specs": [
[
"==",
"0.31.0"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.31.0"
]
]
},
{
"name": "rfc3339-validator",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "rfc3986-validator",
"specs": [
[
"==",
"0.1.1"
]
]
},
{
"name": "rpds-py",
"specs": [
[
"==",
"0.13.1"
]
]
},
{
"name": "secp256k1",
"specs": [
[
"==",
"0.14.0"
]
]
},
{
"name": "send2trash",
"specs": [
[
"==",
"1.8.2"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"67.8.0"
]
]
},
{
"name": "simple-bson",
"specs": [
[
"==",
"0.0.3"
]
]
},
{
"name": "simplejson",
"specs": [
[
"==",
"3.19.2"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "soupsieve",
"specs": [
[
"==",
"2.5"
]
]
},
{
"name": "stack-data",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "strict-rfc3339",
"specs": [
[
"==",
"0.7"
]
]
},
{
"name": "tabulate",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "terminado",
"specs": [
[
"==",
"0.18.0"
]
]
},
{
"name": "testcontainers",
"specs": [
[
"==",
"3.7.1"
]
]
},
{
"name": "tinycss2",
"specs": [
[
"==",
"1.2.1"
]
]
},
{
"name": "toolz",
"specs": [
[
"==",
"0.12.0"
]
]
},
{
"name": "tornado",
"specs": [
[
"==",
"6.3.3"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.66.1"
]
]
},
{
"name": "traitlets",
"specs": [
[
"==",
"5.13.0"
]
]
},
{
"name": "types-python-dateutil",
"specs": [
[
"==",
"2.8.19.14"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.8.0"
]
]
},
{
"name": "uri-template",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.12"
]
]
},
{
"name": "webcolors",
"specs": [
[
"==",
"1.13"
]
]
},
{
"name": "webencodings",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "websocket-client",
"specs": [
[
"==",
"1.6.4"
]
]
},
{
"name": "wrapt",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "zipp",
"specs": [
[
"==",
"3.17.0"
]
]
}
],
"lcname": "pymavryk"
}