{
"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"
}
]
}