isomap-desktop 0.2.0__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.
- isomap_desktop-0.2.0/.coderabbit.yaml +2 -0
- isomap_desktop-0.2.0/.gitattributes +2 -0
- isomap_desktop-0.2.0/.github/workflows/ci.yml +53 -0
- isomap_desktop-0.2.0/.github/workflows/release.yml +130 -0
- isomap_desktop-0.2.0/.gitignore +84 -0
- isomap_desktop-0.2.0/.gitlab-ci.yml +10 -0
- isomap_desktop-0.2.0/.pre-commit-config.yaml +14 -0
- isomap_desktop-0.2.0/CHANGELOG.md +66 -0
- isomap_desktop-0.2.0/PKG-INFO +135 -0
- isomap_desktop-0.2.0/README.md +104 -0
- isomap_desktop-0.2.0/USER_GUIDE.md +188 -0
- isomap_desktop-0.2.0/data/schemas/isoarch_v1.json +19 -0
- isomap_desktop-0.2.0/data/schemas/lipd.json +32 -0
- isomap_desktop-0.2.0/data/schemas/neotoma_v2.json +19 -0
- isomap_desktop-0.2.0/data/schemas/noaa.json +29 -0
- isomap_desktop-0.2.0/data/schemas/pangaea.json +29 -0
- isomap_desktop-0.2.0/data/templates/essd_template.tex +27 -0
- isomap_desktop-0.2.0/docs/PLAN.md +659 -0
- isomap_desktop-0.2.0/docs/SCOPE.md +354 -0
- isomap_desktop-0.2.0/docs/images/column_mapping.png +0 -0
- isomap_desktop-0.2.0/docs/images/import_wizard.png +0 -0
- isomap_desktop-0.2.0/docs/images/map_preview.png +0 -0
- isomap_desktop-0.2.0/docs/images/validation_report.png +0 -0
- isomap_desktop-0.2.0/docs/research-papers/Data Standardization Tool Research.md +411 -0
- isomap_desktop-0.2.0/docs/research-papers/Paleoecological Data Standardization Research.md +286 -0
- isomap_desktop-0.2.0/docs/research-papers/v2_v3_research_dossier.md +53 -0
- isomap_desktop-0.2.0/docs/research-prompts/01_neotoma_submission_process.txt +12 -0
- isomap_desktop-0.2.0/docs/research-prompts/02_isoarch_isomemo_submission.txt +12 -0
- isomap_desktop-0.2.0/docs/research-prompts/03_taxonomic_authority_apis.txt +12 -0
- isomap_desktop-0.2.0/docs/research-prompts/04_isotopic_data_quality_standards.txt +12 -0
- isomap_desktop-0.2.0/docs/research-prompts/05_column_name_matching_algorithms.txt +12 -0
- isomap_desktop-0.2.0/docs/research-prompts/06_pangaea_and_other_repositories.txt +12 -0
- isomap_desktop-0.2.0/docs/research-prompts/07_supp_reproducible_data_transformation.txt +13 -0
- isomap_desktop-0.2.0/docs/research-prompts/IsoMap_prompt_A +132 -0
- isomap_desktop-0.2.0/docs/scope.md +105 -0
- isomap_desktop-0.2.0/pyproject.toml +51 -0
- isomap_desktop-0.2.0/scripts/build-sidecar.sh +57 -0
- isomap_desktop-0.2.0/scripts/generate_test_data.py +24 -0
- isomap_desktop-0.2.0/scripts/isomap-sidecar.spec +69 -0
- isomap_desktop-0.2.0/scripts/scibert_export.py +38 -0
- isomap_desktop-0.2.0/src/isomap/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/core/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/core/chronology.py +100 -0
- isomap_desktop-0.2.0/src/isomap/core/datapaper.py +59 -0
- isomap_desktop-0.2.0/src/isomap/core/exporter.py +251 -0
- isomap_desktop-0.2.0/src/isomap/core/importer.py +60 -0
- isomap_desktop-0.2.0/src/isomap/core/mapper.py +146 -0
- isomap_desktop-0.2.0/src/isomap/core/provenance.py +110 -0
- isomap_desktop-0.2.0/src/isomap/core/spatial.py +105 -0
- isomap_desktop-0.2.0/src/isomap/core/taxonomy.py +0 -0
- isomap_desktop-0.2.0/src/isomap/core/validator.py +141 -0
- isomap_desktop-0.2.0/src/isomap/export/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/export/isoarch.py +0 -0
- isomap_desktop-0.2.0/src/isomap/export/lipd.py +0 -0
- isomap_desktop-0.2.0/src/isomap/export/neotoma.py +0 -0
- isomap_desktop-0.2.0/src/isomap/export/pangaea.py +0 -0
- isomap_desktop-0.2.0/src/isomap/main.py +173 -0
- isomap_desktop-0.2.0/src/isomap/matching/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/matching/distribution.py +74 -0
- isomap_desktop-0.2.0/src/isomap/matching/exact.py +37 -0
- isomap_desktop-0.2.0/src/isomap/matching/fuzzy.py +48 -0
- isomap_desktop-0.2.0/src/isomap/matching/preferences.py +90 -0
- isomap_desktop-0.2.0/src/isomap/matching/semantic.py +109 -0
- isomap_desktop-0.2.0/src/isomap/matching/valentine_matcher.py +60 -0
- isomap_desktop-0.2.0/src/isomap/models/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/models/dataset.py +0 -0
- isomap_desktop-0.2.0/src/isomap/models/log.py +0 -0
- isomap_desktop-0.2.0/src/isomap/models/mapping.py +0 -0
- isomap_desktop-0.2.0/src/isomap/models/validation.py +0 -0
- isomap_desktop-0.2.0/src/isomap/schemas/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/schemas/registry.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/gbif.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/itis.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/neotoma.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/offline.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/pbdb.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/resolver.py +0 -0
- isomap_desktop-0.2.0/src/isomap/taxonomy/worms.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/__init__.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/carbonate.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/collagen.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/isotopic.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/report.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/schemas.py +0 -0
- isomap_desktop-0.2.0/src/isomap/validation/spatial.py +0 -0
- isomap_desktop-0.2.0/test.zip +0 -0
- isomap_desktop-0.2.0/tests/conftest.py +0 -0
- isomap_desktop-0.2.0/tests/integration/test_isoarch_workflow.py +0 -0
- isomap_desktop-0.2.0/tests/integration/test_neotoma_workflow.py +0 -0
- isomap_desktop-0.2.0/tests/test_core_chronology.py +45 -0
- isomap_desktop-0.2.0/tests/test_core_exporter.py +55 -0
- isomap_desktop-0.2.0/tests/test_core_exporter_lipd.py +50 -0
- isomap_desktop-0.2.0/tests/test_core_exporter_templates.py +45 -0
- isomap_desktop-0.2.0/tests/test_core_mapper.py +101 -0
- isomap_desktop-0.2.0/tests/test_core_provenance.py +35 -0
- isomap_desktop-0.2.0/tests/test_core_spatial.py +60 -0
- isomap_desktop-0.2.0/tests/test_core_validator.py +66 -0
- isomap_desktop-0.2.0/tests/test_data/legacy_data.csv +11 -0
- isomap_desktop-0.2.0/tests/test_e2e.py +70 -0
- isomap_desktop-0.2.0/tests/test_exporter.py +0 -0
- isomap_desktop-0.2.0/tests/test_importer.py +40 -0
- isomap_desktop-0.2.0/tests/test_mapper.py +28 -0
- isomap_desktop-0.2.0/tests/test_rpc.py +36 -0
- isomap_desktop-0.2.0/tests/test_taxonomy.py +0 -0
- isomap_desktop-0.2.0/tests/test_validator.py +0 -0
- isomap_desktop-0.2.0/ui/.gitignore +24 -0
- isomap_desktop-0.2.0/ui/README.md +7 -0
- isomap_desktop-0.2.0/ui/e2e/app.spec.ts +157 -0
- isomap_desktop-0.2.0/ui/index.html +14 -0
- isomap_desktop-0.2.0/ui/package-lock.json +2239 -0
- isomap_desktop-0.2.0/ui/package.json +31 -0
- isomap_desktop-0.2.0/ui/playwright.config.ts +25 -0
- isomap_desktop-0.2.0/ui/public/tauri.svg +6 -0
- isomap_desktop-0.2.0/ui/public/vite.svg +1 -0
- isomap_desktop-0.2.0/ui/src/App.css +117 -0
- isomap_desktop-0.2.0/ui/src/App.tsx +222 -0
- isomap_desktop-0.2.0/ui/src/api/sidecar.ts +169 -0
- isomap_desktop-0.2.0/ui/src/assets/react.svg +1 -0
- isomap_desktop-0.2.0/ui/src/components/ChronologyReview/ChronologyReview.tsx +71 -0
- isomap_desktop-0.2.0/ui/src/components/ColumnMapper/ColumnMapper.tsx +144 -0
- isomap_desktop-0.2.0/ui/src/components/ErrorBoundary.tsx +45 -0
- isomap_desktop-0.2.0/ui/src/components/ExportPanel/ExportPanel.tsx +144 -0
- isomap_desktop-0.2.0/ui/src/components/ImportWizard/ImportWizard.tsx +132 -0
- isomap_desktop-0.2.0/ui/src/components/MapPreview/MapPreview.tsx +116 -0
- isomap_desktop-0.2.0/ui/src/components/ValidationReport/ValidationReport.tsx +88 -0
- isomap_desktop-0.2.0/ui/src/components/common/StatusBanner.tsx +102 -0
- isomap_desktop-0.2.0/ui/src/main.tsx +9 -0
- isomap_desktop-0.2.0/ui/src/mockTauri.ts +175 -0
- isomap_desktop-0.2.0/ui/src/vite-env.d.ts +1 -0
- isomap_desktop-0.2.0/ui/src-tauri/.gitignore +7 -0
- isomap_desktop-0.2.0/ui/src-tauri/Cargo.lock +5297 -0
- isomap_desktop-0.2.0/ui/src-tauri/Cargo.toml +21 -0
- isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar +11 -0
- isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-aarch64-apple-darwin +11 -0
- isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-apple-darwin +11 -0
- isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-pc-windows-msvc.bat +13 -0
- isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-pc-windows-msvc.exe +1 -0
- isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-unknown-linux-gnu +1 -0
- isomap_desktop-0.2.0/ui/src-tauri/build.rs +3 -0
- isomap_desktop-0.2.0/ui/src-tauri/capabilities/default.json +23 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/128x128.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/128x128@2x.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/32x32.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square107x107Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square142x142Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square150x150Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square284x284Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square30x30Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square310x310Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square44x44Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square71x71Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/Square89x89Logo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/StoreLogo.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/icon.icns +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/icon.ico +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/icons/icon.png +0 -0
- isomap_desktop-0.2.0/ui/src-tauri/src/lib.rs +305 -0
- isomap_desktop-0.2.0/ui/src-tauri/src/main.rs +6 -0
- isomap_desktop-0.2.0/ui/src-tauri/tauri.conf.json +39 -0
- isomap_desktop-0.2.0/ui/tsconfig.json +25 -0
- isomap_desktop-0.2.0/ui/tsconfig.node.json +10 -0
- isomap_desktop-0.2.0/ui/vite.config.ts +44 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: CI Pipeline
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ "master" ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ "master" ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
backend-tests:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Install uv
|
|
16
|
+
uses: astral-sh/setup-uv@v4
|
|
17
|
+
|
|
18
|
+
- name: Set up Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
|
|
23
|
+
- name: Install dependencies
|
|
24
|
+
run: uv pip install -e ".[dev]" --system
|
|
25
|
+
|
|
26
|
+
- name: Run pytest
|
|
27
|
+
run: pytest tests/
|
|
28
|
+
|
|
29
|
+
ui-build:
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
|
|
34
|
+
- name: Set up Node
|
|
35
|
+
uses: actions/setup-node@v4
|
|
36
|
+
with:
|
|
37
|
+
node-version: 22
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
working-directory: ./ui
|
|
41
|
+
run: npm install
|
|
42
|
+
|
|
43
|
+
- name: Build UI
|
|
44
|
+
working-directory: ./ui
|
|
45
|
+
run: npm run build
|
|
46
|
+
|
|
47
|
+
- name: Install Playwright Browsers
|
|
48
|
+
working-directory: ./ui
|
|
49
|
+
run: npx playwright install --with-deps chromium
|
|
50
|
+
|
|
51
|
+
- name: Run E2E tests
|
|
52
|
+
working-directory: ./ui
|
|
53
|
+
run: npx playwright test
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
# ── Build Python wheel ──────────────────────────────────────────────────
|
|
13
|
+
build:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: '3.12'
|
|
21
|
+
|
|
22
|
+
- name: Build distribution
|
|
23
|
+
run: |
|
|
24
|
+
pip install build
|
|
25
|
+
python -m build
|
|
26
|
+
|
|
27
|
+
- name: Upload artifacts
|
|
28
|
+
uses: actions/upload-artifact@v4
|
|
29
|
+
with:
|
|
30
|
+
name: dist
|
|
31
|
+
path: dist/
|
|
32
|
+
|
|
33
|
+
# ── Publish to PyPI ─────────────────────────────────────────────────────
|
|
34
|
+
publish-pypi:
|
|
35
|
+
needs: build
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
permissions:
|
|
38
|
+
id-token: write
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/download-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: dist
|
|
43
|
+
path: dist/
|
|
44
|
+
|
|
45
|
+
- name: Publish to PyPI
|
|
46
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
47
|
+
with:
|
|
48
|
+
packages-dir: dist/
|
|
49
|
+
skip-existing: true
|
|
50
|
+
|
|
51
|
+
# ── GitHub Release ─────────────────────────────────────────────────────
|
|
52
|
+
create-release:
|
|
53
|
+
needs: build
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
with:
|
|
58
|
+
fetch-depth: 0
|
|
59
|
+
|
|
60
|
+
- uses: actions/download-artifact@v4
|
|
61
|
+
with:
|
|
62
|
+
name: dist
|
|
63
|
+
path: dist/
|
|
64
|
+
|
|
65
|
+
- name: Create GitHub Release
|
|
66
|
+
uses: softprops/action-gh-release@v2
|
|
67
|
+
with:
|
|
68
|
+
name: IsoMap ${{ github.ref_name }}
|
|
69
|
+
generate_release_notes: true
|
|
70
|
+
files: |
|
|
71
|
+
dist/*.whl
|
|
72
|
+
dist/*.tar.gz
|
|
73
|
+
fail_on_unmatched_files: false
|
|
74
|
+
|
|
75
|
+
# ── Build Tauri Apps ─────────────────────────────────────────────────────
|
|
76
|
+
build-tauri:
|
|
77
|
+
needs: create-release
|
|
78
|
+
strategy:
|
|
79
|
+
fail-fast: false
|
|
80
|
+
matrix:
|
|
81
|
+
include:
|
|
82
|
+
- platform: 'macos-latest'
|
|
83
|
+
args: ''
|
|
84
|
+
- platform: 'ubuntu-22.04'
|
|
85
|
+
args: ''
|
|
86
|
+
- platform: 'windows-latest'
|
|
87
|
+
args: ''
|
|
88
|
+
runs-on: ${{ matrix.platform }}
|
|
89
|
+
steps:
|
|
90
|
+
- uses: actions/checkout@v4
|
|
91
|
+
|
|
92
|
+
- name: setup node
|
|
93
|
+
uses: actions/setup-node@v4
|
|
94
|
+
with:
|
|
95
|
+
node-version: 20
|
|
96
|
+
|
|
97
|
+
- name: install Rust stable
|
|
98
|
+
uses: dtolnay/rust-toolchain@stable
|
|
99
|
+
|
|
100
|
+
- name: setup Python
|
|
101
|
+
uses: actions/setup-python@v5
|
|
102
|
+
with:
|
|
103
|
+
python-version: '3.12'
|
|
104
|
+
|
|
105
|
+
- name: install dependencies (ubuntu only)
|
|
106
|
+
if: matrix.platform == 'ubuntu-22.04'
|
|
107
|
+
run: |
|
|
108
|
+
sudo apt-get update
|
|
109
|
+
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
|
|
110
|
+
|
|
111
|
+
- name: install frontend dependencies
|
|
112
|
+
working-directory: ui
|
|
113
|
+
run: npm install
|
|
114
|
+
|
|
115
|
+
- name: build python sidecar
|
|
116
|
+
shell: bash
|
|
117
|
+
run: |
|
|
118
|
+
pip install -e ".[dev]"
|
|
119
|
+
./scripts/build-sidecar.sh
|
|
120
|
+
|
|
121
|
+
- name: build tauri app
|
|
122
|
+
uses: tauri-apps/tauri-action@v0
|
|
123
|
+
env:
|
|
124
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
125
|
+
with:
|
|
126
|
+
tagName: ${{ github.ref_name }}
|
|
127
|
+
releaseName: 'IsoMap ${{ github.ref_name }}'
|
|
128
|
+
releaseDraft: false
|
|
129
|
+
prerelease: false
|
|
130
|
+
args: ${{ matrix.args }}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib/
|
|
14
|
+
lib64/
|
|
15
|
+
parts/
|
|
16
|
+
sdist/
|
|
17
|
+
var/
|
|
18
|
+
wheels/
|
|
19
|
+
share/python-wheels/
|
|
20
|
+
*.egg-info/
|
|
21
|
+
.installed.cfg
|
|
22
|
+
*.egg
|
|
23
|
+
MANIFEST
|
|
24
|
+
|
|
25
|
+
# Environment
|
|
26
|
+
.env
|
|
27
|
+
.venv
|
|
28
|
+
env/
|
|
29
|
+
venv/
|
|
30
|
+
ENV/
|
|
31
|
+
env.bak/
|
|
32
|
+
venv.bak/
|
|
33
|
+
|
|
34
|
+
# Virtual Environments
|
|
35
|
+
.virtualenv
|
|
36
|
+
|
|
37
|
+
# React/Node
|
|
38
|
+
node_modules/
|
|
39
|
+
.npm
|
|
40
|
+
ui/dist/
|
|
41
|
+
ui/node_modules/
|
|
42
|
+
ui/.env.local
|
|
43
|
+
ui/.env.development.local
|
|
44
|
+
ui/.env.test.local
|
|
45
|
+
ui/.env.production.local
|
|
46
|
+
|
|
47
|
+
# IDEs
|
|
48
|
+
.idea/
|
|
49
|
+
.vscode/
|
|
50
|
+
*.swp
|
|
51
|
+
*.swo
|
|
52
|
+
|
|
53
|
+
# MacOS
|
|
54
|
+
.DS_Store
|
|
55
|
+
|
|
56
|
+
# Logs
|
|
57
|
+
*.log
|
|
58
|
+
|
|
59
|
+
# SQLite databases
|
|
60
|
+
*.sqlite
|
|
61
|
+
*.sqlite3
|
|
62
|
+
*.db
|
|
63
|
+
!data/taxonomy/*.db
|
|
64
|
+
|
|
65
|
+
# Tauri
|
|
66
|
+
ui/src-tauri/target/
|
|
67
|
+
# Machine Learning Modelsassets/models/
|
|
68
|
+
|
|
69
|
+
# Machine Learning Models
|
|
70
|
+
assets/models/
|
|
71
|
+
# AI agent / framework config (personal development environment)
|
|
72
|
+
.aidevops.json
|
|
73
|
+
AGENTS.md
|
|
74
|
+
CLAUDE.md
|
|
75
|
+
TODO.md
|
|
76
|
+
.agents/
|
|
77
|
+
.claude/
|
|
78
|
+
todo/
|
|
79
|
+
|
|
80
|
+
# IDE / editor files
|
|
81
|
+
.windsurf/
|
|
82
|
+
.ctx/
|
|
83
|
+
.beads/
|
|
84
|
+
.gitnexus/
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v4.6.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-added-large-files
|
|
9
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
10
|
+
rev: v0.6.2
|
|
11
|
+
hooks:
|
|
12
|
+
- id: ruff
|
|
13
|
+
args: [ --fix ]
|
|
14
|
+
- id: ruff-format
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to IsoMap are documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.2.1] — 2026-06-12
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **CI/CD**: Resolved PyInstaller pathing failures for Windows runners to successfully produce native Windows desktop installers via GitHub Actions.
|
|
9
|
+
|
|
10
|
+
## [0.2.0] — 2026-06-11
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Tauri v2 desktop application**: Full Rust backend with 9 JSON-RPC bridge commands (`import_dataset`, `get_sheet_names`, `map_columns`, `save_override`, `get_spatial_preview`, `normalise_chronology`, `validate_dataset`, `export_dataset`, `generate_data_paper`)
|
|
14
|
+
- **Connected wizard flow**: Import → Column Mapping → Chronology → Spatial → Validation → Export pipeline with shared state across all 6 wizard tabs
|
|
15
|
+
- **StatusBanner component**: Animated CSS spinner, color-coded loading/error/empty/success banners, Retry buttons on all components
|
|
16
|
+
- **E2E test suite**: 6 Playwright tests with in-browser mock Tauri bridge (`mockTauri.ts`), covering full wizard flow
|
|
17
|
+
- **3 new repository schemas**: `pangaea.json` (20 fields), `noaa.json` (24 fields), `lipd.json` (24 fields) — total 5 supported repositories
|
|
18
|
+
- **Cross-platform sidecar scripts**: macOS (Intel + Apple Silicon) and Windows batch wrappers
|
|
19
|
+
- **PyInstaller packaging**: `scripts/isomap-sidecar.spec` and `scripts/build-sidecar.sh` for standalone binary distribution
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **Schema path resolution**: data/schemas and preferences.db now resolve relative to `__file__`, not CWD — works regardless of Tauri bundle location
|
|
23
|
+
- **ColumnMapper**: added schema selector dropdown with all 5 repository options
|
|
24
|
+
- **ImportWizard**: fires `onImportComplete` callback to feed shared wizard state
|
|
25
|
+
- **Downstream tabs**: disabled until a file is imported via the Import Engine
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
- **Rust/Python IPC**: Fixed JSON-RPC Serde deserialization conflicts (camelCase vs snake_case) and Python `sys.exit()` codes causing Rust to fail parsing errors.
|
|
29
|
+
- **Python Backend**: Corrected Valentine matcher API structure, stabilized validation JSON serialization to prevent crashes on timestamps/numpy types, fixed `bce` regex matching, and corrected SQLite queries in preferences.
|
|
30
|
+
- **Frontend React**: Resolved infinite re-fetch loops in ValidationReport by stabilizing JSON string keys, optimized `chronologyMappings` with `useMemo`, and added robust loading guards against concurrent dataset operations.
|
|
31
|
+
- **Security/Config**: Set secure CSP headers in `tauri.conf.json` and removed overly broad `shell:allow-execute` capabilities.
|
|
32
|
+
- CI: removed broken uv cache glob, bumped Python 3.10→3.12, Node 18→22
|
|
33
|
+
- CI: Playwright port mismatch (5173→1420), VITE_E2E=true for mock Tauri in tests
|
|
34
|
+
- `xlsxwriter` dependency missing from pyproject.toml (NOAA export)
|
|
35
|
+
- ONNX model graceful skip when `assets/models/` is absent (CI)
|
|
36
|
+
- Unused `React` import in ErrorBoundary (React 19 auto-JSX)
|
|
37
|
+
- Hardcoded column name mismatches in App.tsx test fixtures
|
|
38
|
+
|
|
39
|
+
## [0.1.0] — 2026-06-06
|
|
40
|
+
|
|
41
|
+
- Initial release with GitHub Release workflow and PyPI publishing
|
|
42
|
+
- Python wheel (`isomap-0.1.0-py3-none-any.whl`) and source tarball artifacts
|
|
43
|
+
|
|
44
|
+
## [Pre-release] — 2026-05-29
|
|
45
|
+
|
|
46
|
+
### v3.0 Features
|
|
47
|
+
- PANGAEA tab-delimited export template
|
|
48
|
+
- NOAA NCEI Paleoclimatology Excel template
|
|
49
|
+
- SciBERT ONNX quantised model for semantic column matching
|
|
50
|
+
- ESSD-compliant LaTeX data paper generation (Jinja2)
|
|
51
|
+
|
|
52
|
+
### v2.1 Features
|
|
53
|
+
- Valentine Ensemble Matching (Coma & Cupid structural schema matching)
|
|
54
|
+
- Semantic Web RO-Crate export (Frictionless Data + provenance)
|
|
55
|
+
|
|
56
|
+
### v2.0 Features
|
|
57
|
+
- PyLiPD native Linked Paleo Data export
|
|
58
|
+
|
|
59
|
+
### v1.0 Features
|
|
60
|
+
- **Import Engine**: CSV and Excel (.xlsx, .xls) with encoding detection and type inference
|
|
61
|
+
- **Column Mapping Engine**: 6-stage fallback pipeline (exact → cache → fuzzy → embeddings → distribution → Valentine)
|
|
62
|
+
- **Chronology Engine**: `cal_BP` normalisation with 1950 CE anchor
|
|
63
|
+
- **Spatial Verification Engine**: GeoDataFrame coordinate cleaning and bounding box export
|
|
64
|
+
- **Validation Engine**: Pandera constraint checking with row-level error tracking
|
|
65
|
+
- **Export Engine**: CSV, Excel, GeoJSON (Neotoma), JSON (IsoArcH), LiPD, PANGAEA, NOAA, RO-Crate
|
|
66
|
+
- **Provenance Engine**: PROV-O traceability metadata
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: isomap-desktop
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Isotopic and paleoecological data standardisation middleware
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Requires-Dist: chardet>=5.2
|
|
7
|
+
Requires-Dist: geopandas>=1.0
|
|
8
|
+
Requires-Dist: httpx>=0.27
|
|
9
|
+
Requires-Dist: jinja2>=3.1
|
|
10
|
+
Requires-Dist: onnxruntime>=1.19
|
|
11
|
+
Requires-Dist: openpyxl>=3.1
|
|
12
|
+
Requires-Dist: optimum[onnxruntime]>=1.20
|
|
13
|
+
Requires-Dist: pandas>=2.2
|
|
14
|
+
Requires-Dist: pandera>=0.20
|
|
15
|
+
Requires-Dist: pydantic>=2.8
|
|
16
|
+
Requires-Dist: pylipd>=1.3
|
|
17
|
+
Requires-Dist: pyproj>=3.6
|
|
18
|
+
Requires-Dist: rapidfuzz>=3.9
|
|
19
|
+
Requires-Dist: rocrate>=0.15
|
|
20
|
+
Requires-Dist: shapely>=2.0
|
|
21
|
+
Requires-Dist: transformers>=4.40
|
|
22
|
+
Requires-Dist: valentine>=1.0
|
|
23
|
+
Requires-Dist: xlrd>=2.0
|
|
24
|
+
Requires-Dist: xlsxwriter>=3.2
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pre-commit>=3.8; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# IsoMap
|
|
33
|
+
|
|
34
|
+
Isotopic and paleoecological data standardisation middleware.
|
|
35
|
+
|
|
36
|
+
IsoMap is an open-source desktop application that automates the standardisation, validation, and export of legacy isotopic and paleoecological datasets for submission to centralised repositories (Neotoma, IsoArcH, PANGAEA, NOAA NCEI, LiPD).
|
|
37
|
+
|
|
38
|
+
📖 **[User Guide](USER_GUIDE.md)** — full walkthrough with screenshots, workflow steps, and troubleshooting.
|
|
39
|
+
📋 **[Changelog](CHANGELOG.md)** — version history and release notes.
|
|
40
|
+
|
|
41
|
+
## Features
|
|
42
|
+
|
|
43
|
+
IsoMap provides a 6-tab wizard interface backed by 8 processing engines:
|
|
44
|
+
|
|
45
|
+
- **Import Engine**: CSV and Excel spreadsheets with automatic encoding detection and type inference.
|
|
46
|
+
- **Column Mapping Engine**: 6-stage fallback pipeline (exact → preferences → fuzzy → semantic embeddings → Valentine ensemble → distribution profiling) to accurately map source columns to 5 target repository schemas.
|
|
47
|
+
- **Chronology Engine**: Auto-detects and normalises uncalibrated/calibrated dates to `cal_BP` with 1950 CE anchor.
|
|
48
|
+
- **Spatial Verification Engine**: Cleans coordinates, displays on interactive Leaflet map, exports bounding box.
|
|
49
|
+
- **Validation Engine**: Pandera constraint checking with row-level error tracking against schema definitions.
|
|
50
|
+
- **Export Engine**: 9 output formats — CSV, Excel, GeoJSON (Neotoma), IsoArcH JSON, LiPD, PANGAEA, NOAA NCEI, RO-Crate, LaTeX data paper.
|
|
51
|
+
- **Provenance Engine**: PROV-O traceability for reproducible data lineage.
|
|
52
|
+
- **Automated Data Papers**: Jinja2 ESSD-compliant LaTeX manuscript generation.
|
|
53
|
+
|
|
54
|
+
## Technology Stack
|
|
55
|
+
|
|
56
|
+
| Layer | Technology |
|
|
57
|
+
|-------|-----------|
|
|
58
|
+
| Desktop shell | Tauri v2 (Rust) |
|
|
59
|
+
| Frontend | React 19, Vite 7, TypeScript, Leaflet |
|
|
60
|
+
| Backend (sidecar) | Python 3.12+, Pandas, Pandera, GeoPandas |
|
|
61
|
+
| ML/NLP | SciBERT ONNX (Optimum), RapidFuzz, Valentine |
|
|
62
|
+
| Testing | Pytest (backend), Playwright (E2E) |
|
|
63
|
+
|
|
64
|
+
## Getting Started
|
|
65
|
+
|
|
66
|
+
### Prerequisites
|
|
67
|
+
|
|
68
|
+
- **Rust 1.70+** — [rustup.rs](https://rustup.rs)
|
|
69
|
+
- **Python 3.12+** — `pip install -e ".[dev]"`
|
|
70
|
+
- **Node.js 20+** with npm
|
|
71
|
+
|
|
72
|
+
### Development
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
cd ui && npm install # Frontend dependencies
|
|
76
|
+
npm run tauri dev # Full desktop app with hot-reload
|
|
77
|
+
npm run dev # Vite frontend only (no Tauri)
|
|
78
|
+
cd src-tauri && cargo build # Rust backend only
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Testing
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pytest tests/ # Python backend (36 tests)
|
|
85
|
+
cd ui && npx playwright test # E2E browser tests (6 tests)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Production Build
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
./scripts/build-sidecar.sh # PyInstaller standalone binary
|
|
92
|
+
cd ui && npm run tauri build # Full desktop app bundle
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Bundles output to `ui/src-tauri/target/release/bundle/`.
|
|
96
|
+
|
|
97
|
+
## Supported Repositories
|
|
98
|
+
|
|
99
|
+
| Schema | Repository | Fields | Required Fields |
|
|
100
|
+
|--------|-----------|--------|----------------|
|
|
101
|
+
| `neotoma_v2` | Neotoma | 11 | SiteName, Latitude, Longitude, TaxonName, Value |
|
|
102
|
+
| `isoarch_v1` | IsoArcH | 10 | site_name, latitude, longitude, sample_id, material, d13c |
|
|
103
|
+
| `pangaea` | PANGAEA | 20 | Event, Latitude, Longitude, Parameter, Value, Unit |
|
|
104
|
+
| `noaa` | NOAA NCEI | 24 | SiteName, Latitude, Longitude, Proxy, Proxy_Value, Proxy_Unit |
|
|
105
|
+
| `lipd` | LiPD v1.3 | 24 | dataSetName, SiteName, Latitude, Longitude, PaleoData_VariableName, PaleoData_Value, PaleoData_Unit |
|
|
106
|
+
|
|
107
|
+
Add custom schemas in `data/schemas/` following the [JSON Schema](https://json-schema.org/) format.
|
|
108
|
+
|
|
109
|
+
## Architecture
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
React invoke() → Rust Tauri commands → sidecar_rpc() → shell wrapper → Python JSON-RPC
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The Rust layer (`ui/src-tauri/src/lib.rs`) exposes 9 Tauri commands that serialise
|
|
116
|
+
parameters to JSON-RPC and forward them to the Python sidecar (`src/isomap/main.py`)
|
|
117
|
+
via stdin/stdout. The sidecar processes the request and returns a JSON-RPC response.
|
|
118
|
+
|
|
119
|
+
### Key Files
|
|
120
|
+
|
|
121
|
+
| File | Purpose |
|
|
122
|
+
|------|---------|
|
|
123
|
+
| `ui/src-tauri/src/lib.rs` | 9 Tauri commands + `sidecar_rpc()` JSON-RPC helper |
|
|
124
|
+
| `ui/src-tauri/tauri.conf.json` | App config, window, sidecar external binary |
|
|
125
|
+
| `ui/src-tauri/binaries/isomap-sidecar*` | Platform-specific sidecar wrappers |
|
|
126
|
+
| `src/isomap/main.py` | Python JSON-RPC server (stdin/stdout or CLI mode) |
|
|
127
|
+
| `ui/src/api/sidecar.ts` | Frontend API layer (`invoke()` calls) |
|
|
128
|
+
| `ui/src/App.tsx` | Main React app with shared wizard state |
|
|
129
|
+
| `data/schemas/*.json` | Repository schema definitions |
|
|
130
|
+
| `scripts/build-sidecar.sh` | PyInstaller sidecar binary builder |
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
MIT
|
|
135
|
+
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# IsoMap
|
|
2
|
+
|
|
3
|
+
Isotopic and paleoecological data standardisation middleware.
|
|
4
|
+
|
|
5
|
+
IsoMap is an open-source desktop application that automates the standardisation, validation, and export of legacy isotopic and paleoecological datasets for submission to centralised repositories (Neotoma, IsoArcH, PANGAEA, NOAA NCEI, LiPD).
|
|
6
|
+
|
|
7
|
+
📖 **[User Guide](USER_GUIDE.md)** — full walkthrough with screenshots, workflow steps, and troubleshooting.
|
|
8
|
+
📋 **[Changelog](CHANGELOG.md)** — version history and release notes.
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
IsoMap provides a 6-tab wizard interface backed by 8 processing engines:
|
|
13
|
+
|
|
14
|
+
- **Import Engine**: CSV and Excel spreadsheets with automatic encoding detection and type inference.
|
|
15
|
+
- **Column Mapping Engine**: 6-stage fallback pipeline (exact → preferences → fuzzy → semantic embeddings → Valentine ensemble → distribution profiling) to accurately map source columns to 5 target repository schemas.
|
|
16
|
+
- **Chronology Engine**: Auto-detects and normalises uncalibrated/calibrated dates to `cal_BP` with 1950 CE anchor.
|
|
17
|
+
- **Spatial Verification Engine**: Cleans coordinates, displays on interactive Leaflet map, exports bounding box.
|
|
18
|
+
- **Validation Engine**: Pandera constraint checking with row-level error tracking against schema definitions.
|
|
19
|
+
- **Export Engine**: 9 output formats — CSV, Excel, GeoJSON (Neotoma), IsoArcH JSON, LiPD, PANGAEA, NOAA NCEI, RO-Crate, LaTeX data paper.
|
|
20
|
+
- **Provenance Engine**: PROV-O traceability for reproducible data lineage.
|
|
21
|
+
- **Automated Data Papers**: Jinja2 ESSD-compliant LaTeX manuscript generation.
|
|
22
|
+
|
|
23
|
+
## Technology Stack
|
|
24
|
+
|
|
25
|
+
| Layer | Technology |
|
|
26
|
+
|-------|-----------|
|
|
27
|
+
| Desktop shell | Tauri v2 (Rust) |
|
|
28
|
+
| Frontend | React 19, Vite 7, TypeScript, Leaflet |
|
|
29
|
+
| Backend (sidecar) | Python 3.12+, Pandas, Pandera, GeoPandas |
|
|
30
|
+
| ML/NLP | SciBERT ONNX (Optimum), RapidFuzz, Valentine |
|
|
31
|
+
| Testing | Pytest (backend), Playwright (E2E) |
|
|
32
|
+
|
|
33
|
+
## Getting Started
|
|
34
|
+
|
|
35
|
+
### Prerequisites
|
|
36
|
+
|
|
37
|
+
- **Rust 1.70+** — [rustup.rs](https://rustup.rs)
|
|
38
|
+
- **Python 3.12+** — `pip install -e ".[dev]"`
|
|
39
|
+
- **Node.js 20+** with npm
|
|
40
|
+
|
|
41
|
+
### Development
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
cd ui && npm install # Frontend dependencies
|
|
45
|
+
npm run tauri dev # Full desktop app with hot-reload
|
|
46
|
+
npm run dev # Vite frontend only (no Tauri)
|
|
47
|
+
cd src-tauri && cargo build # Rust backend only
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Testing
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pytest tests/ # Python backend (36 tests)
|
|
54
|
+
cd ui && npx playwright test # E2E browser tests (6 tests)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Production Build
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
./scripts/build-sidecar.sh # PyInstaller standalone binary
|
|
61
|
+
cd ui && npm run tauri build # Full desktop app bundle
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Bundles output to `ui/src-tauri/target/release/bundle/`.
|
|
65
|
+
|
|
66
|
+
## Supported Repositories
|
|
67
|
+
|
|
68
|
+
| Schema | Repository | Fields | Required Fields |
|
|
69
|
+
|--------|-----------|--------|----------------|
|
|
70
|
+
| `neotoma_v2` | Neotoma | 11 | SiteName, Latitude, Longitude, TaxonName, Value |
|
|
71
|
+
| `isoarch_v1` | IsoArcH | 10 | site_name, latitude, longitude, sample_id, material, d13c |
|
|
72
|
+
| `pangaea` | PANGAEA | 20 | Event, Latitude, Longitude, Parameter, Value, Unit |
|
|
73
|
+
| `noaa` | NOAA NCEI | 24 | SiteName, Latitude, Longitude, Proxy, Proxy_Value, Proxy_Unit |
|
|
74
|
+
| `lipd` | LiPD v1.3 | 24 | dataSetName, SiteName, Latitude, Longitude, PaleoData_VariableName, PaleoData_Value, PaleoData_Unit |
|
|
75
|
+
|
|
76
|
+
Add custom schemas in `data/schemas/` following the [JSON Schema](https://json-schema.org/) format.
|
|
77
|
+
|
|
78
|
+
## Architecture
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
React invoke() → Rust Tauri commands → sidecar_rpc() → shell wrapper → Python JSON-RPC
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The Rust layer (`ui/src-tauri/src/lib.rs`) exposes 9 Tauri commands that serialise
|
|
85
|
+
parameters to JSON-RPC and forward them to the Python sidecar (`src/isomap/main.py`)
|
|
86
|
+
via stdin/stdout. The sidecar processes the request and returns a JSON-RPC response.
|
|
87
|
+
|
|
88
|
+
### Key Files
|
|
89
|
+
|
|
90
|
+
| File | Purpose |
|
|
91
|
+
|------|---------|
|
|
92
|
+
| `ui/src-tauri/src/lib.rs` | 9 Tauri commands + `sidecar_rpc()` JSON-RPC helper |
|
|
93
|
+
| `ui/src-tauri/tauri.conf.json` | App config, window, sidecar external binary |
|
|
94
|
+
| `ui/src-tauri/binaries/isomap-sidecar*` | Platform-specific sidecar wrappers |
|
|
95
|
+
| `src/isomap/main.py` | Python JSON-RPC server (stdin/stdout or CLI mode) |
|
|
96
|
+
| `ui/src/api/sidecar.ts` | Frontend API layer (`invoke()` calls) |
|
|
97
|
+
| `ui/src/App.tsx` | Main React app with shared wizard state |
|
|
98
|
+
| `data/schemas/*.json` | Repository schema definitions |
|
|
99
|
+
| `scripts/build-sidecar.sh` | PyInstaller sidecar binary builder |
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
MIT
|
|
104
|
+
|