jenkins-bot has submitted this change and it was merged.
Change subject: imageuncat: Deprecate -yesterday for -logevents
......................................................................
imageuncat: Deprecate -yesterday for -logevents
The cli argument -logevents uses LogeventsPageGenerator to find
pages based on logevent. This can be used for imageuncat instead
of the -yesterday cli arg. But it doesn't filter based on
timestamp.
This commit adds the start and end timestamps to -logevents and
the same args to LogeventsPageGenerator. Hence, this now deprecates
the older -yesterday cli arg in imageuncat.
Bug: T67192
Change-Id: I5cd14609a43bd7b7343f234c0832cc471ae0250b
---
M pywikibot/pagegenerators.py
M scripts/imageuncat.py
M tests/pagegenerators_tests.py
3 files changed, 98 insertions(+), 11 deletions(-)
Approvals:
John Vandenberg: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py
index 2f80a3b..2668ddd 100644
--- a/pywikibot/pagegenerators.py
+++ b/pywikibot/pagegenerators.py
@@ -103,7 +103,11 @@
across all namespaces.
-logevents Work on articles that were on a specified Special:Log.
- The value may be a comma separated list of three values:
+ The value may be a comma separated list of these values:
+
+ logevent,username,start,end
+
+ or for backward compatibility:
logevent,username,total
@@ -123,6 +127,12 @@
-logevents:delete,,20 gives 20 pages from deletion log
-logevents:protect,Usr gives pages from protect by user Usr
-logevents:patrol,Usr,20 gives 20 patroled pages by user Usr
+ -logevents:upload,,20121231,20100101 gives upload pages
+ in the 2010s, 2011s, and 2012s
+ -logevents:review,,20121231 gives review pages since the
+ beginning till the 31 Dec 2012
+ -logevents:review,Usr,20121231 gives review pages by user
+ Usr since the beginning till the 31 Dec 2012
In some cases it must be written as
-logevents:"patrol,Usr,20"
@@ -528,7 +538,7 @@
recurse=recurse,
content=content)
- def _parse_log_events(self, logtype, user=None, total=None):
+ def _parse_log_events(self, logtype, user=None, start=None, end=None):
"""
Parse the -logevent argument information.
@@ -537,25 +547,47 @@
@param user: A username associated to the log events. Ignored if
empty string or None.
@type user: str
- @param total: The total amount of pages returned.
- @type total: str (castable to int) or int (positive)
+ @param start: Timestamp to start listing from. For backward
+ compatibility, this can also be the total amount of pages
+ that should be returned. It is taken as 'total' if the value does
+ not have 8 digits.
+ @type start: str convertable to Timestamp in the format YYYYMMDD. If
+ the length is not 8: for backward compatibility to use this as
+ 'total', it can also be a str (castable to int) or int (positive).
+ @param end: Timestamp to end listing at
+ @type end: str convertable to Timestamp in the format YYYYMMDD
@return: The generator or None if invalid 'total' value.
@rtype: LogeventsPageGenerator
"""
# TODO: Check if logtype is one of the allowed log types
# TODO: -*log used 500 as default total, also use with -logevents?
- if total is not None:
+
+ # 'start or None', because start might be an empty string
+ start = start or None
+ if isinstance(start, basestring) and len(start) == 8:
+ total = None
+ start = pywikibot.Timestamp.strptime(start, '%Y%m%d')
+ elif start is not None:
try:
- total = int(total)
+ total = int(start)
if total <= 0:
raise ValueError
except ValueError:
pywikibot.error(u'Total number of log ({0}) events must be a '
'positive int.'.format(total))
return None
+ start = None
+
+ if end is not None:
+ if start is None:
+ pywikibot.error('End cannot be given if start is not given.')
+ return None
+ end = pywikibot.Timestamp.strptime(end, '%Y%m%d')
+
# 'user or None', because user might be an empty string when
# 'foo,,bar' was used.
- return LogeventsPageGenerator(logtype, user or None, total=total)
+ return LogeventsPageGenerator(logtype, user or None, total=total,
+ start=start, end=end)
def handleArg(self, arg):
"""Parse one argument at a time.
@@ -919,8 +951,8 @@
@deprecated_args(number="total", mode="logtype", repeat=None)
-def LogeventsPageGenerator(logtype=None, user=None, site=None,
- namespace=0, total=None):
+def LogeventsPageGenerator(logtype=None, user=None, site=None, namespace=0,
+ total=None, start=None, end=None, reverse=False):
"""
Generate Pages for specified modes of logevents.
@@ -934,11 +966,18 @@
@type namespace: int
@param total: Maximum number of pages to retrieve in total
@type total: int
+ @param start: Timestamp to start listing from
+ @type start: pywikibot.Timestamp
+ @param end: Timestamp to end listing at
+ @type end: pywikibot.Timestamp
+ @param reverse: if True, start with oldest changes (default: newest)
+ @type reverse: bool
"""
if site is None:
site = pywikibot.Site()
- for entry in site.logevents(total=total, logtype=logtype,
- user=user, namespace=namespace):
+ for entry in site.logevents(total=total, logtype=logtype, user=user,
+ namespace=namespace, start=start, end=end,
+ reverse=False):
try:
yield entry.page()
except KeyError as e:
diff --git a/scripts/imageuncat.py b/scripts/imageuncat.py
index 7efd746..b63f4f6 100755
--- a/scripts/imageuncat.py
+++ b/scripts/imageuncat.py
@@ -30,7 +30,9 @@
from datetime import timedelta
import pywikibot
+from pywikibot.exceptions import ArgumentDeprecationWarning
from pywikibot import pagegenerators
+from pywikibot.tools import issue_deprecation_warning
docuReplacements = {
'¶ms;': pagegenerators.parameterHelp,
@@ -1371,6 +1373,10 @@
for arg in local_args:
if arg.startswith('-yesterday'):
generator = uploadedYesterday(site)
+ issue_deprecation_warning(
+ 'The usage of "-yesterday"',
+ '-logevents:"upload,,YYYYMMDD,YYYYMMDD"',
+ 2, ArgumentDeprecationWarning)
elif arg.startswith('-recentchanges'):
generator = recentChanges(site=site, delay=120)
else:
diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py
index 91519c2..6c70194 100755
--- a/tests/pagegenerators_tests.py
+++ b/tests/pagegenerators_tests.py
@@ -892,6 +892,15 @@
"""Test GeneratorFactory with
pagegenerators.LogeventsPageGenerator."""
+ @classmethod
+ def setUpClass(cls):
+ """Setup test class."""
+ super(TestLogeventsFactoryGenerator, cls).setUpClass()
+ site = pywikibot.Site()
+ newuser_logevents = list(site.logevents(logtype='newusers', total=1))
+ if len(newuser_logevents) == 0:
+ raise unittest.SkipTest('No newuser logs found to test with.')
+
user = True
@unittest.expectedFailure
@@ -954,6 +963,39 @@
self.assertLessEqual(len(pages), 10)
self.assertTrue(all(isinstance(item, pywikibot.Page) for item in pages))
+ def test_logevents_with_start_timestamp(self):
+ """Test -logevents which uses timestamp for
start."""
+ gf = pagegenerators.GeneratorFactory(site=self.site)
+ # We limit the results to 1 as running this on large websites like
+ # Wikipedia will give an insane number of results as it asks for all
+ # logevents since beginning till now.
+ self.assertTrue(gf.handleArg('-limit:1'))
+ self.assertTrue(gf.handleArg('-logevents:newusers,,21000101'))
+ gen = gf.getCombinedGenerator()
+ self.assertIsNotNone(gen)
+ pages = set(gen)
+ self.assertGreater(len(pages), 0)
+ self.assertTrue(all(isinstance(item, pywikibot.Page) for item in pages))
+
+ def test_logevents_with_start_and_end_timestamp(self):
+ """Test -logevents which uses timestamps for start and
end."""
+ gf = pagegenerators.GeneratorFactory(site=self.site)
+ self.assertTrue(gf.handleArg('-logevents:newusers,,21000101,20990101'))
+ gen = gf.getCombinedGenerator()
+ self.assertIsNotNone(gen)
+ pages = set(gen)
+ self.assertEqual(len(pages), 0)
+
+ def test_logevents_with_total(self):
+ """Test -logevents which uses total."""
+ gf = pagegenerators.GeneratorFactory(site=self.site)
+ self.assertTrue(gf.handleArg('-logevents:newusers,,1'))
+ gen = gf.getCombinedGenerator()
+ self.assertIsNotNone(gen)
+ pages = set(gen)
+ self.assertEqual(len(pages), 1)
+ self.assertTrue(all(isinstance(item, pywikibot.Page) for item in pages))
+
class PageGeneratorIntersectTestCase(GeneratorIntersectTestCase,
RecentChangesTestCase):
--
To view, visit
https://gerrit.wikimedia.org/r/275204
To unsubscribe, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I5cd14609a43bd7b7343f234c0832cc471ae0250b
Gerrit-PatchSet: 9
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: AbdealiJK <abdealikothari(a)gmail.com>
Gerrit-Reviewer: AbdealiJK <abdealikothari(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot <>