Skip to content

Commit

Permalink
Merge pull request #57 from openzim/api-login
Browse files Browse the repository at this point in the history
Refactor api module and retry login if Unathenticated error is thrown
  • Loading branch information
audiodude committed Aug 17, 2019
2 parents 42f10a9 + d8a387a commit 10bdcc6
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 15 deletions.
38 changes: 31 additions & 7 deletions wp1/api.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,35 @@
import logging

import mwclient

logger = logging.getLogger(__name__)
_ua = 'WP1.0Bot/3.0. Run by User:Audiodude. Using mwclient/0.9.1'

try:
from wp1.credentials import API_CREDS
site = mwclient.Site('en.wikipedia.org',
clients_useragent=_ua)
site.login(API_CREDS['user'], API_CREDS['pass'])
except ImportError:
site = None
site = mwclient.Site('en.wikipedia.org', clients_useragent=_ua)
def login():
try:
from wp1.credentials import API_CREDS
site.login(API_CREDS['user'], API_CREDS['pass'])
except mwclient.errors.LoginError as e:
logger.exception(e[1]['result'])
except ImportError:
# No credentials, probably in development environment.
pass


# Global login on startup.
login()


def save_page(page, wikicode, msg):
if not site:
logger.error('Could not save page %s because api site is not defined', page)
return False

try:
page.save(wikicode, msg)
except mwclient.errors.AssertUserFailedError as e:
logger.warn('Got login exception, retrying login')
login()
page.save(wikicode, msg)
return True
29 changes: 29 additions & 0 deletions wp1/api_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import unittest
from unittest.mock import MagicMock, patch

import mwclient

from wp1 import api

class ApiTest(unittest.TestCase):
def setUp(self):
self.page = MagicMock()

def test_save_page(self):
api.save_page(self.page, '<code>', 'edit summary')
self.assertEqual(1, len(self.page.save.call_args_list))
self.assertEqual(('<code>', 'edit summary'), self.page.save.call_args[0])

@patch('wp1.api.login')
def test_save_page_tries_login_on_exception(self, patched_login):
api.site = MagicMock()
self.page.save.side_effect = mwclient.errors.AssertUserFailedError()
with self.assertRaises(mwclient.errors.AssertUserFailedError):
actual = api.save_page(self.page, '<code>', 'edit summary')
self.assertTrue(actual)
self.assertEqual(1, len(patched_login.call_args_list))

def test_save_page_skips_login_on_none_site(self):
api.site = None
actual = api.save_page(self.page, '<code>', 'edit summary')
self.assertFalse(actual)
12 changes: 6 additions & 6 deletions wp1/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from jinja2 import Environment, PackageLoader, select_autoescape

from wp1.api import site
from wp1 import api
from wp1.conf import get_conf
from wp1.constants import LIST_URL
from wp1.models.wp10.category import Category
Expand Down Expand Up @@ -271,12 +271,12 @@ def upload_project_table(project_name):
project_name.decode('utf-8'))
table_data = generate_project_table_data(wp10db, project_name)
wikicode = create_wikicode(table_data)
page_name = ('User:WP 1.0 bot/Tables/Project/%s' %
page_name = ('User:Audiodude/Tables/Project/%s' %
project_name.decode('utf-8'))
page = site.pages[page_name]
page = api.site.pages[page_name]
logger.info('Uploading wikicode to Wikipedia: %s',
project_name.decode('utf-8'))
page.save(wikicode, 'Copying assessment table to wiki.')
api.save_page(page, wikicode, 'Copying assessment table to wiki.')
finally:
if wp10db is not None:
wp10db.close()
Expand All @@ -292,8 +292,8 @@ def upload_global_table():
wikicode = create_wikicode(table_data)
page_name = 'User:WP 1.0 bot/Tables/OverallArticles'
logger.info('Uploading wikicode to Wikipedia: global table')
page = site.pages[page_name]
page.save(wikicode, 'Copying assessment table to wiki.')
page = api.site.pages[page_name]
api.save_page(wikicode, 'Copying assessment table to wiki.')
finally:
if wp10db is not None:
wp10db.close()
Expand Down
4 changes: 2 additions & 2 deletions wp1/tables_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ def test_generate_global_table_data(self):
self.assertEqual(
'All rated articles by quality and importance', actual['title'])

@patch('wp1.tables.site')
@patch('wp1.tables.api')
@patch('wp1.tables.wp10_connect')
def test_upload_project_table(self, patched_connect, patched_site):
try:
Expand All @@ -587,7 +587,7 @@ def test_upload_project_table(self, patched_connect, patched_site):
finally:
self.wp10db.close = orig_close

@patch('wp1.tables.site')
@patch('wp1.tables.api')
@patch('wp1.tables.wp10_connect')
def test_upload_global_table(self, patched_connect, patched_site):
try:
Expand Down

0 comments on commit 10bdcc6

Please sign in to comment.