ghh1125 commited on
Commit
38eeffe
·
verified ·
1 Parent(s): fad659b

Upload 878 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +5 -0
  2. Dockerfile +18 -0
  3. app.py +45 -0
  4. port.json +5 -0
  5. requirements.txt +11 -0
  6. run_docker.ps1 +26 -0
  7. run_docker.sh +75 -0
  8. sunpy/.DS_Store +0 -0
  9. sunpy/mcp_output/README_MCP.md +136 -0
  10. sunpy/mcp_output/analysis.json +1938 -0
  11. sunpy/mcp_output/diff_report.md +136 -0
  12. sunpy/mcp_output/mcp_plugin/__init__.py +0 -0
  13. sunpy/mcp_output/mcp_plugin/adapter.py +349 -0
  14. sunpy/mcp_output/mcp_plugin/main.py +13 -0
  15. sunpy/mcp_output/mcp_plugin/mcp_service.py +274 -0
  16. sunpy/mcp_output/requirements.txt +11 -0
  17. sunpy/mcp_output/start_mcp.py +30 -0
  18. sunpy/mcp_output/workflow_summary.json +237 -0
  19. sunpy/source/.DS_Store +0 -0
  20. sunpy/source/.circleci/codecov_upload.sh +9 -0
  21. sunpy/source/.circleci/config.yml +117 -0
  22. sunpy/source/.circleci/early_exit.sh +7 -0
  23. sunpy/source/.codecov.yaml +11 -0
  24. sunpy/source/.coveragerc +32 -0
  25. sunpy/source/.cruft.json +39 -0
  26. sunpy/source/.editorconfig +17 -0
  27. sunpy/source/.flake8 +29 -0
  28. sunpy/source/.isort.cfg +17 -0
  29. sunpy/source/.mailmap +244 -0
  30. sunpy/source/.pre-commit-config.yaml +46 -0
  31. sunpy/source/.readthedocs.yaml +31 -0
  32. sunpy/source/.rtd-environment.yml +9 -0
  33. sunpy/source/.ruff.toml +76 -0
  34. sunpy/source/.test_package_pins.txt +2 -0
  35. sunpy/source/.zenodo.json +1046 -0
  36. sunpy/source/CHANGELOG.rst +0 -0
  37. sunpy/source/CITATION.cff +79 -0
  38. sunpy/source/CITATION.rst +55 -0
  39. sunpy/source/LICENSE.rst +25 -0
  40. sunpy/source/MANIFEST.in +26 -0
  41. sunpy/source/README.rst +116 -0
  42. sunpy/source/__init__.py +4 -0
  43. sunpy/source/_typos.toml +34 -0
  44. sunpy/source/asv.conf.json +22 -0
  45. sunpy/source/benchmarks/__init__.py +0 -0
  46. sunpy/source/benchmarks/coordinates.py +85 -0
  47. sunpy/source/benchmarks/map.py +107 -0
  48. sunpy/source/benchmarks/time.py +18 -0
  49. sunpy/source/changelog/8493.bugfix.rst +1 -0
  50. sunpy/source/changelog/8505.doc.rst +1 -0
.gitattributes CHANGED
@@ -33,3 +33,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ sunpy/source/docs/whatsnew/7.0-punch.png filter=lfs diff=lfs merge=lfs -text
37
+ sunpy/source/docs/whatsnew/7.0-suit.png filter=lfs diff=lfs merge=lfs -text
38
+ sunpy/source/sunpy/data/test/sci_xrsf-l2-flx1s_g17_d20201016_truncated.nc filter=lfs diff=lfs merge=lfs -text
39
+ sunpy/source/sunpy/data/test/solo_L2_epd-ept-north-hcad_20200713_V02.cdf filter=lfs diff=lfs merge=lfs -text
40
+ sunpy/source/sunpy/data/test/test_ana.fz filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.10
2
+
3
+ RUN useradd -m -u 1000 user && python -m pip install --upgrade pip
4
+ USER user
5
+ ENV PATH="/home/user/.local/bin:$PATH"
6
+
7
+ WORKDIR /app
8
+
9
+ COPY --chown=user ./requirements.txt requirements.txt
10
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
11
+
12
+ COPY --chown=user . /app
13
+ ENV MCP_TRANSPORT=http
14
+ ENV MCP_PORT=7860
15
+
16
+ EXPOSE 7860
17
+
18
+ CMD ["python", "sunpy/mcp_output/start_mcp.py"]
app.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ import os
3
+ import sys
4
+
5
+ mcp_plugin_path = os.path.join(os.path.dirname(__file__), "sunpy", "mcp_output", "mcp_plugin")
6
+ sys.path.insert(0, mcp_plugin_path)
7
+
8
+ app = FastAPI(
9
+ title="Sunpy MCP Service",
10
+ description="Auto-generated MCP service for sunpy",
11
+ version="1.0.0"
12
+ )
13
+
14
+ @app.get("/")
15
+ def root():
16
+ return {
17
+ "service": "Sunpy MCP Service",
18
+ "version": "1.0.0",
19
+ "status": "running",
20
+ "transport": os.environ.get("MCP_TRANSPORT", "http")
21
+ }
22
+
23
+ @app.get("/health")
24
+ def health_check():
25
+ return {"status": "healthy", "service": "sunpy MCP"}
26
+
27
+ @app.get("/tools")
28
+ def list_tools():
29
+ try:
30
+ from mcp_service import create_app
31
+ mcp_app = create_app()
32
+ tools = []
33
+ for tool_name, tool_func in mcp_app.tools.items():
34
+ tools.append({
35
+ "name": tool_name,
36
+ "description": tool_func.__doc__ or "No description available"
37
+ })
38
+ return {"tools": tools}
39
+ except Exception as e:
40
+ return {"error": f"Failed to load tools: {str(e)}"}
41
+
42
+ if __name__ == "__main__":
43
+ import uvicorn
44
+ port = int(os.environ.get("PORT", 7860))
45
+ uvicorn.run(app, host="0.0.0.0", port=port)
port.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "repo": "sunpy",
3
+ "port": 7989,
4
+ "timestamp": 1773267827
5
+ }
requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fastmcp
2
+ fastapi
3
+ uvicorn[standard]
4
+ pydantic>=2.0.0
5
+ astropy>=6.1.0
6
+ fsspec>=2023.6.0
7
+ numpy>=1.26.0
8
+ packaging>=23.2
9
+ parfive[ftp]>=2.1.0
10
+ pyerfa>=2.0.1.1
11
+ requests>=2.32.1
run_docker.ps1 ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cd $PSScriptRoot
2
+ $ErrorActionPreference = "Stop"
3
+ $entryName = if ($env:MCP_ENTRY_NAME) { $env:MCP_ENTRY_NAME } else { "sunpy" }
4
+ $entryUrl = if ($env:MCP_ENTRY_URL) { $env:MCP_ENTRY_URL } else { "http://localhost:7989/mcp" }
5
+ $imageName = if ($env:MCP_IMAGE_NAME) { $env:MCP_IMAGE_NAME } else { "sunpy-mcp" }
6
+ $mcpDir = Join-Path $env:USERPROFILE ".cursor"
7
+ $mcpPath = Join-Path $mcpDir "mcp.json"
8
+ if (!(Test-Path $mcpDir)) { New-Item -ItemType Directory -Path $mcpDir | Out-Null }
9
+ $config = @{}
10
+ if (Test-Path $mcpPath) {
11
+ try { $config = Get-Content $mcpPath -Raw | ConvertFrom-Json } catch { $config = @{} }
12
+ }
13
+ $serversOrdered = [ordered]@{}
14
+ if ($config -and ($config.PSObject.Properties.Name -contains "mcpServers") -and $config.mcpServers) {
15
+ $existing = $config.mcpServers
16
+ if ($existing -is [pscustomobject]) {
17
+ foreach ($p in $existing.PSObject.Properties) { if ($p.Name -ne $entryName) { $serversOrdered[$p.Name] = $p.Value } }
18
+ } elseif ($existing -is [System.Collections.IDictionary]) {
19
+ foreach ($k in $existing.Keys) { if ($k -ne $entryName) { $serversOrdered[$k] = $existing[$k] } }
20
+ }
21
+ }
22
+ $serversOrdered[$entryName] = @{ url = $entryUrl }
23
+ $config = @{ mcpServers = $serversOrdered }
24
+ $config | ConvertTo-Json -Depth 10 | Set-Content -Path $mcpPath -Encoding UTF8
25
+ docker build -t $imageName .
26
+ docker run --rm -p 7989:7860 $imageName
run_docker.sh ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ cd "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
4
+ mcp_entry_name="${MCP_ENTRY_NAME:-sunpy}"
5
+ mcp_entry_url="${MCP_ENTRY_URL:-http://localhost:7989/mcp}"
6
+ mcp_dir="${HOME}/.cursor"
7
+ mcp_path="${mcp_dir}/mcp.json"
8
+ mkdir -p "${mcp_dir}"
9
+ if command -v python3 >/dev/null 2>&1; then
10
+ python3 - "${mcp_path}" "${mcp_entry_name}" "${mcp_entry_url}" <<'PY'
11
+ import json, os, sys
12
+ path, name, url = sys.argv[1:4]
13
+ cfg = {"mcpServers": {}}
14
+ if os.path.exists(path):
15
+ try:
16
+ with open(path, "r", encoding="utf-8") as f:
17
+ cfg = json.load(f)
18
+ except Exception:
19
+ cfg = {"mcpServers": {}}
20
+ if not isinstance(cfg, dict):
21
+ cfg = {"mcpServers": {}}
22
+ servers = cfg.get("mcpServers")
23
+ if not isinstance(servers, dict):
24
+ servers = {}
25
+ ordered = {}
26
+ for k, v in servers.items():
27
+ if k != name:
28
+ ordered[k] = v
29
+ ordered[name] = {"url": url}
30
+ cfg = {"mcpServers": ordered}
31
+ with open(path, "w", encoding="utf-8") as f:
32
+ json.dump(cfg, f, indent=2, ensure_ascii=False)
33
+ PY
34
+ elif command -v python >/dev/null 2>&1; then
35
+ python - "${mcp_path}" "${mcp_entry_name}" "${mcp_entry_url}" <<'PY'
36
+ import json, os, sys
37
+ path, name, url = sys.argv[1:4]
38
+ cfg = {"mcpServers": {}}
39
+ if os.path.exists(path):
40
+ try:
41
+ with open(path, "r", encoding="utf-8") as f:
42
+ cfg = json.load(f)
43
+ except Exception:
44
+ cfg = {"mcpServers": {}}
45
+ if not isinstance(cfg, dict):
46
+ cfg = {"mcpServers": {}}
47
+ servers = cfg.get("mcpServers")
48
+ if not isinstance(servers, dict):
49
+ servers = {}
50
+ ordered = {}
51
+ for k, v in servers.items():
52
+ if k != name:
53
+ ordered[k] = v
54
+ ordered[name] = {"url": url}
55
+ cfg = {"mcpServers": ordered}
56
+ with open(path, "w", encoding="utf-8") as f:
57
+ json.dump(cfg, f, indent=2, ensure_ascii=False)
58
+ PY
59
+ elif command -v jq >/dev/null 2>&1; then
60
+ name="${mcp_entry_name}"; url="${mcp_entry_url}"
61
+ if [ -f "${mcp_path}" ]; then
62
+ tmp="$(mktemp)"
63
+ jq --arg name "$name" --arg url "$url" '
64
+ .mcpServers = (.mcpServers // {})
65
+ | .mcpServers as $s
66
+ | ($s | with_entries(select(.key != $name))) as $base
67
+ | .mcpServers = ($base + {($name): {"url": $url}})
68
+ ' "${mcp_path}" > "${tmp}" && mv "${tmp}" "${mcp_path}"
69
+ else
70
+ printf '{ "mcpServers": { "%s": { "url": "%s" } } }
71
+ ' "$name" "$url" > "${mcp_path}"
72
+ fi
73
+ fi
74
+ docker build -t sunpy-mcp .
75
+ docker run --rm -p 7989:7860 sunpy-mcp
sunpy/.DS_Store ADDED
Binary file (6.15 kB). View file
 
sunpy/mcp_output/README_MCP.md ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SunPy MCP (Model Context Protocol) Service README
2
+
3
+ ## 1) Project Introduction
4
+
5
+ This MCP (Model Context Protocol) service provides a practical interface to core SunPy capabilities for solar/space-science workflows, including:
6
+
7
+ - Data search and download (Fido-based)
8
+ - Solar map loading and processing
9
+ - Time series loading and analysis
10
+ - Time parsing and time-range normalization
11
+ - Solar ephemeris calculations
12
+ - Coordinate frame conversion helpers
13
+
14
+ It is designed for agent/tooling scenarios where users need reliable, scriptable access to SunPy’s high-value APIs without navigating the full library surface.
15
+
16
+ ---
17
+
18
+ ## 2) Installation Method
19
+
20
+ ### Requirements
21
+
22
+ Core dependencies (minimum):
23
+ - numpy
24
+ - astropy
25
+ - packaging
26
+
27
+ Common optional dependencies (recommended for full features):
28
+ - matplotlib, reproject, parfive
29
+ - drms, zeep
30
+ - asdf, scipy, pandas
31
+ - aiohttp, h5py
32
+
33
+ ### Install commands
34
+
35
+ - Install SunPy:
36
+ pip install sunpy
37
+
38
+ - Install commonly used optional extras manually (example):
39
+ pip install matplotlib reproject parfive drms zeep asdf scipy pandas aiohttp h5py
40
+
41
+ If you package this as a standalone MCP (Model Context Protocol) service, include SunPy and optional dependencies in your service environment image or lockfile.
42
+
43
+ ---
44
+
45
+ ## 3) Quick Start
46
+
47
+ ### A. Parse time and build time ranges
48
+ Use `sunpy.time.parse_time` and `sunpy.time.TimeRange` to normalize user input before any data query.
49
+
50
+ ### B. Search and fetch data
51
+ Use `sunpy.net.Fido` with `sunpy.net.attrs` filters (time/instrument/provider, etc.) to perform discovery and downloads.
52
+
53
+ ### C. Load maps
54
+ Use `sunpy.map.Map` (factory path via `MapFactory`) to ingest FITS/JP2 and other supported map formats into `GenericMap` objects.
55
+
56
+ ### D. Load time series
57
+ Use `sunpy.timeseries.TimeSeries` (factory path via `TimeSeriesFactory`) to build `GenericTimeSeries` objects from supported sources/files.
58
+
59
+ ### E. Solar geometry utilities
60
+ Use `sunpy.coordinates.sun` helpers such as:
61
+ - `angular_radius`
62
+ - `B0`, `L0`, `P`
63
+ - `carrington_rotation_number`
64
+
65
+ These are good stateless MCP (Model Context Protocol) tools for fast derived metadata.
66
+
67
+ ---
68
+
69
+ ## 4) Available Tools and Endpoints List
70
+
71
+ Recommended MCP (Model Context Protocol) service endpoints:
72
+
73
+ - `time.parse`
74
+ - Parse/validate user time input into canonical format.
75
+
76
+ - `time.range.create`
77
+ - Build a `TimeRange` from start/end or start/duration.
78
+
79
+ - `solar.ephemeris.compute`
80
+ - Return solar geometry values (`B0`, `L0`, `P`, angular radius, Carrington rotation number).
81
+
82
+ - `data.search`
83
+ - Query remote archives via Fido using attrs-based filters.
84
+
85
+ - `data.fetch`
86
+ - Download query results to local cache/work directory.
87
+
88
+ - `map.load`
89
+ - Load map file(s) into SunPy map objects.
90
+
91
+ - `map.inspect`
92
+ - Return map metadata/WCS summary (instrument, wavelength, date, observer, scale, dimensions).
93
+
94
+ - `map.operations`
95
+ - Common actions: submap, resample, rotate, reprojection hooks (if dependencies installed).
96
+
97
+ - `timeseries.load`
98
+ - Load time-series source/file into `GenericTimeSeries`.
99
+
100
+ - `timeseries.inspect`
101
+ - Return columns, units, time coverage, and basic stats.
102
+
103
+ ---
104
+
105
+ ## 5) Common Issues and Notes
106
+
107
+ - Optional dependency gaps:
108
+ Some features silently require extra packages (e.g., `reproject`, `drms`, `zeep`, `asdf`). Validate availability at startup and expose capability flags.
109
+
110
+ - Remote service variability:
111
+ Network/data-provider endpoints can be slow or unavailable. Implement retries, timeouts, and clear error mapping in service responses.
112
+
113
+ - Data volume/performance:
114
+ Map and time-series workflows can be memory-heavy. Prefer bounded queries (shorter time ranges, targeted instruments) and streaming download patterns.
115
+
116
+ - Environment consistency:
117
+ Pin SunPy + Astropy versions in production to avoid behavior drift across coordinate/time handling.
118
+
119
+ - Cache behavior:
120
+ SunPy download/caching behavior should be documented for operators (cache location, cleanup strategy, retention policy).
121
+
122
+ - No built-in CLI entrypoints:
123
+ This repository is library-first; your MCP (Model Context Protocol) service should define its own transport/server entrypoint.
124
+
125
+ ---
126
+
127
+ ## 6) Reference Links or Documentation
128
+
129
+ - Repository: https://github.com/sunpy/sunpy
130
+ - SunPy documentation: https://docs.sunpy.org
131
+ - SunPy Net/Fido docs: https://docs.sunpy.org/en/stable/guide/acquiring_data/index.html
132
+ - SunPy Map docs: https://docs.sunpy.org/en/stable/guide/map/index.html
133
+ - SunPy TimeSeries docs: https://docs.sunpy.org/en/stable/guide/timeseries/index.html
134
+ - SunPy Coordinates docs: https://docs.sunpy.org/en/stable/guide/coordinates/index.html
135
+
136
+ If needed, I can also generate a production-ready version with explicit JSON tool schemas (request/response fields) for each MCP (Model Context Protocol) endpoint.
sunpy/mcp_output/analysis.json ADDED
@@ -0,0 +1,1938 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "summary": {
3
+ "repository_url": "https://github.com/sunpy/sunpy",
4
+ "summary": "Imported via zip fallback, file count: 582",
5
+ "file_tree": {
6
+ ".circleci/config.yml": {
7
+ "size": 3761
8
+ },
9
+ ".codecov.yaml": {
10
+ "size": 155
11
+ },
12
+ ".cruft.json": {
13
+ "size": 1469
14
+ },
15
+ ".github/dependabot.yml": {
16
+ "size": 119
17
+ },
18
+ ".github/workflows/asv-regular.yml": {
19
+ "size": 2012
20
+ },
21
+ ".github/workflows/ci.yml": {
22
+ "size": 5163
23
+ },
24
+ ".github/workflows/ci_benchmarks.yml": {
25
+ "size": 1776
26
+ },
27
+ ".github/workflows/cron.yml": {
28
+ "size": 4549
29
+ },
30
+ ".github/workflows/label_sync.yml": {
31
+ "size": 704
32
+ },
33
+ ".github/workflows/scheduled_builds.yml": {
34
+ "size": 1566
35
+ },
36
+ ".github/workflows/stale_bot.yml": {
37
+ "size": 1756
38
+ },
39
+ ".github/workflows/sub_package_update.yml": {
40
+ "size": 5945
41
+ },
42
+ ".isort.cfg": {
43
+ "size": 424
44
+ },
45
+ ".pre-commit-config.yaml": {
46
+ "size": 1408
47
+ },
48
+ ".readthedocs.yaml": {
49
+ "size": 520
50
+ },
51
+ ".rtd-environment.yml": {
52
+ "size": 135
53
+ },
54
+ ".ruff.toml": {
55
+ "size": 2147
56
+ },
57
+ ".test_package_pins.txt": {
58
+ "size": 112
59
+ },
60
+ ".zenodo.json": {
61
+ "size": 30873
62
+ },
63
+ "_typos.toml": {
64
+ "size": 428
65
+ },
66
+ "asv.conf.json": {
67
+ "size": 658
68
+ },
69
+ "benchmarks/__init__.py": {
70
+ "size": 0
71
+ },
72
+ "benchmarks/coordinates.py": {
73
+ "size": 2957
74
+ },
75
+ "benchmarks/map.py": {
76
+ "size": 3218
77
+ },
78
+ "benchmarks/time.py": {
79
+ "size": 308
80
+ },
81
+ "docs/conf.py": {
82
+ "size": 17629
83
+ },
84
+ "docs/reference/sunpy_stability.yaml": {
85
+ "size": 1234
86
+ },
87
+ "docs/robots.txt": {
88
+ "size": 208
89
+ },
90
+ "examples/README.txt": {
91
+ "size": 444
92
+ },
93
+ "examples/acquiring_data/README.txt": {
94
+ "size": 92
95
+ },
96
+ "examples/acquiring_data/downloading_cutouts.py": {
97
+ "size": 2741
98
+ },
99
+ "examples/acquiring_data/fido_metadata_queries.py": {
100
+ "size": 2730
101
+ },
102
+ "examples/acquiring_data/querying_and_loading_SHARP_data.py": {
103
+ "size": 1758
104
+ },
105
+ "examples/acquiring_data/querying_the_GOES_event_list.py": {
106
+ "size": 2884
107
+ },
108
+ "examples/acquiring_data/search_cdaweb.py": {
109
+ "size": 1670
110
+ },
111
+ "examples/computer_vision_techniques/README.txt": {
112
+ "size": 122
113
+ },
114
+ "examples/computer_vision_techniques/finding_masking_bright_pixels.py": {
115
+ "size": 2050
116
+ },
117
+ "examples/computer_vision_techniques/loop_edge_enhance.py": {
118
+ "size": 1540
119
+ },
120
+ "examples/computer_vision_techniques/mask_disk.py": {
121
+ "size": 1714
122
+ },
123
+ "examples/computer_vision_techniques/off_limb_enhance.py": {
124
+ "size": 3277
125
+ },
126
+ "examples/differential_rotation/README.txt": {
127
+ "size": 201
128
+ },
129
+ "examples/differential_rotation/comparing_rotation_models.py": {
130
+ "size": 3532
131
+ },
132
+ "examples/differential_rotation/differentially_rotated_coordinate.py": {
133
+ "size": 2494
134
+ },
135
+ "examples/differential_rotation/differentially_rotated_gridlines.py": {
136
+ "size": 2153
137
+ },
138
+ "examples/differential_rotation/reprojected_map.py": {
139
+ "size": 3682
140
+ },
141
+ "examples/map/README.txt": {
142
+ "size": 57
143
+ },
144
+ "examples/map/brightness_pixel_location.py": {
145
+ "size": 1048
146
+ },
147
+ "examples/map/compare_rotation_results.py": {
148
+ "size": 3002
149
+ },
150
+ "examples/map/composite_map_AIA_HMI.py": {
151
+ "size": 2108
152
+ },
153
+ "examples/map/difference_images.py": {
154
+ "size": 3818
155
+ },
156
+ "examples/map/hmi_contours_wcsaxes.py": {
157
+ "size": 3934
158
+ },
159
+ "examples/map/image_bright_regions_gallery_example.py": {
160
+ "size": 2984
161
+ },
162
+ "examples/map/lasco_mask.py": {
163
+ "size": 2668
164
+ },
165
+ "examples/map/map_contouring.py": {
166
+ "size": 1312
167
+ },
168
+ "examples/map/map_data_histogram.py": {
169
+ "size": 2648
170
+ },
171
+ "examples/map/map_from_numpy_array.py": {
172
+ "size": 2057
173
+ },
174
+ "examples/map/map_metadata_modification.py": {
175
+ "size": 1647
176
+ },
177
+ "examples/map/map_resampling_and_superpixels.py": {
178
+ "size": 1930
179
+ },
180
+ "examples/map/map_rotation.py": {
181
+ "size": 1057
182
+ },
183
+ "examples/map/map_segment.py": {
184
+ "size": 4745
185
+ },
186
+ "examples/map/masking_hmi.py": {
187
+ "size": 4521
188
+ },
189
+ "examples/map/plot_frameless_image.py": {
190
+ "size": 1322
191
+ },
192
+ "examples/map/submaps_and_cropping.py": {
193
+ "size": 1248
194
+ },
195
+ "examples/map/track_active_region.py": {
196
+ "size": 3470
197
+ },
198
+ "examples/map_transformations/README.txt": {
199
+ "size": 158
200
+ },
201
+ "examples/map_transformations/autoalign_aia_hmi.py": {
202
+ "size": 2899
203
+ },
204
+ "examples/map_transformations/projection_custom_origin.py": {
205
+ "size": 3595
206
+ },
207
+ "examples/map_transformations/reprojection_aia_euvi_mosaic.py": {
208
+ "size": 7454
209
+ },
210
+ "examples/map_transformations/reprojection_align_aia_hmi.py": {
211
+ "size": 3321
212
+ },
213
+ "examples/map_transformations/reprojection_auto_extent.py": {
214
+ "size": 3474
215
+ },
216
+ "examples/map_transformations/reprojection_carrington.py": {
217
+ "size": 1882
218
+ },
219
+ "examples/map_transformations/reprojection_different_observers.py": {
220
+ "size": 5567
221
+ },
222
+ "examples/map_transformations/reprojection_helioprojective_radial.py": {
223
+ "size": 3888
224
+ },
225
+ "examples/map_transformations/reprojection_spherical_screen.py": {
226
+ "size": 3685
227
+ },
228
+ "examples/map_transformations/upside_down_hmi.py": {
229
+ "size": 1619
230
+ },
231
+ "examples/plotting/AIA_HMI_composite.py": {
232
+ "size": 2322
233
+ },
234
+ "examples/plotting/README.txt": {
235
+ "size": 64
236
+ },
237
+ "examples/plotting/adding_earth.py": {
238
+ "size": 3300
239
+ },
240
+ "examples/plotting/aia_example.py": {
241
+ "size": 1306
242
+ },
243
+ "examples/plotting/draw_wcs_extent.py": {
244
+ "size": 1772
245
+ },
246
+ "examples/plotting/fading_between_maps.py": {
247
+ "size": 1877
248
+ },
249
+ "examples/plotting/finding_local_peaks_in_solar_data.py": {
250
+ "size": 3128
251
+ },
252
+ "examples/plotting/finegrained_plot.py": {
253
+ "size": 2741
254
+ },
255
+ "examples/plotting/great_arc_example.py": {
256
+ "size": 2127
257
+ },
258
+ "examples/plotting/grid_plotting.py": {
259
+ "size": 1458
260
+ },
261
+ "examples/plotting/hmi_synoptic_maps.py": {
262
+ "size": 1464
263
+ },
264
+ "examples/plotting/lasco_overlay.py": {
265
+ "size": 3042
266
+ },
267
+ "examples/plotting/lat_lon_lines.py": {
268
+ "size": 2567
269
+ },
270
+ "examples/plotting/limb_plotting.py": {
271
+ "size": 1632
272
+ },
273
+ "examples/plotting/magnetogram_active_regions.py": {
274
+ "size": 2349
275
+ },
276
+ "examples/plotting/map_editcolormap.py": {
277
+ "size": 1530
278
+ },
279
+ "examples/plotting/masked_composite_plot.py": {
280
+ "size": 2530
281
+ },
282
+ "examples/plotting/offdisk_contours.py": {
283
+ "size": 3220
284
+ },
285
+ "examples/plotting/overplot_hek_polygon.py": {
286
+ "size": 2385
287
+ },
288
+ "examples/plotting/plot_equator_prime_meridian.py": {
289
+ "size": 1870
290
+ },
291
+ "examples/plotting/plot_rotated_rectangle.py": {
292
+ "size": 2016
293
+ },
294
+ "examples/plotting/plotting_blank_map.py": {
295
+ "size": 2852
296
+ },
297
+ "examples/plotting/quadrangle.py": {
298
+ "size": 1937
299
+ },
300
+ "examples/plotting/screen_blend_mode.py": {
301
+ "size": 3322
302
+ },
303
+ "examples/plotting/simple_differential_rotation.py": {
304
+ "size": 3038
305
+ },
306
+ "examples/plotting/solar_cycle_example.py": {
307
+ "size": 2448
308
+ },
309
+ "examples/plotting/sunpy_matplotlib_colormap.py": {
310
+ "size": 1343
311
+ },
312
+ "examples/plotting/three_map_composite.py": {
313
+ "size": 2726
314
+ },
315
+ "examples/plotting/wcsaxes_map_example.py": {
316
+ "size": 2368
317
+ },
318
+ "examples/plotting/wcsaxes_plotting_example.py": {
319
+ "size": 3795
320
+ },
321
+ "examples/plotting/xy_lims.py": {
322
+ "size": 2433
323
+ },
324
+ "examples/saving_and_loading_data/README.txt": {
325
+ "size": 85
326
+ },
327
+ "examples/saving_and_loading_data/coordinates_in_asdf.py": {
328
+ "size": 3671
329
+ },
330
+ "examples/saving_and_loading_data/genericmap_in_asdf.py": {
331
+ "size": 2048
332
+ },
333
+ "examples/saving_and_loading_data/genericmap_in_fits.py": {
334
+ "size": 2037
335
+ },
336
+ "examples/saving_and_loading_data/load_adapt_fits_into_map.py": {
337
+ "size": 3001
338
+ },
339
+ "examples/showcase/README.txt": {
340
+ "size": 86
341
+ },
342
+ "examples/showcase/eclipse_amount.py": {
343
+ "size": 3578
344
+ },
345
+ "examples/showcase/hmi_cutout.py": {
346
+ "size": 5003
347
+ },
348
+ "examples/showcase/los_simulation_box_intersection.py": {
349
+ "size": 11141
350
+ },
351
+ "examples/showcase/stereoscopic_3d.py": {
352
+ "size": 4805
353
+ },
354
+ "examples/showcase/time_distance.py": {
355
+ "size": 8025
356
+ },
357
+ "examples/showcase/where_is_stereo.py": {
358
+ "size": 6615
359
+ },
360
+ "examples/time_series/README.txt": {
361
+ "size": 71
362
+ },
363
+ "examples/time_series/goes_hek_m25.py": {
364
+ "size": 1836
365
+ },
366
+ "examples/time_series/goes_xrs_example.py": {
367
+ "size": 6581
368
+ },
369
+ "examples/time_series/goes_xrs_nrt_data.py": {
370
+ "size": 4199
371
+ },
372
+ "examples/time_series/power_spectra_example.py": {
373
+ "size": 1470
374
+ },
375
+ "examples/time_series/timeseries_convolution_filter.py": {
376
+ "size": 1631
377
+ },
378
+ "examples/time_series/timeseries_example.py": {
379
+ "size": 7506
380
+ },
381
+ "examples/time_series/timeseries_peak_finding.py": {
382
+ "size": 3818
383
+ },
384
+ "examples/time_series/timeseriesmetadata_example.py": {
385
+ "size": 4471
386
+ },
387
+ "examples/units_and_coordinates/AIA_limb_STEREO.py": {
388
+ "size": 3198
389
+ },
390
+ "examples/units_and_coordinates/AltAz_Coordinate_transform.py": {
391
+ "size": 2019
392
+ },
393
+ "examples/units_and_coordinates/ParkerSolarProbe_trajectory.py": {
394
+ "size": 3400
395
+ },
396
+ "examples/units_and_coordinates/README.txt": {
397
+ "size": 138
398
+ },
399
+ "examples/units_and_coordinates/SDO_to_STEREO_Coordinate_Conversion.py": {
400
+ "size": 4948
401
+ },
402
+ "examples/units_and_coordinates/STEREO_SECCHI_starfield.py": {
403
+ "size": 5532
404
+ },
405
+ "examples/units_and_coordinates/getting_lasco_observer_location.py": {
406
+ "size": 4373
407
+ },
408
+ "examples/units_and_coordinates/getting_observer_location.py": {
409
+ "size": 2164
410
+ },
411
+ "examples/units_and_coordinates/map_slit_extraction.py": {
412
+ "size": 2488
413
+ },
414
+ "examples/units_and_coordinates/north_offset_frame.py": {
415
+ "size": 1639
416
+ },
417
+ "examples/units_and_coordinates/planet_locations.py": {
418
+ "size": 1281
419
+ },
420
+ "examples/units_and_coordinates/radec_to_hpc_map.py": {
421
+ "size": 8406
422
+ },
423
+ "examples/units_and_coordinates/spice.py": {
424
+ "size": 7659
425
+ },
426
+ "examples/units_and_coordinates/venus_transit.py": {
427
+ "size": 2115
428
+ },
429
+ "pyproject.toml": {
430
+ "size": 7305
431
+ },
432
+ "pytest.ini": {
433
+ "size": 3288
434
+ },
435
+ "sunpy-dev-env.yml": {
436
+ "size": 1285
437
+ },
438
+ "sunpy/__init__.py": {
439
+ "size": 1298
440
+ },
441
+ "sunpy/_dev/__init__.py": {
442
+ "size": 189
443
+ },
444
+ "sunpy/_dev/scm_version.py": {
445
+ "size": 426
446
+ },
447
+ "sunpy/conftest.py": {
448
+ "size": 6325
449
+ },
450
+ "sunpy/coordinates/__init__.py": {
451
+ "size": 1090
452
+ },
453
+ "sunpy/coordinates/_transformations.py": {
454
+ "size": 62254
455
+ },
456
+ "sunpy/coordinates/data/igrf13coeffs.txt": {
457
+ "size": 40639
458
+ },
459
+ "sunpy/coordinates/ephemeris.py": {
460
+ "size": 17679
461
+ },
462
+ "sunpy/coordinates/frameattributes.py": {
463
+ "size": 5690
464
+ },
465
+ "sunpy/coordinates/frames.py": {
466
+ "size": 47746
467
+ },
468
+ "sunpy/coordinates/metaframes.py": {
469
+ "size": 10713
470
+ },
471
+ "sunpy/coordinates/offset_frame.py": {
472
+ "size": 2365
473
+ },
474
+ "sunpy/coordinates/screens.py": {
475
+ "size": 14451
476
+ },
477
+ "sunpy/coordinates/spice.py": {
478
+ "size": 22488
479
+ },
480
+ "sunpy/coordinates/sun.py": {
481
+ "size": 31541
482
+ },
483
+ "sunpy/coordinates/tests/__init__.py": {
484
+ "size": 0
485
+ },
486
+ "sunpy/coordinates/tests/conftest.py": {
487
+ "size": 335
488
+ },
489
+ "sunpy/coordinates/tests/helpers.py": {
490
+ "size": 498
491
+ },
492
+ "sunpy/coordinates/tests/strategies.py": {
493
+ "size": 1391
494
+ },
495
+ "sunpy/coordinates/tests/test_ephemeris.py": {
496
+ "size": 7807
497
+ },
498
+ "sunpy/coordinates/tests/test_frameattributes.py": {
499
+ "size": 6649
500
+ },
501
+ "sunpy/coordinates/tests/test_frames.py": {
502
+ "size": 27190
503
+ },
504
+ "sunpy/coordinates/tests/test_metaframes.py": {
505
+ "size": 12672
506
+ },
507
+ "sunpy/coordinates/tests/test_offset_frame.py": {
508
+ "size": 2005
509
+ },
510
+ "sunpy/coordinates/tests/test_spice.py": {
511
+ "size": 10391
512
+ },
513
+ "sunpy/coordinates/tests/test_sun.py": {
514
+ "size": 25935
515
+ },
516
+ "sunpy/coordinates/tests/test_transformations.py": {
517
+ "size": 55280
518
+ },
519
+ "sunpy/coordinates/tests/test_utils.py": {
520
+ "size": 18750
521
+ },
522
+ "sunpy/coordinates/tests/test_wcs_utils.py": {
523
+ "size": 12972
524
+ },
525
+ "sunpy/coordinates/utils.py": {
526
+ "size": 22630
527
+ },
528
+ "sunpy/coordinates/wcs_utils.py": {
529
+ "size": 7562
530
+ },
531
+ "sunpy/data/__init__.py": {
532
+ "size": 937
533
+ },
534
+ "sunpy/data/_sample.py": {
535
+ "size": 7190
536
+ },
537
+ "sunpy/data/data_manager/__init__.py": {
538
+ "size": 301
539
+ },
540
+ "sunpy/data/data_manager/cache.py": {
541
+ "size": 5879
542
+ },
543
+ "sunpy/data/data_manager/downloader.py": {
544
+ "size": 1438
545
+ },
546
+ "sunpy/data/data_manager/manager.py": {
547
+ "size": 7297
548
+ },
549
+ "sunpy/data/data_manager/storage.py": {
550
+ "size": 4753
551
+ },
552
+ "sunpy/data/data_manager/tests/__init__.py": {
553
+ "size": 0
554
+ },
555
+ "sunpy/data/data_manager/tests/conftest.py": {
556
+ "size": 2743
557
+ },
558
+ "sunpy/data/data_manager/tests/mocks.py": {
559
+ "size": 636
560
+ },
561
+ "sunpy/data/data_manager/tests/test_cache.py": {
562
+ "size": 3444
563
+ },
564
+ "sunpy/data/data_manager/tests/test_downloader.py": {
565
+ "size": 696
566
+ },
567
+ "sunpy/data/data_manager/tests/test_manager.py": {
568
+ "size": 8935
569
+ },
570
+ "sunpy/data/data_manager/tests/test_storage.py": {
571
+ "size": 1220
572
+ },
573
+ "sunpy/data/sample.py": {
574
+ "size": 2144
575
+ },
576
+ "sunpy/data/test/EVE_L0CS_DIODES_1m_truncated.txt": {
577
+ "size": 4159
578
+ },
579
+ "sunpy/data/test/SRS/19960106SRS.txt": {
580
+ "size": 719
581
+ },
582
+ "sunpy/data/test/SRS/19960430SRS.txt": {
583
+ "size": 604
584
+ },
585
+ "sunpy/data/test/SRS/19960513SRS.txt": {
586
+ "size": 695
587
+ },
588
+ "sunpy/data/test/SRS/20000922SRS.txt": {
589
+ "size": 1223
590
+ },
591
+ "sunpy/data/test/SRS/20000927SRS.txt": {
592
+ "size": 1289
593
+ },
594
+ "sunpy/data/test/SRS/20001001SRS.txt": {
595
+ "size": 1315
596
+ },
597
+ "sunpy/data/test/SRS/20020624SRS.txt": {
598
+ "size": 1776
599
+ },
600
+ "sunpy/data/test/SRS/20020628SRS.txt": {
601
+ "size": 1704
602
+ },
603
+ "sunpy/data/test/SRS/20100621SRS.txt": {
604
+ "size": 662
605
+ },
606
+ "sunpy/data/test/SRS/20150101SRS.txt": {
607
+ "size": 862
608
+ },
609
+ "sunpy/data/test/SRS/20150306SRS.txt": {
610
+ "size": 668
611
+ },
612
+ "sunpy/data/test/SRS/20150906SRS.txt": {
613
+ "size": 697
614
+ },
615
+ "sunpy/data/test/__init__.py": {
616
+ "size": 5101
617
+ },
618
+ "sunpy/data/test/_generate_asdf_test.py": {
619
+ "size": 657
620
+ },
621
+ "sunpy/data/test/eve/eve_01.txt": {
622
+ "size": 4159
623
+ },
624
+ "sunpy/data/test/eve/eve_02.txt": {
625
+ "size": 4159
626
+ },
627
+ "sunpy/data/test/eve/eve_03.txt": {
628
+ "size": 4159
629
+ },
630
+ "sunpy/data/test/eve/eve_04.txt": {
631
+ "size": 4159
632
+ },
633
+ "sunpy/data/test/eve/eve_05.txt": {
634
+ "size": 4159
635
+ },
636
+ "sunpy/data/test/observed-solar-cycle-indices-truncated.json": {
637
+ "size": 1561
638
+ },
639
+ "sunpy/data/test/predicted-solar-cycle-truncated.json": {
640
+ "size": 1287
641
+ },
642
+ "sunpy/data/test/waveunit/__init__.py": {
643
+ "size": 333
644
+ },
645
+ "sunpy/data/tests/__init__.py": {
646
+ "size": 0
647
+ },
648
+ "sunpy/data/tests/test_sample.py": {
649
+ "size": 875
650
+ },
651
+ "sunpy/extern/__init__.py": {
652
+ "size": 281
653
+ },
654
+ "sunpy/extern/appdirs.py": {
655
+ "size": 24719
656
+ },
657
+ "sunpy/extern/appdirs_license.txt": {
658
+ "size": 1097
659
+ },
660
+ "sunpy/extern/distro.py": {
661
+ "size": 49430
662
+ },
663
+ "sunpy/extern/inflect.py": {
664
+ "size": 102537
665
+ },
666
+ "sunpy/extern/inflect_license.txt": {
667
+ "size": 1050
668
+ },
669
+ "sunpy/extern/parse.py": {
670
+ "size": 35530
671
+ },
672
+ "sunpy/extern/parse_license.txt": {
673
+ "size": 1085
674
+ },
675
+ "sunpy/image/__init__.py": {
676
+ "size": 126
677
+ },
678
+ "sunpy/image/resample.py": {
679
+ "size": 8079
680
+ },
681
+ "sunpy/image/tests/__init__.py": {
682
+ "size": 0
683
+ },
684
+ "sunpy/image/tests/test_resample.py": {
685
+ "size": 3718
686
+ },
687
+ "sunpy/image/tests/test_transform.py": {
688
+ "size": 14494
689
+ },
690
+ "sunpy/image/transform.py": {
691
+ "size": 19079
692
+ },
693
+ "sunpy/io/__init__.py": {
694
+ "size": 231
695
+ },
696
+ "sunpy/io/_cdf.py": {
697
+ "size": 9708
698
+ },
699
+ "sunpy/io/_file_tools.py": {
700
+ "size": 8184
701
+ },
702
+ "sunpy/io/_fits.py": {
703
+ "size": 12277
704
+ },
705
+ "sunpy/io/_header.py": {
706
+ "size": 478
707
+ },
708
+ "sunpy/io/_jp2.py": {
709
+ "size": 5088
710
+ },
711
+ "sunpy/io/ana.py": {
712
+ "size": 3678
713
+ },
714
+ "sunpy/io/setup_package.py": {
715
+ "size": 873
716
+ },
717
+ "sunpy/io/special/__init__.py": {
718
+ "size": 39
719
+ },
720
+ "sunpy/io/special/asdf/__init__.py": {
721
+ "size": 0
722
+ },
723
+ "sunpy/io/special/asdf/converters/__init__.py": {
724
+ "size": 0
725
+ },
726
+ "sunpy/io/special/asdf/converters/frames.py": {
727
+ "size": 2759
728
+ },
729
+ "sunpy/io/special/asdf/converters/generic_map.py": {
730
+ "size": 1805
731
+ },
732
+ "sunpy/io/special/asdf/entry_points.py": {
733
+ "size": 2057
734
+ },
735
+ "sunpy/io/special/asdf/resources/__init__.py": {
736
+ "size": 0
737
+ },
738
+ "sunpy/io/special/asdf/resources/manifests/sunpy-1.0.0.yaml": {
739
+ "size": 2223
740
+ },
741
+ "sunpy/io/special/asdf/resources/manifests/sunpy-1.1.0.yaml": {
742
+ "size": 2683
743
+ },
744
+ "sunpy/io/special/asdf/resources/manifests/sunpy-1.1.1.yaml": {
745
+ "size": 2808
746
+ },
747
+ "sunpy/io/special/asdf/resources/manifests/sunpy-1.1.2.yaml": {
748
+ "size": 2968
749
+ },
750
+ "sunpy/io/special/asdf/resources/manifests/sunpy-1.2.0.yaml": {
751
+ "size": 2106
752
+ },
753
+ "sunpy/io/special/asdf/resources/manifests/sunpy-1.2.1.yaml": {
754
+ "size": 2266
755
+ },
756
+ "sunpy/io/special/asdf/resources/schemas/generic_map-1.0.0.yaml": {
757
+ "size": 685
758
+ },
759
+ "sunpy/io/special/asdf/resources/schemas/generic_map-1.1.0.yaml": {
760
+ "size": 626
761
+ },
762
+ "sunpy/io/special/asdf/resources/schemas/generic_map-1.1.1.yaml": {
763
+ "size": 691
764
+ },
765
+ "sunpy/io/special/asdf/resources/schemas/generic_map-1.2.0.yaml": {
766
+ "size": 687
767
+ },
768
+ "sunpy/io/special/asdf/resources/schemas/geocentricearthequatorial-1.0.0.yaml": {
769
+ "size": 1279
770
+ },
771
+ "sunpy/io/special/asdf/resources/schemas/geocentricearthequatorial-1.1.0.yaml": {
772
+ "size": 1275
773
+ },
774
+ "sunpy/io/special/asdf/resources/schemas/geocentricsolarecliptic-1.0.0.yaml": {
775
+ "size": 973
776
+ },
777
+ "sunpy/io/special/asdf/resources/schemas/geocentricsolarecliptic-1.1.0.yaml": {
778
+ "size": 971
779
+ },
780
+ "sunpy/io/special/asdf/resources/schemas/geocentricsolarmagnetospheric-1.0.0.yaml": {
781
+ "size": 1176
782
+ },
783
+ "sunpy/io/special/asdf/resources/schemas/geocentricsolarmagnetospheric-1.1.0.yaml": {
784
+ "size": 1174
785
+ },
786
+ "sunpy/io/special/asdf/resources/schemas/geomagnetic-1.0.0.yaml": {
787
+ "size": 1062
788
+ },
789
+ "sunpy/io/special/asdf/resources/schemas/geomagnetic-1.1.0.yaml": {
790
+ "size": 1060
791
+ },
792
+ "sunpy/io/special/asdf/resources/schemas/heliocentric-1.0.0.yaml": {
793
+ "size": 2193
794
+ },
795
+ "sunpy/io/special/asdf/resources/schemas/heliocentric-1.1.0.yaml": {
796
+ "size": 2097
797
+ },
798
+ "sunpy/io/special/asdf/resources/schemas/heliocentricearthecliptic-1.0.0.yaml": {
799
+ "size": 985
800
+ },
801
+ "sunpy/io/special/asdf/resources/schemas/heliocentricearthecliptic-1.1.0.yaml": {
802
+ "size": 983
803
+ },
804
+ "sunpy/io/special/asdf/resources/schemas/heliocentricinertial-1.0.0.yaml": {
805
+ "size": 954
806
+ },
807
+ "sunpy/io/special/asdf/resources/schemas/heliocentricinertial-1.1.0.yaml": {
808
+ "size": 952
809
+ },
810
+ "sunpy/io/special/asdf/resources/schemas/heliographic_carrington-1.0.0.yaml": {
811
+ "size": 964
812
+ },
813
+ "sunpy/io/special/asdf/resources/schemas/heliographic_carrington-1.1.0.yaml": {
814
+ "size": 2043
815
+ },
816
+ "sunpy/io/special/asdf/resources/schemas/heliographic_carrington-1.2.0.yaml": {
817
+ "size": 2386
818
+ },
819
+ "sunpy/io/special/asdf/resources/schemas/heliographic_carrington-1.3.0.yaml": {
820
+ "size": 2380
821
+ },
822
+ "sunpy/io/special/asdf/resources/schemas/heliographic_stonyhurst-1.0.0.yaml": {
823
+ "size": 964
824
+ },
825
+ "sunpy/io/special/asdf/resources/schemas/heliographic_stonyhurst-1.1.0.yaml": {
826
+ "size": 1213
827
+ },
828
+ "sunpy/io/special/asdf/resources/schemas/heliographic_stonyhurst-1.2.0.yaml": {
829
+ "size": 1209
830
+ },
831
+ "sunpy/io/special/asdf/resources/schemas/helioprojective-1.0.0.yaml": {
832
+ "size": 2476
833
+ },
834
+ "sunpy/io/special/asdf/resources/schemas/helioprojective-1.1.0.yaml": {
835
+ "size": 2378
836
+ },
837
+ "sunpy/io/special/asdf/resources/schemas/helioprojectiveradial-1.0.0.yaml": {
838
+ "size": 2416
839
+ },
840
+ "sunpy/io/special/asdf/resources/schemas/helioprojectiveradial-1.1.0.yaml": {
841
+ "size": 2416
842
+ },
843
+ "sunpy/io/special/asdf/resources/schemas/solarmagnetic-1.0.0.yaml": {
844
+ "size": 1076
845
+ },
846
+ "sunpy/io/special/asdf/resources/schemas/solarmagnetic-1.1.0.yaml": {
847
+ "size": 1074
848
+ },
849
+ "sunpy/io/special/asdf/tests/__init__.py": {
850
+ "size": 43
851
+ },
852
+ "sunpy/io/special/asdf/tests/test_coordinate_frames.py": {
853
+ "size": 3391
854
+ },
855
+ "sunpy/io/special/asdf/tests/test_genericmap.py": {
856
+ "size": 2228
857
+ },
858
+ "sunpy/io/special/asdf/tests/test_time.py": {
859
+ "size": 507
860
+ },
861
+ "sunpy/io/special/genx.py": {
862
+ "size": 10353
863
+ },
864
+ "sunpy/io/special/srs.py": {
865
+ "size": 11387
866
+ },
867
+ "sunpy/io/tests/__init__.py": {
868
+ "size": 0
869
+ },
870
+ "sunpy/io/tests/test_ana.py": {
871
+ "size": 2752
872
+ },
873
+ "sunpy/io/tests/test_cdf.py": {
874
+ "size": 1364
875
+ },
876
+ "sunpy/io/tests/test_filetools.py": {
877
+ "size": 7262
878
+ },
879
+ "sunpy/io/tests/test_fits.py": {
880
+ "size": 9212
881
+ },
882
+ "sunpy/io/tests/test_genx.py": {
883
+ "size": 5150
884
+ },
885
+ "sunpy/io/tests/test_jp2.py": {
886
+ "size": 2024
887
+ },
888
+ "sunpy/io/tests/test_srs.py": {
889
+ "size": 6469
890
+ },
891
+ "sunpy/map/__init__.py": {
892
+ "size": 405
893
+ },
894
+ "sunpy/map/compositemap.py": {
895
+ "size": 18770
896
+ },
897
+ "sunpy/map/header_helper.py": {
898
+ "size": 18599
899
+ },
900
+ "sunpy/map/map_factory.py": {
901
+ "size": 14229
902
+ },
903
+ "sunpy/map/mapbase.py": {
904
+ "size": 134024
905
+ },
906
+ "sunpy/map/mapsequence.py": {
907
+ "size": 19055
908
+ },
909
+ "sunpy/map/maputils.py": {
910
+ "size": 19940
911
+ },
912
+ "sunpy/map/sources/__init__.py": {
913
+ "size": 680
914
+ },
915
+ "sunpy/map/sources/adapt.py": {
916
+ "size": 2309
917
+ },
918
+ "sunpy/map/sources/asos.py": {
919
+ "size": 5565
920
+ },
921
+ "sunpy/map/sources/gong.py": {
922
+ "size": 9103
923
+ },
924
+ "sunpy/map/sources/hinode.py": {
925
+ "size": 8339
926
+ },
927
+ "sunpy/map/sources/iris.py": {
928
+ "size": 2625
929
+ },
930
+ "sunpy/map/sources/mlso.py": {
931
+ "size": 3235
932
+ },
933
+ "sunpy/map/sources/proba2.py": {
934
+ "size": 1570
935
+ },
936
+ "sunpy/map/sources/psp.py": {
937
+ "size": 2271
938
+ },
939
+ "sunpy/map/sources/punch.py": {
940
+ "size": 1463
941
+ },
942
+ "sunpy/map/sources/rhessi.py": {
943
+ "size": 3662
944
+ },
945
+ "sunpy/map/sources/sdo.py": {
946
+ "size": 10808
947
+ },
948
+ "sunpy/map/sources/soho.py": {
949
+ "size": 15866
950
+ },
951
+ "sunpy/map/sources/solo.py": {
952
+ "size": 2838
953
+ },
954
+ "sunpy/map/sources/source_type.py": {
955
+ "size": 1527
956
+ },
957
+ "sunpy/map/sources/stereo.py": {
958
+ "size": 5032
959
+ },
960
+ "sunpy/map/sources/suit.py": {
961
+ "size": 2879
962
+ },
963
+ "sunpy/map/sources/suvi.py": {
964
+ "size": 4571
965
+ },
966
+ "sunpy/map/sources/tests/__init__.py": {
967
+ "size": 0
968
+ },
969
+ "sunpy/map/sources/tests/helpers.py": {
970
+ "size": 283
971
+ },
972
+ "sunpy/map/sources/tests/test_adapt_source.py": {
973
+ "size": 1877
974
+ },
975
+ "sunpy/map/sources/tests/test_aia_source.py": {
976
+ "size": 3450
977
+ },
978
+ "sunpy/map/sources/tests/test_asos_hxi_source.py": {
979
+ "size": 3641
980
+ },
981
+ "sunpy/map/sources/tests/test_cor_source.py": {
982
+ "size": 1642
983
+ },
984
+ "sunpy/map/sources/tests/test_eit_l1_source.py": {
985
+ "size": 2999
986
+ },
987
+ "sunpy/map/sources/tests/test_eit_source.py": {
988
+ "size": 2220
989
+ },
990
+ "sunpy/map/sources/tests/test_eui_source.py": {
991
+ "size": 1847
992
+ },
993
+ "sunpy/map/sources/tests/test_euvi_source.py": {
994
+ "size": 2206
995
+ },
996
+ "sunpy/map/sources/tests/test_gong_halpha_source.py": {
997
+ "size": 2306
998
+ },
999
+ "sunpy/map/sources/tests/test_gong_magnetogram_source.py": {
1000
+ "size": 2684
1001
+ },
1002
+ "sunpy/map/sources/tests/test_gong_synoptic_source.py": {
1003
+ "size": 1797
1004
+ },
1005
+ "sunpy/map/sources/tests/test_hi_source.py": {
1006
+ "size": 1610
1007
+ },
1008
+ "sunpy/map/sources/tests/test_hmi_source.py": {
1009
+ "size": 5024
1010
+ },
1011
+ "sunpy/map/sources/tests/test_hmi_synoptic_source.py": {
1012
+ "size": 1962
1013
+ },
1014
+ "sunpy/map/sources/tests/test_iris_source.py": {
1015
+ "size": 1697
1016
+ },
1017
+ "sunpy/map/sources/tests/test_kcor_source.py": {
1018
+ "size": 2480
1019
+ },
1020
+ "sunpy/map/sources/tests/test_lasco_source.py": {
1021
+ "size": 3401
1022
+ },
1023
+ "sunpy/map/sources/tests/test_mdi_source.py": {
1024
+ "size": 2864
1025
+ },
1026
+ "sunpy/map/sources/tests/test_punch_source.py": {
1027
+ "size": 1361
1028
+ },
1029
+ "sunpy/map/sources/tests/test_rhessi_source.py": {
1030
+ "size": 3147
1031
+ },
1032
+ "sunpy/map/sources/tests/test_sot_source.py": {
1033
+ "size": 2736
1034
+ },
1035
+ "sunpy/map/sources/tests/test_source_type.py": {
1036
+ "size": 1085
1037
+ },
1038
+ "sunpy/map/sources/tests/test_suit_source.py": {
1039
+ "size": 1543
1040
+ },
1041
+ "sunpy/map/sources/tests/test_suvi_source.py": {
1042
+ "size": 1883
1043
+ },
1044
+ "sunpy/map/sources/tests/test_swap_source.py": {
1045
+ "size": 1474
1046
+ },
1047
+ "sunpy/map/sources/tests/test_sxt_source.py": {
1048
+ "size": 2232
1049
+ },
1050
+ "sunpy/map/sources/tests/test_trace_source.py": {
1051
+ "size": 1934
1052
+ },
1053
+ "sunpy/map/sources/tests/test_wispr_source.py": {
1054
+ "size": 12208
1055
+ },
1056
+ "sunpy/map/sources/tests/test_xrt_source.py": {
1057
+ "size": 2698
1058
+ },
1059
+ "sunpy/map/sources/trace.py": {
1060
+ "size": 3492
1061
+ },
1062
+ "sunpy/map/sources/yohkoh.py": {
1063
+ "size": 3535
1064
+ },
1065
+ "sunpy/map/tests/__init__.py": {
1066
+ "size": 0
1067
+ },
1068
+ "sunpy/map/tests/conftest.py": {
1069
+ "size": 5677
1070
+ },
1071
+ "sunpy/map/tests/strategies.py": {
1072
+ "size": 728
1073
+ },
1074
+ "sunpy/map/tests/test_compositemap.py": {
1075
+ "size": 5288
1076
+ },
1077
+ "sunpy/map/tests/test_header.py": {
1078
+ "size": 1100
1079
+ },
1080
+ "sunpy/map/tests/test_header_helper.py": {
1081
+ "size": 13395
1082
+ },
1083
+ "sunpy/map/tests/test_map_factory.py": {
1084
+ "size": 15470
1085
+ },
1086
+ "sunpy/map/tests/test_mapbase.py": {
1087
+ "size": 75254
1088
+ },
1089
+ "sunpy/map/tests/test_mapbase_dask.py": {
1090
+ "size": 2633
1091
+ },
1092
+ "sunpy/map/tests/test_mapsequence.py": {
1093
+ "size": 8776
1094
+ },
1095
+ "sunpy/map/tests/test_maputils.py": {
1096
+ "size": 14495
1097
+ },
1098
+ "sunpy/map/tests/test_plotting.py": {
1099
+ "size": 15295
1100
+ },
1101
+ "sunpy/map/tests/test_reproject_to.py": {
1102
+ "size": 11475
1103
+ },
1104
+ "sunpy/net/__init__.py": {
1105
+ "size": 605
1106
+ },
1107
+ "sunpy/net/_attrs.py": {
1108
+ "size": 9110
1109
+ },
1110
+ "sunpy/net/attr.py": {
1111
+ "size": 25395
1112
+ },
1113
+ "sunpy/net/attrs.py": {
1114
+ "size": 1497
1115
+ },
1116
+ "sunpy/net/base_client.py": {
1117
+ "size": 16588
1118
+ },
1119
+ "sunpy/net/cdaweb/__init__.py": {
1120
+ "size": 114
1121
+ },
1122
+ "sunpy/net/cdaweb/attrs.py": {
1123
+ "size": 122
1124
+ },
1125
+ "sunpy/net/cdaweb/cdaweb.py": {
1126
+ "size": 6105
1127
+ },
1128
+ "sunpy/net/cdaweb/data/attrs.json": {
1129
+ "size": 379618
1130
+ },
1131
+ "sunpy/net/cdaweb/helpers.py": {
1132
+ "size": 5006
1133
+ },
1134
+ "sunpy/net/cdaweb/test/__init__.py": {
1135
+ "size": 0
1136
+ },
1137
+ "sunpy/net/cdaweb/test/test_cdaweb.py": {
1138
+ "size": 1053
1139
+ },
1140
+ "sunpy/net/cdaweb/walker.py": {
1141
+ "size": 857
1142
+ },
1143
+ "sunpy/net/dataretriever/__init__.py": {
1144
+ "size": 820
1145
+ },
1146
+ "sunpy/net/dataretriever/attrs/__init__.py": {
1147
+ "size": 55
1148
+ },
1149
+ "sunpy/net/dataretriever/attrs/adapt.py": {
1150
+ "size": 1839
1151
+ },
1152
+ "sunpy/net/dataretriever/attrs/goes.py": {
1153
+ "size": 252
1154
+ },
1155
+ "sunpy/net/dataretriever/client.py": {
1156
+ "size": 11435
1157
+ },
1158
+ "sunpy/net/dataretriever/sources/__init__.py": {
1159
+ "size": 0
1160
+ },
1161
+ "sunpy/net/dataretriever/sources/adapt.py": {
1162
+ "size": 8069
1163
+ },
1164
+ "sunpy/net/dataretriever/sources/aia_synopsis.py": {
1165
+ "size": 5474
1166
+ },
1167
+ "sunpy/net/dataretriever/sources/eve.py": {
1168
+ "size": 2428
1169
+ },
1170
+ "sunpy/net/dataretriever/sources/fermi_gbm.py": {
1171
+ "size": 3283
1172
+ },
1173
+ "sunpy/net/dataretriever/sources/goes.py": {
1174
+ "size": 17791
1175
+ },
1176
+ "sunpy/net/dataretriever/sources/gong.py": {
1177
+ "size": 2087
1178
+ },
1179
+ "sunpy/net/dataretriever/sources/lyra.py": {
1180
+ "size": 2454
1181
+ },
1182
+ "sunpy/net/dataretriever/sources/noaa.py": {
1183
+ "size": 7259
1184
+ },
1185
+ "sunpy/net/dataretriever/sources/norh.py": {
1186
+ "size": 3949
1187
+ },
1188
+ "sunpy/net/dataretriever/sources/rhessi.py": {
1189
+ "size": 9098
1190
+ },
1191
+ "sunpy/net/dataretriever/sources/tests/__init__.py": {
1192
+ "size": 0
1193
+ },
1194
+ "sunpy/net/dataretriever/sources/tests/test_adapt.py": {
1195
+ "size": 4670
1196
+ },
1197
+ "sunpy/net/dataretriever/sources/tests/test_aia_synopsis.py": {
1198
+ "size": 5261
1199
+ },
1200
+ "sunpy/net/dataretriever/sources/tests/test_eve.py": {
1201
+ "size": 5416
1202
+ },
1203
+ "sunpy/net/dataretriever/sources/tests/test_fermi_gbm.py": {
1204
+ "size": 4440
1205
+ },
1206
+ "sunpy/net/dataretriever/sources/tests/test_goes_suvi.py": {
1207
+ "size": 4061
1208
+ },
1209
+ "sunpy/net/dataretriever/sources/tests/test_goes_ud.py": {
1210
+ "size": 10087
1211
+ },
1212
+ "sunpy/net/dataretriever/sources/tests/test_gong_synoptic.py": {
1213
+ "size": 3214
1214
+ },
1215
+ "sunpy/net/dataretriever/sources/tests/test_lyra_ud.py": {
1216
+ "size": 4437
1217
+ },
1218
+ "sunpy/net/dataretriever/sources/tests/test_noaa.py": {
1219
+ "size": 9325
1220
+ },
1221
+ "sunpy/net/dataretriever/sources/tests/test_norh.py": {
1222
+ "size": 4502
1223
+ },
1224
+ "sunpy/net/dataretriever/sources/tests/test_rhessi.py": {
1225
+ "size": 9755
1226
+ },
1227
+ "sunpy/net/dataretriever/tests/__init__.py": {
1228
+ "size": 0
1229
+ },
1230
+ "sunpy/net/dataretriever/tests/test_client.py": {
1231
+ "size": 958
1232
+ },
1233
+ "sunpy/net/fido_factory.py": {
1234
+ "size": 22421
1235
+ },
1236
+ "sunpy/net/hek/__init__.py": {
1237
+ "size": 32
1238
+ },
1239
+ "sunpy/net/hek/attrs.py": {
1240
+ "size": 17902
1241
+ },
1242
+ "sunpy/net/hek/data/coord_properties.json": {
1243
+ "size": 17301
1244
+ },
1245
+ "sunpy/net/hek/data/unit_properties.json": {
1246
+ "size": 97583
1247
+ },
1248
+ "sunpy/net/hek/hek.py": {
1249
+ "size": 8484
1250
+ },
1251
+ "sunpy/net/hek/tests/__init__.py": {
1252
+ "size": 0
1253
+ },
1254
+ "sunpy/net/hek/tests/test_hek.py": {
1255
+ "size": 12197
1256
+ },
1257
+ "sunpy/net/hek/tests/test_utils.py": {
1258
+ "size": 8283
1259
+ },
1260
+ "sunpy/net/hek/utils.py": {
1261
+ "size": 16116
1262
+ },
1263
+ "sunpy/net/hek2vso/__init__.py": {
1264
+ "size": 293
1265
+ },
1266
+ "sunpy/net/hek2vso/hek2vso.py": {
1267
+ "size": 7152
1268
+ },
1269
+ "sunpy/net/hek2vso/tests/__init__.py": {
1270
+ "size": 0
1271
+ },
1272
+ "sunpy/net/hek2vso/tests/test_hek2vso.py": {
1273
+ "size": 4011
1274
+ },
1275
+ "sunpy/net/helio/__init__.py": {
1276
+ "size": 187
1277
+ },
1278
+ "sunpy/net/helio/attrs.py": {
1279
+ "size": 516
1280
+ },
1281
+ "sunpy/net/helio/chaincode.py": {
1282
+ "size": 3828
1283
+ },
1284
+ "sunpy/net/helio/hec.py": {
1285
+ "size": 9417
1286
+ },
1287
+ "sunpy/net/helio/parser.py": {
1288
+ "size": 7635
1289
+ },
1290
+ "sunpy/net/helio/tests/__init__.py": {
1291
+ "size": 0
1292
+ },
1293
+ "sunpy/net/helio/tests/test_chaincode.py": {
1294
+ "size": 1576
1295
+ },
1296
+ "sunpy/net/helio/tests/test_helio.py": {
1297
+ "size": 11952
1298
+ },
1299
+ "sunpy/net/jsoc/__init__.py": {
1300
+ "size": 69
1301
+ },
1302
+ "sunpy/net/jsoc/attrs.py": {
1303
+ "size": 8506
1304
+ },
1305
+ "sunpy/net/jsoc/data/__init__.py": {
1306
+ "size": 0
1307
+ },
1308
+ "sunpy/net/jsoc/data/attrs.json": {
1309
+ "size": 45897
1310
+ },
1311
+ "sunpy/net/jsoc/jsoc.py": {
1312
+ "size": 39569
1313
+ },
1314
+ "sunpy/net/jsoc/tests/__init__.py": {
1315
+ "size": 0
1316
+ },
1317
+ "sunpy/net/jsoc/tests/test_attr.py": {
1318
+ "size": 3954
1319
+ },
1320
+ "sunpy/net/jsoc/tests/test_jsoc.py": {
1321
+ "size": 15500
1322
+ },
1323
+ "sunpy/net/scraper.py": {
1324
+ "size": 20045
1325
+ },
1326
+ "sunpy/net/scraper_utils.py": {
1327
+ "size": 4187
1328
+ },
1329
+ "sunpy/net/solarnet/__init__.py": {
1330
+ "size": 81
1331
+ },
1332
+ "sunpy/net/solarnet/attrs.py": {
1333
+ "size": 1882
1334
+ },
1335
+ "sunpy/net/solarnet/data/datasets.json": {
1336
+ "size": 3771
1337
+ },
1338
+ "sunpy/net/solarnet/data/tags.json": {
1339
+ "size": 338
1340
+ },
1341
+ "sunpy/net/solarnet/solarnet.py": {
1342
+ "size": 7754
1343
+ },
1344
+ "sunpy/net/solarnet/tests/__init__.py": {
1345
+ "size": 0
1346
+ },
1347
+ "sunpy/net/solarnet/tests/test_solarnet.py": {
1348
+ "size": 2572
1349
+ },
1350
+ "sunpy/net/tests/__init__.py": {
1351
+ "size": 0
1352
+ },
1353
+ "sunpy/net/tests/helpers.py": {
1354
+ "size": 1407
1355
+ },
1356
+ "sunpy/net/tests/strategies.py": {
1357
+ "size": 3911
1358
+ },
1359
+ "sunpy/net/tests/test_attr.py": {
1360
+ "size": 11258
1361
+ },
1362
+ "sunpy/net/tests/test_attr_walker.py": {
1363
+ "size": 1870
1364
+ },
1365
+ "sunpy/net/tests/test_attrs.py": {
1366
+ "size": 1093
1367
+ },
1368
+ "sunpy/net/tests/test_baseclient.py": {
1369
+ "size": 1739
1370
+ },
1371
+ "sunpy/net/tests/test_fido.py": {
1372
+ "size": 16775
1373
+ },
1374
+ "sunpy/net/tests/test_scraper.py": {
1375
+ "size": 15356
1376
+ },
1377
+ "sunpy/net/tests/test_scraper_utils.py": {
1378
+ "size": 2051
1379
+ },
1380
+ "sunpy/net/vso/__init__.py": {
1381
+ "size": 199
1382
+ },
1383
+ "sunpy/net/vso/attrs.py": {
1384
+ "size": 6191
1385
+ },
1386
+ "sunpy/net/vso/data/__init__.py": {
1387
+ "size": 0
1388
+ },
1389
+ "sunpy/net/vso/data/attrs.json": {
1390
+ "size": 23026
1391
+ },
1392
+ "sunpy/net/vso/exceptions.py": {
1393
+ "size": 400
1394
+ },
1395
+ "sunpy/net/vso/table_response.py": {
1396
+ "size": 4786
1397
+ },
1398
+ "sunpy/net/vso/tests/__init__.py": {
1399
+ "size": 0
1400
+ },
1401
+ "sunpy/net/vso/tests/conftest.py": {
1402
+ "size": 100
1403
+ },
1404
+ "sunpy/net/vso/tests/test_attrs.py": {
1405
+ "size": 6853
1406
+ },
1407
+ "sunpy/net/vso/tests/test_vso.py": {
1408
+ "size": 16805
1409
+ },
1410
+ "sunpy/net/vso/vso.py": {
1411
+ "size": 25755
1412
+ },
1413
+ "sunpy/net/vso/zeep_plugins.py": {
1414
+ "size": 556
1415
+ },
1416
+ "sunpy/physics/__init__.py": {
1417
+ "size": 0
1418
+ },
1419
+ "sunpy/physics/differential_rotation.py": {
1420
+ "size": 25646
1421
+ },
1422
+ "sunpy/physics/tests/__init__.py": {
1423
+ "size": 0
1424
+ },
1425
+ "sunpy/physics/tests/reference/test_differential_rotation.txt": {
1426
+ "size": 95355
1427
+ },
1428
+ "sunpy/physics/tests/test_differential_rotation.py": {
1429
+ "size": 20509
1430
+ },
1431
+ "sunpy/sun/__init__.py": {
1432
+ "size": 35
1433
+ },
1434
+ "sunpy/sun/_constants.py": {
1435
+ "size": 9846
1436
+ },
1437
+ "sunpy/sun/constants.py": {
1438
+ "size": 4311
1439
+ },
1440
+ "sunpy/sun/models.py": {
1441
+ "size": 7421
1442
+ },
1443
+ "sunpy/sun/tests/__init__.py": {
1444
+ "size": 0
1445
+ },
1446
+ "sunpy/sun/tests/test_constants.py": {
1447
+ "size": 2324
1448
+ },
1449
+ "sunpy/sun/tests/test_models.py": {
1450
+ "size": 2038
1451
+ },
1452
+ "sunpy/tests/__init__.py": {
1453
+ "size": 44
1454
+ },
1455
+ "sunpy/tests/figure_hashes_mpl_382_ft_261_astropy_702_animators_121.json": {
1456
+ "size": 12483
1457
+ },
1458
+ "sunpy/tests/figure_hashes_mpl_dev_ft_261_astropy_dev_animators_dev.json": {
1459
+ "size": 12483
1460
+ },
1461
+ "sunpy/tests/helpers.py": {
1462
+ "size": 4728
1463
+ },
1464
+ "sunpy/tests/mocks.py": {
1465
+ "size": 6565
1466
+ },
1467
+ "sunpy/tests/self_test.py": {
1468
+ "size": 3792
1469
+ },
1470
+ "sunpy/tests/tests/__init__.py": {
1471
+ "size": 0
1472
+ },
1473
+ "sunpy/tests/tests/test_mocks.py": {
1474
+ "size": 6126
1475
+ },
1476
+ "sunpy/tests/tests/test_self_test.py": {
1477
+ "size": 1855
1478
+ },
1479
+ "sunpy/tests/tests/test_sunpy_data_filenames.py": {
1480
+ "size": 671
1481
+ },
1482
+ "sunpy/time/__init__.py": {
1483
+ "size": 102
1484
+ },
1485
+ "sunpy/time/tests/__init__.py": {
1486
+ "size": 0
1487
+ },
1488
+ "sunpy/time/tests/test_taiseconds.py": {
1489
+ "size": 1272
1490
+ },
1491
+ "sunpy/time/tests/test_time.py": {
1492
+ "size": 13027
1493
+ },
1494
+ "sunpy/time/tests/test_timerange.py": {
1495
+ "size": 9885
1496
+ },
1497
+ "sunpy/time/tests/test_utime.py": {
1498
+ "size": 485
1499
+ },
1500
+ "sunpy/time/time.py": {
1501
+ "size": 14465
1502
+ },
1503
+ "sunpy/time/timeformats.py": {
1504
+ "size": 3702
1505
+ },
1506
+ "sunpy/time/timerange.py": {
1507
+ "size": 15384
1508
+ },
1509
+ "sunpy/timeseries/__init__.py": {
1510
+ "size": 595
1511
+ },
1512
+ "sunpy/timeseries/conftest.py": {
1513
+ "size": 5242
1514
+ },
1515
+ "sunpy/timeseries/metadata.py": {
1516
+ "size": 28715
1517
+ },
1518
+ "sunpy/timeseries/sources/__init__.py": {
1519
+ "size": 1012
1520
+ },
1521
+ "sunpy/timeseries/sources/eve.py": {
1522
+ "size": 13902
1523
+ },
1524
+ "sunpy/timeseries/sources/fermi_gbm.py": {
1525
+ "size": 8598
1526
+ },
1527
+ "sunpy/timeseries/sources/goes.py": {
1528
+ "size": 13281
1529
+ },
1530
+ "sunpy/timeseries/sources/lyra.py": {
1531
+ "size": 7220
1532
+ },
1533
+ "sunpy/timeseries/sources/noaa.py": {
1534
+ "size": 12826
1535
+ },
1536
+ "sunpy/timeseries/sources/norh.py": {
1537
+ "size": 6069
1538
+ },
1539
+ "sunpy/timeseries/sources/rhessi.py": {
1540
+ "size": 8379
1541
+ },
1542
+ "sunpy/timeseries/sources/tests/__init__.py": {
1543
+ "size": 0
1544
+ },
1545
+ "sunpy/timeseries/sources/tests/test_eve.py": {
1546
+ "size": 1545
1547
+ },
1548
+ "sunpy/timeseries/sources/tests/test_fermi_gbm.py": {
1549
+ "size": 952
1550
+ },
1551
+ "sunpy/timeseries/sources/tests/test_goes.py": {
1552
+ "size": 6381
1553
+ },
1554
+ "sunpy/timeseries/sources/tests/test_lyra.py": {
1555
+ "size": 889
1556
+ },
1557
+ "sunpy/timeseries/sources/tests/test_noaa.py": {
1558
+ "size": 1819
1559
+ },
1560
+ "sunpy/timeseries/sources/tests/test_norh.py": {
1561
+ "size": 816
1562
+ },
1563
+ "sunpy/timeseries/sources/tests/test_rhessi.py": {
1564
+ "size": 1025
1565
+ },
1566
+ "sunpy/timeseries/tests/__init__.py": {
1567
+ "size": 0
1568
+ },
1569
+ "sunpy/timeseries/tests/test_timeseries_factory.py": {
1570
+ "size": 19254
1571
+ },
1572
+ "sunpy/timeseries/tests/test_timeseriesbase.py": {
1573
+ "size": 23217
1574
+ },
1575
+ "sunpy/timeseries/tests/test_timeseriesmetadata.py": {
1576
+ "size": 21764
1577
+ },
1578
+ "sunpy/timeseries/timeseries_factory.py": {
1579
+ "size": 21252
1580
+ },
1581
+ "sunpy/timeseries/timeseriesbase.py": {
1582
+ "size": 32737
1583
+ },
1584
+ "sunpy/util/__init__.py": {
1585
+ "size": 169
1586
+ },
1587
+ "sunpy/util/config.py": {
1588
+ "size": 6976
1589
+ },
1590
+ "sunpy/util/datatype_factory_base.py": {
1591
+ "size": 5908
1592
+ },
1593
+ "sunpy/util/decorators.py": {
1594
+ "size": 11444
1595
+ },
1596
+ "sunpy/util/exceptions.py": {
1597
+ "size": 3693
1598
+ },
1599
+ "sunpy/util/functools.py": {
1600
+ "size": 780
1601
+ },
1602
+ "sunpy/util/io.py": {
1603
+ "size": 3262
1604
+ },
1605
+ "sunpy/util/logger.py": {
1606
+ "size": 3327
1607
+ },
1608
+ "sunpy/util/metadata.py": {
1609
+ "size": 7734
1610
+ },
1611
+ "sunpy/util/net.py": {
1612
+ "size": 6598
1613
+ },
1614
+ "sunpy/util/parfive_helpers.py": {
1615
+ "size": 921
1616
+ },
1617
+ "sunpy/util/sphinx/__init__.py": {
1618
+ "size": 527
1619
+ },
1620
+ "sunpy/util/sphinx/doctest.py": {
1621
+ "size": 1965
1622
+ },
1623
+ "sunpy/util/sphinx/generate.py": {
1624
+ "size": 2320
1625
+ },
1626
+ "sunpy/util/sysinfo.py": {
1627
+ "size": 8990
1628
+ },
1629
+ "sunpy/util/tests/__init__.py": {
1630
+ "size": 0
1631
+ },
1632
+ "sunpy/util/tests/test_config.py": {
1633
+ "size": 7052
1634
+ },
1635
+ "sunpy/util/tests/test_datatype_factory_base.py": {
1636
+ "size": 4606
1637
+ },
1638
+ "sunpy/util/tests/test_decorators.py": {
1639
+ "size": 1866
1640
+ },
1641
+ "sunpy/util/tests/test_functools.py": {
1642
+ "size": 2689
1643
+ },
1644
+ "sunpy/util/tests/test_logger.py": {
1645
+ "size": 3984
1646
+ },
1647
+ "sunpy/util/tests/test_metadata.py": {
1648
+ "size": 15975
1649
+ },
1650
+ "sunpy/util/tests/test_net.py": {
1651
+ "size": 1185
1652
+ },
1653
+ "sunpy/util/tests/test_sysinfo.py": {
1654
+ "size": 3345
1655
+ },
1656
+ "sunpy/util/tests/test_util.py": {
1657
+ "size": 5918
1658
+ },
1659
+ "sunpy/util/tests/test_xml.py": {
1660
+ "size": 8199
1661
+ },
1662
+ "sunpy/util/util.py": {
1663
+ "size": 11763
1664
+ },
1665
+ "sunpy/util/xml.py": {
1666
+ "size": 3208
1667
+ },
1668
+ "sunpy/version.py": {
1669
+ "size": 699
1670
+ },
1671
+ "sunpy/visualization/__init__.py": {
1672
+ "size": 234
1673
+ },
1674
+ "sunpy/visualization/animator/__init__.py": {
1675
+ "size": 116
1676
+ },
1677
+ "sunpy/visualization/animator/mapsequenceanimator.py": {
1678
+ "size": 4307
1679
+ },
1680
+ "sunpy/visualization/animator/tests/__init__.py": {
1681
+ "size": 0
1682
+ },
1683
+ "sunpy/visualization/animator/tests/test_mapsequenceanimator.py": {
1684
+ "size": 1269
1685
+ },
1686
+ "sunpy/visualization/colormaps/__init__.py": {
1687
+ "size": 308
1688
+ },
1689
+ "sunpy/visualization/colormaps/cm.py": {
1690
+ "size": 7534
1691
+ },
1692
+ "sunpy/visualization/colormaps/color_tables.py": {
1693
+ "size": 12206
1694
+ },
1695
+ "sunpy/visualization/colormaps/tests/__init__.py": {
1696
+ "size": 0
1697
+ },
1698
+ "sunpy/visualization/colormaps/tests/test_cm.py": {
1699
+ "size": 1441
1700
+ },
1701
+ "sunpy/visualization/drawing.py": {
1702
+ "size": 11926
1703
+ },
1704
+ "sunpy/visualization/tests/__init__.py": {
1705
+ "size": 0
1706
+ },
1707
+ "sunpy/visualization/tests/test_drawing.py": {
1708
+ "size": 5265
1709
+ },
1710
+ "sunpy/visualization/tests/test_visualization.py": {
1711
+ "size": 1143
1712
+ },
1713
+ "sunpy/visualization/visualization.py": {
1714
+ "size": 4163
1715
+ },
1716
+ "sunpy/visualization/wcsaxes_compat.py": {
1717
+ "size": 6568
1718
+ },
1719
+ "tools/gen_tutorial_graph.py": {
1720
+ "size": 1797
1721
+ },
1722
+ "tools/generate_github_changelog.py": {
1723
+ "size": 428
1724
+ },
1725
+ "tools/hek_mkcls.py": {
1726
+ "size": 13149
1727
+ },
1728
+ "tools/hektemplate.py": {
1729
+ "size": 5456
1730
+ },
1731
+ "tools/resize_jp2.py": {
1732
+ "size": 648
1733
+ },
1734
+ "tools/unify_section_headings.py": {
1735
+ "size": 2362
1736
+ },
1737
+ "tools/update_attrs_json.py": {
1738
+ "size": 692
1739
+ },
1740
+ "tools/update_extern.py": {
1741
+ "size": 1869
1742
+ },
1743
+ "tools/update_zenodo.py": {
1744
+ "size": 2097
1745
+ },
1746
+ "tools/version_bumps.py": {
1747
+ "size": 7049
1748
+ },
1749
+ "tox.ini": {
1750
+ "size": 5641
1751
+ }
1752
+ },
1753
+ "processed_by": "zip_fallback",
1754
+ "success": true
1755
+ },
1756
+ "structure": {
1757
+ "packages": [
1758
+ "source.benchmarks",
1759
+ "source.sunpy",
1760
+ "source.sunpy._dev",
1761
+ "source.sunpy.coordinates",
1762
+ "source.sunpy.data",
1763
+ "source.sunpy.extern",
1764
+ "source.sunpy.image",
1765
+ "source.sunpy.io",
1766
+ "source.sunpy.map",
1767
+ "source.sunpy.net",
1768
+ "source.sunpy.physics",
1769
+ "source.sunpy.sun",
1770
+ "source.sunpy.tests",
1771
+ "source.sunpy.time",
1772
+ "source.sunpy.timeseries",
1773
+ "source.sunpy.util",
1774
+ "source.sunpy.visualization"
1775
+ ]
1776
+ },
1777
+ "dependencies": {
1778
+ "has_environment_yml": false,
1779
+ "has_requirements_txt": false,
1780
+ "pyproject": true,
1781
+ "setup_cfg": false,
1782
+ "setup_py": false
1783
+ },
1784
+ "entry_points": {
1785
+ "imports": [],
1786
+ "cli": [],
1787
+ "modules": []
1788
+ },
1789
+ "llm_analysis": {
1790
+ "core_modules": [
1791
+ {
1792
+ "package": "source.sunpy.net",
1793
+ "module": "fido_factory",
1794
+ "functions": [],
1795
+ "classes": [
1796
+ "UnifiedDownloaderFactory"
1797
+ ],
1798
+ "description": "Primary high-level data discovery/download orchestration (Fido); best MCP-facing surface for search/fetch workflows."
1799
+ },
1800
+ {
1801
+ "package": "source.sunpy.map",
1802
+ "module": "map_factory",
1803
+ "functions": [],
1804
+ "classes": [
1805
+ "MapFactory"
1806
+ ],
1807
+ "description": "Factory for constructing map objects from files/data; central entry point for image/map ingestion."
1808
+ },
1809
+ {
1810
+ "package": "source.sunpy.map",
1811
+ "module": "mapbase",
1812
+ "functions": [],
1813
+ "classes": [
1814
+ "GenericMap"
1815
+ ],
1816
+ "description": "Core solar map abstraction with metadata, WCS-aware operations, and plotting hooks."
1817
+ },
1818
+ {
1819
+ "package": "source.sunpy.timeseries",
1820
+ "module": "timeseries_factory",
1821
+ "functions": [],
1822
+ "classes": [
1823
+ "TimeSeriesFactory"
1824
+ ],
1825
+ "description": "Factory entry point for creating time series objects from multiple source formats."
1826
+ },
1827
+ {
1828
+ "package": "source.sunpy.timeseries",
1829
+ "module": "timeseriesbase",
1830
+ "functions": [],
1831
+ "classes": [
1832
+ "GenericTimeSeries"
1833
+ ],
1834
+ "description": "Core time-series abstraction for solar/space-weather data analysis."
1835
+ },
1836
+ {
1837
+ "package": "source.sunpy.coordinates",
1838
+ "module": "frames",
1839
+ "functions": [],
1840
+ "classes": [
1841
+ "Helioprojective",
1842
+ "HeliographicStonyhurst",
1843
+ "HeliographicCarrington",
1844
+ "Heliocentric",
1845
+ "HelioprojectiveRadial"
1846
+ ],
1847
+ "description": "Domain coordinate frame definitions used widely in map and ephemeris operations."
1848
+ },
1849
+ {
1850
+ "package": "source.sunpy.coordinates",
1851
+ "module": "sun",
1852
+ "functions": [
1853
+ "angular_radius",
1854
+ "B0",
1855
+ "L0",
1856
+ "P",
1857
+ "carrington_rotation_number"
1858
+ ],
1859
+ "classes": [],
1860
+ "description": "Solar ephemeris/geometry utility functions suitable for stateless MCP tools."
1861
+ },
1862
+ {
1863
+ "package": "source.sunpy.time",
1864
+ "module": "time",
1865
+ "functions": [
1866
+ "parse_time",
1867
+ "is_time",
1868
+ "is_time_in_given_format"
1869
+ ],
1870
+ "classes": [],
1871
+ "description": "Canonical time parsing/normalization helpers; useful as shared MCP utility layer."
1872
+ },
1873
+ {
1874
+ "package": "source.sunpy.time",
1875
+ "module": "timerange",
1876
+ "functions": [],
1877
+ "classes": [
1878
+ "TimeRange"
1879
+ ],
1880
+ "description": "Time interval representation for queries and slicing."
1881
+ },
1882
+ {
1883
+ "package": "source.sunpy.net",
1884
+ "module": "attrs",
1885
+ "functions": [],
1886
+ "classes": [],
1887
+ "description": "Attribute namespace used to build Fido/client queries; required for expressive search filters."
1888
+ }
1889
+ ],
1890
+ "cli_commands": [],
1891
+ "import_strategy": {
1892
+ "primary": "import",
1893
+ "fallback": "blackbox",
1894
+ "confidence": 0.91
1895
+ },
1896
+ "dependencies": {
1897
+ "required": [
1898
+ "numpy",
1899
+ "astropy",
1900
+ "packaging"
1901
+ ],
1902
+ "optional": [
1903
+ "matplotlib",
1904
+ "reproject",
1905
+ "parfive",
1906
+ "drms",
1907
+ "zeep",
1908
+ "asdf",
1909
+ "scipy",
1910
+ "pandas",
1911
+ "aiohttp",
1912
+ "h5py"
1913
+ ]
1914
+ },
1915
+ "risk_assessment": {
1916
+ "import_feasibility": 0.9,
1917
+ "intrusiveness_risk": "low",
1918
+ "complexity": "medium"
1919
+ }
1920
+ },
1921
+ "deepwiki_analysis": {
1922
+ "repo_url": "https://github.com/sunpy/sunpy",
1923
+ "repo_name": "sunpy",
1924
+ "error": "DeepWiki analysis failed",
1925
+ "model": "gpt-5.3-codex",
1926
+ "source": "llm_direct_analysis",
1927
+ "success": false
1928
+ },
1929
+ "deepwiki_options": {
1930
+ "enabled": true,
1931
+ "model": "gpt-5.3-codex"
1932
+ },
1933
+ "risk": {
1934
+ "import_feasibility": 0.9,
1935
+ "intrusiveness_risk": "low",
1936
+ "complexity": "medium"
1937
+ }
1938
+ }
sunpy/mcp_output/diff_report.md ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Difference Report — **sunpy**
2
+ **Generated:** 2026-03-12 06:22:53
3
+ **Repository:** `sunpy`
4
+ **Project Type:** Python library
5
+ **Scope:** Basic functionality
6
+ **Intrusiveness:** None
7
+ **Workflow Status:** ✅ Success
8
+ **Test Status:** ❌ Failed
9
+
10
+ ---
11
+
12
+ ## 1) Project Overview
13
+
14
+ This update introduces **8 new files** and **no modifications to existing files**.
15
+ Given the non-intrusive scope and unchanged existing code, the changes appear additive and likely intended to extend baseline capabilities or support infrastructure without direct refactoring.
16
+
17
+ ---
18
+
19
+ ## 2) Change Summary
20
+
21
+ | Metric | Value |
22
+ |---|---|
23
+ | New files | 8 |
24
+ | Modified files | 0 |
25
+ | Deleted files | 0 *(not reported)* |
26
+ | Intrusiveness | None |
27
+ | Workflow | Success |
28
+ | Tests | Failed |
29
+
30
+ ### High-level interpretation
31
+ - The CI/workflow pipeline completed successfully (e.g., lint/build/package steps likely passed).
32
+ - Test suite did not pass, indicating either:
33
+ - new tests or fixtures fail,
34
+ - environment/dependency mismatch,
35
+ - integration assumptions broken by additive files,
36
+ - or unrelated pre-existing test instability surfaced in this run.
37
+
38
+ ---
39
+
40
+ ## 3) Difference Analysis
41
+
42
+ ### Structural impact
43
+ - **Codebase stability risk:** Low to medium (no existing files changed).
44
+ - **Behavioral risk:** Medium (new files can still affect import paths, plugin discovery, runtime registration, packaging, or test collection).
45
+ - **Maintenance impact:** Low immediate, potentially medium if files introduce new modules without documentation/tests.
46
+
47
+ ### Likely affected areas (in additive-only updates)
48
+ 1. **Module discovery / imports**
49
+ New packages or modules may be auto-discovered and imported during tests.
50
+ 2. **Test collection behavior**
51
+ New files can alter pytest discovery (`test_*.py`, `conftest.py`, fixtures, markers).
52
+ 3. **Packaging metadata side effects**
53
+ If new files include entry points, configuration, or data files, runtime behavior may change.
54
+ 4. **Documentation and examples**
55
+ New example files may execute in doctest/test pipelines and fail.
56
+
57
+ ---
58
+
59
+ ## 4) Technical Analysis
60
+
61
+ ## CI vs Test outcome mismatch
62
+ A successful workflow with failed tests often indicates:
63
+ - Build/lint/static checks are green.
64
+ - Unit/integration/regression tests failed at runtime.
65
+
66
+ ### Potential technical causes
67
+ - Missing optional dependency required by newly added functionality.
68
+ - Version pinning conflict (local passes, CI fails).
69
+ - New files not wired into test fixtures or mocks.
70
+ - Time/network-dependent tests (flaky or environment-specific).
71
+ - Incomplete test data/resources for new functionality.
72
+
73
+ ### Risk profile
74
+ - **Runtime risk:** Moderate until test failures are triaged.
75
+ - **Release readiness:** Not ready for production release while test status is failed.
76
+ - **Rollback need:** Not required yet (no modified files), but merge/release should be gated.
77
+
78
+ ---
79
+
80
+ ## 5) Recommendations & Improvements
81
+
82
+ ## Immediate actions (high priority)
83
+ 1. **Collect failing test logs** and categorize by failure type:
84
+ - import error,
85
+ - assertion failure,
86
+ - dependency error,
87
+ - timeout/flaky.
88
+ 2. **Map failures to new files** (direct/indirect linkage).
89
+ 3. **Run targeted test subsets** for impacted modules first, then full suite.
90
+ 4. **Validate dependency matrix** (Python versions, optional extras, pinned libs).
91
+
92
+ ## Quality hardening
93
+ - Add/expand tests for each new file’s intended behavior.
94
+ - Ensure deterministic tests (no external network/time unless mocked).
95
+ - Add minimal integration test to verify package discovery and import stability.
96
+ - If examples/docs are included, gate doctests separately or mark unstable cases.
97
+
98
+ ## Process improvements
99
+ - Enforce “tests must pass” branch protection.
100
+ - Add a pre-merge smoke test job for newly added modules.
101
+ - Include a change manifest in PRs: purpose, dependencies, expected test impact.
102
+
103
+ ---
104
+
105
+ ## 6) Deployment Information
106
+
107
+ ## Current deployment posture
108
+ - **Do not deploy/release** this change set in its current state due to failed tests.
109
+ - Artifacts from successful workflow stages may be usable for debugging only.
110
+
111
+ ## Release gate checklist
112
+ - [ ] All tests pass in CI across supported Python versions.
113
+ - [ ] New files reviewed for packaging/import side effects.
114
+ - [ ] Changelog entry added (if user-facing behavior introduced).
115
+ - [ ] Version bump policy verified (patch/minor as applicable).
116
+ - [ ] Rollback plan documented (even if low-risk additive change).
117
+
118
+ ---
119
+
120
+ ## 7) Future Planning
121
+
122
+ 1. **Stabilization sprint (short-term)**
123
+ Resolve current test failures; improve coverage around new files.
124
+ 2. **Reliability improvements (mid-term)**
125
+ Add flaky-test detection/quarantine process and dependency lock validation.
126
+ 3. **Observability (mid-term)**
127
+ Track CI failure categories and mean time to resolution for test regressions.
128
+ 4. **Governance (long-term)**
129
+ Require “change impact notes” for additive updates to reduce hidden integration risks.
130
+
131
+ ---
132
+
133
+ ## 8) Executive Conclusion
134
+
135
+ The `sunpy` update is structurally conservative (**8 new files, 0 modified files**) and operationally low-intrusive, but **not release-ready** because tests failed despite a successful workflow.
136
+ Primary next step is rapid test-failure triage tied to newly introduced files, followed by CI hardening to prevent similar regressions.
sunpy/mcp_output/mcp_plugin/__init__.py ADDED
File without changes
sunpy/mcp_output/mcp_plugin/adapter.py ADDED
@@ -0,0 +1,349 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ from typing import Any, Dict, Optional
4
+
5
+ source_path = os.path.join(
6
+ os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
7
+ "source",
8
+ )
9
+ sys.path.insert(0, source_path)
10
+
11
+
12
+ class Adapter:
13
+ """
14
+ Import-mode adapter for the SunPy repository.
15
+
16
+ This adapter attempts to import SunPy from the local `source` directory and exposes
17
+ practical high-level methods that map to core repository functionality discovered
18
+ during analysis (time parsing/ranges, map loading, timeseries loading, Fido search/fetch,
19
+ and key solar coordinate/physics helpers).
20
+
21
+ All public methods return a unified dictionary format:
22
+ {
23
+ "status": "success" | "error" | "fallback",
24
+ ...
25
+ }
26
+ """
27
+
28
+ # -------------------------------------------------------------------------
29
+ # Lifecycle / module management
30
+ # -------------------------------------------------------------------------
31
+ def __init__(self) -> None:
32
+ self.mode = "import"
33
+ self._modules: Dict[str, Any] = {}
34
+ self._import_error: Optional[str] = None
35
+ self._load_modules()
36
+
37
+ def _ok(self, **payload: Any) -> Dict[str, Any]:
38
+ data = {"status": "success"}
39
+ data.update(payload)
40
+ return data
41
+
42
+ def _err(self, message: str, guidance: Optional[str] = None, **payload: Any) -> Dict[str, Any]:
43
+ data = {"status": "error", "message": message}
44
+ if guidance:
45
+ data["guidance"] = guidance
46
+ data.update(payload)
47
+ return data
48
+
49
+ def _fallback(self, message: str, guidance: Optional[str] = None, **payload: Any) -> Dict[str, Any]:
50
+ data = {"status": "fallback", "message": message}
51
+ if guidance:
52
+ data["guidance"] = guidance
53
+ data.update(payload)
54
+ return data
55
+
56
+ def _load_modules(self) -> None:
57
+ try:
58
+ import sunpy # full path from source root
59
+ import sunpy.map
60
+ import sunpy.time
61
+ import sunpy.timeseries
62
+ import sunpy.net
63
+ import sunpy.net.fido_factory
64
+ import sunpy.coordinates
65
+ import sunpy.coordinates.sun
66
+ import sunpy.physics.differential_rotation
67
+
68
+ self._modules = {
69
+ "sunpy": sunpy,
70
+ "sunpy.map": sunpy.map,
71
+ "sunpy.time": sunpy.time,
72
+ "sunpy.timeseries": sunpy.timeseries,
73
+ "sunpy.net": sunpy.net,
74
+ "sunpy.net.fido_factory": sunpy.net.fido_factory,
75
+ "sunpy.coordinates": sunpy.coordinates,
76
+ "sunpy.coordinates.sun": sunpy.coordinates.sun,
77
+ "sunpy.physics.differential_rotation": sunpy.physics.differential_rotation,
78
+ }
79
+ self._import_error = None
80
+ except Exception as exc:
81
+ self._modules = {}
82
+ self._import_error = str(exc)
83
+
84
+ def health_check(self) -> Dict[str, Any]:
85
+ """
86
+ Validate adapter import status.
87
+
88
+ Returns:
89
+ dict: Unified status with mode, loaded module list, and import diagnostics.
90
+ """
91
+ if self._modules:
92
+ return self._ok(mode=self.mode, loaded_modules=sorted(self._modules.keys()))
93
+ return self._fallback(
94
+ message="Import mode unavailable because local SunPy modules could not be loaded.",
95
+ guidance=(
96
+ "Verify repository source is available under '<plugin_root>/source' and includes "
97
+ "the 'sunpy' package. Check dependency availability: numpy, astropy, packaging."
98
+ ),
99
+ mode=self.mode,
100
+ import_error=self._import_error,
101
+ )
102
+
103
+ # -------------------------------------------------------------------------
104
+ # Time utilities (sunpy.time)
105
+ # -------------------------------------------------------------------------
106
+ def call_parse_time(self, time_input: Any, format: Optional[str] = None, **kwargs: Any) -> Dict[str, Any]:
107
+ """
108
+ Parse a time input using sunpy.time.parse_time.
109
+
110
+ Args:
111
+ time_input: Input accepted by SunPy time parser (str, datetime, astropy Time, etc.).
112
+ format: Optional explicit format passed through to parser.
113
+ **kwargs: Additional parser keyword arguments.
114
+
115
+ Returns:
116
+ dict: Unified status with parsed `astropy.time.Time` object on success.
117
+ """
118
+ if "sunpy.time" not in self._modules:
119
+ return self._fallback(
120
+ message="sunpy.time is not available in import mode.",
121
+ guidance="Run health_check() and resolve import/dependency issues before calling parse_time.",
122
+ )
123
+ try:
124
+ fn = self._modules["sunpy.time"].parse_time
125
+ result = fn(time_input, format=format, **kwargs) if format else fn(time_input, **kwargs)
126
+ return self._ok(result=result)
127
+ except Exception as exc:
128
+ return self._err(
129
+ message=f"Failed to parse time input: {exc}",
130
+ guidance="Ensure the input time format is valid and compatible with SunPy/Astropy.",
131
+ )
132
+
133
+ def instance_timerange(self, a: Any = None, b: Any = None, **kwargs: Any) -> Dict[str, Any]:
134
+ """
135
+ Create an instance of sunpy.time.timerange.TimeRange.
136
+
137
+ Args:
138
+ a: Start value or pair-like input accepted by TimeRange.
139
+ b: End value or duration depending on constructor usage.
140
+ **kwargs: Additional constructor args.
141
+
142
+ Returns:
143
+ dict: Unified status with TimeRange instance on success.
144
+ """
145
+ if "sunpy.time" not in self._modules:
146
+ return self._fallback(
147
+ message="sunpy.time is not available in import mode.",
148
+ guidance="Run health_check() and confirm local source/dependencies.",
149
+ )
150
+ try:
151
+ cls = self._modules["sunpy.time"].TimeRange
152
+ obj = cls(a, b, **kwargs) if b is not None else cls(a, **kwargs)
153
+ return self._ok(instance=obj)
154
+ except Exception as exc:
155
+ return self._err(
156
+ message=f"Failed to create TimeRange instance: {exc}",
157
+ guidance="Provide valid start/end inputs or valid constructor arguments.",
158
+ )
159
+
160
+ # -------------------------------------------------------------------------
161
+ # Map utilities (sunpy.map)
162
+ # -------------------------------------------------------------------------
163
+ def instance_map(self, data: Any, header: Any = None, **kwargs: Any) -> Dict[str, Any]:
164
+ """
165
+ Create a map object via sunpy.map.Map factory.
166
+
167
+ Args:
168
+ data: File path, array, or supported map input.
169
+ header: Optional metadata/header when constructing from raw array data.
170
+ **kwargs: Additional map factory arguments.
171
+
172
+ Returns:
173
+ dict: Unified status with map instance on success.
174
+ """
175
+ if "sunpy.map" not in self._modules:
176
+ return self._fallback(
177
+ message="sunpy.map is not available in import mode.",
178
+ guidance="Install optional dependencies for map workflows and verify source path.",
179
+ )
180
+ try:
181
+ map_factory = self._modules["sunpy.map"].Map
182
+ obj = map_factory(data, header, **kwargs) if header is not None else map_factory(data, **kwargs)
183
+ return self._ok(instance=obj)
184
+ except Exception as exc:
185
+ return self._err(
186
+ message=f"Failed to create map instance: {exc}",
187
+ guidance="Check input FITS path/data-array validity and metadata consistency.",
188
+ )
189
+
190
+ # -------------------------------------------------------------------------
191
+ # TimeSeries utilities (sunpy.timeseries)
192
+ # -------------------------------------------------------------------------
193
+ def instance_timeseries(self, source: Any, **kwargs: Any) -> Dict[str, Any]:
194
+ """
195
+ Create a TimeSeries object via sunpy.timeseries.TimeSeries factory.
196
+
197
+ Args:
198
+ source: Input accepted by TimeSeries factory (file path, URL result, etc.).
199
+ **kwargs: Additional factory options.
200
+
201
+ Returns:
202
+ dict: Unified status with TimeSeries instance on success.
203
+ """
204
+ if "sunpy.timeseries" not in self._modules:
205
+ return self._fallback(
206
+ message="sunpy.timeseries is not available in import mode.",
207
+ guidance="Confirm optional dependencies (e.g., pandas) and local source integrity.",
208
+ )
209
+ try:
210
+ factory = self._modules["sunpy.timeseries"].TimeSeries
211
+ obj = factory(source, **kwargs)
212
+ return self._ok(instance=obj)
213
+ except Exception as exc:
214
+ return self._err(
215
+ message=f"Failed to create TimeSeries instance: {exc}",
216
+ guidance="Check source path/content and ensure required extras are installed.",
217
+ )
218
+
219
+ # -------------------------------------------------------------------------
220
+ # Network/Fido utilities (sunpy.net)
221
+ # -------------------------------------------------------------------------
222
+ def instance_fido(self) -> Dict[str, Any]:
223
+ """
224
+ Return the Fido client facade from sunpy.net.
225
+
226
+ Returns:
227
+ dict: Unified status with Fido facade on success.
228
+ """
229
+ if "sunpy.net" not in self._modules:
230
+ return self._fallback(
231
+ message="sunpy.net is not available in import mode.",
232
+ guidance="Confirm network-related optional dependencies and import availability.",
233
+ )
234
+ try:
235
+ fido = self._modules["sunpy.net"].Fido
236
+ return self._ok(instance=fido)
237
+ except Exception as exc:
238
+ return self._err(
239
+ message=f"Failed to access Fido facade: {exc}",
240
+ guidance="Verify sunpy.net import and compatibility of dependencies.",
241
+ )
242
+
243
+ def call_fido_search(self, *query_attrs: Any) -> Dict[str, Any]:
244
+ """
245
+ Execute a Fido search with provided query attributes.
246
+
247
+ Args:
248
+ *query_attrs: SunPy attr objects, e.g. attrs.Time(...), attrs.Instrument(...).
249
+
250
+ Returns:
251
+ dict: Unified status with search results on success.
252
+ """
253
+ if "sunpy.net" not in self._modules:
254
+ return self._fallback(
255
+ message="sunpy.net is not available in import mode.",
256
+ guidance="Resolve import issues before performing remote searches.",
257
+ )
258
+ try:
259
+ result = self._modules["sunpy.net"].Fido.search(*query_attrs)
260
+ return self._ok(result=result)
261
+ except Exception as exc:
262
+ return self._err(
263
+ message=f"Fido search failed: {exc}",
264
+ guidance="Confirm query attrs are valid and network access is available.",
265
+ )
266
+
267
+ def call_fido_fetch(self, search_result: Any, **kwargs: Any) -> Dict[str, Any]:
268
+ """
269
+ Fetch files from a Fido search result.
270
+
271
+ Args:
272
+ search_result: Result returned by Fido.search.
273
+ **kwargs: Additional fetch options (path, max_conn, progress, etc.).
274
+
275
+ Returns:
276
+ dict: Unified status with fetch response on success.
277
+ """
278
+ if "sunpy.net" not in self._modules:
279
+ return self._fallback(
280
+ message="sunpy.net is not available in import mode.",
281
+ guidance="Resolve import issues before attempting fetch.",
282
+ )
283
+ try:
284
+ fetched = self._modules["sunpy.net"].Fido.fetch(search_result, **kwargs)
285
+ return self._ok(result=fetched)
286
+ except Exception as exc:
287
+ return self._err(
288
+ message=f"Fido fetch failed: {exc}",
289
+ guidance="Check download path permissions, network connectivity, and fetch arguments.",
290
+ )
291
+
292
+ # -------------------------------------------------------------------------
293
+ # Coordinates / solar helpers
294
+ # -------------------------------------------------------------------------
295
+ def call_solar_angular_radius(self, time: Any = "now") -> Dict[str, Any]:
296
+ """
297
+ Compute the apparent solar angular radius at a given time.
298
+
299
+ Args:
300
+ time: Time input accepted by SunPy coordinate helpers.
301
+
302
+ Returns:
303
+ dict: Unified status with angular radius quantity on success.
304
+ """
305
+ if "sunpy.coordinates.sun" not in self._modules:
306
+ return self._fallback(
307
+ message="sunpy.coordinates.sun is not available in import mode.",
308
+ guidance="Ensure astropy and sunpy coordinate modules are importable.",
309
+ )
310
+ try:
311
+ fn = self._modules["sunpy.coordinates.sun"].angular_radius
312
+ value = fn(time=time)
313
+ return self._ok(result=value)
314
+ except Exception as exc:
315
+ return self._err(
316
+ message=f"Failed to compute solar angular radius: {exc}",
317
+ guidance="Provide a valid time input or use default 'now'.",
318
+ )
319
+
320
+ # -------------------------------------------------------------------------
321
+ # Physics helpers
322
+ # -------------------------------------------------------------------------
323
+ def call_diff_rot(self, duration: Any, latitude: Any, rot_type: str = "howard", frame_time: str = "sidereal") -> Dict[str, Any]:
324
+ """
325
+ Compute solar differential rotation using SunPy physics helper.
326
+
327
+ Args:
328
+ duration: Time duration quantity (e.g., astropy.units day/hour quantity).
329
+ latitude: Latitude quantity/array in angular units.
330
+ rot_type: Rotation model (e.g., 'howard', 'snodgrass', 'allen', 'rigid').
331
+ frame_time: 'sidereal' or 'synodic'.
332
+
333
+ Returns:
334
+ dict: Unified status with rotation result on success.
335
+ """
336
+ if "sunpy.physics.differential_rotation" not in self._modules:
337
+ return self._fallback(
338
+ message="sunpy.physics.differential_rotation is not available in import mode.",
339
+ guidance="Ensure sunpy physics module and unit dependencies are installed.",
340
+ )
341
+ try:
342
+ fn = self._modules["sunpy.physics.differential_rotation"].diff_rot
343
+ result = fn(duration=duration, latitude=latitude, rot_type=rot_type, frame_time=frame_time)
344
+ return self._ok(result=result)
345
+ except Exception as exc:
346
+ return self._err(
347
+ message=f"Differential rotation computation failed: {exc}",
348
+ guidance="Validate duration/latitude units and model arguments.",
349
+ )
sunpy/mcp_output/mcp_plugin/main.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ MCP Service Auto-Wrapper - Auto-generated
3
+ """
4
+ from mcp_service import create_app
5
+
6
+ def main():
7
+ """Main entry point"""
8
+ app = create_app()
9
+ return app
10
+
11
+ if __name__ == "__main__":
12
+ app = main()
13
+ app.run()
sunpy/mcp_output/mcp_plugin/mcp_service.py ADDED
@@ -0,0 +1,274 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ from typing import Any
4
+
5
+ source_path = os.path.join(
6
+ os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
7
+ "source",
8
+ )
9
+ if source_path not in sys.path:
10
+ sys.path.insert(0, source_path)
11
+
12
+ from fastmcp import FastMCP
13
+
14
+ import sunpy.coordinates as sunpy_coordinates
15
+ import sunpy.map as sunpy_map
16
+ import sunpy.net as sunpy_net
17
+ import sunpy.time as sunpy_time
18
+ import sunpy.timeseries as sunpy_timeseries
19
+
20
+ mcp = FastMCP("sunpy_mcp_service")
21
+
22
+
23
+ @mcp.tool(
24
+ name="parse_time",
25
+ description="Parse a time input into an Astropy Time object representation.",
26
+ )
27
+ def parse_time(time_input: str) -> dict[str, Any]:
28
+ """
29
+ Parse a user-provided time string into SunPy/Astropy time.
30
+
31
+ Parameters:
32
+ time_input: Time string or supported time format (e.g. ISO timestamp).
33
+
34
+ Returns:
35
+ Dictionary with:
36
+ - success: bool indicating whether parsing succeeded
37
+ - result: Parsed time as string on success, else None
38
+ - error: Error message on failure, else None
39
+ """
40
+ try:
41
+ parsed = sunpy_time.parse_time(time_input)
42
+ return {"success": True, "result": str(parsed), "error": None}
43
+ except Exception as exc:
44
+ return {"success": False, "result": None, "error": str(exc)}
45
+
46
+
47
+ @mcp.tool(
48
+ name="create_time_range",
49
+ description="Create a SunPy TimeRange from start and end timestamps.",
50
+ )
51
+ def create_time_range(start: str, end: str) -> dict[str, Any]:
52
+ """
53
+ Create a time range object.
54
+
55
+ Parameters:
56
+ start: Start timestamp string.
57
+ end: End timestamp string.
58
+
59
+ Returns:
60
+ Dictionary with:
61
+ - success: bool
62
+ - result: TimeRange summary string on success, else None
63
+ - error: Error message on failure, else None
64
+ """
65
+ try:
66
+ tr = sunpy_time.TimeRange(start, end)
67
+ return {"success": True, "result": str(tr), "error": None}
68
+ except Exception as exc:
69
+ return {"success": False, "result": None, "error": str(exc)}
70
+
71
+
72
+ @mcp.tool(
73
+ name="load_map",
74
+ description="Load a SunPy map from a file path.",
75
+ )
76
+ def load_map(file_path: str) -> dict[str, Any]:
77
+ """
78
+ Load a map using sunpy.map.Map.
79
+
80
+ Parameters:
81
+ file_path: Path to a solar data file supported by SunPy.
82
+
83
+ Returns:
84
+ Dictionary with:
85
+ - success: bool
86
+ - result: Basic map metadata on success, else None
87
+ - error: Error message on failure, else None
88
+ """
89
+ try:
90
+ m = sunpy_map.Map(file_path)
91
+ result = {
92
+ "map_type": type(m).__name__,
93
+ "instrument": str(getattr(m, "instrument", "")),
94
+ "observatory": str(getattr(m, "observatory", "")),
95
+ "date": str(getattr(m, "date", "")),
96
+ "dimensions": str(getattr(m, "dimensions", "")),
97
+ "wavelength": str(getattr(m, "wavelength", "")),
98
+ }
99
+ return {"success": True, "result": result, "error": None}
100
+ except Exception as exc:
101
+ return {"success": False, "result": None, "error": str(exc)}
102
+
103
+
104
+ @mcp.tool(
105
+ name="map_subregion_info",
106
+ description="Extract submap info using coordinate bounds in arcseconds.",
107
+ )
108
+ def map_subregion_info(
109
+ file_path: str,
110
+ bottom_left_tx_arcsec: float,
111
+ bottom_left_ty_arcsec: float,
112
+ top_right_tx_arcsec: float,
113
+ top_right_ty_arcsec: float,
114
+ ) -> dict[str, Any]:
115
+ """
116
+ Build a submap from helioprojective bounds and return summary information.
117
+
118
+ Parameters:
119
+ file_path: Input map file path.
120
+ bottom_left_tx_arcsec: Bottom-left x (arcsec).
121
+ bottom_left_ty_arcsec: Bottom-left y (arcsec).
122
+ top_right_tx_arcsec: Top-right x (arcsec).
123
+ top_right_ty_arcsec: Top-right y (arcsec).
124
+
125
+ Returns:
126
+ Dictionary with:
127
+ - success: bool
128
+ - result: Submap summary on success, else None
129
+ - error: Error message on failure, else None
130
+ """
131
+ try:
132
+ import astropy.units as u
133
+ from astropy.coordinates import SkyCoord
134
+
135
+ m = sunpy_map.Map(file_path)
136
+ frame = m.coordinate_frame
137
+ bl = SkyCoord(bottom_left_tx_arcsec * u.arcsec, bottom_left_ty_arcsec * u.arcsec, frame=frame)
138
+ tr = SkyCoord(top_right_tx_arcsec * u.arcsec, top_right_ty_arcsec * u.arcsec, frame=frame)
139
+ sub = m.submap(bl, top_right=tr)
140
+ result = {
141
+ "shape": str(sub.data.shape),
142
+ "date": str(getattr(sub, "date", "")),
143
+ "dimensions": str(getattr(sub, "dimensions", "")),
144
+ }
145
+ return {"success": True, "result": result, "error": None}
146
+ except Exception as exc:
147
+ return {"success": False, "result": None, "error": str(exc)}
148
+
149
+
150
+ @mcp.tool(
151
+ name="search_fido",
152
+ description="Search remote solar data using sunpy.net.Fido.",
153
+ )
154
+ def search_fido(
155
+ start_time: str,
156
+ end_time: str,
157
+ instrument: str,
158
+ ) -> dict[str, Any]:
159
+ """
160
+ Query SunPy Fido for data matching time range and instrument.
161
+
162
+ Parameters:
163
+ start_time: Query start time.
164
+ end_time: Query end time.
165
+ instrument: Instrument name (e.g. AIA, HMI, EIT).
166
+
167
+ Returns:
168
+ Dictionary with:
169
+ - success: bool
170
+ - result: Stringified query response on success, else None
171
+ - error: Error message on failure, else None
172
+ """
173
+ try:
174
+ from sunpy.net import attrs as a
175
+
176
+ query = sunpy_net.Fido.search(
177
+ a.Time(start_time, end_time),
178
+ a.Instrument(instrument),
179
+ )
180
+ return {"success": True, "result": str(query), "error": None}
181
+ except Exception as exc:
182
+ return {"success": False, "result": None, "error": str(exc)}
183
+
184
+
185
+ @mcp.tool(
186
+ name="peek_timeseries",
187
+ description="Load a SunPy TimeSeries and return core metadata.",
188
+ )
189
+ def peek_timeseries(file_path: str) -> dict[str, Any]:
190
+ """
191
+ Load a timeseries file and expose core descriptive information.
192
+
193
+ Parameters:
194
+ file_path: Path to a time series file.
195
+
196
+ Returns:
197
+ Dictionary with:
198
+ - success: bool
199
+ - result: TimeSeries summary on success, else None
200
+ - error: Error message on failure, else None
201
+ """
202
+ try:
203
+ ts = sunpy_timeseries.TimeSeries(file_path)
204
+ result = {
205
+ "timeseries_type": type(ts).__name__,
206
+ "columns": list(ts.columns) if hasattr(ts, "columns") else [],
207
+ "time_range": str(getattr(ts, "time_range", "")),
208
+ "units": str(getattr(ts, "units", "")),
209
+ }
210
+ return {"success": True, "result": result, "error": None}
211
+ except Exception as exc:
212
+ return {"success": False, "result": None, "error": str(exc)}
213
+
214
+
215
+ @mcp.tool(
216
+ name="solar_angular_radius",
217
+ description="Compute apparent solar angular radius at a given time.",
218
+ )
219
+ def solar_angular_radius(time_input: str) -> dict[str, Any]:
220
+ """
221
+ Compute solar angular radius using sunpy.coordinates.sun.
222
+
223
+ Parameters:
224
+ time_input: Observation time.
225
+
226
+ Returns:
227
+ Dictionary with:
228
+ - success: bool
229
+ - result: Angular radius string on success, else None
230
+ - error: Error message on failure, else None
231
+ """
232
+ try:
233
+ from sunpy.coordinates import sun
234
+
235
+ t = sunpy_time.parse_time(time_input)
236
+ radius = sun.angular_radius(t)
237
+ return {"success": True, "result": str(radius), "error": None}
238
+ except Exception as exc:
239
+ return {"success": False, "result": None, "error": str(exc)}
240
+
241
+
242
+ @mcp.tool(
243
+ name="earth_sun_distance",
244
+ description="Compute Earth-Sun distance at a given time.",
245
+ )
246
+ def earth_sun_distance(time_input: str) -> dict[str, Any]:
247
+ """
248
+ Compute Earth-Sun distance via sunpy.coordinates.sun.
249
+
250
+ Parameters:
251
+ time_input: Observation time.
252
+
253
+ Returns:
254
+ Dictionary with:
255
+ - success: bool
256
+ - result: Distance string on success, else None
257
+ - error: Error message on failure, else None
258
+ """
259
+ try:
260
+ from sunpy.coordinates import sun
261
+
262
+ t = sunpy_time.parse_time(time_input)
263
+ distance = sun.earth_distance(t)
264
+ return {"success": True, "result": str(distance), "error": None}
265
+ except Exception as exc:
266
+ return {"success": False, "result": None, "error": str(exc)}
267
+
268
+
269
+ def create_app() -> FastMCP:
270
+ return mcp
271
+
272
+
273
+ if __name__ == "__main__":
274
+ mcp.run()
sunpy/mcp_output/requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fastmcp
2
+ fastapi
3
+ uvicorn[standard]
4
+ pydantic>=2.0.0
5
+ astropy>=6.1.0
6
+ fsspec>=2023.6.0
7
+ numpy>=1.26.0
8
+ packaging>=23.2
9
+ parfive[ftp]>=2.1.0
10
+ pyerfa>=2.0.1.1
11
+ requests>=2.32.1
sunpy/mcp_output/start_mcp.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ """
3
+ MCP Service Startup Entry
4
+ """
5
+ import sys
6
+ import os
7
+
8
+ project_root = os.path.dirname(os.path.abspath(__file__))
9
+ mcp_plugin_dir = os.path.join(project_root, "mcp_plugin")
10
+ if mcp_plugin_dir not in sys.path:
11
+ sys.path.insert(0, mcp_plugin_dir)
12
+
13
+ from mcp_service import create_app
14
+
15
+ def main():
16
+ """Start FastMCP service"""
17
+ app = create_app()
18
+ # Use environment variable to configure port, default 8000
19
+ port = int(os.environ.get("MCP_PORT", "8000"))
20
+
21
+ # Choose transport mode based on environment variable
22
+ transport = os.environ.get("MCP_TRANSPORT", "stdio")
23
+ if transport == "http":
24
+ app.run(transport="http", host="0.0.0.0", port=port)
25
+ else:
26
+ # Default to STDIO mode
27
+ app.run()
28
+
29
+ if __name__ == "__main__":
30
+ main()
sunpy/mcp_output/workflow_summary.json ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "repository": {
3
+ "name": "sunpy",
4
+ "url": "https://github.com/sunpy/sunpy",
5
+ "local_path": "/Users/ghh/Documents/Code/Code2MCP-private/workspace/sunpy",
6
+ "description": "Python library",
7
+ "features": "Basic functionality",
8
+ "tech_stack": "Python",
9
+ "stars": 0,
10
+ "forks": 0,
11
+ "language": "Python",
12
+ "last_updated": "",
13
+ "complexity": "medium",
14
+ "intrusiveness_risk": "low"
15
+ },
16
+ "execution": {
17
+ "start_time": 1773267411.486086,
18
+ "end_time": 1773267629.4328032,
19
+ "duration": 217.94671726226807,
20
+ "status": "success",
21
+ "workflow_status": "success",
22
+ "nodes_executed": [
23
+ "download",
24
+ "analysis",
25
+ "env",
26
+ "generate",
27
+ "run",
28
+ "review",
29
+ "finalize"
30
+ ],
31
+ "total_files_processed": 17,
32
+ "environment_type": "unknown",
33
+ "llm_calls": 0,
34
+ "deepwiki_calls": 0
35
+ },
36
+ "tests": {
37
+ "original_project": {
38
+ "passed": false,
39
+ "details": {},
40
+ "test_coverage": "100%",
41
+ "execution_time": 0,
42
+ "test_files": []
43
+ },
44
+ "mcp_plugin": {
45
+ "passed": true,
46
+ "details": {},
47
+ "service_health": "healthy",
48
+ "startup_time": 0,
49
+ "transport_mode": "stdio",
50
+ "fastmcp_version": "unknown",
51
+ "mcp_version": "unknown"
52
+ }
53
+ },
54
+ "analysis": {
55
+ "structure": {
56
+ "packages": [
57
+ "source.benchmarks",
58
+ "source.sunpy",
59
+ "source.sunpy._dev",
60
+ "source.sunpy.coordinates",
61
+ "source.sunpy.data",
62
+ "source.sunpy.extern",
63
+ "source.sunpy.image",
64
+ "source.sunpy.io",
65
+ "source.sunpy.map",
66
+ "source.sunpy.net",
67
+ "source.sunpy.physics",
68
+ "source.sunpy.sun",
69
+ "source.sunpy.tests",
70
+ "source.sunpy.time",
71
+ "source.sunpy.timeseries",
72
+ "source.sunpy.util",
73
+ "source.sunpy.visualization"
74
+ ]
75
+ },
76
+ "dependencies": {
77
+ "has_environment_yml": false,
78
+ "has_requirements_txt": false,
79
+ "pyproject": true,
80
+ "setup_cfg": false,
81
+ "setup_py": false
82
+ },
83
+ "entry_points": {
84
+ "imports": [],
85
+ "cli": [],
86
+ "modules": []
87
+ },
88
+ "risk_assessment": {
89
+ "import_feasibility": 0.9,
90
+ "intrusiveness_risk": "low",
91
+ "complexity": "medium"
92
+ },
93
+ "deepwiki_analysis": {
94
+ "repo_url": "https://github.com/sunpy/sunpy",
95
+ "repo_name": "sunpy",
96
+ "error": "DeepWiki analysis failed",
97
+ "model": "gpt-5.3-codex",
98
+ "source": "llm_direct_analysis",
99
+ "success": false
100
+ },
101
+ "code_complexity": {
102
+ "cyclomatic_complexity": "medium",
103
+ "cognitive_complexity": "medium",
104
+ "maintainability_index": 75
105
+ },
106
+ "security_analysis": {
107
+ "vulnerabilities_found": 0,
108
+ "security_score": 85,
109
+ "recommendations": []
110
+ }
111
+ },
112
+ "plugin_generation": {
113
+ "files_created": [
114
+ "mcp_output/start_mcp.py",
115
+ "mcp_output/mcp_plugin/__init__.py",
116
+ "mcp_output/mcp_plugin/mcp_service.py",
117
+ "mcp_output/mcp_plugin/adapter.py",
118
+ "mcp_output/mcp_plugin/main.py",
119
+ "mcp_output/requirements.txt",
120
+ "mcp_output/README_MCP.md"
121
+ ],
122
+ "main_entry": "start_mcp.py",
123
+ "requirements": [
124
+ "fastmcp>=0.1.0",
125
+ "pydantic>=2.0.0"
126
+ ],
127
+ "readme_path": "/Users/ghh/Documents/Code/Code2MCP-private/workspace/sunpy/mcp_output/README_MCP.md",
128
+ "adapter_mode": "import",
129
+ "total_lines_of_code": 0,
130
+ "generated_files_size": 0,
131
+ "tool_endpoints": 0,
132
+ "supported_features": [
133
+ "Basic functionality"
134
+ ],
135
+ "generated_tools": [
136
+ "Basic tools",
137
+ "Health check tools",
138
+ "Version info tools"
139
+ ]
140
+ },
141
+ "code_review": {},
142
+ "errors": [],
143
+ "warnings": [],
144
+ "recommendations": [
145
+ "add a minimal smoke-test suite for MCP endpoints (server boot",
146
+ "endpoint discovery",
147
+ "one happy-path call per endpoint)",
148
+ "add contract tests with fixed fixtures for high-value tools (`parse_time`",
149
+ "`TimeRange`",
150
+ "`angular_radius`",
151
+ "`MapFactory`) to catch upstream API drift",
152
+ "introduce endpoint input/output schemas (Pydantic models) with stricter validation and clearer error messages",
153
+ "create a dependency-tiered CI matrix (core-only vs optional extras like `reproject/drms/zeep/asdf`) and mark endpoint availability accordingly",
154
+ "implement graceful degradation for missing optional dependencies with actionable install hints in responses",
155
+ "add timeout/retry/circuit-breaker guards around network-backed flows (notably `UnifiedDownloaderFactory`) to improve MCP reliability",
156
+ "provide async-safe wrappers or explicit sync execution boundaries for blocking SunPy calls to avoid event-loop stalls",
157
+ "add lightweight performance benchmarks for representative operations (time parsing",
158
+ "map creation",
159
+ "simple Fido query) and track regressions in CI",
160
+ "pin and periodically refresh MCP plugin requirements plus add compatibility tests against multiple SunPy/Astropy versions",
161
+ "expand `README_MCP.md` with concrete endpoint examples",
162
+ "dependency profiles",
163
+ "and troubleshooting for common import/runtime failures",
164
+ "add structured logging and request correlation IDs in `mcp_service.py` for observability and easier incident triage",
165
+ "add caching for deterministic expensive computations (ephemeris/time parsing hot paths) with bounded TTL/size",
166
+ "expose a health/readiness endpoint that verifies critical imports and optional capability flags",
167
+ "add security hardening (input size limits",
168
+ "safe path handling for file/map inputs",
169
+ "redaction of sensitive URLs/tokens in logs)",
170
+ "and document/automate release checks (lint",
171
+ "type-check",
172
+ "smoke tests",
173
+ "version bump) for the generated MCP plugin"
174
+ ],
175
+ "performance_metrics": {
176
+ "memory_usage_mb": 0,
177
+ "cpu_usage_percent": 0,
178
+ "response_time_ms": 0,
179
+ "throughput_requests_per_second": 0
180
+ },
181
+ "deployment_info": {
182
+ "supported_platforms": [
183
+ "Linux",
184
+ "Windows",
185
+ "macOS"
186
+ ],
187
+ "python_versions": [
188
+ "3.8",
189
+ "3.9",
190
+ "3.10",
191
+ "3.11",
192
+ "3.12"
193
+ ],
194
+ "deployment_methods": [
195
+ "Docker",
196
+ "pip",
197
+ "conda"
198
+ ],
199
+ "monitoring_support": true,
200
+ "logging_configuration": "structured"
201
+ },
202
+ "execution_analysis": {
203
+ "success_factors": [
204
+ "Workflow completed end-to-end with status=success across all planned nodes (download, analysis, env, generate, run, review, finalize).",
205
+ "Import-mode adapter strategy was feasible (import_feasibility=0.9), enabling direct wrapping of SunPy core APIs.",
206
+ "Generated MCP service booted healthy over stdio and plugin-level tests passed.",
207
+ "Low intrusiveness risk and medium complexity profile allowed non-invasive service scaffolding.",
208
+ "Repository analysis successfully completed via zip fallback despite DeepWiki failure."
209
+ ],
210
+ "failure_reasons": [
211
+ "No hard execution failure detected.",
212
+ "DeepWiki analysis failed (non-blocking) and reduced depth of automated semantic enrichment.",
213
+ "Observability/metrics gaps (0 for memory/cpu/latency/throughput) prevent runtime efficiency validation.",
214
+ "Original project test result indicates passed=false with empty details; this is a validation coverage gap rather than a workflow crash."
215
+ ],
216
+ "overall_assessment": "good",
217
+ "node_performance": {
218
+ "download_time": "Node completed successfully; exact per-node timing not provided. Repository ingestion worked via zip fallback for a large codebase (~582 files).",
219
+ "analysis_time": "Completed successfully with comprehensive package/dependency/risk mapping; medium complexity correctly identified.",
220
+ "generation_time": "Completed successfully; 7 MCP files generated with import adapter and 19 endpoint mappings identified in service info.",
221
+ "test_time": "MCP plugin health checks passed (healthy/stdin transport). Test depth appears minimal (startup and basic checks), with no granular endpoint contract/performance timings."
222
+ },
223
+ "resource_usage": {
224
+ "memory_efficiency": "Unknown due to missing telemetry (reported 0 MB). Instrument memory profiling in CI/runtime.",
225
+ "cpu_efficiency": "Unknown due to missing telemetry (reported 0%). Add CPU sampling for endpoint calls.",
226
+ "disk_usage": "Generated artifact footprint recorded as 0 (likely instrumentation/reporting defect). Actual disk use is non-zero given multiple generated files."
227
+ }
228
+ },
229
+ "technical_quality": {
230
+ "code_quality_score": 74,
231
+ "architecture_score": 78,
232
+ "performance_score": 61,
233
+ "maintainability_score": 76,
234
+ "security_score": 85,
235
+ "scalability_score": 68
236
+ }
237
+ }
sunpy/source/.DS_Store ADDED
Binary file (8.2 kB). View file
 
sunpy/source/.circleci/codecov_upload.sh ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash -e
2
+ curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import
3
+ curl -Os https://uploader.codecov.io/latest/linux/codecov
4
+ curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM
5
+ curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM.sig
6
+ gpgv codecov.SHA256SUM.sig codecov.SHA256SUM
7
+ shasum -a 256 -c codecov.SHA256SUM
8
+ chmod +x codecov
9
+ ./codecov "$@"
sunpy/source/.circleci/config.yml ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: 2.1
2
+
3
+ no-backports: &no-backports
4
+ name: Skip any branches called cherry-pick
5
+ command: |
6
+ if [[ "${CIRCLE_BRANCH}" == *"cherry-pick"* || "${CIRCLE_BRANCH}" == *"backport"* ]]; then
7
+ circleci step halt
8
+ fi
9
+
10
+ skip-check: &skip-check
11
+ name: Check for [ci skip]
12
+ command: bash .circleci/early_exit.sh
13
+
14
+ merge-check: &merge-check
15
+ name: Check if we need to merge upstream main
16
+ command: |
17
+ if [[ -n "${CIRCLE_PR_NUMBER}" ]]; then
18
+ git fetch origin --tags
19
+ git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/merge:pr/$CIRCLE_PR_NUMBER/merge
20
+ git checkout -qf pr/$CIRCLE_PR_NUMBER/merge
21
+ fi
22
+
23
+ apt-run: &apt-install
24
+ name: Install apt packages
25
+ command: |
26
+ sudo apt update
27
+ sudo apt install -y libopenjp2-7
28
+
29
+ jobs:
30
+ figure:
31
+ parameters:
32
+ jobname:
33
+ type: string
34
+ docker:
35
+ - image: cimg/python:3.12
36
+ environment:
37
+ TOXENV=<< parameters.jobname >>
38
+ steps:
39
+ - run: *no-backports
40
+ - checkout
41
+ - run: *skip-check
42
+ - run: *merge-check
43
+ - run: *apt-install
44
+ - run: pip install --user -U tox tox-pypi-filter
45
+ - run: tox -v -- -n 4
46
+ - run:
47
+ name: Running codecov
48
+ command: bash -e .circleci/codecov_upload.sh -f ".tmp/${TOXENV}/coverage.xml"
49
+ - store_artifacts:
50
+ path: .tmp/<< parameters.jobname >>/figure_test_images
51
+ - run:
52
+ name: "Image comparison page is available at: "
53
+ command: echo "${CIRCLE_BUILD_URL}/artifacts/${CIRCLE_NODE_INDEX}/.tmp/${TOXENV}/figure_test_images/fig_comparison.html"
54
+
55
+ deploy-reference-images:
56
+ parameters:
57
+ jobname:
58
+ type: string
59
+ docker:
60
+ - image: cimg/python:3.12
61
+ environment:
62
+ TOXENV: << parameters.jobname >>
63
+ GIT_SSH_COMMAND: ssh -i ~/.ssh/id_rsa_7b8fc81c13a3b446ec9aa50d3f626978
64
+ steps:
65
+ - checkout
66
+ - run: *skip-check
67
+ - run: *merge-check
68
+ - run: *apt-install
69
+ # Clear out all the ssh keys so that it always uses the write deploy key
70
+ - run: ssh-add -D
71
+ # Add private key for deploying to the figure tests repo
72
+ - add_ssh_keys:
73
+ fingerprints: "7b:8f:c8:1c:13:a3:b4:46:ec:9a:a5:0d:3f:62:69:78"
74
+ - run: ssh-keyscan github.com >> ~/.ssh/known_hosts
75
+ - run: git config --global user.email "sunpy@circleci" && git config --global user.name "SunPy Circle CI"
76
+ - run: git clone git@github.com:sunpy/sunpy-figure-tests.git --depth 1 -b sunpy-${CIRCLE_BRANCH} ~/sunpy-figure-tests/
77
+ # Generate Reference images
78
+ - run: pip install --user -U tox tox-pypi-filter
79
+ - run: rm -rf /home/circleci/sunpy-figure-tests/figures/$TOXENV/*
80
+ - run: tox -v -- -n 4 --mpl-generate-path=/home/circleci/sunpy-figure-tests/figures/$TOXENV | tee toxlog
81
+ - run: |
82
+ hashlib=$(grep "^figure_hashes.*\.json$" toxlog)
83
+ cp ./sunpy/tests/$hashlib /home/circleci/sunpy-figure-tests/figures/$TOXENV/
84
+ - run: |
85
+ cd ~/sunpy-figure-tests/
86
+ git pull
87
+ git status
88
+ git add .
89
+ git commit -m "Update reference figures from ${CIRCLE_BRANCH}" || echo "No changes to reference images to deploy"
90
+ git push
91
+
92
+ workflows:
93
+ version: 2
94
+
95
+ figure-tests:
96
+ jobs:
97
+ - figure:
98
+ name: << matrix.jobname >>
99
+ matrix:
100
+ parameters:
101
+ jobname:
102
+ - "py312-figure"
103
+ - "py312-figure-devdeps"
104
+
105
+ - deploy-reference-images:
106
+ name: baseline-<< matrix.jobname >>
107
+ matrix:
108
+ parameters:
109
+ jobname:
110
+ - "py312-figure"
111
+ - "py312-figure-devdeps"
112
+ requires:
113
+ - << matrix.jobname >>
114
+ filters:
115
+ branches:
116
+ only:
117
+ - main
sunpy/source/.circleci/early_exit.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ commitmessage=$(git log --pretty=%B -n 1)
4
+ if [[ $commitmessage = *"[ci skip]"* ]] || [[ $commitmessage = *"[skip ci]"* ]]; then
5
+ echo "Skipping build because [ci skip] found in commit message"
6
+ circleci step halt
7
+ fi
sunpy/source/.codecov.yaml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ comment: off
2
+ coverage:
3
+ status:
4
+ project:
5
+ default:
6
+ threshold: 0.2%
7
+
8
+ codecov:
9
+ require_ci_to_pass: false
10
+ notify:
11
+ wait_for_ci: true
sunpy/source/.coveragerc ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [run]
2
+ omit =
3
+ sunpy/conftest.py
4
+ sunpy/*setup_package*
5
+ sunpy/extern/*
6
+ sunpy/version*
7
+ */sunpy/conftest.py
8
+ */sunpy/*setup_package*
9
+ */sunpy/extern/*
10
+ */sunpy/version*
11
+ disable_warnings =
12
+ module-not-measured
13
+
14
+ [report]
15
+ exclude_lines =
16
+ # Have to re-enable the standard pragma
17
+ pragma: no cover
18
+ # Don't complain about packages we have installed
19
+ except ImportError
20
+ # Don't complain if tests don't hit assertions
21
+ raise AssertionError
22
+ raise NotImplementedError
23
+ # Don't complain about script hooks
24
+ def main(.*):
25
+ # Ignore branches that don't pertain to this version of Python
26
+ pragma: py{ignore_python_version}
27
+ # Don't complain about IPython completion helper
28
+ def _ipython_key_completions_
29
+ # typing.TYPE_CHECKING is False at runtime
30
+ if TYPE_CHECKING:
31
+ # Ignore typing overloads
32
+ @overload
sunpy/source/.cruft.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "template": "https://github.com/sunpy/package-template",
3
+ "commit": "9fdedba64f2ea78ba2fb3023285fb22a434cd91f",
4
+ "checkout": null,
5
+ "context": {
6
+ "cookiecutter": {
7
+ "package_name": "sunpy",
8
+ "module_name": "sunpy",
9
+ "short_description": "SunPy core package: Python for Solar Physics",
10
+ "author_name": "The SunPy Community",
11
+ "author_email": "sunpy@googlegroups.com",
12
+ "project_url": "https://sunpy.org",
13
+ "github_repo": "sunpy/sunpy",
14
+ "sourcecode_url": "https://github.com/sunpy/sunpy",
15
+ "download_url": "https://pypi.org/project/sunpy",
16
+ "documentation_url": "https://docs.sunpy.org",
17
+ "changelog_url": "https://docs.sunpy.org/en/stable/whatsnew/changelog.html",
18
+ "issue_tracker_url": "https://github.com/sunpy/sunpy/issues",
19
+ "license": "BSD 2-Clause",
20
+ "minimum_python_version": "3.12",
21
+ "use_compiled_extensions": "y",
22
+ "enable_dynamic_dev_versions": "y",
23
+ "include_example_code": "n",
24
+ "include_cruft_update_github_workflow": "y",
25
+ "use_extended_ruff_linting": "n",
26
+ "_sphinx_theme": "sunpy",
27
+ "_parent_project": "",
28
+ "_install_requires": "",
29
+ "_copy_without_render": [
30
+ "docs/_templates",
31
+ "docs/_static",
32
+ ".github/workflows/sub_package_update.yml"
33
+ ],
34
+ "_template": "https://github.com/sunpy/package-template",
35
+ "_commit": "9fdedba64f2ea78ba2fb3023285fb22a434cd91f"
36
+ }
37
+ },
38
+ "directory": null
39
+ }
sunpy/source/.editorconfig ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://editorconfig.org
2
+ root=true
3
+ # utf, UNIX-style new line
4
+
5
+ [*]
6
+ charset=utf-8
7
+ end_of_line=lf
8
+ insert_final_newline=true
9
+ trim_trailing_whitespace=true
10
+
11
+ [*.{py,rst,md}]
12
+ indent_style=space
13
+ indent_size=4
14
+
15
+ [*.yml]
16
+ indent_style=space
17
+ indent_size=2
sunpy/source/.flake8 ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [flake8]
2
+ ignore =
3
+ # missing-whitespace-around-operator
4
+ E225
5
+ # missing-whitespace-around-arithmetic-operator
6
+ E226
7
+ # line-too-long
8
+ E501
9
+ # unused-import
10
+ F401
11
+ # undefined-local-with-import-star
12
+ F403
13
+ # redefined-while-unused
14
+ F811
15
+ # Line break occurred before a binary operator
16
+ W503,
17
+ # Line break occurred after a binary operator
18
+ W504
19
+ max-line-length = 110
20
+ exclude =
21
+ .git
22
+ __pycache__
23
+ docs/conf.py
24
+ build
25
+ sunpy/data/sample.py
26
+ sunpy/extern/**
27
+ sunpy/__init__.py
28
+ rst-directives =
29
+ plot
sunpy/source/.isort.cfg ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [settings]
2
+ balanced_wrapping = true
3
+ skip =
4
+ sunpy/extern/
5
+ sunpy/cm/__init__.py
6
+ docs/conf.py
7
+ sunpy/__init__.py
8
+ default_section = THIRDPARTY
9
+ include_trailing_comma = true
10
+ known_astropy = astropy, asdf
11
+ known_first_party = sunpy
12
+ length_sort = false
13
+ length_sort_sections = stdlib
14
+ line_length = 110
15
+ multi_line_output = 3
16
+ no_lines_before = LOCALFOLDER
17
+ sections = STDLIB, THIRDPARTY, ASTROPY, FIRSTPARTY, LOCALFOLDER
sunpy/source/.mailmap ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Abhijeet Manhas <abhijeetmanhas720@gmail.com> Abhijeet Manhas <43112347+abhijeetmanhas@users.noreply.github.com>
2
+ Abhijeet Manhas <abhijeetmanhas720@gmail.com> abhijeetmanhas <abhijeetmanhas720@gmail.com>
3
+ Abigail L. Stevens <A.L.Stevens@uva.nl> Abigail Stevens <A.L.Stevens@uva.nl>
4
+ Abijith Bahuleyan <abijithbahuleyan@gmail.com> Abijith B <twentyse7en@github.com>
5
+ Abijith Bahuleyan <abijithbahuleyan@gmail.com> abijith-bahuleyan <abijithbahuleyan@gmail.com>
6
+ Advait Pimparkar <144479092+advait-zx@users.noreply.github.com> advait pimparkar <144479092+advait-zx@users.noreply.github.com>
7
+ Ahmad Saeed <ahmadsaeed3290@gmail.com> ahmad <53330530+ahmvdev@users.noreply.github.com>
8
+ Ahmad Saeed <ahmadsaeed3290@gmail.com> ahmvdev <ahmadsaeed3290@gmail.com>
9
+ Ahmed Hossam <hoss4614@gmail.com> Ahmed Hossam <108437588+ahmedhosssam@users.noreply.github.com>
10
+ Akash Verma <shivamvermashs@gmail.com> Akash Verma <akashzsh08@gmail.com>
11
+ Akash Verma <shivamvermashs@gmail.com> akash5100 <shivamvermashs@gmail.com>
12
+ Akshit Tyagi <tyagiakshit833@gmail.com> Akshit Tyagi <37214399+exitflynn@users.noreply.github.com>
13
+ Alasdair Wilson <alasdair.wlsn@gmail.com> Alasdair Wilson <60351846+alasdairwilson@users.noreply.github.com>
14
+ Alasdair Wilson <alasdair.wlsn@gmail.com> Alasdair Wilson <alasdair.wlsn@googlemail.com>
15
+ Alasdair Wilson <alasdair.wlsn@gmail.com> alasdairwilson <60351846+alasdairwilson@users.noreply.github.com>
16
+ Albert Y. Shih <ayshih@gmail.com> Albert Shih <ayshih@gmail.com>
17
+ Albert Y. Shih <ayshih@gmail.com> ayshih <ayshih@gmail.com>
18
+ Alex Hamilton <alex_ian_hamilton@hotmail.com> <alex@DESKTOP-UDJUNRJ.home>
19
+ Alex Hamilton <alex_ian_hamilton@hotmail.com> Alex <alex_ian_hamilton@hotmail.com>
20
+ Alex Hamilton <alex_ian_hamilton@hotmail.com> Alex Hamilton <Alex Hamilton>
21
+ Alex Hamilton <alex_ian_hamilton@hotmail.com> Alex Hamilton <Alex_Ian_Hamilton@hotmail.com>
22
+ Alex Hamilton <alex_ian_hamilton@hotmail.com> Alex-Ian-Hamilton <alex_ian_hamilton@hotmail.com>
23
+ Alex Hamilton <alex_ian_hamilton@hotmail.com> unknown <alex_ian_hamilton@hotmail.com>
24
+ Alex Wang <x249wang@uwaterloo.ca> Alex W <x249wang@uwaterloo.ca>
25
+ Amarjit Singh Gaba <asinghgaba@gmail.com> Amarjit <asinghgaba@gmail.com>
26
+ Amogh Jahagirdar <amoghjahagirdargsf@gmail.com> Amogh J <amoghjahagirdargsf@gmail.com>
27
+ Andrew Hill <andrewh.5299@gmail.com> Andrew Hill (AstroEngiSci) <andrewh.5299@gmail.com>
28
+ Andrew Inglis <a.r.inglis@gmail.com> Andrew Inglis <Inglis@scapa.local>
29
+ Andrew Inglis <a.r.inglis@gmail.com> System Administrator <root@scapa.local>
30
+ Andrew Inglis <a.r.inglis@gmail.com> aringlis <a.r.inglis@gmail.com>
31
+ Andrew Leonard <andy.j.leonard@gmail.com> Drew Leonard <andy.j.leonard@gmail.com>
32
+ Andrew Leonard <andy.j.leonard@gmail.com> drew <drew@corona.(none)>
33
+ André Chicrala <andrechicrala@northumbria.ac.uk> Andre Chicrala <andrechicrala@northumbria.ac.uk>
34
+ Aniket Mishra <aniketmishra717@gmail.com> yeppAniket <aniketmishra717@gmail.com>
35
+ Ankit <emonstar333@gmail.com> ankit <emonstar333@gmail.com>
36
+ Ankit Baruah <ankit.baruah1@gmail.com> abit2 <ankit.baruah1@gmail.com>
37
+ Ankit Khushwaha <ankitkhushwaha.dev@gmail.com> Ankit Khushwaha <124484362+ankitkhushwaha@users.noreply.github.com>
38
+ Ankit Khushwaha <ankitkhushwaha.dev@gmail.com> ankitkhushwaha <ankitkhushwaha.dev@gmail.com>
39
+ Ankit Kumar <ankitkmr@users.noreply.github.com> ankitkmr <technocrat.ankit@gmail.com>
40
+ Ansh Dixit <awesomeansh03@gmail.com> Ansh Dixit <64737847+Jett-Code@users.noreply.github.com>
41
+ Arib Alam <aribalam64@gmail.com> Arib Alam <arib.alam.iitkgp@gmail.com>
42
+ Aryan Chouhan <chouhanaryan@yahoo.com> Aryan Chouhan <46817791+chouhanaryan@users.noreply.github.com>
43
+ Aryan Shukla <shuklas2002@gmail.com> Telomelonia <shuklas2002@gmail.com>
44
+ Ashish Bastola <abastola0@gmail.com> abastola0 <abastola0@gmail.com>
45
+ Asish Panda <asishrocks95@gmail.com> kaichogami <asishrocks95@gmail.com>
46
+ Brett J Graham <brettgraham@gmail.com> Brett <brettgraham@gmail.com>
47
+ Brett J Graham <brettgraham@gmail.com> Brett Graham <brettgraham@gmail.com>
48
+ Brigitta Sipőcz <bsipocz@gmail.com> Brigitta Sipocz <b.sipocz@gmail.com>
49
+ Brigitta Sipőcz <bsipocz@gmail.com> Brigitta Sipocz <bsipocz@gmail.com>
50
+ Carlos Molina <carlosmolina.ord@gmail.com> cmolinaord <carlosmolina.ord@gmail.com>
51
+ Chloé Guennou <c.guennou@gmail.com> Chloé <c.guennou@gmail.com>
52
+ Chloé Guennou <c.guennou@gmail.com> cguennou <c.guennou@gmail.com>
53
+ Chris Bard <1957217+cbard@users.noreply.github.com> cbard <1957217+cbard@users.noreply.github.com>
54
+ Chris R. Gilly <gilly@swri.org> C. R. Gilly <gilly@swri.org>
55
+ Chris R. Gilly <gilly@swri.org> gillyspace27 <gilly@swri.org>
56
+ Daniel D'Avella <ddavella@stsci.edu> Dan D'Avella <ddavella@stsci.edu>
57
+ Daniel F. Ryan <ryand5@tcd.ie> Dan Ryan <ryand5@tcd.ie>
58
+ Daniel F. Ryan <ryand5@tcd.ie> DanRyanIrish <ryand5@tcd.ie>
59
+ Daniel Garcia Briseno <daniel.garciabriseno@nasa.gov> Daniel Garcia Briseno <94071409+dgarciabriseno@users.noreply.github.com>
60
+ David Pérez-Suárez <dps.helio@gmail.com> David PS <dps.helio@gmail.com>
61
+ David Pérez-Suárez <dps.helio@gmail.com> David Perez-Suarez <d.perez-suarez@ucl.ac.uk>
62
+ David Pérez-Suárez <dps.helio@gmail.com> David Perez-Suarez <dps.helio@gmail.com>
63
+ David Pérez-Suárez <dps.helio@gmail.com> DavidPS <dps.helio@gmail.com>
64
+ David Pérez-Suárez <dps.helio@gmail.com> dpshelio <dps.helio@gmail.com>
65
+ Devansh Shukla <devanshshukla99@outlook.com> devanshshukla99 <48386249+devanshshukla99@users.noreply.github.com>
66
+ Devansh Shukla <devanshshukla99@outlook.com> devanshshukla99 <devanshshukla99@outlook.com>
67
+ Dipanshu Verma <dipanshu231099@gmail.com> dipanshu <43211840+dipanshu231099@users.noreply.github.com>
68
+ Diya Khetarpal <152620955+Diya910@users.noreply.github.com> Diya910 <152620955+Diya910@users.noreply.github.com>
69
+ Dumindu Buddhika <dumindukarunathilaka@gmail.com> dumindux <dumindukarunathilaka@gmail.com>
70
+ Duygu Keşkek <duygukeskek@hotmail.com> Duygu KEŞKEK <duygukeskek@hotmail.com>
71
+ Ed Mansky <mansky@mindspring.com> ejm4567 <mansky@mindspring.com>
72
+ Enrico Paganin <enrico.paganin@mail.com> platipo <enrico.paganin@mail.com>
73
+ Fionnlagh Mackenzie Dover <fmackenziedover1@sheffield.ac.uk> FinMacDov <fmackenziedover1@sheffield.ac.uk>
74
+ Florian Mayer <florian.mayer@bitsrc.org> Florian Mayer <flormayer@aim.com>
75
+ Freek Verstringe <freek.verstringe@oma.be> freekv <freek.verstringe@oma.be>
76
+ Fu Yu <HaHaPanda@tutamail.com> 须臾 <HaHaPanda@tutamail.com>
77
+ Garrison Taylor <garrisontaylor@gmail.com> gbear605 <garrisontaylor@gmail.com>
78
+ Ghaith Kdimati <87309361+Ghaithq@users.noreply.github.com> Ghaithq <87309361+Ghaithq@users.noreply.github.com>
79
+ Gulshan Kumar <gulshankumar1210iiit@gmail.com> Gulshan Mittal <gulshankumar1210iiit@gmail.com>
80
+ Gulshan Kumar <gulshankumar1210iiit@gmail.com> gulshan-mittal <gulshankumar1210iiit@gmail.com>
81
+ Guntbert Reiter <guntbert@gmx.at> G. Reiter <guntbert@gmx.at>
82
+ Hannah Collier <hannah.collier@fhnw.ch> Hannah Collier <76849369+hannahc243@users.noreply.github.com>
83
+ Harsh Shah <80237556+ryuusama09@users.noreply.github.com> ryuusama <80237556+ryuusama09@users.noreply.github.com>
84
+ Haruhisa Iijima <haruhisa.iijima@gmail.com> Haruhisa IIIJIMA <h.iijima0202@gmail.com>
85
+ Haruhisa Iijima <haruhisa.iijima@gmail.com> Haruhisa IIIJIMA <haruhisa.iijima@gmail.com>
86
+ Himanshu <hs80941@gmail.com> himanshukgp <hs80941@gmail.com>
87
+ Himanshu Pathak <hpathak336@gmail.com> himanshupathak21061998 <hpathak336@gmail.com>
88
+ Jack Ireland <jack.ireland@nasa.gov> Jack Ireland <ireland@Ganymede.(none)>
89
+ Jack Ireland <jack.ireland@nasa.gov> Jack Ireland <ireland@blue.local>
90
+ Jack Ireland <jack.ireland@nasa.gov> Jack Ireland <jackireland@gmail.com>
91
+ Jack Ireland <jack.ireland@nasa.gov> wafels <jackireland@gmail.com>
92
+ Jack Ireland <jack.ireland@nasa.gov> wafels <jackreland@gmail.com>
93
+ Jacob <jgreg23@vt.edu> sudozer <36239573+sudozer@users.noreply.github.com>
94
+ James Calixto <jc2386@cornell.edu> jamescalixto <jc2386@cornell.edu>
95
+ James Paul Mason <jmason86@gmail.com> James Mason <jmason86@gmail.com>
96
+ Jan Gieseler <jan.gieseler@utu.fi> Jan Gieseler <39489154+jgieseler@users.noreply.github.com>
97
+ Jan Gieseler <jan.gieseler@utu.fi> jgieseler <jan.gieseler@utu.fi>
98
+ Jayraj Dulange <jayraj.jayraj@iitgn.ac.in> Deus1704 <jayraj.jayraj@iitgn.ac.in>
99
+ Jayraj Dulange <jayraj.jayraj@iitgn.ac.in> Jayraj Dulange <117574289+Deus1704@users.noreply.github.com>
100
+ Jeffrey Aaron Paul <jeffrey.paul2000@gmail.com> Jeffrey Aaron Paul <50923538+jeffreypaul15@users.noreply.github.com>
101
+ Jeffrey Aaron Paul <jeffrey.paul2000@gmail.com> jeffreypaul15 <jeffrey.paul2000@gmail.com>
102
+ Johan L. Freiherr von Forstner <forstner@physik.uni-kiel.de> Johan von Forstner <forstner@physik.uni-kiel.de>
103
+ Johan L. Freiherr von Forstner <forstner@physik.uni-kiel.de> Johan von Forstner <johan.forstner@gmail.com>
104
+ John Evans <john.g.evans.ne@gmail.com> jevans <john.g.evans.ne@gmail.com>
105
+ John Evans <john.g.evans.ne@gmail.com> quintusdias <john.g.evans.ne@gmail.com>
106
+ Jongyeob Park <pjystar@gmail.com> jongyeob <x9bong@hanmail.net>
107
+ Jose Ivan Campos Rozo <hypnus1803@gmail.com> Hypnus <hypnus1803@gmail.com>
108
+ Joseph Letts <joe@fasteroute.com> Joe Letts <joe@fasteroute.com>
109
+ Juan Camilo Buitrago-Casas <jcbuitragoc@unal.edu.co> Milo BC <jcbuitragoc@unal.edu.co>
110
+ Kalpesh Krishna <kalpeshk2011@gmail.com> KALPESH KRISHNA <kalpeshk2011@gmail.com>
111
+ Kateryna Ivashkiv <kate777iv@gmail.com> Katherine Ivashkiv <kate777iv@gmail.com>
112
+ Kateryna Ivashkiv <kate777iv@gmail.com> kathivashkiv <kate777iv@gmail.com>
113
+ Kaustubh Chaudhari <ckaustubhm06@gmail.com> kc611 <ckaustubhm06@gmail.com>
114
+ Kaustubh Hiware <hiwarekaustubh@googlemail.com> kaustubhhiware <hiwarekaustubh@googlemail.com>
115
+ Kris Akira Stern <krisastern@gmail.com> Kris Stern <krisastern@gmail.com>
116
+ Kris Akira Stern <krisastern@gmail.com> Kris Stern <krisastern@gobuddy.asia>
117
+ Krish Agrawal <diwankrish.17@gmail.com> Krish Agrawal <32320437+Krish2208@users.noreply.github.com>
118
+ Kritika Ranjan <kritikaranjan28@gmail.com> Kritika <kritikaranjan28@gmail.com>
119
+ Laura Hayes <hayesla@tcd.ie> Laura Hayes <lahayes@gs671-lhayesmbp.ndc.nasa.gov>
120
+ Laura Hayes <hayesla@tcd.ie> Laura Hayes <lauraannhayes@gmail.com>
121
+ Laura Hayes <hayesla@tcd.ie> hayesla <hayesla@tcd.ie>
122
+ Laura Hayes <hayesla@tcd.ie> hayesla <lauraannhayes@gmail.com>
123
+ Manit Singh <79140607+NucleonGodX@users.noreply.github.com> NucleonGodX <racerpro41@gmail.com>
124
+ Marius Giger <marius@akenza.io> Marius Giger <gigermarius@gmail.com>
125
+ Mateo Inchaurrandieta <mateo.inchaurrandieta@gmail.com> Mateo Inchaurrandieta <mateo.inchaurrandieta.13@ucl.ac.uk>
126
+ Matthew Mendero <39359693+Mmendero@users.noreply.github.com> Mmendero <39359693+Mmendero@users.noreply.github.com>
127
+ Maya Mohamed <mayamoh5m@gmail.com> Maya-Mohamed <mayamoh5m@gmail.com>
128
+ Md Akramul Haque <haquemdakramul@hotmail.com> Akram9 <haquemdakramul@hotmail.com>
129
+ Md Akramul Haque <haquemdakramul@hotmail.com> Md. Akramul Haque <akram@localhost.localdomain>
130
+ Michael Charlton <m.charlton@mac.com> Michael <m.charlton@mac.com>
131
+ Michael S Kirk <michael.s.kirk@nasa.gov> Michael Kirk <michael.s.kirk@nasa.gov>
132
+ Michael S Kirk <michael.s.kirk@nasa.gov> Michael S Kirk <michael.s.kirk@nasa.gov>
133
+ Michael S Kirk <michael.s.kirk@nasa.gov> SolarBoy <michael.s.kirk@nasa.gov>
134
+ Michael S Kirk <michael.s.kirk@nasa.gov> SolarBoy <mskirk@gs670-mkmac.ndc.nasa.gov>
135
+ Michael S Kirk <michael.s.kirk@nasa.gov> mskirk <michael.s.kirk@gmail.com>
136
+ Mika <77445020+tal66@users.noreply.github.com> tal66 <77445020+tal66@users.noreply.github.com>
137
+ Mingyu Jeon <mgjeon@khu.ac.kr> mgjeon <mgjeon@khu.ac.kr>
138
+ Monica Bobra <mbobra@stanford.edu> mbobra <mbobra@stanford.edu>
139
+ Mouloudi Mohamed Lyes <lyes.mouloudi.007@gmail.com> MOULOUDI Mohamed Lyes <lyes.mouloudi.007@gmail.com>
140
+ Mridul Pandey <mridulpandey27@gmail.com> mridulpandey <39450878+mridullpandey@users.noreply.github.com>
141
+ Mridul Pandey <mridulpandey27@gmail.com> mridulpandey <mridulpandey27@gmail.com>
142
+ Nabil Freij <nabil.freij@gmail.com> Nabil <nabil.freij@gmail.com>
143
+ Nabil Freij <nabil.freij@gmail.com> Nabil Freij <freij@baeri.org>
144
+ Nabil Freij <nabil.freij@gmail.com> Nabil Freij <n.freij@the-iea.org>
145
+ Nabil Freij <nabil.freij@gmail.com> Nabil Freij <nfreij@seti.org>
146
+ Nabil Freij <nabil.freij@gmail.com> Nabobalis <nabil.freij@gmail.com>
147
+ Nabil Freij <nabil.freij@gmail.com> nabobalis <1392107+nabobalis@users.noreply.github.com>
148
+ Nakul Shahdadpuri <nakulshahdadpuri3141@gmail.com> nakul-shahdadpuri <nakulshahdadpuri3141@gmail.com>
149
+ Naman9639 <naman9639224290@gmail.com> Naman <31286078+Naman9639@users.noreply.github.com>
150
+ Naman9639 <naman9639224290@gmail.com> Naman <naman9639224290@gmail.com>
151
+ Naman9639 <naman9639224290@gmail.com> Naman9639 <31286078+Naman9639@users.noreply.github.com>
152
+ Naveen Srinivasan <172697+naveensrinivasan@users.noreply.github.com>naveen <172697+naveensrinivasan@users.noreply.github.com>
153
+ Neeraj Kulkarni <nrjklk@gmail.com> neerajkulk <nrjklk@gmail.com>
154
+ Nischal Singh <32027279+davnish@users.noreply.github.com> Nischal Singh <nischalsingh@Nischals-MacBook-Air.local>
155
+ Norbert G Gyenge <gyenge.norbert@hotmail.com> Norbert Gyenge <gyenge.norbert@hotmail.com>
156
+ Ole Streicher <ole@aip.de> Ole Streicher <olebole@debian.org>
157
+ Paul J. Wright <paul@pauljwright.co.uk> Paul Wright <paul@pauljwright.co.uk>
158
+ Piyush Sharma <piyushsharma04321@gmail.com> ViciousEagle03 <piyushsharma04321@gmail.com>
159
+ Pratham Hole <prathamhole@gmail.com> Pratham Hole <139000226+Prtm2110@users.noreply.github.com>
160
+ Pratham Hole <prathamhole@gmail.com> Prtm2110 <139000226+Prtm2110@users.noreply.github.com>
161
+ Pratham Hole <prathamhole@gmail.com> Prtm2110 <prathamhole@gmail.com>
162
+ Pritish Chakraborty <chakrabortypritish@gmail.com> PritishC <pritishc@pritishc-HP-Mini-210-1100.(none)>
163
+ Pritish Chakraborty <chakrabortypritish@gmail.com> VaticanCameos <chakrabortypritish@gmail.com>
164
+ Priyank Lodha <priyank.bpgc@gmail.com> thelazy <priyank.bpgc@gmail.com>
165
+ Punyaslok Pattnaik <punyaslokpattnaik@yahoo.co.in> Punyaslok <punyaslokpattnaik@yahoo.co.in>
166
+ Punyaslok Pattnaik <punyaslokpattnaik@yahoo.co.in> punyaslokpattnaik@yahoo.co.in <punyaslokpattnaik@yahoo.co.in>
167
+ Punyaslok Pattnaik <punyaslokpattnaik@yahoo.co.in> punyaslokpattnaik@yahoo.co.in <punyaslokpattnaik@yahoo.co.in>
168
+ Quinn Arbolante <quinn.arbolante@gmail.com> Cubostar <cubostar@gmail.com>
169
+ Raahul Singh <raahulsingh002@gmail.com> Raahul Singh <raahul.s18@iiits.in>
170
+ Raahul Singh <raahulsingh002@gmail.com> Raahul-Singh <raahul.s18@iiits.in>
171
+ Raghav Agrawal <153320363+raghav20232023@users.noreply.github.com> RAGHAV AGRAWAL <153320363+raghav20232023@users.noreply.github.com>
172
+ Rajasekhar Reddy Mekala <rajasekharreddymekala732@gmail.com> rajasekharmekala <rajasekharreddymekala732@gmail.com>
173
+ Rajul Srivastava <rajul.iitkgp@gmail.com> Rajul <rajul.iitkgp@gmail.com>
174
+ Rajul Srivastava <rajul.iitkgp@gmail.com> Rajul <rajul09@gmail.com>
175
+ Rajul Srivastava <rajul.iitkgp@gmail.com> Rajul Srivastava <rajul09@gmail.com>
176
+ Ratul Das <53458166+ratuldas6@users.noreply.github.com> Ratul Das (NISER) <53458166+ratuldas6@users.noreply.github.com>
177
+ Rehan Chalana <rehanchalanaprsnl@gmail.com> rehan <rehanchalanaprsnl@gmail.com>
178
+ Rishabh Sharma <rishabh.sharma@students.iiit.ac.in> gunner272 <rishabh.sharma@students.iiit.ac.in>
179
+ Rishabh Sharma <rishabh.sharma@students.iiit.ac.in> rishabh <rishabh.sharma@students.iiit.ac.in>
180
+ Ruben De Visscher <ruben.de.visscher@gmail.com> Ruben De Visscher <ruben.devisscher@observatory.be>
181
+ Russell Hewett <rhewett@mit.edu> rhewett <russell.j.hewett@gmail.com>
182
+ Sally Dacie <sally.dacie.14@ucl.ac.uk> Sally <sally.dacie.14@ucl.ac.uk>
183
+ Sally Dacie <sally.dacie.14@ucl.ac.uk> SallyDa <sally.dacie.14@ucl.ac.uk>
184
+ Samriddhi Agarwal <samriddhi-dev@users.noreply.github.com> samriddhi-dev <samriddhi-dev@users.noreply.github.com>
185
+ Samuel Bennett <bennett.sm89@gmail.com> CyclingNinja <bennett.sm89@gmail.com>
186
+ Samuel Bennett <bennett.sm89@gmail.com> Samuel Bennett <CyclingNinja@users.noreply.github.com>
187
+ Samuel J. Van Kooten <svank@users.noreply.github.com> Sam Van Kooten <svank@users.noreply.github.com>
188
+ Samuel Jackson <mishraayush8705@gmail.com> samuel jackson <mishraayush8705@gmail.com>
189
+ Samuel T. Badman <54911235+STBadman@users.noreply.github.com> Samuel Badman <54911235+STBadman@users.noreply.github.com>
190
+ Sanjeev Dubey <getsanjeevdubey@gmail.com> getsanjeev <getsanjeevdubey@gmail.com>
191
+ Sanskar Modi <sanskar.modi.civ14@iitbhu.ac.in> Sanskar Modi <sanskarmodi97@gmail.com>
192
+ Sanskar Modi <sanskar.modi.civ14@iitbhu.ac.in> sanskar-modi <sanskar.modi.civ14@iitbhu.ac.in>
193
+ Sarthak Jain <jains8844@gmail.com> Sarthak Jain <42547508+jains8844@users.noreply.github.com>
194
+ Sarthak Jain <jains8844@gmail.com> jains8844 <jains8844@gmail.com>
195
+ Sashank Mishra <sashankmishra27@gmail.com> sashank27 <sashankmishra27@gmail.com>
196
+ Sashank Mishra <sashankmishra27@gmail.com> sashmish <sashankmishra27@gmail.com>
197
+ Saurav Kumar Roy <sauravnotfound29@gmail.com> Saurav Kumar Roy <136881235+Sauravroy34@users.noreply.github.com>
198
+ Saurav Kumar Roy <sauravnotfound29@gmail.com> Sauravroy34 <sauravnotfound29@gmail.com>
199
+ Shane Maloney <shane.maloney@dias.ie> Shane Maloney <maloneys@tcd.ie> Shane Maloney
200
+ Shane Maloney <shane.maloney@dias.ie> Shane Maloney <shane.maloney@tcd.ie> Shane Maloney
201
+ Shashank Srikanth <s.shashank2401@gmail.com> S Shashank <s.shashank2401@gmail.com>
202
+ Shivansh Mishra <dHoneysh@gmail.com> honey <dHoneysh@gmail.com>
203
+ Simon Liedtke <liedtke.simon@googlemail.com> derdon <liedtke.simon@googlemail.com>
204
+ Sophie Lemos <sophielemos@outlook.com> SophieLemos <48099481+SophieLemos@users.noreply.github.com>
205
+ Sophie Lemos <sophielemos@outlook.com> sophielemos <sophielemos@outlook.com>
206
+ Steven Christe <steven.d.christe@nasa.gov> Steven Christe <ehsteve@users.noreply.github.com>
207
+ Steven Christe <steven.d.christe@nasa.gov> Steven Christe <schriste@imacnation.(none)>
208
+ Steven Christe <steven.d.christe@nasa.gov> Steven Christe <steven.christe@nasa.gov>
209
+ Steven Christe <steven.d.christe@nasa.gov> steven christe <steven.d.christe@nasa.gov>
210
+ Stuart J. Mumford <stuart@cadair.com> Bertie Smith <stuart@cadair.com>
211
+ Stuart J. Mumford <stuart@cadair.com> Cadair <1391051+Cadair@users.noreply.github.com>
212
+ Stuart J. Mumford <stuart@cadair.com> Stuart Mumford <s.mumford@sheffield.ac.uk>
213
+ Stuart J. Mumford <stuart@cadair.com> Stuart Mumford <stuart@cadair.com>
214
+ Stuart J. Mumford <stuart@cadair.com> Stuart Mumford <stuart@mumford.me.uk>
215
+ Stuart J. Mumford <stuart@cadair.com> Stuart Mumford <stuartmumford@physics.org>
216
+ Stuart J. Mumford <stuart@cadair.com> U-Cadair-Core\stuart <stuart@Cadair-Core.(none)>
217
+ Sudarshan Konge <sudk1896@gmail.com> sudarshan <ssudk1896@gmail.com>
218
+ Sudarshan Konge <sudk1896@gmail.com> sudarshan <sudk1896@gmail.com>
219
+ Sudeep Sidhu <sudeepmanilsidhu@gmail.com> sidhu1012 <sudeepmanilsidhu@gmail.com>
220
+ Suleiman Farah <116139540+SuleimanFarah@users.noreply.github.com> SuleimanFarah <116139540+SuleimanFarah@users.noreply.github.com>
221
+ Swapnil Kannojia <swapnilkannojia123@gmail.com> swapnil99007 <swapnilkannojia123@gmail.com>
222
+ Tan Jia Qing <jiaqing2303@gmail.com> jiaqing23 <jiaqing2303@gmail.com>
223
+ Tannmay Yadav <tanmayy98@gmail.com> tannmay <tanmayy98@gmail.com>
224
+ Tathagata Paul <tathagatapaul7@gmail.com> 4molybdenum2 <tathagatapaul7@gmail.com>
225
+ Tiago M. D. Pereira <tiago.pereira@astro.uio.no> Tiago Pereira <tiago.pereira@astro.uio.no>
226
+ Tiago M. D. Pereira <tiago.pereira@astro.uio.no> tiagopereira <tiago@1x-193-157-254-255.uio.no>
227
+ Timo Laitinen <tlml@users.noreply.github.com> tlml <tlml@users.noreply.github.com>
228
+ Trestan F. Simon <trestansimon@gmail.com> Trestan Simon <trestansimon@gmail.com>
229
+ Trung Kien Dang <kiendang@users.noreply.github.com> Dang Trung Kien <kiendang@users.noreply.github.com>
230
+ Utkarsh Parkhi <uparkhi@ph.iitr.ac.in> utkarsh <uparkhi@ph.iitr.ac.in>
231
+ Utkarsh Parkhi <uparkhi@ph.iitr.ac.in> utkarsh parkhi <42688747+utkarshparkhi@users.noreply.github.com>
232
+ V. Keith Hughitt <keith.hughitt@gmail.com> Keith Hughitt <keith.hughitt@gmail.com>
233
+ V. Keith Hughitt <keith.hughitt@gmail.com> Keith Hughitt <keith@kore.(none)>
234
+ Vishnunarayan K I. <appukuttancr@gmail.com> Vishnunarayan K I <31964688+vn-ki@users.noreply.github.com>
235
+ Vishnunarayan K I. <appukuttancr@gmail.com> Vishnunarayan K I <appukuttancr@gmail.com>
236
+ Vishnunarayan K I. <appukuttancr@gmail.com> vn-ki <appukuttancr@gmail.com>
237
+ Wenli Mo <144060883+wmoapl@users.noreply.github.com> wmoapl <144060883+wmoapl@users.noreply.github.com>
238
+ Will Barnes <wtb2@rice.edu> Will Barnes <will.t.barnes@gmail.com>
239
+ Yash Jain <yashjainjain1704@gmail.com> yash_jain <yashjainjain1704@gmail.com>
240
+ Yash Kothari <yashkothari199767@gmail.com> CaptainDaVinci <yashkothari199767@gmail.com>
241
+ Yash Sharma <yashrsharma44@gmail.com> Yash <yashrsharma44@gmail.com>
242
+ Yudhik Agrawal <yudhik100@gmail.com> yudhik11 <yudhik100@gmail.com>
243
+ Yukie Nomiya <49163604+yukienomiya@users.noreply.github.com> Yuki <49163604+yukienomiya@users.noreply.github.com>
244
+ Zach Burnett <zachary.r.burnett@gmail.com> zacharyburnett <zburnett@stsci.edu>
sunpy/source/.pre-commit-config.yaml ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ exclude: ".*(.csv|.fits|.fts|.fit|.header|.txt|tca.*|.json|.asdf)$|^CITATION.rst|tools\/|sunpy\/extern\/|sunpy\/io\/src\/ana\/"
2
+ repos:
3
+ # This should be before any formatting hooks like isort
4
+ - repo: https://github.com/astral-sh/ruff-pre-commit
5
+ rev: "v0.14.14"
6
+ hooks:
7
+ - id: ruff
8
+ args: ["--fix"]
9
+ - repo: https://github.com/PyCQA/isort
10
+ rev: 7.0.0
11
+ hooks:
12
+ - id: isort
13
+ - repo: https://github.com/pre-commit/pre-commit-hooks
14
+ rev: v6.0.0
15
+ hooks:
16
+ - id: check-ast
17
+ - id: check-case-conflict
18
+ - id: trailing-whitespace
19
+ - id: check-yaml
20
+ - id: debug-statements
21
+ - id: check-added-large-files
22
+ args: ["--enforce-all", "--maxkb=1054"]
23
+ exclude: ""
24
+ - id: end-of-file-fixer
25
+ - id: mixed-line-ending
26
+ - repo: https://github.com/adhtruong/mirrors-typos
27
+ rev: v1.38.1
28
+ hooks:
29
+ - id: typos
30
+ - repo: local
31
+ hooks:
32
+ - id: generate-sunpy-net-hek-attrs
33
+ name: generate sunpy.net.hek.attrs
34
+ entry: python tools/hek_mkcls.py
35
+ language: system
36
+ pass_filenames: false
37
+ files: (^tools/(hek_mkcls|hektemplate)\.py$)|(^sunpy/net/hek/attrs\.py$)
38
+ - id: git-diff
39
+ name: git diff
40
+ entry: git diff --color --exit-code
41
+ language: system
42
+ pass_filenames: false
43
+ always_run: true
44
+ ci:
45
+ autofix_prs: false
46
+ autoupdate_schedule: "quarterly"
sunpy/source/.readthedocs.yaml ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-lts-latest
5
+ tools:
6
+ python: "mambaforge-latest"
7
+ jobs:
8
+ post_checkout:
9
+ - git fetch --unshallow || true
10
+ pre_install:
11
+ - git update-index --assume-unchanged .rtd-environment.yml docs/conf.py
12
+
13
+ conda:
14
+ environment: .rtd-environment.yml
15
+
16
+ sphinx:
17
+ builder: html
18
+ configuration: docs/conf.py
19
+ fail_on_warning: false
20
+
21
+ formats:
22
+ - htmlzip
23
+
24
+ python:
25
+ install:
26
+ - method: pip
27
+ extra_requirements:
28
+ - all
29
+ - docs
30
+ - docs-gallery
31
+ path: .
sunpy/source/.rtd-environment.yml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ name: rtd_sunpy
2
+ channels:
3
+ - conda-forge
4
+ dependencies:
5
+ - python=3.13
6
+ - pip
7
+ - openjpeg
8
+ - graphviz!=2.42.*,!=2.43.*
9
+ - pycairo
sunpy/source/.ruff.toml ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ target-version = "py311"
2
+ line-length = 120
3
+ exclude = [
4
+ ".git,",
5
+ "__pycache__",
6
+ "build",
7
+ "sunpy/extern/**",
8
+ "sunpy/version.py",
9
+ ]
10
+
11
+ [lint]
12
+ select = [
13
+ "E",
14
+ "F",
15
+ "W",
16
+ "UP",
17
+ "PT",
18
+ ]
19
+ extend-ignore = [
20
+ # pycodestyle (E, W)
21
+ "E501", # ignore line length will use a formatter instead
22
+ # pytest (PT)
23
+ "PT001", # Always use pytest.fixture()
24
+ "PT023", # Always use () on pytest decorators
25
+ # flake8-pie (PIE)
26
+ "PIE808", # Disallow passing 0 as the first argument to range
27
+ # flake8-use-pathlib (PTH)
28
+ "PTH123", # open() should be replaced by Path.open()
29
+ # Ruff (RUF)
30
+ "RUF003", # Ignore ambiguous quote marks, doesn't allow ' in comments
31
+ "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
32
+ "RUF013", # PEP 484 prohibits implicit `Optional`
33
+ "RUF015", # Prefer `next(iter(...))` over single element slice
34
+ ]
35
+
36
+ [lint.per-file-ignores]
37
+ "setup.py" = [
38
+ "INP001", # File is part of an implicit namespace package.
39
+ ]
40
+ "conftest.py" = [
41
+ "INP001", # File is part of an implicit namespace package.
42
+ ]
43
+ "docs/conf.py" = [
44
+ "E402" # Module imports not at top of file
45
+ ]
46
+ "docs/*.py" = [
47
+ "INP001", # File is part of an implicit namespace package.
48
+ ]
49
+ "examples/**.py" = [
50
+ "T201", # allow use of print in examples
51
+ "INP001", # File is part of an implicit namespace package.
52
+ ]
53
+ "__init__.py" = [
54
+ "E402", # Module level import not at top of cell
55
+ "F401", # Unused import
56
+ "F403", # from {name} import * used; unable to detect undefined names
57
+ "F405", # {name} may be undefined, or defined from star imports
58
+ ]
59
+ "test_*.py" = [
60
+ "E402", # Module level import not at top of cell
61
+ ]
62
+ # Need to import clients to register them, but don't use them in file
63
+ "sunpy/net/__init__.py" = [
64
+ "F811", # Redefinition of unused {name} from {row}
65
+ ]
66
+ # These files are allowed to use warnings.warn
67
+ "sunpy/util/exceptions.py" = ["TID251"]
68
+ "sunpy/util/tests/test_logger.py" = ["TID251"]
69
+ "sunpy/util/decorators.py" = ["TID251"]
70
+
71
+ [lint.pydocstyle]
72
+ convention = "numpy"
73
+
74
+ [lint.flake8-tidy-imports]
75
+ [lint.flake8-tidy-imports.banned-api]
76
+ "warnings.warn".msg = "Use sunpy specific warning helpers warn_* from sunpy.utils.exceptions"
sunpy/source/.test_package_pins.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # This file is used to pin test packages across sunpy coordinated packages
2
+ # Do not remove, even if it's empty!
sunpy/source/.zenodo.json ADDED
@@ -0,0 +1,1046 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "description": "sunpy is a software library that provides fundamental tools for accessing, loading and interacting with solar physics data in Python",
3
+ "license": "BSD-2-Clause",
4
+ "title": "sunpy: A Core Package for Solar Physics",
5
+ "upload_type": "software",
6
+ "creators": [
7
+ {
8
+ "name": "Stuart J. Mumford",
9
+ "orcid": "0000-0003-4217-4642",
10
+ "affiliation": "Aperio Software Ltd."
11
+ },
12
+ {
13
+ "name": "Nabil Freij",
14
+ "orcid": "0000-0002-6253-082X",
15
+ "affiliation": "SETI Institute & Lockheed Martin Solar and Astrophysics Laboratory"
16
+ },
17
+ {
18
+ "name": "David Stansby",
19
+ "orcid": "0000-0002-1365-1908",
20
+ "affiliation": "University College London"
21
+ },
22
+ {
23
+ "name": "Albert Y. Shih",
24
+ "orcid": "0000-0001-6874-2594",
25
+ "affiliation": "NASA Goddard Space Flight Center"
26
+ },
27
+ {
28
+ "name": "Steven Christe",
29
+ "orcid": "0000-0001-6127-795X",
30
+ "affiliation": "NASA Goddard Space Flight Center"
31
+ },
32
+ {
33
+ "name": "Jack Ireland",
34
+ "orcid": "0000-0002-2019-8881",
35
+ "affiliation": "NASA Goddard Space Flight Center"
36
+ },
37
+ {
38
+ "name": "Florian Mayer"
39
+ },
40
+ {
41
+ "name": "V. Keith Hughitt",
42
+ "orcid": "0000-0003-0787-9559",
43
+ "affiliation": "Center for Cancer Research, National Cancer Institute"
44
+ },
45
+ {
46
+ "name": "Daniel F. Ryan",
47
+ "orcid": "0000-0001-8661-3825",
48
+ "affiliation": "University College London, Mullard Space Science Laboratory (UCL/MSSL)"
49
+ },
50
+ {
51
+ "name": "Simon Liedtke"
52
+ },
53
+ {
54
+ "name": "Will Barnes",
55
+ "orcid": "0000-0001-9642-6089",
56
+ "affiliation": "Department of Physics, American University & NASA Goddard Space Flight Center"
57
+ },
58
+ {
59
+ "name": "Laura Hayes",
60
+ "orcid": "0000-0002-6835-2390",
61
+ "affiliation": "Dublin Institute for Advanced Studies"
62
+ },
63
+ {
64
+ "name": "David Pérez-Suárez",
65
+ "orcid": "0000-0003-0784-6909",
66
+ "affiliation": "University College London"
67
+ },
68
+ {
69
+ "name": "Vishnunarayan K I."
70
+ },
71
+ {
72
+ "name": "Pritish Chakraborty",
73
+ "orcid": "0000-0001-8875-5819",
74
+ "affiliation": "Manav Rachna University"
75
+ },
76
+ {
77
+ "name": "Andrew Inglis",
78
+ "orcid": "0000-0003-0656-2437",
79
+ "affiliation": "Catholic University of America & NASA Goddard Space Flight Center"
80
+ },
81
+ {
82
+ "name": "Punyaslok Pattnaik",
83
+ "orcid": "0000-0001-6216-2353",
84
+ "affiliation": "International Institute of Information Technology, Hyderabad"
85
+ },
86
+ {
87
+ "name": "Brigitta Sipőcz",
88
+ "orcid": "0000-0002-3713-6337",
89
+ "affiliation": "DIRAC Institute, University of Washington"
90
+ },
91
+ {
92
+ "name": "Ahmed Hossam",
93
+ "orcid": "0009-0007-7321-9109",
94
+ "affiliation": "Faculty of Computers and Informatics, Zagazig University"
95
+ },
96
+ {
97
+ "name": "Conor MacBride",
98
+ "orcid": "0000-0002-9901-8723",
99
+ "affiliation": "Astrophysics Research Centre, School of Mathematics and Physics, Queen's University Belfast"
100
+ },
101
+ {
102
+ "name": "Rishabh Sharma"
103
+ },
104
+ {
105
+ "name": "Andrew Leonard",
106
+ "orcid": "0000-0001-5270-7487",
107
+ "affiliation": "Aperio Software Ltd."
108
+ },
109
+ {
110
+ "name": "Russell Hewett",
111
+ "orcid": "0000-0001-8944-4705",
112
+ "affiliation": "Department of Mathematics, Virginia Polytechnic Institute and State University"
113
+ },
114
+ {
115
+ "name": "Alex Hamilton"
116
+ },
117
+ {
118
+ "name": "Abhijeet Manhas",
119
+ "orcid": "0000-0002-0757-2883",
120
+ "affiliation": "School of Computing and Electrical Engineering, Indian Institute of Technology Mandi"
121
+ },
122
+ {
123
+ "name": "Asish Panda"
124
+ },
125
+ {
126
+ "name": "Matt Earnshaw"
127
+ },
128
+ {
129
+ "name": "Nitin Choudhary",
130
+ "orcid": "0000-0001-6915-4583",
131
+ "affiliation": "Department of Mathematics, Indian Institute of Technology, Kharagpur"
132
+ },
133
+ {
134
+ "name": "Ankit Kumar"
135
+ },
136
+ {
137
+ "name": "Raahul Singh",
138
+ "orcid": "0000-0003-4114-8856",
139
+ "affiliation": "​Indian Institute of Information Technology, Sri City​"
140
+ },
141
+ {
142
+ "name": "Prateek Chanda",
143
+ "orcid": "0000-0002-7068-2866",
144
+ "affiliation": "Department of Computer Science & Technology, Indian Institute of Engineering Science & Technology, Shibpur"
145
+ },
146
+ {
147
+ "name": "Saurav Kumar Roy",
148
+ "orcid": "0009-0007-3703-6532",
149
+ "affiliation": "Amrita Vishwa Vidyapeetham, Amritapuri"
150
+ },
151
+ {
152
+ "name": "Shane Maloney",
153
+ "orcid": "0000-0002-4715-1805",
154
+ "affiliation": "Dublin Institute for Advanced Studies"
155
+ },
156
+ {
157
+ "name": "Pratham Hole",
158
+ "orcid": "0009-0009-6926-1034"
159
+ },
160
+ {
161
+ "name": "Alasdair Wilson",
162
+ "orcid": "0000-0003-0820-8159",
163
+ "affiliation": "Oxford Research Software Engineering Team, University of Oxford"
164
+ },
165
+ {
166
+ "name": "Md Akramul Haque",
167
+ "affiliation": "Department of Mechanical Engineering, ZHCET, Aligarh Muslim University"
168
+ },
169
+ {
170
+ "name": "Chris R. Gilly",
171
+ "orcid": "0000-0003-0021-9056",
172
+ "affiliation": "Southwest Research Institute"
173
+ },
174
+ {
175
+ "name": "Michael S Kirk",
176
+ "orcid": "0000-0001-9874-1429",
177
+ "affiliation": "Catholic University of America & NASA Goddard Space Flight Center"
178
+ },
179
+ {
180
+ "name": "Michael Mueller"
181
+ },
182
+ {
183
+ "name": "Sudarshan Konge"
184
+ },
185
+ {
186
+ "name": "Matt Wentzel-Long",
187
+ "orcid": "0000-0002-3106-4598",
188
+ "affiliation": "Stark State College"
189
+ },
190
+ {
191
+ "name": "Rajul Srivastava"
192
+ },
193
+ {
194
+ "name": "Samuel Bennett",
195
+ "orcid": "0000-0001-6420-4422",
196
+ "affiliation": "Aperio Software Ltd."
197
+ },
198
+ {
199
+ "name": "Yash Jain",
200
+ "orcid": "0000-0001-5347-4734",
201
+ "affiliation": "Indian Institute of Technology, Kharagpur"
202
+ },
203
+ {
204
+ "name": "Lazar Zivadinovic",
205
+ "orcid": "0000-0003-1349-1606"
206
+ },
207
+ {
208
+ "name": "Ankit Baruah"
209
+ },
210
+ {
211
+ "name": "Quinn Arbolante",
212
+ "affiliation": "Lockheed Martin Solar and Astrophysics Laboratory",
213
+ "orcid": "0000-0003-0260-453X"
214
+ },
215
+ {
216
+ "name": "Trestan F. Simon",
217
+ "orcid": "0009-0000-3029-8619"
218
+ },
219
+ {
220
+ "name": "Michael Charlton"
221
+ },
222
+ {
223
+ "name": "Sashank Mishra",
224
+ "orcid": "0000-0001-8302-1584",
225
+ "affiliation": "Indian Institute of Information Technology, Allahabad"
226
+ },
227
+ {
228
+ "name": "Jeffrey Aaron Paul",
229
+ "affiliation": "Dayananda Sagar College of Engineering, Bangalore"
230
+ },
231
+ {
232
+ "name": "Akash Verma"
233
+ },
234
+ {
235
+ "name": "Nicky Chorley",
236
+ "orcid": "0000-0002-2747-2716",
237
+ "affiliation": "Centre for Fusion, Space and Astrophysics, Department of Physics, University of Warwick"
238
+ },
239
+ {
240
+ "name": "Aryan Chouhan",
241
+ "orcid": "0000-0001-8004-7586",
242
+ "affiliation": "Dwarkadas Jivanlal Sanghvi College of Engineering, University of Mumbai"
243
+ },
244
+ {
245
+ "name": "Himanshu"
246
+ },
247
+ {
248
+ "name": "James Paul Mason",
249
+ "orcid": "0000-0002-3783-5509",
250
+ "affiliation": "Laboratory for Atmospheric and Space Physics, University of Colorado Boulder"
251
+ },
252
+ {
253
+ "name": "Sanskar Modi"
254
+ },
255
+ {
256
+ "name": "Yash Sharma",
257
+ "orcid": "0000-0002-7861-9677",
258
+ "affiliation": "Indian Institute of Technology, Kharagpur"
259
+ },
260
+ {
261
+ "name": "Akshit Tyagi",
262
+ "orcid": "0009-0005-4804-9035",
263
+ "affiliation": "Jaypee Institute of Information Technology"
264
+ },
265
+ {
266
+ "name": "Aritra Sinha",
267
+ "orcid": "0009-0008-2531-1012",
268
+ "affiliation": "National Institute of Technology Karnataka, Surathkal"
269
+ },
270
+ {
271
+ "name": "Naman9639"
272
+ },
273
+ {
274
+ "name": "Monica Bobra",
275
+ "orcid": "0000-0002-5662-9604"
276
+ },
277
+ {
278
+ "name": "Jose Ivan Campos Rozo",
279
+ "orcid": "0000-0001-8883-6790",
280
+ "affiliation": "Institut für Physik/IGAM, Karl-Franzens-Universität Graz"
281
+ },
282
+ {
283
+ "name": "Larry Manley"
284
+ },
285
+ {
286
+ "name": "Kateryna Ivashkiv"
287
+ },
288
+ {
289
+ "name": "Timo Laitinen",
290
+ "orcid": "0000-0002-7719-7783",
291
+ "affiliation": "Jeremiah Horrocks Institute, University of Central Lancashire"
292
+ },
293
+ {
294
+ "name": "Agneet Chatterjee",
295
+ "orcid": "0000-0002-0961-9569",
296
+ "affiliation": "Jadavpur University, Kolkata"
297
+ },
298
+ {
299
+ "name": "Ansh Dixit",
300
+ "orcid": "0009-0004-7872-0419",
301
+ "affiliation": "Graphic Era (Deemed to be University), Dehradun"
302
+ },
303
+ {
304
+ "name": "Brett J Graham",
305
+ "orcid": "0000-0001-6315-4507",
306
+ "affiliation": "Space Telescope Science Institute"
307
+ },
308
+ {
309
+ "name": "Jan Gieseler",
310
+ "orcid": "0000-0003-1848-7067",
311
+ "affiliation": "University of Turku"
312
+ },
313
+ {
314
+ "name": "Jayraj Dulange",
315
+ "orcid": "0009-0003-2993-7382",
316
+ "affiliation": "Indian Institute of Technology Gandhinagar"
317
+ },
318
+ {
319
+ "name": "Johan Freiherr von Forstner",
320
+ "orcid": "0000-0002-1390-4776",
321
+ "affiliation": "Institut für Experimentelle und Angewandte Physik, University of Kiel"
322
+ },
323
+ {
324
+ "name": "Juanjo Bazán",
325
+ "orcid": "0000-0001-7699-3983",
326
+ "affiliation": "CIEMAT Particle Physics Unit"
327
+ },
328
+ {
329
+ "name": "Kris Akira Stern",
330
+ "orcid": "0000-0003-1613-8947",
331
+ "affiliation": "University of Hong Kong & University of London"
332
+ },
333
+ {
334
+ "name": "Aryan Shukla",
335
+ "orcid": "0009-0001-9467-4836",
336
+ "affiliation": "Indian Institute of Technology Roorkee"
337
+ },
338
+ {
339
+ "name": "John Evans"
340
+ },
341
+ {
342
+ "name": "Sarthak Jain"
343
+ },
344
+ {
345
+ "name": "Michael Malocha"
346
+ },
347
+ {
348
+ "name": "Sourav Ghosh",
349
+ "orcid": "0000-0002-7259-5651",
350
+ "affiliation": "Jadavpur University, Kolkata"
351
+ },
352
+ {
353
+ "name": "Airmansmith97"
354
+ },
355
+ {
356
+ "name": "Ankit Khushwaha",
357
+ "orcid": "0009-0009-3953-4206",
358
+ "affiliation": "Indian Institute Of Technology Dharwad (IIT-DH)"
359
+ },
360
+ {
361
+ "name": "Dominik Stańczak",
362
+ "orcid": "0000-0001-6291-8843",
363
+ "affiliation": "University of Warsaw"
364
+ },
365
+ {
366
+ "name": "Manit Singh",
367
+ "orcid": "0009-0002-6031-3810",
368
+ "affiliation": "Netaji Subhas University of Technology"
369
+ },
370
+ {
371
+ "name": "Rajiv Ranjan Singh",
372
+ "orcid": "0000-0002-1266-4790",
373
+ "affiliation": "JSS Academy of Technical Education, Bengaluru"
374
+ },
375
+ {
376
+ "name": "Ruben De Visscher"
377
+ },
378
+ {
379
+ "name": "Shresth Verma",
380
+ "orcid": "0000-0003-0370-5471",
381
+ "affiliation": "Atal Bihari Vajpayee-Indian Institute of Information Technology and Management, Gwalior"
382
+ },
383
+ {
384
+ "name": "Sophie Lemos"
385
+ },
386
+ {
387
+ "name": "Ankit Agrawal"
388
+ },
389
+ {
390
+ "name": "Arib Alam"
391
+ },
392
+ {
393
+ "name": "Dumindu Buddhika"
394
+ },
395
+ {
396
+ "name": "Hannah Collier",
397
+ "orcid": "0000-0001-5592-8023",
398
+ "affiliation": "University of Applied Sciences Northwestern Switzerland & ETH Zürich"
399
+ },
400
+ {
401
+ "name": "Haruhisa Iijima",
402
+ "orcid": "0000-0002-1007-181X",
403
+ "affiliation": "Nagoya University"
404
+ },
405
+ {
406
+ "name": "Himanshu Pathak",
407
+ "orcid": "0000-0001-9387-4492",
408
+ "affiliation": "Shri Siddhi Vinayak Institute of Technology"
409
+ },
410
+ {
411
+ "name": "Jai Ram Rideout",
412
+ "orcid": "0000-0003-2587-1454",
413
+ "affiliation": "Dogfox Software LLC"
414
+ },
415
+ {
416
+ "name": "Swapnil Sharma"
417
+ },
418
+ {
419
+ "name": "Wenli Mo",
420
+ "orcid": "0000-0002-9179-9801",
421
+ "affiliation": "Johns Hopkins Applied Physics Lab"
422
+ },
423
+ {
424
+ "name": "Daniel Garcia Briseno"
425
+ },
426
+ {
427
+ "name": "Harsh Shah",
428
+ "orcid": "0009-0000-0795-8471",
429
+ "affiliation": "Dwarkadas Jivanlal Sanghvi College of Engineering, University of Mumbai"
430
+ },
431
+ {
432
+ "name": "Jongyeob Park",
433
+ "orcid": "0000-0002-1063-9129",
434
+ "affiliation": "Space Science Division, Korea Astronomy and Space Science Institute"
435
+ },
436
+ {
437
+ "name": "Matt Bates"
438
+ },
439
+ {
440
+ "name": "Tanish Yelgoe",
441
+ "affiliation": "Indian Institute of Technology Gandhinagar (IIT-GN)"
442
+ },
443
+ {
444
+ "name": "Devansh Shukla",
445
+ "orcid": "0000-0003-0610-9747",
446
+ "affiliation": "Sardar Vallabhbhai National Institute of Technology, Surat"
447
+ },
448
+ {
449
+ "name": "Marius Giger",
450
+ "orcid": "0000-0002-6863-6502",
451
+ "affiliation": "FHNW - University of Applied Sciences and Arts Northwestern Switzerland"
452
+ },
453
+ {
454
+ "name": "Pankaj Mishra"
455
+ },
456
+ {
457
+ "name": "Deepankar Sharma"
458
+ },
459
+ {
460
+ "name": "Dhruv Goel"
461
+ },
462
+ {
463
+ "name": "Garrison Taylor",
464
+ "affiliation": "Center for Astrophysics | Harvard & Smithsonian"
465
+ },
466
+ {
467
+ "name": "Goran Cetusic"
468
+ },
469
+ {
470
+ "name": "Guntbert Reiter"
471
+ },
472
+ {
473
+ "name": "Jacob"
474
+ },
475
+ {
476
+ "name": "Mateo Inchaurrandieta"
477
+ },
478
+ {
479
+ "name": "Piyush Sharma",
480
+ "orcid": "0009-0005-1579-5787",
481
+ "affiliation": "Indian Institute of Technology Roorkee"
482
+ },
483
+ {
484
+ "name": "Sally Dacie",
485
+ "orcid": "0000-0001-7572-2903",
486
+ "affiliation": "Mullard Space Science Laboratory, University College London"
487
+ },
488
+ {
489
+ "name": "Sanjeev Dubey"
490
+ },
491
+ {
492
+ "name": "Arthur Eigenbrot",
493
+ "orcid": "0000-0003-0810-4368",
494
+ "affiliation": "National Solar Observatory"
495
+ },
496
+ {
497
+ "name": "Benjamin Mampaey",
498
+ "orcid": "0000-0001-6541-4966",
499
+ "affiliation": "Royal Observatory of Belgium"
500
+ },
501
+ {
502
+ "name": "Erik Bray"
503
+ },
504
+ {
505
+ "name": "Maya Mohamed",
506
+ "affiliation": "Cairo University"
507
+ },
508
+ {
509
+ "name": "Nick Murphy",
510
+ "affiliation": "Center for Astrophysics | Harvard & Smithsonian",
511
+ "orcid": "0000-0001-6628-8033"
512
+ },
513
+ {
514
+ "name": "Rutuja Surve"
515
+ },
516
+ {
517
+ "name": "Samuel Jackson"
518
+ },
519
+ {
520
+ "name": "Serge Zahniy",
521
+ "orcid": "0000-0001-8835-7087",
522
+ "affiliation": "NASA Goddard Space Flight Center"
523
+ },
524
+ {
525
+ "name": "Sudeep Sidhu"
526
+ },
527
+ {
528
+ "name": "Tomas Meszaros"
529
+ },
530
+ {
531
+ "name": "Utkarsh Parkhi"
532
+ },
533
+ {
534
+ "name": "William Russell"
535
+ },
536
+ {
537
+ "name": "Abhigyan Bose"
538
+ },
539
+ {
540
+ "name": "Abhishek Pandey"
541
+ },
542
+ {
543
+ "name": "Abinash Mahapatra",
544
+ "orcid": "0009-0000-5975-6775",
545
+ "affiliation": "Odisha University of Technology and Research"
546
+ },
547
+ {
548
+ "name": "Adrian Price-Whelan",
549
+ "orcid": "0000-0003-0872-7098",
550
+ "affiliation": "Center for Computational Astrophysics, Flatiron Institute"
551
+ },
552
+ {
553
+ "name": "Amogh Jahagirdar"
554
+ },
555
+ {
556
+ "name": "André Chicrala",
557
+ "orcid": "0000-0002-5230-4909",
558
+ "affiliation": "Northumbria University"
559
+ },
560
+ {
561
+ "name": "Aniket Mishra",
562
+ "orcid": "0009-0008-4790-5604"
563
+ },
564
+ {
565
+ "name": "Ankit"
566
+ },
567
+ {
568
+ "name": "Chloé Guennou"
569
+ },
570
+ {
571
+ "name": "Daniel D'Avella"
572
+ },
573
+ {
574
+ "name": "Daniel Williams",
575
+ "orcid": "0000-0003-3772-198X",
576
+ "affiliation": "School of Physics & Astronomy, University of Glasgow"
577
+ },
578
+ {
579
+ "name": "Dipanshu Verma",
580
+ "orcid": "0000-0003-2461-5547",
581
+ "affiliation": "Indian Institute of Technology, Mandi"
582
+ },
583
+ {
584
+ "name": "Jordan Ballew"
585
+ },
586
+ {
587
+ "name": "Krish Agrawal"
588
+ },
589
+ {
590
+ "name": "Mingyu Jeon",
591
+ "orcid": "0009-0004-7798-5052",
592
+ "affiliation": "Kyung Hee University"
593
+ },
594
+ {
595
+ "name": "Mubin Manasia"
596
+ },
597
+ {
598
+ "name": "Neeraj Kulkarni"
599
+ },
600
+ {
601
+ "name": "Nischal Singh",
602
+ "orcid": "0009-0007-2165-052X",
603
+ "affiliation": "Madhav Institute of Technology & Science, Gwalior"
604
+ },
605
+ {
606
+ "name": "Ole Streicher",
607
+ "orcid": "0000-0001-7751-1843",
608
+ "affiliation": "Leibniz Institute for Astrophysics Potsdam"
609
+ },
610
+ {
611
+ "name": "Priyank Lodha"
612
+ },
613
+ {
614
+ "name": "Samuel J. Van Kooten",
615
+ "orcid": "0000-0002-4472-8517",
616
+ "affiliation": "Southwest Research Institute"
617
+ },
618
+ {
619
+ "name": "Shivansh Mishra"
620
+ },
621
+ {
622
+ "name": "Thomas Robitaille"
623
+ },
624
+ {
625
+ "name": "Tom Augspurger"
626
+ },
627
+ {
628
+ "name": "Yash Krishan"
629
+ },
630
+ {
631
+ "name": "Abijith Bahuleyan"
632
+ },
633
+ {
634
+ "name": "Advait Pimparkar"
635
+ },
636
+ {
637
+ "name": "Adwait Bhope",
638
+ "orcid": "0000-0002-7133-8776",
639
+ "affiliation": "Savitribai Phule Pune University"
640
+ },
641
+ {
642
+ "name": "Ahmad Saeed"
643
+ },
644
+ {
645
+ "name": "Amarjit Singh Gaba",
646
+ "orcid": "0000-0002-9505-0160",
647
+ "affiliation": "School of Mathematics, Cardiff University"
648
+ },
649
+ {
650
+ "name": "Andrew Hill"
651
+ },
652
+ {
653
+ "name": "Bernhard M. Wiedemann"
654
+ },
655
+ {
656
+ "name": "Carlos Molina",
657
+ "orcid": "0000-0003-0300-4106"
658
+ },
659
+ {
660
+ "name": "Diya Khetarpal",
661
+ "orcid": "0009-0009-4729-6797"
662
+ },
663
+ {
664
+ "name": "Duygu Keşkek"
665
+ },
666
+ {
667
+ "name": "Ishtyaq Habib"
668
+ },
669
+ {
670
+ "name": "Joseph Letts",
671
+ "orcid": "0000-0001-9900-739X"
672
+ },
673
+ {
674
+ "name": "Karthikeyan Singaravelan"
675
+ },
676
+ {
677
+ "name": "Kritika Ranjan",
678
+ "orcid": "0000-0001-5638-016X",
679
+ "affiliation": "Jain (Deemed-to-be University), Bangalore"
680
+ },
681
+ {
682
+ "name": "Mridul Pandey"
683
+ },
684
+ {
685
+ "name": "Noah Altunian"
686
+ },
687
+ {
688
+ "name": "Reid Gomillion"
689
+ },
690
+ {
691
+ "name": "Samriddhi Agarwal",
692
+ "orcid": "0000-0003-4497-1637",
693
+ "affiliation": "Ryan International School, Bengaluru, Karnataka"
694
+ },
695
+ {
696
+ "name": "Yash Kothari"
697
+ },
698
+ {
699
+ "name": "Yash Malik",
700
+ "orcid": "0009-0005-7611-034X"
701
+ },
702
+ {
703
+ "name": "Yukie Nomiya",
704
+ "orcid": "0000-0002-9572-6300",
705
+ "affiliation": "Sapienza University of Rome"
706
+ },
707
+ {
708
+ "name": "Zach Burnett",
709
+ "affiliation": "Space Telescope Science Institute"
710
+ },
711
+ {
712
+ "name": "Abigail L. Stevens",
713
+ "orcid": "0000-0002-5041-3079",
714
+ "affiliation": "Department of Physics & Astronomy, Michigan State University & Department of Astronomy, University of Michigan"
715
+ },
716
+ {
717
+ "name": "Akhoury Shauryam",
718
+ "orcid": "0009-0005-8038-8301",
719
+ "affiliation": "Chennai Mathematical Institute"
720
+ },
721
+ {
722
+ "name": "Alex Kaszynski"
723
+ },
724
+ {
725
+ "name": "Alex Wang"
726
+ },
727
+ {
728
+ "name": "Ambar Mehrotra"
729
+ },
730
+ {
731
+ "name": "Andy Tang"
732
+ },
733
+ {
734
+ "name": "Anubhav Sinha"
735
+ },
736
+ {
737
+ "name": "Arfon Smith"
738
+ },
739
+ {
740
+ "name": "Arseniy Kustov"
741
+ },
742
+ {
743
+ "name": "Ashish Bastola",
744
+ "orcid": "0009-0006-4968-1005",
745
+ "affiliation": "Clemson University"
746
+ },
747
+ {
748
+ "name": "Brandon Stone"
749
+ },
750
+ {
751
+ "name": "Chris Bard"
752
+ },
753
+ {
754
+ "name": "Chris Lowder",
755
+ "orcid": "0000-0001-8318-8229",
756
+ "affiliation": "Southwest Research Institute"
757
+ },
758
+ {
759
+ "name": "Clément Robert",
760
+ "orcid": "0000-0001-8629-7068"
761
+ },
762
+ {
763
+ "name": "Ed Behn"
764
+ },
765
+ {
766
+ "name": "Ed Mansky"
767
+ },
768
+ {
769
+ "name": "Emmanuel Arias"
770
+ },
771
+ {
772
+ "name": "Enrico Paganin"
773
+ },
774
+ {
775
+ "name": "Erik Tollerud"
776
+ },
777
+ {
778
+ "name": "Fionnlagh Mackenzie Dover",
779
+ "orcid": "0000-0002-1984-7303",
780
+ "affiliation": "SP2RC, School of Mathematics and Statistics, University of Sheffield"
781
+ },
782
+ {
783
+ "name": "Freek Verstringe",
784
+ "affiliation": "Royal Observatory of Belgium"
785
+ },
786
+ {
787
+ "name": "FreyaJain"
788
+ },
789
+ {
790
+ "name": "Fu Yu",
791
+ "affiliation": "Purple Mountain Observatory"
792
+ },
793
+ {
794
+ "name": "Ghaith Kdimati",
795
+ "orcid": "0009-0006-8851-7814",
796
+ "affiliation": "Cairo University"
797
+ },
798
+ {
799
+ "name": "Gulshan Kumar",
800
+ "orcid": "0000-0001-8523-7223",
801
+ "affiliation": "International Institute of Information Technology, Hyderabad"
802
+ },
803
+ {
804
+ "name": "Hardik"
805
+ },
806
+ {
807
+ "name": "Harsh Mathur",
808
+ "orcid": "0000-0001-5253-4213",
809
+ "affiliation": "Indian Institute of Astrophysics, Bengaluru"
810
+ },
811
+ {
812
+ "name": "Igor Babuschkin"
813
+ },
814
+ {
815
+ "name": "James Calixto"
816
+ },
817
+ {
818
+ "name": "Jaylen Wimbish"
819
+ },
820
+ {
821
+ "name": "Jia Qing"
822
+ },
823
+ {
824
+ "name": "Juan Camilo Buitrago-Casas"
825
+ },
826
+ {
827
+ "name": "Kalpesh Krishna",
828
+ "orcid": "0000-0001-6574-0817",
829
+ "affiliation": "University of Massachusetts Amherst"
830
+ },
831
+ {
832
+ "name": "Kaustubh Chaudhari",
833
+ "orcid": "0000-0003-1734-5075",
834
+ "affiliation": "Atal Bihari Vajpayee Indian Institute of Information Technology and Management, Gwalior"
835
+ },
836
+ {
837
+ "name": "Kaustubh Hiware",
838
+ "orcid": "0000-0003-3301-1016",
839
+ "affiliation": "Indian Institute of Technology, Kharagpur"
840
+ },
841
+ {
842
+ "name": "Koustav Ghosh"
843
+ },
844
+ {
845
+ "name": "Kurt McKee",
846
+ "orcid": "0000-0002-8547-8489",
847
+ "affiliation": "University of Chicago"
848
+ },
849
+ {
850
+ "name": "Manas Mangaonkar"
851
+ },
852
+ {
853
+ "name": "Manish Tiwari"
854
+ },
855
+ {
856
+ "name": "Mark Cheung"
857
+ },
858
+ {
859
+ "name": "Matthew Mendero"
860
+ },
861
+ {
862
+ "name": "Megh Dedhia",
863
+ "orcid": "0000-0002-5828-7679",
864
+ "affiliation": "Dwarkadas Jivanlal Sanghvi College of Engineering, University of Mumbai"
865
+ },
866
+ {
867
+ "name": "Mickaël Schoentgen",
868
+ "orcid": "0000-0002-0106-4810"
869
+ },
870
+ {
871
+ "name": "Mika"
872
+ },
873
+ {
874
+ "name": "Mouloudi Mohamed Lyes"
875
+ },
876
+ {
877
+ "name": "Nakshatra",
878
+ "affiliation": "IIT Kharagpur"
879
+ },
880
+ {
881
+ "name": "Nakul Shahdadpuri"
882
+ },
883
+ {
884
+ "name": "Naveen Srinivasan"
885
+ },
886
+ {
887
+ "name": "Norbert G Gyenge",
888
+ "orcid": "0000-0003-0464-1537",
889
+ "affiliation": "SP2RC, School of Mathematics and Statistics, University of Sheffield"
890
+ },
891
+ {
892
+ "name": "OussCHE"
893
+ },
894
+ {
895
+ "name": "Paul J. Wright",
896
+ "orcid": "0000-0001-9021-611X",
897
+ "affiliation": "Dublin Institute for Advanced Studies"
898
+ },
899
+ {
900
+ "name": "Prisha Sharma"
901
+ },
902
+ {
903
+ "name": "Raghav Agrawal",
904
+ "orcid": "0009-0000-1788-2917",
905
+ "affiliation": "Netaji Subhas University of Technology, New Delhi (NSUT New Delhi) and Indian Institute of Technology, Madras (IIT Madras)"
906
+ },
907
+ {
908
+ "name": "Rahul Gopalakrishnan",
909
+ "orcid": "0000-0002-1282-3480",
910
+ "affiliation": "Inter-University Centre for Astronomy and Astrophysics (IUCAA), Pune"
911
+ },
912
+ {
913
+ "name": "Rajasekhar Reddy Mekala"
914
+ },
915
+ {
916
+ "name": "Ratul Das",
917
+ "orcid": "0000-0002-5845-9979",
918
+ "affiliation": "National Institute of Science Education and Research, Bhubaneswar"
919
+ },
920
+ {
921
+ "name": "Rehan Chalana",
922
+ "affiliation": "Chitkara University, Punjab"
923
+ },
924
+ {
925
+ "name": "Rishabh Mishra"
926
+ },
927
+ {
928
+ "name": "Rohan Sharma"
929
+ },
930
+ {
931
+ "name": "Samuel T. Badman",
932
+ "orcid": "0000-0002-6145-436X",
933
+ "affiliation": "Center for Astrophysics | Harvard & Smithsonian"
934
+ },
935
+ {
936
+ "name": "Shashank Srikanth",
937
+ "affiliation": "International Institute of Information Technology, Hyderabad"
938
+ },
939
+ {
940
+ "name": "Shubham Jain"
941
+ },
942
+ {
943
+ "name": "Sijie Yu",
944
+ "orcid": "0000-0003-2872-2614",
945
+ "affiliation": "New Jersey Institute of Technology"
946
+ },
947
+ {
948
+ "name": "Sirjan Hansda",
949
+ "orcid": "0009-0004-0333-3166",
950
+ "affiliation": "Indian Institute of Science, Karnataka"
951
+ },
952
+ {
953
+ "name": "Suleiman Farah",
954
+ "orcid": "0009-0001-3304-2923",
955
+ "affiliation": "University of Toronto"
956
+ },
957
+ {
958
+ "name": "Swapnil Kannojia",
959
+ "orcid": "0000-0002-4233-774X",
960
+ "affiliation": "Maulana Azad National Institute of Technology Bhopal"
961
+ },
962
+ {
963
+ "name": "Syed Md Mihan Chistie",
964
+ "orcid": "0009-0007-5883-2749",
965
+ "affiliation": "Dayananda Sagar University, Bangalore"
966
+ },
967
+ {
968
+ "name": "Tan Jia Qing",
969
+ "orcid": "0009-0003-6749-982X",
970
+ "affiliation": "Nanyang Technological University"
971
+ },
972
+ {
973
+ "name": "Tannmay Yadav",
974
+ "orcid": "0000-0002-3143-5635",
975
+ "affiliation": "Department of Chemical Engineering, Indian Institute of Technology, Kharagpur"
976
+ },
977
+ {
978
+ "name": "Tathagata Paul"
979
+ },
980
+ {
981
+ "name": "Tessa D. Wilkinson"
982
+ },
983
+ {
984
+ "name": "Thomas A Caswell"
985
+ },
986
+ {
987
+ "name": "Thomas Braccia"
988
+ },
989
+ {
990
+ "name": "Tiago M. D. Pereira",
991
+ "orcid": "0000-0003-4747-4329",
992
+ "affiliation": "Rosseland Centre for Solar Physics, University of Oslo & Institute of Theoretical Astrophysics, University of Oslo"
993
+ },
994
+ {
995
+ "name": "Tim Gates"
996
+ },
997
+ {
998
+ "name": "Trung Kien Dang",
999
+ "orcid": "0000-0001-7562-6495",
1000
+ "affiliation": "Saw Swee Hock School Of Public Health, National University Of Singapore"
1001
+ },
1002
+ {
1003
+ "name": "Varun Bankar"
1004
+ },
1005
+ {
1006
+ "name": "William Jamieson",
1007
+ "orcid": "0000-0001-5976-4492"
1008
+ },
1009
+ {
1010
+ "name": "William Setterberg",
1011
+ "orcid": "0000-0003-2165-8314",
1012
+ "affiliation": "University of Minnesota"
1013
+ },
1014
+ {
1015
+ "name": "Yudhik Agrawal",
1016
+ "orcid": "0000-0003-3827-6857",
1017
+ "affiliation": "International Institute of Information Technology, Hyderabad"
1018
+ },
1019
+ {
1020
+ "name": "_Gagan"
1021
+ },
1022
+ {
1023
+ "name": "eebbaaf"
1024
+ },
1025
+ {
1026
+ "name": "graham"
1027
+ },
1028
+ {
1029
+ "name": "pradeep"
1030
+ },
1031
+ {
1032
+ "name": "resakra"
1033
+ },
1034
+ {
1035
+ "name": "yasintoda"
1036
+ },
1037
+ {
1038
+ "name": "Raphael Attie"
1039
+ },
1040
+ {
1041
+ "name": "Sophie A. Murray",
1042
+ "orcid": "0000-0002-9378-5315"
1043
+ }
1044
+ ],
1045
+ "access_right": "open"
1046
+ }
sunpy/source/CHANGELOG.rst ADDED
The diff for this file is too large to render. See raw diff
 
sunpy/source/CITATION.cff ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cff-version: '1.1.0'
2
+ message: 'Please cite the following work when using this software.'
3
+ authors:
4
+ - name: 'The SunPy Community'
5
+ - family-names: 'Barnes'
6
+ given-names: 'Will T.'
7
+ - family-names: 'Bobra'
8
+ given-names: 'Monica G.'
9
+ - family-names: 'Christe'
10
+ given-names: 'Steven D.'
11
+ - family-names: 'Freij'
12
+ given-names: 'Nabil'
13
+ - family-names: 'Hayes'
14
+ given-names: 'Laura A.'
15
+ - family-names: 'Ireland'
16
+ given-names: 'Jack'
17
+ - family-names: 'Mumford'
18
+ given-names: 'Stuart'
19
+ - family-names: 'Perez-Suarez'
20
+ given-names: 'David'
21
+ - family-names: 'Ryan'
22
+ given-names: 'Daniel F.'
23
+ - family-names: 'Shih'
24
+ given-names: 'Albert Y.'
25
+ - family-names: 'Chanda'
26
+ given-names: 'Prateek'
27
+ - family-names: 'Glogowski'
28
+ given-names: 'Kolja'
29
+ - family-names: 'Hewett'
30
+ given-names: 'Russell'
31
+ - family-names: 'Hughitt'
32
+ given-names: 'V. Keith'
33
+ - family-names: 'Hill'
34
+ given-names: 'Andrew'
35
+ - family-names: 'Hiware'
36
+ given-names: 'Kaustubh'
37
+ - family-names: 'Inglis'
38
+ given-names: 'Andrew'
39
+ - family-names: 'Kirk'
40
+ given-names: 'Michael S. F.'
41
+ - family-names: 'Konge'
42
+ given-names: 'Sudarshan'
43
+ - family-names: 'Mason'
44
+ given-names: 'James Paul'
45
+ - family-names: 'Maloney'
46
+ given-names: 'Shane Anthony'
47
+ - family-names: 'Murray'
48
+ given-names: 'Sophie A.'
49
+ - family-names: 'Panda'
50
+ given-names: 'Asish'
51
+ - family-names: 'Park'
52
+ given-names: 'Jongyeob'
53
+ - family-names: 'Pereira'
54
+ given-names: 'Tiago M. D.'
55
+ - family-names: 'Reardon'
56
+ given-names: 'Kevin'
57
+ - family-names: 'Savage'
58
+ given-names: 'Sabrina'
59
+ - family-names: 'Sipőcz'
60
+ given-names: 'Brigitta M.'
61
+ - family-names: 'Stansby'
62
+ given-names: 'David'
63
+ - family-names: 'Jain'
64
+ given-names: 'Yash'
65
+ - family-names: 'Taylor'
66
+ given-names: 'Garrison'
67
+ - family-names: 'Yadav'
68
+ given-names: 'Tannmay'
69
+ - family-names: 'Rajul'
70
+ - family-names: 'Dang'
71
+ given-names: 'Trung Kien'
72
+ doi: '10.3847/1538-4357/ab4f7a'
73
+ identifiers:
74
+ - type: 'doi'
75
+ value: '10.3847/1538-4357/ab4f7a'
76
+ - type: 'url'
77
+ value: 'https://iopscience.iop.org/article/10.3847/1538-4357/ab4f7a'
78
+ title: 'The SunPy Project: Open Source Development and Status of the Version 1.0 Core Package'
79
+ url: 'https://iopscience.iop.org/article/10.3847/1538-4357/ab4f7a'
sunpy/source/CITATION.rst ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .. _citing_sunpy:
2
+
3
+ Acknowledging or Citing SunPy
4
+ =============================
5
+
6
+ If you use SunPy in your scientific work, we would appreciate citing it in your publications.
7
+ The continued growth and development of SunPy is dependent on the community being aware of SunPy.
8
+
9
+ Citing SunPy in Publications
10
+ ----------------------------
11
+
12
+ Please add the following line within your methods, conclusion or acknowledgements sections:
13
+
14
+ *This research used version X.Y.Z (software citation) of the SunPy open source
15
+ software package (project citation).*
16
+
17
+ The project citation should be to the SunPy paper :cite:p:`the_sunpy_community_sunpy_2020`, and the software citation should be the specific `Zenodo DOI`_ for the version used in your work.
18
+
19
+ .. code:: bibtex
20
+
21
+ @ARTICLE{sunpy_community2020,
22
+ doi = {10.3847/1538-4357/ab4f7a},
23
+ url = {https://iopscience.iop.org/article/10.3847/1538-4357/ab4f7a},
24
+ author = {{The SunPy Community} and Barnes, Will T. and Bobra, Monica G. and Christe, Steven D. and Freij, Nabil and Hayes, Laura A. and Ireland, Jack and Mumford, Stuart and Perez-Suarez, David and Ryan, Daniel F. and Shih, Albert Y. and Chanda, Prateek and Glogowski, Kolja and Hewett, Russell and Hughitt, V. Keith and Hill, Andrew and Hiware, Kaustubh and Inglis, Andrew and Kirk, Michael S. F. and Konge, Sudarshan and Mason, James Paul and Maloney, Shane Anthony and Murray, Sophie A. and Panda, Asish and Park, Jongyeob and Pereira, Tiago M. D. and Reardon, Kevin and Savage, Sabrina and Sipőcz, Brigitta M. and Stansby, David and Jain, Yash and Taylor, Garrison and Yadav, Tannmay and Rajul and Dang, Trung Kien},
25
+ title = {The SunPy Project: Open Source Development and Status of the Version 1.0 Core Package},
26
+ journal = {The Astrophysical Journal},
27
+ volume = {890},
28
+ issue = {1},
29
+ pages = {68-},
30
+ publisher = {American Astronomical Society},
31
+ year = {2020}
32
+ }
33
+
34
+ You can also get this information with ``sunpy.__citation__``.
35
+
36
+ Other SunPy publications
37
+ ########################
38
+
39
+ - :cite:t:`sunpy_community_sunpypython_2015` --- First paper describing sunpy v0.5
40
+
41
+ - :cite:t:`mumford_sunpy_2020` --- JOSS review of sunpy v1.0.8
42
+
43
+ - :cite:t:`the_sunpy_community_sunpy_2023` --- Description of the SunPy Project
44
+
45
+ Acknowledging SunPy in Posters and Talks
46
+ ----------------------------------------
47
+
48
+ Please include the `Sunpy logo`_ on the title, conclusion slide, or about page.
49
+ For websites please link the image to `sunpy.org`_.
50
+ Other versions of the logo are available in the `sunpy-logo repository`_.
51
+
52
+ .. _Sunpy logo: https://github.com/sunpy/sunpy-logo/blob/master/sunpy_logo.svg
53
+ .. _sunpy.org: https://sunpy.org/
54
+ .. _sunpy-logo repository: https://github.com/sunpy/sunpy-logo/
55
+ .. _Zenodo DOI: https://doi.org/10.5281/zenodo.591887
sunpy/source/LICENSE.rst ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2013-2025 The SunPy developers
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in the
13
+ documentation and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sunpy/source/MANIFEST.in ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Exclude specific files
2
+ # All files which are tracked by git and not explicitly excluded here are included by setuptools_scm
3
+ exclude .codecov.yaml
4
+ exclude .editorconfig
5
+ exclude .gitattributes
6
+ exclude .gitignore
7
+ exclude .mailmap
8
+ exclude .pre-commit-config.yaml
9
+ exclude .readthedocs.yaml
10
+ exclude .rtd-environment.yml
11
+ exclude .test_package_pins.txt
12
+ exclude .zenodo.json
13
+ exclude asv.conf.json
14
+ exclude CITATION.cff
15
+ exclude sunpy-dev-env.yml
16
+ exclude tox.ini
17
+
18
+ # Prune folders
19
+ prune .circleci
20
+ prune .github
21
+ prune benchmarks
22
+ prune binder
23
+ prune changelog
24
+ prune tools
25
+
26
+ prune sunpy/_dev
sunpy/source/README.rst ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *********
2
+ ``sunpy``
3
+ *********
4
+ |SunPy Logo|
5
+
6
+ +-----------------------------------+-----------------------------------+-----------------------------------+
7
+ | Release | Development | Community |
8
+ +===================================+===================================+===================================+
9
+ | |Latest PyPi Version| | |Python Versions| | |Matrix Chat Room| |
10
+ +-----------------------------------+-----------------------------------+-----------------------------------+
11
+ | |Latest Conda Version| | |Project Status: Active| | |OpenAstronomy Discourse| |
12
+ +-----------------------------------+-----------------------------------+-----------------------------------+
13
+ | |Zenodo - Latest DOI| | |Continuous Integration Status| | |Google Groups Mailing List| |
14
+ +-----------------------------------+-----------------------------------+-----------------------------------+
15
+ | |sunpy stable documentation| | |CodeCov Code Coverage| | |Powered by NumFOCUS| |
16
+ +-----------------------------------+-----------------------------------+-----------------------------------+
17
+ | |sunpy citation| | | |pyOpenSci| |
18
+ +-----------------------------------+-----------------------------------+-----------------------------------+
19
+
20
+ .. |SunPy Logo| image:: https://raw.githubusercontent.com/sunpy/sunpy-logo/master/generated/sunpy_logo_landscape.png
21
+ :width: 200px
22
+ .. |Latest PyPi Version| image:: https://img.shields.io/pypi/v/sunpy.svg
23
+ :target: https://pypi.python.org/pypi/sunpy/
24
+ .. |Python Versions| image:: https://img.shields.io/pypi/pyversions/sunpy
25
+ :target: https://pypi.python.org/pypi/sunpy/
26
+ .. |Matrix Chat Room| image:: https://img.shields.io/matrix/sunpy:openastronomy.org.svg?colorB=%23FE7900&label=Chat&logo=matrix&server_fqdn=matrix.org
27
+ :target: https://app.element.io/#/room/#sunpy:openastronomy.org
28
+ .. |Latest Conda Version| image:: https://anaconda.org/conda-forge/sunpy/badges/version.svg
29
+ :target: https://anaconda.org/conda-forge/sunpy
30
+ .. |Project Status: Active| image:: https://www.repostatus.org/badges/latest/active.svg
31
+ :target: https://www.repostatus.org/#active
32
+ .. |OpenAstronomy Discourse| image:: https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/try2/original/1X/5e1e3b3cada2d7fbae4734d4bc53999933d71c95.svg
33
+ :height: 20px
34
+ :target: https://community.openastronomy.org/
35
+ .. |Zenodo - Latest DOI| image:: https://zenodo.org/badge/2165383.svg
36
+ :target: https://zenodo.org/badge/latestdoi/2165383
37
+ .. |Continuous Integration Status| image:: https://github.com/sunpy/sunpy/actions/workflows/ci.yml/badge.svg?branch=main
38
+ :target: https://github.com/sunpy/sunpy/actions/workflows/ci.yml
39
+ .. |Google Groups Mailing List| image:: https://upload.wikimedia.org/wikipedia/commons/2/27/Google_Groups_logo.gif
40
+ :height: 20px
41
+ :target: https://groups.google.com/g/sunpy
42
+ .. |sunpy stable documentation| image:: https://readthedocs.org/projects/sunpy/badge/?version=stable
43
+ :target: https://docs.sunpy.org/
44
+ .. |CodeCov Code Coverage| image:: https://codecov.io/gh/sunpy/sunpy/branch/main/graph/badge.svg
45
+ :target: https://codecov.io/gh/sunpy/sunpy
46
+ .. |Powered by NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A
47
+ :target: https://numfocus.org
48
+ .. |sunpy citation| image:: https://img.shields.io/badge/cite-sunpy-orange
49
+ :target: https://docs.sunpy.org/en/stable/citation.html
50
+ .. |pyOpenSci| image:: https://tinyurl.com/y22nb8up
51
+ :target: https://github.com/pyOpenSci/software-submission/issues/147
52
+
53
+ ``sunpy`` is a Python software package that provides fundamental tools for accessing, loading and interacting with solar physics data in Python.
54
+ It includes an interface for searching and downloading data from multiple data providers, data containers for image and time series data, commonly used solar coordinate frames and associated transformations, as well as other functionality needed for solar data analysis.
55
+
56
+ Installation
57
+ ============
58
+
59
+ We recommend following the `installation guide <https://docs.sunpy.org/en/stable/guide/installation.html>`__ in the ``sunpy`` documentation.
60
+ This will walk you through installing ``sunpy`` and all of its dependencies.
61
+
62
+ Usage
63
+ =====
64
+
65
+ If you are new to ``sunpy``, the best place to start is the `tutorial <https://docs.sunpy.org/en/stable/tutorial/index.html>`__.
66
+ The `example gallery <https://docs.sunpy.org/en/stable/generated/gallery/index.html>`__ also includes a collection of shorter and more specific examples of using ``sunpy``.
67
+
68
+ Changes
69
+ =======
70
+
71
+ See our `changelog <https://docs.sunpy.org/en/stable/whatsnew/changelog.html>`__ for the latest changes in ``sunpy``.
72
+
73
+ Getting Help
74
+ ============
75
+
76
+ For more information or to ask questions about ``sunpy`` or any other SunPy Project package, please check out:
77
+
78
+ - `sunpy documentation <https://docs.sunpy.org/en/stable/>`__
79
+ - `SunPy Affiliated Packages <https://sunpy.org/affiliated>`__
80
+ - `SunPy Chat`_
81
+ - `SunPy mailing list <https://groups.google.com/forum/#!forum/sunpy>`__
82
+ - `SunPy Community forum <https://community.openastronomy.org/c/sunpy/5>`__
83
+
84
+ Acknowledging or Citing ``sunpy``
85
+ =================================
86
+
87
+ If you use ``sunpy`` in your scientific work, we would appreciate your `citing it in your publications <https://docs.sunpy.org/en/stable/citation.html>`__.
88
+ The continued growth and development of ``sunpy`` is dependent on the community being aware of ``sunpy``.
89
+
90
+ Contributing
91
+ ============
92
+
93
+ The SunPy Project is a community-driven open-source project that welcomes any and all contributions.
94
+ Whether you are a developer, student, or user, you can help by contributing code, documentation, or community support.
95
+
96
+ If you would like to get involved, the `Newcomers Guide`_ guide explains the many different ways to contribute to the SunPy Project and also shows how to get set up with a development workflow.
97
+
98
+ Help is always welcome, so come and say hello by joining the `SunPy Chat`_ and look over the `Good First Issues list`_ for the ideal places to start.
99
+
100
+ .. _Newcomers Guide: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html
101
+ .. _Good First Issues list: https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Good+First+Issue%22
102
+
103
+ Usage of Generative AI
104
+ ======================
105
+
106
+ We expect authentic engagement in our community.
107
+ **Do no post the output from Large Language Models or similar generative AI as code, issues or comments on GitHub or any other platform.**
108
+ If you use generative AI tools as an aid in developing code or documentation changes, ensure that you fully understand the proposed changes and can explain why they are the correct approach and an improvement to the current state.
109
+ For more information see our documentation on fair and appropriate [AI usage](https://docs.sunpy.org/en/latest/dev_guide/contents/ai_usage.html).
110
+
111
+ Code of Conduct
112
+ ===============
113
+
114
+ When you are interacting with the SunPy Community you are asked to follow our `Code of Conduct <https://sunpy.org/coc>`__.
115
+
116
+ .. _SunPy Chat: https://app.element.io/#/room/#sunpy:openastronomy.org
sunpy/source/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ sunpy Project Package Initialization File
4
+ """
sunpy/source/_typos.toml ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ default.extend-ignore-identifiers-re = [
2
+ "ANDed",
3
+ "arange",
4
+ "iy",
5
+ "iy1",
6
+ "iy2",
7
+ "EIS",
8
+ "eis",
9
+ "EIT",
10
+ "eit",
11
+ "HAE",
12
+ "hsi",
13
+ "Hsi",
14
+ "nd",
15
+ "NDData",
16
+ "alog",
17
+ "alog10",
18
+ "FOVs",
19
+ "FOV",
20
+ "ISES",
21
+ # HEK
22
+ "OT",
23
+ "ot",
24
+ # Coords,
25
+ "pn",
26
+ "lightyear",
27
+ "PNGs",
28
+ "setp",
29
+ "Precess",
30
+ "precess",
31
+ "precessed",
32
+ "ASO",
33
+ "aso",
34
+ ]
sunpy/source/asv.conf.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": 1,
3
+ "project": "sunpy",
4
+ "project_url": "https://sunpy.org/",
5
+ "repo": "./",
6
+ "branches": [
7
+ "main"
8
+ ],
9
+ "environment_type": "virtualenv",
10
+ "show_commit_url": "https://github.com/sunpy/sunpy/commit/",
11
+ "benchmark_dir": "benchmarks",
12
+ "results_dir": "asv_results/results",
13
+ "env_dir": "asv_env",
14
+ "install_command": [
15
+ "in-dir={env_dir} python -mpip install {wheel_file}[all]"
16
+ ],
17
+ "build_command": [
18
+ "python -mpip install -U build",
19
+ "python -m build",
20
+ "PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps --no-index -w {build_cache_dir} {build_dir}"
21
+ ]
22
+ }
sunpy/source/benchmarks/__init__.py ADDED
File without changes
sunpy/source/benchmarks/coordinates.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from asv_runner.benchmarks.mark import SkipNotImplemented
2
+
3
+ import astropy.units as u
4
+ from astropy.coordinates import HCRS, ITRS, HeliocentricMeanEcliptic, SphericalRepresentation
5
+
6
+ import sunpy.coordinates.frames as f
7
+
8
+
9
+ class TransformationHeliographic:
10
+ frame_names = ['HCRS', 'HGS', 'HGC', 'HCC', 'HPC', 'HPR', 'HCI']
11
+
12
+ params = (frame_names, frame_names)
13
+ param_names = ['src', 'dest']
14
+
15
+ def setup_cache(self):
16
+ obstime = '2023-01-01'
17
+ vect = SphericalRepresentation(0*u.deg, 0*u.deg, 1*u.AU)
18
+ observer = f.HeliographicStonyhurst(vect, obstime=obstime)
19
+ frames = {
20
+ 'HCRS': HCRS(vect, obstime=obstime),
21
+ 'HGS': f.HeliographicStonyhurst(vect, obstime=obstime),
22
+ 'HGC': f.HeliographicCarrington(vect, obstime=obstime, observer=observer),
23
+ 'HCC': f.Heliocentric(vect, obstime=obstime, observer=observer),
24
+ 'HPC': f.Helioprojective(vect, obstime=obstime, observer=observer),
25
+ 'HPR': f.HelioprojectiveRadial(vect, obstime=obstime, observer=observer),
26
+ 'HCI': f.HeliocentricInertial(vect, obstime=obstime),
27
+ }
28
+ return frames
29
+
30
+ def setup(self, frames, src, dest):
31
+ if src == dest:
32
+ raise SkipNotImplemented
33
+
34
+ def time_transform(self, frames, src, dest):
35
+ frames[src].transform_to(frames[dest])
36
+
37
+
38
+ class TransformationEcliptic:
39
+ frame_names = ['HAE', 'HEE', 'GSE', 'GEI']
40
+
41
+ params = (frame_names, frame_names)
42
+ param_names = ['src', 'dest']
43
+
44
+ def setup_cache(self):
45
+ obstime = '2023-01-01'
46
+ vect = SphericalRepresentation(0*u.deg, 0*u.deg, 1*u.AU)
47
+ frames = {
48
+ 'HAE': HeliocentricMeanEcliptic(vect, obstime=obstime, equinox='J2000'),
49
+ 'HEE': f.HeliocentricEarthEcliptic(vect, obstime=obstime),
50
+ 'GSE': f.GeocentricSolarEcliptic(vect, obstime=obstime),
51
+ 'GEI': f.GeocentricEarthEquatorial(vect, obstime=obstime, equinox='J2000'),
52
+ }
53
+ return frames
54
+
55
+ def setup(self, frames, src, dest):
56
+ if src == dest:
57
+ raise SkipNotImplemented
58
+
59
+ def time_transform(self, frames, src, dest):
60
+ frames[src].transform_to(frames[dest])
61
+
62
+
63
+ class TransformationMagnetic:
64
+ frame_names = ['GEO', 'MAG', 'SM', 'GSM']
65
+
66
+ params = (frame_names, frame_names)
67
+ param_names = ['src', 'dest']
68
+
69
+ def setup_cache(self):
70
+ obstime = '2023-01-01'
71
+ vect = SphericalRepresentation(0*u.deg, 0*u.deg, 1*u.AU)
72
+ frames = {
73
+ 'GEO': ITRS(vect, obstime=obstime),
74
+ 'MAG': f.Geomagnetic(vect, obstime=obstime),
75
+ 'SM': f.SolarMagnetic(vect, obstime=obstime),
76
+ 'GSM': f.GeocentricSolarMagnetospheric(vect, obstime=obstime),
77
+ }
78
+ return frames
79
+
80
+ def setup(self, frames, src, dest):
81
+ if src == dest:
82
+ raise SkipNotImplemented
83
+
84
+ def time_transform(self, frames, src, dest):
85
+ frames[src].transform_to(frames[dest])
sunpy/source/benchmarks/map.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from io import BytesIO
2
+
3
+ from asv_runner.benchmarks.mark import SkipNotImplemented, skip_benchmark
4
+ from matplotlib.figure import Figure
5
+
6
+ import astropy.units as u
7
+
8
+ import sunpy.data.sample
9
+ import sunpy.map
10
+ from sunpy.coordinates import propagate_with_solar_surface
11
+
12
+
13
+ class Creation:
14
+ params = ['AIA_171_IMAGE', 'HMI_LOS_IMAGE']
15
+ param_names = ['name']
16
+
17
+ def setup(self, name):
18
+ self.filename = getattr(sunpy.data.sample, name)
19
+
20
+ def time_create_map(self, name):
21
+ sunpy.map.Map(self.filename)
22
+
23
+ # Skipped due to a bug in pympler.asizeof
24
+ # https://github.com/pympler/pympler/issues/151
25
+ @skip_benchmark
26
+ def mem_create_map(self, name):
27
+ return sunpy.map.Map(self.filename)
28
+
29
+ def peakmem_create_map(self, name):
30
+ sunpy.map.Map(self.filename)
31
+
32
+
33
+ class Resample:
34
+ def setup_cache(self):
35
+ aiamap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE)
36
+ return aiamap
37
+
38
+ def time_resample(self, aiamap):
39
+ aiamap.resample([100, 100] * u.pix)
40
+
41
+ def peakmem_resample(self, aiamap):
42
+ aiamap.resample([100, 100] * u.pix)
43
+
44
+
45
+ class Rotate:
46
+ params = (['scipy', 'scikit-image', 'opencv'], range(0, 6))
47
+ param_names = ['method', 'order']
48
+
49
+ def setup_cache(self):
50
+ aiamap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE)
51
+ return aiamap
52
+
53
+ def setup(self, aiamap, method, order):
54
+ if method == 'opencv' and order not in {0, 1, 3}:
55
+ raise SkipNotImplemented
56
+
57
+ def time_rotate(self, aiamap, method, order):
58
+ aiamap.rotate(30*u.deg, method=method, order=order)
59
+
60
+ def peakmem_rotate(self, aiamap, method, order):
61
+ aiamap.rotate(30*u.deg, method=method, order=order)
62
+
63
+
64
+ class Reproject:
65
+ params = ['interpolation', 'adaptive']
66
+ param_names = ['algorithm']
67
+
68
+ def setup_cache(self):
69
+ maps = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE, sunpy.data.sample.HMI_LOS_IMAGE)
70
+ return maps
71
+
72
+ def time_reproject_to(self, maps, algorithm):
73
+ maps[1].reproject_to(maps[0].wcs, algorithm=algorithm)
74
+
75
+ def peakmem_reproject_to(self, maps, algorithm):
76
+ maps[1].reproject_to(maps[0].wcs, algorithm=algorithm)
77
+
78
+ def time_reproject_to_plus_diffrot(self, maps, algorithm):
79
+ with propagate_with_solar_surface():
80
+ maps[1].reproject_to(maps[0].wcs, algorithm=algorithm)
81
+
82
+ def peakmem_reproject_to_plus_diffrot(self, maps, algorithm):
83
+ with propagate_with_solar_surface():
84
+ maps[1].reproject_to(maps[0].wcs, algorithm=algorithm)
85
+
86
+
87
+ class Autoalign:
88
+ params = [False, True, 'pcolormesh']
89
+ param_names = ['autoalign']
90
+
91
+ def setup_cache(self):
92
+ maps = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE, sunpy.data.sample.HMI_LOS_IMAGE)
93
+ return maps
94
+
95
+ def time_autoalign(self, maps, autoalign):
96
+ fig = Figure()
97
+ ax = fig.add_subplot(projection=maps[0])
98
+ maps[1].plot(axes=ax, autoalign=autoalign)
99
+ buf = BytesIO()
100
+ fig.savefig(buf, format='png')
101
+
102
+ def peakmem_autoalign(self, maps, autoalign):
103
+ fig = Figure()
104
+ ax = fig.add_subplot(projection=maps[0])
105
+ maps[1].plot(axes=ax, autoalign=autoalign)
106
+ buf = BytesIO()
107
+ fig.savefig(buf, format='png')
sunpy/source/benchmarks/time.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sunpy.time import is_time, parse_time
2
+
3
+
4
+ def time_is_time():
5
+ is_time('1995-12-31 23:59:60')
6
+
7
+
8
+ def time_parse_time():
9
+ parse_time('1995-12-31 23:59:60')
10
+
11
+
12
+ def mem_parse_time():
13
+ t = parse_time('1995-12-31 23:59:60')
14
+ return t
15
+
16
+
17
+ def peakmem_parse_time():
18
+ parse_time('1995-12-31 23:59:60')
sunpy/source/changelog/8493.bugfix.rst ADDED
@@ -0,0 +1 @@
 
 
1
+ Fix ~`sunpy.net.scraper.Scraper` to correctly handle proper local file URI on Windows and make internal code more consistent.
sunpy/source/changelog/8505.doc.rst ADDED
@@ -0,0 +1 @@
 
 
1
+ Add `AI Usage <https://docs.sunpy.org/en/latest/dev_guide/contents/ai_usage.html>`__ document and update newcomers guide to cross reference.