{ "info": { "author": "Dan Ryan", "author_email": "dan@danryan.co", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: ISC License (ISCL)", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "===============================================================================\nvistir: Setup / utilities which most projects eventually need\n===============================================================================\n\n.. image:: https://img.shields.io/pypi/v/vistir.svg\n :target: https://pypi.python.org/pypi/vistir\n\n.. image:: https://img.shields.io/pypi/l/vistir.svg\n :target: https://pypi.python.org/pypi/vistir\n\n.. image:: https://travis-ci.com/sarugaku/vistir.svg?branch=master\n :target: https://travis-ci.com/sarugaku/vistir\n\n.. image:: https://img.shields.io/pypi/pyversions/vistir.svg\n :target: https://pypi.python.org/pypi/vistir\n\n.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg\n :target: https://saythanks.io/to/techalchemy\n\n.. image:: https://readthedocs.org/projects/vistir/badge/?version=latest\n :target: https://vistir.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://dev.azure.com/sarugaku/vistir/_apis/build/status/Vistir%20Build%20Pipeline?branchName=master\n :target: https://dev.azure.com/sarugaku/vistir/_build/latest?definitionId=2&branchName=master\n\n\n\ud83d\udc09 Installation\n=================\n\nInstall from `PyPI`_:\n\n ::\n\n $ pipenv install vistir\n\nInstall from `Github`_:\n\n ::\n\n $ pipenv install -e git+https://github.com/sarugaku/vistir.git#egg=vistir\n\n\n.. _PyPI: https://www.pypi.org/project/vistir\n.. _Github: https://github.com/sarugaku/vistir\n\n\n.. _`Summary`:\n\n\ud83d\udc09 Summary\n===========\n\n**vistir** is a library full of utility functions designed to make life easier. Here are\nsome of the places where these functions are used:\n\n * `pipenv`_\n * `requirementslib`_\n * `pip-tools`_\n * `passa`_\n * `pythonfinder`_\n\n.. _passa: https://github.com/sarugaku/passa\n.. _pipenv: https://github.com/pypa/pipenv\n.. _pip-tools: https://github.com/jazzband/pip-tools\n.. _requirementslib: https://github.com/sarugaku/requirementslib\n.. _pythonfinder: https://github.com/sarugaku/pythonfinder\n\n\n.. _`Usage`:\n\n\ud83d\udc09 Usage\n==========\n\nImporting a utility\n--------------------\n\nYou can import utilities directly from **vistir**:\n\n.. code:: python\n\n from vistir import cd\n with cd('/path/to/somedir'):\n do_stuff_in('somedir')\n\n\n.. _`Functionality`:\n\n\ud83d\udc09 Functionality\n==================\n\n**vistir** provides several categories of functionality, including:\n\n * Backports\n * Compatibility Shims\n * Context Managers\n * Miscellaneous Utilities\n * Path Utilities\n\n.. note::\n\n The backports should be imported via ``vistir.compat`` which will provide the\n native versions of the backported items if possible.\n\n\n\ud83d\udc09 Compatibility Shims\n-----------------------\n\nShims are provided for full API compatibility from python 2.7 through 3.7 for the following:\n\n * ``weakref.finalize``\n * ``functools.partialmethod`` (via ``vistir.backports.functools.partialmethod``)\n * ``tempfile.TemporaryDirectory`` (via ``vistir.backports.tempfile.TemporaryDirectory``)\n * ``tempfile.NamedTemporaryFile`` (via ``vistir.backports.tempfile.NamedTemporaryFile``)\n * ``vistir.compat.Path``\n * ``vistir.compat.get_terminal_size``\n * ``vistir.compat.JSONDecodeError``\n * ``vistir.compat.ResourceWarning``\n * ``vistir.compat.FileNotFoundError``\n * ``vistir.compat.PermissionError``\n * ``vistir.compat.IsADirectoryError``\n\nThe following additional functions are provided for encoding strings to the filesystem\ndefault encoding:\n\n * ``vistir.compat.fs_str``\n * ``vistir.compat.to_native_string``\n * ``vistir.compat.fs_encode``\n * ``vistir.compat.fs_decode``\n\n\n\ud83d\udc09 Context Managers\n--------------------\n\n**vistir** provides the following context managers as utility contexts:\n\n * ``vistir.contextmanagers.atomic_open_for_write``\n * ``vistir.contextmanagers.cd``\n * ``vistir.contextmanagers.open_file``\n * ``vistir.contextmanagers.replaced_stream``\n * ``vistir.contextmanagers.replaced_streams``\n * ``vistir.contextmanagers.spinner``\n * ``vistir.contextmanagers.temp_environ``\n * ``vistir.contextmanagers.temp_path``\n\n\n.. _`atomic_open_for_write`:\n\n**atomic_open_for_write**\n///////////////////////////\n\nThis context manager ensures that a file only gets overwritten if the contents can be\nsuccessfully written in its place. If you open a file for writing and then fail in the\nmiddle under normal circumstances, your original file is already gone.\n\n.. code:: python\n\n >>> fn = \"test_file.txt\"\n >>> with open(fn, \"w\") as fh:\n fh.write(\"this is some test text\")\n >>> read_test_file()\n this is some test text\n >>> def raise_exception_while_writing(filename):\n with vistir.contextmanagers.atomic_open_for_write(filename) as fh:\n fh.write(\"Overwriting all the text from before with even newer text\")\n raise RuntimeError(\"But did it get overwritten now?\")\n >>> raise_exception_while_writing(fn)\n Traceback (most recent call last):\n ...\n RuntimeError: But did it get overwritten now?\n >>> read_test_file()\n this is some test text\n\n\n.. _`cd`:\n\n**cd**\n///////\n\nA context manager for temporarily changing the working directory.\n\n\n.. code:: python\n\n >>> os.path.abspath(os.curdir)\n '/tmp/test'\n >>> with vistir.contextmanagers.cd('/tmp/vistir_test'):\n print(os.path.abspath(os.curdir))\n /tmp/vistir_test\n\n\n.. _`open_file`:\n\n**open_file**\n///////////////\n\nA context manager for streaming file contents, either local or remote. It is recommended\nto pair this with an iterator which employs a sensible chunk size.\n\n\n.. code:: python\n\n >>> filecontents = b\"\"\n with vistir.contextmanagers.open_file(\"https://norvig.com/big.txt\") as fp:\n for chunk in iter(lambda: fp.read(16384), b\"\"):\n filecontents.append(chunk)\n >>> import io\n >>> import shutil\n >>> filecontents = io.BytesIO(b\"\")\n >>> with vistir.contextmanagers.open_file(\"https://norvig.com/big.txt\") as fp:\n shutil.copyfileobj(fp, filecontents)\n\n\n**replaced_stream**\n////////////////////\n\n.. _`replaced_stream`:\n\nA context manager to temporarily swap out *stream_name* with a stream wrapper. This will\ncapture the stream output and prevent it from being written as normal.\n\n.. code-block:: python\n\n >>> orig_stdout = sys.stdout\n >>> with replaced_stream(\"stdout\") as stdout:\n ... sys.stdout.write(\"hello\")\n ... assert stdout.getvalue() == \"hello\"\n ... assert orig_stdout.getvalue() != \"hello\"\n\n >>> sys.stdout.write(\"hello\")\n 'hello'\n\n\n.. _`replaced_streams`:\n\n**replaced_streams**\n/////////////////////\n\n\nTemporarily replaces both *sys.stdout* and *sys.stderr* and captures anything written\nto these respective targets.\n\n\n.. code-block:: python\n\n >>> import sys\n >>> with vistir.contextmanagers.replaced_streams() as streams:\n >>> stdout, stderr = streams\n >>> sys.stderr.write(\"test\")\n >>> sys.stdout.write(\"hello\")\n >>> assert stdout.getvalue() == \"hello\"\n >>> assert stderr.getvalue() == \"test\"\n\n >>> stdout.getvalue()\n 'hello'\n\n >>> stderr.getvalue()\n 'test'\n\n\n.. _`spinner`:\n\n**spinner**\n////////////\n\nA context manager for wrapping some actions with a threaded, interrupt-safe spinner. The\nspinner is fully compatible with all terminals (you can use ``bouncingBar`` on non-utf8\nterminals) and will allow you to update the text of the spinner itself by simply setting\n``spinner.text`` or write lines to the screen above the spinner by using\n``spinner.write(line)``. Success text can be indicated using ``spinner.ok(\"Text\")`` and\nfailure text can be indicated with ``spinner.fail(\"Fail text\")``.\n\n.. code:: python\n\n >>> lines = [\"a\", \"b\"]\n >>> with vistir.contextmanagers.spinner(spinner_name=\"dots\", text=\"Running...\", handler_map={}, nospin=False) as sp:\n for line in lines:\n sp.write(line + \"\\n\")\n while some_variable = some_queue.pop():\n sp.text = \"Consuming item: %s\" % some_variable\n if success_condition:\n sp.ok(\"Succeeded!\")\n else:\n sp.fail(\"Failed!\")\n\n\n.. _`temp_environ`:\n\n**temp_environ**\n/////////////////\n\nSets a temporary environment context to freely manipulate ``os.environ`` which will\nbe reset upon exiting the context.\n\n\n.. code:: python\n\n >>> os.environ['MY_KEY'] = \"test\"\n >>> os.environ['MY_KEY']\n 'test'\n >>> with vistir.contextmanagers.temp_environ():\n os.environ['MY_KEY'] = \"another thing\"\n print(\"New key: %s\" % os.environ['MY_KEY'])\n New key: another thing\n >>> os.environ['MY_KEY']\n 'test'\n\n\n.. _`temp_path`:\n\n**temp_path**\n//////////////\n\nSets a temporary environment context to freely manipulate ``sys.path`` which will\nbe reset upon exiting the context.\n\n\n.. code:: python\n\n >>> path_from_virtualenv = load_path(\"/path/to/venv/bin/python\")\n >>> print(sys.path)\n ['/home/user/.pyenv/versions/3.7.0/bin', '/home/user/.pyenv/versions/3.7.0/lib/python37.zip', '/home/user/.pyenv/versions/3.7.0/lib/python3.7', '/home/user/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload', '/home/user/.pyenv/versions/3.7.0/lib/python3.7/site-packages']\n >>> with temp_path():\n sys.path = path_from_virtualenv\n # Running in the context of the path above\n run([\"pip\", \"install\", \"stuff\"])\n >>> print(sys.path)\n ['/home/user/.pyenv/versions/3.7.0/bin', '/home/user/.pyenv/versions/3.7.0/lib/python37.zip', '/home/user/.pyenv/versions/3.7.0/lib/python3.7', '/home/user/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload', '/home/user/.pyenv/versions/3.7.0/lib/python3.7/site-packages']\n\n\n\ud83d\udc09 Cursor Utilities\n--------------------------\n\nThe following Cursor utilities are available to manipulate the console cursor:\n\n * ``vistir.cursor.hide_cursor``\n * ``vistir.cursor.show_cursor``\n\n\n.. _`hide_cursor`:\n\n**hide_cursor**\n/////////////////\n\nHide the console cursor in the given stream.\n\n.. code:: python\n\n >>> vistir.cursor.hide_cursor(stream=sys.stdout)\n\n\n.. _`show_cursor`:\n\n**show_cursor**\n/////////////////\n\nShow the console cursor in the given stream.\n\n.. code:: python\n\n >>> vistir.cursor.show_cursor(stream=sys.stdout)\n\n\n\ud83d\udc09 Miscellaneous Utilities\n--------------------------\n\nThe following Miscellaneous utilities are available as helper methods:\n\n * ``vistir.misc.shell_escape``\n * ``vistir.misc.unnest``\n * ``vistir.misc.dedup``\n * ``vistir.misc.run``\n * ``vistir.misc.load_path``\n * ``vistir.misc.partialclass``\n * ``vistir.misc.to_text``\n * ``vistir.misc.to_bytes``\n * ``vistir.misc.divide``\n * ``vistir.misc.take``\n * ``vistir.misc.chunked``\n * ``vistir.misc.decode_for_output``\n * ``vistir.misc.get_canonical_encoding_name``\n * ``vistir.misc.get_wrapped_stream``\n * ``vistir.misc.StreamWrapper``\n * ``vistir.misc.get_text_stream``\n * ``vistir.misc.replace_with_text_stream``\n * ``vistir.misc.get_text_stdin``\n * ``vistir.misc.get_text_stdout``\n * ``vistir.misc.get_text_stderr``\n * ``vistir.misc.echo``\n\n\n.. _`shell_escape`:\n\n**shell_escape**\n/////////////////\n\nEscapes a string for use as shell input when passing *shell=True* to ``os.Popen``.\n\n.. code:: python\n\n >>> vistir.misc.shell_escape(\"/tmp/test/test script.py hello\")\n '/tmp/test/test script.py hello'\n\n\n.. _`unnest`:\n\n**unnest**\n///////////\n\nUnnests nested iterables into a flattened one.\n\n.. code:: python\n\n >>> nested_iterable = (1234, (3456, 4398345, (234234)), (2396, (23895750, 9283798, 29384, (289375983275, 293759, 2347, (2098, 7987, 27599)))))\n >>> list(vistir.misc.unnest(nested_iterable))\n [1234, 3456, 4398345, 234234, 2396, 23895750, 9283798, 29384, 289375983275, 293759, 2347, 2098, 7987, 27599]\n\n\n.. _`dedup`:\n\n**dedup**\n//////////\n\nDeduplicates an iterable (like a ``set``, but preserving order).\n\n.. code:: python\n\n >>> iterable = [\"repeatedval\", \"uniqueval\", \"repeatedval\", \"anotherval\", \"somethingelse\"]\n >>> list(vistir.misc.dedup(iterable))\n ['repeatedval', 'uniqueval', 'anotherval', 'somethingelse']\n\n.. _`run`:\n\n**run**\n////////\n\nRuns the given command using ``subprocess.Popen`` and passing sane defaults.\n\n.. code:: python\n\n >>> out, err = vistir.run([\"cat\", \"/proc/version\"])\n >>> out\n 'Linux version 4.15.0-27-generic (buildd@lgw01-amd64-044) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #29-Ubuntu SMP Wed Jul 11 08:21:57 UTC 2018'\n\n\n.. _`load_path`:\n\n**load_path**\n//////////////\n\nLoad the ``sys.path`` from the given python executable's environment as json.\n\n.. code:: python\n\n >>> load_path(\"/home/user/.virtualenvs/requirementslib-5MhGuG3C/bin/python\")\n ['', '/home/user/.virtualenvs/requirementslib-5MhGuG3C/lib/python37.zip', '/home/user/.virtualenvs/requirementslib-5MhGuG3C/lib/python3.7', '/home/user/.virtualenvs/requirementslib-5MhGuG3C/lib/python3.7/lib-dynload', '/home/user/.pyenv/versions/3.7.0/lib/python3.7', '/home/user/.virtualenvs/requirementslib-5MhGuG3C/lib/python3.7/site-packages', '/home/user/git/requirementslib/src']\n\n\n.. _`partialclass`:\n\n**partialclass**\n/////////////////\n\nCreate a partially instantiated class.\n\n.. code:: python\n\n >>> source = partialclass(Source, url=\"https://pypi.org/simple\")\n >>> new_source = source(name=\"pypi\")\n >>> new_source\n <__main__.Source object at 0x7f23af189b38>\n >>> new_source.__dict__\n {'url': 'https://pypi.org/simple', 'verify_ssl': True, 'name': 'pypi'}\n\n\n.. _`to_text`:\n\n**to_text**\n////////////\n\nConvert arbitrary text-formattable input to text while handling errors.\n\n.. code:: python\n\n >>> vistir.misc.to_text(b\"these are bytes\")\n 'these are bytes'\n\n\n.. _`to_bytes`:\n\n**to_bytes**\n/////////////\n\nConverts arbitrary byte-convertable input to bytes while handling errors.\n\n.. code:: python\n\n >>> vistir.misc.to_bytes(\"this is some text\")\n b'this is some text'\n >>> vistir.misc.to_bytes(u\"this is some text\")\n b'this is some text'\n\n\n.. _`chunked`:\n\n**chunked**\n////////////\n\nSplits an iterable up into groups *of the specified length*, per `more itertools`_. Returns an iterable.\n\nThis example will create groups of chunk size **5**, which means there will be *6 groups*.\n\n.. code-block:: python\n\n >>> chunked_iterable = vistir.misc.chunked(5, range(30))\n >>> for chunk in chunked_iterable:\n ... add_to_some_queue(chunk)\n\n.. _more itertools: https://more-itertools.readthedocs.io/en/latest/api.html#grouping\n\n\n.. _`take`:\n\n**take**\n/////////\n\nTake elements from the supplied iterable without consuming it.\n\n.. code-block:: python\n\n >>> iterable = range(30)\n >>> first_10 = take(10, iterable)\n >>> [i for i in first_10]\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n >>> [i for i in iterable]\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n\n\n.. _`divide`:\n\n**divide**\n////////////\n\nSplits an iterable up into the *specified number of groups*, per `more itertools`_. Returns an iterable.\n\n.. code-block:: python\n\n >>> iterable = range(30)\n >>> groups = []\n >>> for grp in vistir.misc.divide(3, iterable):\n ... groups.append(grp)\n >>> groups\n [, , ]\n\n\n.. _more itertools: https://more-itertools.readthedocs.io/en/latest/api.html#grouping\n\n\n.. _`decode_for_output`:\n\n**decode_for_output**\n//////////////////////\n\nConverts an arbitrary text input to output which is encoded for printing to terminal\noutputs using the system preferred locale using ``locale.getpreferredencoding(False)``\nwith some additional hackery on linux systems.\n\n\n.. _`get_canonical_encoding_name`:\n\n**get_canonical_encoding_name**\n////////////////////////////////\n\nGiven an encoding name, get the canonical name from a codec lookup.\n\n.. code-block:: python\n\n >>> vistir.misc.get_canonical_encoding_name(\"utf8\")\n \"utf-8\"\n\n\n.. _`get_wrapped_stream`:\n\n**get_wrapped_stream**\n//////////////////////\n\nGiven a stream, wrap it in a `StreamWrapper` instance and return the wrapped stream.\n\n.. code-block:: python\n\n >>> stream = sys.stdout\n >>> wrapped_stream = vistir.misc.get_wrapped_stream(sys.stdout)\n >>> wrapped_stream.write(\"unicode\\u0141\")\n >>> wrapped_stream.seek(0)\n >>> wrapped_stream.read()\n \"unicode\\u0141\"\n\n\n.. _`StreamWrapper`:\n\n**StreamWrapper**\n//////////////////\n\nA stream wrapper and compatibility class for handling wrapping file-like stream objects\nwhich may be used in place of ``sys.stdout`` and other streams.\n\n.. code-block:: python\n\n >>> wrapped_stream = vistir.misc.StreamWrapper(sys.stdout, encoding=\"utf-8\", errors=\"replace\", line_buffering=True)\n >>> wrapped_stream = vistir.misc.StreamWrapper(io.StringIO(), encoding=\"utf-8\", errors=\"replace\", line_buffering=True)\n\n\n.. _`get_text_stream`:\n\n**get_text_stream**\n////////////////////\n\nAn implementation of the **StreamWrapper** for the purpose of wrapping **sys.stdin** or **sys.stdout**.\n\nOn Windows, this returns the appropriate handle to the requested output stream.\n\n.. code-block:: python\n\n >>> text_stream = vistir.misc.get_text_stream(\"stdout\")\n >>> sys.stdout = text_stream\n >>> sys.stdin = vistir.misc.get_text_stream(\"stdin\")\n >>> vistir.misc.echo(u\"\\0499\", fg=\"green\")\n \u0499\n\n\n.. _`replace_with_text_stream`:\n\n**replace_with_text_stream**\n/////////////////////////////\n\nGiven a text stream name, replaces the text stream with a **StreamWrapper** instance.\n\n\n.. code-block:: python\n\n >>> vistir.misc.replace_with_text_stream(\"stdout\")\n\nOnce invoked, the standard stream in question is replaced with the required wrapper,\nturning it into a ``TextIOWrapper`` compatible stream (which ensures that unicode\ncharacters can be written to it).\n\n\n.. _`get_text_stdin`:\n\n**get_text_stdin**\n///////////////////\n\nA helper function for calling **get_text_stream(\"stdin\")**.\n\n\n.. _`get_text_stdout`:\n\n**get_text_stdout**\n////////////////////\n\nA helper function for calling **get_text_stream(\"stdout\")**.\n\n\n.. _`get_text_stderr`:\n\n**get_text_stderr**\n////////////////////\n\nA helper function for calling **get_text_stream(\"stderr\")**.\n\n\n.. _`echo`:\n\n**echo**\n/////////\n\nWrites colored, stream-compatible output to the desired handle (``sys.stdout`` by default).\n\n.. code-block:: python\n\n >>> vistir.misc.echo(\"some text\", fg=\"green\", bg=\"black\", style=\"bold\", err=True) # write to stderr\n some text\n >>> vistir.misc.echo(\"some other text\", fg=\"cyan\", bg=\"white\", style=\"underline\") # write to stdout\n some other text\n\n\n\ud83d\udc09 Path Utilities\n------------------\n\n**vistir** provides utilities for interacting with filesystem paths:\n\n * ``vistir.path.get_converted_relative_path``\n * ``vistir.path.normalize_path``\n * ``vistir.path.is_in_path``\n * ``vistir.path.handle_remove_readonly``\n * ``vistir.path.is_file_url``\n * ``vistir.path.is_readonly_path``\n * ``vistir.path.is_valid_url``\n * ``vistir.path.mkdir_p``\n * ``vistir.path.ensure_mkdir_p``\n * ``vistir.path.create_tracked_tempdir``\n * ``vistir.path.create_tracked_tempfile``\n * ``vistir.path.path_to_url``\n * ``vistir.path.rmtree``\n * ``vistir.path.safe_expandvars``\n * ``vistir.path.set_write_bit``\n * ``vistir.path.url_to_path``\n * ``vistir.path.walk_up``\n\n\n.. _`normalize_path`:\n\n**normalize_path**\n//////////////////\n\nReturn a case-normalized absolute variable-expanded path.\n\n\n.. code:: python\n\n >>> vistir.path.normalize_path(\"~/${USER}\")\n /home/user/user\n\n\n.. _`is_in_path`:\n\n**is_in_path**\n//////////////\n\nDetermine if the provided full path is in the given parent root.\n\n\n.. code:: python\n\n >>> vistir.path.is_in_path(\"~/.pyenv/versions/3.7.1/bin/python\", \"${PYENV_ROOT}/versions\")\n True\n\n\n.. _`get_converted_relative_path`:\n\n**get_converted_relative_path**\n////////////////////////////////\n\nConvert the supplied path to a relative path (relative to ``os.curdir``)\n\n\n.. code:: python\n\n >>> os.chdir('/home/user/code/myrepo/myfolder')\n >>> vistir.path.get_converted_relative_path('/home/user/code/file.zip')\n './../../file.zip'\n >>> vistir.path.get_converted_relative_path('/home/user/code/myrepo/myfolder/mysubfolder')\n './mysubfolder'\n >>> vistir.path.get_converted_relative_path('/home/user/code/myrepo/myfolder')\n '.'\n\n\n.. _`handle_remove_readonly`:\n\n**handle_remove_readonly**\n///////////////////////////\n\nError handler for shutil.rmtree.\n\nWindows source repo folders are read-only by default, so this error handler attempts to\nset them as writeable and then proceed with deletion.\n\nThis function will call check ``vistir.path.is_readonly_path`` before attempting to\ncall ``vistir.path.set_write_bit`` on the target path and try again.\n\n\n.. _`is_file_url`:\n\n**is_file_url**\n////////////////\n\nChecks whether the given url is a properly formatted ``file://`` uri.\n\n.. code:: python\n\n >>> vistir.path.is_file_url('file:///home/user/somefile.zip')\n True\n >>> vistir.path.is_file_url('/home/user/somefile.zip')\n False\n\n\n.. _`is_readonly_path`:\n\n**is_readonly_path**\n/////////////////////\n\nCheck if a provided path exists and is readonly by checking for ``bool(path.stat & stat.S_IREAD) and not os.access(path, os.W_OK)``\n\n.. code:: python\n\n >>> vistir.path.is_readonly_path('/etc/passwd')\n True\n >>> vistir.path.is_readonly_path('/home/user/.bashrc')\n False\n\n\n.. _`is_valid_url`:\n\n**is_valid_url**\n/////////////////\n\nChecks whether a URL is valid and parseable by checking for the presence of a scheme and\na netloc.\n\n.. code:: python\n\n >>> vistir.path.is_valid_url(\"https://google.com\")\n True\n >>> vistir.path.is_valid_url(\"/home/user/somefile\")\n False\n\n\n.. _`mkdir_p`:\n\n**mkdir_p**\n/////////////\n\nRecursively creates the target directory and all of its parents if they do not\nalready exist. Fails silently if they do.\n\n.. code:: python\n\n >>> os.mkdir('/tmp/test_dir')\n >>> os.listdir('/tmp/test_dir')\n []\n >>> vistir.path.mkdir_p('/tmp/test_dir/child/subchild/subsubchild')\n >>> os.listdir('/tmp/test_dir/child/subchild')\n ['subsubchild']\n\n\n.. _`ensure_mkdir_p`:\n\n**ensure_mkdir_p**\n///////////////////\n\nA decorator which ensures that the caller function's return value is created as a\ndirectory on the filesystem.\n\n.. code:: python\n\n >>> @ensure_mkdir_p\n def return_fake_value(path):\n return path\n >>> return_fake_value('/tmp/test_dir')\n >>> os.listdir('/tmp/test_dir')\n []\n >>> return_fake_value('/tmp/test_dir/child/subchild/subsubchild')\n >>> os.listdir('/tmp/test_dir/child/subchild')\n ['subsubchild']\n\n\n.. _`create_tracked_tempdir`:\n\n**create_tracked_tempdir**\n////////////////////////////\n\nCreates a tracked temporary directory using ``vistir.path.TemporaryDirectory``, but does\nnot remove the directory when the return value goes out of scope, instead registers a\nhandler to cleanup on program exit.\n\n.. code:: python\n\n >>> temp_dir = vistir.path.create_tracked_tempdir(prefix=\"test_dir\")\n >>> assert temp_dir.startswith(\"test_dir\")\n True\n >>> with vistir.path.create_tracked_tempdir(prefix=\"test_dir\") as temp_dir:\n with io.open(os.path.join(temp_dir, \"test_file.txt\"), \"w\") as fh:\n fh.write(\"this is a test\")\n >>> os.listdir(temp_dir)\n\n\n.. _`create_tracked_tempfile`:\n\n**create_tracked_tempfile**\n////////////////////////////\n\nCreates a tracked temporary file using ``vistir.compat.NamedTemporaryFile``, but creates\na ``weakref.finalize`` call which will detach on garbage collection to close and delete\nthe file.\n\n.. code:: python\n\n >>> temp_file = vistir.path.create_tracked_tempfile(prefix=\"requirements\", suffix=\"txt\")\n >>> temp_file.write(\"some\\nstuff\")\n >>> exit()\n\n\n.. _`path_to_url`:\n\n**path_to_url**\n////////////////\n\nConvert the supplied local path to a file uri.\n\n.. code:: python\n\n >>> path_to_url(\"/home/user/code/myrepo/myfile.zip\")\n 'file:///home/user/code/myrepo/myfile.zip'\n\n\n.. _`rmtree`:\n\n**rmtree**\n///////////\n\nStand-in for ``shutil.rmtree`` with additional error-handling.\n\nThis version of `rmtree` handles read-only paths, especially in the case of index files\nwritten by certain source control systems.\n\n.. code:: python\n\n >>> vistir.path.rmtree('/tmp/test_dir')\n >>> [d for d in os.listdir('/tmp') if 'test_dir' in d]\n []\n\n.. note::\n\n Setting `ignore_errors=True` may cause this to silently fail to delete the path\n\n\n.. _`safe_expandvars`:\n\n**safe_expandvars**\n////////////////////\n\nCall ``os.path.expandvars`` if value is a string, otherwise do nothing.\n\n.. code:: python\n\n >>> os.environ['TEST_VAR'] = \"MY_TEST_VALUE\"\n >>> vistir.path.safe_expandvars(\"https://myuser:${TEST_VAR}@myfakewebsite.com\")\n 'https://myuser:MY_TEST_VALUE@myfakewebsite.com'\n\n\n.. _`set_write_bit`:\n\n**set_write_bit**\n//////////////////\n\nSet read-write permissions for the current user on the target path. Fail silently\nif the path doesn't exist.\n\n.. code:: python\n\n >>> vistir.path.set_write_bit('/path/to/some/file')\n >>> with open('/path/to/some/file', 'w') as fh:\n fh.write(\"test text!\")\n\n\n.. _`url_to_path`:\n\n**url_to_path**\n////////////////\n\nConvert a valid file url to a local filesystem path. Follows logic taken from pip.\n\n.. code:: python\n\n >>> vistir.path.url_to_path(\"file:///home/user/somefile.zip\")\n '/home/user/somefile.zip'\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/sarugaku/vistir", "keywords": "tools,utilities,backports,paths,spinner,subprocess,filesystem", "license": "ISC License", "maintainer": "", "maintainer_email": "", "name": "vistir", "package_url": "https://pypi.org/project/vistir/", "platform": "", "project_url": "https://pypi.org/project/vistir/", "project_urls": { "Homepage": "https://github.com/sarugaku/vistir" }, "release_url": "https://pypi.org/project/vistir/0.4.3/", "requires_dist": [ "colorama (>=0.3.4)", "requests", "six", "pathlib2 ; python_version < \"3.5\"", "backports.functools-lru-cache ; python_version == \"2.7\"", "backports.shutil-get-terminal-size ; python_version == \"2.7\"", "backports.weakref ; python_version == \"2.7\"", "pre-commit ; extra == 'dev'", "coverage (<5.0) ; extra == 'dev'", "isort ; extra == 'dev'", "flake8 ; extra == 'dev'", "rope ; extra == 'dev'", "invoke ; extra == 'dev'", "parver ; extra == 'dev'", "sphinx ; extra == 'dev'", "sphinx-rtd-theme ; extra == 'dev'", "flake8-bugbear ; (python_version >= \"3.5\") and extra == 'dev'", "black ; (python_version >= \"3.6\") and extra == 'dev'", "yaspin ; extra == 'spinner'", "twine ; extra == 'tests'", "readme-renderer[md] ; extra == 'tests'", "pytest ; extra == 'tests'", "pytest-xdist ; extra == 'tests'", "pytest-cov ; extra == 'tests'", "pytest-timeout ; extra == 'tests'", "hypothesis-fspaths ; extra == 'tests'", "hypothesis ; extra == 'tests'", "mypy ; (python_version >= \"3.4\") and extra == 'typing'", "mypy-extensions ; (python_version >= \"3.4\") and extra == 'typing'", "mypytools ; (python_version >= \"3.4\") and extra == 'typing'", "pytype ; (python_version >= \"3.4\") and extra == 'typing'", "typed-ast ; (python_version >= \"3.4\") and extra == 'typing'" ], "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "summary": "Miscellaneous utilities for dealing with filesystems, paths, projects, subprocesses, and more.", "version": "0.4.3" }, "last_serial": 5504743, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d1220b8a54559940c38e0348864caa2c", "sha256": "8c0571bcecc4785edead8c4f80381a1ce59ee2b838ebf536fc49918ddf0572a6" }, "downloads": -1, "filename": "vistir-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d1220b8a54559940c38e0348864caa2c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 21014, "upload_time": "2018-08-13T15:42:17", "url": "https://files.pythonhosted.org/packages/91/aa/f3798352b5e0bce663d613f60b829e5d5c94606921b587bf8cd98af3855a/vistir-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca060f62ff846403e3eb46ec9e7388c5", "sha256": "112afd88af2921e39c76ec713a31b3fe01419c9149e1ac2dbe0c7d6f3cea67d7" }, "downloads": -1, "filename": "vistir-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ca060f62ff846403e3eb46ec9e7388c5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 23068, "upload_time": "2018-08-13T15:42:19", "url": "https://files.pythonhosted.org/packages/56/bd/3e5cd2fea75c10e54e61c78b02c1bf209aa4c68803dc0a166cf46d2423b9/vistir-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "f814e73eaf1dfce83e6561b6416b9fd1", "sha256": "dd60114001c636d72779c3cf985ef0516bd013c65998d183d52cd97fda85bff2" }, "downloads": -1, "filename": "vistir-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f814e73eaf1dfce83e6561b6416b9fd1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 22705, "upload_time": "2018-08-15T00:24:57", "url": "https://files.pythonhosted.org/packages/c3/69/c4f9cc7f7f926f0a3d561c838a417be5f709c46a35c52cdc904e09b09311/vistir-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1efd27d2ae0f65e762331030693e8f2b", "sha256": "d0c5e0a3f0d8684ad7107bd260a7fcfb050a8bc514a95d2d034fc55bc6e80cc2" }, "downloads": -1, "filename": "vistir-0.1.1.tar.gz", "has_sig": false, "md5_digest": "1efd27d2ae0f65e762331030693e8f2b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 29986, "upload_time": "2018-08-15T00:24:58", "url": "https://files.pythonhosted.org/packages/bf/78/c973f08ae4a9b5493ebda890cca6421c1e11cd0ae4b19a936a5dc698c925/vistir-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "477e9cb8ce48f5e47b535b68b5436483", "sha256": "a455d73376b447eaa8ce207c30bb3229a03117eeb9b3719a78146d2d9fd1cc97" }, "downloads": -1, "filename": "vistir-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "477e9cb8ce48f5e47b535b68b5436483", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 22717, "upload_time": "2018-08-18T04:07:09", "url": "https://files.pythonhosted.org/packages/45/d1/9f1fd1faed823eeb32cb4d1373b2d51a1518d80a7f913f5a43a7822d4d93/vistir-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "85fdc65239b0ab6a284401f2ae71fcea", "sha256": "a660c06fe21cfd25731a4fb074b8af2476f47247e27e8bc818d46efd86b04ad9" }, "downloads": -1, "filename": "vistir-0.1.2.tar.gz", "has_sig": false, "md5_digest": "85fdc65239b0ab6a284401f2ae71fcea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 30034, "upload_time": "2018-08-18T04:07:10", "url": "https://files.pythonhosted.org/packages/d3/75/b20860d64f2d1ca2278dfac79d37a214ffd29f1d4cfd85eb65b14e1a6f43/vistir-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "4218d260c7a328cd477c5de79eb0d7c6", "sha256": "05e6ca13f8c6c1068455f0ce5295441394af680f1f2f164de9356a16556d27d6" }, "downloads": -1, "filename": "vistir-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4218d260c7a328cd477c5de79eb0d7c6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 22731, "upload_time": "2018-08-18T09:00:35", "url": "https://files.pythonhosted.org/packages/ba/e4/dc43df0515790ca4ea8f60f8b7bc13665e2b2b03f3d10a77265e23d1f4b8/vistir-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5da97b3dd37bd2b68566f76b2319c4c5", "sha256": "48c03727910c87f686449c7b2fdcb559e6d85644453057c526fa62583e3f22ff" }, "downloads": -1, "filename": "vistir-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5da97b3dd37bd2b68566f76b2319c4c5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 30152, "upload_time": "2018-08-18T09:00:36", "url": "https://files.pythonhosted.org/packages/5c/18/170027f32e15bcc62522a8554b6bd1f8fd578a43b144e50c575192b13f54/vistir-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "f9f166489a9675c6dcb401063ef287f5", "sha256": "f447923d4c59e8d50add4a9d8275b25a1f038f1a1a00ded50ee3c3d00a3c7f5d" }, "downloads": -1, "filename": "vistir-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f9f166489a9675c6dcb401063ef287f5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 23384, "upload_time": "2018-08-18T18:33:05", "url": "https://files.pythonhosted.org/packages/1b/3e/04152ec3a44655f1f90fc49cb3b5663b2e060d0a3cfc1e4b62b87e898ec9/vistir-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b820156a98ae78f5d282d22a60067f44", "sha256": "011e52dd2e09f948f638262dc39fef38998d134538705a810e88ad6d7bb94c1c" }, "downloads": -1, "filename": "vistir-0.1.4.tar.gz", "has_sig": false, "md5_digest": "b820156a98ae78f5d282d22a60067f44", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 31384, "upload_time": "2018-08-18T18:33:06", "url": "https://files.pythonhosted.org/packages/55/7c/50ba96a03851a3960bd541ae29619511f14a52c1d69c7a3dcc52871668f3/vistir-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "5457301cbbb552e2078e6fe926418c92", "sha256": "49f83c25498edbf3c75b7c9586f5ff75e16be60e50cc5d03f1d692b483a8e46e" }, "downloads": -1, "filename": "vistir-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5457301cbbb552e2078e6fe926418c92", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 24039, "upload_time": "2018-09-07T06:04:52", "url": "https://files.pythonhosted.org/packages/1b/09/b5ecf1a67d1f7a482b41b49b5e43b5521a596043065ee8a8f6df454ba00f/vistir-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d86aa0e2398dae1c14d1eb68ceaed8c", "sha256": "753582db17c8a84d77b9eda5616e7421ec3b46ffe2a146ae39c6d05891bc56a4" }, "downloads": -1, "filename": "vistir-0.1.5.tar.gz", "has_sig": false, "md5_digest": "0d86aa0e2398dae1c14d1eb68ceaed8c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 32364, "upload_time": "2018-09-07T06:04:54", "url": "https://files.pythonhosted.org/packages/a0/ab/fef292df165088d88d758c39a09940385e13e582dfbca2037e75889da3b5/vistir-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "ffe02eb915ede502aaf066f24b01dd7d", "sha256": "8a360ac20cbcc0863d6dbbe7a52e8b2c9ebf48abd6833c3813a82c70708244af" }, "downloads": -1, "filename": "vistir-0.1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ffe02eb915ede502aaf066f24b01dd7d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 24321, "upload_time": "2018-09-13T06:45:05", "url": "https://files.pythonhosted.org/packages/5e/12/7c7ac2d2b16c6c296bcc83b0748650c3d6cda642718af6d7581f7a8d8041/vistir-0.1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8f382bc838185efa8dbd85f9ae126b55", "sha256": "bc6e10284792485c10585536e6aede9e38996c841cc9d2a67238cd05742c2d0b" }, "downloads": -1, "filename": "vistir-0.1.6.tar.gz", "has_sig": false, "md5_digest": "8f382bc838185efa8dbd85f9ae126b55", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 32769, "upload_time": "2018-09-13T06:45:06", "url": "https://files.pythonhosted.org/packages/62/26/31c1411bd7ea67e13cbd2fb84fe34af285e64fab95aca8f110cb1461f2a6/vistir-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "1d5d0f4b35e2e4b80b3fb88e825dae9c", "sha256": "0c62181f430164764714b7cad4fd5b98f9f34afca36a278b942b99502c2dfb0b" }, "downloads": -1, "filename": "vistir-0.1.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1d5d0f4b35e2e4b80b3fb88e825dae9c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 24937, "upload_time": "2018-10-11T10:13:59", "url": "https://files.pythonhosted.org/packages/a5/02/1c6b3761a351a0c26e13e90fd933bde0fc0ed037e42563f5085a0a8dd2e0/vistir-0.1.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7833784ad33938fcde88bd362d9fbd16", "sha256": "06e9d8b26d757e6a5d3a168463023067b3ef2be2793d6a5887f6c4496c82b2b9" }, "downloads": -1, "filename": "vistir-0.1.7.tar.gz", "has_sig": false, "md5_digest": "7833784ad33938fcde88bd362d9fbd16", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 33443, "upload_time": "2018-10-11T10:14:00", "url": "https://files.pythonhosted.org/packages/3d/b2/44ef429d97b22ed76f697ed849074c76ee4c20415d77f077e96ad26c5055/vistir-0.1.7.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "7232dd960275a6d70e70b73c477efafa", "sha256": "d3e610ced2ec3fed5db2d1ce27d80d156e7044003052341fcea9ef2304921f0c" }, "downloads": -1, "filename": "vistir-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7232dd960275a6d70e70b73c477efafa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 31121, "upload_time": "2018-10-24T23:11:52", "url": "https://files.pythonhosted.org/packages/04/36/ba8c635b351069f9d74bb9710ce4668b83f165f33512afd3145bb31605fa/vistir-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06f44ef3e1a61735499f0036d9000340", "sha256": "d88c6a52b30e64d79c2377e27b7804a3883231a3088110aa90261a3dbff71ddc" }, "downloads": -1, "filename": "vistir-0.2.0.tar.gz", "has_sig": false, "md5_digest": "06f44ef3e1a61735499f0036d9000340", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 39720, "upload_time": "2018-10-24T23:11:53", "url": "https://files.pythonhosted.org/packages/21/ac/c407364184f5fae23a0464fd288fbc2913a71653f22c1ccb413c91521489/vistir-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "2756cb239abdcfd0ba44b8ef45de2d84", "sha256": "2b30be2d77733e5cce66c244debff8d2bf63a8a74ca7a98bb8a9f5727f604bdc" }, "downloads": -1, "filename": "vistir-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2756cb239abdcfd0ba44b8ef45de2d84", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 32043, "upload_time": "2018-10-26T14:37:41", "url": "https://files.pythonhosted.org/packages/47/bb/429db22d1a39d4326a2c8880a7d6f29460166c8d251c8c370cfa6293cd06/vistir-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f3377627b27023dd68492c6af6173e46", "sha256": "664cb1f95037a60f51d297c2d7416a6b2e6908b8afec2695ac2314c3875e9094" }, "downloads": -1, "filename": "vistir-0.2.1.tar.gz", "has_sig": false, "md5_digest": "f3377627b27023dd68492c6af6173e46", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 40804, "upload_time": "2018-10-26T14:37:43", "url": "https://files.pythonhosted.org/packages/10/3a/c9f01246b36a444bc8e15a2f65d3000cbfa4e65004fc4c7736ffac89faf5/vistir-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "158c71204d83a7a070421a8bc66c88e4", "sha256": "de1e99b2a7cb590554230ad6529f43085f5001b5dad55e165bc2ac7a8fa7fba0" }, "downloads": -1, "filename": "vistir-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "158c71204d83a7a070421a8bc66c88e4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 32059, "upload_time": "2018-10-26T20:46:30", "url": "https://files.pythonhosted.org/packages/dc/03/7dfaa6725a42e7d848ddf1c0d01a0a59f2006f5cf7d190aa376831af486d/vistir-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "19a1cc43084f83f55e077190e73cb0c9", "sha256": "6ebfa8e12317c082cdf4224ee95bf5a3c09719e23208d1561facc066d687549e" }, "downloads": -1, "filename": "vistir-0.2.2.tar.gz", "has_sig": false, "md5_digest": "19a1cc43084f83f55e077190e73cb0c9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 40890, "upload_time": "2018-10-26T20:46:31", "url": "https://files.pythonhosted.org/packages/5f/2e/f7204f0cbf5d26ded2a1a885ddbf3f491eace117b1a72343915776937fa5/vistir-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "391a53060cfb4c97e05e680b9d99bb68", "sha256": "e39bcd071fb9741c8aad03c99fa54f3b4b9c2a839ce2ea824bfc82d22c8c567a" }, "downloads": -1, "filename": "vistir-0.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "391a53060cfb4c97e05e680b9d99bb68", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 32721, "upload_time": "2018-10-29T13:40:23", "url": "https://files.pythonhosted.org/packages/f3/5e/21bef2ffebaddb3558e9e30cca204a5af85f73050f906c341b9581b14c8b/vistir-0.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02a19f478db3d75a4abfd6b0a7874530", "sha256": "ffb520c1cc315ebb51bba9925e5ce5d09377f3f67c2e1a7fd616247aac2db216" }, "downloads": -1, "filename": "vistir-0.2.3.tar.gz", "has_sig": false, "md5_digest": "02a19f478db3d75a4abfd6b0a7874530", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 41885, "upload_time": "2018-10-29T13:40:25", "url": "https://files.pythonhosted.org/packages/65/60/f4ad7d2c18e793c24e5956ccb0aadbdb622c7b3e60a4055669055d872ac4/vistir-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "194da6fade965982c01ab5d0794dd1e3", "sha256": "851bd783f2b85a372e563db741dc689cb9263ce2e067e387facdca0c36b6a6ea" }, "downloads": -1, "filename": "vistir-0.2.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "194da6fade965982c01ab5d0794dd1e3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 33269, "upload_time": "2018-11-12T17:25:39", "url": "https://files.pythonhosted.org/packages/3a/44/a7e8cc7eb8ba7d06940a1cc31b2a2bf091607b4fd70ae931348ece193297/vistir-0.2.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6e9b1a15a18ec811b0bb6668b3bad0da", "sha256": "b38ffc8ef83f85d81b4efa4cd31ea3bcd37bdb2bc9e8da9f20a40859bc44b57e" }, "downloads": -1, "filename": "vistir-0.2.4.tar.gz", "has_sig": false, "md5_digest": "6e9b1a15a18ec811b0bb6668b3bad0da", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 42670, "upload_time": "2018-11-12T17:25:40", "url": "https://files.pythonhosted.org/packages/e9/23/fc1acce6e096bf8eb93491ba1c69dc16e65603c10489025f4cdb8cc2ce85/vistir-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "e1306aee0036e83bb405bef3299b9fad", "sha256": "6d2005ad670f77bd9c9b5415c4e2a4a20dce5b0cf0e0d11598eb463b2e0ebe44" }, "downloads": -1, "filename": "vistir-0.2.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e1306aee0036e83bb405bef3299b9fad", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 34479, "upload_time": "2018-11-21T06:32:47", "url": "https://files.pythonhosted.org/packages/27/14/4df3568db6b2fb8cf4a7ca209f74bd6644ebaf49862432af107783fdb4f8/vistir-0.2.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f8aeb421016899f4e6866c0c17ccce5", "sha256": "3a1020fb7be000b268af96641ced9ead844b1f75840c41e20e473647688fc630" }, "downloads": -1, "filename": "vistir-0.2.5.tar.gz", "has_sig": false, "md5_digest": "9f8aeb421016899f4e6866c0c17ccce5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 44171, "upload_time": "2018-11-21T06:32:49", "url": "https://files.pythonhosted.org/packages/76/4c/1336d581f09fcd4dbd26f12a8c634a36a561e9fd4f600f4aadb6ae87d8df/vistir-0.2.5.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c2e45ab5e77afc4666e2a8c3c10dde12", "sha256": "fc5cca7a14e92feaa6f85dd91da74d834904280a96a21190aecb4cd1d1048e0e" }, "downloads": -1, "filename": "vistir-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c2e45ab5e77afc4666e2a8c3c10dde12", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 37884, "upload_time": "2019-01-02T04:02:57", "url": "https://files.pythonhosted.org/packages/51/a5/40d1fc46065f8417ee71742717de67a182b1092228e970625d3485b6bbc5/vistir-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b69a1db60cb92a9ea6d3b8374cdbddb", "sha256": "510408ec63a4b423967fd630bf0885c8d6a1d5d126f8bb1be6aba86a0da5e815" }, "downloads": -1, "filename": "vistir-0.3.0.tar.gz", "has_sig": false, "md5_digest": "9b69a1db60cb92a9ea6d3b8374cdbddb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 54174, "upload_time": "2019-01-02T04:02:59", "url": "https://files.pythonhosted.org/packages/15/44/a44f71b3e470ad799d599234716856bdd050272810ce4a3dadd872d2f9a2/vistir-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "ec681aec3d046274b1bd0e500dae492b", "sha256": "68896b279f64ff078e06ffd41f77181ef7cdedbeaa5f453cae3cfdd97d41dbcf" }, "downloads": -1, "filename": "vistir-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ec681aec3d046274b1bd0e500dae492b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 39242, "upload_time": "2019-03-03T03:00:41", "url": "https://files.pythonhosted.org/packages/a5/86/32fa3d59465e48a1f277a0c29efd51d2dceda43f92b302a5ac9b20811fa9/vistir-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "da0e010648fb7012714faf77b1551993", "sha256": "1a3d16d541de7ff098037260506a9efc5f6967176137988bd2cbfdd13b240ba0" }, "downloads": -1, "filename": "vistir-0.3.1.tar.gz", "has_sig": false, "md5_digest": "da0e010648fb7012714faf77b1551993", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 56247, "upload_time": "2019-03-03T03:00:43", "url": "https://files.pythonhosted.org/packages/8f/56/6065e74a2a22730fd39d204a4c7792686507dfafa90237cf585b039a833e/vistir-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "bfb091a19e352a66d0cceb9ee8e2b82a", "sha256": "9564bd162df8d0078b41e6a9bd93c3cc9543bfb542443bcd251b83620f362cb4" }, "downloads": -1, "filename": "vistir-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bfb091a19e352a66d0cceb9ee8e2b82a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 46622, "upload_time": "2019-04-10T20:48:18", "url": "https://files.pythonhosted.org/packages/24/85/2e1d8d3a02aa31fb3a9efa2643907c139094155e386e65134a67d8d3c346/vistir-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a82084abf2cb32115b99e5e196d4a06", "sha256": "199a6031b02d1df216f05e170a04f8ae3568846baf8561cf8a029d821f2ee587" }, "downloads": -1, "filename": "vistir-0.4.0.tar.gz", "has_sig": false, "md5_digest": "5a82084abf2cb32115b99e5e196d4a06", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0,!=3.1,!=3.2,!=3.3", "size": 66373, "upload_time": "2019-04-10T20:48:20", "url": "https://files.pythonhosted.org/packages/f4/27/53e8cc309d5e723ebd4eb25a55094e0171f46decd8498d2fa749832af236/vistir-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "e4a91710ac54a4ca2d8400c2435d1c94", "sha256": "00af96b75157b299616f47657ed34368e92e01d039100368c9dcd94897e3c109" }, "downloads": -1, "filename": "vistir-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e4a91710ac54a4ca2d8400c2435d1c94", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 51779, "upload_time": "2019-05-15T02:55:01", "url": "https://files.pythonhosted.org/packages/0c/d9/ad0be8a0421b2064c0cd441893d7c2333fff44301f3007cbcf15fa302003/vistir-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0636bc2dc92df19f16f9555428ee424c", "sha256": "bbe040ce656f1de9b5f75c953abe49af4d1ba6fdf8f1f4b8db3e63cfd2dad24a" }, "downloads": -1, "filename": "vistir-0.4.1.tar.gz", "has_sig": false, "md5_digest": "0636bc2dc92df19f16f9555428ee424c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 71278, "upload_time": "2019-05-15T02:55:03", "url": "https://files.pythonhosted.org/packages/16/1b/c0c3b406b69c7b60079536e6ee0d2e9c14cb4159161c26d9131514a5afdd/vistir-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "22605d209963a18442ccebdeb6624444", "sha256": "588b81ce97fb2b7429ae7b0443a28be8e0c85bb1d0ba7a4296775035c4156760" }, "downloads": -1, "filename": "vistir-0.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "22605d209963a18442ccebdeb6624444", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 52054, "upload_time": "2019-05-19T22:48:30", "url": "https://files.pythonhosted.org/packages/a2/07/d664bdd27bace31ee7b86118c768c591acd3444f5adadd16836d69b3e616/vistir-0.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "456452ec699cb644ea5f9c509d878154", "sha256": "84f4ca78c5b0051ba407f18a97ea52eae6c415efb65c5ea019afeea16528799a" }, "downloads": -1, "filename": "vistir-0.4.2.tar.gz", "has_sig": false, "md5_digest": "456452ec699cb644ea5f9c509d878154", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 71656, "upload_time": "2019-05-19T22:48:33", "url": "https://files.pythonhosted.org/packages/06/99/e488105e088ab0386d98e6652136799495706e2929a624ecdf76d422892c/vistir-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "328b4aa81746fe1439d0529f0fc7199b", "sha256": "3a0529b4b6c2e842fd19b5ceaa95b6c9201321314825c110406d4af3331a0709" }, "downloads": -1, "filename": "vistir-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "328b4aa81746fe1439d0529f0fc7199b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 52186, "upload_time": "2019-07-09T04:53:58", "url": "https://files.pythonhosted.org/packages/67/71/a8ae9a0a8b799e2a6a1a3adde5351f5ddefb54de2c07668985ed13e5ac1e/vistir-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17769ee1c89624edee7c7000757d8832", "sha256": "2166e3148a67c438c9e3edbba0cde153d42dec6e3bf5d8f4624feb27686c0990" }, "downloads": -1, "filename": "vistir-0.4.3.tar.gz", "has_sig": false, "md5_digest": "17769ee1c89624edee7c7000757d8832", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 73348, "upload_time": "2019-07-09T04:54:00", "url": "https://files.pythonhosted.org/packages/1e/5e/2890afa99a47f609746bd1b82164d54c6e8f574ef6ca7819ab37b60edd43/vistir-0.4.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "328b4aa81746fe1439d0529f0fc7199b", "sha256": "3a0529b4b6c2e842fd19b5ceaa95b6c9201321314825c110406d4af3331a0709" }, "downloads": -1, "filename": "vistir-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "328b4aa81746fe1439d0529f0fc7199b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 52186, "upload_time": "2019-07-09T04:53:58", "url": "https://files.pythonhosted.org/packages/67/71/a8ae9a0a8b799e2a6a1a3adde5351f5ddefb54de2c07668985ed13e5ac1e/vistir-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17769ee1c89624edee7c7000757d8832", "sha256": "2166e3148a67c438c9e3edbba0cde153d42dec6e3bf5d8f4624feb27686c0990" }, "downloads": -1, "filename": "vistir-0.4.3.tar.gz", "has_sig": false, "md5_digest": "17769ee1c89624edee7c7000757d8832", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3", "size": 73348, "upload_time": "2019-07-09T04:54:00", "url": "https://files.pythonhosted.org/packages/1e/5e/2890afa99a47f609746bd1b82164d54c6e8f574ef6ca7819ab37b60edd43/vistir-0.4.3.tar.gz" } ] }