Skip to content
Merged
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
2 changes: 2 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ jobs:

- name: Run tests
run: python -m pytest --cov -v
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # needed for some tests

- name: Upload coverage
uses: codecov/codecov-action@v5
Expand Down
2 changes: 2 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
include LICENSE
include src/spec0/data/*.json
26 changes: 17 additions & 9 deletions src/spec0/cli.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import argparse
import logging
import os

from functools import partial

from spec0.releasesource import PyPIReleaseSource, CondaReleaseSource
from spec0.releasesource import (
PyPIReleaseSource,
CondaReleaseSource,
GitHubReleaseSource,
DefaultReleaseSource,
)
from spec0.releasefilters import SPEC0StrictDate, SPEC0Quarter
from spec0.output import terminal_output, json_output, specifier_output
from spec0.main import main
Expand Down Expand Up @@ -55,7 +61,7 @@ def make_parser():
default=["noarch", "linux-64"],
help=("Conda architectures to check, only used if conda-channel is specified"),
)
# source.add_argument('--github', action='store_true')
source.add_argument("--github", action="store_true")

# filter options
filterg = parser.add_argument_group(
Expand Down Expand Up @@ -116,20 +122,22 @@ def select_source(opts):
"""
selected_pypi = opts.pypi
selected_conda = opts.conda_channel is not None
# selected_github = opts.github
n_selected = sum([selected_pypi, selected_conda])
selected_github = opts.github
n_selected = sum([selected_pypi, selected_conda, selected_github])
token = os.getenv("GITHUB_TOKEN")
if n_selected == 0:
source = None
source = DefaultReleaseSource(token)
elif n_selected > 1:
raise ValueError("Only one source can be selected")
else:
if selected_pypi:
source = [PyPIReleaseSource()]
source = PyPIReleaseSource()
elif selected_conda:
platforms = [f"{opts.conda_channel}/{arch}" for arch in opts.conda_arch]
source = [CondaReleaseSource(platforms)]
# elif selected_github:
# source = GitHubReleaseSource()
source = CondaReleaseSource(platforms)
elif selected_github:
source = GitHubReleaseSource(token)

return source


Expand Down
4 changes: 4 additions & 0 deletions src/spec0/data/github-releases.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"rust": "rust-lang/rust",
"python": "python/cpython"
}
24 changes: 4 additions & 20 deletions src/spec0/main.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,24 @@
from spec0.releasesource import PyPIReleaseSource, CondaReleaseSource
from spec0.releasefilters import SPEC0StrictDate

import logging

_logger = logging.getLogger(__name__)


def default_sources():
"""Default release sources if none are provided."""
return [
PyPIReleaseSource(),
CondaReleaseSource(["conda-forge/noarch", "conda-forge/linux-64"]),
]


def default_filter():
"""Default support filter if none is provided."""
return SPEC0StrictDate()


def main(package, sources=None, filter_=None):
def main(package, source, filter_=None):
"""Main function to get release info for a package.

Parameters
----------
package : str
The name of the package to get release info for.
sources : list, optional
A list of release sources to use. If None, default sources are used.
source : ReleaseSource
The source to use for getting release info.
filter_ : ReleaseFilter, optional
A release filter to use. If None, default filter is used.

Expand All @@ -42,17 +33,10 @@ def main(package, sources=None, filter_=None):
(datetime) release date of the release, and "drop-date" is the
(datetime) drop date of the release, according to the input filter.
"""
if sources is None:
sources = default_sources()

if filter_ is None:
filter_ = default_filter()

# we take the releases from the first source that has them
for source in sources:
if releases := source.get_releases(package):
break

releases = source.get_releases(package)
filtered = filter_.filter(package, releases)
result = {
"package": package,
Expand Down
7 changes: 5 additions & 2 deletions src/spec0/releasefilters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from packaging.specifiers import SpecifierSet
from packaging.version import Version

from .releasesource import Release
from .releasesource import Release, NoReleaseFound
from .utils.dates import next_quarter, quarter_to_date, shift_date_by_months

import logging
Expand Down Expand Up @@ -66,7 +66,10 @@ def _get_n_months(self, package: str):
def _get_minimum_supported(self, package: str, releases: Iterable[Release]):
oldest_minor_release = get_oldest_minor_release(releases)

max_minor_release = max(oldest_minor_release)
try:
max_minor_release = max(oldest_minor_release)
except ValueError: # no releases found; should be caught by source
raise NoReleaseFound(f"No releases found for package '{package}'")
# always support at least the most recent minor release
supported = {max_minor_release: oldest_minor_release[max_minor_release]}

Expand Down
Loading
Loading