{ "info": { "author": "Jakob Stemberger", "author_email": "yaccob@gmx.net", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 2.7" ], "description": "y!\n==\n\nLanguage for processing structured data from sources that can provide\ndata in ``yaml`` or ``json`` format.\n\nWhy not?\n========\n\nThat's the way ***y!*** is pronounced.\n\nAnd that's the question I asked myself when I had the the idea to\nimplement a data processing language quite different from the ones I\nknow so far:\n\n**y**.aml-based **no**-XML **t**.ransformation\n\n***y!*** is the answer to the question ***\"why not?\"***\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSo what does ***y!*** focus on?\n\n- ***y!*** is an incredibly simple language for processing structured\n data (``json``, ``yaml``, ...).\n\n - Therfore it is also perfectly suited for processing output from\n various NOSQL databases! And with little effort even from\n relational databases.\n\n- ***y!*** focuses on quickly and easily producing output.\n This output can be:\n\n - Text\n - Structured data\n\n- ***y!*** represents the power of ``yaml``\n- ***y!*** represents the power of ``jsonpath``\n- ***y!*** adopts the power of xslt (and more) without adopting its\n complexity\n- ***y!*** supports self-verification of programs by simply providing\n samples for input and output.\n\n - No need for using testing-frameworks, writing unit-tests or any\n other hassle.\n\n- ***y!*** supports producing well-formatted documentation without any\n tools-magic.\n\n - It doesn't require any more than a command-line flag.\n\n***y!*** Installation\n=====================\n\nYou need python 2.7. Probably any python >= 2.7 will be supported but\nright now it wasn't tested at all for any version but 2.7\n\n| To install ***y!*** simply enter\n| ``pip install --upgrade ynot``\n| on your command line and you should be able to use it.\n\nYou can check if the installation succeeded:\n\n::\n\n $ ynot --version\n ynot 0.2.2\n\nThe output may look different dependent on where your installer\ninstalled it.\n\nNow try\n\n::\n\n $ ynot -h\n Usage: ynot [OPTION] -t trafoFile document...\n\n Apply transformation to yaml documents\n\n Options:\n --version show program's version number and exit\n -h, --help show this help message and exit\n -t TRAFOFILENAME, --trafo=TRAFOFILENAME\n File transformation is read from\n -l LOGLEVEL, --log-level=LOGLEVEL\n Log level. Choices: [u'DEBUG', u'INFO', u'WARN',\n u'ERROR']; Defaults to INFO\n --verify Verify transformator file TRANSFORMATOR\n --dry-run Only validate and verify. No document processing\n --encoding=ENCODING endoding of input files. Default: [utf-8]\n\nAgain the output may look slightly different on your system.\n\nQuick Start\n===========\n\nUnfortunately tradition requires us to start with a *hello world*\napplication:\n\nHello World\n-----------\n\n``$ cat hello_world.ynot``\n\n.. code:: yaml\n\n actions:\n - print: Hello World\n\n::\n\n $ ynot -t hello_world.ynot\n Hello World\n\n| Not very interesting, right?\n| Not useful at all, right?\n\nBut quite simple, right?\n\nProcess input data\n------------------\n\nNow let's do something a bit more useful. Let's process data - that's\nwhat ***y!*** is made for:\n\nLet's say we have an input that represents multiple text documents with\nsections and chapters:\n\n``$ cat sample_simple.yaml``\n\n.. code:: yaml\n\n - title: Some document title\n sections:\n - title: Some section title\n chapters:\n - title: Some chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other section title\n chapters:\n - title: Some chapter title for some other section\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other document title\n\n| ... just regular ``yaml`` - nothing magic.\n| Now we want to print all the titles and nothing else.\n\nFor the given input file we expect the following output:\n\n::\n\n Some document title\n Some section title\n Some chapter title\n Some other chapter title\n Some other section title\n Some chapter title for some other section\n Some other document title\n\nThe program for achieving that looks as simple as this:\n\n``$ cat sample_simple.ynot``\n\n.. code:: yaml\n\n actions:\n - for:\n path: '..title'\n actions:\n - print: '@y!{.@}'\n\nYou already may have noticed that ***y!*** programs are ``yaml`` files.\nFollowing a particular schema that we'll see later on.\n\nThe ``for`` action introduces an iterator. It iterates over all nodes\naddressed by ``path`` (``jsonpath`` expression) and performs the defined\n``actions`` on them.\n\nOne of the possible actions is ``print`` as we already saw in the hello\nworld program.\n\nHere we see that we are not limited to printing static text, but we can\nrefer to any node of the document by using the special template syntax\n``@y!{whatever}``, where ``whatever`` again is nothing else but a\n``jsonpath`` expression.\n\n``jsonpath`` expressions are evaluated relative to the path of the node\naddressed by parent actions like ``for``, unless they start with ``$`` -\nthen they are absolute ``jsonpath`` expressions, starting at the\ndocument's root.\n\nNow let's try it:\n\n::\n\n $ ynot -t sample_simple.ynot sample01.yaml\n Some document title\n Some section title\n Some chapter title\n Some other chapter title\n Some other section title\n Some chapter title for some other section\n Some other document title\n\nLooks good so far.\n\nBut while developing and testing the program we don't always want to\nmanually check if the output is correct, do we?\n\nWith verification\n~~~~~~~~~~~~~~~~~\n\n| ***y!*** has a very simple and straightforward solution.\n| You can add samples to the program:\n\n``$ cat sample_verficication_succeeding.ynot``\n\n.. code:: yaml\n\n actions:\n - for:\n path: '..title'\n actions:\n - print: '@y!{.@}'\n\n samples:\n sample1:\n\n input:\n - title: Some document title\n sections:\n - title: Some section title\n chapters:\n - title: Some chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other section title\n chapters:\n - title: Some chapter title for some other section\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other document title\n\n output: |\n Some document title\n Some section title\n Some chapter title\n Some other chapter title\n Some other section title\n Some chapter title for some other section\n Some other document title\n\n... and simply verify the program against expected output for given\ninput by just invoking it without input files or with the ``--dry-run``\noption:\n\n``$ ynot -t sample_verification_succeeding.ynot --dry-run``\n\n*Oh! No output!*\n\n| That's intended. When everything is right it doesn't output anything.\n| Let's prove that in case of problems they are reported.\n\nWith failing verification\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSo we change the program slightly by prepending *``title:``* to the\nactual title:\n\n``$ cat sample_verification_failing.ynot``\n\n.. code:: yaml\n\n actions:\n - for:\n path: '..title'\n actions:\n - print: 'title: @y!{.@}'\n\n samples:\n sample1:\n\n input:\n - title: Some document title\n sections:\n - title: Some section title\n chapters:\n - title: Some chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other section title\n chapters:\n - title: Some chapter title for some other section\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other document title\n\n output: |\n Some document title\n Some section title\n Some chapter title\n Some other chapter title\n Some other section title\n Some chapter title for some other section\n Some other document title\n\nNow we can see that the actual output doesn't match the expected one:\n\n::\n\n ynot -t samples/trafos/sample_verification_failing.yaml --dry-run\n ERROR:ynot.globals:Verifying sample sample1 failed\n\n Expected:\n Some document title\n Some section title\n Some chapter title\n Some other chapter title\n Some other section title\n Some chapter title for some other section\n Some other document title\n\n Got:\n title: Some document title\n title: Some section title\n title: Some chapter title\n title: Some other chapter title\n title: Some other section title\n title: Some chapter title for some other section\n title: Some other document title\n\n\n ERROR:ynot.globals:Verifying sample sample1 failed for trafo \n\nNice, isn't it?\n\nYou can add as many samples as you want - all of them will be processed\nand verified.\n\nActions\n=======\n\n``print``\n^^^^^^^^^\n\nWe already saw this action in action.\n\n``write``\n^^^^^^^^^\n\nSame as ``print`` but without trailing newline.\n\n``log``\n^^^^^^^\n\nAllows writing logging information (currently on INFO level - probably\nthis will be made configurable).\n\nWhat can be logged is intentionally limited to some attributes of the\ncurrent node:\n\n- path\n- pathstack\n- node\n- document\n\nYou can refer to these context attributes using python's string\nformatting capabilities (see `Python 2.7.14\ndocumentation `__):\n\n.. code:: yaml\n\n actions:\n - log: 'current path: {path}, current node value: {node}'\n\nSince log messages are written to stderr the output verification is not\naffected by adding log actions.\n\n``call``\n^^^^^^^^\n\nThere is a simple concept or ``routines`` that can be defined on top\nlevel of the transformator file.\n\nAll routines defined there can be called from ``actions`` as well as\nfrom ``routines``.\n\nDetails are explained in the routines section below.\n\nRoutines\n========\n\n- Routines are defined on top level of the ``ynot`` yaml-file.\n- Any ``routines`` key can be used as a parameter for the ``call``\n action.\n- A ``routines`` key maps a list of actions.\n- ***y!*** will also support parameters for routines, but that's not\n yet implemented.\n- These actions can call routines recursively. The following sample\n demonstrates this.\n\n``$ cat sample_routines.ynot``\n\n.. code:: yaml\n\n actions:\n - for:\n path: '$'\n actions:\n - log: 'path: \"%(path)s\"'\n - print: Depth First\n - print: ===========\n - call: print_list\n\n routines:\n\n print_list:\n - log: \"print_list(path='%(path)s')\"\n - for:\n path: '[*]'\n actions:\n - call: print_map\n - call: print_title\n\n print_map:\n - log: \"print_map(path='%(path)s')\"\n - for:\n path: '.*'\n actions:\n - call: print_list\n\n print_title:\n - log: \"print_title(path='%(path)s')\"\n - for:\n path: '.title'\n actions:\n - print: '@y!{.@}'\n\n\n samples:\n\n sample1:\n\n input:\n - title: Some document title\n sections:\n - title: Some section title\n chapters:\n - title: Some chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other chapter title\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other section title\n chapters:\n - title: Some chapter title for some other section\n text: |\n Some long text\n with lots of paragraphs\n - title: Some other document title\n\n output: |\n Depth First\n ===========\n Some chapter title\n Some other chapter title\n Some section title\n Some chapter title for some other section\n Some other section title\n Some document title\n Some other document title\n\nDocumenting\n-----------\n\nGenerating gfm markdown from ``.ynot`` transformators out of the box by\na simple command line option.\n\nJust try it with the routines sample:\n\n``ynot routines.ynot --doc > routines.md``\n\n``cat routines.md``\n\nWhen you view the output in any markdown viewer that's able to present\ngfm markdown you'll see this result:\n\n--------------\n\n.. routinesynot:\n\nroutines.ynot\n\n\n.. routines-1:\n\nRoutines\n========\n\n- `Samples <#samples>`__\n\n - `Sample document 1 <#sample01>`__\n - `Sample document 2 <#sample02>`__\n\n- `routines.ynot <#transformator>`__\n\nTransformator that shows how routines can be used\n-------------------------------------------------\n\nThis transformator lists all titles in *depth-first* mode.\n\nRoutines can be invoced recursively - that does the trick.\n\nSamples\n-------\n\nsample01\n\n\nSample document 1\n~~~~~~~~~~~~~~~~~\n\nThis document contains two documents:\n\n- the first one has two sections,\n\n - the first section has two chapters\n - the second section has only one chapters\n\n- the second one has nothing.\n\nInput\n^^^^^\n\n.. code:: yaml\n\n input:\n - title: Document 1\n sections:\n - title: Section 1.1\n chapters:\n - title: Chapter 1.1.1\n - title: Chatper 1.1.2\n - title: Section 2\n chapters:\n - title: Chapter 1.2.1\n - title: Chatper 1.2.2\n - title: Document 2\n sections:\n - title: Section 2.1\n chapters:\n - title: Chapter 2.1.1\n - title: Chapter 2.1.2\n - title: Section 2.2\n chapters:\n - title: Chapter 2.2.1\n - title: Chapter 2.2.2\n\nOutput\n^^^^^^\n\n::\n\n Depth First\n ===========\n Chapter 1.1.1\n Chatper 1.1.2\n Section 1.1\n Chapter 1.2.1\n Chatper 1.2.2\n Section 2\n Document 1\n Chapter 2.1.1\n Chapter 2.1.2\n Section 2.1\n Chapter 2.2.1\n Chapter 2.2.2\n Section 2.2\n Document 2\n\nsample02\n\n\nSample document 2\n~~~~~~~~~~~~~~~~~\n\nThis document contains two documents:\n\n- the first one has two sections,\n\n - the first section has two chapters\n - the second section has only one chapters\n\n- the second one has nothing.\n\n.. input-1:\n\nInput\n^^^^^\n\n.. code:: yaml\n\n input:\n - title: Some document title\n sections:\n - title: Some section title\n chapters:\n - title: Some chapter title\n text: 'Some long text\n\n with lots of paragraphs\n\n '\n - title: Some other chapter title\n text: 'Some long text\n\n with lots of paragraphs\n\n '\n - title: Some other section title\n chapters:\n - title: Some chapter title for some other section\n text: 'Some long text\n\n with lots of paragraphs\n\n '\n - title: Some other document title\n\n.. output-1:\n\nOutput\n^^^^^^\n\n::\n\n Depth First\n ===========\n Some chapter title\n Some other chapter title\n Some section title\n Some chapter title for some other section\n Some other section title\n Some document title\n Some other document title\n\nTransformator\n-------------\n\n.. code:: yaml\n\n id: routines.ynot\n name: Routines\n title: Transformator that shows how routines can be used\n description: 'This transformator lists all titles\n\n in _depth-first_ mode.\n\n\n Routines can be invoced recursively - that does the trick.\n\n '\n actions:\n - log: 'Root path: {path}\"'\n - for:\n path: $\n actions:\n - print: Depth First\n - print: ===========\n - call: print_list\n routines:\n print_list:\n - log: print_list(path='{path}')\n - for:\n path: '[*]'\n actions:\n - call: print_map\n - call: print_title\n print_map:\n - log: print_map(path='{path}')\n - for:\n path: '*'\n actions:\n - call: print_list\n print_title:\n - log: print_title(path='{path}')\n - for:\n path: title\n actions:\n - print: null\n samples:\n sample1:\n id: sample01\n title: Sample document 1\n description: \"This document contains two documents:\\n* the first one has two sections,\\n * the first section has two chapters\\n\\\n \\ * the second section has only one chapters\\n* the second one has nothing.\\n\"\n input:\n - title: Document 1\n sections:\n - title: Section 1.1\n chapters:\n - title: Chapter 1.1.1\n - title: Chatper 1.1.2\n - title: Section 2\n chapters:\n - title: Chapter 1.2.1\n - title: Chatper 1.2.2\n - title: Document 2\n sections:\n - title: Section 2.1\n chapters:\n - title: Chapter 2.1.1\n - title: Chapter 2.1.2\n - title: Section 2.2\n chapters:\n - title: Chapter 2.2.1\n - title: Chapter 2.2.2\n output: 'Depth First\n\n ===========\n\n Chapter 1.1.1\n\n Chatper 1.1.2\n\n Section 1.1\n\n Chapter 1.2.1\n\n Chatper 1.2.2\n\n Section 2\n\n Document 1\n\n Chapter 2.1.1\n\n Chapter 2.1.2\n\n Section 2.1\n\n Chapter 2.2.1\n\n Chapter 2.2.2\n\n Section 2.2\n\n Document 2\n\n '\n sample2:\n id: sample02\n title: Sample document 2\n description: \"This document contains two documents:\\n* the first one has two sections,\\n * the first section has two chapters\\n\\\n \\ * the second section has only one chapters\\n* the second one has nothing.\\n\"\n input:\n - title: Some document title\n sections:\n - title: Some section title\n chapters:\n - title: Some chapter title\n text: 'Some long text\n\n with lots of paragraphs\n\n '\n - title: Some other chapter title\n text: 'Some long text\n\n with lots of paragraphs\n\n '\n - title: Some other section title\n chapters:\n - title: Some chapter title for some other section\n text: 'Some long text\n\n with lots of paragraphs\n\n '\n - title: Some other document title\n output: 'Depth First\n\n ===========\n\n Some chapter title\n\n Some other chapter title\n\n Some section title\n\n Some chapter title for some other section\n\n Some other section title\n\n Some document title\n\n Some other document title\n\n '\n\n--------------\n\nCurrently under implementation\n==============================\n\nVariables support\n-----------------\n\nVariables can be set during execution. They are saved in the current\nnode's context.\n\nWhen accessing a variable, variables from all parent nodes' contexts are\nvisible as well.\n\nVariables can be accessed programmatically or as part of\nvalue-templates.\n\n- Value template to be substituted by a variable value: ``${...}``\n- Path-match template to be substituted by a single match result:\n ``@y!{...}``\n- Path-multimatch template to be substituted by the\n string-representation of multiple matches: ``@y!*{...}``\n\n.. code:: yaml\n\n actions:\n - set:\n key: myMagicNumber\n value: 42\n - print: '${myMagicNumber}'\n\nCall parameter support\n----------------------\n\n.. code:: yaml\n\n actions:\n - call:\n routine: some_routine\n parameters:\n paramX: some value\n paramY: some value\n\nNot yet implemented\n===================\n\n... nor verified ...\n\nSorting\n-------\n\nMaybe sufficiently supported out of the box by jsonpath_ng extensions.\nTo be verified ...\n\nAlternatively something like this might be implemented\n\n.. code:: yaml\n\n actions:\n - for:\n path: '$.some.path'\n sorting:\n order: descending\n criteria:\n - '.some_field'\n - '.some_other_field'\n actions:\n - print: whatever\n\nGrouping\n--------\n\n.. code:: yaml\n\n actions:\n - for:\n path: '$.some.path'\n grouping:\n criteria:\n - '.some_field'\n - '.some_other_field'\n having:\n - 'whatever'\n - 'whatever'\n actions:\n - print: whatever\n\nConditional processing\n----------------------\n\n.. code:: yaml\n\n actions:\n - if:\n - and:\n - value1: some value\n comparator: equals\n value2: some other value\n - value1: some value\n comparator: equals\n value2: some other value\n - or:\n - value1: some value\n comparator: equals\n value2: some other value\n then:\n - print: matched if branch\n else:\n - print: matched else branch\n\nTransormator/Document processing order\n--------------------------------------\n\n... for multi-document transformator yamls\n\nAllow command line switch like ``--processing-order=templates-first`` or\n``--processing-order=documents-first``\n\n.. command-line-option-for-defining-template-patterns:\n\nCommand line option for defining template patterns.\n---------------------------------------------------\n\nSomething like ...\n\n``template-pattern='{separator: \"@\", idpattern: \"[{}+]\"}'``\n\nConnecting to data sources\n--------------------------\n\nlike *Elasticsearch*, *Redis*, *Cassandra*, *MySQL*, *Kafka*, ... ...\n...\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/yaccob/ynot/archive/0.2.18.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ynot/ynot", "keywords": "yaml,json,transform,xslt,jsonpath,json-path,dump,convert,validate,schema", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "ynot", "package_url": "https://pypi.org/project/ynot/", "platform": "", "project_url": "https://pypi.org/project/ynot/", "project_urls": { "Download": "https://github.com/yaccob/ynot/archive/0.2.18.tar.gz", "Homepage": "https://github.com/ynot/ynot" }, "release_url": "https://pypi.org/project/ynot/0.2.18/", "requires_dist": [ "PyYaml", "jsonpath-ng", "jsonschema" ], "requires_python": "", "summary": "Yaml-based No-xml Transformation", "version": "0.2.18" }, "last_serial": 3565849, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "470a15327a6f1110ffdd92de2bb6ff2b", "sha256": "35c979540d130c5fd1f6733cd0ce7321d05a31211e4a81a7c7146bcd2db4e886" }, "downloads": -1, "filename": "ynot-0.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "470a15327a6f1110ffdd92de2bb6ff2b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8074, "upload_time": "2018-02-03T04:05:30", "url": "https://files.pythonhosted.org/packages/9a/46/82e00547e095cec2f637c6549bbc2cd3b82a55eee7c8df0ead2d896bc4c7/ynot-0.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a00806c71c62b4e93da4d7e359810c38", "sha256": "d3f899c285b1e6c00b0f3a3cb0d44072f92183504ee4ca9a536086781184e8f1" }, "downloads": -1, "filename": "ynot-0.2.0.tar.gz", "has_sig": false, "md5_digest": "a00806c71c62b4e93da4d7e359810c38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9501, "upload_time": "2018-02-03T04:05:31", "url": "https://files.pythonhosted.org/packages/ac/00/06b5ef22811b13beeeb245c8a561652ef5d2e45c6c99324f7cf70011a1d7/ynot-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "f020d4483b34a8c6fe1e21cbc669c484", "sha256": "621a9971219fe2e569ee30a056cf44a930d00f724cc3c552046436c5a873c2d9" }, "downloads": -1, "filename": "ynot-0.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "f020d4483b34a8c6fe1e21cbc669c484", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 10933, "upload_time": "2018-02-03T12:10:38", "url": "https://files.pythonhosted.org/packages/04/dd/23275ce91dab6beec1c9ac7df9b4882269f65d19d1800bed56d510370a33/ynot-0.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b50669ea8351d893906fbcbb05c6242b", "sha256": "d1647107754d7688f9ab58843b788c9e3042c26f7329b4f01a9cfaf069cb9789" }, "downloads": -1, "filename": "ynot-0.2.1.tar.gz", "has_sig": false, "md5_digest": "b50669ea8351d893906fbcbb05c6242b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12512, "upload_time": "2018-02-03T12:10:42", "url": "https://files.pythonhosted.org/packages/20/a1/05c727f0091a986b3076f507d861fdc4165aee8a62852a80ff2bf4b372e7/ynot-0.2.1.tar.gz" } ], "0.2.10": [ { "comment_text": "", "digests": { "md5": "a397a006eefedef772b910ad89778323", "sha256": "f8f7828e3c0e73ec353b473d1bbe697eed8e6d9fc99cc13d7e5b2cfff42ceab9" }, "downloads": -1, "filename": "ynot-0.2.10-py2-none-any.whl", "has_sig": false, "md5_digest": "a397a006eefedef772b910ad89778323", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 18398, "upload_time": "2018-02-05T22:08:57", "url": "https://files.pythonhosted.org/packages/bd/06/526ff894abdec403a9204787583d08499fbd6fdcf18087e14e2cff135f00/ynot-0.2.10-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "987212cd9b5cf89419a0a91d2ad67a41", "sha256": "4770e81bc91d7dc59e0a90071c0cdb55879cc2917a7831dd7ed9eab08ccffeef" }, "downloads": -1, "filename": "ynot-0.2.10.tar.gz", "has_sig": false, "md5_digest": "987212cd9b5cf89419a0a91d2ad67a41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21984, "upload_time": "2018-02-05T22:09:01", "url": "https://files.pythonhosted.org/packages/0d/fa/f036316c12a8edb1fc4de9737ee81d581f02b058c35f04a273574f8a85ce/ynot-0.2.10.tar.gz" } ], "0.2.15": [ { "comment_text": "", "digests": { "md5": "52e1be49dc6787f31df431b371ec9837", "sha256": "de1c86e65f1742a307a1cde35dc4e29ab307548347c34ef2125710c0b94439d4" }, "downloads": -1, "filename": "ynot-0.2.15-py2-none-any.whl", "has_sig": false, "md5_digest": "52e1be49dc6787f31df431b371ec9837", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 19679, "upload_time": "2018-02-05T23:52:25", "url": "https://files.pythonhosted.org/packages/0f/30/9c7eadc01c782a179a0288dc2596957ea87abc27fff0c30cd66ba43dd82c/ynot-0.2.15-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4dcd6d7a8483ce8f34719527f340edcf", "sha256": "3e110e1f9fa55ffe50c1a2b867eae94258c8dc62b621a1b70aa795a1b7803f19" }, "downloads": -1, "filename": "ynot-0.2.15.tar.gz", "has_sig": false, "md5_digest": "4dcd6d7a8483ce8f34719527f340edcf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22928, "upload_time": "2018-02-05T23:52:27", "url": "https://files.pythonhosted.org/packages/22/c2/c323d6fab71a2fa5fd42130f72dc5253e79c87dafa7441ab96cdeca47813/ynot-0.2.15.tar.gz" } ], "0.2.16": [ { "comment_text": "", "digests": { "md5": "1357317adb6d578b73aa11ed1abe205f", "sha256": "4dea1e18aca67684d1dba074647f72274490105d9b69fab3c6a6a60c7b747652" }, "downloads": -1, "filename": "ynot-0.2.16-py2-none-any.whl", "has_sig": false, "md5_digest": "1357317adb6d578b73aa11ed1abe205f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 20356, "upload_time": "2018-02-08T03:17:00", "url": "https://files.pythonhosted.org/packages/e2/6f/5dbd12d1fc4b4a73f0aa72c6604cb0a2fc96c32d546ee869979548e4025b/ynot-0.2.16-py2-none-any.whl" } ], "0.2.17": [ { "comment_text": "", "digests": { "md5": "1f8a1bb51c510f159f33e896ac072ad0", "sha256": "932a68880bab1852ff2e1faa2de948528e04d09df2d8f89e0a2ef021a93cb4ca" }, "downloads": -1, "filename": "ynot-0.2.17-py2-none-any.whl", "has_sig": false, "md5_digest": "1f8a1bb51c510f159f33e896ac072ad0", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 20459, "upload_time": "2018-02-08T22:40:12", "url": "https://files.pythonhosted.org/packages/0a/0e/4dfa332ceda5992ce98262d11c33ee561bdcdd4aa685f342bf8ba782a042/ynot-0.2.17-py2-none-any.whl" } ], "0.2.18": [ { "comment_text": "", "digests": { "md5": "aeb4c3d9eedb5ce072d05ee29535ca9a", "sha256": "f1fe168db4d72a83b21ebeca3c86cfefbd9a7d4b03c00e5632a8c3c30ac77abf" }, "downloads": -1, "filename": "ynot-0.2.18-py2-none-any.whl", "has_sig": false, "md5_digest": "aeb4c3d9eedb5ce072d05ee29535ca9a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 20648, "upload_time": "2018-02-09T02:05:31", "url": "https://files.pythonhosted.org/packages/92/56/ba73e9a01ea2c75c9ab9a9049941c81289347173b92d65557bbdc03bad57/ynot-0.2.18-py2-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aeb4c3d9eedb5ce072d05ee29535ca9a", "sha256": "f1fe168db4d72a83b21ebeca3c86cfefbd9a7d4b03c00e5632a8c3c30ac77abf" }, "downloads": -1, "filename": "ynot-0.2.18-py2-none-any.whl", "has_sig": false, "md5_digest": "aeb4c3d9eedb5ce072d05ee29535ca9a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 20648, "upload_time": "2018-02-09T02:05:31", "url": "https://files.pythonhosted.org/packages/92/56/ba73e9a01ea2c75c9ab9a9049941c81289347173b92d65557bbdc03bad57/ynot-0.2.18-py2-none-any.whl" } ] }