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,342 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Create GitHub issues from plan files.
|
|
3
|
+
|
|
4
|
+
The script parses markdown files under ``solarwindpy/plans`` that contain
|
|
5
|
+
YAML frontmatter and converts them into GitHub issues. Frontmatter fields
|
|
6
|
+
``name``, ``about`` and ``labels`` are used for the issue metadata while the
|
|
7
|
+
markdown content beginning with ``## 🧠 Context`` becomes the issue body. The
|
|
8
|
+
final issue title combines the containing directory name with any numeric
|
|
9
|
+
prefix in the filename to preserve ordering. Optionally a specific
|
|
10
|
+
subdirectory can be scanned via the ``-d/--directory`` CLI argument.
|
|
11
|
+
Authentication uses a token supplied via ``--token`` or the ``GITHUB_TOKEN_SOLARWINDPY``.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
import logging
|
|
18
|
+
import os
|
|
19
|
+
import re
|
|
20
|
+
import subprocess
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Dict, List, Optional, Tuple
|
|
23
|
+
|
|
24
|
+
import requests
|
|
25
|
+
import yaml
|
|
26
|
+
from tabulate import tabulate
|
|
27
|
+
|
|
28
|
+
GITHUB_API = "https://api.github.com"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def load_markdown_plan(path: Path) -> Dict[str, object]:
|
|
32
|
+
"""Parse a markdown plan file.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
path : Path
|
|
37
|
+
Location of the markdown file.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
dict
|
|
42
|
+
Dictionary with ``name``, ``about``, ``labels`` and ``body`` keys.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
text = path.read_text(encoding="utf-8")
|
|
46
|
+
if not text.startswith("---"):
|
|
47
|
+
raise ValueError(f"No YAML frontmatter found in {path}")
|
|
48
|
+
|
|
49
|
+
_, fm, rest = text.split("---", 2)
|
|
50
|
+
meta = yaml.safe_load(fm)
|
|
51
|
+
|
|
52
|
+
context_index = rest.find("## 🧠 Context")
|
|
53
|
+
body = rest[context_index:].lstrip() if context_index != -1 else rest.lstrip("\n")
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
"name": meta.get("name", "").strip(),
|
|
57
|
+
"about": meta.get("about", "").strip(),
|
|
58
|
+
"labels": meta.get("labels", []),
|
|
59
|
+
"body": body,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def fetch_existing_issue_titles(owner: str, repo: str, token: str) -> List[str]:
|
|
64
|
+
"""Retrieve titles of all issues in a repository.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
owner : str
|
|
69
|
+
GitHub organization or username.
|
|
70
|
+
repo : str
|
|
71
|
+
GitHub repository name.
|
|
72
|
+
token : str
|
|
73
|
+
Personal access token.
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
list of str
|
|
78
|
+
Titles of existing issues (open and closed).
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
titles: List[str] = []
|
|
82
|
+
headers = {"Authorization": f"token {token}"}
|
|
83
|
+
page = 1
|
|
84
|
+
while True:
|
|
85
|
+
params = {"state": "all", "per_page": 100, "page": page}
|
|
86
|
+
url = f"{GITHUB_API}/repos/{owner}/{repo}/issues"
|
|
87
|
+
resp = requests.get(url, headers=headers, params=params)
|
|
88
|
+
resp.raise_for_status()
|
|
89
|
+
data = resp.json()
|
|
90
|
+
if not data:
|
|
91
|
+
break
|
|
92
|
+
titles.extend(issue["title"] for issue in data)
|
|
93
|
+
page += 1
|
|
94
|
+
return titles
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def create_issue(
|
|
98
|
+
owner: str, repo: str, token: str, title: str, body: str, labels: List[str]
|
|
99
|
+
) -> Dict[str, object]:
|
|
100
|
+
"""Create a GitHub issue.
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
owner, repo, token, title, body, labels : str or list of str
|
|
105
|
+
Standard GitHub issue parameters.
|
|
106
|
+
|
|
107
|
+
Returns
|
|
108
|
+
-------
|
|
109
|
+
dict
|
|
110
|
+
Response JSON from GitHub API.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
url = f"{GITHUB_API}/repos/{owner}/{repo}/issues"
|
|
114
|
+
headers = {
|
|
115
|
+
"Authorization": f"token {token}",
|
|
116
|
+
"Accept": "application/vnd.github.v3+json",
|
|
117
|
+
}
|
|
118
|
+
payload = {"title": title, "body": body, "labels": labels}
|
|
119
|
+
resp = requests.post(url, json=payload, headers=headers)
|
|
120
|
+
resp.raise_for_status()
|
|
121
|
+
return resp.json()
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def infer_owner_repo() -> Tuple[Optional[str], Optional[str]]:
|
|
125
|
+
"""Infer repository information from the local Git remote.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
tuple of (str or None, str or None)
|
|
130
|
+
Repository owner and name if available.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
url = subprocess.check_output(
|
|
135
|
+
["git", "remote", "get-url", "origin"],
|
|
136
|
+
text=True,
|
|
137
|
+
).strip()
|
|
138
|
+
except Exception: # pragma: no cover - best effort
|
|
139
|
+
return None, None
|
|
140
|
+
|
|
141
|
+
if url.startswith("git@"):
|
|
142
|
+
_, path = url.split(":", 1)
|
|
143
|
+
elif "github.com/" in url:
|
|
144
|
+
path = url.split("github.com/", 1)[1]
|
|
145
|
+
else:
|
|
146
|
+
return None, None
|
|
147
|
+
|
|
148
|
+
if path.endswith(".git"):
|
|
149
|
+
path = path[:-4]
|
|
150
|
+
|
|
151
|
+
parts = path.strip("/").split("/")
|
|
152
|
+
if len(parts) != 2:
|
|
153
|
+
return None, None
|
|
154
|
+
return parts[0], parts[1]
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def find_plan_files(subdir: Optional[str] = None) -> List[Path]:
|
|
158
|
+
"""Recursively locate plan markdown files.
|
|
159
|
+
|
|
160
|
+
Parameters
|
|
161
|
+
----------
|
|
162
|
+
subdir : str, optional
|
|
163
|
+
Specific directory under the plans folder to search.
|
|
164
|
+
|
|
165
|
+
Returns
|
|
166
|
+
-------
|
|
167
|
+
list of Path
|
|
168
|
+
Markdown files excluding ``pre_combination_files``.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
root = Path(__file__).resolve().parent
|
|
172
|
+
search_root = root / subdir if subdir else root
|
|
173
|
+
if not search_root.exists():
|
|
174
|
+
raise FileNotFoundError(f"Directory {search_root} does not exist")
|
|
175
|
+
files = [
|
|
176
|
+
p for p in search_root.rglob("*.md") if "pre_combination_files" not in p.parts
|
|
177
|
+
]
|
|
178
|
+
return sorted(files, key=lambda p: p.name)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def infer_issue_title(path: Path, name: str) -> str:
|
|
182
|
+
"""Construct an issue title from directory and file names.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
path : Path
|
|
187
|
+
Location of the markdown file.
|
|
188
|
+
name : str
|
|
189
|
+
Title from the YAML frontmatter. When provided, it is combined with
|
|
190
|
+
the numeric prefix from ``path``.
|
|
191
|
+
|
|
192
|
+
Returns
|
|
193
|
+
-------
|
|
194
|
+
str
|
|
195
|
+
Issue title in the form ``"<Directory> – <number> <name>"``. If
|
|
196
|
+
``name`` is empty the filename (with hyphens/underscores replaced by
|
|
197
|
+
spaces) is used.
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
dir_name = path.parent.name
|
|
201
|
+
dir_title = " ".join(
|
|
202
|
+
part.capitalize() for part in re.split(r"[-_]", dir_name) if part
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
stem_parts = re.split(r"[-_]", path.stem)
|
|
206
|
+
number = stem_parts[0] if stem_parts and stem_parts[0].isdigit() else ""
|
|
207
|
+
|
|
208
|
+
if name:
|
|
209
|
+
n = name.strip()
|
|
210
|
+
# Remove any leading directory/plan name and keep only the final part after the last dash or en dash
|
|
211
|
+
if "–" in n:
|
|
212
|
+
n = n.split("–")[-1].strip()
|
|
213
|
+
elif "-" in n:
|
|
214
|
+
n = n.split("-")[-1].strip()
|
|
215
|
+
# Remove any repeated directory/plan name at the start of n
|
|
216
|
+
if n.lower().startswith(dir_title.lower()):
|
|
217
|
+
n = n[len(dir_title):].lstrip(" -–")
|
|
218
|
+
title_part = f"{number} {n}".strip() if number else n
|
|
219
|
+
else:
|
|
220
|
+
title_part = " ".join(stem_parts)
|
|
221
|
+
|
|
222
|
+
return f"{dir_title} – {title_part}".strip()
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def format_summary_table(rows: List[Tuple[str, str]]) -> str:
|
|
226
|
+
"""Build a tabulated summary of issue creation outcomes.
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
rows : list of tuple of str
|
|
231
|
+
Each tuple is a ``(status, detail)`` pair.
|
|
232
|
+
|
|
233
|
+
Returns
|
|
234
|
+
-------
|
|
235
|
+
str
|
|
236
|
+
Formatted table using :mod:`tabulate`. Returns a message when ``rows`` is
|
|
237
|
+
empty.
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
if not rows:
|
|
241
|
+
return "No actions performed."
|
|
242
|
+
|
|
243
|
+
return tabulate(rows, headers=["Status", "Detail"], tablefmt="github")
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def main() -> None:
|
|
247
|
+
"""CLI entry point for converting plans into GitHub issues."""
|
|
248
|
+
|
|
249
|
+
parser = argparse.ArgumentParser(
|
|
250
|
+
description="Create GitHub issues from Markdown plans.",
|
|
251
|
+
)
|
|
252
|
+
parser.add_argument(
|
|
253
|
+
"--owner",
|
|
254
|
+
help="GitHub organization or username",
|
|
255
|
+
)
|
|
256
|
+
parser.add_argument(
|
|
257
|
+
"--repo",
|
|
258
|
+
help="GitHub repository name",
|
|
259
|
+
)
|
|
260
|
+
parser.add_argument(
|
|
261
|
+
"-d",
|
|
262
|
+
"--directory",
|
|
263
|
+
help="Subdirectory under plans to search for markdown files",
|
|
264
|
+
)
|
|
265
|
+
parser.add_argument(
|
|
266
|
+
"--token",
|
|
267
|
+
help="GitHub personal access token; falls back to env vars",
|
|
268
|
+
)
|
|
269
|
+
args = parser.parse_args()
|
|
270
|
+
|
|
271
|
+
token = (
|
|
272
|
+
args.token
|
|
273
|
+
or os.getenv("GITHUB_TOKEN_SOLARWINDPY")
|
|
274
|
+
)
|
|
275
|
+
if not token:
|
|
276
|
+
raise SystemExit(
|
|
277
|
+
"GitHub access token not provided. Use --token or set GITHUB_TOKEN_SOLARWINDPY"
|
|
278
|
+
"/GH_TOKEN/GITHUB_ACCESS_TOKEN."
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
log_dir = Path(__file__).resolve().parent.parent / "scripts" / "logs"
|
|
282
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
283
|
+
log_file = log_dir / "issues_from_plans.log"
|
|
284
|
+
logging.basicConfig(
|
|
285
|
+
level=logging.INFO,
|
|
286
|
+
format="%(asctime)s [%(levelname)s] %(message)s",
|
|
287
|
+
handlers=[logging.FileHandler(log_file), logging.StreamHandler()],
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
owner = args.owner
|
|
291
|
+
repo = args.repo
|
|
292
|
+
if not owner or not repo:
|
|
293
|
+
git_owner, git_repo = infer_owner_repo()
|
|
294
|
+
owner = owner or git_owner
|
|
295
|
+
repo = repo or git_repo
|
|
296
|
+
if not owner or not repo:
|
|
297
|
+
logging.error("Repository owner and name must be provided")
|
|
298
|
+
raise SystemExit(1)
|
|
299
|
+
|
|
300
|
+
summary_rows: List[Tuple[str, str]] = []
|
|
301
|
+
|
|
302
|
+
try:
|
|
303
|
+
plan_files = find_plan_files(args.directory)
|
|
304
|
+
except FileNotFoundError as err:
|
|
305
|
+
logging.error(err)
|
|
306
|
+
raise SystemExit(1)
|
|
307
|
+
if not plan_files:
|
|
308
|
+
msg = "No markdown files found in plans directory"
|
|
309
|
+
logging.warning(msg)
|
|
310
|
+
summary_rows.append(("Warning", msg))
|
|
311
|
+
else:
|
|
312
|
+
logging.info("Found %d plan files", len(plan_files))
|
|
313
|
+
existing_titles = set(fetch_existing_issue_titles(owner, repo, token))
|
|
314
|
+
for path in plan_files:
|
|
315
|
+
try:
|
|
316
|
+
plan = load_markdown_plan(path)
|
|
317
|
+
title = infer_issue_title(path, plan["name"])
|
|
318
|
+
body = plan["body"]
|
|
319
|
+
labels = plan["labels"]
|
|
320
|
+
|
|
321
|
+
if title in existing_titles:
|
|
322
|
+
logging.info("Skipping '%s': issue already exists", title)
|
|
323
|
+
summary_rows.append(("Exists", title))
|
|
324
|
+
continue
|
|
325
|
+
|
|
326
|
+
issue = create_issue(owner, repo, token, title, body, labels)
|
|
327
|
+
logging.info("Created issue #%d '%s'", issue["number"], title)
|
|
328
|
+
summary_rows.append(("Created", f"{title} (#{issue['number']})"))
|
|
329
|
+
|
|
330
|
+
except Exception as err: # noqa: BLE001 - logging the error
|
|
331
|
+
logging.error("Failed on %s: %s", path, err)
|
|
332
|
+
summary_rows.append(("Error", f"{path.name}: {err}"))
|
|
333
|
+
|
|
334
|
+
table = format_summary_table(summary_rows)
|
|
335
|
+
|
|
336
|
+
logging.info("\n%s", table)
|
|
337
|
+
with log_file.open("a", encoding="utf-8") as fh:
|
|
338
|
+
fh.write(table + "\n")
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
if __name__ == "__main__":
|
|
342
|
+
main()
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# PR #270 Documentation Validation Fixes - Overview
|
|
2
|
+
|
|
3
|
+
## Plan Metadata
|
|
4
|
+
- **Plan Name**: PR #270 Documentation Validation Fixes and Framework Right-Sizing
|
|
5
|
+
- **Created**: 2025-08-21
|
|
6
|
+
- **Branch**: plan/pr-270-doc-validation-fixes
|
|
7
|
+
- **Implementation Branch**: feature/pr-270-doc-validation-fixes
|
|
8
|
+
- **PlanManager**: UnifiedPlanCoordinator
|
|
9
|
+
- **PlanImplementer**: UnifiedPlanCoordinator
|
|
10
|
+
- **Structure**: Multi-Phase
|
|
11
|
+
- **Total Phases**: 4
|
|
12
|
+
- **Dependencies**: None
|
|
13
|
+
- **Affects**: .github/workflows/, .readthedocs.yaml, scripts/doc_validation/, docs/, tests/
|
|
14
|
+
- **Estimated Duration**: 6-8 hours
|
|
15
|
+
- **Status**: Planning
|
|
16
|
+
|
|
17
|
+
## Phase Overview
|
|
18
|
+
- [ ] **Phase 1: Critical PR Check Fixes** (Est: 2-3 hours) - Fix GitHub Actions v3→v4, doc8 linting, ReadTheDocs failures
|
|
19
|
+
- [ ] **Phase 2: Framework Right-Sizing** (Est: 2-3 hours) - Consolidate 3000→300 lines validation code, archive over-engineering
|
|
20
|
+
- [ ] **Phase 3: Sustainable Documentation Process** (Est: 1-2 hours) - Create minimal validation, update guidelines
|
|
21
|
+
- [ ] **Phase 4: Closeout and Migration** (Est: 1 hour) - Verify functionality, create transition guide
|
|
22
|
+
|
|
23
|
+
## Phase Files
|
|
24
|
+
1. [1-Critical-PR-Fixes.md](./1-Critical-PR-Fixes.md)
|
|
25
|
+
2. [2-Framework-Right-Sizing.md](./2-Framework-Right-Sizing.md)
|
|
26
|
+
3. [3-Sustainable-Documentation.md](./3-Sustainable-Documentation.md)
|
|
27
|
+
4. [4-Closeout-Migration.md](./4-Closeout-Migration.md)
|
|
28
|
+
|
|
29
|
+
## 🎯 Objective
|
|
30
|
+
Fix PR #270 failures and right-size the documentation validation framework from over-engineered 3000+ lines to appropriate ~300 lines for a scientific Python package with 47 documentation examples.
|
|
31
|
+
|
|
32
|
+
## 🧠 Context
|
|
33
|
+
**Current Situation:**
|
|
34
|
+
- PR #270 has multiple check failures: GitHub Actions v3 deprecation, doc8 linting errors, ReadTheDocs build failures
|
|
35
|
+
- Documentation validation framework is over-engineered: 3000+ lines of code for 47 examples with 85.7% failure rate
|
|
36
|
+
- Framework complexity exceeds requirements for scientific package documentation needs
|
|
37
|
+
- Maintenance burden is unsustainable for project scope and team size
|
|
38
|
+
|
|
39
|
+
**Problem Analysis:**
|
|
40
|
+
- GitHub Actions using deprecated artifacts/upload-artifact@v3 → needs v4 migration
|
|
41
|
+
- doc8 linting failures: trailing whitespace and line length violations
|
|
42
|
+
- ReadTheDocs build failures need diagnosis and resolution
|
|
43
|
+
- Validation framework designed for enterprise-scale documentation (1000+ examples) applied to research package (47 examples)
|
|
44
|
+
|
|
45
|
+
## 🔧 Technical Requirements
|
|
46
|
+
- GitHub Actions: artifacts/upload-artifact@v4
|
|
47
|
+
- doc8: trailing whitespace and line length compliance
|
|
48
|
+
- ReadTheDocs: working build pipeline
|
|
49
|
+
- Python 3.9-3.11 compatibility
|
|
50
|
+
- Simplified validation framework: ~300 lines total
|
|
51
|
+
- Maintain existing doctest functionality
|
|
52
|
+
- Preserve CI/CD integration points
|
|
53
|
+
|
|
54
|
+
## 📂 Affected Areas
|
|
55
|
+
**CI/CD Infrastructure:**
|
|
56
|
+
- `.github/workflows/doctest-validation.yml`
|
|
57
|
+
- `.github/workflows/documentation.yml`
|
|
58
|
+
- `.readthedocs.yaml`
|
|
59
|
+
|
|
60
|
+
**Validation Framework:**
|
|
61
|
+
- `scripts/doc_validation/` (consolidation target)
|
|
62
|
+
- `scripts/validation_framework/` (archive candidate)
|
|
63
|
+
- `scripts/doctest_runner.py` (simplify)
|
|
64
|
+
|
|
65
|
+
**Documentation:**
|
|
66
|
+
- `docs/` (formatting fixes)
|
|
67
|
+
- Contributor guidelines
|
|
68
|
+
- Maintenance procedures
|
|
69
|
+
|
|
70
|
+
## ✅ Acceptance Criteria
|
|
71
|
+
- [ ] All PR #270 checks passing (GitHub Actions, doc8, ReadTheDocs)
|
|
72
|
+
- [ ] Documentation validation framework reduced from 3000+ to ~300 lines
|
|
73
|
+
- [ ] 90% reduction in framework complexity while maintaining core functionality
|
|
74
|
+
- [ ] All existing doctest examples continue to work
|
|
75
|
+
- [ ] Sustainable maintenance approach documented
|
|
76
|
+
- [ ] Clear migration path from over-engineered to right-sized solution
|
|
77
|
+
- [ ] CI/CD pipeline streamlined and efficient
|
|
78
|
+
- [ ] ReadTheDocs building successfully
|
|
79
|
+
|
|
80
|
+
## 🧪 Testing Strategy
|
|
81
|
+
**Validation Approach:**
|
|
82
|
+
1. **PR Check Verification**: All GitHub Actions workflows pass
|
|
83
|
+
2. **Documentation Build**: ReadTheDocs builds without errors
|
|
84
|
+
3. **Example Execution**: Core doctest examples execute successfully
|
|
85
|
+
4. **Framework Functionality**: Simplified validation maintains essential features
|
|
86
|
+
5. **Integration Testing**: CI/CD pipeline operates efficiently
|
|
87
|
+
|
|
88
|
+
**Quality Gates:**
|
|
89
|
+
- GitHub Actions workflows complete successfully
|
|
90
|
+
- doc8 linting passes without violations
|
|
91
|
+
- ReadTheDocs build and deployment succeeds
|
|
92
|
+
- Essential doctest examples (physics core) execute correctly
|
|
93
|
+
- Framework complexity metrics show 90% reduction
|
|
94
|
+
|
|
95
|
+
## 📊 Value Proposition Analysis
|
|
96
|
+
|
|
97
|
+
### Scientific Software Development Value
|
|
98
|
+
**Research Efficiency Improvements:**
|
|
99
|
+
- **tests/**: High impact on code quality and reliability
|
|
100
|
+
- **docs/**: Medium impact on user adoption and learning
|
|
101
|
+
|
|
102
|
+
**Development Quality Enhancements:**
|
|
103
|
+
- Systematic evaluation of plan impact on scientific workflows
|
|
104
|
+
- Enhanced decision-making through quantified value metrics
|
|
105
|
+
- Improved coordination with SolarWindPy's physics validation system
|
|
106
|
+
|
|
107
|
+
### Developer Productivity Value
|
|
108
|
+
**Planning Efficiency:**
|
|
109
|
+
- **Manual Planning Time**: ~180 minutes for 4 phases
|
|
110
|
+
- **Automated Planning Time**: ~35 minutes with value propositions
|
|
111
|
+
- **Time Savings**: 145 minutes (81% reduction)
|
|
112
|
+
- **Reduced Cognitive Load**: Systematic framework eliminates ad-hoc analysis
|
|
113
|
+
|
|
114
|
+
**Token Usage Optimization:**
|
|
115
|
+
- **Manual Proposition Writing**: ~1800 tokens
|
|
116
|
+
- **Automated Hook Generation**: ~300 tokens
|
|
117
|
+
- **Net Savings**: 1500 tokens (83% reduction)
|
|
118
|
+
- **Session Extension**: Approximately 15 additional minutes of productive work
|
|
119
|
+
|
|
120
|
+
## 💰 Resource & Cost Analysis
|
|
121
|
+
|
|
122
|
+
### Development Investment
|
|
123
|
+
**Implementation Time Breakdown:**
|
|
124
|
+
- **Base estimate**: 8 hours (moderate plan)
|
|
125
|
+
- **Complexity multiplier**: 0.9x
|
|
126
|
+
- **Final estimate**: 7.2 hours
|
|
127
|
+
- **Confidence interval**: 5.8-9.4 hours
|
|
128
|
+
- **Per-phase average**: 1.8 hours
|
|
129
|
+
|
|
130
|
+
**Maintenance Considerations:**
|
|
131
|
+
- Ongoing maintenance: ~2-4 hours per quarter
|
|
132
|
+
- Testing updates: ~1-2 hours per major change
|
|
133
|
+
- Documentation updates: ~30 minutes per feature addition
|
|
134
|
+
|
|
135
|
+
### Token Usage Economics
|
|
136
|
+
**Current vs Enhanced Token Usage:**
|
|
137
|
+
- Manual proposition writing: ~1800 tokens
|
|
138
|
+
- Automated generation: ~400 tokens
|
|
139
|
+
- Hook execution: 100 tokens
|
|
140
|
+
- Content insertion: 150 tokens
|
|
141
|
+
- Validation: 50 tokens
|
|
142
|
+
- Context overhead: 100 tokens
|
|
143
|
+
|
|
144
|
+
**Net Savings: 1400 tokens (78% reduction)**
|
|
145
|
+
|
|
146
|
+
**Break-even Analysis:**
|
|
147
|
+
- Development investment: ~10-15 hours
|
|
148
|
+
- Token savings per plan: 1400 tokens
|
|
149
|
+
- Break-even point: 10 plans
|
|
150
|
+
- Expected annual volume: 20-30 plans
|
|
151
|
+
|
|
152
|
+
## ⚠️ Risk Assessment & Mitigation
|
|
153
|
+
|
|
154
|
+
### Technical Implementation Risks
|
|
155
|
+
| Risk | Probability | Impact | Mitigation Strategy |
|
|
156
|
+
|------|------------|--------|-------------------|
|
|
157
|
+
| Integration compatibility issues | Low | Medium | Thorough integration testing, backward compatibility validation |
|
|
158
|
+
| Performance degradation | Low | Low | Performance benchmarking, optimization validation |
|
|
159
|
+
|
|
160
|
+
### Project Management Risks
|
|
161
|
+
- **Scope creep risk (Medium)**: Value propositions may reveal additional requirements
|
|
162
|
+
- *Mitigation*: Strict scope boundaries, change control process
|
|
163
|
+
- **Resource availability risk (Low)**: Developer time allocation conflicts
|
|
164
|
+
- *Mitigation*: Resource planning, conflict identification system
|
|
165
|
+
- **Token budget overrun (Low)**: Complex plans may exceed session limits
|
|
166
|
+
- *Mitigation*: Token monitoring, automatic compaction at phase boundaries
|
|
167
|
+
|
|
168
|
+
### Scientific Workflow Risks
|
|
169
|
+
- **User workflow disruption (Low)**: Interface changes may affect researcher productivity
|
|
170
|
+
- *Mitigation*: Backward compatibility, gradual feature introduction
|
|
171
|
+
- **Documentation lag (Medium)**: Implementation may outpace documentation updates
|
|
172
|
+
- *Mitigation*: Documentation-driven development, parallel doc updates
|
|
173
|
+
|
|
174
|
+
## 🔒 Security Proposition
|
|
175
|
+
|
|
176
|
+
### Code-Level Security Assessment
|
|
177
|
+
**Dependency Vulnerability Assessment:**
|
|
178
|
+
- **No specific dependencies identified** - general Python security best practices apply
|
|
179
|
+
|
|
180
|
+
**Recommended Actions:**
|
|
181
|
+
- Run `pip audit` to scan for known vulnerabilities
|
|
182
|
+
- Pin dependency versions in requirements.txt
|
|
183
|
+
- Monitor security advisories for scientific computing packages
|
|
184
|
+
- Consider using conda for better package management
|
|
185
|
+
|
|
186
|
+
**Authentication/Access Control Impact Analysis:**
|
|
187
|
+
- No direct authentication system modifications identified
|
|
188
|
+
- Standard scientific computing access patterns maintained
|
|
189
|
+
- No elevated privilege requirements detected
|
|
190
|
+
- Multi-user environment compatibility preserved
|
|
191
|
+
|
|
192
|
+
**Attack Surface Analysis:**
|
|
193
|
+
- **Minimal exposure increase**: Internal library modifications only
|
|
194
|
+
|
|
195
|
+
**Mitigation Strategies:**
|
|
196
|
+
- Validate all external inputs and user-provided data
|
|
197
|
+
- Sanitize file paths and prevent directory traversal
|
|
198
|
+
- Use parameterized queries for any database operations
|
|
199
|
+
- Implement proper error handling to prevent information disclosure
|
|
200
|
+
|
|
201
|
+
### Scientific Computing Environment Security
|
|
202
|
+
**Development Workflow Security:**
|
|
203
|
+
- Git workflow integrity maintained through branch protection
|
|
204
|
+
- Code review requirements enforced for security-sensitive changes
|
|
205
|
+
- Automated testing validates security assumptions
|
|
206
|
+
- Multi-phase development allows incremental security review
|
|
207
|
+
|
|
208
|
+
**CI/CD Pipeline Security:**
|
|
209
|
+
- Automated dependency scanning in development workflow
|
|
210
|
+
- Test environment isolation prevents production data exposure
|
|
211
|
+
- Secrets management for any required credentials
|
|
212
|
+
- Build reproducibility ensures supply chain integrity
|
|
213
|
+
|
|
214
|
+
**Note**: This security assessment covers code-level security only. Data compliance standards are explicitly excluded and not implemented in this system.
|
|
215
|
+
|
|
216
|
+
## 💾 Token Usage Optimization
|
|
217
|
+
|
|
218
|
+
### Current Token Usage Patterns
|
|
219
|
+
**Manual Planning Token Breakdown:**
|
|
220
|
+
- Initial planning discussion: ~800 tokens
|
|
221
|
+
- Value proposition writing: ~600 tokens (moderate plan)
|
|
222
|
+
- Revision and refinement: ~300 tokens
|
|
223
|
+
- Context switching overhead: ~200 tokens
|
|
224
|
+
- **Total current usage: ~1900 tokens per plan**
|
|
225
|
+
|
|
226
|
+
**Inefficiency Sources:**
|
|
227
|
+
- Repetitive manual analysis for similar plan types
|
|
228
|
+
- Context regeneration between planning sessions
|
|
229
|
+
- Inconsistent proposition quality requiring revisions
|
|
230
|
+
|
|
231
|
+
### Optimized Token Usage Strategy
|
|
232
|
+
**Hook-Based Generation Efficiency:**
|
|
233
|
+
- Hook execution and setup: 100 tokens
|
|
234
|
+
- Plan metadata extraction: 50 tokens
|
|
235
|
+
- Content generation coordination: 150 tokens
|
|
236
|
+
- Template insertion and formatting: 75 tokens
|
|
237
|
+
- Optional validation: 50 tokens
|
|
238
|
+
- **Total optimized usage: ~425 tokens per plan**
|
|
239
|
+
|
|
240
|
+
**Token Savings Achieved:**
|
|
241
|
+
- **Manual planning**: 1900 tokens
|
|
242
|
+
- **Automated planning**: 425 tokens
|
|
243
|
+
- **Net savings**: 1475 tokens per plan
|
|
244
|
+
- **Savings percentage**: 78% reduction in token usage
|
|
245
|
+
|
|
246
|
+
**Optimization Techniques:**
|
|
247
|
+
- Programmatic generation eliminates manual analysis
|
|
248
|
+
- Template-based approach ensures consistency
|
|
249
|
+
- Cached calculations reduce redundant computation
|
|
250
|
+
- Structured format enables better context compression
|
|
251
|
+
|
|
252
|
+
## ⏱️ Time Investment Analysis
|
|
253
|
+
|
|
254
|
+
### Implementation Time Breakdown
|
|
255
|
+
**Phase-by-Phase Time Estimates (4 phases):**
|
|
256
|
+
- Planning and design: 2 hours
|
|
257
|
+
- Implementation: 8.0 hours (base: 8, multiplier: 1.0x)
|
|
258
|
+
- Testing and validation: 2 hours
|
|
259
|
+
- Documentation updates: 1 hours
|
|
260
|
+
- **Total estimated time: 13.0 hours**
|
|
261
|
+
|
|
262
|
+
**Confidence Intervals:**
|
|
263
|
+
- Optimistic (80%): 10.4 hours
|
|
264
|
+
- Most likely (100%): 13.0 hours
|
|
265
|
+
- Pessimistic (130%): 16.9 hours
|
|
266
|
+
|
|
267
|
+
### Time Savings Analysis
|
|
268
|
+
**Per-Plan Time Savings:**
|
|
269
|
+
- Manual planning process: 90 minutes
|
|
270
|
+
- Automated hook-based planning: 20 minutes
|
|
271
|
+
- Net savings per plan: 70 minutes (78% reduction)
|
|
272
|
+
|
|
273
|
+
**Long-term Efficiency Gains:**
|
|
274
|
+
- Projected annual plans: 25
|
|
275
|
+
- Annual time savings: 29.2 hours
|
|
276
|
+
- Equivalent to 3.6 additional development days per year
|
|
277
|
+
|
|
278
|
+
### Break-Even Calculation
|
|
279
|
+
**Investment vs. Returns:**
|
|
280
|
+
- One-time development investment: 14 hours
|
|
281
|
+
- Time savings per plan: 1.2 hours
|
|
282
|
+
- Break-even point: 12.0 plans
|
|
283
|
+
|
|
284
|
+
**Payback Timeline:**
|
|
285
|
+
- Estimated monthly plan volume: 2.5 plans
|
|
286
|
+
- Break-even timeline: 4.8 months
|
|
287
|
+
- ROI positive after: ~12 plans
|
|
288
|
+
|
|
289
|
+
## 🎯 Usage & Adoption Metrics
|
|
290
|
+
|
|
291
|
+
### Target Use Cases
|
|
292
|
+
**Primary Applications:**
|
|
293
|
+
- All new plan creation (immediate value through automated generation)
|
|
294
|
+
- Major feature development planning for SolarWindPy modules
|
|
295
|
+
- Scientific project planning requiring systematic value assessment
|
|
296
|
+
|
|
297
|
+
**Secondary Applications:**
|
|
298
|
+
- Existing plan enhancement during major updates
|
|
299
|
+
- Cross-plan value comparison for resource prioritization
|
|
300
|
+
- Quality assurance for plan completeness and consistency
|
|
301
|
+
|
|
302
|
+
### Adoption Strategy
|
|
303
|
+
**Phased Rollout Approach:**
|
|
304
|
+
- **Phase 1**: Pilot with new plans only (Month 1)
|
|
305
|
+
- **Phase 2**: Gradual adoption for all new plans (Months 2-3)
|
|
306
|
+
- **Phase 3**: Full integration and advanced features (Months 4-6)
|
|
307
|
+
|
|
308
|
+
**Success Factors:**
|
|
309
|
+
- Opt-in enhancement reduces resistance
|
|
310
|
+
- Immediate value visible through token savings
|
|
311
|
+
- Backward compatibility maintains existing workflows
|
|
312
|
+
|
|
313
|
+
### Success Metrics
|
|
314
|
+
**Quantitative Metrics:**
|
|
315
|
+
- Enhanced template adoption rate: >80% for new plans
|
|
316
|
+
- Token usage reduction: 60-80% demonstrated
|
|
317
|
+
- Hook execution success rate: >95% reliability
|
|
318
|
+
- Planning time reduction: >60% measured improvement
|
|
319
|
+
|
|
320
|
+
**Qualitative Indicators:**
|
|
321
|
+
- Developers prefer enhanced planning process
|
|
322
|
+
- Plan reviews are more efficient and comprehensive
|
|
323
|
+
- Security considerations are systematically addressed
|
|
324
|
+
|
|
325
|
+
## 📊 Progress Tracking
|
|
326
|
+
|
|
327
|
+
### Overall Status
|
|
328
|
+
- **Phases Completed**: 0/4
|
|
329
|
+
- **Tasks Completed**: 0/24
|
|
330
|
+
- **Time Invested**: 0h of 6-8h
|
|
331
|
+
- **Last Updated**: 2025-08-21
|
|
332
|
+
|
|
333
|
+
### Implementation Notes
|
|
334
|
+
[Running log of implementation decisions, blockers, changes]
|
|
335
|
+
|
|
336
|
+
## 🔗 Related Plans
|
|
337
|
+
- documentation-code-audit (source of over-engineering - will be archived)
|
|
338
|
+
- deployment-semver-pypi-rtd (successful right-sizing example)
|
|
339
|
+
|
|
340
|
+
## 💬 Notes & Considerations
|
|
341
|
+
**Right-Sizing Philosophy:**
|
|
342
|
+
- Scientific packages need proportional tooling complexity
|
|
343
|
+
- 47 examples ≠ 1000+ examples validation requirements
|
|
344
|
+
- Maintenance burden must match team capacity
|
|
345
|
+
- Over-engineering reduces velocity and increases technical debt
|
|
346
|
+
|
|
347
|
+
**Migration Strategy:**
|
|
348
|
+
- Archive over-engineered components (don't delete)
|
|
349
|
+
- Preserve audit trail for learning
|
|
350
|
+
- Focus on essential functionality for scientific documentation
|
|
351
|
+
- Streamline CI/CD for efficiency
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
*This multi-phase plan uses the plan-per-branch architecture where implementation occurs on feature/pr-270-doc-validation-fixes branch with progress tracked via commit checksums across phase files.*
|