scitex 2.10.3__py3-none-any.whl → 2.13.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 (504) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__main__.py +24 -5
  3. scitex/__version__.py +1 -1
  4. scitex/_install_guide.py +14 -2
  5. scitex/_optional_deps.py +33 -0
  6. scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
  7. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
  8. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
  9. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
  10. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
  11. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
  12. scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
  13. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
  14. scitex/ai/plt/_plot_feature_importance.py +1 -1
  15. scitex/ai/plt/_plot_learning_curve.py +1 -1
  16. scitex/ai/plt/_plot_optuna_study.py +1 -1
  17. scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
  18. scitex/ai/plt/_plot_roc_curve.py +1 -1
  19. scitex/ai/plt/_stx_conf_mat.py +1 -1
  20. scitex/ai/training/_LearningCurveLogger.py +1 -1
  21. scitex/audio/mcp_server.py +38 -8
  22. scitex/bridge/_figrecipe.py +1 -1
  23. scitex/bridge/_helpers.py +1 -1
  24. scitex/bridge/_plt_vis.py +1 -1
  25. scitex/bridge/_stats_plt.py +1 -1
  26. scitex/bridge/_stats_vis.py +2 -2
  27. scitex/browser/automation/CookieHandler.py +1 -1
  28. scitex/browser/core/BrowserMixin.py +1 -1
  29. scitex/browser/core/ChromeProfileManager.py +1 -1
  30. scitex/browser/debugging/_browser_logger.py +1 -1
  31. scitex/browser/debugging/_highlight_element.py +1 -1
  32. scitex/browser/debugging/_show_grid.py +1 -1
  33. scitex/browser/interaction/click_center.py +1 -1
  34. scitex/browser/interaction/click_with_fallbacks.py +1 -1
  35. scitex/browser/interaction/close_popups.py +1 -1
  36. scitex/browser/interaction/fill_with_fallbacks.py +1 -1
  37. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
  38. scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
  39. scitex/browser/stealth/HumanBehavior.py +1 -1
  40. scitex/browser/stealth/StealthManager.py +1 -1
  41. scitex/{fig → canvas}/__init__.py +84 -96
  42. scitex/canvas/_mcp_handlers.py +372 -0
  43. scitex/canvas/_mcp_tool_schemas.py +219 -0
  44. scitex/{fig → canvas}/backend/_parser.py +1 -1
  45. scitex/{fig → canvas}/canvas.py +13 -14
  46. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  47. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  48. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  49. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  50. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  51. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  52. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  53. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  54. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  55. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  56. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  57. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  58. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  59. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  60. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  61. scitex/{fig → canvas}/io/__init__.py +32 -38
  62. scitex/{fig → canvas}/io/_bundle.py +217 -154
  63. scitex/{fig → canvas}/io/_canvas.py +1 -1
  64. scitex/{fig → canvas}/io/_data.py +1 -1
  65. scitex/{fig → canvas}/io/_export.py +1 -1
  66. scitex/{fig → canvas}/io/_load.py +1 -1
  67. scitex/{fig → canvas}/io/_panel.py +1 -1
  68. scitex/{fig → canvas}/io/_save.py +1 -1
  69. scitex/canvas/mcp_server.py +151 -0
  70. scitex/{fig → canvas}/model/__init__.py +1 -1
  71. scitex/{fig → canvas}/model/_annotations.py +1 -1
  72. scitex/{fig → canvas}/model/_axes.py +1 -1
  73. scitex/{fig → canvas}/model/_figure.py +1 -1
  74. scitex/{fig → canvas}/model/_guides.py +1 -1
  75. scitex/{fig → canvas}/model/_plot.py +1 -1
  76. scitex/{fig → canvas}/model/_styles.py +1 -1
  77. scitex/{fig → canvas}/utils/__init__.py +1 -1
  78. scitex/capture/mcp_server.py +41 -12
  79. scitex/cli/audio.py +233 -0
  80. scitex/cli/capture.py +307 -0
  81. scitex/cli/convert.py +10 -6
  82. scitex/cli/main.py +27 -4
  83. scitex/cli/repro.py +233 -0
  84. scitex/cli/resource.py +240 -0
  85. scitex/cli/stats.py +325 -0
  86. scitex/cli/template.py +236 -0
  87. scitex/cli/tex.py +286 -0
  88. scitex/cli/web.py +11 -12
  89. scitex/dev/__init__.py +3 -0
  90. scitex/dev/_pyproject.py +405 -0
  91. scitex/dev/plt/__init__.py +2 -2
  92. scitex/dev/plt/mpl/get_dir_ax.py +1 -1
  93. scitex/dev/plt/mpl/get_signatures.py +1 -1
  94. scitex/dev/plt/mpl/get_signatures_details.py +1 -1
  95. scitex/diagram/README.md +7 -7
  96. scitex/diagram/_mcp_handlers.py +400 -0
  97. scitex/diagram/_mcp_tool_schemas.py +157 -0
  98. scitex/diagram/mcp_server.py +151 -0
  99. scitex/dsp/_demo_sig.py +51 -5
  100. scitex/dsp/_mne.py +13 -2
  101. scitex/dsp/_modulation_index.py +15 -3
  102. scitex/dsp/_pac.py +23 -5
  103. scitex/dsp/_psd.py +16 -4
  104. scitex/dsp/_resample.py +24 -4
  105. scitex/dsp/_transform.py +16 -3
  106. scitex/dsp/add_noise.py +15 -1
  107. scitex/dsp/norm.py +17 -2
  108. scitex/dsp/reference.py +17 -1
  109. scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
  110. scitex/dsp/utils/_zero_pad.py +18 -4
  111. scitex/dt/_normalize_timestamp.py +1 -1
  112. scitex/git/_session.py +1 -1
  113. scitex/io/__init__.py +7 -19
  114. scitex/io/_load.py +15 -19
  115. scitex/io/_load_modules/_canvas.py +2 -2
  116. scitex/io/_load_modules/_con.py +17 -6
  117. scitex/io/_load_modules/_eeg.py +28 -13
  118. scitex/io/_load_modules/_optuna.py +21 -63
  119. scitex/io/_load_modules/_torch.py +11 -3
  120. scitex/io/_save.py +11 -16
  121. scitex/io/_save_modules/__init__.py +6 -10
  122. scitex/io/_save_modules/_canvas.py +3 -3
  123. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
  124. scitex/io/_save_modules/_plot_bundle.py +112 -0
  125. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  126. scitex/io/_save_modules/_stx_bundle.py +16 -16
  127. scitex/io/_save_modules/_torch.py +11 -3
  128. scitex/io/bundle/README.md +89 -80
  129. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  130. scitex/io/bundle/__init__.py +67 -35
  131. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  132. scitex/io/bundle/_core.py +184 -97
  133. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  134. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  135. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  136. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  137. scitex/io/bundle/_manifest.py +99 -0
  138. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  139. scitex/io/bundle/_nested.py +113 -100
  140. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  141. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  142. scitex/io/bundle/_types.py +41 -16
  143. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  144. scitex/io/bundle/_zip.py +21 -31
  145. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  146. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  147. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  148. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  149. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  150. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  151. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  152. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  153. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  154. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  155. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  156. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  157. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  158. scitex/io/bundle/schemas/__init__.py +30 -0
  159. scitex/mcp_server.py +159 -0
  160. scitex/parallel/_run.py +5 -4
  161. scitex/path/_find.py +60 -83
  162. scitex/path/_get_module_path.py +23 -21
  163. scitex/path/_get_spath.py +6 -27
  164. scitex/path/_getsize.py +23 -9
  165. scitex/path/_increment_version.py +31 -38
  166. scitex/path/_mk_spath.py +26 -29
  167. scitex/path/_path.py +5 -12
  168. scitex/path/_split.py +27 -15
  169. scitex/path/_this_path.py +23 -9
  170. scitex/plt/_mcp_handlers.py +361 -0
  171. scitex/plt/_mcp_tool_schemas.py +169 -0
  172. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  173. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  174. scitex/plt/gallery/_generate.py +76 -50
  175. scitex/plt/io/__init__.py +17 -19
  176. scitex/plt/io/_bundle.py +99 -52
  177. scitex/plt/io/_layered_bundle.py +303 -168
  178. scitex/plt/mcp_server.py +205 -0
  179. scitex/plt/utils/_csv_column_naming.py +250 -118
  180. scitex/repro/README_RandomStateManager.md +3 -3
  181. scitex/repro/_RandomStateManager.py +14 -14
  182. scitex/repro/_gen_ID.py +1 -1
  183. scitex/repro/_gen_timestamp.py +1 -1
  184. scitex/repro/_hash_array.py +4 -4
  185. scitex/schema/__init__.py +69 -73
  186. scitex/schema/_canvas.py +1 -1
  187. scitex/schema/_stats.py +2 -2
  188. scitex/scholar/__main__.py +24 -2
  189. scitex/scholar/_mcp_handlers.py +685 -0
  190. scitex/scholar/_mcp_tool_schemas.py +339 -0
  191. scitex/scholar/docs/template.py +1 -1
  192. scitex/scholar/examples/07_storage_integration.py +1 -1
  193. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
  194. scitex/scholar/impact_factor/jcr/build_database.py +1 -1
  195. scitex/scholar/mcp_server.py +315 -0
  196. scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
  197. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
  198. scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
  199. scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
  200. scitex/scholar/storage/PaperIO.py +1 -1
  201. scitex/session/README.md +4 -4
  202. scitex/session/__init__.py +1 -1
  203. scitex/session/_decorator.py +9 -9
  204. scitex/session/_lifecycle.py +5 -5
  205. scitex/session/template.py +1 -1
  206. scitex/stats/__init__.py +30 -33
  207. scitex/stats/__main__.py +281 -0
  208. scitex/stats/_mcp_handlers.py +1191 -0
  209. scitex/stats/_mcp_tool_schemas.py +384 -0
  210. scitex/stats/_schema.py +1 -1
  211. scitex/stats/correct/_correct_bonferroni.py +1 -1
  212. scitex/stats/correct/_correct_fdr.py +1 -1
  213. scitex/stats/correct/_correct_fdr_.py +1 -1
  214. scitex/stats/correct/_correct_holm.py +1 -1
  215. scitex/stats/correct/_correct_sidak.py +1 -1
  216. scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
  217. scitex/stats/effect_sizes/_cohens_d.py +1 -1
  218. scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
  219. scitex/stats/effect_sizes/_eta_squared.py +1 -1
  220. scitex/stats/effect_sizes/_prob_superiority.py +1 -1
  221. scitex/stats/io/__init__.py +10 -11
  222. scitex/stats/io/_bundle.py +16 -16
  223. scitex/stats/mcp_server.py +405 -0
  224. scitex/stats/posthoc/_dunnett.py +1 -1
  225. scitex/stats/posthoc/_games_howell.py +1 -1
  226. scitex/stats/posthoc/_tukey_hsd.py +1 -1
  227. scitex/stats/power/_power.py +1 -1
  228. scitex/stats/utils/_effect_size.py +1 -1
  229. scitex/stats/utils/_formatters.py +1 -1
  230. scitex/stats/utils/_power.py +1 -1
  231. scitex/template/_mcp_handlers.py +259 -0
  232. scitex/template/_mcp_tool_schemas.py +112 -0
  233. scitex/template/mcp_server.py +186 -0
  234. scitex/utils/_verify_scitex_format.py +2 -2
  235. scitex/utils/template.py +1 -1
  236. scitex/web/__init__.py +12 -11
  237. scitex/web/_scraping.py +26 -265
  238. scitex/web/download_images.py +316 -0
  239. scitex/writer/Writer.py +1 -1
  240. scitex/writer/_clone_writer_project.py +1 -1
  241. scitex/writer/_validate_tree_structures.py +1 -1
  242. scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
  243. scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
  244. scitex/writer/dataclasses/core/_Document.py +1 -1
  245. scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
  246. scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
  247. scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
  248. scitex/writer/utils/.legacy_git_retry.py +7 -5
  249. scitex/writer/utils/_parse_latex_logs.py +1 -1
  250. scitex-2.13.0.dist-info/METADATA +1231 -0
  251. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
  252. scitex-2.13.0.dist-info/entry_points.txt +11 -0
  253. scitex/fig/editor/_defaults.py +0 -300
  254. scitex/fig/editor/edit/panel_loader.py +0 -232
  255. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  256. scitex/fig/editor/flask_editor/_core.py +0 -1429
  257. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  258. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  259. scitex/fts/README.md +0 -262
  260. scitex/fts/TODO.md +0 -66
  261. scitex/fts/__init__.py +0 -90
  262. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  263. scitex/fts/_bundle/__init__.py +0 -38
  264. scitex/fts/_bundle/_utils/__init__.py +0 -55
  265. scitex/fts/_bundle/_utils/_const.py +0 -26
  266. scitex/fts/_bundle/_utils/_errors.py +0 -73
  267. scitex/fts/_bundle/_utils/_generate.py +0 -21
  268. scitex/fts/_bundle/_utils/_types.py +0 -76
  269. scitex/fts/_bundle/_zipbundle.py +0 -165
  270. scitex/fts/_fig/__init__.py +0 -22
  271. scitex/fts/_fig/_backend/_parser.py +0 -188
  272. scitex/fts/_fig/_editor/__init__.py +0 -14
  273. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  274. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  275. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  276. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  277. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  278. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  279. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  280. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  281. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  282. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  283. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  284. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  285. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  286. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  287. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  288. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  289. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  290. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  291. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  292. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  293. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  294. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  295. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  296. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  297. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  298. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  299. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  300. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  328. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  329. scitex/fts/_fig/_models/_Annotations.py +0 -115
  330. scitex/fts/_fig/_models/_Axes.py +0 -152
  331. scitex/fts/_fig/_models/_Figure.py +0 -138
  332. scitex/fts/_fig/_models/_Plot.py +0 -123
  333. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  334. scitex/fts/_kinds/_figure/_composite.py +0 -345
  335. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  336. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  337. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  338. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  339. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  340. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  341. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  342. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  343. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  344. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  345. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  346. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  347. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  348. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  349. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  350. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  351. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  352. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  353. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  354. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  355. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  356. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  357. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  358. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  359. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  360. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  361. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  362. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  363. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  364. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  365. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  366. scitex/fts/_stats/__init__.py +0 -48
  367. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  368. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  369. scitex/fts/_tables/__init__.py +0 -65
  370. scitex/fts/_tables/_latex/__init__.py +0 -93
  371. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  372. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  373. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  374. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  375. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  376. scitex/fts/_tables/_latex/_utils.py +0 -369
  377. scitex/fts/_tables/_latex/_validator.py +0 -445
  378. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  379. scitex-2.10.3.dist-info/METADATA +0 -952
  380. scitex-2.10.3.dist-info/entry_points.txt +0 -2
  381. /scitex/{fig → canvas}/README.md +0 -0
  382. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  383. /scitex/{fig → canvas}/backend/_export.py +0 -0
  384. /scitex/{fig → canvas}/backend/_render.py +0 -0
  385. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  386. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  387. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  388. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  389. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  390. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  391. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  392. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  393. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  394. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  395. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  396. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  397. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  398. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  399. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  400. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  401. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  402. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  403. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  404. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  405. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  406. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  407. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  408. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  409. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  410. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  411. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  412. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  413. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  414. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  415. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  416. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  417. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  418. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  419. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  420. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  421. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  422. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  423. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  424. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  425. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  426. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  427. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  428. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  429. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  430. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  431. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  432. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  433. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  434. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  435. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  436. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  437. /scitex/{fig → canvas}/io/_directory.py +0 -0
  438. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  439. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  440. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  441. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  442. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  443. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  444. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  445. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  446. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  447. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  448. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  449. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  450. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  451. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  452. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  453. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  454. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  455. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  456. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  457. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  458. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  459. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  460. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  461. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  462. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  463. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  464. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  465. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  466. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  467. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  468. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  469. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  470. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  471. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  472. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  473. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  474. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  475. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  476. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  477. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  478. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  479. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  480. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  481. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  482. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  483. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  484. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  485. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  486. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  487. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  488. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  489. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  490. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  491. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  492. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  493. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  494. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  495. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  496. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  497. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  498. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  499. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  500. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  501. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  502. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  503. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
  504. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
scitex/path/_find.py CHANGED
@@ -1,113 +1,90 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 19:53:58 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_find.py
5
- #!./env/bin/python3
6
- # -*- coding: utf-8 -*-
7
- # Time-stamp: "2024-04-17 09:34:43"
8
- # Author: Yusuke Watanabe (ywatanabe@scitex.ai)
9
-
10
- """
11
- This script does XYZ.
12
- """
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_find.py
4
+
5
+ """File and directory finding utilities."""
13
6
 
14
7
  import fnmatch
15
- import os
16
- import sys
8
+ from pathlib import Path
9
+ from typing import List, Optional, Union
17
10
 
18
- import scitex
19
11
 
12
+ def find_git_root() -> Path:
13
+ """Find the root directory of the current git repository.
20
14
 
21
- # Functions
22
- def find_git_root():
15
+ Returns
16
+ -------
17
+ Path
18
+ Path to the git repository root.
19
+ """
23
20
  import git
24
21
 
25
22
  repo = git.Repo(".", search_parent_directories=True)
26
- return repo.working_tree_dir
23
+ return Path(repo.working_tree_dir)
27
24
 
28
25
 
29
- def find_dir(root_dir, exp):
26
+ def find_dir(root_dir: Union[str, Path], exp: Union[str, List[str]]) -> List[Path]:
27
+ """Find directories matching pattern."""
30
28
  return _find(root_dir, type="d", exp=exp)
31
29
 
32
30
 
33
- def find_file(root_dir, exp):
31
+ def find_file(root_dir: Union[str, Path], exp: Union[str, List[str]]) -> List[Path]:
32
+ """Find files matching pattern."""
34
33
  return _find(root_dir, type="f", exp=exp)
35
34
 
36
35
 
37
- def _find(rootdir, type="f", exp=["*"]):
38
- """
39
- Mimicks the Unix find command.
40
-
41
- Example:
42
- # rootdir =
43
- # type = 'f' # 'f' for files, 'd' for directories, None for both
44
- # exp = '*.txt' # Pattern to match, or None to match all
45
- find('/path/to/search', "f", "*.txt")
36
+ def _find(
37
+ rootdir: Union[str, Path],
38
+ type: Optional[str] = "f",
39
+ exp: Union[str, List[str]] = "*",
40
+ ) -> List[Path]:
41
+ """Mimics the Unix find command.
42
+
43
+ Parameters
44
+ ----------
45
+ rootdir : str or Path
46
+ Root directory to search in.
47
+ type : str, optional
48
+ 'f' for files, 'd' for directories, None for both.
49
+ exp : str or list of str
50
+ Pattern(s) to match.
51
+
52
+ Returns
53
+ -------
54
+ list of Path
55
+ Matching paths.
56
+
57
+ Example
58
+ -------
59
+ >>> _find('/path/to/search', "f", "*.txt")
46
60
  """
61
+ rootdir = Path(rootdir)
47
62
  if isinstance(exp, str):
48
63
  exp = [exp]
49
64
 
65
+ exclude_keys = ["/lib/", "/env/", "/build/"]
50
66
  matches = []
51
- for _exp in exp:
52
- for root, dirs, files in os.walk(rootdir):
53
- # Depending on the type, choose the list to iterate over
54
- if type == "f": # Files only
55
- names = files
56
- elif type == "d": # Directories only
57
- names = dirs
58
- else: # All entries
59
- names = files + dirs
60
-
61
- for name in names:
62
- # Construct the full path
63
- path = os.path.join(root, name)
64
-
65
- # If an _exp is provided, use fnmatch to filter names
66
- if _exp and not fnmatch.fnmatch(name, _exp):
67
- continue
68
-
69
- # If type is set, ensure the type matches
70
- if type == "f" and not os.path.isfile(path):
71
- continue
72
- if type == "d" and not os.path.isdir(path):
73
- continue
74
-
75
- exclude_keys = ["/lib/", "/env/", "/build/"]
76
- if not any(ek in path for ek in exclude_keys):
77
- matches.append(path)
78
-
79
- # for ek in exclude_keys:
80
- # if ek in path:
81
- # path = None
82
- # break
83
-
84
- # if path is not None:
85
- # # Add the matching path to the results
86
- # matches.append(path)
87
-
88
- return matches
89
-
90
-
91
- if __name__ == "__main__":
92
- # Import matplotlib only when running as script
93
- try:
94
- import matplotlib.pyplot as plt
95
- except ImportError:
96
- plt = None
97
67
 
98
- # Start
99
- CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.session.start(sys, plt)
68
+ for _exp in exp:
69
+ for path in rootdir.rglob("*"):
70
+ # Check type
71
+ if type == "f" and not path.is_file():
72
+ continue
73
+ if type == "d" and not path.is_dir():
74
+ continue
100
75
 
101
- # (YOUR AWESOME CODE)
76
+ # Check pattern match
77
+ if _exp and not fnmatch.fnmatch(path.name, _exp):
78
+ continue
102
79
 
103
- # Close
104
- scitex.session.close(CONFIG)
80
+ # Check exclusions
81
+ path_str = str(path)
82
+ if any(ek in path_str for ek in exclude_keys):
83
+ continue
105
84
 
106
- # EOF
85
+ matches.append(path)
107
86
 
108
- """
109
- /ssh:ywatanabe@444:/home/ywatanabe/proj/entrance/scitex/path/_find.py
110
- """
87
+ return matches
111
88
 
112
89
 
113
90
  # EOF
@@ -1,46 +1,48 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-14 07:39:32 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_get_module_path.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_get_module_path.py
5
4
 
5
+ """Module path utilities."""
6
+
7
+ import importlib.util
8
+ from pathlib import Path
6
9
 
7
- def get_data_path_from_a_package(package_str, resource):
8
- """
9
- Get the path to a data file within a package.
10
10
 
11
- This function finds the path to a data file within a package's data directory.
11
+ def get_data_path_from_a_package(package_str: str, resource: str) -> Path:
12
+ """Get the path to a data file within a package.
12
13
 
13
- Parameters:
14
- -----------
14
+ Parameters
15
+ ----------
15
16
  package_str : str
16
17
  The name of the package as a string.
17
18
  resource : str
18
19
  The name of the resource file within the package's data directory.
19
20
 
20
- Returns:
21
- --------
22
- str
21
+ Returns
22
+ -------
23
+ Path
23
24
  The full path to the resource file.
24
25
 
25
- Raises:
26
- -------
26
+ Raises
27
+ ------
27
28
  ImportError
28
29
  If the specified package cannot be found.
29
30
  FileNotFoundError
30
31
  If the resource file does not exist in the package's data directory.
31
32
  """
32
- import importlib
33
- import os
34
- import sys
35
-
36
33
  spec = importlib.util.find_spec(package_str)
37
34
  if spec is None:
38
35
  raise ImportError(f"Package '{package_str}' not found")
39
36
 
40
- data_dir = os.path.join(spec.origin.split("src")[0], "data")
41
- resource_path = os.path.join(data_dir, resource)
37
+ origin = Path(spec.origin)
38
+ data_dir = origin.parents[0]
39
+ while "src" not in str(data_dir) and data_dir != data_dir.parent:
40
+ data_dir = data_dir.parent
41
+ data_dir = data_dir.parent / "data"
42
+
43
+ resource_path = data_dir / resource
42
44
 
43
- if not os.path.exists(resource_path):
45
+ if not resource_path.exists():
44
46
  raise FileNotFoundError(
45
47
  f"Resource '{resource}' not found in package '{package_str}'"
46
48
  )
scitex/path/_get_spath.py CHANGED
@@ -1,34 +1,13 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 20:51:29 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_get_spath.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_get_spath.py
5
4
 
6
- import inspect
7
- import os
5
+ """Save path utilities - deprecated, use _mk_spath.py instead."""
8
6
 
9
- from ._split import split
7
+ from ._mk_spath import mk_spath
10
8
 
11
-
12
- def get_spath(sfname=".", makedirs=False):
13
- # if __IPYTHON__:
14
- # THIS_FILE = f'/tmp/{os.getenv("USER")}.py'
15
- # else:
16
- # THIS_FILE = inspect.stack()[1].filename
17
-
18
- THIS_FILE = inspect.stack()[1].filename
19
- if "ipython" in __file__: # for ipython
20
- THIS_FILE = f"/tmp/{os.getenv('USER')}.py"
21
-
22
- ## spath
23
- fpath = __file__
24
- fdir, fname, _ = split(fpath)
25
- sdir = fdir + fname + "/"
26
- spath = sdir + sfname
27
-
28
- if makedirs:
29
- os.makedirs(split(spath)[0], exist_ok=True)
30
-
31
- return spath
9
+ # Alias for backward compatibility
10
+ get_spath = mk_spath
32
11
 
33
12
 
34
13
  # EOF
scitex/path/_getsize.py CHANGED
@@ -1,18 +1,32 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 19:54:02 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_getsize.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_getsize.py
5
4
 
6
- import os
5
+ """File size utilities."""
6
+
7
+ from pathlib import Path
8
+ from typing import Union
7
9
 
8
10
  import numpy as np
9
11
 
10
12
 
11
- def getsize(path):
12
- if os.path.exists(path):
13
- return os.path.getsize(path)
14
- else:
15
- return np.nan
13
+ def getsize(path: Union[str, Path]) -> Union[int, float]:
14
+ """Get file size in bytes.
15
+
16
+ Parameters
17
+ ----------
18
+ path : str or Path
19
+ Path to file.
20
+
21
+ Returns
22
+ -------
23
+ int or float
24
+ File size in bytes, or np.nan if file doesn't exist.
25
+ """
26
+ path = Path(path)
27
+ if path.exists():
28
+ return path.stat().st_size
29
+ return np.nan
16
30
 
17
31
 
18
32
  # EOF
@@ -1,23 +1,28 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 19:45:32 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_increment_version.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_increment_version.py
4
+
5
+ """File versioning utilities."""
5
6
 
6
- import os
7
7
  import re
8
- from glob import glob
8
+ from pathlib import Path
9
+ from typing import Union
9
10
 
10
11
 
11
- def increment_version(dirname, fname, ext, version_prefix="_v"):
12
- """
13
- Generate the next version of a filename based on existing versioned files.
12
+ def increment_version(
13
+ dirname: Union[str, Path],
14
+ fname: str,
15
+ ext: str,
16
+ version_prefix: str = "_v",
17
+ ) -> Path:
18
+ """Generate the next version of a filename based on existing versioned files.
14
19
 
15
20
  This function searches for files in the given directory that match the pattern:
16
21
  {fname}{version_prefix}{number}{ext} and returns the path for the next version.
17
22
 
18
- Parameters:
19
- -----------
20
- dirname : str
23
+ Parameters
24
+ ----------
25
+ dirname : str or Path
21
26
  The directory to search in and where the new file will be created.
22
27
  fname : str
23
28
  The base filename without version number or extension.
@@ -26,62 +31,50 @@ def increment_version(dirname, fname, ext, version_prefix="_v"):
26
31
  version_prefix : str, optional
27
32
  The prefix used before the version number. Default is '_v'.
28
33
 
29
- Returns:
30
- --------
31
- str
34
+ Returns
35
+ -------
36
+ Path
32
37
  The full path for the next version of the file.
33
38
 
34
- Example:
35
- --------
39
+ Example
40
+ -------
36
41
  >>> increment_version('/path/to/dir', 'myfile', '.txt')
37
- '/path/to/dir/myfile_v004.txt'
42
+ Path('/path/to/dir/myfile_v004.txt')
38
43
 
39
- Notes:
40
- ------
44
+ Notes
45
+ -----
41
46
  - If no existing versioned files are found, it starts with version 001.
42
47
  - The version number is always formatted with at least 3 digits.
43
48
  """
44
- # Create a regex pattern to match the version number in the filename
49
+ dirname = Path(dirname)
50
+
45
51
  version_pattern = re.compile(
46
52
  rf"({re.escape(fname)}{re.escape(version_prefix)})(\d+)({re.escape(ext)})$"
47
53
  )
48
54
 
49
- # Construct the glob pattern to find all files that match the pattern
50
- glob_pattern = os.path.join(dirname, f"{fname}{version_prefix}*{ext}")
55
+ glob_pattern = f"{fname}{version_prefix}*{ext}"
56
+ files = list(dirname.glob(glob_pattern))
51
57
 
52
- # Use glob to find all files that match the pattern
53
- files = glob(glob_pattern)
54
-
55
- # Initialize the highest version number
56
58
  highest_version = 0
57
59
  base, suffix = None, None
58
60
 
59
- # Loop through the files to find the highest version number
60
61
  for file in files:
61
- filename = os.path.basename(file)
62
- match = version_pattern.search(filename)
62
+ match = version_pattern.search(file.name)
63
63
  if match:
64
64
  base, version_str, suffix = match.groups()
65
65
  version_num = int(version_str)
66
66
  if version_num > highest_version:
67
67
  highest_version = version_num
68
68
 
69
- # If no versioned files were found, use the provided filename and extension
70
69
  if base is None or suffix is None:
71
70
  base = f"{fname}{version_prefix}"
72
71
  suffix = ext
73
- highest_version = 0 # No previous versions
72
+ highest_version = 0
74
73
 
75
- # Increment the highest version number
76
74
  next_version_number = highest_version + 1
77
-
78
- # Format the next version number with the same number of digits as the original
79
75
  next_version_str = f"{base}{next_version_number:03d}{suffix}"
80
76
 
81
- # Combine the directory and new filename to create the full path
82
- next_filepath = os.path.join(dirname, next_version_str)
83
-
84
- return next_filepath
77
+ return dirname / next_version_str
85
78
 
86
79
 
87
80
  # EOF
scitex/path/_mk_spath.py CHANGED
@@ -1,49 +1,46 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 20:59:46 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_mk_spath.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_mk_spath.py
4
+
5
+ """Save path creation utilities."""
5
6
 
6
7
  import inspect
7
8
  import os
8
-
9
- from ._split import split
9
+ from pathlib import Path
10
+ from typing import Union
10
11
 
11
12
 
12
- def mk_spath(sfname, makedirs=False):
13
- """
14
- Create a save path based on the calling script's location.
13
+ def mk_spath(sfname: Union[str, Path], makedirs: bool = False) -> Path:
14
+ """Create a save path based on the calling script's location.
15
15
 
16
- Parameters:
17
- -----------
18
- sfname : str
16
+ Parameters
17
+ ----------
18
+ sfname : str or Path
19
19
  The name of the file to be saved.
20
20
  makedirs : bool, optional
21
- If True, create the directory structure for the save path. Default is False.
21
+ If True, create the directory structure for the save path.
22
22
 
23
- Returns:
24
- --------
25
- str
23
+ Returns
24
+ -------
25
+ Path
26
26
  The full save path for the file.
27
27
 
28
- Example:
29
- --------
30
- >>> import scitex.io._path as path
31
- >>> spath = path.mk_spath('output.txt', makedirs=True)
28
+ Example
29
+ -------
30
+ >>> spath = mk_spath('output.txt', makedirs=True)
32
31
  >>> print(spath)
33
- '/path/to/current/script/output.txt'
32
+ Path('/path/to/current/script_out/output.txt')
34
33
  """
35
- THIS_FILE = inspect.stack()[1].filename
36
- if "ipython" in __file__: # for ipython
37
- THIS_FILE = f"/tmp/fake-{os.getenv('USER')}.py"
34
+ caller_file = inspect.stack()[1].filename
35
+ if "ipython" in caller_file.lower():
36
+ caller_file = f"/tmp/fake-{os.getenv('USER')}.py"
38
37
 
39
- ## spath
40
- fpath = __file__
41
- fdir, fname, _ = split(fpath)
42
- sdir = fdir + fname + "/"
43
- spath = sdir + sfname
38
+ fpath = Path(caller_file)
39
+ sdir = fpath.parent / f"{fpath.stem}_out"
40
+ spath = sdir / sfname
44
41
 
45
42
  if makedirs:
46
- os.makedirs(split(spath)[0], exist_ok=True)
43
+ spath.parent.mkdir(parents=True, exist_ok=True)
47
44
 
48
45
  return spath
49
46
 
scitex/path/_path.py CHANGED
@@ -1,19 +1,12 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 20:46:35 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_path.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_path.py
5
4
 
6
- import inspect
5
+ """Path utilities - deprecated, use _this_path.py instead."""
7
6
 
7
+ from ._this_path import get_this_path, this_path
8
8
 
9
- def this_path(when_ipython="/tmp/fake.py"):
10
- THIS_FILE = inspect.stack()[1].filename
11
- if "ipython" in __file__:
12
- THIS_FILE = when_ipython
13
- return __file__
14
-
15
-
16
- get_this_path = this_path
9
+ __all__ = ["this_path", "get_this_path"]
17
10
 
18
11
 
19
12
  # EOF
scitex/path/_split.py CHANGED
@@ -1,23 +1,35 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 16:18:06 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_split.py
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_split.py
5
4
 
6
- import os
5
+ """Path splitting utilities."""
7
6
 
7
+ from pathlib import Path
8
+ from typing import Tuple, Union
8
9
 
9
- def split(fpath):
10
- """Split a file path to (1) the directory path, (2) the file name, and (3) the file extention
11
- Example:
12
- dirname, fname, ext = split('../data/01/day1/split_octave/2kHz_mat/tt8-2.mat')
13
- print(dirname) # '../data/01/day1/split_octave/2kHz_mat/'
14
- print(fname) # 'tt8-2'
15
- print(ext) # '.mat'
10
+
11
+ def split(fpath: Union[str, Path]) -> Tuple[Path, str, str]:
12
+ """Split a file path into directory, filename, and extension.
13
+
14
+ Parameters
15
+ ----------
16
+ fpath : str or Path
17
+ File path to split.
18
+
19
+ Returns
20
+ -------
21
+ tuple of (Path, str, str)
22
+ (directory, filename without extension, extension)
23
+
24
+ Example
25
+ -------
26
+ >>> dirname, fname, ext = split('../data/01/day1/tt8-2.mat')
27
+ >>> print(dirname) # Path('../data/01/day1')
28
+ >>> print(fname) # 'tt8-2'
29
+ >>> print(ext) # '.mat'
16
30
  """
17
- dirname = os.path.dirname(fpath) + "/"
18
- base = os.path.basename(fpath)
19
- fname, ext = os.path.splitext(base)
20
- return dirname, fname, ext
31
+ path = Path(fpath)
32
+ return path.parent, path.stem, path.suffix
21
33
 
22
34
 
23
35
  # EOF
scitex/path/_this_path.py CHANGED
@@ -1,19 +1,33 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 16:22:21 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_this_path.py
5
- #!/usr/bin/env python3
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_this_path.py
4
+
5
+ """Get current file path utilities."""
6
6
 
7
7
  import inspect
8
+ from pathlib import Path
9
+
8
10
 
11
+ def this_path(ipython_fake_path: str = "/tmp/fake.py") -> Path:
12
+ """Get the path of the calling script.
9
13
 
10
- def this_path(ipython_fake_path="/tmp/fake.py"):
11
- THIS_FILE = inspect.stack()[1].filename
12
- if "ipython" in __file__:
13
- THIS_FILE = ipython_fake_path
14
- return __file__
14
+ Parameters
15
+ ----------
16
+ ipython_fake_path : str
17
+ Fake path to return when running in IPython.
18
+
19
+ Returns
20
+ -------
21
+ Path
22
+ Path to the calling script.
23
+ """
24
+ caller_file = inspect.stack()[1].filename
25
+ if "ipython" in caller_file.lower():
26
+ return Path(ipython_fake_path)
27
+ return Path(caller_file)
15
28
 
16
29
 
17
30
  get_this_path = this_path
18
31
 
32
+
19
33
  # EOF