pygeodesy 24.9.29__py2.py3-none-any.whl → 24.10.24__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/METADATA +15 -15
  2. {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/RECORD +56 -56
  3. pygeodesy/__init__.py +20 -19
  4. pygeodesy/__main__.py +5 -5
  5. pygeodesy/albers.py +12 -17
  6. pygeodesy/basics.py +38 -41
  7. pygeodesy/booleans.py +54 -46
  8. pygeodesy/cartesianBase.py +2 -2
  9. pygeodesy/constants.py +20 -16
  10. pygeodesy/datums.py +3 -3
  11. pygeodesy/dms.py +250 -270
  12. pygeodesy/ellipsoidalBase.py +2 -2
  13. pygeodesy/ellipsoidalBaseDI.py +10 -10
  14. pygeodesy/ellipsoidalNvector.py +4 -4
  15. pygeodesy/ellipsoidalVincenty.py +2 -2
  16. pygeodesy/ellipsoids.py +7 -48
  17. pygeodesy/elliptic.py +14 -14
  18. pygeodesy/errors.py +15 -10
  19. pygeodesy/etm.py +18 -2
  20. pygeodesy/fmath.py +188 -176
  21. pygeodesy/formy.py +4 -4
  22. pygeodesy/fstats.py +54 -56
  23. pygeodesy/fsums.py +304 -266
  24. pygeodesy/geodesici.py +43 -40
  25. pygeodesy/geodesicw.py +3 -3
  26. pygeodesy/geodesicx/gxarea.py +3 -2
  27. pygeodesy/geodsolve.py +73 -24
  28. pygeodesy/geohash.py +2 -2
  29. pygeodesy/geoids.py +28 -27
  30. pygeodesy/internals.py +156 -85
  31. pygeodesy/interns.py +23 -20
  32. pygeodesy/karney.py +61 -12
  33. pygeodesy/latlonBase.py +13 -15
  34. pygeodesy/lazily.py +206 -214
  35. pygeodesy/mgrs.py +13 -13
  36. pygeodesy/named.py +11 -10
  37. pygeodesy/nvectorBase.py +1 -1
  38. pygeodesy/points.py +2 -2
  39. pygeodesy/props.py +34 -13
  40. pygeodesy/rhumb/bases.py +5 -5
  41. pygeodesy/rhumb/solve.py +7 -8
  42. pygeodesy/solveBase.py +7 -25
  43. pygeodesy/sphericalBase.py +20 -23
  44. pygeodesy/sphericalNvector.py +24 -23
  45. pygeodesy/sphericalTrigonometry.py +9 -8
  46. pygeodesy/streprs.py +11 -8
  47. pygeodesy/trf.py +6 -4
  48. pygeodesy/triaxials.py +46 -9
  49. pygeodesy/units.py +4 -3
  50. pygeodesy/ups.py +6 -6
  51. pygeodesy/utily.py +2 -2
  52. pygeodesy/utm.py +2 -2
  53. pygeodesy/vector3d.py +5 -5
  54. pygeodesy/vector3dBase.py +4 -5
  55. {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/WHEEL +0 -0
  56. {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyGeodesy
3
- Version: 24.9.29
3
+ Version: 24.10.24
4
4
  Summary: Pure Python geodesy tools
5
5
  Home-page: https://GitHub.com/mrJean1/PyGeodesy
6
6
  Author: Jean M. Brouwers
@@ -115,31 +115,31 @@ line: ``epydoc --html --no-private --no-source --name=PyGeodesy --url=... -v pyg
115
115
  Tests
116
116
  =====
117
117
 
118
- The tests ran with Python 3.13.0rc2, 3.12.6 (with geographiclib_ 2.0, numpy_ 2.1.0, scipy_ 1.14.1,
119
- GeodSolve_ 2.3, IntersectTool_ 2.3 and RhumbSolve_ 2.3), 3.11.5 (with geographiclib_ 2.0, numpy_
120
- 1.24.2 and scipy_ 1.10.1), Python 3.10.8 (with geographiclib_ 2.0, numpy_ 1.23.3, scipy_ 1.9.1,
121
- GeoConvert_ 2.3, GeodSolve_ 2.3), Python 3.9.6 and Python 2.7.18 (with geographiclib_ 1.50, numpy_
122
- 1.16.6, scipy_ 1.2.2, GeoConvert_ 2.3, GeodSolve_ 2.3, IntersectTool_ 2.3 and RhumbSolve_ 2.3),
123
- all on macOS 14.6.1 Sonoma in 64-bit.
118
+ The tests ran with Python 3.13.0 (with geographiclib_ 2.0), 3.12.7 (with geographiclib_ 2.0, numpy_
119
+ 2.1.0, scipy_ 1.14.1, GeodSolve_ 2.3, IntersectTool_ 2.3 and RhumbSolve_ 2.3), 3.11.5 (with
120
+ geographiclib_ 2.0, numpy_ 1.24.2 and scipy_ 1.10.1), Python 3.10.8 (with geographiclib_ 2.0, numpy_
121
+ 1.23.3, scipy_ 1.9.1, GeoConvert_ 2.3, GeodSolve_ 2.3), Python 3.9.6 and Python 2.7.18 (with
122
+ geographiclib_ 1.50, numpy_ 1.16.6, scipy_ 1.2.2, GeoConvert_ 2.3, GeodSolve_ 2.3, IntersectTool_
123
+ 2.3 and RhumbSolve_ 2.3), all on macOS 14.6.1 Sonoma in 64-bit.
124
124
 
125
125
  All tests ran with and without ``lazy import`` for Python 3 and with command line option ``-W default``
126
126
  and env variable ``PYGEODESY_WARNINGS=on`` for all Python versions. The results of those tests are
127
127
  included in the distribution files.
128
128
 
129
- Python 3.13.0rc2, 3.12.6, 3.11.5 and 3.10.8 run on Apple M1 Silicon (``arm64``), *natively*. Python 2.7.18
129
+ Python 3.13.0, 3.12.7, 3.11.5 and 3.10.8 run on Apple M1 Silicon (``arm64``), *natively*. Python 2.7.18
130
130
  runs on Intel (``x86_64``) or Intel *emulation* (\"``arm64_x86_64``\", see function `pygeodesy.machine`_).
131
131
 
132
- Test coverage has been measured with coverage_ 7.6.0 using Python 3.12.6, 3.11.5 and 3.10.8. The complete
133
- coverage report in HTML and a PDF summary are included in the distribution files.
132
+ Test coverage has been measured with coverage_ 7.6.1 using Python 3.13.0, 3.12.7, 3.11.5 and 3.10.8. The
133
+ complete coverage report in HTML and a PDF summary are included in the distribution files.
134
134
 
135
- The tests also ran with Python 3.12.6 (and geographiclib_ 2.0) on `Debian 12`_ in 64-bit only and with
136
- Python 3.12.3 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
135
+ The tests also ran with Python 3.13.0 (and geographiclib_ 2.0) on `Debian 12`_ in 64-bit only and with
136
+ Python 3.12.5 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
137
137
  (and with geographiclib_ 1.52) on `Windows 10`_ in 64- and 32-bit.
138
138
 
139
139
  A single-File and single-Directory application with ``pygeodesy`` has been bundled using PyInstaller_
140
140
  3.4 and 64-bit Python 3.7.4 and 3.7.3 on macOS 10.13.6 High Sierra.
141
141
 
142
- Previously, the tests were run with Python 3.12.0-4, 3.11.2-4, 3.10.1-7, 3.9.1, 3.8.7, 3.7.1, 2.7.15, PyPy_
142
+ Previously, the tests were run with Python 3.12.0-6, 3.11.2-4, 3.10.1-7, 3.9.1, 3.8.7, 3.7.1, 2.7.15, PyPy_
143
143
  7.3.12 (Python 3.10.12), 7.3.1 (Python 3.6.9) and PyPy_ 7.1.1 (Python 2.7.13) (and geographiclib_ 1.52,
144
144
  numpy_ 1.16.3, 1.16.4, 1.16.6, 1.19.0, 1.19.4, 1.19.5 or 1.22.4 and scipy_ 1.2.1, 1.4.1, 1.5.2 or 1.8.1)
145
145
  on `Ubuntu 16.04`_, with Python 3.10.0-1, 3.9.0-5, 3.8.0-6, 3.7.2-6, 3.7.0, 3.6.2-5, 3.5.3, 2.7.13-17,
@@ -160,7 +160,7 @@ and McCabe_ using Python 2.7.18 and with Flake8_ using Python 3.11.5, both in 64
160
160
 
161
161
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
162
162
 
163
- *Last updated: Sep 29, 2024.*
163
+ *Last updated: Oct 24, 2024.*
164
164
 
165
165
  License
166
166
  =======
@@ -251,7 +251,7 @@ DEALINGS IN THE SOFTWARE.
251
251
  .. _PyCodeStyle: https://PyPI.org/project/pycodestyle
252
252
  .. _PyFlakes: https://PyPI.org/project/pyflakes
253
253
  .. _PyGeodesy: https://PyPI.org/project/PyGeodesy
254
- .. _pygeodesy.machine: https://mrJean1.GitHub.io/PyGeodesy/docs/pygeodesy.interns-module.html#machine
254
+ .. _pygeodesy.machine: https://mrJean1.GitHub.io/PyGeodesy/docs/pygeodesy.internals-module.html#machine
255
255
  .. _PyInstaller: https://PyPI.org/project/pyinstaller
256
256
  .. _PyPI: https://PyPI.org/project/PyGeodesy
257
257
  .. _PyPI Download files: https://PyPI.org/project/PyGeodesy/#files
@@ -1,79 +1,79 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=MPSm_QycgTQamFcQG7hsKLKULgZK4MscaLnEOmrqUq0,42475
3
- pygeodesy/__main__.py,sha256=OupAiDFT_RXFw1Lh6C8bVG9NaonV_Wy6jibN_hA4aJg,5442
4
- pygeodesy/albers.py,sha256=JXqeWAteV2N601e5R-D7bCsa8qAYv3oWm7M3R4uszXM,31078
2
+ pygeodesy/__init__.py,sha256=r0yjEW8YI02U-NFs0qZF3tqSGbEqYLors4l-upxXJEg,42631
3
+ pygeodesy/__main__.py,sha256=1lE1jMp57iXpvu3TEh2unyT2qvtSa5nJPQn_K7Wmj3E,5442
4
+ pygeodesy/albers.py,sha256=BTeUqKPgygExYBLhRJh8b8FYdwuCIpCuo8ggCw6-Auw,30955
5
5
  pygeodesy/azimuthal.py,sha256=erI5DTM0-Nr5YC2LnBTVNbUKlrnnXJUwKe0SCQ7-Soc,50223
6
- pygeodesy/basics.py,sha256=JPANq5maTBqd4PhHIO4TLCfl9SG0D0n6OiUF421p1bQ,30163
7
- pygeodesy/booleans.py,sha256=gEh1bWdHEoSv-4yp0M9JE73xa4DLwLllgKC9d0mNLwM,73460
8
- pygeodesy/cartesianBase.py,sha256=jzPJR4_3Yp5jmK7A5inGOXskDebs7YMdjQzINHjzkP8,46935
6
+ pygeodesy/basics.py,sha256=I1za68bt64DDU7uDobR6EO8DZoNHtfTZHnKdGdH9O8w,30020
7
+ pygeodesy/booleans.py,sha256=0sNGKydX2ALi-VaIdaGhoPoRxmfBvA-Ny66lAH_LVis,73463
8
+ pygeodesy/cartesianBase.py,sha256=82h4wO5OxRRuvwMhGpjdZzeJjYVDWObP_3bhPB1T7TY,46935
9
9
  pygeodesy/clipy.py,sha256=hzI6IutTRkbssjPPgAjXv9OcgCIIZchjnMWaHin4YAU,27728
10
- pygeodesy/constants.py,sha256=E3ANfteZK05I89wbGP4Noxms0pT2TKBOyaVSv8jmlxg,19673
10
+ pygeodesy/constants.py,sha256=X2qvwiHSbCKv-PalJ6u22EJpwCcvSksvFrJdLaxgnZk,19842
11
11
  pygeodesy/css.py,sha256=rPr5EcGm_blVt72h-851ytpVxdPhx1MEqqGs3Ppx3eI,25651
12
- pygeodesy/datums.py,sha256=-m9-cvUVOaJ92eeFgc3O54lel3WqnVYcS7o6WCXkNyw,34043
13
- pygeodesy/dms.py,sha256=QxiRtyc8QSiW-egm6Mrcrgmi_deWz3YnYwIm82JS4TU,44443
12
+ pygeodesy/datums.py,sha256=trFx6KgEjlYY_VC6WViZhH1D-U3tDDDdbZXG6MD2H_U,34057
13
+ pygeodesy/dms.py,sha256=FiI-h3nXngSp624i0KlzHkBqYp5X5ucmvN6fLGi_Xgk,42174
14
14
  pygeodesy/ecef.py,sha256=_yy_TIUGsXmEZ7aRcmchbJwTp7x__edx6EPiS3Xznes,59587
15
15
  pygeodesy/elevations.py,sha256=4FuVcVNb_D09gmcvUlck344N4f7Jms76SIRrdutvKjk,10801
16
- pygeodesy/ellipsoidalBase.py,sha256=IDu0-cKGhkCk3Aj16DJXt2gxjGYsFcjSTrvwG5GbATs,55385
17
- pygeodesy/ellipsoidalBaseDI.py,sha256=wsUcdVdp1Tcs8IOS6bM773tAShIOqt_yscRFU2oiehI,38397
16
+ pygeodesy/ellipsoidalBase.py,sha256=D5OlvepTLoguqDdMmR50OqiMX44e1kaMM-z7k1NtFvI,55385
17
+ pygeodesy/ellipsoidalBaseDI.py,sha256=-y6JhV_8ZA0uNaIV05MkhCASVmUaXJthM4azJrM5Lbk,38445
18
18
  pygeodesy/ellipsoidalExact.py,sha256=wmIGgZyd0cvjswP4KOeDuEcuagjwQQRRq1cmseRoD-Q,16946
19
19
  pygeodesy/ellipsoidalGeodSolve.py,sha256=fAT4b3HXkM6i1W_C0rb4vbSxZqr4c6rS7PIvGF2ad7s,16666
20
20
  pygeodesy/ellipsoidalKarney.py,sha256=qvJa8kZ4SgaRR2UbjtkcRxw_CRbwhXoUT4Dn_6DJ6Ag,18721
21
- pygeodesy/ellipsoidalNvector.py,sha256=rzjFx-y1Z2apUK4yYelcZMYelYFTU-diFGI6o-nxkUk,30039
22
- pygeodesy/ellipsoidalVincenty.py,sha256=hSQ7s6QGDJSsrZvP7KwM1Q4wJz0YjyFjODF6XPGZ5WQ,25946
23
- pygeodesy/ellipsoids.py,sha256=i7piclEb17hYt5wqL7Q0p5qLuRVvz3yonUSUcvmiozc,108005
24
- pygeodesy/elliptic.py,sha256=M30EjB1Il_5Y8E94rN5hz4zPhYBQNoCo5Lj0TvCkiRE,45010
21
+ pygeodesy/ellipsoidalNvector.py,sha256=Ye6O6SIRiiwY6PJG4KD9kZ6GBpKkWWxZWsZC4k3eH-s,30039
22
+ pygeodesy/ellipsoidalVincenty.py,sha256=Eeh-lFB9y65kyYCZ5bc7uRIF9o6UT4lqdkk4EVRi0Pg,25946
23
+ pygeodesy/ellipsoids.py,sha256=PQ4fZtEHN-24ROvEbKzARWquisy__WKvKkaT4SOXVB0,106894
24
+ pygeodesy/elliptic.py,sha256=g_IuxDoVf0npEicUCT3x39GJqo1cfpkalC7aV1Z1hFY,45004
25
25
  pygeodesy/epsg.py,sha256=Vq_M1g7Z0x5Noqsmt6OCQkPdYJj4jpWObtixL5pAjDA,8220
26
- pygeodesy/errors.py,sha256=w7aUnWFFWavu1TiMyAuxA2bAHYOZltzYqauurU8pmLY,31907
27
- pygeodesy/etm.py,sha256=G6dtN1LQAoft5mcUoxVgxHPnl9s8NBsXl-IlS8WP7jo,45328
28
- pygeodesy/fmath.py,sha256=44yyf6shurGxFxFIj_huTk0cnRaMYYEgouFNdPrmZI0,35427
29
- pygeodesy/formy.py,sha256=FvbkYhJ-iIOFR-IOImwm0I_dgXM9CfnWrJK_IvBX0SU,75082
26
+ pygeodesy/errors.py,sha256=KtLGXxBeNMagCio5qeNX86NmR4g1GHmoYsSQ093RgfA,32040
27
+ pygeodesy/etm.py,sha256=QMQstkJGAvGS5zrLz_TJ75IRzDOljNXuuwGs8peJkMg,46188
28
+ pygeodesy/fmath.py,sha256=3y_qlxzq4vlOwqJ0vhDaGscAi3XbOyPbU6IISovvOzE,36494
29
+ pygeodesy/formy.py,sha256=8xrs_fSGng-TVKSgDzjR41SBwtbEO4_kS3Lq4kLtX-4,75082
30
30
  pygeodesy/frechet.py,sha256=F6TYbOEYSOFcll6nvp4GhqafUWXh1umAKb1QaMYQtuM,34372
31
- pygeodesy/fstats.py,sha256=r-RKXOwq2vcwEVrscKyMz0jgeyUFPD4izReKuNbxwoE,28548
32
- pygeodesy/fsums.py,sha256=GgHfZMCexk_q85m0kH4jhkeMnHnoPQ7X334Jzj3t8QM,101835
31
+ pygeodesy/fstats.py,sha256=8Vn1cwlgCQD444WX8FfAEC-AXQcJDeI9_i14Mizp59U,28288
32
+ pygeodesy/fsums.py,sha256=QEPeyM7wkgqeeWEynUNhJhiqynapRTCh8WzpU1fCREw,103404
33
33
  pygeodesy/gars.py,sha256=KRlyZUv1euEl7ZkDYSZG913GAfFMRG2m2hp37ObYY_Y,11829
34
- pygeodesy/geodesici.py,sha256=I9e7saiO5lRodOXJk5DSQxladVcGfT0FR6KJSJVCw7Y,75015
35
- pygeodesy/geodesicw.py,sha256=oEs96Epw839BH3rVpxVdpXuQRBudbOftUsSBUid8fcc,28710
36
- pygeodesy/geodsolve.py,sha256=_Vlb1c3j8n7dW99AinJ2HA_DiV4YnlRjbBY7Ha8AvEk,23553
37
- pygeodesy/geohash.py,sha256=CHJUhvV26PLpjkaTwF4fS42ZRSSsnpH2zyGvadPxqG4,40201
38
- pygeodesy/geoids.py,sha256=EWKfkmdl2GSL0eQCr79ndDwSGXYOPChGokxocCy7YuM,82371
34
+ pygeodesy/geodesici.py,sha256=4Elhe9Z8tcVFD46K0HKd_TSS24CQmgQGGlDk6DnBnmo,74775
35
+ pygeodesy/geodesicw.py,sha256=y6XVpgSG_s-sqF0Dh2HZwJWjBfKiUTCJoCP9Hc8LIww,28710
36
+ pygeodesy/geodsolve.py,sha256=iimnxLJBwygqy7Lxxl-ZjkJ7HVPD6sUrPW8hUZBxaKo,29356
37
+ pygeodesy/geohash.py,sha256=gDmDI91GOJAdNiAcf9bHq8I581UfPnMmwjWyJlPHRlM,40201
38
+ pygeodesy/geoids.py,sha256=uOvDFPYigoEOPnl7yrzbEN1_pEjo4YP-Nan4zsHI_Vs,82479
39
39
  pygeodesy/hausdorff.py,sha256=-aKtRbMefDSoIk4V3wCvNrXPZ7Bqk1P6-XuGuI7o8Zc,34770
40
40
  pygeodesy/heights.py,sha256=Gv3b1xC7I0tBvTO-DdmWVW8A3ZV3RKxY3jveUUZso38,42909
41
- pygeodesy/internals.py,sha256=TSJueckcn6dQddZUhLR0Vf9XN-Whm85IYmSvhVZbB_s,22550
42
- pygeodesy/interns.py,sha256=XvNyWODsUd8_vBLX9XLmcU9Bq97L0nahhF-gvLivzKA,23278
41
+ pygeodesy/internals.py,sha256=QPLqHnyTMQirTyjyRqlenCxP3vOq-PPxKnxFlKie0WM,24594
42
+ pygeodesy/interns.py,sha256=t8hQ3Y1QHzVkoQxq8Z9f0YjkpRC0oB0G7hpV894aYjw,23403
43
43
  pygeodesy/iters.py,sha256=xPH0ytomvJeKHu717Fjzi3QbRrEikO6n7vqkY_IDz1k,20311
44
- pygeodesy/karney.py,sha256=ZkZhbsieGnr2cAIXjzmK-9OJdh72Hjp6Hya1wIoVP3c,38913
44
+ pygeodesy/karney.py,sha256=UUZqUWlRn7S2YdF2A9bxuBNa-Qkpib9QkpRyGZXQOt8,40466
45
45
  pygeodesy/ktm.py,sha256=eUWYKhoPou1AiWiNz-xI8eDr-q-RvKDY6newAmYP26Q,27239
46
- pygeodesy/latlonBase.py,sha256=kCK6IcVg4oeGPYkIU0rgKbZLCRo36wC9NtY5OKBlpeQ,79106
47
- pygeodesy/lazily.py,sha256=NpWnTIAOkIxMorgUMvyR7d3D65-55DqaU98eBnwxcrQ,47411
46
+ pygeodesy/latlonBase.py,sha256=9R9O9SeIRXTmHfpR9WOL8-1m0yyG8Ymfth2eGq0mDEo,79070
47
+ pygeodesy/lazily.py,sha256=MSQhTpG8jPYBGsi75yNx9yXEvefQFwzDFnYpW_-Kkc0,46648
48
48
  pygeodesy/lcc.py,sha256=oDooTzFHnqsMtSKmmmfEbypHpdlPltfo7Mt0pAO4-_A,25669
49
49
  pygeodesy/ltp.py,sha256=ZMdfJHLKeDHSoymmjWfoAZTtrdoADf0O6WccRf53L2w,50745
50
50
  pygeodesy/ltpTuples.py,sha256=oNTxtjxmHveMDQvPdQCHl-JzSJJGb1jFRrF8SEG_Ojw,58480
51
- pygeodesy/mgrs.py,sha256=B3_BATbbCwBXKcxRtyX4PKScyWl0SmhAeXF8CVoc0_A,29903
52
- pygeodesy/named.py,sha256=-uqZk54BC4rFtuVh4LwfWty704DVPLEIwI1EzpNImIg,52350
51
+ pygeodesy/mgrs.py,sha256=3grmlAIeJFMDTLwCqlt86n4_kmIGocQ-3I6bIXd9nPo,29833
52
+ pygeodesy/named.py,sha256=D71yA_a3mwELI-rUYSKKKiXGuJQNuUnVXPTDhW5zZyc,52386
53
53
  pygeodesy/namedTuples.py,sha256=e0rV1Zb2tbx8fztXcSkUFsRTmZtye8B5i_Hi4vBUndU,28758
54
- pygeodesy/nvectorBase.py,sha256=rClYu26Bof9DsM1F60i0eccktNo8xYA_vkThwoY7N4o,28644
54
+ pygeodesy/nvectorBase.py,sha256=Xy1TDcH5UuUelVZ7aSKX85hx3fLlpDkYDhuoZijQ1vI,28644
55
55
  pygeodesy/osgr.py,sha256=3Qon_oWuVrIb1vYnd3ae3L5MDkjp_tngyVdiYHuL4to,30821
56
- pygeodesy/points.py,sha256=vtPQdL2kLOenIrpOdGjOYrUWsav3I1JXQEJugMv46eY,64383
57
- pygeodesy/props.py,sha256=3BIkcaEDwyhSMJle6ufBaji0R0FrD64G3nuR4tPsnrU,23819
56
+ pygeodesy/points.py,sha256=Vs9vShhBxebgo7UdHlt7Ov4D4Chfa723BZxV0_kpgGk,64389
57
+ pygeodesy/props.py,sha256=IFykUIfSybnymwxQbMjCJax7uAZl6SVJ-uMjatQPsLc,24564
58
58
  pygeodesy/resections.py,sha256=IrPHAHbF9JdBgAVd9LMgXoPgPFRkY8j1G7p0P8y8pdc,43543
59
59
  pygeodesy/simplify.py,sha256=vkOtO478sOjZHZBuSFvCaRh72qSDQuzXLQpMK1LKyYI,25232
60
- pygeodesy/solveBase.py,sha256=oI_-FFjSPI1_yQ598hF6HFKUa4tLsAfbnWtKoQ-TJgE,19206
61
- pygeodesy/sphericalBase.py,sha256=bDVuArfePzqcothiTTkyisUGrMDTallXKROjihotcn8,32239
62
- pygeodesy/sphericalNvector.py,sha256=Ip0jPv-MXBoHf3f-uXitGqiMz2xynDtE15OSJEl268Q,56913
63
- pygeodesy/sphericalTrigonometry.py,sha256=cfXuJaJJ6jrJZxQ5anFHhz3ZbgkAB7aiMfuyMtJXqsE,64064
64
- pygeodesy/streprs.py,sha256=4aME8X-_9SS4VESootFOoK96aHjpwq3cKNTZ5u0q_nI,23342
65
- pygeodesy/trf.py,sha256=CRFHmu0lFNtc41fddXavEkHmgnTFWEqR4RTFodcFKsw,119022
66
- pygeodesy/triaxials.py,sha256=a9vdXmSqUXOneL0WpLriEFwNMW9EB6MpVbKYXuw_wi8,62562
67
- pygeodesy/units.py,sha256=gHN-uzsOwIYjyhtWs0th0VHNY-fOiUiZo9G1cZi0oXg,35272
60
+ pygeodesy/solveBase.py,sha256=DpgFNHmWs1GUwCViAU-9iBsmKLVFNc8kW1zrDNi31FY,18485
61
+ pygeodesy/sphericalBase.py,sha256=lsjzDWm3VUxKTpKASqZJDYw7M_CJ4eCgzp3LiCJvMt8,32110
62
+ pygeodesy/sphericalNvector.py,sha256=lUXLX0fSZ0TcResvJ59N25GKR-qQBZEuXlhK-T6ijY4,56984
63
+ pygeodesy/sphericalTrigonometry.py,sha256=uOSNMlsdp5jEK36bL6750IlMuLdy-cKqOsd4tMhFr1M,64135
64
+ pygeodesy/streprs.py,sha256=ItNnTqkE_TMZtqgsRhDonrRDpi5gXtD44sQ_D3Qfsd0,23418
65
+ pygeodesy/trf.py,sha256=hxh6WA7IibL09dHoGMBKQeSXrRFPsYQV0F-LPAD40v4,119073
66
+ pygeodesy/triaxials.py,sha256=priBlyuraA1VhNbN0gv_UAXuulAwV14XjOBvu_oJA4U,63559
67
+ pygeodesy/units.py,sha256=XUbABlp93Pt9VL_Z_chhYRd-dMvwAMWNNWe54V6gmmM,35314
68
68
  pygeodesy/unitsBase.py,sha256=ZZ-VDntCOTjSerQJf9aaLE_J0lozrpmUhynRBaCtg24,14060
69
- pygeodesy/ups.py,sha256=zapIvzoVuj_FDGC6sr8O8ynPhfqXwUg-EFCVnJdM9Eo,23329
70
- pygeodesy/utily.py,sha256=Zb6L9unzHHhp67znmQLLdizvyX6p4eczR1PDtcyWH-s,36189
71
- pygeodesy/utm.py,sha256=lCp7mNEaJNrAYnbdPaNUKkhbsX_GdssTEkp68uYdMLI,31091
69
+ pygeodesy/ups.py,sha256=qRyk3tnQNRD7KgWGPANWOrg6Hxqd9eS7vN8or_tKk4E,23338
70
+ pygeodesy/utily.py,sha256=qLxVVE57PHEu1stJaULIYHZ6G-uNe7Fy_uoQfmNbXUg,36189
71
+ pygeodesy/utm.py,sha256=Ubd6-kZtBEoOzCj-pbHb3gRzuGrWBX6nY9_h1YweV2Q,31091
72
72
  pygeodesy/utmups.py,sha256=g2Z_aEOt6fhV9f4fASlW4_K_O_P4zBsBbWfQV11mIKo,13196
73
73
  pygeodesy/utmupsBase.py,sha256=S4s1Sehj9jSMy-XRxwtwVstG3QhyVt924V0FHu0cPIk,18730
74
74
  pygeodesy/vector2d.py,sha256=O9a3uRIREL2k7G-pnpuacjBcAlKg75MnokjtfJB-nBs,39659
75
- pygeodesy/vector3d.py,sha256=5oqlXXsm_YNGEMkVyKfmyp3qdMRxm-gzlK9V0_EK9hE,42687
76
- pygeodesy/vector3dBase.py,sha256=UOy6W-r8nTZTOMvxUgFQN6cFQo9H4zw0efqtcSpyy8s,36154
75
+ pygeodesy/vector3d.py,sha256=PaiuJgHCf0bO8nhOai42ut2zk0_DskSNCrOtCuHxw6U,42673
76
+ pygeodesy/vector3dBase.py,sha256=IJdJ-fLApA88HbPZb41vAJzbLlGywpfKn5yT7ia26A0,36108
77
77
  pygeodesy/webmercator.py,sha256=fFQtTxIsjOE35_nX_mAgFv1Eov7AdcsCBjT2ONm3qmI,14934
78
78
  pygeodesy/wgrs.py,sha256=6dO31uMKF-t-uQz58hdutilE2A5msOs5Bybq5Uq3qgk,15453
79
79
  pygeodesy/auxilats/_CX_4.py,sha256=WsxGrwqEhdWBx-K5ocwwDuatIkDTZB-FwrqQITbcNU0,6829
@@ -104,15 +104,15 @@ pygeodesy/geodesicx/_C4_30.py,sha256=cseNhROi7DHi77kgdrXXDXO6yiiq00DNcX0HOVf2Rpg
104
104
  pygeodesy/geodesicx/__init__.py,sha256=Z-Pq7wWevRZeMdG2qqL7OE1b8hRUubyZE2w1GqF1OzI,2478
105
105
  pygeodesy/geodesicx/__main__.py,sha256=wsJPK6lW_PsgVCR1ZJksgGhwxwrsMGSXhYkhpjbknTc,4188
106
106
  pygeodesy/geodesicx/gx.py,sha256=yeNpMQbw_uWfs4KOQX8RMAQt6WNsG3zsGgmZRVgbQIk,60612
107
- pygeodesy/geodesicx/gxarea.py,sha256=RbxhU4oXY6koFSCyJk9gsMlewaaTfXiGBAroexpEYjg,19423
107
+ pygeodesy/geodesicx/gxarea.py,sha256=cJaXwMMxjQ21RiCGU7c2YLXNmrqkRawHxQxsg7o5gas,19454
108
108
  pygeodesy/geodesicx/gxbases.py,sha256=AyvsjiSENqikJK6qpm55rDkUlBSmTDk_-FoqzzMFX1M,6130
109
109
  pygeodesy/geodesicx/gxline.py,sha256=zNQF8lz9caHZlsUcL8NfjG02KIza39Q6Qd6XizDp_UI,27537
110
110
  pygeodesy/rhumb/__init__.py,sha256=G8qo1yrLhKfd0yWiVUdJbIPj3udcmsgqKZqFD0PYfeA,2207
111
111
  pygeodesy/rhumb/aux_.py,sha256=XN0zlNwhU525NdcHko-G_Igvc7-mzXbT7ypcVIt5ADw,16048
112
- pygeodesy/rhumb/bases.py,sha256=awpP60K6EOzS753oXM-h9S6paS6FwoCnco8Zt8n81jY,54162
112
+ pygeodesy/rhumb/bases.py,sha256=e_ASUIK9ABtORVZaTMiFMGRc3w2wKGNDPdJEfVCp5CU,54162
113
113
  pygeodesy/rhumb/ekx.py,sha256=JsmdCatWKqsffF8jCh4HDu5IKt_kHq1qUdmP1LMuofY,24044
114
- pygeodesy/rhumb/solve.py,sha256=d4RujlW8B7BFAHlrwfj2Bup-uXZZTpgKWgI2JJBqUGc,24059
115
- PyGeodesy-24.9.29.dist-info/METADATA,sha256=bw_d3WzsZrHR7el08s2UwYG_Irc0KKwlN3h_dGtgZDY,19888
116
- PyGeodesy-24.9.29.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
117
- PyGeodesy-24.9.29.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
118
- PyGeodesy-24.9.29.dist-info/RECORD,,
114
+ pygeodesy/rhumb/solve.py,sha256=Ko1uHcicoqw7x467IzncjMtppjRs1JC1yqVh_DtTV6k,23905
115
+ PyGeodesy-24.10.24.dist-info/METADATA,sha256=tKtj7Pcqe2Kbx6YfgDvEdUNdDHw0-L4X0xpMStYFGlg,19919
116
+ PyGeodesy-24.10.24.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
117
+ PyGeodesy-24.10.24.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
118
+ PyGeodesy-24.10.24.dist-info/RECORD,,
pygeodesy/__init__.py CHANGED
@@ -122,7 +122,8 @@ C{epydoc --html --no-private --no-source --name=PyGeodesy --url=... -v pygeodesy
122
122
  Tests
123
123
  =====
124
124
 
125
- The tests ran with Python 3.13.0rc2, Python 3.12.6 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0,
125
+ The tests ran with Python 3.13.0 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0),
126
+ Python 3.12.7 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0,
126
127
  U{numpy<https://PyPI.org/project/numpy>} 2.1.0, U{scipy<https://PyPI.org/project/scipy>} 1.14.1,
127
128
  U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.3,
128
129
  U{IntersectTool<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.3 and
@@ -144,14 +145,15 @@ All tests ran with and without C{lazy import} for Python 3 and with command line
144
145
  env variable C{PYGEODESY_WARNINGS=on} for all Python versions. The results of those tests are included in
145
146
  the distribution files.
146
147
 
147
- Test coverage has been measured with U{coverage<https://PyPI.org/project/coverage>} 7.6.0 using Python 3.12.6,
148
- 3.11.5 and 3.10.8. The complete coverage report in HTML and a PDF summary are included in the distribution files.
148
+ Test coverage has been measured with U{coverage<https://PyPI.org/project/coverage>} 7.6.1 using Python
149
+ 3.13.0, 3.12.7, 3.11.5 and 3.10.8. The complete coverage report in HTML and a PDF summary are included in
150
+ the distribution files.
149
151
 
150
- Python 3.13.0rc2, 3.12.6, 3.11.5 and 3.10.8 run on Apple M1 Silicon (C{arm64}), I{natively}. Python 2.7.18 runs on
151
- Intel (C{x86_64}) or Intel I{emulation} ("C{arm64_x86_64}", see function L{machine<pygeodesy.machine>}).
152
+ Python 3.13.0, 3.12.7, 3.11.5 and 3.10.8 run on Apple M1 Silicon (C{arm64}), I{natively}. Python 2.7.18 runs
153
+ on Intel (C{x86_64}) or Intel I{emulation} ("C{arm64_x86_64}", see function L{machine<pygeodesy.machine>}).
152
154
 
153
- The tests also ran with Python 3.12.6 (and U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0) on U{Debian
154
- 12<https://Cirrus-CI.com/github/mrJean1/PyGeodesy/master>} in 64-bit only, with Python 3.12.3 (and
155
+ The tests also ran with Python 3.13.0 (and U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0) on
156
+ U{Debian 12<https://Cirrus-CI.com/github/mrJean1/PyGeodesy/master>} in 64-bit only, with Python 3.12.5 (and
155
157
  U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0) on U{Windows
156
158
  2019Server<https://CI.AppVeyor.com/project/mrJean1/pygeodesy>} in 64-bit only and with Python 2.7.18 (and
157
159
  U{geographiclib<https://PyPI.org/project/geographiclib>} 1.52) on U{Windows
@@ -160,7 +162,7 @@ U{geographiclib<https://PyPI.org/project/geographiclib>} 1.52) on U{Windows
160
162
  A single-File and single-Directory application with C{pygeodesy} has been bundled using U{PyInstaller
161
163
  <https://PyPI.org/project/pyinstaller>} 3.4 and 64-bit Python 3.7.3 on macOS 10.13.6 High Sierra.
162
164
 
163
- Previously, the tests were run with Python 3.12.0-4, 3.11.2-4, 3.10.1-7, 3.9.6, 3.9.1, 3.8.7, 3.7.1, 2.7.15, U{PyPy
165
+ Previously, the tests were run with Python 3.12.0-6, 3.11.2-4, 3.10.1-7, 3.9.6, 3.9.1, 3.8.7, 3.7.1, 2.7.15, U{PyPy
164
166
  <https://PyPy.org>} 7.3.12 (Python 3.10.12), 7.3.1 (Python 3.6.9) and U{PyPy<https://PyPy.org>} 7.1.1 (Python
165
167
  2.7.13) (and U{geographiclib <https://PyPI.org/project/geographiclib>} 1.52, U{numpy<https://PyPI.org/project/numpy>}
166
168
  1.16.3, 1.16.4, 1.16.6, 1.19.0, 1.19.4, 1.19.5 or 1.22.4 and U{scipy<https://PyPI.org/project/scipy>} 1.2.1, 1.4.1,
@@ -200,8 +202,8 @@ The following environment variables are observed by C{PyGeodesy}:
200
202
  - C{PYGEODESY_EXCEPTION_CHAINING} - see module L{errors<pygeodesy.errors>}.
201
203
  - C{PYGEODESY_FMT_FORM} - see module L{dms<pygeodesy.dms>}.
202
204
  - C{PYGEODESY_FSUM_F2PRODUCT} - see module L{fsums<pygeodesy.fsums>} and method L{f2product<pygeodesy.Fsum.f2product>}.
203
- - C{PYGEODESY_FSUM_NONFINITES} - see module L{fsums<pygeodesy.fsums>} and function L{nonfiniterrors<pygeodesy.nonfiniterrors>}.
204
- - C{PYGEODESY_FSUM_RESIDUAL} - see module L{fsums<pygeodesy.fsums>} and class L{Fsum<pygeodesy.Fsum>}.
205
+ - C{PYGEODESY_FSUM_NONFINITES} - see module L{fsums<pygeodesy.fsums>} and method L{nonfinites<pygeodesy.Fsum.nonfinites>}.
206
+ - C{PYGEODESY_FSUM_RESIDUAL} - see module L{fsums<pygeodesy.fsums>} and method L{RESIDUAL<pygeodesy.Fsum.RESIDUAL>}.
205
207
  - C{PYGEODESY_GEOCONVERT} - see module L{mgrs<pygeodesy.mgrs>}.
206
208
  - C{PYGEODESY_GEODSOLVE} - see module L{geodsolve<pygeodesy.geodsolve>}.
207
209
  - C{PYGEODESY_INTERSECTTOOL} - see module L{geodesici<pygeodesy.geodesici>}.
@@ -210,12 +212,13 @@ The following environment variables are observed by C{PyGeodesy}:
210
212
  - C{PYGEODESY_RHUMBSOLVE} - see module L{rhumb.solve<pygeodesy.rhumb.solve>}.
211
213
  - C{PYGEODESY_UPS_POLES} - see modules L{ups<pygeodesy.ups>} and L{mgrs<pygeodesy.mgrs>}.
212
214
 
213
- and these to control standard or I{named} C{repr}esentations:
215
+ and these to specify standard or I{named} C{repr}esentations:
214
216
 
215
217
  - C{PYGEODESY_AZIMUTH_STD_REPR} - see method L{Azimuth<pygeodesy.Azimuth>}C{.__repr__}.
216
218
  - C{PYGEODESY_BEARING_STD_REPR} - see method L{Bearing<pygeodesy.Bearing>}C{.__repr__}.
217
219
  - C{PYGEODESY_BOOL_STD_REPR} - see method L{Bool<pygeodesy.Bool>}C{.__repr__}.
218
220
  - C{PYGEODESY_DEGREES_STD_REPR} - see method L{Degrees<pygeodesy.Degrees>}C{.__repr__}.
221
+ - C{PYGEODESY_EPOCH_STD_REPR} - see method L{Float<pygeodesy.Epoch>}C{.__repr__}.
219
222
  - C{PYGEODESY_FLOAT_STD_REPR} - see method L{Float<pygeodesy.Float>}C{.__repr__}.
220
223
  - C{PYGEODESY_INT_STD_REPR} - see method L{Int<pygeodesy.Int>}C{.__repr__}.
221
224
  - C{PYGEODESY_METER_STD_REPR} - see method L{Meter<pygeodesy.Meter>}C{.__repr__}.
@@ -232,12 +235,10 @@ plus during development:
232
235
 
233
236
  and:
234
237
 
235
- - C{PYGEODESY_INIT__ALL__} - Set env variable C{PYGEODESY_INIT__ALL__} to anything
236
- other than C{"__all__"} to avoid importing all C{pygeodesy} modules unnecessarily
237
- (in Python 2 or with C{PYGEODESY_LAZY_IMPORT} turned off in Python 3). However,
238
- to import a C{pygeodesy} item, the item name must be qualified with the C{module}
239
- name, for example C{ from pygeodesy.ellipsoidalExact import LatLon } or C{ from
240
- pygeodesy.deprecated import collins }
238
+ - C{PYGEODESY_INIT__ALL__} - Set env variable C{PYGEODESY_INIT__ALL__} to anything other than C{"__all__"} to avoid
239
+ importing all C{pygeodesy} modules unnecessarily (in Python 2 or with C{PYGEODESY_LAZY_IMPORT} turned off in Python
240
+ 3). However, to import a C{pygeodesy} item, the item name must be qualified with the C{module} name, for example
241
+ C{ from pygeodesy.ellipsoidalExact import LatLon } or C{ from pygeodesy.deprecated import collins }
241
242
 
242
243
  License
243
244
  =======
@@ -581,7 +582,7 @@ if _init__all__ and not _lazy_import2: # import and set __all__
581
582
  raise ImportError('missing %s%s: %s' % (_attribute_, s, t))
582
583
  ns.extend(attrs)
583
584
  # XXX if ps: # check that mod is a _pygeodesy_ module
584
- # XXX m = globalocals[mod] # assert(_dunder_nameof(m) == mod)
585
+ # XXX m = globalocals[mod] # assert(_DUNDER_nameof(m) == mod)
585
586
  # XXX f = getattr(m, _dunder_file_, _NN)
586
587
  # XXX d = _os_path.dirname(_os_path.abspath(f)) if f else pygeodesy_abspath
587
588
  # XXX p = getattr(m, _dunder_package_, _NN) or _pygeodesy_
@@ -597,7 +598,7 @@ else:
597
598
 
598
599
  from pygeodesy.internals import _version2, _DOT_ # PYCHOK import
599
600
  # from pygeodesy.interns import _DOT_ # from .internals
600
- __version__ = '24.09.29'
601
+ __version__ = '24.10.24'
601
602
  # see setup.py for similar logic
602
603
  version = _DOT_(*_version2(__version__, n=3))
603
604
 
pygeodesy/__main__.py CHANGED
@@ -5,7 +5,7 @@ u'''Print L{pygeodesy} version, etc. using C{python -m pygeodesy}.
5
5
  '''
6
6
 
7
7
  __all__ = ()
8
- __version__ = '24.09.05'
8
+ __version__ = '24.10.14'
9
9
 
10
10
  from os.path import basename, dirname
11
11
 
@@ -16,9 +16,9 @@ def _main(): # PYCHOK no cover
16
16
  from pygeodesy import constants, _isfrozen, pygeodesy_abspath, version
17
17
  from pygeodesy.basics import _xcoverage,_xgeographiclib, _xnumpy, _xscipy
18
18
  from pygeodesy.internals import _name_version, printf, _usage, _versions
19
- from pygeodesy.interns import NN, _COMMASPACE_, _DEPRECATED_, _DOT_, _EQUAL_, \
20
- _pygeodesy_abspath_, _version_
21
- from pygeodesy.lazily import isLazy, _dunder_all_, _all_deprecates, _all_imports
19
+ from pygeodesy.interns import NN, _COMMASPACE_, _DEPRECATED_, _DOT_, _DUNDER_all_, \
20
+ _EQUAL_, _pygeodesy_abspath_, _version_
21
+ from pygeodesy.lazily import _all_deprecates, _all_imports, isLazy
22
22
 
23
23
  def _p(name_value):
24
24
  return _DOT_(NN, _EQUAL_(*name_value))
@@ -28,7 +28,7 @@ def _main(): # PYCHOK no cover
28
28
  ('isLazy', isLazy),
29
29
  ('_isfrozen', _isfrozen),
30
30
  ('_floats', len(constants._floats)),
31
- (_dunder_all_, len(_all_imports())),
31
+ (_DUNDER_all_, len(_all_imports())),
32
32
  (_DEPRECATED_, len(_all_deprecates()))))
33
33
 
34
34
  def _nv(_xpkg, p):
pygeodesy/albers.py CHANGED
@@ -38,12 +38,12 @@ from pygeodesy.utily import atan1, atan1d, degrees360, sincos2, sincos2d, \
38
38
  from math import atan2, atanh, degrees, fabs, radians, sqrt
39
39
 
40
40
  __all__ = _ALL_LAZY.albers
41
- __version__ = '24.06.11'
41
+ __version__ = '24.10.15'
42
42
 
43
43
  _k1_ = 'k1'
44
44
  _NUMIT = 8 # XXX 4?
45
45
  _NUMIT0 = 41 # XXX 21?
46
- _TERMS = 21 # XXX 16?
46
+ _TERMS = 31 # XXX 16?
47
47
  _TOL0 = sqrt3(_TOL)
48
48
 
49
49
 
@@ -425,15 +425,12 @@ class _AlbersBase(_NamedBase):
425
425
  e22 = E.e22 # == e2 / e21
426
426
  tol = _tol(_TOL0, ta0)
427
427
  _Ta02 = Fsum(ta0).fsum2f_
428
- _fabs = fabs
429
- _fsum1 = fsum1f_
430
- _sqrt = sqrt
431
428
  _1, _2 = _1_0, _2_0
432
429
  _4, _6 = _4_0, _6_0
433
430
  for self._iteration in range(1, _NUMIT0): # 4 trips
434
431
  ta02 = ta0**2
435
432
  sca02 = ta02 + _1
436
- sca0 = _sqrt(sca02)
433
+ sca0 = sqrt(sca02)
437
434
  sa0 = ta0 / sca0
438
435
  sa01 = sa0 + _1
439
436
  sa02 = sa0**2
@@ -449,10 +446,10 @@ class _AlbersBase(_NamedBase):
449
446
  BA = (_atanh1(e2 * sa0m1**2) * e21 - e2 * sa0m) * sa0m1 \
450
447
  - (_2 + (_1 + e2) * sa0) * sa0m**2 * e22 / sa021 # B + A
451
448
  d = (_4 - (_1 + sa02) * e2 * _2) * e22 / (sa021**2 * sca02) # dAB
452
- u = _fsum1(s1_qZ * g, -D, g * BA)
453
- du = _fsum1(s1_qZ * dg, dD, dg * BA, g * d)
449
+ u = fsum1f_(s1_qZ * g, -D, g * BA)
450
+ du = fsum1f_(s1_qZ * dg, dD, dg * BA, g * d)
454
451
  ta0, d = _Ta02(-u / du * (sca0 * sca02))
455
- if _fabs(d) < tol:
452
+ if fabs(d) < tol:
456
453
  return ta0
457
454
  raise AlbersError(Fmt.no_convergence(d, tol), txt=repr(self))
458
455
 
@@ -496,22 +493,20 @@ class _AlbersBase(_NamedBase):
496
493
  e2 = self.ellipsoid.e2
497
494
  qx = self._qx
498
495
 
499
- ta = txi
500
- _Ta2 = Fsum(ta).fsum2f_
501
- _fabs = fabs
502
- _sqrt3 = sqrt3
503
- _txif = self._txif
504
- _1 = _1_0
496
+ ta = txi
497
+ _Ta2 = Fsum(ta).fsum2f_
498
+ _txif = self._txif
499
+ _1 = _1_0
505
500
  for self._iteration in range(1, _NUMIT): # max 2, mean 1.99
506
501
  # dtxi / dta = (scxi / sca)^3 * 2 * (1 - e^2)
507
502
  # / (qZ * (1 - e^2 * sa^2)^2)
508
503
  ta2 = ta**2
509
504
  sca2 = _1 + ta2
510
505
  txia = _txif(ta)
511
- s3qx = _sqrt3(sca2 / (txia**2 + _1)) * qx # * _1_x21(txia)
506
+ s3qx = sqrt3(sca2 / (txia**2 + _1)) * qx # * _1_x21(txia)
512
507
  eta2 = (_1 - e2 * ta2 / sca2)**2
513
508
  ta, d = _Ta2((txi - txia) * s3qx * eta2)
514
- if _fabs(d) < tol:
509
+ if fabs(d) < tol:
515
510
  return ta
516
511
  raise AlbersError(Fmt.no_convergence(d, tol), txt=repr(self))
517
512
 
pygeodesy/basics.py CHANGED
@@ -20,30 +20,28 @@ from pygeodesy.errors import _AttributeError, _ImportError, _NotImplementedError
20
20
  _TypeError, _TypesError, _ValueError, _xAssertionError, \
21
21
  _xkwds_get1
22
22
  # from pygeodesy.fsums import _isFsum_2Tuple # _MODS
23
- from pygeodesy.internals import _0_0, _enquote, _passarg, _version_info
23
+ from pygeodesy.internals import _0_0, _enquote, _getenv, _passarg, _PYGEODESY, \
24
+ _version_info
24
25
  from pygeodesy.interns import MISSING, NN, _1_, _by_, _COMMA_, _DOT_, _DEPRECATED_, \
25
26
  _ELLIPSIS4_, _EQUAL_, _in_, _invalid_, _N_A_, _not_, \
26
27
  _not_scalar_, _odd_, _SPACE_, _UNDER_, _version_
27
28
  # from pygeodesy.latlonBase import LatLonBase # _MODS
28
- from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _FOR_DOCS, _getenv, \
29
- LazyImportError, _sys_version_info2
29
+ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, LazyImportError
30
30
  # from pygeodesy.named import classname, modulename, _name__ # _MODS
31
31
  # from pygeodesy.nvectorBase import NvectorBase # _MODS
32
32
  # from pygeodesy.props import _update_all # _MODS
33
33
  # from pygeodesy.streprs import Fmt # _MODS
34
- # from pygeodesy.unitsBase import _NamedUnit, Str # _MODS
35
34
 
36
35
  from copy import copy as _copy, deepcopy as _deepcopy
37
36
  from math import copysign as _copysign
38
- import inspect as _inspect
37
+ # import inspect as _inspect # _MODS
39
38
 
40
39
  __all__ = _ALL_LAZY.basics
41
- __version__ = '24.09.28'
40
+ __version__ = '24.10.14'
42
41
 
43
- _below_ = 'below'
44
- _list_tuple_types = (list, tuple)
45
- _PYGEODESY_XPACKAGES_ = 'PYGEODESY_XPACKAGES'
46
- _required_ = 'required'
42
+ _below_ = 'below'
43
+ _list_tuple_types = (list, tuple)
44
+ _required_ = 'required'
47
45
 
48
46
  try: # Luciano Ramalho, "Fluent Python", O'Reilly, 2016 p. 395, 2022 p. 577+
49
47
  from numbers import Integral as _Ints, Real as _Scalars # .units
@@ -120,19 +118,20 @@ def _args_kwds_count2(func, exelf=True):
120
118
  @kwarg exelf: If C{True}, exclude C{self} in the C{args}
121
119
  of a method (C{bool}).
122
120
  '''
121
+ i = _MODS.inspect
123
122
  try: # PYCHOK no cover
124
123
  a = k = 0
125
- for _, p in _inspect.signature(func).parameters.items():
124
+ for _, p in i.signature(func).parameters.items():
126
125
  if p.kind is p.POSITIONAL_OR_KEYWORD:
127
126
  if p.default is p.empty:
128
127
  a += 1
129
128
  else:
130
129
  k += 1
131
- except AttributeError: # .signature new Python 3+
132
- s = _inspect.getargspec(func)
130
+ except AttributeError: # Python 2-
131
+ s = i.getargspec(func)
133
132
  k = len(s.defaults or ())
134
133
  a = len(s.args) - k
135
- if exelf and a > 0 and _inspect.ismethod(func):
134
+ if exelf and a > 0 and i.ismethod(func):
136
135
  a -= 1
137
136
  return a, k
138
137
 
@@ -147,10 +146,11 @@ def _args_kwds_names(func, splast=False):
147
146
  @note: Python 2 may I{not} include the C{*args} nor the
148
147
  C{**kwds} names.
149
148
  '''
149
+ i = _MODS.inspect
150
150
  try:
151
- args_kwds = _inspect.signature(func).parameters.keys()
152
- except AttributeError: # .signature new Python 3+
153
- args_kwds = _inspect.getargspec(func).args
151
+ args_kwds = i.signature(func).parameters.keys()
152
+ except AttributeError: # Python 2-
153
+ args_kwds = i.getargspec(func).args
154
154
  if splast and args_kwds: # PYCHOK no cover
155
155
  args_kwds = list(args_kwds)
156
156
  t = args_kwds[-1:]
@@ -266,14 +266,10 @@ def isCartesian(obj, ellipsoidal=None):
266
266
  return isinstanceof(obj, _MODS.cartesianBase.CartesianBase)
267
267
 
268
268
 
269
- if _FOR_DOCS: # XXX avoid epydoc Python 2.7 error
270
-
271
- def isclass(obj):
272
- '''Is B{C{obj}}ect a C{Class} or C{type}?
273
- '''
274
- return _inspect.isclass(obj)
275
- else:
276
- isclass = _inspect.isclass
269
+ def isclass(obj): # XXX avoid epydoc Python 2.7 error
270
+ '''Is B{C{obj}}ect a C{Class} or C{type}?
271
+ '''
272
+ return _MODS.inspect.isclass(obj)
277
273
 
278
274
 
279
275
  def iscomplex(obj, both=False):
@@ -511,7 +507,7 @@ def issubclassof(Sub, *Supers):
511
507
  if isclass(Sub):
512
508
  t = tuple(S for S in Supers if isclass(S))
513
509
  if t:
514
- return bool(issubclass(Sub, t))
510
+ return bool(issubclass(Sub, t)) # built-in
515
511
  return None
516
512
 
517
513
 
@@ -711,9 +707,9 @@ def splice(iterable, n=2, **fill):
711
707
  yield t # 1 slice, all
712
708
 
713
709
 
714
- def _splituple(strs, *sep_splits): # in .mgrs, .osgr, .webmercator
710
+ def _splituple(strs, *sep_splits): # in .mgrs, ...
715
711
  '''(INTERNAL) Split a C{comma}- or C{whitespace}-separated
716
- string into a C{tuple} of stripped strings.
712
+ string into a C{tuple} of stripped C{str}ings.
717
713
  '''
718
714
  t = (strs.split(*sep_splits) if sep_splits else
719
715
  strs.replace(_COMMA_, _SPACE_).split()) if strs else ()
@@ -744,7 +740,7 @@ def _xcoverage(where, *required):
744
740
  '''(INTERNAL) Import C{coverage} and check required version.
745
741
  '''
746
742
  try:
747
- _xpackage(_xcoverage)
743
+ _xpackages(_xcoverage)
748
744
  import coverage
749
745
  except ImportError as x:
750
746
  raise _xImportError(x, where)
@@ -780,7 +776,7 @@ def _xgeographiclib(where, *required):
780
776
  '''(INTERNAL) Import C{geographiclib} and check required version.
781
777
  '''
782
778
  try:
783
- _xpackage(_xgeographiclib)
779
+ _xpackages(_xgeographiclib)
784
780
  import geographiclib
785
781
  except ImportError as x:
786
782
  raise _xImportError(x, where, Error=LazyImportError)
@@ -828,7 +824,7 @@ def _xiterablen(obj):
828
824
  def _xiterror(obj, _xwhich):
829
825
  '''(INTERNAL) Helper for C{_xinterable} and C{_xiterablen}.
830
826
  '''
831
- t = _not_(_xwhich.__name__[2:]) # _dunder_nameof
827
+ t = _not_(_xwhich.__name__[2:]) # _DUNDER_nameof
832
828
  raise _TypeError(repr(obj), txt=t)
833
829
 
834
830
 
@@ -836,7 +832,7 @@ def _xnumpy(where, *required):
836
832
  '''(INTERNAL) Import C{numpy} and check required version.
837
833
  '''
838
834
  try:
839
- _xpackage(_xnumpy)
835
+ _xpackages(_xnumpy)
840
836
  import numpy
841
837
  except ImportError as x:
842
838
  raise _xImportError(x, where)
@@ -851,13 +847,14 @@ def _xor(x, *xs):
851
847
  return x
852
848
 
853
849
 
854
- def _xpackage(_xpkg):
850
+ def _xpackages(_xpkg):
855
851
  '''(INTERNAL) Check dependency to be excluded.
856
852
  '''
857
- n = _xpkg.__name__[2:] # _dunder_nameof
858
- if n in _XPACKAGES:
859
- x = _SPACE_(n, _in_, _PYGEODESY_XPACKAGES_)
860
- e = _enquote(_getenv(_PYGEODESY_XPACKAGES_, NN))
853
+ n = _xpkg.__name__[2:] # _DUNDER_nameof, less '_x'
854
+ if n in _XPACKAGES: # n.lower() in _XPACKAGES
855
+ E = _PYGEODESY(_xpackages)
856
+ x = _SPACE_(n, _in_, E)
857
+ e = _enquote(_getenv(E, NN))
861
858
  raise ImportError(_EQUAL_(x, e))
862
859
 
863
860
 
@@ -873,7 +870,7 @@ def _xscipy(where, *required):
873
870
  '''(INTERNAL) Import C{scipy} and check required version.
874
871
  '''
875
872
  try:
876
- _xpackage(_xscipy)
873
+ _xpackages(_xscipy)
877
874
  import scipy
878
875
  except ImportError as x:
879
876
  raise _xImportError(x, where)
@@ -905,7 +902,7 @@ def _xversion(package, where, *required, **name):
905
902
  if required:
906
903
  t = _version_info(package)
907
904
  if t[:len(required)] < required:
908
- t = _SPACE_(package.__name__, # _dunder_nameof
905
+ t = _SPACE_(package.__name__, # _DUNDER_nameof
909
906
  _version_, _DOT_(*t),
910
907
  _below_, _DOT_(*required),
911
908
  _req_d_by(where, **name))
@@ -925,14 +922,14 @@ def _xzip(*args, **strict): # PYCHOK no cover
925
922
  return zip(*args)
926
923
 
927
924
 
928
- if _sys_version_info2 < (3, 10): # see .errors
925
+ if _MODS.sys_version_info2 < (3, 10): # see .errors
929
926
  _zip = zip # PYCHOK exported
930
927
  else: # Python 3.10+
931
928
 
932
929
  def _zip(*args):
933
930
  return zip(*args, strict=True)
934
931
 
935
- _XPACKAGES = _splituple(_getenv(_PYGEODESY_XPACKAGES_, NN).lower())
932
+ _XPACKAGES = _splituple(_getenv(_PYGEODESY(_xpackages), NN).lower()) # test/bases._X_OK
936
933
 
937
934
  # **) MIT License
938
935
  #