Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial Update #8

Open
wants to merge 13 commits into
base: dev
Choose a base branch
from
Open

Initial Update #8

wants to merge 13 commits into from

Conversation

pyup-bot
Copy link

This is my first visit to this fine repo so I have bundled all updates in a single pull request to make things easier for you to merge.

Close this pull request and delete the branch if you want me to start with single pull requests right away

Here's the executive summary:

Pins

Name Pinned to pypi
nose 1.3.7 pypi
blessings 1.6 pypi
unidecode 0.04.19 pypi
psutil 4.3.0 pypi
BeautifulSoup 3.2.1 pypi
sqlalchemy 1.0.14 pypi
webob 1.6.1 pypi
lxml 3.6.1 pypi
repoze.lru 0.6 pypi
requests 2.11.0 pypi
webapp2 2.5.2 pypi
PasteScript 2.0.2 pypi
sphinx 1.4.5 pypi

Changelogs

nose -> 1.3.7

1.3.7

  • Fix loading packages from capitalised package on Windows
    Patch by Thomas Kluyver
  • Add option to suppress printing of coverage report
    Patch by Eric Larson.

1.3.6

  • Re-release of 1.3.5 with wheels fixed.

1.3.5

  • Fix 875: nose doesn't collect tests when subpackage is given as arg
  • Fix 809: tests not discovered for namespace packages on Windows
  • Fix 815: "ValueError: unsupported pickle protocol" with --with-id
  • Wrap the working dir path name in quotes when reporting an error.
    Patch by Őry Máté.
  • Fix 887: Fix a discrepancy in test names between Python 2 and Python 3
  • Fix 131: Use os.stat() to check if file is executable
    Patch by Arnon Yaari.
  • Fix 820 and 719: Fix coverage plugin with multiprocess
    Patch by Nicolas Grasset.

1.3.4

  • Recognize doctest options defined in other plugins
    Patch by Daniel Lepage
  • Another fix for Python 3.4: Call super in LazySuite to access
    _removed_tests variable
    Patch by Robert Kuska
  • Fix for try_run when using bound methods
    Patch by Christian Lyder Jacobsen

1.3.3

  • Fixed a minor issue with the reported version number.

1.3.2

  • Fixed an issue where build_ext was not working under setup.py nosetest
    Patch by Michael Crusoe
  • Fixed 786: generator method fails with callable instance
    Patch by Antoine Dechaume
  • Fixed a traceback when using string exceptions
  • Fixed 792: "Not a directory" error when using python setup.py nosetests
  • Fixed 779: xunit report file is written in --where directory
  • Fixed 782: Test failures with Python >= 3.3
    Patch by Dmitry Shachnev
  • Fixed 780: Fix a regression with Python 3
  • Fixed 783: try_run is broken with Python 3.4

1.3.1

  • The log capture plugin now correctly applies filters that were added
    using addFilter.
    Patch by Malthe Borch.
  • Corrected a reference to the multiprocessing plugin in the documentation.
    Patch by Nick Loadholtes.
  • Fixed 447: doctests fail when getpackage() returns None
    Patch by Matthew Brett.
  • Fixed 749: xunit exceeds recursion limit
    Patch by André Caron.
  • Fixed a number of unicode-related issues.
    Patch by John Szakmeister.
  • Added the ability to ignore config files via an environment variable
    Patch by Lukasz Balcerzak
  • Fixed 720: nose with detailed errors raises encoding error
    Patch by John Szakmeister. Thanks to Guillaume Ayoub for the test case.
  • Fixed 692: UnicodeDecodeError in xunit when capturing stdout and stderr
    Patch by John Szakmeister.
  • Fixed 693: Python 2.4 incompatibilities
    Patch by John Szakmeister.
  • Don't save zero-byte xunit test reports
    Patch by Dan Savilonis.
  • Fix Importer.importFromPath to be able to import modules whose names start
    with init
    Patch by Paul Bonser.
  • Add a fake isatty() method to Tee
    Patch by Jimmy Wennlund.
  • Fix 700: Tee is missing the writelines() method
    Patch by John Szakmeister.
  • Fix 649: UnicodeDecodeError when an exception contains encoded strings
    Patch by John Szakmeister.
  • Fix 687: verbosity is not a flag
    Patch by John Szakmeister.
  • Fixed a suppressed deprecation warning
    Patch by Arnon Yaari.
  • Fixed some broken links in the documentation
    Patch by Arnon Yaari.
  • Add missing format parameter in error message
    Patch by Etienne Millon.
  • Switched docs to point at the GitHub site for the issue tracker
    Patch by Daniel Beck.
  • Fix 447: doctests fail when getpackage() returns None
    Patch by Matthew Brett.
  • Fix 366: make --pdb report on errors and failures. Use --pdb-error to get
    the old behavior.
    Patch by Arnon Yaari.
  • Fix 501: Imported test generators are misrecognized as simple test
    functions
    Patch by John Szakmeister.
  • Added a test for issue 501
    Patch by Michael Killough.
  • Use SkipTest from unittest2, if available, for better integration with
    testtools
    Patch by Ian Wienand.
  • Fix 759: Test failures with Python 3.4
    Patch by Barry Warsaw.
  • Add a note about executable files in the usage, and how to workaround it
    Patch by Michael Dunn.
  • Fix 743: fix an incorrect regex in writing_tests.rst
    Patch by Anne Moroney.
  • Fix 690: Don't traceback when coverage reports fail.
    Patch by John Szakmeister.
  • Display the report summary and stack traces even if Ctrl-C was pressed
    during the test run.
    Patch by Kevin Qiu.
  • Fix 771: attr plugin is broken when parent and child share same method
    name with different attributes
    Patch by John Szakmeister. Test case provided by Thomas Grainger.
  • Fix 728: attrib plugin rejects any staticmethod
    Patch by John Szakmesiter. Test case provided by Thomas Kluyver.
  • Fix the plugin testing example.
    Patch by Charlie Dominio.
  • Instruct coverage instance to cover requested packages only.

1.3.0

  • Fix 556: fix selecting specific tests in the setuptools command.
    Patch by Andrey Golovizin.
  • Fixed timed decorator to return the result of the wrapped function.
    Patch by Praful Mathur.
  • Fixed 513: exception in test generator leads to a TypeError.
    Patch by Dmitry Shachnev.
  • Fixed 535: nose.importer causes bizarre import errors if sys.path includes
    symlinks.
    Patch by Antoine Pitrou.
  • Added support for Python 3.3.
    Patch by John Szakmeister and Bradley Froehle.
  • Added the ability to skip generating .pyc files with --no-byte-complie.
    Patch by John Szakmeister.
  • Suppress tracebacks caused by configuration errors (401).
    Patch by Andrea Corbellini.
  • Fixed doctest failures under Python 3 (519).
    Patch by John Szakmeister.
  • Fixed test_address's checking for builtins to work with Python 2 and 3.
    Patch by Joe Mathes and John Szakmeister.
  • Fixed a bug where nose.tools was not being installed on systems without
    setuptools. (554)
    Patch by Bradley Froehle.
  • Fixed a bug in xunit that was causing it to die ungracefully under
    Python 3. (134)
    Patch by John Szakmeister.
  • Fixed 561: logcapture shouldn't buffer records, breaks %r point-in-time
    formatting.
    Patch by Santeri Paavolainen.
  • Taught xunit to capture stdout and stderr in the xunit report.
    Patch by John Szakmeister.
  • Repopulate nose.tools.all so that the autodocs generate correctly.
    Patch by Taavi Burns.
  • Fixed a bug where nose was failing to parse the NOSE_COVER_PACKAGE
    environment variable correctly. (109)
    Patch by Churkin Oleg.
  • Taught nose to lookup it's usage text according to PEP-302.
    Patch by Bradely Froehle.
  • Fixed an ugly traceback when a test class was imported from another module,
    but was missing a method. (595)
    Patch by Michael Williamson.
  • Fix formatFailure expection if missing tb in exc_info. (603)
    Patch by Sascha Peilicke.
  • Taught the test suite to skip coverage tests if the coverage module is not
    available. (597)
    Patch by Dmitry Shachnev.
  • Fix 135: ResultProxy._prepareErr mangles error output in some cases.
    Patch by Arnon Yaari.
  • Updated plugin documentation to fix numerous typos and incorrect names.
    Patch by Arnon Yaari.
  • Added the ability to run nose as a module.
    Patch by Stefano Rivera.
  • Fix installing Nose under Windows with Python 3.3.
    Patch by John Szakmeister.
  • Added documentation for --processes=0 and the default value of
    --process-timeout.
    Patch by Takafumi Arakaki.
  • Fixed broken references to non-existent documentation.
    Patch by Dmitry Shachnev.
  • Fix --cover-min-percentage with --cover-branches. (626)
    Patch by B. W. Baugh.
  • Fix --cover-min-percentage with single packages.
    Patch by John Szakmeister.
  • Fixed reference to PEP 8 to use Sphinx construct for better linking.
    Patch by Mahhtijs van der Vleuten.
  • Fixed a reference to --cover-packages to use the correct option name.
    Patch by Wesley Baugh.
  • Updated Nose to avoid using the deprecated compiler module when possible.
    Patch by Kim Scheilbel.
  • Updated docstrings of formatFailure() and formatError().
    Patch by Daniel Abel.
  • Several man page fixes for better formatting.
    Patches by Dmitry Shachnev.
  • Fixed a bug causing Nose to crash in directories that end in '.py'. (612)
    Patch by Arnon Yaari.
  • Fixed a traceback when a test raises SystemExit and has captured
    output. (526)
    Patch by Arnon Yaari.
  • Fixed ImportError running nosetests on namespace package in a subdirectory
    on Windows. (19)
    Patch by Arnon Yaari.

1.2.1

  • Correct nose.version (549). Thanks to Chris Withers for the bug report.

1.2.0

  • Fixed issue where plugins included with addplugins keyword could
    be overridden by built-in plugins (or third-party plugins registered
    with setuptools) of the same name (466).
    Patch by Brendan McCollam
  • Adds :option:--cover-xml and :option:--cover-xml-file (311).
    Patch by Timothée Peignier.
  • Adds support for :option:--cover-branches (related to 370).
    Patch by Timothée Peignier.
  • Fixed Unicode issue on Python 3.1 with coverage (442)
  • fixed class level fixture handling in multiprocessing plugin
  • Clue in the unittest module so it no longer prints traceback frames for
    our clones of their simple assertion helpers (453). Patch by Erik Rose.
  • Stop using the assert statement in ok_ and eq_ so they work under
    python -O (504). Patch by Erik Rose.
  • Add loglevel option to logcapture plugin (493). Patch by Arach Tchoupani.
  • Add doctest options flag (7 from google code tracker). Patch by Michael
    Forbes.
  • Add support for using 2to3 with the nosetests setuptools command. Patch by
    Andrey Golovizin.
  • Add --cover-min-percentage flag to force test runs without sufficient
    coverage to fail (540). Patch by Domen Kožar.
  • Add travis-ci configuraion (545). Patch by Domen Kožar.
  • Call reactor.stop from twisted thread (301). Patch by Adi Roiban.

1.1.2

  • Fixed regression where the .coverage file was not saved (439).
    Patch by Timothée Peignier.

1.1.1

  • Fixed missing nose.sphinx module in source distribution (436).

1.1.0

  • Revised multiprocessing implementation so that it works for test generators
    (399). Thanks to Rosen Diankov for the patch.
  • More fixes to multiprocessing implemented by Buck Golemon and Gary Donovan
    (also part of 399).
  • Lots of improvements to the attrib plugin by Bobby Impollonia (412, 411,
    324 and 381)
  • Code coverage plugin now uses native HTML generation when coverage 3 is
    installed (264). Thanks to Timothée Peignier for the patch.
  • Xunit plugin now shows test run time in fractions of a second (317)
  • attr (from nose.plugins.attrib) can now be used as a class decorator (292)
  • Fixes Xunit plugin to handle non-UTF8 characters (395)
  • Fixes Xunit plugin for reporting generator tests (369)
  • Fixed problems with SkipTest in Python 3.2 (389)
  • Fixed bug in doctest plugin under python 3. Thanks to Thomas Kluyver
    for the patch. (391)
  • Fixes mishandling of custom exceptions during failures (405)
  • Fixed subtle bug in :option:--first-package-wins that made it
    unpredictable (293)
  • Fixes case where teardown_class() was called more than once (408). Thanks
    to Heng Liu for the patch.
  • Fixes coverage module names -- 'cal' used to also match calendar which was a
    bug (433)
  • Fixes capture plugin when exception message contains non-ascii chars (402)
  • Fixed bug in tests for twisted tools. Thanks to Thomas Kluyver
    for the patch.
  • Makes :option:--plugins more succinct when there are no options (235)

1.0.0

  • Made nose compatible with python 3. Huge thanks to Alex "foogod"
    Stewart!

0.11.4

  • Made nose compatible with Python 2.7.

0.11.3

  • Fixed default plugin manager's use of plugin overriding. Thanks to
    rob.daylife for the bug report and patch. (323).

0.11.2

  • Changed plugin loading so that external plugins loaded via extension
    points can override builtin plugins with the same name.
  • Updated multiprocess plugin and nose's packaging to allow multiprocess
    plugin to work on Windows (265).
  • Fixed bug in xunit plugin's interaction with suites and errors in
    module-level setup. Thanks to Mark McCague for the bug report (279).
  • Fixed bug in nose.loader.TestLoader that allowed Test classes that raise
    exceptions in init to crash the test run (269).
  • Fixed bugs in nose's test suite that caused spurious failures on Windows.
  • Fixed bug in twisted tools: delayed calls were not shut down on
    reactor stop. Thanks to abbeyj for the patch (278).
  • Fixed bug where root log handlers were not cleared. For example, this was
    emitting unwanted messages when testing Google App Engine websites.
  • Fixed bug in test names output by xunit plugin. Thanks to Philip
    Jenvey for the bug report and patch (280).
  • Fixed bug in profile plugin that caused stats to fail to print under Python
    2.5 and later. Thanks to djs at n-cube dot org for the bug report (285).
  • Improved logcapture filtering, with default setting to filter out log
    messages from nose itself. Thanks to gfxmonk for the patch (277).
  • The xunit plugin now tags skipped tests with a <skipped> testcase tag, and
    prevents the XML from containing invalid control characters.
  • Updated nose to be compatible with python 2.7 (305).
  • Updated loading of usage document to allow nose to run from within
    an egg archive (288).
  • Fixed IronPython checks to make nose compatible with more versions
    of IronPython. Thanks to Kevin Mitchell for the patch (316).

0.11.1

  • Fixed bug in xunit plugin xml escaping. Thanks to Nat Williams for the bug
    report (266).
  • Fixed bug in xunit plugin that could cause test run to crash after certain
    types of errors or actions by other plugins.
  • Fixed bug in testid plugin that could cause test run to crash after certain
    types of errors or actions by other plugins.
  • Fixed bug in collect only plugin that caused it to fail when collecting from
    test generators.
  • Fixed some broken html in docs.

0.11

  • All new documentation! nose's documentation is now generated by
    Sphinx. And thanks to Pam Zerbinos, it is much better organized and easier
    to use and read.
  • Two new core commandline options can help with testing namespace
    packages. :option:--first-package-wins is useful when you want to test one
    part of a namespace package that uses another part; in previous versions of
    nose, the other part of the namespace package would be evicted from
    sys.modules when the 2nd loaded. :option:--traverse-namespace is useful if
    you want nose to discover tests across entries in a package's
    path. (This was formerly the default behavior).
  • To make it easier to use custom plugins without needing setuptools,
    :func:nose.core.main and :func:nose.core.run now support an
    :doc:addplugins &lt;doc_tests/test_addplugins/test_addplugins&gt; keyword
    argument that takes a list of additional plugins to make available. Note
    that adding a plugin to this list does not activate or enable the
    plugin, only makes it available to be enabled via command-line or
    config file settings.
  • Thanks to Kevin Mitchell, nose is now more compatible with
    IronPython. IronPython is still not fully supported, but it should work. If
    you'd like to improve nose's support for IronPython further, please join the
    nose developer's list and volunteer to become the IronPython maintainer for
    nose!
  • Added multiprocess plugin that allows tests to be run in parallel
    across multiple processes.
  • Added logcapture plugin that captures logging messages and prints them with
    failing tests. Thanks to Max Ischenko for the implementation.
  • Added optional HTML coverage reports to coverage plugin. Thanks to Augie
    Fackler for the patch.
  • Added plugin that enables collection of tests in all modules. Thanks to
    Peter Fein for the patch (137).
  • Added --failed option to testid plugin. When this option is in effect, if
    any tests failed in the previous test run (so long as testid was active for
    that test run) only the failed tests will run.
  • Made it possible to 'yield test' in addition to 'yield test,' from test
    generators. Thanks to Chad Whitacre for the patch (230).
  • Fixed bug that caused traceback inspector to fail when source code file
    could not be found. Thanks to Philip Jenvey for the bug report and patch
    (236).
  • Fixed some issues limiting compatibility with IronPython. Thanks to Kevin
    Mitchell for the patch.
  • Added support for module and test case fixtures in doctest files (60).
  • Added --traverse-namespace commandline option that restores old default
    behavior of following all package path entries when loading tests from
    packages. Thanks to Philip Jenvey for the patch (167).
  • Added --first-package-wins commandline option to better support testing
    parts of namespace packages. Thanks to Jason Coombs for the bug report
    (197).
  • Added versioned nosetests scripts (123).
  • Fixed bug that would cause context teardown to fail to run in some
    cases. Thanks to John Shaw for the bug report and patch (234).
  • Enabled doctest plugin to use variable other than "_" as the default result
    variable. Thanks to Matt Good for the patch (163).
  • Fixed bug that would cause unicode output to crash output capture. Thanks to
    schickb for the bug report (227).
  • Added setUp and tearDown as valid names for module-level fixtures. Thanks to
    AgilityNerd for the patch (211).
  • Fixed bug in list of valid names for package-level fixtures. Thanks to
    Philip Jenvey for the patch (237).
  • Updated man page generation using hacked up manpage writer from
    docutils sandbox. Thanks grubertusers.sourceforge.net for the
    original module.

0.10.4

  • nose is now compatible with python 2.6.

0.10.3

  • Fixed bug in nosetests setup command that caused an exception to be raised
    if run with options. Thanks to Philip Jenvey for the bug report (191).
  • Raised score of coverage plugin to 200, so that it will execute before
    default-score plugins, and so be able to catch more import-time code. Thanks
    to Ned Batchelder for the bug report and patch (190).

0.10.2

  • nose now runs under jython (jython svn trunk only at this time). Thanks to
    Philip Jenvey, Pam Zerbinos and the other pycon sprinters (160).
  • Fixed bugs in loader, default plugin manager, and other modules that
    caused plugin exceptions to be swallowed (152, 155). Thanks to John J
    Lee for the bug report and patch.
  • Added selftest.py script, used to test a non-installed distribution of
    nose (49). Thanks to Antoine Pitrou and John J Lee for the bug report and
    patches.
  • Fixed bug in nose.importer that caused errors with namespace
    packages. Thanks to Philip Jenvey for the bug report and patch (164).
  • Fixed bug in nose.tools.with_setup that prevented use of multiple
    with_setup decorators. Thanks to tlesher for the bug report (151).
  • Fixed bugs in handling of context fixtures for tests imported into a
    package. Thanks to Gary Bernhardt for the bug report (145).
  • Fixed bugs in handling of config files and config file options for plugins
    excluded by a RestrictedPluginManager. Thanks to John J Lee and Philip
    Jenvey for the bug reports and patches (158, 166).
  • Updated ErrorClass exception reporting to be shorter and more clear. Thanks
    to John J Lee for the patch (142).
  • Allowed plugins to load tests from modules starting with '_'. Thanks to John
    J Lee for the patch (82).
  • Updated documentation about building as rpm (127).
  • Updated config to make including executable files the default on
    IronPython as well as on Windows. Thanks to sanxiyn for the bug
    report and patch (183).
  • Fixed a python 2.3 incompatibility in errorclass_failure.rst
    (173). Thanks to Philip Jenvey for the bug report and patch.
  • Classes with metaclasses can now be collected as tests (153).
  • Made sure the document tree in the selector plugin test is accurate
    and tested (144). Thanks to John J Lee for the bug report and
    patch.
  • Fixed stack level used when dropping into pdb in a doctest
    (154). Thanks to John J Lee for the bug report and patch.
  • Fixed bug in ErrorClassPlugin that made some missing keyword
    argument errors obscure (159). Thanks to Philip Jenvey for the bug
    report and patch.

0.10.1

  • Fixed bug in capture plugin that caused it to record captured output
    on the test in the wrong attribute (113).
  • Fixed bug in result proxy that caused tests to fail if they accessed
    certain result attibutes directly (114). Thanks to Neilen Marais
    for the bug report.
  • Fixed bug in capture plugin that caused other error formatters
    changes to be lost if no output was captured (124). Thanks to
    someone at ilorentz.org for the bug report.
  • Fixed several bugs in the nosetests setup command that made some
    options unusable and the command itself unusable when no options
    were set (125, 126, 128). Thanks to Alain Poirier for the bug
    reports.
  • Fixed bug in handling of string errors (130). Thanks to schl... at
    uni-oldenburg.de for the bug report.
  • Fixed bug in coverage plugin option handling that prevented
    --cover-package=mod1,mod2 from working (117). Thanks to Allen
    Bierbaum for the patch.
  • Fixed bug in profiler plugin that prevented output from being
    produced when output capture was enabled on python 2.5
    (129). Thanks to James Casbon for the patch.
  • Fixed bug in adapting 0.9 plugins to 0.10 (119 part one). Thanks to
    John J Lee for the bug report and tests.
  • Fixed bug in handling of argv in config and plugin test utilities
    (119 part two). Thanks to John J Lee for the bug report and patch.
  • Fixed bug where Failure cases due to invalid test name
    specifications were passed to plugins makeTest (120). Thanks to
    John J Lee for the bug report and patch.
  • Fixed bugs in doc css that mangled display in small windows. Thanks
    to Ben Hoyt for the bug report and Michal Kwiatkowski for the fix.
  • Made it possible to pass a list or comma-separated string as
    defaultTest to main(). Thanks to Allen Bierbaum for the suggestion
    and patch.
  • Fixed a bug in nose.selector and nose.util.getpackage that caused
    directories with names that are not legal python identifiers to be
    collected as packages (143). Thanks to John J Lee for the bug
    report.

0.10.0

  • Fixed bug that broke plugins with names containing underscores or
    hyphens. Thanks to John J Lee for the bug report and patch (Issue
    81).
  • Fixed typo in nose.all. Thanks to John J Lee for the bug report.
  • Fixed handling of test descriptions that are multiline
    docstrings. Thanks to James Casbon for the patch (Issue 50).
  • Improved documentation of doctest plugin to make it clear that
    entities may have doctests, or themselves be tests, but not
    both. Thanks to John J Lee for the bug report and patch (Issue 84).
  • Made file available in non-python-module doctests.
  • Fixed bug that made it impossible for plugins to exclude package
    directories from test discovery (Issue 89). Thanks to John J Lee
    for the bug report and patch.
  • Fixed bug that swallowed TypeError and AttributeError exceptions
    raised in some plugin calls (Issue 95). Thanks to John J Lee for
    the bug report.
  • Fixed inconsistencies in many interfaces and docs. Thanks to John J
    Lee for many bug reports.
  • Fixed bugs in rpm generation (Issue 96). Thanks to Mike Verdone for
    the bug report and http://bugs.python.org/issue644744 for the fix.
  • Fixed inconsisent use of os.environ in plugin testing
    utilities. Thanks to John J Lee for the bug report and patch (Issue
    97).
  • Fixed bug in test_address that prevented use of nose.case.Test in
    doctests (Issue 100). Thanks to John J Lee for the bug report.
  • Fixed bug in error class plugin that caused string exceptions to be
    masked (Issue 101). Thanks to depaula for the bug report.
  • Fixed bugs in tests and the profiler plugin when running under
    Windows (Issue 103). Thanks to Sidnei Da Silva for the bug report.
  • Fixed bugs in plugin calls that caused exception swallowing (Issue
    107). Thanks to John L Lee for the bug report and patch.
  • Added more plugin example doctests. Thanks to Kumar McMillan and
    John L Lee for patches and lots of help.
  • Changed default location of id file for TestId plugin from ~/.noseids to
    .noseids in the configured working directory.

0.10.0b1

  • Added support for a description attribute on tests in function and
    method test cases. Most useful for generators: set the description
    attribute on the yielded function.
  • Fixed incorrect signature of addSuccess() method in
    IPluginInterface. Thanks to nosexunit for the bug report. (Issue
    68).
  • Fixed isclass() function in nose.util so that it will not raise an
    exception when examining instances that have no accessible bases
    attribute. (Issue 65).
  • Fixed passing of tests to result; the test itself and not the
    wrapper was being passed, resulting in test description plugin hooks
    not being called. (Issue 71).
  • Fixed bugs in FailureDetail and Capture plugins, and plugin manager
    and proxy uses of chainable plugin calls. Thanks to Ian Bicking for
    the bug report (Issue 72).
  • Improved documentation.

0.10.0a2

  • Changed entry point name to nose.plugins.0.10 -- dashes and other
    non-word characters besides . are not allowed in entry point names.
    (Issue 67)
  • Fixed loading of plugins from that entry point.
  • Fixed backwards-compatibility issue in nose.util (is_generator was
    renamed isgenerator). (Issue 64)
  • Fixed bug in --logging-config option. Thanks to anton_kr... at yahoo
    com for the bug report. (Issue 62)
  • Fixed bug in handling of --where argument: first --where was not
    passed to loader as workingDir. Thanks to nosexunit for the bug
    report. (Issue 63).

0.10.0a1

  • Rewrote test loader to be more drop-in compatible with
    unittest.TestLoader and to support a more user-friendly command
    line.
  • Rewrote test runner and result classes to reduce duplication of effort.
  • Revised configuration system to be less convoluted.
  • Added nose.case.TestCase as universal wrapper for all
    testcases. Plugins always see instances of this class.
  • Added a management layer to the plugin system, allowing for easy use
    of different plugin loading schemes. The default manager loads
    builtin plugins, 0.10 plugins under the setuptools entrypoint
    nose.plugins.0-10 and provides limited support for legacy plugins
    loaded under the entrypoint nose.plugins.
  • Added plugin hooks in all phases of discovery, running and description.
  • Converted several formely core features to plugins: output capture,
    assert introspection, pdb, and skipped and deprecated test support.
  • Added id plugin that allows for easier specification of tests on the
    command line.
  • Added ErrorClassPlugin base class to allow for easier authoring of
    plugins that handle errors, like the builtin skipped and deprecated
    test plugins.
  • Added support for loading doctests from non-module files for all
    supported python versions.
  • Added score property to plugins to allow plugins to execute in a
    defined order (higher score execute first).
  • Expanded nose's own test suite to include a variety of functional tests.
  • Fixed many bugs.

0.9.3

  • Added support for user configuration files. Thanks to Antoine Pitrou for the
    patch.
  • Fixed bug that caused profiler plugin to leak 0-byte temp files. Thanks to
    Antoine Pitrou for the patch.
  • Made usage of temp files in profiler plugin more sensible. Thanks to Michael
    Sclenker for the bug report.
  • Fixed bug that stopped loading of twisted TestCase tests. Thanks to Kumar
    McMillan for the bug report.
  • Corrected man page location. Thanks to luke macken for the bug report and
    patch.
  • Added with_setup to nose.tools.all. Thanks to Allen Bierbaum for the bug
    report.
  • Altered plugin loading so that builtin plugins can be loaded without
    setuptools. Thanks to Allen Bierbaum for the suggestion.
  • Fixed a bug in the doctests plugin that caused an error when multiple
    exclude arguments were specified. Thanks to mbeachy for the bug report and
    patch.

0.9.2

  • Added nosetests setuptools command. Now you can run python setup.py
    nosetests and have access to all nose features and plugins. Thanks to James
    Casbon for the patch.
  • Added make_decorator function to nose.tools. Used to construct decorator
    functions that are well-behaved and preserve as much of the original
    function's metadata as possible. Thanks to Antoine Pitrou for the patch.
  • Added nose.twistedtools, contributed by Antoine Pitrou. This module adds
    deferred decorator that makes it simple to write deferred tests, with or
    without timeouts.
  • Added monkeypatch to doctests that keeps doctest from stepping on coverage
    when the two plugins are used together. Thanks to David Avraamides for the
    bug report.
  • Added isolation plugin. Use this plugin to automatically restore sys.modules
    after each test module or package. Thanks to Michal Kwiatkowski for the
    feature request.
  • Fixed bug where -vvvv turned off verbose logging instead of making it even
    more verbose. Thanks to Ian Bicking for the bug report.
  • Fixed bug where assert inspection would fail when the trailing """ of a
    docstring was one of the inspected lines. Thanks to cito at online dot de
    for the bug report.
  • Updated attrib plugin to allow selection of test methods by attributes of
    the test case class. Thanks to Jason Hildebrand for the patch.
  • Improved compatibility with python 2.2. Thanks to Chad Whitacre for the
    patch.
  • Fixed bug in handling of options from setup.cfg. Thanks to Kumar McMillan for
    the patch.
  • Fixed bug in generator methods, where a generator method using an inline
    funciton would result in an AttributeError. Thanks to Antoine Pitrou for the
    bug report.
  • Updated coverage plugin to ignore lines tagged with pragma: no cover,
    matching the behavior of coverage.py on the command line. Thanks to Bill
    Zingler for the bug report.
  • Added a man page for nosetests. Thanks to Gustavo Noronha Silva for the
    request and providing an example.

0.9.1

  • New function nose.runmodule() finds and runs tests only in a
    single module, which defaults to main (like unittest.main() or
    doctest.runmodule()). Thanks Greg Wilson for the suggestion.
  • Multiple -w (--where) arguments can now be used in one command line,
    to find and run tests in multiple locations. Thanks Titus Brown for
    the suggestion.
  • Multiple --include and --exclude arguments are now accepted in one command
    line. Thanks Michal Kwiatkowski for the feature request.
  • Coverage will now include modules not imported by any test when
    using the new --cover-inclusive switch. Thanks James Casbon for the
    patch.
  • module:TestClass test selections now properly select all tests in the test
    class.
  • startTest and stopTest are now called in plugins at the beginning and end of
    test suites, including test modules, as well as individual tests. Thanks
    Michal Kwiatkowski for the suggestion.
  • Fix bug in test selection when run as python setup.py test: 'test' was
    passing through and being used as the test name selection. Thanks Kumar
    McMillan for the bug report.
  • Fix bug in handling of -x/--stop option where the test run would stop on
    skipped or deprecated tests. Thanks Kumar McMillan for the bug report.
  • Fix bug in loading tests from projects with layouts that place modules in
    /lib or /src dirs and tests in a parallel /tests dir.
  • Fix bug in python version detection. Thanks Kevin Dangoor for the bug report
    and fix.
  • Fix log message in selector that could raise IndexError. Thanks Kumar
    McMillan for the bug report and patch.
  • Fix bug in handling doctest extension arguments specified in environment and
    on command line. Thanks Ian Bicking for the bug report.
  • Fix bug in running fixtures (setup/teardown) that are not functions, and
    report a better error message when a fixture is not callable. Thanks Ian
    Bicking for the bug report.

0.9.0

  • More unit tests and better test coverage. Numerous bugfixes deriving from
    same.
  • Make --exe option do what it says, and turn it on by default on
    Windows. Add --noexe option so windows users can turn if off.Thanks
    richard at artsalliancemedia dot com for the bug reports.
  • Handle a working directory that happens to be in the middle of a package
    more gracefully. Thanks Max Ischenko for the bug report and test case.
  • Fix bugs in test name comparison when a test module is specified whose name
    overlaps that of a non-test module. Thanks Max Ischenko for the bug report
    and test case.
  • Fix warning spam when a non-existent test file is requested on the command
    line. Thanks Max Ischenko for the bug report.

0.9.0b2

  • Allow --debug to set any logger to DEBUG. Thanks to casbon at gmail dot com
    for the patch.
  • Fix doctest help, which was missing notes about the environment variables
    that it accepts. Thanks to Kumar McMillan for the patch.
  • Restore sys.stdout after run() in nose.core. Thanks to Titus Brown for the
    bug report.
  • Correct handling of trailing comma in attrib plugin args. Thanks Titus Brown
    for the patch.

0.9.0b1

  • Fix bug in handling of OR conditions in attrib plugin. Thanks to Titus
    Brown for the bug report.
  • Fix bug in nose.importer that would cause an attribute error when a local
    module shadowed a builtin, or other object in sys.modules, without a
    file attribute. Thanks to casbon at gmail dot com for the bug report.
  • Fix bug in nose.tools decorators that would cause decorated tests to appear
    with incorrect names in result output.

0.9.0a2

  • In TestLoader, use inspect's isfunction() and ismethod() to filter functions
    and methods, instead of callable(). Thanks to Kumar McMillan for reporting
    the bug.
  • Fix doctest plugin: return an empty iterable when no tests are found in a
    directory instead of None. Thanks to Kumar McMillan for the bug report and
    patch.
  • Ignore executable python modules, unless run with --exe file. This is a
    partial defense against nose causing trouble by loading python modules that
    are not import-safe. The full defense: don't write modules that aren't
    import safe!
  • Catch and warn about errors on plugin load instead of dying.
  • Renamed builtin profile module from nose.plugins.profile to
    nose.plugins.prof to avoid shadowing stdlib profile.py module.

0.9.0a1

  • Add support for plugins, with hooks for selecting, loading and reporting on
    tests. Doctest and coverage are now plugins.
  • Add builtin plugins for profiling with hotshot, selecting tests by
    attribute (contributed by Mika Eloranta), and warning of missed tests
    specified on command line.
  • Change command line test selection syntax to match unittest. Thanks to Titus
    Brown for the suggestion.
  • Option to drop into pdb on error or failure.
  • Option to stop running on first error or failure. Thanks to Kevin Dangoor
    for the suggestion.
  • Support for doctests in files other than python modules (python 2.4 only)
  • Reimplement base test selection as single self-contained class.
  • Reimplement test loading as unittest-compatible TestLoader class.
  • Remove all monkeypatching.
  • Reimplement output capture and assert introspection support in
    unittest-compatible Result class.
  • Better support for multiline constructions in assert introspection.
  • More context output with assert introspections.
  • Refactor setuptools test command support to use proxied result, which
    enables output capture and assert introspection support without
    monkeypatching. Thanks to Philip J. Eby for the suggestion and skeleton
    implementation.
  • Add support for generators in test classes. Thanks to Jay Parlar for the
    suggestion and patch.
  • Add nose.tools package with some helpful test-composition functions and
    decorators, including raises, contributed by Scot Doyle.
  • Reimplement nose.main (TestProgram) to have unittest-compatible signature.
  • All-new import path handling. You can even turn it off! (If you don't,
    nose will ensure that all directories from which it imports anything are on
    sys.path before the import.)
  • Logging package used for verbose logging.
  • Support for skipped and deprecated tests.
  • Configuration is no longer global.

0.8.7

  • Add support for py.test-style test generators. Thanks to Jay Parlar for
    the suggestion.
  • Fix bug in doctest discovery. Thanks to Richard Cooper for the bug report.
  • Fix bug in output capture being appended to later exceptions. Thanks to
    Titus Brown for the patch that uncovered the bug.
  • Fix bug(?) in Exception patch that caused masked hasattr/getattr loops
    to either become actual infinite loops, or at least take so long to finally
    error out that they might as well be infinite.
  • Add -m option to restrict test running to only tests in a particular package
    or module. Like the -f option, -m does not restrict test loading, only
    test execution.
  • When loading and running a test module, ensure that the module's path is in
    sys.path for the duration of the run, not just while importing the module.
  • Add id() method to all callable test classes, for greater unittest
    compatibility.

0.8.6

  • Fix bug with coverage output when sys.modules contains entries without
    file attributes
  • Added -p (--cover-packages) switch that may be used to restrict coverage
    report to modules in the indicated package(s)

0.8.5

  • Output capture and verbose assertion errors now work when run like
    'python setup.py test', as advertised.
  • Code coverage improvements: now coverage will be output for all modules
    imported by any means that were not in sys.modules at the start of the test
    run. By default, test modules will be excluded from the coverage report, but
    you can include them with the -t (--cover-tests) option.

0.8.4

  • Fix bugs in handling of setup/teardown fixtures that could cause TypeError
    exceptions in fixtures to be silently ignored, or multiple fixtures of the
    same type to run. Thanks to Titus Brown for the bug report.

0.8.3

  • Add -V (--version) switch to nosetests
  • Fix bug where sys.path would not be set up correctly when running some
    tests, producing spurious import errors (Thanks to Titus Brown and Mike
    Thomson for the bug reports)
  • For test classses not derived from unittest.TestCase, output (module.Class)
    "doc string" as test description, when method doc string is available
    (Thanks to David Keeney for the suggestion, even if this isn't quite what he
    meant)

0.8.2

  • Revise import to bypass sys.path and manipulate sys.modules more
    intelligently, ensuring that the test module we think we are loading is the
    module we actually load, and that modules loaded by other imports are not
    reloaded without cause
  • Allow test directories inside of packages. Formerly directories matching
    testMatch but lacking an init.py would cause an ImportError when located
    inside of packages
  • Fix bugs in different handling of -f switch in combination with -w and -o

0.8.1

  • Fix bug in main() that resulted in incorrect exit status for nosetests
    script when tests fail
  • Add missing test files to MANIFEST.in
  • Miscellaneous pylint cleanups

0.8

  • Add doctest support
  • Add optional code coverage support, using Ned Batchelder's coverage.py;
    activate with --coverage switch or NOSE_COVERAGE environment variable
  • More informative error message on import error
  • Fix bug where module setup could be called twice and teardown skipped
    for certain setup method names.
  • main() returns success value, does not exit. run_exit() added to support
    old behavior; nosetests script now calls nose.run_exit()

0.7.5

  • Fix bus error on exit
  • Discover tests inside of non-TestCase classes that match testMatch
  • Reorganize selftest: now selftest tests the output of a full nose run
  • Add test_with_setup.py contributed by Kumar McMillan

0.7.2

  • Refactor and correct bugs in discovery and test loading
  • Reorganize and expand documentation
  • Add -f (run this test file only) switch

0.7.1

  • Bugfix release: test files in root of working directory were not being
    stripped of file extension before import.

0.7

  • Change license to LGPL
  • Major rework of output capture and assert introspection
  • Improve test discovery: now finds tests in packages
  • Replace -n switch ('no cwd') with -w switch ('look here')

0.6

  • New nosetests script
  • Allow specification of names on command line that are loadable but not
    directly loadable as modules (eg nosetests -o path/to/tests.py)
  • Add optional py.test-like assert introspection. Thanks to Kevin Dangoor
    for the suggestion.
  • Improvements to selftest

0.5.1

  • Increased compatibility with python 2.3 (and maybe earlier)
  • Increased compatibility with tests written for py.test: now calls
    module.setup_module(module) if module.setup_module() fails

psutil -> 4.3.0

4.3.0

Enhancements

  • 819: [Linux] different speedup improvements:
    Process.ppid() is 20% faster
    Process.status() is 28% faster
    Process.name() is 25% faster
    Process.num_threads is 20% faster on Python 3

Bug fixes

  • 810: [Windows] Windows wheels are incompatible with pip 7.1.2.
  • 812: [NetBSD] fix compilation on NetBSD-5.x.
  • 823: [NetBSD] virtual_memory() raises TypeError on Python 3.
  • 829: [UNIX] psutil.disk_usage() percent field takes root reserved space
    into account.
  • 816: [Windows] fixed net_io_counter() values wrapping after 4.3GB in
    Windows Vista (NT 6.0) and above using 64bit values from newer win APIs.

4.2.0

Enhancements

  • 795: [Windows] new APIs to deal with Windows services: win_service_iter()
    and win_service_get().
  • 800: [Linux] psutil.virtual_memory() returns a new "shared" memory field.
  • 819: [Linux] speedup /proc parsing:
    • Process.ppid() is 20% faster
    • Process.status() is 28% faster
    • Process.name() is 25% faster
    • Process.num_threads is 20% faster on Python 3

Bug fixes

  • 797: [Linux] net_if_stats() may raise OSError for certain NIC cards.
  • 813: Process.as_dict() should ignore extraneous attribute names which gets
    attached to the Process instance.

4.1.0

Enhancements

  • 777: [Linux] Process.open_files() on Linux return 3 new fields: position,
    mode and flags.
  • 779: Process.cpu_times() returns two new fields, 'children_user' and
    'children_system' (always set to 0 on OSX and Windows).
  • 789: [Windows] psutil.cpu_times() return two new fields: "interrupt" and
    "dpc". Same for psutil.cpu_times_percent().
  • 792: new psutil.cpu_stats() function returning number of CPU ctx switches
    interrupts, soft interrupts and syscalls.

Bug fixes

  • 774: [FreeBSD] net_io_counters() dropout is no longer set to 0 if the kernel
    provides it.
  • 776: [Linux] Process.cpu_affinity() may erroneously raise NoSuchProcess.
    (patch by wxwright)
  • 780: [OSX] psutil does not compile with some gcc versions.
  • 786: net_if_addrs() may report incomplete MAC addresses.
  • 788: [NetBSD] virtual_memory()'s buffers and shared values were set to 0.
  • 790: [OSX] psutil won't compile on OSX 10.4.

4.0.0

Enhancements

  • 523: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field.
  • 660: [Windows] make.bat is smarter in finding alternative VS install
    locations. (patch by mpderbec)
  • 732: Process.environ(). (patch by Frank Benkstein)
  • 753: [Linux, OSX, Windows] Process USS and PSS (Linux) "real" memory stats.
    (patch by Eric Rahm)
  • 755: Process.memory_percent() "memtype" parameter.
  • 758: tests now live in psutil namespace.
  • 760: expose OS constants (psutil.LINUX, psutil.OSX, etc.)
  • 756: [Linux] disk_io_counters() return 2 new fields: read_merged_count and
    write_merged_count.
  • 762: new scripts/procsmem.py script.

Bug fixes

  • 685: [Linux] virtual_memory() provides wrong results on systems with a lot
    of physical memory.
  • 704: [Solaris] psutil does not compile on Solaris sparc.
  • 734: on Python 3 invalid UTF-8 data is not correctly handled for process
    name(), cwd(), exe(), cmdline() and open_files() methods resulting in
    UnicodeDecodeError exceptions. 'surrogateescape' error handler is now
    used as a workaround for replacing the corrupted data.
  • 737: [Windows] when the bitness of psutil and the target process was
    different cmdline() and cwd() could return a wrong result or incorrectly
    report an AccessDenied error.
  • 741: [OpenBSD] psutil does not compile on mips64.
  • 751: [Linux] fixed call to Py_DECREF on possible Null object.
  • 754: [Linux] cmdline() can be wrong in case of zombie process.
  • 759: [Linux] Process.memory_maps() may return paths ending with " (deleted)"
  • 761: [Windows] psutil.boot_time() wraps to 0 after 49 days.
  • 764: [NetBSD] fix compilation on NetBSD-6.x.
  • 766: [Linux] net_connections() can't handle malformed /proc/net/unix file.
  • 767: [Linux] disk_io_counters() may raise ValueError on 2.6 kernels and it's
    broken on 2.4 kernels.
  • 770: [NetBSD] disk_io_counters() metrics didn't update.

3.4.2

Enhancements

  • 728: [Solaris] exposed psutil.PROCFS_PATH constant to change the default
    location of /proc filesystem.

Bug fixes

  • 724: [FreeBSD] psutil.virtual_memory().total is incorrect.
  • 730: [FreeBSD] psutil.virtual_memory() crashes.

3.4.1

Enhancements

  • 557: [NetBSD] added NetBSD support. (contributed by Ryo Onodera and
    Thomas Klausner)
  • 708: [Linux] psutil.net_connections() and Process.connections() on Python 2
    can be up to 3x faster in case of many connections.
    Also psutil.Process.memory_maps() is slightly faster.
  • 718: process_iter() is now thread safe.

Bug fixes

  • 714: [OpenBSD] virtual_memory().cached value was always set to 0.
  • 715: don't crash at import time if cpu_times() fail for some reason.
  • 717: [Linux] Process.open_files fails if deleted files still visible.
  • 722: [Linux] swap_memory() no longer crashes if sin/sout can't be determined
    due to missing /proc/vmstat.
  • 724: [FreeBSD] virtual_memory().total is slightly incorrect.

3.3.0

Enhancements

  • 558: [Linux] exposed psutil.PROCFS_PATH constant to change the default
    location of /proc filesystem.
  • 615: [OpenBSD] added OpenBSD support. (contributed by Landry Breuil)

Bug fixes

  • 692: [UNIX] Process.name() is no longer cached as it may change.

3.2.2

Bug fixes

  • 517: [SunOS] net_io_counters failed to detect network interfaces
    correctly on Solaris 10
  • 541: [FreeBSD] disk_io_counters r/w times were expressed in seconds instead
    of milliseconds. (patch by dasumin)
  • 610: [SunOS] fix build and tests on Solaris 10
  • 623: [Linux] process or system connections raises ValueError if IPv6 is not
    supported by the system.
  • 678: [Linux] can't install psutil due to bug in setup.py.
  • 688: [Windows] compilation fails with MSVC 2015, Python 3.5. (patch by
    Mike Sarahan)

3.2.1

Bug fixes

  • 677: [Linux] can't install psutil due to bug in setup.py.

3.2.0

Enhancements

  • 644: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals
    to use with Process.send_signal().
  • 648: CI test integration for OSX. (patch by Jeff Tang)
  • 663: [UNIX] net_if_addrs() now returns point-to-point (VPNs) addresses.
  • 655: [Windows] different issues regarding unicode handling were fixed. On
    Python 2 all APIs returning a string will now return an encoded version of it
    by using sys.getfilesystemencoding() codec. The APIs involved are:
    • psutil.net_if_addrs()
    • psutil.net_if_stats()
    • psutil.net_io_counters()
    • psutil.Process.cmdline()
    • psutil.Process.name()
    • psutil.Process.username()
    • psutil.users()

Bug fixes

  • 513: [Linux] fixed integer overflow for RLIM_INFINITY.
  • 641: [Windows] fixed many compilation warnings. (patch by Jeff Tang)
  • 652: [Windows] net_if_addrs() UnicodeDecodeError in case of non-ASCII NIC
    names.
  • 655: [Windows] net_if_stats() UnicodeDecodeError in case of non-ASCII NIC
    names.
  • 659: [Linux] compilation error on Suse 10. (patch by maozguttman)
  • 664: [Linux] compilation error on Alpine Linux. (patch by Bart van Kleef)
  • 670: [Windows] segfgault of net_if_addrs() in case of non-ASCII NIC names.
    (patch by sk6249)
  • 672: [Windows] compilation fails if using Windows SDK v8.0. (patch by
    Steven Winfield)
  • 675: [Linux] net_connections(); UnicodeDecodeError may occur when listing
    UNIX sockets.

3.1.1

Bug fixes

  • 603: [Linux] ionice_set value range is incorrect. (patch by spacewander)
  • 645: [Linux] psutil.cpu_times_percent() may produce negative results.
  • 656: 'from psutil import *' does not work.

3.1.0

Enhancements

Bug fixes

  • 340: [Windows] Process.open_files() no longer hangs. Instead it uses a
    thred which times out and skips the file handle in case it's taking too long
    to be retrieved. (patch by Jeff Tang, PR 597)
  • 627: [Windows] Process.name() no longer raises AccessDenied for pids owned
    by another user.
  • 636: [Windows] Process.memory_info() raise AccessDenied.
  • 637: [UNIX] raise exception if trying to send signal to Process PID 0 as it
    will affect os.getpid()'s process group instead of PID 0.
  • 639: [Linux] Process.cmdline() can be truncated.
  • 640: [Linux] *connections functions may swallow errors and return an
    incomplete list of connnections.
  • 642: repr() of exceptions is incorrect.
  • 653: [Windows] Add inet_ntop function for Windows XP to support IPv6.
  • 641: [Windows] Replace deprecated string functions with safe equivalents.

3.0.1

Bug fixes

  • 632: [Linux] better error message if cannot parse process UNIX connections.
  • 634: [Linux] Proces.cmdline() does not include empty string arguments.
  • 635: [UNIX] crash on module import if 'enum' package is installed on python
    < 3.4.

3.0.0

Enhancements

  • 250: new psutil.net_if_stats() returning NIC statistics (isup, duplex,
    speed, MTU).
  • 376: new psutil.net_if_addrs() returning all NIC addresses a-la ifconfig.
  • 469: on Python >= 3.4 IOPRIO_CLASS_* and *_PRIORITY_CLASS constants
    returned by psutil.Process' ionice() and nice() methods are enums instead of
    plain integers.
  • 581: add .gitignore. (patch by Gabi Davar)
  • 582: connection constants returned by psutil.net_connections() and
    psutil.Process.connections() were turned from int to enums on Python > 3.4.
  • 587: Move native extension into the package.
  • 589: Process.cpu_affinity() accepts any kind of iterable (set, tuple, ...),
    not only lists.
  • 594: all deprecated APIs were removed.
  • 599: [Windows] process name() can now be determined for all processes even
    when running as a limited user.
  • 602: pre-commit GIT hook.
  • 629: enhanced support for py.test and nose test discovery and tests run.
  • 616: [Windows] Add inet_ntop function for Windows XP.

Bug fixes

  • 428: [all UNIXes except Linux] correct handling of zombie processes;
    introduced new ZombieProcess exception class.
  • 512: [BSD] fix segfault in net_connections().
  • 555: [Linux] psutil.users() correctly handles ":0" as an alias for
    "localhost"
  • 579: [Windows] Fixed open_files() for PID>64K.
  • 579: [Windows] fixed many compiler warnings.
  • 585: [FreeBSD] net_connections() may raise KeyError.
  • 586: [FreeBSD] cpu_affinity() segfaults on set in case an invalid CPU
    number is provided.
  • 593: [FreeBSD] Process().memory_maps() segfaults.
  • 606: Process.parent() may swallow NoSuchProcess exceptions.
  • 611: [SunOS] net_io_counters has send and received swapped
  • 614: [Linux]: cpu_count(logical=False) return the number of physical CPUs
    instead of physical cores.
  • 618: [SunOS] swap tests fail on Solaris when run as normal user
  • 628: [Linux] Process.name() truncates process name in case it contains
    spaces or parentheses.

2.2.1

Bug fixes

  • 496: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references"
    (patch by Bruno Binet)

2.2.0

Enhancements

  • 521: drop support for Python 2.4 and 2.5.
  • 553: new examples/pstree.py script.
  • 564: C extension version mismatch in case the user messed up with psutil
    installation or with sys.path is now detected at import time.
  • 568: New examples/pidof.py script.
  • 569: [FreeBSD] add support for process CPU affinity.

Bug fixes

  • 496: [Solaris] can't import psutil.
  • 547: [UNIX] Process.username() may raise KeyError if UID can't be resolved.
  • 551: [Windows] get rid of the unicode hack for net_io_counters() NIC names.
  • 556: [Linux] lots of file handles were left open.
  • 561: [Linux] net_connections() might skip some legitimate UNIX sockets.
    (patch by spacewander)
  • 565: [Windows] use proper encoding for psutil.Process.username() and
    psutil.users(). (patch by Sylvain Mouquet)
  • 567: [Linux] in the alternative implementation of CPU affinity PyList_Append
    and Py_BuildValue return values are not checked.
  • 569: [FreeBSD] fix memory leak in psutil.cpu_count(logical=False).
  • 571: [Linux] Process.open_files() might swallow AccessDenied exceptions and
    return an incomplete list of open files.

2.1.3

  • 536: [Linux]: fix "undefined symbol: CPU_ALLOC" compilation error.

2.1.2

Enhancements

  • 407: project moved from Google Code to Github; code moved from Mercurial
    to Git.
  • 492: use tox to run tests on multiple python versions. (patch by msabramo)
  • 505: [Windows] distribution as wheel packages.
  • 511: new examples/ps.py sample code.

Bug fixes

  • 340: [Windows] Process.get_open_files() no longer hangs. (patch by
    Jeff Tang)
  • 501: [Windows] disk_io_counters() may return negative values.
  • 503: [Linux] in rare conditions Process exe(), open_files() and
    connections() methods can raise OSError(ESRCH) instead of NoSuchProcess.
  • 504: [Linux] can't build RPM packages via setup.py
  • 506: [Linux] python 2.4 support was broken.
  • 522: [Linux] Process.cpu_affinity() might return EINVAL. (patch by David
    Daeschler)
  • 529: [Windows] Process.exe() may raise unhandled WindowsError exception
    for PIDs 0 and 4. (patch by Jeff Tang)
  • 530: [Linux] psutil.disk_io_counters() may crash on old Linux distros
    (< 2.6.5) (patch by Yaolong Huang)
  • 533: [Linux] Process.memory_maps() may raise TypeError on old Linux distros.

2.1.1

Bug fixes

  • 446: [Windows] fix encoding error when using net_io_counters() on Python 3.
    (patch by Szigeti Gabor Niif)
  • 460: [Windows] net_io_counters() wraps after 4G.
  • 491: [Linux] psutil.net_connections() exceptions. (patch by Alexander Grothe)

2.1.0

Enhancements

  • 387: system-wide open connections a-la netstat.

Bug fixes

  • 421: [Solaris] psutil does not compile on SunOS 5.10 (patch by Naveed
    Roudsari)
  • 489: [Linux] psutil.disk_partitions() return an empty list.

2.0.0

Enhancements

  • 424: [Windows] installer for Python 3.X 64 bit.
  • 427: number of logical and physical CPUs (psutil.cpu_count()).
  • 447: psutil.wait_procs() timeout parameter is now optional.
  • 452: make Process instances hashable and usable with set()s.
  • 453: tests on Python < 2.7 require unittest2 module.
  • 459: add a make file for running tests and other repetitive tasks (also
    on Windows).
  • 463: make timeout parameter of cpu_percent* functions default to 0.0 'cause
    it's a common trap to introduce slowdowns.
  • 468: move documentation to readthedocs.com.
  • 477: process cpu_percent() is about 30% faster. (suggested by crusaderky)
  • 478: [Linux] almost all APIs are about 30% faster on Python 3.X.
  • 479: long deprecated psutil.error module is gone; exception classes now
    live in "psutil" namespace only.

Bug fixes

  • 193: psutil.Popen constructor can throw an exception if the spawned process
    terminates quickly.
  • 340: [Windows] process get_open_files() no longer hangs. (patch by
    jtangvahna.net)
  • 443: [Linux] fix a potential overflow issue for Process.set_cpu_affinity()
    on systems with more than 64 CPUs.
  • 448: [Windows] get_children() and ppid() memory leak (patch by Ulrich
    Klank).
  • 457: [POSIX] pid_exists() always returns True for PID 0.
  • 461: namedtuples are not pickle-able.
  • 466: [Linux] process exe improper null bytes handling. (patch by
    Gautam Singh)
  • 470: wait_procs() might not wait. (patch by crusaderky)
  • 471: [Windows] process exe improper unicode handling. (patch by
    alexmroja.net)
  • 473: psutil.Popen.wait() does not set returncode attribute.
  • 474: [Windows] Process.cpu_percent() is no longer capped at 100%.
  • 476: [Linux] encoding error for process name and cmdline.

API changes

For the sake of consistency a lot of psutil APIs have been renamed.
In most cases accessing the old names will work but it will cause a
DeprecationWarning.

  • psutil.* module level constants have being replaced by functions:

    +-----------------------+-------------------------------+
    | Old name | Replacement |
    +=======================+===============================+
    | psutil.NUM_CPUS | psutil.cpu_cpunt() |
    +-----------------------+-------------------------------+
    | psutil.BOOT_TIME | psutil.boot_time() |
    +-----------------------+-------------------------------+
    | psutil.TOTAL_PHYMEM | psutil.virtual_memory().total |
    +-----------------------+-------------------------------+

  • Renamed psutil.* functions:

    +--------------------------+-------------------------------+
    | Old name | Replacement |
    +==========================+===============================+
    | - psutil.get_pid_list() | psutil.pids() |
    +--------------------------+-------------------------------+
    | - psutil.get_users() | psutil.users() |
    +--------------------------+-------------------------------+
    | - psutil.get_boot_time() | psutil.boot_time() |
    +--------------------------+-------------------------------+

  • All psutil.Process get_* methods lost the get_ prefix.
    get_ext_memory_info() renamed to memory_info_ex().
    Assuming "p = psutil.Process()":

    +--------------------------+----------------------+
    | Old name | Replacement |
    +==========================+======================+
    | p.get_children() | p.children() |
    +--------------------------+----------------------+
    | p.get_connections() | p.connections() |
    +--------------------------+----------------------+
    | p.get_cpu_affinity() | p.cpu_affinity() |
    +--------------------------+----------------------+
    | p.get_cpu_percent() | p.cpu_percent() |
    +--------------------------+----------------------+
    | p.get_cpu_times() | p.cpu_times() |
    +--------------------------+----------------------+
    | p.get_ext_memory_info() | p.memory_info_ex() |
    +--------------------------+----------------------+
    | p.get_io_counters() | p.io_counters() |
    +--------------------------+----------------------+
    | p.get_ionice() | p.ionice() |
    +--------------------------+----------------------+
    | p.get_memory_info() | p.memory_info() |
    +--------------------------+----------------------+
    | p.get_memory_maps() | p.memory_maps() |
    +--------------------------+----------------------+
    | p.get_memory_percent() | p.memory_percent() |
    +--------------------------+----------------------+
    | p.get_nice() | p.nice() |
    +--------------------------+----------------------+
    | p.get_num_ctx_switches() | p.num_ctx_switches() |
    +--------------------------+----------------------+
    | p.get_num_fds() | p.num_fds() |
    +--------------------------+----------------------+
    | p.get_num_threads() | p.num_threads() |
    +--------------------------+----------------------+
    | p.get_open_files() | p.open_files() |
    +--------------------------+----------------------+
    | p.get_rlimit() | p.rlimit() |
    +--------------------------+----------------------+
    | p.get_threads() | p.threads() |
    +--------------------------+----------------------+
    | p.getcwd() | p.cwd() |
    +--------------------------+----------------------+

  • All psutil.Process set_* methods lost the set_ prefix.
    Assuming "p = psutil.Process()":

    +----------------------+---------------------------------+
    | Old name | Replacement |
    +======================+=================================+
    | p.set_nice() | p.nice(value) |
    +----------------------+---------------------------------+
    | p.set_ionice() | p.ionice(ioclass, value=None) |
    +----------------------+---------------------------------+
    | p.set_cpu_affinity() | p.cpu_affinity(cpus) |
    +----------------------+---------------------------------+
    | p.set_rlimit() | p.rlimit(resource, limits=None) |
    +----------------------+---------------------------------+

  • Except for 'pid' all psutil.Process class properties have been turned into
    methods. This is the only case which there are no aliases.
    Assuming "p = psutil.Process()":

    +---------------+-----------------+
    | Old name | Replacement |
    +===============+=================+
    | p.name | p.name() |
    +---------------+-----------------+
    | p.parent | p.parent() |
    +---------------+-----------------+
    | p.ppid | p.ppid() |
    +---------------+-----------------+
    | p.exe | p.exe() |
    +---------------+-----------------+
    | p.cmdline | p.cmdline() |
    +---------------+-----------------+
    | p.status | p.status() |
    +---------------+-----------------+
    | p.uids | p.uids() |
    +---------------+-----------------+
    | p.gids | p.gids() |
    +---------------+-----------------+
    | p.username | p.username() |
    +---------------+-----------------+
    | p.create_time | p.create_time() |
    +---------------+-----------------+

  • timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1.

  • long deprecated psutil.error module is gone; exception classes now live in
    "psutil" namespace only.

  • Process instances' "retcode" attribute returned by psutil.wait_procs() has
    been renamed to "returncode" for consistency with subprocess.Popen.

1.2.1

Bug fixes

  • 348: [Windows XP] fixed "ImportError: DLL load failed" occurring on module
    import.
  • 425: [Solaris] crash on import due to failure at determining BOOT_TIME.
  • 443: [Linux] can't set CPU affinity on systems with more than 64 cores.

1.2.0

Enhancements

  • 439: assume os.getpid() if no argument is passed to psutil.Process
    constructor.
  • 440: new psutil.wait_procs() utility function which waits for multiple
    processes to terminate.

Bug fixes

  • 348: [Windows XP/Vista] fix "ImportError: DLL load failed" occurring on
    module import.

1.1.3

Bug fixes

  • 442: [Linux] psutil won't compile on certain version of Linux because of
    missing prlimit(2) syscall.

1.1.2

Bug fixes

  • 442: [Linux] psutil won't compile on Debian 6.0 because of missing
    prlimit(2) syscall.

1.1.1

Bug fixes

  • 442: [Linux] psutil won't compile on kernels < 2.6.36 due to missing
    prlimit(2) syscall.

1.1.0

Enhancements

  • 410: host tar.gz and windows binary files are on PYPI.
  • 412: [Linux] get/set process resource limits.
  • 415: [Windows] Process.get_children() is an order of magnitude faster.
  • 426: [Windows] Process.name is an order of magnitude faster.
  • 431: [UNIX] Process.name is slightly faster because it unnecessarily
    retrieved also process cmdline.

Bug fixes

  • 391: [Windows] psutil.cpu_times_percent() returns negative percentages.
  • 408: STATUS_* and CONN_* constants don't properly serialize on JSON.
  • 411: [Windows] examples/disk_usage.py may pop-up a GUI error.
  • 413: [Windows] Process.get_memory_info() leaks memory.
  • 414: [Windows] Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER.
  • 416: psutil.disk_usage() doesn't work well with unicode path names.
  • 430: [Linux] process IO counters report wrong number of r/w syscalls.
  • 435: [Linux] psutil.net_io_counters() might report erreneous NIC names.
  • 436: [Linux] psutil.net_io_counters() reports a wrong 'dropin' value.

API changes

  • 408: turn STATUS_* and CONN_* constants into plain Python strings.

1.0.1

Bug fixes

  • 405: network_io_counters(pernic=True) no longer works as intended in 1.0.0.

1.0.0

Enhancements

  • 18: Solaris support (yay!) (thanks Justin Venus)
  • 367: Process.get_connections() 'status' strings are now constants.
  • 380: test suite exits with non-zero on failure. (patch by floppymaster)
  • 391: introduce unittest2 facilities and provide workarounds if unittest2
    is not installed (python < 2.7).

Bug fixes

  • 374: [Windows] negative memory usage reported if process uses a lot of
    memory.
  • 379: [Linux] Process.get_memory_maps() may raise ValueError.
  • 394: [OSX] Mapped memory regions report incorrect file name.
  • 404: [Linux] sched_*affinity() are implicitly declared. (patch by Arfrever)

API changes

  • Process.get_connections() 'status' field is no longer a string but a
    constant object (psutil.CONN_*).
  • Process.get_connections() 'local_address' and 'remote_address' fields
    renamed to 'laddr' and 'raddr'.
  • psutil.network_io_counters() renamed to psutil.net_io_counters().

0.7.1

Bug fixes

  • 325: [BSD] psutil.virtual_memory() can raise SystemError.
    (patch by Jan Beich)
  • 370: [BSD] Process.get_connections() requires root. (patch by John Baldwin)
  • 372: [BSD] different process methods raise NoSuchProcess instead of
    AccessDenied.

0.7.0

Enhancements

  • 233: code migrated to Mercurial (yay!)
  • 246: psutil.error module is deprecated and scheduled for removal.
  • 328: [Windows] process IO nice/priority support.
  • 359: psutil.get_boot_time()
  • 361: [Linux] psutil.cpu_times() now includes new 'steal', 'guest' and
    'guest_nice' fields available on recent Linux kernels.
    Also, psutil.cpu_percent() is more accurate.
  • 362: cpu_times_percent() (per-CPU-time utilization as a percentage)

Bug fixes

  • 234: [Windows] disk_io_counters() fails to list certain disks.
  • 264: [Windows] use of psutil.disk_partitions() may cause a message box to
    appear.
  • 313: [Linux] psutil.virtual_memory() and psutil.swap_memory() can crash on
    certain exotic Linux flavors having an incomplete /proc interface.
    If that's the case we now set the unretrievable stats to 0 and raise a
    RuntimeWarning.
  • 315: [OSX] fix some compilation warnings.
  • 317: [Windows] cannot set process CPU affinity above 31 cores.
  • 319: [Linux] process get_memory_maps() raises KeyError 'Anonymous' on Debian
    squeeze.
  • 321: [UNIX] Process.ppid property is no longer cached as the kernel may set
    the ppid to 1 in case of a zombie process.
  • 323: [OSX] disk_io_counters()'s read_time and write_time parameters were
    reporting microseconds not milliseconds. (patch by Gregory Szorc)
  • 331: Process cmdline is no longer cached after first acces as it may change.
  • 333: [OSX] Leak of Mach ports on OS X (patch by rsesekgoogle.com)
  • 337: [Linux] process methods not working because of a poor /proc
    implementation will raise NotImplementedError rather than RuntimeError
    and Process.as_dict() will not blow up. (patch by Curtin1060)
  • 338: [Linux] disk_io_counters() fails to find some disks.
  • 339: [FreeBSD] get_pid_list() can allocate all the memory on system.
  • 341: [Linux] psutil might crash on import due to error in retrieving system
    terminals map.
  • 344: [FreeBSD] swap_memory() might return incorrect results due to
    kvm_open(3) not being called. (patch by Jean Sebastien)
  • 338: [Linux] disk_io_counters() fails to find some disks.
  • 351: [Windows] if psutil is compiled with mingw32 (provided installers for
    py2.4 and py2.5 are) disk_io_counters() will fail. (Patch by m.malycha)
  • 353: [OSX] get_users() returns an empty list on OSX 10.8.
  • 356: Process.parent now checks whether parent PID has been reused in which
    case returns None.
  • 365: Process.set_nice() should check PID has not been reused by another
    process.
  • 366: [FreeBSD] get_memory_maps(), get_num_fds(), get_open_files() and
    getcwd() Process methods raise RuntimeError instead of AccessDenied.

API changes

  • Process.cmdline property is no longer cached after first access.
  • Process.ppid property is no longer cached after first access.
  • [Linux] Process methods not working because of a poor /proc implementation
    will raise NotImplementedError instead of RuntimeError.
  • psutil.error module is deprecated and scheduled for removal.

0.6.1

Enhancements

  • 316: process cmdline property now makes a better job at guessing the process
    executable from the cmdline.

Bug fixes

  • 316: process exe was resolved in case it was a symlink.
  • 318: python 2.4 compatibility was broken.

API changes

  • process exe can now return an empty string instead of raising AccessDenied.
  • process exe is no longer resolved in case it's a symlink.

0.6.0

Enhancements

  • 216: [POSIX] get_connections() UNIX sockets support.
  • 220: [FreeBSD] get_connections() has been rewritten in C and no longer
    requires lsof.
  • 222: [OSX] add support for process cwd.
  • 261: process extended memory info.
  • 295: [OSX] process executable path is now determined by asking the OS
    instead of being guessed from process cmdline.
  • 297: [OSX] the Process methods below were always raising AccessDenied for
    any process except the current one. Now this is no longer true. Also
    they are 2.5x faster.
    • name
    • get_memory_info()
    • get_memory_percent()
    • get_cpu_times()
    • get_cpu_percent()
    • get_num_threads()
  • 300: examples/pmap.py script.
  • 301: process_iter() now yields processes sorted by their PIDs.
  • 302: process number of voluntary and involuntary context switches.
  • 303: [Windows] the Process methods below were always raising AccessDenied
    for any process not owned by current user. Now this is no longer true:
    • create_time
    • get_cpu_times()
    • get_cpu_percent()
    • get_memory_info()
    • get_memory_percent()
    • get_num_handles()
    • get_io_counters()
  • 305: add examples/netstat.py script.
  • 311: system memory functions has been refactorized and rewritten and now
    provide a more detailed and consistent representation of the system
    memory. New psutil.virtual_memory() function provides the following
    memory amounts:
    • total
    • available
    • percent
    • used
    • active [POSIX]
    • inactive [POSIX]
    • buffers (BSD, Linux)
    • cached (BSD, OSX)
    • wired (OSX, BSD)
    • shared [FreeBSD]
      New psutil.swap_memory() provides:
    • total
    • used
    • free
    • percent
    • sin (no. of bytes the system has swapped in from disk (cumulative))
    • sout (no. of bytes the system has swapped out from disk (cumulative))
      All old memory-related functions are deprecated.
      Also two new example scripts were added: free.py and meminfo.py.
  • 312: psutil.network_io_counters() namedtuple includes 4 new fields:
    errin, errout dropin and dropout, reflecting the number of packets
    dropped and with errors.

Bugfixes

  • 298: [OSX and BSD] memory leak in get_num_fds().
  • 299: potential memory leak every time PyList_New(0) is used.
  • 303: [Windows] potential heap corruption in get_num_threads() and
    get_status() Process methods.
  • 305: [FreeBSD] psutil can't compile on FreeBSD 9 due to removal of utmp.h.
  • 306: at C level, errors are not checked when invoking Py* functions which
    create or manipulate Python objects leading to potential memory related
    errors and/or segmentation faults.
  • 307: [FreeBSD] values returned by psutil.network_io_counters() are wrong.
  • 308: [BSD / Windows] psutil.virtmem_usage() wasn't actually returning
    information about swap memory usage as it was supposed to do. It does
    now.
  • 309: get_open_files() might not return files which can not be accessed
    due to limited permissions. AccessDenied is now raised instead.

API changes

  • psutil.phymem_usage() is deprecated (use psutil.virtual_memory())
  • psutil.virtmem_usage() is deprecated (use psutil.swap_memory())
  • psutil.phymem_buffers() on Linux is deprecated (use psutil.virtual_memory())
  • psutil.cached_phymem() on Linux is deprecated (use psutil.virtual_memory())
  • [Windows and BSD] psutil.virtmem_usage() now returns information about swap
    memory instead of virtual memory.

0.5.1

Enhancements

  • 293: [Windows] process executable path is now determined by asking the OS
    instead of being guessed from process cmdline.

Bugfixes

  • 292: [Linux] race condition in process files/threads/connections.
  • 294: [Windows] Process CPU affinity is only able to set CPU 0.

0.5.0

Enhancements

  • 195: [Windows] number of handles opened by process.
  • 209: psutil.disk_partitions() now provides also mount options.
  • 229: list users currently connected on the system (psutil.get_users()).
  • 238: [Linux, Windows] process CPU affinity (get and set).
  • 242: Process.get_children(recursive=True): return all process
    descendants.
  • 245: [POSIX] Process.wait() incrementally consumes less CPU cycles.
  • 257: [Windows] removed Windows 2000 support.
  • 258: [Linux] Process.get_memory_info() is now 0.5x faster.
  • 260: process's mapped memory regions. (Windows patch by wj32.64, OSX patch
    by Jeremy Whitlock)
  • 262: [Windows] psutil.disk_partitions() was slow due to inspecting the
    floppy disk drive also when "all" argument was False.
  • 273: psutil.get_process_list() is deprecated.
  • 274: psutil no longer requires 2to3 at installation time in order to work
    with Python 3.
  • 278: new Process.as_dict() method.
  • 281: ppid, name, exe, cmdline and create_time properties of Process class
    are now cached after being accessed.
  • 282: psutil.STATUS_* constants can now be compared by using their string
    representation.
  • 283: speedup Process.is_running() by caching its return value in case the
    process is terminated.
  • 284: [POSIX] per-process number of opened file descriptors.
  • 287: psutil.process_iter() now caches Process instances between calls.
  • 290: Process.nice property is deprecated in favor of new get_nice() and
    set_nice() methods.

Bugfixes

  • 193: psutil.Popen constructor can throw an exception if the spawned process
    terminates quickly.
  • 240: [OSX] incorrect use of free() for Process.get_connections().
  • 244: [POSIX] Process.wait() can hog CPU resources if called against a
    process which is not our children.
  • 248: [Linux] psutil.network_io_counters() might return erroneous NIC names.
  • 252: [Windows] process getcwd() erroneously raise NoSuchProcess for
    processes owned by another user. It now raises AccessDenied instead.
  • 266: [Windows] psutil.get_pid_list() only shows 1024 processes.
    (patch by Amoser)
  • 267: [OSX] Process.get_connections() - an erroneous remote address was
    returned. (Patch by Amoser)
  • 272: [Linux] Porcess.get_open_files() - potential race condition can lead to
    unexpected NoSuchProcess exception. Also, we can get incorrect reports
    of not absolutized path names.
  • 275: [Linux] Process.get_io_counters() erroneously raise NoSuchProcess on
    old Linux versions. Where not available it now raises
    NotImplementedError.
  • 286: Process.is_running() doesn't actually check whether PID has been
    reused.
  • 314: Process.get_children() can sometimes return non-children.

API changes

  • Process.nice property is deprecated in favor of new get_nice() and set_nice()
    methods.
  • psutil.get_process_list() is deprecated.
  • ppid, name, exe, cmdline and create_time properties of Process class are now
    cached after being accessed, meaning NoSuchProcess will no longer be raised
    in case the process is gone in the meantime.
  • psutil.STATUS_* constants can now be compared by using their string
    representation.

0.4.1

Bugfixes

  • 228: some example scripts were not working with python 3.
  • 230: [Windows / OSX] memory leak in Process.get_connections().
  • 232: [Linux] psutil.phymem_usage() can report erroneous values which are
    different than "free" command.
  • 236: [Windows] memory/handle leak in Process's get_memory_info(),
    suspend() and resume() methods.

0.4.0

Enhancements

  • 150: network I/O counters. (OSX and Windows patch by Jeremy Whitlock)
  • 154: [FreeBSD] add support for process getcwd()
  • 157: [Windows] provide installer for Python 3.2 64-bit.
  • 198: Process.wait(timeout=0) can now be used to make wait() return
    immediately.
  • 206: disk I/O counters. (OSX and Windows patch by Jeremy Whitlock)
  • 213: examples/iotop.py script.
  • 217: Process.get_connections() now has a "kind" argument to filter
    for connections with different criteria.
  • 221: [FreeBSD] Process.get_open_files has been rewritten in C and no longer
    relies on lsof.
  • 223: examples/top.py script.
  • 227: examples/nettop.py script.

Bugfixes

  • 135: [OSX] psutil cannot create Process object.
  • 144: [Linux] no longer support 0 special PID.
  • 188: [Linux] psutil import error on Linux ARM architectures.
  • 194: [POSIX] psutil.Process.get_cpu_percent() now reports a percentage over
    100 on multicore processors.
  • 197: [Linux] Process.get_connections() is broken on platforms not
    supporting IPv6.
  • 200: [Linux] psutil.NUM_CPUS not working on armel and sparc architectures
    and causing crash on module import.
  • 201: [Linux] Process.get_connections() is broken on big-endian
    architectures.
  • 211: Process instance can unexpectedly raise NoSuchProcess if tested for
    equality with another object.
  • 218: [Linux] crash at import time on Debian 64-bit because of a missing
    line in /proc/meminfo.
  • 226: [FreeBSD] crash at import time on FreeBSD 7 and minor.

0.3.0

Enhancements

  • 125: system per-cpu percentage utilization and times.
  • 163: per-process associated terminal (TTY).
  • 171: added get_phymem() and get_virtmem() functions returning system
    memory information (total, used, free) and memory percent usage.
    total_* avail_* and used_* memory functions are deprecated.
  • 172: disk usage statistics.
  • 174: mounted disk partitions.
  • 179: setuptools is now used in setup.py

Bugfixes

  • 159: SetSeDebug() does not close handles or unset impersonation on return.
  • 164: [Windows] wait function raises a TimeoutException when a process
    returns -1 .
  • 165: process.status raises an unhandled exception.
  • 166: get_memory_info() leaks handles hogging system resources.
  • 168: psutil.cpu_percent() returns erroneous results when used in
    non-blocking mode. (patch by Philip Roberts)
  • 178: OSX - Process.get_threads() leaks memory
  • 180: [Windows] Process's get_num_threads() and get_threads() methods can
    raise NoSuchProcess exception while process still exists.

0.2.1

Enhancements

  • 64: per-process I/O counters.
  • 116: per-process wait() (wait for process to terminate and return its exit
    code).
  • 134: per-process get_threads() returning information (id, user and kernel
    times) about threads opened by process.
  • 136: process executable path on FreeBSD is now determined by asking the
    kernel instead of guessing it from cmdline[0].
  • 137: per-process real, effective and saved user and group ids.
  • 140: system boot time.
  • 142: per-process get and set niceness (priority).
  • 143: per-process status.
  • 147: per-process I/O nice (priority) - Linux only.
  • 148: psutil.Popen class which tidies up subprocess.Popen and psutil.Process
    in a unique interface.
  • 152: [OSX] get_process_open_files() implementation has been rewritten
    in C and no longer relies on lsof resulting in a 3x speedup.
  • 153: [OSX] get_process_connection() implementation has been rewritten
    in C and no longer relies on lsof resulting in a 3x speedup.

Bugfixes

  • 83: process cmdline is empty on OSX 64-bit.
  • 130: a race condition can cause IOError exception be raised on
    Linux if process disappears between open() and subsequent read() calls.
  • 145: WindowsError was raised instead of psutil.AccessDenied when using
    process resume() or suspend() on Windows.
  • 146: 'exe' property on Linux can raise TypeError if path contains NULL
    bytes.
  • 151: exe and getcwd() for PID 0 on Linux return inconsistent data.

API changes

  • Process "uid" and "gid" properties are deprecated in favor of "uids" and
    "gids" properties.

0.2.0

Enhancements

  • 79: per-process open files.
  • 88: total system physical cached memory.
  • 88: total system physical memory buffers used by the kernel.
  • 91: per-process send_signal() and terminate() methods.
  • 95: NoSuchProcess and AccessDenied exception classes now provide "pid",
    "name" and "msg" attributes.
  • 97: per-process children.
  • 98: Process.get_cpu_times() and Process.get_memory_info now return
    a namedtuple instead of a tuple.
  • 103: per-process opened TCP and UDP connections.
  • 107: add support for Windows 64 bit. (patch by cjgohlke)
  • 111: per-process executable name.
  • 113: exception messages now include process name and pid.
  • 114: process username Windows implementation has been rewritten in pure
    C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
    longer required as a third-party dependancy. (patch by wj32)
  • 117: added support for Windows 2000.
  • 123: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
    new 'interval' parameter.
  • 129: per-process number of threads.

Bugfixes

  • 80: fixed warnings when installing psutil with easy_install.
  • 81: psutil fails to compile with Visual Studio.
  • 94: suspend() raises OSError instead of AccessDenied.
  • 86: psutil didn't compile against FreeBSD 6.x.
  • 102: orphaned process handles obtained by using OpenProcess in C were
    left behind every time Process class was instantiated.
  • 111: path and name Process properties report truncated or erroneous
    values on UNIX.
  • 120: cpu_percent() always returning 100% on OS X.
  • 112: uid and gid properties don't change if process changes effective
    user/group id at some point.
  • 126: ppid, uid, gid, name, exe, cmdline and create_time properties are
    no longer cached and correctly raise NoSuchProcess exception if the process
    disappears.

API changes

  • psutil.Process.path property is deprecated and works as an alias for "exe"
    property.
  • psutil.Process.kill(): signal argument was removed - to send a signal to the
    process use send_signal(signal) method instead.
  • psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
  • psutil.cpu_times() returns a nametuple instead of a tuple.
  • New psutil.Process methods: get_open_files(), get_connections(),
    send_signal() and terminate().
  • ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
    cached and raise NoSuchProcess exception if process disappears.
  • psutil.cpu_percent() no longer returns immediately (see issue 123).
  • psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
    immediately by default (see issue 123).

0.1.3

Enhancements

  • 14: per-process username
  • 51: per-process current working directory (Windows and Linux only)
  • 59: Process.is_running() is now 10 times faster
  • 61: added supoprt for FreeBSD 64 bit
  • 71: implemented suspend/resume process
  • 75: python 3 support

Bugfixes

  • 36: process cpu_times() and memory_info() functions succeeded also for dead
    processes while a NoSuchProcess exception is supposed to be raised.
  • 48: incorrect size for mib array defined in getcmdargs for BSD
  • 49: possible memory leak due to missing free() on error condition on
  • 50: fixed getcmdargs() memory fragmentation on BSD
  • 55: test_pid_4 was failing on Windows Vista
  • 57: some unit tests were failing on systems where no swap memory is
    available
  • 58: is_running() is now called before kill() to make sure we are going
    to kill the correct process.
  • 73: virtual memory size reported on OS X includes shared library size
  • 77: NoSuchProcess wasn't raised on Process.create_time if kill() was
    used first.

0.1.2

Enhancements

  • 32: Per-process CPU user/kernel times
  • 33: Process create time
  • 34: Per-process CPU utilization percentage
  • 38: Per-process memory usage (bytes)
  • 41: Per-process memory utilization (percent)
  • 39: System uptime
  • 43: Total system virtual memory
  • 46: Total system physical memory
  • 44: Total system used/free virtual and physical memory

Bugfixes

  • 36: [Windows] NoSuchProcess not raised when accessing timing methods.
  • 40: test_get_cpu_times() failing on FreeBSD and OS X.
  • 42: [Windows] get_memory_percent() raises AccessDenied.

0.1.1

Enhancements

  • 4: FreeBSD support for all functions of psutil
  • 9: Process.uid and Process.gid now retrieve process UID and GID.
  • 11: Support for parent/ppid - Process.parent property returns a
    Process object representing the parent process, and Process.ppid returns
    the parent PID.
  • 12 & 15:
    NoSuchProcess exception now raised when creating an object
    for a nonexistent process, or when retrieving information about a process
    that has gone away.
  • 21: AccessDenied exception created for raising access denied errors
    from OSError or WindowsError on individual platforms.
  • 26: psutil.process_iter() function to iterate over processes as
    Process objects with a generator.
  • ?: Process objects can now also be compared with == operator for equality
    (PID, name, command line are compared).

Bugfixes

  • 16: [Windows] Special case for "System Idle Process" (PID 0) which
    otherwise would return an "invalid parameter" exception.
  • 17: get_process_list() ignores NoSuchProcess and AccessDenied
    exceptions during building of the list.
  • 22: [Windows] Process(0).kill() was failing with an unset exception.
  • 23: Special case for pid_exists(0)
  • 24: [Windows] Process(0).kill() now raises AccessDenied exception instead
    of WindowsError.
  • 30: psutil.get_pid_list() was returning two ins

lxml -> 3.6.1

3.6.1

Features added

  • GH180: Separate option inline_style for Cleaner that only removes style
    attributes instead of all styles. Patch by Christian Pedersen.
  • GH196: Windows build support for Python 3.5. Contribution by Maximilian Hils.

Bugs fixed

  • GH199: Exclude file fields from FormElement.form_values (as browsers do).
    Patch by Tomas Divis.
  • GH198, LP1568167: Try to provide base URL from Resolver.resolve_string().
    Patch by Michael van Tellingen.
  • GH191: More accurate float serialisation in objectify.FloatElement.
    Patch by Holger Joukl.
  • LP1551797: Repair XSLT error logging. Patch by Marcus Brinkmann.

3.6.0

Features added

  • GH187: Now supports (only) version 5.x and later of PyPy.
    Patch by Armin Rigo.
  • GH181: Direct support for .rnc files in RelaxNG() if rnc2rng
    is installed. Patch by Dirkjan Ochtman.

Bugs fixed

  • GH189: Static builds honour FTP proxy configurations when downloading
    the external libs. Patch by Youhei Sakurai.
  • GH186: Soupparser failed to process entities in Python 3.x.
    Patch by Duncan Morris.
  • GH185: Rare encoding related TypeError on import was fixed.
    Patch by Petr Demin.

3.5.0

Bugs fixed

  • Unicode string results failed XPath queries in PyPy.
  • LP1497051: HTML target parser failed to terminate on exceptions
    and continued parsing instead.
  • Deprecated API usage in doctestcompare.

3.5.0b1

Features added

  • cleanup_namespaces() accepts a new argument keep_ns_prefixes
    that does not remove definitions of the provided prefix-namespace
    mapping from the tree.
  • cleanup_namespaces() accepts a new argument top_nsmap that
    moves definitions of the provided prefix-namespace mapping to the
    top of the tree.
  • LP1490451: Element objects gained a cssselect() method as
    known from lxml.html. Patch by Simon Sapin.
  • API functions and methods behave and look more like Python functions,
    which allows introspection on them etc. One side effect to be aware of
    is that the functions now bind as methods when assigned to a class
    variable. A quick fix is to wrap them in staticmethod() (as for
    normal Python functions).
  • ISO-Schematron support gained an option error_finder that allows
    passing a filter function for picking validation errors from reports.
  • LP1243600: Elements in lxml.html gained a classes property
    that provides a set-like interface to the class attribute.
    Original patch by masklinn.
  • LP1341964: The soupparser now handles DOCTYPE declarations, comments
    and processing instructions outside of the root element.
    Patch by Olli Pottonen.
  • LP1421512: The docinfo of a tree was made editable to allow
    setting and removing the public ID and system ID of the DOCTYPE.
    Patch by Olli Pottonen.
  • LP1442427: More work-arounds for quirks and bugs in pypy and pypy3.
  • lxml.html.soupparser now uses BeautifulSoup version 4 instead
    of version 3 if available.

Bugs fixed

  • Memory errors that occur during tree adaptations (e.g. moving subtrees
    to foreign documents) could leave the tree in a crash prone state.
  • Calling process_children() in an XSLT extension element without
    an output_parent argument failed with a TypeError.
    Fix by Jens Tröger.
  • GH162: Image data in HTML data URLs is considered safe and
    no longer removed by lxml.html.clean JavaScript cleaner.
  • GH166: Static build could link libraries in wrong order.
  • GH172: Rely a bit more on libxml2 for encoding detection rather than
    rolling our own in some cases. Patch by Olli Pottonen.
  • GH159: Validity checks for names and string content were tightened
    to detect the use of illegal characters early. Patch by Olli Pottonen.
  • LP1421921: Comments/PIs before the DOCTYPE declaration were not
    serialised. Patch by Olli Pottonen.
  • LP659367: Some HTML DOCTYPE declarations were not serialised.
    Patch by Olli Pottonen.
  • LP1238503: lxml.doctestcompare is now consistent with stdlib's doctest
    in how it uses + and - to refer to unexpected and missing output.
  • Empty prefixes are explicitly rejected when a namespace mapping is used
    with ElementPath to avoid hiding bugs in user code.
  • Several problems with PyPy were fixed by switching to Cython 0.23.

3.4.4

Bugs fixed

  • An ElementTree compatibility test added in lxml 3.4.3 that failed in
    Python 3.4+ was removed again.

3.4.3

Bugs fixed

  • Expression cache in ElementPath was ignored. Fix by Changaco.
  • LP1426868: Passing a default namespace and a prefixed namespace mapping
    as nsmap into xmlfile.element() raised a TypeError.
  • LP1421927: DOCTYPE system URLs were incorrectly quoted when containing
    double quotes. Patch by Olli Pottonen.
  • LP1419354: meta-redirect URLs were incorrectly processed by
    iterlinks() if preceded by whitespace.

3.4.2

Bugs fixed

  • LP1415907: Crash when creating an XMLSchema from a non-root element
    of an XML document.
  • LP1369362: HTML cleaning failed when hitting processing instructions
    with pseudo-attributes.
  • CDATA() wrapped content was rejected for tail text.
  • CDATA sections were not serialised as tail text of the top-level element.

3.4.1

Features added

  • New htmlfile HTML generator to accompany the incremental xmlfile
    serialisation API. Patch by Burak Arslan.

Bugs fixed

  • lxml.sax.ElementTreeContentHandler did not initialise its superclass.

3.4.0

Features added

  • xmlfile(buffered=False) disables output buffering and flushes the
    content after each API operation (starting/ending element blocks or writes).
    A new method xf.flush() can alternatively be used to explicitly flush
    the output.
  • lxml.html.document_fromstring has a new option ensure_head_body=True
    which will add an empty head and/or body element to the result document if
    missing.
  • lxml.html.iterlinks now returns links inside meta refresh tags.
  • New XMLParser option collect_ids=False to disable ID hash table
    creation. This can substantially speed up parsing of documents with many
    different IDs that are not used.
  • The parser uses per-document hash tables for XML IDs. This reduces the
    load of the global parser dict and speeds up parsing for documents with
    many different IDs.
  • ElementTree.getelementpath(element) returns a structural ElementPath
    expression for the given element, which can be used for lookups later.
  • xmlfile() accepts a new argument close=True to close file(-like)
    objects after writing to them. Before, xmlfile() only closed the file
    if it had opened it internally.
  • Allow "bytearray" type for ASCII text input.

Bugs fixed

Other changes

  • LP400588: decoding errors have become hard errors even in recovery mode.
    Previously, they could lead to an internal tree representation in a mixed
    encoding state, which lead to very late errors or even silently incorrect
    behaviour during tree traversal or serialisation.
  • Requires Python 2.6, 2.7, 3.2 or later. No longer supports
    Python 2.4, 2.5 and 3.1, use lxml 3.3.x for those.
  • Requires libxml2 2.7.0 or later and libxslt 1.1.23 or later,
    use lxml 3.3.x with older versions.

3.3.6

Bugs fixed

  • Prevent tree cycle creation when adding Elements as siblings.
  • LP1361948: crash when deallocating Element siblings without parent.
  • LP1354652: crash when traversing internally loaded documents in XSLT
    extension functions.

3.3.5

Bugs fixed

  • HTML cleaning could fail to strip javascript links that mix control
    characters into the link scheme.

3.3.4

Features added

  • Source line numbers above 65535 are available on Elements when
    using libxml2 2.9 or later.

Bugs fixed

  • lxml.html.fragment_fromstring() failed for bytes input in Py3.

Other changes

3.3.3

Bugs fixed

  • LP1287118: Crash when using Element subtypes with __slots__.

Other changes

  • The internal classes _LogEntry and _Attrib can no longer be
    subclassed from Python code.

3.3.2

Bugs fixed

  • The properties resolvers and version, as well as the methods
    set_element_class_lookup() and makeelement(), were lost from
    iterparse objects in 3.3.0.
  • LP1222132: instances of XMLSchema, Schematron and RelaxNG
    did not clear their local error_log before running a validation.
  • LP1238500: lxml.doctestcompare mixed up "expected" and "actual" in
    attribute values.
  • Some file I/O tests were failing in MS-Windows due to non-portable temp
    file usage. Initial patch by Gabi Davar.
  • LP910014: duplicate IDs in a document were not reported by DTD validation.
  • LP1185332: tostring(method=&quot;html&quot;) did not use HTML serialisation
    semantics for trailing tail text. Initial patch by Sylvain Viollon.
  • LP1281139: .attrib value of Comments lost its mutation methods
    in 3.3.0. Even though it is empty and immutable, it should still
    provide the same interface as that returned for Elements.

3.3.1

Features added

Bugs fixed

  • LP1014290: HTML documents parsed with parser.feed() failed to find
    elements during tag iteration.
  • LP1273709: Building in PyPy failed due to missing support for
    PyUnicode_Compare() and PyByteArray_*() in PyPy's C-API.
  • LP1274413: Compilation in MSVC failed due to missing "stdint.h" standard
    header file.
  • LP1274118: iterparse() failed to parse BOM prefixed files.

Other changes

3.3.0

Features added

Bugs fixed

  • The heuristic that distinguishes file paths from URLs was tightened
    to produce less false negatives.

Other changes

3.3.0beta5

Features added

  • The PEP 393 unicode parsing support gained a fallback for wchar strings
    which might still be somewhat common on Windows systems.

Bugs fixed

  • Several error handling problems were fixed throughout the code base that
    could previously lead to exceptions being silently swallowed or not
    properly reported.
  • The C-API function appendChild() is now deprecated as it does not
    propagate exceptions (its return type is void). The new function
    appendChildToElement() was added as a safe replacement.
  • Passing a string into fromstringlist() raises an exception instead of
    parsing the string character by character.

Other changes

  • Document cleanup code was simplified using the new GC features in
    Cython 0.20.

3.3.0beta4

Features added

Bugs fixed

  • The (empty) value returned by the attrib property of Entity and Comment
    objects was mutable.
  • Element class lookup wasn't available for the new pull parsers or when using
    a custom parser target.
  • Setting Element attributes on instantiation with both the attrib argument
    and keyword arguments could modify the mapping passed as attrib.
  • LP1266171: DTDs instantiated from internal/external subsets (i.e. through
    the docinfo property) lost their attribute declarations.

Other changes

  • Built with Cython 0.20pre (gitrev 012ae82eb) to prepare support for
    Python 3.4.

3.3.0beta3

Features added

  • Unicode string parsing was optimised for Python 3.3 (PEP 393).

Bugs fixed

  • HTML parsing of Unicode strings could misdecode the input on some platforms.
  • Crash in xmlfile() when closing open elements out of order in an error case.

Other changes

3.3.0beta2

Features added

  • iterparse() supports the recover option.

Bugs fixed

  • Crash in iterparse() for HTML parsing.
  • Crash in target parsing with attributes.

Other changes

  • The safety check in the read-only tree implementation (e.g. used by
    PythonElementClassLookup) raises a more appropriate ReferenceError
    for illegal access after tree disposal instead of an AssertionError.
    This should only impact test code that specifically checks the original
    behaviour.

3.3.0beta1

Features added

  • New option handle_failures in make_links_absolute() and
    resolve_base_href() (lxml.html) that enables ignoring or
    discarding links that fail to parse as URLs.
  • New parser classes XMLPullParser and HTMLPullParser for
    incremental parsing, as implemented for ElementTree in Python 3.4.
  • iterparse() enables recovery mode by default for HTML parsing
    (html=True).

Bugs fixed

  • LP1255132: crash when trying to run validation over non-Element (e.g.
    comment or PI).
  • Error messages in the log and in exception messages that originated
    from libxml2 could accidentally be picked up from preceding warnings
    instead of the actual error.
  • The ElementMaker in lxml.objectify did not accept a dict as
    argument for adding attributes to the element it's building. This
    works as in lxml.builder now.
  • LP1228881: repr(XSLTAccessControl) failed in Python 3.
  • Raise ValueError when trying to append an Element to itself or
    to one of its own descendants, instead of running into an infinite
    loop.
  • LP1206077: htmldiff discarded whitespace from the output.
  • Compressed plain-text serialisation to file-like objects was broken.
  • lxml.html.formfill: Fix textarea form filling.
    The textarea used to be cleared before the new content was set,
    which removed the name attribute.

Other changes

  • Some basic API classes use freelists internally for faster
    instantiation. This can speed up some iterparse() scenarios,
    for example.
  • iterparse() was rewritten to use the new *PullParser
    classes internally instead of being a parser itself.

3.2.5

Features added

Bugs fixed

  • Crash in xmlfile() when closing open elements out of order in an error case.
  • Crash in target parsing with attributes.
  • LP1255132: crash when trying to run validation over non-Element (e.g.
    comment or PI).

Other changes

3.2.4

Features added

Bugs fixed

  • Memory leak when creating an XPath evaluator in a thread.
  • LP1228881: repr(XSLTAccessControl) failed in Python 3.
  • Raise ValueError when trying to append an Element to itself or
    to one of its own descendants.
  • LP1206077: htmldiff discarded whitespace from the output.
  • Compressed plain-text serialisation to file-like objects was broken.

Other changes

3.2.3

Bugs fixed

  • Fix support for Python 2.4 which was lost in 3.2.2.

3.2.2

Features added

Bugs fixed

  • LP1185701: spurious XMLSyntaxError after finishing iterparse().
  • Crash in lxml.objectify during xsi annotation.

Other changes

  • Return values of user provided element class lookup methods are now
    validated against the type of the XML node they represent to prevent
    API class mismatches.

3.2.1

Features added

  • The methods apply_templates() and process_children() of XSLT
    extension elements have gained two new boolean options elements_only
    and remove_blank_text that discard either all strings or whitespace-only
    strings from the result list.

Bugs fixed

  • When moving Elements to another tree, the namespace cleanup mechanism
    no longer drops namespace prefixes from attributes for which it finds
    a default namespace declaration, to prevent them from appearing as
    unnamespaced attributes after serialisation.
  • Returning non-type objects from a custom class lookup method could lead
    to a crash.
  • Instantiating and using subtypes of Comments and ProcessingInstructions
    crashed.

Other changes

3.2.0

Features added

Bugs fixed

  • LP690319: Leading whitespace could change the behaviour of the string
    parsing functions in lxml.html.
  • LP599318: The string parsing functions in lxml.html are more robust
    in the face of uncommon HTML content like framesets or missing body tags.
    Patch by Stefan Seelmann.
  • LP712941: I/O errors while trying to access files with paths that contain
    non-ASCII characters could raise UnicodeDecodeError instead of properly
    reporting the IOError.
  • LP673205: Parsing from in-memory strings disabled network access in the
    default parser and made subsequent attempts to parse from a URL fail.
  • LP971754: lxml.html.clean appends 'nofollow' to 'rel' attributes instead
    of overwriting the current value.
  • LP715687: lxml.html.clean no longer discards scripts that are explicitly
    allowed by the user provided whitelist. Patch by Christine Koppelt.

Other changes

3.1.2

Features added

Bugs fixed

  • LP1136509: Passing attributes through the namespace-unaware API of
    the sax bridge (i.e. the handler.startElement() method) failed
    with a TypeError. Patch by Mike Bayer.
  • LP1123074: Fix serialisation error in XSLT output when converting
    the result tree to a Unicode string.
  • GH105: Replace illegal usage of xmlBufLength() in libxml2 2.9.0
    by properly exported API function xmlBufUse().

Other changes

3.1.1

Features added

Bugs fixed

  • LP1160386: Write access to lxml.html.FormElement.fields raised
    an AttributeError in Py3.
  • Illegal memory access during cleanup in incremental xmlfile writer.

Other changes

  • The externally useless class lxml.etree._BaseParser was removed
    from the module dict.

3.1.0

Features added

  • GH89: lxml.html.clean allows overriding the set of attributes that it
    considers 'safe'. Patch by Francis Devereux.

Bugs fixed

  • LP1104370: copy.copy(el.attrib) raised an exception. It now returns
    a copy of the attributes as a plain Python dict.
  • GH95: When used with namespace prefixes, the el.find*() methods
    always used the first namespace mapping that was provided for each
    path expression instead of using the one that was actually passed
    in for the current run.
  • LP1092521, GH91: Fix undefined C symbol in Python runtimes compiled
    without threading support. Patch by Ulrich Seidl.

Other changes

3.1beta1

Features added

  • New build-time option --with-unicode-strings for Python 2 that
    makes the API always return Unicode strings for names and text
    instead of byte strings for plain ASCII content.
  • New incremental XML file writing API etree.xmlfile().
  • E factory in lxml.objectify is callable to simplify the creation of
    tags with non-identifier names without having to resort to getattr().

Bugs fixed

  • When starting from a non-namespaced element in lxml.objectify, searching
    for a child without explicitly specifying a namespace incorrectly found
    namespaced elements with the requested local name, instead of restricting
    the search to non-namespaced children.
  • GH85: Deprecation warnings were fixed for Python 3.x.
  • GH33: lxml.html.fromstring() failed to accept bytes input in Py3.
  • LP1080792: Static build of libxml2 2.9.0 failed due to missing file.

Other changes

  • The externally useless class _ObjectifyElementMakerCaller was
    removed from the module API of lxml.objectify.
  • LP1075622: lxml.builder is faster for adding text to elements with
    many children. Patch by Anders Hammarquist.

3.0.2

Features added

Bugs fixed

  • Fix crash during interpreter shutdown by switching to Cython 0.17.3 for building.

Other changes

3.0.1

Features added

Bugs fixed

  • LP1065924: Element proxies could disappear during garbage collection
    in PyPy without proper cleanup.
  • GH71: Failure to work with libxml2 2.6.x.
  • LP1065139: static MacOS-X build failed in Py3.

Other changes

3.0

Features added

Bugs fixed

  • End-of-file handling was incorrect in iterparse() when reading from
    a low-level C file stream and failed in libxml2 2.9.0 due to its
    improved consistency checks.

Other changes

  • The build no longer uses Cython by default unless the generated C files
    are missing. To use Cython, pass the option "--with-cython". To ignore
    the fatal build error when Cython is required but not available (e.g. to
    run special setup.py commands that do not actually run a build), pass
    "--without-cython".

3.0beta1

Features added

  • Python level access to (optional) libxml2 memory debugging features
    to simplify debugging of memory leaks etc.

Bugs fixed

  • Fix a memory leak in XPath by switching to Cython 0.17.1.
  • Some tests were adapted to work with PyPy.

Other changes

  • The code was adapted to work with the upcoming libxml2 2.9.0 release.

3.0alpha2

Features added

  • The .iter() method of elements now accepts tag arguments like
    &quot;{*}name&quot; to search for elements with a given local name in any
    namespace. With this addition, all combinations of wildcards now work
    as expected:
    &quot;{ns}name&quot;, &quot;{}name&quot;, &quot;{*}name&quot;, &quot;{ns}*&quot;, &quot;{}*&quot;
    and &quot;{*}*&quot;. Note that &quot;name&quot; is equivalent to &quot;{}name&quot;,
    but &quot;*&quot; is &quot;{*}*&quot;.
    The same change applies to the .getiterator(), .itersiblings(),
    .iterancestors(), .iterdescendants(), .iterchildren()
    and .itertext() methods;the strip_attributes(),
    strip_elements() and strip_tags() functions as well as the
    iterparse() class. Patch by Simon Sapin.
  • C14N allows specifying the inclusive prefixes to be promoted
    to top-level during exclusive serialisation.

Bugs fixed

  • Passing long Unicode strings into the feed() parser interface
    failed to read the entire string.

Other changes

3.0alpha1

Features added

  • Initial support for building in PyPy (through cpyext).
  • DTD objects gained an API that allows read access to their
    declarations.
  • xpathgrep.py gained support for parsing line-by-line (e.g.
    from grep output) and for surrounding the output with a new root
    tag.
  • E-factory in lxml.builder accepts subtypes of known data
    types (such as string subtypes) when building elements around them.
  • Tree iteration and iterparse() with a selective tag
    argument supports passing a set of tags. Tree nodes will be
    returned by the iterators if they match any of the tags.

Bugs fixed

  • The .find*() methods in lxml.objectify no longer use XPath
    internally, which makes them faster in many cases (especially when
    short circuiting after a single or couple of elements) and fixes
    some behavioural differences compared to lxml.etree. Note that
    this means that they no longer support arbitrary XPath expressions
    but only the subset that the ElementPath language supports.
    The previous implementation was also redundant with the normal
    XPath support, which can be used as a replacement.
  • el.find(&#39;*&#39;) could accidentally return a comment or processing
    instruction that happened to be in the wrong spot. (Same for the
    other .find*() methods.)
  • The error logging is less intrusive and avoids a global setup where
    possible.
  • Fixed undefined names in html5lib parser.
  • xpathgrep.py did not work in Python 3.
  • Element.attrib.update() did not accept an attrib of
    another Element as parameter.
  • For subtypes of ElementBase that make the .text or .tail
    properties immutable (as in objectify, for example), inserting text
    when creating Elements through the E-Factory feature of the class
    constructor would fail with an exception, stating that the text
    cannot be modified.

Other changes

  • The code base was overhauled to properly use 'const' where the API
    of libxml2 and libxslt requests it. This also has an impact on the
    public C-API of lxml itself, as defined in etreepublic.pxd, as
    well as the provided declarations in the lxml/includes/ directory.
    Code that uses these declarations may have to be adapted. On the
    plus side, this fixes several C compiler warnings, also for user
    code, thus making it easier to spot real problems again.
  • The functionality of "lxml.cssselect" was moved into a separate PyPI
    package called "cssselect". To continue using it, you must install
    that package separately. The "lxml.cssselect" module is still
    available and provides the same interface, provided the "cssselect"
    package can be imported at runtime.
  • Element attributes passed in as an attrib dict or as keyword
    arguments are now sorted by (namespaced) name before being created
    to make their order predictable for serialisation and iteration.
    Note that adding or deleting attributes afterwards does not take
    that order into account, i.e. setting a new attribute appends it
    after the existing ones.
  • Several classes that are for internal use only were removed
    from the lxml.etree module dict:
    _InputDocument, _ResolverRegistry, _ResolverContext, _BaseContext, _ExsltRegExp, _IterparseContext, _TempStore, _ExceptionContext, __ContentOnlyElement, _AttribIterator, _NamespaceRegistry, _ClassNamespaceRegistry, _FunctionNamespaceRegistry, _XPathFunctionNamespaceRegistry, _ParserDictionaryContext, _FileReaderContext, _ParserContext, _PythonSaxParserTarget, _TargetParserContext, _ReadOnlyProxy, _ReadOnlyPIProxy, _ReadOnlyEntityProxy, _ReadOnlyElementProxy, _OpaqueNodeWrapper, _OpaqueDocumentWrapper, _ModifyContentOnlyProxy, _ModifyContentOnlyPIProxy, _ModifyContentOnlyEntityProxy, _AppendOnlyElementProxy, _SaxParserContext, _FilelikeWriter, _ParserSchemaValidationContext, _XPathContext, _XSLTResolverContext, _XSLTContext, _XSLTQuotedStringParam
  • Several internal classes can no longer be inherited from:
    _InputDocument, _ResolverRegistry, _ExsltRegExp, _ElementUnicodeResult, _IterparseContext, _TempStore, _AttribIterator, _ClassNamespaceRegistry, _XPathFunctionNamespaceRegistry, _ParserDictionaryContext, _FileReaderContext, _PythonSaxParserTarget, _TargetParserContext, _ReadOnlyPIProxy, _ReadOnlyEntityProxy, _OpaqueDocumentWrapper, _ModifyContentOnlyPIProxy, _ModifyContentOnlyEntityProxy, _AppendOnlyElementProxy, _FilelikeWriter, _ParserSchemaValidationContext, _XPathContext, _XSLTResolverContext, _XSLTContext, _XSLTQuotedStringParam, _XSLTResultTree, _XSLTProcessingInstruction

2.3.6

Features added

Bugs fixed

  • Passing long Unicode strings into the feed() parser interface
    failed to read the entire string.

Other changes

2.3.5

Features added

Bugs fixed

  • Crash when merging text nodes in element.remove().
  • Crash in sax/target parser when reporting empty doctype.

Other changes

2.3.4

Features added

Bugs fixed

  • Crash when building an nsmap (Element property) with empty
    namespace URIs.
  • Crash due to race condition when errors (or user messages) occur
    during threaded XSLT processing.
  • XSLT stylesheet compilation could ignore compilation errors.

Other changes

2.3.3

Features added

  • lxml.html.tostring() gained new serialisation options
    with_tail and doctype.

Bugs fixed

  • Fixed a crash when using iterparse() for HTML parsing and
    requesting start events.
  • Fixed parsing of more selectors in cssselect. Whitespace before
    pseudo-elements and pseudo-classes is significant as it is a
    descendant combinator.
    "E :pseudo" should parse the same as "E *:pseudo", not "E:pseudo".
    Patch by Simon Sapin.
  • lxml.html.diff no longer raises an exception when hitting
    'img' tags without 'src' attribute.

Other changes

2.3.2

Features added

  • lxml.objectify.deannotate() has a new boolean option
    cleanup_namespaces to remove the objectify namespace
    declarations (and generally clean up the namespace declarations)
    after removing the type annotations.
  • lxml.objectify gained its own SubElement() function as a
    copy of etree.SubElement to avoid an otherwise redundant import
    of lxml.etree on the user side.

Bugs fixed

  • Fixed the "descendant" bug in cssselect a second time (after a first
    fix in lxml 2.3.1). The previous change resulted in a serious
    performance regression for the XPath based evaluation of the
    translated expression. Note that this breaks the usage of some of
    the generated XPath expressions as XSLT location paths that
    previously worked in 2.3.1.
  • Fixed parsing of some selectors in cssselect. Whitespace after combinators
    ">", "+" and "~" is now correctly ignored. Previously is was parsed as
    a descendant combinator. For example, "div> .foo" was parsed the same as
    "div>* .foo" instead of "div>.foo". Patch by Simon Sapin.

Other changes

2.3.1

Features added

  • New option kill_tags in lxml.html.clean to remove specific
    tags and their content (i.e. their whole subtree).
  • pi.get() and pi.attrib on processing instructions to parse
    pseudo-attributes from the text content of processing instructions.
  • lxml.get_include() returns a list of include paths that can be
    used to compile external C code against lxml.etree. This is
    specifically required for statically linked lxml builds when code
    needs to compile against the exact same header file versions as lxml
    itself.
  • Resolver.resolve_file() takes an additional option
    close_file that configures if the file(-like) object will be
    closed after reading or not. By default, the file will be closed,
    as the user is not expected to keep a reference to it.

Bugs fixed

  • HTML cleaning didn't remove 'data:' links.
  • The html5lib parser integration now uses the 'official'
    implementation in html5lib itself, which makes it work with newer
    releases of the library.
  • In lxml.sax, endElementNS() could incorrectly reject a plain
    tag name when the corresponding start event inferred the same plain
    tag name to be in the default namespace.
  • When an open file-like object is passed into parse() or
    iterparse(), the parser will no longer close it after use. This
    reverts a change in lxml 2.3 where all files would be closed. It is
    the users responsibility to properly close the file(-like) object,
    also in error cases.
  • Assertion error in lxml.html.cleaner when discarding top-level elements.
  • In lxml.cssselect, use the xpath 'A//B' (short for
    'A/descendant-or-self::node()/B') instead of 'A/descendant::B' for
    the css descendant selector ('A B'). This makes a few edge cases
    like &quot;div *:last-child&quot; consistent with the selector behavior in
    WebKit and Firefox, and makes more css expressions valid location
    paths (for use in xsl:template match).
  • In lxml.html, non-selected &lt;option&gt; tags no longer show up in the
    collected form values.
  • Adding/removing &lt;option&gt; values to/from a multiple select form
    field properly selects them and unselects them.

Other changes

  • Static builds can specify the download directory with the
    --download-dir option.

2.3

Features added

  • When looking for children, lxml.objectify takes '{}tag' as
    meaning an empty namespace, as opposed to the parent namespace.

Bugs fixed

  • When finished reading from a file-like object, the parser
    immediately calls its .close() method.
  • When finished parsing, iterparse() immediately closes the input
    file.
  • Work-around for libxml2 bug that can leave the HTML parser in a
    non-functional state after parsing a severely broken document (fixed
    in libxml2 2.7.8).
  • marque tag in HTML cleanup code is correctly named marquee.

Other changes

  • Some public functions in the Cython-level C-API have more explicit
    return types.

2.3beta1

Features added

Bugs fixed

  • Crash in newer libxml2 versions when moving elements between
    documents that had attributes on replaced XInclude nodes.
  • XMLID() function was missing the optional parser and
    base_url parameters.
  • Searching for wildcard tags in iterparse() was broken in Py3.
  • lxml.html.open_in_browser() didn't work in Python 3 due to the
    use of os.tempnam. It now takes an optional 'encoding' parameter.

Other changes

2.3alpha2

Features added

Bugs fixed

  • Crash in XSLT when generating text-only result documents with a
    stylesheet created in a different thread.

Other changes

  • repr() of Element objects shows the hex ID with leading 0x
    (following ElementTree 1.3).

2.3alpha1

Features added

  • Keyword argument namespaces in lxml.cssselect.CSSSelector()
    to pass a prefix-to-namespace mapping for the selector.
  • New function lxml.etree.register_namespace(prefix, uri) that
    globally registers a namespace prefix for a namespace that newly
    created Elements in that namespace will use automatically. Follows
    ElementTree 1.3.
  • Support 'unicode' string name as encoding parameter in
    tostring(), following ElementTree 1.3.
  • Support 'c14n' serialisation method in ElementTree.write() and
    tostring(), following ElementTree 1.3.
  • The ElementPath expression syntax (el.find*()) was extended to
    match the upcoming ElementTree 1.3 that will ship in the standard
    library of Python 3.2/2.7. This includes extended support for
    predicates as well as namespace prefixes (as known from XPath).
  • During regular XPath evaluation, various ESXLT functions are
    available within their namespace when using libxslt 1.1.26 or later.
  • Support passing a readily configured logger instance into
    PyErrorLog, instead of a logger name.
  • On serialisation, the new doctype parameter can be used to
    override the DOCTYPE (internal subset) of the document.
  • New parameter output_parent to XSLTExtension.apply_templates()
    to append the resulting content directly to an output element.
  • XSLTExtension.process_children() to process the content of the
    XSLT extension element itself.
  • ISO-Schematron support based on the de-facto Schematron reference
    'skeleton implementation'.
  • XSLT objects now take XPath object as __call__ stylesheet
    parameters.
  • Enable path caching in ElementPath (el.find*()) to avoid parsing
    overhead.
  • Setting the value of a namespaced attribute always uses a prefixed
    namespace instead of the default namespace even if both declare the
    same namespace URI. This avoids serialisation problems when an
    attribute from a default namespace is set on an element from a
    different namespace.
  • XSLT extension elements: support for XSLT context nodes other than
    elements: document root, comments, processing instructions.
  • Support for strings (in addition to Elements) in node-sets returned
    by extension functions.
  • Forms that lack an action attribute default to the base URL of
    the document on submit.
  • XPath attribute result strings have an attrname property.
  • Namespace URIs get validated against RFC 3986 at the API level
    (required by the XML namespace specification).
  • Target parsers show their target object in the .target property
    (compatible with ElementTree).

Bugs fixed

  • API is hardened against invalid proxy instances to prevent crashes
    due to incorrectly instantiated Element instances.
  • Prevent crash when instantiating CommentBase and friends.
  • Export ElementTree compatible XML parser class as
    XMLTreeBuilder, as it is called in ET 1.2.
  • ObjectifiedDataElements in lxml.objectify were not hashable. They
    now use the hash value of the underlying Python value (string,
    number, etc.) to which they compare equal.
  • Parsing broken fragments in lxml.html could fail if the fragment
    contained an orphaned closing '</div>' tag.
  • Using XSLT extension elements around the root of the output document
    crashed.
  • lxml.cssselect did not distinguish between x[attr=&quot;val&quot;] and
    x [attr=&quot;val&quot;] (with a space). The latter now matches the
    attribute independent of the element.
  • Rewriting multiple links inside of HTML text content could end up
    replacing unrelated content as replacements could impact the
    reported position of subsequent matches. Modifications are now
    simplified by letting the iterlinks() generator in lxml.html
    return links in reversed order if they appear inside the same text
    node. Thus, replacements and link-internal modifications no longer
    change the position of links reported afterwards.
  • The .value attribute of textarea elements in lxml.html did
    not represent the complete raw value (including child tags etc.). It
    now serialises the complete content on read and replaces the
    complete content by a string on write.
  • Target parser didn't call .close() on the target object if
    parsing failed. Now it is guaranteed that .close() will be
    called after parsing, regardless of the outcome.

Other changes

  • Official support for Python 3.1.2 and later.
  • Static MS Windows builds can now download their dependencies
    themselves.
  • Element.attrib no longer uses a cyclic reference back to its
    Element object. It therefore no longer requires the garbage
    collector to clean up.
  • Static builds include libiconv, in addition to libxml2 and libxslt.

2.2.8

Bugs fixed

  • Crash in newer libxml2 versions when moving elements between
    documents that had attributes on replaced XInclude nodes.
  • Import fix for urljoin in Python 3.1+.

2.2.7

Bugs fixed

  • Crash in XSLT when generating text-only result documents with a
    stylesheet created in a different thread.

2.2.6

Bugs fixed

  • Fixed several Python 3 regressions by building with Cython 0.11.3.

2.2.5

Features added

  • Support for running XSLT extension elements on the input root node
    (e.g. in a template matching on "/").

Bugs fixed

  • Crash in XPath evaluation when reading smart strings from a document
    other than the original context document.
  • Support recent versions of html5lib by not requiring its
    XHTMLParser in htmlparser.py anymore.
  • Manually instantiating the custom element classes in
    lxml.objectify could crash.
  • Invalid XML text characters were not rejected by the API when they
    appeared in unicode strings directly after non-ASCII characters.
  • lxml.html.open_http_urllib() did not work in Python 3.
  • The functions strip_tags() and strip_elements() in
    lxml.etree did not remove all occurrences of a tag in all cases.
  • Crash in XSLT extension elements when the XSLT context node is not
    an element.

2.2.4

Bugs fixed

  • Static build of libxml2/libxslt was broken.

2.2.3

Features added

Bugs fixed

  • The resolve_entities option did not work in the incremental feed
    parser.
  • Looking up and deleting attributes without a namespace could hit a
    namespaced attribute of the same name instead.
  • Late errors during calls to SubElement() (e.g. attribute related
    ones) could leave a partially initialised element in the tree.
  • Modifying trees that contain parsed entity references could result
    in an infinite loop.
  • ObjectifiedElement.setattr created an empty-string child element when the
    attribute value was rejected as a non-unicode/non-ascii string
  • Syntax errors in lxml.cssselect could result in misleading error
    messages.
  • Invalid syntax in CSS expressions could lead to an infinite loop in
    the parser of lxml.cssselect.
  • CSS special character escapes were not properly handled in
    lxml.cssselect.
  • CSS Unicode escapes were not properly decoded in lxml.cssselect.
  • Select options in HTML forms that had no explicit value
    attribute were not handled correctly. The HTML standard dictates
    that their value is defined by their text content. This is now
    supported by lxml.html.
  • XPath raised a TypeError when finding CDATA sections. This is now
    fully supported.
  • Calling help(lxml.objectify) didn't work at the prompt.
  • The ElementMaker in lxml.objectify no longer defines the default
    namespaces when annotation is disabled.
  • Feed parser failed to honour the 'recover' option on parse errors.
  • Diverting the error logging to Python's logging system was broken.

Other changes

2.2.2

Features added

  • New helper functions strip_attributes(), strip_elements(),
    strip_tags() in lxml.etree to remove attributes/subtrees/tags
    from a subtree.

Bugs fixed

  • Namespace cleanup on subtree insertions could result in missing
    namespace declarations (and potentially crashes) if the element
    defining a namespace was deleted and the namespace was not used by
    the top element of the inserted subtree but only in deeper subtrees.
  • Raising an exception from a parser target callback didn't always
    terminate the parser.
  • Only {true, false, 1, 0} are accepted as the lexical representation for
    BoolElement ({True, False, T, F, t, f} not any more), restoring lxml <= 2.0
    behaviour.

Other changes

2.2.1

Features added

  • Injecting default attributes into a document during XML Schema
    validation (also at parse time).
  • Pass huge_tree parser option to disable parser security
    restrictions imposed by libxml2 2.7.

Bugs fixed

  • The script for statically building libxml2 and libxslt didn't work
    in Py3.
  • XMLSchema() also passes invalid schema documents on to libxml2
    for parsing (which could lead to a crash before release 2.6.24).

Other changes

2.2

Features added

  • Support for standalone flag in XML declaration through
    tree.docinfo.standalone and by passing standalone=True/False
    on serialisation.

Bugs fixed

  • Crash when parsing an XML Schema with external imports from a
    filename.

2.2beta4

Features added

  • Support strings and instantiable Element classes as child arguments
    to the constructor of custom Element classes.
  • GZip compression support for serialisation to files and file-like
    objects.

Bugs fixed

  • Deep-copying an ElementTree copied neither its sibling PIs and
    comments nor its internal/external DTD subsets.
  • Soupparser failed on broken attributes without values.
  • Crash in XSLT when overwriting an already defined attribute using
    xsl:attribute.
  • Crash bug in exception handling code under Python 3. This was due
    to a problem in Cython, not lxml itself.
  • lxml.html.FormElement._name() failed for non top-level forms.
  • TAG special attribute in constructor of custom Element classes
    was evaluated incorrectly.

Other changes

  • Official support for Python 3.0.1.
  • Element.findtext() now returns an empty string instead of None
    for Elements without text content.

2.2beta3

Features added

  • XSLT.strparam() class method to wrap quoted string parameters
    that require escaping.

Bugs fixed

  • Memory leak in XPath evaluators.
  • Crash when parsing indented XML in one thread and merging it with
    other documents parsed in another thread.
  • Setting the base attribute in lxml.objectify from a unicode
    string failed.
  • Fixes following changes in Python 3.0.1.
  • Minor fixes for Python 3.

Other changes

  • The global error log (which is copied into the exception log) is now
    local to a thread, which fixes some race conditions.
  • More robust error handling on serialisation.

2.2beta2

Bugs fixed

  • Potential memory leak on exception handling. This was due to a
    problem in Cython, not lxml itself.
  • iter_links (and related link-rewriting functions) in
    lxml.html would interpret CSS like url(&quot;link&quot;) incorrectly
    (treating the quotation marks as part of the link).
  • Failing import on systems that have an io module.

2.2beta1

Features added

  • Allow lxml.html.diff.htmldiff to accept Element objects, not
    just HTML strings.

Bugs fixed

  • Crash when using an XPath evaluator in multiple threads.
  • Fixed missing whitespace before Link:... in lxml.html.diff.

Other changes

  • Export lxml.html.parse.

2.2alpha1

Features added

  • Support for XSLT result tree fragments in XPath/XSLT extension
    functions.
  • QName objects have new properties namespace and localname.
  • New options for exclusive C14N and C14N without comments.
  • Instantiating a custom Element classes creates a new Element.

Bugs fixed

  • XSLT didn't inherit the parse options of the input document.
  • 0-bytes could slip through the API when used inside of Unicode
    strings.
  • With lxml.html.clean.autolink, links with balanced parenthesis,
    that end in a parenthesis, will be linked in their entirety (typical
    with Wikipedia links).

Other changes

2.1.5

Bugs fixed

  • Potential memory leak on exception handling. This was due to a
    problem in Cython, not lxml itself.
  • Failing import on systems that have an io module.

2.1.4

Bugs fixed

  • Crash when using an XPath evaluator in multiple threads.

2.1.3

Features added

Bugs fixed

  • Ref-count leaks when lxml enters a try-except statement while an
    outside exception lives in sys.exc_*(). This was due to a problem in
    Cython, not lxml itself.
  • Parser Unicode decoding errors could get swallowed by other
    exceptions.
  • Name/import errors in some Python modules.
  • Internal DTD subsets that did not specify a system or public ID were
    not serialised and did not appear in the docinfo property of
    ElementTrees.
  • Fix a pre-Py3k warning when parsing from a gzip file in Py2.6.
  • Test suite fixes for libxml2 2.7.
  • Resolver.resolve_string() did not work for non-ASCII byte strings.
  • Resolver.resolve_file() was broken.
  • Overriding the parser encoding didn't work for many encodings.

Other changes

2.1.2

Features added

  • lxml.etree now tries to find the absolute path name of files when
    parsing from a file-like object. This helps custom resolvers when
    resolving relative URLs, as lixbml2 can prepend them with the path
    of the source document.

Bugs fixed

  • Memory problem when passing documents between threads.
  • Target parser did not honour the recover option and raised an
    exception instead of calling .close() on the target.

Other changes

2.1.1

Features added

Bugs fixed

  • Crash when parsing XSLT stylesheets in a thread and using them in
    another.
  • Encoding problem when including text with ElementInclude under
    Python 3.

Other changes

2.1

Features added

  • Smart strings can be switched off in XPath (smart_strings
    keyword option).
  • lxml.html.rewrite_links() strips links to work around documents
    with whitespace in URL attributes.

Bugs fixed

  • Custom resolvers were not used for XMLSchema includes/imports and
    XInclude processing.
  • CSS selector parser dropped remaining expression after a function
    with parameters.

Other changes

  • objectify.enableRecursiveStr() was removed, use
    objectify.enable_recursive_str() instead
  • Speed-up when running XSLTs on documents from other threads

2.1beta3

Features added

  • Major overhaul of tools/xpathgrep.py script.
  • Pickling ElementTree objects in lxml.objectify.
  • Support for parsing from file-like objects that return unicode
    strings.
  • New function etree.cleanup_namespaces(el) that removes unused
    namespace declarations from a (sub)tree (experimental).
  • XSLT results support the buffer protocol in Python 3.
  • Polymorphic functions in lxml.html that accept either a tree or
    a parsable string will return either a UTF-8 encoded byte string, a
    unicode string or a tree, based on the type of the input.
    Previously, the result was always a byte string or a tree.
  • Support for Python 2.6 and 3.0 beta.
  • File name handling now uses a heuristic to convert between byte
    strings (usually filenames) and unicode strings (usually URLs).
  • Parsing from a plain file object frees the GIL under Python 2.x.
  • Running iterparse() on a plain file (or filename) frees the GIL
    on reading under Python 2.x.
  • Conversion functions html_to_xhtml() and xhtml_to_html() in
    lxml.html (experimental).
  • Most features in lxml.html work for XHTML namespaced tag names
    (experimental).

Bugs fixed

  • ElementTree.parse() didn't handle target parser result.
  • Crash in Element class lookup classes when the init() method of
    the super class is not called from Python subclasses.
  • A number of problems related to unicode/byte string conversion of
    filenames and error messages were fixed.
  • Building on MacOS-X now passes the "flat_namespace" option to the C
    compiler, which reportedly prevents build quirks and crashes on this
    platform.
  • Windows build was broken.
  • Rare crash when serialising to a file object with certain encodings.

Other changes

  • Non-ASCII characters in attribute values are no longer escaped on
    serialisation.
  • Passing non-ASCII byte strings or invalid unicode strings as .tag,
    namespaces, etc. will result in a ValueError instead of an
    AssertionError (just like the tag well-formedness check).
  • Up to several times faster attribute access (i.e. tree traversal) in
    lxml.objectify.

2.1beta2

Features added

  • All parse functions in lxml.html take a parser keyword argument.
  • lxml.html has a new parser class XHTMLParser and a module
    attribute xhtml_parser that provide XML parsers that are
    pre-configured for the lxml.html package.

Bugs fixed

  • Moving a subtree from a document created in one thread into a
    document of another thread could crash when the rest of the source
    document is deleted while the subtree is still in use.
  • Passing an nsmap when creating an Element will no longer strip
    redundantly defined namespace URIs. This prevented the definition
    of more than one prefix for a namespace on the same Element.

Other changes

  • If the default namespace is redundantly defined with a prefix on the
    same Element, the prefix will now be preferred for subelements and
    attributes. This allows users to work around a problem in libxml2
    where attributes from the default namespace could serialise without
    a prefix even when they appear on an Element with a different
    namespace (i.e. they would end up in the wrong namespace).

2.1beta1

Features added

  • Error logging in Schematron (requires libxml2 2.6.32 or later).
  • Parser option strip_cdata for normalising or keeping CDATA
    sections. Defaults to True as before, thus replacing CDATA
    sections by their text content.
  • CDATA() factory to wrap string content as CDATA section.

Bugs fixed

  • Resolving to a filename in custom resolvers didn't work.
  • lxml did not honour libxslt's second error state "STOPPED", which
    let some XSLT errors pass silently.
  • Memory leak in Schematron with libxml2 >= 2.6.31.
  • lxml.etree accepted non well-formed namespace prefix names.

Other changes

  • Major cleanup in internal moveNodeToDocument() function, which
    takes care of namespace cleanup when moving elements between
    different namespace contexts.
  • New Elements created through the makeelement() method of an HTML
    parser or through lxml.html now end up in a new HTML document
    (doctype HTML 4.01 Transitional) instead of a generic XML document.
    This mostly impacts the serialisation and the availability of a DTD
    context.

2.1alpha1

Features added

  • New event types 'comment' and 'pi' in iterparse().
  • XSLTAccessControl instances have a property options that
    returns a dict of access configuration options.
  • Constant instances DENY_ALL and DENY_WRITE on
    XSLTAccessControl class.
  • Extension elements for XSLT (experimental!)
  • Element.base property returns the xml:base or HTML base URL of
    an Element.
  • docinfo.URL property is writable.

Bugs fixed

  • Default encoding for plain text serialisation was different from
    that of XML serialisation (UTF-8 instead of ASCII).

Other changes

  • Minor API speed-ups.
  • The benchmark suite now uses tail text in the trees, which makes the
    absolute numbers incomparable to previous results.
  • Generating the HTML documentation now requires Pygments_, which is
    used to enable syntax highlighting for the doctest examples.

.. _Pygments: http://pygments.org/

Most long-time deprecated functions and methods were removed:

  • etree.clearErrorLog(), use etree.clear_error_log()

  • etree.useGlobalPythonLog(), use
    etree.use_global_python_log()

  • etree.ElementClassLookup.setFallback(), use
    etree.ElementClassLookup.set_fallback()

  • etree.getDefaultParser(), use etree.get_default_parser()

  • etree.setDefaultParser(), use etree.set_default_parser()

  • etree.setElementClassLookup(), use
    etree.set_element_class_lookup()

    Note that parser.setElementClassLookup() has not been removed
    yet, although parser.set_element_class_lookup() should be used
    instead.

  • xpath_evaluator.registerNamespace(), use
    xpath_evaluator.register_namespace()

  • xpath_evaluator.registerNamespaces(), use
    xpath_evaluator.register_namespaces()

  • objectify.setPytypeAttributeTag, use
    objectify.set_pytype_attribute_tag

  • objectify.setDefaultParser(), use
    objectify.set_default_parser()

2.0.11

Bugs fixed

  • Crash when using an XPath evaluator in multiple threads.

2.0.10

Bugs fixed

  • Ref-count leaks when lxml enters a try-except statement while an
    outside exception lives in sys.exc_*(). This was due to a problem in
    Cython, not lxml itself.

2.0.9

Bugs fixed

  • Memory problem when passing documents between threads.
  • Target parser did not honour the recover option and raised an
    exception instead of calling .close() on the target.

2.0.8

Features added

  • lxml.html.rewrite_links() strips links to work around documents
    with whitespace in URL attributes.

Bugs fixed

  • Crash when parsing XSLT stylesheets in a thread and using them in
    another.
  • CSS selector parser dropped remaining expression after a function
    with parameters.

Other changes

2.0.7

Features added

  • Pickling ElementTree objects in lxml.objectify.

Bugs fixed

  • Descending dot-separated classes in CSS selectors were not resolved
    correctly.
  • ElementTree.parse() didn't handle target parser result.
  • Potential threading problem in XInclude.
  • Crash in Element class lookup classes when the init() method of
    the super class is not called from Python subclasses.

Other changes

  • Non-ASCII characters in attribute values are no longer escaped on
    serialisation.

2.0.6

Features added

Bugs fixed

  • Incorrect evaluation of el.find(&quot;tag[child]&quot;).
  • Windows build was broken.
  • Moving a subtree from a document created in one thread into a
    document of another thread could crash when the rest of the source
    document is deleted while the subtree is still in use.
  • Rare crash when serialising to a file object with certain encodings.

Other changes

  • lxml should now build without problems on MacOS-X.

2.0.5

Features added

Bugs fixed

  • Resolving to a filename in custom resolvers didn't work.
  • lxml did not honour libxslt's second error state "STOPPED", which
    let some XSLT errors pass silently.
  • Memory leak in Schematron with libxml2 >= 2.6.31.

Other changes

2.0.4

Features added

Bugs fixed

  • Hanging thread in conjunction with GTK threading.
  • Crash bug in iterparse when moving elements into other documents.
  • HTML elements' .cssselect() method was broken.
  • ElementTree.find*() didn't accept QName objects.

Other changes

2.0.3

Features added

  • soupparser.parse() allows passing keyword arguments on to
    BeautifulSoup.
  • fromstring() method in lxml.html.soupparser.

Bugs fixed

  • lxml.html.diff didn't treat empty tags properly (e.g.,
    &lt;br&gt;).
  • Handle entity replacements correctly in target parser.
  • Crash when using iterparse() with XML Schema validation.
  • The BeautifulSoup parser (soupparser.py) did not replace entities,
    which made them turn up in text content.
  • Attribute assignment of custom PyTypes in objectify could fail to
    correctly serialise the value to a string.

Other changes

  • lxml.html.ElementSoup was replaced by a new module
    lxml.html.soupparser with a more consistent API. The old module
    remains for compatibility with ElementTree's own ElementSoup module.
  • Setting the XSLT_CONFIG and XML2_CONFIG environment variables at
    build time will let setup.py pick up the xml2-config and
    xslt-config scripts from the supplied path name.
  • Passing --with-xml2-config=/path/to/xml2-config to setup.py will
    override the xml2-config script that is used to determine the C
    compiler options. The same applies for the --with-xslt-config
    option.

2.0.2

Features added

  • Support passing base_url to file parser functions to override
    the filename of the file(-like) object.

Bugs fixed

  • The prefix for objectify's pytype namespace was missing from the set
    of default prefixes.
  • Memory leak in Schematron (fixed only for libxml2 2.6.31+).
  • Error type names in RelaxNG were reported incorrectly.
  • Slice deletion bug fixed in objectify.

Other changes

  • Enabled doctests for some Python modules (especially lxml.html).
  • Add a method argument to lxml.html.tostring()
    (method=&quot;xml&quot; for XHTML output).
  • Make it clearer that methods like lxml.html.fromstring() take a
    base_url argument.

2.0.1

Features added

  • Child iteration in lxml.pyclasslookup.
  • Loads of new docstrings reflect the signature of functions and
    methods to make them visible in API docs and help()

Bugs fixed

  • The module lxml.html.builder was duplicated as
    lxml.htmlbuilder
  • Form elements would return None for form.fields.keys() if there
    was an unnamed input field. Now unnamed input fields are completely
    ignored.
  • Setting an element slice in objectify could insert slice-overlapping
    elements at the wrong position.

Other changes

  • The generated API documentation was cleaned up and disburdened from
    non-public classes etc.
  • The previously public module lxml.html.setmixin was renamed to
    lxml.html._setmixin as it is not an official part of lxml. If
    you want to use it, feel free to copy it over to your own source
    base.
  • Passing --with-xslt-config=/path/to/xslt-config to setup.py will
    override the xslt-config script that is used to determine the C
    compiler options.

2.0

Features added

  • Passing the unicode type as encoding to tostring() will
    serialise to unicode. The tounicode() function is now
    deprecated.
  • XMLSchema() and RelaxNG() can parse from StringIO.
  • makeparser() function in lxml.objectify to create a new
    parser with the usual objectify setup.
  • Plain ASCII XPath string results are no longer forced into unicode
    objects as in 2.0beta1, but are returned as plain strings as before.
  • All XPath string results are 'smart' objects that have a
    getparent() method to retrieve their parent Element.
  • with_tail option in serialiser functions.
  • More accurate exception messages in validator creation.
  • Parse-time XML schema validation (schema parser keyword).
  • XPath string results of the text() function and attribute
    selection make their Element container accessible through a
    getparent() method. As a side-effect, they are now always
    unicode objects (even ASCII strings).
  • XSLT objects are usable in any thread - at the cost of a deep
    copy if they were not created in that thread.
  • Invalid entity names and character references will be rejected by
    the Entity() factory.
  • entity.text returns the textual representation of the entity,
    e.g. &amp;amp;.
  • New properties position and code on ParseError exception (as
    in ET 1.3)
  • Rich comparison of element.attrib proxies.
  • ElementTree compatible TreeBuilder class.
  • Use default prefixes for some common XML namespaces.
  • lxml.html.clean.Cleaner now allows for a host_whitelist, and
    two overridable methods: allow_embedded_url(el, url) and the
    more general allow_element(el).
  • Extended slicing of Elements as in element[1:-1:2], both in
    etree and in objectify
  • Resolvers can now provide a base_url keyword argument when
    resolving a document as string data.
  • When using lxml.doctestcompare you can give the doctest option
    NOPARSE_MARKUP (like doctest: +NOPARSE_MARKUP) to suppress
    the special checking for one test.
  • Separate feed_error_log property for the feed parser interface.
    The normal parser interface and iterparse continue to use
    error_log.
  • The normal parsers and the feed parser interface are now separated
    and can be used concurrently on the same parser instance.
  • fromstringlist() and tostringlist() functions as in
    ElementTree 1.3
  • iterparse() accepts an html boolean keyword argument for
    parsing with the HTML parser (note that this interface may be
    subject to change)
  • Parsers accept an encoding keyword argument that overrides the encoding
    of the parsed documents.
  • New C-API function hasChild() to test for children
  • annotate() function in objectify can annotate with Python types and XSI
    types in one step. Accompanied by xsiannotate() and pyannotate().
  • ET.write(), tostring() and tounicode() now accept a keyword
    argument method that can be one of 'xml' (or None), 'html' or 'text' to
    serialise as XML, HTML or plain text content.
  • iterfind() method on Elements returns an iterator equivalent to
    findall()
  • itertext() method on Elements
  • Setting a QName object as value of the .text property or as an attribute
    will resolve its prefix in the respective context
  • ElementTree-like parser target interface as described in
    http://effbot.org/elementtree/elementtree-xmlparser.htm
  • ElementTree-like feed parser interface on XMLParser and HTMLParser
    (feed() and close() methods)
  • Reimplemented objectify.E for better performance and improved
    integration with objectify. Provides extended type support based on
    registered PyTypes.
  • XSLT objects now support deep copying
  • New makeSubElement() C-API function that allows creating a new
    subelement straight with text, tail and attributes.
  • XPath extension functions can now access the current context node
    (context.context_node) and use a context dictionary
    (context.eval_context) from the context provided in their first
    parameter
  • HTML tag soup parser based on BeautifulSoup in lxml.html.ElementSoup
  • New module lxml.doctestcompare by Ian Bicking for writing simplified
    doctests based on XML/HTML output. Use by importing lxml.usedoctest or
    lxml.html.usedoctest from within a doctest.
  • New module lxml.cssselect by Ian Bicking for selecting Elements with CSS
    selectors.
  • New package lxml.html written by Ian Bicking for advanced HTML
    treatment.
  • Namespace class setup is now local to the ElementNamespaceClassLookup
    instance and no longer global.
  • Schematron validation (incomplete in libxml2)
  • Additional stringify argument to objectify.PyType() takes a
    conversion function to strings to support setting text values from arbitrary
    types.
  • Entity support through an Entity factory and element classes. XML
    parsers now have a resolve_entities keyword argument that can be set to
    False to keep entities in the document.
  • column field on error log entries to accompany the line field
  • Error specific messages in XPath parsing and evaluation
    NOTE: for evaluation errors, you will now get an XPathEvalError instead of
    an XPathSyntaxError. To catch both, you can except on XPathError
  • The regular expression functions in XPath now support passing a node-set
    instead of a string
  • Extended type annotation in objectify: new xsiannotate() function
  • EXSLT RegExp support in standard XPath (not only XSLT)

Bugs fixed

  • Missing import in lxml.html.clean.
  • Some Python 2.4-isms prevented lxml from building/running under
    Python 2.3.
  • XPath on ElementTrees could crash when selecting the virtual root
    node of the ElementTree.
  • Compilation --without-threading was buggy in alpha5/6.
  • Memory leak in the parse() function.
  • Minor bugs in XSLT error message formatting.
  • Result document memory leak in target parser.
  • Target parser failed to report comments.
  • In the lxml.html iter_links method, links in &lt;object&gt;
    tags weren't recognized. (Note: plugin-specific link parameters
    still aren't recognized.) Also, the &lt;embed&gt; tag, though not
    standard, is now included in lxml.html.defs.special_inline_tags.
  • Using custom resolvers on XSLT stylesheets parsed from a string
    could request ill-formed URLs.
  • With lxml.doctestcompare if you do &lt;tag xmlns=&quot;...&quot;&gt; in your
    output, it will then be namespace-neutral (before the ellipsis was
    treated as a real namespace).
  • AttributeError in feed parser on parse errors
  • XML feed parser setup problem
  • Type annotation for unicode strings in DataElement()
  • lxml failed to serialise namespace declarations of elements other than the
    root node of a tree
  • Race condition in XSLT where the resolver context leaked between concurrent
    XSLT calls
  • lxml.etree did not check tag/attribute names
  • The XML parser did not report undefined entities as error
  • The text in exceptions raised by XML parsers, validators and XPath
    evaluators now reports the first error that occurred instead of the last
  • Passing '' as XPath namespace prefix did not raise an error
  • Thread safety in XPath evaluators

Other changes

  • Exceptions carry only the part of the error log that is related to
    the operation that caused the error.
  • XMLSchema() and RelaxNG() now enforce passing the source
    file/filename through the file keyword argument.
  • The test suite now skips most doctests under Python 2.3.
  • make clean no longer removes the .c files (use make realclean instead)
  • Minor performance tweaks for Element instantiation and subelement
    creation
  • Various places in the XPath, XSLT and iteration APIs now require
    keyword-only arguments.
  • The argument order in element.itersiblings() was changed to
    match the order used in all other iteration methods. The second
    argument ('preceding') is now a keyword-only argument.
  • The getiterator() method on Elements and ElementTrees was
    reverted to return an iterator as it did in lxml 1.x. The ET API
    specification allows it to return either a sequence or an iterator,
    and it traditionally returned a sequence in ET and an iterator in
    lxml. However, it is now deprecated in favour of the iter()
    method, which should be used in new code wherever possible.
  • The 'pretty printed' serialisation of ElementTree objects now
    inserts newlines at the root level between processing instructions,
    comments and the root tag.
  • A 'pretty printed' serialisation is now terminated with a newline.
  • Second argument to lxml.etree.Extension() helper is no longer
    required, third argument is now a keyword-only argument ns.
  • lxml.html.tostring takes an encoding argument.
  • The module source files were renamed to "lxml.*.pyx", such as
    "lxml.etree.pyx". This was changed for consistency with the way
    Pyrex commonly handles package imports. The main effect is that
    classes now know about their fully qualified class name, including
    the package name of their module.
  • Keyword-only arguments in some API functions, especially in the
    parsers and serialisers.
  • Tag name validation in lxml.etree (and lxml.html) now distinguishes
    between HTML tags and XML tags based on the parser that was used to
    parse or create them. HTML tags no longer reject any non-ASCII
    characters in tag names but only spaces and the special characters
    &lt;&gt;&amp;/&quot;&#39;.
  • lxml.etree now emits a warning if you use XPath with libxml2 2.6.27
    (which can crash on certain XPath errors)
  • Type annotation in objectify now preserves the already annotated type by
    default to prevent losing type information that is already there.
  • element.getiterator() returns a list, use element.iter() to retrieve
    an iterator (ElementTree 1.3 compatible behaviour)
  • objectify.PyType for None is now called "NoneType"
  • el.getiterator() renamed to el.iter(), following ElementTree 1.3 -
    original name is still available as alias
  • In the public C-API, findOrBuildNodeNs() was replaced by the more
    generic findOrBuildNodeNsPrefix
  • Major refactoring in XPath/XSLT extension function code
  • Network access in parsers disabled by default

1.3.6

Bugs fixed

  • Backported decref crash fix from 2.0
  • Well hidden free-while-in-use crash bug in ObjectPath

Other changes

  • The test suites now run gc.collect() in the tearDown()
    methods. While this makes them take a lot longer to run, it also
    makes it easier to link a specific test to garbage collection
    problems that would otherwise appear in later tests.

1.3.5

Features added

Bugs fixed

  • lxml.etree could crash when adding more than 10000 namespaces to a
    document
  • lxml failed to serialise namespace declarations of elements other
    than the root node of a tree

1.3.4

Features added

  • The ElementMaker in lxml.builder now accepts the keyword arguments
    namespace and nsmap to set a namespace and nsmap for the Elements it
    creates.
  • The docinfo on ElementTree objects has new properties internalDTD
    and externalDTD that return a DTD object for the internal or external
    subset of the document respectively.
  • Serialising an ElementTree now includes any internal DTD subsets that are
    part of the document, as well as comments and PIs that are siblings of the
    root node.

Bugs fixed

  • Parsing with the no_network option could fail

Other changes

  • lxml now raises a TagNameWarning about tag names containing ':' instead of
    an Error as 1.3.3 did. The reason is that a number of projects currently
    misuse the previous lack of tag name validation to generate namespace
    prefixes without declaring namespaces. Apart from the danger of generating
    broken XML this way, it also breaks most of the namespace-aware tools in
    XML, including XPath, XSLT and validation. lxml 1.3.x will continue to
    support this bug with a Warning, while lxml 2.0 will be strict about
    well-formed tag names (not only regarding ':').
  • Serialising an Element no longer includes its comment and PI siblings (only
    ElementTree serialisation includes them).

1.3.3

Features added

  • ElementTree compatible parser ETCompatXMLParser strips processing
    instructions and comments while parsing XML
  • Parsers now support stripping PIs (keyword argument 'remove_pis')
  • etree.fromstring() now supports parsing both HTML and XML, depending on
    the parser you pass.
  • Support base_url keyword argument in HTML() and XML()

Bugs fixed

  • Parsing from Python Unicode strings failed on some platforms
  • Element() did not raise an exception on tag names containing ':'
  • Element.getiterator(tag) did not accept Comment and
    ProcessingInstruction as tags. It also accepts Element now.

1.3.2

Features added

Bugs fixed

  • "deallocating None" crash bug

1.3.1

Features added

  • objectify.DataElement now supports setting values from existing data
    elements (not just plain Python types) and reuses defined namespaces etc.
  • E-factory support for lxml.objectify (objectify.E)

Bugs fixed

  • Better way to prevent crashes in Element proxy cleanup code
  • objectify.DataElement didn't set up None value correctly
  • objectify.DataElement didn't check the value against the provided type hints
  • Reference-counting bug in Element.attrib.pop()

1.3

Features added

  • Module lxml.pyclasslookup module implements an Element class lookup
    scheme that can access the entire tree in read-only mode to help determining
    a suitable Element class
  • Parsers take a remove_comments keyword argument that skips over comments
  • parse() function in objectify, corresponding to XML() etc.
  • Element.addnext(el) and Element.addprevious(el) methods to support
    adding processing instructions and comments around the root node
  • Element.attrib was missing clear() and pop() methods
  • Extended type annotation in objectify: cleaner annotation namespace setup
    plus new deannotate() function
  • Support for custom Element class instantiation in lxml.sax: passing a
    makeelement function to the ElementTreeContentHandler will reuse the
    lookup context of that function
  • '.' represents empty ObjectPath (identity)
  • Element.values() to accompany the existing .keys() and .items()
  • collectAttributes() C-function to build a list of attribute
    keys/values/items for a libxml2 node
  • DTD validator class (like RelaxNG and XMLSchema)
  • HTML generator helpers by Fredrik Lundh in lxml.htmlbuilder
  • ElementMaker XML generator by Fredrik Lundh in lxml.builder.E
  • Support for pickeling objectify.ObjectifiedElement objects to XML
  • update() method on Element.attrib
  • Optimised replacement for libxml2's _xmlReconsiliateNs(). This allows lxml
    a better handling of namespaces when moving elements between documents.

Bugs fixed

  • Removing Elements from a tree could make them lose their namespace
    declarations
  • ElementInclude didn't honour base URL of original document
  • Replacing the children slice of an Element would cut off the tails of the
    original children
  • Element.getiterator(tag) did not accept Comment and
    ProcessingInstruction as tags
  • API functions now check incoming strings for XML conformity. Zero bytes or
    low ASCII characters are no longer accepted (AssertionError).
  • XSLT parsing failed to pass resolver context on to imported documents
  • passing '' as namespace prefix in nsmap could be passed through to libxml2
  • Objectify couldn't handle prefixed XSD type names in xsi:type
  • More ET compatible behaviour when writing out XML declarations or not
  • More robust error handling in iterparse()
  • Documents lost their top-level PIs and comments on serialisation
  • lxml.sax failed on comments and PIs. Comments are now properly ignored and
    PIs are copied.
  • Possible memory leaks in namespace handling when moving elements between
    documents

Other changes

  • major restructuring in the documentation

1.2.1

Bugs fixed

  • Build fixes for MS compiler
  • Item assignments to special names like element[&quot;text&quot;] failed
  • Renamed ObjectifiedDataElement.__setText() to _setText() to make it easier
    to access
  • The pattern for attribute names in ObjectPath was too restrictive

1.2

Features added

  • Rich comparison of QName objects
  • Support for regular expressions in benchmark selection
  • get/set emulation (not .attrib!) for attributes on processing instructions
  • ElementInclude Python module for ElementTree compatible XInclude processing
    that honours custom resolvers registered with the source document
  • ElementTree.parser property holds the parser used to parse the document
  • setup.py has been refactored for greater readability and flexibility
  • --rpath flag to setup.py to induce automatic linking-in of dynamic library
    runtime search paths has been renamed to --auto-rpath. This makes it
    possible to pass an --rpath directly to distutils; previously this was being
    shadowed.

Bugs fixed

  • Element instantiation now uses locks to prevent race conditions with threads
  • ElementTree.write() did not raise an exception when the file was not writable
  • Error handling could crash under Python <= 2.4.1 - fixed by disabling thread
    support in these environments
  • Element.find*() did not accept QName objects as path

Other changes

  • code cleanup: redundant _NodeBase super class merged into _Element class
    Note: although the impact should be zero in most cases, this change breaks
    the compatibility of the public C-API

1.1.2

Features added

  • Data elements in objectify support repr(), which is now used by dump()
  • Source distribution now ships with a patched Pyrex
  • New C-API function makeElement() to create new elements with text,
    tail, attributes and namespaces
  • Reuse original parser flags for XInclude
  • Simplified support for handling XSLT processing instructions

Bugs fixed

  • Parser resources were not freed before the next parser run
  • Open files and XML strings returned by Python resolvers were not
    closed/freed
  • Crash in the IDDict returned by XMLDTDID
  • Copying Comments and ProcessingInstructions failed
  • Memory leak for external URLs in _XSLTProcessingInstruction.parseXSL()
  • Memory leak when garbage collecting tailed root elements
  • HTML script/style content was not propagated to .text
  • Show text xincluded between text nodes correctly in .text and .tail
  • 'integer * objectify.StringElement' operation was not supported

1.1.1

Features added

  • XSLT profiling support (profile_run keyword)
  • countchildren() method on objectify.ObjectifiedElement
  • Support custom elements for tree nodes in lxml.objectify

Bugs fixed

  • lxml.objectify failed to support long data values (e.g., "123L")
  • Error messages from XSLT did not reach XSLT.error_log
  • Factories objectify.Element() and objectify.DataElement() were missing
    attrib and nsmap keyword arguments
  • Changing the default parser in lxml.objectify did not update the factories
    Element() and DataElement()
  • Let lxml.objectify.Element() always generate tree elements (not data
    elements)
  • Build under Windows failed ('\0' bug in patched Pyrex version)

1.1

Features added

  • Comments and processing instructions return '<!-- comment -->' and
    '<?pi-target content?>' for repr()
  • Parsers are now the preferred (and default) place where element class lookup
    schemes should be registered. Namespace lookup is no longer supported by
    default.
  • Support for Python 2.5 beta
  • Unlock the GIL for deep copying documents and for XPath()
  • New compact keyword argument for parsing read-only documents
  • Support for parser options in iterparse()
  • The namespace axis is supported in XPath and returns (prefix, URI)
    tuples
  • The XPath expression "/" now returns an empty list instead of raising an
    exception
  • XML-Object API on top of lxml (lxml.objectify)
  • Customizable Element class lookup:
    • different pre-implemented lookup mechanisms
    • support for externally provided lookup functions
  • Support for processing instructions (ET-like, not compatible)
  • Public C-level API for independent extension modules
  • Module level iterwalk() function as 'iterparse' for trees
  • Module level iterparse() function similar to ElementTree (see
    documentation for differences)
  • Element.nsmap property returns a mapping of all namespace prefixes known at
    the Element to their namespace URI
  • Reentrant threading support in RelaxNG, XMLSchema and XSLT
  • Threading support in parsers and serializers:
    • All in-memory operations (tostring, parse(StringIO), etc.) free the GIL
    • File operations (on file names) free the GIL
    • Reading from file-like objects frees the GIL and reacquires it for reading
    • Serialisation to file-like objects is single-threaded (high lock overhead)
  • Element iteration over XPath axes:
    • Element.iterdescendants() iterates over the descendants of an element
    • Element.iterancestors() iterates over the ancestors of an element (from
      parent to parent)
    • Element.itersiblings() iterates over either the following or preceding
      siblings of an element
    • Element.iterchildren() iterates over the children of an element in either
      direction
    • All iterators support the tag keyword argument to restrict the
      generated elements
  • Element.getnext() and Element.getprevious() return the direct siblings of an
    element

Bugs fixed

  • filenames with local 8-bit encoding were not supported
  • 1.1beta did not compile under Python 2.3
  • ignore unknown 'pyval' attribute values in objectify
  • objectify.ObjectifiedElement.addattr() failed to accept Elements and Lists
  • objectify.ObjectPath.setattr() failed to accept Elements and Lists
  • XPathSyntaxError now inherits from XPathError
  • Threading race conditions in RelaxNG and XMLSchema
  • Crash when mixing elements from XSLT results into other trees, concurrent
    XSLT is only allowed when the stylesheet was parsed in the main thread
  • The EXSLT regexp:match function now works as defined (except for some
    differences in the regular expression syntax)
  • Setting element.text to '' returned None on request, not the empty string
  • iterparse() could crash on long XML files
  • Creating documents no longer copies the parser for later URL resolving. For
    performance reasons, only a reference is kept. Resolver updates on the
    parser will now be reflected by documents that were parsed before the
    change. Although this should rarely become visible, it is a behavioral
    change from 1.0.

1.0.4

Features added

  • List-like Element.extend() method

Bugs fixed

  • Crash in tail handling in Element.replace()

1.0.3

Features added

  • Element.replace(old, new) method to replace a subelement by another one

Bugs fixed

  • Crash when mixing elements from XSLT results into other trees
  • Copying/deepcopying did not work for ElementTree objects
  • Setting an attribute to a non-string value did not raise an exception
  • Element.remove() deleted the tail text from the removed Element

1.0.2

Features added

  • Support for setting a custom default Element class as opposed to namespace
    specific classes (which still override the default class)

Bugs fixed

  • Rare exceptions in Python list functions were not handled
  • Parsing accepted unicode strings with XML encoding declaration in certain
    cases
  • Parsing 8-bit encoded strings from StringIO objects raised an exception
  • Module function initThread() was removed - useless (and never worked)
  • XSLT and parser exception messages include the error line number

1.0.1

Features added

  • Repeated calls to Element.attrib now efficiently return the same instance

Bugs fixed

  • Document deallocation could crash in certain garbage collection scenarios
  • Extension function calls in XSLT variable declarations could break the
    stylesheet and crash on repeated calls
  • Deep copying Elements could lose namespaces declared in parents
  • Deep copying Elements did not copy tail
  • Parsing file(-like) objects failed to load external entities
  • Parsing 8-bit strings from file(-like) objects raised an exception
  • xsl:include failed when the stylesheet was parsed from a file-like object
  • lxml.sax.ElementTreeProducer did not call startDocument() / endDocument()
  • MSVC compiler complained about long strings (supports only 2048 bytes)

1.0

Features added

  • Element.getiterator() and the findall() methods support finding arbitrary
    elements from a namespace (pattern {namespace}*)
  • Another speedup in tree iteration code
  • General speedup of Python Element object creation and deallocation
  • Writing C14N no longer serializes in memory (reduced memory footprint)
  • PyErrorLog for error logging through the Python logging module
  • Element.getroottree() returns an ElementTree for the root node of the
    document that contains the element.
  • ElementTree.getpath(element) returns a simple, absolute XPath expression to
    find the element in the tree structure
  • Error logs have a last_error attribute for convenience
  • Comment texts can be changed through the API
  • Formatted output via pretty_print keyword in serialization functions
  • XSLT can block access to file system and network via XSLTAccessControl
  • ElementTree.write() no longer serializes in memory (reduced memory
    footprint)
  • Speedup of Element.findall(tag) and Element.getiterator(tag)
  • Support for writing the XML representation of Elements and ElementTrees to
    Python unicode strings via etree.tounicode()
  • Support for writing XSLT results to Python unicode strings via unicode()
  • Parsing a unicode string no longer copies the string (reduced memory
    footprint)
  • Parsing file-like objects reads chunks rather than the whole file (reduced
    memory footprint)
  • Parsing StringIO objects from the start avoids copying the string (reduced
    memory footprint)
  • Read-only 'docinfo' attribute in ElementTree class holds DOCTYPE
    information, original encoding and XML version as seen by the parser
  • etree module can be compiled without libxslt by commenting out the line
    include &quot;xslt.pxi&quot; near the end of the etree.pyx source file
  • Better error messages in parser exceptions
  • Error reporting also works in XSLT
  • Support for custom document loaders (URI resolvers) in parsers and XSLT,
    resolvers are registered at parser level
  • Implementation of exslt:regexp for XSLT based on the Python 're' module,
    enabled by default, can be switched off with 'regexp=False' keyword argument
  • Support for exslt extensions (libexslt) and libxslt extra functions
    (node-set, document, write, output)
  • Substantial speedup in XPath.evaluate()
  • HTMLParser for parsing (broken) HTML
  • XMLDTDID function parses XML into tuple (root node, ID dict) based on xml:id
    implementation of libxml2 (as opposed to ET compatible XMLID)

Bugs fixed

  • Memory leak in Element.setitem
  • Memory leak in Element.attrib.items() and Element.attrib.values()
  • Memory leak in XPath extension functions
  • Memory leak in unicode related setup code
  • Element now raises ValueError on empty tag names
  • Namespace fixing after moving elements between documents could fail if the
    source document was freed too early
  • Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't')
    didn't reset the namespace
  • Unknown constants from newer libxml2 versions could raise exceptions in the
    error handlers
  • lxml.etree compiles much faster
  • On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail
    in certain cases
  • Document reference in ElementTree objects was not updated when the root
    element was moved to a different document
  • Running absolute XPath expressions on an Element now evaluates against the
    root tree
  • Evaluating absolute XPath expressions (/*) on an ElementTree could fail
  • Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree
    objects
  • Removed public function initThreadLogging(), replaced by more general
    initThread() which fixes a number of setup problems in threads
  • Memory leak when using iconv encoders in tostring/write
  • Deep copying Elements and ElementTrees maintains the document information
  • Serialization functions raise LookupError for unknown encodings
  • Memory deallocation crash resulting from deep copying elements
  • Some ElementTree methods could crash if the root node was not initialized
    (neither file nor element passed to the constructor)
  • Element/SubElement failed to set attribute namespaces from passed attrib
    dictionary
  • tostring() adds an XML declaration for non-ASCII encodings
  • tostring() failed to serialize encodings that contain 0-bytes
  • ElementTree.xpath() and XPathDocumentEvaluator were not using the
    ElementTree root node as reference point
  • Calling document(&#39;&#39;) in XSLT failed to return the stylesheet

0.9.2

Features added

  • Speedup for Element.makeelement(): the new element reuses the original
    libxml2 document instead of creating a new empty one
  • Speedup for reversed() iteration over element children (Py2.4+ only)
  • ElementTree compatible QName class
  • RelaxNG and XMLSchema accept any Element, not only ElementTrees

Bugs fixed

  • str(xslt_result) was broken for XSLT output other than UTF-8
  • Memory leak if write_c14n fails to write the file after conversion
  • Crash in XMLSchema and RelaxNG when passing non-schema documents
  • Memory leak in RelaxNG() when RelaxNGParseError is raised

0.9.1

Features added

  • lxml.sax.ElementTreeContentHandler checks closing elements and raises
    SaxError on mismatch
  • lxml.sax.ElementTreeContentHandler supports namespace-less SAX events
    (startElement, endElement) and defaults to empty attributes (keyword
    argument)
  • Speedup for repeatedly accessing element tag names
  • Minor API performance improvements

Bugs fixed

  • Memory deallocation bug when using XSLT output method "html"
  • sax.py was handling UTF-8 encoded tag names where it shouldn't
  • lxml.tests package will no longer be installed (is still in source tar)

0.9

Features added

  • Error logging API for libxml2 error messages
  • Various performance improvements
  • Benchmark script for lxml, ElementTree and cElementTree
  • Support for registering extension functions through new FunctionNamespace
    class (see doc/extensions.txt)
  • ETXPath class for XPath expressions in ElementTree notation ('//{ns}tag')
  • Support for variables in XPath expressions (also in XPath class)
  • XPath class for compiled XPath expressions
  • XMLID module level function (ElementTree compatible)
  • XMLParser API for customized libxml2 parser configuration
  • Support for custom Element classes through new Namespace API (see
    doc/namespace_extensions.txt)
  • Common exception base class LxmlError for module exceptions
  • real iterator support in iter(Element), Element.getiterator()
  • XSLT objects are callable, result trees support str()
  • Added MANIFEST.in for easier creation of RPM files.
  • 'getparent' method on elements allows navigation to an element's
    parent element.
  • Python core compatible SAX tree builder and SAX event generator. See
    doc/sax.txt for more information.

Bugs fixed

  • Segfaults and memory leaks in various API functions of Element
  • Segfault in XSLT.tostring()
  • ElementTree objects no longer interfere, Elements can be root of different
    ElementTrees at the same time
  • document('') works in XSLT documents read from files (in-memory documents
    cannot support this due to libxslt deficiencies)

0.8

Features added

  • Support for copy.deepcopy() on elements. copy.copy() works also, but
    does the same thing, and does not create a shallow copy, as that
    makes no sense in the context of libxml2 trees. This means a
    potential incompatibility with ElementTree, but there's more chance
    that it works than if copy.copy() isn't supported at all.
  • Increased compatibility with (c)ElementTree; .parse() on ElementTree is
    supported and parsing of gzipped XML files works.
  • implemented index() on elements, allowing one to find the index of a
    SubElement.

Bugs fixed

  • Use xslt-config instead of xml2-config to find out libxml2
    directories to take into account a case where libxslt is installed
    in a different directory than libxslt.
  • Eliminate crash condition in iteration when text nodes are changed.
  • Passing 'None' to tostring() does not result in a segfault anymore,
    but an AssertionError.
  • Some test fixes for Windows.
  • Raise XMLSyntaxError and XPathSyntaxError instead of plain python
    syntax errors. This should be less confusing.
  • Fixed error with uncaught exception in Pyrex code.
  • Calling lxml.etree.fromstring('') throws XMLSyntaxError instead of a
    segfault.
  • has_key() works on attrib. 'in' tests also work correctly on attrib.
  • INSTALL.txt was saying 2.2.16 instead of 2.6.16 as a supported
    libxml2 version, as it should.
  • Passing a UTF-8 encoded string to the XML() function would fail;
    fixed.

0.7

Features added

  • parameters (XPath expressions) can be passed to XSLT using keyword
    parameters.
  • Simple XInclude support. Calling the xinclude() method on a tree
    will process any XInclude statements in the document.
  • XMLSchema support. Use the XMLSchema class or the convenience
    xmlschema() method on a tree to do XML Schema (XSD) validation.
  • Added convenience xslt() method on tree. This is less efficient
    than the XSLT object, but makes it easier to write quick code.
  • Added convenience relaxng() method on tree. This is less efficient
    than the RelaxNG object, but makes it easier to write quick code.
  • Make it possible to use XPathEvaluator with elements as well. The
    XPathEvaluator in this case will retain the element so multiple
    XPath queries can be made against one element efficiently. This
    replaces the second argument to the .evaluate() method that existed
    previously.
  • Allow registerNamespace() to be called on an XPathEvaluator, after
    creation, to add additional namespaces. Also allow registerNamespaces(),
    which does the same for a namespace dictionary.
  • Add 'prefix' attribute to element to be able to read prefix information.
    This is entirely read-only.
  • It is possible to supply an extra nsmap keyword parameter to
    the Element() and SubElement() constructors, which supplies a
    prefix to namespace URI mapping. This will create namespace
    prefix declarations on these elements and these prefixes will show up
    in XML serialization.

Bugs fixed

  • Killed yet another memory management related bug: trees created
    using newDoc would not get a libxml2-level dictionary, which caused
    problems when deallocating these documents later if they contained a
    node that came from a document with a dictionary.
  • Moving namespaced elements between documents was problematic as
    references to the original document would remain. This has been fixed
    by applying xmlReconciliateNs() after each move operation.
  • Can pass None to 'dump()' without segfaults.
  • tostring() works properly for non-root elements as well.
  • Cleaned out the tostring() method so it should handle encoding
    correctly.
  • Cleaned out the ElementTree.write() method so it should handle encoding
    correctly. Writing directly to a file should also be faster, as there is no
    need to go through a Python string in that case. Made sure the test cases
    test both serializing to StringIO as well as serializing to a real file.

0.6

Features added

  • Changed setup.py so that library_dirs is also guessed. This should
    help with compilation on the Mac OS X platform, where otherwise the
    wrong library (shipping with the OS) could be picked up.
  • Tweaked setup.py so that it picks up the version from version.txt.

Bugs fixed

  • Do the right thing when handling namespaced attributes.
  • fix bug where tostring() moved nodes into new documents. tostring()
    had very nasty side-effects before this fix, sorry!

0.5.1

  • Python 2.2 compatibility fixes.
  • unicode fixes in Element() and Comment() as well as XML(); unicode
    input wasn't properly being UTF-8 encoded.

0.5

Initial public release.

repoze.lru -> 0.6

0.6


  • Added a 'CacheMaker' helper class: a maker keeps references (by name)
    to the caches it creates, to permit them to be cleared.
  • Added statistics to each cache, tracking lookups, hits, misses, and
    evictions.
  • Automated building Sphinx docs and testing example snippets under tox.
  • Added Sphinx documentation.
  • Dropped support for Python 2.5.
  • Added support for PyPy.
  • Added setup.py docs alias (installs Sphinx and dependencies).
  • Added setup.py dev alias (runs develop plus installs nose
    and coverage).
  • Added support for CI under supported Pythons using tox.
  • Bug: Remove potential race condition on lock in face of interrupts
    (Issue 10).

0.5


  • Feature: added a new "invalidate()" method to allow removal of items from
    the cache (issue 8).
  • Bug: LRUCache.put() could take multiple seconds on large caches (Issue 7).
  • Bug: LRUCache was not thread safe (Issue 6).
  • Bug: LRUCache.clock would waste RAM (Issue 4).
  • Bug: repeated pushing of an entry would remove other cache entries
    (Issue 3).
  • Bug: LRUCache would evict entries even when not full (Issue 2).

0.4


0.3


  • Add a thread lock around clear logic.

0.2


  • Add a clear method.

0.1


  • Initial release.

requests -> 2.11.0

2.11.0

+++++++++++++++++++

Improvements

  • Added support for the ALL_PROXY environment variable.
  • Reject header values that contain leading whitespace or newline characters to
    reduce risk of header smuggling.

Bugfixes

  • Fixed occasional TypeError when attempting to decode a JSON response that
    occurred in an error case. Now correctly returns a ValueError.
  • Requests would incorrectly ignore a non-CIDR IP address in the NO_PROXY
    environment variables: Requests now treats it as a specific IP.
  • Fixed a bug when sending JSON data that could cause us to encounter obscure
    OpenSSL errors in certain network conditions (yes, really).
  • Added type checks to ensure that iter_content only accepts integers and
    None for chunk sizes.
  • Fixed issue where responses whose body had not been fully consumed would have
    the underlying connection closed but not returned to the connection pool,
    which could cause Requests to hang in situations where the HTTPAdapter
    had been configured to use a blocking connection pool.

Miscellaneous

  • Updated bundled urllib3 to 1.16.

2.10.0

+++++++++++++++++++

New Features

  • SOCKS Proxy Support! (requires PySocks; $ pip install requests[socks])

Miscellaneous

  • Updated bundled urllib3 to 1.15.1.

2.9.2

++++++++++++++++++

Improvements

  • Change built-in CaseInsensitiveDict (used for headers) to use OrderedDict
    as its underlying datastore.

Bugfixes

  • Don't use redirect_cache if allow_redirects=False
  • When passed objects that throw exceptions from tell(), send them via
    chunked transfer encoding instead of failing.
  • Raise a ProxyError for proxy related connection issues.

2.9.1

++++++++++++++++++

Bugfixes

  • Resolve regression introduced in 2.9.0 that made it impossible to send binary
    strings as bodies in Python 3.
  • Fixed errors when calculating cookie expiration dates in certain locales.

Miscellaneous

  • Updated bundled urllib3 to 1.13.1.

2.9.0

++++++++++++++++++

Minor Improvements (Backwards compatible)

  • The verify keyword argument now supports being passed a path to a
    directory of CA certificates, not just a single-file bundle.
  • Warnings are now emitted when sending files opened in text mode.
  • Added the 511 Network Authentication Required status code to the status code
    registry.

Bugfixes

  • For file-like objects that are not seeked to the very beginning, we now
    send the content length for the number of bytes we will actually read, rather
    than the total size of the file, allowing partial file uploads.
  • When uploading file-like objects, if they are empty or have no obvious
    content length we set Transfer-Encoding: chunked rather than
    Content-Length: 0.
  • We correctly receive the response in buffered mode when uploading chunked
    bodies.
  • We now handle being passed a query string as a bytestring on Python 3, by
    decoding it as UTF-8.
  • Sessions are now closed in all cases (exceptional and not) when using the
    functional API rather than leaking and waiting for the garbage collector to
    clean them up.
  • Correctly handle digest auth headers with a malformed qop directive that
    contains no token, by treating it the same as if no qop directive was
    provided at all.
  • Minor performance improvements when removing specific cookies by name.

Miscellaneous

  • Updated urllib3 to 1.13.

2.8.1

++++++++++++++++++

Bugfixes

  • Update certificate bundle to match certifi 2015.9.6.2's weak certificate
    bundle.
  • Fix a bug in 2.8.0 where requests would raise ConnectTimeout instead of
    ConnectionError
  • When using the PreparedRequest flow, requests will now correctly respect the
    json parameter. Broken in 2.8.0.
  • When using the PreparedRequest flow, requests will now correctly handle a
    Unicode-string method name on Python 2. Broken in 2.8.0.

2.8.0

++++++++++++++++++

Minor Improvements (Backwards Compatible)

  • Requests now supports per-host proxies. This allows the proxies
    dictionary to have entries of the form
    {&#39;&lt;scheme&gt;://&lt;hostname&gt;&#39;: &#39;&lt;proxy&gt;&#39;}. Host-specific proxies will be used
    in preference to the previously-supported scheme-specific ones, but the
    previous syntax will continue to work.
  • Response.raise_for_status now prints the URL that failed as part of the
    exception message.
  • requests.utils.get_netrc_auth now takes an raise_errors kwarg,
    defaulting to False. When True, errors parsing .netrc files cause
    exceptions to be thrown.
  • Change to bundled projects import logic to make it easier to unbundle
    requests downstream.
  • Changed the default User-Agent string to avoid leaking data on Linux: now
    contains only the requests version.

Bugfixes

  • The json parameter to post() and friends will now only be used if
    neither data nor files are present, consistent with the
    documentation.
  • We now ignore empty fields in the NO_PROXY environment variable.
  • Fixed problem where httplib.BadStatusLine would get raised if combining
    stream=True with contextlib.closing.
  • Prevented bugs where we would attempt to return the same connection back to
    the connection pool twice when sending a Chunked body.
  • Miscellaneous minor internal changes.
  • Digest Auth support is now thread safe.

Updates

  • Updated urllib3 to 1.12.

2.7.0

++++++++++++++++++

This is the first release that follows our new release process. For more, see
our documentation &lt;http://docs.python-requests.org/en/latest/community/release-process/&gt;_.

Bugfixes

  • Updated urllib3 to 1.10.4, resolving several bugs involving chunked transfer
    encoding and response framing.

2.6.2

++++++++++++++++++

Bugfixes

  • Fix regression where compressed data that was sent as chunked data was not
    properly decompressed. (2561)

2.6.1

++++++++++++++++++

Bugfixes

  • Remove VendorAlias import machinery introduced in v2.5.2.
  • Simplify the PreparedRequest.prepare API: We no longer require the user to
    pass an empty list to the hooks keyword argument. (c.f. 2552)
  • Resolve redirects now receives and forwards all of the original arguments to
    the adapter. (2503)
  • Handle UnicodeDecodeErrors when trying to deal with a unicode URL that
    cannot be encoded in ASCII. (2540)
  • Populate the parsed path of the URI field when performing Digest
    Authentication. (2426)
  • Copy a PreparedRequest's CookieJar more reliably when it is not an instance
    of RequestsCookieJar. (2527)

2.6.0

++++++++++++++++++

Bugfixes

  • CVE-2015-2296: Fix handling of cookies on redirect. Previously a cookie
    without a host value set would use the hostname for the redirected URL
    exposing requests users to session fixation attacks and potentially cookie
    stealing. This was disclosed privately by Matthew Daley of
    BugFuzz &lt;https://bugfuzz.com&gt;_. This affects all versions of requests from
    v2.1.0 to v2.5.3 (inclusive on both ends).
  • Fix error when requests is an install_requires dependency and python setup.py test is run. (2462)
  • Fix error when urllib3 is unbundled and requests continues to use the
    vendored import location.
  • Include fixes to urllib3's header handling.
  • Requests' handling of unvendored dependencies is now more restrictive.

Features and Improvements

  • Support bytearrays when passed as parameters in the files argument.
    (2468)
  • Avoid data duplication when creating a request with str, bytes, or
    bytearray input to the files argument.

2.5.3

++++++++++++++++++

Bugfixes

2.5.2

++++++++++++++++++

Features and Improvements

  • Add sha256 fingerprint support. (shazow/urllib3540_)
  • Improve the performance of headers. (shazow/urllib3544_)

Bugfixes

  • Copy pip's import machinery. When downstream redistributors remove
    requests.packages.urllib3 the import machinery will continue to let those
    same symbols work. Example usage in requests' documentation and 3rd-party
    libraries relying on the vendored copies of urllib3 will work without having
    to fallback to the system urllib3.
  • Attempt to quote parts of the URL on redirect if unquoting and then quoting
    fails. (2356)
  • Fix filename type check for multipart form-data uploads. (2411)
  • Properly handle the case where a server issuing digest authentication
    challenges provides both auth and auth-int qop-values. (2408)
  • Fix a socket leak. (shazow/urllib3549_)
  • Fix multiple Set-Cookie headers properly. (shazow/urllib3534_)
  • Disable the built-in hostname verification. (shazow/urllib3526_)
  • Fix the behaviour of decoding an exhausted stream. (shazow/urllib3535_)

Security

  • Pulled in an updated cacert.pem.
  • Drop RC4 from the default cipher list. (shazow/urllib3551_)

.. _shazow/urllib3551: urllib3/urllib3#551
.. _shazow/urllib3549: urllib3/urllib3#549
.. _shazow/urllib3544: urllib3/urllib3#544
.. _shazow/urllib3540: urllib3/urllib3#540
.. _shazow/urllib3535: urllib3/urllib3#535
.. _shazow/urllib3534: urllib3/urllib3#534
.. _shazow/urllib3526: urllib3/urllib3#526

2.5.1

++++++++++++++++++

Behavioural Changes

  • Only catch HTTPErrors in raise_for_status (2382)

Bugfixes

  • Handle LocationParseError from urllib3 (2344)
  • Handle file-like object filenames that are not strings (2379)
  • Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated (2389)

2.5.0

++++++++++++++++++

Improvements

  • Allow usage of urllib3's Retry object with HTTPAdapters (2216)
  • The iter_lines method on a response now accepts a delimiter with which
    to split the content (2295)

Behavioural Changes

  • Add deprecation warnings to functions in requests.utils that will be removed
    in 3.0 (2309)
  • Sessions used by the functional API are always closed (2326)
  • Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9) (2323)

Bugfixes

  • Only parse the URL once (2353)
  • Allow Content-Length header to always be overridden (2332)
  • Properly handle files in HTTPDigestAuth (2333)
  • Cap redirect_cache size to prevent memory abuse (2299)
  • Fix HTTPDigestAuth handling of redirects after authenticating successfully
    (2253)
  • Fix crash with custom method parameter to Session.request (2317)
  • Fix how Link headers are parsed using the regular expression library (2271)

Documentation

  • Add more references for interlinking (2348)
  • Update CSS for theme (2290)
  • Update width of buttons and sidebar (2289)
  • Replace references of Gittip with Gratipay (2282)
  • Add link to changelog in sidebar (2273)

2.4.3

++++++++++++++++++

Bugfixes

  • Unicode URL improvements for Python 2.
  • Re-order JSON param for backwards compat.
  • Automatically defrag authentication schemes from host/pass URIs. (2249 &lt;https://github.com/kennethreitz/requests/issues/2249&gt;_)

2.4.2

++++++++++++++++++

Improvements

  • FINALLY! Add json parameter for uploads! (2258 &lt;https://github.com/kennethreitz/requests/pull/2258&gt;_)
  • Support for bytestring URLs on Python 3.x (2238 &lt;https://github.com/kennethreitz/requests/pull/2238&gt;_)

Bugfixes

  • Avoid getting stuck in a loop (2244 &lt;https://github.com/kennethreitz/requests/pull/2244&gt;_)
  • Multiple calls to iter* fail with unhelpful error. (2240 &lt;https://github.com/kennethreitz/requests/issues/2240&gt;, 2241 &lt;https://github.com/kennethreitz/requests/issues/2241&gt;)

Documentation

  • Correct redirection introduction (2245 &lt;https://github.com/kennethreitz/requests/pull/2245/&gt;_)
  • Added example of how to send multiple files in one request. (2227 &lt;https://github.com/kennethreitz/requests/pull/2227/&gt;_)
  • Clarify how to pass a custom set of CAs (2248 &lt;https://github.com/kennethreitz/requests/pull/2248/&gt;_)

2.4.1

++++++++++++++++++

  • Now has a "security" package extras set, $ pip install requests[security]
  • Requests will now use Certifi if it is available.
  • Capture and re-raise urllib3 ProtocolError
  • Bugfix for responses that attempt to redirect to themselves forever (wtf?).

2.4.0

++++++++++++++++++

Behavioral Changes

  • Connection: keep-alive header is now sent automatically.

Improvements

  • Support for connect timeouts! Timeout now accepts a tuple (connect, read) which is used to set individual connect and read timeouts.
  • Allow copying of PreparedRequests without headers/cookies.
  • Updated bundled urllib3 version.
  • Refactored settings loading from environment -- new Session.merge_environment_settings.
  • Handle socket errors in iter_content.

2.3.0

++++++++++++++++++

API Changes

  • New Response property is_redirect, which is true when the
    library could have processed this response as a redirection (whether
    or not it actually did).
  • The timeout parameter now affects requests with both stream=True and
    stream=False equally.
  • The change in v2.0.0 to mandate explicit proxy schemes has been reverted.
    Proxy schemes now default to http://.
  • The CaseInsensitiveDict used for HTTP headers now behaves like a normal
    dictionary when references as string or viewed in the interpreter.

Bugfixes

  • No longer expose Authorization or Proxy-Authorization headers on redirect.
    Fix CVE-2014-1829 and CVE-2014-1830 respectively.
  • Authorization is re-evaluated each redirect.
  • On redirect, pass url as native strings.
  • Fall-back to autodetected encoding for JSON when Unicode detection fails.
  • Headers set to None on the Session are now correctly not sent.
  • Correctly honor decode_unicode even if it wasn't used earlier in the same
    response.
  • Stop advertising compress as a supported Content-Encoding.
  • The Response.history parameter is now always a list.
  • Many, many urllib3 bugfixes.

2.2.1

++++++++++++++++++

Bugfixes

  • Fixes incorrect parsing of proxy credentials that contain a literal or encoded '' character.
  • Assorted urllib3 fixes.

2.2.0

++++++++++++++++++

API Changes

  • New exception: ContentDecodingError. Raised instead of urllib3
    DecodeError exceptions.

Bugfixes

  • Avoid many many exceptions from the buggy implementation of proxy_bypass on OS X in Python 2.6.
  • Avoid crashing when attempting to get authentication credentials from ~/.netrc when running as a user without a home directory.
  • Use the correct pool size for pools of connections to proxies.
  • Fix iteration of CookieJar objects.
  • Ensure that cookies are persisted over redirect.
  • Switch back to using chardet, since it has merged with charade.

2.1.0

++++++++++++++++++

  • Updated CA Bundle, of course.
  • Cookies set on individual Requests through a Session (e.g. via Session.get()) are no longer persisted to the Session.
  • Clean up connections when we hit problems during chunked upload, rather than leaking them.
  • Return connections to the pool when a chunked upload is successful, rather than leaking it.
  • Match the HTTPbis recommendation for HTTP 301 redirects.
  • Prevent hanging when using streaming uploads and Digest Auth when a 401 is received.
  • Values of headers set by Requests are now always the native string type.
  • Fix previously broken SNI support.
  • Fix accessing HTTP proxies using proxy authentication.
  • Unencode HTTP Basic usernames and passwords extracted from URLs.
  • Support for IP address ranges for no_proxy environment variable
  • Parse headers correctly when users override the default Host: header.
  • Avoid munging the URL in case of case-sensitive servers.
  • Looser URL handling for non-HTTP/HTTPS urls.
  • Accept unicode methods in Python 2.6 and 2.7.
  • More resilient cookie handling.
  • Make Response objects pickleable.
  • Actually added MD5-sess to Digest Auth instead of pretending to like last time.
  • Updated internal urllib3.
  • Fixed Lukasa's lack of taste.

2.0.1

++++++++++++++++++

  • Updated included CA Bundle with new mistrusts and automated process for the future
  • Added MD5-sess to Digest Auth
  • Accept per-file headers in multipart file POST messages.
  • Fixed: Don't send the full URL on CONNECT messages.
  • Fixed: Correctly lowercase a redirect scheme.
  • Fixed: Cookies not persisted when set via functional API.
  • Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError.
  • Updated internal urllib3 and chardet.

2.0.0

++++++++++++++++++

API Changes:

  • Keys in the Headers dictionary are now native strings on all Python versions,
    i.e. bytestrings on Python 2, unicode on Python 3.
  • Proxy URLs now must have an explicit scheme. A MissingSchema exception
    will be raised if they don't.
  • Timeouts now apply to read time if Stream=False.
  • RequestException is now a subclass of IOError, not RuntimeError.
  • Added new method to PreparedRequest objects: PreparedRequest.copy().
  • Added new method to Session objects: Session.update_request(). This
    method updates a Request object with the data (e.g. cookies) stored on
    the Session.
  • Added new method to Session objects: Session.prepare_request(). This
    method updates and prepares a Request object, and returns the
    corresponding PreparedRequest object.
  • Added new method to HTTPAdapter objects: HTTPAdapter.proxy_headers().
    This should not be called directly, but improves the subclass interface.
  • httplib.IncompleteRead exceptions caused by incorrect chunked encoding
    will now raise a Requests ChunkedEncodingError instead.
  • Invalid percent-escape sequences now cause a Requests InvalidURL
    exception to be raised.
  • HTTP 208 no longer uses reason phrase &quot;im_used&quot;. Correctly uses
    &quot;already_reported&quot;.
  • HTTP 226 reason added (&quot;im_used&quot;).

Bugfixes:

  • Vastly improved proxy support, including the CONNECT verb. Special thanks to
    the many contributors who worked towards this improvement.
  • Cookies are now properly managed when 401 authentication responses are
    received.
  • Chunked encoding fixes.
  • Support for mixed case schemes.
  • Better handling of streaming downloads.
  • Retrieve environment proxies from more locations.
  • Minor cookies fixes.
  • Improved redirect behaviour.
  • Improved streaming behaviour, particularly for compressed data.
  • Miscellaneous small Python 3 text encoding bugs.
  • .netrc no longer overrides explicit auth.
  • Cookies set by hooks are now correctly persisted on Sessions.
  • Fix problem with cookies that specify port numbers in their host field.
  • BytesIO can be used to perform streaming uploads.
  • More generous parsing of the no_proxy environment variable.
  • Non-string objects can be passed in data values alongside files.

1.2.3

++++++++++++++++++

  • Simple packaging fix

1.2.2

++++++++++++++++++

  • Simple packaging fix

1.2.1

++++++++++++++++++

  • 301 and 302 redirects now change the verb to GET for all verbs, not just
    POST, improving browser compatibility.
  • Python 3.3.2 compatibility
  • Always percent-encode location headers
  • Fix connection adapter matching to be most-specific first
  • new argument to the default connection adapter for passing a block argument
  • prevent a KeyError when there's no link headers

1.2.0

++++++++++++++++++

  • Fixed cookies on sessions and on requests
  • Significantly change how hooks are dispatched - hooks now receive all the
    arguments specified by the user when making a request so hooks can make a
    secondary request with the same parameters. This is especially necessary for
    authentication handler authors
  • certifi support was removed
  • Fixed bug where using OAuth 1 with body signature_type sent no data
  • Major proxy work thanks to Lukasa including parsing of proxy authentication
    from the proxy url
  • Fix DigestAuth handling too many 401s
  • Update vendored urllib3 to include SSL bug fixes
  • Allow keyword arguments to be passed to json.loads() via the
    Response.json() method
  • Don't send Content-Length header by default on GET or HEAD
    requests
  • Add elapsed attribute to Response objects to time how long a request
    took.
  • Fix RequestsCookieJar
  • Sessions and Adapters are now picklable, i.e., can be used with the
    multiprocessing library
  • Update charade to version 1.0.3

The change in how hooks are dispatched will likely cause a great deal of
issues.

1.1.0

++++++++++++++++++

  • CHUNKED REQUESTS
  • Support for iterable response bodies
  • Assume servers persist redirect params
  • Allow explicit content types to be specified for file data
  • Make merge_kwargs case-insensitive when looking up keys

1.0.3

++++++++++++++++++

  • Fix file upload encoding bug
  • Fix cookie behavior

1.0.2

++++++++++++++++++

  • Proxy fix for HTTPAdapter.

1.0.1

++++++++++++++++++

  • Cert verification exception bug.
  • Proxy fix for HTTPAdapter.

1.0.0

++++++++++++++++++

  • Massive Refactor and Simplification
  • Switch to Apache 2.0 license
  • Swappable Connection Adapters
  • Mountable Connection Adapters
  • Mutable ProcessedRequest chain
  • /s/prefetch/stream
  • Removal of all configuration
  • Standard library logging
  • Make Response.json() callable, not property.
  • Usage of new charade project, which provides python 2 and 3 simultaneous chardet.
  • Removal of all hooks except 'response'
  • Removal of all authentication helpers (OAuth, Kerberos)

This is not a backwards compatible change.

0.14.2

+++++++++++++++++++

  • Improved mime-compatible JSON handling
  • Proxy fixes
  • Path hack fixes
  • Case-Insensitive Content-Encoding headers
  • Support for CJK parameters in form posts

0.14.1

+++++++++++++++++++

  • Python 3.3 Compatibility
  • Simply default accept-encoding
  • Bugfixes

0.14.0

++++++++++++++++++++

  • No more iter_content errors if already downloaded.

0.13.9

+++++++++++++++++++

  • Fix for OAuth + POSTs
  • Remove exception eating from dispatch_hook
  • General bugfixes

0.13.8

+++++++++++++++++++

  • Incredible Link header support :)

0.13.7

+++++++++++++++++++

  • Support for (key, value) lists everywhere.
  • Digest Authentication improvements.
  • Ensure proxy exclusions work properly.
  • Clearer UnicodeError exceptions.
  • Automatic casting of URLs to strings (fURL and such)
  • Bugfixes.

0.13.6

+++++++++++++++++++

  • Long awaited fix for hanging connections!

0.13.5

+++++++++++++++++++

  • Packaging fix

0.13.4

+++++++++++++++++++

  • GSSAPI/Kerberos authentication!
  • App Engine 2.7 Fixes!
  • Fix leaking connections (from urllib3 update)
  • OAuthlib path hack fix
  • OAuthlib URL parameters fix.

0.13.3

+++++++++++++++++++

  • Use simplejson if available.
  • Do not hide SSLErrors behind Timeouts.
  • Fixed param handling with urls containing fragments.
  • Significantly improved information in User Agent.
  • client certificates are ignored when verify=False

0.13.2

+++++++++++++++++++

  • Zero dependencies (once again)!
  • New: Response.reason
  • Sign querystring parameters in OAuth 1.0
  • Client certificates no longer ignored when verify=False
  • Add openSUSE certificate support

0.13.1

+++++++++++++++++++

  • Allow passing a file or file-like object as data.
  • Allow hooks to return responses that indicate errors.
  • Fix Response.text and Response.json for body-less responses.

0.13.0

+++++++++++++++++++

  • Removal of Requests.async in favor of grequests &lt;https://github.com/kennethreitz/grequests&gt;_
  • Allow disabling of cookie persistence.
  • New implementation of safe_mode
  • cookies.get now supports default argument
  • Session cookies not saved when Session.request is called with return_response=False
  • Env: no_proxy support.
  • RequestsCookieJar improvements.
  • Various bug fixes.

0.12.1

+++++++++++++++++++

  • New Response.json property.
  • Ability to add string file uploads.
  • Fix out-of-range issue with iter_lines.
  • Fix iter_content default size.
  • Fix POST redirects containing files.

0.12.0

+++++++++++++++++++

  • EXPERIMENTAL OAUTH SUPPORT!
  • Proper CookieJar-backed cookies interface with awesome dict-like interface.
  • Speed fix for non-iterated content chunks.
  • Move pre_request to a more usable place.
  • New pre_send hook.
  • Lazily encode data, params, files.
  • Load system Certificate Bundle if certify isn't available.
  • Cleanups, fixes.

0.11.2

+++++++++++++++++++

  • Attempt to use the OS's certificate bundle if certifi isn't available.
  • Infinite digest auth redirect fix.
  • Multi-part file upload improvements.
  • Fix decoding of invalid %encodings in URLs.
  • If there is no content in a response don't throw an error the second time that content is attempted to be read.
  • Upload data on redirects.

0.11.1

+++++++++++++++++++

  • POST redirects now break RFC to do what browsers do: Follow up with a GET.
  • New strict_mode configuration to disable new redirect behavior.

0.11.0

+++++++++++++++++++

  • Private SSL Certificate support
  • Remove select.poll from Gevent monkeypatching
  • Remove redundant generator for chunked transfer encoding
  • Fix: Response.ok raises Timeout Exception in safe_mode

0.10.8

+++++++++++++++++++

  • Generate chunked ValueError fix
  • Proxy configuration by environment variables
  • Simplification of iter_lines.
  • New trust_env configuration for disabling system/environment hints.
  • Suppress cookie errors.

0.10.7

+++++++++++++++++++

  • encode_uri = False

0.10.6

+++++++++++++++++++

  • Allow '=' in cookies.

0.10.5

+++++++++++++++++++

  • Response body with 0 content-length fix.
  • New async.imap.
  • Don't fail on netrc.

0.10.4

+++++++++++++++++++

  • Honor netrc.

0.10.3

+++++++++++++++++++

  • HEAD requests don't follow redirects anymore.
  • raise_for_status() doesn't raise for 3xx anymore.
  • Make Session objects picklable.
  • ValueError for invalid schema URLs.

0.10.2

+++++++++++++++++++

  • Vastly improved URL quoting.
  • Additional allowed cookie key values.
  • Attempted fix for "Too many open files" Error
  • Replace unicode errors on first pass, no need for second pass.
  • Append '/' to bare-domain urls before query insertion.
  • Exceptions now inherit from RuntimeError.
  • Binary uploads + auth fix.
  • Bugfixes.

0.10.1

+++++++++++++++++++

  • PYTHON 3 SUPPORT!
  • Dropped 2.5 Support. (Backwards Incompatible)

0.10.0

+++++++++++++++++++

  • Response.content is now bytes-only. (Backwards Incompatible)
  • New Response.text is unicode-only.
  • If no Response.encoding is specified and chardet is available, Response.text will guess an encoding.
  • Default to ISO-8859-1 (Western) encoding for "text" subtypes.
  • Removal of decode_unicode. (Backwards Incompatible)
  • New multiple-hooks system.
  • New Response.register_hook for registering hooks within the pipeline.
  • Response.url is now Unicode.

0.9.3

++++++++++++++++++

  • SSL verify=False bugfix (apparent on windows machines).

0.9.2

++++++++++++++++++

  • Asynchronous async.send method.
  • Support for proper chunk streams with boundaries.
  • session argument for Session classes.
  • Print entire hook tracebacks, not just exception instance.
  • Fix response.iter_lines from pending next line.
  • Fix but in HTTP-digest auth w/ URI having query strings.
  • Fix in Event Hooks section.
  • Urllib3 update.

0.9.1

++++++++++++++++++

  • danger_mode for automatic Response.raise_for_status()
  • Response.iter_lines refactor

0.9.0

++++++++++++++++++

  • verify ssl is default.

0.8.9

++++++++++++++++++

  • Packaging fix.

0.8.8

++++++++++++++++++

  • SSL CERT VERIFICATION!
  • Release of Cerifi: Mozilla's cert list.
  • New 'verify' argument for SSL requests.
  • Urllib3 update.

0.8.7

++++++++++++++++++

  • iter_lines last-line truncation fix
  • Force safe_mode for async requests
  • Handle safe_mode exceptions more consistently
  • Fix iteration on null responses in safe_mode

0.8.6

++++++++++++++++++

  • Socket timeout fixes.
  • Proxy Authorization support.

0.8.5

++++++++++++++++++

  • Response.iter_lines!

0.8.4

++++++++++++++++++

  • Prefetch bugfix.
  • Added license to installed version.

0.8.3

++++++++++++++++++

  • Converted auth system to use simpler callable objects.
  • New session parameter to API methods.
  • Display full URL while logging.

0.8.2

++++++++++++++++++

  • New Unicode decoding system, based on over-ridable Response.encoding.
  • Proper URL slash-quote handling.
  • Cookies with [, ], and _ allowed.

0.8.1

++++++++++++++++++

  • URL Request path fix
  • Proxy fix.
  • Timeouts fix.

0.8.0

++++++++++++++++++

  • Keep-alive support!
  • Complete removal of Urllib2
  • Complete removal of Poster
  • Complete removal of CookieJars
  • New ConnectionError raising
  • Safe_mode for error catching
  • prefetch parameter for request methods
  • OPTION method
  • Async pool size throttling
  • File uploads send real names
  • Vendored in urllib3

0.7.6

++++++++++++++++++

  • Digest authentication bugfix (attach query data to path)

0.7.5

++++++++++++++++++

  • Response.content = None if there was an invalid response.
  • Redirection auth handling.

0.7.4

++++++++++++++++++

  • Session Hooks fix.

0.7.3

++++++++++++++++++

  • Digest Auth fix.

0.7.2

++++++++++++++++++

  • PATCH Fix.

0.7.1

++++++++++++++++++

  • Move away from urllib2 authentication handling.
  • Fully Remove AuthManager, AuthObject, &c.
  • New tuple-based auth system with handler callbacks.

0.7.0

++++++++++++++++++

  • Sessions are now the primary interface.
  • Deprecated InvalidMethodException.
  • PATCH fix.
  • New config system (no more global settings).

0.6.6

++++++++++++++++++

  • Session parameter bugfix (params merging).

0.6.5

++++++++++++++++++

  • Offline (fast) test suite.
  • Session dictionary argument merging.

0.6.4

++++++++++++++++++

  • Automatic decoding of unicode, based on HTTP Headers.
  • New decode_unicode setting.
  • Removal of r.read/close methods.
  • New r.faw interface for advanced response usage.*
  • Automatic expansion of parameterized headers.

0.6.3

++++++++++++++++++

  • Beautiful requests.async module, for making async requests w/ gevent.

0.6.2

++++++++++++++++++

  • GET/HEAD obeys allow_redirects=False.

0.6.1

++++++++++++++++++

  • Enhanced status codes experience \o/
  • Set a maximum number of redirects (settings.max_redirects)
  • Full Unicode URL support
  • Support for protocol-less redirects.
  • Allow for arbitrary request types.
  • Bugfixes

0.6.0

++++++++++++++++++

  • New callback hook system
  • New persistent sessions object and context manager
  • Transparent Dict-cookie handling
  • Status code reference object
  • Removed Response.cached
  • Added Response.request
  • All args are kwargs
  • Relative redirect support
  • HTTPError handling improvements
  • Improved https testing
  • Bugfixes

0.5.1

++++++++++++++++++

  • International Domain Name Support!
  • Access headers without fetching entire body (read())
  • Use lists as dicts for parameters
  • Add Forced Basic Authentication
  • Forced Basic is default authentication type
  • python-requests.org default User-Agent header
  • CaseInsensitiveDict lower-case caching
  • Response.history bugfix

0.5.0

++++++++++++++++++

  • PATCH Support
  • Support for Proxies
  • HTTPBin Test Suite
  • Redirect Fixes
  • settings.verbose stream writing
  • Querystrings for all methods
  • URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised
    r.requests.get(&#39;hwe://blah&#39;); r.raise_for_status()

0.4.1

++++++++++++++++++

  • Improved Redirection Handling
  • New 'allow_redirects' param for following non-GET/HEAD Redirects
  • Settings module refactoring

0.4.0

++++++++++++++++++

  • Response.history: list of redirected responses
  • Case-Insensitive Header Dictionaries!
  • Unicode URLs

0.3.4

++++++++++++++++++

  • Urllib2 HTTPAuthentication Recursion fix (Basic/Digest)
  • Internal Refactor
  • Bytes data upload Bugfix

0.3.3

++++++++++++++++++

  • Request timeouts
  • Unicode url-encoded data
  • Settings context manager and module

0.3.2

++++++++++++++++++

  • Automatic Decompression of GZip Encoded Content
  • AutoAuth Support for Tupled HTTP Auth

0.3.1

++++++++++++++++++

  • Cookie Changes
  • Response.read()
  • Poster fix

0.3.0

++++++++++++++++++

  • Automatic Authentication API Change
  • Smarter Query URL Parameterization
  • Allow file uploads and POST data together
  • New Authentication Manager System
    • Simpler Basic HTTP System
    • Supports all build-in urllib2 Auths
    • Allows for custom Auth Handlers

0.2.4

++++++++++++++++++

  • Python 2.5 Support
  • PyPy-c v1.4 Support
  • Auto-Authentication tests
  • Improved Request object constructor

0.2.3

++++++++++++++++++

  • New HTTPHandling Methods
    • Response.nonzero (false if bad HTTP Status)
    • Response.ok (True if expected HTTP Status)
    • Response.error (Logged HTTPError if bad HTTP Status)
    • Response.raise_for_status() (Raises stored HTTPError)

0.2.2

++++++++++++++++++

  • Still handles request in the event of an HTTPError. (Issue 2)
  • Eventlet and Gevent Monkeypatch support.
  • Cookie Support (Issue 1)

0.2.1

++++++++++++++++++

  • Added file attribute to POST and PUT requests for multipart-encode file uploads.
  • Added Request.url attribute for context and redirects

0.2.0

++++++++++++++++++

  • Birth!

0.0.1

++++++++++++++++++

  • Frustration
  • Conception

Once you have closed this pull request, I'll create seperate pull requests for every update as soon as I find them.

That's it for now!

Happy merging! 🤖

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants