-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Am 2014-08-19 11:13, schrieb Raphael Hertzog:
> Hello Simon,
>
> On Mon, 18 Aug 2014, Simon Kainz wrote:
>> this adds support for data from duck.debian.net.
>
> Thanks for the patch! Here are a few things to fix:
>
> First you should respect PEP8 for the coding style, notably: - use
> only spaces to indent, not tabs - spaces around assignation
> operatior
>
> You can use "pep8" to check your code (distro-tracker is not fully
> PEP8 compliant yet, but we try to pay attention for new code).
ok, i did and fixed the areas where it complains about code written by me
>
>>> From a0a3810608a306ab77eee214a9be0854e39e3367 Mon Sep 17
>>> 00:00:00 2001
>> From: Simon Kainz <simon@familiekainz.at> Date: Mon, 18 Aug 2014
>> 10:42:28 +0200 Subject: [PATCH 1/2] add new template for duck
>> extra info.
>
> There's no point in adding the template in a separate commit.
> Please squash both commits together.
ok, done, see the attachment.
>
>> --- /dev/null +++
>> b/distro_tracker/vendor/debian/templates/debian/duck-action-item.html
>>
>>
@@ -0,0 +1,8 @@
>> +{% with duck = item.extra_data.duck_link %} +{% with issues =
>> item.extra_data.issues_link %} +<a href="{{ duck }}">DUCK</a>
>> reports some <a href="{{ issues }}">issues</a> concerning
>> upstream URLs defined for this package. +{% endwith %} +{%
>> endwith %}
>
> The "with" tag doesn't bring anything as you use each variable only
> once. Please inline the duck and issues variables.
fixed.
>
>> From 11e3918f8f9b99b96e0d77c11ddf686dc36d20f1 Mon Sep 17 00:00:00
>> 2001 From: Simon Kainz <simon@familiekainz.at> Date: Mon, 18 Aug
>> 2014 10:43:14 +0200 Subject: [PATCH 2/2] add data from
>> duck.debian.net into
>>
>
>> +class UpdateDebianDuckTask(BaseTask): + """ + A task for
>> updating upstream url issue information on all packages. +
>> """ + + DUCK_LINK = 'http://duck.debian.net' + # URL of the
>> list of source packages with issues. + DUCK_SP_LIST_URL =
>> 'http://duck.debian.net/static/sourcepackages.txt' + +
>
> Single empty line here.
fixed.
>
>> + ACTION_ITEM_TYPE_NAME = 'debian-duck' +
>> ACTION_ITEM_TEMPLATE = 'debian/duck-action-item.html' +
>> ITEM_DESCRIPTION = 'The URL(s) for this package had some recent
>> persistent <a href="{issues_link}">issues</a>' + + def
>> __init__(self, force_update=False, *args, **kwargs): +
>> super(UpdateDebianDuckTask, self).__init__(*args, **kwargs) +
>> self.force_update = force_update + self.action_item_type =
>> ActionItemType.objects.create_or_update( +
>> type_name=self.ACTION_ITEM_TYPE_NAME, +
>> full_description_template = self.ACTION_ITEM_TEMPLATE)
>
> Please do not use "tabs" but real spaces with 4-space
done.
>
>
>> + def _get_duck_urls_content(self): + """ + Gets the list of
>> packages with URL issues from + duck.debian.net + + :returns: A
>> array if source package names. + """ + + ducklist =
>> get_resource_content(self.DUCK_SP_LIST_URL) + + packages = [] +
>> for package_name in ducklist.splitlines(): +
>> package_name = package_name.strip() +
>> packages.append(package_name) + return packages
>
> Eek, the mix of spaces and tabs gives a really bad output here
> when quoted...
also fixed.
>
> Also get_resource_content will return None when the content of the
> URL hasn't changed since last time, you should deal with that
> case.
>
>> + +
>
> A single empty line here.
>
>> + def update_action_item(self,package):
>
> Space after the comma.
fixed.
>
>> + action_item =
>> package.get_action_item_for_type(self.action_item_type) + if not
>> action_item: + action_item = ActionItem( + package =
>> package, + item_type = self.action_item_type, + ) + +
>> issues_link = self.DUCK_LINK + "/static/sp/" + package.name[0] +
>> "/" + package.name + ".html"
>
> Are you really using a directory split based on the first character
> only? I ask because the debian pool has a special case for "lib*"
> packages where it uses the four first letters and many services
> have been mimicking this choice.
ok, fixed, i now use the lib* approach.
>
>> + action_item.short_description=
>> self.ITEM_DESCRIPTION.format(issues_link = issues_link)
>
> one space around the first "=" (in the assignation) but no spaces
> around the second one (named parameter).
>
>> + action_item.save() + + def execute(self): + ducklings=
>> self._get_duck_urls_content()
>
> One space around the equal.
fixed.
>
>> + if ducklings is None: + return
>
> Your current version of _get_duck_urls_content() will never return
> None but this is something to fix (cf another comment above).
>
fixed (at least to my understanding).
>> + ActionItem.objects.delete_obsolete_items( +
>> item_types=[self.action_item_type], +
>> non_obsolete_packages=ducklings) + + packages =
>> SourcePackageName.objects.filter(name__in=ducklings) + + for
>> package in packages: + self.update_action_item(package) +
>> class UpdateWnppStatsTask(BaseTask):
>
> Please put two empty lines between two class definitions.
done.
>
> It would also be nicer if you could include unit tests for your
> code. It should relatively easy to adapt from other similar tasks
> in distro_tracker/vendor/debian/tests.py (UpdateDebciStatusTask for
> example).
>
I added 3 testcases for duck to distro_tracker/vendor/debian/tests.py
which behave as expected.
> Cheers,
>
Sorry for the noise in the first place. My python-foo is rather
non-existent, but will get better.
So please take another look at my attached patch.
Bye & thanks for your help.
Simon
- --
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
iQIcBAEBCgAGBQJT9KJgAAoJEBy08PeN7K/pfLIP/3Zg92bTFvBUIn84slPtcxAo
uiCamgSOQKAuOXPPOcwEPyvhCH2P3NvD35m0O58l9oXm6bdSN/u8Yi/3PC7fuQ1K
f223IuPdezCol6VRoUHrLfiSWRBk3I/Nt3m8QQkQMQzNAbYTXHFrsidRbGfFna9R
d3u5t/RM84Q+onI4O70RHFivRslmRS2AfEXgf1zflmajP6jfyeq8+ST9n+wAiUwz
6iuV6PSGOqsr8hFqiMjtVEJ7/T887cCol9pJBCmD9uaH30I2Dzi4UzjhFfoWzOsW
R27w1Spoy3Vb/IvJxJCcsGNxryIZ1lvX5x6iRODqrC8478FJDGiDBo0pJJ9Uw50I
L+zoJWCwB47rb2Xij2YvSUwWTIpVNnnmwuJVHNj1gMUV2zcOVF6yCnksPvVgNBZF
1SCRno//mq/oZzbihzct7fTtZPhWheYSqd/x36Q19qI60s5yk2IVOHjksn8ADwjn
Rls71N9E2cspaKLpWELu/JMI1uk9CJf3XqyGDMW0RmYcYwNsHF3ZyanBsmEVMUYQ
kznE0aQBM539H/Kl4kd0lwOm4c2VuAiOgeyeYct0uRchjI1AAGx0Mm0sxIFpfKm2
xQgAgAjvep5mgGXsxeW6Uy9mWM91TAUszwuIQY0I44fDhd4Z5Cif2g5LHygEn4Cq
PFTa9EpTdV22gZmrVZgD
=JVLm
-----END PGP SIGNATURE-----
>From 0ce427d42900d99c4a148296545bff625d99e3fc Mon Sep 17 00:00:00 2001
From: Simon Kainz <simon@familiekainz.at>
Date: Wed, 20 Aug 2014 15:14:56 +0200
Subject: [PATCH] add support for data from duck.debian.net
---
.../debian/templates/debian/duck-action-item.html | 4 ++
distro_tracker/vendor/debian/tests.py | 57 +++++++++++++++
distro_tracker/vendor/debian/tracker_tasks.py | 81 ++++++++++++++++++++++
3 files changed, 142 insertions(+)
create mode 100644 distro_tracker/vendor/debian/templates/debian/duck-action-item.html
diff --git a/distro_tracker/vendor/debian/templates/debian/duck-action-item.html b/distro_tracker/vendor/debian/templates/debian/duck-action-item.html
new file mode 100644
index 0000000..ecb4b56
--- /dev/null
+++ b/distro_tracker/vendor/debian/templates/debian/duck-action-item.html
@@ -0,0 +1,4 @@
+<a href="{{ item.extra_data.duck_link }}">DUCK</a> reports some <a href="{{ item.extra_data.issues_link }}">issues</a> concerning upstream URLs defined for this package.
+
+
+
diff --git a/distro_tracker/vendor/debian/tests.py b/distro_tracker/vendor/debian/tests.py
index 3bd5a5d..2e657e2 100644
--- a/distro_tracker/vendor/debian/tests.py
+++ b/distro_tracker/vendor/debian/tests.py
@@ -60,6 +60,7 @@ from distro_tracker.vendor.debian.tracker_tasks import RetrieveLowThresholdNmuTa
from distro_tracker.vendor.debian.tracker_tasks import DebianWatchFileScannerUpdate
from distro_tracker.vendor.debian.tracker_tasks import UpdateExcusesTask
from distro_tracker.vendor.debian.tracker_tasks import UpdateDebciStatusTask
+from distro_tracker.vendor.debian.tracker_tasks import UpdateDebianDuckTask
from distro_tracker.vendor.debian.models import DebianContributor
from distro_tracker.vendor.debian.models import UbuntuPackage
from distro_tracker.vendor.debian.tracker_tasks import UpdateLintianStatsTask
@@ -4500,6 +4501,62 @@ class DebianSsoLoginTests(TestCase):
@mock.patch('distro_tracker.core.utils.http.requests')
+class UpdateDebianDuckTaskTest(TestCase):
+ """
+ Tests for the :class:`distro_tracker.vendor.debian.tracker_tasks.UpdateDebianDuckTask` task.
+ """
+ def setUp(self):
+ self.dummy_package = SourcePackageName.objects.create(name='dummy-package')
+ self.other_package = SourcePackageName.objects.create(name='other-package')
+ self.duck_data = """
+ dummy-package
+ dummy-package2
+ """
+
+ def run_task(self):
+ """
+ Runs the Duck status update task.
+ """
+ task = UpdateDebianDuckTask()
+ task.execute()
+
+ def test_action_item_when_in_list(self, mock_requests):
+ """
+ Tests that an ActionItem is created for a package reported by duck.
+ """
+ set_mock_response(mock_requests, text=self.duck_data)
+
+ self.run_task()
+ self.assertEqual(1, self.dummy_package.action_items.count())
+
+ def test_no_action_item_when_not_in_list(self, mock_requests):
+ """
+ Tests that no ActionItem is created for a package not reported by duck.
+ """
+ set_mock_response(mock_requests, text=self.duck_data)
+
+ self.run_task()
+ self.assertEqual(0, self.other_package.action_items.count())
+
+ def test_action_item_is_dropped_when_duck_reports_nothing_again(self, mock_requests):
+ """
+ Tests that ActionItems are dropped when a package was previousy reported
+ but is now not reported anymore.
+ """
+ set_mock_response(mock_requests, text=self.duck_data)
+ self.run_task()
+ self.assertEqual(1, self.dummy_package.action_items.count())
+
+ duck_data = """
+ yet-another-package
+ """
+ set_mock_response(mock_requests, text=duck_data)
+
+ self.run_task()
+ self.assertEqual(0, self.dummy_package.action_items.count())
+
+
+@mock.patch('distro_tracker.core.utils.http.requests')
class UpdateDebciStatusTaskTest(TestCase):
"""
Tests for the :class:`distro_tracker.vendor.debian.tracker_tasks.UpdateDebciStatusTask` task.
diff --git a/distro_tracker/vendor/debian/tracker_tasks.py b/distro_tracker/vendor/debian/tracker_tasks.py
index 920ac62..e815359 100644
--- a/distro_tracker/vendor/debian/tracker_tasks.py
+++ b/distro_tracker/vendor/debian/tracker_tasks.py
@@ -1686,6 +1686,87 @@ class UpdateUbuntuStatsTask(BaseTask):
patch_diff=diff)
+class UpdateDebianDuckTask(BaseTask):
+ """
+ A task for updating upstream url issue information on all packages.
+ """
+
+ DUCK_LINK = 'http://duck.debian.net'
+ # URL of the list of source packages with issues.
+ DUCK_SP_LIST_URL = 'http://duck.debian.net/static/sourcepackages.txt'
+
+ ACTION_ITEM_TYPE_NAME = 'debian-duck'
+ ACTION_ITEM_TEMPLATE = 'debian/duck-action-item.html'
+ ITEM_DESCRIPTION = 'The URL(s) for this package had some \
+ recent persistent <a href="{issues_link}">issues</a>'
+
+ def __init__(self, force_update=False, *args, **kwargs):
+ super(UpdateDebianDuckTask, self).__init__(*args, **kwargs)
+ self.force_update = force_update
+ self.action_item_type = ActionItemType.objects.create_or_update(
+ type_name=self.ACTION_ITEM_TYPE_NAME,
+ full_description_template=self.ACTION_ITEM_TEMPLATE)
+
+ def set_parameters(self, parameters):
+ if 'force_update' in parameters:
+ self.force_update = parameters['force_update']
+
+ def prefix(self, pname):
+ if pname.startswith("lib") and len(pname) > 3:
+ return pname[0:4]
+ return pname[0:1]
+
+ def _get_duck_urls_content(self):
+ """
+ Gets the list of packages with URL issues from
+ duck.debian.net
+
+ :returns: A array if source package names.
+ """
+
+ ducklist = get_resource_content(self.DUCK_SP_LIST_URL)
+ if ducklist is None:
+ return None
+
+ packages = []
+ for package_name in ducklist.splitlines():
+ package_name = package_name.strip()
+ packages.append(package_name)
+ return packages
+
+ def update_action_item(self, package):
+ action_item = package.get_action_item_for_type(self.action_item_type)
+ if not action_item:
+ action_item = ActionItem(
+ package=package,
+ item_type=self.action_item_type,
+ )
+
+ issues_link = self.DUCK_LINK + "/static/sp/" \
+ + self.prefix(package.name) + "/" + package.name + ".html"
+ action_item.short_description = self.ITEM_DESCRIPTION.format(issues_link=issues_link)
+
+ action_item.extra_data = {
+ 'duck_link': self.DUCK_LINK,
+ 'issues_link': issues_link
+ }
+ action_item.save()
+
+ def execute(self):
+ ducklings = self._get_duck_urls_content()
+ if ducklings is None:
+ return
+
+ ActionItem.objects.delete_obsolete_items(
+ item_types=[self.action_item_type],
+ non_obsolete_packages=ducklings)
+
+ packages = SourcePackageName.objects.filter(name__in=ducklings)
+
+ for package in packages:
+ self.update_action_item(package)
+
+
class UpdateWnppStatsTask(BaseTask):
"""
The task updates the WNPP bugs for all packages.
--
2.0.1
Attachment:
0001-add-support-for-data-from-duck.debian.net.patch.sig
Description: PGP signature