Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updates from package template #167

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .cruft.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"template": "https://github.com/sunpy/package-template",
"commit": "aec53b81aed2e7e534045e59303d82712fe82fb1",
"commit": "4ca8e60aac805d5f736de80c45ae0aba96b4cb85",
"checkout": null,
"context": {
"cookiecutter": {
Expand All @@ -16,7 +16,8 @@
"enable_dynamic_dev_versions": "y",
"include_example_code": "n",
"include_cruft_update_github_workflow": "y",
"_sphinx_theme": "alabaster",
"use_extended_ruff_linting": "y",
"_sphinx_theme": "sunpy",
"_parent_project": "",
"_install_requires": "",
"_copy_without_render": [
Expand Down
48 changes: 31 additions & 17 deletions .github/workflows/sub_package_update.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,6 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
include:
- add-paths: .
body: apply the changes to this repo.
branch: cruft/update
commit-message: "Automatic package template update"
title: Updates from the package template

steps:
- uses: actions/checkout@v4

Expand All @@ -55,25 +47,47 @@ jobs:
echo "has_changes=$CHANGES" >> "$GITHUB_OUTPUT"

- name: Run update if available
id: cruft_update
if: steps.check.outputs.has_changes == '1'
run: |
git config --global user.email "${{ github.actor }}@users.noreply.github.com"
git config --global user.name "${{ github.actor }}"

cruft update --skip-apply-ask --refresh-private-variables
cruft_output=$(cruft update --skip-apply-ask --refresh-private-variables)
echo $cruft_output
git restore --staged .

- name: Create pull request
if [[ "$cruft_output" == *"Failed to cleanly apply the update, there may be merge conflicts."* ]]; then
echo merge_conflicts=1 >> $GITHUB_OUTPUT
else
echo merge_conflicts=0 >> $GITHUB_OUTPUT
fi

- name: Check if only .cruft.json is modified
id: cruft_json
if: steps.check.outputs.has_changes == '1'
run: |
git status --porcelain=1
if [[ "$(git status --porcelain=1)" == " M .cruft.json" ]]; then
echo "Only .cruft.json is modified. Exiting workflow early."
echo "has_changes=0" >> "$GITHUB_OUTPUT"
else
echo "has_changes=1" >> "$GITHUB_OUTPUT"
fi

- name: Create pull request
if: steps.cruft_json.outputs.has_changes == '1'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
add-paths: ${{ matrix.add-paths }}
commit-message: ${{ matrix.commit-message }}
branch: ${{ matrix.branch }}
add-paths: "."
commit-message: "Automatic package template update"
branch: "cruft/update"
delete-branch: true
branch-suffix: timestamp
title: ${{ matrix.title }}
draft: ${{ steps.cruft_update.outputs.merge_conflicts == '1' }}
title: "Updates from the package template"
body: |
This is an autogenerated PR, which will ${{ matrix.body }}.
[Cruft](https://cruft.github.io/cruft/) has detected updates from the Package Template
This is an autogenerated PR, which will applies the latest changes from the [SunPy Package Template](https://github.com/sunpy/package-template).
If this pull request has been opened as a draft there are conflicts which need fixing.

**To run the CI on this pull request you will need to close it and reopen it.**
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
repos:
# This should be before any formatting hooks like isort
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: "v0.6.9"
rev: "v0.7.1"
hooks:
- id: ruff
args: ["--fix"]
Expand Down
77 changes: 65 additions & 12 deletions .ruff.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,84 @@ exclude = [
]

[lint]
select = ["E", "F", "W", "UP", "PT"]
select = [
"E",
"F",
"W",
"UP",
"PT",
"N",
"BLE",
"A",
"C4",
"INP",
"PIE",
"T20",
"RET",
"TID",
"PTH",
"PD",
"PLC",
"PLE",
"FLY",
"NPY",
"PERF",
"RUF",
]
extend-ignore = [
# pycodestyle (E, W)
"E501", # LineTooLong # TODO! fix
"E501", # ignore line length will use a formatter instead
# pyupgrade (UP)
"UP038", # Use | in isinstance - not compatible with models and is slower
# pytest (PT)
"PT001", # Always use pytest.fixture()
"PT004", # Fixtures which don't return anything should have leading _
"PT007", # Parametrize should be lists of tuples # TODO! fix
"PT011", # Too broad exception assert # TODO! fix
"PT023", # Always use () on pytest decorators
# flake8-pie (PIE)
"PIE808", # Disallow passing 0 as the first argument to range
# flake8-use-pathlib (PTH)
"PTH123", # open() should be replaced by Path.open()
# Ruff (RUF)
"RUF003", # Ignore ambiguous quote marks, doesn't allow ' in comments
"RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
"RUF013", # PEP 484 prohibits implicit `Optional`
"RUF015", # Prefer `next(iter(...))` over single element slice
# PEP8 Naming
"N802", # Function name should be lowercase
"N803", # Argument name should be lowercase
"N806", # Variable in function should be lowercase
]

[lint.per-file-ignores]
# Part of configuration, not a package.
"setup.py" = ["INP001"]
"conftest.py" = ["INP001"]
"setup.py" = [
"INP001", # File is part of an implicit namespace package.
]
"conftest.py" = [
"INP001", # File is part of an implicit namespace package.
]
"docs/conf.py" = [
"E402", # Module imports not at top of file
"F403"
"E402" # Module imports not at top of file
]
"docs/*.py" = [
"INP001", # Implicit-namespace-package. The examples are not a package.
"INP001", # File is part of an implicit namespace package.
]
"examples/**.py" = [
"T201", # allow use of print in examples
"INP001", # File is part of an implicit namespace package.
]
"__init__.py" = [
"E402", # Module level import not at top of cell
"F401", # Unused import
"F403", # from {name} import * used; unable to detect undefined names
"F405", # {name} may be undefined, or defined from star imports
]
"test_*.py" = [
"E402", # Module level import not at top of cell
]
# Be a bit more lax on legacy
"sunkit_spex/legacy/tests/*.py" = [
"PT011", # `pytest.raises(ValueError)` is too broad
]
"__init__.py" = ["E402", "F401", "F403"]
"test_*.py" = ["B011", "D", "E402", "PGH001", "S101"]

[lint.pydocstyle]
convention = "numpy"
Expand Down
4 changes: 2 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
]

# Add any paths that contain templates here, relative to this directory.
# templates_path = ["_templates"] # NOQA: ERA001
# templates_path = ["_templates"]

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
Expand Down Expand Up @@ -101,7 +101,7 @@
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
# html_static_path = ["_static"] # NOQA: ERA001
# html_static_path = ["_static"]

# By default, when rendering docstrings for classes, sphinx.ext.autodoc will
# make docs with the class-level docstring and the class-method docstrings,
Expand Down
3 changes: 2 additions & 1 deletion examples/fitting_RHESSI_spectra.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import matplotlib.pyplot as plt
import numpy as np
from numpy.exceptions import VisibleDeprecationWarning
from parfive import Downloader

from astropy.time import Time
Expand All @@ -28,7 +29,7 @@

warnings.filterwarnings("ignore", category=RuntimeWarning)
try:
warnings.filterwarnings("ignore", category=np.VisibleDeprecationWarning)
warnings.filterwarnings("ignore", category=VisibleDeprecationWarning)
except AttributeError:
warnings.filterwarnings("ignore", category=np.exceptions.VisibleDeprecationWarning)

Expand Down
5 changes: 3 additions & 2 deletions examples/fitting_custom_spectra.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@

import matplotlib.pyplot as plt
import numpy as np
from numpy.exceptions import VisibleDeprecationWarning

from sunkit_spex.legacy.fitting.fitter import Fitter

warnings.filterwarnings("ignore", category=RuntimeWarning)
try:
warnings.filterwarnings("ignore", category=np.VisibleDeprecationWarning)
warnings.filterwarnings("ignore", category=VisibleDeprecationWarning)
except AttributeError:
warnings.filterwarnings("ignore", category=np.exceptions.VisibleDeprecationWarning)

Expand Down Expand Up @@ -74,7 +75,7 @@ def gauss(a, b, c, energies=None):
chan_bins = np.stack((np.arange(0, maxi, step), np.arange(step, maxi + step, step)), axis=-1)
gauss_mod1 = gauss(1.3e4, 350, 60, energies=chan_bins)
gauss_mod2 = gauss(3e3, 600, 60, energies=chan_bins)
noise = np.random.randint(low=10, high=100, size=(len(chan_bins))) / 100 * 5
noise = np.random.default_rng().integers(low=10, high=100, size=(len(chan_bins))) / 100 * 5

fake_data = gauss_mod1 + gauss_mod2 + noise

Expand Down
3 changes: 2 additions & 1 deletion examples/skip_fitting_NuSTAR_spectra.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@

import matplotlib.pyplot as plt
import numpy as np
from numpy.exceptions import VisibleDeprecationWarning
from parfive import Downloader

from sunkit_spex.legacy.fitting.fitter import Fitter, load

warnings.filterwarnings("ignore", category=RuntimeWarning)
try:
warnings.filterwarnings("ignore", category=np.VisibleDeprecationWarning)
warnings.filterwarnings("ignore", category=VisibleDeprecationWarning)
except AttributeError:
warnings.filterwarnings("ignore", category=np.exceptions.VisibleDeprecationWarning)

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ tests = [
docs = [
"sphinx",
"sphinx-automodapi",
"sunpy-sphinx-theme",
"packaging",
"sphinx-changelog",
"sphinx-gallery",
"sunpy-sphinx-theme",
]

[project.urls]
Expand Down
4 changes: 2 additions & 2 deletions sunkit_spex/_dev/scm_version.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Try to use setuptools_scm to get the current version; this is only used
# in development installations from the git repository.
import os.path
from pathlib import Path

try:
from setuptools_scm import get_version

version = get_version(root=os.path.join('..', '..'), relative_to=__file__)
version = get_version(root=Path('../..'), relative_to=__file__)
except ImportError:
raise
except Exception as e:
Expand Down
Empty file added sunkit_spex/data/__init__.py
Empty file.
43 changes: 19 additions & 24 deletions sunkit_spex/legacy/emission.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def __init__(self, *, p, q, eelow, eebrk, eehigh, norm=True):

def __eq__(self, other):
return all(
[getattr(self, name) == getattr(other, name) for name in ["p", "q", "eelow", "eebrk", "eehigh"]]
getattr(self, name) == getattr(other, name) for name in ["p", "q", "eelow", "eebrk", "eehigh"]
) and isinstance(other, self.__class__)

def flux(self, electron_energy):
Expand Down Expand Up @@ -211,9 +211,7 @@ def collisional_loss(electron_energy):
beta = np.sqrt(1.0 - (1.0 / gamma**2))

# TODO figure out what number is?
energy_loss_rate = np.log(6.9447e9 * electron_energy) / beta

return energy_loss_rate
return np.log(6.9447e9 * electron_energy) / beta


def bremsstrahlung_cross_section(electron_energy, photon_energy, z=1.2):
Expand Down Expand Up @@ -301,9 +299,7 @@ def bremsstrahlung_cross_section(electron_energy, photon_energy, z=1.2):
fe = (a2 / a1) * (1.0 - np.exp(-2.0 * np.pi * a1)) / (1.0 - np.exp(-2.0 * np.pi * a2))

# Compute the differential cross section (units cm^2).
cross_section = twoar02 * fe * crtmp

return cross_section
return twoar02 * fe * crtmp


def _get_integrand(x_log, *, model, electron_dist, photon_energy, z, efd=True):
Expand Down Expand Up @@ -354,18 +350,18 @@ def _get_integrand(x_log, *, model, electron_dist, photon_energy, z, efd=True):
return (
electron_energy * np.log(10) * density * brem_cross * pc / collision_loss / ((electron_energy / mc2) + 1.0)
)
elif model == "thin-target":
if model == "thin-target":
if efd:
return electron_energy * np.log(10) * electron_dist.flux(electron_energy) * brem_cross * (mc2 / clight)
else:
return (
electron_energy
* np.log(10)
* electron_dist.flux(electron_energy)
* brem_cross
* pc
/ ((electron_energy / mc2) + 1.0)
)
return (
electron_energy
* np.log(10)
* electron_dist.flux(electron_energy)
* brem_cross
* pc
/ ((electron_energy / mc2) + 1.0)
)
return None


def _integrate_part(
Expand Down Expand Up @@ -469,6 +465,7 @@ def _integrate_part(
# If all point have reached criterion return value and flags
if i.size == 0:
return intsum, ier
return None


def _split_and_integrate(*, model, photon_energies, maxfcn, rerr, eelow, eebrk, eehigh, p, q, z, efd, integrator=None):
Expand Down Expand Up @@ -641,10 +638,11 @@ def _split_and_integrate(*, model, photon_energies, maxfcn, rerr, eelow, eebrk,
DmlinO = (intsum1 + intsum2 + intsum3) * (mc2 / clight)
ier = ier1 + ier2 + ier3
return DmlinO, ier
elif model == "thin-target":
if model == "thin-target":
Dmlin = intsum2 + intsum3
ier = ier2 + ier3
return Dmlin, ier
return None


def bremsstrahlung_thin_target(photon_energies, p, eebrk, q, eelow, eehigh, efd=True, integrator=None):
Expand Down Expand Up @@ -742,8 +740,7 @@ def bremsstrahlung_thin_target(photon_energies, p, eebrk, q, eelow, eehigh, efd=
flux *= fcoeff

return flux
else:
raise Warning("The photon energies are higher than the highest electron energy or not " "greater than zero")
raise Warning("The photon energies are higher than the highest electron energy or not " "greater than zero")


def bremsstrahlung_thick_target(photon_energies, p, eebrk, q, eelow, eehigh, integrator=None):
Expand Down Expand Up @@ -836,8 +833,6 @@ def bremsstrahlung_thick_target(photon_energies, p, eebrk, q, eelow, eehigh, int
integrator=integrator,
)

flux = (fcoeff / decoeff) * flux
return (fcoeff / decoeff) * flux

return flux
else:
raise Warning("The photon energies are higher than the highest electron energy or not " "greater than zero")
raise Warning("The photon energies are higher than the highest electron energy or not " "greater than zero")
Loading