Skip to content

Commit

Permalink
Merge branch 'release-1.12.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Moffat committed Nov 27, 2016
2 parents 023dc55 + 07a3245 commit f665686
Show file tree
Hide file tree
Showing 12 changed files with 2,823 additions and 920 deletions.
17 changes: 8 additions & 9 deletions .travis.yml
@@ -1,24 +1,23 @@
os:
- linux
- osx

language: python

python:
- 2.6
- 2.7
- pypy
- 3.2
- 3.3
- 3.4
- 3.5
- pypy3

env:
- LC_ALL=C
- LC_ALL=en_US.UTF-8

before_script: pip install coverage coveralls
before_script:
- pip install -r requirements-dev.txt

script:
- coverage run --source sh test.py
- coverage report
- python sh.py travis

after_success: coveralls
after_success:
- coveralls
38 changes: 38 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,43 @@
# Changelog

## 1.12.0 - 11/21/16

* composed commands no longer propagate `_bg`
* better support for using `sys.stdin` and `sys.stdout` for `_in` and `_out`
* bugfix where `which()` would not stop searching at the first valid executable found in PATH
* added `_long_prefix` for programs whose long arguments start with something other than `--` [#278](https://github.com/amoffat/sh/pull/278)
* added `_log_msg` for advanced configuration of log message [#311](https://github.com/amoffat/sh/pull/311)
* added `sh.contrib.sudo`
* added `_arg_preprocess` for advanced command wrapping
* alter callable `_in` arguments to signify completion with falsy chunk
* bugfix where pipes passed into `_out` or `_err` were not flushed on process end [#252](https://github.com/amoffat/sh/pull/252)
* deprecated `with sh.args(**kwargs)` in favor of `sh2 = sh(**kwargs)`
* made `sh.pushd` thread safe
* added `.kill_group()` and `.signal_group()` methods for better process control [#237](https://github.com/amoffat/sh/pull/237)
* added `new_session` special keyword argument for controlling spawned process session [#266](https://github.com/amoffat/sh/issues/266)
* bugfix better handling for EINTR on system calls [#292](https://github.com/amoffat/sh/pull/292)
* bugfix where with-contexts were not threadsafe [#247](https://github.com/amoffat/sh/issues/195)
* `_uid` new special keyword param for specifying the user id of the process [#133](https://github.com/amoffat/sh/issues/133)
* bugfix where exceptions were swallowed by processes that weren't waited on [#309](https://github.com/amoffat/sh/issues/309)
* bugfix where processes that dupd their stdout/stderr to a long running child process would cause sh to hang [#310](https://github.com/amoffat/sh/issues/310)
* improved logging output [#323](https://github.com/amoffat/sh/issues/323)
* bugfix for python3+ where binary data was passed into a process's stdin [#325](https://github.com/amoffat/sh/issues/325)
* Introduced execution contexts which allow baking of common special keyword arguments into all commands [#269](https://github.com/amoffat/sh/issues/269)
* `Command` and `which` now can take an optional `paths` parameter which specifies the search paths [#226](https://github.com/amoffat/sh/issues/226)
* `_preexec_fn` option for executing a function after the child process forks but before it execs [#260](https://github.com/amoffat/sh/issues/260)
* `_fg` reintroduced, with limited functionality. hurrah! [#92](https://github.com/amoffat/sh/issues/92)
* bugfix where a command would block if passed a fd for stdin that wasn't yet ready to read [#253](https://github.com/amoffat/sh/issues/253)
* `_long_sep` can now take `None` which splits the long form arguments into individual arguments [#258](https://github.com/amoffat/sh/issues/258)
* making `_piped` perform "direct" piping by default (linking fds together). this fixes memory problems [#270](https://github.com/amoffat/sh/issues/270)
* bugfix where calling `next()` on an iterable process that has raised `StopIteration`, hangs [#273](https://github.com/amoffat/sh/issues/273)
* `sh.cd` called with no arguments no changes into the user's home directory, like native `cd` [#275](https://github.com/amoffat/sh/issues/275)
* `sh.glob` removed entirely. the rationale is correctness over hand-holding. [#279](https://github.com/amoffat/sh/issues/279)
* added `_truncate_exc`, defaulting to `True`, which tells our exceptions to truncate output.
* bugfix for exceptions whose messages contained unicode
* `_done` callback no longer assumes you want your command put in the background.
* `_done` callback is now called asynchronously in a separate thread.
* `_done` callback is called regardless of exception, which is necessary in order to release held resources, for example a process pool

## 1.10 - 12/30/14

* partially applied functions with `functools.partial` have been fixed for `_out` and `_err` callbacks [#160](https://github.com/amoffat/sh/issues/160)
Expand Down
2 changes: 1 addition & 1 deletion MANIFEST.in
@@ -1,3 +1,3 @@
include AUTHORS.md CHANGELOG.md LICENSE.txt README.md test.py
include CHANGELOG.md LICENSE.txt README.rst test.py

global-exclude *.pyc
39 changes: 0 additions & 39 deletions README.md

This file was deleted.

73 changes: 73 additions & 0 deletions README.rst
@@ -0,0 +1,73 @@
.. image:: https://img.shields.io/pypi/v/sh.svg?style=flat-square
:target: https://pypi.python.org/pypi/sh
:alt: Version
.. image:: https://img.shields.io/pypi/pyversions/sh.svg?style=flat-square
:target: https://pypi.python.org/pypi/sh
:alt: Python Versions
.. image:: https://img.shields.io/travis/amoffat/sh.svg?style=flat-square
:target: https://travis-ci.org/amoffat/sh
:alt: Build Status
.. image:: https://img.shields.io/coveralls/amoffat/sh.svg?style=flat-square
:target: https://coveralls.io/r/amoffat/sh?branch=master
:alt: Coverage Status

|
sh is a full-fledged subprocess replacement for Python 2.6 - 3.5, PyPy and PyPy3
that allows you to call any program as if it were a function:

.. code:: python
from sh import ifconfig
print ifconfig("eth0")
sh is *not* a collection of system commands implemented in Python.

Installation
============

::

$> pip install sh

Complete documentation @ http://amoffat.github.com/sh
=====================================================

Developers
==========

Testing
-------

First install the development requirements::

$> pip install -r requirements-dev.txt

The run the tests for all Python versions on your system::

$> python sh.py test

To run a single test for all environments::

$> python sh.py test FunctionalTests.test_unicode_arg

To run a single test for a single environment::

$> python sh.py test -e 3.4 FunctionalTests.test_unicode_arg

Coverage
--------

First run all of the tests::

$> python sh.py test

This will aggregate a ``.coverage``. You may then visualize the report with::

$> coverage report

Or generate visual html files with::

$> coverage html

Which will create ``./htmlcov/index.html`` that you may open in a web browser.
8 changes: 4 additions & 4 deletions requirements-dev.txt
@@ -1,4 +1,4 @@
coverage==3.7.1
py==1.4.26
tox==1.8.1
virtualenv==12.0.4
coverage==4.2
coveralls==1.1
docopt==0.6.2
requests==2.12.1
12 changes: 12 additions & 0 deletions requirements-docs.txt
@@ -0,0 +1,12 @@
alabaster==0.7.9
Babel==2.3.4
docutils==0.12
imagesize==0.7.1
Jinja2==2.8
MarkupSafe==0.23
Pygments==2.1.3
pytz==2016.7
six==1.10.0
snowballstemmer==1.2.1
Sphinx==1.4.8
sphinx-rtd-theme==0.1.9
5 changes: 5 additions & 0 deletions setup.cfg
@@ -0,0 +1,5 @@
[bdist_wheel]
universal = 1

[metadata]
license_file = LICENSE.txt
27 changes: 22 additions & 5 deletions setup.py
@@ -1,18 +1,33 @@
from __future__ import print_function
import os
from os.path import dirname, abspath, join
import sys
import sh
import codecs
from setuptools import setup

try: from distutils.core import setup
except ImportError: from setuptools import setup

HERE = dirname(abspath(__file__))

author = "Andrew Moffat"
author_email = "andrew.robert.moffat@gmail.com"
keywords = ["subprocess", "process", "shell", "launch", "program"]


def read(*parts):
with codecs.open(join(HERE, *parts), "rb", "utf-8") as f:
return f.read()

setup(
name="sh",
version=sh.__version__,
description="Python subprocess interface",
author="Andrew Moffat",
author_email="andrew.robert.moffat@gmail.com",
description="Python subprocess replacement",
long_description=read("README.rst"),
author=author,
author_email=author_email,
maintainer=author,
maintainer_email=author_email,
keywords=keywords,
url="https://github.com/amoffat/sh",
license="MIT",
py_modules=["sh"],
Expand All @@ -31,6 +46,8 @@
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Software Development :: Build Tools",
"Topic :: Software Development :: Libraries :: Python Modules",
],
Expand Down

0 comments on commit f665686

Please sign in to comment.