|
FITS (Flexible Image Transport System) is a data format most used in astronomy.
PyFITS is a Python module for reading, writing, and manipulating FITS files.
The module uses Python's object-oriented features to provide quick, easy, and
efficient access to FITS files. The use of Python's array syntax enables
immediate access to any FITS extension, header cards, or data items.
Changes to 2.4.0 (in py-pyfits):
Changelog
===========
3.2 (2013-11-26)
----------------
Highlights
^^^^^^^^^^
- Rewrote CFITSIO-based backend for handling tile compression of FITS files.
It now uses a standard CFITSIO instead of heavily modified pieces of CFITSIO
as before. PyFITS ships with its own copy of CFITSIO v3.35 which supports
the latest version of the Tiled Image Convention (v2.3), but system
packagers may choose instead to strip this out in favor of a
system-installed version of CFITSIO. Earlier versions may work, but nothing
earlier than 3.28 has been tested yet. (#169)
- Added support for reading and writing tables using the Q format for columns.
The Q format is identical to the P format (variable-length arrays) except
that it uses 64-bit integers for the data descriptors, allowing more than
4 GB of variable-length array data in a single table. (#160)
- Added initial support for table columns containing pseudo-unsigned integers.
This is currently enabled by using the ``uint=True`` option when opening
files; any table columns with the correct BZERO value will be interpreted
and returned as arrays of unsigned integers.
- Some refactoring of the table and ``FITS_rec`` modules in order to better
separate the details of the FITS binary and ASCII table data structures from
the HDU data structures that encapsulate them. Most of these changes should
not be apparent to users (but see API Changes below).
API Changes
^^^^^^^^^^^
- Assigning to values in ``ColDefs.names``, ``ColDefs.formats``,
``ColDefs.nulls`` and other attributes of ``ColDefs`` instances that return
lists of column properties is no longer supported. Assigning to those lists
will no longer update the corresponding columns. Instead, please just
modify the ``Column`` instances directly (``Column.name``, ``Column.null``,
etc.)
- The ``pyfits.new_table`` function is marked "pending deprecation". This
does not mean it will be removed outright or that its functionality has
changed. It will likely be replaced in the future for a function with
similar, if not subtly different functionality. A better, if not slightly
more verbose approach is to use ``pyfits.FITS_rec.from_columns`` to create
a new ``FITS_rec`` table--this has the same interface as
``pyfits.new_table``. The difference is that it returns a plan ``FITS_rec``
array, and not an HDU instance. This ``FITS_rec`` object can then be used
as the data argument in the constructors for ``BinTableHDU`` (for binary
tables) or ``TableHDU`` (for ASCII tables). This is analogous to creating
an ``ImageHDU`` by passing in an image array.
``pyfits.FITS_rec.from_columns`` is just a simpler way of creating a
FITS-compatible recarray from a FITS column specification.
- The ``updateHeader``, ``updateHeaderData``, and ``updateCompressedData``
methods of the ``CompDataHDU`` class are pending deprecation and moved to
internal methods. The operation of these methods depended too much on
internal state to be used safely by users; instead they are invoked
automatically in the appropriate places when reading/writing compressed image
HDUs.
- The ``CompDataHDU.compData`` attribute is pending deprecation in favor of
the clearer and more PEP-8 compatible ``CompDataHDU.compressed_data``.
- The constructor for ``CompDataHDU`` has been changed to accept new keyword
arguments. The new keyword arguments are essentially the same, but are in
underscore_separated format rather than camelCase format. The old arguments
are still pending deprecation.
- The internal attributes of HDU classes ``_hdrLoc``, ``_datLoc``, and
``_datSpan`` have been replaced with ``_header_offset``, ``_data_offset``,
and ``_data_size`` respectively. The old attribute names are still pending
deprecation. This should only be of interest to advanced users who have
created their own HDU subclasses.
- The following previously deprecated functions and methods have been removed
entirely: ``createCard``, ``createCardFromString``, ``upperKey``,
``ColDefs.data``, ``setExtensionNameCaseSensitive``, ``_File.getfile``,
``_TableBaseHDU.get_coldefs``, ``Header.has_key``, ``Header.ascardlist``.
If you run your code with a previous version of PyFITS (>= 3.0, < 3.2) with
the ``python -Wd`` argument, warnings for all deprecated interfaces still in
use will be displayed.
- Interfaces that were pending deprecation are now fully deprecated. These
include: ``create_card``, ``create_card_from_string``, ``upper_key``,
``Header.get_history``, and ``Header.get_comment``.
- The ``.name`` attribute on HDUs is now directly tied to the HDU's header, so
that if ``.header['EXTNAME']`` changes so does ``.name`` and vice-versa.
- The ``pyfits.file.PYTHON_MODES`` constant dict was renamed to
``pyfits.file.PYFITS_MODES`` which better reflects its purpose. This is
rarely used by client code, however. Support for the old name will be
removed by PyFITS 3.4.
Other Changes and Additions
^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The new compression code also adds support for the ZQUANTIZ and ZDITHER0
keywords added in more recent versions of this FITS Tile Compression spec.
This includes support for lossless compression with GZIP. (#198) By default
no dithering is used, but the ``SUBTRACTIVE_DITHER_1`` and
``SUBTRACTIVE_DITHER_2`` methods can be enabled by passing the correct
constants to the ``quantize_method`` argument to the ``CompImageHDU``
constuctor. A seed can be manually specified, or automatically generated
using either the system clock or checksum-based methods via the
``dither_seed`` argument. See the documentation for ``CompImageHDU`` for
more details. (#198) (spacetelescope/PYFITS#32)
- Images compressed with the Tile Compression standard can now be larger than
4 GB through support of the Q format. (#159)
- All HDUs now have a ``.ver`` ``.level`` attribute that returns the value of
the EXTVAL and EXTLEVEL keywords from that HDU's header, if the exist. This
was added for consistency with the ``.name`` attribute which returns the
EXTNAME value from the header.
- Then ``Column`` and ``ColDefs`` classes have new ``.dtype`` attributes
which give the Numpy dtype for the column data in the first case, and the
full Numpy compound dtype for each table row in the latter case.
- There was an issue where new tables created defaulted the values in all
string columns to '0.0'. Now string columns are filled with empty strings
by default--this seems a less surprising default, but it may cause
differences with tables created with older versions of PyFITS.
- Improved round-tripping and preservation of manually assigned column
attributes (``TNULLn``, ``TSCALn``, etc.) in table HDU headers.
(astropy/astropy#996)
Bug Fixes
^^^^^^^^^
- Binary tables containing compressed images may, optionally, contain other
columns unrelated to the tile compression convention. Although this is an
uncommon use case, it is permitted by the standard. (#159)
- Reworked some of the file I/O routines to allow simpler, more consistent
mapping between OS-level file modes ('rb', 'wb', 'ab', etc.) and the more
"PyFITS-specific" modes used by PyFITS like "readonly" and "update".
That is, if reading a FITS file from an open file object, it doesn't matter
as much what "mode" it was opened in so long as it has the right
capabilities (read/write/etc.) Also works around bugs in the Python io
module in 2.6+ with regard to file modes. (spacetelescope/PyFITS#33)
- Fixed an obscure issue that can occur on systems that don't have flush to
memory-mapped files implemented (namely GNU Hurd). (astropy/astropy#968)
3.1.3 (2013-11-26)
------------------
- Disallowed assigning NaN and Inf floating point values as header values,
since the FITS standard does not define a way to represent them in. Because
this is undefined, the previous behavior did not make sense and produced
invalid FITS files. (spacetelescope/PyFITS#11)
- Added a workaround for a bug in 64-bit OSX that could cause truncation when
writing files greater than 2^32 bytes in size. (spacetelescope/PyFITS#28)
- Fixed a long-standing issue where writing binary tables did not correctly
write the TFORMn keywords for variable-length array columns (they ommitted
the max array length parameter of the format). This was thought fixed in
v3.1.2, but it was only fixed there for compressed image HDUs and not for
binary tables in general.
- Fixed an obscure issue that can occur on systems that don't have flush to
memory-mapped files implemented (namely GNU Hurd). (Backported from 3.2)
3.0.12 (2013-11-26)
-------------------
- Disallowed assigning NaN and Inf floating point values as header values,
since the FITS standard does not define a way to represent them in. Because
this is undefined, the previous behavior did not make sense and produced
invalid FITS files. (Backported from 3.1.3)
- Added a workaround for a bug in 64-bit OSX that could cause truncation when
writing files greater than 2^32 bytes in size. (Backported from 3.1.3)
- Fixed a long-standing issue where writing binary tables did not correctly
write the TFORMn keywords for variable-length array columns (they ommitted
the max array length parameter of the format). This was thought fixed in
v3.1.2, but it was only fixed there for compressed image HDUs and not for
binary tables in general. (Backported from 3.1.3)
- Fixed an obscure issue that can occur on systems that don't have flush to
memory-mapped files implemented (namely GNU Hurd). (Backported from 3.2)
3.1.2 (2013-04-22)
------------------
- When an error occurs opening a file in fitsdiff the exception message will
now at least mention which file had the error. (#168)
- Fixed support for opening gzipped FITS files by filename in a writeable mode
(PyFITS has supported writing to gzip files for some time now, but only
enabled it when GzipFile objects were passed to ``pyfits.open()`` due to
some legacy code preventing full gzip support. (#195)
- Added a more helpful error message in the case of malformatted FITS files
that contain non-float NULL values in an ASCII table but are missing the
required TNULLn keywords in the header. (#197)
- Fixed an (apparently long-standing) issue where writing compressed images
did not correctly write the TFORMn keywords for variable-length array
columns (they ommitted the max array length parameter of the format). (#199)
- Slightly refactored how tables containing variable-length array columns are
handled to add two improvements: Fixes an issue where accessing the data
after a call to the `pyfits.getdata` convenience function caused an
exception, and allows the VLA data to be read from an existing mmap of the
FITS file. (#200)
- Fixed a bug that could occur when opening a table containing
multi-dimensional columns (i.e. via the TDIMn keyword) and then writing it
out to a new file. (#201)
- Added use of the console_scripts entry point to install the fitsdiff and
fitscheck scripts, which if nothing else provides better Windows support.
The generated scripts now override the ones explicitly defined in the
scripts/ directory (which were just trivial stubs to begin with). (#202)
- Fixed a bug on Python 3 where attempting to open a non-existent file on
Python 3 caused a seemingly unrelated traceback. (#203)
- Fixed a bug in fitsdiff that reported two header keywords containing NaN
as value as different. (#204)
- Fixed an issue in the tests that caused some tests to fail if pyfits is
installed with read-only permissions. (#208)
- Fixed a bug where instantiating a ``BinTableHDU`` from a numpy array
containing boolean fields converted all the values to ``False``. (#215)
- Fixed an issue where passing an array of integers into the constructor of
``Column()`` when the column type is floats of the same byte width caused the
column array to become garbled. (#218)
- Fixed inconsistent behavior in creating CONTINUE cards from byte strings
versus unicode strings in Python 2--CONTINUE cards can now be created
properly from unicode strings (so long as they are convertable to ASCII).
(spacetelescope/PyFITS#1)
- Fixed a couple cases where creating a new table using TDIMn in some of the
columns could caused a crash. (spacetelescope/PyFITS#3)
- Fixed a bug in parsing HIERARCH keywords that do not have a space after
the first equals sign (before the value). (spacetelescope/PyFITS#5)
- Prevented extra leading whitespace on HIERARCH keywords from being treated
as part of the keyword. (spacetelescope/PyFITS#6)
- Fixed a bug where HIERARCH keywords containing lower-case letters was
mistakenly marked as invalid during header validation.
(spacetelescope/PyFITS#7)
- Fixed an issue that was ancillary to (spacetelescope/PyFITS#7) where the
``Header.index()`` method did not work correctly with HIERARCH keywords
containing lower-case letters.
3.0.11 (2013-04-17)
-------------------
- Fixed support for opening gzipped FITS files by filename in a writeable mode
(PyFITS has supported writing to gzip files for some time now, but only
enabled it when GzipFile objects were passed to ``pyfits.open()`` due to
some legacy code preventing full gzip support. Backported from 3.1.2. (#195)
- Added a more helpful error message in the case of malformatted FITS files
that contain non-float NULL values in an ASCII table but are missing the
required TNULLn keywords in the header. Backported from 3.1.2. (#197)
- Fixed an (apparently long-standing) issue where writing compressed images did
not correctly write the TFORMn keywords for variable-length array columns
(they ommitted the max array length parameter of the format). Backported from
3.1.2. (#199)
- Slightly refactored how tables containing variable-length array columns are
handled to add two improvements: Fixes an issue where accessing the data
after a call to the `pyfits.getdata` convenience function caused an
exception, and allows the VLA data to be read from an existing mmap of the
FITS file. Backported from 3.1.2. (#200)
- Fixed a bug that could occur when opening a table containing
multi-dimensional columns (i.e. via the TDIMn keyword) and then writing it
out to a new file. Backported from 3.1.2. (#201)
- Fixed a bug on Python 3 where attempting to open a non-existent file on
Python 3 caused a seemingly unrelated traceback. Backported from 3.1.2.
(#203)
- Fixed a bug in fitsdiff that reported two header keywords containing NaN
as value as different. Backported from 3.1.2. (#204)
- Fixed an issue in the tests that caused some tests to fail if pyfits is
installed with read-only permissions. Backported from 3.1.2. (#208)
- Fixed a bug where instantiating a ``BinTableHDU`` from a numpy array
containing boolean fields converted all the values to ``False``. Backported
from 3.1.2. (#215)
- Fixed an issue where passing an array of integers into the constructor of
``Column()`` when the column type is floats of the same byte width caused the
column array to become garbled. Backported from 3.1.2. (#218)
- Fixed a couple cases where creating a new table using TDIMn in some of the
columns could caused a crash. Backported from 3.1.2.
(spacetelescope/PyFITS#3)
3.1.1 (2013-01-02)
------------------
This is a bug fix release for the 3.1.x series.
Bug Fixes
^^^^^^^^^
- Improved handling of scaled images and pseudo-unsigned integer images in
compressed image HDUs. They now work more transparently like normal image
HDUs with support for the ``do_not_scale_image_data`` and ``uint`` options,
as well as ``scale_back`` and ``save_backup``. The ``.scale()`` method
works better too. (#88)
- Permits non-string values for the EXTNAME keyword when reading in a file,
rather than throwing an exception due to the malformatting. Added
verification for the format of the EXTNAME keyword when writing. (#96)
- Added support for EXTNAME and EXTVER in PRIMARY HDUs. That is, if EXTNAME
is specified in the header, it will also be reflected in the ``.name``
attribute and in ``pyfits.info()``. These keywords used to be verboten in
PRIMARY HDUs, but the latest version of the FITS standard allows them.
(#151)
- HCOMPRESS can again be used to compress data cubes (and higher-dimensional
arrays) so long as the tile size is effectively 2-dimensional. In fact,
PyFITS will automatically use compatible tile sizes even if they're not
explicitly specified. (#171)
- Added support for the optional ``endcard`` parameter in the
``Header.fromtextfile()`` and ``Header.totextfile()`` methods. Although
``endcard=False`` was a reasonable default assumption, there are still text
dumps of FITS headers that include the END card, so this should have been
more flexible. (#176)
- Fixed a crash when running fitsdiff on two empty (that is, zero row) tables.
(#178)
- Fixed an issue where opening files containing random groups HDUs in update
mode could cause an unnecessary rewrite of the file even if none of the
data is modified. (#179)
- Fixed a bug that could caused a deadlock in the filesystem on OSX if PyFITS
is used with Numpy 1.7 in some cases. (#180)
- Fixed a crash when generating diff reports from diffs using the
``ignore_comments`` options. (#181)
- Fixed some bugs with WCS Paper IV record-valued keyword cards:
- Cards that looked kind of like RVKCs but were not intended to be were
over-permissively treated as such--commentary keywords like COMMENT and
HISTORY were particularly affected. (#183)
- Looking up a card in a header by its standard FITS keyword only should
always return the raw value of that card. That way cards containing
values that happen to valid RVKCs but were not intended to be will still
be treated like normal cards. (#184)
- Looking up a RVKC in a header with only part of the field-specifier (for
example "DP1.AXIS" instead of "DP1.AXIS.1") was implicitly treated as a
wildcard lookup. (#184)
- Fixed a crash when diffing two FITS files where at least one contains a
compressed image HDU which was not recognized as an image instead of a
table. (#187)
- Fixed bugs in the backwards compatibility layer for the ``CardList.index``
and ``CardList.count`` methods. (#190)
- Improved ``__repr__`` and text file representation of cards with long values
that are split into CONTINUE cards. (#193)
- Fixed a crash when trying to assign a long (> 72 character) value to blank
('') keywords. This also changed how blank keywords are represented--there
are still exactly 8 spaces before any commentary content can begin; this
*may* affect the exact display of header cards that assumed there could be
fewer spaces in a blank keyword card before the content begins. However, the
current approach is more in line with the requirements of the FITS standard.
(#194)
3.0.10 (2013-01-02)
-------------------
- Improved handling of scaled images and pseudo-unsigned integer images in
compressed image HDUs. They now work more transparently like normal image
HDUs with support for the ``do_not_scale_image_data`` and ``uint`` options,
as well as ``scale_back`` and ``save_backup``. The ``.scale()`` method
works better too. Backported from 3.1.1. (#88)
- Permits non-string values for the EXTNAME keyword when reading in a file,
rather than throwing an exception due to the malformatting. Added
verification for the format of the EXTNAME keyword when writing. Backported
from 3.1.1. (#96)
- Added support for EXTNAME and EXTVER in PRIMARY HDUs. That is, if EXTNAME
is specified in the header, it will also be reflected in the ``.name``
attribute and in ``pyfits.info()``. These keywords used to be verbotten in
PRIMARY HDUs, but the latest version of the FITS standard allows them.
Backported from 3.1.1. (#151)
- HCOMPRESS can again be used to compress data cubes (and higher-dimensional
arrays) so long as the tile size is effectively 2-dimensional. In fact,
PyFITS will not automatically use compatible tile sizes even if they're not
explicitly specified. Backported from 3.1.1. (#171)
- Fixed a bug when writing out files containing zero-width table columns,
where the TFIELDS keyword would be updated incorrectly, leaving the table
largely unreadable. Backported from 3.1.0. (#174)
- Fixed an issue where opening files containing random groups HDUs in update
mode could cause an unnecessary rewrite of the file even if none of the
data is modified. Backported from 3.1.1. (#179)
- Fixed a bug that could caused a deadlock in the filesystem on OSX if PyFITS
is used with Numpy 1.7 in some cases. Backported from 3.1.1. (#180)
3.1 (2012-08-08)
----------------
Highlights
^^^^^^^^^^
- The ``Header`` object has been significantly reworked, and ``CardList``
objects are now deprecated (their functionality folded into the ``Header``
class). See API Changes below for more details.
- Memory maps are now used by default to access HDU data. See API Changes
below for more details.
- Now includes a new version of the ``fitsdiff`` program for comparing two
FITS files, and a new FITS comparison API used by ``fitsdiff``. See New
Features below.
API Changes
^^^^^^^^^^^
- The ``Header`` class has been rewritten, and the ``CardList`` class is
deprecated. Most of the basic details of working with FITS headers are
unchanged, and will not be noticed by most users. But there are differences
in some areas that will be of interest to advanced users, and to application
developers. For full details of the changes, see the "Header Interface
Transition Guide" section in the PyFITS documentation. See ticket #64 on
the PyFITS Trac for futher details and background. Some highlights are
listed below:
* The Header class now fully implements the Python dict interface, and can
be used interchangably with a dict, where the keys are header keywords.
* New keywords can be added to the header using normal keyword assignment
(previously it was necessary to use ``Header.update`` to add new
keywords). For example::
>>> header['NAXIS'] = 2
will update the existing 'FOO' keyword if it already exists, or add a new
one if it doesn't exist, just like a dict.
* It is possible to assign both a value and a comment at the same time using
a tuple::
>>> header['NAXIS'] = (2, 'Number of axes')
* To add/update a new card and ensure it's added in a specific location, use
``Header.set()``::
>>> header.set('NAXIS', 2, 'Number of axes', after='BITPIX')
This works the same as the old ``Header.update()``. ``Header.update()``
still works in the old way too, but is deprecated.
* Although ``Card`` objects still exist, it generally is not necessary to
work with them directly. ``Header.ascardlist()``/``Header.ascard`` are
deprecated and should not be used. To directly access the ``Card``
objects in a header, use ``Header.cards``.
* To access card comments, it is still possible to either go through the
card itself, or through ``Header.comments``. For example::
>>> header.cards['NAXIS'].comment
Number of axes
>>> header.comments['NAXIS']
Number of axes
* ``Card`` objects can now be used interchangeably with
``(keyword, value, comment)`` 3-tuples. They still have ``.value`` and
``.comment`` attributes as well. The ``.key`` attribute has been renamed
to ``.keyword`` for consistency, though ``.key`` is still supported (but
deprecated).
- Memory mapping is now used by default to access HDU data. That is,
``pyfits.open()`` uses ``memmap=True`` as the default. This provides better
performance in the majority of use cases--there are only some I/O intensive
applications where it might not be desirable. Enabling mmap by default also
enabled finding and fixing a large number of bugs in PyFITS' handling of
memory-mapped data (most of these bug fixes were backported to PyFITS
3.0.5). (#85)
* A new ``pyfits.USE_MEMMAP`` global variable was added. Set
``pyfits.USE_MEMMAP = False`` to change the default memmap setting for
opening files. This is especially useful for controlling the behavior in
applications where pyfits is deeply embedded.
* Likewise, a new ``PYFITS_USE_MEMMAP`` environment variable is supported.
Set ``PYFITS_USE_MEMMAP = 0`` in your environment to change the default
behavior.
- The ``size()`` method on HDU objects is now a ``.size`` property--this
returns the size in bytes of the data portion of the HDU, and in most cases
is equivalent to ``hdu.data.nbytes`` (#83)
- ``BinTableHDU.tdump`` and ``BinTableHDU.tcreate`` are deprecated--use
``BinTableHDU.dump`` and ``BinTableHDU.load`` instead. The new methods
output the table data in a slightly different format from previous versions,
which places quotes around each value. This format is compatible with data
dumps from previous versions of PyFITS, but not vice-versa due to a parsing
bug in older versions.
- Likewise the ``pyfits.tdump`` and ``pyfits.tcreate`` convenience function
versions of these methods have been renamed ``pyfits.tabledump`` and
``pyfits.tableload``. The old deprecated, but currently retained for
backwards compatibility. (r1125)
- A new global variable ``pyfits.EXTENSION_NAME_CASE_SENSITIVE`` was added.
This serves as a replacement for ``pyfits.setExtensionNameCaseSensitive``
which is not deprecated and may be removed in a future version. To enable
case-sensitivity of extension names (i.e. treat 'sci' as distict from 'SCI')
set ``pyfits.EXTENSION_NAME_CASE_SENSITIVE = True``. The default is
``False``. (r1139)
- A new global configuration variable ``pyfits.STRIP_HEADER_WHITESPACE`` was
added. By default, if a string value in a header contains trailing
whitespace, that whitespace is automatically removed when the value is read.
Now if you set ``pyfits.STRIP_HEADER_WHITESPACE = False`` all whitespace is
preserved. (#146)
- The old ``classExtensions`` extension mechanism (which was deprecated in
PyFITS 3.0) is removed outright. To our knowledge it was no longer used
anywhere. (r1309)
- Warning messages from PyFITS issued through the Python warnings API are now
output to stderr instead of stdout, as is the default. PyFITS no longer
modifies the default behavior of the warnings module with respect to which
stream it outputs to. (r1319)
- The ``checksum`` argument to ``pyfits.open()`` now accepts a value of
'remove', which causes any existing CHECKSUM/DATASUM keywords to be ignored,
and removed when the file is saved.
New Features
^^^^^^^^^^^^
- Added support for the proposed "FITS" extension HDU type. See
http://listmgr.cv.nrao.edu/pipermail/fitsbits/2002-April/001094.html. FITS
HDUs contain an entire FITS file embedded in their data section. `FitsHDU`
objects work like other HDU types in PyFITS. Their ``.data`` attribute
returns the raw data array. However, they have a special ``.hdulist``
attribute which processes the data as a FITS file and returns it as an
in-memory HDUList object. FitsHDU objects also support a
``FitsHDU.fromhdulist()`` classmethod which returns a new `FitsHDU` object
that embeds the supplied HDUList. (#80)
- Added a new ``.is_image`` attribute on HDU objects, which is True if the HDU
data is an 'image' as opposed to a table or something else. Here the
meaning of 'image' is fairly loose, and mostly just means a Primary or Image
extension HDU, or possibly a compressed image HDU (#71)
- Added an ``HDUList.fromstring`` classmethod which can parse a FITS file
already in memory and instantiate and ``HDUList`` object from it. This
could be useful for integrating PyFITS with other libraries that work on
FITS file, such as CFITSIO. It may also be useful in streaming
applications. The name is a slight misnomer, in that it actually accepts
any Python object that implements the buffer interface, which includes
``bytes``, ``bytearray``, ``memoryview``, ``numpy.ndarray``, etc. (#90)
- Added a new ``pyfits.diff`` module which contains facilities for comparing
FITS files. One can use the ``pyfits.diff.FITSDiff`` class to compare two
FITS files in their entirety. There is also a ``pyfits.diff.HeaderDiff``
class for just comparing two FITS headers, and other similar interfaces.
See the PyFITS Documentation for more details on this interface. The
``pyfits.diff`` module powers the new ``fitsdiff`` program installed with
PyFITS. After installing PyFITS, run ``fitsdiff --help`` for usage details.
- ``pyfits.open()`` now accepts a ``scale_back`` argument. If set to
``True``, this automatically scales the data using the original BZERO and
BSCALE parameters the file had when it was first opened, if any, as well as
the original BITPIX. For example, if the original BITPIX were 16, this
would be equivalent to calling ``hdu.scale('int16', 'old')`` just before
calling ``flush()`` or ``close()`` on the file. This option applies to all
HDUs in the file. (#120)
- ``pyfits.open()`` now accepts a ``save_backup`` argument. If set to
``True``, this automatically saves a backup of the original file before
flushing any changes to it (this of course only applies to update and append
mode). This may be especially useful when working with scaled image data.
(#121)
Changes in Behavior
^^^^^^^^^^^^^^^^^^^
- Warnings from PyFITS are not output to stderr by default, instead of stdout
as it has been for some time. This is contrary to most users' expectations
and makes it more difficult for them to separate output from PyFITS from the
desired output for their scripts. (r1319)
Bug Fixes
^^^^^^^^^
- Fixed ``pyfits.tcreate()`` (now ``pyfits.tableload()``) to be more robust
when encountering blank lines in a column definition file (#14)
- Fixed a fairly rare crash that could occur in the handling of CONTINUE cards
when using Numpy 1.4 or lower (though 1.4 is the oldest version supported by
PyFITS). (r1330)
- Fixed ``_BaseHDU.fromstring`` to actually correctly instantiate an HDU
object from a string/buffer containing the header and data of that HDU.
This allowed for the implementation of ``HDUList.fromstring`` described
above. (#90)
- Fixed a rare corner case where, in some use cases, (mildly, recoverably)
malformatted float values in headers were not properly returned as floats.
(#137)
- Fixed a corollary to the previous bug where float values with a leading zero
before the decimal point had the leading zero unnecessarily removed when
saving changes to the file (eg. "0.001" would be written back as ".001" even
if no changes were otherwise made to the file). (#137)
- When opening a file containing CHECKSUM and/or DATASUM keywords in update
mode, the CHECKSUM/DATASUM are updated and preserved even if the file was
opened with checksum=False. This change in behavior prevents checksums from
being unintentionally removed. (#148)
- Fixed a bug where ``ImageHDU.scale(option='old')`` wasn't working at all--it
was not restoring the image to its original BSCALE and BZERO values. (#162)
- Fixed a bug when writing out files containing zero-width table columns,
where the TFIELDS keyword would be updated incorrectly, leaving the table
largely unreadable. This fix will be backported to the 3.0.x series in
version 3.0.10. (#174)
3.0.9 (2012-08-06)
------------------
This is a bug fix release for the 3.0.x series.
Bug Fixes
^^^^^^^^^
- Fixed ``Header.values()``/``Header.itervalues()`` and ``Header.items()``/
``Header.iteritems()`` to correctly return the different values for
duplicate keywords (particularly commentary keywords like HISTORY and
COMMENT). This makes the old Header implementation slightly more compatible
with the new implementation in PyFITS 3.1. (#127)
.. note::
This fix did not change the existing behavior from earlier PyFITS
versions where ``Header.keys()`` returns all keywords in the header with
duplicates removed. PyFITS 3.1 changes that behavior, so that
``Header.keys()`` includes duplicates.
- Fixed a bug where ``ImageHDU.scale(option='old')`` wasn't working at all--it
was not restoring the image to its original BSCALE and BZERO values. (#162)
- Fixed a bug where opening a file containing compressed image HDUs in
'update' mode and then immediately closing it without making any changes
caused the file to be rewritten unncessarily. (#167)
- Fixed two memory leaks that could occur when writing compressed image data,
or in some cases when opening files containing compressed image HDUs in
'update' mode. (#168)
3.0.8 (2012-06-04)
------------------
Changes in Behavior
^^^^^^^^^^^^^^^^^^^
- Prior to this release, image data sections did not work with scaled
data--that is, images with non-trivial BSCALE and/or BZERO values.
Previously, in order to read such images in sections, it was necessary to
manually apply the BSCALE+BZERO to each section. It's worth noting that
sections *did* support pseudo-unsigned ints (flakily). This change just
extends that support for general BSCALE+BZERO values.
Bug Fixes
^^^^^^^^^
- Fixed a bug that prevented updates to values in boolean table columns from
being saved. This turned out to be a symptom of a deeper problem that could
prevent other table updates from being saved as well. (#139)
- Fixed a corner case in which a keyword comment ending with the string "END"
could, in some circumstances, cause headers (and the rest of the file after
that point) to be misread. (#142)
- Fixed support for scaled image data and psuedo-unsigned ints in image data
sections (``hdu.section``). Previously this was not supported at all. At
some point support was supposedly added, but it was buggy and incomplete.
Now the feature seems to work much better. (#143)
- Fixed the documentation to point out that image data sections *do* support
non-contiguous slices (and have for a long time). The documentation was
never updated to reflect this, and misinformed users that only contiguous
slices were supported, leading to some confusion. (#144)
- Fixed a bug where creating an ``HDUList`` object containing multiple PRIMARY
HDUs caused an infinite recursion when validating the object prior to
writing to a file. (#145)
- Fixed a rare but serious case where saving an update to a file that
previously had a CHECKSUM and/or DATASUM keyword, but removed the checksum
in saving, could cause the file to be slightly corrupted and unreadable.
(#147)
- Fixed problems with reading "non-standard" FITS files with primary headers
containing SIMPLE = F. PyFITS has never made many guarantees as to how such
files are handled. But it should at least be possible to read their
headers, and the data if possible. Saving changes to such a file should not
try to prepend an unwanted valid PRIMARY HDU. (#157)
- Fixed a bug where opening an image with ``disable_image_compression = True``
caused compression to be disabled for all subsequent ``pyfits.open()`` calls.
(r1651)
3.0.7 (2012-04-10)
------------------
Changes in Behavior
^^^^^^^^^^^^^^^^^^^
- Slices of GroupData objects now return new GroupData objects instead of
extended multi-row _Group objects. This is analogous to how PyFITS 3.0 fixed
FITS_rec slicing, and should have been fixed for GroupData at the same time.
The old behavior caused bugs where functions internal to Numpy expected that
slicing an ndarray would return a new ndarray. As this is a rare usecase
with a rare feature most users are unlikely to be affected by this change.
- The previously internal _Group object for representing individual group
records in a GroupData object are renamed Group and are now a public
interface. However, there's almost no good reason to create Group objects
directly, so it shouldn't be considered a "new feature".
- An annoyance from PyFITS 3.0.6 was fixed, where the value of the EXTEND
keyword was always being set to F if there are not actually any extension
HDUs. It was unnecessary to modify this value.
Bug Fixes
^^^^^^^^^
- Fixed GroupData objects to return new GroupData objects when sliced instead
of _Group record objects. See "Changes in behavior" above for more details.
- Fixed slicing of Group objects--previously it was not possible to slice
slice them at all.
- Made it possible to assign `np.bool_` objects as header values. (#123)
- Fixed overly strict handling of the EXTEND keyword; see "Changes in
behavior" above. (#124)
- Fixed many cases where an HDU's header would be marked as "modified" by
PyFITS and rewritten, even when no changes to the header are necessary.
(#125)
- Fixed a bug where the values of the PTYPEn keywords in a random groups HDU
were forced to be all lower-case when saving the file. (#130)
- Removed an unnecessary inline import in `ExtensionHDU.__setattr__` that was
causing some slowdown when opening files containing a large number of
extensions, plus a few other small (but not insignficant) performance
improvements thanks to Julian Taylor. (#133)
- Fixed a regression where header blocks containing invalid end-of-header
padding (i.e. null bytes instead of spaces) couldn't be parsed by PyFITS.
Such headers can be parsed again, but a warning is raised, as such headers
are not valid FITS. (#136)
- Fixed a memory leak where table data in random groups HDUs weren't being
garbage collected. (#138)
3.0.6 (2012-02-29)
------------------
Highlights
^^^^^^^^^^
The main reason for this release is to fix an issue that was introduced in
PyFITS 3.0.5 where merely opening a file containing scaled data (that is, with
non-trivial BSCALE and BZERO keywords) in 'update' mode would cause the data
to be automatically rescaled--possibly converting the data from ints to
floats--as soon as the file is closed, even if the application did not touch
the data. Now PyFITS will only rescale the data in an extension when the data
is actually accessed by the application. So opening a file in 'update' mode
in order to modify the header or append new extensions will not cause any
change to the data in existing extensions.
This release also fixes a few Windows-specific bugs found through more
extensive Windows testing, and other miscellaneous bugs.
Bug Fixes
^^^^^^^^^
- More accurate error messages when opening files containing invalid header
cards. (#109)
- Fixed a possible reference cycle/memory leak that was caught through more
extensive testing on Windows. (#112)
- Fixed 'ostream' mode to open the underlying file in 'wb' mode instead of 'w'
mode. (#112)
- Fixed a Windows-only issue where trying to save updates to a resized FITS
file could result in a crash due to there being open mmaps on that file.
(#112)
- Fixed a crash when trying to create a FITS table (i.e. with new_table())
from a Numpy array containing bool fields. (#113)
- Fixed a bug where manually initializing an ``HDUList`` with a list of of
HDUs wouldn't set the correct EXTEND keyword value on the primary HDU.
(#114)
- Fixed a crash that could occur when trying to deepcopy a Header in Python <
2.7. (#115)
- Fixed an issue where merely opening a scaled image in 'update' mode would
cause the data to be converted to floats when the file is closed. (#119)
3.0.5 (2012-01-30)
------------------
- Fixed a crash that could occur when accessing image sections of files
opened with memmap=True. (r1211)
- Fixed the inconsistency in the behavior of files opened in 'readonly' mode
when memmap=True vs. when memmap=False. In the latter case, although
changes to array data were not saved to disk, it was possible to update the
array data in memory. On the other hand with memmap=True, 'readonly' mode
prevented even in-memory modification to the data. This is what
'copyonwrite' mode was for, but difference in behavior was confusing. Now
'readonly' is equivalent to 'copyonwrite' when using memmap. If the old
behavior of denying changes to the array data is necessary, a new
'denywrite' mode may be used, though it is only applicable to files opened
with memmap. (r1275)
- Fixed an issue where files opened with memmap=True would return image data
as a raw numpy.memmap object, which can cause some unexpected
behaviors--instead memmap object is viewed as a numpy.ndarray. (r1285)
- Fixed an issue in Python 3 where a workaround for a bug in Numpy on Python 3
interacted badly with some other software, namely to vo.table package (and
possibly others). (r1320, r1337, and #110)
- Fixed buggy behavior in the handling of SIGINTs (i.e. Ctrl-C keyboard
interrupts) while flushing changes to a FITS file. PyFITS already prevented
SIGINTs from causing an incomplete flush, but did not clean up the signal
handlers properly afterwards, or reraise the keyboard interrupt once the
flush was complete. (r1321)
- Fixed a crash that could occur in Python 3 when opening files with checksum
checking enabled. (r1336)
- Fixed a small bug that could cause a crash in the `StreamingHDU` interface
when using Numpy below version 1.5.
- Fixed a crash that could occur when creating a new `CompImageHDU` from an
array of big-endian data. (#104)
- Fixed a crash when opening a file with extra zero padding at the end.
Though FITS files should not have such padding, it's not explictly forbidden
by the format either, and PyFITS shouldn't stumble over it. (#106)
- Fixed a major slowdown in opening tables containing large columns of string
values. (#111)
3.0.4 (2011-11-22)
------------------
- Fixed a crash when writing HCOMPRESS compressed images that could happen on
Python 2.5 and 2.6. (r1217)
- Fixed a crash when slicing an table in a file opened in 'readonly' mode with
memmap=True. (r1230)
- Writing changes to a file or writing to a new file verifies the output in
'fix' mode by default instead of 'exception'--that is, PyFITS will
automatically fix common FITS format errors rather than raising an
exception. (r1243)
- Fixed a bug where convenience functions such as getval() and getheader()
crashed when specifying just 'PRIMARY' as the extension to use (r1263).
- Fixed a bug that prevented passing keyword arguments (beyond the standard
data and header arguments) as positional arguments to the constructors of
extension HDU classes.
- Fixed some tests that were failing on Windows--in this case the tests
themselves failed to close some temp files and Windows refused to delete them
while there were still open handles on them. (r1295)
- Fixed an issue with floating point formatting in header values on Python 2.5
for Windows (and possibly other platforms). The exponent was zero-padded to
3 digits; although the FITS standard makes no specification on this, the
formatting is now normalized to always pad the exponent to two digits.
(r1295)
- Fixed a bug where long commentary cards (such as HISTORY and COMMENT) were
broken into multiple CONTINUE cards. However, commentary cards are not
expected to be found in CONTINUE cards. Instead these long cards are broken
into multiple commentary cards. (#97)
- GZIP/ZIP-compressed FITS files can be detected and opened regardless of
their filename extension. (#99)
- Fixed a serious bug where opening scaled images in 'update' mode and then
closing the file without touching the data would cause the file to be
corrupted. (#101)
3.0.3 (2011-10-05)
------------------
- Fixed several small bugs involving corner cases in record-valued keyword
cards (#70)
- In some cases HDU creation failed if the first keyword value in the header
was not a string value (#89)
- Fixed a crash when trying to compute the HDU checksum when the data array
contains an odd number of bytes (#91)
- Disabled an unnecessary warning that was displayed on opening compressed
HDUs with disable_image_compression = True (#92)
- Fixed a typo in code for handling HCOMPRESS compressed images.
3.0.2 (2011-09-23)
------------------
- The ``BinTableHDU.tcreate`` method and by extension the ``pyfits.tcreate``
function don't get tripped up by blank lines anymore (#14)
- The presence, value, and position of the EXTEND keyword in Primary HDUs is
verified when reading/writing a FITS file (#32)
- Improved documentation (in warning messages as well as in the handbook) that
PyFITS uses zero-based indexing (as one would expect for C/Python code, but
contrary to the PyFITS standard which was written with FORTRAN in mind)
(#68)
- Fixed a bug where updating a header card comment could cause the value to be
lost if it had not already been read from the card image string.
- Fixed a related bug where changes made directly to Card object in a header
(i.e. assigning directly to card.value or card.comment) would not propagate
when flushing changes to the file (#69) [Note: This and the bug above it
were originally reported as being fixed in version 3.0.1, but the fix was
never included in the release.]
- Improved file handling, particularly in Python 3 which had a few small file
I/O-related bugs (#76)
- Fixed a bug where updating a FITS file would sometimes cause it to lose its
original file permissions (#79)
- Fixed the handling of TDIMn keywords; 3.0 added support for them, but got
the axis order backards (they were treated as though they were row-major)
(#82)
- Fixed a crash when a FITS file containing scaled data is opened and
immediately written to a new file without explicitly viewing the data first
(#84)
- Fixed a bug where creating a table with columns named either 'names' or
'formats' resulted in an infinite recursion (#86)
3.0.1 (2011-09-12)
------------------
- Fixed a bug where updating a header card comment could cause the value to be
lost if it had not already been read from the card image string.
- Changed ``_TableBaseHDU.data`` so that if the data contain an empty table a
``FITS_rec`` object with zero rows is returned rather than ``None``.
- The ``.key`` attribute of ``RecordValuedKeywordCards`` now returns the full
keyword+field-specifier value, instead of just the plain keyword (#46)
- Fixed a related bug where changes made directly to Card object in a header
(i.e. assigning directly to card.value or card.comment) would not propagate
when flushing changes to the file (#69)
- Fixed a bug where writing a table with zero rows could fail in some cases
(#72)
- Miscellanous small bug fixes that were causing some tests to fail,
particularly on Python 3 (#74, #75)
- Fixed a bug where creating a table column from an array in non-native byte
order would not preserve the byte order, thus interpreting the column array
using the wrong byte order (#77)
3.0.0 (2011-08-23)
--------------------
- Contains major changes, bumping the version to 3.0
- Large amounts of refactoring and reorganization of the code; tried to
preserve public API backwards-compatibility with older versions (private API
has many changes and is not guaranteed to be backwards-compatible). There
are a few small public API changes to be aware of:
* The pyfits.rec module has been removed completely. If your version of
numpy does not have the numpy.core.records module it is too old to be used
with PyFITS.
* The ``Header.ascardlist()`` method is deprecated--use the ``.ascard``
attribute instead.
* ``Card`` instances have a new ``.cardimage`` attribute that should be used
rather than ``.ascardimage()``, which may become deprecated.
* The ``Card.fromstring()`` method is now a classmethod. It returns a new
``Card`` instance rather than modifying an existing instance.
* The ``req_cards()`` method on HDU instances has changed: The ``pos``
argument is not longer a string. It is either an integer value (meaning
the card's position must match that value) or it can be a function that
takes the card's position as it's argument, and returns True if the
position is valid. Likewise, the ``test`` argument no longer takes a
string, but instead a function that validates the card's value and returns
True or False.
* The ``get_coldefs()`` method of table HDUs is deprecated. Use the
``.columns`` attribute instead.
* The ``ColDefs.data`` attribute is deprecated--use ``ColDefs.columns``
instead (though in general you shouldn't mess with it directly--it might
become internal at some point).
* ``FITS_record`` objects take ``start`` and ``end`` as arguments instead of
``startColumn`` and ``endColumn`` (these are rarely created manually, so
it's unlikely that this change will affect anyone).
* ``BinTableHDU.tcreate()`` is now a classmethod, and returns a new
``BinTableHDU`` instance.
* Use ``ExtensionHDU`` and ``NonstandardExtHDU`` for making new extension HDU
classes. They are now public interfaces, wheres previously they were
private and prefixed with underscores.
* Possibly others--please report if you find any changes that cause
difficulties.
- Calls to deprecated functions will display a Deprecation warning. However,
in Python 2.7 and up Deprecation warnings are ignored by default, so run
Python with the `-Wd` option to see if you're using any deprecated
functions. If we get close to actually removing any functions, we might
make the Deprecation warnings display by default.
- Added basic Python 3 support
- Added support for multi-dimensional columns in tables as specified by the
TDIMn keywords (#47)
- Fixed a major memory leak that occurred when creating new tables with the
``new_table()`` function (#49)
be padded with zero-bytes) vs ASCII tables (where strings are padded with
spaces) (#15)
- Fixed a bug in which the case of Random Access Group parameters names was not
preserved when writing (#41)
- Added support for binary table fields with zero width (#42)
- Added support for wider integer types in ASCII tables; although this is non-
standard, some GEIS images require it (#45)
- Fixed a bug that caused the index_of() method of HDULists to crash when the
HDUList object is created from scratch (#48)
- Fixed the behavior of string padding in binary tables (where strings should
be padded with nulls instead of spaces)
- Fixed a rare issue that caused excessive memory usage when computing
checksums using a non-standard block size (see r818)
- Add support for forced uint data in image sections (#53)
- Fixed an issue where variable-length array columns were not extended when
creating a new table with more rows than the original (#54)
- Fixed tuple and list-based indexing of FITS_rec objects (#55)
- Fixed an issue where BZERO and BSCALE keywords were appended to headers in
the wrong location (#56)
- ``FITS_record`` objects (table rows) have full slicing support, including
stepping, etc. (#59)
- Fixed a bug where updating multiple files simultaneously (such as when
running parallel processes) could lead to a race condition with mktemp()
(#61)
- Fixed a bug where compressed image headers were not in the order expected by
the funpack utility (#62)
|
|
= 4.3.2 (20131002) =
* Fixed a bug in which short Unicode input was improperly encoded to
ASCII when checking whether or not it was the name of a file on
disk. [bug=1227016]
* Fixed a crash when a short input contains data not valid in
filenames. [bug=1232604]
* Fixed a bug that caused Unicode data put into UnicodeDammit to
return None instead of the original data. [bug=1214983]
* Combined two tests to stop a spurious test failure when tests are
run by nosetests. [bug=1212445]
= 4.3.1 (20130815) =
* Fixed yet another problem with the html5lib tree builder, caused by
html5lib's tendency to rearrange the tree during
parsing. [bug=1189267]
* Fixed a bug that caused the optimized version of find_all() to
return nothing. [bug=1212655]
= 4.3.0 (20130812) =
* Instead of converting incoming data to Unicode and feeding it to the
lxml tree builder in chunks, Beautiful Soup now makes successive
guesses at the encoding of the incoming data, and tells lxml to
parse the data as that encoding. Giving lxml more control over the
parsing process improves performance and avoids a number of bugs and
issues with the lxml parser which had previously required elaborate
workarounds:
- An issue in which lxml refuses to parse Unicode strings on some
systems. [bug=1180527]
- A returning bug that truncated documents longer than a (very
small) size. [bug=963880]
- A returning bug in which extra spaces were added to a document if
the document defined a charset other than UTF-8. [bug=972466]
This required a major overhaul of the tree builder architecture. If
you wrote your own tree builder and didn't tell me, you'll need to
modify your prepare_markup() method.
* The UnicodeDammit code that makes guesses at encodings has been
split into its own class, EncodingDetector. A lot of apparently
redundant code has been removed from Unicode, Dammit, and some
undocumented features have also been removed.
* Beautiful Soup will issue a warning if instead of markup you pass it
a URL or the name of a file on disk (a common beginner's mistake).
* A number of optimizations improve the performance of the lxml tree
builder by about 33%, the html.parser tree builder by about 20%, and
the html5lib tree builder by about 15%.
* All find_all calls should now return a ResultSet object. Patch by
Aaron DeVore. [bug=1194034]
= 4.2.1 (20130531) =
* The default XML formatter will now replace ampersands even if they
appear to be part of entities. That is, "<" will become
"&lt;". The old code was left over from Beautiful Soup 3, which
didn't always turn entities into Unicode characters.
If you really want the old behavior (maybe because you add new
strings to the tree, those strings include entities, and you want
the formatter to leave them alone on output), it can be found in
EntitySubstitution.substitute_xml_containing_entities(). [bug=1182183]
* Gave new_string() the ability to create subclasses of
NavigableString. [bug=1181986]
* Fixed another bug by which the html5lib tree builder could create a
disconnected tree. [bug=1182089]
* The .previous_element of a BeautifulSoup object is now always None,
not the last element to be parsed. [bug=1182089]
* Fixed test failures when lxml is not installed. [bug=1181589]
* html5lib now supports Python 3. Fixed some Python 2-specific
code in the html5lib test suite. [bug=1181624]
* The html.parser treebuilder can now handle numeric attributes in
text when the hexidecimal name of the attribute starts with a
capital X. Patch by Tim Shirley. [bug=1186242]
= 4.2.0 (20130514) =
* The Tag.select() method now supports a much wider variety of CSS
selectors.
- Added support for the adjacent sibling combinator (+) and the
general sibling combinator (~). Tests by "liquider". [bug=1082144]
- The combinators (>, +, and ~) can now combine with any supported
selector, not just one that selects based on tag name.
- Added limited support for the "nth-of-type" pseudo-class. Code
by Sven Slootweg. [bug=1109952]
* The BeautifulSoup class is now aliased to "_s" and "_soup", making
it quicker to type the import statement in an interactive session:
from bs4 import _s
or
from bs4 import _soup
The alias may change in the future, so don't use this in code you're
going to run more than once.
* Added the 'diagnose' submodule, which includes several useful
functions for reporting problems and doing tech support.
- diagnose(data) tries the given markup on every installed parser,
reporting exceptions and displaying successes. If a parser is not
installed, diagnose() mentions this fact.
- lxml_trace(data, html=True) runs the given markup through lxml's
XML parser or HTML parser, and prints out the parser events as
they happen. This helps you quickly determine whether a given
problem occurs in lxml code or Beautiful Soup code.
- htmlparser_trace(data) is the same thing, but for Python's
built-in HTMLParser class.
* In an HTML document, the contents of a <script> or <style> tag will
no longer undergo entity substitution by default. XML documents work
the same way they did before. [bug=1085953]
* Methods like get_text() and properties like .strings now only give
you strings that are visible in the document--no comments or
processing commands. [bug=1050164]
* The prettify() method now leaves the contents of <pre> tags
alone. [bug=1095654]
* Fix a bug in the html5lib treebuilder which sometimes created
disconnected trees. [bug=1039527]
* Fix a bug in the lxml treebuilder which crashed when a tag included
an attribute from the predefined "xml:" namespace. [bug=1065617]
* Fix a bug by which keyword arguments to find_parent() were not
being passed on. [bug=1126734]
* Stop a crash when unwisely messing with a tag that's been
decomposed. [bug=1097699]
* Now that lxml's segfault on invalid doctype has been fixed, fixed a
corresponding problem on the Beautiful Soup end that was previously
invisible. [bug=984936]
* Fixed an exception when an overspecified CSS selector didn't match
anything. Code by Stefaan Lippens. [bug=1168167]
= 4.1.3 (20120820) =
* Skipped a test under Python 2.6 and Python 3.1 to avoid a spurious
test failure caused by the lousy HTMLParser in those
versions. [bug=1038503]
* Raise a more specific error (FeatureNotFound) when a requested
parser or parser feature is not installed. Raise NotImplementedError
instead of ValueError when the user calls insert_before() or
insert_after() on the BeautifulSoup object itself. Patch by Aaron
Devore. [bug=1038301]
= 4.1.2 (20120817) =
* As per PEP-8, allow searching by CSS class using the 'class_'
keyword argument. [bug=1037624]
* Display namespace prefixes for namespaced attribute names, instead of
the fully-qualified names given by the lxml parser. [bug=1037597]
* Fixed a crash on encoding when an attribute name contained
non-ASCII characters.
* When sniffing encodings, if the cchardet library is installed,
Beautiful Soup uses it instead of chardet. cchardet is much
faster. [bug=1020748]
* Use logging.warning() instead of warning.warn() to notify the user
that characters were replaced with REPLACEMENT
CHARACTER. [bug=1013862]
= 4.1.1 (20120703) =
* Fixed an html5lib tree builder crash which happened when html5lib
moved a tag with a multivalued attribute from one part of the tree
to another. [bug=1019603]
* Correctly display closing tags with an XML namespace declared. Patch
by Andreas Kostyrka. [bug=1019635]
* Fixed a typo that made parsing significantly slower than it should
have been, and also waited too long to close tags with XML
namespaces. [bug=1020268]
* get_text() now returns an empty Unicode string if there is no text,
rather than an empty bytestring. [bug=1020387]
= 4.1.0 (20120529) =
* Added experimental support for fixing Windows-1252 characters
embedded in UTF-8 documents. (UnicodeDammit.detwingle())
* Fixed the handling of " with the built-in parser. [bug=993871]
* Comments, processing instructions, document type declarations, and
markup declarations are now treated as preformatted strings, the way
CData blocks are. [bug=1001025]
* Fixed a bug with the lxml treebuilder that prevented the user from
adding attributes to a tag that didn't originally have
attributes. [bug=1002378] Thanks to Oliver Beattie for the patch.
* Fixed some edge-case bugs having to do with inserting an element
into a tag it's already inside, and replacing one of a tag's
children with another. [bug=997529]
* Added the ability to search for attribute values specified in UTF-8. [bug=1003974]
This caused a major refactoring of the search code. All the tests
pass, but it's possible that some searches will behave differently.
|