touml
=====
> pronounced /ˈtoo͞m.əl/
A CLI, written in Rust, that converts Python classes to a unified Mermaid diagram.
## Installation
```shell
pip install touml
# OR (better yet)
uv pip install touml
```
## Usage
```shell
# Print help
touml --help
# Print output to stdout
touml path/to/python/files
# Generate an `out.mmd` file in the current directory
touml path/to/python/files -o .
# Print output, but exclude classes, files, and subdirectories matching globs.
touml path/to/python/files --exclude-files "**/__init__.py" "**/config.py" --exclude-dirs "tests" --exclude-classes "Base*"
```
## Tips
```shell
# Pipe outputs to `less` to scroll outputs
$ touml path/to/python/files | less
# Pipe outputs to `mmdc` to generate images
$ touml path/to/python/files | mmdc -i -o out.png
# Copy outputs to clipboard
$ touml path/to/python/files | pbcopy
```
## Examples
```shell
# Convert all Python files in the test directory to Mermaid diagrams
$ touml tests
classDiagram
class StrClass {
+ some_other_values tuple[int, ...]
+ value str
+ yet_another_value set[int]
+ get_concatenated(self) str
}
Base <|-- StrClass
StrMixin <|-- StrClass
class IntClass {
+ value_1 int
+ value_2 list[int]
+ value_3 dict[str, int]
+ check_even(cls, v) int
}
Base <|-- IntClass
IntMixin <|-- IntClass
class Value {
+ VAL_1
+ VAL_2
+ VAL_3
}
`enum.StrEnum` <|-- Value
class ClassicClass {
+ ANOTHER_CLS_VAR
+ A_CLS_VAR int
+ value
}
class Base {
+ id int
+ model_config
}
BaseModel <|-- Base
class BaseMixin {
+ do_something(self)
}
`abc.ABC` <|-- BaseMixin
class IntMixin {
+ do_something(self) int
}
BaseMixin <|-- IntMixin
BaseModel <|-- IntMixin
class StrMixin {
+ do_something(self) str
}
BaseMixin <|-- StrMixin
BaseModel <|-- StrMixin
```
Pipe the above to `mmdc -i - -t dark -b transparent`, and you get:
![Example](assets/readme-example.png)
## FAQs
### What's Mermaid?
Mermaid is a diagramming and charting tool that produces neat diagrams from text. You can learn more about it [here](https://mermaid-js.github.io/mermaid/).
### This tool doesn't generate images!
You're right, young padawan. This tool, intentionally, only generates Mermaid diagram code.
To generate images, you can pipe the output to `mmdc` (the official Mermaid CLI).
To download `mmdc`, take a look at their [docs](https://github.com/mermaid-js/mermaid-cli?tab=readme-ov-file#installation).
Once installed, you can try something like this:
```shell
$ touml path/to/python/files | mmdc -i -o out.png
```
### I don't need images, I just want to see the diagrams!
You can copy the output to your clipboard and paste it in a Markdown file,
Draw.io, or any other tool that supports Mermaid diagrams.
```shell
$ touml path/to/python/files | pbcopy
```
### Why Rust?
The idea was to make `touml` invocable from a CI pipeline, and we all know how much we want those to be fast.
### Sure, but how fast is it?
Blazingly fast, of course. For anecdotal evidence, where I accidentally executed `touml` against my current directory (including my virtual environment), I was able to generate Mermaid output for 427 Python files in 0.72 seconds. Not convinced? Try it out yourself!
### How does it work?
Easy.
1. Parse all Python files in a given directory, minus those that a user wants to exclude.
2. Extract all classes and their attributes, using the Python AST.
3. Generate a Mermaid diagram from the extracted classes and attributes.
### Does `touml` support other languages?
At present, no: `touml` only generates Mermaid from Python. However, so long as there's a data model that `impl`s the `MermaidAdapter` trait, sky's the limit.
Raw data
{
"_id": null,
"home_page": null,
"name": "touml",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "\"Rahul D. Ghosal\" <rdghosal@proton.me>",
"keywords": "rust, pyo3, rustpython, cli",
"author": "Rahul D. Ghosal <rdghosal@proton.me>",
"author_email": "\"Rahul D. Ghosal\" <rdghosal@proton.me>",
"download_url": "https://files.pythonhosted.org/packages/3c/e2/8e1869824f8437689b4b254ce45ac29449088f088c229486e741b8dc8342/touml-0.1.3.tar.gz",
"platform": null,
"description": "touml\n=====\n\n> pronounced /\u02c8too\u035em.\u0259l/\n\nA CLI, written in Rust, that converts Python classes to a unified Mermaid diagram.\n\n## Installation\n\n```shell\npip install touml\n\n# OR (better yet)\nuv pip install touml\n```\n\n## Usage\n\n```shell\n# Print help\ntouml --help\n\n# Print output to stdout\ntouml path/to/python/files\n\n# Generate an `out.mmd` file in the current directory\ntouml path/to/python/files -o .\n\n# Print output, but exclude classes, files, and subdirectories matching globs.\ntouml path/to/python/files --exclude-files \"**/__init__.py\" \"**/config.py\" --exclude-dirs \"tests\" --exclude-classes \"Base*\"\n```\n\n## Tips\n\n```shell\n# Pipe outputs to `less` to scroll outputs\n$ touml path/to/python/files | less\n\n# Pipe outputs to `mmdc` to generate images\n$ touml path/to/python/files | mmdc -i -o out.png\n\n# Copy outputs to clipboard\n$ touml path/to/python/files | pbcopy\n```\n\n## Examples\n\n```shell\n# Convert all Python files in the test directory to Mermaid diagrams\n$ touml tests\n\nclassDiagram\n\n class StrClass {\n + some_other_values tuple[int, ...]\n + value str\n + yet_another_value set[int]\n + get_concatenated(self) str\n }\n\n Base <|-- StrClass\n StrMixin <|-- StrClass\n\n\n class IntClass {\n + value_1 int\n + value_2 list[int]\n + value_3 dict[str, int]\n + check_even(cls, v) int\n }\n\n Base <|-- IntClass\n IntMixin <|-- IntClass\n\n\n class Value {\n + VAL_1\n + VAL_2\n + VAL_3\n }\n\n `enum.StrEnum` <|-- Value\n\n\n class ClassicClass {\n + ANOTHER_CLS_VAR\n + A_CLS_VAR int\n + value\n }\n\n\n class Base {\n + id int\n + model_config\n }\n\n BaseModel <|-- Base\n\n\n class BaseMixin {\n + do_something(self)\n }\n\n `abc.ABC` <|-- BaseMixin\n\n\n class IntMixin {\n + do_something(self) int\n }\n\n BaseMixin <|-- IntMixin\n BaseModel <|-- IntMixin\n\n\n class StrMixin {\n + do_something(self) str\n }\n\n BaseMixin <|-- StrMixin\n BaseModel <|-- StrMixin\n\n```\n\nPipe the above to `mmdc -i - -t dark -b transparent`, and you get:\n![Example](assets/readme-example.png)\n\n## FAQs\n\n### What's Mermaid?\nMermaid is a diagramming and charting tool that produces neat diagrams from text. You can learn more about it [here](https://mermaid-js.github.io/mermaid/).\n\n### This tool doesn't generate images!\nYou're right, young padawan. This tool, intentionally, only generates Mermaid diagram code.\nTo generate images, you can pipe the output to `mmdc` (the official Mermaid CLI).\nTo download `mmdc`, take a look at their [docs](https://github.com/mermaid-js/mermaid-cli?tab=readme-ov-file#installation).\n\nOnce installed, you can try something like this:\n\n```shell\n$ touml path/to/python/files | mmdc -i -o out.png\n```\n\n### I don't need images, I just want to see the diagrams!\nYou can copy the output to your clipboard and paste it in a Markdown file,\nDraw.io, or any other tool that supports Mermaid diagrams.\n\n```shell\n$ touml path/to/python/files | pbcopy\n```\n\n### Why Rust?\nThe idea was to make `touml` invocable from a CI pipeline, and we all know how much we want those to be fast.\n\n### Sure, but how fast is it?\nBlazingly fast, of course. For anecdotal evidence, where I accidentally executed `touml` against my current directory (including my virtual environment), I was able to generate Mermaid output for 427 Python files in 0.72 seconds. Not convinced? Try it out yourself!\n\n### How does it work?\nEasy.\n1. Parse all Python files in a given directory, minus those that a user wants to exclude.\n2. Extract all classes and their attributes, using the Python AST.\n3. Generate a Mermaid diagram from the extracted classes and attributes.\n\n### Does `touml` support other languages?\nAt present, no: `touml` only generates Mermaid from Python. However, so long as there's a data model that `impl`s the `MermaidAdapter` trait, sky's the limit.\n\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "CLI that creates a UML class diagram from classes in a Python module or subpackage.",
"version": "0.1.3",
"project_urls": {
"repository": "https://github.com/rdghosal/touml"
},
"split_keywords": [
"rust",
" pyo3",
" rustpython",
" cli"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e66242a188223d10f88dacb7c4902a3c1b24c92eaf61bf2c43b6a8e63ec47719",
"md5": "c4c6fb11a6d7dd9e04bdfc787b68e204",
"sha256": "1813c4625148f4d23c5daff3137c1dce8ba7e6d421d1483ba993340e099e3df4"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "c4c6fb11a6d7dd9e04bdfc787b68e204",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1689110,
"upload_time": "2025-01-03T14:11:21",
"upload_time_iso_8601": "2025-01-03T14:11:21.282198Z",
"url": "https://files.pythonhosted.org/packages/e6/62/42a188223d10f88dacb7c4902a3c1b24c92eaf61bf2c43b6a8e63ec47719/touml-0.1.3-py3-none-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "84deecc562d60250a9e88af76f96c4435df74a658232010ab01ad74c0b972986",
"md5": "54f54fb3a02448517ad360f90467ee19",
"sha256": "b80ab029ac34d9f4f08d969075293abc8da9181cec6d112e05988c79e29fda87"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "54f54fb3a02448517ad360f90467ee19",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1598543,
"upload_time": "2025-01-03T14:11:18",
"upload_time_iso_8601": "2025-01-03T14:11:18.612775Z",
"url": "https://files.pythonhosted.org/packages/84/de/ecc562d60250a9e88af76f96c4435df74a658232010ab01ad74c0b972986/touml-0.1.3-py3-none-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "36a329b369a4aaf0b9590dc18520dc907ee66cc5d1b0fba7c625228b72a8e27b",
"md5": "54d8f97ad06b2ad124f1292db7ca2ce1",
"sha256": "4bd104a21959172843d695c481d7014725be0d5fc3556b611c96519c3b8ddd0e"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "54d8f97ad06b2ad124f1292db7ca2ce1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1670255,
"upload_time": "2025-01-03T14:11:03",
"upload_time_iso_8601": "2025-01-03T14:11:03.381236Z",
"url": "https://files.pythonhosted.org/packages/36/a3/29b369a4aaf0b9590dc18520dc907ee66cc5d1b0fba7c625228b72a8e27b/touml-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "82f6c4cdac1c1ed301b729bda4978d229d46287b4e19fc5ac772227a90bafecc",
"md5": "eca183c46eea941dd21ae23ea1ac9385",
"sha256": "fcecb07d8209b25152fa86d860261d111b7416f134b35b688b5b27d75e48cb61"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "eca183c46eea941dd21ae23ea1ac9385",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1712515,
"upload_time": "2025-01-03T14:11:06",
"upload_time_iso_8601": "2025-01-03T14:11:06.151280Z",
"url": "https://files.pythonhosted.org/packages/82/f6/c4cdac1c1ed301b729bda4978d229d46287b4e19fc5ac772227a90bafecc/touml-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b1d96198de1b0596a237840cbffb0cdbfba1a8d5a92ad0709fa7c5a8e8a73b38",
"md5": "2283e36eceb31c09f82443c75488c70d",
"sha256": "b1d8bfd530e16b015dd57f556931b95e5239213f3bbe5d02c7f77c12d242fb60"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "2283e36eceb31c09f82443c75488c70d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1875481,
"upload_time": "2025-01-03T14:11:12",
"upload_time_iso_8601": "2025-01-03T14:11:12.961076Z",
"url": "https://files.pythonhosted.org/packages/b1/d9/6198de1b0596a237840cbffb0cdbfba1a8d5a92ad0709fa7c5a8e8a73b38/touml-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0b68b046247009d971772407829f0fe92a2e36c3035946d5efdd4c15c6f1b502",
"md5": "9c4d547afed062a1aef3d6f3c409c1e3",
"sha256": "a3a34734aa8d2d65e9f066fe445bb4274cd2912fe0a03cb3ddf596cbaeb91030"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "9c4d547afed062a1aef3d6f3c409c1e3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1921577,
"upload_time": "2025-01-03T14:11:08",
"upload_time_iso_8601": "2025-01-03T14:11:08.646022Z",
"url": "https://files.pythonhosted.org/packages/0b/68/b046247009d971772407829f0fe92a2e36c3035946d5efdd4c15c6f1b502/touml-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6a84a8e0653b55259efea75369c1fc76ee4a5dee8f5724e00e2c39e4832ce99f",
"md5": "b5af196c5326d8b85431d6a57ad59c11",
"sha256": "1deca3e108ecce3ee8fca9836263be471aff75bc86310fb82ac056502219d63a"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "b5af196c5326d8b85431d6a57ad59c11",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 2023483,
"upload_time": "2025-01-03T14:11:10",
"upload_time_iso_8601": "2025-01-03T14:11:10.176383Z",
"url": "https://files.pythonhosted.org/packages/6a/84/a8e0653b55259efea75369c1fc76ee4a5dee8f5724e00e2c39e4832ce99f/touml-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5fbfe12f122dee64c7a0a5484b0cb19bb8969bb2b14a86bc0992e3f585d030a9",
"md5": "fce5697778cb0d70c05e00c440372ea8",
"sha256": "7b1df1e36d8d9b04475f49dd5b09e64bc24463a129b32cf3c6b518a9e2454499"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "fce5697778cb0d70c05e00c440372ea8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1762532,
"upload_time": "2025-01-03T14:11:15",
"upload_time_iso_8601": "2025-01-03T14:11:15.475806Z",
"url": "https://files.pythonhosted.org/packages/5f/bf/e12f122dee64c7a0a5484b0cb19bb8969bb2b14a86bc0992e3f585d030a9/touml-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "78650e4c651c8d306233aa9be103a22d674710c46d3729ceba0abca54580c3ce",
"md5": "c71e87e97942da9bb5b39f367588a7aa",
"sha256": "bbb81109d0b2843b8efcc4b5a4ff90dfd761c06d8acafa4fc1e6862c0d1078d2"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "c71e87e97942da9bb5b39f367588a7aa",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1714457,
"upload_time": "2025-01-03T14:11:25",
"upload_time_iso_8601": "2025-01-03T14:11:25.985052Z",
"url": "https://files.pythonhosted.org/packages/78/65/0e4c651c8d306233aa9be103a22d674710c46d3729ceba0abca54580c3ce/touml-0.1.3-py3-none-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b02282073fedfa79891a2b2408b7ef7fb4d9924b29be687d236605d8cfd2bee3",
"md5": "9fe1600b32ab9848d3c9bd9cf2c2d729",
"sha256": "33b44bd381412426c4d1e0bda02cafe92bcc7842b1ebc6b0add869953f723d08"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "9fe1600b32ab9848d3c9bd9cf2c2d729",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1746044,
"upload_time": "2025-01-03T14:11:27",
"upload_time_iso_8601": "2025-01-03T14:11:27.851241Z",
"url": "https://files.pythonhosted.org/packages/b0/22/82073fedfa79891a2b2408b7ef7fb4d9924b29be687d236605d8cfd2bee3/touml-0.1.3-py3-none-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "79af8e1cda38657c2994b0b897e3a5c35bec94c0e36793a3f58e601a2f6d2218",
"md5": "25a4fe191f3ce2563c9629230d773927",
"sha256": "9979ccb8b3c5bf657f0b9953b834a52e83dd565c79baa72d656bee1da066693b"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "25a4fe191f3ce2563c9629230d773927",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1835661,
"upload_time": "2025-01-03T14:11:30",
"upload_time_iso_8601": "2025-01-03T14:11:30.882531Z",
"url": "https://files.pythonhosted.org/packages/79/af/8e1cda38657c2994b0b897e3a5c35bec94c0e36793a3f58e601a2f6d2218/touml-0.1.3-py3-none-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "58c00dbfedc3348f91682b76687d9413a3f15be4f4c5ae7d50a25da9b7355990",
"md5": "9e0a87047a99936eabb2c1c395b95092",
"sha256": "c784427cb74d578df2f74aad93cdb12c95be9773ad9a28788cd757622ac5f168"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "9e0a87047a99936eabb2c1c395b95092",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1817616,
"upload_time": "2025-01-03T14:11:32",
"upload_time_iso_8601": "2025-01-03T14:11:32.230652Z",
"url": "https://files.pythonhosted.org/packages/58/c0/0dbfedc3348f91682b76687d9413a3f15be4f4c5ae7d50a25da9b7355990/touml-0.1.3-py3-none-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cffaa0b9a507c32e89cb0835ff5589a1a12f8b124eedacf9aa8cf1b272e3e272",
"md5": "f072fa17e1735b7e9c48fadd4253bebf",
"sha256": "b77ee0b5a36fb2a7612acab0b4bce4c524da63a3e9e4db11651b833734363f0d"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-win32.whl",
"has_sig": false,
"md5_digest": "f072fa17e1735b7e9c48fadd4253bebf",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1476534,
"upload_time": "2025-01-03T14:11:37",
"upload_time_iso_8601": "2025-01-03T14:11:37.179796Z",
"url": "https://files.pythonhosted.org/packages/cf/fa/a0b9a507c32e89cb0835ff5589a1a12f8b124eedacf9aa8cf1b272e3e272/touml-0.1.3-py3-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "268d9c34d0ae51be044127a7c4f73143d9452fd6f6d121161ded7b838939b434",
"md5": "cd8f37ae748cc23ccc7447b3eacc6163",
"sha256": "f7cb886af96ae853e2c1ded1b6e324cd81b7587855406b958dfefe66f2ee6746"
},
"downloads": -1,
"filename": "touml-0.1.3-py3-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "cd8f37ae748cc23ccc7447b3eacc6163",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 1598289,
"upload_time": "2025-01-03T14:11:34",
"upload_time_iso_8601": "2025-01-03T14:11:34.395066Z",
"url": "https://files.pythonhosted.org/packages/26/8d/9c34d0ae51be044127a7c4f73143d9452fd6f6d121161ded7b838939b434/touml-0.1.3-py3-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3ce28e1869824f8437689b4b254ce45ac29449088f088c229486e741b8dc8342",
"md5": "3429d0efdaaa005e3079ee15386ab770",
"sha256": "c0a77e2d524eb239e849e913bc8f58c75bb08be4377d0f4b79c628717a8d22c1"
},
"downloads": -1,
"filename": "touml-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "3429d0efdaaa005e3079ee15386ab770",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 18930,
"upload_time": "2025-01-03T14:11:33",
"upload_time_iso_8601": "2025-01-03T14:11:33.527635Z",
"url": "https://files.pythonhosted.org/packages/3c/e2/8e1869824f8437689b4b254ce45ac29449088f088c229486e741b8dc8342/touml-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-03 14:11:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "rdghosal",
"github_project": "touml",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "touml"
}