Files @ 7aff9a999536
Branch filter:

Location: kallithea/setup.py - annotation

Thomas De Schampheleire
templates, controllers: replace webhelpers.html.literal() with webhelpers.html.HTML() where possible

Usage of webhelpers.literal (h.literal) can be a problem when variables are
not correctly escaped. Luckily, this function can be avoided in several
cases.

Several users of the construct:
h.literal(_('..A..') % (..B..))

can be simplified if (..B..) just contains a call to h.link_to. In this
case, there is actually no need to use h.literal, because the object
returned by link_to is already a literal. It is sufficient to use
webhelpers.html.HTML() like so:
h.HTML(_('..A..')) % (..B..)

which is better because it will escape the '..A..' part instead of passing
it literally.

The need to wrap the '..A..' part in HTML() is to make sure the (escaped)
end result is not a plain string but a 'literal' to avoid double escaping
later.

See also the documentation:
https://docs.pylonsproject.org/projects/webhelpers/en/latest/modules/html/builder.html
"
When literal is used in a mixed expression containing both literals and
ordinary strings, it tries hard to escape the strings and return a
literal. However, this depends on which value has “control” of the
expression. literal seems to be able to take control with all
combinations of the + operator, but with % and join it must be on the
left side of the expression. So these all work:

"A" + literal("B")
literal(", ").join(["A", literal("B")])
literal("%s %s") % (16, literal("kg"))

But these return an ordinary string which is prone to double-escaping later:

"\n".join([literal('<span class="foo">Foo!</span>'), literal('Bar!')])
"%s %s" % (literal("16"), literal("&lt;em&gt;kg&lt;/em&gt;"))
"

This same escaping with 'HTML()' was already done by default in mako
templates for constructs like ${_("something")} that do not contain format
specifiers. When the translated string _does_ contain format specifiers, we
want to use the same escaping, but we have to do it explicit and earlier so
the escaping happens already when strings are inserted into the template
string.
bf011c9f7f58
266a3cbc0302
9382e88eae22
65c27fd21769
9382e88eae22
9382e88eae22
a922e91a4f02
a9a1560dad79
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
7e5f8c12a3fc
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
9382e88eae22
3a1cf70e0f42
2d7a94f3eaae
9382e88eae22
55fc0bcce916
9ec1d2ac4529
55fc0bcce916
55fc0bcce916
55fc0bcce916
953047e8c88a
55fc0bcce916
9ec1d2ac4529
55fc0bcce916
55fc0bcce916
55fc0bcce916
55fc0bcce916
664262b31af3
55fc0bcce916
66bd06015fb1
664262b31af3
55fc0bcce916
55fc0bcce916
664262b31af3
55fc0bcce916
33bdabfa67b8
55fc0bcce916
44a15e2a04ff
55fc0bcce916
e7d6373631c4
5746cc3b3fa5
e4b9a1d1fea1
9382e88eae22
9382e88eae22
d4f6dc38d625
9ec1d2ac4529
bda2bd2558b1
9382e88eae22
953ee49f3b30
55fc0bcce916
a1fba57f46fa
880a39e5d8df
880a39e5d8df
880a39e5d8df
fc6063e6630b
cc48c1541c7e
fc6063e6630b
fc6063e6630b
fc6063e6630b
fc6063e6630b
fc6063e6630b
fc6063e6630b
fc6063e6630b
fc6063e6630b
cc48c1541c7e
fc6063e6630b
a60cd29ba7e2
b0e2c949c34b
2afa6b8c2ade
2afa6b8c2ade
65c27fd21769
65c27fd21769
24c0d584ba86
326a9336fbe5
faad9dd06b58
266a3cbc0302
266a3cbc0302
7e5f8c12a3fc
266a3cbc0302
266a3cbc0302
266a3cbc0302
266a3cbc0302
2afa6b8c2ade
266a3cbc0302
65c27fd21769
7c732f2047f8
d69aa464f373
266a3cbc0302
7c732f2047f8
7c732f2047f8
266a3cbc0302
ad2e97c6f17f
2642f128ad46
a922e91a4f02
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
c79e4f89bfd3
a922e91a4f02
564e40829f80
a922e91a4f02
24c0d584ba86
9382e88eae22
ad2e97c6f17f
2642f128ad46
2d7a94f3eaae
f4807acf643d
9382e88eae22
3315e9263a53
880a39e5d8df
9382e88eae22
2642f128ad46
a60cd29ba7e2
2642f128ad46
65c27fd21769
20dc7a5eb748
7e5f8c12a3fc
564e40829f80
564e40829f80
0e6035a85980
564e40829f80
20dc7a5eb748
20dc7a5eb748
7ac09514a178
9793473d74be
9793473d74be
9793473d74be
e4b9a1d1fea1
7ac09514a178
564e40829f80
7e5f8c12a3fc
564e40829f80
564e40829f80
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import os
import sys
import platform

if sys.version_info < (2, 6) or sys.version_info >= (3,):
    raise Exception('Kallithea requires python 2.6 or 2.7')


here = os.path.abspath(os.path.dirname(__file__))


def _get_meta_var(name, data, callback_handler=None):
    import re
    matches = re.compile(r'(?:%s)\s*=\s*(.*)' % name).search(data)
    if matches:
        if not callable(callback_handler):
            callback_handler = lambda v: v

        return callback_handler(eval(matches.groups()[0]))

_meta = open(os.path.join(here, 'kallithea', '__init__.py'), 'rb')
_metadata = _meta.read()
_meta.close()

callback = lambda V: ('.'.join(map(str, V[:3])) + '.'.join(V[3:]))
__version__ = _get_meta_var('VERSION', _metadata, callback)
__license__ = _get_meta_var('__license__', _metadata)
__author__ = _get_meta_var('__author__', _metadata)
__url__ = _get_meta_var('__url__', _metadata)
# defines current platform
__platform__ = platform.system()

is_windows = __platform__ in ['Windows']

requirements = [
    "alembic >= 0.8.0, < 1.1",
    "gearbox < 1",
    "waitress >= 0.8.8, < 1.2",
    "WebOb >= 1.7, < 1.8", # turbogears2 2.3.12 requires WebOb<1.8.0
    "backlash >= 0.1.2, < 1",
    "TurboGears2 >= 2.3.10, < 2.4",
    "tgext.routes >= 0.2.0, < 1",
    "Beaker >= 1.7.0, < 2",
    "WebHelpers >= 1.3, < 1.4",
    "FormEncode >= 1.2.4, < 1.4",
    "SQLAlchemy >= 1.1, < 1.3",
    "Mako >= 0.9.0, < 1.1",
    "Pygments >= 2.0, < 2.3",
    "Whoosh >= 2.5.0, < 2.8",
    "celery >= 3.1, < 4.0", # celery 4 doesn't work
    "Babel >= 1.3, < 2.7",
    "python-dateutil >= 1.5.0, < 2.8",
    "Markdown >= 2.2.1, < 2.7",
    "docutils >= 0.11, < 0.15",
    "URLObject >= 2.3.4, < 2.5",
    "Routes >= 1.13, < 2",
    "dulwich >= 0.14.1, < 0.20",
    "mercurial >= 4.1.1, < 4.10",
    "decorator >= 3.3.2, < 4.4",
    "Paste >= 2.0.3, < 3.1",
    "bleach >= 3.0, < 3.1",
    "Click >= 7.0, < 8",
]

if sys.version_info < (2, 7):
    requirements.append("importlib == 1.0.1")
    requirements.append("argparse")

if not is_windows:
    requirements.append("bcrypt >= 3.1.0, < 3.2")

dependency_links = [
]

classifiers = [
    'Development Status :: 4 - Beta',
    'Environment :: Web Environment',
    'Framework :: Pylons',
    'Intended Audience :: Developers',
    'License :: OSI Approved :: GNU General Public License (GPL)',
    'Operating System :: OS Independent',
    'Programming Language :: Python',
    'Programming Language :: Python :: 2.6',
    'Programming Language :: Python :: 2.7',
    'Topic :: Software Development :: Version Control',
]


# additional files from project that goes somewhere in the filesystem
# relative to sys.prefix
data_files = []

description = ('Kallithea is a fast and powerful management tool '
               'for Mercurial and Git with a built in push/pull server, '
               'full text search and code-review.')

keywords = ' '.join([
    'kallithea', 'mercurial', 'git', 'code review',
    'repo groups', 'ldap', 'repository management', 'hgweb replacement',
    'hgwebdir', 'gitweb replacement', 'serving hgweb',
])

# long description
README_FILE = 'README.rst'
try:
    long_description = open(README_FILE).read()
except IOError as err:
    sys.stderr.write(
        "[WARNING] Cannot find file specified as long_description (%s)\n"
        % README_FILE
    )
    long_description = description

import setuptools

# monkey patch setuptools to use distutils owner/group functionality
from setuptools.command import sdist
sdist_org = sdist.sdist
class sdist_new(sdist_org):
    def initialize_options(self):
        sdist_org.initialize_options(self)
        self.owner = self.group = 'root'
sdist.sdist = sdist_new

packages = setuptools.find_packages(exclude=['ez_setup'])

setuptools.setup(
    name='Kallithea',
    version=__version__,
    description=description,
    long_description=long_description,
    keywords=keywords,
    license=__license__,
    author=__author__,
    author_email='kallithea@sfconservancy.org',
    dependency_links=dependency_links,
    url=__url__,
    install_requires=requirements,
    classifiers=classifiers,
    data_files=data_files,
    packages=packages,
    include_package_data=True,
    message_extractors={'kallithea': [
            ('**.py', 'python', None),
            ('templates/**.mako', 'mako', {'input_encoding': 'utf-8'}),
            ('templates/**.html', 'mako', {'input_encoding': 'utf-8'}),
            ('public/**', 'ignore', None)]},
    zip_safe=False,
    entry_points="""
    [console_scripts]
    kallithea-api =    kallithea.bin.kallithea_api:main
    kallithea-gist =   kallithea.bin.kallithea_gist:main
    kallithea-config = kallithea.bin.kallithea_config:main
    kallithea-cli =    kallithea.bin.kallithea_cli:cli

    [paste.app_factory]
    main = kallithea.config.middleware:make_app
    """,
)