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,465 @@
|
|
|
1
|
+
"""Visual validation tests for plotting functionality.
|
|
2
|
+
|
|
3
|
+
This module provides visual validation framework for matplotlib plots to ensure
|
|
4
|
+
consistent rendering and detect visual regressions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
import numpy as np
|
|
9
|
+
import matplotlib
|
|
10
|
+
import matplotlib.pyplot as plt
|
|
11
|
+
from matplotlib.testing.decorators import image_comparison
|
|
12
|
+
import warnings
|
|
13
|
+
|
|
14
|
+
# Configure matplotlib for testing
|
|
15
|
+
matplotlib.use("Agg") # Non-interactive backend
|
|
16
|
+
plt.ioff() # Turn off interactive mode
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TestVisualValidationFramework:
|
|
20
|
+
"""Test the visual validation framework infrastructure."""
|
|
21
|
+
|
|
22
|
+
def test_matplotlib_backend(self):
|
|
23
|
+
"""Test matplotlib backend is properly configured."""
|
|
24
|
+
backend = matplotlib.get_backend()
|
|
25
|
+
assert backend == "Agg", f"Expected Agg backend, got {backend}"
|
|
26
|
+
|
|
27
|
+
def test_matplotlib_interactive_mode(self):
|
|
28
|
+
"""Test matplotlib interactive mode is disabled."""
|
|
29
|
+
assert (
|
|
30
|
+
not plt.isinteractive()
|
|
31
|
+
), "Interactive mode should be disabled for testing"
|
|
32
|
+
|
|
33
|
+
def test_figure_creation(self):
|
|
34
|
+
"""Test basic figure creation works in test environment."""
|
|
35
|
+
fig, ax = plt.subplots()
|
|
36
|
+
assert fig is not None
|
|
37
|
+
assert ax is not None
|
|
38
|
+
plt.close(fig)
|
|
39
|
+
|
|
40
|
+
def test_plot_generation(self):
|
|
41
|
+
"""Test basic plot generation works."""
|
|
42
|
+
fig, ax = plt.subplots()
|
|
43
|
+
x = np.linspace(0, 10, 100)
|
|
44
|
+
y = np.sin(x)
|
|
45
|
+
ax.plot(x, y)
|
|
46
|
+
ax.set_xlabel("X Label")
|
|
47
|
+
ax.set_ylabel("Y Label")
|
|
48
|
+
ax.set_title("Test Plot")
|
|
49
|
+
|
|
50
|
+
# Verify plot has expected elements
|
|
51
|
+
assert len(ax.lines) == 1
|
|
52
|
+
assert ax.get_xlabel() == "X Label"
|
|
53
|
+
assert ax.get_ylabel() == "Y Label"
|
|
54
|
+
assert ax.get_title() == "Test Plot"
|
|
55
|
+
|
|
56
|
+
plt.close(fig)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class TestBasicPlotVisualValidation:
|
|
60
|
+
"""Basic visual validation tests for common plot types."""
|
|
61
|
+
|
|
62
|
+
def setup_method(self):
|
|
63
|
+
"""Set up test data for plotting."""
|
|
64
|
+
self.x = np.linspace(0, 10, 100)
|
|
65
|
+
self.y_sin = np.sin(self.x)
|
|
66
|
+
self.y_cos = np.cos(self.x)
|
|
67
|
+
|
|
68
|
+
def teardown_method(self):
|
|
69
|
+
"""Clean up after each test."""
|
|
70
|
+
plt.close("all")
|
|
71
|
+
|
|
72
|
+
def test_line_plot_visual(self):
|
|
73
|
+
"""Test basic line plot visual output."""
|
|
74
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
75
|
+
ax.plot(self.x, self.y_sin, label="sin(x)", linewidth=2)
|
|
76
|
+
ax.plot(self.x, self.y_cos, label="cos(x)", linewidth=2, linestyle="--")
|
|
77
|
+
ax.set_xlabel("X values")
|
|
78
|
+
ax.set_ylabel("Y values")
|
|
79
|
+
ax.set_title("Line Plot Test")
|
|
80
|
+
ax.legend()
|
|
81
|
+
ax.grid(True, alpha=0.3)
|
|
82
|
+
|
|
83
|
+
# Basic validation - plot should have expected elements
|
|
84
|
+
assert len(ax.lines) == 2
|
|
85
|
+
assert ax.legend_ is not None
|
|
86
|
+
assert ax.get_xlabel() == "X values"
|
|
87
|
+
|
|
88
|
+
plt.tight_layout()
|
|
89
|
+
# Note: For actual visual validation, would use @image_comparison decorator
|
|
90
|
+
# This serves as a framework test
|
|
91
|
+
|
|
92
|
+
def test_scatter_plot_visual(self):
|
|
93
|
+
"""Test scatter plot visual output."""
|
|
94
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
95
|
+
|
|
96
|
+
# Generate scatter data
|
|
97
|
+
np.random.seed(42)
|
|
98
|
+
x_scatter = np.random.randn(100)
|
|
99
|
+
y_scatter = np.random.randn(100)
|
|
100
|
+
colors = np.random.rand(100)
|
|
101
|
+
|
|
102
|
+
scatter = ax.scatter(x_scatter, y_scatter, c=colors, alpha=0.7, cmap="viridis")
|
|
103
|
+
ax.set_xlabel("X values")
|
|
104
|
+
ax.set_ylabel("Y values")
|
|
105
|
+
ax.set_title("Scatter Plot Test")
|
|
106
|
+
|
|
107
|
+
# Add colorbar
|
|
108
|
+
plt.colorbar(scatter, ax=ax, label="Color Value")
|
|
109
|
+
|
|
110
|
+
# Validation
|
|
111
|
+
assert len(ax.collections) == 1 # Scatter collection
|
|
112
|
+
assert ax.get_xlabel() == "X values"
|
|
113
|
+
|
|
114
|
+
plt.tight_layout()
|
|
115
|
+
|
|
116
|
+
def test_histogram_visual(self):
|
|
117
|
+
"""Test histogram visual output."""
|
|
118
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
119
|
+
|
|
120
|
+
# Generate histogram data
|
|
121
|
+
np.random.seed(42)
|
|
122
|
+
data = np.random.normal(0, 1, 1000)
|
|
123
|
+
|
|
124
|
+
n, bins, patches = ax.hist(
|
|
125
|
+
data, bins=30, alpha=0.7, color="skyblue", edgecolor="black", linewidth=0.5
|
|
126
|
+
)
|
|
127
|
+
ax.set_xlabel("Value")
|
|
128
|
+
ax.set_ylabel("Frequency")
|
|
129
|
+
ax.set_title("Histogram Test")
|
|
130
|
+
ax.grid(True, alpha=0.3, axis="y")
|
|
131
|
+
|
|
132
|
+
# Validation
|
|
133
|
+
assert len(patches) == 30 # Number of bins
|
|
134
|
+
assert len(n) == 30
|
|
135
|
+
assert len(bins) == 31 # n+1 bin edges
|
|
136
|
+
|
|
137
|
+
plt.tight_layout()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class TestSolarWindPyPlottingVisualValidation:
|
|
141
|
+
"""Visual validation tests for SolarWindPy plotting components."""
|
|
142
|
+
|
|
143
|
+
def setup_method(self):
|
|
144
|
+
"""Set up test data for SolarWindPy plotting."""
|
|
145
|
+
# Create synthetic plasma data
|
|
146
|
+
self.time = np.arange(100)
|
|
147
|
+
self.density = 10 + 2 * np.sin(self.time / 10) + np.random.normal(0, 0.5, 100)
|
|
148
|
+
self.velocity = 400 + 50 * np.sin(self.time / 15) + np.random.normal(0, 10, 100)
|
|
149
|
+
self.temperature = (
|
|
150
|
+
1e5 + 2e4 * np.sin(self.time / 8) + np.random.normal(0, 5e3, 100)
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def teardown_method(self):
|
|
154
|
+
"""Clean up after each test."""
|
|
155
|
+
plt.close("all")
|
|
156
|
+
|
|
157
|
+
def test_time_series_plot_visual(self):
|
|
158
|
+
"""Test time series plotting visual output."""
|
|
159
|
+
fig, axes = plt.subplots(3, 1, figsize=(10, 8), sharex=True)
|
|
160
|
+
|
|
161
|
+
# Density plot
|
|
162
|
+
axes[0].plot(self.time, self.density, "b-", linewidth=1.5)
|
|
163
|
+
axes[0].set_ylabel("Density (cm⁻³)")
|
|
164
|
+
axes[0].set_title("Solar Wind Time Series")
|
|
165
|
+
axes[0].grid(True, alpha=0.3)
|
|
166
|
+
|
|
167
|
+
# Velocity plot
|
|
168
|
+
axes[1].plot(self.time, self.velocity, "r-", linewidth=1.5)
|
|
169
|
+
axes[1].set_ylabel("Velocity (km/s)")
|
|
170
|
+
axes[1].grid(True, alpha=0.3)
|
|
171
|
+
|
|
172
|
+
# Temperature plot
|
|
173
|
+
axes[2].plot(self.time, self.temperature, "g-", linewidth=1.5)
|
|
174
|
+
axes[2].set_ylabel("Temperature (K)")
|
|
175
|
+
axes[2].set_xlabel("Time")
|
|
176
|
+
axes[2].grid(True, alpha=0.3)
|
|
177
|
+
|
|
178
|
+
plt.tight_layout()
|
|
179
|
+
|
|
180
|
+
# Validation
|
|
181
|
+
for ax in axes:
|
|
182
|
+
assert len(ax.lines) == 1
|
|
183
|
+
assert ax.get_ylabel() != ""
|
|
184
|
+
|
|
185
|
+
def test_correlation_plot_visual(self):
|
|
186
|
+
"""Test correlation/scatter plot visual output."""
|
|
187
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
188
|
+
|
|
189
|
+
# Create correlation plot
|
|
190
|
+
scatter = ax.scatter(
|
|
191
|
+
self.velocity, self.temperature, c=self.density, alpha=0.7, cmap="plasma"
|
|
192
|
+
)
|
|
193
|
+
ax.set_xlabel("Velocity (km/s)")
|
|
194
|
+
ax.set_ylabel("Temperature (K)")
|
|
195
|
+
ax.set_title("Velocity-Temperature Correlation")
|
|
196
|
+
|
|
197
|
+
# Add colorbar with scientific notation
|
|
198
|
+
cbar = plt.colorbar(scatter, ax=ax)
|
|
199
|
+
cbar.set_label("Density (cm⁻³)")
|
|
200
|
+
|
|
201
|
+
# Add trend line
|
|
202
|
+
z = np.polyfit(self.velocity, self.temperature, 1)
|
|
203
|
+
p = np.poly1d(z)
|
|
204
|
+
ax.plot(self.velocity, p(self.velocity), "r--", alpha=0.8, linewidth=2)
|
|
205
|
+
|
|
206
|
+
plt.tight_layout()
|
|
207
|
+
|
|
208
|
+
# Validation
|
|
209
|
+
assert len(ax.collections) == 1 # Scatter collection
|
|
210
|
+
assert len(ax.lines) == 1 # Trend line
|
|
211
|
+
|
|
212
|
+
def test_distribution_plot_visual(self):
|
|
213
|
+
"""Test distribution plotting visual output."""
|
|
214
|
+
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
|
|
215
|
+
|
|
216
|
+
# Density histogram
|
|
217
|
+
axes[0, 0].hist(
|
|
218
|
+
self.density,
|
|
219
|
+
bins=20,
|
|
220
|
+
alpha=0.7,
|
|
221
|
+
color="blue",
|
|
222
|
+
edgecolor="black",
|
|
223
|
+
density=True,
|
|
224
|
+
)
|
|
225
|
+
axes[0, 0].set_xlabel("Density (cm⁻³)")
|
|
226
|
+
axes[0, 0].set_ylabel("Probability Density")
|
|
227
|
+
axes[0, 0].set_title("Density Distribution")
|
|
228
|
+
axes[0, 0].grid(True, alpha=0.3)
|
|
229
|
+
|
|
230
|
+
# Velocity histogram
|
|
231
|
+
axes[0, 1].hist(
|
|
232
|
+
self.velocity,
|
|
233
|
+
bins=20,
|
|
234
|
+
alpha=0.7,
|
|
235
|
+
color="red",
|
|
236
|
+
edgecolor="black",
|
|
237
|
+
density=True,
|
|
238
|
+
)
|
|
239
|
+
axes[0, 1].set_xlabel("Velocity (km/s)")
|
|
240
|
+
axes[0, 1].set_ylabel("Probability Density")
|
|
241
|
+
axes[0, 1].set_title("Velocity Distribution")
|
|
242
|
+
axes[0, 1].grid(True, alpha=0.3)
|
|
243
|
+
|
|
244
|
+
# Temperature histogram
|
|
245
|
+
axes[1, 0].hist(
|
|
246
|
+
self.temperature,
|
|
247
|
+
bins=20,
|
|
248
|
+
alpha=0.7,
|
|
249
|
+
color="green",
|
|
250
|
+
edgecolor="black",
|
|
251
|
+
density=True,
|
|
252
|
+
)
|
|
253
|
+
axes[1, 0].set_xlabel("Temperature (K)")
|
|
254
|
+
axes[1, 0].set_ylabel("Probability Density")
|
|
255
|
+
axes[1, 0].set_title("Temperature Distribution")
|
|
256
|
+
axes[1, 0].grid(True, alpha=0.3)
|
|
257
|
+
|
|
258
|
+
# Combined box plot
|
|
259
|
+
data_for_box = [
|
|
260
|
+
self.density / np.mean(self.density),
|
|
261
|
+
self.velocity / np.mean(self.velocity),
|
|
262
|
+
self.temperature / np.mean(self.temperature),
|
|
263
|
+
]
|
|
264
|
+
box_plot = axes[1, 1].boxplot(
|
|
265
|
+
data_for_box, labels=["Density", "Velocity", "Temperature"]
|
|
266
|
+
)
|
|
267
|
+
axes[1, 1].set_ylabel("Normalized Value")
|
|
268
|
+
axes[1, 1].set_title("Parameter Distributions")
|
|
269
|
+
axes[1, 1].grid(True, alpha=0.3)
|
|
270
|
+
|
|
271
|
+
plt.tight_layout()
|
|
272
|
+
|
|
273
|
+
# Validation
|
|
274
|
+
for ax in axes.flat[:-1]: # All except box plot
|
|
275
|
+
assert len(ax.patches) > 0 # Histogram bars
|
|
276
|
+
assert len(axes[1, 1].lines) > 0 # Box plot lines
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class TestPlotLayoutValidation:
|
|
280
|
+
"""Test plot layout and formatting validation."""
|
|
281
|
+
|
|
282
|
+
def teardown_method(self):
|
|
283
|
+
"""Clean up after each test."""
|
|
284
|
+
plt.close("all")
|
|
285
|
+
|
|
286
|
+
def test_subplot_layout_visual(self):
|
|
287
|
+
"""Test subplot layout and spacing."""
|
|
288
|
+
fig = plt.figure(figsize=(12, 8))
|
|
289
|
+
|
|
290
|
+
# Create different subplot layouts
|
|
291
|
+
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
|
|
292
|
+
ax2 = plt.subplot2grid((3, 3), (0, 2))
|
|
293
|
+
ax3 = plt.subplot2grid((3, 3), (1, 0))
|
|
294
|
+
ax4 = plt.subplot2grid((3, 3), (1, 1), colspan=2)
|
|
295
|
+
ax5 = plt.subplot2grid((3, 3), (2, 0), colspan=3)
|
|
296
|
+
|
|
297
|
+
# Add content to each subplot
|
|
298
|
+
x = np.linspace(0, 10, 100)
|
|
299
|
+
|
|
300
|
+
ax1.plot(x, np.sin(x), "b-")
|
|
301
|
+
ax1.set_title("Sin Wave")
|
|
302
|
+
ax1.grid(True, alpha=0.3)
|
|
303
|
+
|
|
304
|
+
ax2.plot(x, np.cos(x), "r-")
|
|
305
|
+
ax2.set_title("Cos Wave")
|
|
306
|
+
ax2.grid(True, alpha=0.3)
|
|
307
|
+
|
|
308
|
+
ax3.hist(np.random.randn(1000), bins=30, alpha=0.7)
|
|
309
|
+
ax3.set_title("Histogram")
|
|
310
|
+
|
|
311
|
+
ax4.scatter(np.random.randn(100), np.random.randn(100), alpha=0.7)
|
|
312
|
+
ax4.set_title("Scatter Plot")
|
|
313
|
+
ax4.grid(True, alpha=0.3)
|
|
314
|
+
|
|
315
|
+
ax5.plot(x, np.tan(x), "g-")
|
|
316
|
+
ax5.set_ylim(-5, 5)
|
|
317
|
+
ax5.set_title("Tan Wave")
|
|
318
|
+
ax5.set_xlabel("X values")
|
|
319
|
+
ax5.grid(True, alpha=0.3)
|
|
320
|
+
|
|
321
|
+
plt.tight_layout()
|
|
322
|
+
|
|
323
|
+
# Validation
|
|
324
|
+
assert len(fig.axes) == 5
|
|
325
|
+
for ax in fig.axes:
|
|
326
|
+
assert ax.get_title() != ""
|
|
327
|
+
|
|
328
|
+
def test_colorbar_layout_visual(self):
|
|
329
|
+
"""Test colorbar layout and positioning."""
|
|
330
|
+
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
|
|
331
|
+
|
|
332
|
+
x = np.linspace(0, 10, 50)
|
|
333
|
+
y = np.linspace(0, 10, 50)
|
|
334
|
+
X, Y = np.meshgrid(x, y)
|
|
335
|
+
Z = np.sin(X) * np.cos(Y)
|
|
336
|
+
|
|
337
|
+
# Different colorbar layouts
|
|
338
|
+
im1 = axes[0, 0].contourf(X, Y, Z, levels=20, cmap="viridis")
|
|
339
|
+
plt.colorbar(im1, ax=axes[0, 0], shrink=0.8)
|
|
340
|
+
axes[0, 0].set_title("Contour with Colorbar")
|
|
341
|
+
|
|
342
|
+
im2 = axes[0, 1].imshow(Z, extent=[0, 10, 0, 10], cmap="plasma")
|
|
343
|
+
plt.colorbar(im2, ax=axes[0, 1], orientation="horizontal", pad=0.1)
|
|
344
|
+
axes[0, 1].set_title("Image with Horizontal Colorbar")
|
|
345
|
+
|
|
346
|
+
im3 = axes[1, 0].pcolormesh(X, Y, Z, cmap="coolwarm")
|
|
347
|
+
plt.colorbar(im3, ax=axes[1, 0], fraction=0.046, pad=0.04)
|
|
348
|
+
axes[1, 0].set_title("Pcolormesh with Colorbar")
|
|
349
|
+
|
|
350
|
+
# Shared colorbar
|
|
351
|
+
im4 = axes[1, 1].contour(X, Y, Z, levels=10, cmap="jet")
|
|
352
|
+
axes[1, 1].set_title("Contour Lines")
|
|
353
|
+
|
|
354
|
+
plt.tight_layout()
|
|
355
|
+
|
|
356
|
+
# Validation - check that colorbars were created
|
|
357
|
+
# Note: This is a basic structural test
|
|
358
|
+
assert len(fig.axes) >= 4 # At least the 4 main axes
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
class TestErrorHandlingVisualValidation:
|
|
362
|
+
"""Test error handling in visual validation framework."""
|
|
363
|
+
|
|
364
|
+
def teardown_method(self):
|
|
365
|
+
"""Clean up after each test."""
|
|
366
|
+
plt.close("all")
|
|
367
|
+
|
|
368
|
+
def test_invalid_data_handling(self):
|
|
369
|
+
"""Test handling of invalid data in plots."""
|
|
370
|
+
fig, ax = plt.subplots()
|
|
371
|
+
|
|
372
|
+
# Data with NaN values
|
|
373
|
+
x = np.linspace(0, 10, 100)
|
|
374
|
+
y = np.sin(x)
|
|
375
|
+
y[50:60] = np.nan # Insert NaN values
|
|
376
|
+
|
|
377
|
+
with warnings.catch_warnings():
|
|
378
|
+
warnings.simplefilter("ignore") # Suppress NaN warnings
|
|
379
|
+
ax.plot(x, y, "b-")
|
|
380
|
+
|
|
381
|
+
ax.set_xlabel("X")
|
|
382
|
+
ax.set_ylabel("Y")
|
|
383
|
+
ax.set_title("Plot with NaN Values")
|
|
384
|
+
|
|
385
|
+
# Should still create a valid plot
|
|
386
|
+
assert len(ax.lines) == 1
|
|
387
|
+
|
|
388
|
+
plt.close(fig)
|
|
389
|
+
|
|
390
|
+
def test_empty_data_handling(self):
|
|
391
|
+
"""Test handling of empty data."""
|
|
392
|
+
fig, ax = plt.subplots()
|
|
393
|
+
|
|
394
|
+
# Empty arrays
|
|
395
|
+
x = np.array([])
|
|
396
|
+
y = np.array([])
|
|
397
|
+
|
|
398
|
+
ax.plot(x, y, "b-")
|
|
399
|
+
ax.set_xlabel("X")
|
|
400
|
+
ax.set_ylabel("Y")
|
|
401
|
+
ax.set_title("Empty Plot")
|
|
402
|
+
|
|
403
|
+
# Should create plot without error
|
|
404
|
+
assert len(ax.lines) == 1
|
|
405
|
+
|
|
406
|
+
plt.close(fig)
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def test_visual_validation_framework_availability():
|
|
410
|
+
"""Test that visual validation framework components are available."""
|
|
411
|
+
# Test matplotlib testing decorators
|
|
412
|
+
from matplotlib.testing.decorators import image_comparison
|
|
413
|
+
|
|
414
|
+
assert image_comparison is not None
|
|
415
|
+
|
|
416
|
+
# Test that we can create baseline directory path
|
|
417
|
+
import os
|
|
418
|
+
|
|
419
|
+
baseline_dir = os.path.join(os.path.dirname(__file__), "baseline_images")
|
|
420
|
+
# Directory doesn't need to exist yet, but path should be valid
|
|
421
|
+
assert isinstance(baseline_dir, str)
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def test_reproducible_random_plots():
|
|
425
|
+
"""Test that plots with random data are reproducible with seed."""
|
|
426
|
+
# First plot
|
|
427
|
+
np.random.seed(42)
|
|
428
|
+
fig1, ax1 = plt.subplots()
|
|
429
|
+
x1 = np.random.randn(100)
|
|
430
|
+
y1 = np.random.randn(100)
|
|
431
|
+
ax1.scatter(x1, y1)
|
|
432
|
+
|
|
433
|
+
# Second plot with same seed
|
|
434
|
+
np.random.seed(42)
|
|
435
|
+
fig2, ax2 = plt.subplots()
|
|
436
|
+
x2 = np.random.randn(100)
|
|
437
|
+
y2 = np.random.randn(100)
|
|
438
|
+
ax2.scatter(x2, y2)
|
|
439
|
+
|
|
440
|
+
# Data should be identical
|
|
441
|
+
np.testing.assert_array_equal(x1, x2)
|
|
442
|
+
np.testing.assert_array_equal(y1, y2)
|
|
443
|
+
|
|
444
|
+
plt.close(fig1)
|
|
445
|
+
plt.close(fig2)
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
# Example of how to implement actual image comparison test
|
|
449
|
+
# (Commented out as it requires baseline images)
|
|
450
|
+
"""
|
|
451
|
+
@image_comparison(baseline_images=['example_plot'],
|
|
452
|
+
extensions=['png'],
|
|
453
|
+
tol=0.1)
|
|
454
|
+
def test_example_image_comparison():
|
|
455
|
+
'''Example of actual image comparison test.'''
|
|
456
|
+
fig, ax = plt.subplots()
|
|
457
|
+
x = np.linspace(0, 10, 100)
|
|
458
|
+
y = np.sin(x)
|
|
459
|
+
ax.plot(x, y, 'b-', linewidth=2)
|
|
460
|
+
ax.set_xlabel('X')
|
|
461
|
+
ax.set_ylabel('Y')
|
|
462
|
+
ax.set_title('Example Plot')
|
|
463
|
+
ax.grid(True)
|
|
464
|
+
return fig
|
|
465
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Tests for the solar_activity module."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Tests for LISIRD sub-package
|