{ "info": { "author": "Hans Jang", "author_email": "hsjang8848@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development" ], "description": "[![Build Status](https://travis-ci.org/pinetr2e/napkin.svg?branch=master)](https://travis-ci.org/pinetr2e/napkin)\n[![PyPI version](https://badge.fury.io/py/napkin.svg)](https://badge.fury.io/py/napkin)\n# Napkin\n\nNapkin is a tool to \"write\" sequence diagrams effectively as Python code.\n\n\n## Motivation\nThe sequence diagrams are useful tool to capture the behavioural aspect of the\ndesign. [PlantUML](http://plantuml.com) is a great tool to draw nice sequence\ndiagrams with simple human readable plain text.\n\nHowever, the syntax of PlantUML is hard to use when there are nested calls,\nwhere lifeline with multiple activation/deactivations are involved.\nUnfortunately, this situation is quite common in sequence diagram for S/W.\n\nFor example, consider the following common sequence diagram,\nwhich is from [Figure 4.2, UML Distilled 3E](https://my.safaribooksonline.com/book/software-engineering-and-development/uml/0321193687/sequence-diagrams/ch04):\n![Figure 4.2, UML Distilled 3E](images/distributed_control.png)\n\nThe PlainUML script for the diagram will be as follows:\n```plantuml\n@startuml\nparticipant User\nparticipant Order\nparticipant OrderLine\nparticipant Product\nparticipant Customer\n\nUser -> Order : calculatePrice()\nactivate Order\nOrder -> OrderLine : calculatePrice()\nactivate OrderLine\nOrderLine -> Product : getPrice(quantity:number)\nOrderLine -> Customer : getDiscountedValue(Order)\nactivate Customer\nCustomer -> Order : getBaseValue()\nactivate Order\nCustomer <-- Order: value\ndeactivate Order\nOrderLine <-- Customer: discountedValue\ndeactivate Customer\ndeactivate OrderLine\ndeactivate Order\n@enduml\n```\nIt is quite hard to follow especially as there are multiple level of nested actviation/deactivation.\n\nWhat if we express the same thing as the following Python code ?\n```python\n\n@napkin.seq_diagram()\ndef distributed_control(c):\n user = c.object('User')\n order = c.object('Order')\n orderLine = c.object('OrderLine')\n product = c.object('Product')\n customer = c.object('Customer')\n\n with user:\n with order.calculatePrice():\n with orderLine.calculatePrice():\n product.getPrice('quantity:number')\n with customer.getDiscountedValue(order):\n order.getBaseValue().ret('value')\n c.ret('discountedValue')\n```\n`distributed_control` is normal function accepting a context object, `c` to access APIs.\nThe function defines objects and the control starts with `user` object, which then calls `orderLine.calculatePrice()`.\nBasically, the sequence diagram is expressed as \"almost\" normal python code.\n\nThere are several advantages in using Python instead of using other special\nsyntax language:\n* Easy to write/maintain scripts for the correct diagrams\n* Many common mistakes are detected as normal Python error. For example, method\n call to an undefined object will be just normal Python error.(This can be even\n checked by IDE without running scripts).\n* Any Python editor can become sequence diagram editor\n* There can be many interesting usages by taking advantage of Python as general\n language. For example, we can build a library for patterns.\n\n\n## Installation\n\nInstall and update using `pip`\n```\npip install napkin\n```\n\n## Hello world\n\nWrite a simple script called `hello.py` as follows:\n\n```python\nimport napkin\n\n@napkin.seq_diagram()\ndef hello_world(c):\n user = c.object('user')\n world = c.object('world')\n with user:\n world.hello()\n```\nThen, the following command will generate `hello_world.puml`:\n```\n$ napkin hello.py\n```\n\n## Usages\n\n### Command line\n```\nusage: napkin [-h] [--output-format {plantuml,plantuml_png}]\n [--output-dir OUTPUT_DIR] [--version]\n srcs [srcs ...]\n\npositional arguments:\n srcs Python file or directory containing diagram functions\n\noptional arguments:\n -h, --help show this help message and exit\n --output-format {plantuml,plantuml_png}, -f {plantuml,plantuml_png}\n --output-dir OUTPUT_DIR, -o OUTPUT_DIR\n --version show program's version number and exit\n\nSupported output formats:\n plantuml : PlantUML script (default)\n plantuml_png : PlantUML script and PNG image\n```\n\n### Standalone code to generate diagrams\n\nInstead of passing `napkin` binary Python files, we can generate diagrams simply by running\nthe Python source code containing the diagrams as follows:\n```python\n\nimport napkin\n\n@napkin.seq_diagram()\ndef hello_world(c):\n ...\n\n\nif __name__ == '__main__':\n napkin.generate()\n```\n`napkin.generate(output_format='plantuml', output_dir='.')` will generate all the diagrams described in the same file.\n\n\n### Generate PNG files directly\nNapkin can generate PNG formt image files directly by using [plantuml Python package](https://pypi.org/project/plantuml/).\n\nAfter installing the optional package as follows:\n```\n$ pip install plantuml\n```\n\n`napkin` can specify the out format with `plantuml_png`, which will generate PNG file along with puml file.\n```\n$ napkin -f plantuml_png hello.py\n```\n\n## Python script examples\n[Basic Examples](./DEMO_EXAMPLES.md)\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/pinetr2e/napkin", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "napkin", "package_url": "https://pypi.org/project/napkin/", "platform": "", "project_url": "https://pypi.org/project/napkin/", "project_urls": { "Homepage": "https://github.com/pinetr2e/napkin" }, "release_url": "https://pypi.org/project/napkin/0.5.3.2/", "requires_dist": [ "plantuml; extra == 'PNG'" ], "requires_python": "", "summary": "Python DSL for writing PlantUML sequence diagram", "version": "0.5.3.2" }, "last_serial": 4749985, "releases": { "0.5.0": [ { "comment_text": "", "digests": { "md5": "9c24027f3d587b5aba61f6d4402b3f5f", "sha256": "afc34296520070b674a2f31790f19e8e6a2eca2a854b008e862f7002f2e4f797" }, "downloads": -1, "filename": "napkin-0.5.0-py2-none-any.whl", "has_sig": false, "md5_digest": "9c24027f3d587b5aba61f6d4402b3f5f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14114, "upload_time": "2019-01-20T05:49:37", "url": "https://files.pythonhosted.org/packages/09/19/9fe5e1151ee9849d29c36e5ef308c5b202b2e0f72ed7c07999a10fd802aa/napkin-0.5.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f7031c18b7da73b043bda538d960b1b6", "sha256": "273ed63b443b990d073972f4a4085502d87c6147e6c8c31b2032c0fb91305c80" }, "downloads": -1, "filename": "napkin-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f7031c18b7da73b043bda538d960b1b6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14115, "upload_time": "2019-01-20T05:48:32", "url": "https://files.pythonhosted.org/packages/75/a7/14a8c981e17ffa0abe3df8667141114551ebc56d3f2315bffe3b955ebdb5/napkin-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "21bcfe7f3e0914059088fef8076b86c1", "sha256": "7f2dfcbb89dd74c1a09ded8fe7e1fa0e663ce63d1cee83ca61672366e23c5675" }, "downloads": -1, "filename": "napkin-0.5.0.tar.gz", "has_sig": false, "md5_digest": "21bcfe7f3e0914059088fef8076b86c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10643, "upload_time": "2019-01-20T05:48:34", "url": "https://files.pythonhosted.org/packages/c4/81/ff431fd803c1726ea1bbf7cd82009854a213f75b7b2bbb19cdb53da8d0a1/napkin-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "d3d3b91f01c6a7e6304f656e8023a023", "sha256": "1c8cce637cc904c924d0b4adcade70ce3127fe0991883931e521e7707608b9e7" }, "downloads": -1, "filename": "napkin-0.5.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d3d3b91f01c6a7e6304f656e8023a023", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14115, "upload_time": "2019-01-20T06:10:22", "url": "https://files.pythonhosted.org/packages/25/e7/78ffb7edcf1f856bc9ec3d31e75a15363d688e10f7e293aa4721462fa5c4/napkin-0.5.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d751e14119d8928593779f52fe0837c4", "sha256": "fcbaf3bbefe2237cf04671da8d5bb54b2f9e87268016074656a1bc23641fba9a" }, "downloads": -1, "filename": "napkin-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d751e14119d8928593779f52fe0837c4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14113, "upload_time": "2019-01-20T06:10:24", "url": "https://files.pythonhosted.org/packages/98/21/81f00d5864d28e1af80bfa8b588bfa7bf3e27bd10f27570f9e325859bbb4/napkin-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea7949d6a6932b717b3bf4da599afab6", "sha256": "6e49896ca6aec5ad25cafd8823a8369d21d7fb4464158b704dd000e80dc49862" }, "downloads": -1, "filename": "napkin-0.5.1.tar.gz", "has_sig": false, "md5_digest": "ea7949d6a6932b717b3bf4da599afab6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10646, "upload_time": "2019-01-20T06:10:26", "url": "https://files.pythonhosted.org/packages/28/86/5c095f96b2623149350fea6b7cf46818a0bf782cf948cd2c70c97de5e780/napkin-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "885216d3034ad9164f88f06af2af29de", "sha256": "37d61d2479fa644b397d2a80c492d1223a710479b19039313d5149f15540edc2" }, "downloads": -1, "filename": "napkin-0.5.2-py2-none-any.whl", "has_sig": false, "md5_digest": "885216d3034ad9164f88f06af2af29de", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 24579, "upload_time": "2019-01-21T14:18:25", "url": "https://files.pythonhosted.org/packages/fa/8b/6f018775c4fb9e5995405585eda469eee5e59dde7a066392d622a227d26b/napkin-0.5.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "833bd5cf02e85e9ac5c5b31b433b59a2", "sha256": "ce46a4e164e0102aa0346d17780271c0556f9be43f1d2ecb1ea1a8983bcd4351" }, "downloads": -1, "filename": "napkin-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "833bd5cf02e85e9ac5c5b31b433b59a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24579, "upload_time": "2019-01-21T14:18:27", "url": "https://files.pythonhosted.org/packages/79/19/d4347bd0af6d26b9f7fb5350c616e3f3162ceb8ac29bd92914325d0866bb/napkin-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "829e5e1fcccf8a78e8ab5e9140aa865c", "sha256": "feca3b5a6557b3bc1eed7107feb5b4ab5e51fe3410aa4e1f701b21d972f27521" }, "downloads": -1, "filename": "napkin-0.5.2.tar.gz", "has_sig": false, "md5_digest": "829e5e1fcccf8a78e8ab5e9140aa865c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12101, "upload_time": "2019-01-21T14:18:29", "url": "https://files.pythonhosted.org/packages/51/6c/11b96a5959ffe391639061723f76ed062bd5e7e56880663dce4f14789503/napkin-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "5f26be8e400e9f9570930572b7dd740d", "sha256": "c254ae924a2153067c2988980edfb900eafb481f10e941227a10313782f974b6" }, "downloads": -1, "filename": "napkin-0.5.3-py2-none-any.whl", "has_sig": false, "md5_digest": "5f26be8e400e9f9570930572b7dd740d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15930, "upload_time": "2019-01-22T13:13:49", "url": "https://files.pythonhosted.org/packages/87/8e/c7dfb629626695eb5b78295f991985ffd4f1550e3be7e78568ab3a1b095e/napkin-0.5.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0242d19a87016ca887cf2a679482c8d8", "sha256": "8dfdbb92cfbde5890b0656c2f3f398874bfaa72b60d37210ab79605dcde33693" }, "downloads": -1, "filename": "napkin-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "0242d19a87016ca887cf2a679482c8d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15931, "upload_time": "2019-01-22T13:13:51", "url": "https://files.pythonhosted.org/packages/8b/81/a543a65513ce861aee13d72cd92dafbb70a4dc3e1712c32fce72cef493a3/napkin-0.5.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "73589bee7817965f61e4a4ac15a4e798", "sha256": "050b7d87ad6a002832c85e9039794b10f2d19eb05dc80f35986d0ce9281fe2e8" }, "downloads": -1, "filename": "napkin-0.5.3.tar.gz", "has_sig": false, "md5_digest": "73589bee7817965f61e4a4ac15a4e798", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12752, "upload_time": "2019-01-22T13:13:52", "url": "https://files.pythonhosted.org/packages/3f/50/74e1e632fcca21beb71736bd35c89e0a4d5ca03960994b8761dfad583cec/napkin-0.5.3.tar.gz" } ], "0.5.3.2": [ { "comment_text": "", "digests": { "md5": "61847e422fbfc51bd9dad10bf298a593", "sha256": "b5026209b0ea40104c17e50125388ae2e22cb86d3ba8a6c75d71af2e0c3a4cfe" }, "downloads": -1, "filename": "napkin-0.5.3.2-py2-none-any.whl", "has_sig": false, "md5_digest": "61847e422fbfc51bd9dad10bf298a593", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15888, "upload_time": "2019-01-28T12:17:29", "url": "https://files.pythonhosted.org/packages/eb/61/32dfe607e8d3676e5fbfcdbfa7bd2a2a0c85867b4dfa048092ed6349af10/napkin-0.5.3.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a324e9d8c3c566e7bc00750e9a43696a", "sha256": "1c8249c6e13a2a37ac324a9941ac879eb1d65efdf2de7ea0dcba71895ab85fb9" }, "downloads": -1, "filename": "napkin-0.5.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a324e9d8c3c566e7bc00750e9a43696a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16688, "upload_time": "2019-01-28T12:19:20", "url": "https://files.pythonhosted.org/packages/49/96/1aa65f3cf181818468affe18905d48c448d25b2872833b5ffc4afd51d060/napkin-0.5.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02418d1570672d2cbcb6982d62aef5a9", "sha256": "f8122530f4a41c789569dc3e3498a2e18483ec5766cc4c4d4c8f01dfe0fb5039" }, "downloads": -1, "filename": "napkin-0.5.3.2.tar.gz", "has_sig": false, "md5_digest": "02418d1570672d2cbcb6982d62aef5a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14011, "upload_time": "2019-01-28T12:17:31", "url": "https://files.pythonhosted.org/packages/aa/54/6c36233010ddd5990bc5189c3065c2db82d8adc22545a878556053a9e612/napkin-0.5.3.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "61847e422fbfc51bd9dad10bf298a593", "sha256": "b5026209b0ea40104c17e50125388ae2e22cb86d3ba8a6c75d71af2e0c3a4cfe" }, "downloads": -1, "filename": "napkin-0.5.3.2-py2-none-any.whl", "has_sig": false, "md5_digest": "61847e422fbfc51bd9dad10bf298a593", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15888, "upload_time": "2019-01-28T12:17:29", "url": "https://files.pythonhosted.org/packages/eb/61/32dfe607e8d3676e5fbfcdbfa7bd2a2a0c85867b4dfa048092ed6349af10/napkin-0.5.3.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a324e9d8c3c566e7bc00750e9a43696a", "sha256": "1c8249c6e13a2a37ac324a9941ac879eb1d65efdf2de7ea0dcba71895ab85fb9" }, "downloads": -1, "filename": "napkin-0.5.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a324e9d8c3c566e7bc00750e9a43696a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16688, "upload_time": "2019-01-28T12:19:20", "url": "https://files.pythonhosted.org/packages/49/96/1aa65f3cf181818468affe18905d48c448d25b2872833b5ffc4afd51d060/napkin-0.5.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02418d1570672d2cbcb6982d62aef5a9", "sha256": "f8122530f4a41c789569dc3e3498a2e18483ec5766cc4c4d4c8f01dfe0fb5039" }, "downloads": -1, "filename": "napkin-0.5.3.2.tar.gz", "has_sig": false, "md5_digest": "02418d1570672d2cbcb6982d62aef5a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14011, "upload_time": "2019-01-28T12:17:31", "url": "https://files.pythonhosted.org/packages/aa/54/6c36233010ddd5990bc5189c3065c2db82d8adc22545a878556053a9e612/napkin-0.5.3.2.tar.gz" } ] }