
As per [their blog post of the 27th April](https://blog.readthedocs.com/securing-subdomains/) ‘Securing subdomains’: > Starting today, Read the Docs will start hosting projects from subdomains on the domain readthedocs.io, instead of on readthedocs.org. This change addresses some security concerns around site cookies while hosting user generated data on the same domain as our dashboard. Test Plan: Manually visited all the links I’ve modified.
149 lines
5.4 KiB
Python
149 lines
5.4 KiB
Python
from __future__ import print_function
|
|
import ast
|
|
import os
|
|
import sys
|
|
import codecs
|
|
from fnmatch import fnmatchcase
|
|
from distutils.util import convert_path
|
|
from setuptools import setup, find_packages
|
|
|
|
class VersionFinder(ast.NodeVisitor):
|
|
def __init__(self):
|
|
self.version = None
|
|
|
|
def visit_Assign(self, node):
|
|
if node.targets[0].id == '__version__':
|
|
self.version = node.value.s
|
|
|
|
|
|
def read(*parts):
|
|
filename = os.path.join(os.path.dirname(__file__), *parts)
|
|
with codecs.open(filename, encoding='utf-8') as fp:
|
|
return fp.read()
|
|
|
|
|
|
def find_version(*parts):
|
|
finder = VersionFinder()
|
|
finder.visit(ast.parse(read(*parts)))
|
|
return finder.version
|
|
|
|
|
|
# Provided as an attribute, so you can append to these instead
|
|
# of replicating them:
|
|
standard_exclude = ('*.py', '*.pyc', '*$py.class', '*~', '.*', '*.bak')
|
|
standard_exclude_directories = ('.*', 'CVS', '_darcs', './build',
|
|
'./dist', 'EGG-INFO', '*.egg-info')
|
|
|
|
|
|
# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
|
|
# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
|
|
# Note: you may want to copy this into your setup.py file verbatim, as
|
|
# you can't import this from another package, when you don't know if
|
|
# that package is installed yet.
|
|
def find_package_data(where='.', package='',
|
|
exclude=standard_exclude,
|
|
exclude_directories=standard_exclude_directories,
|
|
only_in_packages=True,
|
|
show_ignored=False):
|
|
"""
|
|
Return a dictionary suitable for use in ``package_data``
|
|
in a distutils ``setup.py`` file.
|
|
|
|
The dictionary looks like::
|
|
|
|
{'package': [files]}
|
|
|
|
Where ``files`` is a list of all the files in that package that
|
|
don't match anything in ``exclude``.
|
|
|
|
If ``only_in_packages`` is true, then top-level directories that
|
|
are not packages won't be included (but directories under packages
|
|
will).
|
|
|
|
Directories matching any pattern in ``exclude_directories`` will
|
|
be ignored; by default directories with leading ``.``, ``CVS``,
|
|
and ``_darcs`` will be ignored.
|
|
|
|
If ``show_ignored`` is true, then all the files that aren't
|
|
included in package data are shown on stderr (for debugging
|
|
purposes).
|
|
|
|
Note patterns use wildcards, or can be exact paths (including
|
|
leading ``./``), and all searching is case-insensitive.
|
|
"""
|
|
|
|
out = {}
|
|
stack = [(convert_path(where), '', package, only_in_packages)]
|
|
while stack:
|
|
where, prefix, package, only_in_packages = stack.pop(0)
|
|
for name in os.listdir(where):
|
|
fn = os.path.join(where, name)
|
|
if os.path.isdir(fn):
|
|
bad_name = False
|
|
for pattern in exclude_directories:
|
|
if (fnmatchcase(name, pattern) or fn.lower() == pattern.lower()):
|
|
bad_name = True
|
|
if show_ignored:
|
|
print("Directory %s ignored by pattern %s" %
|
|
(fn, pattern), file=sys.stderr)
|
|
break
|
|
if bad_name:
|
|
continue
|
|
if (os.path.isfile(os.path.join(fn, '__init__.py')) and not prefix):
|
|
if not package:
|
|
new_package = name
|
|
else:
|
|
new_package = package + '.' + name
|
|
stack.append((fn, '', new_package, False))
|
|
else:
|
|
stack.append((fn, prefix + name + '/', package, only_in_packages))
|
|
elif package or not only_in_packages:
|
|
# is a file
|
|
bad_name = False
|
|
for pattern in exclude:
|
|
if (fnmatchcase(name, pattern) or fn.lower() == pattern.lower()):
|
|
bad_name = True
|
|
if show_ignored:
|
|
print("File %s ignored by pattern %s" %
|
|
(fn, pattern), file=sys.stderr)
|
|
break
|
|
if bad_name:
|
|
continue
|
|
out.setdefault(package, []).append(prefix + name)
|
|
return out
|
|
|
|
setup(
|
|
name="django_compressor",
|
|
version=find_version("compressor", "__init__.py"),
|
|
url='https://django-compressor.readthedocs.io/en/latest/',
|
|
license='MIT',
|
|
description="Compresses linked and inline JavaScript or CSS into single cached files.",
|
|
long_description=read('README.rst'),
|
|
author='Jannis Leidel',
|
|
author_email='jannis@leidel.info',
|
|
packages=find_packages(),
|
|
package_data=find_package_data(),
|
|
classifiers=[
|
|
'Development Status :: 5 - Production/Stable',
|
|
'Framework :: Django',
|
|
'Intended Audience :: Developers',
|
|
'License :: OSI Approved :: MIT License',
|
|
'Operating System :: OS Independent',
|
|
'Programming Language :: Python',
|
|
'Programming Language :: Python :: 2',
|
|
'Programming Language :: Python :: 2.7',
|
|
'Programming Language :: Python :: 3',
|
|
'Programming Language :: Python :: 3.2',
|
|
'Programming Language :: Python :: 3.3',
|
|
'Programming Language :: Python :: 3.4',
|
|
'Programming Language :: Python :: 3.5',
|
|
'Topic :: Internet :: WWW/HTTP',
|
|
],
|
|
zip_safe=False,
|
|
install_requires=[
|
|
'django-appconf >= 1.0',
|
|
'rcssmin == 1.0.6',
|
|
'rjsmin == 1.0.12',
|
|
],
|
|
)
|