{ "info": { "author": "Tyler Byers", "author_email": "tbyers@risklens.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# verispy\n\n\n\n \n \n\n\n \n \n\n
Latest Release\n \n \"latest\n \n
License\n \n \"license\"\n \n
\n\nverispy logo horizontal bar chart with stylized verispy\nThis is a Python package built for working with VERIS data. This package has two main purposes: \n\n 1. Allow the user to extract [VERIS](http://veriscommunity.net/) JSON objects into a Pandas DataFrame structure. The most likely source of VERIS data is the VERIS Community Database ([VCDB](https://github.com/vz-risk/VCDB)). \n 2. Provide some basic data analysis functionality for the DataFrame. This includes calculating the count and frequency of given enumerations, and plotting a simple horizontal bar chart. \n\n## Installation\n\nTo install this package, either `git clone` this repository, and \n\n```bash\npython -m pip install /verispy/\n```\n\nOr, you may simply use: \n```bash\npip install verispy\n```\n\nYou will also need to download the VCDB data:\n```bash\ngit clone https://github.com/vz-risk/VCDB.git\n```\n\n## Loading Data \n\nAfter installing, creating a VERIS object is simple. We just need the path to the VCDB json directory:\n\n```python\nIn [1]: from verispy import VERIS\n\nIn [2]: data_dir = '../VCDB/data/json/validated/'\n\nIn [3]: v = VERIS(json_dir=data_dir)\n```\n\nWe may wish to verify that the VERIS schema URL is correct. Note that the schema comes from the [VERIS](https://github.com/vz-risk/veris) repo on GitHub. If you cannot connect to the internet every time you run `verispy`, you can also download the schema and change the path locally with the `schema_path` parameter in the `json_to_df` function. \n\n```python\nIn [4]: v.schema_url\nOut[4]: 'https://raw.githubusercontent.com/vz-risk/veris/master/verisc-merged.json'\n```\n\nThen, we can load the VERIS data from the JSON and assign to a DataFrame:\n\n```python\nIn [5]: veris_df = v.json_to_df(verbose=True)\nLoading schema\nLoading JSON files to DataFrame.\nFinished loading JSON files to dataframe.\nBuilding DataFrame with enumerations.\nDone building DataFrame with enumerations.\nPost-Processing DataFrame (A4 Names, Victim Industries, Patterns)\nFinished building VERIS DataFrame\n```\n\n## Inspecting Data\n\nThen, we might want to inspect our DataFrame:\n\n```python\nIn [6]: veris_df.shape\nOut[6]: (7839, 2315)\n\nIn [7]: veris_df.head()\nOut[7]: \n action.Environmental action.Error ... victim.state victim.victim_id\n0 False False ... NJ C.R. Bard, Inc.\n1 False True ... NaN British Columbia Ministry of Finance\n2 False False ... NaN NaN\n3 False False ... FL Camberwell High School\n4 False False ... NaN Loyalist Certification Services Exams\n\n[5 rows x 2315 columns]\n\n```\n\nDo a quick value count on one of the enumerations:\n\n```python\nIn [8]: veris_df['action.malware.variety.Ransomware'].value_counts()\nOut[8]: \nFalse 7716\nTrue 123\nName: action.malware.variety.Ransomware, dtype: int64\n```\n\nMost of the enumerations are True/False values.\n\nTo see a dictionary of the enumerations, look at the `enumerations` attribute in the VERIS object: \n\n```python\nIn [9]: len(v.enumerations)\nOut[9]: 68\n\nIn [10]: import pprint\n\nIn [11]: pprint.pprint(v.enumerations)\n{'action.environmental.variety': ['Deterioration',\n 'Earthquake',\n 'EMI',\n 'ESD',\n 'Fire',\n 'Flood',\n 'Hazmat',\n 'Humidity',\n 'Hurricane',\n 'Ice',\n 'Landslide',\n 'Leak',\n 'Lightning',\n 'Meteorite',\n 'Particulates',\n 'Pathogen',\n 'Power failure',\n 'Temperature',\n 'Tornado',\n 'Tsunami',\n 'Vermin',\n 'Volcano',\n 'Wind',\n 'Other',\n 'Unknown'],\n 'action.error.variety': ['Capacity shortage',\n 'Classification error',\n 'Data entry error',\n 'Disposal error',\n 'Gaffe',\n 'Loss',\n\n ... \n # many more lines\n```\n\n## Analysis\n\nThe `enum_summary` (get enumerations with confidence intervals) function is the main analysis function within `verispy`. \n\nWe can look at top-level enumerations: \n\n```python\nIn [12]: v.enum_summary(veris_df, 'action')\nOut[12]: \n enum x n freq\n0 Error 2268 7629.0 0.29729\n1 Hacking 2079 7629.0 0.27251\n2 Misuse 1604 7629.0 0.21025\n3 Physical 1517 7629.0 0.19885\n4 Malware 635 7629.0 0.08324\n5 Social 517 7629.0 0.06777\n6 Environmental 8 7629.0 0.00105\n7 Unknown 210 NaN NaN\n```\n\nOr lower-level enumerations:\n\n```python\nIn [13]: v.enum_summary(veris_df, 'action.social.variety')\nOut[13]: \n enum x n freq\n0 Phishing 350 501.0 0.69860\n1 Bribery 51 501.0 0.10180\n2 Pretexting 41 501.0 0.08184\n3 Extortion 33 501.0 0.06587\n4 Forgery 16 501.0 0.03194\n5 Influence 13 501.0 0.02595\n6 Other 10 501.0 0.01996\n7 Baiting 2 501.0 0.00399\n8 Elicitation 2 501.0 0.00399\n9 Propaganda 2 501.0 0.00399\n10 Scam 2 501.0 0.00399\n11 Spam 1 501.0 0.00200\n12 Unknown 16 NaN NaN\n```\n\nWe can add a second variable as the `by` parameter, and thus get enumerations subsetted by the \"by\": \n\n```python\nIn [14]: v.enum_summary(veris_df, 'action', by='attribute')\nOut[14]: \n by enum x n freq\n0 attribute.Availability Physical 1153 2350.0 0.49064\n1 attribute.Availability Hacking 664 2350.0 0.28255\n2 attribute.Availability Error 446 2350.0 0.18979\n3 attribute.Availability Malware 138 2350.0 0.05872\n4 attribute.Availability Misuse 67 2350.0 0.02851\n5 attribute.Availability Social 59 2350.0 0.02511\n6 attribute.Availability Environmental 8 2350.0 0.00340\n7 attribute.Availability Unknown 5 NaN NaN\n8 attribute.Confidentiality Error 2231 7057.0 0.31614\n9 attribute.Confidentiality Hacking 1684 7057.0 0.23863\n10 attribute.Confidentiality Misuse 1552 7057.0 0.21992\n11 attribute.Confidentiality Physical 1492 7057.0 0.21142\n12 attribute.Confidentiality Malware 555 7057.0 0.07865\n13 attribute.Confidentiality Social 459 7057.0 0.06504\n14 attribute.Confidentiality Environmental 2 7057.0 0.00028\n15 attribute.Confidentiality Unknown 198 NaN NaN\n16 attribute.Integrity Hacking 916 1833.0 0.49973\n17 attribute.Integrity Malware 635 1833.0 0.34643\n18 attribute.Integrity Social 517 1833.0 0.28205\n19 attribute.Integrity Physical 321 1833.0 0.17512\n20 attribute.Integrity Misuse 257 1833.0 0.14021\n21 attribute.Integrity Error 35 1833.0 0.01909\n22 attribute.Integrity Environmental 0 1833.0 0.00000\n23 attribute.Integrity Unknown 15 NaN NaN\n```\n\nWe can add in a confidence interval by specifying the `ci_method` (currently supported methods: `wilson`, `normal`, or `agresti_coull`, see https://www.statsmodels.org/dev/generated/statsmodels.stats.proportion.proportion_confint.html for more information):\n\n```python\nIn [15]: v.enum_summary(veris_df, 'action.social.variety', ci_method='wilson')\nOut[15]: \n enum x n freq method lower upper\n0 Phishing 350 501.0 0.69860 wilson 0.65704 0.73715\n1 Bribery 51 501.0 0.10180 wilson 0.07828 0.13138\n2 Pretexting 41 501.0 0.08184 wilson 0.06090 0.10914\n3 Extortion 33 501.0 0.06587 wilson 0.04728 0.09106\n4 Forgery 16 501.0 0.03194 wilson 0.01975 0.05124\n5 Influence 13 501.0 0.02595 wilson 0.01523 0.04388\n6 Other 10 501.0 0.01996 wilson 0.01088 0.03635\n7 Baiting 2 501.0 0.00399 wilson 0.00110 0.01444\n8 Elicitation 2 501.0 0.00399 wilson 0.00110 0.01444\n9 Propaganda 2 501.0 0.00399 wilson 0.00110 0.01444\n10 Scam 2 501.0 0.00399 wilson 0.00110 0.01444\n11 Spam 1 501.0 0.00200 wilson 0.00035 0.01122\n12 Unknown 16 NaN NaN wilson NaN NaN\n```\n\nAnd we can change the confidence interval width with `ci_level` (default is 0.95):\n\n```python\nIn [16]: v.enum_summary(veris_df, 'action.social.variety', ci_method='wilson', ci_level=0.5)\nOut[16]: \n enum x n freq method lower upper\n0 Phishing 350 501.0 0.69860 wilson 0.68460 0.71224\n1 Bribery 51 501.0 0.10180 wilson 0.09304 0.11127\n2 Pretexting 41 501.0 0.08184 wilson 0.07395 0.09048\n3 Extortion 33 501.0 0.06587 wilson 0.05878 0.07374\n4 Forgery 16 501.0 0.03194 wilson 0.02705 0.03767\n5 Influence 13 501.0 0.02595 wilson 0.02157 0.03119\n6 Other 10 501.0 0.01996 wilson 0.01616 0.02463\n7 Baiting 2 501.0 0.00399 wilson 0.00249 0.00639\n8 Elicitation 2 501.0 0.00399 wilson 0.00249 0.00639\n9 Propaganda 2 501.0 0.00399 wilson 0.00249 0.00639\n10 Scam 2 501.0 0.00399 wilson 0.00249 0.00639\n11 Spam 1 501.0 0.00200 wilson 0.00103 0.00387\n12 Unknown 16 NaN NaN wilson NaN NaN\n```\n\nThe `enum_summary` function returns a DataFrame. With this enumeration DataFrame, we can then draw a simple horizontal bar chart with the `plot_barchart` function:\n\n```python\nIn [17]: actionci_df = v.enum_summary(veris_df, 'action')\n\nIn [18]: action_fig = v.plot_barchart(actionci_df, 'Actions')\n\nIn [19]: action_fig.show()\n```\n\n![Action Enumeration Bar Plot](./fig/action_horiz_bar.png)\n\n## Clustering with Patterns\n\nAnother useful feature of the `verispy` package is the `df_to_matrix` function, which converts the VERIS DataFrame into a matrix of boolean values for selected enumerations. This feature is inspired by the blog post [DBIR Data-Driven Cover](http://datadrivensecurity.info/blog/posts/2014/May/dbir-mds/) by Jay Jacobs. This blog post talks about the DBIR \"Patterns,\" which were originally described in the [2014 DBIR](https://www.verizonenterprise.com/resources/reports/rp_Verizon-DBIR-2014_en_xg.pdf). \n\n### Patterns Function\n\nIn Jay's blog post, he points the reader to a GitHub gist with a function he wrote, getpatternlist.R. We have taken that R function and converted it to Python; it may be found at this gist: [dbir_patterns.py](https://gist.github.com/tbyers-risklens/cd7e61be6c6c420f859e43066658940a).\n\nUsing this function, we can create a data frame with the DBIR patterns:\n\n```python\nIn [23]: import pandas as pd\n\ndef get_pattern(df):\n \"\"\" Generates the DBIR \"patterns,\" with liberal inspiration from the getpatternlist.R: \n https://gist.github.com/jayjacobs/a145cb87551f551fc719\n\n Parameters\n ----------\n df: pd DataFrame with most VERIS encodings already built (from verispy package).\n\n Returns\n -------\n pd DataFrame with the patterns. Does not return as part of original VERIS DF.\n \"\"\"\n skimmer = df['action.physical.variety.Skimmer'] | \\\n (df['action.physical.variety.Tampering'] & df['attribute.confidentiality.data.variety.Payment'])\n \n espionage = df['actor.external.motive.Espionage'] | df['actor.external.variety.State-affiliated']\n.... (more lines, see gist)\n\nIn [23]: patterns = get_pattern(veris_df)\n\nIn [24]: patterns['pattern'].value_counts()\nOut[24]: \nMiscellaneous Errors 1814\nPrivilege Misuse 1597\nLost and Stolen Assets 1460\nEverything Else 1028\nWeb Applications 896\nPayment Card Skimmers 278\nCrimeware 268\nCyber-Espionage 248\nDenial of Service 162\nPoint of Sale 88\nName: pattern, dtype: int64\n```\n\nFrom here, we can go back to our `veris_df` DataFrame and make a boolean VERIS matrix:\n\n```python\nIn [25]: vmat = v.df_to_matrix(veris_df)\n\nIn [26]: vmat\nOut[26]: \narray([[0, 0, 0, ..., 0, 0, 0],\n [0, 0, 0, ..., 0, 0, 0],\n [0, 1, 1, ..., 0, 1, 0],\n ...,\n [0, 0, 1, ..., 0, 0, 0],\n [0, 0, 0, ..., 0, 0, 0],\n [0, 0, 1, ..., 0, 0, 0]])\n\nIn [27]: vmat.shape\nOut[27]: (7839, 569)\n```\n\nThen, we can do a dimensionality-reducing technique called [TSNE](https://lvdmaaten.github.io/tsne/). The following operation may take several minutes:\n\n```python\nIn [28]: from sklearn.manifold import TSNE\n\nIn [29]: tsne = TSNE(n_components=2, random_state=42)\n\nIn [30]: v_tsne = tsne.fit_transform(vmat)\n``` \n\nFinally, we can create the following plot, which we have colored by DBIR \"Pattern\", using Seaborn:\n\n```python\nIn [31]: import seaborn as sns\n\nIn [32]: import pandas as pd\n\nIn [33]: import matplotlib.pyplot as plt\n\nIn [34]: tsne_df = pd.DataFrame({'x':v_tsne[:, 0], 'y':v_tsne[:, 1], 'pattern':patterns['pattern']})\n\nIn [35]: tsne_df.head()\nOut[35]: \n x y pattern\n0 0.411892 -34.907738 Privilege Misuse\n1 29.374905 12.816430 Miscellaneous Errors\n2 -63.858070 -47.406250 Cyber-Espionage\n3 -58.987106 7.611073 Web Applications\n4 -75.674927 7.452817 Web Applications\n\nIn [36]: tsne_centers = tsne_df.groupby(by='pattern').mean()\n ...: tsne_centers['pattern'] = tsne_centers.index\n\nIn [37]: p1 = sns.lmplot(x='x', y='y', data=tsne_df, fit_reg=False, hue='pattern',\n ...: scatter_kws={'alpha':0.25}, size=6)\n ...: \n\nIn [38]: def label_point(df, ax):\n ...: for i, point in df.iterrows():\n ...: ax.text(point['x'] - 30, point['y'], point['pattern'])\n ...: \n\nIn [39]: label_point(tsne_centers, plt.gca())\n\nIn [40]: plt.show()\n```\n![TSNE plot with clusters](./fig/tsne_clusters.png)\n\n\n## Unit Testing\n\nUnit tested with `pytest`\n\n```bash\n(veris) verispy $ pytest\n======================================================= test session starts ========================================================\nplatform darwin -- Python 3.6.5, pytest-3.5.1, py-1.5.3, pluggy-0.6.0\nrootdir: /Users/tylerbyers/src/verispy, inifile:\nplugins: remotedata-0.2.1, openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2\ncollected 8 items \n\nverispy/tests/test_veris.py ........ [100%]\n\n==================================================== 8 passed in 11.50 seconds =====================================================\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/RiskLens/verispy", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "verispy", "package_url": "https://pypi.org/project/verispy/", "platform": "", "project_url": "https://pypi.org/project/verispy/", "project_urls": { "Homepage": "https://github.com/RiskLens/verispy" }, "release_url": "https://pypi.org/project/verispy/0.1.8/", "requires_dist": null, "requires_python": "", "summary": "Parses VCDB json data into a Pandas DataFrame and provides summary functions and basic enumeration plotting.", "version": "0.1.8" }, "last_serial": 5952192, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "6623590c2f15feac9e68915b201dc7df", "sha256": "3b8e558df64cfd0f1e236eec5bdb8a84415c5ce60a078a7578361295cced31ea" }, "downloads": -1, "filename": "verispy-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6623590c2f15feac9e68915b201dc7df", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 155570, "upload_time": "2019-01-09T20:14:59", "url": "https://files.pythonhosted.org/packages/1d/71/98aa211a5209dcd664c775baf67aaa5df3cecfd6cb0344d11711475eca48/verispy-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72f0a9b889d56693767d66f691f2e81f", "sha256": "c5801f190c8170a538f8c467e36f7c256c0d14cbedc6fdfe3a40c58086474dfc" }, "downloads": -1, "filename": "verispy-0.1.tar.gz", "has_sig": false, "md5_digest": "72f0a9b889d56693767d66f691f2e81f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 84686, "upload_time": "2019-01-09T20:15:10", "url": "https://files.pythonhosted.org/packages/35/1b/12099fb2fae771da73105d5fcdbe8f34b4cb25f1eaebfaed7b90ce28fc24/verispy-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "dce63f75ed86abefa91f00256da6f988", "sha256": "aba03de85f357e455966528ec6bc05912f58dbf98a4bb1fc643726e9df5594be" }, "downloads": -1, "filename": "verispy-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dce63f75ed86abefa91f00256da6f988", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 157736, "upload_time": "2019-01-09T20:15:02", "url": "https://files.pythonhosted.org/packages/13/94/f724fcb7454e09e6e6bd18b19f87d489504be1841e99cd64fa7f6e1f4f42/verispy-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a685dc3e067d5358e5d26a775efdaae1", "sha256": "0e827b689dd8d6ecc1fa04b7515a9cdc2f1d7c95dfb50373b3652d25d7609ea6" }, "downloads": -1, "filename": "verispy-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a685dc3e067d5358e5d26a775efdaae1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86439, "upload_time": "2019-01-09T20:15:07", "url": "https://files.pythonhosted.org/packages/17/49/0942409f6e0e2538000b5261abfd87bcc435d06ec4ad9ff7060aabfc0290/verispy-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "4645c66a5dab9b0b722970c2d0b37e58", "sha256": "0933a55de5cc7cfd4a94843c54159eaae0ba0a9153850e627e30c2864a6be7c7" }, "downloads": -1, "filename": "verispy-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4645c66a5dab9b0b722970c2d0b37e58", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 157743, "upload_time": "2019-01-09T20:15:04", "url": "https://files.pythonhosted.org/packages/eb/31/a86c99600c0370d226337d52614fd36dd3dcf68ba31fee014c3d5e578704/verispy-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "38ab9cf79ce2de5b630e45ecb2b6f19c", "sha256": "c6c936737d548b4ebc6282f065783f5ab4cbc4efa4095f00d4c29ec31f14ea08" }, "downloads": -1, "filename": "verispy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "38ab9cf79ce2de5b630e45ecb2b6f19c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86457, "upload_time": "2019-01-09T20:15:08", "url": "https://files.pythonhosted.org/packages/8c/59/5bd196368bf599c429a468a053ea50c38e16aaaa7b030afc7dc5b9f9d41a/verispy-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "6d02e1839c605ea49c2a7c46d5ae4d00", "sha256": "bb5ff251015651afe8d7ec996f0ca7c0cb8167a5f2cecc1ee56879feecf64e00" }, "downloads": -1, "filename": "verispy-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6d02e1839c605ea49c2a7c46d5ae4d00", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 157939, "upload_time": "2019-06-17T18:18:50", "url": "https://files.pythonhosted.org/packages/e8/a3/69c81eda4c123c8377f5f58b15b927eaad4cf91b381fcfd3a2296be073ac/verispy-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b36fb3f3530a3c7742ec0aa03ca488cc", "sha256": "53c8e63e55987bb95c54d01794f3033d1c29302faeaedc83ae233166d298012b" }, "downloads": -1, "filename": "verispy-0.1.3.tar.gz", "has_sig": false, "md5_digest": "b36fb3f3530a3c7742ec0aa03ca488cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86885, "upload_time": "2019-06-17T18:18:55", "url": "https://files.pythonhosted.org/packages/5c/a5/98ef350726d9fce8fd4120839d2d75ebeb2a654f4bc6a65342df355fc78d/verispy-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c1a2ad96ec1f76c0e8ae466792da889a", "sha256": "fb242c344693f64989dba8f16c5d4e3c44179b523f7cb29714938094addaf5aa" }, "downloads": -1, "filename": "verispy-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "c1a2ad96ec1f76c0e8ae466792da889a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 158852, "upload_time": "2019-07-05T23:07:03", "url": "https://files.pythonhosted.org/packages/23/f4/2bc3b2ac7725c7a6fd928ec7ec84bf6bbe5400c6fa877fb1cbaab9cbe28f/verispy-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7828d178de506ed917e11c525fcae69", "sha256": "4e8099658bd057f12260db0150eb2d4bea365262ac70350d14f0b4226da6d999" }, "downloads": -1, "filename": "verispy-0.1.4.tar.gz", "has_sig": false, "md5_digest": "e7828d178de506ed917e11c525fcae69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87671, "upload_time": "2019-07-05T23:07:10", "url": "https://files.pythonhosted.org/packages/d2/e4/137497da58fa678b6b5f49a21c9490f130d3c193b46b45a91962663fc65b/verispy-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "3b00296150572e1275136b20da70892f", "sha256": "c7ccbf4df125a9300cef4c24aad666835d9d4d4c2f7649122b6a74efad18cda0" }, "downloads": -1, "filename": "verispy-0.1.5.tar.gz", "has_sig": false, "md5_digest": "3b00296150572e1275136b20da70892f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87680, "upload_time": "2019-09-18T00:13:18", "url": "https://files.pythonhosted.org/packages/9b/17/41ccec96774815f6200eac3d0b3f74cd73ca8660513327b0c720a524834f/verispy-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "989ef20f12eb300d418afea296504e74", "sha256": "50794ba9ef45d1541110e1b5d80f5fd4ccaa40c4afff2171f550932d3f44cb8e" }, "downloads": -1, "filename": "verispy-0.1.6.tar.gz", "has_sig": false, "md5_digest": "989ef20f12eb300d418afea296504e74", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 86990, "upload_time": "2019-09-24T19:28:10", "url": "https://files.pythonhosted.org/packages/39/13/effbfc71e58e0314c49c085fa314af1ae3b8dc76cc855b22c61dc43c0801/verispy-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "9c53ce74cfda2ecf47953a550a2e72cd", "sha256": "53b8b96cd2cae84e4305071f0ec298e91838ee5e01ed5b720ee4842c824bbc41" }, "downloads": -1, "filename": "verispy-0.1.7.tar.gz", "has_sig": false, "md5_digest": "9c53ce74cfda2ecf47953a550a2e72cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87696, "upload_time": "2019-10-08T18:44:21", "url": "https://files.pythonhosted.org/packages/f4/cd/82da9a83dfc4a4e6534e94f053f3f723dd9ce80d50fdb53fc2f7ee314fcf/verispy-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "bd488c95e0bfaedf64638dea3a00ce10", "sha256": "c296c19860817e320538cbc8a74652f63ce0bc1da18d04029eb3f65cf7c82f6b" }, "downloads": -1, "filename": "verispy-0.1.8.tar.gz", "has_sig": false, "md5_digest": "bd488c95e0bfaedf64638dea3a00ce10", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87167, "upload_time": "2019-10-09T21:52:05", "url": "https://files.pythonhosted.org/packages/5d/37/0caae64a42d19420f8bc3ed3318c2eb2efd1a62253ee1a3e8c4b7359025c/verispy-0.1.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bd488c95e0bfaedf64638dea3a00ce10", "sha256": "c296c19860817e320538cbc8a74652f63ce0bc1da18d04029eb3f65cf7c82f6b" }, "downloads": -1, "filename": "verispy-0.1.8.tar.gz", "has_sig": false, "md5_digest": "bd488c95e0bfaedf64638dea3a00ce10", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87167, "upload_time": "2019-10-09T21:52:05", "url": "https://files.pythonhosted.org/packages/5d/37/0caae64a42d19420f8bc3ed3318c2eb2efd1a62253ee1a3e8c4b7359025c/verispy-0.1.8.tar.gz" } ] }