gbdraw 0.14.0__py3-none-any.whl

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 (624) hide show
  1. gbdraw/__init__.py +58 -0
  2. gbdraw/_build_support.py +261 -0
  3. gbdraw/_web_assets.py +197 -0
  4. gbdraw/analysis/__init__.py +49 -0
  5. gbdraw/analysis/collinearity.py +1794 -0
  6. gbdraw/analysis/collinearity_units.py +303 -0
  7. gbdraw/analysis/conservation.py +603 -0
  8. gbdraw/analysis/depth.py +300 -0
  9. gbdraw/analysis/depth_tracks.py +833 -0
  10. gbdraw/analysis/gc.py +115 -0
  11. gbdraw/analysis/ortholog_paths.py +436 -0
  12. gbdraw/analysis/protein_artifacts.py +835 -0
  13. gbdraw/analysis/protein_colinearity.py +6669 -0
  14. gbdraw/analysis/skew.py +153 -0
  15. gbdraw/annotations/__init__.py +92 -0
  16. gbdraw/annotations/feature_underlays.py +228 -0
  17. gbdraw/annotations/io.py +340 -0
  18. gbdraw/annotations/label_search.py +28 -0
  19. gbdraw/annotations/layout.py +265 -0
  20. gbdraw/annotations/legend.py +68 -0
  21. gbdraw/annotations/models.py +522 -0
  22. gbdraw/annotations/planning.py +116 -0
  23. gbdraw/annotations/resolve.py +460 -0
  24. gbdraw/api/__init__.py +411 -0
  25. gbdraw/api/config.py +55 -0
  26. gbdraw/api/diagram.py +4113 -0
  27. gbdraw/api/io.py +196 -0
  28. gbdraw/api/migration_report.py +25 -0
  29. gbdraw/api/options.py +1601 -0
  30. gbdraw/api/prepared.py +965 -0
  31. gbdraw/api/record_planning.py +1836 -0
  32. gbdraw/api/region_drawing.py +525 -0
  33. gbdraw/api/render.py +240 -0
  34. gbdraw/api/request_render.py +3350 -0
  35. gbdraw/api/requests.py +856 -0
  36. gbdraw/api/session_compat.py +1893 -0
  37. gbdraw/api/tracks.py +53 -0
  38. gbdraw/auto_sizes.py +349 -0
  39. gbdraw/canvas/__init__.py +16 -0
  40. gbdraw/canvas/circular.py +182 -0
  41. gbdraw/canvas/linear.py +426 -0
  42. gbdraw/circular.py +1532 -0
  43. gbdraw/cli.py +248 -0
  44. gbdraw/cli_utils/__init__.py +28 -0
  45. gbdraw/cli_utils/common.py +772 -0
  46. gbdraw/cli_utils/losat_output.py +39 -0
  47. gbdraw/cli_utils/session.py +1348 -0
  48. gbdraw/comparisons/__init__.py +1 -0
  49. gbdraw/comparisons/circular_losat.py +254 -0
  50. gbdraw/comparisons/linear_losat.py +278 -0
  51. gbdraw/comparisons/losat_jobs.py +485 -0
  52. gbdraw/comparisons/losat_runtime.py +916 -0
  53. gbdraw/config/__init__.py +3 -0
  54. gbdraw/config/models/__init__.py +39 -0
  55. gbdraw/config/models/canvas.py +262 -0
  56. gbdraw/config/models/common.py +24 -0
  57. gbdraw/config/models/labels.py +286 -0
  58. gbdraw/config/models/objects.py +662 -0
  59. gbdraw/config/models/render_profiles.py +113 -0
  60. gbdraw/config/models/root.py +173 -0
  61. gbdraw/config/modify.py +502 -0
  62. gbdraw/config/toml.py +54 -0
  63. gbdraw/configurators/__init__.py +21 -0
  64. gbdraw/configurators/blast.py +106 -0
  65. gbdraw/configurators/depth.py +58 -0
  66. gbdraw/configurators/features.py +101 -0
  67. gbdraw/configurators/gc.py +128 -0
  68. gbdraw/configurators/legend.py +375 -0
  69. gbdraw/contract_shapes.py +370 -0
  70. gbdraw/core/__init__.py +3 -0
  71. gbdraw/core/color.py +119 -0
  72. gbdraw/core/fonts.py +1044 -0
  73. gbdraw/core/numeric.py +194 -0
  74. gbdraw/core/record_metadata.py +354 -0
  75. gbdraw/core/sequence.py +167 -0
  76. gbdraw/core/text.py +811 -0
  77. gbdraw/crop_genbank.py +267 -0
  78. gbdraw/data/LiberationMono-Bold.ttf +0 -0
  79. gbdraw/data/LiberationMono-BoldItalic.ttf +0 -0
  80. gbdraw/data/LiberationMono-Italic.ttf +0 -0
  81. gbdraw/data/LiberationMono-Regular.ttf +0 -0
  82. gbdraw/data/LiberationSans-Bold.ttf +0 -0
  83. gbdraw/data/LiberationSans-BoldItalic.ttf +0 -0
  84. gbdraw/data/LiberationSans-Italic.ttf +0 -0
  85. gbdraw/data/LiberationSans-Regular.ttf +0 -0
  86. gbdraw/data/LiberationSerif-Bold.ttf +0 -0
  87. gbdraw/data/LiberationSerif-BoldItalic.ttf +0 -0
  88. gbdraw/data/LiberationSerif-Italic.ttf +0 -0
  89. gbdraw/data/LiberationSerif-Regular.ttf +0 -0
  90. gbdraw/data/__init__.py +0 -0
  91. gbdraw/data/color_palettes.toml +841 -0
  92. gbdraw/data/config.toml +425 -0
  93. gbdraw/data/losat-release.json +39 -0
  94. gbdraw/definition_line_styles.py +206 -0
  95. gbdraw/diagrams/__init__.py +16 -0
  96. gbdraw/diagrams/circular/__init__.py +15 -0
  97. gbdraw/diagrams/circular/assemble.py +3411 -0
  98. gbdraw/diagrams/circular/builders.py +542 -0
  99. gbdraw/diagrams/circular/positioning.py +136 -0
  100. gbdraw/diagrams/circular/presets.py +532 -0
  101. gbdraw/diagrams/circular/radial_layout.py +2795 -0
  102. gbdraw/diagrams/linear/__init__.py +7 -0
  103. gbdraw/diagrams/linear/annotation_labels.py +617 -0
  104. gbdraw/diagrams/linear/assemble.py +3403 -0
  105. gbdraw/diagrams/linear/builders.py +559 -0
  106. gbdraw/diagrams/linear/orthogroup_alignment.py +272 -0
  107. gbdraw/diagrams/linear/positioning.py +39 -0
  108. gbdraw/diagrams/linear/precalc.py +289 -0
  109. gbdraw/diagrams/linear/track_slots.py +795 -0
  110. gbdraw/exceptions.py +127 -0
  111. gbdraw/features/__init__.py +90 -0
  112. gbdraw/features/colors.py +164 -0
  113. gbdraw/features/coordinates.py +247 -0
  114. gbdraw/features/factory.py +425 -0
  115. gbdraw/features/ids.py +343 -0
  116. gbdraw/features/objects.py +291 -0
  117. gbdraw/features/overrides.py +328 -0
  118. gbdraw/features/placement.py +512 -0
  119. gbdraw/features/selector_values.py +477 -0
  120. gbdraw/features/shapes.py +155 -0
  121. gbdraw/features/source.py +369 -0
  122. gbdraw/features/tracks.py +465 -0
  123. gbdraw/features/visibility.py +369 -0
  124. gbdraw/interface.py +1254 -0
  125. gbdraw/io/__init__.py +8 -0
  126. gbdraw/io/cli_tables.py +999 -0
  127. gbdraw/io/colors.py +530 -0
  128. gbdraw/io/comparison_sequences.py +184 -0
  129. gbdraw/io/comparisons.py +390 -0
  130. gbdraw/io/filenames.py +51 -0
  131. gbdraw/io/genome.py +492 -0
  132. gbdraw/io/record_select.py +170 -0
  133. gbdraw/io/regions.py +412 -0
  134. gbdraw/io/table_text.py +214 -0
  135. gbdraw/labels/__init__.py +3 -0
  136. gbdraw/labels/circular.py +5531 -0
  137. gbdraw/labels/circular_candidates.py +110 -0
  138. gbdraw/labels/circular_fit.py +658 -0
  139. gbdraw/labels/circular_leaders.py +228 -0
  140. gbdraw/labels/circular_radial.py +456 -0
  141. gbdraw/labels/circular_repair.py +938 -0
  142. gbdraw/labels/circular_types.py +175 -0
  143. gbdraw/labels/coordinates.py +77 -0
  144. gbdraw/labels/filtering.py +589 -0
  145. gbdraw/labels/fit.py +728 -0
  146. gbdraw/labels/label_ink.py +241 -0
  147. gbdraw/labels/label_style.py +146 -0
  148. gbdraw/labels/linear.py +1318 -0
  149. gbdraw/labels/linear_types.py +90 -0
  150. gbdraw/labels/policy.py +24 -0
  151. gbdraw/layout/__init__.py +45 -0
  152. gbdraw/layout/_immutable.py +30 -0
  153. gbdraw/layout/circular.py +448 -0
  154. gbdraw/layout/circular_depth_axis.py +86 -0
  155. gbdraw/layout/common.py +16 -0
  156. gbdraw/layout/composition.py +778 -0
  157. gbdraw/layout/linear.py +735 -0
  158. gbdraw/layout/linear_coords.py +17 -0
  159. gbdraw/layout/linear_multi_record.py +479 -0
  160. gbdraw/layout/record_coordinates.py +438 -0
  161. gbdraw/layout/record_labels.py +21 -0
  162. gbdraw/layout/record_placement.py +184 -0
  163. gbdraw/layout/scalar_axis.py +210 -0
  164. gbdraw/layout/similarity_alignment.py +1041 -0
  165. gbdraw/layout/spatial.py +362 -0
  166. gbdraw/layout/text_geometry.py +362 -0
  167. gbdraw/legend/__init__.py +3 -0
  168. gbdraw/legend/circular_layout.py +571 -0
  169. gbdraw/legend/linear_layout.py +470 -0
  170. gbdraw/legend/metrics.py +47 -0
  171. gbdraw/legend/row_facts.py +149 -0
  172. gbdraw/legend/sources.py +215 -0
  173. gbdraw/legend/table.py +630 -0
  174. gbdraw/linear.py +1834 -0
  175. gbdraw/linear_comparison.py +499 -0
  176. gbdraw/losat_setup.py +269 -0
  177. gbdraw/mode_profiles.py +303 -0
  178. gbdraw/render/__init__.py +9 -0
  179. gbdraw/render/composition.py +403 -0
  180. gbdraw/render/document.py +163 -0
  181. gbdraw/render/drawers/__init__.py +11 -0
  182. gbdraw/render/drawers/annotation_marks.py +135 -0
  183. gbdraw/render/drawers/circular/__init__.py +20 -0
  184. gbdraw/render/drawers/circular/annotations.py +863 -0
  185. gbdraw/render/drawers/circular/conservation.py +152 -0
  186. gbdraw/render/drawers/circular/definition.py +108 -0
  187. gbdraw/render/drawers/circular/depth.py +182 -0
  188. gbdraw/render/drawers/circular/features.py +563 -0
  189. gbdraw/render/drawers/circular/gc_content.py +256 -0
  190. gbdraw/render/drawers/circular/gc_skew.py +89 -0
  191. gbdraw/render/drawers/circular/labels.py +219 -0
  192. gbdraw/render/drawers/label_backing.py +249 -0
  193. gbdraw/render/drawers/linear/__init__.py +18 -0
  194. gbdraw/render/drawers/linear/annotations.py +524 -0
  195. gbdraw/render/drawers/linear/depth.py +198 -0
  196. gbdraw/render/drawers/linear/features.py +348 -0
  197. gbdraw/render/drawers/linear/gc_content.py +289 -0
  198. gbdraw/render/drawers/linear/gc_skew.py +101 -0
  199. gbdraw/render/drawers/linear/labels.py +39 -0
  200. gbdraw/render/export.py +383 -0
  201. gbdraw/render/font_embedding.py +618 -0
  202. gbdraw/render/formats.py +174 -0
  203. gbdraw/render/group_content.py +342 -0
  204. gbdraw/render/groups/__init__.py +11 -0
  205. gbdraw/render/groups/circular/__init__.py +28 -0
  206. gbdraw/render/groups/circular/axis.py +43 -0
  207. gbdraw/render/groups/circular/conservation.py +115 -0
  208. gbdraw/render/groups/circular/definition.py +508 -0
  209. gbdraw/render/groups/circular/depth.py +58 -0
  210. gbdraw/render/groups/circular/gc_content.py +63 -0
  211. gbdraw/render/groups/circular/gc_skew.py +63 -0
  212. gbdraw/render/groups/circular/labels.py +111 -0
  213. gbdraw/render/groups/circular/legend.py +258 -0
  214. gbdraw/render/groups/circular/seq_record.py +138 -0
  215. gbdraw/render/groups/circular/ticks.py +126 -0
  216. gbdraw/render/groups/linear/__init__.py +32 -0
  217. gbdraw/render/groups/linear/definition.py +464 -0
  218. gbdraw/render/groups/linear/depth.py +77 -0
  219. gbdraw/render/groups/linear/feature_identity.py +68 -0
  220. gbdraw/render/groups/linear/gc_content.py +112 -0
  221. gbdraw/render/groups/linear/gc_skew.py +86 -0
  222. gbdraw/render/groups/linear/legend.py +309 -0
  223. gbdraw/render/groups/linear/length_bar.py +339 -0
  224. gbdraw/render/groups/linear/pairwise_match.py +649 -0
  225. gbdraw/render/groups/linear/plot_title.py +52 -0
  226. gbdraw/render/groups/linear/seq_record.py +487 -0
  227. gbdraw/render/interactive_context.py +211 -0
  228. gbdraw/render/interactive_svg.py +1783 -0
  229. gbdraw/render/label_binding.py +26 -0
  230. gbdraw/render/output_paths.py +279 -0
  231. gbdraw/render/patterns.py +59 -0
  232. gbdraw/render/track_slot_metadata.py +62 -0
  233. gbdraw/render_stages.py +930 -0
  234. gbdraw/session.py +1578 -0
  235. gbdraw/session_contract.py +504 -0
  236. gbdraw/session_drawings.py +492 -0
  237. gbdraw/session_io.py +7256 -0
  238. gbdraw/session_legacy_values.py +32 -0
  239. gbdraw/session_migration.py +616 -0
  240. gbdraw/session_request_codec.py +5601 -0
  241. gbdraw/session_resources.py +361 -0
  242. gbdraw/svg/__init__.py +3 -0
  243. gbdraw/svg/arrows.py +169 -0
  244. gbdraw/svg/circular_conservation.py +85 -0
  245. gbdraw/svg/circular_features.py +886 -0
  246. gbdraw/svg/circular_ticks.py +674 -0
  247. gbdraw/svg/circular_tracks.py +226 -0
  248. gbdraw/svg/elements.py +105 -0
  249. gbdraw/svg/ids.py +149 -0
  250. gbdraw/svg/linear_features.py +420 -0
  251. gbdraw/svg/linear_tracks.py +197 -0
  252. gbdraw/svg/text_path.py +68 -0
  253. gbdraw/tracks/__init__.py +68 -0
  254. gbdraw/tracks/circular.py +916 -0
  255. gbdraw/tracks/linear.py +605 -0
  256. gbdraw/tracks/parsing.py +314 -0
  257. gbdraw/tracks/scalars.py +77 -0
  258. gbdraw/version.py +7 -0
  259. gbdraw/web/__init__.py +0 -0
  260. gbdraw/web/assets/favicon.ico +0 -0
  261. gbdraw/web/assets/gbdraw-logo-title-outlined.svg +5 -0
  262. gbdraw/web/assets/gbdraw-logo-title.png +0 -0
  263. gbdraw/web/assets/gbdraw-logo-title.svg +108 -0
  264. gbdraw/web/assets/gbdraw-logo.svg +100 -0
  265. gbdraw/web/css/tailwind.css +103 -0
  266. gbdraw/web/gallery/palettes/palettes.json +853 -0
  267. gbdraw/web/gbdraw-0.14.0-py3-none-any.whl +0 -0
  268. gbdraw/web/index.html +9071 -0
  269. gbdraw/web/js/app/annotations/record-catalog.js +292 -0
  270. gbdraw/web/js/app/annotations/record-selector.js +223 -0
  271. gbdraw/web/js/app/annotations/table-codec.js +242 -0
  272. gbdraw/web/js/app/annotations/target-actions.js +138 -0
  273. gbdraw/web/js/app/annotations/validation.js +78 -0
  274. gbdraw/web/js/app/annotations.js +349 -0
  275. gbdraw/web/js/app/app-messages.js +151 -0
  276. gbdraw/web/js/app/app-setup.js +7641 -0
  277. gbdraw/web/js/app/auto-value-display.js +619 -0
  278. gbdraw/web/js/app/candidate-render.js +956 -0
  279. gbdraw/web/js/app/circular-track-slots/measure-input.js +84 -0
  280. gbdraw/web/js/app/circular-track-slots/track-index-input.js +46 -0
  281. gbdraw/web/js/app/circular-track-slots.js +2014 -0
  282. gbdraw/web/js/app/comparison-ui.js +665 -0
  283. gbdraw/web/js/app/depth-tracks.js +29 -0
  284. gbdraw/web/js/app/feature-editor/color-actions.js +1940 -0
  285. gbdraw/web/js/app/feature-editor/feature-edit-table.js +181 -0
  286. gbdraw/web/js/app/feature-editor/label-actions.js +1842 -0
  287. gbdraw/web/js/app/feature-editor/pattern-drafts.js +118 -0
  288. gbdraw/web/js/app/feature-editor/placement-actions.js +266 -0
  289. gbdraw/web/js/app/feature-editor/rule-actions.js +1162 -0
  290. gbdraw/web/js/app/feature-editor/svg-actions.js +2165 -0
  291. gbdraw/web/js/app/feature-editor/visibility-actions.js +791 -0
  292. gbdraw/web/js/app/feature-editor.js +324 -0
  293. gbdraw/web/js/app/feature-search/preview-actions.js +522 -0
  294. gbdraw/web/js/app/feature-search/preview-svg.js +274 -0
  295. gbdraw/web/js/app/feature-search/search-core.js +837 -0
  296. gbdraw/web/js/app/feature-selection.js +784 -0
  297. gbdraw/web/js/app/font-settings.js +400 -0
  298. gbdraw/web/js/app/history-inputs.js +297 -0
  299. gbdraw/web/js/app/history-shortcuts.js +66 -0
  300. gbdraw/web/js/app/label-fit-dialog.js +191 -0
  301. gbdraw/web/js/app/legend/drag-actions.js +241 -0
  302. gbdraw/web/js/app/legend/entry-actions.js +895 -0
  303. gbdraw/web/js/app/legend/layout-actions.js +243 -0
  304. gbdraw/web/js/app/legend/sort-actions.js +87 -0
  305. gbdraw/web/js/app/legend/stroke-actions.js +152 -0
  306. gbdraw/web/js/app/legend/track-data-styles.js +138 -0
  307. gbdraw/web/js/app/legend-layout/canvas-actions.js +110 -0
  308. gbdraw/web/js/app/legend-layout/composition-actions.js +1603 -0
  309. gbdraw/web/js/app/legend-layout/decoration-continuity.js +173 -0
  310. gbdraw/web/js/app/legend-layout/diagram-drag.js +573 -0
  311. gbdraw/web/js/app/legend-layout/reposition-actions.js +156 -0
  312. gbdraw/web/js/app/legend-layout.js +175 -0
  313. gbdraw/web/js/app/legend.js +111 -0
  314. gbdraw/web/js/app/linear-record-selector.js +408 -0
  315. gbdraw/web/js/app/linear-track-slots.js +1174 -0
  316. gbdraw/web/js/app/linear-typography.js +58 -0
  317. gbdraw/web/js/app/losat-settings.js +236 -0
  318. gbdraw/web/js/app/orthogroups.js +1012 -0
  319. gbdraw/web/js/app/pairwise-match-popup.js +2473 -0
  320. gbdraw/web/js/app/palettes.js +113 -0
  321. gbdraw/web/js/app/preview-item-popup.js +513 -0
  322. gbdraw/web/js/app/preview-runtime.js +1162 -0
  323. gbdraw/web/js/app/python-helpers.js +1801 -0
  324. gbdraw/web/js/app/record-display/feature-anchor.js +433 -0
  325. gbdraw/web/js/app/record-display/feature-record-rotation.js +670 -0
  326. gbdraw/web/js/app/record-display-options.js +549 -0
  327. gbdraw/web/js/app/record-groups.js +94 -0
  328. gbdraw/web/js/app/record-selection.js +227 -0
  329. gbdraw/web/js/app/result-paint-record.js +188 -0
  330. gbdraw/web/js/app/results.js +283 -0
  331. gbdraw/web/js/app/right-drawer.js +87 -0
  332. gbdraw/web/js/app/rule-matching.js +392 -0
  333. gbdraw/web/js/app/run-analysis.js +6363 -0
  334. gbdraw/web/js/app/run-info.js +2339 -0
  335. gbdraw/web/js/app/settings-pane.js +239 -0
  336. gbdraw/web/js/app/similarity-alignment.js +2380 -0
  337. gbdraw/web/js/app/svg-styles.js +357 -0
  338. gbdraw/web/js/app/track-slot-colors.js +111 -0
  339. gbdraw/web/js/app/track-slot-edits.js +64 -0
  340. gbdraw/web/js/app/ui-language.js +72 -0
  341. gbdraw/web/js/app/ui.js +592 -0
  342. gbdraw/web/js/app/watchers.js +675 -0
  343. gbdraw/web/js/app.js +68 -0
  344. gbdraw/web/js/components.js +1005 -0
  345. gbdraw/web/js/config.js +25 -0
  346. gbdraw/web/js/contracts/request-shape.generated.js +1569 -0
  347. gbdraw/web/js/contracts/request.generated.js +488 -0
  348. gbdraw/web/js/contracts/schema.generated.js +255 -0
  349. gbdraw/web/js/contracts/session-shape.generated.js +795 -0
  350. gbdraw/web/js/contracts/session.generated.js +795 -0
  351. gbdraw/web/js/mode-profiles.generated.js +114 -0
  352. gbdraw/web/js/mode-profiles.js +247 -0
  353. gbdraw/web/js/mode-scoped-settings.generated.js +242 -0
  354. gbdraw/web/js/services/alignment-review-view.js +298 -0
  355. gbdraw/web/js/services/annotation-state.js +214 -0
  356. gbdraw/web/js/services/artifact-slot.js +111 -0
  357. gbdraw/web/js/services/bounded-json-transport.js +237 -0
  358. gbdraw/web/js/services/browser-preferences.js +63 -0
  359. gbdraw/web/js/services/byte-utils.js +132 -0
  360. gbdraw/web/js/services/canonical-comparisons.js +71 -0
  361. gbdraw/web/js/services/canonical-resource-references.js +36 -0
  362. gbdraw/web/js/services/circular-track-measure.js +98 -0
  363. gbdraw/web/js/services/circular-track-slot-model.js +1132 -0
  364. gbdraw/web/js/services/comparison-warnings.js +44 -0
  365. gbdraw/web/js/services/config-field-readers.js +1550 -0
  366. gbdraw/web/js/services/config.js +6869 -0
  367. gbdraw/web/js/services/conservation-series.js +412 -0
  368. gbdraw/web/js/services/current-option-values.js +392 -0
  369. gbdraw/web/js/services/current-worker-result-source.js +61 -0
  370. gbdraw/web/js/services/definition-line-style-state.js +109 -0
  371. gbdraw/web/js/services/depth-file-codec.js +98 -0
  372. gbdraw/web/js/services/depth-track-state.js +915 -0
  373. gbdraw/web/js/services/diagram-generation.js +1084 -0
  374. gbdraw/web/js/services/diagram-resource-staging.js +188 -0
  375. gbdraw/web/js/services/diagram-worker-protocol.js +177 -0
  376. gbdraw/web/js/services/drawn-groups.js +60 -0
  377. gbdraw/web/js/services/export.js +625 -0
  378. gbdraw/web/js/services/feature-catalog.js +1412 -0
  379. gbdraw/web/js/services/feature-dom.js +133 -0
  380. gbdraw/web/js/services/feature-edit-migration.js +784 -0
  381. gbdraw/web/js/services/feature-identity.js +347 -0
  382. gbdraw/web/js/services/feature-metadata-extraction.js +517 -0
  383. gbdraw/web/js/services/feature-override-identity.js +321 -0
  384. gbdraw/web/js/services/feature-placement.js +446 -0
  385. gbdraw/web/js/services/feature-selector.js +253 -0
  386. gbdraw/web/js/services/feature-sequence-fasta.js +236 -0
  387. gbdraw/web/js/services/feature-utils.js +375 -0
  388. gbdraw/web/js/services/feature-visibility.js +1067 -0
  389. gbdraw/web/js/services/file-content-cache.js +123 -0
  390. gbdraw/web/js/services/file-imports.js +457 -0
  391. gbdraw/web/js/services/font-families.js +149 -0
  392. gbdraw/web/js/services/font-store.js +305 -0
  393. gbdraw/web/js/services/gallery-examples.js +113 -0
  394. gbdraw/web/js/services/gallery-session-migration.js +785 -0
  395. gbdraw/web/js/services/gallery-session-publication.js +486 -0
  396. gbdraw/web/js/services/genbank-header.js +138 -0
  397. gbdraw/web/js/services/history-files.js +138 -0
  398. gbdraw/web/js/services/history-snapshot.js +2160 -0
  399. gbdraw/web/js/services/history.js +1831 -0
  400. gbdraw/web/js/services/imported-comparison-intent.js +629 -0
  401. gbdraw/web/js/services/json-clone.js +29 -0
  402. gbdraw/web/js/services/label-fit.js +225 -0
  403. gbdraw/web/js/services/label-override-table.js +203 -0
  404. gbdraw/web/js/services/layout-preferences.js +451 -0
  405. gbdraw/web/js/services/legacy-render-request.js +453 -0
  406. gbdraw/web/js/services/legacy-similarity-alignment.js +290 -0
  407. gbdraw/web/js/services/legend-layout.js +1148 -0
  408. gbdraw/web/js/services/legend-row-names.js +133 -0
  409. gbdraw/web/js/services/legend-svg.js +785 -0
  410. gbdraw/web/js/services/linear-comparisons.js +1148 -0
  411. gbdraw/web/js/services/linear-label-visibility.js +94 -0
  412. gbdraw/web/js/services/linear-record-layout.js +197 -0
  413. gbdraw/web/js/services/linear-sources.js +528 -0
  414. gbdraw/web/js/services/linear-track-slot-model.js +760 -0
  415. gbdraw/web/js/services/losat-cache.js +997 -0
  416. gbdraw/web/js/services/losat-normalization.js +91 -0
  417. gbdraw/web/js/services/losat-runtime.js +227 -0
  418. gbdraw/web/js/services/losat-thread-plan.js +65 -0
  419. gbdraw/web/js/services/losat.js +1093 -0
  420. gbdraw/web/js/services/main-session-comparison-frame.js +335 -0
  421. gbdraw/web/js/services/match-sequences.js +1251 -0
  422. gbdraw/web/js/services/mode-scoped-migration.js +577 -0
  423. gbdraw/web/js/services/orthogroup-feature-metadata.js +720 -0
  424. gbdraw/web/js/services/pdf-fonts.js +201 -0
  425. gbdraw/web/js/services/pyodide-assets.js +54 -0
  426. gbdraw/web/js/services/record-discovery.js +440 -0
  427. gbdraw/web/js/services/record-display-model.js +349 -0
  428. gbdraw/web/js/services/record-draw-selection.js +380 -0
  429. gbdraw/web/js/services/record-options.js +363 -0
  430. gbdraw/web/js/services/record-source-coordinates.js +88 -0
  431. gbdraw/web/js/services/reset.js +240 -0
  432. gbdraw/web/js/services/resource-payload-owner.js +37 -0
  433. gbdraw/web/js/services/result-normalization.js +82 -0
  434. gbdraw/web/js/services/result-paint-bases.js +38 -0
  435. gbdraw/web/js/services/right-drawer-state.js +120 -0
  436. gbdraw/web/js/services/rule-matchers.js +217 -0
  437. gbdraw/web/js/services/runtime-capabilities.js +98 -0
  438. gbdraw/web/js/services/runtime-test-hooks.js +33 -0
  439. gbdraw/web/js/services/safe-object-keys.js +44 -0
  440. gbdraw/web/js/services/session-active-config-contract.js +638 -0
  441. gbdraw/web/js/services/session-authority.js +1582 -0
  442. gbdraw/web/js/services/session-feature-metadata.js +260 -0
  443. gbdraw/web/js/services/session-feature-recovery.js +1289 -0
  444. gbdraw/web/js/services/session-file.js +367 -0
  445. gbdraw/web/js/services/session-fonts.js +97 -0
  446. gbdraw/web/js/services/session-import-client.js +113 -0
  447. gbdraw/web/js/services/session-request.js +6877 -0
  448. gbdraw/web/js/services/session-resource-backing.js +715 -0
  449. gbdraw/web/js/services/session-resources.js +528 -0
  450. gbdraw/web/js/services/setting-application.js +183 -0
  451. gbdraw/web/js/services/settings-pane-state.js +110 -0
  452. gbdraw/web/js/services/settings-sections.js +187 -0
  453. gbdraw/web/js/services/specific-color-rules.js +680 -0
  454. gbdraw/web/js/services/standalone-interactivity-assets.js +6918 -0
  455. gbdraw/web/js/services/standalone-interactivity.js +2146 -0
  456. gbdraw/web/js/services/style-overrides.js +132 -0
  457. gbdraw/web/js/services/svg-result-ingestion.js +1851 -0
  458. gbdraw/web/js/services/svg-result-normalization.js +177 -0
  459. gbdraw/web/js/services/svg-sanitization.js +242 -0
  460. gbdraw/web/js/services/svg-serialization.js +248 -0
  461. gbdraw/web/js/services/svg-transform.js +89 -0
  462. gbdraw/web/js/services/text-download.js +52 -0
  463. gbdraw/web/js/services/track-legend-rows.js +363 -0
  464. gbdraw/web/js/services/track-slot-display.js +238 -0
  465. gbdraw/web/js/services/track-slot-validation.js +1808 -0
  466. gbdraw/web/js/state.js +1329 -0
  467. gbdraw/web/js/utils/clipboard.js +27 -0
  468. gbdraw/web/js/utils/color-utils.js +444 -0
  469. gbdraw/web/js/utils/contract-repair.js +411 -0
  470. gbdraw/web/js/utils/contract-shape.js +195 -0
  471. gbdraw/web/js/utils/download-names.js +26 -0
  472. gbdraw/web/js/utils/error-normalization.js +865 -0
  473. gbdraw/web/js/utils/error-text.js +20 -0
  474. gbdraw/web/js/utils/feature-rendering.js +147 -0
  475. gbdraw/web/js/utils/field-reading.js +163 -0
  476. gbdraw/web/js/utils/font-family-rules.generated.js +71 -0
  477. gbdraw/web/js/utils/hosted-build.js +19 -0
  478. gbdraw/web/js/utils/i18n-catalogs/es.js +2788 -0
  479. gbdraw/web/js/utils/i18n-catalogs/fr.js +2788 -0
  480. gbdraw/web/js/utils/i18n-catalogs/id.js +2788 -0
  481. gbdraw/web/js/utils/i18n-catalogs/ja.js +2788 -0
  482. gbdraw/web/js/utils/i18n-catalogs/ko.js +2788 -0
  483. gbdraw/web/js/utils/i18n-catalogs/pt.js +2788 -0
  484. gbdraw/web/js/utils/i18n-catalogs/th.js +2788 -0
  485. gbdraw/web/js/utils/i18n-catalogs/vi.js +2788 -0
  486. gbdraw/web/js/utils/i18n-catalogs/zh-Hans.js +2788 -0
  487. gbdraw/web/js/utils/i18n-catalogs/zh-Hant.js +2788 -0
  488. gbdraw/web/js/utils/i18n.js +294 -0
  489. gbdraw/web/js/utils/inert-markup.js +22 -0
  490. gbdraw/web/js/utils/legend-font-metrics.generated.js +1576 -0
  491. gbdraw/web/js/utils/load-repairs.js +349 -0
  492. gbdraw/web/js/utils/markup-preview.js +27 -0
  493. gbdraw/web/js/utils/named-colors.js +51 -0
  494. gbdraw/web/js/utils/optional-positive-number.js +73 -0
  495. gbdraw/web/js/utils/own-entry.js +30 -0
  496. gbdraw/web/js/utils/png.js +82 -0
  497. gbdraw/web/js/utils/popup-bounds.js +142 -0
  498. gbdraw/web/js/utils/tsv-cell.js +6 -0
  499. gbdraw/web/js/utils/vue-raw.js +10 -0
  500. gbdraw/web/js/utils/zip.js +186 -0
  501. gbdraw/web/js/web-ux-profile.js +20 -0
  502. gbdraw/web/js/workers/diagram-generation-worker.js +1442 -0
  503. gbdraw/web/js/workers/losat-threaded-worker.js +440 -0
  504. gbdraw/web/js/workers/losat-wasi-thread-worker.js +191 -0
  505. gbdraw/web/js/workers/losat-worker.js +172 -0
  506. gbdraw/web/js/workers/pyodide-snapshot.js +586 -0
  507. gbdraw/web/js/workers/session-import-worker.js +49 -0
  508. gbdraw/web/js/workers/worker-font-registry.js +135 -0
  509. gbdraw/web/open-source-notices.html +1373 -0
  510. gbdraw/web/presets/bakta_color_table.txt +26 -0
  511. gbdraw/web/presets/pharokka_color_table.txt +16 -0
  512. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000708-BGC0000713_default_colors.tsv +1 -0
  513. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000708-BGC0000713_specific_colors.tsv +4 -0
  514. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000708.gbk +1633 -0
  515. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000709.gbk +1837 -0
  516. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000711.gbk +1088 -0
  517. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000712.gbk +2147 -0
  518. gbdraw/web/tutorial-data/aminoglycoside-bgc-five/BGC0000713.gbk +1232 -0
  519. gbdraw/web/tutorial-data/de3/NC_042057.1.gb +1855 -0
  520. gbdraw/web/tutorial-data/depth-1kb/AP027133.DRR394922.depth-1kb.tsv +608 -0
  521. gbdraw/web/tutorial-data/depth-1kb/AP027133.gb +20196 -0
  522. gbdraw/web/tutorial-data/hepatoplasmataceae-five/AP027078.gb +20180 -0
  523. gbdraw/web/tutorial-data/hepatoplasmataceae-five/AP027131.gb +21876 -0
  524. gbdraw/web/tutorial-data/hepatoplasmataceae-five/AP027132.gb +21337 -0
  525. gbdraw/web/tutorial-data/hepatoplasmataceae-five/NZ_CP006932.gb +25445 -0
  526. gbdraw/web/tutorial-data/human-mitochondrion/HmmtDNA.gbk +1165 -0
  527. gbdraw/web/tutorial-data/human-mitochondrion/HmmtDNA_feature_visibility.tsv +4 -0
  528. gbdraw/web/tutorial-data/lambda/NC_001416.gb +3221 -0
  529. gbdraw/web/tutorial-data/lambda-de3-comparison/lambda-de3.losatn.tsv +6 -0
  530. gbdraw/web/tutorial-data/lambda-de3-comparison/lambda-de3.tlosatx.tsv +397 -0
  531. gbdraw/web/tutorial-data/lambda-gff3/NC_001416.fna +694 -0
  532. gbdraw/web/tutorial-data/lambda-gff3/NC_001416.gff3 +167 -0
  533. gbdraw/web/tutorial-data/manifest.json +2175 -0
  534. gbdraw/web/tutorial-data/metazoan-mitochondria-comparison/NC_001328.1.fna +231 -0
  535. gbdraw/web/tutorial-data/metazoan-mitochondria-comparison/NC_002333.2.fna +278 -0
  536. gbdraw/web/tutorial-data/metazoan-mitochondria-comparison/NC_024511.2.fna +327 -0
  537. gbdraw/web/tutorial-data/metazoan-mitochondria-comparison/caenorhabditis-human.tlosatx.tsv +66 -0
  538. gbdraw/web/tutorial-data/metazoan-mitochondria-comparison/danio-human.tlosatx.tsv +276 -0
  539. gbdraw/web/tutorial-data/metazoan-mitochondria-comparison/drosophila-human.tlosatx.tsv +93 -0
  540. gbdraw/web/tutorial-data/metazoan-mitochondria-four/NC_001328.1.gb +690 -0
  541. gbdraw/web/tutorial-data/metazoan-mitochondria-four/NC_002333.2.gb +987 -0
  542. gbdraw/web/tutorial-data/metazoan-mitochondria-four/NC_024511.2.gb +1233 -0
  543. gbdraw/web/tutorial-data/shared/cds_gene_qualifier_priority.tsv +1 -0
  544. gbdraw/web/tutorial-data/tobacco-plastome-regions/NC_001879.gbk +5285 -0
  545. gbdraw/web/tutorial-data/tobacco-plastome-regions/chloroplast_specific_table.tsv +71 -0
  546. gbdraw/web/tutorial-data/tobacco-plastome-regions/modified_default_colors.tsv +6 -0
  547. gbdraw/web/tutorial-data/tobacco-plastome-regions/nicotiana-tabacum-regions-span.tsv +9 -0
  548. gbdraw/web/tutorial-data/tobacco-plastome-regions/nicotiana-tabacum-regions.tsv +5 -0
  549. gbdraw/web/tutorial-data/tobacco-plastome-regions/qualifier_priority.tsv +1 -0
  550. gbdraw/web/vendor/browser_wasi_shim/dist/debug.js +1 -0
  551. gbdraw/web/vendor/browser_wasi_shim/dist/fd.js +1 -0
  552. gbdraw/web/vendor/browser_wasi_shim/dist/fs_mem.js +1 -0
  553. gbdraw/web/vendor/browser_wasi_shim/dist/fs_opfs.js +1 -0
  554. gbdraw/web/vendor/browser_wasi_shim/dist/index.js +1 -0
  555. gbdraw/web/vendor/browser_wasi_shim/dist/strace.js +1 -0
  556. gbdraw/web/vendor/browser_wasi_shim/dist/wasi.js +1 -0
  557. gbdraw/web/vendor/browser_wasi_shim/dist/wasi_defs.js +1 -0
  558. gbdraw/web/vendor/dompurify/purify.min.js +3 -0
  559. gbdraw/web/vendor/fonts/inter/inter-latin-300-normal.woff2 +0 -0
  560. gbdraw/web/vendor/fonts/inter/inter-latin-400-normal.woff2 +0 -0
  561. gbdraw/web/vendor/fonts/inter/inter-latin-500-normal.woff2 +0 -0
  562. gbdraw/web/vendor/fonts/inter/inter-latin-600-normal.woff2 +0 -0
  563. gbdraw/web/vendor/fonts/inter/inter-latin-700-normal.woff2 +0 -0
  564. gbdraw/web/vendor/fonts/inter/inter-vietnamese-300-normal.woff2 +0 -0
  565. gbdraw/web/vendor/fonts/inter/inter-vietnamese-400-normal.woff2 +0 -0
  566. gbdraw/web/vendor/fonts/inter/inter-vietnamese-500-normal.woff2 +0 -0
  567. gbdraw/web/vendor/fonts/inter/inter-vietnamese-600-normal.woff2 +0 -0
  568. gbdraw/web/vendor/fonts/inter/inter-vietnamese-700-normal.woff2 +0 -0
  569. gbdraw/web/vendor/fonts/noto-sans-jp/noto-sans-jp-japanese-300-normal.woff2 +0 -0
  570. gbdraw/web/vendor/fonts/noto-sans-jp/noto-sans-jp-japanese-400-normal.woff2 +0 -0
  571. gbdraw/web/vendor/fonts/noto-sans-jp/noto-sans-jp-japanese-500-normal.woff2 +0 -0
  572. gbdraw/web/vendor/fonts/noto-sans-jp/noto-sans-jp-japanese-700-normal.woff2 +0 -0
  573. gbdraw/web/vendor/jspdf/jspdf.umd.min.js +373 -0
  574. gbdraw/web/vendor/phosphor-icons/regular/Phosphor.svg +3056 -0
  575. gbdraw/web/vendor/phosphor-icons/regular/Phosphor.ttf +0 -0
  576. gbdraw/web/vendor/phosphor-icons/regular/Phosphor.woff +0 -0
  577. gbdraw/web/vendor/phosphor-icons/regular/Phosphor.woff2 +0 -0
  578. gbdraw/web/vendor/phosphor-icons/regular/style.css +4627 -0
  579. gbdraw/web/vendor/pyodide/v0.29.0/full/micropip-0.11.0-py3-none-any.whl +0 -0
  580. gbdraw/web/vendor/pyodide/v0.29.0/full/package.json +126 -0
  581. gbdraw/web/vendor/pyodide/v0.29.0/full/pyodide-lock.json +1 -0
  582. gbdraw/web/vendor/pyodide/v0.29.0/full/pyodide.asm.js +15 -0
  583. gbdraw/web/vendor/pyodide/v0.29.0/full/pyodide.asm.wasm +0 -0
  584. gbdraw/web/vendor/pyodide/v0.29.0/full/pyodide.js +6 -0
  585. gbdraw/web/vendor/pyodide/v0.29.0/full/pyodide.mjs +4 -0
  586. gbdraw/web/vendor/pyodide/v0.29.0/full/python_stdlib.zip +0 -0
  587. gbdraw/web/vendor/pyodide/v0.29.0/full/tzdata-2025.2-py2.py3-none-any.whl +0 -0
  588. gbdraw/web/vendor/pyodide-wheels/bcbio_gff-0.7.1-py3-none-any.whl +0 -0
  589. gbdraw/web/vendor/pyodide-wheels/biopython-1.85-cp313-cp313-pyodide_2025_0_wasm32.whl +0 -0
  590. gbdraw/web/vendor/pyodide-wheels/fonttools-4.56.0-py3-none-any.whl +0 -0
  591. gbdraw/web/vendor/pyodide-wheels/numpy-2.2.5-cp313-cp313-pyodide_2025_0_wasm32.whl +0 -0
  592. gbdraw/web/vendor/pyodide-wheels/pandas-2.3.2-cp313-cp313-pyodide_2025_0_wasm32.whl +0 -0
  593. gbdraw/web/vendor/pyodide-wheels/python_dateutil-2.9.0.post0-py2.py3-none-any.whl +0 -0
  594. gbdraw/web/vendor/pyodide-wheels/pytz-2025.2-py2.py3-none-any.whl +0 -0
  595. gbdraw/web/vendor/pyodide-wheels/six-1.17.0-py2.py3-none-any.whl +0 -0
  596. gbdraw/web/vendor/pyodide-wheels/svgwrite-1.4.3-py3-none-any.whl +0 -0
  597. gbdraw/web/vendor/svg2pdf.js/svg2pdf.umd.min.js +3 -0
  598. gbdraw/web/vendor/vue/vue.global.prod.js +13 -0
  599. gbdraw/web/wasm/losat/README.md +29 -0
  600. gbdraw/web/wasm/losat/losat-threaded.wasm +0 -0
  601. gbdraw/web/wasm/losat/losat.wasm +0 -0
  602. gbdraw/web_support/__init__.py +30 -0
  603. gbdraw/web_support/capabilities.py +77 -0
  604. gbdraw/web_support/comparison_sequences.py +44 -0
  605. gbdraw/web_support/config_overrides.py +243 -0
  606. gbdraw/web_support/error_adapter.py +378 -0
  607. gbdraw/web_support/export_fonts.py +74 -0
  608. gbdraw/web_support/feature_catalog.py +2735 -0
  609. gbdraw/web_support/feature_metadata.py +611 -0
  610. gbdraw/web_support/feature_override_table.py +26 -0
  611. gbdraw/web_support/label_fit.py +352 -0
  612. gbdraw/web_support/mode_scoped_settings.py +376 -0
  613. gbdraw/web_support/orthogroup_metadata.py +538 -0
  614. gbdraw/web_support/request_render.py +704 -0
  615. gbdraw/web_support/rule_matching.py +84 -0
  616. gbdraw/web_support/similarity_alignment.py +610 -0
  617. gbdraw/web_support/stored_protein_frames.py +78 -0
  618. gbdraw-0.14.0.dist-info/METADATA +152 -0
  619. gbdraw-0.14.0.dist-info/RECORD +624 -0
  620. gbdraw-0.14.0.dist-info/WHEEL +5 -0
  621. gbdraw-0.14.0.dist-info/entry_points.txt +2 -0
  622. gbdraw-0.14.0.dist-info/licenses/LICENSE.txt +21 -0
  623. gbdraw-0.14.0.dist-info/licenses/LICENSE_LIBERATION_FONTS.txt +102 -0
  624. gbdraw-0.14.0.dist-info/top_level.txt +1 -0
gbdraw/__init__.py ADDED
@@ -0,0 +1,58 @@
1
+ """Public Python interface for gbdraw."""
2
+
3
+ from .interface import (
4
+ CircularLayout,
5
+ CircularOptions,
6
+ CircularTrackOptions,
7
+ ComparisonRingOptions,
8
+ ComparisonRingTrackOptions,
9
+ ConservationOptions,
10
+ ConservationTrackOptions,
11
+ DepthTrackOptions,
12
+ Diagram,
13
+ FeatureOptions,
14
+ LabelOptions,
15
+ LinearComparisonOptions,
16
+ LinearLayout,
17
+ LinearOptions,
18
+ LinearTrackOptions,
19
+ Thresholds,
20
+ TitleOptions,
21
+ draw_circular,
22
+ draw_linear,
23
+ read_genbank,
24
+ read_gff,
25
+ )
26
+ from .version import __version__
27
+ from .api.requests import RecordDisplayOptions
28
+ from .features.placement import FeaturePlacementOverride, FeaturePlacementTarget
29
+ from .layout.similarity_alignment import SimilarityAlignmentReference
30
+
31
+ __all__ = [
32
+ "CircularLayout",
33
+ "CircularOptions",
34
+ "CircularTrackOptions",
35
+ "ComparisonRingOptions",
36
+ "ComparisonRingTrackOptions",
37
+ "ConservationOptions",
38
+ "ConservationTrackOptions",
39
+ "DepthTrackOptions",
40
+ "Diagram",
41
+ "FeatureOptions",
42
+ "FeaturePlacementOverride",
43
+ "FeaturePlacementTarget",
44
+ "LabelOptions",
45
+ "LinearComparisonOptions",
46
+ "LinearLayout",
47
+ "LinearOptions",
48
+ "LinearTrackOptions",
49
+ "RecordDisplayOptions",
50
+ "SimilarityAlignmentReference",
51
+ "Thresholds",
52
+ "TitleOptions",
53
+ "__version__",
54
+ "draw_circular",
55
+ "draw_linear",
56
+ "read_genbank",
57
+ "read_gff",
58
+ ]
@@ -0,0 +1,261 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import re
5
+ import sys
6
+ import zipfile
7
+ from datetime import datetime
8
+ from importlib.util import module_from_spec, spec_from_file_location
9
+ from pathlib import Path
10
+
11
+
12
+ REPO_ROOT = Path(__file__).resolve().parents[1]
13
+ PYPROJECT_PATH = REPO_ROOT / "pyproject.toml"
14
+ WEB_ROOT = Path(__file__).resolve().parent / "web"
15
+ CONFIG_PATH = WEB_ROOT / "js" / "config.js"
16
+
17
+ BROWSER_WHEEL_BUILD_ENV = "GBDRAW_BUILDING_BROWSER_WHEEL"
18
+
19
+ _PROJECT_VERSION_RE = re.compile(r'^version\s*=\s*"([^"]+)"\s*$', re.MULTILINE)
20
+ _WHEEL_NAME_RE = re.compile(r'^(export const GBDRAW_WHEEL_NAME\s*=\s*")[^"]+(";\s*)$', re.MULTILINE)
21
+ _WHEEL_CACHE_BUST_RE = re.compile(r'^(export const GBDRAW_WHEEL_CACHE_BUST\s*=\s*")[^"]+(";\s*)$', re.MULTILINE)
22
+
23
+ _PYTHON_RUNTIME_PACKAGE_DATA = [
24
+ "data/color_palettes.toml",
25
+ "data/config.toml",
26
+ "data/losat-release.json",
27
+ "data/*.ttf",
28
+ "web/js/services/standalone-interactivity-assets.js",
29
+ ]
30
+
31
+ _WEB_APP_PACKAGE_DATA = [
32
+ "web/index.html",
33
+ "web/css/tailwind.css",
34
+ "web/open-source-notices.html",
35
+ "web/gallery/palettes/palettes.json",
36
+ "web/assets/*.ico",
37
+ "web/assets/*.png",
38
+ "web/assets/*.svg",
39
+ "web/js/*.js",
40
+ "web/js/app/*.js",
41
+ "web/js/app/*/*.js",
42
+ "web/js/contracts/*.js",
43
+ "web/js/workers/*.js",
44
+ "web/js/services/*.js",
45
+ "web/js/utils/*.js",
46
+ "web/js/utils/*/*.js",
47
+ "web/presets/*.txt",
48
+ "web/presets/*.tsv",
49
+ "web/tutorial-data/*.json",
50
+ "web/tutorial-data/*/*.fna",
51
+ "web/tutorial-data/*/*.gb",
52
+ "web/tutorial-data/*/*.gbk",
53
+ "web/tutorial-data/*/*.gff3",
54
+ "web/tutorial-data/*/*.tsv",
55
+ "web/vendor/fonts/*.ttf",
56
+ "web/vendor/*/*.css",
57
+ "web/vendor/*/*.js",
58
+ "web/vendor/*/*.json",
59
+ "web/vendor/*/*.svg",
60
+ "web/vendor/*/*.ttf",
61
+ "web/vendor/*/*.whl",
62
+ "web/vendor/*/*.woff",
63
+ "web/vendor/*/*.woff2",
64
+ "web/vendor/*/*/*.css",
65
+ "web/vendor/*/*/*.js",
66
+ "web/vendor/*/*/*.json",
67
+ "web/vendor/*/*/*.mjs",
68
+ "web/vendor/*/*/*.svg",
69
+ "web/vendor/*/*/*.ttf",
70
+ "web/vendor/*/*/*.whl",
71
+ "web/vendor/*/*/*.woff",
72
+ "web/vendor/*/*/*.woff2",
73
+ "web/vendor/*/*/*.zip",
74
+ "web/vendor/*/*/*.wasm",
75
+ "web/vendor/*/*/*/*.js",
76
+ "web/vendor/*/*/*/*.json",
77
+ "web/vendor/*/*/*/*.mjs",
78
+ "web/vendor/*/*/*/*.whl",
79
+ "web/vendor/*/*/*/*.zip",
80
+ "web/vendor/*/*/*/*.wasm",
81
+ "web/wasm/*/*.md",
82
+ "web/wasm/*/*.wasm",
83
+ ]
84
+
85
+ BROWSER_WHEEL_MAX_BYTES = 20 * 1024 * 1024
86
+
87
+ _BROWSER_WHEEL_FORBIDDEN_PREFIXES = (
88
+ "gbdraw/bin/",
89
+ "gbdraw/web/assets/",
90
+ "gbdraw/web/css/",
91
+ "gbdraw/web/gallery/",
92
+ "gbdraw/web/js/",
93
+ "gbdraw/web/presets/",
94
+ "gbdraw/web/tutorial-data/",
95
+ "gbdraw/web/vendor/",
96
+ "gbdraw/web/wasm/",
97
+ )
98
+
99
+ _BROWSER_WHEEL_FORBIDDEN_FILES = {
100
+ "gbdraw/web/index.html",
101
+ "gbdraw/web/open-source-notices.html",
102
+ }
103
+
104
+ _BROWSER_WHEEL_ALLOWED_FILES = {
105
+ "gbdraw/web/js/services/standalone-interactivity-assets.js",
106
+ }
107
+
108
+
109
+ def is_browser_wheel_build() -> bool:
110
+ return os.environ.get(BROWSER_WHEEL_BUILD_ENV) == "1"
111
+
112
+
113
+ def get_package_data_patterns(*, include_browser_wheel: bool) -> list[str]:
114
+ patterns = list(_PYTHON_RUNTIME_PACKAGE_DATA)
115
+ if not is_browser_wheel_build():
116
+ patterns.extend(_WEB_APP_PACKAGE_DATA)
117
+ if include_browser_wheel and not is_browser_wheel_build():
118
+ patterns.insert(3, f"web/{expected_browser_wheel_name()}")
119
+ return patterns
120
+
121
+
122
+ def get_excluded_package_data_patterns(*, include_browser_wheel: bool) -> list[str]:
123
+ excluded = ["bin/*/*"]
124
+ if not include_browser_wheel:
125
+ excluded.append("web/*.whl")
126
+ return excluded
127
+
128
+
129
+ def read_project_version() -> str:
130
+ pyproject_text = PYPROJECT_PATH.read_text(encoding="utf-8")
131
+ match = _PROJECT_VERSION_RE.search(pyproject_text)
132
+ if match is None:
133
+ raise RuntimeError(f"Could not determine project version from {PYPROJECT_PATH}")
134
+ return match.group(1)
135
+
136
+
137
+ def expected_browser_wheel_name(version: str | None = None) -> str:
138
+ if version is None:
139
+ version = read_project_version()
140
+ return f"gbdraw-{version}-py3-none-any.whl"
141
+
142
+
143
+ def read_browser_wheel_name_from_config() -> str:
144
+ config_text = CONFIG_PATH.read_text(encoding="utf-8")
145
+ match = _WHEEL_NAME_RE.search(config_text)
146
+ if match is None:
147
+ raise RuntimeError(f"Could not determine GBDRAW_WHEEL_NAME from {CONFIG_PATH}")
148
+ _, value = match.group(0).split("=", 1)
149
+ return value.strip().strip(";").strip().strip('"').strip("'")
150
+
151
+
152
+ def generate_cache_bust_token() -> str:
153
+ return datetime.now().strftime("%Y%m%d-%H%M%S")
154
+
155
+
156
+ def update_browser_wheel_config(*, wheel_name: str, cache_bust: str | None = None) -> None:
157
+ config_text = CONFIG_PATH.read_text(encoding="utf-8")
158
+ updated_text, replacements = _WHEEL_NAME_RE.subn(
159
+ lambda match: f'{match.group(1)}{wheel_name}{match.group(2)}',
160
+ config_text,
161
+ count=1,
162
+ )
163
+ if replacements != 1:
164
+ raise RuntimeError(f"Could not update GBDRAW_WHEEL_NAME in {CONFIG_PATH}")
165
+ if cache_bust is not None:
166
+ updated_text, cache_bust_replacements = _WHEEL_CACHE_BUST_RE.subn(
167
+ lambda match: f'{match.group(1)}{cache_bust}{match.group(2)}',
168
+ updated_text,
169
+ count=1,
170
+ )
171
+ if cache_bust_replacements != 1:
172
+ raise RuntimeError(f"Could not update GBDRAW_WHEEL_CACHE_BUST in {CONFIG_PATH}")
173
+ if updated_text != config_text:
174
+ CONFIG_PATH.write_text(updated_text, encoding="utf-8")
175
+
176
+
177
+ def refresh_open_source_notices() -> None:
178
+ generator_path = REPO_ROOT / "tools" / "generate_open_source_notices.py"
179
+ spec = spec_from_file_location("gbdraw_generate_open_source_notices", generator_path)
180
+ if spec is None or spec.loader is None:
181
+ raise RuntimeError(f"Could not load open source notices generator from {generator_path}")
182
+
183
+ module = module_from_spec(spec)
184
+ sys.modules[spec.name] = module
185
+ spec.loader.exec_module(module)
186
+ module.write_open_source_notices()
187
+
188
+
189
+ def inspect_browser_wheel_payload(path: Path) -> None:
190
+ if path.stat().st_size > BROWSER_WHEEL_MAX_BYTES:
191
+ raise RuntimeError(
192
+ f"Browser wheel {path.relative_to(REPO_ROOT)} is too large: "
193
+ f"{path.stat().st_size} bytes, expected at most {BROWSER_WHEEL_MAX_BYTES}. "
194
+ "Run `python tools/prepare_browser_wheel.py`."
195
+ )
196
+
197
+ with zipfile.ZipFile(path) as zf:
198
+ names = set(zf.namelist())
199
+
200
+ forbidden = sorted(
201
+ name
202
+ for name in names
203
+ if name in _BROWSER_WHEEL_FORBIDDEN_FILES
204
+ or (
205
+ name not in _BROWSER_WHEEL_ALLOWED_FILES
206
+ and any(name.startswith(prefix) for prefix in _BROWSER_WHEEL_FORBIDDEN_PREFIXES)
207
+ )
208
+ or (name.startswith("gbdraw/web/gbdraw-") and name.endswith(".whl"))
209
+ )
210
+ if forbidden:
211
+ preview = "\n".join(forbidden[:20])
212
+ if len(forbidden) > 20:
213
+ preview += f"\n... and {len(forbidden) - 20} more"
214
+ raise RuntimeError(
215
+ "Browser wheel contains hosted web assets that should remain outside the "
216
+ "Pyodide runtime wheel:\n"
217
+ f"{preview}\n"
218
+ "Run `python tools/prepare_browser_wheel.py`."
219
+ )
220
+
221
+ required = {
222
+ "gbdraw/data/color_palettes.toml",
223
+ "gbdraw/data/config.toml",
224
+ "gbdraw/web/js/services/standalone-interactivity-assets.js",
225
+ }
226
+ missing = sorted(required - names)
227
+ if missing:
228
+ raise RuntimeError(
229
+ "Browser wheel is missing required Python runtime package data:\n"
230
+ + "\n".join(missing)
231
+ + "\nRun `python tools/prepare_browser_wheel.py`."
232
+ )
233
+
234
+
235
+ def validate_browser_wheel_prepared() -> Path:
236
+ expected_name = expected_browser_wheel_name()
237
+ expected_path = WEB_ROOT / expected_name
238
+ existing_wheels = sorted(WEB_ROOT.glob("gbdraw-*.whl"))
239
+
240
+ if not expected_path.exists():
241
+ raise FileNotFoundError(
242
+ f"Missing browser wheel {expected_path.relative_to(REPO_ROOT)}. "
243
+ "Run `python tools/prepare_browser_wheel.py`."
244
+ )
245
+
246
+ unexpected_wheels = [path.name for path in existing_wheels if path.name != expected_name]
247
+ if unexpected_wheels:
248
+ raise RuntimeError(
249
+ "Unexpected browser wheel files in gbdraw/web: "
250
+ f"{', '.join(unexpected_wheels)}. Run `python tools/prepare_browser_wheel.py` to refresh them."
251
+ )
252
+
253
+ configured_name = read_browser_wheel_name_from_config()
254
+ if configured_name != expected_name:
255
+ raise RuntimeError(
256
+ f"gbdraw/web/js/config.js points to {configured_name}, expected {expected_name}. "
257
+ "Run `python tools/prepare_browser_wheel.py`."
258
+ )
259
+
260
+ inspect_browser_wheel_payload(expected_path)
261
+ return expected_path
gbdraw/_web_assets.py ADDED
@@ -0,0 +1,197 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from pathlib import Path
5
+
6
+
7
+ REPO_ROOT = Path(__file__).resolve().parents[1]
8
+ WEB_ROOT = REPO_ROOT / "gbdraw" / "web"
9
+ VENDOR_ROOT = WEB_ROOT / "vendor"
10
+ PYODIDE_RUNTIME_DIR = VENDOR_ROOT / "pyodide" / "v0.29.0" / "full"
11
+
12
+ # The Vue build that index.html loads: the global production build, which
13
+ # still contains the template compiler that the in-DOM templates need.
14
+ VUE_RUNTIME_FILE = Path("vendor") / "vue" / "vue.global.prod.js"
15
+
16
+ ASSET_URLS = {
17
+ "vue": f"https://unpkg.com/vue@3.5.25/dist/{VUE_RUNTIME_FILE.name}",
18
+ "pyodide_core": "https://github.com/pyodide/pyodide/releases/download/0.29.0/pyodide-core-0.29.0.tar.bz2",
19
+ "micropip": "https://cdn.jsdelivr.net/pyodide/v0.29.0/full/micropip-0.11.0-py3-none-any.whl",
20
+ "tzdata": "https://cdn.jsdelivr.net/pyodide/v0.29.0/full/tzdata-2025.2-py2.py3-none-any.whl",
21
+ "browser_wasi_shim": "https://registry.npmjs.org/@bjorn3/browser_wasi_shim/-/browser_wasi_shim-0.4.2.tgz",
22
+ "jspdf": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.3.tgz",
23
+ "svg2pdf": "https://registry.npmjs.org/svg2pdf.js/-/svg2pdf.js-2.6.0.tgz",
24
+ "dompurify": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz",
25
+ "phosphor": "https://registry.npmjs.org/@phosphor-icons/web/-/web-2.1.2.tgz",
26
+ "inter": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz",
27
+ "noto_sans_jp": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.9.tgz",
28
+ }
29
+
30
+ PYODIDE_CORE_FILES = {
31
+ "package.json",
32
+ "pyodide.asm.js",
33
+ "pyodide.asm.wasm",
34
+ "pyodide.js",
35
+ "pyodide.mjs",
36
+ "pyodide-lock.json",
37
+ "python_stdlib.zip",
38
+ }
39
+
40
+ PYODIDE_RUNTIME_PACKAGE_WHEELS = {
41
+ "micropip": "micropip-0.11.0-py3-none-any.whl",
42
+ "tzdata": "tzdata-2025.2-py2.py3-none-any.whl",
43
+ }
44
+
45
+ PYODIDE_LOCAL_WHEELS = (
46
+ Path("vendor") / "pyodide-wheels" / "six-1.17.0-py2.py3-none-any.whl",
47
+ Path("vendor") / "pyodide-wheels" / "python_dateutil-2.9.0.post0-py2.py3-none-any.whl",
48
+ Path("vendor") / "pyodide-wheels" / "pytz-2025.2-py2.py3-none-any.whl",
49
+ Path("vendor") / "pyodide-wheels" / "numpy-2.2.5-cp313-cp313-pyodide_2025_0_wasm32.whl",
50
+ Path("vendor") / "pyodide-wheels" / "biopython-1.85-cp313-cp313-pyodide_2025_0_wasm32.whl",
51
+ Path("vendor") / "pyodide-wheels" / "fonttools-4.56.0-py3-none-any.whl",
52
+ Path("vendor") / "pyodide-wheels" / "svgwrite-1.4.3-py3-none-any.whl",
53
+ Path("vendor") / "pyodide-wheels" / "bcbio_gff-0.7.1-py3-none-any.whl",
54
+ Path("vendor") / "pyodide-wheels" / "pandas-2.3.2-cp313-cp313-pyodide_2025_0_wasm32.whl",
55
+ )
56
+
57
+ PYODIDE_RUNTIME_WHEELS = tuple(
58
+ Path("vendor") / "pyodide" / "v0.29.0" / "full" / filename
59
+ for filename in PYODIDE_RUNTIME_PACKAGE_WHEELS.values()
60
+ )
61
+
62
+ PYODIDE_BUNDLED_WHEELS = PYODIDE_LOCAL_WHEELS + PYODIDE_RUNTIME_WHEELS
63
+
64
+ UI_FONT_ASSETS = {
65
+ "inter": (
66
+ "inter-latin-300-normal.woff2",
67
+ "inter-latin-400-normal.woff2",
68
+ "inter-latin-500-normal.woff2",
69
+ "inter-latin-600-normal.woff2",
70
+ "inter-latin-700-normal.woff2",
71
+ "inter-vietnamese-300-normal.woff2",
72
+ "inter-vietnamese-400-normal.woff2",
73
+ "inter-vietnamese-500-normal.woff2",
74
+ "inter-vietnamese-600-normal.woff2",
75
+ "inter-vietnamese-700-normal.woff2",
76
+ ),
77
+ "noto-sans-jp": (
78
+ "noto-sans-jp-japanese-300-normal.woff2",
79
+ "noto-sans-jp-japanese-400-normal.woff2",
80
+ "noto-sans-jp-japanese-500-normal.woff2",
81
+ "noto-sans-jp-japanese-700-normal.woff2",
82
+ ),
83
+ }
84
+
85
+ REQUIRED_UI_FONT_FILES = tuple(
86
+ Path("vendor") / "fonts" / family / filename
87
+ for family, filenames in UI_FONT_ASSETS.items()
88
+ for filename in filenames
89
+ )
90
+
91
+
92
+ @dataclass(frozen=True)
93
+ class WebAssetNotice:
94
+ display_name: str
95
+ version: str
96
+ license_expression: str
97
+ source_url: str
98
+ bundled_path: str
99
+ notice: str
100
+ license_text_anchors: tuple[str, ...] = ()
101
+
102
+
103
+ WEB_ASSET_NOTICES = (
104
+ WebAssetNotice(
105
+ display_name="Vue.js",
106
+ version="3.5.25",
107
+ license_expression="MIT",
108
+ source_url=ASSET_URLS["vue"],
109
+ bundled_path=VUE_RUNTIME_FILE.as_posix(),
110
+ notice="Copyright (c) 2018-present Yuxi (Evan) You and Vue contributors.",
111
+ license_text_anchors=("license-mit",),
112
+ ),
113
+ WebAssetNotice(
114
+ display_name="Tailwind CSS (generated stylesheet)",
115
+ version="3.4.17",
116
+ license_expression="MIT",
117
+ source_url="https://tailwindcss.com",
118
+ bundled_path="css/tailwind.css",
119
+ notice=(
120
+ "Copyright (c) Tailwind Labs, Inc. The stylesheet is generated with the "
121
+ "Tailwind CSS compiler and contains its base styles (Preflight)."
122
+ ),
123
+ license_text_anchors=("license-mit",),
124
+ ),
125
+ WebAssetNotice(
126
+ display_name="Pyodide core runtime",
127
+ version="0.29.0",
128
+ license_expression="MPL-2.0",
129
+ source_url=ASSET_URLS["pyodide_core"],
130
+ bundled_path="vendor/pyodide/v0.29.0/full/",
131
+ notice="The local Pyodide package.json declares MPL-2.0.",
132
+ license_text_anchors=("license-mpl-2.0",),
133
+ ),
134
+ WebAssetNotice(
135
+ display_name="browser_wasi_shim",
136
+ version="0.4.2",
137
+ license_expression="MIT OR Apache-2.0",
138
+ source_url=ASSET_URLS["browser_wasi_shim"],
139
+ bundled_path="vendor/browser_wasi_shim/dist/",
140
+ notice="The package metadata identifies the author as bjorn3.",
141
+ license_text_anchors=("license-mit", "license-apache-2.0"),
142
+ ),
143
+ WebAssetNotice(
144
+ display_name="jsPDF",
145
+ version="3.0.3",
146
+ license_expression="MIT",
147
+ source_url=ASSET_URLS["jspdf"],
148
+ bundled_path="vendor/jspdf/jspdf.umd.min.js",
149
+ notice="Copyright (c) 2010-2025 James Hall and contributors.",
150
+ license_text_anchors=("license-mit",),
151
+ ),
152
+ WebAssetNotice(
153
+ display_name="svg2pdf.js",
154
+ version="2.6.0",
155
+ license_expression="MIT",
156
+ source_url=ASSET_URLS["svg2pdf"],
157
+ bundled_path="vendor/svg2pdf.js/svg2pdf.umd.min.js",
158
+ notice="Authored by the yFiles for HTML Support Team at yWorks.",
159
+ license_text_anchors=("license-mit",),
160
+ ),
161
+ WebAssetNotice(
162
+ display_name="DOMPurify",
163
+ version="3.2.7",
164
+ license_expression="MPL-2.0 OR Apache-2.0",
165
+ source_url=ASSET_URLS["dompurify"],
166
+ bundled_path="vendor/dompurify/purify.min.js",
167
+ notice="The distributed header identifies Cure53 and other contributors.",
168
+ license_text_anchors=("license-mpl-2.0", "license-apache-2.0"),
169
+ ),
170
+ WebAssetNotice(
171
+ display_name="Phosphor Icons Web",
172
+ version="2.1.2",
173
+ license_expression="MIT",
174
+ source_url=ASSET_URLS["phosphor"],
175
+ bundled_path="vendor/phosphor-icons/regular/",
176
+ notice="Package author: rektdeckard.",
177
+ license_text_anchors=("license-mit",),
178
+ ),
179
+ WebAssetNotice(
180
+ display_name="Inter font package",
181
+ version="Fontsource package 5.2.8",
182
+ license_expression="OFL-1.1",
183
+ source_url=ASSET_URLS["inter"],
184
+ bundled_path="vendor/fonts/inter/",
185
+ notice="Font package metadata identifies Google Inc. as the author.",
186
+ license_text_anchors=("license-ofl-1.1",),
187
+ ),
188
+ WebAssetNotice(
189
+ display_name="Noto Sans JP font package",
190
+ version="Fontsource package 5.2.9",
191
+ license_expression="OFL-1.1",
192
+ source_url=ASSET_URLS["noto_sans_jp"],
193
+ bundled_path="vendor/fonts/noto-sans-jp/",
194
+ notice="Font package metadata identifies Google Inc. as the author.",
195
+ license_text_anchors=("license-ofl-1.1",),
196
+ ),
197
+ )
@@ -0,0 +1,49 @@
1
+ """Sequence / genome analysis helpers (internal)."""
2
+
3
+ from .collinearity import (
4
+ CollinearityAnchor,
5
+ CollinearityAnchorMode,
6
+ CollinearityBlock,
7
+ CollinearityResult,
8
+ CollinearitySearchScope,
9
+ LosslessCollinearityParameters,
10
+ build_orthogroup_collinearity_blocks,
11
+ convert_collinearity_blocks_to_comparisons,
12
+ iter_collinearity_search_pairs,
13
+ normalize_collinearity_anchor_mode,
14
+ normalize_collinearity_search_scope,
15
+ )
16
+ from .depth import clear_depth_tsv_cache, depth_df, read_depth_tsv
17
+ from .conservation import (
18
+ ConservationLoadResult,
19
+ ConservationSource,
20
+ ConservationTrack,
21
+ load_conservation_sources,
22
+ normalize_conservation_tracks_for_record,
23
+ resolve_conservation_reference_side,
24
+ )
25
+
26
+ __all__ = [
27
+ "CollinearityAnchor",
28
+ "CollinearityAnchorMode",
29
+ "CollinearityBlock",
30
+ "CollinearityResult",
31
+ "CollinearitySearchScope",
32
+ "LosslessCollinearityParameters",
33
+ "build_orthogroup_collinearity_blocks",
34
+ "convert_collinearity_blocks_to_comparisons",
35
+ "iter_collinearity_search_pairs",
36
+ "normalize_collinearity_anchor_mode",
37
+ "normalize_collinearity_search_scope",
38
+ "clear_depth_tsv_cache",
39
+ "ConservationLoadResult",
40
+ "ConservationSource",
41
+ "ConservationTrack",
42
+ "depth_df",
43
+ "load_conservation_sources",
44
+ "normalize_conservation_tracks_for_record",
45
+ "read_depth_tsv",
46
+ "resolve_conservation_reference_side",
47
+ ]
48
+
49
+