Name | pygef JSON |
Version |
0.12.1
JSON |
| download |
home_page | None |
Summary | Parse soil measurument data. |
upload_time | 2025-07-22 10:20:50 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. |
keywords |
gef
|
VCS |
 |
bugtrack_url |
|
requirements |
affine
alabaster
asteroid-sphinx-theme
asttokens
attrs
babel
black
certifi
charset-normalizer
click
click-plugins
cligj
contextily
contourpy
coverage
coveralls
cycler
decorator
docopt
docutils
executing
fonttools
gef-file-to-map
geographiclib
geopy
idna
imagesize
iniconfig
ipython
ipython-pygments-lexers
isort
jedi
jinja2
joblib
kiwisolver
lxml
markupsafe
matplotlib
matplotlib-inline
mercantile
mypy-extensions
numpy
packaging
parso
pathspec
pexpect
pillow
platformdirs
pluggy
polars
prompt-toolkit
ptyprocess
pure-eval
pygments
pyparsing
pytest
python-dateutil
rasterio
requests
roman-numerals-py
six
snowballstemmer
sphinx
sphinx-autodoc-typehints
sphinx-rtd-theme
sphinxcontrib-applehelp
sphinxcontrib-devhelp
sphinxcontrib-htmlhelp
sphinxcontrib-jquery
sphinxcontrib-jsmath
sphinxcontrib-qthelp
sphinxcontrib-serializinghtml
stack-data
traitlets
urllib3
wcwidth
xyzservices
|
Travis-CI |
No Travis.
|
coveralls test coverage |
|
# PYGEF
[](https://github.com/ambv/black)
[](https://pypi.org/project/pygef)
[](https://github.com/ritchie46/pygef)
[](https://coveralls.io/github/cemsbv/pygef?branch=master)
Simple parser for \*.gef files. These are ASCII based files used for soil
properties measurements. Compatible with Python 3.9.
Recently added the parsing of xml boreholes file, the xml parsing is still in a
preliminary phase, not all the files are supported. If you find a file that
doesn't work with pygef, please make an issue about it or PR :)
## Installation
Latest stable version:
```sh
pip install pygef
```
Cutting-edge version (might break):
```sh
pip install git+https://github.com/cemsbv/pygef.git
```
## CPT files
```python
>> > from pygef import read_cpt
>> > # read gef and xml files
>> > cpt_data = read_cpt("./my-cpt.xml")
>> > cpt_data
CPTData: {'bro_id': 'CPT000000099543',
'cone_diameter': 44,
'cone_surface_area': 1500,
'cone_surface_quotient': 0.67,
'cone_to_friction_sleeve_distance': 100,
'cone_to_friction_sleeve_surface_area': 22530,
'cone_to_friction_sleeve_surface_quotient': 1.0,
...
'zlm_pore_pressure_u3_after': None,
'zlm_pore_pressure_u3_before': None}
>> > # access the underlying polars DataFrame under the `data` attribute
>> > cpt_data.data.head()
shape: (5, 9)
┌────────────┬───────┬───────────┬────────────┬─────┬────────────┬────────────┬────────────┬────────────┐
│ penetratio ┆ depth ┆ elapsedTi ┆ coneResist ┆ ... ┆ inclinatio ┆ inclinatio ┆ localFrict ┆ frictionRa │
│ nLength ┆ --- ┆ me ┆ ance ┆ ┆ nNS ┆ nResultant ┆ ion ┆ tio │
│ --- ┆ f64 ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │
│ f64 ┆ ┆ f64 ┆ f64 ┆ ┆ i64 ┆ i64 ┆ f64 ┆ f64 │
╞════════════╪═══════╪═══════════╪════════════╪═════╪════════════╪════════════╪════════════╪════════════╡
│ 0.0 ┆ 0.0 ┆ -9.99999
e ┆ -9.99999e5 ┆ ... ┆ -999999 ┆ -999999 ┆ -9.99999e5 ┆ -9.99999e5 │
│ ┆ ┆ 5 ┆ ┆ ┆ ┆ ┆ ┆ │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 0.02 ┆ 0.02 ┆ 11.0 ┆ 2.708 ┆ ... ┆ 0 ┆ 0 ┆ 0.03 ┆ 0.6 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 0.04 ┆ 0.039 ┆ 13.0 ┆ 4.29 ┆ ... ┆ 0 ┆ 0 ┆ 0.039 ┆ 0.8 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 0.06 ┆ 0.059 ┆ 15.0 ┆ 5.124 ┆ ... ┆ 0 ┆ 0 ┆ 0.045 ┆ 0.9 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 0.08 ┆ 0.079 ┆ 17.0 ┆ 5.45 ┆ ... ┆ 0 ┆ 0 ┆ 0.049 ┆ 1.0 │
└────────────┴───────┴───────────┴────────────┴─────┴────────────┴────────────┴────────────┴────────────┘
```
## Bore files
```python
>> > from pygef import read_bore
>> > # read gef and xml files
>> > bore_data = read_bore("./my-bore.xml")
>> > bore_data
BoreData: {'bore_hole_completed': True,
'bore_rock_reached': False,
'data': (13, 8),
'delivered_location': Location(srs_name='urn:ogc:def:crs:EPSG::28992', x=158322.139, y=444864.706),
'delivered_vertical_position_datum': 'nap',
'delivered_vertical_position_offset': 10.773,
'delivered_vertical_position_reference_point': 'maaiveld',
'description_procedure': 'ISO14688d1v2019c2020',
'final_bore_depth': 12.0,
'final_sample_depth': 12.0,
'research_report_date': datetime.date(2021, 10, 19)}
>> > # access the underlying polars DataFrame under the `data` attribute
>> > bore_data.data.head()
shape: (5, 8)
┌────────────┬────────────┬────────────┬──────────┬────────────┬────────────┬────────────┬─────────┐
│ upper_boun ┆ lower_boun ┆ geotechnic ┆ color ┆ dispersed_ ┆ organic_ma ┆ sand_media ┆ soil_di │
│ dary ┆ dary ┆ al_soil_na ┆ --- ┆ inhomogeni ┆ tter_conte ┆ n_class ┆ st │
│ --- ┆ --- ┆ me ┆ str ┆ ty ┆ nt_class ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ --- ┆ ┆ --- ┆ --- ┆ str ┆ list[f6 │
│ ┆ ┆ str ┆ ┆ bool ┆ str ┆ ┆ 4] │
╞════════════╪════════════╪════════════╪══════════╪════════════╪════════════╪════════════╪═════════╡
│ 0.0 ┆ 1.0 ┆ zwakGrindi ┆ donkergr ┆ false ┆ nietOrgani ┆ middelgrof ┆ [0.2, │
│ ┆ ┆ gZand ┆ ijs ┆ ┆ sch ┆ 420
tot630u ┆ 0.0, │
│ ┆ ┆ ┆ ┆ ┆ ┆ m ┆ ... │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 0.0] │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ 1.0 ┆ 1.1 ┆ zwakGrindi ┆ donkergr ┆ false ┆ nietOrgani ┆ middelgrof ┆ [0.2, │
│ ┆ ┆ gZand ┆ ijs ┆ ┆ sch ┆ 420
tot630u ┆ 0.0, │
│ ┆ ┆ ┆ ┆ ┆ ┆ m ┆ ... │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 0.0] │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ 1.1 ┆ 2.0 ┆ zwakZandig ┆ standaar ┆ false ┆ nietOrgani ┆ null ┆ [0.0, │
│ ┆ ┆ eKleiMetGr ┆ dBruin ┆ ┆ sch ┆ ┆ 0.1, │
│ ┆ ┆ ind ┆ ┆ ┆ ┆ ┆ ... │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 0.0] │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ 2.0 ┆ 3.0 ┆ zwakZandig ┆ standaar ┆ false ┆ nietOrgani ┆ null ┆ [0.0, │
│ ┆ ┆ eKlei ┆ dGrijs ┆ ┆ sch ┆ ┆ 0.0, │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ... │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 0.0] │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
│ 3.0 ┆ 4.0 ┆ zwakZandig ┆ donkergr ┆ false ┆ nietOrgani ┆ null ┆ [0.0, │
│ ┆ ┆ eKlei ┆ ijs ┆ ┆ sch ┆ ┆ 0.0, │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ... │
│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 0.0] │
└────────────┴────────────┴────────────┴──────────┴────────────┴────────────┴────────────┴─────────┘
```
## Plotting
To use the plotting functionality pygef needs to be installed with the `[plot]`
feature.
```sh
pip install pygef[plot]
```
```python
from pygef import read_cpt, read_bore
from pygef.plotting import plot_cpt, plot_bore
# plot cpt file
plot_cpt(read_cpt("myfile.xml"))
# plot a bore file
plot_bore(read_bore("myfile.xml"))
```
## Documentation
Build the docs:
```bash
python -m pip install --upgrade pip setuptools
pip install -r requirements.txt
pip install .
sphinx-build -b html docs public
```
## Format
We format our code with black and isort.
```bash
black --config "pyproject.toml" .
isort --settings-path "pyproject.toml" .
```
## Lint
To maintain code quality we use the GitHub super-linter.
To run the linters locally, run the following bash script from the root
directory:
```bash
docker run \
--env VALIDATE_ALL_CODEBASE=true \
--env DEFAULT_BRANCH=master \
--env RUN_LOCAL=true \
--env FIX_PYTHON_ISORT=true \
--env FIX_PYTHON_BLACK=true \
--env FIX_YAML_PRETTIER=true \
--env VALIDATE_JSCPD=false \
--env VALIDATE_CSS=false \
--env VALIDATE_BASH=false \
--env VALIDATE_YAML=false \
--env VALIDATE_PYTHON_PYLINT=false \
--env VALIDATE_NATURAL_LANGUAGE=false \
--env VALIDATE_MARKDOWN=false \
--env LINTER_RULES_PATH=/ \
--env PYTHON_BLACK_CONFIG_FILE=pyproject.toml \
--env PYTHON_ISORT_CONFIG_FILE=pyproject.toml \
--env PYTHON_MYPY_CONFIG_FILE=pyproject.toml \
--env PYTHON_FLAKE8_CONFIG_FILE=.flake8 \
-v $(pwd):/tmp/lint ghcr.io/super-linter/super-linter:v8
```
## UnitTest
Test the software with the use of coverage:
```bash
python -m pip install --upgrade pip setuptools
pip install -r requirements.txt
pip install -e .[test] .[map] .[plot]
coverage run -m pytest
```
## Requirements
Requirements are autogenerated by `pip-compile` with python 3.9
```bash
pip-compile --extra=plot --extra=test --extra=docs --extra=lint --extra=map --output-file=requirements.txt pyproject.toml
```
To update the requirements within the defined ranges, run:
```bash
pip-compile --upgrade --extra=plot --extra=test --extra=docs --extra=lint --extra=map --output-file=requirements.txt pyproject.toml
```
Raw data
{
"_id": null,
"home_page": null,
"name": "pygef",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "gef",
"author": null,
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/96/66/e55e70e5cf8227b1253869dc321cf1a7116f79db4adbc45d6792fa935d3d/pygef-0.12.1.tar.gz",
"platform": null,
"description": "# PYGEF\n\n[](https://github.com/ambv/black)\n[](https://pypi.org/project/pygef)\n[](https://github.com/ritchie46/pygef)\n[](https://coveralls.io/github/cemsbv/pygef?branch=master)\n\nSimple parser for \\*.gef files. These are ASCII based files used for soil\nproperties measurements. Compatible with Python 3.9.\n\nRecently added the parsing of xml boreholes file, the xml parsing is still in a\npreliminary phase, not all the files are supported. If you find a file that\ndoesn't work with pygef, please make an issue about it or PR :)\n\n## Installation\n\nLatest stable version:\n\n```sh\npip install pygef\n```\n\nCutting-edge version (might break):\n\n```sh\npip install git+https://github.com/cemsbv/pygef.git\n```\n\n## CPT files\n\n```python\n>> > from pygef import read_cpt\n>> > # read gef and xml files\n>> > cpt_data = read_cpt(\"./my-cpt.xml\")\n>> > cpt_data\nCPTData: {'bro_id': 'CPT000000099543',\n 'cone_diameter': 44,\n 'cone_surface_area': 1500,\n 'cone_surface_quotient': 0.67,\n 'cone_to_friction_sleeve_distance': 100,\n 'cone_to_friction_sleeve_surface_area': 22530,\n 'cone_to_friction_sleeve_surface_quotient': 1.0,\n ...\n 'zlm_pore_pressure_u3_after': None,\n'zlm_pore_pressure_u3_before': None}\n>> > # access the underlying polars DataFrame under the `data` attribute\n>> > cpt_data.data.head()\nshape: (5, 9)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 penetratio \u2506 depth \u2506 elapsedTi \u2506 coneResist \u2506 ... \u2506 inclinatio \u2506 inclinatio \u2506 localFrict \u2506 frictionRa \u2502\n\u2502 nLength \u2506 --- \u2506 me \u2506 ance \u2506 \u2506 nNS \u2506 nResultant \u2506 ion \u2506 tio \u2502\n\u2502 --- \u2506 f64 \u2506 --- \u2506 --- \u2506 \u2506 --- \u2506 --- \u2506 --- \u2506 --- \u2502\n\u2502 f64 \u2506 \u2506 f64 \u2506 f64 \u2506 \u2506 i64 \u2506 i64 \u2506 f64 \u2506 f64 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 0.0 \u2506 0.0 \u2506 -9.99999\ne \u2506 -9.99999e5 \u2506 ... \u2506 -999999 \u2506 -999999 \u2506 -9.99999e5 \u2506 -9.99999e5 \u2502\n\u2502 \u2506 \u2506 5 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 0.02 \u2506 0.02 \u2506 11.0 \u2506 2.708 \u2506 ... \u2506 0 \u2506 0 \u2506 0.03 \u2506 0.6 \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 0.04 \u2506 0.039 \u2506 13.0 \u2506 4.29 \u2506 ... \u2506 0 \u2506 0 \u2506 0.039 \u2506 0.8 \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 0.06 \u2506 0.059 \u2506 15.0 \u2506 5.124 \u2506 ... \u2506 0 \u2506 0 \u2506 0.045 \u2506 0.9 \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 0.08 \u2506 0.079 \u2506 17.0 \u2506 5.45 \u2506 ... \u2506 0 \u2506 0 \u2506 0.049 \u2506 1.0 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n## Bore files\n\n```python\n>> > from pygef import read_bore\n>> > # read gef and xml files\n>> > bore_data = read_bore(\"./my-bore.xml\")\n>> > bore_data\nBoreData: {'bore_hole_completed': True,\n 'bore_rock_reached': False,\n 'data': (13, 8),\n 'delivered_location': Location(srs_name='urn:ogc:def:crs:EPSG::28992', x=158322.139, y=444864.706),\n 'delivered_vertical_position_datum': 'nap',\n 'delivered_vertical_position_offset': 10.773,\n 'delivered_vertical_position_reference_point': 'maaiveld',\n 'description_procedure': 'ISO14688d1v2019c2020',\n 'final_bore_depth': 12.0,\n 'final_sample_depth': 12.0,\n 'research_report_date': datetime.date(2021, 10, 19)}\n>> > # access the underlying polars DataFrame under the `data` attribute\n>> > bore_data.data.head()\nshape: (5, 8)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 upper_boun \u2506 lower_boun \u2506 geotechnic \u2506 color \u2506 dispersed_ \u2506 organic_ma \u2506 sand_media \u2506 soil_di \u2502\n\u2502 dary \u2506 dary \u2506 al_soil_na \u2506 --- \u2506 inhomogeni \u2506 tter_conte \u2506 n_class \u2506 st \u2502\n\u2502 --- \u2506 --- \u2506 me \u2506 str \u2506 ty \u2506 nt_class \u2506 --- \u2506 --- \u2502\n\u2502 f64 \u2506 f64 \u2506 --- \u2506 \u2506 --- \u2506 --- \u2506 str \u2506 list[f6 \u2502\n\u2502 \u2506 \u2506 str \u2506 \u2506 bool \u2506 str \u2506 \u2506 4] \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 0.0 \u2506 1.0 \u2506 zwakGrindi \u2506 donkergr \u2506 false \u2506 nietOrgani \u2506 middelgrof \u2506 [0.2, \u2502\n\u2502 \u2506 \u2506 gZand \u2506 ijs \u2506 \u2506 sch \u2506 420\ntot630u \u2506 0.0, \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 m \u2506 ... \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 0.0] \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 1.0 \u2506 1.1 \u2506 zwakGrindi \u2506 donkergr \u2506 false \u2506 nietOrgani \u2506 middelgrof \u2506 [0.2, \u2502\n\u2502 \u2506 \u2506 gZand \u2506 ijs \u2506 \u2506 sch \u2506 420\ntot630u \u2506 0.0, \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 m \u2506 ... \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 0.0] \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 1.1 \u2506 2.0 \u2506 zwakZandig \u2506 standaar \u2506 false \u2506 nietOrgani \u2506 null \u2506 [0.0, \u2502\n\u2502 \u2506 \u2506 eKleiMetGr \u2506 dBruin \u2506 \u2506 sch \u2506 \u2506 0.1, \u2502\n\u2502 \u2506 \u2506 ind \u2506 \u2506 \u2506 \u2506 \u2506 ... \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 0.0] \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 2.0 \u2506 3.0 \u2506 zwakZandig \u2506 standaar \u2506 false \u2506 nietOrgani \u2506 null \u2506 [0.0, \u2502\n\u2502 \u2506 \u2506 eKlei \u2506 dGrijs \u2506 \u2506 sch \u2506 \u2506 0.0, \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 ... \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 0.0] \u2502\n\u251c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u253c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u254c\u2524\n\u2502 3.0 \u2506 4.0 \u2506 zwakZandig \u2506 donkergr \u2506 false \u2506 nietOrgani \u2506 null \u2506 [0.0, \u2502\n\u2502 \u2506 \u2506 eKlei \u2506 ijs \u2506 \u2506 sch \u2506 \u2506 0.0, \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 ... \u2502\n\u2502 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 \u2506 0.0] \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n## Plotting\n\nTo use the plotting functionality pygef needs to be installed with the `[plot]`\nfeature.\n\n```sh\npip install pygef[plot]\n```\n\n```python\nfrom pygef import read_cpt, read_bore\nfrom pygef.plotting import plot_cpt, plot_bore\n\n# plot cpt file\nplot_cpt(read_cpt(\"myfile.xml\"))\n\n# plot a bore file\nplot_bore(read_bore(\"myfile.xml\"))\n```\n\n## Documentation\n\nBuild the docs:\n\n```bash\npython -m pip install --upgrade pip setuptools\npip install -r requirements.txt\npip install .\n\nsphinx-build -b html docs public\n```\n\n## Format\n\nWe format our code with black and isort.\n\n```bash\nblack --config \"pyproject.toml\" .\nisort --settings-path \"pyproject.toml\" .\n```\n\n## Lint\n\nTo maintain code quality we use the GitHub super-linter.\n\nTo run the linters locally, run the following bash script from the root\ndirectory:\n\n```bash\ndocker run \\\n--env VALIDATE_ALL_CODEBASE=true \\\n--env DEFAULT_BRANCH=master \\\n--env RUN_LOCAL=true \\\n--env FIX_PYTHON_ISORT=true \\\n--env FIX_PYTHON_BLACK=true \\\n--env FIX_YAML_PRETTIER=true \\\n--env VALIDATE_JSCPD=false \\\n--env VALIDATE_CSS=false \\\n--env VALIDATE_BASH=false \\\n--env VALIDATE_YAML=false \\\n--env VALIDATE_PYTHON_PYLINT=false \\\n--env VALIDATE_NATURAL_LANGUAGE=false \\\n--env VALIDATE_MARKDOWN=false \\\n--env LINTER_RULES_PATH=/ \\\n--env PYTHON_BLACK_CONFIG_FILE=pyproject.toml \\\n--env PYTHON_ISORT_CONFIG_FILE=pyproject.toml \\\n--env PYTHON_MYPY_CONFIG_FILE=pyproject.toml \\\n--env PYTHON_FLAKE8_CONFIG_FILE=.flake8 \\\n-v $(pwd):/tmp/lint ghcr.io/super-linter/super-linter:v8\n```\n\n## UnitTest\n\nTest the software with the use of coverage:\n\n```bash\npython -m pip install --upgrade pip setuptools\npip install -r requirements.txt\npip install -e .[test] .[map] .[plot]\n\ncoverage run -m pytest\n```\n\n## Requirements\n\nRequirements are autogenerated by `pip-compile` with python 3.9\n\n```bash\npip-compile --extra=plot --extra=test --extra=docs --extra=lint --extra=map --output-file=requirements.txt pyproject.toml\n```\n\nTo update the requirements within the defined ranges, run:\n\n```bash\npip-compile --upgrade --extra=plot --extra=test --extra=docs --extra=lint --extra=map --output-file=requirements.txt pyproject.toml\n```\n",
"bugtrack_url": null,
"license": "MIT License\n \n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n \n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n \n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.",
"summary": "Parse soil measurument data.",
"version": "0.12.1",
"project_urls": {
"repository": "https://github.com/cemsbv/pygef"
},
"split_keywords": [
"gef"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "d3a378ab9891a32611e789bfea985deea0193a3c1879bfc4bdad3f6dd3546063",
"md5": "c9ef34d76b084f6e43734934f6793a3f",
"sha256": "268042bc0f61991ef87cdab78bf69160f854d86232b19fa76a509cadee3f0147"
},
"downloads": -1,
"filename": "pygef-0.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c9ef34d76b084f6e43734934f6793a3f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 36364,
"upload_time": "2025-07-22T10:20:48",
"upload_time_iso_8601": "2025-07-22T10:20:48.871810Z",
"url": "https://files.pythonhosted.org/packages/d3/a3/78ab9891a32611e789bfea985deea0193a3c1879bfc4bdad3f6dd3546063/pygef-0.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9666e55e70e5cf8227b1253869dc321cf1a7116f79db4adbc45d6792fa935d3d",
"md5": "afc80f28fe34d3f5c5b7102b35ee6af3",
"sha256": "212b2f95ad0d0490ef58bf2d0891b7245a7beecea706592fdebb987233f8a40a"
},
"downloads": -1,
"filename": "pygef-0.12.1.tar.gz",
"has_sig": false,
"md5_digest": "afc80f28fe34d3f5c5b7102b35ee6af3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 34506,
"upload_time": "2025-07-22T10:20:50",
"upload_time_iso_8601": "2025-07-22T10:20:50.149768Z",
"url": "https://files.pythonhosted.org/packages/96/66/e55e70e5cf8227b1253869dc321cf1a7116f79db4adbc45d6792fa935d3d/pygef-0.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-22 10:20:50",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "cemsbv",
"github_project": "pygef",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [
{
"name": "affine",
"specs": [
[
"==",
"2.4.0"
]
]
},
{
"name": "alabaster",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "asteroid-sphinx-theme",
"specs": [
[
"==",
"0.0.3"
]
]
},
{
"name": "asttokens",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.3.0"
]
]
},
{
"name": "babel",
"specs": [
[
"==",
"2.17.0"
]
]
},
{
"name": "black",
"specs": [
[
"==",
"25.1.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.7.14"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.2"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.2.1"
]
]
},
{
"name": "click-plugins",
"specs": [
[
"==",
"1.1.1.2"
]
]
},
{
"name": "cligj",
"specs": [
[
"==",
"0.7.2"
]
]
},
{
"name": "contextily",
"specs": [
[
"==",
"1.6.2"
]
]
},
{
"name": "contourpy",
"specs": [
[
"==",
"1.3.2"
]
]
},
{
"name": "coverage",
"specs": [
[
"==",
"6.5.0"
]
]
},
{
"name": "coveralls",
"specs": [
[
"==",
"3.3.1"
]
]
},
{
"name": "cycler",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.2.1"
]
]
},
{
"name": "docopt",
"specs": [
[
"==",
"0.6.2"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.21.2"
]
]
},
{
"name": "executing",
"specs": [
[
"==",
"2.2.0"
]
]
},
{
"name": "fonttools",
"specs": [
[
"==",
"4.59.0"
]
]
},
{
"name": "gef-file-to-map",
"specs": [
[
"==",
"0.2.1"
]
]
},
{
"name": "geographiclib",
"specs": [
[
"==",
"2.0"
]
]
},
{
"name": "geopy",
"specs": [
[
"==",
"2.4.1"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "imagesize",
"specs": [
[
"==",
"1.4.1"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "ipython",
"specs": [
[
"==",
"9.4.0"
]
]
},
{
"name": "ipython-pygments-lexers",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "isort",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "jedi",
"specs": [
[
"==",
"0.19.2"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.6"
]
]
},
{
"name": "joblib",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "kiwisolver",
"specs": [
[
"==",
"1.4.8"
]
]
},
{
"name": "lxml",
"specs": [
[
"==",
"6.0.0"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "matplotlib",
"specs": [
[
"==",
"3.10.3"
]
]
},
{
"name": "matplotlib-inline",
"specs": [
[
"==",
"0.1.7"
]
]
},
{
"name": "mercantile",
"specs": [
[
"==",
"1.2.1"
]
]
},
{
"name": "mypy-extensions",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"2.3.1"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"25.0"
]
]
},
{
"name": "parso",
"specs": [
[
"==",
"0.8.4"
]
]
},
{
"name": "pathspec",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "pexpect",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"11.3.0"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.8"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "polars",
"specs": [
[
"==",
"1.31.0"
]
]
},
{
"name": "prompt-toolkit",
"specs": [
[
"==",
"3.0.51"
]
]
},
{
"name": "ptyprocess",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "pure-eval",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.2.3"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.4.1"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "rasterio",
"specs": [
[
"==",
"1.4.3"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.4"
]
]
},
{
"name": "roman-numerals-py",
"specs": [
[
"==",
"3.1.0"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "snowballstemmer",
"specs": [
[
"==",
"3.0.1"
]
]
},
{
"name": "sphinx",
"specs": [
[
"==",
"8.2.3"
]
]
},
{
"name": "sphinx-autodoc-typehints",
"specs": [
[
"==",
"3.2.0"
]
]
},
{
"name": "sphinx-rtd-theme",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "sphinxcontrib-applehelp",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "sphinxcontrib-devhelp",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "sphinxcontrib-htmlhelp",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "sphinxcontrib-jquery",
"specs": [
[
"==",
"4.1"
]
]
},
{
"name": "sphinxcontrib-jsmath",
"specs": [
[
"==",
"1.0.1"
]
]
},
{
"name": "sphinxcontrib-qthelp",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "sphinxcontrib-serializinghtml",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "stack-data",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "traitlets",
"specs": [
[
"==",
"5.14.3"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.13"
]
]
},
{
"name": "xyzservices",
"specs": [
[
"==",
"2025.4.0"
]
]
}
],
"lcname": "pygef"
}