# Common Makefile for PGWUI projects
#
-# Variables to customize:
+# Variables from the including Makefile.
# PGWUI_COMPONENT := pgwui_example
## dist Create sdist Python package in ./dist
.PHONY: dist
-dist:
+dist: devel/buildenv
rm -rf dist
- ${PYTHON_EXE} setup.py sdist
+ devel/buildenv/bin/python -m build
# Expected targets
# Development related targets
-# Re-create development environment when setup.py changes
-devel: setup.py
+# Re-create development environment when build environment changes
+devel: setup.py pyproject.toml MANIFEST.in
rm -rf devel ${TOX_STUFF}
mkdir devel
+# virtualenv for package building
+devel/buildenv: devel
+ [ -d devel/buildenv ] \
+ || ( ${VIRTUALENV} devel/buildenv ; \
+ devel/buildenv/bin/pip install --upgrade pip ; \
+ devel/buildenv/bin/pip install --upgrade setuptools ; \
+ devel/buildenv/bin/pip install build ; \
+ )
+
# virtualenv for development
devel/testenv: devel
[ -d devel/testenv ] \
devel/testenv/bin/pip install --upgrade pip ; \
devel/testenv/bin/pip install --upgrade setuptools ; \
devel/testenv/bin/pip install tox ; \
- devel/testenv/bin/pip install -e '.[testing]' ; \
+ devel/testenv/bin/pip install -e '.[test]' ; \
)
# virtualenv for pytest
devel/pytest/bin/pip install dist/${PGWUI_COMPONENT}-*.tar.gz ; \
devel/pytest/bin/pip install flake8 ; \
devel/pytest/bin/pip install pytest-cov ; \
- devel/pytest/bin/pip install -e '.[testing]' ; \
+ devel/pytest/bin/pip install -e '.[test]' ; \
) \
else \
( devel/pytest/bin/pip uninstall -y ${PGWUI_COMPONENT} ; \
devel/pytest/bin/pip install dist/${PGWUI_COMPONENT}-*.tar.gz ; \
- devel/pytest/bin/pip install -e '.[testing]' ; \
+ devel/pytest/bin/pip install -e '.[test]' ; \
) ; \
fi
devel/pudb/bin/pip install --upgrade setuptools ; \
devel/pudb/bin/pip install --upgrade wheel ; \
devel/pudb/bin/pip install dist/${PGWUI_COMPONENT}-*.tar.gz ; \
- devel/pudb/bin/pip install -e '.[testing]' ; \
+ devel/pudb/bin/pip install -e '.[test]' ; \
devel/pudb/bin/pip install pudb ; \
) \
else \
( devel/pudb/bin/pip uninstall -y ${PGWUI_COMPONENT} ; \
- devel/pudb/bin/pip install -e '.[testing]' ; \
+ devel/pudb/bin/pip install -e '.[test]' ; \
devel/pudb/bin/pip install dist/${PGWUI_COMPONENT}-*.tar.gz \
) ; \
fi
--- /dev/null
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+# Have setuptools find all our packages, and, since include-package-data
+# defaults to true, this also includes all the data files found in
+# MANIFEST.in
+[tool.setuptools.packages.find]
+where = ["src"]
+
+[project]
+name = "pgwui_upload"
+# Versioning is major.minor.fixes. Major releases change (after 1.0.0)
+# when backward incompatibility is introduced. Minor releases introduce
+# new features. Fix releases introduce fixes.
+dynamic = [
+ "version", "readme",
+ "dependencies", # dynamic because version numbers are injected
+ "optional-dependencies" # dynamic because version numbers are injected
+]
+description = """Upload into a PostgreSQL table, assisting data cleanup, \
+ via the web."""
+requires-python = ">=3.7"
+
+# The license should be clear from the classifier, below
+# license = {file = "LICENSE.txt"}
+authors = [{name = 'Karl O. Pinc', email = 'kop@karlpinc.com'}]
+urls = {'Home Page' = 'http://pgwui_upload.readthedocs.io/'}
+# What does your project relate to?
+keywords = [
+ 'batch',
+ 'batch upload',
+ 'batch validation',
+ 'bulk',
+ 'bulk data upload',
+ 'bulk data validation',
+ 'bulk upload',
+ 'bulk validation',
+ 'data upload',
+ 'data validation',
+ 'database front end',
+ 'error reporting',
+ 'interface',
+ 'Postgres',
+ 'Postgres user interface',
+ 'Postgres web interface',
+ 'PostgreSQL',
+ 'Postgres front end',
+ 'transaction',
+ 'upload',
+ 'validation',
+ 'user interface',
+ 'web',
+ 'web front end'
+]
+# 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 :: 3 - Alpha',
+
+ # Indicate who your project is intended for
+ 'Environment :: Web Environment',
+ 'Framework :: Pyramid',
+ 'Intended Audience :: End Users/Desktop',
+ 'Intended Audience :: Information Technology',
+ 'Intended Audience :: Science/Research',
+ 'Intended Audience :: System Administrators',
+ 'Topic :: Database :: Front-Ends',
+ 'Topic :: Internet :: WWW/HTTP',
+ 'Topic :: Scientific/Engineering',
+ 'Topic :: Utilities',
+
+ # 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',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: 3.11'
+]
+
+# [project.scripts]
+# script-name = 'module.path:function'
+
+[project.entry-points]
+# (Note, the PGWUI entry point names in these component groups must begin
+# with a period.)
+# Entry point supporting PGWUI's autoconfigure component discovery.
+[project.entry-points.'pgwui.components']
+'.pgwui_upload' = 'pgwui_upload'
+# Entry point supporting the PGWUI component's check of its setting values.
+[project.entry-points.'pgwui.check_settings']
+'.pgwui_upload' = 'pgwui_upload.check_settings:check_settings'
-"""A setuptools based setup module.
+# Copyright (C) 2016, 2017, 2018, 2019, 2020, 2024 The Meme Factory, Inc.
+# http://www.karlpinc.com/
-Copied from:
-https://github.com/pypa/sampleproject
-It's license applies to this file.
-"""
-# Copyright (c) 2016 The Python Packaging Authority (PyPA)
+# This file is part of PGWUI_Upload.
#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
+# This program is free software: you can redistribute it and/or
+# modify it under the terms of the GNU Affero General Public License
+# as published by the Free Software Foundation, either version 3 of
+# the License, or (at your option) any later version.
#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Affero General Public License for more details.
#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# DEALINGS IN THE SOFTWARE.
+# You should have received a copy of the GNU Affero General Public
+# License along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+
+# Karl O. Pinc <kop@karlpinc.com>
+
+import codecs # To use a consistent encoding
+import setuptools
+import os
+#
+# version
+#
+
+here = os.path.abspath(os.path.dirname(__file__))
+
+# Get program version
+with codecs.open(
+ os.path.join(here, "src", "pgwui_upload", "VERSION"),
+ encoding="utf-8",
+) as version_file:
+ version = version_file.read().strip()
-# Always prefer setuptools over distutils
-from setuptools import setup, find_packages
-# To use a consistent encoding
-from codecs import open
-from os import path
+#
+# readme
+#
# Get the long description from the README file
def filter_readme():
- '''Return README content with copyright at top removed'''
+ """Return README content with copyright at top removed"""
lines = []
past_copyright = False
- with open(path.join(here, 'README.rst'), encoding='utf-8') as f:
+ with open(os.path.join(here, "README.rst"), encoding="utf-8") as f:
for line in f:
if past_copyright:
lines.append(line)
else:
- if line == '.. #End Of Copyright Marker#\n':
+ if line == ".. #End Of Copyright Marker#\n":
past_copyright = True
- return ''.join(lines)
-
+ return "".join(lines)
-here = path.abspath(path.dirname(__file__))
-# Get program version
-with open(path.join(here, 'src', 'pgwui_upload', 'VERSION'),
- encoding='utf-8') as version_file:
- version = version_file.read().strip()
-
-# Get the long description from the README file
-long_description = filter_readme()
-
-# Pyramid testing requirements
-tests_require = [
- 'pgwui_develop==' + version,
- 'WebTest >= 1.3.1', # py3 compat
- 'pytest>=3.7.4',
- 'pytest-cov',
+#
+# dependencies (run-time)
+#
+install_requires = [
+ 'markupsafe',
+ 'pgwui_core==' + version,
+ 'pgwui_upload_core==' + version,
+ 'psycopg',
+ 'pyramid',
]
-setup(
- name='pgwui_upload',
-
- # Versioning is major.minor.fixes. Major releases change (after 1.0.0)
- # when backward incompatibility is introduced. Minor releases introduce
- # new features. Fix releases introduce fixes.
- version=version,
-
- description=(
- 'Upload into a PostgreSQL table, assisting data cleanup, via the web.'
- ),
- long_description=long_description,
- long_description_content_type='text/x-rst',
-
- # The project's main homepage.
- url='http://pgwui_upload.readthedocs.io/',
-
- # Author details
- author='Karl O. Pinc',
- author_email='kop@karlpinc.com',
-
- # Choose your license
- license='AGPLv3+',
-
- # 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 :: 3 - Alpha',
-
- # Indicate who your project is intended for
- 'Environment :: Web Environment',
- 'Framework :: Pyramid',
- 'Intended Audience :: End Users/Desktop',
- 'Intended Audience :: Information Technology',
- 'Intended Audience :: Science/Research',
- 'Intended Audience :: System Administrators',
- 'Topic :: Database :: Front-Ends',
- 'Topic :: Internet :: WWW/HTTP',
- 'Topic :: Scientific/Engineering',
- 'Topic :: Utilities',
-
- # 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',
- 'Programming Language :: Python :: 3.7',
- 'Programming Language :: Python :: 3.8',
- 'Programming Language :: Python :: 3.9',
- 'Programming Language :: Python :: 3.10',
- 'Programming Language :: Python :: 3.11',
- ],
-
- # What does your project relate to?
- keywords=[
- 'batch',
- 'batch upload',
- 'batch validation',
- 'bulk',
- 'bulk data upload',
- 'bulk data validation',
- 'bulk upload',
- 'bulk validation',
- 'data upload',
- 'data validation',
- 'database front end',
- 'error reporting',
- 'interface',
- 'Postgres',
- 'Postgres user interface',
- 'Postgres web interface',
- 'PostgreSQL',
- 'Postgres front end',
- 'transaction',
- 'upload',
- 'validation',
- 'user interface',
- 'web',
- 'web front end',
- ],
-
- # You can just specify the packages manually here if your project is
- # simple. Or you can use find_packages().
- packages=find_packages('src'),
- package_dir={'': 'src'},
-
- # Run-time dependencies.
- install_requires=[
- 'markupsafe',
- 'pgwui_core==' + version,
- 'pgwui_upload_core==' + version,
- 'psycopg',
- 'pyramid',
- ],
-
- # List additional groups of dependencies here (e.g. development
- # dependencies). You can install these using the following syntax,
- # for example:
- # $ pip install -e .[testing]
- extras_require={
- 'testing': tests_require,
- },
-
- # 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.
- package_data={
- 'pgwui_upload': [
- 'templates/*.mak',
- 'VERSION',
- ],
- },
+#
+# optional-dependencies
+#
- # 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.
- #
- # Setup an entry point to support PGWUI autoconfigure discovery.
- entry_points={
- 'pgwui.components': '.pgwui_upload = pgwui_upload',
- 'pgwui.check_settings':
- '.pgwui_upload = pgwui_upload.check_settings:check_settings'}
-)
+extras_require = {
+ "test": [
+ "pgwui_develop==" + version,
+ "WebTest >= 1.3.1", # py3 compat
+ "pytest>=3.7.4",
+ "pytest-cov",
+ ]
+}
+
+
+if __name__ == '__main__':
+ setuptools.setup(
+ version=version,
+ long_description=filter_readme(),
+ long_description_content_type='text/x-rst',
+ install_requires=install_requires,
+ extras_require=extras_require
+ )