Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-pyproj for openSUSE:Factory checked in at 2023-09-26 22:01:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pyproj (Old) and /work/SRC/openSUSE:Factory/.python-pyproj.new.1770 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pyproj" Tue Sep 26 22:01:43 2023 rev:28 rq:1113531 version:3.6.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pyproj/python-pyproj.changes 2023-08-31 13:51:15.556106792 +0200 +++ /work/SRC/openSUSE:Factory/.python-pyproj.new.1770/python-pyproj.changes 2023-09-26 22:11:03.172733336 +0200 @@ -1,0 +2,12 @@ +Sun Sep 24 20:01:29 UTC 2023 - Libor Pechacek <lpecha...@gmx.com> + +- Update to 3.6.1 + * WHL: Update to PROJ 9.3 by @snowman2 in #1334 + * DEP: Add Python 3.12 support by @snowman2 in #1341 + * BUG: Cython 3 compatibility fixes by @snowman2 in #1322 + * BUG: Remove pkg_resources from setup.py by @snowman2 in #1314 + * DOC: Fixed typos by @djm93dev in #1305 & #1306 + * DOC: Fix logo view on Pypi by @cyschneck in #1308 + * DOC: Spelling permimeter -> perimeter by @zanejgr in #1310 + +------------------------------------------------------------------- Old: ---- pyproj-3.6.0.tar.gz New: ---- pyproj-3.6.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pyproj.spec ++++++ --- /var/tmp/diff_new_pack.7izDeZ/_old 2023-09-26 22:11:04.208770836 +0200 +++ /var/tmp/diff_new_pack.7izDeZ/_new 2023-09-26 22:11:04.208770836 +0200 @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-pyproj -Version: 3.6.0 +Version: 3.6.1 Release: 0 Summary: Python interface to PROJ library License: SUSE-Public-Domain AND X11 @@ -27,8 +27,8 @@ Source: https://files.pythonhosted.org/packages/source/p/pyproj/pyproj-%{version}.tar.gz BuildRequires: %{python_module Cython >= 0.28.4 with %python-Cython < 3} BuildRequires: %{python_module devel >= 3.8} -BuildRequires: %{python_module setuptools} BuildRequires: %{python_module pip} +BuildRequires: %{python_module setuptools} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: proj ++++++ pyproj-3.6.0.tar.gz -> pyproj-3.6.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/PKG-INFO new/pyproj-3.6.1/PKG-INFO --- old/pyproj-3.6.0/PKG-INFO 2023-06-12 15:28:26.049971600 +0200 +++ new/pyproj-3.6.1/PKG-INFO 2023-09-21 03:31:48.168290600 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyproj -Version: 3.6.0 +Version: 3.6.1 Summary: Python interface to PROJ (cartographic projections and coordinate transformations library) Home-page: https://github.com/pyproj4/pyproj Author-email: Jeff Whitaker <jeffrey.s.whita...@noaa.gov> @@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Scientific/Engineering :: GIS @@ -29,8 +30,9 @@ Description-Content-Type: text/markdown License-File: LICENSE License-File: LICENSE_proj +Requires-Dist: certifi - + # pyproj @@ -38,7 +40,7 @@ <p align="center"> <a href="https://gitter.im/pyproj4-pyproj/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img alt="Join the chat at https://gitter.im/pyproj4-pyproj/community" src="https://badges.gitter.im/pyproj4-pyproj/community.svg"></a> -<a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-60-orange.svg?style=flat-square"></a> +<a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-63-orange.svg?style=flat-square"></a> <a href="https://ci.appveyor.com/project/snowman2/pyproj"><img alt="Appveyor Build Status" src="https://ci.appveyor.com/api/projects/status/v2ypts9j76doa9ey/branch/main?svg=true"></a> <a href="https://github.com/pyproj4/pyproj/actions?query=workflow%3ATests"><img alt="GitHub Actions Build Status" src="https://github.com/pyproj4/pyproj/workflows/Tests/badge.svg"></a> <a href="https://codecov.io/gh/pyproj4/pyproj"><img alt="Codecov Status" src="https://codecov.io/gh/pyproj4/pyproj/branch/main/graph/badge.svg"></a> @@ -148,6 +150,9 @@ <td align="center"><a href="https://github.com/dmahr1"><img src="https://avatars.githubusercontent.com/u/8354515?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dan Mahr</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Tests">â ï¸</a></td> <td align="center"><a href="https://github.com/rhugonnet"><img src="https://avatars.githubusercontent.com/u/28896516?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Romain Hugonnet</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Tests">â ï¸</a></td> <td align="center"><a href="https://javier.jimenezshaw.com/"><img src="https://avatars.githubusercontent.com/u/15678366?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Javier Jimenez Shaw</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Tests">â ï¸</a></td> + <td align="center"><a href="https://github.com/djm93dev"><img src="https://avatars.githubusercontent.com/u/101536185?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel McDonald</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=djm93dev" title="Documentation">ð</a></td> + <td align="center"><a href="https://cyschneck.com/"><img src="https://avatars.githubusercontent.com/u/22159116?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cora Schneck</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cyschneck" title="Documentation">ð</a></td> + <td align="center"><a href="https://github.com/zanejgr"><img src="https://avatars.githubusercontent.com/u/14795919?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zanejgr</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=zanejgr" title="Documentation">ð</a></td> </tr> </table> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/README.md new/pyproj-3.6.1/README.md --- old/pyproj-3.6.0/README.md 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/README.md 2023-09-21 03:30:44.000000000 +0200 @@ -1,4 +1,4 @@ - + # pyproj @@ -6,7 +6,7 @@ <p align="center"> <a href="https://gitter.im/pyproj4-pyproj/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img alt="Join the chat at https://gitter.im/pyproj4-pyproj/community" src="https://badges.gitter.im/pyproj4-pyproj/community.svg"></a> -<a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-60-orange.svg?style=flat-square"></a> +<a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-63-orange.svg?style=flat-square"></a> <a href="https://ci.appveyor.com/project/snowman2/pyproj"><img alt="Appveyor Build Status" src="https://ci.appveyor.com/api/projects/status/v2ypts9j76doa9ey/branch/main?svg=true"></a> <a href="https://github.com/pyproj4/pyproj/actions?query=workflow%3ATests"><img alt="GitHub Actions Build Status" src="https://github.com/pyproj4/pyproj/workflows/Tests/badge.svg"></a> <a href="https://codecov.io/gh/pyproj4/pyproj"><img alt="Codecov Status" src="https://codecov.io/gh/pyproj4/pyproj/branch/main/graph/badge.svg"></a> @@ -116,6 +116,9 @@ <td align="center"><a href="https://github.com/dmahr1"><img src="https://avatars.githubusercontent.com/u/8354515?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dan Mahr</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Tests">â ï¸</a></td> <td align="center"><a href="https://github.com/rhugonnet"><img src="https://avatars.githubusercontent.com/u/28896516?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Romain Hugonnet</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Tests">â ï¸</a></td> <td align="center"><a href="https://javier.jimenezshaw.com/"><img src="https://avatars.githubusercontent.com/u/15678366?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Javier Jimenez Shaw</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Tests">â ï¸</a></td> + <td align="center"><a href="https://github.com/djm93dev"><img src="https://avatars.githubusercontent.com/u/101536185?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel McDonald</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=djm93dev" title="Documentation">ð</a></td> + <td align="center"><a href="https://cyschneck.com/"><img src="https://avatars.githubusercontent.com/u/22159116?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cora Schneck</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cyschneck" title="Documentation">ð</a></td> + <td align="center"><a href="https://github.com/zanejgr"><img src="https://avatars.githubusercontent.com/u/14795919?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zanejgr</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=zanejgr" title="Documentation">ð</a></td> </tr> </table> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/docs/advanced_examples.rst new/pyproj-3.6.1/docs/advanced_examples.rst --- old/pyproj-3.6.0/docs/advanced_examples.rst 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/docs/advanced_examples.rst 2023-09-21 03:30:44.000000000 +0200 @@ -19,12 +19,12 @@ .. code-block:: python - import numpy as np + import numpy from pyproj import Transformer, transform transformer = Transformer.from_crs(2263, 4326) - x_coords = np.random.randint(80000, 120000) - y_coords = np.random.randint(200000, 250000) + x_coords = numpy.random.randint(80000, 120000) + y_coords = numpy.random.randint(200000, 250000) Example with :func:`pyproj.transformer.transform`: @@ -202,7 +202,7 @@ - :class:`pyproj.crs.CRS` - :class:`pyproj.transformer.Transformer` -If you have pyproj<3.1, you will need to create create the object +If you have pyproj<3.1, you will need to create the object within the thread that uses it. Here is a simple demonstration: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/docs/history.rst new/pyproj-3.6.1/docs/history.rst --- old/pyproj-3.6.0/docs/history.rst 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/docs/history.rst 2023-09-21 03:30:44.000000000 +0200 @@ -1,6 +1,12 @@ Change Log ========== +3.6.1 +------ +- WHL: Wheels contain PROJ 9.3.0 (issue #1327) +- BUG: Remove pkg_resources from setup.py (issue #1313) +- BUG: Cython 3 compatibility fixes (issue #1321) + 3.6.0 ------ - DEP: Minimum supported Python version 3.9 (issue #1111) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/docs/past_versions.rst new/pyproj-3.6.1/docs/past_versions.rst --- old/pyproj-3.6.0/docs/past_versions.rst 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/docs/past_versions.rst 2023-09-21 03:30:44.000000000 +0200 @@ -1,6 +1,7 @@ Documentation Archive ===================== +- `3.6.0 <https://pyproj4.github.io/pyproj/3.6.0/>`_ - `3.5.0 <https://pyproj4.github.io/pyproj/3.5.0/>`_ - `3.4.1 <https://pyproj4.github.io/pyproj/3.4.1/>`_ - `3.3.1 <https://pyproj4.github.io/pyproj/3.3.1/>`_ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj/__init__.py new/pyproj-3.6.1/pyproj/__init__.py --- old/pyproj-3.6.0/pyproj/__init__.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproj/__init__.py 2023-09-21 03:30:44.000000000 +0200 @@ -66,7 +66,7 @@ transform, ) -__version__ = "3.6.0" +__version__ = "3.6.1" __all__ = [ "Proj", "Geod", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj/_datadir.pxd new/pyproj-3.6.1/pyproj/_datadir.pxd --- old/pyproj-3.6.0/pyproj/_datadir.pxd 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproj/_datadir.pxd 2023-09-21 03:30:44.000000000 +0200 @@ -1,7 +1,7 @@ include "proj.pxi" -cpdef str _get_proj_error() -cpdef void _clear_proj_error() +cpdef str _get_proj_error() noexcept +cpdef void _clear_proj_error() noexcept cdef PJ_CONTEXT* PYPROJ_GLOBAL_CONTEXT cdef PJ_CONTEXT* pyproj_context_create() except * cdef void pyproj_context_destroy(PJ_CONTEXT* context) except * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj/_datadir.pyx new/pyproj-3.6.1/pyproj/_datadir.pyx --- old/pyproj-3.6.0/pyproj/_datadir.pyx 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproj/_datadir.pyx 2023-09-21 03:30:44.000000000 +0200 @@ -6,7 +6,6 @@ from pyproj._compat cimport cstrencode -from pyproj.exceptions import DataDirError from pyproj.utils import strtobool # for logging the internal PROJ messages @@ -79,14 +78,14 @@ ) -cpdef str _get_proj_error(): +cpdef str _get_proj_error() noexcept: """ Get the internal PROJ error message. Returns None if no error was set. """ return _INTERNAL_PROJ_ERROR -cpdef void _clear_proj_error(): +cpdef void _clear_proj_error() noexcept: """ Clear the internal PROJ error message. """ @@ -94,7 +93,7 @@ _INTERNAL_PROJ_ERROR = None -cdef void pyproj_log_function(void *user_data, int level, const char *error_msg) nogil: +cdef void pyproj_log_function(void *user_data, int level, const char *error_msg) nogil noexcept: """ Log function for catching PROJ errors. """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj/_geod.pyx new/pyproj-3.6.1/pyproj/_geod.pyx --- old/pyproj-3.6.0/pyproj/_geod.pyx 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproj/_geod.pyx 2023-09-21 03:30:44.000000000 +0200 @@ -566,7 +566,7 @@ Returns ------- (float, float): - The area (meter^2) and permimeter (meters) of the polygon. + The area (meter^2) and perimeter (meters) of the polygon. """ cdef PyBuffWriteManager lonbuff = PyBuffWriteManager(lons) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj/crs/enums.py new/pyproj-3.6.1/pyproj/crs/enums.py --- old/pyproj-3.6.0/pyproj/crs/enums.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproj/crs/enums.py 2023-09-21 03:30:44.000000000 +0200 @@ -82,7 +82,7 @@ """ .. versionadded:: 2.5.0 - Ellisoidal 2D Coordinate System Axis for creating axis with + Ellipsoidal 2D Coordinate System Axis for creating axis with with :class:`pyproj.crs.coordinate_system.Ellipsoidal2DCS` Attributes @@ -99,7 +99,7 @@ """ .. versionadded:: 2.5.0 - Ellisoidal 3D Coordinate System Axis for creating axis with + Ellipsoidal 3D Coordinate System Axis for creating axis with with :class:`pyproj.crs.coordinate_system.Ellipsoidal3DCS` Attributes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj/geod.py new/pyproj-3.6.1/pyproj/geod.py --- old/pyproj-3.6.0/pyproj/geod.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproj/geod.py 2023-09-21 03:30:44.000000000 +0200 @@ -969,7 +969,7 @@ Returns ------- (float, float): - The geodesic area (meters^2) and permimeter (meters) of the polygon. + The geodesic area (meters^2) and perimeter (meters) of the polygon. """ return self._polygon_area_perimeter( _copytobuffer(lons)[0], _copytobuffer(lats)[0], radians=radians @@ -1077,7 +1077,7 @@ Returns ------- (float, float): - The geodesic area (meters^2) and permimeter (meters) of the polygon. + The geodesic area (meters^2) and perimeter (meters) of the polygon. """ try: return self.polygon_area_perimeter( # type: ignore diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproj.egg-info/PKG-INFO new/pyproj-3.6.1/pyproj.egg-info/PKG-INFO --- old/pyproj-3.6.0/pyproj.egg-info/PKG-INFO 2023-06-12 15:28:26.000000000 +0200 +++ new/pyproj-3.6.1/pyproj.egg-info/PKG-INFO 2023-09-21 03:31:48.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyproj -Version: 3.6.0 +Version: 3.6.1 Summary: Python interface to PROJ (cartographic projections and coordinate transformations library) Home-page: https://github.com/pyproj4/pyproj Author-email: Jeff Whitaker <jeffrey.s.whita...@noaa.gov> @@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Scientific/Engineering :: GIS @@ -29,8 +30,9 @@ Description-Content-Type: text/markdown License-File: LICENSE License-File: LICENSE_proj +Requires-Dist: certifi - + # pyproj @@ -38,7 +40,7 @@ <p align="center"> <a href="https://gitter.im/pyproj4-pyproj/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img alt="Join the chat at https://gitter.im/pyproj4-pyproj/community" src="https://badges.gitter.im/pyproj4-pyproj/community.svg"></a> -<a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-60-orange.svg?style=flat-square"></a> +<a href="#contributors"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-63-orange.svg?style=flat-square"></a> <a href="https://ci.appveyor.com/project/snowman2/pyproj"><img alt="Appveyor Build Status" src="https://ci.appveyor.com/api/projects/status/v2ypts9j76doa9ey/branch/main?svg=true"></a> <a href="https://github.com/pyproj4/pyproj/actions?query=workflow%3ATests"><img alt="GitHub Actions Build Status" src="https://github.com/pyproj4/pyproj/workflows/Tests/badge.svg"></a> <a href="https://codecov.io/gh/pyproj4/pyproj"><img alt="Codecov Status" src="https://codecov.io/gh/pyproj4/pyproj/branch/main/graph/badge.svg"></a> @@ -148,6 +150,9 @@ <td align="center"><a href="https://github.com/dmahr1"><img src="https://avatars.githubusercontent.com/u/8354515?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dan Mahr</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=dmahr1" title="Tests">â ï¸</a></td> <td align="center"><a href="https://github.com/rhugonnet"><img src="https://avatars.githubusercontent.com/u/28896516?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Romain Hugonnet</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=rhugonnet" title="Tests">â ï¸</a></td> <td align="center"><a href="https://javier.jimenezshaw.com/"><img src="https://avatars.githubusercontent.com/u/15678366?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Javier Jimenez Shaw</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Code">ð»</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Documentation">ð</a> <a href="https://github.com/pyproj4/pyproj/commits?author=jjimenezshaw" title="Tests">â ï¸</a></td> + <td align="center"><a href="https://github.com/djm93dev"><img src="https://avatars.githubusercontent.com/u/101536185?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel McDonald</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=djm93dev" title="Documentation">ð</a></td> + <td align="center"><a href="https://cyschneck.com/"><img src="https://avatars.githubusercontent.com/u/22159116?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cora Schneck</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=cyschneck" title="Documentation">ð</a></td> + <td align="center"><a href="https://github.com/zanejgr"><img src="https://avatars.githubusercontent.com/u/14795919?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zanejgr</b></sub></a><br /><a href="https://github.com/pyproj4/pyproj/commits?author=zanejgr" title="Documentation">ð</a></td> </tr> </table> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/pyproject.toml new/pyproj-3.6.1/pyproject.toml --- old/pyproj-3.6.0/pyproject.toml 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/pyproject.toml 2023-09-21 03:30:44.000000000 +0200 @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=61.0.0", "wheel", "cython>=0.28.4"] +requires = ["setuptools>=61.0.0", "wheel", "cython>=3"] build-backend = "setuptools.build_meta" [project] @@ -32,6 +32,7 @@ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3 :: Only", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: GIS", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/setup.py new/pyproj-3.6.1/setup.py --- old/pyproj-3.6.0/setup.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/setup.py 2023-09-21 03:30:44.000000000 +0200 @@ -7,20 +7,39 @@ from pathlib import Path from typing import Optional -from pkg_resources import parse_version from setuptools import Extension, setup -PROJ_MIN_VERSION = parse_version("9.0.0") +PROJ_MIN_VERSION = (9, 0, 0) CURRENT_FILE_PATH = Path(__file__).absolute().parent BASE_INTERNAL_PROJ_DIR = Path("proj_dir") INTERNAL_PROJ_DIR = CURRENT_FILE_PATH / "pyproj" / BASE_INTERNAL_PROJ_DIR PROJ_VERSION_SEARCH = re.compile(r".*Rel\.\s+(?P<version>\d+\.\d+\.\d+).*") +VERSION_SEARCH = re.compile(r".*(?P<version>\d+\.\d+\.\d+).*") -def get_proj_version(proj_dir: Path) -> str: +def _parse_version(version: str) -> tuple[int, int, int]: + """Convert a version string to a tuple of integers.""" + match = VERSION_SEARCH.search(version) + if not match: + raise SystemExit( + f"PROJ version unable to be determined from {version}. " + "Please set the PROJ_VERSION environment variable." + ) + return tuple( + int(ver) for ver in match.groupdict()["version"].split(".", maxsplit=2) + ) + + +def get_proj_version(proj_dir: Path) -> tuple[int, int, int]: + """ + Determine PROJ version. + + Prefer PROJ_VERSION environment variable. + If PROJ_VERSION is not set, try to determine the version from the PROJ executable. + """ proj_version = os.environ.get("PROJ_VERSION") if proj_version: - return proj_version + return _parse_version(proj_version) proj = proj_dir / "bin" / "proj" proj_ver = subprocess.check_output(str(proj), stderr=subprocess.STDOUT).decode( "ascii" @@ -31,15 +50,17 @@ "PROJ version unable to be determined. " "Please set the PROJ_VERSION environment variable." ) - return match.groupdict()["version"] + return _parse_version(match.groupdict()["version"]) -def check_proj_version(proj_version: str) -> None: +def check_proj_version(proj_version: tuple[int, int, int]) -> None: """checks that the PROJ library meets the minimum version""" - if parse_version(proj_version) < PROJ_MIN_VERSION: + if proj_version < PROJ_MIN_VERSION: + proj_version_str = ".".join(str(ver) for ver in proj_version) + min_proj_version_str = ".".join(str(ver) for ver in PROJ_MIN_VERSION) raise SystemExit( - f"ERROR: Minimum supported PROJ version is {PROJ_MIN_VERSION}, installed " - f"version is {proj_version}. For more information see: " + f"ERROR: Minimum supported PROJ version is {min_proj_version_str}, " + f"installed version is {proj_version_str}. For more information see: " "https://pyproj4.github.io/pyproj/stable/installation.html" ) @@ -154,11 +175,11 @@ # make sure cython is available try: from Cython.Build import cythonize - except ImportError: + except ImportError as error: raise SystemExit( "ERROR: Cython.Build.cythonize not found. " "Cython is required to build pyproj." - ) + ) from error # By default we'll try to get options PROJ_DIR or the local version of proj proj_dir = get_proj_dir() @@ -167,9 +188,7 @@ proj_version = get_proj_version(proj_dir) check_proj_version(proj_version) - proj_version_major, proj_version_minor, proj_version_patch = parse_version( - proj_version - ).base_version.split(".") + proj_version_major, proj_version_minor, proj_version_patch = proj_version # setup extension options ext_options = { @@ -197,9 +216,9 @@ ], quiet=True, compile_time_env={ - "CTE_PROJ_VERSION_MAJOR": int(proj_version_major), - "CTE_PROJ_VERSION_MINOR": int(proj_version_minor), - "CTE_PROJ_VERSION_PATCH": int(proj_version_patch), + "CTE_PROJ_VERSION_MAJOR": proj_version_major, + "CTE_PROJ_VERSION_MINOR": proj_version_minor, + "CTE_PROJ_VERSION_PATCH": proj_version_patch, "CTE_PYTHON_IMPLEMENTATION": platform.python_implementation(), }, **get_cythonize_options(), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/test/conftest.py new/pyproj-3.6.1/test/conftest.py --- old/pyproj-3.6.0/test/conftest.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/test/conftest.py 2023-09-21 03:30:44.000000000 +0200 @@ -18,6 +18,7 @@ PROJ_GTE_911 = PROJ_LOOSE_VERSION >= version.parse("9.1.1") PROJ_GTE_92 = PROJ_LOOSE_VERSION >= version.parse("9.2.0") PROJ_GTE_921 = PROJ_LOOSE_VERSION >= version.parse("9.2.1") +PROJ_GTE_93 = PROJ_LOOSE_VERSION >= version.parse("9.3.0") def unset_data_dir(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/test/test_datum_shift.py new/pyproj-3.6.1/test/test_datum_shift.py --- old/pyproj-3.6.0/test/test_datum_shift.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/test/test_datum_shift.py 2023-09-21 03:30:44.000000000 +0200 @@ -51,13 +51,13 @@ assert_almost_equal((back_lon, back_lat, back_z), (WGS84_lon, WGS84_lat, WGS84_z)) -def test_shift_wgs84_to_gaussb_no_ellisoidal_height(): +def test_shift_wgs84_to_gaussb_no_ellipsoidal_height(): with pytest.warns(FutureWarning): xgb, ygb, zgb = transform(WGS84_PROJ, GAUSSSB_PROJ, WGS84_lon, WGS84_lat, 0) assert_almost_equal((xgb, ygb, zgb), (GB_x, 5055619.899, 0), decimal=2) -def test_shift_gaussb_to_wgs84_no_ellisoidal_height(): +def test_shift_gaussb_to_wgs84_no_ellipsoidal_height(): with pytest.warns(FutureWarning): back_lon, back_lat, back_z = transform(GAUSSSB_PROJ, WGS84_PROJ, GB_x, GB_y, 0) assert_almost_equal( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/test/test_proj.py new/pyproj-3.6.1/test/test_proj.py --- old/pyproj-3.6.0/test/test_proj.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/test/test_proj.py 2023-09-21 03:30:44.000000000 +0200 @@ -5,7 +5,7 @@ import unittest from unittest.mock import patch -import numpy as np +import numpy import pytest from numpy.testing import assert_almost_equal @@ -441,11 +441,11 @@ @pytest.mark.parametrize("radians", [False, True]) def test_get_factors__2d_input(radians): transformer = Proj(3857) - longitude = np.array([[0, 1], [2, 3]]) - latitude = np.array([[1, 2], [3, 4]]) + longitude = numpy.array([[0, 1], [2, 3]]) + latitude = numpy.array([[1, 2], [3, 4]]) if radians: - longitude = np.radians(longitude) - latitude = np.radians(latitude) + longitude = numpy.radians(longitude) + latitude = numpy.radians(latitude) factors = transformer.get_factors( longitude=longitude, latitude=latitude, radians=radians ) @@ -497,22 +497,36 @@ def test_get_factors__nan_inf(): transformer = Proj(3857) factors = transformer.get_factors( - longitude=[0, np.nan, np.inf, 0], latitude=[np.nan, 2, 2, np.inf] + longitude=[0, numpy.nan, numpy.inf, 0], latitude=[numpy.nan, 2, 2, numpy.inf] ) - assert_almost_equal(factors.meridional_scale, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.parallel_scale, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.areal_scale, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.angular_distortion, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal( - factors.meridian_parallel_angle, [np.inf, np.inf, np.inf, np.inf] - ) - assert_almost_equal(factors.meridian_convergence, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.tissot_semimajor, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.tissot_semiminor, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.dx_dlam, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.dx_dphi, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.dy_dlam, [np.inf, np.inf, np.inf, np.inf]) - assert_almost_equal(factors.dy_dphi, [np.inf, np.inf, np.inf, np.inf]) + assert_almost_equal( + factors.meridional_scale, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.parallel_scale, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.areal_scale, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.angular_distortion, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.meridian_parallel_angle, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.meridian_convergence, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.tissot_semimajor, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal( + factors.tissot_semiminor, [numpy.inf, numpy.inf, numpy.inf, numpy.inf] + ) + assert_almost_equal(factors.dx_dlam, [numpy.inf, numpy.inf, numpy.inf, numpy.inf]) + assert_almost_equal(factors.dx_dphi, [numpy.inf, numpy.inf, numpy.inf, numpy.inf]) + assert_almost_equal(factors.dy_dlam, [numpy.inf, numpy.inf, numpy.inf, numpy.inf]) + assert_almost_equal(factors.dy_dphi, [numpy.inf, numpy.inf, numpy.inf, numpy.inf]) def test_get_factors__errcheck(): @@ -523,7 +537,7 @@ def test_numpy_bool_kwarg_false(): # Issue 564 - south = np.array(50) < 0 + south = numpy.array(50) < 0 proj = Proj( proj="utm", zone=32, ellipsis="WGS84", datum="WGS84", units="m", south=south ) @@ -532,7 +546,7 @@ def test_numpy_bool_kwarg_true(): # Issue 564 - south = np.array(50) > 0 + south = numpy.array(50) > 0 proj = Proj( proj="utm", zone=32, ellipsis="WGS84", datum="WGS84", units="m", south=south ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/test/test_transformer.py new/pyproj-3.6.1/test/test_transformer.py --- old/pyproj-3.6.0/test/test_transformer.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/test/test_transformer.py 2023-09-21 03:30:44.000000000 +0200 @@ -9,7 +9,7 @@ from pathlib import Path from unittest.mock import call, patch -import numpy as np +import numpy import pytest from numpy.testing import assert_almost_equal, assert_array_equal @@ -22,6 +22,7 @@ from test.conftest import ( PROJ_GTE_91, PROJ_GTE_92, + PROJ_GTE_93, grids_available, proj_env, proj_network_env, @@ -64,8 +65,8 @@ xx, yy = pyproj.transform( p1, p2, (-180, -180, 180, 180, -180), (-90, 90, 90, -90, -90) ) - assert np.all(np.isinf(xx)) - assert np.all(np.isinf(yy)) + assert numpy.all(numpy.isinf(xx)) + assert numpy.all(numpy.isinf(yy)) with pytest.warns(FutureWarning), pytest.raises(ProjError): pyproj.transform( p1, p2, (-180, -180, 180, 180, -180), (-90, 90, 90, -90, -90), errcheck=True @@ -412,7 +413,7 @@ ) -@pytest.mark.parametrize("empty_array", [(), [], np.array([])]) +@pytest.mark.parametrize("empty_array", [(), [], numpy.array([])]) def test_transform_empty_array_xy(empty_array): transformer = Transformer.from_crs(2193, 4326) assert_array_equal( @@ -420,7 +421,7 @@ ) -@pytest.mark.parametrize("empty_array", [(), [], np.array([])]) +@pytest.mark.parametrize("empty_array", [(), [], numpy.array([])]) def test_transform_empty_array_xyzt(empty_array): transformer = Transformer.from_pipeline("+init=ITRF2008:ITRF2000") assert_array_equal( @@ -540,7 +541,7 @@ "Description: unavailable until proj_trans is called\n" "Area of Use:\n- undefined" ) - elif PROJ_GTE_92: + elif PROJ_GTE_92 and not PROJ_GTE_93: assert trans_repr == ( "<Unknown Transformer: noop>\n" "Description: Transformation from EGM2008 height to WGS 84 " @@ -555,7 +556,7 @@ "(ballpark vertical transformation, without ellipsoid height " "to vertical height correction)\n" "Area of Use:\n" - "- name: World\n" + f"- name: World{'.' if PROJ_GTE_93 else ''}\n" "- bounds: (-180.0, -90.0, 180.0, 90.0)" ) @@ -1205,7 +1206,7 @@ "+proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 " "+a=6370997 +b=6370997 +units=m +no_defs", ) - assert np.allclose( + assert numpy.allclose( transformer.transform_bounds(40, -120, 64, -80, densify_pts=density), expected, ) @@ -1222,7 +1223,15 @@ "input_bounds, radians", [ ((-120, 40, -80, 64), False), - ((np.radians(-120), np.radians(40), np.radians(-80), np.radians(64)), True), + ( + ( + numpy.radians(-120), + numpy.radians(40), + numpy.radians(-80), + numpy.radians(64), + ), + True, + ), ], ) def test_transform_bounds_densify__xy(density, expected, input_bounds, radians): @@ -1232,7 +1241,7 @@ "+a=6370997 +b=6370997 +units=m +no_defs", always_xy=True, ) - assert np.allclose( + assert numpy.allclose( transformer.transform_bounds( *input_bounds, densify_pts=density, radians=radians ), @@ -1459,8 +1468,8 @@ @pytest.mark.parametrize("inplace", [True, False]) def test_transform__fortran_order(inplace): - lons, lats = np.arange(-180, 180, 20), np.arange(-90, 90, 10) - lats, lons = np.meshgrid(lats, lons) + lons, lats = numpy.arange(-180, 180, 20), numpy.arange(-90, 90, 10) + lats, lons = numpy.meshgrid(lats, lons) f_lons, f_lats = lons.copy(order="F"), lats.copy(order="F") transformer = Transformer.from_crs( "EPSG:4326", @@ -1519,10 +1528,10 @@ def test_4d_transform__inplace__numpy(): transformer = Transformer.from_crs(7789, 8401) - xarr = np.array([3496737.2679], dtype=np.float64) - yarr = np.array([743254.4507], dtype=np.float64) - zarr = np.array([5264462.9620], dtype=np.float64) - tarr = np.array([2019.0], dtype=np.float64) + xarr = numpy.array([3496737.2679], dtype=numpy.float64) + yarr = numpy.array([743254.4507], dtype=numpy.float64) + zarr = numpy.array([5264462.9620], dtype=numpy.float64) + tarr = numpy.array([2019.0], dtype=numpy.float64) t_xarr, t_yarr, t_zarr, t_tarr = transformer.transform( xx=xarr, yy=yarr, zz=zarr, tt=tarr, inplace=True ) @@ -1538,10 +1547,10 @@ def test_4d_transform__inplace__numpy__int(): transformer = Transformer.from_crs(7789, 8401) - xarr = np.array([3496737], dtype=np.int32) - yarr = np.array([743254], dtype=np.int32) - zarr = np.array([5264462], dtype=np.int32) - tarr = np.array([2019], dtype=np.int32) + xarr = numpy.array([3496737], dtype=numpy.int32) + yarr = numpy.array([743254], dtype=numpy.int32) + zarr = numpy.array([5264462], dtype=numpy.int32) + tarr = numpy.array([2019], dtype=numpy.int32) t_xarr, t_yarr, t_zarr, t_tarr = transformer.transform( xx=xarr, yy=yarr, zz=zarr, tt=tarr, inplace=True ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyproj-3.6.0/test/test_utils.py new/pyproj-3.6.1/test/test_utils.py --- old/pyproj-3.6.0/test/test_utils.py 2023-06-12 15:27:32.000000000 +0200 +++ new/pyproj-3.6.1/test/test_utils.py 2023-09-21 03:30:44.000000000 +0200 @@ -2,8 +2,6 @@ import numpy import pytest -from pandas import Series -from xarray import DataArray from pyproj.utils import DataType, _copytobuffer, _copytobuffer_return_scalar @@ -22,7 +20,6 @@ "in_data, data_type", [ (numpy.array(1), DataType.FLOAT), - (DataArray(numpy.array(1)), DataType.FLOAT), (1, DataType.FLOAT), ([1], DataType.LIST), ((1,), DataType.TUPLE), @@ -32,10 +29,23 @@ assert _copytobuffer(in_data) == (array("d", [1]), data_type) -@pytest.mark.parametrize( - "in_arr", [numpy.array([1]), DataArray(numpy.array([1])), Series(numpy.array([1]))] -) -def test__copytobuffer__numpy_array(in_arr): +def test__copytobuffer__xarray_scalar(): + xarray = pytest.importorskip("xarray") + assert _copytobuffer(xarray.DataArray(numpy.array(1))) == ( + array("d", [1]), + DataType.FLOAT, + ) + + +@pytest.mark.parametrize("arr_type", ["numpy", "xarray", "pandas"]) +def test__copytobuffer__array(arr_type): + in_arr = numpy.array([1]) + if arr_type == "xarray": + xarray = pytest.importorskip("xarray") + in_arr = xarray.DataArray(in_arr) + elif arr_type == "pandas": + pandas = pytest.importorskip("pandas") + in_arr = pandas.Series(in_arr) assert _copytobuffer(in_arr) == ( in_arr.astype("d").__array__(), DataType.ARRAY,