{ "info": { "author": "Nicholas Bollweg", "author_email": "nick.bollweg@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: IPython", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Human Machine Interfaces", "Topic :: Scientific/Engineering :: Visualization", "Topic :: Software Development :: Widget Sets" ], "description": "IPyTangle\n=========\n\n|build-badge| |pypi-badge|\n\nReactive narratives inspired by\n`Tangle `__ in the `Jupyter\nNotebook `__.\n\nIPyTangle makes plain markdown into an interactive part of your\ndata-driven narrative.\n\n.. |build-badge| image:: https://travis-ci.org/bollwyvl/ipytangle.svg\n :target: https://travis-ci.org/bollwyvl/ipytangle\n.. |pypi-badge| image:: https://img.shields.io/pypi/v/ipytangle.svg\n :target: https://pypi.python.org/pypi/ipytangle/\n\n.. figure:: screenshots/cookies/002_change.png\n :alt: \n\nInstallation\n------------\n\nGet the most recent release with:\n\n.. code:: bash\n\n pip install ipytangle\n\nOr the bleeding-edge version:\n\n.. code:: bash\n\n pip install -e git+https://github.com/bollwyvl/ipytangle#egg=IPyTangle\n\nUsage\n-----\n\nIn a Notebook, write this python...\n\n.. code:: python\n\n from ipytangle import tangle\n\n tangle(cookies=3, calories=lambda cookies: cookies * 50)\n\nAnd this markdown:\n\n.. code:: markdown\n\n When you eat [`cookies` cookies](#:cookies), you consume [`calories` calories](#:calories).\n\nAnd you would see something like this:\n\n When you eat ```2`` cookies <#:cookies>`__, you consume ```150``\n calories <#:>`__.\n\nAnd interacting with the links would cause the result to update.\n\nExamples\n--------\n\nAdapted from the originals from\n`Tangle `__.\n\n- `Cookies `__\n- `California State Parks Proposition\n 21 `__\n\nAdditionally, ``ipytangle`` comes with integration with IPython's\n``interact``, the easiest way to start using widgets.\n\n- ```Interact``\\ ing with a\n tangle `__\n- `Tangling up\n ``interact`` `__\n\nMarkdown\n--------\n\n``ipytangle`` implements most of the\n`TangleKit `__\nbaseline as markdown links. Because it adds no new notation, unrendered\nTangle Markdown should still render in a useful way.\n\nGenerally, think of a link as:\n\n.. code:: markdown\n\n [what the user sees](#:tangle types)\n\nIn the link text, backticks, **\\`\\`** are used to represent a JavaScript\nexpression that will be updated on user interaction, cascading updates,\nor other updates from the kernel. In addition to any variables defined\nwith ``ipytangle``, some `formatting <#Formatting>`__ libraries are\nprovided. ``window`` globals should also work :wink:.\n\nOnly the generated ``code`` blocks will be transformed, the rest of the\nelements (if any) will be preserved. This means you can use images,\ninside the label of a control, for example.\n\nLink Types\n~~~~~~~~~~\n\n``[](#:)``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\njust display a view\n\n.. code:: markdown\n\n For [`years` years](#:) have I trained Jedi. \n\n``[](#:)``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\ndisplay a view and update an integer based on dragging\n\n.. code:: markdown\n\n [made the kessel run in `distance` parsecs](#:distance)\n\n``[](#:if)`` ... *[\\_ ``[](#elif)``\\ \\_]* ... *[\\_ ``[](#:else)`` \\_]* ... ``[](#:endif)``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nmark some text (which may have other fields) to only display based on\ncondition\n\n.. code:: markdown\n\n What's more foolish? The [`fool_is_more_foolish`](#:if)fool[](#:else)the fool who follows him(#:endif).\n\nyou may also have an ``else`` and any number of ``elif``\\ s... because\nthey are markdown span-level elements, you may use newlines for easier\nediting\n\n.. code:: markdown\n\n [`feeling == \"bad\"`](#:if) I have a bad feeling about this.\n [`feeling == \"cautious\"`](#:elif) You will never find a more wretched hive of scum and villainy.\n [](#:else) Search your feelings.\n [](#:endif)\n\nProposed Link Types\n~~~~~~~~~~~~~~~~~~~\n\n``[](#::(int|float):::)``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\ndisplay a view and update some ``type`` of variable. Additionally,\n``min``\\ imum ``max``\\ imum and ``step``-size values can be specified.\n\n``[](#::inline)``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nReplace the ``variable``, for which a linked widget has been registered\n(TBD) with the widget itself inline. > Needs research.\n\nWidgets\n~~~~~~~\n\nAt it's core, ``ipytangle`` provides ``Tangle``, an IPython ``Widget``.\nBecause of this, a ``Tangle`` can connect to any other IPython widgets\nvia *traitlets* and ``links``. Unlike many widgets, a ``Tangle`` doesn't\ndo much with its screen real estate, and might not be very interesting\nto put inside a layout. Yet.\n\nThere are several methods for creating a ``Tangle``.\n\n``ipytangle.tangle``\n^^^^^^^^^^^^^^^^^^^^\n\nAs in the above example, this tries to be the most pythonic approach.\n\n.. code:: python\n\n from ipytangle import tangle\n \n square = tangle(x=1, y=(1, lambda x: x*x))\n \n print(\"square is\", square)\n square.x = 2\n print(\"y is\", square.y)\n\n\n.. parsed-literal::\n\n square is \n y is 4\n\n\nLinking to other widgets\n''''''''''''''''''''''''\n\n``tangle`` makes working with other core and custom widgets easy,\nautomatically copying trait information. If a widget implements\n``value``, as most of the core widgets do, you can reference it\ndirectly. Alternately, specify a ``tuple`` of ``(widget, \"trait_name\")``\nto subscribe to that trait.\n\n.. code:: python\n\n from IPython.html.widgets import IntSlider\n \n x = IntSlider(1)\n square = tangle(x=x, y=(1, lambda x: x*x))\n \n print(\"square is\", square)\n x.value = 2\n print(\"y is\", square.y)\n\n\n.. parsed-literal::\n\n square is \n y is 4\n\n\n``ipytangle.Tangle``\n^^^^^^^^^^^^^^^^^^^^\n\nIf you are already familiar with widgets, subclassing ``Tangle`` might\nbe the most convenient:\n\n.. code:: python\n\n from ipytangle import Tangle\n from IPython.utils import traitlets\n \n class Square(Tangle):\n x = traitlets.CInt(1, sync=True)\n y = traitlets.CInt(1, sync=True)\n \n def _x_changed(self):\n self.y = self.x * self.x\n \n square = Square()\n \n print(\"square is\", square)\n square.x = 2\n print(\"y is\", square.y)\n\n\n.. parsed-literal::\n\n square is <__main__.Square object at 0x7f127434b7f0>\n y is 4\n\n\n *A future version of IPython Widgets will allow dynamically-added\n traits with ``add_trait``. This will open up whole new areas for\n tinkering. Stay tuned!*\n\nFormatting\n~~~~~~~~~~\n\nIn addition to your locally-bound variables, ``ipytangle`` bundles\nseveral nice JavaScript libraries and shortcuts for formatting text and\nnumbers: - ```moment`` `__ dates and times -\n```mathjs`` `__ scientific\nunits\\ ``- [``\\ numeral\\`](http://numeraljs.com/) currency, and\nmiscellany\n\nInspiration\n-----------\n\nOf course, Brett Victor's `Tangle `__ is\nthe primary inspiration, as well as: -\n`tributary `__ - `derby `__ -\n`d3 `__\n\nRoadmap\n-------\n\n- support\n `TangleKit `__\n baseline\n- float\n- switch\n- :math:`L_AT^EX` (sic)\n- sparklines, distributions, etc.\n- offline/nbviewer?", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/bollwyvl/ipytangle", "keywords": "IPython tangle", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "ipytangle", "package_url": "https://pypi.org/project/ipytangle/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/ipytangle/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/bollwyvl/ipytangle" }, "release_url": "https://pypi.org/project/ipytangle/0.4.0/", "requires_dist": null, "requires_python": null, "summary": "Tangle reactive documents in the IPython Notebook", "version": "0.4.0" }, "last_serial": 1585872, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "35ba1ea373b17c45c7115fb6bf1a9ece", "sha256": "2f41154230c8a32a4dc82c0a8b6e59f458ef5611dcd76611bbe43921e199e92d" }, "downloads": -1, "filename": "ipytangle-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "35ba1ea373b17c45c7115fb6bf1a9ece", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 1225417, "upload_time": "2015-05-19T21:39:08", "url": "https://files.pythonhosted.org/packages/ff/ac/72b25b3dd6300d58de69395bb608d06ebc9814f7b35eaa42235dd728e969/ipytangle-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1da4e7c83fa37e865fdf85d1a01e2b86", "sha256": "5d62394a39b2e9dc034ab7f1df51c62a35a5006dfd44ee3acd83b146d218bedf" }, "downloads": -1, "filename": "ipytangle-0.1.0.tar.gz", "has_sig": false, "md5_digest": "1da4e7c83fa37e865fdf85d1a01e2b86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 624056, "upload_time": "2015-05-19T21:37:04", "url": "https://files.pythonhosted.org/packages/08/c9/de041eb876478a9f1eb2786b9b6ee7658e866fd844f992018d5fea2e4624/ipytangle-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "f8aae3e38114504f5ae9858d53befdb0", "sha256": "9ace8e470a7c8398eb3e0451786e258cd37815c8ee7a2c2caede5b0209a6f19e" }, "downloads": -1, "filename": "ipytangle-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f8aae3e38114504f5ae9858d53befdb0", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 1228233, "upload_time": "2015-06-05T01:58:32", "url": "https://files.pythonhosted.org/packages/8b/ae/316063f1ca4efc5887edecc529914f1b09abf250e4c5273b70c4986af550/ipytangle-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f482048a686b0b5e35e61606d2fcf9b", "sha256": "508485ab2d574068b5b1bf0b29af61f0a101180b0e16e14e081ff8369849f49e" }, "downloads": -1, "filename": "ipytangle-0.1.1.tar.gz", "has_sig": false, "md5_digest": "1f482048a686b0b5e35e61606d2fcf9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 524983, "upload_time": "2015-06-05T01:56:40", "url": "https://files.pythonhosted.org/packages/78/cc/c224495b46a3cfb443b4e4eea1d0c3729e3c4bec26bc4e29903291695eda/ipytangle-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "aae594836dfec6dee74e9ad44abfab59", "sha256": "5a0f7525dc0c3e96a92ec73033c19c275493603de213b486f21812022e4f0406" }, "downloads": -1, "filename": "ipytangle-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aae594836dfec6dee74e9ad44abfab59", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 1228220, "upload_time": "2015-06-05T02:47:25", "url": "https://files.pythonhosted.org/packages/82/ca/1bdb0fcbf5cb2a7df96a022fc18c006283c625aae5131ea61ab84c813802/ipytangle-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f5f4b45db16dd790aeb96d4dc88e70d6", "sha256": "40e1805ec72fd0eeccafbf6f533caebfa12a5898307ce35069f83a48e38e0e73" }, "downloads": -1, "filename": "ipytangle-0.1.2.tar.gz", "has_sig": false, "md5_digest": "f5f4b45db16dd790aeb96d4dc88e70d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 525028, "upload_time": "2015-06-05T02:45:41", "url": "https://files.pythonhosted.org/packages/c1/39/9cb6be3eda0366e221b789882e836256c26e987aefd60fdf4b93005298e9/ipytangle-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "014bbb4f3639eb7a5050617a71c34603", "sha256": "b8a49f7ecbc4edf8ef213784e9f57f87d05dac6d9ea789ca85ed5ae40dccee34" }, "downloads": -1, "filename": "ipytangle-0.1.3.tar.gz", "has_sig": false, "md5_digest": "014bbb4f3639eb7a5050617a71c34603", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 521062, "upload_time": "2015-06-05T04:03:24", "url": "https://files.pythonhosted.org/packages/10/29/975664dc39305203db60b351829c6cd32864cd3948e65dbf8be512293a00/ipytangle-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "deff6e529ee0c8e0a3bc8981ff574ea3", "sha256": "163c2581f549d9b5757f82ef6d78d834cbe7607625f92080a0aa75dad3a64c56" }, "downloads": -1, "filename": "ipytangle-0.1.4.tar.gz", "has_sig": false, "md5_digest": "deff6e529ee0c8e0a3bc8981ff574ea3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 518873, "upload_time": "2015-06-06T05:26:36", "url": "https://files.pythonhosted.org/packages/80/b9/2e48e43a66cc58aea7ba5c86010a8e9df1e6e3734e7c70e9301e73fd3f14/ipytangle-0.1.4.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "bf3fc6aa8c44d1be0f5c48d838a07502", "sha256": "d23c6d61abf38647562e0592c0732b433f7f4d488419f20ff5e451d915a7b528" }, "downloads": -1, "filename": "ipytangle-0.2.0.tar.gz", "has_sig": false, "md5_digest": "bf3fc6aa8c44d1be0f5c48d838a07502", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 518957, "upload_time": "2015-06-06T06:15:34", "url": "https://files.pythonhosted.org/packages/29/32/c05ff922a5eefb98789140d0b4ac271fb12d70ce0fa33f57ea9a6b478ce1/ipytangle-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "b7447e292de857566fed829fe54cf2a6", "sha256": "bd074d0b576f8fc28e7233bdf76821a64caa660da08bcb053da8bf2eb302ae34" }, "downloads": -1, "filename": "ipytangle-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b7447e292de857566fed829fe54cf2a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 518969, "upload_time": "2015-06-09T12:49:13", "url": "https://files.pythonhosted.org/packages/16/13/906babe2290be8abffe3f4cc3062b27337ad51d883e6227bacb97af8b710/ipytangle-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "159d5deaa4f1350b2f8a3f03bb90d101", "sha256": "25a7cc47c7f750b0df1c885473f0b64493b55a8a8e8d2bd9a1e555f4e4a8d630" }, "downloads": -1, "filename": "ipytangle-0.4.0.tar.gz", "has_sig": false, "md5_digest": "159d5deaa4f1350b2f8a3f03bb90d101", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 520684, "upload_time": "2015-06-10T04:36:19", "url": "https://files.pythonhosted.org/packages/e0/01/8fa4e3dabf4f87ada66ff832c40d1236f77a3c41ae76777a85031e0bcf6b/ipytangle-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "159d5deaa4f1350b2f8a3f03bb90d101", "sha256": "25a7cc47c7f750b0df1c885473f0b64493b55a8a8e8d2bd9a1e555f4e4a8d630" }, "downloads": -1, "filename": "ipytangle-0.4.0.tar.gz", "has_sig": false, "md5_digest": "159d5deaa4f1350b2f8a3f03bb90d101", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 520684, "upload_time": "2015-06-10T04:36:19", "url": "https://files.pythonhosted.org/packages/e0/01/8fa4e3dabf4f87ada66ff832c40d1236f77a3c41ae76777a85031e0bcf6b/ipytangle-0.4.0.tar.gz" } ] }