plexus-python-common 1.0.30__tar.gz

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 (82) hide show
  1. plexus_python_common-1.0.30/.editorconfig +80 -0
  2. plexus_python_common-1.0.30/.github/workflows/pr.yml +32 -0
  3. plexus_python_common-1.0.30/.github/workflows/push.yml +38 -0
  4. plexus_python_common-1.0.30/.gitignore +187 -0
  5. plexus_python_common-1.0.30/MANIFEST.in +1 -0
  6. plexus_python_common-1.0.30/PKG-INFO +38 -0
  7. plexus_python_common-1.0.30/README.md +4 -0
  8. plexus_python_common-1.0.30/VERSION +1 -0
  9. plexus_python_common-1.0.30/pyproject.toml +107 -0
  10. plexus_python_common-1.0.30/resources/unittest/jsonutils/dummy.0.jsonl +10 -0
  11. plexus_python_common-1.0.30/resources/unittest/jsonutils/dummy.1.jsonl +10 -0
  12. plexus_python_common-1.0.30/resources/unittest/jsonutils/dummy.2.jsonl +10 -0
  13. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.baz/file.bar.baz +16 -0
  14. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.baz/file.foo.bar +16 -0
  15. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.baz/file.foo.baz +16 -0
  16. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/dir.foo.bar/dir.foo.bar.baz/file.foo.bar.baz +16 -0
  17. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/dir.foo.bar/file.bar.baz +16 -0
  18. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/dir.foo.bar/file.foo.bar +16 -0
  19. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/dir.foo.bar/file.foo.baz +16 -0
  20. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/file.bar +16 -0
  21. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/file.baz +16 -0
  22. plexus_python_common-1.0.30/resources/unittest/s3utils/dir.foo/file.foo +16 -0
  23. plexus_python_common-1.0.30/resources/unittest/s3utils_archive/archive.compressed.zip +0 -0
  24. plexus_python_common-1.0.30/resources/unittest/s3utils_archive/archive.uncompressed.zip +0 -0
  25. plexus_python_common-1.0.30/resources/unittest/shutils/0-dummy +0 -0
  26. plexus_python_common-1.0.30/resources/unittest/shutils/1-dummy +0 -0
  27. plexus_python_common-1.0.30/resources/unittest/shutils/2-dummy +0 -0
  28. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.0.0.jsonl +0 -0
  29. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.0.0.vol-0.jsonl +0 -0
  30. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.0.jsonl +10 -0
  31. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.1.1.jsonl +0 -0
  32. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.1.1.vol-1.jsonl +0 -0
  33. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.1.jsonl +10 -0
  34. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.2.2.jsonl +0 -0
  35. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.2.2.vol-2.jsonl +0 -0
  36. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.2.jsonl +10 -0
  37. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.csv.part0 +0 -0
  38. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.csv.part1 +0 -0
  39. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.csv.part2 +0 -0
  40. plexus_python_common-1.0.30/resources/unittest/shutils/dummy.txt +0 -0
  41. plexus_python_common-1.0.30/setup.cfg +4 -0
  42. plexus_python_common-1.0.30/setup.py +13 -0
  43. plexus_python_common-1.0.30/src/plexus/common/__init__.py +6 -0
  44. plexus_python_common-1.0.30/src/plexus/common/carto/OSMFile.py +259 -0
  45. plexus_python_common-1.0.30/src/plexus/common/carto/OSMNode.py +25 -0
  46. plexus_python_common-1.0.30/src/plexus/common/carto/OSMTags.py +101 -0
  47. plexus_python_common-1.0.30/src/plexus/common/carto/OSMWay.py +24 -0
  48. plexus_python_common-1.0.30/src/plexus/common/carto/__init__.py +11 -0
  49. plexus_python_common-1.0.30/src/plexus/common/pose.py +107 -0
  50. plexus_python_common-1.0.30/src/plexus/common/proj.py +305 -0
  51. plexus_python_common-1.0.30/src/plexus/common/utils/__init__.py +0 -0
  52. plexus_python_common-1.0.30/src/plexus/common/utils/apiutils.py +31 -0
  53. plexus_python_common-1.0.30/src/plexus/common/utils/bagutils.py +215 -0
  54. plexus_python_common-1.0.30/src/plexus/common/utils/config.py +61 -0
  55. plexus_python_common-1.0.30/src/plexus/common/utils/datautils.py +200 -0
  56. plexus_python_common-1.0.30/src/plexus/common/utils/jsonutils.py +92 -0
  57. plexus_python_common-1.0.30/src/plexus/common/utils/ormutils.py +1428 -0
  58. plexus_python_common-1.0.30/src/plexus/common/utils/s3utils.py +751 -0
  59. plexus_python_common-1.0.30/src/plexus/common/utils/shutils.py +234 -0
  60. plexus_python_common-1.0.30/src/plexus/common/utils/sqlutils.py +9 -0
  61. plexus_python_common-1.0.30/src/plexus/common/utils/strutils.py +382 -0
  62. plexus_python_common-1.0.30/src/plexus/common/utils/testutils.py +49 -0
  63. plexus_python_common-1.0.30/src/plexus_python_common.egg-info/PKG-INFO +38 -0
  64. plexus_python_common-1.0.30/src/plexus_python_common.egg-info/SOURCES.txt +80 -0
  65. plexus_python_common-1.0.30/src/plexus_python_common.egg-info/dependency_links.txt +1 -0
  66. plexus_python_common-1.0.30/src/plexus_python_common.egg-info/not-zip-safe +1 -0
  67. plexus_python_common-1.0.30/src/plexus_python_common.egg-info/requires.txt +33 -0
  68. plexus_python_common-1.0.30/src/plexus_python_common.egg-info/top_level.txt +1 -0
  69. plexus_python_common-1.0.30/test/plexus_test.py +13 -0
  70. plexus_python_common-1.0.30/test/plexus_tests/__init__.py +15 -0
  71. plexus_python_common-1.0.30/test/plexus_tests/common/carto/osm_file_test.py +96 -0
  72. plexus_python_common-1.0.30/test/plexus_tests/common/carto/osm_tags_test.py +196 -0
  73. plexus_python_common-1.0.30/test/plexus_tests/common/pose_test.py +66 -0
  74. plexus_python_common-1.0.30/test/plexus_tests/common/proj_test.py +184 -0
  75. plexus_python_common-1.0.30/test/plexus_tests/common/utils/bagutils_test.py +73 -0
  76. plexus_python_common-1.0.30/test/plexus_tests/common/utils/datautils_test.py +38 -0
  77. plexus_python_common-1.0.30/test/plexus_tests/common/utils/jsonutils_test.py +16 -0
  78. plexus_python_common-1.0.30/test/plexus_tests/common/utils/ormutils_test.py +1136 -0
  79. plexus_python_common-1.0.30/test/plexus_tests/common/utils/s3utils_test.py +575 -0
  80. plexus_python_common-1.0.30/test/plexus_tests/common/utils/shutils_test.py +267 -0
  81. plexus_python_common-1.0.30/test/plexus_tests/common/utils/strutils_test.py +828 -0
  82. plexus_python_common-1.0.30/test/plexus_tests/common/utils/testutils_test.py +50 -0
@@ -0,0 +1,80 @@
1
+ root = true
2
+
3
+ [*.py]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+ indent_size = 4
10
+
11
+ ij_python_align_collections_and_comprehensions = true
12
+ ij_python_align_multiline_imports = true
13
+ ij_python_align_multiline_parameters = true
14
+ ij_python_align_multiline_parameters_in_calls = true
15
+ ij_python_blank_line_at_file_end = true
16
+ ij_python_blank_lines_after_imports = 1
17
+ ij_python_blank_lines_after_local_imports = 0
18
+ ij_python_blank_lines_around_class = 1
19
+ ij_python_blank_lines_around_method = 1
20
+ ij_python_blank_lines_around_top_level_classes_functions = 2
21
+ ij_python_blank_lines_before_first_method = 0
22
+ ij_python_call_parameters_new_line_after_left_paren = false
23
+ ij_python_call_parameters_right_paren_on_new_line = false
24
+ ij_python_call_parameters_wrap = normal
25
+ ij_python_dict_alignment = 0
26
+ ij_python_dict_new_line_after_left_brace = false
27
+ ij_python_dict_new_line_before_right_brace = false
28
+ ij_python_dict_wrapping = 1
29
+ ij_python_from_import_new_line_after_left_parenthesis = false
30
+ ij_python_from_import_new_line_before_right_parenthesis = false
31
+ ij_python_from_import_parentheses_force_if_multiline = false
32
+ ij_python_from_import_trailing_comma_if_multiline = false
33
+ ij_python_from_import_wrapping = 1
34
+ ij_python_hang_closing_brackets = false
35
+ ij_python_keep_blank_lines_in_code = 1
36
+ ij_python_keep_blank_lines_in_declarations = 1
37
+ ij_python_keep_indents_on_empty_lines = false
38
+ ij_python_keep_line_breaks = true
39
+ ij_python_method_parameters_new_line_after_left_paren = false
40
+ ij_python_method_parameters_right_paren_on_new_line = false
41
+ ij_python_method_parameters_wrap = normal
42
+ ij_python_new_line_after_colon = false
43
+ ij_python_new_line_after_colon_multi_clause = true
44
+ ij_python_optimize_imports_always_split_from_imports = false
45
+ ij_python_optimize_imports_case_insensitive_order = false
46
+ ij_python_optimize_imports_join_from_imports_with_same_source = false
47
+ ij_python_optimize_imports_sort_by_type_first = true
48
+ ij_python_optimize_imports_sort_imports = true
49
+ ij_python_optimize_imports_sort_names_in_from_imports = true
50
+ ij_python_space_after_comma = true
51
+ ij_python_space_after_number_sign = true
52
+ ij_python_space_after_py_colon = true
53
+ ij_python_space_before_backslash = true
54
+ ij_python_space_before_comma = false
55
+ ij_python_space_before_for_semicolon = false
56
+ ij_python_space_before_lbracket = false
57
+ ij_python_space_before_method_call_parentheses = false
58
+ ij_python_space_before_method_parentheses = false
59
+ ij_python_space_before_number_sign = true
60
+ ij_python_space_before_py_colon = false
61
+ ij_python_space_within_empty_method_call_parentheses = false
62
+ ij_python_space_within_empty_method_parentheses = false
63
+ ij_python_spaces_around_additive_operators = true
64
+ ij_python_spaces_around_assignment_operators = true
65
+ ij_python_spaces_around_bitwise_operators = true
66
+ ij_python_spaces_around_eq_in_keyword_argument = false
67
+ ij_python_spaces_around_eq_in_named_parameter = false
68
+ ij_python_spaces_around_equality_operators = true
69
+ ij_python_spaces_around_multiplicative_operators = true
70
+ ij_python_spaces_around_power_operator = true
71
+ ij_python_spaces_around_relational_operators = true
72
+ ij_python_spaces_around_shift_operators = true
73
+ ij_python_spaces_within_braces = false
74
+ ij_python_spaces_within_brackets = false
75
+ ij_python_spaces_within_method_call_parentheses = false
76
+ ij_python_spaces_within_method_parentheses = false
77
+ ij_python_use_continuation_indent_for_arguments = false
78
+ ij_python_use_continuation_indent_for_collection_and_comprehensions = false
79
+ ij_python_use_continuation_indent_for_parameters = false
80
+ ij_python_wrap_long_lines = false
@@ -0,0 +1,32 @@
1
+ name: Pull Request
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [ "master" ]
6
+
7
+ env:
8
+ BUILD_NUMBER: ${{ github.run_number }}
9
+
10
+ jobs:
11
+ build-python:
12
+ runs-on: ubuntu-latest
13
+ container:
14
+ image: ruyangshou/plexus-basedev-dev-python:latest
15
+ options: --user github
16
+ strategy:
17
+ matrix:
18
+ python-version: [ "3.12", "3.13", "3.14" ]
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Setup Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "${{ matrix.python-version }}"
27
+
28
+ - name: Build and Test
29
+ run: |
30
+ python -m pip install --upgrade pip
31
+ python -m pip install .[test,all]
32
+ python -m pytest . --cov --cov-report xml --cov-config pyproject.toml
@@ -0,0 +1,38 @@
1
+ name: Push
2
+
3
+ on:
4
+ push:
5
+ branches: [ "master" ]
6
+
7
+ env:
8
+ BUILD_NUMBER: ${{ github.run_number }}
9
+
10
+ jobs:
11
+ push:
12
+ runs-on: ubuntu-latest
13
+ container:
14
+ image: ruyangshou/plexus-basedev-dev-python:latest
15
+ options: --user github
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Setup Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.14"
24
+
25
+ - name: Build and Upload
26
+ run: |
27
+ python -m pip install --upgrade pip build twine
28
+ python -m pip install .[test,all]
29
+ python -m pytest . --cov --cov-report xml --cov-config pyproject.toml
30
+ python -m build -sw .
31
+ python -m twine upload --username __token__ --password ${{ secrets.PYPI_TOKEN }} dist/*
32
+
33
+ - name: Upload Coverage Report
34
+ uses: codecov/codecov-action@v5
35
+ with:
36
+ token: ${{ secrets.CODECOV_TOKEN }}
37
+ slug: ${{ github.repository }}
38
+ fail_ci_if_error: true
@@ -0,0 +1,187 @@
1
+ # System junks
2
+ *.[oa]
3
+ *~
4
+ .DS_Store
5
+ Thumbs.db
6
+
7
+ # Git
8
+ .git/
9
+
10
+ # General
11
+ target/
12
+ output/
13
+ build/
14
+ opt/
15
+ gen/
16
+ tmp/
17
+ temp/
18
+
19
+ # IDEs
20
+ *.iml
21
+ .idea/
22
+ .classpath
23
+ .project
24
+ .settings/
25
+ .vscode/
26
+
27
+
28
+ # Byte-compiled / optimized / DLL files
29
+ __pycache__/
30
+ *.py[cod]
31
+ *$py.class
32
+
33
+ # C extensions
34
+ *.so
35
+
36
+ # Distribution / packaging
37
+ .Python
38
+ build/
39
+ develop-eggs/
40
+ dist/
41
+ downloads/
42
+ eggs/
43
+ .eggs/
44
+ lib/
45
+ lib64/
46
+ parts/
47
+ sdist/
48
+ var/
49
+ wheels/
50
+ share/python-wheels/
51
+ *.egg-info/
52
+ .installed.cfg
53
+ *.egg
54
+ MANIFEST
55
+
56
+ # PyInstaller
57
+ # Usually these files are written by a python script from a template
58
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
59
+ *.manifest
60
+ *.spec
61
+
62
+ # Installer logs
63
+ pip-log.txt
64
+ pip-delete-this-directory.txt
65
+
66
+ # Unit test / coverage reports
67
+ htmlcov/
68
+ .tox/
69
+ .nox/
70
+ .coverage
71
+ .coverage.*
72
+ .cache
73
+ nosetests.xml
74
+ coverage.xml
75
+ *.cover
76
+ *.py,cover
77
+ .hypothesis/
78
+ .pytest_cache/
79
+ cover/
80
+
81
+ # Translations
82
+ *.mo
83
+ *.pot
84
+
85
+ # Django stuff:
86
+ *.log
87
+ local_settings.py
88
+ db.sqlite3
89
+ db.sqlite3-journal
90
+
91
+ # Flask stuff:
92
+ instance/
93
+ .webassets-cache
94
+
95
+ # Scrapy stuff:
96
+ .scrapy
97
+
98
+ # Sphinx documentation
99
+ docs/_build/
100
+
101
+ # PyBuilder
102
+ .pybuilder/
103
+ target/
104
+
105
+ # Jupyter Notebook
106
+ .ipynb_checkpoints
107
+
108
+ # IPython
109
+ profile_default/
110
+ ipython_config.py
111
+
112
+ # pyenv
113
+ # For a library or package, you might want to ignore these files since the code is
114
+ # intended to run in multiple environments; otherwise, check them in:
115
+ # .python-version
116
+
117
+ # pipenv
118
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
119
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
120
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
121
+ # install all needed dependencies.
122
+ #Pipfile.lock
123
+
124
+ # poetry
125
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
126
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
127
+ # commonly ignored for libraries.
128
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
129
+ #poetry.lock
130
+
131
+ # pdm
132
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
133
+ #pdm.lock
134
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
135
+ # in version control.
136
+ # https://pdm.fming.dev/#use-with-ide
137
+ .pdm.toml
138
+
139
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
140
+ __pypackages__/
141
+
142
+ # Celery stuff
143
+ celerybeat-schedule
144
+ celerybeat.pid
145
+
146
+ # SageMath parsed files
147
+ *.sage.py
148
+
149
+ # Environments
150
+ .env
151
+ .venv
152
+ env/
153
+ venv/
154
+ ENV/
155
+ env.bak/
156
+ venv.bak/
157
+
158
+ # Spyder project settings
159
+ .spyderproject
160
+ .spyproject
161
+
162
+ # Rope project settings
163
+ .ropeproject
164
+
165
+ # mkdocs documentation
166
+ /site
167
+
168
+ # mypy
169
+ .mypy_cache/
170
+ .dmypy.json
171
+ dmypy.json
172
+
173
+ # Pyre type checker
174
+ .pyre/
175
+
176
+ # pytype static type analyzer
177
+ .pytype/
178
+
179
+ # Cython debug symbols
180
+ cython_debug/
181
+
182
+ # PyCharm
183
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
184
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
185
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
186
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
187
+ #.idea/
@@ -0,0 +1 @@
1
+ include VERSION
@@ -0,0 +1,38 @@
1
+ Metadata-Version: 2.4
2
+ Name: plexus-python-common
3
+ Version: 1.0.30
4
+ Classifier: Programming Language :: Python :: 3
5
+ Classifier: Programming Language :: Python :: 3.12
6
+ Classifier: Programming Language :: Python :: 3.13
7
+ Classifier: Programming Language :: Python :: 3.14
8
+ Requires-Python: <3.15,>=3.12
9
+ Requires-Dist: aiobotocore<2.27,>=2.26
10
+ Requires-Dist: boto3<1.42,>=1.41
11
+ Requires-Dist: boto3-stubs<1.42,>=1.41
12
+ Requires-Dist: cloudpathlib>=0.21
13
+ Requires-Dist: fsspec>=2025.10
14
+ Requires-Dist: lxml>=6.0
15
+ Requires-Dist: numpy>=2.3
16
+ Requires-Dist: pydantic>=2.8
17
+ Requires-Dist: pygeodesy>=24.10
18
+ Requires-Dist: pyparsing>=3.2
19
+ Requires-Dist: pyproj>=3.6
20
+ Requires-Dist: pyquaternion>=0.9
21
+ Requires-Dist: sqlalchemy>=2.0
22
+ Requires-Dist: s3fs>=2025.10
23
+ Requires-Dist: rich>=13.9
24
+ Requires-Dist: textcase>=0.4
25
+ Requires-Dist: ujson>=5.9
26
+ Requires-Dist: iker-python-common[all]>=1.0
27
+ Provides-Extra: all
28
+ Requires-Dist: plexus-python-common[api]; extra == "all"
29
+ Provides-Extra: api
30
+ Requires-Dist: fastapi>=0.119.0; extra == "api"
31
+ Requires-Dist: sqlmodel>=0.0.25; extra == "api"
32
+ Provides-Extra: test
33
+ Requires-Dist: ddt>=1.7; extra == "test"
34
+ Requires-Dist: moto[s3,server]>=5.1; extra == "test"
35
+ Requires-Dist: pytest-cov>=5.0; extra == "test"
36
+ Requires-Dist: pytest-order>=1.3; extra == "test"
37
+ Requires-Dist: pytest-postgresql>=6.1; extra == "test"
38
+ Requires-Dist: pytest>=8.3; extra == "test"
@@ -0,0 +1,4 @@
1
+ # Plexus Python Common Module
2
+
3
+ [![codecov](https://codecov.io/gh/ruyangshou/plexus-python-common/graph/badge.svg?token=U8EPB2JZ70)](
4
+ https://codecov.io/gh/ruyangshou/plexus-python-common)
@@ -0,0 +1 @@
1
+ 1.0
@@ -0,0 +1,107 @@
1
+ [build-system]
2
+ requires = [
3
+ "setuptools>=80.0",
4
+ "setuptools-scm>=9.0",
5
+ "iker-python-setup>=1.0",
6
+ ]
7
+ build-backend = "setuptools.build_meta"
8
+
9
+ [dependency-groups]
10
+ dev = [
11
+ "aiobotocore>=2.26,<2.27",
12
+ "boto3>=1.41,<1.42",
13
+ "boto3-stubs>=1.41,<1.42",
14
+ "cloudpathlib>=0.21",
15
+ "fsspec>=2025.10",
16
+ "lxml>=6.0",
17
+ "numpy>=2.3",
18
+ "pydantic>=2.8",
19
+ "pygeodesy>=24.10",
20
+ "pyparsing>=3.2",
21
+ "pyproj>=3.6",
22
+ "pyquaternion>=0.9",
23
+ "sqlalchemy>=2.0",
24
+ "s3fs>=2025.10",
25
+ "rich>=13.9",
26
+ "textcase>=0.4",
27
+ "ujson>=5.9",
28
+ "iker-python-common[all]>=1.0",
29
+ ]
30
+ api = [
31
+ "fastapi>=0.119.0",
32
+ "sqlmodel>=0.0.25",
33
+ ]
34
+ test = [
35
+ "ddt>=1.7",
36
+ "moto[server,s3]>=5.1",
37
+ "pytest-cov>=5.0",
38
+ "pytest-order>=1.3",
39
+ "pytest-postgresql>=6.1",
40
+ "pytest>=8.3",
41
+ ]
42
+
43
+ [project]
44
+ name = "plexus-python-common"
45
+ dynamic = ["version"]
46
+ requires-python = ">=3.12,<3.15"
47
+ classifiers = [
48
+ "Programming Language :: Python :: 3",
49
+ "Programming Language :: Python :: 3.12",
50
+ "Programming Language :: Python :: 3.13",
51
+ "Programming Language :: Python :: 3.14",
52
+ ]
53
+ dependencies = [
54
+ "aiobotocore>=2.26,<2.27",
55
+ "boto3>=1.41,<1.42",
56
+ "boto3-stubs>=1.41,<1.42",
57
+ "cloudpathlib>=0.21",
58
+ "fsspec>=2025.10",
59
+ "lxml>=6.0",
60
+ "numpy>=2.3",
61
+ "pydantic>=2.8",
62
+ "pygeodesy>=24.10",
63
+ "pyparsing>=3.2",
64
+ "pyproj>=3.6",
65
+ "pyquaternion>=0.9",
66
+ "sqlalchemy>=2.0",
67
+ "s3fs>=2025.10",
68
+ "rich>=13.9",
69
+ "textcase>=0.4",
70
+ "ujson>=5.9",
71
+ "iker-python-common[all]>=1.0",
72
+ ]
73
+
74
+ [project.optional-dependencies]
75
+ all = [
76
+ "plexus-python-common[api]",
77
+ ]
78
+ api = [
79
+ "fastapi>=0.119.0",
80
+ "sqlmodel>=0.0.25",
81
+ ]
82
+ test = [
83
+ "ddt>=1.7",
84
+ "moto[server,s3]>=5.1",
85
+ "pytest-cov>=5.0",
86
+ "pytest-order>=1.3",
87
+ "pytest-postgresql>=6.1",
88
+ "pytest>=8.3",
89
+ ]
90
+
91
+ [tool.setuptools]
92
+ package-dir = { "" = "src" }
93
+ zip-safe = false
94
+ include-package-data = true
95
+
96
+ [tool.setuptools.packages.find]
97
+ where = ["src"]
98
+ namespaces = true
99
+
100
+ [tool.pytest.ini_options]
101
+ pythonpath = ["src"]
102
+
103
+ [tool.coverage.run]
104
+ branch = true
105
+ include = [
106
+ "src/plexus/*",
107
+ ]
@@ -0,0 +1,10 @@
1
+ {"file": "dummy.0.jsonl"}
2
+ {"file": "dummy.0.jsonl"}
3
+ {"file": "dummy.0.jsonl"}
4
+ {"file": "dummy.0.jsonl"}
5
+ {"file": "dummy.0.jsonl"}
6
+ {"file": "dummy.0.jsonl"}
7
+ {"file": "dummy.0.jsonl"}
8
+ {"file": "dummy.0.jsonl"}
9
+ {"file": "dummy.0.jsonl"}
10
+ {"file": "dummy.0.jsonl"}
@@ -0,0 +1,10 @@
1
+ {"file": "dummy.1.jsonl"}
2
+ {"file": "dummy.1.jsonl"}
3
+ {"file": "dummy.1.jsonl"}
4
+ {"file": "dummy.1.jsonl"}
5
+ {"file": "dummy.1.jsonl"}
6
+ {"file": "dummy.1.jsonl"}
7
+ {"file": "dummy.1.jsonl"}
8
+ {"file": "dummy.1.jsonl"}
9
+ {"file": "dummy.1.jsonl"}
10
+ {"file": "dummy.1.jsonl"}
@@ -0,0 +1,10 @@
1
+ {"file": "dummy.2.jsonl"}
2
+ {"file": "dummy.2.jsonl"}
3
+ {"file": "dummy.2.jsonl"}
4
+ {"file": "dummy.2.jsonl"}
5
+ {"file": "dummy.2.jsonl"}
6
+ {"file": "dummy.2.jsonl"}
7
+ {"file": "dummy.2.jsonl"}
8
+ {"file": "dummy.2.jsonl"}
9
+ {"file": "dummy.2.jsonl"}
10
+ {"file": "dummy.2.jsonl"}
@@ -0,0 +1,16 @@
1
+ a8a02100e9c056a268ab37eab24e779e48fede1876b84ed3c7ca8ab85deeaeca
2
+ 79e97fdca8f0654e868cc8df06cf6b6cfe9d462c840711dbf42a8607919701a7
3
+ 77c3748acb005e2f629a80b8040163365f37804d4b0e174ddb1ecf3a535397ec
4
+ 0491153226b97cad16810e00e29af54141390b3778902ca5bf10636f0ceb4517
5
+ 4c087fe45d4da13a4098a4d28429d4db44cffd5a1e74712e153528235ea4edae
6
+ a6e92325d196f396e47b2359de8b8f42616dac799c2f902fa65af403b1b5f4da
7
+ 20ba5f1f9d22c9b872fe6fac9d1826fb8a25555dbc0c365e627c83413b33ec54
8
+ 8c2d17b8fd807064690e467a504e62488f122816dfe6633c12e7e5c602731c1f
9
+ ea71cc5db9bc57291b342c7c57aca7efb0cdb4d483408e624e4784c46b5e6387
10
+ 03a9459c9d51a456256496cd5c4b869e9a9938554deab6d00d35757690b0e8eb
11
+ 1e3559627ab862dc5c2d484df8de62e5e688be5be6dc153fc6708c1204767c80
12
+ bb59ca780800c5ac88ba97d16df06d655f6378c8e4ed72b0e56035453bb29780
13
+ 56d8c93fa7ac72d3609db5b950dac47da6e93c275f5138b32278ddde0c337ee6
14
+ ea69fa60b4b36a8cf4d474e434ace98326f08e7cc0d3875b49c83c250a596ce6
15
+ 123607bc959c2db77828d2b42f1b05f53a4a8b7e6a74a496f85d23f7ec743cf5
16
+ 6b9aa2ff76e89a810e8ff6371ddf3b72084a03296b75a590b47593d53dec3486
@@ -0,0 +1,16 @@
1
+ 720d2bd3a25198a16f64ac3d4d1f8df7f557e9b35acc9d5581a8f3af82ce60ed
2
+ 79528118740a4d2b64448d079323f4d60b1d388999952971fcb11433bfc7cf13
3
+ f854de5075f0f11bdf7e3169e9b0a4e8cf30debfca55074fb81e6ffd19610290
4
+ ac16db129fca95347325c4a28aceac1b41cca825e817aa15b69bde06305246c4
5
+ 186f694795ff0205ce5394ee94158da39166dbb78013476e10044cabc4ae01e1
6
+ 26f7b3fa2999bb6f0f43e3deec6f31dbdd3d012136e31993c346ba3f9228318d
7
+ 9f6003a457daba22c887e7bacc384096318f9a1b51f7bf54fa73eccf9141e4a1
8
+ 4e067207135567f319705905488a4dea20b4190072cc28749508b521467cfd9c
9
+ 857e5f626be43bd9ee17d291bfdcbc1b9ec806f6a248c906d11dbeb9727fc540
10
+ 9ca0c7711187895faea3d80434b02765bf9734e70d6996c0e85c8bb9cf43997a
11
+ ec3a8d2f8d1d2ad1b6b7df73d5fb0e70cee35e201c05fc601bf2e3646239504f
12
+ 4081ca757b01665e5165768db772d1df533232e207352dc22f7dfc1dbbc5177f
13
+ 2137c93ef01ea7020cd35c8d23c765618a7df1f68182cd2173b2ef78605b46ea
14
+ 0d5f72293e7cfe60d72fd8679b6245ccf9c6a02cf6c3ed22ed8bd4e936cb8b51
15
+ 0bad89c9fb578259d11a9a63e33a387bafbe2e77691b4a978e9ebbf0c1ebe9bd
16
+ 3ed28d1e72df01fcaf3bec7684f4a4e98e9034a90752e3f56129041a24bf90c9
@@ -0,0 +1,16 @@
1
+ 5e8cc51ab1aefd7a4e94d9694e520781035da2599e1bc9f8027bdce7ff38e071
2
+ 42f3d72ba0ce14e7677cc82f032d83e067988de918be1939ec92fb5345eacea0
3
+ 756c2890ee1ad7728a3a37a6152e70395a4175f0875df36c28db779b33a2465d
4
+ 5b7ddc909a5222a3104c735aca5fbb9664eff539881df9758ba57ec29eac190e
5
+ 38c2ad30436156b4097460462f886c2435aff974a890d8202450316ec1a4ccad
6
+ 0adf70c9d2e17a07e3ba5d5de40e2a76b97007da009bf71b07c4f2369e27a340
7
+ 053604687953985c938395d4e7a3ae51c4bbebb89c3fa8c62d77ce5b6fad6a74
8
+ 88ab13123bbfe44bc0feddac059f8c71ecb2ad43972f45b74c90d48cf1a66b45
9
+ 3ff068ee5fcab4e5de968a8effd4d51b051ab90f8998dc5ddaa35539ed31f822
10
+ b875296acfc49ce62e8a26d725a022116c1befc5ad154883d0a8071bf7704a57
11
+ b429b69be4616306dd65c5c4ebdef07a75aa51e9e272fed96175f17419a73e88
12
+ 7a00211dc02e8c6f912d3823a4867841a0728495fa290066c843490e746a44ac
13
+ 222d0a014c9d8a247e9ffd3386c188d402ed21c3037fad84a72d27e0d55d220a
14
+ c78d7bb8b44bd0c4952f2628670820d2063eab056d089aa5623f06c675eac41a
15
+ 16ba9040e748ab4e36a5d66ec59c6a54448cc4e23c75462d2cf10e9443cdb23f
16
+ 9ee130f144ae1964f85756b1af88c7971a909c37b42773fee5fa59beab8ae476
@@ -0,0 +1,16 @@
1
+ d4ea1f50310c6b388dc05225fb144edc2309fcc170578e03d21551d62f6c529b
2
+ d8697d566d84fbe32a6612c9ea7f29d9fbb9580fa94a227985a85127790ab1d5
3
+ 56532a34324d071c42d022594b04541591082c1e01eeb7f3117a9b0b0b597dca
4
+ 0b3a5a6dd4d29e749070632d0bb6efe21545d03a2a83a56be09263c61e7996b3
5
+ dfa9efd413d8b14bfe5ef2266a9bcc7bcb759366d83b52a47757c7eb3b83305a
6
+ 4363131c70131bff160c87d485678a7625ffe84ddf8afe26081f6976bfd9e1de
7
+ 4b08b08f541163376b1b6324e898f6e064895dfb577f27eb6da51cf72fdda1c1
8
+ 2955bdafdb1e25911d18d46b299dc2d1bb758864b12b0f994e8edb7413989152
9
+ 084b742162bd2be14cdec84a1c4d066777258ada62013614d0e35285c299ed20
10
+ 3091bc434a9db50a33d3e40c517fb1eefa206fb4fd6a049541391d80f6d292ac
11
+ 20aaf8f7c29a4dd3395da27a4d389edd3907c6e30808be383bc5b1836e18887b
12
+ 721c980d5dc32db0af11bb834e7e1bebd7f1cf43fbd328cc2c06c71e6a629bd9
13
+ ce0ffb63bc50c92eb33f2e90412820d06ba87ffab6b99b6090a96cf25ec8400c
14
+ c5371b421e9037d5c2f9ec492cf50c624dc2b364a55f3532285d966f777957ed
15
+ 773325da337c54ff631d578b56f961992cb199208a08e02ab0bd7e18acd9cddc
16
+ dfec79db0381280f712129945e2f1f1c1b6d8af4f97363d9786b71a4ec0ba3e7
@@ -0,0 +1,16 @@
1
+ 21f8bb48cae63d93c007ce3c01867c05d98b6f54dcb1271dbfa868928dd908d1
2
+ f0a95b295397d5c5179ffb6db6768c78071468e03f3b28ae050f4ba71c1fb573
3
+ b8b32ffaff720fc59abb293e444668efd2cba500f9718b899992a4bedbda9ca2
4
+ 564c5f8c6ffaeeacc11648f7081e313d220058b7bc4e224f4ae3665de61b3407
5
+ f1b494e6a9e51787e75551e5eab78b65267921dbac0612425cd56e6fb5160541
6
+ d00833db2ead9c2e0959f7d4df3d721eca01a5378c6b5be427427c9ccfddda3c
7
+ 2345e4cde221e719df5a98c5cddcd226c1955eaaa381a790a9ed31bdccc31561
8
+ 9079a1071adae4bb5d92a6b14fcc31f30295843eb05a76d097f83b3e5a91bdfd
9
+ 08c0c7bdeb84b14aa61fa197ee2e1d3ca587380956f9d78e9cb54063328d1db2
10
+ dce9a86dee30cf11516a520e000f962a4285400cfb3534815b7ffaf570021ddb
11
+ 558b83ae432c6d84c3ff41682cabcd009405a6eed44fad326b19b4449f12dc2f
12
+ 994735e737cf223b5c35bf91ddf615f9ede92866861ebf00c5adc99f85e281be
13
+ 3d2fb05abf258f7086df1adaa9b1153dcbd97421afddc1840f236146d4a061d6
14
+ 9045c587beb27ec7e0bdccdb01c322943c6c3f41dc3e64b73c4ce087e6cdbf71
15
+ 2bcde27e4a4c3c353de550dd05221b2739c076b11230fc1e28d7b4ea5781308a
16
+ 1cd0ed94e53172dcad4350801b1bdb2a9eb1906661c803f62adce0b60a040918
@@ -0,0 +1,16 @@
1
+ da047c10deb537fc9054e886d0caca5ddbd92b50e4addb7aeb1671a59672082d
2
+ 77084de68a0d90919280ec6783ab81766f492a88b1389252431f2583c0eefaf5
3
+ e6748050831576d0af305351847a746f4db843bd8b86dd16d376ebffd45af99e
4
+ 33bf4bc21ce7f6325d16495742bb0387a872deb16944ec91d59cf3c2509ffa27
5
+ 7f28f5bb1b8bcaf10419ee1b153ba5f10f45fd6ea033ce73a5e79c22398c6431
6
+ 81de68c34767beb3a569dcfbd6da6299a23048734f9ef6f4b90c8a7f7f796a38
7
+ 4aa0531b7c4ccabf176a62db435d2481a60cce01b8bc2b34c9d93200c105ba01
8
+ 317300d8fe7fc932eddc2e92530979021a429daf17e3506f9e8d2c8317d21c7d
9
+ 0ec23d1c56a22737be5a1f41741b1fa4e6c17964d262b53eb4a87bd8bda46f06
10
+ 3b57ae7bddcc2ea032fdef3584f1784996005517d86852a1a8552694360ae4c3
11
+ adf1a0526704165a4ed38697b40bba6b934fa0c4fcd184554eee9b60dc5e6dc9
12
+ 6a811e36305b8c5f6dd643b3475834eb4c01ef8eda4996d766652479c1064d9c
13
+ 1cf2fc65c25841156b9b40d37137c1d8be316ae656263e5bb80c78a5bd99e50e
14
+ 63298b9ebbd015a76dd4569cfed1c79d300fdec01b642301c05b43299114bd18
15
+ db0778ab7ce627f304206b0cb2b0084ea5de89a7e1076dbe003d311b293d3367
16
+ 1cef389f7e94e5b4fdb49bf34049acbe1409c4542a8a2002c082bcbcf00c2228
@@ -0,0 +1,16 @@
1
+ edc463c935e9c4cf8cff3ad1e825ab90a63019daa233aebd248074556f219e77
2
+ e27cab488b83b915437a6d485b59d6902c5136a1da816515c463bc1dc1574b10
3
+ 7f3df81ebebc9f14998395f6075c55d34cd17f5c8df18b59d036b52e007c5ecf
4
+ 532bce7d2486aec458c94227c0564eebf18b726a67572c98efb812362e539798
5
+ a2dc7c9a3c2500d9b025a3c2f43ec0a540d0f8c9292a31876f3d8dc7a9bf4768
6
+ d1fee3fc1335a8f4e0ffd788ceca90991e0a08a01ab8bc8e59d4e0517a1ed239
7
+ 6ea15f2d28cb31b9d163eb46431ea5600b779eda1843ebc8f640058382b8a96f
8
+ 0007192199c1bd90af17b4fcab5997930e442b2f96a0d274a6c838c07508a2d0
9
+ 4a06289b76f6ea0cf3207864fe727b06e44fffc4584f82c334b4f427471dedbb
10
+ 8aadced49b1d8c565c55892e4fa8134295b41ce24da100d0884b2586f66a5a37
11
+ a241d8c926cbbb2c2edcf216c6fe4fb8c8510ddedf6a21720abf27f448b9acd3
12
+ f788780fd9290f471d03503a75442a53824a73d44c810b39eee7e9cb1d7f6b8b
13
+ 3afe9173afd8541f243070250b07fc9188c30fae04fc6ca1ab10ceb45fafa39a
14
+ cc290a6a790d85371c05a13700e1cf59bec66e2707b94647983d4f0ef8dd8fb6
15
+ 54caa6a8178c01d79a8dda3bf98cb3c9b1a2394e483bfa4451627beb4b79cb5e
16
+ a710a46c3fd1857352c15b9cf65dba498ea8de14e21db09d8a1c9db9ac8591ea
@@ -0,0 +1,16 @@
1
+ e03b7b0d2dd60cd95fe7da8340ef3ebc6ed61921c0eb78a622113fa92b741378
2
+ 8cc77d74e7f266431bd5d938a3f595fddce4ff0bba40c73ad01162ce713c441d
3
+ c4e1e6b47236b80933fa20dd6d4036a72e961bdfee48fe1662a13f7c6d8e4d5b
4
+ 88bd23e9985c981a15bdb5e9046f518df2fba2fc3dd31761e69d987055e48892
5
+ 6a64664ab144a1404bbae297a13d376af4c36bd9b54fda06a18b5f5c1fe50d29
6
+ 5b8a2faf3e8b4c84af5bfbeb00c2f0ff0d460fd85e95064025b41cfafe72a980
7
+ 291ee31de42225c131ac95fdeae55c27e9eddd955465f015f3bcfb7344f6cdbc
8
+ 9175db19869c296308cacd445bbe6cf86143a0f3507b107ffd92762aa315bd3d
9
+ 0db30480b8f6b71562c00be807c0f79beab1cda8b460677e6cc228d69d0fc314
10
+ 9168239614522f5935235834af42fbee5f05ad2211f59942a0a53e0c6629257c
11
+ 3455fa92f90751bb8a42a826e4de9a2c829c24f7e15422b9b78724c2d4d0f46f
12
+ 7bde7a79971d85d2834fcf5856c89360f1958415aa61cd4030db39a66209b5f2
13
+ fb47ac2282808dea1990d681a9e3f60f18b9c792fcc13b28d43d874c5ddf02c1
14
+ 2255496fdcc29fc436edd156922bbd03e5222166e33596d74238fca8a57325a7
15
+ a2a5799e7d22f58030de160af13bab3a8b6f108c224324fec6140f955b99a0e1
16
+ 6653ed7f620088a543073fbacb59b9caf046550a82b8c0bd9e9d5c3275e23b39