Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-edgegrid-python for
openSUSE:Factory checked in at 2026-09-28 10:47:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-edgegrid-python (Old)
and /work/SRC/openSUSE:Factory/.python-edgegrid-python.new.383539 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-edgegrid-python"
Mon Sep 28 10:47:45 2026 rev:5 rq:1381007 version:2.0.8
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-edgegrid-python/python-edgegrid-python.changes
2026-04-12 20:01:23.027188247 +0200
+++
/work/SRC/openSUSE:Factory/.python-edgegrid-python.new.383539/python-edgegrid-python.changes
2026-09-28 10:48:42.692631017 +0200
@@ -1,0 +2,8 @@
+Mon Sep 28 02:43:45 UTC 2026 - Steve Kowalik <[email protected]>
+
+- Update to 2.0.8:
+ * setuptools 82 compatibility - replaced deprecated pkg_resources with
+ PEP 420 namespace package discovery
+- Remove unneeded devel BuildRequires, this is noarch.
+
+-------------------------------------------------------------------
Old:
----
edgegrid_python-2.0.5.tar.gz
New:
----
edgegrid_python-2.0.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-edgegrid-python.spec ++++++
--- /var/tmp/diff_new_pack.dpnoBa/_old 2026-09-28 10:48:43.650671157 +0200
+++ /var/tmp/diff_new_pack.dpnoBa/_new 2026-09-28 10:48:43.653671282 +0200
@@ -17,14 +17,12 @@
Name: python-edgegrid-python
-Version: 2.0.5
+Version: 2.0.8
Release: 0
Summary: Client authentication protocol for python-requests
License: Apache-2.0
-Group: Development/Languages/Python
URL: https://github.com/akamai-open/AkamaiOPEN-edgegrid-python
Source:
https://files.pythonhosted.org/packages/source/e/edgegrid-python/edgegrid_python-%{version}.tar.gz
-BuildRequires: %{python_module devel}
BuildRequires: %{python_module pip}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module requests >= 2.24.0}
@@ -36,7 +34,6 @@
Requires: python-requests >= 2.24.0
Requires: python-requests-toolbelt >= 0.9.1
BuildArch: noarch
-
%python_subpackages
%description
@@ -50,7 +47,11 @@
%install
%pyproject_install
-%python_expand %fdupes %{buildroot}%{$python_sitelib}
+%{python_expand %fdupes %{buildroot}%{$python_sitelib}
+# Do not install examples or ci
+rm -rv %{buildroot}%{$python_sitelib}/examples
+rm -rv %{buildroot}%{$python_sitelib}/ci
+}
%check
%pytest
@@ -60,6 +61,5 @@
%license LICENSE
%dir %{python_sitelib}/akamai
%{python_sitelib}/akamai/edgegrid
-%{python_sitelib}/edgegrid_python-%{version}*.pth
%{python_sitelib}/edgegrid_python-%{version}.dist-info
++++++ edgegrid_python-2.0.5.tar.gz -> edgegrid_python-2.0.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/PKG-INFO
new/edgegrid_python-2.0.8/PKG-INFO
--- old/edgegrid_python-2.0.5/PKG-INFO 2026-01-27 10:47:13.810386000 +0100
+++ new/edgegrid_python-2.0.8/PKG-INFO 2026-09-21 10:29:15.970618000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: edgegrid-python
-Version: 2.0.5
+Version: 2.0.8
Summary: {OPEN} client authentication protocol for python-requests
Home-page: https://github.com/akamai/AkamaiOPEN-edgegrid-python
License: Apache 2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/akamai/__init__.py
new/edgegrid_python-2.0.8/akamai/__init__.py
--- old/edgegrid_python-2.0.5/akamai/__init__.py 2025-07-10
12:29:55.000000000 +0200
+++ new/edgegrid_python-2.0.8/akamai/__init__.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-"""Library provides an authentication handler for requests"""
-__import__('pkg_resources').declare_namespace(__name__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/akamai/edgegrid/__init__.py
new/edgegrid_python-2.0.8/akamai/edgegrid/__init__.py
--- old/edgegrid_python-2.0.5/akamai/edgegrid/__init__.py 2026-01-27
10:35:27.000000000 +0100
+++ new/edgegrid_python-2.0.8/akamai/edgegrid/__init__.py 2026-09-21
10:29:04.950872400 +0200
@@ -36,6 +36,6 @@
__all__ = ['EdgeGridAuth', 'EdgeRc']
__title__ = 'edgegrid-python'
-__version__ = '2.0.5'
+__version__ = '2.0.8'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2026 Akamai Technologies'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/ci/check_namespace_pkg.py
new/edgegrid_python-2.0.8/ci/check_namespace_pkg.py
--- old/edgegrid_python-2.0.5/ci/check_namespace_pkg.py 1970-01-01
01:00:00.000000000 +0100
+++ new/edgegrid_python-2.0.8/ci/check_namespace_pkg.py 2026-09-21
10:29:04.951715000 +0200
@@ -0,0 +1,33 @@
+"""
+Namespace package import test — run by ci/test_namespace_pkg.sh after both
+edgegrid-python and the temporary akamai-dummy fragment are installed.
+Requires REPO_DIR env var pointing to the edgegrid-python repo root.
+"""
+import akamai
+import akamai.dummy
+import akamai.edgegrid
+import os
+
+from akamai.dummy import SENTINEL
+from akamai.edgegrid import EdgeGridAuth, EdgeRc
+
+assert SENTINEL == "akamai.dummy is here", f"Unexpected value: {SENTINEL!r}"
+
+# Exercise real EdgeRc code — parse the sample_edgerc shipped with the package.
+sample_edgerc = os.path.join(os.environ["REPO_DIR"], "akamai", "edgegrid",
"test", "sample_edgerc")
+rc = EdgeRc(sample_edgerc)
+assert rc.get("default", "host") ==
"xxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.luna.akamaiapis.net/", "EdgeRc.get
failed"
+
+# Both fragments must live under the *same* namespace package object.
+# Each entry in akamai.__path__ is the `akamai/` dir from one fragment.
+# Derive expected dirs by going up one level from each sub-package's __file__.
+real_paths = [os.path.realpath(p) for p in akamai.__path__ if os.path.isdir(p)]
+
+edgegrid_frag =
os.path.realpath(os.path.join(os.path.dirname(akamai.edgegrid.__file__), ".."))
+dummy_frag =
os.path.realpath(os.path.join(os.path.dirname(akamai.dummy.__file__), ".."))
+
+assert edgegrid_frag in real_paths, f"edgegrid fragment {edgegrid_frag!r} not
in {real_paths}"
+assert dummy_frag in real_paths, f"dummy fragment {dummy_frag!r} not in
{real_paths}"
+
+print(f"OK — akamai.edgegrid is reachable from {edgegrid_frag}")
+print(f"OK — akamai.dummy is reachable from {dummy_frag}")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/ci/coverage_report.py
new/edgegrid_python-2.0.8/ci/coverage_report.py
--- old/edgegrid_python-2.0.5/ci/coverage_report.py 1970-01-01
01:00:00.000000000 +0100
+++ new/edgegrid_python-2.0.8/ci/coverage_report.py 2026-09-21
10:29:04.951715000 +0200
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+"""Generate a coverage summary markdown table from Cobertura XML files.
+
+Usage:
+ python ci/coverage_report.py <version>:<path/to/cobertura.xml> ...
+
+Each positional argument is a colon-separated pair of a label (e.g. the
+Python version) and the path to a Cobertura-format XML coverage report.
+The script reads the top-level ``line-rate`` attribute from each file,
+formats it as a percentage, and prints a markdown table to stdout.
+"""
+
+import argparse
+import sys
+import xml.etree.ElementTree as ET
+
+
+def parse_line_coverage(xml_path: str) -> float:
+ """Return the top-level line coverage rate (0–1) from a Cobertura XML
file."""
+ try:
+ tree = ET.parse(xml_path) # noqa: S314 — file is a trusted CI artifact
+ except ET.ParseError as exc:
+ raise SystemExit(f"Failed to parse {xml_path!r}: {exc}") from exc
+ root = tree.getroot()
+ try:
+ return float(root.attrib["line-rate"])
+ except (KeyError, ValueError) as exc:
+ raise SystemExit(f"Missing or invalid 'line-rate' in {xml_path!r}:
{exc}") from exc
+
+
+def build_table(rows: list[tuple[str, float]]) -> str:
+ lines = [
+ "## Coverage Report",
+ "",
+ "| Python Version | Line Coverage |",
+ "| :---: | :---: |",
+ ]
+ for version, rate in sorted(rows):
+ pct = rate * 100
+ badge = "✅" if pct >= 80 else "❌"
+ lines.append(f"| {version} | {badge} {pct:.1f}% |")
+ return "\n".join(lines) + "\n"
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(
+ description="Summarise Cobertura coverage reports into a GitHub step
summary."
+ )
+ parser.add_argument(
+ "entries",
+ nargs="+",
+ metavar="VERSION:XML_PATH",
+ help="Colon-separated pair of a label and the path to a Cobertura XML
file.",
+ )
+ args = parser.parse_args()
+
+ rows: list[tuple[str, float]] = []
+ for entry in args.entries:
+ if ":" not in entry:
+ print(f"Error: expected VERSION:PATH, got {entry!r}",
file=sys.stderr)
+ sys.exit(1)
+ version, xml_path = entry.split(":", 1)
+ rate = parse_line_coverage(xml_path)
+ rows.append((version, rate))
+
+ table = build_table(rows)
+ print(table)
+
+
+if __name__ == "__main__":
+ main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid_python-2.0.5/edgegrid_python.egg-info/PKG-INFO
new/edgegrid_python-2.0.8/edgegrid_python.egg-info/PKG-INFO
--- old/edgegrid_python-2.0.5/edgegrid_python.egg-info/PKG-INFO 2026-01-27
10:47:13.000000000 +0100
+++ new/edgegrid_python-2.0.8/edgegrid_python.egg-info/PKG-INFO 2026-09-21
10:29:15.949509400 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: edgegrid-python
-Version: 2.0.5
+Version: 2.0.8
Summary: {OPEN} client authentication protocol for python-requests
Home-page: https://github.com/akamai/AkamaiOPEN-edgegrid-python
License: Apache 2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid_python-2.0.5/edgegrid_python.egg-info/SOURCES.txt
new/edgegrid_python-2.0.8/edgegrid_python.egg-info/SOURCES.txt
--- old/edgegrid_python-2.0.5/edgegrid_python.egg-info/SOURCES.txt
2026-01-27 10:47:13.000000000 +0100
+++ new/edgegrid_python-2.0.8/edgegrid_python.egg-info/SOURCES.txt
2026-09-21 10:29:15.960272800 +0200
@@ -3,7 +3,6 @@
README.md
requirements.txt
setup.py
-akamai/__init__.py
akamai/edgegrid/__init__.py
akamai/edgegrid/edgegrid.py
akamai/edgegrid/edgerc.py
@@ -15,9 +14,14 @@
akamai/edgegrid/test/test_edgegrid.py
akamai/edgegrid/test/testcases.json
akamai/edgegrid/test/testdata.json
+ci/check_namespace_pkg.py
+ci/coverage_report.py
edgegrid_python.egg-info/PKG-INFO
edgegrid_python.egg-info/SOURCES.txt
edgegrid_python.egg-info/dependency_links.txt
-edgegrid_python.egg-info/namespace_packages.txt
edgegrid_python.egg-info/requires.txt
-edgegrid_python.egg-info/top_level.txt
\ No newline at end of file
+edgegrid_python.egg-info/top_level.txt
+examples/create-credentials.py
+examples/delete-credentials.py
+examples/get-credentials.py
+examples/update-credentials.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid_python-2.0.5/edgegrid_python.egg-info/namespace_packages.txt
new/edgegrid_python-2.0.8/edgegrid_python.egg-info/namespace_packages.txt
--- old/edgegrid_python-2.0.5/edgegrid_python.egg-info/namespace_packages.txt
2026-01-27 10:47:13.000000000 +0100
+++ new/edgegrid_python-2.0.8/edgegrid_python.egg-info/namespace_packages.txt
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-akamai
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid_python-2.0.5/edgegrid_python.egg-info/top_level.txt
new/edgegrid_python-2.0.8/edgegrid_python.egg-info/top_level.txt
--- old/edgegrid_python-2.0.5/edgegrid_python.egg-info/top_level.txt
2026-01-27 10:47:13.000000000 +0100
+++ new/edgegrid_python-2.0.8/edgegrid_python.egg-info/top_level.txt
2026-09-21 10:29:15.950720800 +0200
@@ -1 +1,4 @@
akamai
+ci
+dist
+examples
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/examples/create-credentials.py
new/edgegrid_python-2.0.8/examples/create-credentials.py
--- old/edgegrid_python-2.0.5/examples/create-credentials.py 1970-01-01
01:00:00.000000000 +0100
+++ new/edgegrid_python-2.0.8/examples/create-credentials.py 2026-09-21
10:29:04.952063000 +0200
@@ -0,0 +1,34 @@
+# This example creates your new API client credentials.
+#
+# To run this example:
+#
+# 1. Specify the location of your .edgerc file and the section header of the
set of credentials to use.
+#
+## The defaults here expect the .edgerc at your home directory and use the
credentials under the heading of default.
+#
+# 2. Open a Terminal or shell instance and run "python
examples/create-credentials.py".
+#
+# A successful call returns a new API client with its credentialId. Use this
ID in both the update and delete examples.
+#
+# For more information on the call used in this example, see
https://techdocs.akamai.com/iam-api/reference/post-self-credentials.
+
+import requests
+import json
+from akamai.edgegrid import EdgeGridAuth, EdgeRc
+from urllib.parse import urljoin
+
+edgerc = EdgeRc('~/.edgerc')
+section = 'default'
+baseurl = 'https://%s' % edgerc.get(section, 'host')
+
+session = requests.Session()
+session.auth = EdgeGridAuth.from_edgerc(edgerc, section)
+
+path = '/identity-management/v3/api-clients/self/credentials'
+headers = {
+ "Accept": "application/json"
+}
+
+result = session.post(urljoin(baseurl, path), headers=headers)
+print(result.status_code)
+print(json.dumps(result.json(), indent=2))
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/examples/delete-credentials.py
new/edgegrid_python-2.0.8/examples/delete-credentials.py
--- old/edgegrid_python-2.0.5/examples/delete-credentials.py 1970-01-01
01:00:00.000000000 +0100
+++ new/edgegrid_python-2.0.8/examples/delete-credentials.py 2026-09-21
10:29:04.952063000 +0200
@@ -0,0 +1,35 @@
+# This example deletes your API client credentials.
+#
+# To run this example:
+#
+# 1. Specify the location of your .edgerc file and the section header of the
set of credentials to use.
+#
+# The defaults here expect the .edgerc at your home directory and use the
credentials under the heading of default.
+#
+# 2. Add the credentialId from the update example to the path. You can only
delete inactive credentials. Sending the request on an active set will return a
400. Use the update credentials example for deactivation.
+#
+# **Important:** Don't use the credentials you're actively using when deleting
a set of credentials. Otherwise, you'll block your access to the Akamai APIs.
+#
+# 3. Open a Terminal or shell instance and run "python
examples/delete-credentials.py".
+#
+# A successful call returns "" null.
+#
+# For more information on the call used in this example, see
https://techdocs.akamai.com/iam-api/reference/delete-self-credential.
+
+import requests
+import json
+from akamai.edgegrid import EdgeGridAuth, EdgeRc
+from urllib.parse import urljoin
+
+edgerc = EdgeRc('~/.edgerc')
+section = 'default'
+baseurl = 'https://%s' % edgerc.get(section, 'host')
+
+session = requests.Session()
+session.auth = EdgeGridAuth.from_edgerc(edgerc, section)
+credentialId = 123456
+
+path =
'/identity-management/v3/api-clients/self/credentials/{}'.format(credentialId)
+
+result = session.delete(urljoin(baseurl, path))
+print(result.status_code)
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/examples/get-credentials.py
new/edgegrid_python-2.0.8/examples/get-credentials.py
--- old/edgegrid_python-2.0.5/examples/get-credentials.py 1970-01-01
01:00:00.000000000 +0100
+++ new/edgegrid_python-2.0.8/examples/get-credentials.py 2026-09-21
10:29:04.952063000 +0200
@@ -0,0 +1,37 @@
+# This example returns a list of your API client credentials.
+#
+# To run this example:
+#
+# 1. Specify the location of your .edgerc file and the section header of the
set of credentials to use.
+#
+# The defaults here expect the .edgerc at your home directory and use the
credentials under the heading of default.
+#
+# 2. Open a Terminal or shell instance and run "python
examples/get-credentials.py".
+#
+# A successful call returns your credentials grouped by credentialId.
+#
+# For more information on the call used in this example, see
https://techdocs.akamai.com/iam-api/reference/get-self-credentials.
+
+import requests
+import json
+from akamai.edgegrid import EdgeGridAuth, EdgeRc
+from urllib.parse import urljoin
+
+edgerc = EdgeRc('~/.edgerc')
+section = 'default'
+baseurl = 'https://%s' % edgerc.get(section, 'host')
+
+session = requests.Session()
+session.auth = EdgeGridAuth.from_edgerc(edgerc, section)
+
+path = '/identity-management/v3/api-clients/self/credentials'
+headers = {
+ "Accept": "application/json"}
+querystring = {
+ "actions": True
+}
+
+result = session.get(urljoin(baseurl, path), headers=headers,
params=querystring)
+print(result.status_code)
+print(json.dumps(result.json(), indent=2))
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/examples/update-credentials.py
new/edgegrid_python-2.0.8/examples/update-credentials.py
--- old/edgegrid_python-2.0.5/examples/update-credentials.py 1970-01-01
01:00:00.000000000 +0100
+++ new/edgegrid_python-2.0.8/examples/update-credentials.py 2026-09-21
10:29:04.952063000 +0200
@@ -0,0 +1,47 @@
+# This example updates the credentials from the create credentials example.
+#
+# To run this example:
+#
+# 1. Specify the location of your .edgerc file and the section header of the
set of credentials to use.
+#
+# The defaults here expect the .edgerc at your home directory and use the
credentials under the heading of default.
+#
+# 2. Add the credentialId for the set of credentials created using the create
example as a path parameter.
+#
+# 3. Edit the expiresOn date to today's date. Optionally, you can change the
description value.
+#
+# **Important:** Don't use the credentials you're actively using when
inactivating a set of credentials. Otherwise, you'll block your access to the
Akamai APIs.
+#
+# 4. Open a Terminal or shell instance and run "python
examples/update-credentials.py".
+#
+# A successful call returns.
+#
+# For more information on the call used in this example, see
https://techdocs.akamai.com/iam-api/reference/put-self-credential.
+
+import requests
+import json
+from akamai.edgegrid import EdgeGridAuth, EdgeRc
+from urllib.parse import urljoin
+
+edgerc = EdgeRc('~/.edgerc')
+section = 'default'
+baseurl = 'https://%s' % edgerc.get(section, 'host')
+
+session = requests.Session()
+session.auth = EdgeGridAuth.from_edgerc(edgerc, section)
+credentialId = 123456
+
+path =
'/identity-management/v3/api-clients/self/credentials/{}'.format(credentialId)
+headers = {
+ "Content-Type": "application/json",
+ "Accept": "application/json"}
+payload = {
+ "status": "INACTIVE",
+ "expiresOn": "2024-12-30T22:09:24.000Z", # The date cannot be more than
two years out or it will return a 400
+ "description": "Update this credential"
+}
+
+result = session.put(urljoin(baseurl, path), headers=headers, json=payload)
+print(result.status_code)
+print(json.dumps(result.json(), indent=2))
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/requirements.txt
new/edgegrid_python-2.0.8/requirements.txt
--- old/edgegrid_python-2.0.5/requirements.txt 2026-01-27 10:35:27.000000000
+0100
+++ new/edgegrid_python-2.0.8/requirements.txt 2026-09-21 10:29:04.952063000
+0200
@@ -8,13 +8,13 @@
# via requests
charset-normalizer==3.4.4
# via requests
-idna==3.11
+idna==3.19
# via requests
-requests==2.32.5
+requests==2.33.0
# via
# edgegrid-python (setup.py)
# requests-toolbelt
requests-toolbelt==1.0.0
# via edgegrid-python (setup.py)
-urllib3==2.6.3
+urllib3==2.7.0
# via requests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid_python-2.0.5/setup.py
new/edgegrid_python-2.0.8/setup.py
--- old/edgegrid_python-2.0.5/setup.py 2026-01-27 10:35:27.000000000 +0100
+++ new/edgegrid_python-2.0.8/setup.py 2026-09-21 10:29:04.952063000 +0200
@@ -1,12 +1,12 @@
-from setuptools import setup, find_packages
+from setuptools import setup, find_namespace_packages
+
setup(
name='edgegrid-python',
- version='2.0.5',
+ version='2.0.8',
description='{OPEN} client authentication protocol for python-requests',
url='https://github.com/akamai/AkamaiOPEN-edgegrid-python',
- namespace_packages=['akamai'],
- packages=find_packages(),
+ packages=find_namespace_packages(),
python_requires=">=3.10",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",