fiberpath 0.3.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 (217) hide show
  1. fiberpath-0.3.0/.gitattributes +5 -0
  2. fiberpath-0.3.0/.github/actions/setup-node/action.yml +27 -0
  3. fiberpath-0.3.0/.github/actions/setup-python/action.yml +46 -0
  4. fiberpath-0.3.0/.github/actions/setup-rust/action.yml +44 -0
  5. fiberpath-0.3.0/.github/workflows/backend-ci.yml +73 -0
  6. fiberpath-0.3.0/.github/workflows/docs-ci.yml +44 -0
  7. fiberpath-0.3.0/.github/workflows/docs-deploy.yml +59 -0
  8. fiberpath-0.3.0/.github/workflows/gui-ci.yml +75 -0
  9. fiberpath-0.3.0/.github/workflows/gui-packaging.yml +62 -0
  10. fiberpath-0.3.0/.github/workflows/release.yml +172 -0
  11. fiberpath-0.3.0/.gitignore +210 -0
  12. fiberpath-0.3.0/.vscode/extensions.json +32 -0
  13. fiberpath-0.3.0/.workflow-old-archive/ci.yml +66 -0
  14. fiberpath-0.3.0/.workflow-old-archive/docs-site.yml +66 -0
  15. fiberpath-0.3.0/.workflow-old-archive/gui-tests.yml +97 -0
  16. fiberpath-0.3.0/.workflow-old-archive/gui.yml +105 -0
  17. fiberpath-0.3.0/CONTRIBUTING.md +68 -0
  18. fiberpath-0.3.0/LICENSE +661 -0
  19. fiberpath-0.3.0/PKG-INFO +827 -0
  20. fiberpath-0.3.0/README.md +125 -0
  21. fiberpath-0.3.0/docs/api.md +111 -0
  22. fiberpath-0.3.0/docs/architecture.md +90 -0
  23. fiberpath-0.3.0/docs/ci-cd.md +262 -0
  24. fiberpath-0.3.0/docs/concepts.md +35 -0
  25. fiberpath-0.3.0/docs/format-wind.md +374 -0
  26. fiberpath-0.3.0/docs/index.md +30 -0
  27. fiberpath-0.3.0/docs/packaging.md +90 -0
  28. fiberpath-0.3.0/docs/planner-math.md +63 -0
  29. fiberpath-0.3.0/docs/roadmap.md +3 -0
  30. fiberpath-0.3.0/examples/README.md +3 -0
  31. fiberpath-0.3.0/examples/complex_surface/README.md +3 -0
  32. fiberpath-0.3.0/examples/multi_layer/README.md +3 -0
  33. fiberpath-0.3.0/examples/multi_layer/input.wind +27 -0
  34. fiberpath-0.3.0/examples/simple_cylinder/README.md +3 -0
  35. fiberpath-0.3.0/examples/simple_cylinder/input.wind +17 -0
  36. fiberpath-0.3.0/examples/sized_simple_cylinder/README.md +7 -0
  37. fiberpath-0.3.0/examples/sized_simple_cylinder/input.wind +17 -0
  38. fiberpath-0.3.0/fiberpath/__init__.py +10 -0
  39. fiberpath-0.3.0/fiberpath/config/__init__.py +22 -0
  40. fiberpath-0.3.0/fiberpath/config/schemas.py +72 -0
  41. fiberpath-0.3.0/fiberpath/config/validator.py +31 -0
  42. fiberpath-0.3.0/fiberpath/execution/__init__.py +7 -0
  43. fiberpath-0.3.0/fiberpath/execution/marlin.py +311 -0
  44. fiberpath-0.3.0/fiberpath/gcode/__init__.py +6 -0
  45. fiberpath-0.3.0/fiberpath/gcode/dialects.py +47 -0
  46. fiberpath-0.3.0/fiberpath/gcode/generator.py +31 -0
  47. fiberpath-0.3.0/fiberpath/geometry/__init__.py +13 -0
  48. fiberpath-0.3.0/fiberpath/geometry/curves.py +16 -0
  49. fiberpath-0.3.0/fiberpath/geometry/intersections.py +23 -0
  50. fiberpath-0.3.0/fiberpath/geometry/surfaces.py +17 -0
  51. fiberpath-0.3.0/fiberpath/math_utils.py +20 -0
  52. fiberpath-0.3.0/fiberpath/planning/__init__.py +13 -0
  53. fiberpath-0.3.0/fiberpath/planning/calculations.py +50 -0
  54. fiberpath-0.3.0/fiberpath/planning/exceptions.py +19 -0
  55. fiberpath-0.3.0/fiberpath/planning/helpers.py +55 -0
  56. fiberpath-0.3.0/fiberpath/planning/layer_strategies.py +194 -0
  57. fiberpath-0.3.0/fiberpath/planning/machine.py +151 -0
  58. fiberpath-0.3.0/fiberpath/planning/planner.py +133 -0
  59. fiberpath-0.3.0/fiberpath/planning/validators.py +51 -0
  60. fiberpath-0.3.0/fiberpath/simulation/__init__.py +5 -0
  61. fiberpath-0.3.0/fiberpath/simulation/simulator.py +186 -0
  62. fiberpath-0.3.0/fiberpath/visualization/__init__.py +13 -0
  63. fiberpath-0.3.0/fiberpath/visualization/export_json.py +14 -0
  64. fiberpath-0.3.0/fiberpath/visualization/plotter.py +261 -0
  65. fiberpath-0.3.0/fiberpath_api/__init__.py +5 -0
  66. fiberpath-0.3.0/fiberpath_api/main.py +19 -0
  67. fiberpath-0.3.0/fiberpath_api/routes/__init__.py +1 -0
  68. fiberpath-0.3.0/fiberpath_api/routes/plan.py +41 -0
  69. fiberpath-0.3.0/fiberpath_api/routes/simulate.py +29 -0
  70. fiberpath-0.3.0/fiberpath_api/routes/stream.py +49 -0
  71. fiberpath-0.3.0/fiberpath_api/routes/validate.py +21 -0
  72. fiberpath-0.3.0/fiberpath_api/schemas.py +50 -0
  73. fiberpath-0.3.0/fiberpath_cli/__init__.py +5 -0
  74. fiberpath-0.3.0/fiberpath_cli/__main__.py +6 -0
  75. fiberpath-0.3.0/fiberpath_cli/main.py +27 -0
  76. fiberpath-0.3.0/fiberpath_cli/output.py +14 -0
  77. fiberpath-0.3.0/fiberpath_cli/plan.py +100 -0
  78. fiberpath-0.3.0/fiberpath_cli/plot.py +37 -0
  79. fiberpath-0.3.0/fiberpath_cli/simulate.py +36 -0
  80. fiberpath-0.3.0/fiberpath_cli/stream.py +123 -0
  81. fiberpath-0.3.0/fiberpath_cli/validate.py +26 -0
  82. fiberpath-0.3.0/fiberpath_gui/.gitignore +6 -0
  83. fiberpath-0.3.0/fiberpath_gui/.stylelintrc.json +25 -0
  84. fiberpath-0.3.0/fiberpath_gui/README.md +63 -0
  85. fiberpath-0.3.0/fiberpath_gui/docs/ARCHITECTURE.md +42 -0
  86. fiberpath-0.3.0/fiberpath_gui/docs/CLI_HEALTH_CHECK.md +342 -0
  87. fiberpath-0.3.0/fiberpath_gui/docs/CSS_ARCHITECTURE.md +372 -0
  88. fiberpath-0.3.0/fiberpath_gui/docs/PERFORMANCE_PROFILING.md +186 -0
  89. fiberpath-0.3.0/fiberpath_gui/docs/SCHEMA.md +145 -0
  90. fiberpath-0.3.0/fiberpath_gui/docs/STORE_SPLITTING_ANALYSIS.md +183 -0
  91. fiberpath-0.3.0/fiberpath_gui/docs/TESTING.md +281 -0
  92. fiberpath-0.3.0/fiberpath_gui/docs/TYPE_SAFETY_IMPLEMENTATION.md +289 -0
  93. fiberpath-0.3.0/fiberpath_gui/generate-types.json +8 -0
  94. fiberpath-0.3.0/fiberpath_gui/index.html +12 -0
  95. fiberpath-0.3.0/fiberpath_gui/package-lock.json +6298 -0
  96. fiberpath-0.3.0/fiberpath_gui/package.json +59 -0
  97. fiberpath-0.3.0/fiberpath_gui/schemas/wind-schema.json +197 -0
  98. fiberpath-0.3.0/fiberpath_gui/src/App.tsx +170 -0
  99. fiberpath-0.3.0/fiberpath_gui/src/components/CliHealthWarning.tsx +60 -0
  100. fiberpath-0.3.0/fiberpath_gui/src/components/ErrorBoundary.tsx +88 -0
  101. fiberpath-0.3.0/fiberpath_gui/src/components/ErrorNotificationToast.tsx +39 -0
  102. fiberpath-0.3.0/fiberpath_gui/src/components/FileField.tsx +50 -0
  103. fiberpath-0.3.0/fiberpath_gui/src/components/MenuBar.tsx +252 -0
  104. fiberpath-0.3.0/fiberpath_gui/src/components/ResultCard.tsx +15 -0
  105. fiberpath-0.3.0/fiberpath_gui/src/components/StatusBar.tsx +72 -0
  106. fiberpath-0.3.0/fiberpath_gui/src/components/StatusText.tsx +26 -0
  107. fiberpath-0.3.0/fiberpath_gui/src/components/canvas/CanvasControls.tsx +66 -0
  108. fiberpath-0.3.0/fiberpath_gui/src/components/canvas/CenterCanvas.tsx +13 -0
  109. fiberpath-0.3.0/fiberpath_gui/src/components/canvas/LayerScrubber.tsx +34 -0
  110. fiberpath-0.3.0/fiberpath_gui/src/components/canvas/VisualizationCanvas.tsx +209 -0
  111. fiberpath-0.3.0/fiberpath_gui/src/components/dialogs/AboutDialog.tsx +120 -0
  112. fiberpath-0.3.0/fiberpath_gui/src/components/dialogs/CliUnavailableDialog.tsx +100 -0
  113. fiberpath-0.3.0/fiberpath_gui/src/components/dialogs/DiagnosticsDialog.tsx +219 -0
  114. fiberpath-0.3.0/fiberpath_gui/src/components/dialogs/ExportConfirmationDialog.tsx +187 -0
  115. fiberpath-0.3.0/fiberpath_gui/src/components/editors/HelicalLayerEditor.tsx +270 -0
  116. fiberpath-0.3.0/fiberpath_gui/src/components/editors/HoopLayerEditor.tsx +66 -0
  117. fiberpath-0.3.0/fiberpath_gui/src/components/editors/SkipLayerEditor.tsx +92 -0
  118. fiberpath-0.3.0/fiberpath_gui/src/components/forms/MachineSettingsForm.tsx +89 -0
  119. fiberpath-0.3.0/fiberpath_gui/src/components/forms/MandrelForm.tsx +100 -0
  120. fiberpath-0.3.0/fiberpath_gui/src/components/forms/TowForm.tsx +100 -0
  121. fiberpath-0.3.0/fiberpath_gui/src/components/layers/LayerRow.tsx +119 -0
  122. fiberpath-0.3.0/fiberpath_gui/src/components/layers/LayerStack.tsx +157 -0
  123. fiberpath-0.3.0/fiberpath_gui/src/components/panels/BottomPanel.tsx +18 -0
  124. fiberpath-0.3.0/fiberpath_gui/src/components/panels/LeftPanel.tsx +18 -0
  125. fiberpath-0.3.0/fiberpath_gui/src/components/panels/RightPanel.tsx +18 -0
  126. fiberpath-0.3.0/fiberpath_gui/src/contexts/CliHealthContext.tsx +77 -0
  127. fiberpath-0.3.0/fiberpath_gui/src/contexts/ErrorNotificationContext.tsx +77 -0
  128. fiberpath-0.3.0/fiberpath_gui/src/hooks/useCliHealth.ts +171 -0
  129. fiberpath-0.3.0/fiberpath_gui/src/hooks/useKeyboardShortcuts.ts +137 -0
  130. fiberpath-0.3.0/fiberpath_gui/src/layouts/MainLayout.tsx +56 -0
  131. fiberpath-0.3.0/fiberpath_gui/src/lib/commands.ts +120 -0
  132. fiberpath-0.3.0/fiberpath_gui/src/lib/fileOperations.ts +254 -0
  133. fiberpath-0.3.0/fiberpath_gui/src/lib/recentFiles.ts +69 -0
  134. fiberpath-0.3.0/fiberpath_gui/src/lib/retry.ts +66 -0
  135. fiberpath-0.3.0/fiberpath_gui/src/lib/schemas.test.ts +473 -0
  136. fiberpath-0.3.0/fiberpath_gui/src/lib/schemas.ts +310 -0
  137. fiberpath-0.3.0/fiberpath_gui/src/lib/validation.test.ts +380 -0
  138. fiberpath-0.3.0/fiberpath_gui/src/lib/validation.ts +44 -0
  139. fiberpath-0.3.0/fiberpath_gui/src/main.tsx +22 -0
  140. fiberpath-0.3.0/fiberpath_gui/src/state/projectStore.test.ts +304 -0
  141. fiberpath-0.3.0/fiberpath_gui/src/state/projectStore.ts +207 -0
  142. fiberpath-0.3.0/fiberpath_gui/src/styles/buttons.css +136 -0
  143. fiberpath-0.3.0/fiberpath_gui/src/styles/canvas.css +355 -0
  144. fiberpath-0.3.0/fiberpath_gui/src/styles/dialogs.css +503 -0
  145. fiberpath-0.3.0/fiberpath_gui/src/styles/forms.css +248 -0
  146. fiberpath-0.3.0/fiberpath_gui/src/styles/index.css +29 -0
  147. fiberpath-0.3.0/fiberpath_gui/src/styles/layout.css +409 -0
  148. fiberpath-0.3.0/fiberpath_gui/src/styles/notifications.css +163 -0
  149. fiberpath-0.3.0/fiberpath_gui/src/styles/panels.css +444 -0
  150. fiberpath-0.3.0/fiberpath_gui/src/styles/reset.css +45 -0
  151. fiberpath-0.3.0/fiberpath_gui/src/styles/tokens.css +175 -0
  152. fiberpath-0.3.0/fiberpath_gui/src/styles/typography.css +121 -0
  153. fiberpath-0.3.0/fiberpath_gui/src/tests/integration/workflows.test.ts +354 -0
  154. fiberpath-0.3.0/fiberpath_gui/src/tests/setup.ts +33 -0
  155. fiberpath-0.3.0/fiberpath_gui/src/types/components.ts +142 -0
  156. fiberpath-0.3.0/fiberpath_gui/src/types/converters.test.ts +447 -0
  157. fiberpath-0.3.0/fiberpath_gui/src/types/converters.ts +127 -0
  158. fiberpath-0.3.0/fiberpath_gui/src/types/project.ts +146 -0
  159. fiberpath-0.3.0/fiberpath_gui/src/types/wind-schema.ts +72 -0
  160. fiberpath-0.3.0/fiberpath_gui/src-tauri/Cargo.lock +4841 -0
  161. fiberpath-0.3.0/fiberpath_gui/src-tauri/Cargo.toml +20 -0
  162. fiberpath-0.3.0/fiberpath_gui/src-tauri/build.rs +3 -0
  163. fiberpath-0.3.0/fiberpath_gui/src-tauri/capabilities/default.json +11 -0
  164. fiberpath-0.3.0/fiberpath_gui/src-tauri/icons/128x128.png +0 -0
  165. fiberpath-0.3.0/fiberpath_gui/src-tauri/icons/256x256.png +0 -0
  166. fiberpath-0.3.0/fiberpath_gui/src-tauri/icons/32x32.png +0 -0
  167. fiberpath-0.3.0/fiberpath_gui/src-tauri/icons/512x512.png +0 -0
  168. fiberpath-0.3.0/fiberpath_gui/src-tauri/icons/icon.ico +0 -0
  169. fiberpath-0.3.0/fiberpath_gui/src-tauri/src/main.rs +303 -0
  170. fiberpath-0.3.0/fiberpath_gui/src-tauri/tauri.conf.json +41 -0
  171. fiberpath-0.3.0/fiberpath_gui/tsconfig.json +21 -0
  172. fiberpath-0.3.0/fiberpath_gui/tsconfig.node.json +12 -0
  173. fiberpath-0.3.0/fiberpath_gui/vite.config.ts +37 -0
  174. fiberpath-0.3.0/fiberpath_gui/vitest.config.ts +18 -0
  175. fiberpath-0.3.0/mkdocs.yml +47 -0
  176. fiberpath-0.3.0/pyproject.toml +80 -0
  177. fiberpath-0.3.0/roadmap-v1.md +157 -0
  178. fiberpath-0.3.0/roadmap-v2.md +243 -0
  179. fiberpath-0.3.0/roadmap-v3.md +268 -0
  180. fiberpath-0.3.0/roadmap-v4.md +7 -0
  181. fiberpath-0.3.0/roadmap-v5.md +145 -0
  182. fiberpath-0.3.0/scripts/export_schema.py +30 -0
  183. fiberpath-0.3.0/scripts/generate_schema.py +50 -0
  184. fiberpath-0.3.0/setup.cfg +13 -0
  185. fiberpath-0.3.0/tests/api/test_plan_route.py +60 -0
  186. fiberpath-0.3.0/tests/api/test_stream_route.py +23 -0
  187. fiberpath-0.3.0/tests/cli/test_axis_format.py +148 -0
  188. fiberpath-0.3.0/tests/cli/test_cli_json.py +68 -0
  189. fiberpath-0.3.0/tests/cli/test_cli_smoke.py +9 -0
  190. fiberpath-0.3.0/tests/cli/test_stream_command.py +17 -0
  191. fiberpath-0.3.0/tests/cyclone_reference_runs/inputs/helical-balanced.wind +33 -0
  192. fiberpath-0.3.0/tests/cyclone_reference_runs/inputs/simple-hoop.wind +21 -0
  193. fiberpath-0.3.0/tests/cyclone_reference_runs/inputs/skip-bias.wind +41 -0
  194. fiberpath-0.3.0/tests/cyclone_reference_runs/outputs/helical-balanced/output.gcode +43506 -0
  195. fiberpath-0.3.0/tests/cyclone_reference_runs/outputs/helical-balanced/preview.png +0 -0
  196. fiberpath-0.3.0/tests/cyclone_reference_runs/outputs/simple-hoop/output.gcode +1519 -0
  197. fiberpath-0.3.0/tests/cyclone_reference_runs/outputs/simple-hoop/preview.png +0 -0
  198. fiberpath-0.3.0/tests/cyclone_reference_runs/outputs/skip-bias/output.gcode +26889 -0
  199. fiberpath-0.3.0/tests/cyclone_reference_runs/outputs/skip-bias/preview.png +0 -0
  200. fiberpath-0.3.0/tests/execution/test_marlin_streamer.py +198 -0
  201. fiberpath-0.3.0/tests/gcode/test_generator.py +17 -0
  202. fiberpath-0.3.0/tests/geometry/test_surfaces.py +6 -0
  203. fiberpath-0.3.0/tests/planning/_generate_fixtures.py +92 -0
  204. fiberpath-0.3.0/tests/planning/fixtures/helical_layer.gcode +4525 -0
  205. fiberpath-0.3.0/tests/planning/fixtures/hoop_layer.gcode +251 -0
  206. fiberpath-0.3.0/tests/planning/fixtures/hoop_only_program.gcode +214 -0
  207. fiberpath-0.3.0/tests/planning/fixtures/skip_layer.gcode +3 -0
  208. fiberpath-0.3.0/tests/planning/test_axis_mapping.py +265 -0
  209. fiberpath-0.3.0/tests/planning/test_helpers_machine.py +63 -0
  210. fiberpath-0.3.0/tests/planning/test_layer_strategies.py +80 -0
  211. fiberpath-0.3.0/tests/planning/test_planner_smoke.py +82 -0
  212. fiberpath-0.3.0/tests/planning/test_validators.py +37 -0
  213. fiberpath-0.3.0/tests/simulation/test_simulator.py +45 -0
  214. fiberpath-0.3.0/tests/simulation/test_simulator_axis_detection.py +94 -0
  215. fiberpath-0.3.0/tests/visualization/test_plotter.py +82 -0
  216. fiberpath-0.3.0/tests/visualization/test_plotter_axis_detection.py +108 -0
  217. fiberpath-0.3.0/uv.lock +1958 -0
@@ -0,0 +1,5 @@
1
+ *.gcode linguist-generated=true
2
+ *.gco linguist-generated=true
3
+ *.gcnc linguist-generated=true
4
+ *.ngc linguist-generated=true
5
+ *.log linguist-generated=true
@@ -0,0 +1,27 @@
1
+ name: Setup Node.js Environment
2
+ description: Sets up Node.js and installs npm dependencies
3
+
4
+ inputs:
5
+ node-version:
6
+ description: Node.js version to use
7
+ required: false
8
+ default: "20"
9
+ working-directory:
10
+ description: Working directory for npm install
11
+ required: false
12
+ default: "./fiberpath_gui"
13
+
14
+ runs:
15
+ using: composite
16
+ steps:
17
+ - name: Set up Node.js
18
+ uses: actions/setup-node@v4
19
+ with:
20
+ node-version: ${{ inputs.node-version }}
21
+ cache: npm
22
+ cache-dependency-path: ${{ inputs.working-directory }}/package-lock.json
23
+
24
+ - name: Install dependencies
25
+ shell: bash
26
+ working-directory: ${{ inputs.working-directory }}
27
+ run: npm ci
@@ -0,0 +1,46 @@
1
+ name: Setup Python Environment
2
+ description: Sets up Python with uv and installs dependencies
3
+
4
+ inputs:
5
+ python-version:
6
+ description: Python version to use
7
+ required: false
8
+ default: "3.11"
9
+ dependencies:
10
+ description: Dependency groups to install (e.g., ".[dev,api]")
11
+ required: false
12
+ default: ".[dev,api,docs]"
13
+ cache-key-suffix:
14
+ description: Additional suffix for cache key
15
+ required: false
16
+ default: ""
17
+
18
+ runs:
19
+ using: composite
20
+ steps:
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ inputs.python-version }}
25
+
26
+ - name: Set up uv
27
+ uses: astral-sh/setup-uv@v3
28
+ with:
29
+ enable-cache: true
30
+ cache-dependency-glob: "pyproject.toml"
31
+
32
+ - name: Cache Python virtual environment
33
+ uses: actions/cache@v4
34
+ with:
35
+ path: .venv
36
+ key: venv-${{ runner.os }}-${{ inputs.python-version }}-${{ hashFiles('pyproject.toml') }}-${{ inputs.cache-key-suffix }}
37
+ restore-keys: |
38
+ venv-${{ runner.os }}-${{ inputs.python-version }}-
39
+
40
+ - name: Create virtual environment
41
+ shell: bash
42
+ run: uv venv
43
+
44
+ - name: Install dependencies
45
+ shell: bash
46
+ run: uv pip install ${{ inputs.dependencies }}
@@ -0,0 +1,44 @@
1
+ name: Setup Rust Environment
2
+ description: Sets up Rust toolchain with caching and Linux dependencies
3
+
4
+ inputs:
5
+ install-linux-deps:
6
+ description: Whether to install Linux dependencies for Tauri
7
+ required: false
8
+ default: "false"
9
+ working-directory:
10
+ description: Working directory for cargo operations
11
+ required: false
12
+ default: "./fiberpath_gui/src-tauri"
13
+
14
+ runs:
15
+ using: composite
16
+ steps:
17
+ - name: Set up Rust toolchain
18
+ uses: dtolnay/rust-toolchain@stable
19
+
20
+ - name: Cache cargo artifacts
21
+ uses: actions/cache@v4
22
+ with:
23
+ path: |
24
+ ~/.cargo/bin
25
+ ~/.cargo/registry
26
+ ~/.cargo/git
27
+ ${{ inputs.working-directory }}/target
28
+ key: ${{ runner.os }}-cargo-${{ hashFiles(format('{0}/Cargo.lock', inputs.working-directory)) }}
29
+ restore-keys: |
30
+ ${{ runner.os }}-cargo-
31
+
32
+ - name: Install Linux dependencies
33
+ if: runner.os == 'Linux' && inputs.install-linux-deps == 'true'
34
+ shell: bash
35
+ run: |
36
+ sudo apt-get update
37
+ sudo apt-get install -y \
38
+ pkg-config \
39
+ libgtk-3-dev \
40
+ libwebkit2gtk-4.1-dev \
41
+ libjavascriptcoregtk-4.1-dev \
42
+ libayatana-appindicator3-dev \
43
+ librsvg2-dev \
44
+ patchelf
@@ -0,0 +1,73 @@
1
+ name: Backend CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, tabsgui]
6
+ paths:
7
+ - "fiberpath/**"
8
+ - "fiberpath_api/**"
9
+ - "fiberpath_cli/**"
10
+ - "tests/**"
11
+ - "pyproject.toml"
12
+ - "setup.cfg"
13
+ - ".github/workflows/backend-ci.yml"
14
+ - ".github/actions/setup-python/**"
15
+ pull_request:
16
+ paths:
17
+ - "fiberpath/**"
18
+ - "fiberpath_api/**"
19
+ - "fiberpath_cli/**"
20
+ - "tests/**"
21
+ - "pyproject.toml"
22
+ - "setup.cfg"
23
+ - ".github/workflows/backend-ci.yml"
24
+ - ".github/actions/setup-python/**"
25
+
26
+ jobs:
27
+ lint-and-type-check:
28
+ name: Lint & Type Check
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - name: Checkout repository
32
+ uses: actions/checkout@v4
33
+
34
+ - name: Setup Python environment
35
+ uses: ./.github/actions/setup-python
36
+ with:
37
+ dependencies: ".[dev,api,docs]"
38
+
39
+ - name: Run Ruff linter
40
+ run: uv run ruff check
41
+
42
+ - name: Run MyPy type checker
43
+ run: uv run mypy
44
+
45
+ test:
46
+ name: Test (${{ matrix.os }})
47
+ needs: lint-and-type-check
48
+ runs-on: ${{ matrix.os }}
49
+ strategy:
50
+ fail-fast: false
51
+ matrix:
52
+ os: [ubuntu-latest, macos-latest, windows-latest]
53
+ steps:
54
+ - name: Checkout repository
55
+ uses: actions/checkout@v4
56
+
57
+ - name: Setup Python environment
58
+ uses: ./.github/actions/setup-python
59
+ with:
60
+ dependencies: ".[dev,api]"
61
+ cache-key-suffix: ${{ matrix.os }}
62
+
63
+ - name: Run pytest with coverage
64
+ run: uv run pytest -v --cov --cov-report=xml
65
+
66
+ - name: Upload coverage
67
+ if: matrix.os == 'ubuntu-latest'
68
+ uses: codecov/codecov-action@v4
69
+ with:
70
+ files: ./coverage.xml
71
+ flags: backend
72
+ name: backend-${{ matrix.os }}
73
+ fail_ci_if_error: false
@@ -0,0 +1,44 @@
1
+ name: Docs CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, tabsgui]
6
+ paths:
7
+ - "docs/**"
8
+ - "mkdocs.yml"
9
+ - "CONTRIBUTING.md"
10
+ - "README.md"
11
+ - ".github/workflows/docs-ci.yml"
12
+ - ".github/actions/setup-python/**"
13
+ pull_request:
14
+ paths:
15
+ - "docs/**"
16
+ - "mkdocs.yml"
17
+ - "CONTRIBUTING.md"
18
+ - "README.md"
19
+ - ".github/workflows/docs-ci.yml"
20
+ - ".github/actions/setup-python/**"
21
+
22
+ jobs:
23
+ validate:
24
+ name: Validate MkDocs Build
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - name: Checkout repository
28
+ uses: actions/checkout@v4
29
+
30
+ - name: Setup Python environment
31
+ uses: ./.github/actions/setup-python
32
+ with:
33
+ dependencies: ".[docs]"
34
+
35
+ - name: Build MkDocs site
36
+ run: uv run mkdocs build --strict
37
+
38
+ - name: Verify build output
39
+ run: |
40
+ if [ ! -d "site" ]; then
41
+ echo "Build failed - no site directory"
42
+ exit 1
43
+ fi
44
+ echo "MkDocs build successful"
@@ -0,0 +1,59 @@
1
+ name: Docs Deploy
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "docs/**"
8
+ - "mkdocs.yml"
9
+ - "CONTRIBUTING.md"
10
+ - "README.md"
11
+ - ".github/workflows/docs-deploy.yml"
12
+ - ".github/actions/setup-python/**"
13
+ workflow_dispatch:
14
+
15
+ permissions:
16
+ contents: read
17
+ pages: write
18
+ id-token: write
19
+
20
+ concurrency:
21
+ group: pages-${{ github.ref }}
22
+ cancel-in-progress: true
23
+
24
+ jobs:
25
+ build:
26
+ name: Build MkDocs Site
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - name: Checkout repository
30
+ uses: actions/checkout@v4
31
+
32
+ - name: Configure GitHub Pages
33
+ id: pages
34
+ uses: actions/configure-pages@v5
35
+
36
+ - name: Setup Python environment
37
+ uses: ./.github/actions/setup-python
38
+ with:
39
+ dependencies: ".[docs]"
40
+
41
+ - name: Build MkDocs site
42
+ run: uv run mkdocs build --strict --site-dir site
43
+
44
+ - name: Upload Pages artifact
45
+ uses: actions/upload-pages-artifact@v3
46
+ with:
47
+ path: site
48
+
49
+ deploy:
50
+ name: Deploy to GitHub Pages
51
+ needs: build
52
+ runs-on: ubuntu-latest
53
+ environment:
54
+ name: github-pages
55
+ url: ${{ steps.deployment.outputs.page_url }}
56
+ steps:
57
+ - name: Deploy to GitHub Pages
58
+ id: deployment
59
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,75 @@
1
+ name: GUI CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, tabsgui]
6
+ paths:
7
+ - "fiberpath_gui/**"
8
+ - ".github/workflows/gui-ci.yml"
9
+ - ".github/actions/setup-node/**"
10
+ - ".github/actions/setup-rust/**"
11
+ pull_request:
12
+ paths:
13
+ - "fiberpath_gui/**"
14
+ - ".github/workflows/gui-ci.yml"
15
+ - ".github/actions/setup-node/**"
16
+ - ".github/actions/setup-rust/**"
17
+
18
+ jobs:
19
+ lint-and-type-check:
20
+ name: Lint & Type Check
21
+ runs-on: ubuntu-latest
22
+ defaults:
23
+ run:
24
+ working-directory: fiberpath_gui
25
+ steps:
26
+ - name: Checkout repository
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Setup Node.js environment
30
+ uses: ./.github/actions/setup-node
31
+
32
+ - name: Run ESLint
33
+ run: npm run lint
34
+
35
+ - name: Run TypeScript compiler
36
+ run: npx tsc --noEmit
37
+
38
+ test:
39
+ name: Test & Build
40
+ needs: lint-and-type-check
41
+ runs-on: ubuntu-latest
42
+ defaults:
43
+ run:
44
+ working-directory: fiberpath_gui
45
+ steps:
46
+ - name: Checkout repository
47
+ uses: actions/checkout@v4
48
+
49
+ - name: Setup Node.js environment
50
+ uses: ./.github/actions/setup-node
51
+
52
+ - name: Run Vitest
53
+ run: npm test
54
+
55
+ - name: Run tests with coverage
56
+ run: npm run test:coverage
57
+
58
+ - name: Upload coverage
59
+ uses: codecov/codecov-action@v4
60
+ with:
61
+ files: ./fiberpath_gui/coverage/lcov.info
62
+ flags: gui
63
+ name: gui
64
+ fail_ci_if_error: false
65
+
66
+ - name: Build Vite assets
67
+ run: npm run build
68
+
69
+ - name: Verify build output
70
+ run: |
71
+ if [ ! -d "dist" ]; then
72
+ echo "Build failed - no dist directory"
73
+ exit 1
74
+ fi
75
+ echo "Build successful - dist/ directory created"
@@ -0,0 +1,62 @@
1
+ name: GUI Packaging
2
+
3
+ on:
4
+ push:
5
+ branches: [main, tabsgui]
6
+ paths:
7
+ - "fiberpath_gui/**"
8
+ - ".github/workflows/gui-packaging.yml"
9
+ - ".github/actions/setup-node/**"
10
+ - ".github/actions/setup-rust/**"
11
+ workflow_call:
12
+ workflow_dispatch:
13
+ release:
14
+ types: [published]
15
+
16
+ jobs:
17
+ package:
18
+ name: Build Installers (${{ matrix.os }})
19
+ runs-on: ${{ matrix.os }}
20
+ timeout-minutes: 45
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os: [windows-latest, macos-latest, ubuntu-latest]
25
+ defaults:
26
+ run:
27
+ working-directory: fiberpath_gui
28
+ steps:
29
+ - name: Checkout repository
30
+ uses: actions/checkout@v4
31
+
32
+ - name: Setup Node.js environment
33
+ uses: ./.github/actions/setup-node
34
+
35
+ - name: Setup Rust environment
36
+ uses: ./.github/actions/setup-rust
37
+ with:
38
+ install-linux-deps: "true"
39
+
40
+ - name: Build Tauri bundles
41
+ run: npm run package
42
+
43
+ - name: Upload artifacts
44
+ uses: actions/upload-artifact@v4
45
+ with:
46
+ name: fiberpath-gui-${{ matrix.os }}
47
+ path: fiberpath_gui/src-tauri/target/release/bundle
48
+ if-no-files-found: error
49
+ retention-days: 30
50
+
51
+ - name: Upload release assets
52
+ if: github.event_name == 'release'
53
+ uses: softprops/action-gh-release@v2
54
+ with:
55
+ files: |
56
+ fiberpath_gui/src-tauri/target/release/bundle/dmg/*.dmg
57
+ fiberpath_gui/src-tauri/target/release/bundle/nsis/*.exe
58
+ fiberpath_gui/src-tauri/target/release/bundle/msi/*.msi
59
+ fiberpath_gui/src-tauri/target/release/bundle/deb/*.deb
60
+ fiberpath_gui/src-tauri/target/release/bundle/appimage/*.AppImage
61
+ env:
62
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,172 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: Version to release (e.g., 0.3.0)
8
+ required: true
9
+ type: string
10
+ prerelease:
11
+ description: Mark as pre-release
12
+ required: false
13
+ type: boolean
14
+ default: false
15
+
16
+ permissions:
17
+ contents: write
18
+ id-token: write
19
+
20
+ jobs:
21
+ validate:
22
+ name: Validate Release
23
+ runs-on: ubuntu-latest
24
+ outputs:
25
+ tag: ${{ steps.check.outputs.tag }}
26
+ steps:
27
+ - name: Checkout repository
28
+ uses: actions/checkout@v4
29
+ with:
30
+ fetch-depth: 0
31
+
32
+ - name: Setup Python environment
33
+ uses: ./.github/actions/setup-python
34
+
35
+ - name: Validate version format
36
+ id: check
37
+ run: |
38
+ VERSION="${{ inputs.version }}"
39
+ if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$ ]]; then
40
+ echo "Error: Invalid version format. Use semantic versioning (e.g., 0.3.0 or 0.3.0-rc.1)"
41
+ exit 1
42
+ fi
43
+ TAG="v$VERSION"
44
+ echo "tag=$TAG" >> $GITHUB_OUTPUT
45
+ echo "Release tag: $TAG"
46
+
47
+ - name: Check if tag already exists
48
+ run: |
49
+ TAG="${{ steps.check.outputs.tag }}"
50
+ if git rev-parse "$TAG" >/dev/null 2>&1; then
51
+ echo "Error: Tag $TAG already exists"
52
+ exit 1
53
+ fi
54
+ echo "Tag $TAG is available"
55
+
56
+ - name: Verify version in pyproject.toml
57
+ run: |
58
+ VERSION="${{ inputs.version }}"
59
+ PYPROJECT_VERSION=$(grep -E '^version = ' pyproject.toml | cut -d'"' -f2)
60
+ if [ "$VERSION" != "$PYPROJECT_VERSION" ]; then
61
+ echo "Warning: Input version ($VERSION) doesn't match pyproject.toml ($PYPROJECT_VERSION)"
62
+ echo "Please update pyproject.toml before releasing"
63
+ exit 1
64
+ fi
65
+
66
+ create-release:
67
+ name: Create GitHub Release
68
+ needs: validate
69
+ runs-on: ubuntu-latest
70
+ steps:
71
+ - name: Checkout repository
72
+ uses: actions/checkout@v4
73
+
74
+ - name: Create release tag
75
+ run: |
76
+ git config user.name "github-actions[bot]"
77
+ git config user.email "github-actions[bot]@users.noreply.github.com"
78
+ git tag -a ${{ needs.validate.outputs.tag }} -m "Release ${{ inputs.version }}"
79
+ git push origin ${{ needs.validate.outputs.tag }}
80
+
81
+ - name: Get previous tag
82
+ id: previous-tag
83
+ run: |
84
+ PREV_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
85
+ echo "previous=$PREV_TAG" >> $GITHUB_OUTPUT
86
+ echo "Previous tag: ${PREV_TAG:-none}"
87
+
88
+ - name: Generate release notes
89
+ id: notes
90
+ uses: actions/github-script@v7
91
+ with:
92
+ script: |
93
+ const prevTag = '${{ steps.previous-tag.outputs.previous }}';
94
+ const newTag = '${{ needs.validate.outputs.tag }}';
95
+
96
+ if (!prevTag) {
97
+ return `## Release ${newTag}\n\nInitial release.`;
98
+ }
99
+
100
+ const { data: commits } = await github.rest.repos.compareCommits({
101
+ owner: context.repo.owner,
102
+ repo: context.repo.repo,
103
+ base: prevTag,
104
+ head: newTag
105
+ });
106
+
107
+ const changes = commits.commits
108
+ .map(c => `- ${c.commit.message.split('\n')[0]} (${c.sha.substring(0, 7)})`)
109
+ .join('\n');
110
+
111
+ return `## What's Changed\n\n${changes}\n\n**Full Changelog**: https://github.com/${{ github.repository }}/compare/${prevTag}...${newTag}`;
112
+ result-encoding: string
113
+
114
+ - name: Create GitHub Release
115
+ uses: softprops/action-gh-release@v2
116
+ with:
117
+ tag_name: ${{ needs.validate.outputs.tag }}
118
+ name: Release ${{ inputs.version }}
119
+ body: ${{ steps.notes.outputs.result }}
120
+ draft: false
121
+ prerelease: ${{ inputs.prerelease }}
122
+ env:
123
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
124
+
125
+ publish-backend:
126
+ name: Publish Backend to PyPI
127
+ needs: [validate, create-release]
128
+ runs-on: ubuntu-latest
129
+ environment:
130
+ name: pypi
131
+ url: https://pypi.org/project/fiberpath/
132
+ steps:
133
+ - name: Checkout repository
134
+ uses: actions/checkout@v4
135
+
136
+ - name: Setup Python environment
137
+ uses: ./.github/actions/setup-python
138
+ with:
139
+ dependencies: ".[dev]"
140
+
141
+ - name: Verify version matches tag
142
+ run: |
143
+ TAG_VERSION="${{ inputs.version }}"
144
+ PACKAGE_VERSION=$(uv run python -c "import fiberpath; print(fiberpath.__version__)")
145
+ if [ "$TAG_VERSION" != "$PACKAGE_VERSION" ]; then
146
+ echo "Error: Tag version ($TAG_VERSION) doesn't match package version ($PACKAGE_VERSION)"
147
+ exit 1
148
+ fi
149
+ echo "Version check passed: $PACKAGE_VERSION"
150
+
151
+ - name: Build distribution packages
152
+ run: uv build
153
+
154
+ - name: Verify build artifacts
155
+ run: |
156
+ if [ ! -d "dist" ] || [ -z "$(ls -A dist)" ]; then
157
+ echo "Error: No distribution files in dist/"
158
+ exit 1
159
+ fi
160
+ echo "Built packages:"
161
+ ls -lh dist/
162
+
163
+ - name: Publish to PyPI
164
+ uses: pypa/gh-action-pypi-publish@release/v1
165
+ with:
166
+ print-hash: true
167
+
168
+ build-gui-installers:
169
+ name: Build GUI Installers
170
+ needs: [validate, create-release]
171
+ uses: ./.github/workflows/gui-packaging.yml
172
+ secrets: inherit