snid-sage 0.1.1.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snid_sage-0.1.1.dev0/.github/workflows/deploy-docs.yml +57 -0
- snid_sage-0.1.1.dev0/.github/workflows/deploy-pypi.yml +146 -0
- snid_sage-0.1.1.dev0/.github/workflows/test-installation.yml +245 -0
- snid_sage-0.1.1.dev0/.github/workflows/test-pypi-only.yml +282 -0
- snid_sage-0.1.1.dev0/.gitignore +333 -0
- snid_sage-0.1.1.dev0/LICENSE +35 -0
- snid_sage-0.1.1.dev0/MANIFEST.in +56 -0
- snid_sage-0.1.1.dev0/PKG-INFO +217 -0
- snid_sage-0.1.1.dev0/README.md +147 -0
- snid_sage-0.1.1.dev0/data/sn2003jo.dat +1743 -0
- snid_sage-0.1.1.dev0/data/tns_2024ggi.dat +1861 -0
- snid_sage-0.1.1.dev0/data/tns_2025baq.dat +943 -0
- snid_sage-0.1.1.dev0/data/tns_2025iau.dat +1915 -0
- snid_sage-0.1.1.dev0/docs/README.md +41 -0
- snid_sage-0.1.1.dev0/docs/index.md +258 -0
- snid_sage-0.1.1.dev0/docs/installation/installation.md +272 -0
- snid_sage-0.1.1.dev0/docs/navigation-guide.md +268 -0
- snid_sage-0.1.1.dev0/docs/quickstart/first-analysis.md +207 -0
- snid_sage-0.1.1.dev0/images/ChatGPT Image Jun 24, 2025, 03_11_21 PM.png +0 -0
- snid_sage-0.1.1.dev0/images/OLD_ICONS/ChatGPT Image May 3, 2025, 03_59_02 PM.png +0 -0
- snid_sage-0.1.1.dev0/images/OLD_ICONS/ChatGPT Image May 3, 2025, 04_04_56 PM.png +0 -0
- snid_sage-0.1.1.dev0/images/OLD_ICONS/ChatGPT Image May 3, 2025, 04_10_18 PM.png +0 -0
- snid_sage-0.1.1.dev0/images/OLD_ICONS/ChatGPT Image May 3, 2025, 04_12_52 PM.png +0 -0
- snid_sage-0.1.1.dev0/images/OLD_ICONS/dark.png +0 -0
- snid_sage-0.1.1.dev0/images/OLD_ICONS/icon.png +0 -0
- snid_sage-0.1.1.dev0/images/Screenshot.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.ico +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_1024x1024.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_128x128.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_128x128@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_16x16.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_16x16@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_256x256.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_256x256@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_32x32.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_32x32@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_512x512.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_512x512@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_64x64.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.iconset/icon_64x64@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_1024x1024.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_128x128.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_128x128@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_16x16.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_16x16@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_256x256.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_256x256@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_32x32.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_32x32@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_512x512.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_512x512@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_64x64.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.iconset/icon_64x64@2x.png +0 -0
- snid_sage-0.1.1.dev0/images/icon_dark.png +0 -0
- snid_sage-0.1.1.dev0/images/light.png +0 -0
- snid_sage-0.1.1.dev0/mkdocs.yml +157 -0
- snid_sage-0.1.1.dev0/pyproject.toml +206 -0
- snid_sage-0.1.1.dev0/run_snid_cli.py +18 -0
- snid_sage-0.1.1.dev0/run_snid_gui.py +510 -0
- snid_sage-0.1.1.dev0/run_tests.py +149 -0
- snid_sage-0.1.1.dev0/scripts/build_unified_storage.py +150 -0
- snid_sage-0.1.1.dev0/scripts/check_template_filtering.py +190 -0
- snid_sage-0.1.1.dev0/scripts/entry_points/bin/snid +15 -0
- snid_sage-0.1.1.dev0/scripts/entry_points/bin/snid-gui +28 -0
- snid_sage-0.1.1.dev0/scripts/entry_points/bin/snid-sage +28 -0
- snid_sage-0.1.1.dev0/scripts/entry_points/bin/snid-template +15 -0
- snid_sage-0.1.1.dev0/scripts/generate_platform_icons.py +281 -0
- snid_sage-0.1.1.dev0/scripts/plot_lnw_templates_pdf.py +107 -0
- snid_sage-0.1.1.dev0/scripts/plot_templates_pdf.py +133 -0
- snid_sage-0.1.1.dev0/scripts/rebuild_template_storage.py +239 -0
- snid_sage-0.1.1.dev0/scripts/setup_all_platform_icons.py +383 -0
- snid_sage-0.1.1.dev0/scripts/setup_linux_icons.py +405 -0
- snid_sage-0.1.1.dev0/scripts/setup_macos_icons.py +338 -0
- snid_sage-0.1.1.dev0/scripts/setup_windows_icons.py +341 -0
- snid_sage-0.1.1.dev0/scripts/verify_icons.py +54 -0
- snid_sage-0.1.1.dev0/setup.cfg +4 -0
- snid_sage-0.1.1.dev0/setup_cross_platform.py +318 -0
- snid_sage-0.1.1.dev0/snid_sage/__init__.py +52 -0
- snid_sage-0.1.1.dev0/snid_sage/_version.py +21 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/__init__.py +31 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/cli/__init__.py +43 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/cli/batch.py +1282 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/cli/config.py +280 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/cli/identify.py +931 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/cli/main.py +166 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/cli/template.py +457 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/__init__.py +12 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/__init__.py +16 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/analysis/__init__.py +9 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/analysis/analysis_plotter.py +615 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/analysis/interactive_line_tools.py +385 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/__init__.py +50 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/cluster_selection_dialog.py +1340 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/configuration_dialog.py +1295 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/continuum_editor_dialog.py +391 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/enhanced_ai_assistant_dialog.py +1021 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/manual_redshift_dialog.py +1567 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/mask_manager_dialog.py +274 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/multi_step_emission_dialog.py +2933 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/preprocessing_dialog.py +2074 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/preprocessing_selection_dialog.py +267 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/redshift_mode_dialog.py +351 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/results_dialog.py +694 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/settings_dialog.py +760 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/shortcuts_dialog.py +306 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/snid_analysis_dialog.py +439 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/dialogs/wind_velocity_dialog.py +825 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/forms/__init__.py +14 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/forms/input_controls.py +323 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/forms/toggle_controls.py +465 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/plots/__init__.py +17 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/plots/interactive_tools.py +390 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/plots/preview_plot_manager.py +665 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/plots/spectrum_plotter.py +401 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/plots/summary_plotter.py +432 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/__init__.py +39 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/advanced_controls.py +572 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/config_widgets.py +554 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/custom_toggles.py +446 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/interactive_continuum_widget.py +757 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/progress_widgets.py +656 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/components/widgets/theme_widgets.py +351 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/controllers/__init__.py +21 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/controllers/app_controller.py +572 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/controllers/dialog_controller.py +454 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/controllers/file_controller.py +707 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/controllers/plot_controller.py +1192 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/controllers/view_controller.py +221 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/dialogs/__init__.py +6 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/__init__.py +9 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/__init__.py +22 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/analysis_controller.py +1578 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/cluster_summary.py +555 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/emission_line_overlay_controller.py +390 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/games_integration.py +357 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/line_detection.py +826 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/manual_selection_controller.py +564 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/analysis/wind_velocity_controller.py +485 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/configuration/__init__.py +18 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/configuration/config_controller.py +594 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/configuration/gui_settings_controller.py +544 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/preprocessing/__init__.py +16 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/preprocessing/preprocessing_controller.py +351 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/preprocessing/preview_calculator.py +535 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/preprocessing/spectrum_preprocessor.py +630 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/results/__init__.py +9 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/results/llm_integration.py +479 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/features/results/results_manager.py +539 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/preprocessing_gui.py +56 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/sage_gui.py +1923 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/__init__.py +39 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/cross_platform_window.py +871 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/event_handlers.py +412 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/gui_helpers.py +472 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/import_manager.py +236 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/improved_button_workflow.py +378 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/layout_utils.py +1245 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/logo_manager.py +240 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/no_title_plot_manager.py +348 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/spectrum_reset_manager.py +622 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/startup_manager.py +366 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/state_manager.py +497 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/unified_font_manager.py +312 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/unified_theme_manager.py +794 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/universal_window_manager.py +419 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/window_event_handlers.py +222 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/utils/workflow_integration.py +295 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/gui/widgets/__init__.py +6 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/__init__.py +12 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/analysis/__init__.py +6 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/analysis/llm_utils.py +660 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/llm_integration.py +444 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/openrouter/__init__.py +6 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/openrouter/openrouter_llm.py +901 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/openrouter/openrouter_summary.py +774 -0
- snid_sage-0.1.1.dev0/snid_sage/interfaces/llm/ui/__init__.py +14 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/__init__.py +38 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/constants/__init__.py +80 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/constants/physical.py +405 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/exceptions/__init__.py +41 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/exceptions/core_exceptions.py +127 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/types/__init__.py +53 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/types/result_types.py +197 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/types/spectrum_types.py +209 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/__init__.py +15 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/config/__init__.py +26 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/config/configuration_manager.py +563 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/config/platform_config.py +253 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/data_io/__init__.py +6 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/data_io/spectrum_loader.py +480 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/__init__.py +133 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/fwhm_analysis.py +432 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/interactive_fwhm_analyzer.py +503 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/line_analysis.py +170 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/line_detection_utils.py +1158 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/line_presets.py +282 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/line_selection_utils.py +298 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/nist_search.py +684 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/line_detection/spectrum_utils.py +186 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/logging/__init__.py +104 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/logging/config.py +317 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/logging/snid_logger.py +392 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/mask_utils/__init__.py +6 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/mask_utils/mask_utils.py +301 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/math_utils/__init__.py +39 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/math_utils/weighted_statistics.py +365 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/plotting/__init__.py +45 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/plotting/plot_theming.py +513 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/plotting/spectrum_utils.py +259 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/results_formatter.py +630 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/simple_template_finder.py +397 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/wind_analysis/__init__.py +36 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/wind_analysis/pcygni_fitting.py +503 -0
- snid_sage-0.1.1.dev0/snid_sage/shared/utils/wind_analysis/wind_calculations.py +455 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/__init__.py +28 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/core/__init__.py +36 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/core/config.py +420 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/core/integration.py +510 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/cosmological_clustering.py +1039 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/fft_tools.py +521 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/games.py +1892 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/io.py +1455 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/optimization_integration.py +224 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/plotting.py +2290 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/plotting_3d.py +474 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/preprocessing.py +763 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/snid.py +2483 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/snid_test.py +232 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/snidtype.py +656 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/template_fft_storage.py +868 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/template_manager.py +399 -0
- snid_sage-0.1.1.dev0/snid_sage/snid/vectorized_peak_finder.py +441 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/template_index.json +7936 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_AGN.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_GAP.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Galaxy.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_II.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Ia.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Ib.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Ibn.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Ic.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Icn.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_KN.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_LFBOT.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_SLSN.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_Star.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage/templates/templates_TDE.hdf5 +0 -0
- snid_sage-0.1.1.dev0/snid_sage.egg-info/PKG-INFO +217 -0
- snid_sage-0.1.1.dev0/snid_sage.egg-info/SOURCES.txt +252 -0
- snid_sage-0.1.1.dev0/snid_sage.egg-info/dependency_links.txt +1 -0
- snid_sage-0.1.1.dev0/snid_sage.egg-info/entry_points.txt +5 -0
- snid_sage-0.1.1.dev0/snid_sage.egg-info/requires.txt +47 -0
- snid_sage-0.1.1.dev0/snid_sage.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Deploy Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: "pages"
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Set up Python
|
|
26
|
+
uses: actions/setup-python@v4
|
|
27
|
+
with:
|
|
28
|
+
python-version: '3.11'
|
|
29
|
+
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install --upgrade pip
|
|
33
|
+
pip install mkdocs-material
|
|
34
|
+
pip install mkdocs-git-revision-date-localized-plugin
|
|
35
|
+
|
|
36
|
+
- name: Build documentation
|
|
37
|
+
run: mkdocs build
|
|
38
|
+
|
|
39
|
+
- name: Setup Pages
|
|
40
|
+
uses: actions/configure-pages@v4
|
|
41
|
+
|
|
42
|
+
- name: Upload artifact
|
|
43
|
+
uses: actions/upload-pages-artifact@v3
|
|
44
|
+
with:
|
|
45
|
+
path: './site'
|
|
46
|
+
|
|
47
|
+
deploy:
|
|
48
|
+
environment:
|
|
49
|
+
name: github-pages
|
|
50
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
51
|
+
runs-on: ubuntu-latest
|
|
52
|
+
needs: build
|
|
53
|
+
if: github.ref == 'refs/heads/main'
|
|
54
|
+
steps:
|
|
55
|
+
- name: Deploy to GitHub Pages
|
|
56
|
+
id: deployment
|
|
57
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
name: Deploy to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*' # Trigger on version tags like v1.2.3
|
|
7
|
+
workflow_dispatch: # Allow manual trigger
|
|
8
|
+
inputs:
|
|
9
|
+
test_pypi:
|
|
10
|
+
description: 'Deploy to Test PyPI instead of PyPI'
|
|
11
|
+
required: false
|
|
12
|
+
default: false
|
|
13
|
+
type: boolean
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
test-before-deploy:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout code
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
with:
|
|
22
|
+
fetch-depth: 0 # Fetch all history for setuptools_scm
|
|
23
|
+
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: '3.11'
|
|
28
|
+
|
|
29
|
+
- name: Install system dependencies
|
|
30
|
+
run: |
|
|
31
|
+
sudo apt-get update
|
|
32
|
+
sudo apt-get install -y libhdf5-dev libpng-dev libjpeg-dev pkg-config build-essential
|
|
33
|
+
|
|
34
|
+
- name: Install build dependencies
|
|
35
|
+
run: |
|
|
36
|
+
python -m pip install --upgrade pip
|
|
37
|
+
pip install build twine setuptools_scm[toml]
|
|
38
|
+
|
|
39
|
+
- name: Verify version detection
|
|
40
|
+
run: |
|
|
41
|
+
python -c "
|
|
42
|
+
from setuptools_scm import get_version
|
|
43
|
+
version = get_version()
|
|
44
|
+
print(f'Detected version: {version}')
|
|
45
|
+
"
|
|
46
|
+
|
|
47
|
+
- name: Build package
|
|
48
|
+
run: |
|
|
49
|
+
python -m build
|
|
50
|
+
|
|
51
|
+
- name: Check package
|
|
52
|
+
run: |
|
|
53
|
+
python -m twine check dist/*
|
|
54
|
+
|
|
55
|
+
- name: Test basic import
|
|
56
|
+
run: |
|
|
57
|
+
pip install dist/*.whl
|
|
58
|
+
python -c "import snid_sage; print(f'Package version: {snid_sage.__version__}')"
|
|
59
|
+
|
|
60
|
+
deploy:
|
|
61
|
+
needs: test-before-deploy
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
|
|
64
|
+
steps:
|
|
65
|
+
- name: Checkout code
|
|
66
|
+
uses: actions/checkout@v4
|
|
67
|
+
with:
|
|
68
|
+
fetch-depth: 0 # Fetch all history for setuptools_scm
|
|
69
|
+
|
|
70
|
+
- name: Set up Python
|
|
71
|
+
uses: actions/setup-python@v5
|
|
72
|
+
with:
|
|
73
|
+
python-version: '3.11'
|
|
74
|
+
|
|
75
|
+
- name: Install system dependencies
|
|
76
|
+
run: |
|
|
77
|
+
sudo apt-get update
|
|
78
|
+
sudo apt-get install -y libhdf5-dev libpng-dev libjpeg-dev pkg-config build-essential
|
|
79
|
+
|
|
80
|
+
- name: Install build dependencies
|
|
81
|
+
run: |
|
|
82
|
+
python -m pip install --upgrade pip
|
|
83
|
+
pip install build twine setuptools_scm[toml]
|
|
84
|
+
|
|
85
|
+
- name: Build package
|
|
86
|
+
run: |
|
|
87
|
+
python -m build
|
|
88
|
+
|
|
89
|
+
- name: Verify built package
|
|
90
|
+
run: |
|
|
91
|
+
echo "Built files:"
|
|
92
|
+
ls -la dist/
|
|
93
|
+
echo "Package contents:"
|
|
94
|
+
python -m twine check dist/*
|
|
95
|
+
|
|
96
|
+
- name: Deploy to Test PyPI
|
|
97
|
+
if: github.event.inputs.test_pypi == 'true'
|
|
98
|
+
run: |
|
|
99
|
+
python -m twine upload --repository testpypi dist/*
|
|
100
|
+
env:
|
|
101
|
+
TWINE_USERNAME: __token__
|
|
102
|
+
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
|
103
|
+
|
|
104
|
+
- name: Deploy to PyPI
|
|
105
|
+
if: github.event.inputs.test_pypi != 'true'
|
|
106
|
+
run: |
|
|
107
|
+
python -m twine upload dist/*
|
|
108
|
+
env:
|
|
109
|
+
TWINE_USERNAME: __token__
|
|
110
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
111
|
+
|
|
112
|
+
- name: Create GitHub Release
|
|
113
|
+
if: github.event.inputs.test_pypi != 'true' && startsWith(github.ref, 'refs/tags/')
|
|
114
|
+
uses: actions/create-release@v1
|
|
115
|
+
env:
|
|
116
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
117
|
+
with:
|
|
118
|
+
tag_name: ${{ github.ref_name }}
|
|
119
|
+
release_name: SNID SAGE ${{ github.ref_name }}
|
|
120
|
+
body: |
|
|
121
|
+
## SNID SAGE ${{ github.ref_name }}
|
|
122
|
+
|
|
123
|
+
### Installation
|
|
124
|
+
```bash
|
|
125
|
+
pip install snid-sage
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### What's Changed
|
|
129
|
+
- See commit history for detailed changes
|
|
130
|
+
|
|
131
|
+
### Full Changelog
|
|
132
|
+
**Full Changelog**: https://github.com/FiorenSt/SNID-SAGE/compare/v0.0.1...${{ github.ref_name }}
|
|
133
|
+
draft: false
|
|
134
|
+
prerelease: false
|
|
135
|
+
|
|
136
|
+
notify-success:
|
|
137
|
+
needs: deploy
|
|
138
|
+
runs-on: ubuntu-latest
|
|
139
|
+
if: success()
|
|
140
|
+
steps:
|
|
141
|
+
- name: Notify deployment success
|
|
142
|
+
run: |
|
|
143
|
+
echo "🎉 SNID SAGE successfully deployed to PyPI!"
|
|
144
|
+
echo "📦 Package: snid-sage"
|
|
145
|
+
echo "🏷️ Version: ${{ github.ref_name }}"
|
|
146
|
+
echo "📋 Install command: pip install snid-sage"
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
name: Test Package Installation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
# DISABLED - Using test-pypi-only.yml instead
|
|
5
|
+
# This workflow is disabled and will not run
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
disabled:
|
|
9
|
+
description: 'This workflow is disabled'
|
|
10
|
+
required: true
|
|
11
|
+
default: 'disabled'
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
test-installation:
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
# Test key combinations to avoid too many jobs
|
|
19
|
+
include:
|
|
20
|
+
# Core platform testing
|
|
21
|
+
- os: ubuntu-latest
|
|
22
|
+
python-version: "3.11"
|
|
23
|
+
install-method: "pip"
|
|
24
|
+
test-name: "Ubuntu Python 3.11"
|
|
25
|
+
- os: macos-latest
|
|
26
|
+
python-version: "3.11"
|
|
27
|
+
install-method: "pip"
|
|
28
|
+
test-name: "macOS Python 3.11"
|
|
29
|
+
- os: windows-latest
|
|
30
|
+
python-version: "3.11"
|
|
31
|
+
install-method: "pip"
|
|
32
|
+
test-name: "Windows Python 3.11"
|
|
33
|
+
# Test conda on macOS
|
|
34
|
+
- os: macos-latest
|
|
35
|
+
python-version: "3.11"
|
|
36
|
+
install-method: "conda"
|
|
37
|
+
test-name: "macOS Conda Python 3.11"
|
|
38
|
+
# Test older Python versions
|
|
39
|
+
- os: ubuntu-latest
|
|
40
|
+
python-version: "3.8"
|
|
41
|
+
install-method: "pip"
|
|
42
|
+
test-name: "Ubuntu Python 3.8"
|
|
43
|
+
- os: macos-latest
|
|
44
|
+
python-version: "3.12"
|
|
45
|
+
install-method: "pip"
|
|
46
|
+
test-name: "macOS Python 3.12"
|
|
47
|
+
|
|
48
|
+
runs-on: ${{ matrix.os }}
|
|
49
|
+
|
|
50
|
+
steps:
|
|
51
|
+
- name: Checkout code
|
|
52
|
+
uses: actions/checkout@v4
|
|
53
|
+
|
|
54
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
55
|
+
uses: actions/setup-python@v5
|
|
56
|
+
with:
|
|
57
|
+
python-version: ${{ matrix.python-version }}
|
|
58
|
+
|
|
59
|
+
- name: Set up Conda (if using conda)
|
|
60
|
+
if: matrix.install-method == 'conda'
|
|
61
|
+
uses: conda-incubator/setup-miniconda@v3
|
|
62
|
+
with:
|
|
63
|
+
python-version: ${{ matrix.python-version }}
|
|
64
|
+
|
|
65
|
+
- name: Cache pip dependencies
|
|
66
|
+
uses: actions/cache@v3
|
|
67
|
+
with:
|
|
68
|
+
path: ~/.cache/pip
|
|
69
|
+
key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml', '**/requirements*.txt') }}
|
|
70
|
+
restore-keys: |
|
|
71
|
+
${{ runner.os }}-pip-
|
|
72
|
+
|
|
73
|
+
- name: Install system dependencies (macOS)
|
|
74
|
+
if: runner.os == 'macOS'
|
|
75
|
+
run: |
|
|
76
|
+
# Install Homebrew if not available
|
|
77
|
+
if ! command -v brew &> /dev/null; then
|
|
78
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
79
|
+
fi
|
|
80
|
+
brew install hdf5
|
|
81
|
+
brew install libpng
|
|
82
|
+
brew install libjpeg
|
|
83
|
+
brew install pkg-config
|
|
84
|
+
|
|
85
|
+
- name: Install system dependencies (Ubuntu)
|
|
86
|
+
if: runner.os == 'Linux'
|
|
87
|
+
run: |
|
|
88
|
+
sudo apt-get update
|
|
89
|
+
sudo apt-get install -y libhdf5-dev libpng-dev libjpeg-dev pkg-config build-essential
|
|
90
|
+
|
|
91
|
+
- name: Build package
|
|
92
|
+
run: |
|
|
93
|
+
python -m pip install --upgrade pip build wheel
|
|
94
|
+
python -m build --sdist --wheel
|
|
95
|
+
|
|
96
|
+
- name: Test pip installation
|
|
97
|
+
if: matrix.install-method == 'pip'
|
|
98
|
+
shell: bash
|
|
99
|
+
run: |
|
|
100
|
+
set -euxo pipefail
|
|
101
|
+
echo "Testing: ${{ matrix.test-name }}"
|
|
102
|
+
|
|
103
|
+
# Test installation from wheel
|
|
104
|
+
python -m pip install dist/*.whl
|
|
105
|
+
|
|
106
|
+
# Test basic import
|
|
107
|
+
python -c "import snid_sage; print('✅ Package imported successfully')"
|
|
108
|
+
|
|
109
|
+
# Test CLI commands
|
|
110
|
+
echo "Testing CLI commands..."
|
|
111
|
+
snid --help && echo "✅ snid CLI works"
|
|
112
|
+
snid-gui --help && echo "✅ snid-gui CLI works"
|
|
113
|
+
snid-sage --help && echo "✅ snid-sage CLI works"
|
|
114
|
+
|
|
115
|
+
# Test optional dependencies + dev extras
|
|
116
|
+
echo "Testing optional dependencies..."
|
|
117
|
+
python -m pip install ".[dev]"
|
|
118
|
+
python -c "import snid_sage; print('✅ Package with dev dependencies imported successfully')"
|
|
119
|
+
|
|
120
|
+
# Test core functionality
|
|
121
|
+
echo "Testing core functionality..."
|
|
122
|
+
python -c "
|
|
123
|
+
from snid_sage.shared.utils.data_io.spectrum_loader import SpectrumLoader
|
|
124
|
+
loader = SpectrumLoader()
|
|
125
|
+
print('✅ Core functionality works')
|
|
126
|
+
"
|
|
127
|
+
|
|
128
|
+
- name: Test sdist installation
|
|
129
|
+
if: matrix.install-method == 'pip'
|
|
130
|
+
shell: bash
|
|
131
|
+
run: |
|
|
132
|
+
set -euxo pipefail
|
|
133
|
+
echo "Testing sdist installation..."
|
|
134
|
+
pip uninstall -y snid-sage
|
|
135
|
+
python -m pip install dist/*.tar.gz
|
|
136
|
+
python -c "import snid_sage; print('✅ sdist installation successful')"
|
|
137
|
+
|
|
138
|
+
- name: Run unit tests
|
|
139
|
+
if: matrix.install-method == 'pip'
|
|
140
|
+
shell: bash
|
|
141
|
+
run: |
|
|
142
|
+
set -euxo pipefail
|
|
143
|
+
echo "Running unit tests..."
|
|
144
|
+
python -m pip install ".[dev]"
|
|
145
|
+
pytest -q
|
|
146
|
+
|
|
147
|
+
- name: Test conda installation
|
|
148
|
+
if: matrix.install-method == 'conda'
|
|
149
|
+
run: |
|
|
150
|
+
echo "Testing: ${{ matrix.test-name }}"
|
|
151
|
+
|
|
152
|
+
# Install package in conda environment
|
|
153
|
+
conda install -c conda-forge pip
|
|
154
|
+
pip install dist/*.whl
|
|
155
|
+
|
|
156
|
+
# Test basic import
|
|
157
|
+
python -c "import snid_sage; print('✅ Package imported successfully in conda')"
|
|
158
|
+
|
|
159
|
+
# Test CLI commands
|
|
160
|
+
echo "Testing CLI commands in conda..."
|
|
161
|
+
snid --help && echo "✅ snid CLI works in conda"
|
|
162
|
+
snid-gui --help && echo "✅ snid-gui CLI works in conda"
|
|
163
|
+
snid-sage --help && echo "✅ snid-sage CLI works in conda"
|
|
164
|
+
|
|
165
|
+
# Test core functionality
|
|
166
|
+
echo "Testing core functionality in conda..."
|
|
167
|
+
python -c "
|
|
168
|
+
from snid_sage.shared.utils.data_io.spectrum_loader import SpectrumLoader
|
|
169
|
+
loader = SpectrumLoader()
|
|
170
|
+
print('✅ Core functionality works in conda')
|
|
171
|
+
"
|
|
172
|
+
|
|
173
|
+
- name: Test GUI import (if GUI dependencies available)
|
|
174
|
+
run: |
|
|
175
|
+
echo "Testing GUI module import..."
|
|
176
|
+
python -c "
|
|
177
|
+
try:
|
|
178
|
+
import snid_sage.interfaces.gui.sage_gui
|
|
179
|
+
print('✅ GUI module imported successfully')
|
|
180
|
+
except ImportError as e:
|
|
181
|
+
print(f'⚠️ GUI import failed (expected on CI): {e}')
|
|
182
|
+
except Exception as e:
|
|
183
|
+
print(f'❌ GUI exception: {e}')
|
|
184
|
+
"
|
|
185
|
+
|
|
186
|
+
- name: Test optional dependencies availability
|
|
187
|
+
run: |
|
|
188
|
+
echo "Testing optional dependencies..."
|
|
189
|
+
for dep in astropy scipy matplotlib pandas h5py; do
|
|
190
|
+
if python -c "import $dep" 2>/dev/null; then
|
|
191
|
+
echo "✅ $dep available"
|
|
192
|
+
else
|
|
193
|
+
echo "⚠️ $dep not available"
|
|
194
|
+
fi
|
|
195
|
+
done
|
|
196
|
+
|
|
197
|
+
- name: Test Summary
|
|
198
|
+
if: always()
|
|
199
|
+
run: |
|
|
200
|
+
echo "### ${{ matrix.test-name }} 📝" >> "$GITHUB_STEP_SUMMARY"
|
|
201
|
+
echo "- Package built and installed successfully" >> "$GITHUB_STEP_SUMMARY"
|
|
202
|
+
echo "- CLI commands available" >> "$GITHUB_STEP_SUMMARY"
|
|
203
|
+
echo "- Core functionality works" >> "$GITHUB_STEP_SUMMARY"
|
|
204
|
+
echo "- Optional dependencies handled" >> "$GITHUB_STEP_SUMMARY"
|
|
205
|
+
|
|
206
|
+
test-pypi-installation:
|
|
207
|
+
runs-on: macos-latest
|
|
208
|
+
if: github.event_name == 'release'
|
|
209
|
+
|
|
210
|
+
steps:
|
|
211
|
+
- name: Checkout code
|
|
212
|
+
uses: actions/checkout@v4
|
|
213
|
+
|
|
214
|
+
- name: Set up Python
|
|
215
|
+
uses: actions/setup-python@v5
|
|
216
|
+
with:
|
|
217
|
+
python-version: "3.11"
|
|
218
|
+
|
|
219
|
+
- name: Install from PyPI
|
|
220
|
+
run: |
|
|
221
|
+
echo "Testing PyPI installation on macOS..."
|
|
222
|
+
python -m pip install --upgrade pip
|
|
223
|
+
python -m pip install snid-sage
|
|
224
|
+
|
|
225
|
+
# Test basic functionality
|
|
226
|
+
python -c "import snid_sage; print('✅ PyPI installation successful')"
|
|
227
|
+
|
|
228
|
+
# Test CLI commands
|
|
229
|
+
echo "Testing PyPI CLI commands..."
|
|
230
|
+
snid --help && echo "✅ PyPI snid CLI works"
|
|
231
|
+
snid-gui --help && echo "✅ PyPI snid-gui CLI works"
|
|
232
|
+
snid-sage --help && echo "✅ PyPI snid-sage CLI works"
|
|
233
|
+
|
|
234
|
+
- name: Test PyPI with optional dependencies
|
|
235
|
+
run: |
|
|
236
|
+
echo "Testing PyPI with dev dependencies..."
|
|
237
|
+
python -m pip install "snid-sage[dev]"
|
|
238
|
+
python -c "import snid_sage; print('✅ PyPI installation with dev dependencies successful')"
|
|
239
|
+
|
|
240
|
+
# Test core functionality
|
|
241
|
+
python -c "
|
|
242
|
+
from snid_sage.shared.utils.data_io.spectrum_loader import SpectrumLoader
|
|
243
|
+
loader = SpectrumLoader()
|
|
244
|
+
print('✅ PyPI core functionality works')
|
|
245
|
+
"
|