{ "info": { "author": "David O'Connor ", "author_email": "David O'Connor ", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python" ], "description": "[![crates.io version](https://meritbadge.herokuapp.com/pyflow)](https://crates.io/crates/pyflow)\n[![Build Status](https://travis-ci.org/David-OConnor/pyflow.svg?branch=master)](https://travis-ci.org/David-OConnor/pyflow)\n\n\n# Pyflow\n\n#### *Simple is better than complex* - The Zen of Python\n\nPyflow manages Python installations and dependencies.\n\n![Demonstration](https://raw.githubusercontent.com/david-oconnor/pyflow/master/demo.gif)\n\n**Goals**: Make using and publishing Python projects as simple as possible. Actively\nmanaging Python environments shouldn't be required to use dependencies safely. We're attempting\nto fix each stumbling block in the Python workflow, so that it's as elegant\nas the language itself.\n\nYou don't need Python or any other tools installed to use Pyflow.\n\nIt runs standalone scripts in their\nown environments with no config, and project functions directly from the CLI.\n\nIt implements [PEP 582 -- Python local packages directory](https://www.python.org/dev/peps/pep-0582/)\nand [Pep 518 (pyproject.toml)](https://www.python.org/dev/peps/pep-0518/), and supports Python \u2265 3.4. \n\n\n## Installation\n- **Windows** - Download and run \n[this installer](https://github.com/David-OConnor/pyflow/releases/download/0.1.7/pyflow-0.1.7-x86_64.msi).\nOr, if you have [Scoop](https://scoop.sh) installed, run `scoop install pyflow`.\n\n- **Ubuntu or Debian** - Download and run \n[this deb](https://github.com/David-OConnor/pyflow/releases/download/0.1.7/pyflow_0.1.7_amd64.deb).\n\n- **Fedora, CentOs, RedHat, or older versions of SUSE** - Download and run \n[this rpm](https://github.com/David-OConnor/pyflow/releases/download/0.1.7/pyflow-0.1.7.x86_64.rpm).\n\n- **A different Linux distro** - Download this \n[standalone binary](https://github.com/David-OConnor/pyflow/releases/download/0.1.7/pyflow)\n and place it somewhere accessible by the PATH. For example, `/usr/bin`.\n\n- **Mac** - Build from source using the instructions near the bottom of this page,\n or install via `cargo`. (If able, please PR the binary.)\n \n - **If you have [Rust](https://www.rust-lang.org) installed** - Run `cargo install pyflow`.\n\n\n## Quickstart\n- *(Optional)* Run `pyflow init` in an existing project folder, or `pyflow new projname` \nto create a new project folder. `init` imports data from `requirements.txt` or `Pipfile`; `new`\ncreates a folder with the basics.\n- Run `pyflow install` in a project folder to sync dependencies with `pyproject.toml`, \nor add dependencies to it. \nThis file will be created if it doesn't exist.\n- Run `pyflow` or `pyflow myfile.py` to run Python.\n\n\n## Quick-and-dirty start for quick-and-dirty scripts\n- Add the line `__requires__ = [numpy, requests]` somewhere in your script, where `numpy` and \n`requests` are dependencies.\nRun `pyflow script myscript.py`, where `myscript.py` is the name of your script.\nThis will set up an isolated environment for this script, and install\ndependencies as required. This is a safe way\nto run one-off Python files that aren't attached to a project, but have dependencies.\n\n\n## Why add another Python manager?\n`Pipenv`, `Poetry`, and `Pyenv` address parts of \nPyflow's *raison d'\u00eatre*, but expose stumbling blocks that may frustrate new users, \nboth when installing and using. Some reasons why this is different:\n \n- It behaves consistently regardless of how your system and Python installations\nare configured.\n \n- It automatically manages Python installations and environments. You specify a Python version\n in `pyproject.toml` (if ommitted, it asks), and it ensures that version is used. \n If the version's not installed, Pyflow downloads a binary, and uses that.\n If multiple installations are found for that version, it asks which to use.\n `Pyenv` can be used to install Python, but only if your system is configured in a certain way: \n I don\u2019t think expecting a user\u2019s computer to compile Python is reasonable.\n\n- By not using Python to install or run, it remains environment-agnostic. \nThis is important for making setup and use as simple and decison-free as\n possible. It's common for Python-based CLI tools\nto not run properly when installed from `pip` due to the `PATH` or user directories\nnot being configured in the expected way.\n\n- Its dependency resolution and locking is faster due to using a cached\ndatabase of dependencies, vice downloading and checking each package, or relying\non the incomplete data available on the [pypi warehouse](https://github.com/pypa/warehouse).\n`Pipenv`\u2019s resolution in particular may be prohibitively-slow on weak internet connections.\n\n- It keeps dependencies in the project directory, in `__pypackages__`. This is subtle, \nbut reinforces the idea that there's\nno hidden state.\n\n- It will always use the specified version of Python. This is a notable limitation in `Poetry`; Poetry\nmay pick the wrong installation (eg Python2 vice Python3), with no obvious way to change it.\nPoetry allows projects to specify version, but neither selects, \nnor provides a way to select the right one. If it chooses the wrong one, it will \ninstall the wrong environment, and produce a confusing \nerror message. This can be worked around using `Pyenv`, but this solution isn't \ndocumented, and adds friction to the \nworkflow. It may confuse new users, as it occurs \nby default on popular linux distros like Ubuntu. Additionally, `Pyenv's` docs are \nconfusing: It's not obvious how to install it, what operating systems\nit's compatible with, or what additional dependencies are required.\n\n- Multiple versions of a dependency can be installed, allowing resolution\nof conflicting sub-dependencies. (ie: Your package requires `Dep A>=1.0` and `Dep B`.\n`Dep B` requires Dep `A==0.9`) There are many cases where `Poetry` and `Pipenv` will fail\nto resolve dependencies. Try it for yourself with a few\n random dependencies from [pypi](https://pypi.org/); there's a good chance you'll\n hit this problem using `Poetry` or `Pipenv`. *Limitations: This will not work for\nsome compiled dependencies, and attempting to package something using this will\ntrigger an error.*\n\nPerhaps the biggest philosophical difference is that Pyflow abstracts over environments,\nrather than expecting users to manage them.\n\n\n## My OS comes with Python, and Virtual environments are easy. What's the point of this?\nHopefully we're not replacing [one problem](https://xkcd.com/1987/) with [another](https://xkcd.com/927/).\n\nSome people like the virtual-environment workflow - it requires only tools included \nwith Python, and uses few console commands to create,\nand activate and environments. However, it may be tedious depending on workflow:\nThe commands may be long depending on the path of virtual envs and projects,\nand it requires modifying the state of the terminal for each project, each time\nyou use it, which you may find inconvenient or inelegant.\n\nI think we can do better. This is especially relevant for new Python users\nwho don't understand venvs, or are unaware of the hazards of working with a system Python.\n \n`Pipenv` improves the workflow by automating environment use, and \nallowing reproducable dependency graphs. `Poetry` improves upon `Pipenv's` API,\nspeed, and dependency resolution, as well as improving\nthe packaging and distributing process by using a consolidating project config. Both\n are sensitive to the Python environment used to run them, and won't work\n correctly if it's not as expected. \n\n`Conda` addresses these problems elegantly, but maintains a separate repository\nof binaries from `PyPi`. If all packages you need are available on `Conda`, it may\nbe the best solution. If not, it requires falling back to `Pip`, which means \nusing two separate package managers.\n\nWhen building and deploying packages, a set of overlapping files are \ntraditionally used: `setup.py`, `setup.cfg`, `requirements.txt` and `MANIFEST.in`. We use\n`pyproject.toml` as the single-source of project info required to build\nand publish.\n\n\n## A thoroughly biased feature table\nThese tools have different scopes and purposes:\n\n| Name | [Pip + venv](https://docs.python.org/3/library/venv.html) | [Pipenv](https://docs.pipenv.org) | [Poetry](https://poetry.eustace.io) | [pyenv](https://github.com/pyenv/pyenv) | [pythonloc](https://github.com/cs01/pythonloc) | [Conda](https://docs.conda.io/en/latest/) |this |\n|------|------------|--------|--------|-------|-----------|-------|-----|\n| **Manages dependencies** | \u2713 | \u2713 | \u2713 | | | \u2713 | \u2713|\n| **Resolves/locks deps** | | \u2713 | \u2713 | | | \u2713 | \u2713|\n| **Manages Python installations** | | | | \u2713 | | \u2713 | \u2713 |\n| **Py-environment-agnostic** | | | | \u2713 | | \u2713 | \u2713 |\n| **Included with Python** | \u2713 | | | | | | |\n| **Stores deps with project** | | | | | \u2713 | | \u2713|\n| **Requires changing session state** | \u2713 | | | \u2713 | | | |\n| **Clean build/publish flow** | | | \u2713 | | | | \u2713 |\n| **Supports old Python versions** | with `virtualenv` | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | |\n| **Isolated envs for scripts** | | | | | | | \u2713 |\n| **Runs project fns from CLI** | | | | | | | \u2713 |\n\n\n## Use\n- Optionally, create a `pyproject.toml` file in your project directory. Otherwise, this\nfile will be created automatically. You may wish to use `pyproject new` to create a basic\nproject folder (With a .gitignore, source directory etc), or `pyproject init` to populate\ninfo from `requirements.txt` or `Pipfile`. See\n[PEP 518](https://www.python.org/dev/peps/pep-0518/) for details.\n\nExample contents:\n```toml\n[tool.pyflow]\npy_version = \"3.7\"\nname = \"runcible\"\nversion = \"0.1.0\"\nauthors = [\"John Hackworth \"]\n\n\n[tool.pyflow.dependencies]\nnumpy = \"^1.16.4\"\ndiffeqpy = \"1.1.0\"\n```\nThe `[tool.pyflow]` section is used for metadata. The only required item in it is\n `py_version`, unless\nbuilding and distributing a package. The `[tool.pyflow.dependencies]` section\ncontains all dependencies, and is an analog to `requirements.txt`. You can specify\ndeveloper dependencies in the `[tool.pyflow.dev-dependencies]` section. These\nwon't be packed or published, but will be installed locally. You can install these\nfrom the cli using the `--dev` flag. Eg: `pyflow install black --dev`\n\nYou can specify `extra` dependencies, which will only be installed when passing\nexplicit flags to `pyflow install`, or when included in another project with the appropriate\n flag enabled. Ie packages requiring this one can enable with \n`pip install -e` etc.\n```toml\n[tool.pyflow.extras]\ntest = [\"pytest\", \"nose\"]\nsecure = [\"crypto\"]\n```\n\nIf you'd like to an install a dependency with extras, use syntax like this:\n```toml\n[tool.pyflow.dependencies]\nipython = { version = \"^7.7.0\", extras = [\"qtconsole\"] }\n```\n\nTo install from a local path instead of `pypi`, use syntax like this:\n```toml\n[tool.pyflow.dependencies]\n# packagename = { path = \"path-to-package\"}\nnumpy = { path = \"../numpy\" }\n```\n\nTo install from a `git` repo, use syntax like this:\n```toml\n[tool.pyflow.dependencies]\nsaturn = { git = \"https://github.com/david-oconnor/saturn.git\" } # The trailing `.git` here is optional.\n```\n\n`git`dependencies are currently experimental. If you run into problems with them,\nplease submit an issue.\n\nTo install a package that includes a `.` in its name, enclose the name in quotes.\n\nFor details on \nhow to specify dependencies in this `Cargo.toml`-inspired \n[semvar](https://semver.org) format,\n reference\n[this guide](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html).\n\nWe also attempt to parse metadata and dependencies from [tool.poetry](https://poetry.eustace.io/docs/pyproject/)\nsections of `pyproject.toml`, so there's no need to modify the format\nif you're using that.\n\nYou can specify direct entry points to parts of your program using something like this in `pyproject.toml`:\n```toml\n[tool.pyflow.scripts]\nname = \"module:function\"\n```\nWhere you replace `name`, `function`, and `module` with the name to call your script with, the \nfunction you wish to run, and the module it's in respectively. This is similar to specifying \nscripts in `setup.py` for built packages. The key difference is that functions specified here \ncan be run at any time,\nwithout having to build the package. Run with `pyflow name` to do this.\n\nIf you run `pyflow package` on on a package using this, the result will work like normal script\nentry points for somone using the package, regardless of if they're using this tool.\n\n\n## What you can do\n\n### Managing dependencies:\n- `pyflow install` - Install all packages in `pyproject.toml`, and remove ones not (recursively) specified.\nIf an environment isn't already set up for the version specified in `pyproject.toml`, sets one up. If\nno version is specified, it asks you.\n- `pyflow install requests` - If you specify one or more packages after `install`, those packages will \nbe added to `pyproject.toml` and installed. You can use the `--dev` flag to install dev dependencies. eg:\n`pyflow install black --dev`.\n- `pyflow install numpy==1.16.4 matplotlib>=3.1` - Example with multiple dependencies, and specified versions\n- `pyflow uninstall requests` - Remove one or more dependencies\n\n### Running REPL and Python files in the environment:\n- `pyflow` - Run a Python REPL\n- `pyflow main.py` - Run a python file\n- `pyflow ipython`, `pyflow black` etc - Run a CLI tool like `ipython`, or a project function\n For the former, this must have been installed by a dependency; for the latter, it's specfied\nunder `[tool.pyflow]`, `scripts`\n- `pyflow script myscript.py` - Run a one-off script, outside a project directory, with per-file\npackage management\n\n### Building and publishing:\n- `pyflow package` - Package for distribution (uses setuptools internally, and \nbuilds both source and wheel.)\n- `pyflow package --extras \"test all\"` - Package for distribution with extra features enabled, \nas defined in `pyproject.toml`\n- `pyflow publish` - Upload to PyPi (Repo specified in `pyproject.toml`. Uses `Twine` internally.)\n\n### Misc:\n- `pyflow list` - Display all installed packages and console scripts\n- `pyflow new projname` - Create a directory containing the basics for a project: \na readme, pyproject.toml, .gitignore, and directory for code\n- `pyflow init` - Create a `pyproject.toml` file in an existing project directory. Pull info from\n`requirements.text` and `Pipfile` as required.\n- `pyflow reset` - Remove the environment, and uninstall all packages\n- `pyflow clear` - Clear the cache, of downloaded dependencies, Python installations, or script-\nenvironments; it will ask you which ones you'd like to clear.\n- `pyflow -V` - Get the current version of this tool\n- `pyflow help` Get help, including a list of available commands\n\n\n## How installation and locking work\nRunning `pyflow install` syncs the project's installed dependencies with those\n specified in `pyproject.toml`. It generates `pyflow.lock`, which on subsequent runs,\n keeps dependencies each package a fixed version, as long as it continues to meet the constraints\n specified in `pyproject.toml`. Adding a\npackage name via the CLI, eg `pyflow install matplotlib` simply adds that requirement before proceeding.\n`pyflow.lock` isn't meant to be edited directly.\n \nEach dependency listed in `pyproject.toml` is checked for a compatible match in `pyflow.lock`\n If a constraint is met by something in the lock file, \nthe version we'll sync will match that listed in the lock file. If not met, a new entry\nis added to the lock file, containing the highest version allowed by `pyproject.toml`.\nOnce complete, packages are installed and removed in order to exactly meet those listed\nin the updated lock file.\n\nThis tool downloads and unpacks wheels from `pypi`, or builds\nwheels from source if none are availabile. It verifies the integrity of the downloaded file\n against that listed on `pypi` using `SHA256`, and the exact \nversions used are stored in a lock file.\n\nWhen a dependency is removed from `pyproject.toml`, it, and its subdependencies not\nalso required by other packages are removed from the `__pypackages__` folder.\n\n\n## How dependencies are resolved\n\nCompatible versions of dependencies are determined using info from \nthe [PyPi Warehouse](https://github.com/pypa/warehouse) (available versions, and hash info), \nand the `pydeps` database. We use `pydeps`, which is built specifically for this project,\ndue to inconsistent dependency information stored on `pypi`. A dependency graph is built\nusing this cached database. We attempt to use the newest compatible version of each package.\n\nIf all packages are either only specified once, or specified multiple times with the same\nnewest-compatible version, we're done resolving, and ready to install and sync.\n\nIf a package is included more than once with different newest-compatible versions, but one\nof those newest-compatible is compatible with all requirements, we install that one. If not,\nwe search all versions to find one that's compatible.\n\nIf still unable to find a version of a package that satisfies all requirements, we install\nmultiple versions of it as-required, store them in separate directories, and modify\ntheir parents' imports as required.\n\nNote that it may be possible to resolve dependencies in cases not listed above, instead\nof installing multiple versions. Ie we could try different combinations of top-level packages,\ncheck for resolutions, then vary children as-required down the hierarchy. We don't do this because\n it's slow, has no guarantee of success, and involves installing older versions of packages.\n\n\n## Not-yet-implemented\n- Installing global CLI tools\n- The lock file is missing some info like hashes\n- Adding a dependency via the CLI with a specific version constraint, or extras.\n- Dealing with multiple-installed-versions of a dependency that uses importlib\nor dynamic imports\n- Install Python on Mac\n\n## Building and uploading your project to PyPi\nIn order to build and publish your project, additional info is needed in\n`pyproject.toml`, that mimics what would be in `setup.py`. Example:\n```toml\n[tool.pyflow]\nname = \"everythingkiller\"\npy_version = \"3.6\"\nversion = \"0.1.0\"\nauthors = [\"Fraa Erasmas \"]\ndescription = \"Small, but packs a punch!\"\nhomepage = \"https://everything.math\"\nrepository = \"https://github.com/raz/everythingkiller\"\nlicense = \"MIT\"\nkeywords = [\"nanotech\", \"weapons\"]\nclassifiers = [\n \"Topic :: System :: Hardware\",\n \"Topic :: Scientific/Engineering :: Human Machine Interfaces\",\n]\npython_requires = \">=3.6\"\n# If not included, will default to `test.pypi.org`\npackage_url = \"https://upload.pypi.org/legacy/\"\n\n\n[tool.pyflow.scripts]\n# name = \"module:function\"\nactivate = \"jeejah:activate\"\n\n\n[tool.pyflow.dependencies]\nnumpy = \"^1.16.4\"\nmanimlib = \"0.1.8\"\nipython = {version = \"^7.7.0\", extras=[\"qtconsole\"]}\n\n\n[tool.pyflow.dev-dependencies]\nblack = \"^18.0\"\n```\n`package_url` is used to determine which package repository to upload to. If ommitted, \n`Pypi test` is used (`https://test.pypi.org/legacy/`).\n\nOther items you can specify in `[tool.pyflow]`:\n- `readme`: The readme filename, use this if it's named something other than `README.md`.\n- `build`: A python script to execute building non-python extensions when running `pyflow package`.\n\n## Building this from source \nIf you\u2019d like to build from source, [download and install Rust]( https://www.rust-lang.org/tools/install),\nclone the repo, and in the repo directory, run `cargo build --release`.\n\nIe on linux or Mac:\n```bash\ncurl https://sh.rustup.rs -sSf | sh\ngit clone https://github.com/david-oconnor/pyflow.git\ncd pyflow\ncargo build --release\n```\n\n## Updating\n- If installed via `Scoop`, run `scoop update pyflow`.\n- If installed via `Snap`, run `snap refresh pyflow`.\n- If installed via `Cargo`, run `cargo install pyflow --force`. \n- If installed via `Pip`, run `pip install --upgrade pflow`.\n- If using an installer or \ndeb, run the new version's installer or deb. If manually calling a binary, replace it.\n\n## Contributing\nIf you notice unexpected behavior or missing features, please post an issue,\nor submit a PR. If you see unexpected\nbehavior, it's probably a bug! Post an issue listing the dependencies that did\nnot install correctly.\n\n\n## Why not to use this\n- It's adding another tool to an already complex field.\n- Most of the features here are already provided by a range of existing packages,\nlike the ones in the table above.\n- The field of contributers is expected to be small, since it's written in a different language.\n- Dependency managers like Pipenv and Poetry work well enough for many cases,\nhave dedicated dev teams, and large userbases.\n- `Conda` in particular handles many things this does quite well.\n\n\n## Dependency cache repo:\n- [Github](https://github.com/David-OConnor/pydeps)\nExample API calls: `https://pydeps.herokuapp.com/requests`, \n`https://pydeps.herokuapp.com/requests/2.21.0`. \nThis pulls all top-level\ndependencies for the `requests` package, and the dependencies for version `2.21.0` respectively.\nThere is also a `POST` API for pulling info on specified versions.\n The first time this command is run\nfor a package/version combo, it may be slow. Subsequent calls, by anyone,\nshould be fast. This is due to having to download and install each package\non the server to properly determine dependencies, due to unreliable information\n on the `pypi warehouse`.\n \n \n## Python binary sources:\n### [Repo binaries are downloaded from](https://github.com/David-OConnor/pybin/releases)\n- Windows: [Python official Visual Studio package](https://www.nuget.org/packages/python/3.8.0-b4),\nby Steve Dower.\n- Newer linux distros: Built on Ubuntu 18.04, using standard procedures.\n- Older linux distros: Built on CentOS 7, using standard procedures.\n\n\n## Gotchas\n- Make sure `__pypackages__` is in your `.gitignore` file.\n- You may need to set up IDEs to find packages in `__pypackages__`. If using PyCharm:\n`Settings` \u2192 `Project` \u2192 `Project Interpreter` \u2192 `\u2699` \u2192 `Show All...` \u2192 \n(Select the interpreter, ie `(projname)/__pypackages__/3.x/.venv/bin/python`) \u2192 \nClick the folder-tree icon at the bottom of the pop-out window \u2192\n Click the `+` icon at the bottom of the new pop-out window \u2192\n Navigate to and select `(projname)/__pypackages__/3.x/lib`\n- If using VsCode: `Settings` \u2192 search `python extra paths` \u2192\n `Edit in settings.json` \u2192 Add or modify the line: \n `\"python.autoComplete.extraPaths\": [\"(projname)/__pypackages__/3.7/lib\"]`\n\n\n# References\n- [PEP 582 - Python local packages directory](https://www.python.org/dev/peps/pep-0582/)\n- [PEP 518 - pyproject.toml](https://www.python.org/dev/peps/pep-518/)\n- [Semantic versioning](https://semver.org/)\n- [PEP 440 -- Version Identification and Dependency Specification](https://www.python.org/dev/peps/pep-0440/)\n- [Specifying dependencies in Cargo](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html)\n- [Predictable dependency management blog entry](https://blog.rust-lang.org/2016/05/05/cargo-pillars.html)\n- [Blog on why Pyhon dependencies are hard to determine](https://dustingram.com/articles/2018/03/05/why-pypi-doesnt-know-dependencies/)\n\n", "description_content_type": "text/markdown; charset=UTF-8; variant=GFM", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://www.github.com/David-OConnor/pyflow", "keywords": "python dependency packaging build", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pflow", "package_url": "https://pypi.org/project/pflow/", "platform": "", "project_url": "https://pypi.org/project/pflow/", "project_urls": { "Homepage": "https://www.github.com/David-OConnor/pyflow" }, "release_url": "https://pypi.org/project/pflow/0.1.8/", "requires_dist": null, "requires_python": "", "summary": "A modern Python installation and dependency manager", "version": "0.1.8" }, "last_serial": 6005106, "releases": { "0.1.8": [ { "comment_text": "", "digests": { "md5": "163c60178fd5ffa20d4e18cd066272d8", "sha256": "eaab1067295a17fcadc40bf7043f23414ba6ae2a5521f7e2d5b407ca53e5c030" }, "downloads": -1, "filename": "pflow-0.1.8.1-py2.py3-none-manylinux2010_x86_64.whl", "has_sig": false, "md5_digest": "163c60178fd5ffa20d4e18cd066272d8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27232919, "upload_time": "2019-10-21T01:03:25", "url": "https://files.pythonhosted.org/packages/d3/40/0894bd4aec10c10e32d9a4a5fb6783f16f210489a656a6f969df77f1985b/pflow-0.1.8.1-py2.py3-none-manylinux2010_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "2795c3509aaa91253ba554189f925851", "sha256": "b677622bcb23ca1c90827d65c88b06b3534ebbe4cbce315dffa37d27a7512fda" }, "downloads": -1, "filename": "pflow-0.1.8.1-py2.py3-none-win_amd64.whl", "has_sig": false, "md5_digest": "2795c3509aaa91253ba554189f925851", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5486578, "upload_time": "2019-10-21T01:05:33", "url": "https://files.pythonhosted.org/packages/13/26/490fd2eb8d4dc3c927b135ad1bcb802df37ec7c57464d9108e771664687d/pflow-0.1.8.1-py2.py3-none-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "27d7cef2aaa7859ae518c72a3562116a", "sha256": "c3f376bec46cc1d9f5536648bba0762ac5517885c57d9390b45388eadfc99686" }, "downloads": -1, "filename": "pflow-0.1.8-py2.py3-none-manylinux2010_x86_64.whl", "has_sig": false, "md5_digest": "27d7cef2aaa7859ae518c72a3562116a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27232917, "upload_time": "2019-10-21T00:43:57", "url": "https://files.pythonhosted.org/packages/2c/b3/6fd6c7e0c2bd845a3150b2656c2ec783b2ef41e871d90894f5923b822bdb/pflow-0.1.8-py2.py3-none-manylinux2010_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "99a05a826222876a01a316d34ff390b5", "sha256": "e4fe6db208c5fc6642e493938466b1a6f16c2562e5e4b82108ad605f61bcd791" }, "downloads": -1, "filename": "pflow-0.1.8-py2.py3-none-win_amd64.whl", "has_sig": false, "md5_digest": "99a05a826222876a01a316d34ff390b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5486576, "upload_time": "2019-10-21T00:44:37", "url": "https://files.pythonhosted.org/packages/56/65/8ab20665aa9327340b6cc985db2dab5576c461412cdb37d179b43099cd91/pflow-0.1.8-py2.py3-none-win_amd64.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "163c60178fd5ffa20d4e18cd066272d8", "sha256": "eaab1067295a17fcadc40bf7043f23414ba6ae2a5521f7e2d5b407ca53e5c030" }, "downloads": -1, "filename": "pflow-0.1.8.1-py2.py3-none-manylinux2010_x86_64.whl", "has_sig": false, "md5_digest": "163c60178fd5ffa20d4e18cd066272d8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27232919, "upload_time": "2019-10-21T01:03:25", "url": "https://files.pythonhosted.org/packages/d3/40/0894bd4aec10c10e32d9a4a5fb6783f16f210489a656a6f969df77f1985b/pflow-0.1.8.1-py2.py3-none-manylinux2010_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "2795c3509aaa91253ba554189f925851", "sha256": "b677622bcb23ca1c90827d65c88b06b3534ebbe4cbce315dffa37d27a7512fda" }, "downloads": -1, "filename": "pflow-0.1.8.1-py2.py3-none-win_amd64.whl", "has_sig": false, "md5_digest": "2795c3509aaa91253ba554189f925851", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5486578, "upload_time": "2019-10-21T01:05:33", "url": "https://files.pythonhosted.org/packages/13/26/490fd2eb8d4dc3c927b135ad1bcb802df37ec7c57464d9108e771664687d/pflow-0.1.8.1-py2.py3-none-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "27d7cef2aaa7859ae518c72a3562116a", "sha256": "c3f376bec46cc1d9f5536648bba0762ac5517885c57d9390b45388eadfc99686" }, "downloads": -1, "filename": "pflow-0.1.8-py2.py3-none-manylinux2010_x86_64.whl", "has_sig": false, "md5_digest": "27d7cef2aaa7859ae518c72a3562116a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27232917, "upload_time": "2019-10-21T00:43:57", "url": "https://files.pythonhosted.org/packages/2c/b3/6fd6c7e0c2bd845a3150b2656c2ec783b2ef41e871d90894f5923b822bdb/pflow-0.1.8-py2.py3-none-manylinux2010_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "99a05a826222876a01a316d34ff390b5", "sha256": "e4fe6db208c5fc6642e493938466b1a6f16c2562e5e4b82108ad605f61bcd791" }, "downloads": -1, "filename": "pflow-0.1.8-py2.py3-none-win_amd64.whl", "has_sig": false, "md5_digest": "99a05a826222876a01a316d34ff390b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5486576, "upload_time": "2019-10-21T00:44:37", "url": "https://files.pythonhosted.org/packages/56/65/8ab20665aa9327340b6cc985db2dab5576c461412cdb37d179b43099cd91/pflow-0.1.8-py2.py3-none-win_amd64.whl" } ] }