diff --git a/README.rst b/README.rst index 7d4150b..259a080 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ django-analytical |latest-version| ================================== -|travis-ci| |coveralls| |downloads| |license| +|travis-ci| |coveralls| |health| |downloads| |license| The django-analytical application integrates analytics services into a Django_ project. @@ -32,6 +32,9 @@ an asynchronous version of the Javascript code if possible. .. |coveralls| image:: https://coveralls.io/repos/jcassee/django-analytical/badge.svg :alt: Test coverage :target: https://coveralls.io/r/jcassee/django-analytical +.. |health| image:: https://landscape.io/github/jcassee/django-analytical/master/landscape.svg?style=flat + :target: https://landscape.io/github/jcassee/django-analytical/master + :alt: Code health .. |downloads| image:: https://img.shields.io/pypi/dm/django-analytical.svg :alt: Monthly downloads from PyPI :target: https://pypi.python.org/pypi/django-analytical diff --git a/analytical/templatetags/chartbeat.py b/analytical/templatetags/chartbeat.py index 26d2c7d..e47f104 100644 --- a/analytical/templatetags/chartbeat.py +++ b/analytical/templatetags/chartbeat.py @@ -55,6 +55,7 @@ def chartbeat_top(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return ChartbeatTopNode() + class ChartbeatTopNode(Node): def render(self, context): if is_internal_ip(context): @@ -76,6 +77,7 @@ def chartbeat_bottom(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return ChartbeatBottomNode() + class ChartbeatBottomNode(Node): def __init__(self): self.user_id = get_required_setting('CHARTBEAT_USER_ID', USER_ID_RE, @@ -109,5 +111,5 @@ def _get_domain(context): elif getattr(settings, 'CHARTBEAT_AUTO_DOMAIN', True): try: return Site.objects.get_current().domain - except (ImproperlyConfigured, Site.DoesNotExist): #pylint: disable=E1101 + except (ImproperlyConfigured, Site.DoesNotExist): # pylint: disable=E1101 return diff --git a/analytical/templatetags/clicky.py b/analytical/templatetags/clicky.py index a2bf1c3..bee7f07 100644 --- a/analytical/templatetags/clicky.py +++ b/analytical/templatetags/clicky.py @@ -49,6 +49,7 @@ def clicky(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return ClickyNode() + class ClickyNode(Node): def __init__(self): self.site_id = get_required_setting('CLICKY_SITE_ID', SITE_ID_RE, diff --git a/analytical/templatetags/crazy_egg.py b/analytical/templatetags/crazy_egg.py index 884e678..5f0d830 100644 --- a/analytical/templatetags/crazy_egg.py +++ b/analytical/templatetags/crazy_egg.py @@ -33,6 +33,7 @@ def crazy_egg(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return CrazyEggNode() + class CrazyEggNode(Node): def __init__(self): self.account_nr = get_required_setting('CRAZY_EGG_ACCOUNT_NUMBER', diff --git a/analytical/templatetags/google_analytics.py b/analytical/templatetags/google_analytics.py index 47bc015..d19e6ca 100644 --- a/analytical/templatetags/google_analytics.py +++ b/analytical/templatetags/google_analytics.py @@ -12,6 +12,7 @@ from django.template import Library, Node, TemplateSyntaxError from analytical.utils import is_internal_ip, disable_html, \ get_required_setting, get_domain, AnalyticalException + def enumerate(sequence, start=0): """Copy of the Python 2.6 `enumerate` builtin for compatibility.""" n = start @@ -56,6 +57,7 @@ DISPLAY_ADVERTISING_SOURCE = ("'https://' : 'http://'", "'stats.g.doubleclick.ne register = Library() + @register.tag def google_analytics(parser, token): """ @@ -70,6 +72,7 @@ def google_analytics(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return GoogleAnalyticsNode() + class GoogleAnalyticsNode(Node): def __init__(self): self.property_id = get_required_setting( @@ -132,6 +135,7 @@ class GoogleAnalyticsNode(Node): commands.append(ANONYMIZE_IP_CODE) return commands + def contribute_to_analytical(add_node): GoogleAnalyticsNode() # ensure properly configured add_node('head_bottom', GoogleAnalyticsNode) diff --git a/analytical/templatetags/gosquared.py b/analytical/templatetags/gosquared.py index f125496..b159d9c 100644 --- a/analytical/templatetags/gosquared.py +++ b/analytical/templatetags/gosquared.py @@ -48,6 +48,7 @@ def gosquared(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return GoSquaredNode() + class GoSquaredNode(Node): def __init__(self): self.site_token = get_required_setting('GOSQUARED_SITE_TOKEN', TOKEN_RE, diff --git a/analytical/templatetags/intercom.py b/analytical/templatetags/intercom.py index 8cf582f..5b88586 100644 --- a/analytical/templatetags/intercom.py +++ b/analytical/templatetags/intercom.py @@ -76,7 +76,7 @@ class IntercomNode(Node): vars = self._get_custom_attrs(context) vars["app_id"] = self.app_id html = TRACKING_CODE % {"settings_json": json.dumps(vars, sort_keys=True)} - + if is_internal_ip(context, 'INTERCOM') or not user or not user.is_authenticated(): # Intercom is disabled for non-logged in users. html = disable_html(html, 'Intercom') diff --git a/analytical/templatetags/kiss_insights.py b/analytical/templatetags/kiss_insights.py index 5ab430a..17c70a6 100644 --- a/analytical/templatetags/kiss_insights.py +++ b/analytical/templatetags/kiss_insights.py @@ -40,6 +40,7 @@ def kiss_insights(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return KissInsightsNode() + class KissInsightsNode(Node): def __init__(self): self.account_number = get_required_setting( diff --git a/analytical/templatetags/kiss_metrics.py b/analytical/templatetags/kiss_metrics.py index d53d11c..4288b1b 100644 --- a/analytical/templatetags/kiss_metrics.py +++ b/analytical/templatetags/kiss_metrics.py @@ -58,6 +58,7 @@ def kiss_metrics(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return KissMetricsNode() + class KissMetricsNode(Node): def __init__(self): self.api_key = get_required_setting('KISS_METRICS_API_KEY', @@ -72,9 +73,9 @@ class KissMetricsNode(Node): try: properties = context[ALIAS_CONTEXT_KEY] key, value = properties.popitem() - commands.append(ALIAS_CODE % (key,value)) + commands.append(ALIAS_CODE % (key, value)) except KeyError: - pass + pass try: name, properties = context[EVENT_CONTEXT_KEY] commands.append(EVENT_CODE % {'name': name, diff --git a/analytical/templatetags/olark.py b/analytical/templatetags/olark.py index 2a2712b..08ca384 100644 --- a/analytical/templatetags/olark.py +++ b/analytical/templatetags/olark.py @@ -53,6 +53,7 @@ def olark(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return OlarkNode() + class OlarkNode(Node): def __init__(self): self.site_id = get_required_setting('OLARK_SITE_ID', SITE_ID_RE, diff --git a/analytical/templatetags/performable.py b/analytical/templatetags/performable.py index 8753157..e357783 100644 --- a/analytical/templatetags/performable.py +++ b/analytical/templatetags/performable.py @@ -50,6 +50,7 @@ def performable(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return PerformableNode() + class PerformableNode(Node): def __init__(self): self.api_key = get_required_setting('PERFORMABLE_API_KEY', API_KEY_RE, diff --git a/analytical/templatetags/reinvigorate.py b/analytical/templatetags/reinvigorate.py index dd16c95..4f577bc 100644 --- a/analytical/templatetags/reinvigorate.py +++ b/analytical/templatetags/reinvigorate.py @@ -44,6 +44,7 @@ def reinvigorate(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return ReinvigorateNode() + class ReinvigorateNode(Node): def __init__(self): self.tracking_id = get_required_setting('REINVIGORATE_TRACKING_ID', diff --git a/analytical/templatetags/snapengage.py b/analytical/templatetags/snapengage.py index 96652b5..57134c3 100644 --- a/analytical/templatetags/snapengage.py +++ b/analytical/templatetags/snapengage.py @@ -66,6 +66,7 @@ def snapengage(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return SnapEngageNode() + class SnapEngageNode(Node): def __init__(self): self.widget_id = get_required_setting('SNAPENGAGE_WIDGET_ID', diff --git a/analytical/templatetags/spring_metrics.py b/analytical/templatetags/spring_metrics.py index 45c3edc..74e2767 100644 --- a/analytical/templatetags/spring_metrics.py +++ b/analytical/templatetags/spring_metrics.py @@ -49,6 +49,7 @@ def spring_metrics(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return SpringMetricsNode() + class SpringMetricsNode(Node): def __init__(self): self.tracking_id = get_required_setting('SPRING_METRICS_TRACKING_ID', diff --git a/analytical/templatetags/uservoice.py b/analytical/templatetags/uservoice.py index 1f618f9..d1ab6f7 100644 --- a/analytical/templatetags/uservoice.py +++ b/analytical/templatetags/uservoice.py @@ -82,6 +82,7 @@ class UserVoiceNode(Node): name = user.username return {'name': name, 'email': user.email} + def contribute_to_analytical(add_node): UserVoiceNode() # ensure properly configured add_node('body_bottom', UserVoiceNode) diff --git a/analytical/templatetags/woopra.py b/analytical/templatetags/woopra.py index 8018e78..e5e2ad4 100644 --- a/analytical/templatetags/woopra.py +++ b/analytical/templatetags/woopra.py @@ -47,6 +47,7 @@ def woopra(parser, token): raise TemplateSyntaxError("'%s' takes no arguments" % bits[0]) return WoopraNode() + class WoopraNode(Node): def __init__(self): self.domain = get_required_setting('WOOPRA_DOMAIN', DOMAIN_RE, diff --git a/analytical/tests/__init__.py b/analytical/tests/__init__.py index 3c4bca8..cf955c0 100644 --- a/analytical/tests/__init__.py +++ b/analytical/tests/__init__.py @@ -1,6 +1,7 @@ """ Tests for django-analytical. """ +# flake8: noqa from analytical.tests.test_tag_analytical import * from analytical.tests.test_tag_chartbeat import * diff --git a/analytical/tests/settings.py b/analytical/tests/settings.py index 8c1c4cd..374530c 100644 --- a/analytical/tests/settings.py +++ b/analytical/tests/settings.py @@ -15,5 +15,7 @@ INSTALLED_APPS = [ SECRET_KEY = 'testing' -MIDDLEWARE_CLASSES=('django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware'), +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', +) diff --git a/analytical/tests/test_tag_google_analytics.py b/analytical/tests/test_tag_google_analytics.py index 95b7541..74ce256 100644 --- a/analytical/tests/test_tag_google_analytics.py +++ b/analytical/tests/test_tag_google_analytics.py @@ -104,6 +104,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase): r = GoogleAnalyticsNode().render(Context()) self.assertFalse("_gaq.push (['_gat._anonymizeIp']);" in r, r) + @override_settings(GOOGLE_ANALYTICS_PROPERTY_ID='UA-123456-7', GOOGLE_ANALYTICS_TRACKING_STYLE=TRACK_MULTIPLE_DOMAINS, GOOGLE_ANALYTICS_DOMAIN=None, diff --git a/analytical/tests/test_tag_kiss_metrics.py b/analytical/tests/test_tag_kiss_metrics.py index b5cf2aa..9c2c19d 100644 --- a/analytical/tests/test_tag_kiss_metrics.py +++ b/analytical/tests/test_tag_kiss_metrics.py @@ -68,8 +68,7 @@ class KissMetricsTagTestCase(TagTestCase): def test_alias(self): r = KissMetricsNode().render(Context({'kiss_metrics_alias': {'test': 'test_alias'}})) - self.assertTrue("_kmq.push(['alias', 'test', 'test_alias']);" in r,r) - + self.assertTrue("_kmq.push(['alias', 'test', 'test_alias']);" in r, r) @override_settings(ANALYTICAL_INTERNAL_IPS=['1.1.1.1']) def test_render_internal_ip(self): diff --git a/analytical/tests/test_tag_uservoice.py b/analytical/tests/test_tag_uservoice.py index 5ff6a8b..d8f6a5b 100644 --- a/analytical/tests/test_tag_uservoice.py +++ b/analytical/tests/test_tag_uservoice.py @@ -77,4 +77,4 @@ class UserVoiceTagTestCase(TagTestCase): @override_settings(USERVOICE_ADD_TRIGGER=False) def test_auto_trigger_custom_win(self): r = UserVoiceNode().render(Context({'uservoice_add_trigger': True})) - self.assertTrue("UserVoice.push(['addTrigger', {}]);" in r, r) \ No newline at end of file + self.assertTrue("UserVoice.push(['addTrigger', {}]);" in r, r) diff --git a/analytical/tests/test_utils.py b/analytical/tests/test_utils.py index 5f6b3e6..8bf2cb3 100644 --- a/analytical/tests/test_utils.py +++ b/analytical/tests/test_utils.py @@ -32,6 +32,7 @@ class SettingDeletedTestCase(TestCase): self.assertRaises(AnalyticalException, get_required_setting, "USER_ID", "\d+", "invalid USER_ID") + @override_settings(ANALYTICAL_DOMAIN="example.org") class GetDomainTestCase(TestCase): def test_get_service_domain_from_context(self): diff --git a/analytical/tests/utils.py b/analytical/tests/utils.py index ee95c51..11d106d 100644 --- a/analytical/tests/utils.py +++ b/analytical/tests/utils.py @@ -7,6 +7,7 @@ from __future__ import with_statement from django.template import Template, Context, RequestContext from django.test.testcases import TestCase + def run_tests(): """ Use the Django test runner to run the tests.