Changeset - 2182a2005278
[Not reviewed]
default
0 6 0
Marcin Kuzminski - 15 years ago 2011-04-08 00:47:20
marcin@python-works.com
merged some docs, and fixed setup.py platform check
6 files changed with 127 insertions and 113 deletions:
0 comments (0 inline, 0 general)
development.ini
Show inline comments
 
@@ -29,25 +29,26 @@ debug = true
 
threadpool_workers = 5
 

	
 
##max request before thread respawn
 
threadpool_max_requests = 6
 

	
 
##option to use threads of process
 
use_threadpool = false
 
use_threadpool = true
 

	
 
use = egg:Paste#http
 
host = 0.0.0.0
 
port = 5000
 

	
 
[app:main]
 
use = egg:rhodecode
 
full_stack = true
 
static_files = true
 
lang=en
 
cache_dir = %(here)s/data
 
index_dir = %(here)s/data/index
 
app_instance_uuid = develop
 
cut_off_limit = 256000
 
force_https = false
 

	
 
####################################
 
###        CELERY CONFIG        ####
 
####################################
 
@@ -67,22 +68,23 @@ celery.result.serialier = json
 
#celery.send.task.error.emails = true
 
#celery.amqp.task.result.expires = 18000
 

	
 
celeryd.concurrency = 2
 
#celeryd.log.file = celeryd.log
 
celeryd.log.level = debug
 
celeryd.max.tasks.per.child = 3
 
celeryd.max.tasks.per.child = 1
 

	
 
#tasks will never be sent to the queue, but executed locally instead.
 
celery.always.eager = false
 

	
 
####################################
 
###         BEAKER CACHE        ####
 
####################################
 
beaker.cache.data_dir=/%(here)s/data/cache/data
 
beaker.cache.lock_dir=/%(here)s/data/cache/lock
 
beaker.cache.data_dir=%(here)s/data/cache/data
 
beaker.cache.lock_dir=%(here)s/data/cache/lock
 

	
 
beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
 

	
 
beaker.cache.super_short_term.type=memory
 
beaker.cache.super_short_term.expire=10
 

	
 
beaker.cache.short_term.type=memory
 
@@ -135,63 +137,63 @@ logview.pylons.templating = #bfb
 
logview.pylons.util = #eee
 

	
 
#########################################################
 
### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
 
#########################################################
 
sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db
 
#sqlalchemy.db1.echo = False
 
#sqlalchemy.db1.pool_recycle = 3600
 
sqlalchemy.db1.echo = True
 
sqlalchemy.db1.pool_recycle = 3600
 
sqlalchemy.convert_unicode = true
 

	
 
################################
 
### LOGGING CONFIGURATION   ####
 
################################
 
[loggers]
 
keys = root, routes, rhodecode, sqlalchemy,beaker,templates
 

	
 
[handlers]
 
keys = console
 
keys = console, console_sql
 

	
 
[formatters]
 
keys = generic,color_formatter
 
keys = generic, color_formatter, color_formatter_sql
 

	
 
#############
 
## LOGGERS ##
 
#############
 
[logger_root]
 
level = NOTSET
 
handlers = console
 

	
 
[logger_routes]
 
level = DEBUG
 
handlers = console
 
handlers = 
 
qualname = routes.middleware
 
# "level = DEBUG" logs the route matched and routing variables.
 
propagate = 0
 
propagate = 1
 

	
 
[logger_beaker]
 
level = ERROR
 
handlers = console
 
level = DEBUG
 
handlers = 
 
qualname = beaker.container
 
propagate = 0
 
propagate = 1
 

	
 
[logger_templates]
 
level = INFO
 
handlers = console
 
handlers = 
 
qualname = pylons.templating
 
propagate = 0
 
propagate = 1
 

	
 
[logger_rhodecode]
 
level = DEBUG
 
handlers = console
 
handlers = 
 
qualname = rhodecode
 
propagate = 0
 
propagate = 1
 

	
 
[logger_sqlalchemy]
 
level = ERROR
 
handlers = console
 
level = INFO
 
handlers = console_sql
 
qualname = sqlalchemy.engine
 
propagate = 0
 

	
 
##############
 
## HANDLERS ##
 
##############
 
@@ -199,18 +201,29 @@ propagate = 0
 
[handler_console]
 
class = StreamHandler
 
args = (sys.stderr,)
 
level = NOTSET
 
formatter = color_formatter
 

	
 
[handler_console_sql]
 
class = StreamHandler
 
args = (sys.stderr,)
 
level = NOTSET
 
formatter = color_formatter_sql
 

	
 
################
 
## FORMATTERS ##
 
################
 

	
 
[formatter_generic]
 
format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 
datefmt = %Y-%m-%d %H:%M:%S
 

	
 
[formatter_color_formatter]
 
class=rhodecode.lib.colored_formatter.ColorFormatter
 
format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 
datefmt = %Y-%m-%d %H:%M:%S
 

	
 
[formatter_color_formatter_sql]
 
class=rhodecode.lib.colored_formatter.ColorFormatterSql
 
format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 
datefmt = %Y-%m-%d %H:%M:%S
 
\ No newline at end of file
docs/index.rst
Show inline comments
 
@@ -50,8 +50,7 @@ Other topics
 
.. _mercurial: http://mercurial.selenic.com/
 
.. _bitbucket: http://bitbucket.org/
 
.. _subversion: http://subversion.tigris.org/
 
.. _git: http://git-scm.com/
 
.. _celery: http://celeryproject.org/
 
.. _Sphinx: http://sphinx.pocoo.org/
 
.. _GPL: http://www.gnu.org/licenses/gpl.html
 
.. _vcs: http://pypi.python.org/pypi/vcs
 
.. _vcs: http://pypi.python.org/pypi/vcs
 
\ No newline at end of file
docs/setup.rst
Show inline comments
 
@@ -304,18 +304,17 @@ Additional tutorial
 
http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons
 

	
 

	
 
Apache as subdirectory
 
----------------------
 

	
 

	
 
Apache subdirectory part::
 

	
 
    <Location /rhodecode>
 
      ProxyPass http://127.0.0.1:59542/rhodecode
 
      ProxyPassReverse http://127.0.0.1:59542/rhodecode
 
    <Location /<someprefix> >
 
      ProxyPass http://127.0.0.1:5000/<someprefix>
 
      ProxyPassReverse http://127.0.0.1:5000/<someprefix>
 
      SetEnvIf X-Url-Scheme https HTTPS=1
 
    </Location> 
 

	
 
Besides the regular apache setup you will need to add the following to your .ini file::
 

	
 
    filter-with = proxy-prefix
 
@@ -324,12 +323,14 @@ Add the following at the end of the .ini
 

	
 
    [filter:proxy-prefix]
 
    use = egg:PasteDeploy#prefix
 
    prefix = /<someprefix> 
 

	
 

	
 
then change <someprefix> into your choosen prefix
 

	
 
Apache's example FCGI config
 
----------------------------
 

	
 
TODO !
 

	
 
Other configuration files
ez_setup.py
Show inline comments
 
@@ -12,13 +12,14 @@ mirror, or use an alternate download dir
 
the appropriate options to ``use_setuptools()``.
 

	
 
This file can also be run as a script to install or upgrade setuptools.
 
"""
 
import sys
 
DEFAULT_VERSION = "0.6c9"
 
DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
 
DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" \
 
    % sys.version[:3]
 

	
 
md5_data = {
 
    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
 
    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
 
    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
 
    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
 
@@ -51,80 +52,87 @@ md5_data = {
 
    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
 
    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
 
    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
 
    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
 
}
 

	
 
import sys, os
 
try: from hashlib import md5
 
except ImportError: from md5 import md5
 
import os
 

	
 
try:
 
    from hashlib import md5
 
except ImportError:
 
    from md5 import md5
 

	
 

	
 
def _validate_md5(egg_name, data):
 
    if egg_name in md5_data:
 
        digest = md5(data).hexdigest()
 
        if digest != md5_data[egg_name]:
 
            print >>sys.stderr, (
 
                "md5 validation of %s failed!  (Possible download problem?)"
 
                % egg_name
 
            )
 
                % egg_name)
 
            sys.exit(2)
 
    return data
 

	
 
def use_setuptools(
 
    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
 
    download_delay=15
 
):
 

	
 
def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
 
                   to_dir=os.curdir, download_delay=15):
 
    """Automatically find/download setuptools and make it available on sys.path
 

	
 
    `version` should be a valid setuptools version number that is available
 
    as an egg for download under the `download_base` URL (which should end with
 
    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
 
    it is not already available.  If `download_delay` is specified, it should
 
    be the number of seconds that will be paused before initiating a download,
 
    should one be required.  If an older version of setuptools is installed,
 
    this routine will print a message to ``sys.stderr`` and raise SystemExit in
 
    an attempt to abort the calling script.
 
    """
 
    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
 
    was_imported = 'pkg_resources' in sys.modules or ('setuptools' in
 
                                                      sys.modules)
 

	
 
    def do_download():
 
        egg = download_setuptools(version, download_base, to_dir, download_delay)
 
        egg = download_setuptools(version, download_base, to_dir,
 
                                  download_delay)
 
        sys.path.insert(0, egg)
 
        import setuptools; setuptools.bootstrap_install_from = egg
 
        import setuptools
 
        setuptools.bootstrap_install_from = egg
 
    try:
 
        import pkg_resources
 
    except ImportError:
 
        return do_download()       
 
    try:
 
        pkg_resources.require("setuptools>="+version); return
 
        pkg_resources.require("setuptools>=" + version)
 
        return
 
    except pkg_resources.VersionConflict, e:
 
        if was_imported:
 
            print >>sys.stderr, (
 
            "The required version of setuptools (>=%s) is not available, and\n"
 
            "can't be installed while this script is running. Please install\n"
 
            " a more recent version first, using 'easy_install -U setuptools'."
 
            "\n\n(Currently using %r)"
 
            ) % (version, e.args[0])
 
            "\n\n(Currently using %r)") % (version, e.args[0])
 
            sys.exit(2)
 
        else:
 
            del pkg_resources, sys.modules['pkg_resources']    # reload ok
 
            return do_download()
 
    except pkg_resources.DistributionNotFound:
 
        return do_download()
 

	
 
def download_setuptools(
 
    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
 
    delay = 15
 
):
 

	
 
def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
 
                        to_dir=os.curdir, delay=15):
 
    """Download setuptools from a specified location and return its filename
 

	
 
    `version` should be a valid setuptools version number that is available
 
    as an egg for download under the `download_base` URL (which should end
 
    with a '/'). `to_dir` is the directory where the egg will be downloaded.
 
    `delay` is the number of seconds to pause before an actual download attempt.
 
    `delay` is the number of seconds to pause before an actual download
 
    attempt.
 
    """
 
    import urllib2, shutil
 
    import urllib2
 

	
 
    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
 
    url = download_base + egg_name
 
    saveto = os.path.join(to_dir, egg_name)
 
    src = dst = None
 
    if not os.path.exists(saveto):  # Avoid repeated downloads
 
        try:
 
@@ -141,60 +149,30 @@ I will start the download in %d seconds.
 
(Note: if this machine does not have network access, please obtain the file
 

	
 
   %s
 

	
 
and place it in this directory before rerunning this script.)
 
---------------------------------------------------------------------------""",
 
                    version, download_base, delay, url
 
                ); from time import sleep; sleep(delay)
 
                    version, download_base, delay, url)
 
                from time import sleep
 
                sleep(delay)
 
            log.warn("Downloading %s", url)
 
            src = urllib2.urlopen(url)
 
            # Read/write all in one block, so we don't create a corrupt file
 
            # if the download is interrupted.
 
            data = _validate_md5(egg_name, src.read())
 
            dst = open(saveto,"wb"); dst.write(data)
 
            dst = open(saveto, "wb")
 
            dst.write(data)
 
        finally:
 
            if src: src.close()
 
            if dst: dst.close()
 
            if src:
 
                src.close()
 
            if dst:
 
                dst.close()
 
    return os.path.realpath(saveto)
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 

	
 
def main(argv, version=DEFAULT_VERSION):
 
    """Install or upgrade setuptools and EasyInstall"""
 
    try:
 
        import setuptools
 
    except ImportError:
 
        egg = None
 
@@ -207,14 +185,14 @@ def main(argv, version=DEFAULT_VERSION):
 
            if egg and os.path.exists(egg):
 
                os.unlink(egg)
 
    else:
 
        if setuptools.__version__ == '0.0.1':
 
            print >>sys.stderr, (
 
            "You have an obsolete version of setuptools installed.  Please\n"
 
            "remove it from your system entirely before rerunning this script."
 
            )
 
            "remove it from your system entirely before rerunning"
 
            " this script.")
 
            sys.exit(2)
 

	
 
    req = "setuptools>="+version
 
    import pkg_resources
 
    try:
 
        pkg_resources.require(req)
 
@@ -227,15 +205,17 @@ def main(argv, version=DEFAULT_VERSION):
 
        sys.exit(0) # try to force an exit
 
    else:
 
        if argv:
 
            from setuptools.command.easy_install import main
 
            main(argv)
 
        else:
 
            print "Setuptools version",version,"or greater has been installed."
 
            print "Setuptools version", version, ("or greater has "
 
                                                  "been installed.")
 
            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
 

	
 

	
 
def update_md5(filenames):
 
    """Update our built-in md5 registry"""
 

	
 
    import re
 

	
 
    for name in filenames:
 
@@ -247,13 +227,15 @@ def update_md5(filenames):
 
    data = ["    %r: %r,\n" % it for it in md5_data.items()]
 
    data.sort()
 
    repl = "".join(data)
 

	
 
    import inspect
 
    srcfile = inspect.getsourcefile(sys.modules[__name__])
 
    f = open(srcfile, 'rb'); src = f.read(); f.close()
 
    f = open(srcfile, 'rb')
 
    src = f.read()
 
    f.close()
 

	
 
    match = re.search("\nmd5_data = {\n([^}]+)}", src)
 
    if not match:
 
        print >>sys.stderr, "Internal error!"
 
        sys.exit(2)
 

	
 
@@ -265,12 +247,6 @@ def update_md5(filenames):
 

	
 
if __name__=='__main__':
 
    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
 
        update_md5(sys.argv[2:])
 
    else:
 
        main(sys.argv[1:])
 

	
 

	
 

	
 

	
 

	
 

	
production.ini
Show inline comments
 
################################################################################
 
################################################################################
 
# rhodecode - Pylons environment configuration                                 #
 
# RhodeCode - Pylons environment configuration                                 #
 
#                                                                              # 
 
# The %(here)s variable will be replaced with the parent directory of this file#
 
################################################################################
 

	
 
[DEFAULT]
 
debug = true
 
################################################################################
 
## Uncomment and replace with the address which should receive                ## 
 
## any error reports after application crash                                  ##
 
## Additionally those settings will be used by rhodecode mailing system       ##
 
## Additionally those settings will be used by RhodeCode mailing system       ##
 
################################################################################
 
#email_to = admin@localhost
 
#error_email_from = paste_error@localhost
 
#app_email_from = rhodecode-noreply@localhost
 
#error_message =
 

	
 
@@ -75,14 +75,15 @@ celeryd.max.tasks.per.child = 3
 
#tasks will never be sent to the queue, but executed locally instead.
 
celery.always.eager = false
 

	
 
####################################
 
###         BEAKER CACHE        ####
 
####################################
 
beaker.cache.data_dir=/%(here)s/data/cache/data
 
beaker.cache.lock_dir=/%(here)s/data/cache/lock
 
beaker.cache.data_dir=%(here)s/data/cache/data
 
beaker.cache.lock_dir=%(here)s/data/cache/lock
 

	
 
beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long
 

	
 
beaker.cache.super_short_term.type=memory
 
beaker.cache.super_short_term.expire=10
 

	
 
beaker.cache.short_term.type=memory
 
@@ -144,62 +145,85 @@ sqlalchemy.db1.url = sqlite:///%(here)s/
 
sqlalchemy.convert_unicode = true
 

	
 
################################
 
### LOGGING CONFIGURATION   ####
 
################################
 
[loggers]
 
keys = root, routes, rhodecode, sqlalchemy
 
keys = root, routes, rhodecode, sqlalchemy, beaker, templates
 

	
 
[handlers]
 
keys = console
 
keys = console, console_sql
 

	
 
[formatters]
 
keys = generic,color_formatter
 
keys = generic, color_formatter, color_formatter_sql
 

	
 
#############
 
## LOGGERS ##
 
#############
 
[logger_root]
 
level = INFO
 
level = NOTSET
 
handlers = console
 

	
 
[logger_routes]
 
level = INFO
 
handlers = console
 
level = DEBUG
 
handlers = 
 
qualname = routes.middleware
 
# "level = DEBUG" logs the route matched and routing variables.
 
propagate = 0
 
propagate = 1
 

	
 
[logger_beaker]
 
level = DEBUG
 
handlers = 
 
qualname = beaker.container
 
propagate = 1
 

	
 
[logger_templates]
 
level = INFO
 
handlers = 
 
qualname = pylons.templating
 
propagate = 1
 

	
 
[logger_rhodecode]
 
level = DEBUG
 
handlers = console
 
handlers = 
 
qualname = rhodecode
 
propagate = 0
 
propagate = 1
 

	
 
[logger_sqlalchemy]
 
level = ERROR
 
handlers = console
 
level = INFO
 
handlers = console_sql
 
qualname = sqlalchemy.engine
 
propagate = 0
 

	
 
##############
 
## HANDLERS ##
 
##############
 

	
 
[handler_console]
 
class = StreamHandler
 
args = (sys.stderr,)
 
level = NOTSET
 
level = INFO
 
formatter = color_formatter
 

	
 
[handler_console_sql]
 
class = StreamHandler
 
args = (sys.stderr,)
 
level = WARN
 
formatter = color_formatter_sql
 

	
 
################
 
## FORMATTERS ##
 
################
 

	
 
[formatter_generic]
 
format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 
datefmt = %Y-%m-%d %H:%M:%S
 

	
 
[formatter_color_formatter]
 
class=rhodecode.lib.colored_formatter.ColorFormatter
 
format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 
datefmt = %Y-%m-%d %H:%M:%S
 

	
 
[formatter_color_formatter_sql]
 
class=rhodecode.lib.colored_formatter.ColorFormatterSql
 
format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
 
datefmt = %Y-%m-%d %H:%M:%S
 
\ No newline at end of file
setup.py
Show inline comments
 
import sys
 
from rhodecode import get_version
 
from rhodecode import __platform__
 
from rhodecode import __license__
 
from rhodecode import PLATFORM_OTHERS
 

	
 
py_version = sys.version_info
 

	
 
if py_version < (2, 5):
 
    raise Exception('RhodeCode requires python 2.5 or later')
 

	
 
@@ -33,13 +34,13 @@ classifiers = ['Development Status :: 5 
 
               'Programming Language :: Python :: 2.7', ]
 

	
 
if py_version < (2, 6):
 
    requirements.append("simplejson")
 
    requirements.append("pysqlite")
 

	
 
if __platform__ in ('Linux', 'Darwin'):
 
if __platform__ in PLATFORM_OTHERS:
 
    requirements.append("py-bcrypt")
 

	
 

	
 
#additional files from project that goes somewhere in the filesystem
 
#relative to sys.prefix
 
data_files = []
0 comments (0 inline, 0 general)