| 1 | # GNU MediaGoblin -- federated, autonomous media hosting |
| 2 | # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. |
| 3 | # |
| 4 | # This program is free software: you can redistribute it and/or modify |
| 5 | # it under the terms of the GNU Affero General Public License as published by |
| 6 | # the Free Software Foundation, either version 3 of the License, or |
| 7 | # (at your option) any later version. |
| 8 | # |
| 9 | # This program is distributed in the hope that it will be useful, |
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | # GNU Affero General Public License for more details. |
| 13 | # |
| 14 | # You should have received a copy of the GNU Affero General Public License |
| 15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 16 | |
| 17 | from __future__ import print_function |
| 18 | |
| 19 | from setuptools import setup, find_packages |
| 20 | from io import open |
| 21 | import os |
| 22 | import re |
| 23 | |
| 24 | import sys |
| 25 | |
| 26 | PY2 = sys.version_info[0] == 2 # six is not installed yet |
| 27 | |
| 28 | READMEFILE = "README" |
| 29 | VERSIONFILE = os.path.join("mediagoblin", "_version.py") |
| 30 | VSRE = r"^__version__ = ['\"]([^'\"]*)['\"]" |
| 31 | |
| 32 | |
| 33 | def get_version(): |
| 34 | with open(VERSIONFILE, "rt") as fobj: |
| 35 | verstrline = fobj.read() |
| 36 | mo = re.search(VSRE, verstrline, re.M) |
| 37 | if mo: |
| 38 | return mo.group(1) |
| 39 | else: |
| 40 | raise RuntimeError("Unable to find version string in %s." % |
| 41 | VERSIONFILE) |
| 42 | |
| 43 | pyversion_install_requires = [] |
| 44 | if PY2: |
| 45 | pyversion_install_requires.append('alabaster<=0.7.999') # Tested with 0.7.12 |
| 46 | pyversion_install_requires.append('alembic<=1.4.999') # Tested with 1.4.2 |
| 47 | pyversion_install_requires.append('amqp<=2.5.999') # Tested with 2.5.2 |
| 48 | pyversion_install_requires.append('apipkg<=1.999') # Tested with 1.5 |
| 49 | pyversion_install_requires.append('atomicwrites<=1.4.999') # Tested with 1.4.0 |
| 50 | pyversion_install_requires.append('attrs<=19.3.999') # Tested with 19.3.0 |
| 51 | pyversion_install_requires.append('Babel<=2.8.999') # Tested with 2.8.0 |
| 52 | pyversion_install_requires.append('beautifulsoup4<=4.7.999') # Tested with 4.7.1 |
| 53 | pyversion_install_requires.append('billiard<=3.5.0.999') # Tested with 3.5.0.5 |
| 54 | pyversion_install_requires.append('celery<=4.2.999') # Tested with 4.2.2 |
| 55 | pyversion_install_requires.append('certifi<=2020.4.5.999') # Tested with 2020.4.5.1 |
| 56 | pyversion_install_requires.append('chardet<=3.0.999') # Tested with 3.0.4 |
| 57 | pyversion_install_requires.append('configobj<=5.0.999') # Tested with 5.0.6 |
| 58 | pyversion_install_requires.append('configparser<=5.0.999') # Tested with 5.0.0 |
| 59 | pyversion_install_requires.append('contextlib2<=0.6.999') # Tested with 0.6.0.post1 |
| 60 | pyversion_install_requires.append('decorator<=4.4.999') # Tested with 4.4.2 |
| 61 | pyversion_install_requires.append('dnspython<=1.16.999') # Tested with 1.16.0 |
| 62 | pyversion_install_requires.append('docutils<=0.999') # Tested with 0.16 |
| 63 | pyversion_install_requires.append('email-validator<=1.0.999') # Tested with 1.0.5 |
| 64 | pyversion_install_requires.append('execnet<=1.7.999') # Tested with 1.7.1 |
| 65 | pyversion_install_requires.append('ExifRead<=2.1.999') # Tested with 2.1.2 |
| 66 | pyversion_install_requires.append('funcsigs<=1.0.999') # Tested with 1.0.2 |
| 67 | pyversion_install_requires.append('functools32<=3.2.999') # Tested with 3.2.3.post2 |
| 68 | pyversion_install_requires.append('idna<=2.999') # Tested with 2.9 |
| 69 | pyversion_install_requires.append('imagesize<=1.2.999') # Tested with 1.2.0 |
| 70 | pyversion_install_requires.append('importlib-metadata<=1.6.999') # Tested with 1.6.0 |
| 71 | pyversion_install_requires.append('itsdangerous<=1.1.999') # Tested with 1.1.0 |
| 72 | pyversion_install_requires.append('Jinja2<=2.11.999') # Tested with 2.11.2 |
| 73 | pyversion_install_requires.append('jsonschema<=3.2.999') # Tested with 3.2.0 |
| 74 | pyversion_install_requires.append('kombu<=4.3.999') # Tested with 4.3.0 |
| 75 | pyversion_install_requires.append('Mako<=1.1.999') # Tested with 1.1.2 |
| 76 | pyversion_install_requires.append('Markdown<=3.1.999') # Tested with 3.1.1 |
| 77 | pyversion_install_requires.append('MarkupSafe<=1.1.999') # Tested with 1.1.1 |
| 78 | pyversion_install_requires.append('mock<=1.0.999') # Tested with 1.0.1 |
| 79 | pyversion_install_requires.append('more-itertools<=5.0.999') # Tested with 5.0.0 |
| 80 | pyversion_install_requires.append('oauthlib<=3.1.999') # Tested with 3.1.0 |
| 81 | pyversion_install_requires.append('packaging<=20.999') # Tested with 20.3 |
| 82 | pyversion_install_requires.append('Paste<=3.4.999') # Tested with 3.4.0 |
| 83 | pyversion_install_requires.append('PasteDeploy<=2.1.999') # Tested with 2.1.0 |
| 84 | pyversion_install_requires.append('PasteScript<=3.2.999') # Tested with 3.2.0 |
| 85 | pyversion_install_requires.append('pathlib2<=2.3.999') # Tested with 2.3.5 |
| 86 | pyversion_install_requires.append('pbr<=5.4.999') # Tested with 5.4.5 |
| 87 | pyversion_install_requires.append('pkg-resources<=0.0.999') # Tested with 0.0.0 |
| 88 | pyversion_install_requires.append('pluggy<=0.13.999') # Tested with 0.13.1 |
| 89 | pyversion_install_requires.append('py<=1.8.999') # Tested with 1.8.1 |
| 90 | pyversion_install_requires.append('py-bcrypt<=0.999') # Tested with 0.4 |
| 91 | pyversion_install_requires.append('Pygments<=2.5.999') # Tested with 2.5.2 |
| 92 | pyversion_install_requires.append('PyLD<=1.0.999') # Tested with 1.0.5 |
| 93 | pyversion_install_requires.append('pyparsing<=2.4.999') # Tested with 2.4.7 |
| 94 | pyversion_install_requires.append('pyrsistent<=0.16.999') # Tested with 0.16.0 |
| 95 | pyversion_install_requires.append('pytest<=4.6.999') # Tested with 4.6.9 |
| 96 | pyversion_install_requires.append('pytest-forked<=1.1.999') # Tested with 1.1.3 |
| 97 | pyversion_install_requires.append('pytest-xdist<=1.31.999') # Tested with 1.31.0 |
| 98 | pyversion_install_requires.append('python-dateutil<=2.8.999') # Tested with 2.8.1 |
| 99 | pyversion_install_requires.append('python-editor<=1.0.999') # Tested with 1.0.4 |
| 100 | pyversion_install_requires.append('pytz<=2020.999') # Tested with 2020.1 |
| 101 | pyversion_install_requires.append('requests<=2.23.999') # Tested with 2.23.0 |
| 102 | pyversion_install_requires.append('scandir<=1.10.999') # Tested with 1.10.0 |
| 103 | pyversion_install_requires.append('six<=1.12.999') # Tested with 1.12.0 |
| 104 | pyversion_install_requires.append('snowballstemmer<=2.0.999') # Tested with 2.0.0 |
| 105 | pyversion_install_requires.append('Sphinx<=1.8.999') # Tested with 1.8.5 |
| 106 | pyversion_install_requires.append('sphinxcontrib-websupport<=1.2.999') # Tested with 1.2.2 |
| 107 | pyversion_install_requires.append('SQLAlchemy<=1.3.999') # Tested with 1.3.16 |
| 108 | pyversion_install_requires.append('sqlalchemy-migrate<=0.13.999') # Tested with 0.13.0 |
| 109 | pyversion_install_requires.append('sqlparse<=0.3.999') # Tested with 0.3.1 |
| 110 | pyversion_install_requires.append('Tempita<=0.5.999') # Tested with 0.5.3.dev0 |
| 111 | pyversion_install_requires.append('typing<=3.7.4.999') # Tested with 3.7.4.1 |
| 112 | pyversion_install_requires.append('Unidecode<=1.1.999') # Tested with 1.1.1 |
| 113 | pyversion_install_requires.append('urllib3<=1.25.999') # Tested with 1.25.9 |
| 114 | pyversion_install_requires.append('vine<=1.3.999') # Tested with 1.3.0 |
| 115 | pyversion_install_requires.append('waitress<=1.4.999') # Tested with 1.4.3 |
| 116 | pyversion_install_requires.append('wcwidth<=0.1.999') # Tested with 0.1.9 |
| 117 | pyversion_install_requires.append('WebOb<=1.8.999') # Tested with 1.8.6 |
| 118 | pyversion_install_requires.append('WebTest<=2.0.999') # Tested with 2.0.35 |
| 119 | pyversion_install_requires.append('Werkzeug<=0.16.999') # Tested with 0.16.1 |
| 120 | pyversion_install_requires.append('WTForms<=2.3.999') # Tested with 2.3.1 |
| 121 | pyversion_install_requires.append('zipp<=1.2.999') # Tested with 1.2.0 |
| 122 | |
| 123 | install_requires = [ |
| 124 | 'waitress', |
| 125 | 'alembic>=0.7.5', |
| 126 | 'python-dateutil', |
| 127 | 'wtforms', |
| 128 | 'py-bcrypt', |
| 129 | 'pytest>=2.3.1', |
| 130 | 'pytest-xdist', |
| 131 | 'werkzeug>=0.7,<1.0.0', |
| 132 | # Celery 4.3.0 drops the "sqlite" transport alias making our tests fail. |
| 133 | 'celery>=3.0,<4.3.0', |
| 134 | # Jinja2 3.0.0 uses f-strings (Python 3.7 and above) but `pip install` on |
| 135 | # Debian 9 doesn't seem to respect Jinja2's 'python_requires=">=3.6"' line. |
| 136 | 'jinja2<3.0.0', |
| 137 | 'Babel>=1.3', |
| 138 | 'WebTest>=2.0.18', |
| 139 | 'ConfigObj', |
| 140 | 'Markdown', |
| 141 | 'sqlalchemy', |
| 142 | 'itsdangerous', |
| 143 | 'pytz', |
| 144 | 'sphinx', |
| 145 | 'six>=1.11.0', |
| 146 | 'oauthlib', |
| 147 | 'unidecode', |
| 148 | 'jsonschema', |
| 149 | 'PasteDeploy', |
| 150 | 'PasteScript', |
| 151 | 'requests>=2.6.0', |
| 152 | 'certifi>=2017.4.17', # Reported to be a requirement on Fedora 31 (TODO: test) |
| 153 | 'PyLD<2.0.0', # Python 2, but also breaks a Python 3 test if >= 2.0.0. |
| 154 | 'ExifRead>=2.0.0', |
| 155 | 'email-validator', # Seems that WTForms must have dropped this. |
| 156 | # This is optional: |
| 157 | # 'translitcodec', |
| 158 | # For now we're expecting that users will install this from |
| 159 | # their package managers. |
| 160 | # 'lxml', |
| 161 | # 'Pillow', |
| 162 | ] + pyversion_install_requires |
| 163 | |
| 164 | if not PY2: |
| 165 | # PyPI version (1.4.2) does not have proper Python 3 support |
| 166 | install_requires.append('ExifRead>=2.0.0') |
| 167 | |
| 168 | with open(READMEFILE, encoding="utf-8") as fobj: |
| 169 | long_description = fobj.read() |
| 170 | |
| 171 | try: |
| 172 | setup( |
| 173 | name="mediagoblin", |
| 174 | version=get_version(), |
| 175 | packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), |
| 176 | zip_safe=False, |
| 177 | include_package_data = True, |
| 178 | # scripts and dependencies |
| 179 | install_requires=install_requires, |
| 180 | test_suite='nose.collector', |
| 181 | entry_points="""\ |
| 182 | [console_scripts] |
| 183 | gmg = mediagoblin.gmg_commands:main_cli |
| 184 | |
| 185 | [paste.app_factory] |
| 186 | app = mediagoblin.app:paste_app_factory |
| 187 | |
| 188 | [paste.server_runner] |
| 189 | paste_server_selector = mediagoblin.app:paste_server_selector |
| 190 | |
| 191 | [paste.filter_app_factory] |
| 192 | errors = mediagoblin.errormiddleware:mgoblin_error_middleware |
| 193 | |
| 194 | [zc.buildout] |
| 195 | make_user_dev_dirs = mediagoblin.buildout_recipes:MakeUserDevDirs |
| 196 | |
| 197 | [babel.extractors] |
| 198 | jinja2 = jinja2.ext:babel_extract |
| 199 | """, |
| 200 | license='AGPLv3', |
| 201 | author='Free Software Foundation and contributors', |
| 202 | author_email='cwebber@gnu.org', |
| 203 | url="http://mediagoblin.org/", |
| 204 | long_description=long_description, |
| 205 | description='MediaGoblin is a web application for publishing all kinds of media', |
| 206 | classifiers=[ |
| 207 | "Development Status :: 3 - Alpha", |
| 208 | "Environment :: Web Environment", |
| 209 | "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", |
| 210 | "Operating System :: OS Independent", |
| 211 | "Programming Language :: Python", |
| 212 | 'Programming Language :: Python :: 2', |
| 213 | 'Programming Language :: Python :: 2.7', |
| 214 | 'Programming Language :: Python :: 3', |
| 215 | 'Programming Language :: Python :: 3.3', |
| 216 | 'Programming Language :: Python :: 3.4', |
| 217 | "Topic :: Internet :: WWW/HTTP :: Dynamic Content" |
| 218 | ], |
| 219 | ) |
| 220 | except TypeError as e: |
| 221 | import sys |
| 222 | |
| 223 | # Check if the problem is caused by the sqlalchemy/setuptools conflict |
| 224 | msg_as_str = str(e) |
| 225 | if not (msg_as_str == 'dist must be a Distribution instance'): |
| 226 | raise |
| 227 | |
| 228 | # If so, tell the user it is OK to just run the script again. |
| 229 | print("\n\n---------- NOTE ----------", file=sys.stderr) |
| 230 | print("The setup.py command you ran failed.\n", file=sys.stderr) |
| 231 | print("It is a known possible failure. Just run it again. It works the " |
| 232 | "second time.", file=sys.stderr) |
| 233 | sys.exit(1) |