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.
- {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/METADATA +15 -15
- {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/RECORD +56 -56
- pygeodesy/__init__.py +20 -19
- pygeodesy/__main__.py +5 -5
- pygeodesy/albers.py +12 -17
- pygeodesy/basics.py +38 -41
- pygeodesy/booleans.py +54 -46
- pygeodesy/cartesianBase.py +2 -2
- pygeodesy/constants.py +20 -16
- pygeodesy/datums.py +3 -3
- pygeodesy/dms.py +250 -270
- pygeodesy/ellipsoidalBase.py +2 -2
- pygeodesy/ellipsoidalBaseDI.py +10 -10
- pygeodesy/ellipsoidalNvector.py +4 -4
- pygeodesy/ellipsoidalVincenty.py +2 -2
- pygeodesy/ellipsoids.py +7 -48
- pygeodesy/elliptic.py +14 -14
- pygeodesy/errors.py +15 -10
- pygeodesy/etm.py +18 -2
- pygeodesy/fmath.py +188 -176
- pygeodesy/formy.py +4 -4
- pygeodesy/fstats.py +54 -56
- pygeodesy/fsums.py +304 -266
- pygeodesy/geodesici.py +43 -40
- pygeodesy/geodesicw.py +3 -3
- pygeodesy/geodesicx/gxarea.py +3 -2
- pygeodesy/geodsolve.py +73 -24
- pygeodesy/geohash.py +2 -2
- pygeodesy/geoids.py +28 -27
- pygeodesy/internals.py +156 -85
- pygeodesy/interns.py +23 -20
- pygeodesy/karney.py +61 -12
- pygeodesy/latlonBase.py +13 -15
- pygeodesy/lazily.py +206 -214
- pygeodesy/mgrs.py +13 -13
- pygeodesy/named.py +11 -10
- pygeodesy/nvectorBase.py +1 -1
- pygeodesy/points.py +2 -2
- pygeodesy/props.py +34 -13
- pygeodesy/rhumb/bases.py +5 -5
- pygeodesy/rhumb/solve.py +7 -8
- pygeodesy/solveBase.py +7 -25
- pygeodesy/sphericalBase.py +20 -23
- pygeodesy/sphericalNvector.py +24 -23
- pygeodesy/sphericalTrigonometry.py +9 -8
- pygeodesy/streprs.py +11 -8
- pygeodesy/trf.py +6 -4
- pygeodesy/triaxials.py +46 -9
- pygeodesy/units.py +4 -3
- pygeodesy/ups.py +6 -6
- pygeodesy/utily.py +2 -2
- pygeodesy/utm.py +2 -2
- pygeodesy/vector3d.py +5 -5
- pygeodesy/vector3dBase.py +4 -5
- {PyGeodesy-24.9.29.dist-info → PyGeodesy-24.10.24.dist-info}/WHEEL +0 -0
- {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.
|
|
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.
|
|
119
|
-
GeodSolve_ 2.3, IntersectTool_ 2.3 and RhumbSolve_ 2.3), 3.11.5 (with
|
|
120
|
-
1.24.2 and scipy_ 1.10.1), Python 3.10.8 (with geographiclib_ 2.0, numpy_
|
|
121
|
-
GeoConvert_ 2.3, GeodSolve_ 2.3), Python 3.9.6 and Python 2.7.18 (with
|
|
122
|
-
1.16.6, scipy_ 1.2.2, GeoConvert_ 2.3, GeodSolve_ 2.3, IntersectTool_
|
|
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.
|
|
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.
|
|
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.
|
|
136
|
-
Python 3.12.
|
|
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-
|
|
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:
|
|
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.
|
|
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=
|
|
3
|
-
pygeodesy/__main__.py,sha256=
|
|
4
|
-
pygeodesy/albers.py,sha256=
|
|
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=
|
|
7
|
-
pygeodesy/booleans.py,sha256=
|
|
8
|
-
pygeodesy/cartesianBase.py,sha256=
|
|
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=
|
|
10
|
+
pygeodesy/constants.py,sha256=X2qvwiHSbCKv-PalJ6u22EJpwCcvSksvFrJdLaxgnZk,19842
|
|
11
11
|
pygeodesy/css.py,sha256=rPr5EcGm_blVt72h-851ytpVxdPhx1MEqqGs3Ppx3eI,25651
|
|
12
|
-
pygeodesy/datums.py,sha256
|
|
13
|
-
pygeodesy/dms.py,sha256=
|
|
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=
|
|
17
|
-
pygeodesy/ellipsoidalBaseDI.py,sha256
|
|
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=
|
|
22
|
-
pygeodesy/ellipsoidalVincenty.py,sha256=
|
|
23
|
-
pygeodesy/ellipsoids.py,sha256=
|
|
24
|
-
pygeodesy/elliptic.py,sha256=
|
|
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=
|
|
27
|
-
pygeodesy/etm.py,sha256=
|
|
28
|
-
pygeodesy/fmath.py,sha256=
|
|
29
|
-
pygeodesy/formy.py,sha256=
|
|
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=
|
|
32
|
-
pygeodesy/fsums.py,sha256=
|
|
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=
|
|
35
|
-
pygeodesy/geodesicw.py,sha256=
|
|
36
|
-
pygeodesy/geodsolve.py,sha256=
|
|
37
|
-
pygeodesy/geohash.py,sha256=
|
|
38
|
-
pygeodesy/geoids.py,sha256=
|
|
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=
|
|
42
|
-
pygeodesy/interns.py,sha256=
|
|
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=
|
|
44
|
+
pygeodesy/karney.py,sha256=UUZqUWlRn7S2YdF2A9bxuBNa-Qkpib9QkpRyGZXQOt8,40466
|
|
45
45
|
pygeodesy/ktm.py,sha256=eUWYKhoPou1AiWiNz-xI8eDr-q-RvKDY6newAmYP26Q,27239
|
|
46
|
-
pygeodesy/latlonBase.py,sha256=
|
|
47
|
-
pygeodesy/lazily.py,sha256=
|
|
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=
|
|
52
|
-
pygeodesy/named.py,sha256
|
|
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=
|
|
54
|
+
pygeodesy/nvectorBase.py,sha256=Xy1TDcH5UuUelVZ7aSKX85hx3fLlpDkYDhuoZijQ1vI,28644
|
|
55
55
|
pygeodesy/osgr.py,sha256=3Qon_oWuVrIb1vYnd3ae3L5MDkjp_tngyVdiYHuL4to,30821
|
|
56
|
-
pygeodesy/points.py,sha256=
|
|
57
|
-
pygeodesy/props.py,sha256=
|
|
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=
|
|
61
|
-
pygeodesy/sphericalBase.py,sha256=
|
|
62
|
-
pygeodesy/sphericalNvector.py,sha256=
|
|
63
|
-
pygeodesy/sphericalTrigonometry.py,sha256=
|
|
64
|
-
pygeodesy/streprs.py,sha256=
|
|
65
|
-
pygeodesy/trf.py,sha256=
|
|
66
|
-
pygeodesy/triaxials.py,sha256=
|
|
67
|
-
pygeodesy/units.py,sha256=
|
|
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=
|
|
70
|
-
pygeodesy/utily.py,sha256=
|
|
71
|
-
pygeodesy/utm.py,sha256=
|
|
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=
|
|
76
|
-
pygeodesy/vector3dBase.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
115
|
-
PyGeodesy-24.
|
|
116
|
-
PyGeodesy-24.
|
|
117
|
-
PyGeodesy-24.
|
|
118
|
-
PyGeodesy-24.
|
|
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.
|
|
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.
|
|
148
|
-
3.11.5 and 3.10.8. The complete coverage report in HTML and a PDF summary are included in
|
|
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.
|
|
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.
|
|
154
|
-
12<https://Cirrus-CI.com/github/mrJean1/PyGeodesy/master>} in 64-bit only, with Python 3.12.
|
|
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-
|
|
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
|
|
204
|
-
- C{PYGEODESY_FSUM_RESIDUAL} - see module L{fsums<pygeodesy.fsums>} and
|
|
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
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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_,
|
|
20
|
-
_pygeodesy_abspath_, _version_
|
|
21
|
-
from pygeodesy.lazily import
|
|
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
|
-
(
|
|
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.
|
|
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 =
|
|
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 =
|
|
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 =
|
|
453
|
-
du =
|
|
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
|
|
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
|
|
500
|
-
_Ta2
|
|
501
|
-
|
|
502
|
-
|
|
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 =
|
|
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
|
|
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,
|
|
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,
|
|
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.
|
|
40
|
+
__version__ = '24.10.14'
|
|
42
41
|
|
|
43
|
-
_below_
|
|
44
|
-
_list_tuple_types
|
|
45
|
-
|
|
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
|
|
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: #
|
|
132
|
-
s =
|
|
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
|
|
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 =
|
|
152
|
-
except AttributeError: #
|
|
153
|
-
args_kwds =
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:]) #
|
|
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
|
-
|
|
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
|
|
850
|
+
def _xpackages(_xpkg):
|
|
855
851
|
'''(INTERNAL) Check dependency to be excluded.
|
|
856
852
|
'''
|
|
857
|
-
n = _xpkg.__name__[2:] #
|
|
858
|
-
if n in _XPACKAGES:
|
|
859
|
-
|
|
860
|
-
|
|
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
|
-
|
|
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__, #
|
|
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
|
|
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(
|
|
932
|
+
_XPACKAGES = _splituple(_getenv(_PYGEODESY(_xpackages), NN).lower()) # test/bases._X_OK
|
|
936
933
|
|
|
937
934
|
# **) MIT License
|
|
938
935
|
#
|