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.
Files changed (163) hide show
  1. isomap_desktop-0.2.0/.coderabbit.yaml +2 -0
  2. isomap_desktop-0.2.0/.gitattributes +2 -0
  3. isomap_desktop-0.2.0/.github/workflows/ci.yml +53 -0
  4. isomap_desktop-0.2.0/.github/workflows/release.yml +130 -0
  5. isomap_desktop-0.2.0/.gitignore +84 -0
  6. isomap_desktop-0.2.0/.gitlab-ci.yml +10 -0
  7. isomap_desktop-0.2.0/.pre-commit-config.yaml +14 -0
  8. isomap_desktop-0.2.0/CHANGELOG.md +66 -0
  9. isomap_desktop-0.2.0/PKG-INFO +135 -0
  10. isomap_desktop-0.2.0/README.md +104 -0
  11. isomap_desktop-0.2.0/USER_GUIDE.md +188 -0
  12. isomap_desktop-0.2.0/data/schemas/isoarch_v1.json +19 -0
  13. isomap_desktop-0.2.0/data/schemas/lipd.json +32 -0
  14. isomap_desktop-0.2.0/data/schemas/neotoma_v2.json +19 -0
  15. isomap_desktop-0.2.0/data/schemas/noaa.json +29 -0
  16. isomap_desktop-0.2.0/data/schemas/pangaea.json +29 -0
  17. isomap_desktop-0.2.0/data/templates/essd_template.tex +27 -0
  18. isomap_desktop-0.2.0/docs/PLAN.md +659 -0
  19. isomap_desktop-0.2.0/docs/SCOPE.md +354 -0
  20. isomap_desktop-0.2.0/docs/images/column_mapping.png +0 -0
  21. isomap_desktop-0.2.0/docs/images/import_wizard.png +0 -0
  22. isomap_desktop-0.2.0/docs/images/map_preview.png +0 -0
  23. isomap_desktop-0.2.0/docs/images/validation_report.png +0 -0
  24. isomap_desktop-0.2.0/docs/research-papers/Data Standardization Tool Research.md +411 -0
  25. isomap_desktop-0.2.0/docs/research-papers/Paleoecological Data Standardization Research.md +286 -0
  26. isomap_desktop-0.2.0/docs/research-papers/v2_v3_research_dossier.md +53 -0
  27. isomap_desktop-0.2.0/docs/research-prompts/01_neotoma_submission_process.txt +12 -0
  28. isomap_desktop-0.2.0/docs/research-prompts/02_isoarch_isomemo_submission.txt +12 -0
  29. isomap_desktop-0.2.0/docs/research-prompts/03_taxonomic_authority_apis.txt +12 -0
  30. isomap_desktop-0.2.0/docs/research-prompts/04_isotopic_data_quality_standards.txt +12 -0
  31. isomap_desktop-0.2.0/docs/research-prompts/05_column_name_matching_algorithms.txt +12 -0
  32. isomap_desktop-0.2.0/docs/research-prompts/06_pangaea_and_other_repositories.txt +12 -0
  33. isomap_desktop-0.2.0/docs/research-prompts/07_supp_reproducible_data_transformation.txt +13 -0
  34. isomap_desktop-0.2.0/docs/research-prompts/IsoMap_prompt_A +132 -0
  35. isomap_desktop-0.2.0/docs/scope.md +105 -0
  36. isomap_desktop-0.2.0/pyproject.toml +51 -0
  37. isomap_desktop-0.2.0/scripts/build-sidecar.sh +57 -0
  38. isomap_desktop-0.2.0/scripts/generate_test_data.py +24 -0
  39. isomap_desktop-0.2.0/scripts/isomap-sidecar.spec +69 -0
  40. isomap_desktop-0.2.0/scripts/scibert_export.py +38 -0
  41. isomap_desktop-0.2.0/src/isomap/__init__.py +0 -0
  42. isomap_desktop-0.2.0/src/isomap/core/__init__.py +0 -0
  43. isomap_desktop-0.2.0/src/isomap/core/chronology.py +100 -0
  44. isomap_desktop-0.2.0/src/isomap/core/datapaper.py +59 -0
  45. isomap_desktop-0.2.0/src/isomap/core/exporter.py +251 -0
  46. isomap_desktop-0.2.0/src/isomap/core/importer.py +60 -0
  47. isomap_desktop-0.2.0/src/isomap/core/mapper.py +146 -0
  48. isomap_desktop-0.2.0/src/isomap/core/provenance.py +110 -0
  49. isomap_desktop-0.2.0/src/isomap/core/spatial.py +105 -0
  50. isomap_desktop-0.2.0/src/isomap/core/taxonomy.py +0 -0
  51. isomap_desktop-0.2.0/src/isomap/core/validator.py +141 -0
  52. isomap_desktop-0.2.0/src/isomap/export/__init__.py +0 -0
  53. isomap_desktop-0.2.0/src/isomap/export/isoarch.py +0 -0
  54. isomap_desktop-0.2.0/src/isomap/export/lipd.py +0 -0
  55. isomap_desktop-0.2.0/src/isomap/export/neotoma.py +0 -0
  56. isomap_desktop-0.2.0/src/isomap/export/pangaea.py +0 -0
  57. isomap_desktop-0.2.0/src/isomap/main.py +173 -0
  58. isomap_desktop-0.2.0/src/isomap/matching/__init__.py +0 -0
  59. isomap_desktop-0.2.0/src/isomap/matching/distribution.py +74 -0
  60. isomap_desktop-0.2.0/src/isomap/matching/exact.py +37 -0
  61. isomap_desktop-0.2.0/src/isomap/matching/fuzzy.py +48 -0
  62. isomap_desktop-0.2.0/src/isomap/matching/preferences.py +90 -0
  63. isomap_desktop-0.2.0/src/isomap/matching/semantic.py +109 -0
  64. isomap_desktop-0.2.0/src/isomap/matching/valentine_matcher.py +60 -0
  65. isomap_desktop-0.2.0/src/isomap/models/__init__.py +0 -0
  66. isomap_desktop-0.2.0/src/isomap/models/dataset.py +0 -0
  67. isomap_desktop-0.2.0/src/isomap/models/log.py +0 -0
  68. isomap_desktop-0.2.0/src/isomap/models/mapping.py +0 -0
  69. isomap_desktop-0.2.0/src/isomap/models/validation.py +0 -0
  70. isomap_desktop-0.2.0/src/isomap/schemas/__init__.py +0 -0
  71. isomap_desktop-0.2.0/src/isomap/schemas/registry.py +0 -0
  72. isomap_desktop-0.2.0/src/isomap/taxonomy/__init__.py +0 -0
  73. isomap_desktop-0.2.0/src/isomap/taxonomy/gbif.py +0 -0
  74. isomap_desktop-0.2.0/src/isomap/taxonomy/itis.py +0 -0
  75. isomap_desktop-0.2.0/src/isomap/taxonomy/neotoma.py +0 -0
  76. isomap_desktop-0.2.0/src/isomap/taxonomy/offline.py +0 -0
  77. isomap_desktop-0.2.0/src/isomap/taxonomy/pbdb.py +0 -0
  78. isomap_desktop-0.2.0/src/isomap/taxonomy/resolver.py +0 -0
  79. isomap_desktop-0.2.0/src/isomap/taxonomy/worms.py +0 -0
  80. isomap_desktop-0.2.0/src/isomap/validation/__init__.py +0 -0
  81. isomap_desktop-0.2.0/src/isomap/validation/carbonate.py +0 -0
  82. isomap_desktop-0.2.0/src/isomap/validation/collagen.py +0 -0
  83. isomap_desktop-0.2.0/src/isomap/validation/isotopic.py +0 -0
  84. isomap_desktop-0.2.0/src/isomap/validation/report.py +0 -0
  85. isomap_desktop-0.2.0/src/isomap/validation/schemas.py +0 -0
  86. isomap_desktop-0.2.0/src/isomap/validation/spatial.py +0 -0
  87. isomap_desktop-0.2.0/test.zip +0 -0
  88. isomap_desktop-0.2.0/tests/conftest.py +0 -0
  89. isomap_desktop-0.2.0/tests/integration/test_isoarch_workflow.py +0 -0
  90. isomap_desktop-0.2.0/tests/integration/test_neotoma_workflow.py +0 -0
  91. isomap_desktop-0.2.0/tests/test_core_chronology.py +45 -0
  92. isomap_desktop-0.2.0/tests/test_core_exporter.py +55 -0
  93. isomap_desktop-0.2.0/tests/test_core_exporter_lipd.py +50 -0
  94. isomap_desktop-0.2.0/tests/test_core_exporter_templates.py +45 -0
  95. isomap_desktop-0.2.0/tests/test_core_mapper.py +101 -0
  96. isomap_desktop-0.2.0/tests/test_core_provenance.py +35 -0
  97. isomap_desktop-0.2.0/tests/test_core_spatial.py +60 -0
  98. isomap_desktop-0.2.0/tests/test_core_validator.py +66 -0
  99. isomap_desktop-0.2.0/tests/test_data/legacy_data.csv +11 -0
  100. isomap_desktop-0.2.0/tests/test_e2e.py +70 -0
  101. isomap_desktop-0.2.0/tests/test_exporter.py +0 -0
  102. isomap_desktop-0.2.0/tests/test_importer.py +40 -0
  103. isomap_desktop-0.2.0/tests/test_mapper.py +28 -0
  104. isomap_desktop-0.2.0/tests/test_rpc.py +36 -0
  105. isomap_desktop-0.2.0/tests/test_taxonomy.py +0 -0
  106. isomap_desktop-0.2.0/tests/test_validator.py +0 -0
  107. isomap_desktop-0.2.0/ui/.gitignore +24 -0
  108. isomap_desktop-0.2.0/ui/README.md +7 -0
  109. isomap_desktop-0.2.0/ui/e2e/app.spec.ts +157 -0
  110. isomap_desktop-0.2.0/ui/index.html +14 -0
  111. isomap_desktop-0.2.0/ui/package-lock.json +2239 -0
  112. isomap_desktop-0.2.0/ui/package.json +31 -0
  113. isomap_desktop-0.2.0/ui/playwright.config.ts +25 -0
  114. isomap_desktop-0.2.0/ui/public/tauri.svg +6 -0
  115. isomap_desktop-0.2.0/ui/public/vite.svg +1 -0
  116. isomap_desktop-0.2.0/ui/src/App.css +117 -0
  117. isomap_desktop-0.2.0/ui/src/App.tsx +222 -0
  118. isomap_desktop-0.2.0/ui/src/api/sidecar.ts +169 -0
  119. isomap_desktop-0.2.0/ui/src/assets/react.svg +1 -0
  120. isomap_desktop-0.2.0/ui/src/components/ChronologyReview/ChronologyReview.tsx +71 -0
  121. isomap_desktop-0.2.0/ui/src/components/ColumnMapper/ColumnMapper.tsx +144 -0
  122. isomap_desktop-0.2.0/ui/src/components/ErrorBoundary.tsx +45 -0
  123. isomap_desktop-0.2.0/ui/src/components/ExportPanel/ExportPanel.tsx +144 -0
  124. isomap_desktop-0.2.0/ui/src/components/ImportWizard/ImportWizard.tsx +132 -0
  125. isomap_desktop-0.2.0/ui/src/components/MapPreview/MapPreview.tsx +116 -0
  126. isomap_desktop-0.2.0/ui/src/components/ValidationReport/ValidationReport.tsx +88 -0
  127. isomap_desktop-0.2.0/ui/src/components/common/StatusBanner.tsx +102 -0
  128. isomap_desktop-0.2.0/ui/src/main.tsx +9 -0
  129. isomap_desktop-0.2.0/ui/src/mockTauri.ts +175 -0
  130. isomap_desktop-0.2.0/ui/src/vite-env.d.ts +1 -0
  131. isomap_desktop-0.2.0/ui/src-tauri/.gitignore +7 -0
  132. isomap_desktop-0.2.0/ui/src-tauri/Cargo.lock +5297 -0
  133. isomap_desktop-0.2.0/ui/src-tauri/Cargo.toml +21 -0
  134. isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar +11 -0
  135. isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-aarch64-apple-darwin +11 -0
  136. isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-apple-darwin +11 -0
  137. isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-pc-windows-msvc.bat +13 -0
  138. isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-pc-windows-msvc.exe +1 -0
  139. isomap_desktop-0.2.0/ui/src-tauri/binaries/isomap-sidecar-x86_64-unknown-linux-gnu +1 -0
  140. isomap_desktop-0.2.0/ui/src-tauri/build.rs +3 -0
  141. isomap_desktop-0.2.0/ui/src-tauri/capabilities/default.json +23 -0
  142. isomap_desktop-0.2.0/ui/src-tauri/icons/128x128.png +0 -0
  143. isomap_desktop-0.2.0/ui/src-tauri/icons/128x128@2x.png +0 -0
  144. isomap_desktop-0.2.0/ui/src-tauri/icons/32x32.png +0 -0
  145. isomap_desktop-0.2.0/ui/src-tauri/icons/Square107x107Logo.png +0 -0
  146. isomap_desktop-0.2.0/ui/src-tauri/icons/Square142x142Logo.png +0 -0
  147. isomap_desktop-0.2.0/ui/src-tauri/icons/Square150x150Logo.png +0 -0
  148. isomap_desktop-0.2.0/ui/src-tauri/icons/Square284x284Logo.png +0 -0
  149. isomap_desktop-0.2.0/ui/src-tauri/icons/Square30x30Logo.png +0 -0
  150. isomap_desktop-0.2.0/ui/src-tauri/icons/Square310x310Logo.png +0 -0
  151. isomap_desktop-0.2.0/ui/src-tauri/icons/Square44x44Logo.png +0 -0
  152. isomap_desktop-0.2.0/ui/src-tauri/icons/Square71x71Logo.png +0 -0
  153. isomap_desktop-0.2.0/ui/src-tauri/icons/Square89x89Logo.png +0 -0
  154. isomap_desktop-0.2.0/ui/src-tauri/icons/StoreLogo.png +0 -0
  155. isomap_desktop-0.2.0/ui/src-tauri/icons/icon.icns +0 -0
  156. isomap_desktop-0.2.0/ui/src-tauri/icons/icon.ico +0 -0
  157. isomap_desktop-0.2.0/ui/src-tauri/icons/icon.png +0 -0
  158. isomap_desktop-0.2.0/ui/src-tauri/src/lib.rs +305 -0
  159. isomap_desktop-0.2.0/ui/src-tauri/src/main.rs +6 -0
  160. isomap_desktop-0.2.0/ui/src-tauri/tauri.conf.json +39 -0
  161. isomap_desktop-0.2.0/ui/tsconfig.json +25 -0
  162. isomap_desktop-0.2.0/ui/tsconfig.node.json +10 -0
  163. isomap_desktop-0.2.0/ui/vite.config.ts +44 -0
@@ -0,0 +1,2 @@
1
+ reviews:
2
+ abort_on_close: false
@@ -0,0 +1,2 @@
1
+ # Opt out of AI model training
2
+ * ai-training=false
@@ -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,10 @@
1
+ stages:
2
+ - verify
3
+
4
+ verify-job:
5
+ stage: verify
6
+ script:
7
+ - echo "Repository is clean."
8
+ only:
9
+ - main
10
+ - master
@@ -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
+