=========================
 pyutilib.misc CHANGELOG
=========================

-------------------------------------------------------------------------------
 Version 5.10
-------------------------------------------------------------------------------

- Next release

-------------------------------------------------------------------------------
 Version 5.9.1
-------------------------------------------------------------------------------

- Updating to import_file for better support of filenames containing periods

-------------------------------------------------------------------------------
 Version 5.9
-------------------------------------------------------------------------------

- Adding functionality to import_file that allows forcefully reloading
  a module under a different name.

- Adding functionality for creating hardlinks

-------------------------------------------------------------------------------
 Version 5.8
-------------------------------------------------------------------------------

- Adding logic to support comparison of compressed json and yaml files

- Removing restriction about using pyutilib.misc.import_file with file names containing a "."

- Making numeric difference output more helpful with small floating point
  differences

- Print line number for failed imports.

-------------------------------------------------------------------------------
 Version 5.7
-------------------------------------------------------------------------------

- Improved indentation processing when generating documentation for
  ConfigBlocks with hidden "developer" options.

- Improved identification of floating point numbers in baseline comparisons.

-------------------------------------------------------------------------------
 Version 5.6
-------------------------------------------------------------------------------

- Added new configuration management class

- Adding ArchiveReader class. This is a simple interface
  for opening file objects for reading that may live inside an
  archive such as a .zip, .tar, or standard directory.

- Misc bug fixes.

-------------------------------------------------------------------------------
 Version 5.5.1
-------------------------------------------------------------------------------

- Need to set the sys.path environment to ensure that packages are
  imported correctly in python3

- Eliminating the use of func_code

-------------------------------------------------------------------------------
 Version 5.5
-------------------------------------------------------------------------------

- Removing code that is used in python 2.4 (which is no longer supported)

- pypy portability fixes

- py3k portability fixes

- Explicit import of xmltodict

- Change to completely ignore a line that is filtered.

- Updating the test filter rule to track that the filter is passed
  the RAW line and not the line with the ignored characters removed.

-------------------------------------------------------------------------------
 Version 5.4
-------------------------------------------------------------------------------

- Revising the comparison logic to allow the filter function to
  return a string, which replaces the current line.

- Adding xmltodict.py, a third-party xml parsing tool. This is used
  to support an XML comparison utility that is analogous to what
  is supported for YAML and JSON.

-------------------------------------------------------------------------------
 Version 5.3.1
-------------------------------------------------------------------------------

- Bug fixes related to portability changes.

-------------------------------------------------------------------------------
 Version 5.3
-------------------------------------------------------------------------------

- Portability changes for Python 3.x

- Edits to close open files.

-------------------------------------------------------------------------------
 Version 5.2
-------------------------------------------------------------------------------

- Changing the management of the 'index' attribute to be consistent
  with Coopr components.

-------------------------------------------------------------------------------
 Version 5.1
-------------------------------------------------------------------------------

- Adding a utility to perform a simple YAML parse.

- Changing the Container/Options class to print output in YAML format, rather
  than the custom format it was previously using.

- Adding 'update' method to Container objects.

- Relaxing the restriction on which import exceptions can cause YAML /
  JSON to be reported as unavailable (for Python 2.4 compatibility).

- Adding the find_files utility, which recursively finds files that
  match a pattern.

- Split out flatten_list from flatten: flatten will work on any
  nested (iterable) containers. flatten_list is specialized for
  nested lists (and is actually faster than flatten_tuple).

- Efficiency improvements for flatten() and flatten_tuple()

-------------------------------------------------------------------------------
 Version 5.0.2
-------------------------------------------------------------------------------

- Changed the implementation of quote_split() to better handle several
  common edge cases that frequently appear on Windows platforms.

-------------------------------------------------------------------------------
 Version 5.0.1
-------------------------------------------------------------------------------

- Changed the logic for load_json() to generate data with non-unicode strings.
  This supports proper comparison of JSON and YAML data in Python 2.x.

-------------------------------------------------------------------------------
 Version 5.0
-------------------------------------------------------------------------------

- Removing deprecated recursive_delete function.

- A rework of the yaml comparison utilities, to support both json and yaml.

- Adding more explicit diagnostic information when parsing JSON and YAML
  files.

- Added logic to limit the number of comparisons made after a file comparison
  test fails.

- Making the comparison method even smarter when numeric values are
  involved.  Now, the comparison does not assume that the numeric values
  are white-space separated tokens.

- Bug fix. Allow integer and floating point values to be compared in yaml
  data.

- Migrating file comparison logic from pyutilib.th into pyutilib.misc

- Adding comparison tests that rely on tolerance values.

- Fixes for import_file() so that any import exceptions (i.e. Python
  parsing errors) are passed intact up to the caller. This is critical
  for Pyomo so that the user can use the "-c" option to get the actual
  line number in their model file that causes the exception.

- Creating a default log handler for the 'pyutilib' namespace (so pyutilib
  logging messages can actually make it to the user). 

-------------------------------------------------------------------------------
 Version 4.6
-------------------------------------------------------------------------------

- Adding basic classes for "tee"ing streams and the console streams
  (sys.stdout and sys.stderr).

-------------------------------------------------------------------------------
 Version 4.5.4
-------------------------------------------------------------------------------

- Reformatting with reindent.

-------------------------------------------------------------------------------
 Version 4.5.3
-------------------------------------------------------------------------------

- A slightly more robust importer. If the filename ends with '.py', then
  don't try to import it. For example, it interprets "file.py" as package
  "file" followed by module "py". But this is rarely the case.

-------------------------------------------------------------------------------
 Version 4.5.2
-------------------------------------------------------------------------------

- Fixing the logic to compute estimated downloads for packages that
  are release just before the specified start time.

-------------------------------------------------------------------------------
 Version 4.5.1
-------------------------------------------------------------------------------

- Install scripts with entry points.

-------------------------------------------------------------------------------
 Version 4.5
-------------------------------------------------------------------------------

- Changed tests to eliminate the use of deprecated 'fail*' syntax.

- Fixed bug in the SparseMapping getitem logic.

- Overhaul of the LogHandler:
    * now takes an optional "verbosity" keyword argument. If present,
      it is assumed to be a function that returns a boolean indicating
      whether or not to output the file/function/line as part of the
      log output. Defaults to "True" for backwards compatibility
    * now indents all lines in the provided message with a tab (instead of
      just indenting the first line).  correctly handle newlines for
      messages
    * print lines for multiline messages in the right order 
    * changed output to use stdout rather than stderr

- Cleanup of the StreamIndenter.

- Adding a utility (PauseGC) for cleanly pausing the Python garbage
  collector.

-------------------------------------------------------------------------------
 Version 4.4
-------------------------------------------------------------------------------

- Added the SparseMapping object, which provides a default value for
  keys that are not defined in the dictionary, a specified domain for keys,
  and a specified value that mappings are within.

- Adding the pyutilib.misc.indent_io.StreamIndenter? class for indenting
  or prefacing every line of output sent to a file-like object (resolves
  #92).

- Adding output of YAML comparison diagnostic when exception is thrown
  when comparing sub-list elements (baseline versus output). The previous
  version silently let errors go by, significantly complicating diagnostics.

- Added LogHandler, which was adapted from coopr.pyomo

-------------------------------------------------------------------------------
 Version 4.3
-------------------------------------------------------------------------------

- If we catch an exception while loading a module, include the message
  from the caught exception as part of the "Failed to load python module"
  exception we throw.

- Adding support for importing unexported symbols through import_file().
  Also refining the import name parsing to explicitly look for .py or .pyc
  extension, and raising an exception for '.' in the file name.

-------------------------------------------------------------------------------
 Version 4.2
-------------------------------------------------------------------------------

- Adding a 'validate' option to the search_file function.

-------------------------------------------------------------------------------
 Version 4.1.2
-------------------------------------------------------------------------------

- Changing test to purposely fail. The 'cd' command actualy exists
  on Macs!

-------------------------------------------------------------------------------
 Version 4.1.1
-------------------------------------------------------------------------------

- Removing a limitation on the # of packages downloaded.

-------------------------------------------------------------------------------
 Version 4.1
-------------------------------------------------------------------------------

- Changing format of exceptions to print YAML data structure
  using pprint.

- Introduced conditional for runpy2.  If runpy is not available, then
  try to execute using runpy2.

- Add a deepcopy method that annotates a class.  This is used if
  running Python 2.4.

- Adding diagnostic output to pyutilib.misc import_file method to add name of 
  the Python module that it failed to load. Fixes the issue of the pyomo script 
  not reporting the file name (instead just: Failed to open file).

- For projects that split their code into multiple files, assume that
  all their files are relative to their directory. Note that after
  the import is done, that directory is removed, so no permanent
  changing of the environment.

- Add @deprecated decorator.  With this decorator, we can now start to 
  actively mark/remind ourselves of deprecated functions in use. Will also 
  perhaps be good for unawares users. Example use:

  @deprecated
  def some_func ( ):
    pass

-------------------------------------------------------------------------------
 Version 4.0
-------------------------------------------------------------------------------

- Adding pypi_downloads script.

- Adding module for YAML utilities, including tools for comparing
  YAML data (repn, strings, files).

- Adding utility to fix strings so they can be printed in YAML output.

- Added associated tests for these YAML utilities.

-------------------------------------------------------------------------------
 Version 3.4.1
-------------------------------------------------------------------------------

- Update to package README files to point to the new PyUtilib mailing lists. 

-------------------------------------------------------------------------------
 Version 3.4
-------------------------------------------------------------------------------

- Adding the rmtree() method developed in pyutilib.virtualenv 

-------------------------------------------------------------------------------
 Version 3.3.1
-------------------------------------------------------------------------------

- Rework of unit tests to (a) import pyutilib.th as 'unittest' and
  (b) employ test skipping.

-------------------------------------------------------------------------------
 Version 3.3
-------------------------------------------------------------------------------

- Misc fix to handle '_' attributes separately in Container objects, so 
  they don't show up in the dictionary keys.

- Adding the ability to name Container objects.

- Created the Options class, which is an alias for Container.

-------------------------------------------------------------------------------
 Version 3.2
-------------------------------------------------------------------------------

- Adding a Container class, which generalizes Bunch.  If an attribute
  does not exist, then the getattr() function returns None unless the
  attribute name startes with '_'.  In that case, getattr() raises
  AttributeError.  This allows Container objects to simplify
  access to attribute values;  attribute initialization can be
  assessed by comparing the attribute value to None.

- Adding a coroutine decorator.

-------------------------------------------------------------------------------
 Version 3.1
-------------------------------------------------------------------------------

- Bug fix for tracing when '__file__' is not in frame.f_globals

-------------------------------------------------------------------------------
 Version 3.0
-------------------------------------------------------------------------------

- Initial release PyUtilib to create the pyutilib.misc package.

- See pyutilib.dist for previous ChangeLog information related to PyUtilib.

