Hello community, here is the log from the commit of package python-plumbum for openSUSE:Factory checked in at 2020-04-27 23:37:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-plumbum (Old) and /work/SRC/openSUSE:Factory/.python-plumbum.new.2738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-plumbum" Mon Apr 27 23:37:07 2020 rev:5 rq:798106 version:1.6.9 Changes: -------- --- /work/SRC/openSUSE:Factory/python-plumbum/python-plumbum.changes 2020-03-18 12:50:36.717146742 +0100 +++ /work/SRC/openSUSE:Factory/.python-plumbum.new.2738/python-plumbum.changes 2020-04-27 23:37:09.823381014 +0200 @@ -1,0 +2,13 @@ +Mon Apr 27 07:26:40 UTC 2020 - Tomáš Chvátal <[email protected]> + +- Add patch fixing build with no python2 available: + * no-python2.patch +- Update to 1.6.9: + * Last version to support Python 2.6; added python_requires (#507) + * Paths: Fix bug with subscription operations (#498), (#506) + * Paths: Fix resolve (#492) + * Commands: Fix resolve (#491) + * Commands: Add context manager on popen (#495) + * Several smaller fixes (#500), (#505) + +------------------------------------------------------------------- Old: ---- v1.6.8.tar.gz New: ---- no-python2.patch v1.6.9.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-plumbum.spec ++++++ --- /var/tmp/diff_new_pack.YS6cIS/_old 2020-04-27 23:37:10.659382646 +0200 +++ /var/tmp/diff_new_pack.YS6cIS/_new 2020-04-27 23:37:10.663382654 +0200 @@ -18,13 +18,13 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-plumbum -Version: 1.6.8 +Version: 1.6.9 Release: 0 Summary: Shell combinators library License: MIT -Group: Development/Languages/Python URL: https://github.com/tomerfiliba/plumbum Source: https://github.com/tomerfiliba/plumbum/archive/v%{version}.tar.gz +Patch0: no-python2.patch BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros @@ -51,6 +51,7 @@ %prep %setup -q -n plumbum-%{version} +%patch0 -p1 # remote tests won't work in OBS rm tests/test_remote.py ++++++ no-python2.patch ++++++ Index: plumbum-1.6.9/tests/test_local.py =================================================================== --- plumbum-1.6.9.orig/tests/test_local.py +++ plumbum-1.6.9/tests/test_local.py @@ -966,7 +966,7 @@ class TestLocalEncoding: name = self.richstr + six.str("_program") with open(name, 'w') as f: - f.write("#!/usr/bin/env python\nprint('yes')") + f.write("#!{}\nprint('yes')".format(sys.executable)) st = os.stat(name) os.chmod(name, st.st_mode | stat.S_IEXEC) ++++++ v1.6.8.tar.gz -> v1.6.9.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/.ci/travis.sh new/plumbum-1.6.9/.ci/travis.sh --- old/plumbum-1.6.8/.ci/travis.sh 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/.ci/travis.sh 2020-03-23 14:25:44.000000000 +0100 @@ -11,7 +11,7 @@ else pip install --upgrade pip pip install -r dev-requirements.txt - pip install coveralls + pip install 'coveralls;python_version>="2.7"' pip install -e . fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/.travis.yml new/plumbum-1.6.9/.travis.yml --- old/plumbum-1.6.8/.travis.yml 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/.travis.yml 2020-03-23 14:25:44.000000000 +0100 @@ -13,10 +13,12 @@ env: PYV=3.6 - python: 3.7 env: PYV=3.7 + - python: 3.8 + env: PYV=3.8 - python: 2.6 dist: trusty env: PYV=2.6 - - python: pypy + - python: pypy3 - language: generic env: PY3=2 PYV=Mac2 os: osx @@ -32,7 +34,7 @@ install: ".ci/travis.sh" script: python$PY3 setup.py test -c after_success: -- if [ -n "$PYV" ] ; then coveralls; fi +- if [ -n "$PYV" ] && [ "$PYV" -ne "2.6" ] ; then coveralls; fi notifications: email: on_success: change diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/CHANGELOG.rst new/plumbum-1.6.9/CHANGELOG.rst --- old/plumbum-1.6.8/CHANGELOG.rst 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/CHANGELOG.rst 2020-03-23 14:25:44.000000000 +0100 @@ -1,3 +1,14 @@ +1.6.9 +----- + +* Last version to support Python 2.6; added python_requires (`#507 <https://github.com/tomerfiliba/plumbum/pull/507>`_) +* Paths: Fix bug with subscription operations (`#498 <https://github.com/tomerfiliba/plumbum/pull/498>`_), (`#506 <https://github.com/tomerfiliba/plumbum/pull/506>`_) +* Paths: Fix resolve (`#492 <https://github.com/tomerfiliba/plumbum/pull/492>`_) +* Commands: Fix resolve (`#491 <https://github.com/tomerfiliba/plumbum/pull/491>`_) +* Commands: Add context manager on popen (`#495 <https://github.com/tomerfiliba/plumbum/pull/495>`_) +* Several smaller fixes (`#500 <https://github.com/tomerfiliba/plumbum/pull/500>`_), (`#505 <https://github.com/tomerfiliba/plumbum/pull/505>`_) + + 1.6.8 ----- * Exceptions: Changed ProcessExecutionError's formatting to be more user-friendly (`#456 <https://github.com/tomerfiliba/plumbum/pull/456>`_) @@ -5,7 +16,7 @@ * Commands: support for piping stdout/stderr to a logger (`#454 <https://github.com/tomerfiliba/plumbum/pull/454>`_) * Paths: support composing paths using subscription operations (`#455 <https://github.com/tomerfiliba/plumbum/pull/455>`_) * CLI: Improved 'Set' validator to allow non-string types, and CSV params (`#452 <https://github.com/tomerfiliba/plumbum/pull/452>`_) -* TypedEnv: Facility for modeling environment-variables into python data types (`#451 <https://github.com/tomerfiliba/plumbum/pull/450>`_) +* TypedEnv: Facility for modeling environment-variables into python data types (`#451 <https://github.com/tomerfiliba/plumbum/pull/451>`_) * Commands: execute local/remote commands via a magic `.cmd` attribute (`#450 <https://github.com/tomerfiliba/plumbum/pull/450>`_) 1.6.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/README.rst new/plumbum-1.6.9/README.rst --- old/plumbum-1.6.8/README.rst 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/README.rst 2020-03-23 14:25:44.000000000 +0100 @@ -16,9 +16,9 @@ .. image:: https://img.shields.io/pypi/pyversions/plumbum.svg :target: https://pypi.python.org/pypi/plumbum/ :alt: PyPI Versions -.. image:: https://anaconda.org/conda-forge/plumbum/badges/version.svg - :target: https://anaconda.org/conda-forge/plumbum - :alt: Anaconda-Server Badge +.. image:: https://img.shields.io/conda/vn/conda-forge/plumbum.svg + :target: https://github.com/conda-forge/plumbum-feedstock + :alt: Conda-Forge Badge .. image:: https://img.shields.io/pypi/l/plumbum.svg :target: https://pypi.python.org/pypi/plumbum/ :alt: PyPI License diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/docs/index.rst new/plumbum-1.6.9/docs/index.rst --- old/plumbum-1.6.8/docs/index.rst 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/docs/index.rst 2020-03-23 14:25:44.000000000 +0100 @@ -118,6 +118,7 @@ remote utils cli + typed_env colors changelog quickref diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/docs/typed_env.rst new/plumbum-1.6.9/docs/typed_env.rst --- old/plumbum-1.6.8/docs/typed_env.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/plumbum-1.6.9/docs/typed_env.rst 2020-03-23 14:25:44.000000000 +0100 @@ -0,0 +1,96 @@ +.. _guide-typed-env: + +TypedEnv +======== +Plumbum provides this utility class to facilitate working with environment variables. +Similar to how :class:`plumbum.cli.Application` parses command line arguments into pythonic data types, +:class:`plumbum.typed_env.TypedEnv` parses environment variables: + +class MyEnv(TypedEnv): + username = TypedEnv.Str("USER", default='anonymous') + path = TypedEnv.CSV("PATH", separator=":", type=local.path) + tmp = TypedEnv.Str(["TMP", "TEMP"]) # support 'fallback' var-names + is_travis = TypedEnv.Bool("TRAVIS", default=False) # True is 'yes/true/1' (case-insensitive) + +We can now instantiate this class to access its attributes:: + + >>> env = MyEnv() + >>> env.username + 'ofer' + + >>> env.path + [<LocalPath /home/ofer/bin>, + <LocalPath /usr/local/bin>, + <LocalPath /usr/local/sbin>, + <LocalPath /usr/sbin>, + <LocalPath /usr/bin>, + <LocalPath /sbin>, + <LocalPath /bin>] + + >>> env.tmp + Traceback (most recent call last): + [...] + KeyError: 'TMP' + + >>> env.is_travis + False + +Finally, our ``TypedEnv`` object allows us ad-hoc access to the rest of the environment variables, using dot-notation:: + + >>> env.HOME + '/home/ofer' + +We can also update the environment via our ``TypedEnv`` object: + + >>> env.tmp = "/tmp" + >>> env.tmp + '/tmp' + + >>> from os import environ + >>> env.TMP + '/tmp' + + >>> env.is_travis = True + >>> env.TRAVIS + 'yes' + + >>> env.path = [local.path("/a"), local.path("/b")] + >>> env.PATH + '/a:/b' + + +TypedEnv as an Abstraction Layer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The ``TypedEnv`` class is very useful for separating your application from the actual environment variables. +It provides a layer where parsing and normalizing can take place in a centralized fashion. + +For example, you might start with this simple implementation:: + + class CiBuildEnv(TypedEnv): + job_id = TypedEnv.Str("BUILD_ID") + + +Later, as the application gets more complicated, you may expand your implementation like so:: + + class CiBuildEnv(TypedEnv): + is_travis = TypedEnv.Bool("TRAVIS", default=False) + _travis_job_id = TypedEnv.Str("TRAVIS_JOB_ID") + _jenkins_job_id = TypedEnv.Str("BUILD_ID") + + @property + def job_id(self): + return self._travis_job_id if self.is_travis else self._jenkins_job_id + + + +TypedEnv vs. local.env +^^^^^^^^^^^^^^^^^^^^^^ + +It is important to note that ``TypedEnv`` is separate and unrelated to the ``LocalEnv`` object that is provided via ``local.env``. + +While ``TypedEnv`` reads and writes directly to ``os.environ``, +``local.env`` is a frozen copy taken at the start of the python session. + +While ``TypedEnv`` is focused on parsing environment variables to be used by the current process, +``local.env``'s primary purpose is to manipulate the environment for child processes that are spawned +via plumbum's :ref:`local commands <guide-local-commands>`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/commands/base.py new/plumbum-1.6.9/plumbum/commands/base.py --- old/plumbum-1.6.8/plumbum/commands/base.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/commands/base.py 2020-03-23 14:25:44.000000000 +0100 @@ -143,7 +143,6 @@ raise NotImplementedError() def nohup(self, - command, cwd='.', stdout='nohup.out', stderr=None, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/commands/modifiers.py new/plumbum-1.6.9/plumbum/commands/modifiers.py --- old/plumbum-1.6.8/plumbum/commands/modifiers.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/commands/modifiers.py 2020-03-23 14:25:44.000000000 +0100 @@ -374,7 +374,7 @@ else: stdout = self.stdout append = self.append - return cmd.nohup(cmd, self.cwd, stdout, self.stderr, append) + return cmd.nohup(self.cwd, stdout, self.stderr, append) NOHUP = _NOHUP() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/commands/processes.py new/plumbum-1.6.9/plumbum/commands/processes.py --- old/plumbum-1.6.8/plumbum/commands/processes.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/commands/processes.py 2020-03-23 14:25:44.000000000 +0100 @@ -1,7 +1,6 @@ import time import atexit import heapq -from subprocess import Popen from threading import Thread from plumbum.lib import IS_WIN32, six @@ -24,7 +23,7 @@ return proc.returncode, stdout, stderr -def _iter_lines(proc, decode, linesize, line_timeout=None): +def _iter_lines_posix(proc, decode, linesize, line_timeout=None): try: from selectors import DefaultSelector, EVENT_READ except ImportError: @@ -62,6 +61,62 @@ yield 1, decode(line) +def _iter_lines_win32(proc, decode, linesize, line_timeout=None): + + class Piper(Thread): + + def __init__(self, fd, pipe): + super().__init__(name="PlumbumPiper%sThread" % fd) + self.pipe = pipe + self.fd = fd + self.empty = False + self.daemon = True + super().start() + + def read_from_pipe(self): + return self.pipe.readline(linesize) + + def run(self): + for line in iter(self.read_from_pipe, b''): + queue.put((self.fd, decode(line))) + # self.pipe.close() + + if line_timeout is None: + line_timeout = float("inf") + queue = Queue() + pipers = [Piper(0, proc.stdout), Piper(1, proc.stderr)] + last_line_ts = time.time() + empty = True + while True: + try: + yield queue.get_nowait() + last_line_ts = time.time() + empty = False + except QueueEmpty: + empty = True + if time.time() - last_line_ts > line_timeout: + raise ProcessLineTimedOut("popen line timeout expired", getattr(proc, "argv", None), getattr(proc, "machine", None)) + if proc.poll() is not None: + break + if empty: + time.sleep(0.1) + + for piper in pipers: + piper.join() + + while True: + try: + yield queue.get_nowait() + except QueueEmpty: + break + + +if IS_WIN32: + _iter_lines = _iter_lines_win32 +else: + _iter_lines = _iter_lines_posix + + #=================================================================================================== # Exceptions #=================================================================================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/machines/local.py new/plumbum-1.6.9/plumbum/machines/local.py --- old/plumbum-1.6.8/plumbum/machines/local.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/machines/local.py 2020-03-23 14:25:44.000000000 +0100 @@ -42,6 +42,12 @@ def __iter__(self): return self.iter_lines() + def __enter__(self): + return self._proc.__enter__() + + def __exit__(self, *args, **kwargs): + return self._proc.__exit__(*args, **kwargs) + def __getattr__(self, name): return getattr(self._proc, name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/path/base.py new/plumbum-1.6.9/plumbum/path/base.py --- old/plumbum-1.6.8/plumbum/path/base.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/path/base.py 2020-03-23 14:25:44.000000000 +0100 @@ -38,7 +38,11 @@ return self.join(other) __truediv__ = __div__ - __getitem__ = __div__ + + def __getitem__(self, key): + if type(key) == str or isinstance(key, Path): + return self / key + return str(self)[key] def __floordiv__(self, expr): """Returns a (possibly empty) list of paths that matched the glob-pattern under this path""" @@ -414,7 +418,7 @@ results.extend(fn(single_pattern)) return sorted(list(set(results))) - def resolve(strict=False): + def resolve(self, strict=False): """Added to allow pathlib like syntax. Does nothing since Plumbum paths are always absolute. Does not (currently) resolve symlinks.""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/path/local.py new/plumbum-1.6.9/plumbum/path/local.py --- old/plumbum-1.6.8/plumbum/path/local.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/path/local.py 2020-03-23 14:25:44.000000000 +0100 @@ -58,6 +58,9 @@ cls, os.path.normpath(os.path.join(*(str(p) for p in parts)))) return self + def __fspath__(self): + return self._path() + @property def _path(self): return str(self) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/path/remote.py new/plumbum-1.6.9/plumbum/path/remote.py --- old/plumbum-1.6.8/plumbum/path/remote.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/path/remote.py 2020-03-23 14:25:44.000000000 +0100 @@ -3,6 +3,7 @@ from plumbum.path.base import Path, FSUser from plumbum.lib import _setdoc, six from plumbum.commands import shquote, ProcessExecutionError +import os import sys try: # Py3 @@ -170,7 +171,7 @@ def stat(self): res = self.remote._path_stat(self) if res is None: - raise OSError(errno.ENOENT) + raise OSError(errno.ENOENT, os.strerror(errno.ENOENT), '') return res @_setdoc(Path) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/typed_env.py new/plumbum-1.6.9/plumbum/typed_env.py --- old/plumbum-1.6.8/plumbum/typed_env.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/typed_env.py 2020-03-23 14:25:44.000000000 +0100 @@ -6,6 +6,11 @@ NO_DEFAULT = object() +# must not inherit from AttributeError, so not to mess with python's attribute-lookup flow +class EnvironmentVariableError(KeyError): + pass + + class TypedEnv(MutableMapping): """ This object can be used in 'exploratory' mode: @@ -29,7 +34,7 @@ try: print(p.tmp) - except KeyError: + except EnvironmentVariableError: print("TMP/TEMP is not defined") else: assert False @@ -52,7 +57,7 @@ return self try: return self.convert(instance._raw_get(*self.names)) - except KeyError: + except EnvironmentVariableError: if self.default is NO_DEFAULT: raise return self.default @@ -64,6 +69,10 @@ pass class Bool(_BaseVar): + """ + Converts 'yes|true|1|no|false|0' to the appropriate boolean value. + Case-insensitive. Throws a ``ValueError`` for any other value. + """ def convert(self, s): s = s.lower() @@ -81,6 +90,10 @@ convert = staticmethod(float) class CSV(_BaseVar): + """ + Comma-separated-strings get split using the ``separator`` (',' by default) into + a list of objects of type ``type`` (``str`` by default). + """ def __init__(self, name, default=NO_DEFAULT, type=str, separator=","): super(TypedEnv.CSV, self).__init__(name, default=default) @@ -117,12 +130,12 @@ if value is not NO_DEFAULT: return value else: - raise KeyError(key_names[0]) + raise EnvironmentVariableError(key_names[0]) def __contains__(self, key): try: self._raw_get(key) - except KeyError: + except EnvironmentVariableError: return False else: return True @@ -131,7 +144,7 @@ # if we're here then there was no descriptor defined try: return self._raw_get(name) - except KeyError: + except EnvironmentVariableError: raise AttributeError("%s has no attribute %r" % (self.__class__, name)) def __getitem__(self, key): @@ -140,7 +153,7 @@ def get(self, key, default=None): try: return self[key] - except KeyError: + except EnvironmentVariableError: return default def __dir__(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/plumbum/version.py new/plumbum-1.6.9/plumbum/version.py --- old/plumbum-1.6.8/plumbum/version.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/plumbum/version.py 2020-03-23 14:25:44.000000000 +0100 @@ -1,3 +1,3 @@ -version = (1, 6, 8) +version = (1, 6, 9) version_string = ".".join(map(str, version)) -release_date = "2019.10.30" +release_date = "2020.03.23" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/setup.py new/plumbum-1.6.9/setup.py --- old/plumbum-1.6.8/setup.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/setup.py 2020-03-23 14:25:44.000000000 +0100 @@ -80,8 +80,10 @@ "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Build Tools", "Topic :: System :: Systems Administration", ], + python_requires='>=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*', ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/plumbum-1.6.8/tests/test_local.py new/plumbum-1.6.9/tests/test_local.py --- old/plumbum-1.6.8/tests/test_local.py 2019-10-30 22:21:12.000000000 +0100 +++ new/plumbum-1.6.9/tests/test_local.py 2020-03-23 14:25:44.000000000 +0100 @@ -8,7 +8,7 @@ CommandNotFound, ProcessExecutionError, ProcessTimedOut, ProcessLineTimedOut) from plumbum.lib import six, IS_WIN32 from plumbum.fs.atomic import AtomicFile, AtomicCounterFile, PidFile -from plumbum.machines.local import LocalCommand +from plumbum.machines.local import LocalCommand, PlumbumLocalPopen from plumbum.path import RelativePath import plumbum @@ -23,6 +23,18 @@ SDIR = os.path.dirname(os.path.abspath(__file__)) +class TestLocalPopen: + @pytest.mark.skipif(sys.version_info < (3, 2), + reason="Context Manager was introduced in Python 3.2") + def test_contextmanager(self): + if IS_WIN32: + command = ['dir'] + else: + command = ['ls'] + with PlumbumLocalPopen(command): + pass + + class TestLocalPath: longpath = local.path("/some/long/path/to/file.txt") @@ -267,6 +279,11 @@ (tmp / "py_333").chmod(0o777) assert not tmp.exists() + def test_str_getitem(self): + with local.tempdir() as tmp: + assert str(tmp) == str(tmp[:]) + assert str(tmp)[0] == str(tmp[0]) + @pytest.mark.usefixtures("testdir") class TestLocalMachine:
