Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-osc-tiny for openSUSE:Factory
checked in at 2026-03-11 20:57:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-osc-tiny (Old)
and /work/SRC/openSUSE:Factory/.python-osc-tiny.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-osc-tiny"
Wed Mar 11 20:57:28 2026 rev:43 rq:1338338 version:0.12.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-osc-tiny/python-osc-tiny.changes
2025-11-25 15:55:57.110334803 +0100
+++
/work/SRC/openSUSE:Factory/.python-osc-tiny.new.8177/python-osc-tiny.changes
2026-03-11 20:59:46.596947380 +0100
@@ -1,0 +2,18 @@
+Wed Mar 11 13:47:51 UTC 2026 - maintenance-obs-robot
<[email protected]>
+
+- Release 0.12.0
+ ## What's Changed
+ * fix: include cached-property as a conditional dependency by @dcermak in
https://github.com/SUSE/osc-tiny/pull/223
+ * Add py.typed by @dcermak in https://github.com/SUSE/osc-tiny/pull/222
+ * feat: add extension for the /published/ route by @dcermak in
https://github.com/SUSE/osc-tiny/pull/226
+ * chore: new version 0.12.0 by @dcermak in
https://github.com/SUSE/osc-tiny/pull/227
+
+-------------------------------------------------------------------
+Wed Mar 11 12:38:20 UTC 2026 - dancermak <[email protected]>
+
+- Release 0.12.0
+ - feat: add extension for the /published/ route
+ - chore: add py.typed marker
+ - fix: include cached-property as a conditional dependency
+
+-------------------------------------------------------------------
Old:
----
osc_tiny-0.11.0.tar.gz
New:
----
osc_tiny-0.12.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-osc-tiny.spec ++++++
--- /var/tmp/diff_new_pack.bpJTWE/_old 2026-03-11 20:59:47.148970114 +0100
+++ /var/tmp/diff_new_pack.bpJTWE/_new 2026-03-11 20:59:47.152970279 +0100
@@ -19,7 +19,7 @@
%define skip_python2 1
%{?sle15allpythons}
Name: python-osc-tiny
-Version: 0.11.0
+Version: 0.12.0
Release: 0
Summary: Client API for openSUSE BuildService
License: MIT
++++++ osc_tiny-0.11.0.tar.gz -> osc_tiny-0.12.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/MANIFEST.in
new/osc_tiny-0.12.0/MANIFEST.in
--- old/osc_tiny-0.11.0/MANIFEST.in 2025-11-25 10:35:56.000000000 +0100
+++ new/osc_tiny-0.12.0/MANIFEST.in 2026-03-11 14:47:05.000000000 +0100
@@ -1,3 +1,4 @@
include *.md
include LICENSE
-include requirements*.txt
\ No newline at end of file
+include requirements*.txt
+include osctiny/py.typed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/PKG-INFO new/osc_tiny-0.12.0/PKG-INFO
--- old/osc_tiny-0.11.0/PKG-INFO 2025-11-25 10:36:08.642153300 +0100
+++ new/osc_tiny-0.12.0/PKG-INFO 2026-03-11 14:47:08.794050700 +0100
@@ -1,17 +1,16 @@
Metadata-Version: 2.4
Name: osc-tiny
-Version: 0.11.0
-Summary: Client API for openSUSE BuildService
+Version: 0.12.0
+Summary: Client API for the Open Build Service
Home-page: https://github.com/SUSE/osc-tiny
Author: Andreas Hasenkopf
Author-email: [email protected]
Maintainer: SUSE Maintenance Automation Engineering team
Maintainer-email: [email protected]
-License: MIT
+License-Expression: MIT
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
@@ -20,6 +19,8 @@
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: lxml
@@ -28,14 +29,15 @@
Requires-Dist: pytz
Requires-Dist: pyyaml
Requires-Dist: urllib3
+Requires-Dist: cached-property; python_version < "3.8"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
-Dynamic: license
Dynamic: license-file
+Dynamic: license-expression
Dynamic: maintainer
Dynamic: maintainer-email
Dynamic: requires-dist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osc_tiny.egg-info/PKG-INFO
new/osc_tiny-0.12.0/osc_tiny.egg-info/PKG-INFO
--- old/osc_tiny-0.11.0/osc_tiny.egg-info/PKG-INFO 2025-11-25
10:36:08.000000000 +0100
+++ new/osc_tiny-0.12.0/osc_tiny.egg-info/PKG-INFO 2026-03-11
14:47:08.000000000 +0100
@@ -1,17 +1,16 @@
Metadata-Version: 2.4
Name: osc-tiny
-Version: 0.11.0
-Summary: Client API for openSUSE BuildService
+Version: 0.12.0
+Summary: Client API for the Open Build Service
Home-page: https://github.com/SUSE/osc-tiny
Author: Andreas Hasenkopf
Author-email: [email protected]
Maintainer: SUSE Maintenance Automation Engineering team
Maintainer-email: [email protected]
-License: MIT
+License-Expression: MIT
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
@@ -20,6 +19,8 @@
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: lxml
@@ -28,14 +29,15 @@
Requires-Dist: pytz
Requires-Dist: pyyaml
Requires-Dist: urllib3
+Requires-Dist: cached-property; python_version < "3.8"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
-Dynamic: license
Dynamic: license-file
+Dynamic: license-expression
Dynamic: maintainer
Dynamic: maintainer-email
Dynamic: requires-dist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osc_tiny.egg-info/SOURCES.txt
new/osc_tiny-0.12.0/osc_tiny.egg-info/SOURCES.txt
--- old/osc_tiny-0.11.0/osc_tiny.egg-info/SOURCES.txt 2025-11-25
10:36:08.000000000 +0100
+++ new/osc_tiny-0.12.0/osc_tiny.egg-info/SOURCES.txt 2026-03-11
14:47:08.000000000 +0100
@@ -3,7 +3,6 @@
README.md
requirements.txt
requirements_devel.txt
-requirements_pre38.txt
setup.py
osc_tiny.egg-info/PKG-INFO
osc_tiny.egg-info/SOURCES.txt
@@ -12,6 +11,7 @@
osc_tiny.egg-info/top_level.txt
osctiny/__init__.py
osctiny/osc.py
+osctiny/py.typed
osctiny/extensions/__init__.py
osctiny/extensions/attributes.py
osctiny/extensions/bs_requests.py
@@ -22,6 +22,7 @@
osctiny/extensions/origin.py
osctiny/extensions/packages.py
osctiny/extensions/projects.py
+osctiny/extensions/published.py
osctiny/extensions/search.py
osctiny/extensions/staging.py
osctiny/extensions/users.py
@@ -39,6 +40,7 @@
osctiny/tests/test_origin.py
osctiny/tests/test_packages.py
osctiny/tests/test_projects.py
+osctiny/tests/test_published.py
osctiny/tests/test_requests.py
osctiny/tests/test_search.py
osctiny/tests/test_staging.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osc_tiny.egg-info/requires.txt
new/osc_tiny-0.12.0/osc_tiny.egg-info/requires.txt
--- old/osc_tiny-0.11.0/osc_tiny.egg-info/requires.txt 2025-11-25
10:36:08.000000000 +0100
+++ new/osc_tiny-0.12.0/osc_tiny.egg-info/requires.txt 2026-03-11
14:47:08.000000000 +0100
@@ -4,3 +4,6 @@
pytz
pyyaml
urllib3
+
+[:python_version < "3.8"]
+cached-property
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osctiny/__init__.py
new/osc_tiny-0.12.0/osctiny/__init__.py
--- old/osc_tiny-0.11.0/osctiny/__init__.py 2025-11-25 10:35:56.000000000
+0100
+++ new/osc_tiny-0.12.0/osctiny/__init__.py 2026-03-11 14:47:05.000000000
+0100
@@ -1,9 +1,9 @@
# pylint: disable=missing-docstring
from .osc import Osc
from .extensions import bs_requests, buildresults, comments, packages, \
- projects, search, users
+ projects, published, search, users
__all__ = ['Osc', 'bs_requests', 'buildresults', 'comments', 'packages',
- 'projects', 'search', 'users']
-__version__ = "0.11.0"
+ 'projects', 'published', 'search', 'users']
+__version__ = "0.12.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osctiny/extensions/buildresults.py
new/osc_tiny-0.12.0/osctiny/extensions/buildresults.py
--- old/osc_tiny-0.11.0/osctiny/extensions/buildresults.py 2025-11-25
10:35:56.000000000 +0100
+++ new/osc_tiny-0.12.0/osctiny/extensions/buildresults.py 2026-03-11
14:47:05.000000000 +0100
@@ -4,6 +4,7 @@
"""
# pylint: disable=too-few-public-methods
from urllib.parse import urljoin
+from warnings import warn
from ..utils.base import ExtensionBase
@@ -115,8 +116,8 @@
"""
Get a list of published binaries in a repository
- Returns the directory listing of published packages for a given
- project, repository, and architecture combination.
+ .. deprecated:: 0.12.0
+ Use
:py:meth:`osctiny.extensions.published.Published.get_binary_list` instead.
:param project: Project name
:param repo: Repository name
@@ -124,15 +125,14 @@
:param params: Additional parameters
:return: Objectified XML element containing directory entries
:rtype: lxml.objectify.ObjectifiedElement
-
"""
- response = self.osc.request(
- method="GET",
- url=urljoin(self.osc.url, f"/published/{project}/{repo}/{arch}"),
- params=params,
+ warn(
+ "Build.get_published_list is deprecated. "
+ "Use osc.published.get_binary_list instead.",
+ DeprecationWarning,
+ stacklevel=2,
)
-
- return self.osc.get_objectified_xml(response)
+ return self.osc.published.get_binary_list(project, repo, arch,
**params)
def get_status_and_build_id(self, project, repo, arch):
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osctiny/extensions/published.py
new/osc_tiny-0.12.0/osctiny/extensions/published.py
--- old/osc_tiny-0.11.0/osctiny/extensions/published.py 1970-01-01
01:00:00.000000000 +0100
+++ new/osc_tiny-0.12.0/osctiny/extensions/published.py 2026-03-11
14:47:05.000000000 +0100
@@ -0,0 +1,61 @@
+"""
+Published binaries extension
+-----------------------------
+"""
+
+from urllib.parse import urljoin
+
+from ..utils.base import ExtensionBase
+
+
+class Published(ExtensionBase):
+ """
+ Osc extension for retrieving published binaries
+
+ .. versionadded:: 0.12.0
+ """
+
+ base_path = "/published"
+
+ def get(self, project: str, repo: str, **params):
+ """
+ Get published repository info
+
+ Returns directory listing or metadata (e.g. ``view=publishedpath``)
+ for a given project and repository.
+
+ :param project: Project name
+ :param repo: Repository name
+ :param params: Additional parameters
+ :return: Objectified XML element
+ :rtype: lxml.objectify.ObjectifiedElement
+ """
+ response = self.osc.request(
+ method="GET",
+ url=urljoin(self.osc.url, f"{self.base_path}/{project}/{repo}"),
+ params=params,
+ )
+
+ return self.osc.get_objectified_xml(response)
+
+ def get_binary_list(self, project: str, repo: str, arch: str, **params):
+ """
+ Get a list of published binaries in a repository
+
+ Returns the directory listing of published packages for a given
+ project, repository, and architecture combination.
+
+ :param project: Project name
+ :param repo: Repository name
+ :param arch: Architecture name
+ :param params: Additional parameters
+ :return: Objectified XML element containing directory entries
+ :rtype: lxml.objectify.ObjectifiedElement
+ """
+ response = self.osc.request(
+ method="GET",
+ url=urljoin(self.osc.url,
f"{self.base_path}/{project}/{repo}/{arch}"),
+ params=params,
+ )
+
+ return self.osc.get_objectified_xml(response)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osctiny/osc.py
new/osc_tiny-0.12.0/osctiny/osc.py
--- old/osc_tiny-0.11.0/osctiny/osc.py 2025-11-25 10:35:56.000000000 +0100
+++ new/osc_tiny-0.12.0/osctiny/osc.py 2026-03-11 14:47:05.000000000 +0100
@@ -30,6 +30,7 @@
from .extensions.origin import Origin
from .extensions.packages import Package
from .extensions.projects import Project
+from .extensions.published import Published
from .extensions.bs_requests import Request as BsRequest
from .extensions.search import Search
from .extensions.staging import Staging
@@ -173,6 +174,7 @@
self.origins = Origin(osc_obj=self)
self.packages = Package(osc_obj=self)
self.projects = Project(osc_obj=self)
+ self.published = Published(osc_obj=self)
self.requests = BsRequest(osc_obj=self)
self.search = Search(osc_obj=self)
self.staging = Staging(osc_obj=self)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osctiny/tests/test_published.py
new/osc_tiny-0.12.0/osctiny/tests/test_published.py
--- old/osc_tiny-0.11.0/osctiny/tests/test_published.py 1970-01-01
01:00:00.000000000 +0100
+++ new/osc_tiny-0.12.0/osctiny/tests/test_published.py 2026-03-11
14:47:05.000000000 +0100
@@ -0,0 +1,119 @@
+import re
+import warnings
+
+import responses
+
+from .base import OscTest
+
+
+class PublishedTest(OscTest):
+ @responses.activate
+ def test_get(self):
+ project = "openSUSE:Factory"
+ repo = "standard"
+
+ response_body = """
+ <directory>
+ <entry name="x86_64"/>
+ <entry name="i586"/>
+ </directory>
+ """
+
+ self.mock_request(
+ method=responses.GET,
+
url=re.compile(f"{re.escape(self.osc.url)}/published/{project}/{repo}"),
+ body=response_body,
+ )
+
+ response = self.osc.published.get(project=project, repo=repo)
+ entries = response.findall("entry")
+ self.assertEqual(len(entries), 2)
+ self.assertEqual(entries[0].get("name"), "x86_64")
+
+ @responses.activate
+ def test_get_publishedpath(self):
+ project = "SUSE:SLFO:1.1:Staging:I"
+ repo = "standard"
+
+ response_body = """<publishedpath project="SUSE:SLFO:1.1:Staging:I"
repository="standard">
+ <path>SUSE:/SLFO:/1.1:/Staging:/I/standard</path>
+
<url>https://download.opensuse.org/obs/SUSE:/SLFO:/1.1:/Staging:/I/standard</url>
+</publishedpath>
+"""
+
+ self.mock_request(
+ method=responses.GET,
+
url=re.compile(f"{re.escape(self.osc.url)}/published/{project}/{repo}"),
+ body=response_body,
+ )
+
+ response = self.osc.published.get(
+ project=project, repo=repo, view="publishedpath"
+ )
+ self.assertIsNotNone(response)
+ self.assertEqual(
+ response.url,
+
"https://download.opensuse.org/obs/SUSE:/SLFO:/1.1:/Staging:/I/standard",
+ )
+
+ @responses.activate
+ def test_get_binary_list(self):
+ project = "openSUSE:Factory"
+ repo = "standard"
+ arch = "x86_64"
+
+ response_body = """
+ <directory>
+ <entry name="acme-webserver-1.2.3-1.1.x86_64.rpm"/>
+ <entry name="python-foobar-2.0.1-4.2.x86_64.rpm"/>
+ <entry name="libcoolstuff3-0.5.7-2.1.x86_64.rpm"/>
+ </directory>
+ """
+
+ self.mock_request(
+ method=responses.GET,
+ url=re.compile(
+ f"{re.escape(self.osc.url)}/published/{project}/{repo}/{arch}"
+ ),
+ body=response_body,
+ )
+
+ response = self.osc.published.get_binary_list(
+ project=project, repo=repo, arch=arch
+ )
+ entries = response.findall("entry")
+ self.assertEqual(len(entries), 3)
+ self.assertEqual(entries[0].get("name"),
"acme-webserver-1.2.3-1.1.x86_64.rpm")
+ self.assertEqual(entries[2].get("name"),
"libcoolstuff3-0.5.7-2.1.x86_64.rpm")
+
+ @responses.activate
+ def test_build_get_published_list_deprecated(self):
+ project = "openSUSE:Factory"
+ repo = "standard"
+ arch = "x86_64"
+
+ response_body = """
+ <directory>
+ <entry name="acme-webserver-1.2.3-1.1.x86_64.rpm"/>
+ </directory>
+ """
+
+ self.mock_request(
+ method=responses.GET,
+ url=re.compile(
+ f"{re.escape(self.osc.url)}/published/{project}/{repo}/{arch}"
+ ),
+ body=response_body,
+ )
+
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter("always")
+ response = self.osc.build.get_published_list(
+ project=project, repo=repo, arch=arch
+ )
+ self.assertEqual(len(w), 1)
+ self.assertTrue(issubclass(w[0].category, DeprecationWarning))
+ self.assertIn("deprecated", str(w[0].message).lower())
+
+ entries = response.findall("entry")
+ self.assertEqual(len(entries), 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/osctiny/utils/base.py
new/osc_tiny-0.12.0/osctiny/utils/base.py
--- old/osc_tiny-0.11.0/osctiny/utils/base.py 2025-11-25 10:35:56.000000000
+0100
+++ new/osc_tiny-0.12.0/osctiny/utils/base.py 2026-03-11 14:47:05.000000000
+0100
@@ -4,10 +4,17 @@
"""
# pylint: disable=too-few-public-methods,
+from typing import TYPE_CHECKING
+
+
+if TYPE_CHECKING:
+ from osctiny import Osc
+
class ExtensionBase:
"""
Base class for extensions of the :py:class:`Ocs` entry point.
"""
+
def __init__(self, osc_obj: "Osc"):
self.osc = osc_obj
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/requirements.txt
new/osc_tiny-0.12.0/requirements.txt
--- old/osc_tiny-0.11.0/requirements.txt 2025-11-25 10:35:56.000000000
+0100
+++ new/osc_tiny-0.12.0/requirements.txt 2026-03-11 14:47:05.000000000
+0100
@@ -4,3 +4,4 @@
pytz
pyyaml
urllib3
+cached-property; python_version < '3.8'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/requirements_pre38.txt
new/osc_tiny-0.12.0/requirements_pre38.txt
--- old/osc_tiny-0.11.0/requirements_pre38.txt 2025-11-25 10:35:56.000000000
+0100
+++ new/osc_tiny-0.12.0/requirements_pre38.txt 1970-01-01 01:00:00.000000000
+0100
@@ -1 +0,0 @@
-cached-property
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/osc_tiny-0.11.0/setup.py new/osc_tiny-0.12.0/setup.py
--- old/osc_tiny-0.11.0/setup.py 2025-11-25 10:35:56.000000000 +0100
+++ new/osc_tiny-0.12.0/setup.py 2026-03-11 14:47:05.000000000 +0100
@@ -1,6 +1,5 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-from sys import version_info
from setuptools import setup, find_packages
@@ -13,10 +12,6 @@
with open("requirements.txt", "r") as fh:
requirements += _filter(fh.readlines())
- if version_info.minor < 8:
- with open("requirements_pre38.txt", "r") as fh:
- requirements += _filter(fh.readlines())
-
return requirements
@@ -26,8 +21,8 @@
setup(
name='osc-tiny',
- version='0.11.0',
- description='Client API for openSUSE BuildService',
+ version='0.12.0',
+ description='Client API for the Open Build Service',
long_description=long_description,
long_description_content_type="text/markdown",
author='Andreas Hasenkopf',
@@ -36,13 +31,13 @@
maintainer_email='[email protected]',
url='https://github.com/SUSE/osc-tiny',
packages=find_packages(),
- license='MIT',
+ package_data={"osctiny": ["py.typed"]},
+ license_expression='MIT',
install_requires=get_requires(),
classifiers=[
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
- "License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
@@ -51,5 +46,7 @@
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
]
)