diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e96b01a..05621b4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,14 +56,11 @@ jobs: run: | # Replace default path to CKAN core config file with the one on the container sed -i -e 's/use = config:.*/use = config:\/srv\/app\/src\/ckan\/test-core.ini/' test.ini - pip install -r requirements.txt - pip install -r dev-requirements.txt - pip install -e . + pip install -e .[dev] - name: Setup extension run: | ckan -c test.ini db init - ckan -c test.ini db pending-migrations --apply - name: Run tests run: pytest --ckan-ini=test.ini --cov=ckanext.subscribe --cov-report=term-missing --cov-append --disable-warnings ckanext/subscribe/tests diff --git a/MANIFEST.in b/MANIFEST.in index 8dfa866..fea62fb 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,6 @@ include README.rst include LICENSE include requirements.txt +include dev-requirements.txt recursive-include ckanext/subscribe *.html *.json *.js *.less *.css *.mo *.yml recursive-include ckanext/subscribe/migration *.ini *.py *.mako diff --git a/README.rst b/README.rst index 81a4421..782732c 100644 --- a/README.rst +++ b/README.rst @@ -247,8 +247,7 @@ do:: git clone https://github.com/bellisk/ckanext-subscribe.git cd ckanext-subscribe - python setup.py develop - pip install -r dev-requirements.txt + pip install -e .[dev] Now continue Installation steps from step 3 diff --git a/ckanext/subscribe/utils.py b/ckanext/subscribe/utils.py index d4e770b..37e72cf 100644 --- a/ckanext/subscribe/utils.py +++ b/ckanext/subscribe/utils.py @@ -32,9 +32,7 @@ def get_footer_contents(email_vars, subscription=None): if subscription: plain_text_footer += """ You can unsubscribe from notifications emails for {object_type}: "{object_title}" by going to {unsubscribe_link}. -""".format( - **email_vars - ) +""".format(**email_vars) else: plain_text_footer += ( "To stop receiving all subscription emails from {site_title}: " @@ -43,9 +41,7 @@ def get_footer_contents(email_vars, subscription=None): ).format(**email_vars) plain_text_footer += """ Manage your settings at {manage_link}. -""".format( - **email_vars - ) +""".format(**email_vars) return plain_text_footer, html_footer @@ -121,9 +117,7 @@ def get_manage_email_contents(email_vars): -- {html_footer} -""".format( - **email_vars - ) +""".format(**email_vars) plain_text_body = """ {site_title} subscription requested: @@ -132,9 +126,7 @@ def get_manage_email_contents(email_vars): -- {plain_text_footer} -""".format( - **email_vars - ) +""".format(**email_vars) return subject, plain_text_body, html_body @@ -152,9 +144,7 @@ def get_subscription_confirmation_email_contents(email_vars): -- {html_footer} -""".format( - **email_vars - ) +""".format(**email_vars) plain_text_body = """ You have subscribed to notifications about: {object_type}: {object_title} ({object_name}) @@ -165,9 +155,7 @@ def get_subscription_confirmation_email_contents(email_vars): -- {plain_text_footer} -""".format( - **email_vars - ) +""".format(**email_vars) return subject, plain_text_body, html_body @@ -176,8 +164,7 @@ def get_notification_email_contents(email_vars): # Make sure subject is only one line subject = subject.split("\n")[0] - html_body = Template( - """ + html_body = Template("""

Changes have occurred in relation to your subscription(s)

{% for notification in notifications %} @@ -197,10 +184,8 @@ def get_notification_email_contents(email_vars): -- {{ html_footer }} -""" - ).render(**email_vars) - plain_text_body = Template( - """ +""").render(**email_vars) + plain_text_body = Template(""" Changes have occurred in relation to your subscription(s) {% for notification in notifications %} @@ -215,8 +200,7 @@ def get_notification_email_contents(email_vars): -- {{ plain_text_footer }} -""" - ).render(**email_vars) +""").render(**email_vars) return subject, plain_text_body, html_body @@ -234,9 +218,7 @@ def get_verification_email_contents(email_vars): -- {html_footer} -""".format( - **email_vars - ) +""".format(**email_vars) plain_text_body = """ {site_title} subscription requested: {object_type}: {object_title} ({object_name}) @@ -246,9 +228,7 @@ def get_verification_email_contents(email_vars): -- {plain_text_footer} -""".format( - **email_vars - ) +""".format(**email_vars) return subject, plain_text_body, html_body diff --git a/dev-requirements.txt b/dev-requirements.txt index a61f397..3fd6521 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,2 +1,4 @@ +black coveralls # for reporting test coverage to coveralls.io in .github/workflows/test.yml +isort mock diff --git a/pyproject.toml b/pyproject.toml index 5d7bf33..8152bc7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,46 @@ +[project] +name = "ckanext-subscribe" +version = "1.1.0" +dynamic = ["dependencies", "optional-dependencies"] +description = "CKAN extension that allows users to subscribe to updates WITHOUT requiring login" +authors = [ + {name = "David Read", email = "david.read@hackneyworkshop.com"} +] +maintainers = [ + {name = "Liip AG", email = "ogdch@liip.ch"} +] +license = {text = "AGPL"} +classifiers = [ + "Intended Audience :: Developers", + "Development Status :: 4 - Beta", + "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", +] +keywords = [ + "CKAN", + "email", + "subscription", + "notifications", +] + +[project.urls] +Documentation = "https://github.com/opendata-swiss/ckanext-subscribe" +Repository = "https://github.com/opendata-swiss/ckanext-subscribe" +Issues = "https://github.com/opendata-swiss/ckanext-subscribe/issues" + +[build-system] +requires = ["setuptools>=64"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.dynamic] +dependencies = {file = ["requirements.txt"]} +optional-dependencies = {dev = { file = ["dev-requirements.txt"] }} + [tool.isort] profile = "black" + +[project.entry-points."ckan.plugins"] +subscribe = "ckanext.subscribe.plugin:SubscribePlugin" diff --git a/requirements.txt b/requirements.txt index e69de29..dc3292c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1 @@ +enum34 diff --git a/setup.cfg b/setup.cfg index e481581..66dfc32 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,13 @@ +[options] +packages = find: +namespace_packages = ckanext +install_requires = +include_package_data = True + +[options.entry_points] +babel.extractors = + ckan = ckan.lib.extract:extract_ckan + [extract_messages] keywords = translate isPlural add_comments = TRANSLATORS: diff --git a/setup.py b/setup.py index 670c0bb..de8315f 100644 --- a/setup.py +++ b/setup.py @@ -1,84 +1,6 @@ -# -*- coding: utf-8 -*- -from codecs import open # To use a consistent encoding -from os import path - -from setuptools import find_packages, setup # Always prefer setuptools over distutils - -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the relevant file -with open(path.join(here, "README.rst"), encoding="utf-8") as f: - long_description = f.read() +from setuptools import setup setup( - name="""ckanext-subscribe""", - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # http://packaging.python.org/en/latest/tutorial.html#version - version="1.1.0", - description=""" -CKAN extension that allows users to subscribe to updates WITHOUT requiring login""", - long_description=long_description, - long_description_content_type="text/x-rst", - # The project's main homepage. - url="https://github.com/bellisk/ckanext-subscribe", - # Author details - author="""David Read""", - author_email="""david.read@hackneyworkshop.com""", - maintainer="""Liip AG""", - maintainer_email="""ogdch@liip.ch""", - # Choose your license - license="AGPL", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 4 - Beta", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3", - ], - # What does your project relate to? - keywords="""CKAN email subscription notifications""", - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=find_packages(exclude=["contrib", "docs", "tests*"]), - namespace_packages=["ckanext"], - install_requires=[ - "enum34", - ], - # If there are data files included in your packages that need to be - # installed, specify them here. If using Python 2.6 or less, then these - # have to be included in MANIFEST.in as well. - include_package_data=True, - package_data={}, - # Although 'package_data' is the preferred approach, in some case you may - # need to place data files outside of your packages. - # see http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files - # In this case, 'data_file' will be installed into '/my_data' - data_files=[], - # To provide executable scripts, use entry points in preference to the - # "scripts" keyword. Entry points provide cross-platform support and allow - # pip to create the appropriate form of executable for the target platform. - entry_points=""" - [ckan.plugins] - subscribe=ckanext.subscribe.plugin:SubscribePlugin - - [babel.extractors] - ckan = ckan.lib.extract:extract_ckan - - [paste.paster_command] - subscribe = ckanext.subscribe.cli:subscribeCommand - - """, - # If you are changing from the default layout of your extension, you may - # have to change the message extractors, you can read more about babel - # message extraction at - # http://babel.pocoo.org/docs/messages/#extraction-method-mapping-and-configuration message_extractors={ "ckanext": [ ("**.py", "python", None),