{
"info": {
"author": "Paul Triantafyllou",
"author_email": "trianta@research.att.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6"
],
"description": ".. ===============LICENSE_START=======================================================\n.. Acumos CC-BY-4.0\n.. ===================================================================================\n.. Copyright (C) 2017-2018 AT&T Intellectual Property & Tech Mahindra. All rights reserved.\n.. ===================================================================================\n.. This Acumos documentation file is distributed by AT&T and Tech Mahindra\n.. under the Creative Commons Attribution 4.0 International License (the \"License\");\n.. you may not use this file except in compliance with the License.\n.. You may obtain a copy of the License at\n..\n.. http://creativecommons.org/licenses/by/4.0\n..\n.. This file is distributed on an \"AS IS\" BASIS,\n.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n.. See the License for the specific language governing permissions and\n.. limitations under the License.\n.. ===============LICENSE_END=========================================================\n\n===============================\nAcumos Python Client User Guide\n===============================\n\n\n|Build Status|\n\n``acumos`` is a client library that allows modelers to push their Python models\nto the `Acumos platform `__.\n\nInstallation\n============\n\nYou will need a Python 3.5+ environment in order to install ``acumos``.\nYou can use `Anaconda `__\n(preferred) or `pyenv `__ to install and\nmanage Python environments.\n\nIf you\u2019re new to Python and need an IDE to start developing, we\nrecommend using `Spyder `__ which\ncan easily be installed with Anaconda.\n\nThe ``acumos`` package can be installed with pip:\n\n.. code:: bash\n\n pip install acumos\n\n\nProtocol Buffers\n----------------\n\nThe ``acumos`` package uses protocol buffers and **assumes you have\nthe protobuf compiler** ``protoc`` **installed**. Please visit the `protobuf\nrepository `__\nand install the appropriate ``protoc`` for your operating system.\nInstallation is as easy as downloading a binary release and adding it to\nyour system ``$PATH``. This is a temporary requirement that will be\nremoved in a future version of ``acumos``.\n\n**Anaconda Users**: You can easily install ``protoc`` from `an Anaconda\npackage `__ via:\n\n.. code:: bash\n\n conda install -c anaconda libprotobuf\n\n\n.. |Build Status| image:: https://jenkins.acumos.org/buildStatus/icon?job=acumos-python-client-tox-verify-master\n :target: https://jenkins.acumos.org/job/acumos-python-client-tox-verify-master/\n\n.. ===============LICENSE_START=======================================================\n.. Acumos CC-BY-4.0\n.. ===================================================================================\n.. Copyright (C) 2017-2018 AT&T Intellectual Property & Tech Mahindra. All rights reserved.\n.. ===================================================================================\n.. This Acumos documentation file is distributed by AT&T and Tech Mahindra\n.. under the Creative Commons Attribution 4.0 International License (the \"License\");\n.. you may not use this file except in compliance with the License.\n.. You may obtain a copy of the License at\n..\n.. http://creativecommons.org/licenses/by/4.0\n..\n.. This file is distributed on an \"AS IS\" BASIS,\n.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n.. See the License for the specific language governing permissions and\n.. limitations under the License.\n.. ===============LICENSE_END=========================================================\n\n=============================\nAcumos Python Client Tutorial\n=============================\n\nThis tutorial provides a brief overview of ``acumos`` for creating\nAcumos models. The tutorial is meant to be followed linearly, and some\ncode snippets depend on earlier imports and objects. Full examples are\navailable in the ``examples/`` directory of the `Acumos Python client repository `__.\n\n#. `Importing Acumos`_\n#. `Creating A Session`_\n#. `A Simple Model`_\n#. `Exporting Models`_\n#. `Defining Types`_\n#. `Using DataFrames with scikit-learn`_\n#. `Declaring Requirements`_\n#. `Declaring Options`_\n#. `Keras and TensorFlow`_\n#. `Testing Models`_\n#. `More Examples`_\n\nImporting Acumos\n================\n\nFirst import the modeling and session packages:\n\n.. code:: python\n\n from acumos.modeling import Model, List, Dict, create_namedtuple, create_dataframe\n from acumos.session import AcumosSession\n\nCreating A Session\n==================\n\nAn ``AcumosSession`` allows you to export your models to Acumos. You can\neither dump a model to disk locally, so that you can upload it via the\nAcumos website, or push the model to Acumos directly.\n\nIf you\u2019d like to push directly to Acumos, create a session with the ``push_api`` argument:\n\n.. code:: python\n\n session = AcumosSession(push_api=\"https://my.acumos.instance.com/push\")\n\nSee the onboarding page of your Acumos instance website to find the correct\n``push_api`` URL to use.\n\nIf you\u2019re only interested in dumping a model to disk, arguments aren\u2019t needed:\n\n.. code:: python\n\n session = AcumosSession()\n\nA Simple Model\n==============\n\nAny Python function can be used to define an Acumos model using `Python\ntype hints `__.\n\nLet\u2019s first create a simple model that adds two integers together.\nAcumos needs to know what the inputs and outputs of your functions are.\nWe can use the Python type annotation syntax to specify the function\nsignature.\n\nBelow we define a function ``add_numbers`` with ``int`` type parameters\n``x`` and ``y``, and an ``int`` return type. We then build an Acumos\nmodel with an ``add`` method.\n\n**Note:** Function\n`docstrings `__ are included\nwith your model and used for documentation, so be sure to include one!\n\n.. code:: python\n\n def add_numbers(x: int, y: int) -> int:\n '''Returns the sum of x and y'''\n return x + y\n\n model = Model(add=add_numbers)\n\nExporting Models\n================\n\nWe can now export our model using the ``AcumosSession`` object created\nearlier. The ``push`` and ``dump`` APIs are shown below. The ``dump`` method will\nsave the model to disk so that it can be onboarded via the Acumos website. The\n``push`` method pushes the model directly to Acumos.\n\n.. code:: python\n\n session.push(model, 'my-model')\n session.dump(model, 'my-model', '~/') # creates ~/my-model\n\nFor more information on how to onboard a dumped model via the Acumos website,\nsee the `web onboarding guide `__.\n\n**Note:** Pushing a model to Acumos will prompt you for an onboarding token if\nyou have not previously provided one. The interactive prompt can be avoided by\nexporting the ``ACUMOS_TOKEN`` environment variable, which corresponds to an\nauthentication token that can be found in your account settings on the Acumos\nwebsite.\n\nDefining Types\n==============\n\nIn this example, we make a model that can read binary images and output\nsome metadata about them. This model makes use of a custom type\n``ImageShape``.\n\nWe first create a ``NamedTuple`` type called ``ImageShape``, which is\nlike an ordinary ``tuple`` but with field accessors. We can then use\n``ImageShape`` as the return type of ``get_shape``. Note how\n``ImageShape`` can be instantiated as a new object.\n\n.. code:: python\n\n import io\n import PIL\n\n ImageShape = create_namedtuple('ImageShape', [('width', int), ('height', int)])\n\n def get_format(data: bytes) -> str:\n '''Returns the format of an image'''\n buffer = io.BytesIO(data)\n img = PIL.Image.open(buffer)\n return img.format\n\n def get_shape(data: bytes) -> ImageShape:\n '''Returns the width and height of an image'''\n buffer = io.BytesIO(data)\n img = PIL.Image.open(buffer)\n shape = ImageShape(width=img.width, height=img.height)\n return shape\n\n model = Model(get_format=get_format, get_shape=get_shape)\n\n**Note:** Starting in Python 3.6, you can alternatively use this simpler\nsyntax:\n\n.. code:: python\n\n from acumos.modeling import NamedTuple\n\n class ImageShape(NamedTuple):\n '''Type representing the shape of an image'''\n width: int\n height: int\n\nUsing DataFrames with scikit-learn\n==================================\n\nIn this example, we train a ``RandomForestClassifier`` using\n``scikit-learn`` and use it to create an Acumos model.\n\nWhen making machine learning models, it\u2019s common to use a dataframe data\nstructure to represent data. To make things easier, ``acumos`` can\ncreate ``NamedTuple`` types directly from ``pandas.DataFrame`` objects.\n\n``NamedTuple`` types created from ``pandas.DataFrame`` objects store\ncolumns as named attributes and preserve column order. Because\n``NamedTuple`` types are like ordinary ``tuple`` types, the resulting\nobject can be iterated over. Thus, iterating over a ``NamedTuple``\ndataframe object is the same as iterating over the columns of a\n``pandas.DataFrame``. As a consequence, note how ``np.column_stack`` can\nbe used to create a ``numpy.ndarray`` from the input ``df``.\n\nFinally, the model returns a ``numpy.ndarray`` of ``int`` corresponding\nto predicted iris classes. The ``classify_iris`` function represents\nthis as ``List[int]`` in the signature return.\n\n.. code:: python\n\n import numpy as np\n import pandas as pd\n from sklearn.datasets import load_iris\n from sklearn.ensemble import RandomForestClassifier\n\n iris = load_iris()\n X = iris.data\n y = iris.target\n\n clf = RandomForestClassifier(random_state=0)\n clf.fit(X, y)\n\n # here, an appropriate NamedTuple type is inferred from a pandas DataFrame\n X_df = pd.DataFrame(X, columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])\n IrisDataFrame = create_dataframe('IrisDataFrame', X_df)\n\n # ==================================================================================\n # # or equivalently:\n #\n # IrisDataFrame = create_namedtuple('IrisDataFrame', [('sepal_length', List[float]),\n # ('sepal_width', List[float]),\n # ('petal_length', List[float]),\n # ('petal_width', List[float])])\n # ==================================================================================\n\n def classify_iris(df: IrisDataFrame) -> List[int]:\n '''Returns an array of iris classifications'''\n X = np.column_stack(df)\n return clf.predict(X)\n\n model = Model(classify=classify_iris)\n\nCheck out the ``sklearn`` examples in the examples directory for full\nrunnable scripts.\n\nDeclaring Requirements\n======================\n\nIf your model depends on another Python script or package that you wrote, you can\ndeclare the dependency via the ``acumos.metadata.Requirements`` class:\n\n.. code:: python\n\n from acumos.metadata import Requirements\n\nNote that only pure Python is supported at this time.\n\nCustom Scripts\n--------------\n\nCustom scripts can be included by giving ``Requirements`` a sequence of paths\nto Python scripts, or directories containing Python scripts. For example, if the\nmodel defined in ``model.py`` depended on ``helper1.py``:\n\n::\n\n model_workspace/\n \u251c\u2500\u2500 model.py\n \u251c\u2500\u2500 helper1.py\n \u2514\u2500\u2500 helper2.py\n\nthis dependency could be declared like so:\n\n.. code:: python\n\n from helper1 import do_thing\n\n def transform(x: int) -> int:\n '''Does the thing'''\n return do_thing(x)\n\n model = Model(transform=transform)\n\n reqs = Requirements(scripts=['./helper1.py'])\n\n # using the AcumosSession created earlier:\n session.push(model, 'my-model', reqs)\n session.dump(model, 'my-model', '~/', reqs) # creates ~/my-model\n\nAlternatively, all Python scripts within ``model_workspace/`` could be included\nusing:\n\n.. code:: python\n\n reqs = Requirements(scripts=['.'])\n\nCustom Packages\n---------------\n\nCustom packages can be included by giving ``Requirements`` a sequence of paths to\nPython packages, i.e. directories with an ``__init__.py`` file. Assuming that the\npackage ``~/repos/my_pkg`` contains:\n\n::\n\n my_pkg/\n \u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 bar.py\n \u2514\u2500\u2500 foo.py\n\nthen you can bundle ``my_pkg`` with your model like so:\n\n.. code:: python\n\n from my_pkg.bar import do_thing\n\n def transform(x: int) -> int:\n '''Does the thing'''\n return do_thing(x)\n\n model = Model(transform=transform)\n\n reqs = Requirements(packages=['~/repos/my_pkg'])\n\n # using the AcumosSession created earlier:\n session.push(model, 'my-model', reqs)\n session.dump(model, 'my-model', '~/', reqs) # creates ~/my-model\n\nRequirement Mapping\n-------------------\n\nPython packaging and `PyPI `__ aren\u2019t\nperfect, and sometimes the name of the Python package you import in your\ncode is different than the package name used to install it. One example\nof this is the ``PIL`` package, which is commonly installed using `a fork\ncalled pillow `_ (i.e.\n``pip install pillow`` will provide the ``PIL`` package).\n\nTo address this inconsistency, the ``Requirements``\nclass allows you to map Python package names to PyPI package names. When\nyour model is analyzed for dependencies by ``acumos``, this mapping is\nused to ensure the correct PyPI packages will be used.\n\nIn the example below, the ``req_map`` parameter is used to declare a\nrequirements mapping from the ``PIL`` Python package to the ``pillow``\nPyPI package:\n\n.. code:: python\n\n reqs = Requirements(req_map={'PIL': 'pillow'})\n\nDeclaring Options\n=================\n\nThe ``acumos.metadata.Options`` class is a collection of options that users may\nwish to specify along with their Acumos model. If an ``Options`` instance is not\nprovided to ``AcumosSession.push``, then default options are applied. See the\nclass docstring for more details.\n\nBelow, we demonstrate how options can be used to include additional model metadata\nand influence the behavior of the Acumos platform. For example, a license can be\nincluded with a model via the ``license`` parameter, either by providing a license\nstring or a path to a license file. Likewise, we can specify whether or not the Acumos\nplatform should eagerly build the model microservice via the ``create_microservice``\nparameter.\n\n.. code:: python\n\n from acumos.metadata import Options\n\n opts = Options(license=\"Apache 2.0\", # \"./path/to/license_file\" also works\n create_microservice=False, # don't build the microservice yet\n\n session.push(model, 'my-model', options=opts)\n\nKeras and TensorFlow\n====================\n\nCheck out the Keras and TensorFlow examples in the ``examples/`` directory of\nthe `Acumos Python client repository `__.\n\nTesting Models\n==============\n\nThe ``acumos.modeling.Model`` class wraps your custom functions and\nproduces corresponding input and output types. This section shows how to\naccess those types for the purpose of testing. For simplicity, we\u2019ll\ncreate a model using the ``add_numbers`` function again:\n\n.. code:: python\n\n def add_numbers(x: int, y: int) -> int:\n '''Returns the sum of x and y'''\n return x + y\n\n model = Model(add=add_numbers)\n\nThe ``model`` object now has an ``add`` attribute, which acts as a\nwrapper around ``add_numbers``. The ``add_numbers`` function can be\ninvoked like so:\n\n.. code:: python\n\n result = model.add.inner(1, 2)\n print(result) # 3\n\nThe ``model.add`` object also has a corresponding *wrapped* function\nthat is generated by ``acumos.modeling.Model``. The wrapped function is\nthe primary way your model will be used within Acumos.\n\nWe can access the ``input_type`` and ``output_type`` attributes to test\nthat the function works as expected:\n\n.. code:: python\n\n AddIn = model.add.input_type\n AddOut = model.add.output_type\n\n add_in = AddIn(1, 2)\n print(add_in) # AddIn(x=1, y=2)\n\n add_out = AddOut(3)\n print(add_out) # AddOut(value=3)\n\n model.add.wrapped(add_in) == add_out # True\n\nMore Examples\n=============\n\nBelow are some additional function examples. Note how ``numpy`` types\ncan even be used in type hints, as shown in the ``numpy_sum`` function.\n\n.. code:: python\n\n from collections import Counter\n import numpy as np\n\n def list_sum(x: List[int]) -> int:\n '''Computes the sum of a sequence of integers'''\n return sum(x)\n\n def numpy_sum(x: List[np.int32]) -> np.int32:\n '''Uses numpy to compute a vectorized sum over x'''\n return np.sum(x)\n\n def count_strings(x: List[str]) -> Dict[str, int]:\n '''Returns a count mapping from a sequence of strings'''\n return Counter(x)\n\n.. ===============LICENSE_START=======================================================\n.. Acumos CC-BY-4.0\n.. ===================================================================================\n.. Copyright (C) 2017-2018 AT&T Intellectual Property & Tech Mahindra. All rights reserved.\n.. ===================================================================================\n.. This Acumos documentation file is distributed by AT&T and Tech Mahindra\n.. under the Creative Commons Attribution 4.0 International License (the \"License\");\n.. you may not use this file except in compliance with the License.\n.. You may obtain a copy of the License at\n..\n.. http://creativecommons.org/licenses/by/4.0\n..\n.. This file is distributed on an \"AS IS\" BASIS,\n.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n.. See the License for the specific language governing permissions and\n.. limitations under the License.\n.. ===============LICENSE_END=========================================================\n\n==================================\nAcumos Python Client Release Notes\n==================================\n\nv0.8.0\n======\n\n- Enhancements\n\n - Users may now specify additional options when pushing their Acumos model. See the options section in the tutorial for more information.\n - ``acumos`` now supports Keras models built with ``tensorflow.keras``\n\n- Support changes\n\n - ``acumos`` no longer supports Python 3.4\n\n\nv0.7.2\n======\n\n- Bug fixes\n\n - The deprecated authentication API is now considered optional\n - A more portable path solution is now used when saving models, to avoid issues with models developed in Windows\n\n\nv0.7.1\n======\n\n- Authentication\n\n - Username and password authentication has been deprecated\n - Users are now interactively prompted for an onboarding token, as opposed to a username and password\n\nv0.7.0\n======\n\n- Requirements\n\n - Python script dependencies can now be specified using a Requirements object\n - Python script dependencies found during the introspection stage are now included with the model\n\nv0.6.5\n======\n\n- Bug fixes\n\n - Don't attempt to use an empty auth token (avoids blank strings to be set in environment)\n\nv0.6.4\n======\n\n- Bug fixes\n\n - The normalized path of the system base prefix is now used for identifying stdlib packages\n\nv0.6.3\n======\n\n- Bug fixes\n\n - Improved dependency inspection when using a virtualenv\n - Removed custom packages from model metadata, as it caused image build failures\n - Fixed Python 3.5.2 ordering bug in wrapped model usage\n\nv0.6.2\n======\n\n- TensorFlow\n\n - Fixed a serialization issue that occurred when using a frozen graph\n\nv0.6.1\n======\n\n- Model upload\n\n - The JWT is now cleared immediately after a failed upload\n - Additional HTTP information is now included in the error message\n\nv0.6.0\n======\n\n- Authentication token\n\n - A new environment variable ``ACUMOS_TOKEN`` can be used to short-circuit\n the authentication process\n\n- Extra headers\n\n - ``AcumosSession.push`` now accepts an optional ``extra_headers`` argument,\n which will allow users and systems to include additional information when\n pushing models to the onboarding server\n\nv0.5.0\n======\n\n- Modeling\n\n - Python 3.6 NamedTuple syntax support now tested\n - User documentation includes example of new NamedTuple syntax\n\n- Model wrapper\n\n - Model wrapper now has APIs for consuming and producing Python\n dicts and JSON strings\n\n- Protobuf and protoc\n\n - An explicit check for protoc is now made, which raises a more\n informative error message\n - User documentation is more clear about dependence on protoc, and\n provides an easier way to install protoc via Anaconda\n\n- Keras\n\n - The active keras backend is now included as a tracked module\n - keras_contrib layers are now supported\n\nv0.4.0\n======\n\n- Replaced library-specific onboarding functions with \u201cnew-style\u201d\n models\n\n - Support for arbitrary Python functions using type hints\n - Support for custom user-defined types\n - Support for TensorFlow models\n - Improved dependency introspection\n - Improved object serialization mechanisms\n\n.. ===============LICENSE_START=======================================================\n.. Acumos CC-BY-4.0\n.. ===================================================================================\n.. Copyright (C) 2017-2018 AT&T Intellectual Property & Tech Mahindra. All rights reserved.\n.. ===================================================================================\n.. This Acumos documentation file is distributed by AT&T and Tech Mahindra\n.. under the Creative Commons Attribution 4.0 International License (the \"License\");\n.. you may not use this file except in compliance with the License.\n.. You may obtain a copy of the License at\n..\n.. http://creativecommons.org/licenses/by/4.0\n..\n.. This file is distributed on an \"AS IS\" BASIS,\n.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n.. See the License for the specific language governing permissions and\n.. limitations under the License.\n.. ===============LICENSE_END=========================================================\n\n====================================\nAcumos Python Client Developer Guide\n====================================\n\nTesting\n=======\n\nWe use a combination of ``tox``, ``pytest``, and ``flake8`` to test\n``acumos``. Code which is not PEP8 compliant (aside from E501) will be\nconsidered a failing test. You can use tools like ``autopep8`` to\n\u201cclean\u201d your code as follows:\n\n.. code:: bash\n\n $ pip install autopep8\n $ cd acumos-python-client\n $ autopep8 -r --in-place --ignore E501 acumos/ testing/ examples/\n\nRun tox directly:\n\n.. code:: bash\n\n $ cd acumos-python-client\n $ export WORKSPACE=$(pwd) # env var normally provided by Jenkins\n $ tox\n\nYou can also specify certain tox environments to test:\n\n.. code:: bash\n\n $ tox -e py36 # only test against Python 3.6\n $ tox -e flake8 # only lint code\n\n\n",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://gerrit.acumos.org/r/gitweb?p=acumos-python-client.git",
"keywords": "acumos machine learning model modeling artificial intelligence ml ai",
"license": "Apache License 2.0",
"maintainer": "",
"maintainer_email": "",
"name": "acumos",
"package_url": "https://pypi.org/project/acumos/",
"platform": "",
"project_url": "https://pypi.org/project/acumos/",
"project_urls": {
"Homepage": "https://gerrit.acumos.org/r/gitweb?p=acumos-python-client.git"
},
"release_url": "https://pypi.org/project/acumos/0.8.0/",
"requires_dist": [
"appdirs",
"dill",
"filelock",
"numpy",
"protobuf",
"requests"
],
"requires_python": ">=3.5, <3.7",
"summary": "Acumos client library for building and pushing Python models",
"version": "0.8.0"
},
"last_serial": 5173444,
"releases": {
"0.5.3": [
{
"comment_text": "",
"digests": {
"md5": "35a2a2246455ac4eedf3bd46660f5144",
"sha256": "17fc94b607f5707a37f0a923d6dce922c49889b12c272a1d55e61a7233e3deed"
},
"downloads": -1,
"filename": "acumos-0.5.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "35a2a2246455ac4eedf3bd46660f5144",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 36113,
"upload_time": "2018-03-09T21:46:17",
"url": "https://files.pythonhosted.org/packages/79/eb/c1a790684c0e1bbdfbe426ddd906dd44f5847cb57d8834736e550ad00c3e/acumos-0.5.3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "f8a22e14bc33bcdd3469611002d618ff",
"sha256": "3b9b1bf49d31e9621d47fe404f55f564dfb77e6440609fea2ba7be9b0917981b"
},
"downloads": -1,
"filename": "acumos-0.5.3.tar.gz",
"has_sig": false,
"md5_digest": "f8a22e14bc33bcdd3469611002d618ff",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27822,
"upload_time": "2018-03-09T21:46:19",
"url": "https://files.pythonhosted.org/packages/3f/b5/5368c4cbb5f1f9dcf3d40fa12421ddbce2490ad066dc2aad9b15dd6c1b94/acumos-0.5.3.tar.gz"
}
],
"0.6.0": [
{
"comment_text": "",
"digests": {
"md5": "5e7e289e32509f352d0ef18ac66a293f",
"sha256": "3ede69dc6cdb21caa42f69af146667d59676efd97feed96e145ba5f37f5ee167"
},
"downloads": -1,
"filename": "acumos-0.6.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "5e7e289e32509f352d0ef18ac66a293f",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 36934,
"upload_time": "2018-03-21T23:12:34",
"url": "https://files.pythonhosted.org/packages/21/e2/039d4478a0ff6c982d724df3bcdef16fcebf91df6d60ebd2f6bee59f6345/acumos-0.6.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "4939db9471f45bf60ab27a931366d88e",
"sha256": "d58495dd72db0093d2311eeb03c54cd59e80317c67b589b7db52a3052eca8212"
},
"downloads": -1,
"filename": "acumos-0.6.0.tar.gz",
"has_sig": false,
"md5_digest": "4939db9471f45bf60ab27a931366d88e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28676,
"upload_time": "2018-03-21T23:12:36",
"url": "https://files.pythonhosted.org/packages/a7/21/b80eb23a74be5e543a7b78da5fcdcb3a3c18bb989ab8398222bf0d1b5332/acumos-0.6.0.tar.gz"
}
],
"0.6.1": [
{
"comment_text": "",
"digests": {
"md5": "c08ccae93708afaed5211a2d465839c5",
"sha256": "9c3f6200debd018779e529b936685c1d24821c2d59bf02d25fa5c3ec84ac4bda"
},
"downloads": -1,
"filename": "acumos-0.6.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "c08ccae93708afaed5211a2d465839c5",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 37160,
"upload_time": "2018-03-23T20:16:19",
"url": "https://files.pythonhosted.org/packages/fb/d1/f0cfcf9380ad4e637699f4be2a2ea7547bfb91d4835cafe60444ac34c9b9/acumos-0.6.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "978c00d8c69fdb0e08fe8e52165d99d7",
"sha256": "d07cbc02193165b1d0cd12163bb2b1aa2ad8cc427a4c9d0d4dc41e199f20492e"
},
"downloads": -1,
"filename": "acumos-0.6.1.tar.gz",
"has_sig": false,
"md5_digest": "978c00d8c69fdb0e08fe8e52165d99d7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29254,
"upload_time": "2018-03-23T20:16:20",
"url": "https://files.pythonhosted.org/packages/74/d0/3a4d57bbe5d02ad652e7102b86b1c9ac1b006f695ad677c542fdfd5e3d1d/acumos-0.6.1.tar.gz"
}
],
"0.6.2": [
{
"comment_text": "",
"digests": {
"md5": "36d87223553ba9acb190aac8acdc0a30",
"sha256": "f66d59f5ce518f75dea7eab4b7deac87cb8cc34c276f707297cd35ba1d94bf9f"
},
"downloads": -1,
"filename": "acumos-0.6.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "36d87223553ba9acb190aac8acdc0a30",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 30323,
"upload_time": "2018-04-06T20:19:59",
"url": "https://files.pythonhosted.org/packages/27/bf/162ef72d58a921c8f0ab0e25e0bbbd6cedd8cc86d5c469c3d99e401ef345/acumos-0.6.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "eed9886623d6a8c1cda826ad08629204",
"sha256": "b88165733b51c7f0b192875f068212c4cc766f488abc94973a94aff254ea23d6"
},
"downloads": -1,
"filename": "acumos-0.6.2.tar.gz",
"has_sig": false,
"md5_digest": "eed9886623d6a8c1cda826ad08629204",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29266,
"upload_time": "2018-04-06T20:20:00",
"url": "https://files.pythonhosted.org/packages/ea/e1/646e37b7432bfa598814a6191cd73bc218e3a429cc6b525ed3aa91aa8d3d/acumos-0.6.2.tar.gz"
}
],
"0.6.3": [
{
"comment_text": "",
"digests": {
"md5": "78f330a67d739aadc2563bc6c689aaf9",
"sha256": "6f78462949d20ff599311f21fd620f94b51cc8b7e085283b1d16c9572d2ed23f"
},
"downloads": -1,
"filename": "acumos-0.6.3-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "78f330a67d739aadc2563bc6c689aaf9",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 30589,
"upload_time": "2018-04-27T16:34:47",
"url": "https://files.pythonhosted.org/packages/bd/db/1b37a6f6d41d5a2f1fe901a80a9ac6a37b5acb29301ab4f547a3c515a704/acumos-0.6.3-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "573794fa2a78699eeb96996826401f19",
"sha256": "4f87d08a0e0a3bc3fc1da164b21c8be6398e6d60f379cab9f4435efa64498786"
},
"downloads": -1,
"filename": "acumos-0.6.3.tar.gz",
"has_sig": false,
"md5_digest": "573794fa2a78699eeb96996826401f19",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29569,
"upload_time": "2018-04-27T16:34:48",
"url": "https://files.pythonhosted.org/packages/2f/c8/632be135488cdc39e3cf229335e682522bc802b601e576ad2827ccbae241/acumos-0.6.3.tar.gz"
}
],
"0.6.4": [
{
"comment_text": "",
"digests": {
"md5": "1ac5b525135af642df3f34f5230d2c1b",
"sha256": "192a8c652f57f20f24485b9dd68e3a2ad087e37462e06d97fef3984fca16f1c0"
},
"downloads": -1,
"filename": "acumos-0.6.4-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "1ac5b525135af642df3f34f5230d2c1b",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 30634,
"upload_time": "2018-05-31T19:27:50",
"url": "https://files.pythonhosted.org/packages/e1/b0/3cc0d6417f794e93058eb68983468be8da22d3e16e3f9834acd29604a8c2/acumos-0.6.4-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "d769aebf7df551ab3f51b7b0f0622165",
"sha256": "433c01301b30d18527b5a7055bde7435f3bac74c68650bbfa33af32cf52c90d7"
},
"downloads": -1,
"filename": "acumos-0.6.4.tar.gz",
"has_sig": false,
"md5_digest": "d769aebf7df551ab3f51b7b0f0622165",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29693,
"upload_time": "2018-05-31T19:27:51",
"url": "https://files.pythonhosted.org/packages/54/da/f5c06c4ee2ee53b12df92dc3cf5dc10874cf69594c2166dba2d0490d17be/acumos-0.6.4.tar.gz"
}
],
"0.6.5": [
{
"comment_text": "",
"digests": {
"md5": "3718f873e1f573fcfff26cde72622d7c",
"sha256": "d3996cc44288d6e3c800230ff6af6601be7931327ccf8f22d7baa1d925430d22"
},
"downloads": -1,
"filename": "acumos-0.6.5-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "3718f873e1f573fcfff26cde72622d7c",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 30673,
"upload_time": "2018-06-15T20:45:40",
"url": "https://files.pythonhosted.org/packages/8d/c2/837e1a6599905a9d4cffd3efaa04a1ea3fa78a86ac7f3d8dcf7f671fbc63/acumos-0.6.5-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "960dc8091a89e021ee013a1b3c947376",
"sha256": "1112beb615bc4aacce8ddc6be4bb3fc690e65a4c082a77b35bc57cc729fc0aed"
},
"downloads": -1,
"filename": "acumos-0.6.5.tar.gz",
"has_sig": false,
"md5_digest": "960dc8091a89e021ee013a1b3c947376",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29795,
"upload_time": "2018-06-15T20:45:41",
"url": "https://files.pythonhosted.org/packages/da/b2/f9ed4247a6ab61011d061e62e41bab7164c7ebb6f4d99b60927892a50019/acumos-0.6.5.tar.gz"
}
],
"0.7.0": [
{
"comment_text": "",
"digests": {
"md5": "5e19fe5aa05368b98057dc2b182ca5bc",
"sha256": "1d56d271fa775d0803bbd1dfe2df505860aeb982f1ccc30f5582ccf761e88c8c"
},
"downloads": -1,
"filename": "acumos-0.7.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "5e19fe5aa05368b98057dc2b182ca5bc",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 31719,
"upload_time": "2018-06-20T14:19:48",
"url": "https://files.pythonhosted.org/packages/9b/cb/192af4f59ba4d441ab77307aa6329eee0230336232e7b2df7c24263e4f34/acumos-0.7.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "e1ccf4a85253172a8670db4ba56986cd",
"sha256": "fe70f26a41a4707e4a75e26ee08dcd2fd8b3428c86f4f7c3f5c58ab1e88286e4"
},
"downloads": -1,
"filename": "acumos-0.7.0.tar.gz",
"has_sig": false,
"md5_digest": "e1ccf4a85253172a8670db4ba56986cd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 31159,
"upload_time": "2018-06-20T14:19:49",
"url": "https://files.pythonhosted.org/packages/bf/64/488fb619d08c73128cf5063f52fff39856cea0d288cf2edc6707a61b469a/acumos-0.7.0.tar.gz"
}
],
"0.7.1": [
{
"comment_text": "",
"digests": {
"md5": "22db5b6424fc5a046f44ff112a84617d",
"sha256": "dd77b1bf700d48bef3b23eec38bbd079d3e357c47c2e574b9c2c51dd54c61bce"
},
"downloads": -1,
"filename": "acumos-0.7.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "22db5b6424fc5a046f44ff112a84617d",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.4",
"size": 39341,
"upload_time": "2018-10-17T20:22:34",
"url": "https://files.pythonhosted.org/packages/eb/54/d9f0deb8d6afec70b88359c545ab58ecb9b26ea8db12edfb13f119fbed1c/acumos-0.7.1-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "be0b2dd4e68e2b429811d2ea2688151e",
"sha256": "d023ceac5f346d7081a4063813afab837288daafe5890d27aa61963651035e19"
},
"downloads": -1,
"filename": "acumos-0.7.1.tar.gz",
"has_sig": false,
"md5_digest": "be0b2dd4e68e2b429811d2ea2688151e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.4",
"size": 31509,
"upload_time": "2018-10-17T20:22:36",
"url": "https://files.pythonhosted.org/packages/99/6b/1f2e32782436611b402900a4ccf45afb3c8b6da29d155a789fc873b4d7f0/acumos-0.7.1.tar.gz"
}
],
"0.7.2": [
{
"comment_text": "",
"digests": {
"md5": "a30e6731f719b2308bb978b08b696d32",
"sha256": "86cec04349c0977e1be746ac3ad1b8b1900c7d2272bb6b8a9c1ac5b235b8d341"
},
"downloads": -1,
"filename": "acumos-0.7.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "a30e6731f719b2308bb978b08b696d32",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.4",
"size": 39590,
"upload_time": "2019-01-19T02:55:06",
"url": "https://files.pythonhosted.org/packages/26/7d/0fae8018745aaf81f897de3fd64e75accb8c3d7383a1b576c8b10b009036/acumos-0.7.2-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "978d41d1b5bb30e8c80e394f5465aa9b",
"sha256": "d05fd160041eb7f9ddb534841fa39c622bbd82a6bf7a9fe4e9a6e4664e33a4a1"
},
"downloads": -1,
"filename": "acumos-0.7.2.tar.gz",
"has_sig": false,
"md5_digest": "978d41d1b5bb30e8c80e394f5465aa9b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.4",
"size": 31800,
"upload_time": "2019-01-19T02:55:07",
"url": "https://files.pythonhosted.org/packages/90/a0/681587481abda2be0ef2f584aa768486af202873ef9afb989b25ced5e964/acumos-0.7.2.tar.gz"
}
],
"0.8.0": [
{
"comment_text": "",
"digests": {
"md5": "7308b83df2caae2ee207a5f54feb5d7a",
"sha256": "bc4360d4ddc715c8aa092bfde2996f94a8a45797f1a4ee445a24fe938f0d9dee"
},
"downloads": -1,
"filename": "acumos-0.8.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "7308b83df2caae2ee207a5f54feb5d7a",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.5, <3.7",
"size": 40928,
"upload_time": "2019-04-22T16:03:01",
"url": "https://files.pythonhosted.org/packages/26/5c/8291481e0a5b4e5e2129c0f4d852eac852023bbf995f9f16e9d4bc4de5ba/acumos-0.8.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "9cf9d87cf280745542e1da1418eca71c",
"sha256": "6986c0cad04fc1cf0364c058dd45f522b0ffb5c35fba492eb459ddb94bcff2fd"
},
"downloads": -1,
"filename": "acumos-0.8.0.tar.gz",
"has_sig": false,
"md5_digest": "9cf9d87cf280745542e1da1418eca71c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.5, <3.7",
"size": 34075,
"upload_time": "2019-04-22T16:03:02",
"url": "https://files.pythonhosted.org/packages/77/29/1af417848399a233d765062fb02f8a76cee61b460138913cedb0d94974ff/acumos-0.8.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "7308b83df2caae2ee207a5f54feb5d7a",
"sha256": "bc4360d4ddc715c8aa092bfde2996f94a8a45797f1a4ee445a24fe938f0d9dee"
},
"downloads": -1,
"filename": "acumos-0.8.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "7308b83df2caae2ee207a5f54feb5d7a",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.5, <3.7",
"size": 40928,
"upload_time": "2019-04-22T16:03:01",
"url": "https://files.pythonhosted.org/packages/26/5c/8291481e0a5b4e5e2129c0f4d852eac852023bbf995f9f16e9d4bc4de5ba/acumos-0.8.0-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "9cf9d87cf280745542e1da1418eca71c",
"sha256": "6986c0cad04fc1cf0364c058dd45f522b0ffb5c35fba492eb459ddb94bcff2fd"
},
"downloads": -1,
"filename": "acumos-0.8.0.tar.gz",
"has_sig": false,
"md5_digest": "9cf9d87cf280745542e1da1418eca71c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.5, <3.7",
"size": 34075,
"upload_time": "2019-04-22T16:03:02",
"url": "https://files.pythonhosted.org/packages/77/29/1af417848399a233d765062fb02f8a76cee61b460138913cedb0d94974ff/acumos-0.8.0.tar.gz"
}
]
}