jenkins-bot has submitted this change and it was merged.
Change subject: proofreadpage.py: decorator to check/load cached data ......................................................................
proofreadpage.py: decorator to check/load cached data
Decorate `IndexPage` methods to avoid code repetition when checking if data are already cached.
Change-Id: I52a928e507146de5510df1b9da5b09ec3150c9e0 --- M pywikibot/proofreadpage.py M tests/proofreadpage_tests.py 2 files changed, 43 insertions(+), 17 deletions(-)
Approvals: XZise: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/proofreadpage.py b/pywikibot/proofreadpage.py index edc0060..383cb0f 100644 --- a/pywikibot/proofreadpage.py +++ b/pywikibot/proofreadpage.py @@ -366,16 +366,28 @@ self._all_page_links = set( self.site.pagelinks(self, namespaces=self.site.proofread_page_ns))
- # Cache results. + self._cached = False + + def check_if_cached(fn): + """Decorator to check if data are cached and cache them if needed.""" + def wrapper(self, *args, **kwargs): + if self._cached is False: + self._get_page_mappings() + return fn(self, *args, **kwargs) + return wrapper + + def _get_page_mappings(self): + """Associate label and number for each page linked to the index.""" + # Clean cache, if any. self._page_from_numbers = {} self._numbers_from_page = {} self._page_numbers_from_label = {} self._pages_from_label = {} self._labels_from_page_number = {} self._labels_from_page = {} + if hasattr(self, '_parsed_text'): + del self._parsed_text
- def _get_page_mappings(self): - """Associate label and number for each page linked to the index.""" self._parsed_text = self._get_parsed_page() self._soup = BeautifulSoup(self._parsed_text, 'html.parser') attrs = {'class': re.compile('prp-pagequality')} @@ -423,17 +435,20 @@ # Sanity check: all links to Page: ns must have been considered. assert set(self._labels_from_page) == set(self._all_page_links)
+ # Info cached. + self._cached = True + @property + @check_if_cached def num_pages(self): """Return total number of pages in Index.
@return: total number of pages in Index @rtype: int """ - if not self._page_from_numbers: - self._get_page_mappings() return len(self._page_from_numbers)
+ @check_if_cached def get_label_from_page(self, page): """Return 'page label' for page.
@@ -443,14 +458,12 @@ @return: page label @rtype: unicode string """ - if not self._labels_from_page: - self._get_page_mappings() - try: return self._labels_from_page[page] except KeyError: raise KeyError('Invalid Page: %s.' % page)
+ @check_if_cached def get_label_from_page_number(self, page_number): """Return page label from page number.
@@ -460,9 +473,6 @@ @return: page label @rtype: unicode string """ - if not self._labels_from_page_number: - self._get_page_mappings() - try: return self._labels_from_page_number[page_number] except KeyError: @@ -472,9 +482,6 @@ def _get_from_label(self, mapping_dict, label): """Helper function to get info from label.""" # Convert label to string if an integer is passed. - if not mapping_dict: - self._get_page_mappings() - if isinstance(label, int): label = str(label)
@@ -483,6 +490,7 @@ except KeyError: raise KeyError('No page has label: "%s".' % label)
+ @check_if_cached def get_page_number_from_label(self, label='1'): """Return page number from page label.
@@ -493,6 +501,7 @@ """ return self._get_from_label(self._page_numbers_from_label, label)
+ @check_if_cached def get_page_from_label(self, label='1'): """Return page number from page label.
@@ -503,6 +512,7 @@ """ return self._get_from_label(self._pages_from_label, label)
+ @check_if_cached def get_page_from_number(self, page_number): """Return a page object from page number.
@@ -510,9 +520,6 @@ @return: page @rtype: page object """ - if not self._page_from_numbers: - self._get_page_mappings() - try: return self._page_from_numbers[page_number] except KeyError: diff --git a/tests/proofreadpage_tests.py b/tests/proofreadpage_tests.py index 45ad5fc..ee38dd1 100644 --- a/tests/proofreadpage_tests.py +++ b/tests/proofreadpage_tests.py @@ -366,6 +366,25 @@ for i in page_numbers) site_def['get_page'].append([label, page_set])
+ def test_check_if_cached(self, key): + """Test if cache is checked and loaded properly.""" + data = self.sites[key] + index_page = IndexPage(self.site, self.sites[key]['index']) + + num, title_num, label = data['get_label'] + self.assertIs(index_page._cached, False) + fetched_label = index_page.get_label_from_page_number(num) + + self.assertIs(index_page._cached, True) + self.assertEqual(label, fetched_label) + + # Check if cache is refreshed. + index_page._labels_from_page_number[num] = 'wrong cached value' + self.assertEqual(index_page.get_label_from_page_number(num), + 'wrong cached value') + index_page._cached = False + self.assertEqual(index_page.get_label_from_page_number(num), label) + def test_num_pages(self, key): """Test num_pages property.""" index_page = IndexPage(self.site, self.sites[key]['index'])
pywikibot-commits@lists.wikimedia.org