solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.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.
Potentially problematic release.
This version of solarwindpy might be problematic. Click here for more details.
- plans/.velocity/metrics.json +96 -0
- plans/0-overview-template.md +268 -0
- plans/N-phase-template.md +106 -0
- plans/PLAN_AUDIT_SUMMARY.md +173 -0
- plans/TEMPLATE-USAGE-GUIDE.md +198 -0
- plans/__init__.py +1 -0
- plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
- plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
- plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
- plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
- plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
- plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
- plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
- plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
- plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
- plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
- plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
- plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
- plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
- plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
- plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
- plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
- plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
- plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
- plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
- plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
- plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
- plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
- plans/cicd-architecture-redesign/0-Overview.md +193 -0
- plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
- plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
- plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
- plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
- plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
- plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
- plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
- plans/cicd-architecture-redesign/8-Documentation.md +285 -0
- plans/cicd-architecture-redesign/Closeout.md +225 -0
- plans/closeout-template.md +259 -0
- plans/completed/circular-import-audit/0-Overview.md +152 -0
- plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
- plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
- plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
- plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
- plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
- plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
- plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
- plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
- plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
- plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
- plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
- plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
- plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
- plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
- plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
- plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
- plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
- plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
- plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
- plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
- plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
- plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
- plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
- plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
- plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
- plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
- plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
- plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
- plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
- plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
- plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
- plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
- plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
- plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
- plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
- plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
- plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
- plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
- plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
- plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
- plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
- plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
- plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
- plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
- plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
- plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
- plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
- plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
- plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
- plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
- plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
- plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
- plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
- plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
- plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
- plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
- plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
- plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
- plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
- plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
- plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
- plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
- plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
- plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
- plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
- plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
- plans/completed/pr-review-remediation/0-Overview.md +138 -0
- plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
- plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
- plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
- plans/completed/pr-review-remediation/compacted_state.md +66 -0
- plans/completed/python-310-migration/0-Overview.md +390 -0
- plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
- plans/completed/python-310-migration/2-Implementation.md +256 -0
- plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
- plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
- plans/completed/python-310-migration/5-Closeout.md +252 -0
- plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
- plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
- plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
- plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
- plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
- plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
- plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
- plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
- plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
- plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
- plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
- plans/completed/test-directory-consolidation/0-Overview.md +51 -0
- plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
- plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
- plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
- plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
- plans/completed/test-directory-consolidation/5-Validation.md +152 -0
- plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
- plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
- plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
- plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
- plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
- plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
- plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
- plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
- plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
- plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
- plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
- plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
- plans/documentation-code-audit/0-Overview.md +393 -0
- plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
- plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
- plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
- plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
- plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
- plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
- plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
- plans/documentation-code-audit/8-Closeout.md +456 -0
- plans/documentation-rebuild-session/compacted_state.md +109 -0
- plans/documentation-rendering-fixes/0-Overview.md +104 -0
- plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
- plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
- plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
- plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
- plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
- plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
- plans/documentation-rendering-fixes/compacted_state.md +132 -0
- plans/documentation-template-fix/0-Overview.md +197 -0
- plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
- plans/documentation-template-fix/2-Template-Modification.md +609 -0
- plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
- plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
- plans/documentation-template-fix/5-Documentation-Training.md +602 -0
- plans/documentation-workflow-fix/0-Overview.md +222 -0
- plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
- plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
- plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
- plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
- plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
- plans/duplicate-object-warnings-fix-plan.md +130 -0
- plans/github-issues-migration/0-Overview.md +510 -0
- plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
- plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
- plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
- plans/github-issues-migration/4-Validated-Migration.md +252 -0
- plans/github-issues-migration/5-Documentation-Training.md +171 -0
- plans/github-issues-migration/6-Closeout.md +179 -0
- plans/github-workflows-repair/repair-plan.md +299 -0
- plans/issues_from_plans.py +342 -0
- plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
- plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
- plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
- plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
- plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
- plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
- plans/python-310-migration/0-Overview.md +390 -0
- plans/python-310-migration/1-Planning-Setup.md +164 -0
- plans/python-310-migration/2-Implementation.md +256 -0
- plans/python-310-migration/3-Testing-Validation.md +335 -0
- plans/python-310-migration/4-Documentation-Release.md +274 -0
- plans/python-310-migration/5-Closeout.md +252 -0
- plans/readthedocs-simplified/0-Overview.md +243 -0
- plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
- plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
- plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
- plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
- plans/readthedocs-simplified/5-Closeout.md +231 -0
- plans/readthedocs-simplified/compacted_state.md +127 -0
- plans/session-compaction-2025-08-12/compacted_state.md +114 -0
- plans/session-compaction-2025-08-13/compacted_state.md +145 -0
- plans/session-continuity-protocol/0-Overview.md +35 -0
- plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
- plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
- plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
- plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
- plans/sphinx-warnings-analysis.md +222 -0
- plans/systemprompt-optimization/0-Overview.md +447 -0
- plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
- plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
- plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
- plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
- plans/systemprompt-optimization/9-Closeout.md +165 -0
- plans/systemprompt-optimization/compacted_state.md +143 -0
- plans/template-value-propositions/0-Overview.md +357 -0
- plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
- plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
- plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
- plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
- plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
- plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
- plans/tests-audit/0-Overview.md +410 -0
- plans/tests-audit/1-Discovery-Inventory.md +170 -0
- plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
- plans/tests-audit/3-Architecture-Compliance.md +195 -0
- plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
- plans/tests-audit/5-Documentation-Enhancement.md +220 -0
- plans/tests-audit/6-Audit-Deliverables.md +220 -0
- plans/tests-audit/7-Closeout.md +252 -0
- plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
- plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
- plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
- plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
- plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
- plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
- plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
- plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
- plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
- plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
- plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
- plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
- plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
- plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
- plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
- plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
- plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
- plans/tests-audit/artifacts/test_parser.py +395 -0
- solarwindpy/README.md +3 -0
- solarwindpy/Untitled.ipynb +54 -0
- solarwindpy/__init__.py +74 -0
- solarwindpy/core/__init__.py +23 -0
- solarwindpy/core/alfvenic_turbulence.py +804 -0
- solarwindpy/core/base.py +267 -0
- solarwindpy/core/ions.py +309 -0
- solarwindpy/core/plasma.py +2133 -0
- solarwindpy/core/spacecraft.py +256 -0
- solarwindpy/core/tensor.py +90 -0
- solarwindpy/core/units_constants.py +199 -0
- solarwindpy/core/vector.py +328 -0
- solarwindpy/fitfunctions/__init__.py +20 -0
- solarwindpy/fitfunctions/core.py +734 -0
- solarwindpy/fitfunctions/exponentials.py +188 -0
- solarwindpy/fitfunctions/gaussians.py +264 -0
- solarwindpy/fitfunctions/lines.py +116 -0
- solarwindpy/fitfunctions/moyal.py +71 -0
- solarwindpy/fitfunctions/plots.py +751 -0
- solarwindpy/fitfunctions/power_laws.py +209 -0
- solarwindpy/fitfunctions/tex_info.py +568 -0
- solarwindpy/fitfunctions/trend_fits.py +482 -0
- solarwindpy/instabilities/__init__.py +16 -0
- solarwindpy/instabilities/beta_ani.py +82 -0
- solarwindpy/instabilities/verscharen2016.py +631 -0
- solarwindpy/plotting/__init__.py +33 -0
- solarwindpy/plotting/agg_plot.py +489 -0
- solarwindpy/plotting/base.py +465 -0
- solarwindpy/plotting/hist1d.py +405 -0
- solarwindpy/plotting/hist2d.py +1035 -0
- solarwindpy/plotting/histograms.py +1845 -0
- solarwindpy/plotting/labels/__init__.py +104 -0
- solarwindpy/plotting/labels/base.py +686 -0
- solarwindpy/plotting/labels/chemistry.py +19 -0
- solarwindpy/plotting/labels/composition.py +100 -0
- solarwindpy/plotting/labels/datetime.py +235 -0
- solarwindpy/plotting/labels/elemental_abundance.py +73 -0
- solarwindpy/plotting/labels/special.py +794 -0
- solarwindpy/plotting/orbits.py +515 -0
- solarwindpy/plotting/scatter.py +99 -0
- solarwindpy/plotting/select_data_from_figure.py +329 -0
- solarwindpy/plotting/spiral.py +980 -0
- solarwindpy/plotting/tools.py +434 -0
- solarwindpy/scripts/__init__.py +1 -0
- solarwindpy/scripts/logs/.gitignore +1 -0
- solarwindpy/solar_activity/__init__.py +53 -0
- solarwindpy/solar_activity/base.py +605 -0
- solarwindpy/solar_activity/lisird/__init__.py +3 -0
- solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
- solarwindpy/solar_activity/lisird/lisird.py +319 -0
- solarwindpy/solar_activity/plots.py +116 -0
- solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
- solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
- solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
- solarwindpy/tools/__init__.py +162 -0
- solarwindpy-0.1.0.dist-info/METADATA +181 -0
- solarwindpy-0.1.0.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.0.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.0.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.0.dist-info/top_level.txt +3 -0
- tests/__init__.py +1 -0
- tests/conftest.py +10 -0
- tests/core/__init__.py +1 -0
- tests/core/test_alfvenic_turbulence.py +544 -0
- tests/core/test_base.py +112 -0
- tests/core/test_base_head_tail.py +29 -0
- tests/core/test_base_mi_tuples.py +11 -0
- tests/core/test_core_verify_datetimeindex.py +32 -0
- tests/core/test_ions.py +325 -0
- tests/core/test_plasma.py +2581 -0
- tests/core/test_plasma_io.py +12 -0
- tests/core/test_quantities.py +507 -0
- tests/core/test_spacecraft.py +210 -0
- tests/core/test_units_constants.py +22 -0
- tests/data/epoch.csv +4 -0
- tests/data/plasma.csv +4 -0
- tests/data/spacecraft.csv +4 -0
- tests/fitfunctions/conftest.py +60 -0
- tests/fitfunctions/test_core.py +193 -0
- tests/fitfunctions/test_exponentials.py +342 -0
- tests/fitfunctions/test_gaussians.py +142 -0
- tests/fitfunctions/test_lines.py +349 -0
- tests/fitfunctions/test_moyal.py +258 -0
- tests/fitfunctions/test_plots.py +258 -0
- tests/fitfunctions/test_power_laws.py +365 -0
- tests/fitfunctions/test_tex_info.py +183 -0
- tests/fitfunctions/test_trend_fit_properties.py +31 -0
- tests/fitfunctions/test_trend_fits.py +244 -0
- tests/plotting/__init__.py +1 -0
- tests/plotting/labels/__init__.py +1 -0
- tests/plotting/labels/test_chemistry.py +243 -0
- tests/plotting/labels/test_composition.py +345 -0
- tests/plotting/labels/test_datetime.py +445 -0
- tests/plotting/labels/test_elemental_abundance.py +366 -0
- tests/plotting/labels/test_init.py +66 -0
- tests/plotting/labels/test_labels_base.py +347 -0
- tests/plotting/labels/test_special.py +550 -0
- tests/plotting/test_agg_plot.py +602 -0
- tests/plotting/test_base.py +752 -0
- tests/plotting/test_fixtures_utilities.py +775 -0
- tests/plotting/test_histograms.py +546 -0
- tests/plotting/test_integration.py +675 -0
- tests/plotting/test_orbits.py +435 -0
- tests/plotting/test_performance.py +708 -0
- tests/plotting/test_scatter.py +752 -0
- tests/plotting/test_select_data_from_figure.py +1209 -0
- tests/plotting/test_spiral.py +573 -0
- tests/plotting/test_tools.py +607 -0
- tests/plotting/test_visual_validation.py +465 -0
- tests/solar_activity/__init__.py +1 -0
- tests/solar_activity/lisird/__init__.py +1 -0
- tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
- tests/solar_activity/lisird/test_lisird_id.py +187 -0
- tests/solar_activity/sunspot_number/__init__.py +1 -0
- tests/solar_activity/sunspot_number/test_init.py +399 -0
- tests/solar_activity/sunspot_number/test_sidc.py +465 -0
- tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
- tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
- tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
- tests/solar_activity/test_base.py +656 -0
- tests/solar_activity/test_init.py +396 -0
- tests/solar_activity/test_plots.py +371 -0
- tests/test_circular_imports.py +408 -0
- tests/test_issue_titles.py +25 -0
- tests/test_statusline.py +298 -0
- solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
- solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
- solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
"""Test module for circular import detection and validation.
|
|
2
|
+
|
|
3
|
+
This module contains comprehensive tests to validate that the SolarWindPy package has no
|
|
4
|
+
circular import dependencies and that all modules can be imported successfully in
|
|
5
|
+
various orders and scenarios.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
import importlib
|
|
10
|
+
import pytest
|
|
11
|
+
import gc
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import List, Dict, Set
|
|
14
|
+
import time
|
|
15
|
+
|
|
16
|
+
# Add the parent directory to allow importing our analysis tools
|
|
17
|
+
PROJECT_ROOT = Path(__file__).parent.parent.parent
|
|
18
|
+
sys.path.insert(0, str(PROJECT_ROOT))
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from scripts.analyze_imports_fixed import DependencyAnalyzer
|
|
22
|
+
from scripts.test_dynamic_imports import DynamicImportTester
|
|
23
|
+
except ImportError as e:
|
|
24
|
+
pytest.skip(f"Could not import analysis tools: {e}", allow_module_level=True)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TestCircularImports:
|
|
28
|
+
"""Test class for circular import validation."""
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def setup_class(cls):
|
|
32
|
+
"""Set up test class with module discovery."""
|
|
33
|
+
cls.package_root = PROJECT_ROOT / "solarwindpy"
|
|
34
|
+
cls.package_name = "solarwindpy"
|
|
35
|
+
|
|
36
|
+
# Discover all modules
|
|
37
|
+
cls.all_modules = cls._discover_modules()
|
|
38
|
+
|
|
39
|
+
# Key modules that should be tested more thoroughly
|
|
40
|
+
cls.key_modules = [
|
|
41
|
+
"solarwindpy",
|
|
42
|
+
"solarwindpy.core",
|
|
43
|
+
"solarwindpy.core.base",
|
|
44
|
+
"solarwindpy.core.plasma",
|
|
45
|
+
"solarwindpy.plotting",
|
|
46
|
+
"solarwindpy.fitfunctions",
|
|
47
|
+
"solarwindpy.solar_activity",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def _discover_modules(cls) -> List[str]:
|
|
52
|
+
"""Discover all importable modules in the package."""
|
|
53
|
+
modules = []
|
|
54
|
+
|
|
55
|
+
for py_file in cls.package_root.rglob("*.py"):
|
|
56
|
+
if (
|
|
57
|
+
"/tests/" in str(py_file)
|
|
58
|
+
or py_file.name.startswith("test_")
|
|
59
|
+
or "/__pycache__/" in str(py_file)
|
|
60
|
+
):
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
rel_path = py_file.relative_to(cls.package_root)
|
|
64
|
+
parts = list(rel_path.with_suffix("").parts)
|
|
65
|
+
|
|
66
|
+
if parts[-1] == "__init__":
|
|
67
|
+
parts = parts[:-1]
|
|
68
|
+
|
|
69
|
+
if parts:
|
|
70
|
+
module_name = f"{cls.package_name}.{'.'.join(parts)}"
|
|
71
|
+
else:
|
|
72
|
+
module_name = cls.package_name
|
|
73
|
+
|
|
74
|
+
modules.append(module_name)
|
|
75
|
+
|
|
76
|
+
return sorted(modules)
|
|
77
|
+
|
|
78
|
+
def _clean_modules(self):
|
|
79
|
+
"""Clean imported modules for test isolation."""
|
|
80
|
+
modules_to_remove = [m for m in sys.modules if m.startswith(self.package_name)]
|
|
81
|
+
for module in modules_to_remove:
|
|
82
|
+
if module in sys.modules:
|
|
83
|
+
del sys.modules[module]
|
|
84
|
+
gc.collect()
|
|
85
|
+
|
|
86
|
+
def test_static_dependency_analysis(self):
|
|
87
|
+
"""Test that static analysis finds no circular dependencies."""
|
|
88
|
+
analyzer = DependencyAnalyzer(str(self.package_root))
|
|
89
|
+
analyzer.scan_package()
|
|
90
|
+
analyzer.build_dependency_graph()
|
|
91
|
+
|
|
92
|
+
cycles = analyzer.find_circular_dependencies_dfs()
|
|
93
|
+
|
|
94
|
+
assert len(cycles) == 0, (
|
|
95
|
+
f"Static analysis found {len(cycles)} circular dependency cycles: "
|
|
96
|
+
f"{[' -> '.join(cycle + [cycle[0]]) for cycle in cycles]}"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
def test_individual_module_imports(self):
|
|
100
|
+
"""Test that each module can be imported individually."""
|
|
101
|
+
failed_imports = []
|
|
102
|
+
|
|
103
|
+
for module_name in self.all_modules:
|
|
104
|
+
self._clean_modules()
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
importlib.import_module(module_name)
|
|
108
|
+
except ImportError as e:
|
|
109
|
+
if (
|
|
110
|
+
"circular" in str(e).lower()
|
|
111
|
+
or "cannot import name" in str(e).lower()
|
|
112
|
+
):
|
|
113
|
+
failed_imports.append(f"{module_name}: {str(e)}")
|
|
114
|
+
else:
|
|
115
|
+
# Other import errors might be acceptable (missing dependencies, etc.)
|
|
116
|
+
pass
|
|
117
|
+
except Exception as e:
|
|
118
|
+
# Unexpected errors should be investigated but not necessarily fail the test
|
|
119
|
+
pass
|
|
120
|
+
|
|
121
|
+
assert len(failed_imports) == 0, (
|
|
122
|
+
f"Found circular import errors in individual module imports: "
|
|
123
|
+
f"{failed_imports}"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def test_key_module_imports(self):
|
|
127
|
+
"""Test that key modules can be imported without circular import errors."""
|
|
128
|
+
circular_imports = []
|
|
129
|
+
|
|
130
|
+
for module_name in self.key_modules:
|
|
131
|
+
self._clean_modules()
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
importlib.import_module(module_name)
|
|
135
|
+
except ImportError as e:
|
|
136
|
+
if (
|
|
137
|
+
"circular" in str(e).lower()
|
|
138
|
+
or "cannot import name" in str(e).lower()
|
|
139
|
+
):
|
|
140
|
+
circular_imports.append(f"{module_name}: {str(e)}")
|
|
141
|
+
except Exception:
|
|
142
|
+
# Other exceptions are not circular import issues
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
assert (
|
|
146
|
+
len(circular_imports) == 0
|
|
147
|
+
), f"Circular imports detected in key modules: {circular_imports}"
|
|
148
|
+
|
|
149
|
+
def test_import_order_independence(self):
|
|
150
|
+
"""Test that import order doesn't cause circular import issues."""
|
|
151
|
+
import_orders = [
|
|
152
|
+
sorted(self.key_modules), # alphabetical
|
|
153
|
+
sorted(self.key_modules, reverse=True), # reverse alphabetical
|
|
154
|
+
# Base modules first
|
|
155
|
+
[m for m in self.key_modules if "base" in m or "__init__" in m]
|
|
156
|
+
+ [m for m in self.key_modules if "base" not in m and "__init__" not in m],
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
for i, order in enumerate(import_orders):
|
|
160
|
+
self._clean_modules()
|
|
161
|
+
|
|
162
|
+
circular_imports = []
|
|
163
|
+
for module_name in order:
|
|
164
|
+
try:
|
|
165
|
+
importlib.import_module(module_name)
|
|
166
|
+
except ImportError as e:
|
|
167
|
+
if (
|
|
168
|
+
"circular" in str(e).lower()
|
|
169
|
+
or "cannot import name" in str(e).lower()
|
|
170
|
+
):
|
|
171
|
+
circular_imports.append(f"{module_name}: {str(e)}")
|
|
172
|
+
except Exception:
|
|
173
|
+
# Other errors are not our concern for this test
|
|
174
|
+
pass
|
|
175
|
+
|
|
176
|
+
assert (
|
|
177
|
+
len(circular_imports) == 0
|
|
178
|
+
), f"Import order {i+1} caused circular import errors: {circular_imports}"
|
|
179
|
+
|
|
180
|
+
def test_cross_module_import_scenarios(self):
|
|
181
|
+
"""Test various cross-module import scenarios."""
|
|
182
|
+
# Test pairs of related modules
|
|
183
|
+
module_pairs = [
|
|
184
|
+
("solarwindpy.core", "solarwindpy.plotting"),
|
|
185
|
+
("solarwindpy.core.base", "solarwindpy.core.plasma"),
|
|
186
|
+
("solarwindpy.fitfunctions", "solarwindpy.plotting"),
|
|
187
|
+
("solarwindpy", "solarwindpy.core"),
|
|
188
|
+
]
|
|
189
|
+
|
|
190
|
+
for first_module, second_module in module_pairs:
|
|
191
|
+
if (
|
|
192
|
+
first_module not in self.all_modules
|
|
193
|
+
or second_module not in self.all_modules
|
|
194
|
+
):
|
|
195
|
+
continue
|
|
196
|
+
|
|
197
|
+
# Test importing first, then second
|
|
198
|
+
self._clean_modules()
|
|
199
|
+
circular_imports = []
|
|
200
|
+
|
|
201
|
+
try:
|
|
202
|
+
importlib.import_module(first_module)
|
|
203
|
+
importlib.import_module(second_module)
|
|
204
|
+
except ImportError as e:
|
|
205
|
+
if (
|
|
206
|
+
"circular" in str(e).lower()
|
|
207
|
+
or "cannot import name" in str(e).lower()
|
|
208
|
+
):
|
|
209
|
+
circular_imports.append(
|
|
210
|
+
f"{first_module} -> {second_module}: {str(e)}"
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Test importing second, then first
|
|
214
|
+
self._clean_modules()
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
importlib.import_module(second_module)
|
|
218
|
+
importlib.import_module(first_module)
|
|
219
|
+
except ImportError as e:
|
|
220
|
+
if (
|
|
221
|
+
"circular" in str(e).lower()
|
|
222
|
+
or "cannot import name" in str(e).lower()
|
|
223
|
+
):
|
|
224
|
+
circular_imports.append(
|
|
225
|
+
f"{second_module} -> {first_module}: {str(e)}"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
assert len(circular_imports) == 0, (
|
|
229
|
+
f"Cross-module import scenarios failed for {first_module} and {second_module}: "
|
|
230
|
+
f"{circular_imports}"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
def test_main_package_import(self):
|
|
234
|
+
"""Test that the main package can be imported without circular imports."""
|
|
235
|
+
self._clean_modules()
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
import solarwindpy # noqa: F401
|
|
239
|
+
except ImportError as e:
|
|
240
|
+
if "circular" in str(e).lower() or "cannot import name" in str(e).lower():
|
|
241
|
+
pytest.fail(f"Main package import has circular import: {e}")
|
|
242
|
+
|
|
243
|
+
def test_public_api_imports(self):
|
|
244
|
+
"""Test that public API imports work without circular imports."""
|
|
245
|
+
self._clean_modules()
|
|
246
|
+
|
|
247
|
+
# Test common public API usage patterns
|
|
248
|
+
api_imports = [
|
|
249
|
+
"from solarwindpy import Plasma",
|
|
250
|
+
"from solarwindpy.core import Base",
|
|
251
|
+
"from solarwindpy.plotting import histograms",
|
|
252
|
+
"import solarwindpy.core as swp_core",
|
|
253
|
+
"import solarwindpy.plotting as swp_plotting",
|
|
254
|
+
]
|
|
255
|
+
|
|
256
|
+
circular_import_errors = []
|
|
257
|
+
|
|
258
|
+
for import_statement in api_imports:
|
|
259
|
+
self._clean_modules()
|
|
260
|
+
|
|
261
|
+
try:
|
|
262
|
+
exec(import_statement)
|
|
263
|
+
except ImportError as e:
|
|
264
|
+
if (
|
|
265
|
+
"circular" in str(e).lower()
|
|
266
|
+
or "cannot import name" in str(e).lower()
|
|
267
|
+
):
|
|
268
|
+
circular_import_errors.append(f"{import_statement}: {str(e)}")
|
|
269
|
+
except Exception:
|
|
270
|
+
# Other errors are not circular import issues
|
|
271
|
+
pass
|
|
272
|
+
|
|
273
|
+
assert (
|
|
274
|
+
len(circular_import_errors) == 0
|
|
275
|
+
), f"Public API imports have circular import errors: {circular_import_errors}"
|
|
276
|
+
|
|
277
|
+
def test_dynamic_import_comprehensive(self):
|
|
278
|
+
"""Run comprehensive dynamic import test."""
|
|
279
|
+
# Skip if dynamic tester not available
|
|
280
|
+
try:
|
|
281
|
+
tester = DynamicImportTester(str(self.package_root))
|
|
282
|
+
except Exception:
|
|
283
|
+
pytest.skip("Dynamic import tester not available")
|
|
284
|
+
|
|
285
|
+
# Run a subset of dynamic tests for performance
|
|
286
|
+
modules_to_test = (
|
|
287
|
+
self.key_modules
|
|
288
|
+
+ [
|
|
289
|
+
m
|
|
290
|
+
for m in self.all_modules
|
|
291
|
+
if any(key in m for key in ["core", "plotting", "fitfunctions"])
|
|
292
|
+
][:15]
|
|
293
|
+
) # Limit for test performance
|
|
294
|
+
|
|
295
|
+
circular_imports = []
|
|
296
|
+
|
|
297
|
+
for module_name in modules_to_test:
|
|
298
|
+
result = tester.test_individual_import(module_name)
|
|
299
|
+
if result["circular_import"]:
|
|
300
|
+
circular_imports.append(f"{module_name}: {result['error']}")
|
|
301
|
+
|
|
302
|
+
assert (
|
|
303
|
+
len(circular_imports) == 0
|
|
304
|
+
), f"Dynamic import testing found circular imports: {circular_imports}"
|
|
305
|
+
|
|
306
|
+
def test_import_time_performance(self):
|
|
307
|
+
"""Test that imports complete in reasonable time (may indicate circular
|
|
308
|
+
issues)."""
|
|
309
|
+
import_times = {}
|
|
310
|
+
slow_imports = []
|
|
311
|
+
|
|
312
|
+
for module_name in self.key_modules:
|
|
313
|
+
self._clean_modules()
|
|
314
|
+
|
|
315
|
+
start_time = time.time()
|
|
316
|
+
try:
|
|
317
|
+
importlib.import_module(module_name)
|
|
318
|
+
import_time = time.time() - start_time
|
|
319
|
+
import_times[module_name] = import_time
|
|
320
|
+
|
|
321
|
+
# Flag imports taking longer than 5 seconds as potentially problematic
|
|
322
|
+
if import_time > 5.0:
|
|
323
|
+
slow_imports.append(f"{module_name}: {import_time:.2f}s")
|
|
324
|
+
|
|
325
|
+
except ImportError as e:
|
|
326
|
+
if "circular" in str(e).lower():
|
|
327
|
+
pytest.fail(
|
|
328
|
+
f"Circular import in performance test for {module_name}: {e}"
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
# This is more of a warning than a failure - slow imports might indicate issues
|
|
332
|
+
if slow_imports:
|
|
333
|
+
pytest.warns(UserWarning, match="Slow imports detected")
|
|
334
|
+
import warnings
|
|
335
|
+
|
|
336
|
+
warnings.warn(
|
|
337
|
+
f"Slow imports detected (possible circular import indicators): {slow_imports}"
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class TestImportStructure:
|
|
342
|
+
"""Test the overall import structure health."""
|
|
343
|
+
|
|
344
|
+
@classmethod
|
|
345
|
+
def setup_class(cls):
|
|
346
|
+
"""Set up test class."""
|
|
347
|
+
cls.package_root = PROJECT_ROOT / "solarwindpy"
|
|
348
|
+
|
|
349
|
+
def test_no_wildcard_imports_in_init(self):
|
|
350
|
+
"""Test that __init__.py files don't use wildcard imports (which can hide
|
|
351
|
+
circular imports)."""
|
|
352
|
+
init_files = list(self.package_root.rglob("__init__.py"))
|
|
353
|
+
wildcard_imports = []
|
|
354
|
+
|
|
355
|
+
for init_file in init_files:
|
|
356
|
+
with open(init_file, "r", encoding="utf-8") as f:
|
|
357
|
+
content = f.read()
|
|
358
|
+
|
|
359
|
+
# Look for wildcard imports
|
|
360
|
+
if "from * import" in content or "import *" in content:
|
|
361
|
+
wildcard_imports.append(str(init_file.relative_to(self.package_root)))
|
|
362
|
+
|
|
363
|
+
assert len(wildcard_imports) == 0, (
|
|
364
|
+
f"Found wildcard imports in __init__.py files (can mask circular imports): "
|
|
365
|
+
f"{wildcard_imports}"
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
def test_relative_import_consistency(self):
|
|
369
|
+
"""Test that relative imports are used consistently within packages."""
|
|
370
|
+
# This is more of a style check, but inconsistent relative imports
|
|
371
|
+
# can sometimes lead to circular import issues
|
|
372
|
+
|
|
373
|
+
python_files = [
|
|
374
|
+
f
|
|
375
|
+
for f in self.package_root.rglob("*.py")
|
|
376
|
+
if "/tests/" not in str(f) and not f.name.startswith("test_")
|
|
377
|
+
]
|
|
378
|
+
|
|
379
|
+
inconsistent_files = []
|
|
380
|
+
|
|
381
|
+
for py_file in python_files:
|
|
382
|
+
with open(py_file, "r", encoding="utf-8") as f:
|
|
383
|
+
content = f.read()
|
|
384
|
+
|
|
385
|
+
# Look for both relative and absolute imports of the same package
|
|
386
|
+
has_relative = "from ." in content or "from .." in content
|
|
387
|
+
has_absolute = (
|
|
388
|
+
"from solarwindpy" in content or "import solarwindpy" in content
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
if has_relative and has_absolute:
|
|
392
|
+
# This might be intentional, but flag for review
|
|
393
|
+
rel_path = str(py_file.relative_to(self.package_root))
|
|
394
|
+
inconsistent_files.append(rel_path)
|
|
395
|
+
|
|
396
|
+
# This is informational rather than a hard failure
|
|
397
|
+
if inconsistent_files:
|
|
398
|
+
import warnings
|
|
399
|
+
|
|
400
|
+
warnings.warn(
|
|
401
|
+
f"Files with mixed relative/absolute imports (review for potential issues): "
|
|
402
|
+
f"{inconsistent_files[:5]}{'...' if len(inconsistent_files) > 5 else ''}"
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
if __name__ == "__main__":
|
|
407
|
+
# Run tests directly
|
|
408
|
+
pytest.main([__file__, "-v"])
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|
5
|
+
from plans.issues_from_plans import infer_issue_title
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_infer_issue_title_preserves_numbers(tmp_path):
|
|
9
|
+
path = (
|
|
10
|
+
tmp_path
|
|
11
|
+
/ "combined_plan_with_checklist_documentation"
|
|
12
|
+
/ "1-Overview-and-Goals.md"
|
|
13
|
+
)
|
|
14
|
+
path.parent.mkdir()
|
|
15
|
+
path.touch()
|
|
16
|
+
title = infer_issue_title(path, "")
|
|
17
|
+
assert title == "Combined Plan With Checklist Documentation – 1 Overview and Goals"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_infer_issue_title_uses_frontmatter_name(tmp_path):
|
|
21
|
+
path = tmp_path / "combined_plan_with_checklist_documentation" / "2-Another.md"
|
|
22
|
+
path.parent.mkdir(exist_ok=True)
|
|
23
|
+
path.touch()
|
|
24
|
+
title = infer_issue_title(path, "Custom Name")
|
|
25
|
+
assert title == "Combined Plan With Checklist Documentation – 2 Custom Name"
|