# Change history

## PyEPR 1.1.5 (15/10/2023)

- Get rid of the deprecated pip –install-options.

- No longer ise the deprecated Cython IF statement.

- Build wheels for Python 3.12.

- Move project metadata to pyproject.toml

## PyEPR 1.1.4 (07/01/2023)

- Do not use deprecated keywords in setup.cfg.

- Silence compiler warnings.

- Fix extlinks configuration.

- Modernize documentation generation: - drop local theme - drop local sphinxect for IPython console highlighting - use the RTD sphinx theme - update sidebar templates

- Fix comparibility with packaging v22.0.

- Modernize and re-format the Python code.

- The minimum required Python version is now v3.7.

## PyEPR 1.1.3 (13/09/2021)

- Do not use the deprecated distutils package.

- Improve command line arguments management in `setup.py`.

- Stop distributing .c code auto-generated by Cython in the source tarball. Now the .c code is generated by Cython during the build package phase.

## PyEPR 1.1.2 (06/11/2021)

- Enable CI testing with Python 3.10.

- Update the internal copy of EPR C API to v2.3dev_pyerp112.

## PyEPR 1.1.1 (07/08/2021)

- Fix a serious issue in sdist generation.

## PyEPR 1.1.0 (06/08/2021)

- Old Python versions are no longer officially supported. Now PyEPR require Python >= 3.5 and Cython >= v0.29.

- Introduced the `pyproject.toml` file.

- The `setup.py` script has been simplified and modernized, now it always use setuptools and `setup.cfg`.

- Now the EPR C API is handled using git submodule.

- Fixed potential crash in cases in which the EPR C API fails to open the requested product

- Update the test suite to use the public product `ASA_APM_1PNPDE20091007_025628_000000432083_00118_39751_9244.N1`. The previously used one is no longer available.

- Continuous Integration moved to GitHub Actions (GHA).

- Fix a leak of resources on Windows platforms.

- The `print_()` method of `Field` and `Record` classes has been renamed into `print()`. The old `print_()` method is now deprecated and will be removed in future versions.

- Support for `pathlib`.

- Enforce type checking.

## PyEPR 1.0.1 (07/03/2020)

- Fixed a problem in the test using the `epr.Product._fileno` (only impacting MacOS-X). Also some advice about the correct use of `epr.Product._fileno` has been added to the documentation.

- Always close the product object during tests. Prevents errors during CI cleanup actions on Windows.

## PyEPR 1.0.0 (08/09/2019)

- Do not use deprecated numpy API (requires Cython >= 0.29)

- Minimal numpy version is now v1.7

- Set Cython ‘language_level` explicitly to ‘3str’ if Cython >= v0.29, to ‘2’ otherwise

- Python v2.6, v3.2, v3.3 and v3.4 are now deprecated. Support for the deprecated Python version will be removed in future releases of PyEPR

## PyEPR 0.9.5 (23/08/2018)

- Fix compatibility with numpy >= 1.14: `np.fromstring()` is deprecated

- Update the pypi sidebar in the documentation

- Use .rst extension for doc source files

- Fix setup script to not use system libs if epr-api sources are available

- Do not access fields of bands after that the product has been closed (fix a segmentation fault on windows)

- unittest2 is now required for Python < 3.4

## PyEPR 0.9.4 (29/04/2018)

- Fix compatibility with Cython >= 0.28

- PyEPR has been successfully tested with PyPy

## PyEPR 0.9.3 (02/05/2015)

- Fix PyEprExtension class in setup.py (closes gh-11)

- Updated internal EPR API version

## PyEPR 0.9.2 (08/03/2015)

- Improved string representation of fields in case of `E_TID_STRING` data type. Now bytes are decoded and represented as Python strings.

- New tutorial GDAL export example

- Improved “Installation” and “Testing” sections of the user manual

## PyEPR 0.9.1 (27/02/2015)

- Fix source distribution (missing EPR API C sources)

## PyEPR 0.9 (27/02/2015)

- basic support for update mode: products can now be opened in update mode (‘rb+’) and it is possible to call `epr.Field.set_elem()` and `epr.Field.set_elems()` methods to set `epr.Field` elements changing the contents of the `epr.Product` on disk. This feature is not available in the EPR C API.

- new functions/methods and properties:

  - `epr.Record.index` property: returns the index of the `epr.Record` within the `epr.Dataset`

  - `epr.Band.dataset` property: returns the source `epr.Dataset` object containing the raw data used to create the `epr.Band`’s pixel values

  - `epr.Band._field_index` and `epr.Band._elem_index` properties: return the `epr.Field` index (within the `epr.Record`) and the element index (within the `epr.Field`) containing the raw data used to create the `epr.Band`’s pixel values

  - `epr.Record.dataset_name` property: returns the name of the `epr.Dataset` from which the `Record` has bee read

  - `epr.Record.tot_size` and `epr.Field.tot_size` properties: return the total size in bytes of the `epr.Record` and `epr.Field` respectively

  - `epr.get_numpy_dtype()` function: retrieves the numpy data type corresponding to the specified EPR type ID

  - added support for some low level feature: the _magic private attribute stores the identifier of EPR C stricture, the `epr.Record.get_offset()` returns the offset in bytes of the `epr.Record` within the file, and the `epr.Field.get_offset()` method returns the `epr.Field` offset within the `epr.Record`

- improved functions/methods:

  - `epr.Field.get_elems()` now also handles `epr.E_TID_STRING` and `epr.E_TID_TIME` data types

  - improved `epr.get_data_type_size()`, `epr.data_type_id_to_str()`, `epr.get_scaling_method_name()` and `epr.get_sample_model_name()` functions that are now defined using the cython cpdef directive

  - the `epr.Field.get_elems()` method has been re-written to remove loops and unnecessary data copy

  - now generator expressions are used to implement __iter__ special methods

- the index parameter of the `epr.Dataset.read_record()` method is now optional (defaults to zero)

- the deprecated __revision__ variable has been removed

- declarations of the EPR C API have been moved to the new `epr.pyd`

- the const_char and const_void definitions have been dropped, no longer necessary with Cython >= 0.19

- minimum required version for Cython is now 0.19

- the `setup.py` script has been completely rewritten to be more “pip friendly”. The new script uses setuptools if available and functions that use numpy are evaluated lazily so to give a chance to pip and setuptools to install dependencies, numpy, before they are actually used. This should make PyEPR “pip-installable” even on system there numpy is not already installed.

- the `test` directory has been renamed into `tests`

- the test suite now has a `setUpModule()` function that automatically downloads the ENVISAT test data required for test execution. The download only happens if the test dataset is not already available.

- tests can now be run using the `setup.py` script:

      $ python3 setup.py test

- enable continuous integration and testing in for Windows using AppVeyor (32bit only)

- status badges for AppVeyor CI and PyPI added to the HTML doc index

## PyEPR 0.8.2 (03/08/2014)

- fixed segfault caused by incorrect access to `epr.Dataset.description` string in case of closed products

- fixed a memory leak in `epr.Raster` (closes gh-10)

- the size parameters (src_width and src_height) in `epr.Band.create_compatible_raster()` are now optional. By default a `epr.Raster` with the same size of the scene is created

- the test suite have been improved

- improved the NDVI computation example

- updates sphinx config

- small clarification in the Installation section of the User Manual.

- EPR C API (version bundled with the official source tar-ball)

  - in case of error always free resources before setting the error code. This avoids error shadowing in some cases.

  - fixed a bug that caused reading of the incorrect portion of data in case of mirrored annotation datasets (closes gh-9)

  - fixed a bug that caused incorrect data sub-sampling in case of mirrored datasets

## PyEPR 0.8.1 (07/09/2013)

- fixed an important bug in the error checking code introduced in previous release (closes gh-8)

- fixed the NDVI example

- no more display link URL in footnotes of the PDF User Manual

## PyEPR 0.8 (07/09/2013)

- now the `epr.Product` objects have a `epr.Product.close()` method that can be used to explicitly close products without relying on the garbage collector behaviour (closes gh-7)

- new `epr.Product.closed` (read-only) attribute that can be used to check if a `epr.Product` has been closed

- the `Product` class now supports context management so they can be used in `with` statements

- added entries for `epr.__version__` and `epr.__revision__` in the reference manual

- the `epr.__revision__` module attribute is now deprecated

- some cythonization warnings have been fixed

- several small improvements to the documentation

## PyEPR 0.7.1 (19/08/2013)

- fixed potential issues with conversion from python strings to `char*`

- new snapshot of the EPR C API sources (2.3dev):

  - the size of the record tables has been fixed

  - the EPR_NUM_PRODUCT_TABLES has been fixed

  - fixed a missing prototype

  - several GCC warnings has been silenced

  - additional checks on return codes

  - now and error is raised when an invalid flag name is used

- better factorization of Python 3 specific code

- use the CLOUD flag instead of BRIGHT in unit tests

- added function/method signature to all doc-strings for better interactive help

- several improvements to the documentation:

  - updated the `README.txt` file to mention EPR C API sourced inclusion in the PyEPR 0.7 (and lates) source tar-ball

  - small fix in the installation instructions: the pip tool does not have a “–prefix” parameter

  - always use the python3 syntax for the print function in all examples in the documentation

  - links to older (and dev) versions of the documentation have been added in the man page of the HTML doc

  - removed date form the doc meta-data. The documentation build date is reported in the front page of the LaTeX (PDF) doc and, starting from this release, in the footer of the HTML doc.

  - the Ohloh widget has been added in the sidebar of the HTML doc

  - improved the regexp for detecting the SW version in the :file`setup.py` script

  - formatting

## PyEPR 0.7 (04/08/2013)

- more detailed error messages in case of open failures

- new sphinx theme for the HTML documentation

- Travis-CI has been set-up for the project

- now the source tar-ball also includes a copy of the EPR C API sources so that no external C library is required to build PyEPR.

  This features also makes it easier to install PyEPR using pip.

  The user can still guild PyEPR against a system version of the ERP-API library simply using the –epr-api-src option of the `setup.py` script with “None”” as value.

  The ERP C API included in the source tar-ball is version 2.3dev-pyepr062, a development and patched version that allows the following enhancements.

  - support for ERS products in ENVISAT format

  - support for ASAR products generated with the new ASAR SW version 6.02 (ref. doc. PO-RS-MDA-GS-2009_4/C

  - fix incorrect reading of “incident_angle” bands (closes gh-6). The issue is in the EPR C API.

## PyEPR 0.6.1 (26/04/2012)

- fix compatibility with Cython 0.16

- added a new option to the setup script (–epr-api-src) to build PyEPR using the EPR-API C sources

## PyEPR 0.6 (12/08/2011)

- full support for Python 3

- improved code highligh in the documentation

- depend from cython >= 0.13 instead of cython >= 0.14.1. Cythonizing `epr.pyx` with Python 3 requires cython >= 0.15

## PyEPR 0.5 (25/04/2011)

- stop using `PyFile_AsFile()` that is no more available in Python 3

- now documentation uses intersphinx capabilities

- code examples added to documentation

- tutorials added to documentation

- the LICENSE.txt file is now included in the source distribution

- the Cython construct `with nogil` is now used instead of calling `Py_BEGIN_ALLOW_THREADS()` and `Py_END_ALLOW_THREADS()` directly

- dropped old versions of Cython; now Cython 0.14.1 or newer is required

- suppressed several constness related warnings

## PyEPR 0.4 (10/04/2011)

- fixed a bug in the `epr.Product.__str__()`, `Dataset.__str__()` and `erp.Band.__repr__()` methods (bad formatting)

- fixed `epr.Field.get_elems()` method for char and uchar data types

- implemented `epr.Product.read_bitmask_raster()`, now the `epr.Product` API is complete

- fixed segfault in `epr.Field.get_unit()` method when the field has no unit

- a smaller dataset is now used for unit tests

- a new tutorial section has been added to the user documentation

## PyEPR 0.3 (01/04/2011)

- version string of the EPR C API is now exposed as module attribute `epr.EPR_C_API_VERSION`

- implemented `__repr__`, `__str__`, `__eq__`, `__ne__` and `__iter__` special methods

- added utility methods (not included in the C API) like:

  - `epr.Record.get_field_names()`

  - `epr.Record.fields()`

  - `epr.Dataset.records()`

  - `epr.Product.get_dataset_names()`

  - `epr.Product.get_band_names()`

  - `epr.Product.datasets()`

  - `epr.Product.bands()`

- fixed a logic error that caused empty messages in custom EPR exceptions

## PyEPR 0.2 (20/03/2011)

- sphinx documentation added

- added docstrings to all method and classes

- renamed some method and parameter in order to avoid redundancies and have a more pythonic API

- in case of null pointers a `epr.EPRValueError` is raised

- improved C library shutdown management

- introduced some utility methods to `epr.Product` and `epr.Record` classes

## PyEPR 0.1 (09/03/2011)

Initial release