{ "info": { "author": "EAB Tech", "author_email": "eabtech@eab.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Juniper: Package lambda functions\n=================================\n\n|circle| |pypi version| |apache license|\n\nJuniper is a packaging tool to stream and standardize the creation of a zip\nartifact for a set of AWS Lambda functions.\n\nThe zip artifacts generated include the source code of the dependencies defined\nin a given requirements.txt file as well as any shared libraries the function\ndepends on. With the generated artifact, a developer can deploy a lambda function\neither manually, through the awscli or using a cloudformation/sam template.\n\nQuickstart\n**********\n\nWith Python==3.6 and Docker installed, install juniper:\n\n.. code-block:: text\n\n > pip install juniper\n\nIn order to package your lambda functions with juniper, you need to create a\nmanifest file.\n\n.. code-block:: yaml\n\n functions:\n # Name the zip file you want juni to create\n router:\n # The dependencies of the router function.\n requirements: ./src/requirements.txt.\n # Include this file in the generated zip artifact.\n include:\n - ./src/lambda_function.py\n\nThe folder structure this manifest refers to looks like:\n\n::\n\n .\n \u251c\u2500\u2500 manifest.yml\n \u251c\u2500\u2500 src\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 requirements.txt\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 lambda_function.py\n\nBuild it!\n\n.. code-block:: text\n\n > juni build\n\nJuniper creates the following artifact `./dist/router.zip` \ud83c\udf89\n\nFor a more comprehensive example, please take a look at our `tutorial`_.\n\n.. _`tutorial`: https://eabglobal.github.io/juniper/tutorial.html\n\nPython3.7 and Beyond\n********************\nBy default juniper uses docker containers to package your lambda functions. Behind\nthe scenes, juniper creates a docker-compose file from your manifest. This file is\nused by the `build` command to spawn a build container per function definition.\n\nSince the AWS Lambda service supports multiple python runtimes, it makes sense for\njuniper to give you the ability to specify a docker image. With the following\nmanifest file, you can package the router lambda using a python3.7 image.\n\n.. code-block:: yaml\n\n functions:\n router:\n # Use this docker image\n image: lambci/lambda:build-python3.7\n requirements: ./src/router/requirements.txt\n # Include these local modules in the artifact\n include:\n - ./src/commonlib/mylib\n - ./src/router_function/router\n\nKeep in mind that not every single docker image works, for more information on\nthe type of images supported read `juniper and docker`_.\n\n.. _`juniper and docker`: https://eabglobal.github.io/juniper/features.html\n\nLambda Layers\n*************\nAWS Lambda layers is a recent service that gives a developer the ability to\npre-package a set of dependencies. A lambda function can be built on top of multiple\nlayers, either packaged by the developer, by AWS or by a third party.\n\nTo build a layer, the juniper manifest uses a new block:\n\n.. code-block:: yaml\n\n layers:\n base:\n requirements: ./src/requirements/base.txt\n pg:\n requirements: ./src/requirements/postgres.txt\n\nWith this manifest, running **juni build** creates two layer artifacts: one with the\nname base and another one named pg. Lambda layers are packaged along the lambda\nfunctions defined in the manifest and the zip files are stored in the artifacts directory.\n\nThe generated artifact includes the dependencies defined in the requirements file\nof the lambda layer.\n\nEach individual section supports the definition of a custom docker image. With this\nfeature, a layer can be built using python3.7 and another one can be built using the\ndefault python interpreter; python3.6.\n\n.. code-block:: yaml\n\n layers:\n base:\n image: lambci/lambda:build-python3.7\n requirements: ./src/requirements/base.txt\n\n\nJuniper builds the artifact for you, you can either use the `layers aws cli`_ to\nupload it to AWS or you can use a SAM template definition. While using a SAM template,\nmake sure you use the `AWS::Serverless::LayerVersion` resource.\n\nTo see an example on how to package lambda functions with layers, juniper includes\nan example in the codebase called `ridge`_.\n\n.. _`layers aws cli`: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-manage\n.. _`ridge`: https://github.com/eabglobal/juniper/tree/master/examples/ridge\n\nConfiguration\n*************\nTo update the default configuration of juniper, can use the the global section\nof the manifest. A sample configuration looks like:\n\n.. code-block:: yaml\n\n global:\n image: lambci/lambda:build-python3.7\n output: ./build\n\n functions:\n router:\n requirements: ./src/router/requirements.txt\n include:\n - ./src/router_function/router/lambda_function.py\n\nSetting a docker image at a global level tells juniper to package every\nlambda function using that image. In this example, the zip artifacts will be stored in\nthe ./build folder instead of the ./dist; which is the default.\n\nInclude Binaries\n****************\nUsing the lambci build images to create the zip artifacts for a given set of lambda\nfunctions is sufficient for most use cases. However, there are times when the base container\ndoes not have all the build libraries necessary to install a python package. In this cases\nrunning `juni build` fails while trying to pip install the dependencies of the function.\nIn addition, once the libraries are installed in the container some packages require a set of\nbinaries to work properly at runtime.\n\nThe recommended procedure to install OS libraries and include missing dependencies\nis to use a dockerfile to build a local docker image. The strategy is illustrated as follows:\n\n* Create a dockerfile using one of the lambci images as a starting point\n* Build a local docker image from the docker file\n* Use the local image in the juniper manifest\n\nWith this startegy, the juniper manifest will look like this:\n\n.. code-block:: yaml\n\n functions:\n router:\n image: custom/local_docker_image\n requirements: ./src/router/requirements.txt\n include:\n - ./src/router_function/router/lambda_function.py\n\nIn this case, a developer needs to build the docker image before executing the\njuni build command.\n\nAt this point, the developer can push the docker image to the docker hub and use\nthe hosted version instead of the local one. This strategy separates the build of\na custom image from the build of the artifacts.\n\nIf you need binaries in the final artifact, you can place these binaries either in\n**/var/task/lambda_lib/** or the **/var/task/lambda_bin/** depending on your use case.\nFiles added to the bin folder are included in the PATH, files added to the lib,\nare included in the LD_LIBRARY_PATH. For more information view `aws layer config`_.\n\nIt is important that you put the files there given that juniper is in\ncharge of placing these binaries in the correct place depending on the type of\nresource (lambda/layer).\n\nA concrete example of the configuration is outlined in the `advanced`_ section\nof our documentation.\n\n.. _`advanced`: https://eabglobal.github.io/juniper/advanced.html\n.. _`aws layer config`: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path\n\nPIP Configuration\n*****************\nTo set any pip configuration parameters, create a pip.conf file and add the path\nto the manifest. The **pipconf** setting is only available at a global level and\nit will apply to the packaging of all the functions defined in the manifest.\n\n.. code-block:: yaml\n\n global:\n pipconf: ./pip.conf\n\n functions:\n sample:\n requirements: ./requirements.txt\n include:\n - ./lambda_function.py\n\nA sample pip.conf file can be seen bellow, to see the entire list of parameters\nvisit the official `pip documentation`_.\n\n.. code-block:: yaml\n\n [global]\n timeout = 5\n index-url = https://download.zope.org/ppix\n\n.. _`pip documentation`: https://pip.pypa.io/en/stable/user_guide/#config-file\n\nFeatures\n********\n\nThis list defines the entire scope of Juniper. Nothing more, nothing else.\n\n* Minimal manifest file to define packaging\n* Using docker containers as a way to install dependencies and generate the artifacts\n* Ability to tailor the requirements.txt per lambda\n* Create an individual zip artifact for multiple lambda functions\n* Ability to include shared dependencies (python modules relative to the function\n being packaged)\n* Specify docker image to package lamdba functions using different python runtimes\n* Define pip command line arguments using a pip.conf file\n* Packaging of lambda layers\n\nContributing\n************\n\nFor guidance on setting up a development environment and how to make a\ncontribution to Juniper, see the `contributing guidelines`_.\n\n.. _contributing guidelines: https://github.com/eabglobal/juniper/blob/master/CONTRIBUTING.rst\n\nLinks\n*****\n\n* Documentation: https://eabglobal.github.io/juniper/\n* License: `Apache Software License`_\n\n* Code: https://github.com/eabglobal/juniper\n* Issue tracker: https://github.com/eabglobal/juniper/issues\n* Test status:\n\n * Linux, Mac: https://circleci.com/gh/eabglobal/juniper\n\n.. _Apache Software License: https://github.com/eabglobal/juniper/blob/master/LICENSE\n\n\n.. |circle| image:: https://circleci.com/gh/eabglobal/juniper/tree/master.svg?style=shield\n :target: https://circleci.com/gh/eabglobal/juniper/tree/master\n\n.. |pypi version| image:: https://img.shields.io/pypi/v/juniper.svg\n :target: https://pypi.org/project/juniper/\n\n.. |apache license| image:: https://img.shields.io/github/license/eabglobal/juniper.svg\n :target: https://github.com/eabglobal/juniper/blob/master/LICENSE\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "Apache Software License", "maintainer": "", "maintainer_email": "", "name": "juniper", "package_url": "https://pypi.org/project/juniper/", "platform": "", "project_url": "https://pypi.org/project/juniper/", "project_urls": { "Code": "https://github.com/eabglobal/juniper", "Documentation": "https://eabglobal.github.io/juniper/", "Issue tracker": "https://github.com/eabglobal/juniper/issues" }, "release_url": "https://pypi.org/project/juniper/0.5.2/", "requires_dist": [ "click (>=5.1)", "click-log", "PyYAML (<4.3,>=3.10)", "Jinja2 (>=2.10)", "docker-compose (<1.24,>=1.20)" ], "requires_python": ">=3.6", "summary": "Tool to streamline the build of python lambda functions.", "version": "0.5.2" }, "last_serial": 5478805, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "3fefbfcf974376736a657c492f5b0883", "sha256": "0dec4cf971671fc65ee5d0dbd3fd0aa3d1d8a3ec73478f8e7731b1fad25896ec" }, "downloads": -1, "filename": "juniper-0.1.1.tar.gz", "has_sig": false, "md5_digest": "3fefbfcf974376736a657c492f5b0883", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10897, "upload_time": "2019-02-01T23:47:26", "url": "https://files.pythonhosted.org/packages/cd/d3/cf6362812765e36646e62a2c8fb9ae99886fea53a28ca28b0369d4840cc6/juniper-0.1.1.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "0bf7c5702d52f1bce8a397473e328cec", "sha256": "568b0f103191b105ccc3c424c7b04566185d4ff12d36b99bac48b9742f9dfe39" }, "downloads": -1, "filename": "juniper-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0bf7c5702d52f1bce8a397473e328cec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 17468, "upload_time": "2019-03-03T01:28:18", "url": "https://files.pythonhosted.org/packages/9a/6e/1b61f9cdc224a72e257efb7cec04be8ff309ad1d40b252ecc5b2eddfd5fb/juniper-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4f23b34e2fafadb5755550326a94cc3f", "sha256": "ea2ba704b074c18cc10801aab0295d005f5300c2e612f0dace202268aa22ecee" }, "downloads": -1, "filename": "juniper-0.2.1.tar.gz", "has_sig": false, "md5_digest": "4f23b34e2fafadb5755550326a94cc3f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 13700, "upload_time": "2019-03-03T01:28:19", "url": "https://files.pythonhosted.org/packages/a1/f4/7c5a89903e8c9b551a8f6533a2b3d7d4826d83865b1c5983a330868148d5/juniper-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "ddbb38f39983b7a4c40b2d551c65c7c9", "sha256": "89c6dd3e403db268109b3a5e70f3cbffb88202e8cb480a097994607b78f143a7" }, "downloads": -1, "filename": "juniper-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ddbb38f39983b7a4c40b2d551c65c7c9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 17674, "upload_time": "2019-03-04T18:59:52", "url": "https://files.pythonhosted.org/packages/17/f7/d40e3a8275549aa990dae22fc42a88896cef61548768d1423ea9dfe3f30f/juniper-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3944b224285ff474a44e17fda14b95ad", "sha256": "3fa005011edd4c00f29a66a399a7abd565323641e637fc44d1ec4b39fa6bc3de" }, "downloads": -1, "filename": "juniper-0.2.2.tar.gz", "has_sig": false, "md5_digest": "3944b224285ff474a44e17fda14b95ad", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 15103, "upload_time": "2019-03-04T18:59:54", "url": "https://files.pythonhosted.org/packages/9a/80/7574b3ef352d4deded9992d5a4e627a5f9c94be0f91294872bd9746c47be/juniper-0.2.2.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "bd446c98991d0a32189cb614bc185d6e", "sha256": "dab06e7bc9b0de16e650d08e6c9437379e8de8c44b0f731535964be8ef128dec" }, "downloads": -1, "filename": "juniper-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "bd446c98991d0a32189cb614bc185d6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 19444, "upload_time": "2019-03-17T15:10:11", "url": "https://files.pythonhosted.org/packages/44/1a/de82c191c1c3f8f35a69a00a0f6b39769e1c2d7cc5fee61df07493039b51/juniper-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9367b8379d8b99680eef8c429570470e", "sha256": "597f33b37715cd6b9613b180e12427c6a6ba84381b692a40d99fdfb6125c4197" }, "downloads": -1, "filename": "juniper-0.2.4.tar.gz", "has_sig": false, "md5_digest": "9367b8379d8b99680eef8c429570470e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 15724, "upload_time": "2019-03-17T15:10:13", "url": "https://files.pythonhosted.org/packages/8a/bb/9b0d4f036d9002ba8d8e478a063e64d775881ba45517428988c8411aa536/juniper-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "cc503e1bfe71d4c0c6956c27111edc55", "sha256": "ee076b2747ce5004eb52ecab455955ea76bce291e29dc105a5455234e6bcd977" }, "downloads": -1, "filename": "juniper-0.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "cc503e1bfe71d4c0c6956c27111edc55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 19546, "upload_time": "2019-03-22T15:49:21", "url": "https://files.pythonhosted.org/packages/51/f9/b819c66d15760cbd377aa8d06b22ceaa592f3076c7424c230332b603c910/juniper-0.2.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cae9a1d6ffce3a52e5551b1cc4022e9", "sha256": "c05ac471afe93c58883333d98293ccc32cb484916e781a5cff9474f1e48eacb2" }, "downloads": -1, "filename": "juniper-0.2.5.tar.gz", "has_sig": false, "md5_digest": "6cae9a1d6ffce3a52e5551b1cc4022e9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17257, "upload_time": "2019-03-22T15:49:22", "url": "https://files.pythonhosted.org/packages/fa/80/3e045562d137d40f70fc5643e9081bc1453d4083acb97d56c773ec271e00/juniper-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "764d2093d84629411f34775ac0f0db67", "sha256": "bf25de8573bcfa80f2b3dfbd22ab1b472acc3d881afc7c16708f93aa384339f9" }, "downloads": -1, "filename": "juniper-0.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "764d2093d84629411f34775ac0f0db67", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 19575, "upload_time": "2019-03-22T16:20:36", "url": "https://files.pythonhosted.org/packages/f5/61/adcfa95b3a1b6ce73e88a4829461bbd3cd6c00d050eafe5e44672d0bec01/juniper-0.2.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d979e2101864a34a549911e64e041ec3", "sha256": "886277ba6f652f5b4e99505401ab6745e06a961ecf921960442f5c9a9dc89f6b" }, "downloads": -1, "filename": "juniper-0.2.6.tar.gz", "has_sig": false, "md5_digest": "d979e2101864a34a549911e64e041ec3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17321, "upload_time": "2019-03-22T16:20:37", "url": "https://files.pythonhosted.org/packages/40/70/0fb958e23ec6361439b8f4cb1018520f0ef0d6efe1581daf8e527a98dc49/juniper-0.2.6.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "33ab4a4a719c9144a7e0f201f62b609e", "sha256": "08dd93227eadbae14a34c12bf194bbbed9631ad808aeedae7981ffef8a79f04d" }, "downloads": -1, "filename": "juniper-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "33ab4a4a719c9144a7e0f201f62b609e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 21140, "upload_time": "2019-04-05T18:11:29", "url": "https://files.pythonhosted.org/packages/68/75/a5607ceffc2ceac694ea2b3327c45c82dd58c3dc5e5b29feca9e8148eb1e/juniper-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba495af447cbfd4f28ba58976b86b6cb", "sha256": "72397aa7ea341af2fb4d125dd2f0d63608559796c39640303b5c1b6569392a78" }, "downloads": -1, "filename": "juniper-0.3.0.tar.gz", "has_sig": false, "md5_digest": "ba495af447cbfd4f28ba58976b86b6cb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18623, "upload_time": "2019-04-05T18:11:30", "url": "https://files.pythonhosted.org/packages/ca/bc/95b080902c9d53a40ccf85df01169d52cf00ad2079a2abd6b78a2dfb1f8b/juniper-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "f797ac8ce5df1c19c5abded893841c64", "sha256": "013d9a9561c3fa797d4df9e590472ed68c1bd8c07ee3afa66ac0d08d4cd48d63" }, "downloads": -1, "filename": "juniper-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f797ac8ce5df1c19c5abded893841c64", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 22658, "upload_time": "2019-04-24T17:53:46", "url": "https://files.pythonhosted.org/packages/62/76/acdc07c229d0c5ba4f531cc8ef9992f77e91d47a1d5139e780150769b051/juniper-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c91b689cc18362834c019fcf1c92642", "sha256": "33c1a47e27e77361ae6d5059040fde5a62b1308103297a13dd07547c5d2e2706" }, "downloads": -1, "filename": "juniper-0.4.0.tar.gz", "has_sig": false, "md5_digest": "2c91b689cc18362834c019fcf1c92642", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 20817, "upload_time": "2019-04-24T17:53:48", "url": "https://files.pythonhosted.org/packages/c3/b8/0894ff381d81d174f33d2a7728d0d4eeac2159b739c57aeece708f334be5/juniper-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "8323dcd9c3e29242e7deec54a01f952d", "sha256": "d8d0240ccc639e8beee0f4f60e583a6897ee0751323165830c8e22cce65b72f5" }, "downloads": -1, "filename": "juniper-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8323dcd9c3e29242e7deec54a01f952d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23479, "upload_time": "2019-06-25T02:14:08", "url": "https://files.pythonhosted.org/packages/90/50/738396d954245d87be8c6946237b619ecb5442a3c9f3bfdce2edcf5dba27/juniper-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6805c6ac216e65ad721a79ff90cc1738", "sha256": "5bf452cc66dbe7b97bbe47230bf1dde3af624d35892c16582a27120597758b0b" }, "downloads": -1, "filename": "juniper-0.5.0.tar.gz", "has_sig": false, "md5_digest": "6805c6ac216e65ad721a79ff90cc1738", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 22716, "upload_time": "2019-06-25T02:14:09", "url": "https://files.pythonhosted.org/packages/37/4c/a4780d0f49338acea373e2dd6381df67f430760be131259be3ed644c58e4/juniper-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "9db0ce7163159374e3ce9b41e4ae6a03", "sha256": "a3fcdc4c3485cf8eec7a998f9b252e76c84aa8ee58b707c0b09ea198b1cf8d69" }, "downloads": -1, "filename": "juniper-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9db0ce7163159374e3ce9b41e4ae6a03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23860, "upload_time": "2019-06-29T03:04:50", "url": "https://files.pythonhosted.org/packages/51/4d/b8af0109e496fa24c767e533e4cd0dfacf5714ae5f52df629fcc8e1e6d51/juniper-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "898157500ae907f38eb04120a6cbfe9c", "sha256": "e16b122c37f0e1d7f3ca19a9a6bedf495d9ce3f43a61e1349c1b9f84a4c51292" }, "downloads": -1, "filename": "juniper-0.5.1.tar.gz", "has_sig": false, "md5_digest": "898157500ae907f38eb04120a6cbfe9c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 24061, "upload_time": "2019-06-29T03:04:51", "url": "https://files.pythonhosted.org/packages/48/98/c40d2bb7e1f343af5a465b42bcde10932657c02ea9e2e4a2757662ffcb7f/juniper-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "8615bdfe5f30d3c164165b83827065ea", "sha256": "be324a584f3d2d193ad965c672f8bde49fa3691655adb0d77519e1c6aae2c9eb" }, "downloads": -1, "filename": "juniper-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8615bdfe5f30d3c164165b83827065ea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23989, "upload_time": "2019-07-02T23:46:03", "url": "https://files.pythonhosted.org/packages/b1/7b/adf1f7012420e228f0489360b9ac95f94bdf5861ef69079998416b7c4900/juniper-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "19c0a689d75ce95534b0e5ca851e5e7c", "sha256": "d99d091fb4bb4a61459d472c9ad4382159b362e2f3fc56fbfea44fa5cbe87754" }, "downloads": -1, "filename": "juniper-0.5.2.tar.gz", "has_sig": false, "md5_digest": "19c0a689d75ce95534b0e5ca851e5e7c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 24363, "upload_time": "2019-07-02T23:46:04", "url": "https://files.pythonhosted.org/packages/9f/aa/359fe3937918e90e0cb280dca00f87f577d3dad57a3a8f0c37bd1501ab06/juniper-0.5.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8615bdfe5f30d3c164165b83827065ea", "sha256": "be324a584f3d2d193ad965c672f8bde49fa3691655adb0d77519e1c6aae2c9eb" }, "downloads": -1, "filename": "juniper-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8615bdfe5f30d3c164165b83827065ea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 23989, "upload_time": "2019-07-02T23:46:03", "url": "https://files.pythonhosted.org/packages/b1/7b/adf1f7012420e228f0489360b9ac95f94bdf5861ef69079998416b7c4900/juniper-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "19c0a689d75ce95534b0e5ca851e5e7c", "sha256": "d99d091fb4bb4a61459d472c9ad4382159b362e2f3fc56fbfea44fa5cbe87754" }, "downloads": -1, "filename": "juniper-0.5.2.tar.gz", "has_sig": false, "md5_digest": "19c0a689d75ce95534b0e5ca851e5e7c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 24363, "upload_time": "2019-07-02T23:46:04", "url": "https://files.pythonhosted.org/packages/9f/aa/359fe3937918e90e0cb280dca00f87f577d3dad57a3a8f0c37bd1501ab06/juniper-0.5.2.tar.gz" } ] }