jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1048832?usp=email )
Change subject: [doc] Update ROADMAP.rst, CHANGELOG.rst and some code documentations
......................................................................
[doc] Update ROADMAP.rst, CHANGELOG.rst and some code documentations
Change-Id: If46121fb857cc49cc8521947f6fadecccdcb5ee3
---
M ROADMAP.rst
M docs/api_ref/pywikibot.data.rst
M pywikibot/data/superset.py
M pywikibot/pagegenerators/_generators.py
M scripts/CHANGELOG.rst
M tests/superset_tests.py
6 files changed, 64 insertions(+), 62 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/ROADMAP.rst b/ROADMAP.rst
index b244348..b956e38 100644
--- a/ROADMAP.rst
+++ b/ROADMAP.rst
@@ -1,6 +1,12 @@
Current Release Changes
=======================
+* Add support for ``btmwiki`` to Pywikibot (:phab:`T368069`)
+* Include image repository extensions in :attr:`site.APISite.file_extensions
+ <pywikibot.site._apisite.APISite.file_extensions>`
+* Ignore :exc:`ValueError` durig upcast of :class:`FilePage<pywikibot.page.FilePage>` due to invalid file extension
+ (:phab:`T367777`)
+* Add :func:`pagegenerators.SupersetPageGenerator` pagegenerator (:phab:`T367684`)
* No longer wait in :meth:`data.api.Request._http_request` for ``ImportError`` and ``NameError``
* Replace ``requests.utils.urlparse`` with ``urllib.parse.urlparse`` in
:func:`comms.http.get_authentication` (:phab:`T367649`)
diff --git a/docs/api_ref/pywikibot.data.rst b/docs/api_ref/pywikibot.data.rst
index cd4f8c3..0caf1b9 100644
--- a/docs/api_ref/pywikibot.data.rst
+++ b/docs/api_ref/pywikibot.data.rst
@@ -29,6 +29,12 @@
.. automodule:: data.sparql
:synopsis: SPARQL Query interface
+:mod:`data.superset` --- Superset requests
+==========================================
+
+.. automodule:: data.superset
+ :synopsis: Superset Query interface
+
:mod:`data.wikistats` --- WikiStats requests
============================================
diff --git a/pywikibot/data/superset.py b/pywikibot/data/superset.py
index 85aebc0..2da5a10 100644
--- a/pywikibot/data/superset.py
+++ b/pywikibot/data/superset.py
@@ -1,10 +1,16 @@
-"""Superset Query interface."""
+"""Superset Query interface.
+
+.. versionadded:: 9.2
+"""
#
# (C) Pywikibot team, 2024
#
# Distributed under the terms of the MIT license.
#
+from __future__ import annotations
+
from textwrap import fill
+from typing import TYPE_CHECKING, Any
import pywikibot
from pywikibot.comms import http
@@ -12,6 +18,10 @@
from pywikibot.exceptions import NoUsernameError, ServerError
+if TYPE_CHECKING:
+ from pywikibot.site import BaseSite
+
+
class SupersetQuery(WaitingMixin):
"""Superset Query class.
@@ -19,27 +29,21 @@
service.
"""
- def __init__(self, schema_name=None,
- site=None, database_id=None):
- """
- Create superset endpoint with initial defaults.
+ def __init__(self,
+ schema_name: str | None = None,
+ site: BaseSite | None = None,
+ database_id: int | None = None) -> None:
+ """Create superset endpoint with initial defaults.
Either site OR schema_name is required. Site and schema_name are
mutually exclusive. Database id will be retrieved automatically
if needed.
:param site: The mediawiki site to be queried
- :type site: pywikibot.Site, optional
-
- :param schema_name: superset database schema name.
- Example value "enwiki_p"
- :type schema_name: str, optional
-
+ :param schema_name: superset database schema name. Example value
+ "enwiki_p"
:param database_id: superset database id.
- :type database_id: int, optional
-
:raises TypeError: if site and schema_name are both defined'
-
"""
if site and schema_name:
msg = 'Only one of schema_name and site parameters can be defined'
@@ -59,20 +63,16 @@
self.last_response = None
self.superset_url = 'https://superset.wmcloud.org'
- def login(self):
- """
- Login to superset.
+ def login(self) -> bool:
+ """Login to superset.
- Function logins first to meta.wikimedia.org
- and then OAUTH login to superset.wmcloud.org.
- Working login expects that the user has manually
- permitted the username to login to the superset.
+ Function logins first to meta.wikimedia.org and then OAUTH login
+ to superset.wmcloud.org. Working login expects that the user has
+ manually permitted the username to login to the superset.
:raises NoUsernameError: if not not logged in.
:raises ServerError: For other errors
-
:return: True if user has been logged to superset
- :rtype bool
"""
# superset uses meta for OAUTH authentication
loginsite = pywikibot.Site('meta')
@@ -108,16 +108,14 @@
return self.connected
- def get_csrf_token(self):
- """
- Get superset CSRF token.
+ def get_csrf_token(self) -> str:
+ """Get superset CSRF token.
- Method retrieves a CSRF token from the Superset service.
- If the instance is not connected, it attempts to log in first.
+ Method retrieves a CSRF token from the Superset service. If the
+ instance is not connected, it attempts to log in first.
:raises ServerError: For any http errors
:return CSRF token string
- :rtype str
"""
if not self.connected:
self.login()
@@ -132,19 +130,14 @@
status_code = self.last_response.status_code
raise ServerError(f'CSRF token error: {status_code}')
- def get_database_id_by_schema_name(self, schema_name):
- """
- Get superset database_id using superset schema name.
+ def get_database_id_by_schema_name(self, schema_name: str) -> int:
+ """Get superset database_id using superset schema name.
- :param schema_name: superset database schema name.
- Example value "enwiki_p"
- :type schema_name: str
-
+ :param schema_name: superset database schema name. Example value
+ "enwiki_p"
:raises KeyError: If the database ID could found.
:raises ServerError: For any other http errors
-
:return: database id
- :rtype: int
"""
if not self.connected:
self.login()
@@ -169,27 +162,18 @@
raise KeyError(f'Schema "{schema_name}" not found in {url}.')
def merge_query_arguments(self,
- database_id=None,
- schema_name=None,
- site=None):
- """
- Determine and validate the database_id and schema_name.
+ database_id: int | None = None,
+ schema_name: str | None = None,
+ site: BaseSite = None) -> tuple(int, str):
+ """Determine and validate the database_id and schema_name.
:param database_id: The superset database ID.
- :type database_id: int, optional
-
:param schema_name: The superset schema name.
- :type schema_name: str, optional
-
:param site: The target site
- :type site: pywikibot.Site, optional
-
:raises TypeError: if site and schema_name are both defined'
:raises TypeError: If determined database_id is not an integer.
:raises TypeError: If neither site nor schema_name is determined.
-
:return A tuple containing database_id and schema_name.
- :rtype: tuple
"""
if site and schema_name:
msg = 'Only one of schema_name and site parameters can be defined'
@@ -222,21 +206,17 @@
return database_id, schema_name
- def query(self, sql, database_id=None, schema_name=None, site=None):
- """
- Execute SQL queries on Superset.
+ def query(self, sql: str,
+ database_id: int | None = None,
+ schema_name: str | None = None,
+ site: BaseSite = None) -> list[Any]:
+ """Execute SQL queries on Superset.
:param sql: The SQL query to execute.
- :type sql: str
:param database_id: The database ID.
- :type database_id: int, optional
:param schema_name: The schema name.
- :type schema_name: str, optional
-
:raises RuntimeError: If the query execution fails.
-
:return: The data returned from the query execution.
- :rtype: list
"""
if not self.connected:
self.login()
diff --git a/pywikibot/pagegenerators/_generators.py b/pywikibot/pagegenerators/_generators.py
index 9c6c6db..b335fc8 100644
--- a/pywikibot/pagegenerators/_generators.py
+++ b/pywikibot/pagegenerators/_generators.py
@@ -1,6 +1,6 @@
"""Page filter generators provided by the pagegenerators module."""
#
-# (C) Pywikibot team, 2008-2023
+# (C) Pywikibot team, 2008-2024
#
# Distributed under the terms of the MIT license.
#
@@ -981,6 +981,8 @@
FROM page
LIMIT 10
+ .. versionadded:: 9.2
+
:param query: the SQL query string.
:param site: Site for generator results.
:param schema_name: target superset schema name
diff --git a/scripts/CHANGELOG.rst b/scripts/CHANGELOG.rst
index 45d2b18..31ae292 100644
--- a/scripts/CHANGELOG.rst
+++ b/scripts/CHANGELOG.rst
@@ -4,6 +4,11 @@
9.2.0
-----
+addwikis
+^^^^^^^^
+
+* This maintenance script was added to add wikis to the Family.codes set
+
commons_information
^^^^^^^^^^^^^^^^^^^
diff --git a/tests/superset_tests.py b/tests/superset_tests.py
index 171835f..744b430 100755
--- a/tests/superset_tests.py
+++ b/tests/superset_tests.py
@@ -1,5 +1,8 @@
#!/usr/bin/env python3
-"""Tests for superset module."""
+"""Tests for superset module.
+
+.. versionadded:: 9.2
+"""
#
# (C) Pywikibot team, 2024
#
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1048832?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: If46121fb857cc49cc8521947f6fadecccdcb5ee3
Gerrit-Change-Number: 1048832
Gerrit-PatchSet: 3
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: D3r1ck01 <dalangi-ctr(a)wikimedia.org>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1047202?usp=email )
Change subject: include image repository extensions in APISite.file_extensions
......................................................................
include image repository extensions in APISite.file_extensions
the site's image repository may have different file extensions
configured which should also be considered valid for the site
Change-Id: Ibf449cbf41f5e464ebef0bf4e6927e0dac14c49c
---
M pywikibot/site/_apisite.py
1 file changed, 7 insertions(+), 3 deletions(-)
Approvals:
jenkins-bot: Verified
Xqt: Looks good to me, approved
diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index 9a2037c..e1af5e0 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -492,8 +492,13 @@
"""File extensions enabled on the wiki.
.. versionadded:: 8.4
+ .. versionchanged:: 9.2
+ also include extensions from the image repository
"""
- return sorted(e['ext'] for e in self.siteinfo.get('fileextensions'))
+ ext = self.siteinfo.get('fileextensions')
+ if self.has_image_repository:
+ ext.extend(self.image_repository().siteinfo.get('fileextensions'))
+ return sorted({e['ext'] for e in ext})
@property
def maxlimit(self) -> int:
@@ -1273,8 +1278,7 @@
@property
def has_image_repository(self) -> bool:
"""Return True if site has a shared image repository like Commons."""
- code, fam = self.shared_image_repository()
- return bool(code or fam)
+ return self.image_repository() is not None
@property
def has_data_repository(self) -> bool:
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1047202?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ibf449cbf41f5e464ebef0bf4e6927e0dac14c49c
Gerrit-Change-Number: 1047202
Gerrit-PatchSet: 2
Gerrit-Owner: JJMC89 <JJMC89.Wikimedia(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1047079?usp=email )
Change subject: [IMPR] ignore ValueError durig upcast of FilePage due to invalid file extension
......................................................................
[IMPR] ignore ValueError durig upcast of FilePage due to invalid file extension
Also remove retry loop in
TestFilePageDataItem.test_data_item_when_file_exist_but_without_item
of file_tests which doesn't make any sense because the generator was
empty after the exception. Now let the test fail if an exception might
occur but skip the test if no related FilePage was found.
Bug: T367777
Change-Id: Ife4b1a7e648f770df98d6141902a28e0d7cb62f5
---
M pywikibot/pagegenerators/_generators.py
M tests/file_tests.py
2 files changed, 20 insertions(+), 14 deletions(-)
Approvals:
Zache-tool: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/pagegenerators/_generators.py b/pywikibot/pagegenerators/_generators.py
index af59e3d..2e5fcee 100644
--- a/pywikibot/pagegenerators/_generators.py
+++ b/pywikibot/pagegenerators/_generators.py
@@ -155,8 +155,7 @@
namespaces: NamespaceArgType = (0, ),
total: int | None = None
) -> Generator[pywikibot.page.Page, None, None]:
- """
- Iterate Page objects for all new titles in a single namespace.
+ """Iterate Page objects for all new titles in a single namespace.
:param site: Site for generator results.
:param namespace: namespace to retrieve pages from
@@ -185,8 +184,14 @@
.. versionchanged:: 8.2
The YieldType depends on namespace. It can be
- :class:`pywikibot.Page`, :class:`pywikibot.User`,
- :class:`pywikibot.FilePage` or :class:`pywikibot.Category`.
+ :class:`pywikibot.Page<pywikibot.page.Page>`,
+ :class:`pywikibot.User<pywikibot.page.User>`,
+ :class:`pywikibot.FilePage<pywikibot.page.FilePage>` or
+ :class:`pywikibot.Category<pywikibot.page.Category>`.
+ .. versionchanged:: 9.2
+ Ignore :class:`pywikibot.FilePage<pywikibot.page.FilePage>` if it
+ raises a :exc:`ValueError` during upcast e.g. due to an invaild
+ file extension.
:param site: Site for generator results.
"""
@@ -206,7 +211,12 @@
pageclass = pywikibot.Category
else:
pageclass = pywikibot.Page
- yield pageclass(site, rc['title'])
+ try:
+ yield pageclass(site, rc['title'])
+ except ValueError:
+ if pageclass == pywikibot.FilePage:
+ pywikibot.exception()
+ raise
if site is None:
site = pywikibot.Site()
diff --git a/tests/file_tests.py b/tests/file_tests.py
index f55d73c..6650bcc 100755
--- a/tests/file_tests.py
+++ b/tests/file_tests.py
@@ -415,16 +415,12 @@
)
# Seek to first page without mediainfo.
- # Retry loop is for excepting incorrect files
- for retry in range(5):
- try:
- for page in gen:
- slots = page.latest_revision.slots
- if 'mediainfo' not in slots:
- break
+ for page in gen:
+ slots = page.latest_revision.slots
+ if 'mediainfo' not in slots:
break
- except ValueError:
- pass
+ else:
+ self.skipTest('No page found without mediainfo')
item = page.data_item()
self.assertIsInstance(item, pywikibot.MediaInfo)
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1047079?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ife4b1a7e648f770df98d6141902a28e0d7cb62f5
Gerrit-Change-Number: 1047079
Gerrit-PatchSet: 3
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: JJMC89 <JJMC89.Wikimedia(a)gmail.com>
Gerrit-Reviewer: Zache-tool <kimmo.virtanen(a)gmail.com>
Gerrit-Reviewer: jenkins-bot