jenkins-bot has submitted this change and it was merged.
Change subject: [FEAT] api tests: Test APIMWException
......................................................................
[FEAT] api tests: Test APIMWException
The patch adds tests for the APIMWException. To reliably cause such an
exception it patches the http import from the pywikibot.data.api module to its
own class which returns predefined data.
Because there might be some setting up involved before the actual request is
done that should be tested, the tests using a Page instance do a dummy call
before.
Change-Id: I6165a073d74916c9dc42f7667ae18bdd027b1176
---
M tests/api_tests.py
1 file changed, 137 insertions(+), 2 deletions(-)
Approvals:
John Vandenberg: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/api_tests.py b/tests/api_tests.py
index 5cc9aa9..4331e35 100644
--- a/tests/api_tests.py
+++ b/tests/api_tests.py
@@ -10,14 +10,18 @@
__version__ = '$Id$'
import datetime
+import json
import types
+
+from collections import Mapping
import pywikibot.data.api as api
import pywikibot.family
import pywikibot.login
import pywikibot.site
+import pywikibot.page
-from pywikibot.tools import MediaWikiVersion
+from pywikibot.tools import MediaWikiVersion, PY2
from tests.aspects import (
unittest,
@@ -25,7 +29,138 @@
DefaultSiteTestCase,
DefaultDrySiteTestCase,
)
-from tests.utils import allowed_failure, FakeLoginManager
+from tests.utils import allowed_failure, expected_failure_if, FakeLoginManager
+
+if not PY2:
+ from urllib.parse import unquote_to_bytes
+ unicode = str
+else:
+ from urllib import unquote_plus as unquote_to_bytes
+
+
+class PatchedRequest(object):
+
+ """
+ A ContextWrapper allowing Request to handle specific returned data.
+
+ This patches the C{http} import in the L{pywikibot.data.api} module to a
+ class simulating C{request}. It has a C{data} attribute which is either a
+ static value which the requests will return or it's a callable returning the
+ data. If it's a callable it'll be called with the same parameters as the
+ original function in the L{pywikibot.comms.http} module, but with an extra
+ argument C{parameters} which contains the extracted parameters.
+
+ A unicode returned will be forwarded directly and a Mapping will be first
+ converted into a json string. If it is False it'll use the original request
+ and do an actual request. Any other types are not allowed.
+ """
+
+ class FakeHttp(object):
+
+ """A fake http module to have a consistent response from request."""
+
+ def __init__(self, wrapper):
+ self.__wrapper = wrapper
+
+ def request(self, *args, **kwargs):
+ result = self.__wrapper.data
+ if callable(result):
+ result = result(*args, **kwargs)
+ if result is False:
+ return self.__wrapper._old_http.request(*args, **kwargs)
+ elif isinstance(result, unicode):
+ return result
+ elif isinstance(result, Mapping):
+ return json.dumps(result)
+ else:
+ raise ValueError('The result is not a valid type '
+ '"{0}"'.format(type(result)))
+
+ def __init__(self, data=None):
+ """
+ Initialize the context wrapper.
+
+ @param data: The data for the request which may be changed later. It
+ must be either unicode or Mapping before submitting a request.
+ @type data: unicode or Mapping
+ """
+ super(PatchedRequest, self).__init__()
+ self.data = data
+
+ def __enter__(self):
+ """Patch the http module property."""
+ self._old_http = api.http
+ api.http = PatchedRequest.FakeHttp(self)
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ """Reset the http module property."""
+ api.http = self._old_http
+
+
+class TestAPIMWException(DefaultSiteTestCase):
+
+ """Test raising an APIMWException."""
+
+ data = {'error': {'code': 'internal_api_error_fake',
+ 'info': 'Fake error message'}}
+
+ def _dummy_request(self, **kwargs):
+ self.assertIn('body', kwargs)
+ self.assertIn('uri', kwargs)
+ self.assertIn('site', kwargs)
+ if kwargs['body'] is None:
+ # use uri and remove script path
+ parameters = kwargs['uri']
+ prefix = kwargs['site'].scriptpath() + '/api.php?'
+ self.assertEqual(prefix, parameters[:len(prefix)])
+ parameters = parameters[len(prefix):]
+ else:
+ parameters = kwargs['body']
+ parameters = parameters.encode('ascii') # it should be bytes anyway
+ # Extract parameter data from the body, it's ugly but allows us
+ # to verify that we actually test the right request
+ parameters = [p.split(b'=', 1) for p in parameters.split(b'&')]
+ parameters = dict(
+ (param.decode('ascii'), set(unquote_to_bytes(value).decode(kwargs['site'].encoding()).replace('+', ' ').split('|')))
+ for param, value in parameters)
+ if 'fake' not in parameters:
+ return False # do an actual request
+ if self.assert_parameters:
+ for param, value in self.assert_parameters.items():
+ self.assertIn(param, parameters)
+ if value is not None:
+ if isinstance(value, unicode):
+ value = value.split('|')
+ self.assertLessEqual(set(value), parameters[param])
+ return self.data
+
+ def test_API_error(self):
+ """Test a static request."""
+ req = api.Request(site=self.site, parameters={'action': 'query',
+ 'fake': True})
+ with PatchedRequest(self.data):
+ self.assertRaises(api.APIMWException, req.submit)
+
+ def test_API_error_encoding_ASCII(self):
+ """Test a Page instance as parameter using ASCII chars."""
+ page = pywikibot.page.Page(self.site, 'ASCII')
+ req = api.Request(site=self.site, parameters={'action': 'query',
+ 'fake': True,
+ 'titles': page})
+ self.assert_parameters = {'fake': ''}
+ with PatchedRequest(self._dummy_request):
+ self.assertRaises(api.APIMWException, req.submit)
+
+ @expected_failure_if(PY2)
+ def test_API_error_encoding_Unicode(self):
+ """Test a Page instance as parameter using non-ASCII chars."""
+ page = pywikibot.page.Page(self.site, 'Ümlä üt')
+ req = api.Request(site=self.site, parameters={'action': 'query',
+ 'fake': True,
+ 'titles': page})
+ self.assert_parameters = {'fake': ''}
+ with PatchedRequest(self._dummy_request):
+ self.assertRaises(api.APIMWException, req.submit)
class TestApiFunctions(DefaultSiteTestCase):
--
To view, visit https://gerrit.wikimedia.org/r/220002
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I6165a073d74916c9dc42f7667ae18bdd027b1176
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: jenkins-bot <>
jenkins-bot has submitted this change and it was merged.
Change subject: Remove unused Family._addlang
......................................................................
Remove unused Family._addlang
It is a private method that is also unused in compat.
Bug: T89451
Change-Id: I00fae9771963629a60e9d3744442d972492cf054
---
M pywikibot/family.py
1 file changed, 0 insertions(+), 10 deletions(-)
Approvals:
XZise: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/family.py b/pywikibot/family.py
index 6c2e071..a4634fc 100644
--- a/pywikibot/family.py
+++ b/pywikibot/family.py
@@ -943,16 +943,6 @@
return list(pywikibot.Family(self.interwiki_forward).langs.keys())
return list(self.langs.keys())
- def _addlang(self, code, location, namespaces={}):
- """
- Add a new language to the langs and namespaces of the family.
-
- This is supposed to be called in the constructor of the family.
- """
- self.langs[code] = location
-# for num, val in namespaces.items():
-# self.namespaces[num][code] = val
-
def get_known_families(self, site):
return self.known_families
--
To view, visit https://gerrit.wikimedia.org/r/219822
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I00fae9771963629a60e9d3744442d972492cf054
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>
Build Update for wikimedia/pywikibot-core
-------------------------------------
Build: #2423
Status: Passed
Duration: 21 minutes and 51 seconds
Commit: 41da270 (master)
Author: Fabian Neundorf
Message: [IMPROV] LogEntry: page method instead of title
The name of the method title() is misleading as it actually returns a Page
instance. The title() method still redirects to the new page() method but is
deprecated and will be replaced in the future by something that just returns a
string.
Bug: T78125
Change-Id: Ic1abfaba91a6b8e117b29365a882fdcf9203ccf7
View the changeset: https://github.com/wikimedia/pywikibot-core/compare/2dc93bfeac8b...41da2704…
View the full build log and details: https://travis-ci.org/wikimedia/pywikibot-core/builds/67839467
--
You can configure recipients for build notifications in your .travis.yml file. See http://docs.travis-ci.com/user/notifications
jenkins-bot has submitted this change and it was merged.
Change subject: [IMPROV] LogEntry: page method instead of title
......................................................................
[IMPROV] LogEntry: page method instead of title
The name of the method title() is misleading as it actually returns a Page
instance. The title() method still redirects to the new page() method but is
deprecated and will be replaced in the future by something that just returns a
string.
Bug: T78125
Change-Id: Ic1abfaba91a6b8e117b29365a882fdcf9203ccf7
---
M pywikibot/logentries.py
M pywikibot/pagegenerators.py
M scripts/imageuncat.py
M scripts/redirect.py
M tests/logentry_tests.py
M tests/site_tests.py
6 files changed, 39 insertions(+), 12 deletions(-)
Approvals:
John Vandenberg: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/logentries.py b/pywikibot/logentries.py
index bc99909..017f558 100644
--- a/pywikibot/logentries.py
+++ b/pywikibot/logentries.py
@@ -82,16 +82,26 @@
def ns(self):
return self.data['ns']
+ @deprecated('page()')
def title(self):
+ """
+ DEPRECATED: Alias for page().
+
+ This is going to be replaced by just returning the title as a string
+ instead of a Page instance.
+ """
+ return self.page()
+
+ def page(self):
"""
Page on which action was performed.
Note: title may be missing in data dict e.g. by oversight action to
hide the title. In that case a KeyError exception will raise
"""
- if not hasattr(self, '_title'):
- self._title = pywikibot.Page(self.site, self.data['title'])
- return self._title
+ if not hasattr(self, '_page'):
+ self._page = pywikibot.Page(self.site, self.data['title'])
+ return self._page
def type(self):
return self.data['type']
@@ -136,7 +146,7 @@
if self.isAutoblockRemoval:
self._blockid = int(self.data['title'][pos + 1:])
- def title(self):
+ def page(self):
"""
Return the blocked account or IP.
@@ -149,7 +159,7 @@
if self.isAutoblockRemoval:
return self._blockid
else:
- return super(BlockEntry, self).title()
+ return super(BlockEntry, self).page()
def flags(self):
"""
diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py
index d1a714c..3dff94f 100644
--- a/pywikibot/pagegenerators.py
+++ b/pywikibot/pagegenerators.py
@@ -890,7 +890,7 @@
for entry in site.logevents(total=total, logtype=logtype,
user=user, namespace=namespace):
try:
- yield entry.title()
+ yield entry.page()
except KeyError as e:
pywikibot.warning(u'LogeventsPageGenerator: '
u'failed to load page for %r; skipping'
@@ -1668,8 +1668,8 @@
site = pywikibot.Site()
for entry in site.logevents(logtype="upload", step=step, total=total):
# entry is an UploadEntry object
- # entry.title() returns a Page object
- yield entry.title()
+ # entry.page() returns a Page object
+ yield entry.page()
def WikibaseItemGenerator(gen):
diff --git a/scripts/imageuncat.py b/scripts/imageuncat.py
index d543730..85a6d7e 100755
--- a/scripts/imageuncat.py
+++ b/scripts/imageuncat.py
@@ -1261,7 +1261,7 @@
yesterday = today + timedelta(days=-1)
for logentry in site.logevents(logtype='upload', start=yesterday, end=today, reverse=True):
- yield logentry.title()
+ yield logentry.page()
def recentChanges(site=None, delay=0, block=70):
diff --git a/scripts/redirect.py b/scripts/redirect.py
index b8e299c..9792ce1 100755
--- a/scripts/redirect.py
+++ b/scripts/redirect.py
@@ -351,7 +351,7 @@
pywikibot.output('.', newline=False)
for logentry in move_gen:
try:
- moved_page = logentry.title()
+ moved_page = logentry.page()
except KeyError: # hidden page
continue
pywikibot.output('.', newline=False)
diff --git a/tests/logentry_tests.py b/tests/logentry_tests.py
index 20820c9..ea17f2e 100644
--- a/tests/logentry_tests.py
+++ b/tests/logentry_tests.py
@@ -79,7 +79,9 @@
self.assertIsInstance(logentry.pageid(), int)
self.assertIsInstance(logentry.timestamp(), pywikibot.Timestamp)
if 'title' in logentry.data: # title may be missing
- self.assertIsInstance(logentry.title(), pywikibot.Page)
+ self.assertIsInstance(logentry.page(), pywikibot.Page)
+ else:
+ self.assertRaises(KeyError, logentry.page)
self.assertEqual(logentry.type(), logtype)
self.assertIsInstance(logentry.user(), unicode)
self.assertGreaterEqual(logentry.logid(), 0)
@@ -95,6 +97,7 @@
"""Create the new class."""
def test_method(logtype):
def test_logevent(self, key):
+ """Test a single logtype entry."""
self._test_logevent(logtype)
return test_logevent
@@ -192,6 +195,19 @@
self.assertIsInstance(logentry.new_ns(), int)
self.assertEqual(logentry.new_title(), logentry.target_page)
+ def test_LogEntry_title(self, key):
+ """Test title and page return the same instance."""
+ # Request multiple log entries in the hope that one might have no
+ # title entry
+ for logentry in self.site.logevents(total=5):
+ if 'title' in logentry.data: # title may be missing
+ self.assertIsInstance(logentry.title(), pywikibot.Page)
+ self.assertIs(logentry.title(), logentry.page())
+ else:
+ self.assertRaises(KeyError, logentry.title)
+ self.assertDeprecation()
+ self._reset_messages()
+
if __name__ == '__main__':
try:
diff --git a/tests/site_tests.py b/tests/site_tests.py
index 9c62d93..2fbe552 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -899,7 +899,8 @@
for entry in mysite.logevents(logtype=typ, total=3):
self.assertEqual(entry.type(), typ)
for entry in mysite.logevents(page=mainpage, total=3):
- self.assertEqual(entry.title().title(), mainpage.title())
+ self.assertEqual(entry.page().title(), mainpage.title())
+ self.assertEqual(entry.page(), mainpage)
for entry in mysite.logevents(user=mysite.user(), total=3):
self.assertEqual(entry.user(), mysite.user())
for entry in mysite.logevents(start=pywikibot.Timestamp.fromISOformat("2008-09-01T00:00:01Z"), total=5):
--
To view, visit https://gerrit.wikimedia.org/r/218931
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ic1abfaba91a6b8e117b29365a882fdcf9203ccf7
Gerrit-PatchSet: 2
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: Elyashiv <elyashi.horovitz(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: jenkins-bot <>
jenkins-bot has submitted this change and it was merged.
Change subject: [FEAT] tests: Generic reading bot class test case
......................................................................
[FEAT] tests: Generic reading bot class test case
For tests which use a Bot class and also userPut (or similar) this test case
can be used as it monkey patches '_save_page' to prevent actually saving the
page.
Change-Id: Iaec972f813f2470d1f2e51fde8d59b29d929925c
---
M tests/bot_tests.py
M tests/disambredir_tests.py
2 files changed, 90 insertions(+), 24 deletions(-)
Approvals:
John Vandenberg: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/bot_tests.py b/tests/bot_tests.py
index b2a9a7c..4764e79 100644
--- a/tests/bot_tests.py
+++ b/tests/bot_tests.py
@@ -14,7 +14,81 @@
import pywikibot
import pywikibot.bot
-from tests.aspects import unittest, DefaultSiteTestCase, SiteAttributeTestCase
+from tests.aspects import (
+ unittest, DefaultSiteTestCase, SiteAttributeTestCase, TestCase,
+)
+
+
+class FakeSaveBotTestCase(TestCase):
+
+ """
+ An abstract test case which patches the bot class to not actually write.
+
+ It redirects the bot's _save_page to it's own C{bot_save} method. Currently
+ userPut, put_current and user_edit_entity call it. By default it'll call
+ the original method but replace the function called to actually save the
+ page by C{page_save}. It patches the bot class as soon as this class'
+ attribute bot is defined. It also sets the bot's 'always' option to True to
+ avoid user interaction.
+
+ The C{bot_save} method compares the save counter before the call and asserts
+ that it has increased by one after the call. It also stores locally in
+ C{save_called} if C{page_save} has been called. If C{bot_save} or
+ C{page_save} are implemented they should call super's method at some point
+ to make sure these assertions work. At C{tearDown} it checks that the pages
+ are saved often enough. The attribute C{default_assert_saves} defines the
+ number of saves which must happen and compares it to the difference using
+ the save counter. It is possible to define C{assert_saves} after C{setUp} to
+ overwrite the default value for certain tests. By default the number of
+ saves it asserts are 1. Additionally C{save_called} increases by 1 on each
+ call of C{page_save} and should be equal to C{assert_saves}.
+
+ This means if the bot class actually does other writes, like using
+ L{pywikibot.page.Page.save} manually, it'll still write.
+ """
+
+ @property
+ def bot(self):
+ """Get the current bot."""
+ return self._bot
+
+ @bot.setter
+ def bot(self, value):
+ """Set and patch the current bot."""
+ assert value._save_page != self.bot_save, 'bot may not be patched.'
+ self._bot = value
+ self._bot.options['always'] = True
+ self._original = self._bot._save_page
+ self._bot._save_page = self.bot_save
+ self._old_counter = self._bot._save_counter
+
+ def setUp(self):
+ """Set up test by reseting the counters."""
+ super(FakeSaveBotTestCase, self).setUp()
+ self.assert_saves = getattr(self, 'default_assert_saves', 1)
+ self.save_called = 0
+
+ def tearDown(self):
+ """Tear down by asserting the counters."""
+ self.assertEqual(self._bot._save_counter,
+ self._old_counter + self.assert_saves)
+ self.assertEqual(self.save_called, self.assert_saves)
+ super(FakeSaveBotTestCase, self).tearDown()
+
+ def bot_save(self, page, func, *args, **kwargs):
+ """Handle when bot's userPut was called."""
+ self.assertGreaterEqual(self._bot._save_counter, 0)
+ old_counter = self._bot._save_counter
+ old_local_cnt = self.save_called
+ result = self._original(page, self.page_save, *args, **kwargs)
+ self.assertEqual(self._bot._save_counter, old_counter + 1)
+ self.assertEqual(self.save_called, old_local_cnt + 1)
+ self.assertGreater(self._bot._save_counter, self._old_counter)
+ return result
+
+ def page_save(self, *args, **kwargs):
+ """Handle when bot calls the page's save method."""
+ self.save_called += 1
class TestBotTreatExit(object):
diff --git a/tests/disambredir_tests.py b/tests/disambredir_tests.py
index 5b34e47..5e260c7 100644
--- a/tests/disambredir_tests.py
+++ b/tests/disambredir_tests.py
@@ -18,11 +18,12 @@
from scripts import disambredir
-from tests.aspects import unittest, TestCase
+from tests.aspects import unittest
+from tests.bot_tests import FakeSaveBotTestCase
from tests.utils import fixed_generator
-class TestDisambigurationRedirectBot(TestCase):
+class TestDisambigurationRedirectBot(FakeSaveBotTestCase):
"""
Test cases for DisambigurationRedirectBot.
@@ -62,70 +63,61 @@
def setUpClass(cls):
"""Initialize page variable."""
super(TestDisambigurationRedirectBot, cls).setUpClass()
+ # Patch the page to be independent of the actual site
cls.page = pywikibot.Page(cls.site, 'User:BobBot/Test disambig')
+ cls.page.linkedPages = fixed_generator(
+ [pywikibot.Page(cls.site, 'User:BobBot/Redir'),
+ pywikibot.Page(cls.site, 'Main Page')])
+
+ def bot_save(self, page, *args, **kwargs):
+ """Check if the page matches."""
+ self.assertIs(page, self.page)
+ return super(TestDisambigurationRedirectBot, self).bot_save(
+ page, *args, **kwargs)
def setUp(self):
"""Set up the test page."""
- def _save_page(*args, **kwargs):
- self.assertIs(args[0], self.page)
- self.save_called = True
- return # avert actually saving
-
super(TestDisambigurationRedirectBot, self).setUp()
self.page.text = ('[[User:BobBot/Redir#Foo|Bar]]\n'
'[[User:BobBot/Redir|Baz]]\n'
'[[Main Page|Label]]\n')
self.bot = disambredir.DisambiguationRedirectBot(generator=[self.page])
- self.bot.options['always'] = True
- # Patch the page and bot to not actually save anything
- self.page.linkedPages = fixed_generator(
- [pywikibot.Page(self.site, 'User:BobBot/Redir'),
- pywikibot.Page(self.site, 'Main Page')])
- self.save_called = False
- self.bot._save_page = _save_page
def test_unchanged(self):
"""Test no change."""
+ # No changes needed, won't call the save method
+ self.assert_saves = 0
self._patch_create_callback('n')
- self.assertFalse(self.save_called)
self.bot.run()
self.assertEqual(self.page.text,
'[[User:BobBot/Redir#Foo|Bar]]\n'
'[[User:BobBot/Redir|Baz]]\n'
'[[Main Page|Label]]\n')
- # No changes needed, won't call the save method
- self.assertFalse(self.save_called)
def test_unlink(self):
"""Test unlinking."""
self._patch_create_callback('u')
- self.assertFalse(self.save_called)
self.bot.run()
self.assertEqual(self.page.text,
'Bar\nBaz\n[[Main Page|Label]]\n')
- self.assertTrue(self.save_called)
def test_replace_target(self):
"""Test replacing just target page."""
self._patch_create_callback('t')
- self.assertFalse(self.save_called)
self.bot.run()
self.assertEqual(self.page.text,
'[[Main Page#Foo|Bar]]\n'
'[[Main Page|Baz]]\n'
'[[Main Page|Label]]\n')
- self.assertTrue(self.save_called)
def test_replace_all(self):
"""Test replacing target and label."""
self._patch_create_callback('l')
- self.assertFalse(self.save_called)
self.bot.run()
self.assertEqual(self.page.text,
'[[Main Page#Foo|Main Page]]\n'
'[[Main Page]]\n'
'[[Main Page|Label]]\n')
- self.assertTrue(self.save_called)
if __name__ == '__main__':
--
To view, visit https://gerrit.wikimedia.org/r/218002
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Iaec972f813f2470d1f2e51fde8d59b29d929925c
Gerrit-PatchSet: 3
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>