{ "info": { "author": "Lasse Hyyrynen", "author_email": "leh@protonmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Topic :: Utilities" ], "description": "|Build Status| |Coverage| |PyPI|\n\nJF\n==\n\nJF, aka \"jndex fingers\" or more commonly \"json filter pipeline\", is a\njq-clone written in python. It supports evaluation of python oneliners,\nmaking it especially appealing for data scientists who are used to\nworking with python.\n\nInstalling\n==========\n\n::\n\n pip install jf\n\nHow does it work\n================\n\nJF works by converting json or yaml data structure through a\nmap/filter-pipeline. The pipeline is compiled from a string representing\na comma-separated list filters and mappers. The query parser assumes\nthat each function of the pipeline reads items from a generator. The\ngenerator is given as the last non-keyword parameter to the function, so\n\"map(conversion)\" is interpreted as \"map(conversion, inputgenerator)\".\nThe result from a previous function is given as the input generator for\nthe next function in the pipeline. The pipeline conversion is shown\nbelow as pseudocode:\n\n::\n\n def build_pipeline(input, conversions):\n pipeline = input\n for convert in conversions:\n pipeline = convert(pipeline)\n return pipeline\n\nThe pipeline generated by the previous function is then iterated and\nprinted to the user. The basic building blocks of a pipeline are\n\n- map(val) = map item to new object\n- filter(cond) = filter to show only items matching condition\n- update(val) = update item values\n- hide(dict\\_keys) = hide dict\\_keys from output\n\nSome built-in functions headers have been remodeled to be more intuitive\nwith the framework. Most noticeable is the sorted-function, which\nnormally has the key defined as a keyword argument. This was done since\nit seems more logical to sort items by id by writing \"sorted(x.id)\" than\n\"sorted(key=lambda x: x.id)\". Similar changes are done for some other\nuseful functions:\n\n- islice(stop) => islice(arr, start=0, stop, step=1)\n- islice(start, stop, step=1) => islice(arr, start, stop, step)\n- first(N=1) => islice(arr, N)\n- last(N=1) => iter(deque(arr, maxlen=N))\n- I = arr (== identity operation)\n- yield\\_from(x) => yield items from x\n- group\\_by(key) => group items by data key value\n- chain() => chain(\\*arr) - combine items into a list\n\nFor datetime processing, two useful helper functions are imported by\ndefault:\n\n- date(string) for parsing string into a python datetime-object\n- age(string) for calculating timedelta between now() and date(string)\n\nThese are useful for sorting or filtering items in based on timestamps.\nSome of these functions have aliases predefined, such as head(), tail(),\nyield\\_all(), group() and reduce\\_list().\n\nFor shortened syntax, '{...}' is interpreted as 'map({...})' and (...)\nis interpreted as filter(...).\n\nBasic usage\n===========\n\nFilter selected fields\n\n::\n\n $ cat samples.jsonl | jf 'map({id: x.id, subject: x.fields.subject})'\n {\"id\": \"87086895\", \"subject\": \"Swedish children stories\"}\n {\"id\": \"87114792\", \"subject\": \"New Finnish storybooks\"}\n\nFilter selected items\n\n::\n\n $ cat samples.jsonl | jf 'map({id: x.id, subject: x.fields.subject}),\n filter(x.id == \"87114792\")'\n {\"id\": \"87114792\", \"subject\": \"New Finnish storybooks\"}\n\nFilter selected items with shortened syntax\n\n::\n\n $ cat samples.jsonl | jf '{id: x.id, subject: x.fields.subject},\n (x.id == \"87114792\")'\n {\"id\": \"87114792\", \"subject\": \"New Finnish storybooks\"}\n\nFilter selected values\n\n::\n\n $ cat samples.jsonl | jf 'map(x.id)'\n \"87086895\"\n \"87114792\"\n\nFilter items by age (and output yaml)\n\n::\n\n $ cat samples.jsonl | jf 'map({id: x.id, datetime: x[\"content-datetime\"]}),\n filter(age(x.datetime) > age(\"456 days\")),\n update({age: age(x.datetime)})' --indent=5 --yaml\n age: 457 days, 4:07:54.932587\n datetime: '2016-10-29 10:55:42+03:00'\n id: '87086895'\n\nSort items by age and print their id, length and age\n\n::\n\n $ cat samples.jsonl|jf 'update({age: age(x[\"content-datetime\"])}),\n sorted(x.age),\n map(.id, \"length: %d\" % len(.content), .age)' --indent=3 --yaml\n - '14941692'\n - 'length: 63'\n - 184 days, 0:02:20.421829\n - '90332110'\n - 'length: 191'\n - 215 days, 22:15:46.403613\n - '88773908'\n - 'length: 80'\n - 350 days, 3:11:06.412088\n - '14558799'\n - 'length: 1228'\n - 450 days, 6:30:54.419461\n\nFilter items after a given datetime (test.json is a git commit history):\n\n::\n\n $ jf 'update({age: age(.commit.author.date)}),\n filter(date(.commit.author.date) > date(\"2018-01-30T17:00:00Z\")),\n sorted(x.age, reverse=True), map(.sha, .age, .commit.author.date)' test.json \n [\n \"68fe662966c57443ae7bf6939017f8ffa4b182c2\",\n \"2 days, 9:40:12.137919\",\n \"2018-01-30T18:35:27Z\"\n ]\n [\n \"d3211e1141d8b2bf480cbbebd376b57bae9d8bdf\",\n \"2 days, 9:18:07.134418\",\n \"2018-01-30T18:57:32Z\"\n ]\n [\n \"f8ba0ba559e39611bc0b63f236a3e67085fe8b40\",\n \"2 days, 8:50:09.129790\",\n \"2018-01-30T19:25:30Z\"\n ]\n\nImport your own modules and hide fields:\n\n::\n\n $ cat test.json|jf --import_from modules/ --import demomodule --yaml 'update({id: x.sha}),\n demomodule.timestamppipe(),\n hide(\"sha\", \"committer\", \"parents\", \"html_url\", \"author\", \"commit\",\n \"comments_url\"), islice(3,5)'\n - Pipemod: was here at 2018-01-31 09:26:12.366465\n id: f5f879dd7303c35fa3712586af1e7df884a5b98b\n url: https://api.github.com/repos/alhoo/jf/commits/f5f879dd7303c35fa3712586af1e7df884a5b98b\n - Pipemod: was here at 2018-01-31 09:26:12.368438\n id: b393d09215efc4fc0382dd82ec3f38ae59a287e5\n url: https://api.github.com/repos/alhoo/jf/commits/b393d09215efc4fc0382dd82ec3f38ae59a287e5\n\nRead yaml:\n\n::\n\n $ cat test.yaml | jf --yamli 'update({id: x.sha, age: age(x.commit.author.date)}),\n filter(x.age < age(\"1 days\"))' --indent=2 --yaml\n - age: 0 days, 22:45:56.388477\n author:\n avatar_url: https://avatars1.githubusercontent.com/u/8501204?v=4\n events_url: https://api.github.com/users/hyyry/events{/privacy}\n followers_url: https://api.github.com/users/hyyry/followers\n ...\n\nGroup duplicates (age is within the same hour):\n\n::\n\n $ cat test.json|jf --import_from modules/ --import demomodule 'update({id: x.sha}),\n sorted(.commit.author.date, reverse=True),\n demomodule.DuplicateRemover(int(age(.commit.author.date).total_seconds()/3600),\n group=1).process(lambda x: {\"duplicate\": x.id}),\n map(list(map(lambda y: {age: age(y.commit.author.date), id: y.id, \n date: y.commit.author.date, duplicate_of: y[\"duplicate\"],\n comment: y.commit.message}, x))),\n first(2)'\n [\n {\n \"comment\": \"Add support for hiding fields\",\n \"duplicate_of\": null,\n \"id\": \"f8ba0ba559e39611bc0b63f236a3e67085fe8b40\",\n \"age\": \"16:19:00.102299\",\n \"date\": \"2018-01-30 19:25:30+00:00\"\n },\n {\n \"comment\": \"Enhance error handling\",\n \"duplicate_of\": \"f8ba0ba559e39611bc0b63f236a3e67085fe8b40\",\n \"id\": \"d3211e1141d8b2bf480cbbebd376b57bae9d8bdf\",\n \"age\": \"16:46:58.104188\",\n \"date\": \"2018-01-30 18:57:32+00:00\"\n }\n ]\n [\n {\n \"comment\": \"Reduce verbosity when debugging\",\n \"duplicate_of\": null,\n \"id\": \"f5f879dd7303c35fa3712586af1e7df884a5b98b\",\n \"age\": \"19:26:00.106777\",\n \"date\": \"2018-01-30 16:18:30+00:00\"\n },\n {\n \"comment\": \"Print help if no input is given\",\n \"duplicate_of\": \"f5f879dd7303c35fa3712586af1e7df884a5b98b\",\n \"id\": \"b393d09215efc4fc0382dd82ec3f38ae59a287e5\",\n \"age\": \"19:35:16.108654\",\n \"date\": \"2018-01-30 16:09:14+00:00\"\n }\n ]\n\nUse pythonic conditional operation, string.split() and complex string\nand date formatting with built-in python syntax. Also you can combine\nthe power of regular expressions by including the re-library.\n\n::\n\n $ jf --import_from modules/ --import re --import demomodule --input skype.json 'yield_from(x.messages),\n update({from: x.from.split(\":\")[-1], mid: x.skypeeditedid if x.skypeeditedid else x.clientmessageid}),\n sorted(age(x.composetime), reverse=True),\n demomodule.DuplicateRemover(x.mid, group=1).process(),\n map(last(x)),\n yield_from(x),\n sorted(age(.composetime), reverse=True),\n map(\"%s %s: %s\" % (date(x.composetime).strftime(\"%d.%m.%Y %H:%M\"), x.from, re.sub(r\"(<[^>]+>)+\", \" \", x.content)))' --raw\n 27.01.2018 11:02 2296ead9324b68aef4bc105c8e90200c@thread.skype: 1518001760666 8:live:matti_3426 8:live:matti_6656 8:hyyrynen.london 8:live:suvi_56 8:jukka.mattinen \n 27.01.2018 11:12 matti_7626: Required competence: PHP programmer (Mika D, Markus H, Heidi), some JavaScript (e.g. for GUI)\n 27.01.2018 11:12 matti_7626: Matti: parameters part\n 27.01.2018 11:15 matti_7626: 1.) Clarify customer requirements - AP: Suvi/Joseph\n 27.01.2018 11:22 matti_7626: This week - initial installation and setup\n 27.01.2018 11:22 matti_7626: Next week (pending customer requirements) - system configuration\n 27.01.2018 11:25 matti_7626: configuration = parameters, configuration files (audio files, from customer, ask Suvi to request today?), add audio files to system (via GUI)\n 27.01.2018 11:26 matti_7626: Testing = specify how we do testing, for example written test cases by the customer.\n 27.01.2018 11:28 matti_7626: Need test group (testgroup 1 prob easiest to recognise says Lasse)\n\nFeatures\n========\n\n- json, jsonl and yaml files for input and output\n- bz2 and gzip compressed input for json, jsonl and yaml\n- csv and xlsx support if pandas and xlrd is installed\n- markdown table output support\n- construct generator pipeline with map, hide, filter\n- access json dict as classes with dot-notation for attributes\n- datetime and timedelta comparison\n- age() for timedelta between datetime and current time\n- first(N), last(N), islice(start, stop, step)\n- head and tail alias for last and first\n- firstnlast(N) (or headntail(N))\n- import your own modules for more complex filtering\n- Support stateful classes for complex interactions between items\n- drop your filtered data to IPython for manual data exploration\n- pandas profiling support for quick data exploration\n- user --ordered\\_dict to keep items in order\n\nKnown bugs\n==========\n\n- IPython doesn't launch perfectly with piped data\n\n.. |Build Status| image:: https://travis-ci.org/alhoo/jf.svg?branch=master\n :target: https://travis-ci.org/alhoo/jf\n.. |Coverage| image:: https://codecov.io/github/alhoo/jf/coverage.svg?branch=master\n :target: https://codecov.io/github/alhoo/jf\n.. |PyPI| image:: https://img.shields.io/pypi/v/jf.svg\n :target: https://pypi.python.org/pypi/jf\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/alhoo/jf/archive/0.6.6.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/alhoo/jf", "keywords": "json", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "jf", "package_url": "https://pypi.org/project/jf/", "platform": "", "project_url": "https://pypi.org/project/jf/", "project_urls": { "Download": "https://github.com/alhoo/jf/archive/0.6.6.tar.gz", "Homepage": "https://github.com/alhoo/jf" }, "release_url": "https://pypi.org/project/jf/0.6.6/", "requires_dist": null, "requires_python": "", "summary": "Python jsonl query engine", "version": "0.6.6" }, "last_serial": 5930867, "releases": { "0.3": [ { "comment_text": "", "digests": { "md5": "3d8342c5e2411dbcc5e0bf3af179f2bf", "sha256": "3ece8c794f2f4c53bba114f4cdc1601846c97d3d992abec7ef9a37f2b01b884f" }, "downloads": -1, "filename": "jf-0.3.tar.gz", "has_sig": false, "md5_digest": "3d8342c5e2411dbcc5e0bf3af179f2bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9958, "upload_time": "2018-01-31T21:48:39", "url": "https://files.pythonhosted.org/packages/0c/72/016b2ab40e93e592d513e025b1ccd938627e7f7b4273115fee31cc28221a/jf-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "4dad0debe8a9ad352f544e1cade3410d", "sha256": "7486133f149b8f391db5abbdfabb19bf06d07cd75ce34067dad7ee618ab0acf7" }, "downloads": -1, "filename": "jf-0.3.1.tar.gz", "has_sig": false, "md5_digest": "4dad0debe8a9ad352f544e1cade3410d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11669, "upload_time": "2018-01-31T22:07:21", "url": "https://files.pythonhosted.org/packages/60/39/e54d872b25ba4810b04d8af5d35bedbf291efa6392e79453ce8f4e1b6160/jf-0.3.1.tar.gz" } ], "0.3.10": [ { "comment_text": "", "digests": { "md5": "0e6b0bdf1efacb0007fe414cb957c6ec", "sha256": "7ab2c0c57a19a5bde4ad23ddd1d6b2e912558cd92d900df195da1dc1062f97fd" }, "downloads": -1, "filename": "jf-0.3.10.tar.gz", "has_sig": false, "md5_digest": "0e6b0bdf1efacb0007fe414cb957c6ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31227, "upload_time": "2018-02-10T16:02:39", "url": "https://files.pythonhosted.org/packages/d1/2d/ab906f304c1936715c56dad4342b4cb624f9097b2f4d6920f7de2efd2192/jf-0.3.10.tar.gz" } ], "0.3.11": [ { "comment_text": "", "digests": { "md5": "cc6f75f4344bd6d3f280fc01366c435f", "sha256": "4d39650545801df404e9dc658e546b51d6f838ad9ae257383e65e070ad3a1dc3" }, "downloads": -1, "filename": "jf-0.3.11.tar.gz", "has_sig": false, "md5_digest": "cc6f75f4344bd6d3f280fc01366c435f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32079, "upload_time": "2018-02-11T13:34:18", "url": "https://files.pythonhosted.org/packages/5a/8a/a0912f8a35be1a161256124d65ff9aa5661a891670e9397c861a3b8fa078/jf-0.3.11.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "c7a3e95b1cbee9b7ccd19ea6ef0a5edf", "sha256": "29db45441b5511a732f101fab94b86be0580f834c98c22f72a92caeb139b5811" }, "downloads": -1, "filename": "jf-0.3.2.tar.gz", "has_sig": false, "md5_digest": "c7a3e95b1cbee9b7ccd19ea6ef0a5edf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11661, "upload_time": "2018-01-31T22:13:47", "url": "https://files.pythonhosted.org/packages/66/1d/54884cd09b81568fd3ae72737a560b28476976d6bcfe9621f4fe0fa1b3b0/jf-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "964bcd087559685207b65ca0cf5d8549", "sha256": "f28795ae04561fe7fb24a9340802d49d7ecfa132c977598adf1628d46a04796b" }, "downloads": -1, "filename": "jf-0.3.3.tar.gz", "has_sig": false, "md5_digest": "964bcd087559685207b65ca0cf5d8549", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12112, "upload_time": "2018-02-01T05:20:55", "url": "https://files.pythonhosted.org/packages/88/29/991dca65b9e59562e877fec2759bc83ea1c4627a5f48b6c6ff1604fea060/jf-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "d0c05156c29a52391d609f6c10468284", "sha256": "58336205fbec1acc9d70ee8b82fa9eeab10245102bdf0b084fec54701550878c" }, "downloads": -1, "filename": "jf-0.3.4.tar.gz", "has_sig": false, "md5_digest": "d0c05156c29a52391d609f6c10468284", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15437, "upload_time": "2018-02-02T15:53:15", "url": "https://files.pythonhosted.org/packages/34/db/78f825167fd0a4118fa2aa01e22f14fad093db9c2c14cea368f2097d9330/jf-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "180ef7bb592de2e2092845754825cc76", "sha256": "d63f9e5cb06e796eaf3155bc6480d030feb083d36c8f1a9898b8d0ab68965177" }, "downloads": -1, "filename": "jf-0.3.5.tar.gz", "has_sig": false, "md5_digest": "180ef7bb592de2e2092845754825cc76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16641, "upload_time": "2018-02-04T08:00:00", "url": "https://files.pythonhosted.org/packages/eb/68/986c63c10f5f2b8257827b56646b75108eb1bd47b96ff39f155a60392b0c/jf-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "f75905e969400d82f478bbd4b1a4ca6b", "sha256": "9e75cba67626eaf37c6c64927594a45ce0d41293d09ece457114cc220eb6c44d" }, "downloads": -1, "filename": "jf-0.3.6.tar.gz", "has_sig": false, "md5_digest": "f75905e969400d82f478bbd4b1a4ca6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23934, "upload_time": "2018-02-04T20:01:57", "url": "https://files.pythonhosted.org/packages/73/f0/1651756acef161f7fff31081b8d522dfe361dea33e94bd8769726c92b67b/jf-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "bfddf02e5cb32b4ce0b0d1a57ebe6fee", "sha256": "7525307f48dd8ed01f22b3b5e6ad5474895fb7587c1ffc2bb3c5602396210ecd" }, "downloads": -1, "filename": "jf-0.3.7.tar.gz", "has_sig": false, "md5_digest": "bfddf02e5cb32b4ce0b0d1a57ebe6fee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24464, "upload_time": "2018-02-06T03:14:54", "url": "https://files.pythonhosted.org/packages/7d/3d/669832b014632207e87f3574f69979257ea62d020f741fb611cb0fcf39c0/jf-0.3.7.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "ecc7bfc2572627159c6a270c41050f89", "sha256": "1df9ef22b1b3baab3d0aa939e43221a26352f155af198c1766da86a9013bd4e5" }, "downloads": -1, "filename": "jf-0.3.8.tar.gz", "has_sig": false, "md5_digest": "ecc7bfc2572627159c6a270c41050f89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24704, "upload_time": "2018-02-06T03:48:41", "url": "https://files.pythonhosted.org/packages/91/05/5ae692d5007b49478b63a6e2e3924ef2a1a15972797c87c6467ae4b644a6/jf-0.3.8.tar.gz" } ], "0.3.9": [ { "comment_text": "", "digests": { "md5": "e798be3720c110f70b9f7b71d14f3914", "sha256": "fb0a4af020414b3d28d27f9d080e0cd68dead3fa2793b2d502052598a27e77a7" }, "downloads": -1, "filename": "jf-0.3.9.tar.gz", "has_sig": false, "md5_digest": "e798be3720c110f70b9f7b71d14f3914", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33908, "upload_time": "2018-02-08T16:52:08", "url": "https://files.pythonhosted.org/packages/ef/e8/54eba496221e6fd89c7b29761af9e57a43df1124ebe571faba0d66fa1b13/jf-0.3.9.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "8f9791eced5927c401d5925484b7034c", "sha256": "869da6c1dfbbb377e4091827fd405d1691dd83cc3d2b635125e10dd868fc4c54" }, "downloads": -1, "filename": "jf-0.4.0.tar.gz", "has_sig": false, "md5_digest": "8f9791eced5927c401d5925484b7034c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36853, "upload_time": "2018-02-14T16:02:46", "url": "https://files.pythonhosted.org/packages/f8/8b/f48b32663e6fc5ec53ac45de71e969f697640ca516bb3d047acccb991bb6/jf-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "35070dfdf815bc4c5c97725bf0910271", "sha256": "83f71df98744aa45565346bf84709c7d33d00bbf0bde48c1d7f5c51af4bada4a" }, "downloads": -1, "filename": "jf-0.4.1.tar.gz", "has_sig": false, "md5_digest": "35070dfdf815bc4c5c97725bf0910271", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36897, "upload_time": "2018-02-14T16:12:55", "url": "https://files.pythonhosted.org/packages/67/2e/714e6b04a46dd4c69a0beb62d83276323aef58a24bdc8cd0a803dd9a982f/jf-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "4e4c1fec923a020b67a82114eb5782ba", "sha256": "eda1700ff17595b0aa1002c27999472761f572269cb2b0b0edae752c8d1b6ae9" }, "downloads": -1, "filename": "jf-0.4.2.tar.gz", "has_sig": false, "md5_digest": "4e4c1fec923a020b67a82114eb5782ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17093, "upload_time": "2018-03-22T05:57:55", "url": "https://files.pythonhosted.org/packages/14/6d/11681c87f7ebd87a5c1bd911e16a8941f31ef1c2c54fe1913f7c78e9b0aa/jf-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "f0690fa036bc08ea198e882cc866930d", "sha256": "3d6fab43c93a269e8c99a94ecf0b7ec9867f0bc6c5258e8aa8c145b50bb1bda6" }, "downloads": -1, "filename": "jf-0.4.3.tar.gz", "has_sig": false, "md5_digest": "f0690fa036bc08ea198e882cc866930d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40312, "upload_time": "2018-03-22T18:28:03", "url": "https://files.pythonhosted.org/packages/37/df/562335c9b9bfbc8d5e98e3ea44305d3a6e32348e72fcd0af483b783f65b5/jf-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "77e4652dad8ac5b08152985d83feadac", "sha256": "65cb5e6994fdd3994b5be855e7b3a7bc5e46fe058bfafd835368ef6b2753f6e6" }, "downloads": -1, "filename": "jf-0.4.4.tar.gz", "has_sig": false, "md5_digest": "77e4652dad8ac5b08152985d83feadac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40599, "upload_time": "2018-07-13T23:22:12", "url": "https://files.pythonhosted.org/packages/79/8a/8619e6c2cf6c26b46728f7db3626a4034344ee803f0f491975d36eadeec1/jf-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "87c9b95abee62c21520f9624d2373315", "sha256": "97cfd4492807964cb21a51357f0dd804d08a0390f4aa43d355ddb6ad9dcc908f" }, "downloads": -1, "filename": "jf-0.4.5.tar.gz", "has_sig": false, "md5_digest": "87c9b95abee62c21520f9624d2373315", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41068, "upload_time": "2018-07-16T04:39:41", "url": "https://files.pythonhosted.org/packages/db/60/d4ca0e09650933b22ef73c3f86881d75b802edbb418e25ca2addad3525c2/jf-0.4.5.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "594eca4da446729c8d5b50a8216d4569", "sha256": "eadcf530ae1e594d70d5c59e3de443567e19dddf4474d275bfd1cf41f451f8b2" }, "downloads": -1, "filename": "jf-0.4.6.tar.gz", "has_sig": false, "md5_digest": "594eca4da446729c8d5b50a8216d4569", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41458, "upload_time": "2018-07-16T11:56:59", "url": "https://files.pythonhosted.org/packages/af/50/ab2276162287dff161ae8f7c2a19b1905aa113fabf4f14c58d24709e69f6/jf-0.4.6.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "d8ef5b186f188b13ba96228c5dd1fab2", "sha256": "2443e1c4c5eb1d8ebd9408d8340b31dd6696aef304ad4c8d5480c65382757766" }, "downloads": -1, "filename": "jf-0.5.0.tar.gz", "has_sig": false, "md5_digest": "d8ef5b186f188b13ba96228c5dd1fab2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43425, "upload_time": "2018-07-17T16:56:12", "url": "https://files.pythonhosted.org/packages/6d/3e/e418f65f04365e38961a3d77cff398b576a413de8fb225b57189469e1958/jf-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "10eada0c9747e473839517a6be2cfbea", "sha256": "55bcfe4876c31fdabcb0125f4ae704fdbc7fd7055005df38d8bea6caf6cf1447" }, "downloads": -1, "filename": "jf-0.5.1.tar.gz", "has_sig": false, "md5_digest": "10eada0c9747e473839517a6be2cfbea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18846, "upload_time": "2018-07-25T00:29:39", "url": "https://files.pythonhosted.org/packages/6d/1a/ba0e68a339edc35aebca3f88ca42f238fb42d46cbf5ea8291b37673e1a65/jf-0.5.1.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "4ae9871e0f555c3b9a5ad7e974186f11", "sha256": "3b1cb383a10188ce0be89a593fb08bb264e31aa66aa6ea3ffa4abdcddd4ccc2e" }, "downloads": -1, "filename": "jf-0.5.3.tar.gz", "has_sig": false, "md5_digest": "4ae9871e0f555c3b9a5ad7e974186f11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22198, "upload_time": "2018-09-11T07:47:05", "url": "https://files.pythonhosted.org/packages/90/f8/c6eaf354b05c5901102e0dd02007f8aec3694bd68b3288c824efe06ecc63/jf-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "edd66fb0a8960459b270bd7d8b6df798", "sha256": "bbf1ac0a24a102cfbbfe50738ad14bd25d1ee0fed0c9b9b4212f6a595956c741" }, "downloads": -1, "filename": "jf-0.5.4.tar.gz", "has_sig": false, "md5_digest": "edd66fb0a8960459b270bd7d8b6df798", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22283, "upload_time": "2018-09-11T08:15:47", "url": "https://files.pythonhosted.org/packages/f4/36/a1a3028805db138a36f4f998eceded329a85e32fcf768a517ceeb6622610/jf-0.5.4.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "433d1b6d3eacf1536d8c401f5283849e", "sha256": "981497abceb3a904f3369fd8bfbdb5bf58ef1942700f64705fdc432c47fb9ae9" }, "downloads": -1, "filename": "jf-0.6.0.tar.gz", "has_sig": false, "md5_digest": "433d1b6d3eacf1536d8c401f5283849e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22307, "upload_time": "2018-09-11T08:51:49", "url": "https://files.pythonhosted.org/packages/f5/73/dd25e4de4af0400cb8797c7e9f9740391a36d0d3bf6ec09571598584aea3/jf-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "686ad8d3f9dc4c121e4c26093a4fa00a", "sha256": "5bab1e1fd10a4a877ccd3e0410975b6ed838c764bc9516199c67e0bfc4959a38" }, "downloads": -1, "filename": "jf-0.6.1.tar.gz", "has_sig": false, "md5_digest": "686ad8d3f9dc4c121e4c26093a4fa00a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22430, "upload_time": "2018-09-26T05:28:18", "url": "https://files.pythonhosted.org/packages/47/7b/4c2abe43ef664ecbadb4237aaccd4aff9a5d8194476951cbb5f9e62aeba5/jf-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "e721fa94cf11c93e164b77348f05939e", "sha256": "227b0087e011e6c9d9a482380a459acfb9d77cd12ef8c8d13a957010a08bcbfa" }, "downloads": -1, "filename": "jf-0.6.2.tar.gz", "has_sig": false, "md5_digest": "e721fa94cf11c93e164b77348f05939e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22435, "upload_time": "2018-11-13T10:10:11", "url": "https://files.pythonhosted.org/packages/52/50/7d042734b1b45a036f72b11aaf825168382763c162eac1a87095db2a2a4a/jf-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "1c675367931cac600e5b4cfd2f71a09f", "sha256": "4a9821fe56e8000b9c895172c5e487f162958053f3ba4afc8942b4d7d86116b9" }, "downloads": -1, "filename": "jf-0.6.3.tar.gz", "has_sig": false, "md5_digest": "1c675367931cac600e5b4cfd2f71a09f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23338, "upload_time": "2019-02-24T09:07:55", "url": "https://files.pythonhosted.org/packages/39/36/f26c655042169a1ce60e212abd3c6d5f818340ca0e7f2eaa229082e7a5f9/jf-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "048b44a185741766d41a1f7b99f3db4a", "sha256": "4a74f5647907acb63df9ced1832dcc99e4d58c73b236c4ac728665c4c7ddf106" }, "downloads": -1, "filename": "jf-0.6.4.tar.gz", "has_sig": false, "md5_digest": "048b44a185741766d41a1f7b99f3db4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23492, "upload_time": "2019-06-18T11:46:04", "url": "https://files.pythonhosted.org/packages/40/04/719bc5844179be905f750d345baae056350f7764a091ebcd543f6fc96b4c/jf-0.6.4.tar.gz" } ], "0.6.5": [ { "comment_text": "", "digests": { "md5": "772223c823c37533c3cd18d3076ffc88", "sha256": "a9208035c2e90151e59cb519da793086ef701b2aa114a1d522a06b645c0ecc51" }, "downloads": -1, "filename": "jf-0.6.5.tar.gz", "has_sig": false, "md5_digest": "772223c823c37533c3cd18d3076ffc88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23667, "upload_time": "2019-10-05T02:29:38", "url": "https://files.pythonhosted.org/packages/3b/c8/9942ad8ef14cb4943ee6cc412c3dfdd1b442a1c1e9291d6d3ec5da9bfce7/jf-0.6.5.tar.gz" } ], "0.6.6": [ { "comment_text": "", "digests": { "md5": "e6a3df8a124d272cd2f6e5ded479c140", "sha256": "b3c2ab96d2a088cdced1ff6c0c14a37ce8655bf529247ba007e40319f07ff997" }, "downloads": -1, "filename": "jf-0.6.6.tar.gz", "has_sig": false, "md5_digest": "e6a3df8a124d272cd2f6e5ded479c140", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23677, "upload_time": "2019-10-05T02:49:05", "url": "https://files.pythonhosted.org/packages/32/87/e428b7a728b6df94277f4a85c0f3e4ddd964e5891c7cea8dc3734596e23e/jf-0.6.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e6a3df8a124d272cd2f6e5ded479c140", "sha256": "b3c2ab96d2a088cdced1ff6c0c14a37ce8655bf529247ba007e40319f07ff997" }, "downloads": -1, "filename": "jf-0.6.6.tar.gz", "has_sig": false, "md5_digest": "e6a3df8a124d272cd2f6e5ded479c140", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23677, "upload_time": "2019-10-05T02:49:05", "url": "https://files.pythonhosted.org/packages/32/87/e428b7a728b6df94277f4a85c0f3e4ddd964e5891c7cea8dc3734596e23e/jf-0.6.6.tar.gz" } ] }