solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.1__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.1.dist-info/METADATA +181 -0
- solarwindpy-0.1.1.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.1.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,435 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Tests for solarwindpy.plotting.orbits module.
|
|
3
|
+
|
|
4
|
+
This module provides comprehensive test coverage for orbit plotting functionality
|
|
5
|
+
specialized for solar wind spacecraft trajectory visualization.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
import logging
|
|
10
|
+
import pandas as pd
|
|
11
|
+
import numpy as np
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from unittest.mock import patch, MagicMock, call
|
|
14
|
+
from abc import ABC
|
|
15
|
+
|
|
16
|
+
import matplotlib
|
|
17
|
+
|
|
18
|
+
matplotlib.use("Agg") # Use non-interactive backend
|
|
19
|
+
from matplotlib import pyplot as plt
|
|
20
|
+
from matplotlib.collections import QuadMesh
|
|
21
|
+
|
|
22
|
+
import solarwindpy.plotting.orbits as orbits_module
|
|
23
|
+
from solarwindpy.plotting.orbits import OrbitPlot, OrbitHist1D, OrbitHist2D
|
|
24
|
+
from solarwindpy.plotting import tools
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TestOrbitsModuleStructure:
|
|
28
|
+
"""Test orbits module structure and imports."""
|
|
29
|
+
|
|
30
|
+
def test_module_imports(self):
|
|
31
|
+
"""Test that all required imports are accessible."""
|
|
32
|
+
assert hasattr(orbits_module, "np")
|
|
33
|
+
assert hasattr(orbits_module, "pd")
|
|
34
|
+
assert hasattr(orbits_module, "mpl")
|
|
35
|
+
assert hasattr(orbits_module, "histograms")
|
|
36
|
+
assert hasattr(orbits_module, "tools")
|
|
37
|
+
|
|
38
|
+
def test_classes_available(self):
|
|
39
|
+
"""Test that orbit classes are accessible."""
|
|
40
|
+
assert hasattr(orbits_module, "OrbitPlot")
|
|
41
|
+
assert hasattr(orbits_module, "OrbitHist1D")
|
|
42
|
+
assert hasattr(orbits_module, "OrbitHist2D")
|
|
43
|
+
|
|
44
|
+
assert callable(orbits_module.OrbitHist1D)
|
|
45
|
+
assert callable(orbits_module.OrbitHist2D)
|
|
46
|
+
|
|
47
|
+
def test_orbit_plot_inheritance(self):
|
|
48
|
+
"""Test OrbitPlot inheritance structure."""
|
|
49
|
+
assert issubclass(OrbitPlot, ABC)
|
|
50
|
+
assert issubclass(OrbitHist1D, OrbitPlot)
|
|
51
|
+
assert issubclass(OrbitHist2D, OrbitPlot)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class ConcreteOrbitPlot(OrbitPlot):
|
|
55
|
+
"""Concrete implementation of OrbitPlot for testing abstract functionality."""
|
|
56
|
+
|
|
57
|
+
def __init__(self, orbit, *args, **kwargs):
|
|
58
|
+
# Mock the required attributes that the parent classes would provide
|
|
59
|
+
self._gb_axes = ["test_axis"]
|
|
60
|
+
self.joint = pd.DataFrame({"test_axis": [1, 2, 3], "Orbit": ["A", "B", "C"]})
|
|
61
|
+
self.data = pd.DataFrame(
|
|
62
|
+
{"x": [1, 2, 3, 4, 5], "y": [2, 4, 6, 8, 10]},
|
|
63
|
+
index=pd.date_range("2020-01-01", periods=5, freq="h"),
|
|
64
|
+
)
|
|
65
|
+
self.cut = pd.DataFrame({"test_cut": [1, 2, 3, 4, 5]}, index=self.data.index)
|
|
66
|
+
self.path = Path("/test/path")
|
|
67
|
+
|
|
68
|
+
super().__init__(orbit, *args, **kwargs)
|
|
69
|
+
|
|
70
|
+
def set_path(self, *args, orbit=None, **kwargs):
|
|
71
|
+
"""Mock implementation of set_path."""
|
|
72
|
+
if orbit is not None:
|
|
73
|
+
self._path = self.path / orbit.path
|
|
74
|
+
return self.path
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class TestOrbitPlot:
|
|
78
|
+
"""Test OrbitPlot abstract base class."""
|
|
79
|
+
|
|
80
|
+
def setup_method(self):
|
|
81
|
+
"""Set up test data for each test method."""
|
|
82
|
+
# Create test orbit intervals
|
|
83
|
+
self.orbit_intervals = pd.IntervalIndex.from_tuples(
|
|
84
|
+
[
|
|
85
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00")),
|
|
86
|
+
(pd.Timestamp("2020-01-01 03:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
87
|
+
]
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def test_orbit_plot_initialization(self):
|
|
91
|
+
"""Test OrbitPlot initialization."""
|
|
92
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
93
|
+
|
|
94
|
+
assert orbit_plot is not None
|
|
95
|
+
assert hasattr(orbit_plot, "orbit")
|
|
96
|
+
assert hasattr(orbit_plot, "_orbit")
|
|
97
|
+
|
|
98
|
+
def test_orbit_plot_invalid_orbit_type(self):
|
|
99
|
+
"""Test that invalid orbit type raises TypeError."""
|
|
100
|
+
with pytest.raises(TypeError):
|
|
101
|
+
ConcreteOrbitPlot("invalid_orbit")
|
|
102
|
+
|
|
103
|
+
with pytest.raises(TypeError):
|
|
104
|
+
ConcreteOrbitPlot([1, 2, 3])
|
|
105
|
+
|
|
106
|
+
def test_disable_both_property(self):
|
|
107
|
+
"""Test _disable_both property is True by default."""
|
|
108
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
109
|
+
assert orbit_plot._disable_both is True
|
|
110
|
+
|
|
111
|
+
def test_orbit_property(self):
|
|
112
|
+
"""Test orbit property returns the IntervalIndex."""
|
|
113
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
114
|
+
|
|
115
|
+
orbit = orbit_plot.orbit
|
|
116
|
+
assert isinstance(orbit, pd.IntervalIndex)
|
|
117
|
+
assert len(orbit) == 2
|
|
118
|
+
|
|
119
|
+
def test_orbit_key_property(self):
|
|
120
|
+
"""Test _orbit_key returns 'Orbit'."""
|
|
121
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
122
|
+
assert orbit_plot._orbit_key == "Orbit"
|
|
123
|
+
|
|
124
|
+
def test_grouped_property(self):
|
|
125
|
+
"""Test grouped property groups by _gb_axes + _orbit_key."""
|
|
126
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
127
|
+
|
|
128
|
+
grouped = orbit_plot.grouped
|
|
129
|
+
assert hasattr(grouped, "groups")
|
|
130
|
+
# Should group by both test_axis and Orbit
|
|
131
|
+
|
|
132
|
+
def test_set_orbit_sorting(self):
|
|
133
|
+
"""Test set_orbit sorts the intervals."""
|
|
134
|
+
# Create unsorted intervals
|
|
135
|
+
unsorted_intervals = pd.IntervalIndex.from_tuples(
|
|
136
|
+
[
|
|
137
|
+
(pd.Timestamp("2020-01-01 03:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
138
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00")),
|
|
139
|
+
]
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
orbit_plot = ConcreteOrbitPlot(unsorted_intervals)
|
|
143
|
+
|
|
144
|
+
# Should be sorted by start time
|
|
145
|
+
assert orbit_plot.orbit[0].left < orbit_plot.orbit[1].left
|
|
146
|
+
|
|
147
|
+
def test_set_orbit_validates_type(self):
|
|
148
|
+
"""Test set_orbit validates IntervalIndex type."""
|
|
149
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
150
|
+
|
|
151
|
+
with pytest.raises(TypeError):
|
|
152
|
+
orbit_plot.set_orbit("invalid")
|
|
153
|
+
|
|
154
|
+
def test_set_path_with_orbit(self):
|
|
155
|
+
"""Test set_path with orbit parameter."""
|
|
156
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
157
|
+
|
|
158
|
+
# Mock orbit object with path
|
|
159
|
+
mock_orbit = MagicMock()
|
|
160
|
+
mock_orbit.path = Path("orbit/path")
|
|
161
|
+
|
|
162
|
+
result = orbit_plot.set_path(orbit=mock_orbit)
|
|
163
|
+
|
|
164
|
+
# Path should be updated to include orbit path
|
|
165
|
+
assert "orbit" in str(orbit_plot._path)
|
|
166
|
+
|
|
167
|
+
def test_make_cut_method_exists(self):
|
|
168
|
+
"""Test make_cut method exists and processes orbit intervals."""
|
|
169
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
170
|
+
|
|
171
|
+
# Test that the method exists
|
|
172
|
+
assert hasattr(orbit_plot, "make_cut")
|
|
173
|
+
assert callable(orbit_plot.make_cut)
|
|
174
|
+
|
|
175
|
+
# Test that orbit intervals exist
|
|
176
|
+
assert len(orbit_plot.orbit) == 2
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class TestOrbitHist1D:
|
|
180
|
+
"""Test OrbitHist1D class functionality."""
|
|
181
|
+
|
|
182
|
+
def setup_method(self):
|
|
183
|
+
"""Set up test data for OrbitHist1D tests."""
|
|
184
|
+
# Create test orbit intervals
|
|
185
|
+
self.orbit_intervals = pd.IntervalIndex.from_tuples(
|
|
186
|
+
[
|
|
187
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00")),
|
|
188
|
+
(pd.Timestamp("2020-01-01 03:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
189
|
+
]
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Create test data
|
|
193
|
+
times = pd.date_range("2020-01-01", periods=20, freq="15min")
|
|
194
|
+
self.x_data = pd.Series(np.random.uniform(1, 10, 20), index=times)
|
|
195
|
+
|
|
196
|
+
def test_orbit_hist_1d_initialization(self):
|
|
197
|
+
"""Test OrbitHist1D initialization basics."""
|
|
198
|
+
# Test that class exists and can be instantiated (even if it fails)
|
|
199
|
+
assert hasattr(orbits_module, "OrbitHist1D")
|
|
200
|
+
assert callable(OrbitHist1D)
|
|
201
|
+
|
|
202
|
+
# Test the class is properly defined
|
|
203
|
+
assert issubclass(OrbitHist1D, OrbitPlot)
|
|
204
|
+
|
|
205
|
+
def test_format_axis_method_exists(self):
|
|
206
|
+
"""Test _format_axis method exists."""
|
|
207
|
+
# Test that the method exists on the class
|
|
208
|
+
assert hasattr(OrbitHist1D, "_format_axis")
|
|
209
|
+
assert callable(getattr(OrbitHist1D, "_format_axis"))
|
|
210
|
+
|
|
211
|
+
def test_make_plot_method_exists(self):
|
|
212
|
+
"""Test make_plot method exists."""
|
|
213
|
+
# Test that the method exists on the class
|
|
214
|
+
assert hasattr(OrbitHist1D, "make_plot")
|
|
215
|
+
assert callable(getattr(OrbitHist1D, "make_plot"))
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class TestOrbitHist2D:
|
|
219
|
+
"""Test OrbitHist2D class functionality."""
|
|
220
|
+
|
|
221
|
+
def setup_method(self):
|
|
222
|
+
"""Set up test data for OrbitHist2D tests."""
|
|
223
|
+
# Create test orbit intervals
|
|
224
|
+
self.orbit_intervals = pd.IntervalIndex.from_tuples(
|
|
225
|
+
[
|
|
226
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00")),
|
|
227
|
+
(pd.Timestamp("2020-01-01 03:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
228
|
+
]
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Create test data
|
|
232
|
+
times = pd.date_range("2020-01-01", periods=20, freq="15min")
|
|
233
|
+
self.x_data = pd.Series(np.random.uniform(1, 10, 20), index=times)
|
|
234
|
+
self.y_data = pd.Series(np.random.uniform(1, 10, 20), index=times)
|
|
235
|
+
|
|
236
|
+
def test_orbit_hist_2d_initialization(self):
|
|
237
|
+
"""Test OrbitHist2D initialization basics."""
|
|
238
|
+
# Test that class exists and can be instantiated (even if it fails)
|
|
239
|
+
assert hasattr(orbits_module, "OrbitHist2D")
|
|
240
|
+
assert callable(OrbitHist2D)
|
|
241
|
+
|
|
242
|
+
# Test the class is properly defined
|
|
243
|
+
assert issubclass(OrbitHist2D, OrbitPlot)
|
|
244
|
+
|
|
245
|
+
def test_format_in_out_axes_method_exists(self):
|
|
246
|
+
"""Test _format_in_out_axes method exists."""
|
|
247
|
+
assert hasattr(OrbitHist2D, "_format_in_out_axes")
|
|
248
|
+
assert callable(getattr(OrbitHist2D, "_format_in_out_axes"))
|
|
249
|
+
|
|
250
|
+
def test_prune_lower_yaxis_ticks(self):
|
|
251
|
+
"""Test _prune_lower_yaxis_ticks prunes ticks correctly."""
|
|
252
|
+
mock_ax0 = MagicMock()
|
|
253
|
+
mock_ax1 = MagicMock()
|
|
254
|
+
|
|
255
|
+
mock_ax0.get_yticks.return_value = np.array([0, 1, 2, 3, 4])
|
|
256
|
+
mock_ax0.get_yscale.return_value = "linear"
|
|
257
|
+
mock_ax1.get_yscale.return_value = "linear"
|
|
258
|
+
|
|
259
|
+
OrbitHist2D._prune_lower_yaxis_ticks(mock_ax0, mock_ax1)
|
|
260
|
+
|
|
261
|
+
# Should have called set_major_locator on both axes
|
|
262
|
+
mock_ax0.yaxis.set_major_locator.assert_called_once()
|
|
263
|
+
mock_ax1.yaxis.set_major_locator.assert_called_once()
|
|
264
|
+
|
|
265
|
+
def test_project_1d_method_exists(self):
|
|
266
|
+
"""Test project_1d method exists."""
|
|
267
|
+
assert hasattr(OrbitHist2D, "project_1d")
|
|
268
|
+
assert callable(getattr(OrbitHist2D, "project_1d"))
|
|
269
|
+
|
|
270
|
+
def test_make_one_plot_method_exists(self):
|
|
271
|
+
"""Test make_one_plot method exists."""
|
|
272
|
+
assert hasattr(OrbitHist2D, "make_one_plot")
|
|
273
|
+
assert callable(getattr(OrbitHist2D, "make_one_plot"))
|
|
274
|
+
|
|
275
|
+
def test_make_one_plot_kind_validation(self):
|
|
276
|
+
"""Test make_one_plot kind validation logic."""
|
|
277
|
+
# Test the transformation logic directly
|
|
278
|
+
trans = {"i": "Inbound", "o": "Outbound", "b": "Both"}
|
|
279
|
+
|
|
280
|
+
# Test valid transformations
|
|
281
|
+
assert trans["i"] == "Inbound"
|
|
282
|
+
assert trans["o"] == "Outbound"
|
|
283
|
+
assert trans["b"] == "Both"
|
|
284
|
+
|
|
285
|
+
def test_disable_both_property_default(self):
|
|
286
|
+
"""Test that _disable_both is True by default in OrbitPlot classes."""
|
|
287
|
+
# This property is inherited from OrbitPlot
|
|
288
|
+
orbit_plot = ConcreteOrbitPlot(self.orbit_intervals)
|
|
289
|
+
assert orbit_plot._disable_both is True
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
class TestOrbitPlottingIntegration:
|
|
293
|
+
"""Test integration between orbit plotting components."""
|
|
294
|
+
|
|
295
|
+
def setup_method(self):
|
|
296
|
+
"""Set up test data for integration tests."""
|
|
297
|
+
self.orbit_intervals = pd.IntervalIndex.from_tuples(
|
|
298
|
+
[
|
|
299
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00")),
|
|
300
|
+
(pd.Timestamp("2020-01-01 03:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
301
|
+
]
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
times = pd.date_range("2020-01-01", periods=50, freq="6min")
|
|
305
|
+
self.x_data = pd.Series(np.random.uniform(1, 10, 50), index=times)
|
|
306
|
+
self.y_data = pd.Series(np.random.uniform(1, 10, 50), index=times)
|
|
307
|
+
|
|
308
|
+
def test_orbit_plot_inheritance_chain(self):
|
|
309
|
+
"""Test that inheritance chain works correctly."""
|
|
310
|
+
# OrbitHist1D should inherit from both OrbitPlot and Hist1D
|
|
311
|
+
assert issubclass(OrbitHist1D, OrbitPlot)
|
|
312
|
+
# Note: We can't easily test Hist1D inheritance without importing histograms
|
|
313
|
+
|
|
314
|
+
# OrbitHist2D should inherit from both OrbitPlot and Hist2D
|
|
315
|
+
assert issubclass(OrbitHist2D, OrbitPlot)
|
|
316
|
+
|
|
317
|
+
def test_orbit_interval_validation(self):
|
|
318
|
+
"""Test that orbit intervals are properly validated across classes."""
|
|
319
|
+
valid_intervals = self.orbit_intervals
|
|
320
|
+
invalid_inputs = ["string", [1, 2, 3], pd.Index([1, 2, 3]), None]
|
|
321
|
+
|
|
322
|
+
for invalid_input in invalid_inputs:
|
|
323
|
+
with pytest.raises(TypeError):
|
|
324
|
+
ConcreteOrbitPlot(invalid_input)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
class TestOrbitErrorHandling:
|
|
328
|
+
"""Test error handling and edge cases in orbit plotting."""
|
|
329
|
+
|
|
330
|
+
def setup_method(self):
|
|
331
|
+
"""Set up test data for error handling tests."""
|
|
332
|
+
self.orbit_intervals = pd.IntervalIndex.from_tuples(
|
|
333
|
+
[
|
|
334
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00")),
|
|
335
|
+
(pd.Timestamp("2020-01-01 03:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
336
|
+
]
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
def test_empty_orbit_intervals(self):
|
|
340
|
+
"""Test handling of empty orbit intervals."""
|
|
341
|
+
empty_intervals = pd.IntervalIndex([])
|
|
342
|
+
|
|
343
|
+
# Should not raise an error during initialization
|
|
344
|
+
orbit_plot = ConcreteOrbitPlot(empty_intervals)
|
|
345
|
+
assert len(orbit_plot.orbit) == 0
|
|
346
|
+
|
|
347
|
+
def test_single_orbit_interval(self):
|
|
348
|
+
"""Test handling of single orbit interval."""
|
|
349
|
+
single_interval = pd.IntervalIndex.from_tuples(
|
|
350
|
+
[(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 02:00"))]
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
orbit_plot = ConcreteOrbitPlot(single_interval)
|
|
354
|
+
assert len(orbit_plot.orbit) == 1
|
|
355
|
+
|
|
356
|
+
def test_overlapping_orbit_intervals(self):
|
|
357
|
+
"""Test handling of overlapping orbit intervals."""
|
|
358
|
+
overlapping_intervals = pd.IntervalIndex.from_tuples(
|
|
359
|
+
[
|
|
360
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 03:00")),
|
|
361
|
+
(pd.Timestamp("2020-01-01 02:00"), pd.Timestamp("2020-01-01 05:00")),
|
|
362
|
+
]
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
# Should accept overlapping intervals (sorting behavior may vary)
|
|
366
|
+
orbit_plot = ConcreteOrbitPlot(overlapping_intervals)
|
|
367
|
+
assert len(orbit_plot.orbit) == 2
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
class TestOrbitDocumentation:
|
|
371
|
+
"""Test documentation and docstrings for orbit classes."""
|
|
372
|
+
|
|
373
|
+
def test_module_docstring(self):
|
|
374
|
+
"""Test that module has docstring."""
|
|
375
|
+
assert orbits_module.__doc__ is not None
|
|
376
|
+
assert len(orbits_module.__doc__.strip()) > 0
|
|
377
|
+
|
|
378
|
+
def test_orbit_plot_docstring(self):
|
|
379
|
+
"""Test that OrbitPlot has class documentation."""
|
|
380
|
+
# OrbitPlot is abstract, may not have detailed docstring
|
|
381
|
+
assert hasattr(OrbitPlot, "__doc__")
|
|
382
|
+
|
|
383
|
+
def test_orbit_hist_1d_docstring(self):
|
|
384
|
+
"""Test that OrbitHist1D methods have docstrings."""
|
|
385
|
+
assert OrbitHist1D.make_plot.__doc__ is not None
|
|
386
|
+
assert len(OrbitHist1D.make_plot.__doc__.strip()) > 0
|
|
387
|
+
|
|
388
|
+
def test_orbit_hist_2d_docstring(self):
|
|
389
|
+
"""Test that OrbitHist2D methods have docstrings."""
|
|
390
|
+
assert OrbitHist2D.project_1d.__doc__ is not None
|
|
391
|
+
assert len(OrbitHist2D.project_1d.__doc__.strip()) > 0
|
|
392
|
+
|
|
393
|
+
assert OrbitHist2D.make_one_plot.__doc__ is not None
|
|
394
|
+
assert len(OrbitHist2D.make_one_plot.__doc__.strip()) > 0
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
class TestOrbitPerformance:
|
|
398
|
+
"""Test performance characteristics of orbit plotting."""
|
|
399
|
+
|
|
400
|
+
def test_large_orbit_dataset(self):
|
|
401
|
+
"""Test handling of large orbit datasets."""
|
|
402
|
+
# Create larger dataset
|
|
403
|
+
large_intervals = pd.IntervalIndex.from_tuples(
|
|
404
|
+
[
|
|
405
|
+
(
|
|
406
|
+
pd.Timestamp("2020-01-01") + pd.Timedelta(hours=i),
|
|
407
|
+
pd.Timestamp("2020-01-01") + pd.Timedelta(hours=i + 1),
|
|
408
|
+
)
|
|
409
|
+
for i in range(0, 100, 2)
|
|
410
|
+
]
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
# Should handle large interval sets
|
|
414
|
+
orbit_plot = ConcreteOrbitPlot(large_intervals)
|
|
415
|
+
assert len(orbit_plot.orbit) == 50
|
|
416
|
+
|
|
417
|
+
def test_memory_usage_with_large_data(self):
|
|
418
|
+
"""Test memory efficiency with large datasets."""
|
|
419
|
+
orbit_intervals = pd.IntervalIndex.from_tuples(
|
|
420
|
+
[
|
|
421
|
+
(pd.Timestamp("2020-01-01 00:00"), pd.Timestamp("2020-01-01 12:00")),
|
|
422
|
+
(pd.Timestamp("2020-01-01 12:00"), pd.Timestamp("2020-01-02 00:00")),
|
|
423
|
+
]
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
# Create orbit plot - should not consume excessive memory
|
|
427
|
+
orbit_plot = ConcreteOrbitPlot(orbit_intervals)
|
|
428
|
+
|
|
429
|
+
# Basic memory usage test - just ensure it doesn't crash
|
|
430
|
+
assert orbit_plot is not None
|
|
431
|
+
assert len(orbit_plot.orbit) == 2
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
if __name__ == "__main__":
|
|
435
|
+
pytest.main([__file__])
|