Skip to content

Commit

Permalink
Allow collapsing of long lists of newer versions for a package
Browse files Browse the repository at this point in the history
  • Loading branch information
trawick committed Jul 10, 2024
1 parent 9050a33 commit 974612c
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 8 deletions.
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
* Support for Python 3.5 dropped
* Package renamed from `e_ood` to `e_out_of_date` for clarity

### Other changes

* Collapse long lists of newer versions by passing `max_newer_versions=N` to
`render` methods of `AnalyzerReport` or `AnalyzerPackageReport`.

## Version 0.2.0

### Breaking changes
Expand Down
28 changes: 20 additions & 8 deletions e_out_of_date/analyze.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
""" Analyze contents of virtualenv with respect to newer available package versions """
import math

from pkg_resources import parse_version

from .db import ReportedUpdateTypes
Expand All @@ -21,23 +23,25 @@ def __init__(self, package_name, current_version):
def __str__(self):
return 'Report for "%s"' % self.name

def render(self, version_db, verbose=False):
def render(self, version_db, verbose=False, max_newer_versions=None):
"""
Render this report (info on a particular package) to a string.
:param version_db: PackageVersionClassifications object, for classifying releases
:param verbose: Include more than minimal information in the report
:param max_newer_versions: Limit on newer versions shown for a package
:return: the rendered report, in the form of a string
"""
return '\n'.join(self.render_to_list(version_db, verbose))
return '\n'.join(self.render_to_list(version_db, verbose, max_newer_versions))

def render_to_list(self, version_db, verbose=False):
def render_to_list(self, version_db, verbose=False, max_newer_versions=None):
"""
Render this report (info on a particular package) to a list of strings,
for easy consolidation into a report on the entire virtualenv.
:param version_db: PackageVersionClassifications object, for classifying releases
:param verbose: Include more than minimal information in the report
:param max_newer_versions: Limit on newer versions shown for a package
:return: the rendered report, in the form of a list of strings
"""
messages = []
Expand All @@ -57,11 +61,18 @@ def _footer():
for v in sorted(self.newer)
]

if max_newer_versions is not None and len(newer) > max_newer_versions:
num_versions_in_section = math.floor(max_newer_versions / 2) # we might lose one
newer = newer[:num_versions_in_section] + [None] + newer[-num_versions_in_section:]

messages.append('Newer releases:')
for release in newer:
messages.append(' %s: %s' % (
release, version_db.classify_release(self.name, release)
))
if release is None: # max_newer_versions suppression
messages.append(' (more newer versions suppressed)')
else:
messages.append(' %s: %s' % (
release, version_db.classify_release(self.name, release)
))
changelog = version_db.get_changelog(self.name)
if changelog:
messages.append(' Changelog: %s' % changelog)
Expand Down Expand Up @@ -106,18 +117,19 @@ def add_package(self, package_name, current_version):
self.packages.append(package_report)
return package_report

def render(self, verbose=False):
def render(self, verbose=False, max_newer_versions=None):
"""
Create a printable report of the analysis results
:param verbose: Include more than minimal information in the report
:param max_newer_versions: Limit on newer versions shown for a package
:return: report string
"""
messages = []
up_to_date = []
no_version_info = []
render_all = verbose
for package in self.packages:
messages += package.render_to_list(self.version_db, verbose)
messages += package.render_to_list(self.version_db, verbose, max_newer_versions)
if package.newer:
render_all = True
if package.up_to_date:
Expand Down
34 changes: 34 additions & 0 deletions tests/test_analyze.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,37 @@ def test_package_not_in_release_database(self):
1.0.9: No information about package
"""
self.assertEqual(expected_report, report.render())

def test_suppress_most_newer_versions_from_report(self):
env = InstalledPackageVersions.from_freeze_file(StringIO('many-newer-versions==3.0.0'))
version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
available = FakePackageVersionInfo({
'many-newer-versions': {
'releases': {
x: True for x in [
"3.0.0",
"3.0.1",
"3.0.2",
"3.0.3",
"3.0.4",
"3.0.5",
"3.0.6",
"3.0.7",
"3.0.8",
"3.0.9",
"3.1.0"
]
}
}
})
analyzer = Analyzer(env, available, version_db)
report = analyzer.analyze()
expected_report = """many-newer-versions: 3.0.0
Newer releases:
3.0.1: Non-security bug fixes
3.0.2: Non-security bug fixes
(more newer versions suppressed)
3.0.9: Non-security bug fixes
3.1.0: Non-security bug fixes
"""
self.assertEqual(expected_report, report.render(max_newer_versions=4))
7 changes: 7 additions & 0 deletions tests/test_db.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,10 @@ non-lts-example:
ignored_releases: [1.0.1]
security_releases: [1.0.5, 1.0.8, 1.0.8rc3]
lts_releases: []
many-newer-versions:
bug_fix_releases: [3.0.0, 3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5, 3.0.6, 3.0.7, 3.0.8, 3.0.9, 3.1.0]
compatibility_releases: []
feature_releases: []
ignored_releases: []
security_releases: []
lts_releases: []

0 comments on commit 974612c

Please sign in to comment.