Zine

open source content publishing system


Changeset 1375:01b77c91b28e


Ignore:
Timestamp:
06/18/10 19:48:01 (2 years ago)
Author:
mitsuhiko
Branch:
default
Parents:
1374:9dd8173575da (diff), 1346:86dc84e7c111 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merged

Files:
9 edited

Legend:

Unmodified
Added
Removed
  • INSTALL

    r1370 r1375  
    55installed: 
    66 
    7 - Python 2.5 or higher 
    8 - Werkzeug 0.5.1* 
     7- Python* 2.4 or higher 
     8- Werkzeug* 0.6 or higher 
    99- Jinja2* 
    1010- A database (MySQL, SQLite or PostgreSQL and others are supported) 
    11 - SQLAlchemy 0.5 [revision>=5491] or higher* 
     11- SQLAlchemy* 0.6 or higher 
     12- sqlalchemy-migrate* 0.6 or higher 
    1213- simplejson* [included in Python 2.6 and higher] 
    1314- html5lib* 
     
    2122If you might use easy_install:: 
    2223 
    23     $ easy_install Werkzeug Jinja2 MySQL-python SQLAlchemy simplejson pytz Babel lxml html5lib 
     24    $ easy_install Werkzeug Jinja2 MySQL-python SQLAlchemy simplejson \ 
     25      pytz Babel lxml html5lib sqlalchemy-migrate 
    2426 
    2527To install lxml you may need the development packages of libxml2 and libxslt 
  • scripts/_make-setup-virtualenv.py

    r1343 r1375  
    2929] 
    3030 
    31 # for python 2.4/2.5 we want simplejson installed too. 
     31# for python 2.5 we want simplejson installed too. 
    3232if sys.version_info < (2, 6): 
    3333    REQUIREMENTS.append('simplejson') 
  • scripts/_make-setup-virtualenv.py

    r1370 r1375  
    2121# requirements without lxml, because lxml is special for OS X 
    2222REQUIREMENTS = [ 
    23     'Werkzeug>=0.4', 
     23    'Werkzeug>=0.6', 
    2424    'Jinja2>=2.1', 
    25     'SQLAlchemy==dev', 
     25    'SQLAlchemy>=0.6', 
    2626    'pytz', 
    27     'Babel>=0.9.4' 
     27    'Babel>=0.9.4', 
     28    'sqlalchemy-migrate>=0.6' 
    2829] 
    2930 
     
    3940    print 'It appears that you are using OS X.  If an installation error' 
    4041    print 'occurs on installing lxml, please make sure you have port' 
    41     print 'installed. 
     42    print 'installed.' 
    4243    print '=' * 60 
    4344 
  • scripts/setup-virtualenv

    r1343 r1375  
    1717    import subprocess 
    1818except ImportError, e: 
    19     if sys.version_info <= (2, 3): 
     19    if sys.version_info <= (2, 4): 
    2020        print 'ERROR: %s' % e 
    21         print 'ERROR: this script requires Python 2.4 or greater; or at least the subprocess module.' 
     21        print 'ERROR: this script requires Python 2.5 or greater; or at least the subprocess module.' 
    2222        print 'If you copy subprocess.py from a newer version of Python this script will probably work' 
    2323        sys.exit(101) 
  • scripts/setup-virtualenv

    r1370 r1375  
    55""" 
    66 
     7virtualenv_version = "1.4.6" 
     8 
    79import sys 
    810import os 
    911import optparse 
     12import re 
    1013import shutil 
    1114import logging 
     
    2528except NameError: 
    2629    from sets import Set as set 
    27      
     30 
    2831join = os.path.join 
    2932py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1]) 
     
    3134expected_exe = is_jython and 'jython' or 'python' 
    3235 
    33 REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'ntpath', 'genericpath', 
     36REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath', 
    3437                    'fnmatch', 'locale', 'encodings', 'codecs', 
    3538                    'stat', 'UserDict', 'readline', 'copy_reg', 'types', 
     
    3740                    'lib-dynload', 'config', 'zlib'] 
    3841 
    39 if sys.version_info[:2] == (2, 6): 
     42if sys.version_info[:2] >= (2, 6): 
    4043    REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) 
    4144if sys.version_info[:2] <= (2, 3): 
     
    246249        logger.info('Changed mode of %s to %s', fn, oct(newmode)) 
    247250 
    248 def install_setuptools(py_executable, unzip=False): 
    249     setup_fn = 'setuptools-0.6c9-py%s.egg' % sys.version[:3] 
    250     search_dirs = ['.', os.path.dirname(__file__), join(os.path.dirname(__file__), 'support-files')] 
     251def _find_file(filename, dirs): 
     252    for dir in dirs: 
     253        if os.path.exists(join(dir, filename)): 
     254            return join(dir, filename) 
     255    return filename 
     256 
     257def _install_req(py_executable, unzip=False, distribute=False): 
     258    if not distribute: 
     259        setup_fn = 'setuptools-0.6c11-py%s.egg' % sys.version[:3] 
     260        project_name = 'setuptools' 
     261        bootstrap_script = EZ_SETUP_PY 
     262        source = None 
     263    else: 
     264        setup_fn = None 
     265        source = 'distribute-0.6.8.tar.gz' 
     266        project_name = 'distribute' 
     267        bootstrap_script = DISTRIBUTE_SETUP_PY 
     268        try: 
     269            # check if the global Python has distribute installed or plain 
     270            # setuptools 
     271            import pkg_resources 
     272            if not hasattr(pkg_resources, '_distribute'): 
     273                location = os.path.dirname(pkg_resources.__file__) 
     274                logger.notify("A globally installed setuptools was found (in %s)" % location) 
     275                logger.notify("Use the --no-site-packages option to use distribute in " 
     276                              "the virtualenv.") 
     277        except ImportError: 
     278            pass 
     279 
     280    search_dirs = file_search_dirs() 
     281 
     282    if setup_fn is not None: 
     283        setup_fn = _find_file(setup_fn, search_dirs) 
     284 
     285    if source is not None: 
     286        source = _find_file(source, search_dirs) 
     287 
     288    if is_jython and os._name == 'nt': 
     289        # Jython's .bat sys.executable can't handle a command line 
     290        # argument with newlines 
     291        import tempfile 
     292        fd, ez_setup = tempfile.mkstemp('.py') 
     293        os.write(fd, bootstrap_script) 
     294        os.close(fd) 
     295        cmd = [py_executable, ez_setup] 
     296    else: 
     297        cmd = [py_executable, '-c', bootstrap_script] 
     298    if unzip: 
     299        cmd.append('--always-unzip') 
     300    env = {} 
     301    if logger.stdout_level_matches(logger.DEBUG): 
     302        cmd.append('-v') 
     303 
     304    old_chdir = os.getcwd() 
     305    if setup_fn is not None and os.path.exists(setup_fn): 
     306        logger.info('Using existing %s egg: %s' % (project_name, setup_fn)) 
     307        cmd.append(setup_fn) 
     308        if os.environ.get('PYTHONPATH'): 
     309            env['PYTHONPATH'] = setup_fn + os.path.pathsep + os.environ['PYTHONPATH'] 
     310        else: 
     311            env['PYTHONPATH'] = setup_fn 
     312    else: 
     313        # the source is found, let's chdir 
     314        if source is not None and os.path.exists(source): 
     315            os.chdir(os.path.dirname(source)) 
     316        else: 
     317            logger.info('No %s egg found; downloading' % project_name) 
     318        cmd.extend(['--always-copy', '-U', project_name]) 
     319    logger.start_progress('Installing %s...' % project_name) 
     320    logger.indent += 2 
     321    cwd = None 
     322    if project_name == 'distribute': 
     323        env['DONT_PATCH_SETUPTOOLS'] = 'true' 
     324 
     325    def _filter_ez_setup(line): 
     326        return filter_ez_setup(line, project_name) 
     327 
     328    if not os.access(os.getcwd(), os.W_OK): 
     329        cwd = '/tmp' 
     330        if source is not None and os.path.exists(source): 
     331            # the current working dir is hostile, let's copy the 
     332            # tarball to /tmp 
     333            target = os.path.join(cwd, os.path.split(source)[-1]) 
     334            shutil.copy(source, target) 
     335    try: 
     336        call_subprocess(cmd, show_stdout=False, 
     337                        filter_stdout=_filter_ez_setup, 
     338                        extra_env=env, 
     339                        cwd=cwd) 
     340    finally: 
     341        logger.indent -= 2 
     342        logger.end_progress() 
     343        if os.getcwd() != old_chdir: 
     344            os.chdir(old_chdir) 
     345        if is_jython and os._name == 'nt': 
     346            os.remove(ez_setup) 
     347 
     348def file_search_dirs(): 
     349    here = os.path.dirname(os.path.abspath(__file__)) 
     350    dirs = ['.', here, 
     351            join(here, 'virtualenv_support')] 
    251352    if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv': 
    252353        # Probably some boot script; just in case virtualenv is installed... 
     
    256357            pass 
    257358        else: 
    258             search_dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'support-files')) 
    259     for dir in search_dirs: 
    260         if os.path.exists(join(dir, setup_fn)): 
    261             setup_fn = join(dir, setup_fn) 
    262             break 
    263     if is_jython and os._name == 'nt': 
    264         # Jython's .bat sys.executable can't handle a command line 
    265         # argument with newlines 
    266         import tempfile 
    267         fd, ez_setup = tempfile.mkstemp('.py') 
    268         os.write(fd, EZ_SETUP_PY) 
    269         os.close(fd) 
    270         cmd = [py_executable, ez_setup] 
    271     else: 
    272         cmd = [py_executable, '-c', EZ_SETUP_PY] 
    273     if unzip: 
    274         cmd.append('--always-unzip') 
    275     env = {} 
    276     if logger.stdout_level_matches(logger.DEBUG): 
    277         cmd.append('-v') 
    278     if os.path.exists(setup_fn): 
    279         logger.info('Using existing Setuptools egg: %s', setup_fn) 
    280         cmd.append(setup_fn) 
    281         if os.environ.get('PYTHONPATH'): 
    282             env['PYTHONPATH'] = setup_fn + os.path.pathsep + os.environ['PYTHONPATH'] 
    283         else: 
    284             env['PYTHONPATH'] = setup_fn 
    285     else: 
    286         logger.info('No Setuptools egg found; downloading') 
    287         cmd.extend(['--always-copy', '-U', 'setuptools']) 
    288     logger.start_progress('Installing setuptools...') 
     359            dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support')) 
     360    return [d for d in dirs if os.path.isdir(d)] 
     361 
     362def install_setuptools(py_executable, unzip=False): 
     363    _install_req(py_executable, unzip) 
     364 
     365def install_distribute(py_executable, unzip=False): 
     366    _install_req(py_executable, unzip, distribute=True) 
     367 
     368_pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I) 
     369def install_pip(py_executable): 
     370    filenames = [] 
     371    for dir in file_search_dirs(): 
     372        filenames.extend([join(dir, fn) for fn in os.listdir(dir) 
     373                          if _pip_re.search(fn)]) 
     374    filenames.sort(key=lambda x: os.path.basename(x).lower()) 
     375    if not filenames: 
     376        filename = 'pip' 
     377    else: 
     378        filename = filenames[-1] 
     379    easy_install_script = 'easy_install' 
     380    if sys.platform == 'win32': 
     381        easy_install_script = 'easy_install-script.py' 
     382    cmd = [py_executable, join(os.path.dirname(py_executable), easy_install_script), filename] 
     383    if filename == 'pip': 
     384        logger.info('Installing pip from network...') 
     385    else: 
     386        logger.info('Installing %s' % os.path.basename(filename)) 
    289387    logger.indent += 2 
    290     cwd = None 
    291     if not os.access(os.getcwd(), os.W_OK): 
    292         cwd = '/tmp' 
     388    def _filter_setup(line): 
     389        return filter_ez_setup(line, 'pip') 
    293390    try: 
    294391        call_subprocess(cmd, show_stdout=False, 
    295                         filter_stdout=filter_ez_setup, 
    296                         extra_env=env, 
    297                         cwd=cwd) 
     392                        filter_stdout=_filter_setup) 
    298393    finally: 
    299394        logger.indent -= 2 
    300         logger.end_progress() 
    301         if is_jython and os._name == 'nt': 
    302             os.remove(ez_setup) 
    303  
    304 def filter_ez_setup(line): 
     395 
     396def filter_ez_setup(line, project_name='setuptools'): 
    305397    if not line.strip(): 
     398        return Logger.DEBUG 
     399    if project_name == 'distribute': 
     400        for prefix in ('Extracting', 'Now working', 'Installing', 'Before', 
     401                       'Scanning', 'Setuptools', 'Egg', 'Already', 
     402                       'running', 'writing', 'reading', 'installing', 
     403                       'creating', 'copying', 'byte-compiling', 'removing', 
     404                       'Processing'): 
     405            if line.startswith(prefix): 
     406                return Logger.DEBUG 
    306407        return Logger.DEBUG 
    307408    for prefix in ['Reading ', 'Best match', 'Processing setuptools', 
     
    314415def main(): 
    315416    parser = optparse.OptionParser( 
    316         version="1.3.2", 
     417        version=virtualenv_version, 
    317418        usage="%prog [OPTIONS] DEST_DIR") 
    318419 
     
    356457        dest='unzip_setuptools', 
    357458        action='store_true', 
    358         help="Unzip Setuptools when installing it") 
     459        help="Unzip Setuptools or Distribute when installing it") 
    359460 
    360461    parser.add_option( 
     
    364465        help='Make an EXISTING virtualenv environment relocatable.  ' 
    365466        'This fixes up scripts and makes all .pth files relative') 
     467 
     468    parser.add_option( 
     469        '--distribute', 
     470        dest='use_distribute', 
     471        action='store_true', 
     472        help='Use Distribute instead of Setuptools. Set environ variable' 
     473        'VIRTUALENV_USE_DISTRIBUTE to make it the default ') 
    366474 
    367475    if 'extend_parser' in globals(): 
     
    420528 
    421529    create_environment(home_dir, site_packages=not options.no_site_packages, clear=options.clear, 
    422                        unzip_setuptools=options.unzip_setuptools) 
     530                       unzip_setuptools=options.unzip_setuptools, 
     531                       use_distribute=options.use_distribute) 
    423532    if 'after_install' in globals(): 
    424533        after_install(options, home_dir) 
     
    489598 
    490599def create_environment(home_dir, site_packages=True, clear=False, 
    491                        unzip_setuptools=False): 
     600                       unzip_setuptools=False, use_distribute=False): 
    492601    """ 
    493602    Creates a new environment in ``home_dir``. 
     
    499608    first be cleared. 
    500609    """ 
     610    home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) 
     611 
     612    py_executable = os.path.abspath(install_python( 
     613        home_dir, lib_dir, inc_dir, bin_dir, 
     614        site_packages=site_packages, clear=clear)) 
     615 
     616    install_distutils(lib_dir, home_dir) 
     617 
     618    if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'): 
     619        install_distribute(py_executable, unzip=unzip_setuptools) 
     620    else: 
     621        install_setuptools(py_executable, unzip=unzip_setuptools) 
     622 
     623    install_pip(py_executable) 
     624 
     625    install_activate(home_dir, bin_dir) 
     626 
     627def path_locations(home_dir): 
     628    """Return the path locations for the environment (where libraries are, 
     629    where scripts go, etc)""" 
    501630    # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its 
    502631    # prefix arg is broken: http://bugs.python.org/issue3386 
    503632    if sys.platform == 'win32': 
     633        # Windows has lots of problems with executables with spaces in 
     634        # the name; this function will remove them (using the ~1 
     635        # format): 
     636        mkdir(home_dir) 
     637        if ' ' in home_dir: 
     638            try: 
     639                import win32api 
     640            except ImportError: 
     641                print 'Error: the path "%s" has a space in it' % home_dir 
     642                print 'To handle these kinds of paths, the win32api module must be installed:' 
     643                print '  http://sourceforge.net/projects/pywin32/' 
     644                sys.exit(3) 
     645            home_dir = win32api.GetShortPathName(home_dir) 
    504646        lib_dir = join(home_dir, 'Lib') 
    505647        inc_dir = join(home_dir, 'Include') 
     
    513655        inc_dir = join(home_dir, 'include', py_version) 
    514656        bin_dir = join(home_dir, 'bin') 
    515  
     657    return home_dir, lib_dir, inc_dir, bin_dir 
     658 
     659def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear): 
     660    """Install just the base environment, no distutils patches etc""" 
    516661    if sys.executable.startswith(bin_dir): 
    517662        print 'Please use the *system* python to run this script' 
    518663        return 
    519          
     664 
    520665    if clear: 
    521666        rmtree(lib_dir) 
     
    576721        for fn in os.listdir(exec_dir): 
    577722            copyfile(join(exec_dir, fn), join(lib_dir, fn)) 
    578      
     723 
    579724    if is_jython: 
    580         # Jython has either jython.jar and javalib/ dir, or just 
    581         # jython-complete.jar 
    582         for name in 'jython.jar', 'javalib', 'jython-complete.jar': 
     725        # Jython has either jython-dev.jar and javalib/ dir, or just 
     726        # jython.jar 
     727        for name in 'jython-dev.jar', 'javalib', 'jython.jar': 
    583728            src = join(prefix, name) 
    584729            if os.path.exists(src): 
    585730                copyfile(src, join(home_dir, name)) 
     731        # XXX: registry should always exist after Jython 2.5rc1 
     732        src = join(prefix, 'registry') 
     733        if os.path.exists(src): 
     734            copyfile(src, join(home_dir, 'registry'), symlink=False) 
    586735        copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'), 
    587736                 symlink=False) 
     
    600749        ## FIXME: could I just hard link? 
    601750        executable = sys.executable 
    602         if (sys.platform == 'cygwin' and not os.path.exists(executable) 
    603             and os.path.exists(executable + '.exe')): 
     751        if sys.platform == 'cygwin' and os.path.exists(executable + '.exe'): 
    604752            # Cygwin misreports sys.executable sometimes 
    605753            executable += '.exe' 
     
    608756        shutil.copyfile(executable, py_executable) 
    609757        make_exe(py_executable) 
     758        if sys.platform == 'win32' or sys.platform == 'cygwin': 
     759            pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe') 
     760            if os.path.exists(pythonw): 
     761                logger.info('Also created pythonw.exe') 
     762                shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe')) 
     763 
    610764    if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe: 
    611765        secondary_exe = os.path.join(os.path.dirname(py_executable), 
     
    622776            shutil.copyfile(sys.executable, secondary_exe) 
    623777            make_exe(secondary_exe) 
    624      
     778 
    625779    if 'Python.framework' in prefix: 
    626780        logger.debug('MacOSX Python framework detected') 
    627781 
    628         # Copy the framework's dylib into the virtual  
     782        # Make sure we use the the embedded interpreter inside 
     783        # the framework, even if sys.executable points to 
     784        # the stub executable in ${sys.prefix}/bin 
     785        # See http://groups.google.com/group/python-virtualenv/ 
     786        #                              browse_thread/thread/17cab2f85da75951 
     787        shutil.copy( 
     788                os.path.join( 
     789                    prefix, 'Resources/Python.app/Contents/MacOS/Python'), 
     790                py_executable) 
     791 
     792        # Copy the framework's dylib into the virtual 
    629793        # environment 
    630794        virtual_lib = os.path.join(home_dir, '.Python') 
     
    649813 
    650814        # Some tools depend on pythonX.Y being present 
    651         pth = py_executable + '%s.%s' % ( 
    652                 sys.version_info[0], sys.version_info[1]) 
    653         if os.path.exists(pth): 
    654             os.unlink(pth) 
    655         os.symlink('python', pth) 
     815        py_executable_version = '%s.%s' % ( 
     816            sys.version_info[0], sys.version_info[1]) 
     817        if not py_executable.endswith(py_executable_version): 
     818            # symlinking pythonX.Y > python 
     819            pth = py_executable + '%s.%s' % ( 
     820                    sys.version_info[0], sys.version_info[1]) 
     821            if os.path.exists(pth): 
     822                os.unlink(pth) 
     823            os.symlink('python', pth) 
     824        else: 
     825            # reverse symlinking python -> pythonX.Y (with --python) 
     826            pth = join(bin_dir, 'python') 
     827            if os.path.exists(pth): 
     828                os.unlink(pth) 
     829            os.symlink(os.path.basename(py_executable), pth) 
    656830 
    657831    if sys.platform == 'win32' and ' ' in py_executable: 
     
    674848        logger.fatal( 
    675849            'ERROR: virtualenv is not compatible with this system or executable') 
     850        if sys.platform == 'win32': 
     851            logger.fatal( 
     852                'Note: some Windows users have reported this error when they installed Python for "Only this user".  The problem may be resolvable if you install Python "For all users".  (See https://bugs.launchpad.net/virtualenv/+bug/352844)') 
    676853        sys.exit(100) 
    677854    else: 
     
    682859        logger.notify('Please make sure you remove any previous custom paths from ' 
    683860                      'your %s file.' % pydistutils) 
    684  
    685     install_distutils(lib_dir, home_dir) 
    686  
    687     install_setuptools(py_executable, unzip=unzip_setuptools) 
    688  
    689     install_activate(home_dir, bin_dir) 
     861    ## FIXME: really this should be calculated earlier 
     862    return py_executable 
    690863 
    691864def install_activate(home_dir, bin_dir): 
     
    721894    symlink so lib64 points to lib 
    722895    """ 
    723     if [p for p in distutils.sysconfig.get_config_vars().values()  
     896    if [p for p in distutils.sysconfig.get_config_vars().values() 
    724897        if isinstance(p, basestring) and 'lib64' in p]: 
    725898        logger.debug('This system uses lib64; symlinking lib64 to lib') 
     
    751924def make_environment_relocatable(home_dir): 
    752925    """ 
    753     Makes the already-existing environment use relative paths, and takes out  
     926    Makes the already-existing environment use relative paths, and takes out 
    754927    the #!-based environment selection in scripts. 
    755928    """ 
     
    775948    for filename in os.listdir(bin_dir): 
    776949        filename = os.path.join(bin_dir, filename) 
     950        if not os.path.isfile(filename): 
     951            # ignore subdirs, e.g. .svn ones. 
     952            continue 
    777953        f = open(filename, 'rb') 
    778954        lines = f.readlines() 
     
    781957            logger.warn('Script %s is an empty file' % filename) 
    782958            continue 
    783         if lines[0].strip() != shebang: 
     959        if not lines[0].strip().startswith(shebang): 
    784960            if os.path.basename(filename) in OK_ABS_SCRIPTS: 
    785961                logger.debug('Cannot make script %s relative' % filename) 
     
    796972        f.close() 
    797973 
    798 def fixup_pth_and_egg_link(home_dir): 
     974def fixup_pth_and_egg_link(home_dir, sys_path=None): 
    799975    """Makes .pth and .egg-link files use relative paths""" 
    800976    home_dir = os.path.normcase(os.path.abspath(home_dir)) 
    801     for path in sys.path: 
     977    if sys_path is None: 
     978        sys_path = sys.path 
     979    for path in sys_path: 
    802980        if not path: 
    803981            path = '.' 
     
    8901068        return './' 
    8911069    return os.path.sep.join(full_parts) 
    892                  
     1070 
    8931071 
    8941072 
     
    9531131from subprocess import call 
    9541132 
     1133# requirements without lxml, because lxml is special for OS X 
    9551134REQUIREMENTS = [ 
    956     'Werkzeug>=0.4', 
     1135    'Werkzeug>=0.6', 
    9571136    'Jinja2>=2.1', 
    958     'SQLAlchemy==dev', 
     1137    'SQLAlchemy>=0.6', 
    9591138    'pytz', 
    960     'Babel>=0.9.4' 
     1139    'Babel>=0.9.4', 
     1140    'sqlalchemy-migrate>=0.6' 
    9611141] 
    9621142 
     
    9671147# os x has some problems with lxml, make sure the user has port installed 
    9681148# so that we can compile lxml 
     1149lxml_static_deps=False 
    9691150if sys.platform == 'darwin': 
    9701151    print '=' * 60 
    9711152    print 'It appears that you are using OS X.  If an installation error' 
    9721153    print 'occurs on installing lxml, please make sure you have port' 
    973     print 'installed and execute the following command:' 
    974     print 
    975     print '    $ port install libxml2 libxslt' 
     1154    print 'installed.' 
    9761155    print '=' * 60 
     1156 
     1157    # no idea if that actually helps, but let's hope it does :D 
    9771158    _dyld_path = os.environ.get('DYLD_LIBRARY_PATH', '') 
    9781159    if _dyld_path: 
     
    9801161    _dyld_path += '/opt/local/lib' 
    9811162    os.environ['DYLD_LIBRARY_PATH']= _dyld_path 
     1163    lxml_static_deps = True 
    9821164 
    9831165def install(home_dir, *args, **kw): 
     
    9961178    for requirement in REQUIREMENTS: 
    9971179        install(home_dir, requirement) 
    998     install(home_dir, 'lxml>=2.0', static_deps=True) 
     1180    install(home_dir, 'lxml>=2.0', static_deps=lxml_static_deps) 
    9991181    call(['ln', '-s', '../zine', os.path.join(site_packages, 'zine')]) 
    10001182 
     
    10021184##file site.py 
    10031185SITE_PY = """ 
    1004 eJy1PP1z2zaWv/OvwNKToZTKdJJ2OztO3Zt8uFvvuEm2Tmdz63p0FAlJrCmSJUjL2pu7v/3eBwCC 
    1005 H7Ll3T1NJpYI4OHh4X3jgb7vvylLmSdiUyRNJoWSURWvRRnVayWWRSXqdVolx2VU1Tt4Gt9GK6lE 
    1006 XQi1UyH2Cj3v+b/48Z6Lz+tUGRTgW9TUxSaq0zjKsp1IN2VR1TIRSVOl+UqkeVqnUZb+A3oUeSie 
    1007 /+sYeBe5gJVnqazEnawUwFWiWIpPu3pd5GLSlLjml+Efo6+nM6HiKi1r6FBpnIEi66j2cikTQBN6 
    1008 NgpImdbyWJUyTpdpbDtuiyZLRJlFsRT/9V+8NOoaBJ4qNnK7lpUUOSADMCXAKhEP+JpWIi4SGQrx 
    1009 VsYRTsDPW2J5DG2Ge6aQjHkhsiJfwZpyGUulomonJoumJkCEskgKwCkFDOo0y7xtUd2qKWwp7ccW 
    1010 HomI2aO7GGYPWCfOP+QcwPFj7v2Sp/czhg3cg+DqNbNNJZfpvYgQLPyU9zKe62eTdCmSdLkEGuT1 
    1011 FLt4jIASWbo4KWk7vtM79P0JYWW5MoI5JKLMnbmRRoTex1wUgGyFlK+BrzdKTDZRmgN7/RTFhMvf 
    1012 0jwptmpKOAN9lfitUbWDsTcZQRl6OyjPBJLX0L/Js/RWZrspEOTzWnqVVE1WIwsnaSXjuqhSqQgA 
    1013 oLYT8j5VACGC/edFMy8ZSZsxOTJVgATgVqBIoIhiI2xpvkxXTUUyIZYp8Brs4w8ffxbvz99evPmg 
    1014 ucIAYylbbQBngEJb4+AEE4iTRlUnWQEiGHqX+EdESYJiscL5Aa+2w8mje+NNYO1l2B/jbBGQ/b1c 
    1015 pFFupoE11iD+NJdH4/4bhszUGujzPw/PBgt/s48qtHD+tl0XIEV5tJFiHSniZeQM7zsN5/uwrNev 
    1016 gRsUwqmBVIo3J0lShAckcWk2KXIpSmCxLM3l1AMKLahvdxeBFT4U+THtdY8TAELl5dDoPJvSjLmE 
    1017 hQ5hvUYJN513tDLdxbP7vCkqEnXg/zwm7ZFF+S3hqIjt+dtCrtI8R4SQF7zgKKCJ1W0KnJiE4pJ6 
    1018 kSSbTiJgfcM9USQa4CVkOuBJeR9tykyCrmzKEsn8iODTZLIWZq8z5jjoWZNCpF1rlzrKe6/CLz2u 
    1019 IzTrdSUBeLPoCN2yKEBYQcsSNmW0mfFs24I4xxuRJxqEPEE9YSx+B4q+UarZSNuIvAKahRjKWxZZ 
    1020 VmyBZKeeJ8QRdjJmtMuc0Apt8D/Axf8zWcdrz3NmsoA1KER+HygEAkpc5pqrNRIdbtOs3Fcyac6a 
    1021 oqgSWdFUhxH7hBE/sDOu1ftQ1NoM8XJxl4tNWqNKWmgjl7KNyoOa9eNrXjcsA2ytIpqZri2dNri8 
    1022 rFxHC2mciIVcoiToTXpttx3m9EbmJOtZC9SPQFFoA7LIlC3IuGJBpbOsJZltgMHCF+Vp2WTUSSGD 
    1023 iQgm2pQEfxOhES60ewPszYbUQ4XEBjcG+wO4/QPEaLtOgT4xQAANg1oKtm+R1hWa9FYfeV0zbcbz 
    1024 /MCpF0ttm3jKZZRm2i5HuXdBD8+risQ3liWOmmliKFhhXqMztsqBjijmvu97nnFgdsp8Ley3+XzR 
    1025 pGjv5nOvrnanwB0Chdxj6OIDLJSm45ZlVWyw2aJ3BfoA9DKO8I7EJ1IUkr3SDjO9Rgq4Wrk0XdH8 
    1026 OhwpUJV4n34+/+Hiy/mVOBPXrVaa9VXSDcx5nkfAmaTUgS9607bqCHqi7kpRfYkfwELTviapotEk 
    1027 gTKqG2A/QP1z1VAzLCPuNHrnH968vTyf/3J1/vP86uLzOSAIpkJ6R7RkAFc34KWpEPgbGCtRoTaR 
    1028 3mAEPXj75so+8BK5BIa7lciWk+fkv02Z7LAK6FVo6/RbkeamnZrJu4EeZyKYz+MsUgob5/PAqnHj 
    1029 UV2ffnND/X6L7qKAgeOnkrC6HKHM8L+RSaMFAZ3AU57UHWI6Adtt4khJ7kULgnHzOcrefD7RqwGm 
    1030 JLYBx4HFKRCmC8pelYJ/RuRHWVyoIsOfCB+5mbgQnXqUdlyadtrDuyhrpDJzUDdAfyVrBDkB0xGY 
    1031 SYIZEXxqOwL9lihA+LQdjh9U52neSPtwE1pUh7RZ6jVXclPcyQSsKu6Rs2zxM7VAkFRmoPNgWSCw 
    1032 pOhZsIxDEGFIwEIPDIFGAXhwQ1AMQQwtjjguk7kC9uQYhxhWB2Cs48qquEvRiix2uhGUIIgQqkJj 
    1033 sTS0At3tDtVR14FiBPcmR0ptZQBCUjXsiRDeCBLVSNKKW0jgLlF+b+jrbV5s8zkHJWcoipOp3Uvk 
    1034 NL2b2KHdgiPxAygnQLIAj70lGkMBX04gsx0D8rB8WC5QlpxGAAQaHM2LKhxYxoenJXI4gNMijOlr 
    1035 QdxcSTQEd2YK8qENMRxI1BraB0ZsEBIszsqwlRXNZGitTDeY2CFJl+suQ44tugB6VAxBmU40NO5k 
    1036 6Hd9CjIuLl0pdcahnv7y5QuzjVpTqIuILXDRaBuWpELDcgfqNgV/1JhaDpyJDSAAzgFMozRriuMr 
    1037 UZRsZmE/OSIHW3YFTt26rsvTk5PtdhvqQK+oVidqefLHP3377Z9esJJIEuIfWI4jLTrrEZ5QG7oq 
    1038 4XdGkX1vdq7Hj2ne5UaCNZFkbsnHQPz+3KRJIU6Pp1ahIBe3yhv/NwYOFMjcTMpUBtr6LUbP1PGz 
    1039 8Gvli2di4vadTNla6ejHKmqIYkghQRuoJBhRF2AfwJrFRZPXgaO+lPgKFDWEXolcNKvATt4xA+YH 
    1040 LBXldGJ54PjlDWLQ5QzDV0orqjlqCWKLNF8WDul/ZraJyGZqDYHkRZ09CIt241rMEDc5XN6tB+II 
    1041 jVlhqpA7UCK6XQ4WQNt5KDn40Q7P513pOjzm0zEExvR5hnm1uzFBwSFccC9mrtQ5XI1+EEjTllUz 
    1042 KBhXNYKCBtdhwdTW4MiKBwgyEOT3URTHG6t7AJ16SRwT+JldgB7uPANr12cFxzVAHjgTL+mJBMfp 
    1043 dND2gre2yTKK1Hs82qEKA+5sNNrpAvhyYgDMhF/94nNPvS0XH3ubwnswAqzg4B4ZbDlgJmwJmUxI 
    1044 pYl/5I+w08Dq7xvNNB4DgZtE/Q8DThif8QSVAmEqJ13G3cfhlrac0OghvN/gEE+ZXSKJVntkq687 
    1045 RmXqQbu0THNUvc4ehXFWgJdolSLxUdve9RXIOcbHY7ZMC6AmQ0sOp9MZOXsd+Qt0P0yLrBoMIN34 
    1046 GjHapIqMG5JpDf+BV0FxKyUZgJYEzYI5VMi6C/s3iJxdr/6yhz0soZEh3K77vJCBwdBwTPuRQDLq 
    1047 KBuEIAcSDmWRPEfWBhlwmLNBHdmGZrlXuAlGqEDMHANCWgZwp8Z2GC4QnoSYiyYBRcj3tZKl+Er4 
    1048 sH19ST1Mdf9budREphOnA3kKOqQ9c8NdJ9Q964W+XYbuBr2UAy8L4OAFeDxuAtdlc8O0NhIHX72r 
    1049 ty1SoJApOPenLqo3hjBukvAPZ06PllhmEsNQnYk6qXoz09Sz261Bw4YbMJ0978+lH7txL46dBIV6 
    1050 JTf3EP4FVariQgVTtKeHxMdWLphLhrSy2F+mCx/+dDbEn950IMmsjx5OmUTVNs05ZtcrPusSc4CO 
    1051 XXzHKp1cUfxzAqhg7unkhwpYmo6NTkAAUHbLEoJupf30IdgHV+pbuDzc7/i516df3wyXPxudwv2M 
    1052 E/P8vq4ihfTMmKzMxkjPocVFNQmLi/KdPkbSB4Po11eFgrBPfLz6IpAQnGHbRrunLb1lUcTm0TV1 
    1053 PgZ10ESPkqu3OmIXQAT1GDLKyT/BmIcj+9TFPbCwJwB5EsM8sCkGkuWT/ljo9e0385GEmgvn228c 
    1054 Zjtkx8Ykc9Jzr+zMdGYqRldohlQyysiAO4PQdoMaux70KaesJSmm0nxwM+LJ4ce0Gz3cwh90HwRj 
    1055 5nNE9IDQtVj8BgGg0jmjuyjNKJkKaBwfoyoysSuH4+P4dCA9jDLmecANeDEbDS/U9QvYmICD5elw 
    1056 OdrZeGMSjCNBnvmUkVI9CVTyYZkz3HMAa+4xCg+YhOHUnG5eGsXOBFbiOe7Ec7GlQyNKhIBdyAFK 
    1057 wjp/BA5aW3308K6pKj5AoA0tZXWMGXU+Lzdanw64h2BOPsgaMbHdYkosOaerxZiMBDpVZFcStFZ+ 
    1058 fG/WhQkwZX6XVjAW2GcS/Pjxp/NguOl6Ghw0Ds7dRyMTh+sehPsELRdo4gRPGcMUesqQf14NBx0O 
    1059 7UuROdQx6RtNtiFhB1kb4/WP78Ej8VvnuKE9KYnXMr6dSzr9QTbFoU4G6x02Iyb2UKh7Cq+iJZUS 
    1060 wErirEFasdH9jIc9TR5TMrOWoLh1iRUe4NKZDgfryyxaiQkNTjBQ1NxIseRdVGkLVlYFFvWIJk1O 
    1061 Vmki5O9NlKETLpdLwAUzzbop5OkpXhTv+ViKS0eUjJsqrXdAgkgVOlFPJ1hOx8WOFzrpIMk5WSYg 
    1062 nmmdiitcNrYz4RJDrvH0JC4SvWQcYE5SkLvoObTnxRxnnVNt1IyRmvbDOH7s9WcoAIAPQGH9/lTH 
    1063 2d0WSU3uaQDtuUtU1JIdUrpxQUGmBaFMphiX8G/62WVEl7f2YLnaj+XqYSxXfSxXo1iuuliuHsbS 
    1064 FQncWBtiGkkYCzP7OcjRI1M3QuRpzqN4zf2wAgcrbQCiKI1zbWSKS8c6cSgn4wkIqW3ndIgetkeg 
    1065 KZf2VAUnrDRI5H7MOGtH3hT9OYPpQFUP5qWYc/V9x8DdsSdhSAf2CxrO8pZEdRR25GKVFQsQW4vu 
    1066 rAUwE/0TYc5s5HfzBediepbK//Sfn3/8+AG7IyjfnEXSMNxENCy4lMnzqFqpoTS1XmUJ7Eg9uwfD 
    1067 NEwDPDowDuZZjvi/9wVWciDjiC0dJxaiBA+ADuZtN/f4Ogh6z/U5t37OTM6Z4TPh57XfLmoPkd58 
    1068 +vT+zec3PgXo/v/6rsAY2nalw8XH9LAdhv6b291SHMeAUOu4tjV+7po6tG454nEba8D2wokXN70H 
    1069 rw4x2KPxR3eV/6+Ugi0BQoU6VfMUQh0cX/5LceWAPoYRB/Ubbh6cnRXb5sie46I4or/PSenk/lg1 
    1070 K1m/Pf/zxYfLi7ef3nz+0XFU0OH4eHXySpz/9EXQkSOqWbbcEZ621Xi4DerPLWMWSQH/Goy2kqbm 
    1071 NAaMen95qbN/GyyLxTop1IwhPOeTcQuNQ0bOk9iH+kgbMcq0G+9UDNMJMFUUo1e/4dpXVehaKipE 
    1072 XqBL1egAQVeCm4pxOioJgUegs0sKBsFVC9BEFW+1iV0qzirrKuoRpLQlsWeNGYXEgxMoJ6dqMnQA 
    1073 7DjZ5VkRJZqD4Uk7WKuj68DFNbgJVZmlEG+8DmxaWA/DE9eWYfRDe2jCeI3JqTMcZtYdedV7sUDd 
    1074 +jrgtenx05bRfm8Aw5bB3sO6c0knjlTrhfUSIsBOnGsM5D18tVuv90DBhmHyuMZNNEyXwuojCAHF 
    1075 OgU3F3hyDTYCvVmA0NuJbsrq1IlhZYEHfsG7TXL810ATpNv7119HutdVdvx3UYKvLvh0Ohghptv5 
    1076 PbjnoQzF+ccfpgEjR7VR4q8NlhKC2aSkgyPldCTOpzLziZLZUh9ZdhUiNmhrRs294ZUsKz183IEL 
    1077 UAKeqQnZtmfK0C/ACgILe4ZLmfZAY5WkxQzvB7hHW+ZzJK7WMst0Yd3F+8tz8HCwcBMliDPD5zAd 
    1078 R/V4LKPrOfj+Qg8UHtpAc4VsXKGjRQd3SdjpNpooQpGj0Z2zPrtPlIwZjhpkXqooVS7aE1w2w3JK 
    1079 F0PkZtgOs7PM3cNuSGe3G9EdJYcZY/6posqoLmcAR9PTiN138OuxONTkvvh8Is1rUwqTpTFoU1C8 
    1080 oFZnICpIYlBgzH9FztmnolKmcBoelrsqXa1rzPDB4JCKNrH7T2++XF58oCrIV1+3HuIIi87Ia53x 
    1081 8eQZ1p5gZA5f3HoS5K35fIxzdRPCQB0Ef/pNfO55xhMMxnESDP/0m7hy/cyJWngFoKaasi8k6Kw6 
    1082 w8akp5UIxtXGbPhxa0tazLpgKG+GhbL6CNFd35Afbc+eQaEchWl8Qup0WWoaTsxgt9ah/9FrXJaY 
    1083 600m452gdUzCzGcBQ28HLfuqKtzPQBaxzBQwGvbuzmHqDgZd9XIcZtvHLRSCaUv7a+7k9Zx+cY6i 
    1084 DEScuIOnLpONq2LdnTmwU583ACa+0+gaSRxV6P6vua/9jA4mltgDn9oMxGIjNgUYdUtdatyAJ4V2 
    1085 ARQIlZVNHMmdTZ+/6qzRsQmPr1HrLrCQP4Ii1EVeVE1bVMCJ8OV3dh+5idBCVXoqAsdfyWVe2AoE 
    1086 /GzX6Fu+7K5xVAYo4YZiV0X5Sk4Y1szA/KpL7D3pQtK2HY65Tnvnq5q7wUO938PgQ7EYz/EbzHp8 
    1087 MOh3K3d9bdSlDnYYLTHuQqiiLWh3CLcnvFd7U9rYXZ8ITQIM5X8P9tDrEfQ0LPS7fh85acAPE8u4 
    1088 l9Ze9eq5A9ug/cq4goCpVpTSd6yw8RBdw9zawLPWCvv2qT5jtr+t733I2X1nHkbJnaWzYl936AWo 
    1089 /l84A0U3QlKqhmyLqXVbIu9kVoCbBBEYFrv+Zotdp+FogP4IXi0qSOBftXse5bfkMb7728VMvPvw 
    1090 M/z/Vn6EGANvHMzE3wEB8a6oINbiWy+4EREWytYcRBWNwmsJBI2Sy3j1i++LfeqsAxPZuoK3W7pr 
    1091 9YXAqqVqwxd8AUVeI90Ea62lqUuF36ZwfuiWGZdpbFd83Yhk2F9OjCW4J7pnuK43GSpOJ23Qbue1 
    1092 f3nx7vzD1XlY3yNfmZ++k1bonqDjivTBXoWHGDNhn8QNPrlxPMgfZVaOOJA6BjOlyRiDiQDc9NLG 
    1093 XXwbNbK+dlRhIC3KXVLEIfYErqJLQKLegkc5dcKtRy1ex9wgrMlUH320bi0+BmqIX/sawIeONEav 
    1094 iUYSQtECy/L5ceiP26SZoHwk/Hl+u03cdKaur6YF9jFtVz3pDrdKaM101vBcZiLUzuxOmGsoWRqp 
    1095 zSJ2b2N8zM19YlAvlJ+Wy6jJaiFziDIo7KWLnaBl3QsULCfMLazb6VYBJS6ybbRTzlF4pISPs/p0 
    1096 Nw0T6ZQyg6j0p+iWdTHe7BANX0MC6IQoxRKFM1Q18ZrlmMODEfVHqm+b5l+/CgZE5kk5Zoxbpw7W 
    1097 iS4UY7SStV4/P5hMr1+2ZpWyibFbZhTEJVgcl1OOQH2Wz58/98V/PO4JMCphVhS34KIA7LEAUVxS 
    1098 8x4brhdnd2vo5ZqWEFgyXstreHBDWU/7vMkpWffAUNoQaf8aGAHuTWD50fTv2UROY1V8QMg9+KBB 
    1099 245f8pTu+WOyRaLK1a9LoKvoCMewJOiGIFJxmgYcuMN+7IoGbz5g4k3zi7wHjk83dMcdWvFkg8PO 
    1100 NXpbVPRkuceicyZ8Auxj5l/PRnepqPYf8Jx/2mk05xd5WrdVuy/cQy99DQ/9WDYpmq9EtEXJMOvo 
    1101 EcO5RNNh1dbbLB5k0Y73XsTXbgqut0pufgx3YG2QtGK5NJjCQ7NJcSGr2BhV3LE0TmsHjOmHcHgw 
    1102 xPvaAIXeCEo+aHgyDImVaNv6B7svLqYf6fzv2Mykyz5q+yYITpdEea/MJQzb+SkxYwlp+dZ8mcIs 
    1103 HyjRq/2BzlziDzrNiCWbneuv7uWRJtfXWvncvb3rCnDoVQpWQVp27OgI540bFj4zrXbs21uwToUp 
    1104 hquE211a1U2UzfXVyzm6bHN7IKrxtJcOHrxOY30WcLALcD2Pdbkl+A6mOgLpiaVYpgAW4nUdrodu 
    1105 IX+35r0s0Nd71dHjmAR+wR6so8Gx51emFPwQlW8Kkge1vC6WM6pFCab9UqpBLzxRCHSl0qBsdZ/H 
    1106 /SQUDGzXNT4UQAYA4A87gsFXvXMip8CKy9z2HQ0MgH77zUNgXaUzWuNH+fiuItJXI9yiu/ZAgGXb 
    1107 +IBrcDNRUhJzmU0LIt/7QalhE2DvKpoT+37JNTQfvuQHFnzAeVuAkx0/U4F2uw2HPEQri99DpGo7 
    1108 ef8UlfSocVqh24fFcuuIW1B8m/LUBkd8GSSnFO7ELaHAT307WkUa4fsZkKDH9W3w0PJ5/ENr1z08 
    1109 u3JzNjNYe7eg26WBHrufX8ZowC6pJsRBdYkWo/m/R3Rn+thwPP2hP0v7bifOghAPatRmmiU3Uex+ 
    1110 xyubx/xqqLbKzSm3dne9t6a9FxMNOw85ecjNfFCHz+0NGzp9TTR7dQ3YA1dGpnZzMDzpoXKwScuL 
    1111 Y65tOe6+m4fN2yCAfMoVFme3x5If+27JQHf7AgP3KnBC73kid5qv8grbrb23hddQuWroL/oGMh5l 
    1112 244EjA7G+WUrBE7TWuZ3aCSUDarxbzvF4M0Khvptl9ELrXaX+ZUAE9t9OuyiecTp0rpaWHTxiKvV 
    1113 LX96oqvVgX+gq6XfVwEspvHRZVKjBVGP+GTUp/OqCM8KD4yZA5EwOdp7r4LZhIlbXgQOU3rvt2++ 
    1114 iPhdQBZ5Iw9Y9jK8Mk0gfuJKC7eqr3ND3cw7KCYZJHhHXhcyXrc6ttyxcj63y75BTxuwT9kMBx7o 
    1115 /XVFeK8N0UVo7plFr0TG00+5nsH8ctLP5pFJBjEXtZke094G55q1B7HLvh11KguGUqhtq36nx564 
    1116 amrrW2gvMSZHjW1DclNSZwO/iF5Q1H9/ImkyLEc2F+KAeWPpvJeBXsnAoOruixor0BERphbZ7s3s 
    1117 K5SoH6cflH03GKYXYxkagnTqgf3h+vxO+US2hwqex3pCv3WAETFqQyfsbJL7mRLXx3Tz4Bhl9Mb+ 
    1118 wj3TtvpvKaaya3t9V5lTIUzjQedlk7npaTtmMIBMAGU7iqVT6gYK4wTo3MqtAsGooloXTC92IgBn 
    1119 V+dgsS6B6Kiv3jvI45Gag72h1QtxvK8u3a3LFuLl/o5Jr/Rbj3jFI9QjI1Rjqn8djwWPxvcVnIvv 
    1120 CTKnywTd1+3YSkzTCrquGMLXu+uXpzbXgvyOze5tUKS9b/UzuIttieeDb4hwRhOvVDM6IsXz+Gkf 
    1121 /I3vsOZS7PfTBvcV9vhyJo/OkPxO+/jxoRnReT2a30fU8t0pLEhMnqkpLcopmtS42yfTwWJblTWE 
    1122 wdWKj8MYaD8AhVDGTTp++FIyqOcX2q1dNPRaHfvaH7zj48gDnQV2eYFHGO+nxa4/nO4YHDScajdt 
    1123 xSd36POe3m8Qa/aSuVcnXttvC/orb3lgj1PAtzXGx788YPzw1NgOf/VQnYHt9fVohTD7flhngKdO 
    1124 PQqZxyFYF1CYE1LTWKJmJByv27VknE6HTPESuSLFEyF0tPCVWeRHk+8315bfGgPv/wBR06QN 
     1186eJzVPGtz2ziS3/krsHSlKGVkOo/ZqS1nPFdO4sx4z5N4J5na3HpSWkqCJI4pkkOQlrVXd7/9+gGA 
     1187AEn5sbP74VSpWCKARqPRbzQYhuFpWcp8ITbFosmkUDKp5mtRJvVaiWVRiXqdVovDMqnqHTydXycr 
     1188qURdCLVTMfaKg+Dp7/wET8WndaoMCvAtaepik9TpPMmynUg3ZVHVciEWTZXmK5HmaZ0mWfoP6FHk 
     1189sXj6+zEIznMBK89SWYkbWSmAq0SxFJe7el3kYtSUuObn8R+Tl+OJUPMqLWvoUGmcgSLrpA5yKReA 
     1190JvRsFJAyreWhKuU8XaZz23FbNNlClFkyl+Lvf+elUdcoClSxkdu1rKTIARmAKQFWiXjA17QS82Ih 
     1191YyFey3mCE/DzllgBQ5vgnikkY16IrMhXsKZczqVSSbUTo1lTEyBCWSwKwCkFDOo0y4JtUV2rMWwp 
     11927ccWHomE2cNfDLMHrBPn73MO4PghD37O09sJwwbuQXD1mtmmksv0ViQIFn7KWzmf6mejdCkW6XIJ 
     1193NMjrMXYJGAElsnR2VNJ2fKt36LsjwspyZQJzSESZO3MjjYiD81okmQK2bUqkkSLM38pZmuRAjfwG 
     1194pgOIQNJgaJ5Fqmo7D61OFACgwn2sQUo2Sow2SZoDs/6YzAntv6b5otiqMVEAdkuJXxtVu+sfDRAA 
     1195ejsEmAS4WWY3mzxLr2W2GwMCnwD7Sqomq1EgFmkl53VRpVIRAEBtJ+QtID0RSSU1CZkzjdxOiP5E 
     1196kzTHjUUBQ4HHRiTJMl01FUmYWKbAucAV7z78JN6evT4/fa95zABjmV1tAGeAQhvt4AQTiKNGVUdZ 
     1197AQIdBxf4RySLBQrZCucHvNoOR/fudDCCtZdxd4yz4UB2vbl6GlhjDcqE5gpo3H/DkIlaA33+5579 
     1198DoLTfVShhfO37boAmcyTjRTrhPkLOSP4VsP5Li7r9SvgBoVwaiCVws1BBFOEByRxaTYqcilKYLEs 
     1199zeU4AArNqK+/i8AK74v8kPa6wwkAoQpyaHSejWnGXMJC+7Beob4wnXe0Mt0lsPu8KSpSHMD/+Zx0 
     1200UZbk14SjIobibzO5SvMcEUJeCKKDiCZW1ylw4iIWF9SL9ILpJCLWXtwTRaIBXkKmA56Ut8mmzOSE 
     1201xRd1691qhCaTtTB7nTHHQc+a1CvtWrvUQd57EX/ucB2hWa8rCcCbmSd0y6KYiBnobMKmTDYsXvW2 
     1202IM4JBuSJBiFPUE8Yi9+BoqdKNRtpG5FXQLMQQwXLIsuKLZDsOAiEOMBOxij7zAmt0Ab/A1z8P5P1 
     1203fB0EzkwWsAaFyO8DhUDAJMhcc7VGwuM2zcpdJZPmrCmKaiErmuphxD5ixB/YGdcavC9qbdR4ubjL 
     1204xSatUSXNtMlM2eLlUc368RWvG5YBllsRzUzXlk4bXF5WrpOZNC7JTC5REvQmvbLbDnMGA3OSLa7F 
     1205hq0MtAFZZMoWZFixoNJZ1pKcAIDBwpfkadlk1Ekhg4kEJtqUBH+ToEkvtLME7M1mOUCFxOZ7DvYH 
     1206cPsHiNF2nQJ95gABNAxqKdi+WVpX6CC0+ijwjb4Zz/MDp54vtW3iKZdJmmkrn+TBOT08qyoS37ks 
     1207cdREE0PBCvMaXbtVDnREMQ/DMAiMO7RT5mthv02nsyZFezedBnW1OwbuECjkAUMX72GhNB23LKti 
     1208g80WvY+gD0Av44jgQFySopDs43rM9Aop4Grl0nRF8+twpEBVElz+dPbu/PPZR3EirlqtNOmqpC8w 
     120951meAGeSUge+6EzbqiPoiborRfUl3oGFpn0Fk0SjSQJlUjfAfoD6p6qhZljG3GsMzt6fvr44m/78 
     12108eyn6cfzT2eAIJgKGRzQktHCNeDzqRj4GxhroWJtIoPeCHrw+vSjfRBMUzX9lV3jExZ27QddHX/9 
     1211RZyciOjX5CaJAvBF2q68Lz8SW37alRKG1vBnVKhxECzkElj4WiKjj56SfznmAUAX6Floe/drkeam 
     1212nZq9KUgORzQCcJhO51miFHaeTiOgFg0Y+MCAmJ1U5N4RDCx37tCxRgU/lQTq5jhkgv8NoJjMaByi 
     1213wSi6Q0wnYPvNPFGSe9HyYdx0irI/nY70hCAUxLbguLA4R8J0QdmvUvAPaftRF8xUkeFPhI/SRFKA 
     1214IQpqG9wkHYLEN0nWSDVyFgVEHI06ZESFlSpiCjD1I7Bo7daNx11qgsuDCGE3IF9WgDaqOpTDzwH4 
     1215DSD2JhjCgIljGKYZYvpn9tgJB3DdIlSbSnWgsJYRl2eX4uWzF4foFkDstrDU8bqjpUvzRtqHS9it 
     1216lawdhHlUNCH+Hrt0WaK+wqfHd8PcxHZn+qyw1FtcyU1xIxeALTKws8viJ2qBCBfWMU9gF0E/kl1l 
     1217PWb8rwTjOV49SAvaYKDehqCY/Tdbf8BBtcwVaAMOUInUOnpmk1JWxU2KRnu2041gc0BjoeUxDkLg 
     1218bJzHZGhawA6BN5kjpbYyAp1UNez4Ed4IErX2otVuMYG7QHX5hb5e58U2n3JEeYKabzS2rIuCpZkX 
     1219O7RbcCDegS0AJAsIkFqiMRRwnQXK1iEgD8uH5QJlyUcHQGAwFYU9DiwTMtESOfrCaRHG+JUg4a0k 
     12202t0bMwWFLIYYDiRqje0DoyUQEizOKjirGjSToayZbjCxQxKf6y5iDuV8AB0qxmC7RhoadzL0uzoG 
     12215SwuXKXkjEOz+PnzZ2YbtaY8BSI2w0WjKV6SxYrLHVi3FHSC8Ww460FssAUnEcA0SrOmOPwoipK9 
     1222GtjPSy3bYIwhSqrr8vjoaLvdxjpKL6rVkVoe/fFP33zzp2esExcL4h9YjiMtOmUVH1Ebeobxt8YC 
     1223fWd2rsOPae5zI8EaSfJuyKVD/L5v0kUhjg/HVn8iF7e2Ev83/gQokKmZlKkMtA1bjJ6owyfxSxWK 
     1224J2Lk9h2N2TnQwaa1YkaDQhuoJBhRF2COwXmYF01eR44iVeIrsG4Q6S7krFlFdnLPRpofsFSU05Hl 
     1225gcPnXxADnzMMXxlTPEUtQWyR5svCIf1PzDYJuShaQyB50UT1otDdsBYzxF08XN6tw+cIjVlhqpA7 
     1226UCL8Lg8WQNu5Lzn40f4l2j3HvzQfzxAYSx8Y5tXe3QgFh3DBvZi4UudwNbqdIE1bVs2gYFzVCAoa 
     1227PLUZU1uDIxsZIUj0bkzQzBurewCdOhk4E2ebXYAe7jw9a9dlBccTQh44Ec/piQQ/9bjX9oy3tsky 
     1228Sox0eNSjCgP2NhrtdAF8OTIAJiKsfg65p96W8w+dTeE9GABWcC4FGWzZYyZscX3A8CAcYKee1d83 
     1229mmk8BAI3ifo/DDhhfMITVAqEqRz5jLuPwy1tOX/UQXi/wSGeMrtEEq32yFZXdwzK1J12aZnmqHqd 
     1230PYrnWQFOsVWKxEdtu+8rUCyCj4dsmRZATYaWHE6nE3L2PPmLdD/MQq0ajNfddAZitEkVGTck0xr+ 
     1231A6+C0gSU0wFaEjQL5qFC5i/sXyBydr36yx72sIRGhnC77vNCegZDwzHtBwLJqJMaIAQ5kLAvi+Q5 
     1232sjbIgMOcDfJkG5rlXuEmGLECMXMMCGkZwJ0avfgGn8R4kEACipBvayVL8ZUIYfu6kvow1f0v5VKT 
     1233CBg5HchT0BmEEze74GQWTjqZBp+h/RwDHTmUBXDwDDweN1/usrlhWpv4AF/d19sWKVDIlAsJxy6q 
     1234Xwxh3JzsH06cHi2xzCSGobyJvJMRM9M4sNutQcOGGzDennfn0o/dhAWOHUWFeiE3txD+RVWq5oWK 
     1235ML7tpS7cj+aKPm0sthfpLIQ/3gaE4y8eJJl10cG8xSKptmkekYrRKzzxiddDxy7Ws0JHHyneOQJU 
     1236MLV39K4CFqYzviNgeJRVCJtlpLRf3gd750pDC5eHh55fe3X88kt/+ZN9KRj7GSbm2W1dJQrpmTFZ 
     1237mW2Rnn0Li2oRFpfkO31Kp09x0Y+vCgVhnvjw8bNAQnACc5vsHrf0liURm3vX5H0M6qB57iVXZ3XE 
     1238LoAI6i1klKPo8Yz5cGQfu7g7FvYIII9imDs2xUDSfPLPwLlro2COw8Uux0RXV6jxA83ffD0dSF26 
     1239SH7zdXjPLB1iDIn9qOOr2Znp9FwMLtsMqWSSkTfgDKK0X97yju1TjlnlUoCmmezLgFuIH9NulHoL 
     1240v9e9F9mZzwHRA+LgYvYrRJNKJ6BukjSjRDigcXiIes4EwhzbD+PjQbobZUwagU/xbDIYq6irZ7Ax 
     1241EUfe4/5ytOdyapKzAxGj+ZSJ6qNyoM+t22MX7yzaPXLbL/uDtvTfpLMeCchbTThAwAeuwRwJ/v9f 
     1242CSsrhqaV1bij9ZW8W88bYA9Qh3sckTvckP7UfIK0NM4Ey50ST1FAn4otnQNTsg2PDgDKgv2MATi4 
     1243jfo08U1TVXwmSHJeyuoQD8kmAktgjKdBlTV9MEfvZY2Y2G5zSl46BRPFkOqMdDrSriRqPclhkV0X 
     1244Jokh85u0grGgVUbRDx9+PIv6DKCnwUHD4Nx9NFzycDuFcB/BtJEmTvSYMUyhxwz556Uq8ji0q1zN 
     1245Oa1JEWqy9QnbywyayHJ4D+7JEXgneHz4iTHbfC3n11NJB7rIpjjUyZK+wWbExJ7z+oU1KllSdRCs 
     1246ZJ41SCt29LCsa9nkc0qY1xLsua7BxJoMOqblhNAyS1ZiRIMXmIzQ3Ej5ipuk0t5OWRVY9SeadHG0 
     1247ShdC/tYkGQZ6crkEXPA0QzfFPD3lJMRbPmnmajAl502V1jsgQaIKfRhEh9JOx9mOFzrykOS8PxMQ 
     1248j6mPxUdcNrYz4RaGXCZc9FPguEiMxHCAOa1D7qLn0J4XU5x1SsWTE0aqf1BLj4PuDAUACAEorD8c 
     124961yO3yKpyT1xoj13iYpa0iOlG3sW5HEglNEYY1/+TT99RnR5aw+Wq/1Yru7GctXFcjWI5crHcnU3 
     1250lq5I4MbaNIaRhKFURjfPPVgF4WYheJqzZL7mflhUh8VzAFGUJqAzMsW1pV6ugw98CAipbecEkh62 
     1251VQ0pV+tVBSdFNUjkfjzV0MGjqQp2BlONhB7MSzE+277KDn/sURxTDc6MhrO8LZI6iT25WGXFDMTW 
     1252ojtpAUxEt8iDs2f5zXTG+b6OpQov/+vTDx/eY3cEFZrzbhqGm4iGBZcyeppUK9WXpjbYKIEdqadf 
     1253mUHDNMCDB+ZaeJYD/u8tHfkj44gtHVkXogQPgGptbDe3IiWKOs916Yp+zkzOpw8nIszrsF3UHiKd 
     1254Xl6+Pf10GlISKPzf0BUYQ1tfOlx8TA/boe+/ud0txXEMCLXOpbTGz12TR+uWI+63sQZsx+199qXz 
     12554MVDDPZgWOqv8t9KKdgSIFSs04GPIdSDg5/fFSb06GMYsVeS5Z61sLNi2xzZc1wUR/SHEtHdCfzT 
     1256L4wxpkAA7UKNTGTQBlMdpW/N6x0UdYA+0Nf73SFYN/TqRjI+Re0iBhxAh7K22373z8vcs9FTsn59 
     12579v35+4vz15enn35wXEB05T58PHohzn78LKhgAA0Y+0QJnpXXWJoChsW9QSIWBfxrML2xaGpOSsKo 
     1258txcXOne/wTsEWFSKNieG51zXYqFxjoaznvahLkhBjDIdIDmXNah+gy5zYLy04YsCqtCFp3QHZIbO 
     1259aqNDL30Jx1zWoYPOGKQPOrukYBBccwRNVB5cm6iw4jMhfYFlAClto22lQEY5qN75sXMiYvLtXmKO 
     1260BsOTdrBW9FeRi2v0JVZllkIk9yqysqSHYb1Eyzj6oT3yZLyGNKAzHGbWHXnVe7FAq/Uq4rXp8eOW 
     12610X5rAMOWwd7CunNJ9QJUGIvVTiLCTnxyEMlb+Gq3Xu+Bgg3Do58aN9EwXQqrTyC4FusUAgjgyTVY 
     1262X4wTAEJnJ/wE9LGTHZAFHtdHbzaLw79EmiB+719+GeheV9nh30QJUZDg2pJogJhu57cQ+MQyFmcf 
     12633o0jRo5qNcVfGqy7BoeEsnyOtFNBC5+pTkdKZktdcODrA2zQfgI1d4ZXsqz08GHXOEIJeKJG5DU8 
     1264UYZ+Edb/WNgTXMq4AxpLyi1meDXLPZg2nwPxcS2zTFchn7+9OAPfEavcUYL4nOcMpuN8CR6q6mos 
     1265vjrWAYVHrtBcIRtX6MLSsfsi9roNZmZR5Gi0d1Jv94myn/1RvVRnlaTKRXuEy2ZYTp13jNwM22F2 
     1266lrm73w3p7HYjuqPkMGNMLyuqa/Q5AzianiYcGEHEhJX0JtnMp4tpXptCtiydgzYFxQtqdQKigiTG 
     126762LEf0XO6d6iUuaWCTwsd1W6WteYUofBMVW4Y/cfTz9fnL+nkvEXL1vfe4BFJxQPTLi44AQrxzDn 
     1268AV/cajDkrel0iHN1E8JAHQR/uk1ctXDCE/TGcXoR/3Sb+JrPiRMP8gpATTVlV0gwDHCGDUlPKxGM 
     1269q42G8eNWhrWY+WAoI4m3CnQBgLu+Pj/anh2DQtkf0/iIs4plqWk4MoPdSqXuR69xWeLhymI03Ala 
     1270hyTMfGYw9LrXsq8myv30ZBFvHAJG/d7+HKZqqNdVL8dhtn3cQsGttrS/5E7G1Ok3z1GUgYgjd/DY 
     1271ZbJhVay7Mwd61bU9YOJbja6RxEGFHv6Sh9rP8DCxxO5FK2Yg3W4gU4D5DKnvZTTgSaFdAAVCRaEj 
     1272R3In46cvvDU6NuH+NWrdBRbyB1CEukSTSv+LCjgRvvzG7iM3EVqoSo9F5PgrucwLWz+En+0afcvn 
     1273/hoHZYBSmSh2VZKv5IhhTQzMr3xi70nEkrb1OOYq7VRLaO4GD/V2D4P3xWL49MRg1uGDXr9ruetq 
     1274I5862GHwgoAPoUq2oN3Lph7xXu09LMDu+gh2FGGS5LdoD73uQU/DQr/rt4EzHPwwsYx7ae1V5/JJ 
     1275ZBu0XzmvIGCqFR2WOFbYeIiuYW5t4ElrhUP7VFeM2N8DN3qcOlQXLqPgQvVWGOoOnVA/5LslfF0u 
     1276pdrl9uqDblvIG5kV4BZBxIWl6b/a0vRxPJjquAevFhUk6C/aHU/ya/IQ3/z1fCLevP8J/n8tP0BM 
     1277gdexJuJvgIB4U1QQW/GVQLqrjWXtNQdNRaPwzhZBozQ9X2tHZ+XSWwceCeh6e7/Q3uoHgTWG1Ybf 
     1278pQAo8hrpmmxrHU0VOfw211z6bphxkYZ2JdSNSIb9xf9YMH+ke8brepOhonSSBO12XoUX52/O3n88 
     1279i+tb5CPzM3SSCH79C65IH5FWeBw0EfbJvMEnXxyP8QeZlQMOo465zEUCjLlEBG55aeMsvqqfWN86 
     1280qTBwFuVuUcxj7AlcxXeX6i14kGMnvLrXwnnmBWGNxvoQqXVj8TFQQ/zSlfgQOtIYvSYaSQglM7xE 
     1281w4/jcNgGTQRlduHP0+vtwk0M69sQtMAupu2qR/5wq3TWTGcNz2UmQu3E7oS5I5elidrM5u7dqQ+5 
     12820C9bAHVCmX65TJqsFjKHqILCXLr1DlrVve7EcsLcwrqc7gBRoiLbJjvl1JokSoQ4a0gXd/FIgnJm 
     1283EIX+mFyz7sV7WKLhO5oAnRCl2KFwhqpmvmY55nBAq7ve0fs2zV++iHpE5kk5Rpy3ThysE10mxmgl 
     1284a71+fjAaXz1vzSjlZefeZcd5CRbG5ZQDUJ/l06dPQ/Ef91t+RiXOiuIaXBKAPRQQigtq3mOz9eLs 
     1285bvW9WtMSA0vO1/IKHnyh/LF93uSUnLtjKG2ItH8NjAj3JrL8aPp3bCCnrSo+auUefGSjbcfPeUqv 
     1286VMHkikSVq99Mg4kXI1DEkqAbokTN0zTiQB32Y1c0eE8JE22aX+QtcHyKYCbYimdEHGau0buikkXL 
     1287PRadExES4JBKiHg2uuhJN3UAz+nlTqM5Pc/Tuq2xf+YeH+o7yrV9U4rmK5FsUTLMOjrEcK68eaza 
     1288epfFnSzqeevF/MpNuXVWyc334Q6sDZJWLJcGU3hoNmleyGpujCruWDpPaweM6YdweDC9IIYMUBwM 
     1289oBSChifDsLASbVv/YPfFxfQDnaQempl0AU1tX7rD6ZEk79SRxXE7PyViLCEt35ovY5jlPSV2tT/g 
     1290zSX+oNOKWGDtvRvAverV5PrOP1cwtC8CADj0nhmrIC07ejrCebmRhc9Mqx359hUBTj04hqeE201a 
     12911U2STfW99Cm6bFN7tKzxtFeE7rz8Zn0WcKgLcDUPdbE0+A6mzgTpibWOplwd4nMdnsfutRv/hkpZ 
     1292oK/3wtPjmPR9xpfgHQ2OPb8yFzceovLN9YFe5b2L5YSqeqJxt1ax1wtPECJd80Vp2SEP+1FTGliu 
     1293K/xQABkAgD/s+EVfdU6BnNI0rhvdl/rvAf3m67vAukpmsGiW8u2+4tEXl9wq1jbhz7JsfL41uJUo 
     1294GQtz1VQLHt/KQylhlW9vEptah+6FCGh++JLvWPADTtMinOzwiYq0m2048i5aWfzuIlXbKfinqKRH 
     1295DdMK3TwsM1wn3ILi2pTHNhgybxLAFO3ILT7BT309WJad4MtqkKCH9XV01/J5/F1r1z0Cu3Jz9tJb 
     1296u3/9wqWBHrufX4ZowC6oJsSDKjotRtN/jehO9LHgcHpDf5b2tXmc5SAe1KhNNEtukrn7HQ+nD/mt 
     1297e219oHM5wt31zpr2Xhs27Nzn5D4380EcPrf33+h0daHZiw0WvYNlyvU6U7laqWmCr/CZkpdDZ8s9 
     129882Xs5jt6fYtM1M6YO7xRDyAMq+gqILfQD3YdPCl+lSAfzTpXpwVNTQVMTkWUShccvWrbCuBijlpp 
     1299vEmKcElTmEnMN6imKitwR0L9wjk+Mxwqs2qBmghqk6hrg7oZMdHvH8Mp+KDaXL/hWJldHI86QAiu 
     1300ynfe28E1gtOpbQN+edZeBEwnliFk3mwgPq7bO/D+2UQqvnNmoEtXuMFOjNSKXYdTXMRSyx8OUhil 
     13012O9fafPveTd33P4bW5X2cLaiETr8fszFQkfKDTent/YdOO67Fxb0HkOKiPjdCcJ2a7nP3vuHrTAv 
     1302dCFFqIMWbtUvmeAXinFWBSuyHD4CuXevPPiVcVZnscNg0XCeuYqh/1YBvDVHhnboZUE9Lui/Fshn 
     1303hnZ+X29YZullovd0tlQ84R6Diqedbdy68ljEco8r7xcqPtKV9+A/0JXXr3YCa6Lx0fpgsHTxHp+f 
     13041YT7nqSWEWDMFIiEyfbOW3aMPRy5hYDgkKe3oX17IOtM53aBMRPIkf0XaBAIfh+ScqumvPeVmHmH 
     1305fG1fuujx9xcfXp9eEC2ml6dv/vP0ezoixrxVx2Y9ONbJi0Om9qFXkubGPfpYb2jyFtuBd4lxXbWG 
     13060GvvHYkMQBiuoR/a0K4ic5v3DejVIvcHAeJ3L7sDdZ/KHoTcc7503at7mNepHQv0Uy70Mb+ccxnz 
     1307yGRNWRzalKhpb7NYWkZ7Qf6+jXNKbvrqRDul+lVVexIQY1v4RTuAySvkL5u7MlW8NkPCjkr3nc5U 
     1308rYY3IMw9b5DCuXReN0RvGmJQtf/y6AqUXYI5eHYYJ/ZFjNSP83TKvmEU8/BzGRuCeFcQwv76XGFf 
     1309yGwPFYKAFZ5+mQ4jYvSfzmzb06AnSlwd0mWnQ1Q2X+wv3DPt5P41xTOf2r6VQpnjUsx3Q+dlk7nn 
     1310OHZMbwA5f5QWLJZOdS1oviOgcyueCtgbfSZWiLOdiCBK1IcVWLBDdNRvlHGQR7vpYG9o9Uwc7rsK 
     1311414FEeL5/o6Lzm0TPeIFj1D3jFCNuXDgWGCsGdl3x0V8R5A5ryzoNRSe84HnGfrlh/D15ur5sU1K 
     1312Ir9js/uSA6R96Bj2q7aq/M4XHzmjiVeqCdUOYKHKuAv+S+iw5lLsD3B6NbJ7giBz4MSQQq99+Fzd 
     1313jPBeshp2EbV8dwwLEqMnakyLcqqKNe72ybi32FZl9WFwgfT9MHraD0AhlGHfBD/8rg1Qz890PDhr 
     13146G1x1uHEa4WOPNAhuc8LPMJ4fS123eF0relBw6lc3BaZc4cu7+n9BrFmr4F7eYmO/bagu/KWB/bY 
     1315fr4gNjz++QPG98sp7PAXdznUttfLwUsJ7MRiAQ4ez3YoZB7HYF1AYY5ITWPtppFwvPjdktHhpnZp 
     1316yBXo8FFND74JkgILcmKn2vJbYxD8H2/QG9E= 
    11251317""".decode("base64").decode("zlib") 
    11261318 
    11271319##file ez_setup.py 
    11281320EZ_SETUP_PY = """ 
    1129 eJzNWmtv20YW/a5fwagwJCEyzfdDgbLoNikQoOgWaVNg4XjleVpsKJIlKTvaRf/73jvDp2Qp7SIf 
    1130 lkVqmxzeuc9zzx3pmxfFod7m2WQ6nf49z+uqLklhVKLeF3Wep5WRZFVN0pTUCSyavJPGId8bTySr 
    1131 jTo39pUYr8WnpVEQ9ok8iFmlH5rFYWn8tq9qWMDSPRdGvU2qiUxSga/UWxBCdsLgSSlYnZcH4ymp 
    1132 t0ZSLw2ScYNwrl7ADXFtnRdGLvVOrfzVajIx4JJlvjPEvzfqvpHsirysUctNr6VaN741X5xYVorf 
    1133 96COQYyqECyRCTMeRVmBE3Dv/tUl/g6reP6UpTnhk11Slnm5NPJSeYdkBklrUWakFt2i3tKl2pTB 
    1134 Kp4bVW7Qg1HtiyI9JNnDBI0lRVHmRZng63mBQVB+uL8/tuD+3pxMfkE3Kb8ytTFKFEa5h98rNIWV 
    1135 SaHMa6KqtCweSsKHcTQxGSaN86pDNXnz9vtvP/zwy+bXt+9/fvePH421MbXMgMXT7smH9z+gW/HJ 
    1136 tq6L1c1NcSgSU+eWmZcPN01OVDdX1Q381212MzWucBOzce/tyr2bTHbc33BSExD4HxWwWf/GNexN 
    1137 7evi4JiuKR4eZitjFkWOw4iMLdvxLR55EY3jgIbS8VkgAkZmywtSvFYKDWMSEc9yhedbjqQ08oVw 
    1138 pR17duj6jJ6R4ox18QM/DP2YRyTgkWSeZ4UWibkVOqHD4/iylE4XDwwgEbeDmDtUBIEtieuQQPiO 
    1139 8GTknLPIHetCqWszS7LQjWMSuH4Yx6HPCI+lT6zAji5K6XRxIxIxuMsDwbjjOF4o7TCWISdBEEvC 
    1140 zkjxxroEjuX5xPEE94QtKAtDKSw3JsQTgQyFf1FK7xdGHWJHPugRccKkpA63QR/LpS61mfe8FHaU 
    1141 L9SVDvV9N+YBxDWUoUd4GNsOCCKxFZ2xiB3nC9jDBQdPBiF3uCOlsD3Lit3Akw7xzkSaHeWLtKzA 
    1142 ozIgxKEht6RLiUU9UNCK7JA54UUpnS6BHdixIwRzfemFIhLEDhgPiO2AVCc8J+UoX6QdQaJBEXEp 
    1143 IgiWH7MYpEibhzSM5JmsY0f5IizBQy+IHBbHEZU0dKmMLJf4lgAxtrgoxW+lECqkHUjOwTDf920v 
    1144 8mwWQh7yOIoD/5yUo6yjFo1t1yaMUNexwBmQr6H0POZDwENbXpTSWQQpJ2HPgHuSSpfFIZWxFzAL 
    1145 XAXZK5yLUjqLIqw6KGDXYZzGLHQokx6koRNIJyLyXNb5Y4uEiCWPLFAHMg8STboCatMPAwGYYwfn 
    1146 Iu2PLSJSOIRLQAc7tGwhwLkhgIxPGQAXCc7VkX8Uo4i7MrC92GOMkCi0PUgc7oaUMe5yn5+REowt 
    1147 cv0gArSObDsARIkiL3RABCCf78WCOdZFKT1KMT8g0g8p+Be6AFRDYIEhnudCgfnkXDUGY4uoIyMS 
    1148 +g6Adkx86gLYWhBqLnwJLcF3z0gJxxY5FsRIxoQzlwS2L3zb9qEMoTVEwnbP5ks4tsgnkYx9L7JC 
    1149 7gXEkjQImbSlA2GAR865CgjHFnmAlYQ7ICrEAvRcz7ZtyUXk2vAvPKdLdNTVLOxpTgweiTmNGKZg 
    1150 SEnkWtggrctSOosYJW4E2AC9w4tcZmHOQraBsxkT4OSLUjqL7NCxQwA5CHTMme1bfmwRP6KugDqP 
    1151 /XORjscWge7Ms6Ap2ehh6sWB8JikworAVmadi3R8hAyQZNCgHeG7UcQDQCcihBUAeLHA9c716UZK 
    1152 Z5EUEFpX+MQOqe0wCBPzPZuGgnguiURwUUrQeZdA2dgSUZM4ggMw2bEbuQC6fuxArwIpf0wGxA5Y 
    1153 ajWpy8NK8+YtqbZpQlvaDBxsIj4zAYzxnbrzFpltsxYeDtdNuJDG5pGkCbA2sYFbc9BpkwGtXxpI 
    1154 5BYrZUAijfY+Uv+W5umHePEEOGINtA9FqBfNrfis7wJNb5eBnGbli3Un5bYVfdfLwwvoM5D616+R 
    1155 ZVY1FyXQ8/loBV5TNKmxoKH5V0CmCbBp/sIw5j/lVZXQdMDigZnD37u/LaYnwq46M0ePFqO/UB/x 
    1156 Oannjr5fQnDLTLlLO/SI46tFDU1eH3HyZafWhpJKrAfEfAmEfwMTxzqvTLYv4TedTN0LXKTksLb9 
    1157 SRMkYP/f7ut8B35gMCQcYKLI+E1n9mDgw/FsRz5BLGEGegRXEXQQOA9NK0i91VPZfaP0vVFt833K 
    1158 cSgh2tdDae2Ale13VJQw6xGYGKtesJKFg0yG3jUkDC+dUvuMq1eEcT9yxL2Bo8n8aZuwbbu7AK1x 
    1159 wtTyjNnNbGGCktpL97glyhlMo1tRjubcpwRGJ9pnguBLyEid4ErlLAd/pKUg/NCrD3vAkHk/drva 
    1160 rhkxlZi60VJJo0Kp0jhEDZ4sz3ilfdOqURBIFHQqeATLKqlhXIQBcjCW6og39ueZUGOhHnG51guc 
    1161 mqfow2fHXNSymRlFI0yN5GW+h52EVkXXGTF2oqpg1NNzal909/cqX0qSwFz886Gqxe7tZ/RXpgMB 
    1162 Q2oN9/SASihCCxqPKYjG6OHVbDNU/Xwi1UajENi/NmbFp4dNKap8XzJRzRBhcPtdzvepqHDYHQDo 
    1163 8WNdE1B1HPKgcdt80SMJpty6L5pBXTYeOyrBtuyWR4XWY0BbJCZ4VpT13FriJgOQa4C62+nVcEin 
    1164 7WnNpgnMRgHzGmXoAAGwH8saOUg9fAbhu5daQBo6pHl0usNItNkk13zaa/x6PX3ZuGrxqpE9VGEs 
    1165 4Fe98rs8k2nCanDNaoj+w8j/VbSf/rLts/9Mvs9fr6+qRVfLbQ2rE6mP2Rjwp4xksxpLqisRwAw8 
    1166 hVE10py6YLXsswxS2TR+SgVkSLv8RB7WEJYyAJAAW1oNZVJW4Ih9heUwAwmHNvTG9YeB8jPzSN7H 
    1167 7GM2/25fliAN4FwLuCqP+tYCulafy8Ik5UN1a91d7lkqfmklxjGARB+HczmstNujOr3DV74BaxWS 
    1168 559Gop7LwfNZ8yaBkkjoHjv4j3n9fQ594XI+6077XFl/7XaLxQ/lOeqzb55pqqqMSd8UjDRnmpIo 
    1169 +NQ2JLU+6FMU4/+0yWqIxqPctsl+qcfiPdz1tMFq3L/ve+aZvpjrbtg2Q2wqrN6TtDeiaTLjRtKe 
    1170 FJfQa6gD2bqFFEp1nrV8dW0MwOz6qgLufVUh9Z4OC+foKFPnKsgd9g70mfFyTBEr8ihA+zVQct0U 
    1171 fsuTbN62kHapFleVDMUpnvwjdPOWWiNUta9DkVZ1NddiFysssG8f8wQTqBAE+2WrTtXVxwjP8VKp 
    1172 yEEQeqNqvZTmD6NVSMYxLuN38YKV5hMpszn6+frrXfqguwHWBsmr57L8SqUEHoDPxaPI8A8wpwBl 
    1173 J1uRFsj73ulsG3CPLlWAnGD+4xH9HF0xgZawNABdJnhrB+WcCXAkvAJ1iMwXEFo8IR4TGGerSr09 
    1174 7AEKwc1JsyVAd8Nx+h1BZd5mszmZzAHExAo9rMTsCNsi3eK50I1pC+EFJeqnvPzUbLo0Ct1dclqT 
    1175 5uMVRAqFElfVZIIoAh5girWrBSC5r8SmckrRdKuhAebia0YRkmJ5kjID0D0hVCrLllhNJ68Bo1DJ 
    1176 Wic4WTbEKRWieKV/zI+41zg7WxhWfbGaqi2O+p4quQYfTPiZFyKbnyz7xngPpP/mqUxqAB+IMfhX 
    1177 0W3A8E9L/ITnCaOHdIGVWIYAjSwvy71KjlQcCVNxH6YHsvBaqPUtJrZX83HJuSEcDDBxIJkvxhpr 
    1178 FFHWaKxYTp/oFNwJD0xlhx7Du5dgGMShcHUMAbDBSu3C0rwS88UJRFT1SgkdPm+6WQtaoGCKv7Sw 
    1179 NfkzF/bvHWT6HAjL4/Jcx+577rtLn32pHvsWqFWzqm0Qz5Hpo88ULzFpPTx0WH0isV9zecBQk7p1 
    1180 SsnGY8RoilAxw9IYzA4s3+3AUHPEIdvjHNIMZO3VxEi5OIVeoPy8eImnLXcLlaZPYlaqtBYGtvEv 
    1181 pgpain4+6lWo9mkPgUX7DCbAT/POrDHhTIbE3dxsGm9tNsYaRkLLtEx79pdHhH8CwCtwxbmYVnkq 
    1182 oFbPjMYt6Ydmoon9CaEvxS5/VHirIqE/ulYTMHSOGqA3/QLuHjH1s5S8Karfx2RlMHkN2c7pMPgn 
    1183 Bjr4eYF/H01tq/PZ/j+n5KUy6wR/UcpJNj9Xd2253Y1nduVsawGJD1Zh94fAMZUp+OT5DMVdvpID 
    1184 OvWV5hemMJ3m059PaNF02SLKFEDwQTWiEo9/IQmBJPUJPX1G3mz+HujUtP2ShVkcxtPnVH994vQb 
    1185 BuZi1hxrFl1/akeYqofnD+qpgSVC90laX+tzYhD5gMPdARF5mMVlM/8g12rPlTuxvUMU5+7ZNf6J 
    1186 K+Y9q1ZC2l6omuaspLP+WXfMjO/eNUfUsm2qzx5Ty67Z6RFQt+jbKf5xVa7g3xKwAsaHhmlqQtZu 
    1187 ZELz3VXzxV33slmBxV3rLHComE71pKCb9NAxEAEYIet2YlBfC1m3d80HUeuixfvz4XS+UYxhs2my 
    1188 vnNJI2NpKLe8aihR64BXx8buSA3T4Br0NCtBSradTz9mw+91fMzmt//64+7l4o+poieL4Rij3h5g 
    1189 0TOIDY1cfbEmNQSiwIvpaZG2iKhVhf/frpRgU1Hvub24gzFMOfKleqofwugKj1Z3z5s/e2pyQjb0 
    1190 qFN94IAJmNH6cb2ebTZYsJvNrPsUJEWJoKaq4deOaoft37f2HbxzfQ3O0qUyaF+D2umWO6u75/qi 
    1191 woheJi7S138BSGV4QQ== 
     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 
     1387178BYnMUkw== 
     1388""".decode("base64").decode("zlib") 
     1389 
     1390##file distribute_setup.py 
     1391DISTRIBUTE_SETUP_PY = """ 
     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 
    11921469""".decode("base64").decode("zlib") 
    11931470 
    11941471##file activate.sh 
    11951472ACTIVATE_SH = """ 
    1196 eJytU99P2zAQfvdfcaQ8ABqN+srUh6IhUYmViXSdNECum1waS6ld2U6zgva/75ykNP0xpGnkIYl9 
    1197 n8/fffddB8aZtJDKHGFRWAczhMJiAqV0GQRWFyZGmEkVitjJlXAYwEVq9AJmwmYXrANrXUAslNIO 
    1198 TKFAOkikwdjla8YS3JyCs3N4ZUCPTOERLhUEp/z+7gufDB/G3wd3/NtgfBvAM3wGl6GqkP7x2/1j 
    1199 0DcE/lpq4yrg216hLDo4OFTFU8mqb6eu3Ga6yBNI0BHnqigQKoEXm32CMpNxBplYIQj6UCjWi4UP 
    1200 u0y4Sq8mFakWizwn3ZyGOd1NMtBfqo1fLAUJ2xy1XYAfpK0uXBN2Us2bNDtALwScet4QZ0LN0UJJ 
    1201 TRKJf63BC07XGrRLYo7JnrjXg4j0vNT16md0yyc3D9HwfnRE5Kq0S7Mjz9/aFPWOdSnqHTSJgAc9 
    1202 inrvtqgJbyjUkE30ZjTZEjshXkSkD4HSKkHrTOGNhnvcOhBhnsIGcLJ3+9aem3t/M3J0HZTGYE6t 
    1203 Vw5Wwkgxy9G2Db17MWMtnv2A89aS84A1CrSLYQf+JA1rbzeLFjrk/Ho44qPB1xvOrxpY2/psX0qf 
    1204 zPeg0iuYkrNRiQXC007ep2BayUgc96XzvpIiJ2Nb9FaFAe0o8t5cxs2MayNJlAaOCJlzy6swLMuy 
    1205 +4KOnLrqkptDq1NXCoOh8BlC9maZxxatKaU8SvBpOn2GuhbMLW5Pn71T1Hl9gFra8h77oJn/gHn/ 
    1206 z1n/9znfzDgp8gduuMqz 
     1473eJytVF1v2jAUfc+vuA19aKvRiNdOPFAVqUgtrQhj0kplTHJDLAUb2Q5ZO+2/7zokbQKs0rTmgeDc 
     147473OObwemqTCQiAxhnRsLS4TcYAyFsCn4RuU6QlgKGfDIii236MNFotUaltykF14HXlQOEZdSWdC5 
     1475BGEhFhojm714Xox1FJydwy8P6BEJPEFXgn/KHu5u2Gw0mX4b3LHHwfTWh2f4CjZFWXq6x33uH3N9 
     147688CfG6Vt6fj2LZcGLRwElfZEeOW7s5vcpCrPYojRUs/lUMBlDK8m/QJFKqIUUr5F4PQiU6TWa2e2 
     1477KbclXlUqQi3iWUa4WQUrqk0w0L9EaXfYcAK2CjWXAN8JW5XbymyFXFVpWo4OCDh1fUOUcrlCAwWR 
     1478xGP38wIOcCqr0Wyoc4z3wL0ehIRnV+1OP8JbNhtOwtHD+AjI5Whd3YLnbzSFvWMshb0DksjxgKOw 
     14799yFFlbluYedSW4fj2XtjJ9QXNdIHXyoZo7E6d0LDvd46EGKWQO1wsle960y1QuvSvz0S9c4utMaM 
     14802JcWtlwLvszQNDXdru15jVb7PmONI2O+V4HQnMc7kCjBuJN3dWh4B4xdj8ZsPLgfMnZVuTXV7+04 
     1481e4VWGLsZhYPruyF7nDzcP073ENonwNWvmSvT+Qu6Eyj5GmHeyjv3FyUBNNqhIDrgVCl4RtfCoBM6 
     1482DOiLJOWuRFRtCKUF4dkIQYTU2s1VEBRFcfmKlrS+vaT7EBiV2IJrDLjLErSF99RocUGpjzY7Xyye 
     14834X02zAy2s5x9MOj5eyApZE/RTq6ftEw+YZH85xL59wVSLw+C4Q8Om94M 
    12071484""".decode("base64").decode("zlib") 
    12081485 
    12091486##file activate.bat 
    12101487ACTIVATE_BAT = """ 
    1211 eJx1kEEOgjAQRfc9xSxoAlfQkIiBCBFKg8iKZBbSKhu6kPvHFqQ0Ct3N9P2flzmJx0uBkpK8xQhN 
    1212 VtX3KMeENSGiMyES0ksY1AidkP0gOuBVWfAafAL6mfC8CD3uXUgw4QuKZR7btr0c3aCoKTLMxl9I 
    1213 F8Yp8VdrFhUJYgAW2zeK6tT10eOvjV7RCXiqUcHtmnGz0nb/clN6DpCDJddi56q0bRHPGfu6Hm0s 
    1214 YTH5AJ7udMY= 
     1488eJx9kE0OgjAQhfdNeodZ0ASuICERA1EilAaRlckspFU2dCH3jxSQNgad1fx87+W1e3l/atBKUfKS 
     1489AzRZVV/jHFPeRIjOhEgJJZ2CXg/QStX1sgVRlYWowacExjL6eRN5wjtSEiySD45lnqyeP7VsA2OL 
     1490mcE2zhFbMcfItw/gcZEiBmC5P8Hi+jTnGZvvNOOKhfDQg4bLORNm3s41aSfc3HcWts7O77Ib4iHj 
     1491S87QEaY8oeQNhWR0fg== 
    12151492""".decode("base64").decode("zlib") 
    12161493 
     
    12181495DEACTIVATE_BAT = """ 
    12191496eJxzSE3OyFfIT0vj4spMU0hJTcvMS01RiPf3cYkP8wwKCXX0iQ8I8vcNCFHQ4FIAguLUEgWIgK0q 
    1220 FlWqXJpcICVYpGzx2OAY4oFsPpCLbjpQCLvZILVcXFaufi5cACHzOrI= 
     1497FlWqXJpcICVYpGzx2OAY4gExGchANxcopMqFxVCQUi4uK1c/Fy4AyB051w== 
    12211498""".decode("base64").decode("zlib") 
    12221499 
    12231500##file distutils-init.py 
    12241501DISTUTILS_INIT = """ 
    1225 eJytlcuq2zAQhvd6iuGEEhuC6ToQzqIXyKKl0C66EzrWOFarSEaSc3n7jizH8SWhXdSLoIx+jWa+ 
    1226 GY/VsbEugPVMpZW/DsuzcEaZg4eb4YM1lTp8E86jg9X0r/JgbAABJ+VCKzSaExytbDVuwFs4I5TC 
    1227 QOsRVIBgoVJGQqgRfJBavTEmlTPiiLCjYIpGhLroLXHLhzYo7Xm0jxS/rDLZTJ6Nwyo4r5RGzvMN 
    1228 rAc365ypanBirDvGRTa9JofdIpRscWbwn28Z0HNjVsRF1pni8/KDMh2RGa6CRpS/xQFBBHjnQTQN 
    1229 UuAR0BuRMolQxKJtKYKyBoRPxqsPeLw7en3JGWqPKQzepcB5oQxRCNn7Dcyy62R4wRJsg3eIHdGp 
    1230 lMhxrowK5K65rvO8cChklrNbW0T5qH3Kjj9jq9X9ziKuKNdQ1ui3jFkteewAnsQdRE+FjbLiI/04 
    1231 9dbGdIuFikmsYGHNPOqqr0FlW+otKt6jS5Kw0yWE/F6LWWMtMNzTKavDOjlZjToJLySgG2Z++7BW 
    1232 Q2yjqiy0ndRhaJ1JYvYPTCjyJadpAYbCzKpwwMCba6itoRqX5GgQFtOtjvuwOTuXNVoE7hssVaXK 
    1233 HSXWOKzUZffVGuzzJ1DJGGdFtG+H16O3d5fH7tI8WcYwlsFOL71dmbNnQdIwkLbkvG+Nx5vsWf5j 
    1234 NLOzC5I00J6RjLPuKUnaXJL0QRgpnIy7T8mORUDL/4l6EdU0pr+AJ8Vz8KPNx+BnJGdnY49/3v/8 
    1235 8mkL32vbagn71N4z9v3hUxytr/G9SM8+QE3jVNBwpU9ghNhW1YY+W777e64VeZIWvVnTZEMat2ku 
    1236 01dMFuwP2YOSYA== 
     1502eJytVl2L6zYQffevGBKK7XavKe3bhVBo78uFSyml0IdlEVpbTtR1JCMpm6S/vjOSY0v+uO1DDbs4 
     15030tF8nJk5sjz32jjQNpPhzd7H1ys3SqqjhcfCL1q18vgbN1YY2Kc/pQWlHXB4l8ZdeCfUO5x1c+nE 
     1504E1gNVwE1V3CxAqQDp6GVqgF3EmBd08nXLGukUfws4IDBVD13p2pYoS3rLk52ltF6hPhLS1XM4EUc 
     1505VsVYKzvBWPkE+WgmLzPZjkaUNmd6KVI3JRwWoRSLM6P98mMG+Dw4q+il8Ev07P7ATCNmRlfQ8/qN 
     1506HwVwB99Y4H0vMHAi6BWZUoEhoqXTNXdSK+A2LN6tE+fJ0E+7MhOdFSEM5lNgrJIKWXDF908wy87D 
     1507xE3UoHsxkegZTaHIHGNSSYfm+ntelpURvCnK7NEWBI/ap/b8Z1m232N2rj7B60V2DRM3B5NpaLSw 
     1508KnfwpvQVTviHOR+F88lhQyBAGlE7be6DoRNg9ldsG3218IHa6MRNU+tGBEYIggwafRk6yzsXDcVU 
     15099Ua08kYxt+F3x12LRaQi52j0xx/ywFxrdMRqVevzmaummlIYEp0WsCAaX8cFb6buuLUTqEgQQ6/Q 
     151004iWRoF38m/BdE8VtlBY0bURiB6KG1crpMZwc2fIjqWh+1UrkSLpWUIP8PySwLKv4qPGSVqDuMPy 
     1511dywQ+gS7L1irXVkm5pJsq3l+Ib1lMOvUrxI+/mBBY4KB+WpUtcO06RtzckNvQ6vYj1lGoZM2sdDG 
     1512fryJPYJVn/Cfka8XSqNaoLKhmOlqXMzW9+YBVp1EtIThZtOwzCRvMaARa+0xD0b2kcaJGwJsMbc7 
     1513hLUfY4vKvsCOBdvDnyfuRbzmXRdGTZgPF7oGQkJACWVD22IMQdhx0npt5S2f+pXO+OwH6d+hwiS5 
     15147IJOjcK2emj1zBy1aONHByfAMoraw6WlrSIFTbGghqASoRCjVncYROFpXM4uYSqhGnuVeGvks4jz 
     1515cjnCoR5GnPW7KOh4maVbdFeoplgJ3wh3MSrAsv/QuMjOspnTKRl1fTYqqNisv7uTVnhF1GhoBFbp 
     1516lh+OcXN2riA5ZrYXtWxlfcDuC8U5kLoN3CCJYXGpesO6dx6rU0zGMtjU6cNlmW0Fid8Sja4ZG+Z3 
     1517fTPbyj+mZnZ2wSQK8RaT9Km0ySRuLpm0DkUUL0ra3WQ2BgGJ7v9I9SKqNKZ/IR4R28RHm+vEz5ic 
     1518nZ2IH7bfub8pU1PR3gr10W7xLTfHh6Z6bgZ7K14G7Mj/1z5J6MFo6V5e07H0Ou78dTyeI+mxKOpI 
     1519eC2KMSj6HKxd6Uudf/n886fPv+f++x1lbASlmjQuPz8OvGA0j7j2eCu/4bcW6SFeCuNJ0W1GQHI5 
     1520iwC9Ey0bjtHd9P4dPA++XxLnZDVuxvFEtlm3lf5a2c02u2LRYXHH/AOs8pIa 
    12371521""".decode("base64").decode("zlib") 
    12381522 
  • zine/database.py

    r1342 r1375  
    241241    setattr(db, name, getattr(session, name)) 
    242242 
     243# Some things changed names with SQLAlchemy 0.6.0 
     244db.save = session.add 
     245db.clear = session.expunge_all 
     246 
    243247#: and finally hook our own implementations of various objects in 
    244248db.Model = Model 
  • zine/database.py

    r1347 r1375  
    212212    old_init = getattr(cls, '__init__', None) 
    213213    def register_init(self, *args, **kwargs): 
    214         old_init(self, *args, **kwargs) 
     214        if old_init is not None: 
     215            old_init(self, *args, **kwargs) 
    215216        session.add(self) 
    216217    cls.__init__ = register_init 
     
    236237 
    237238#: forward some session methods to the module as well 
    238 for name in ('delete', 'flush', 'execute', 'begin', 'mapper', 
    239              'commit', 'rollback', 'refresh', 'expire', 
    240              'query_property'): 
     239for name in 'delete', 'flush', 'execute', 'begin',  'commit', 'rollback', \ 
     240            'refresh', 'expire', 'query_property': 
    241241    setattr(db, name, getattr(session, name)) 
    242242 
     
    253253db.ZEMLParserData = ZEMLParserData 
    254254db.mapper = mapper 
     255db.basic_mapper = orm.mapper 
    255256db.association_proxy = association_proxy 
    256257db.attribute_loaded = attribute_loaded 
     
    263264metadata = db.MetaData() 
    264265 
     266schema_versions = db.Table('schema_versions', metadata, 
     267    db.Column('repository_id', db.String(255), primary_key=True), 
     268    db.Column('repository_path', db.Text), 
     269    db.Column('version', db.Integer) 
     270) 
    265271 
    266272users = db.Table('users', metadata, 
  • zine/websetup/__init__.py

    r1341 r1375  
    149149        error = None 
    150150        database_uri = value('database_uri', '').strip() 
     151         
     152        # set up the initial config 
     153        config_filename = path.join(self.instance_folder, 'zine.ini') 
     154        cfg = Configuration(config_filename) 
     155        t = cfg.edit() 
     156        t.update( 
     157            maintenance_mode=environment.MODE != 'development', 
     158            blog_url=request.url_root, 
     159            secret_key=gen_secret_key(), 
     160            database_uri=database_uri, 
     161            language=request.translations.language, 
     162            iid=new_iid(), 
     163            # load one plugin by default for a better theme 
     164            plugins='vessel_theme', 
     165            theme='vessel' 
     166        ) 
     167        cfg._comments['[zine]'] = CONFIG_HEADER 
     168        try: 
     169            t.commit() 
     170        except ConfigurationTransactionError: 
     171            _ = request.translations.gettext 
     172            error = _('The configuration file (%s) could not be opened ' 
     173                      'for writing. Please adjust your permissions and ' 
     174                      'try again.') % config_filename 
     175            return render_response(request, 'error.html', { 
     176            'finished': False, 
     177            'error':    error 
     178            }) 
    151179 
    152180        try: 
     
    194222            ) 
    195223 
    196             # set up the initial config 
    197             config_filename = path.join(self.instance_folder, 'zine.ini') 
    198             cfg = Configuration(config_filename) 
    199             t = cfg.edit() 
    200             t.update( 
    201                 maintenance_mode=environment.MODE != 'development', 
    202                 blog_url=request.url_root, 
    203                 secret_key=gen_secret_key(), 
    204                 database_uri=database_uri, 
    205                 language=request.translations.language, 
    206                 iid=new_iid(), 
    207                 # load one plugin by default for a better theme 
    208                 plugins='vessel_theme', 
    209                 theme='vessel' 
    210             ) 
    211             cfg._comments['[zine]'] = CONFIG_HEADER 
    212             try: 
    213                 t.commit() 
    214             except ConfigurationTransactionError: 
    215                 _ = request.translations.gettext 
    216                 error = _('The configuration file (%s) could not be opened ' 
    217                           'for writing. Please adjust your permissions and ' 
    218                           'try again.') % config_filename 
    219224 
    220225        # use a local variable, the global render_response could 
  • zine/websetup/__init__.py

    r1362 r1375  
    187187            error = str(error).decode('utf-8', 'ignore') 
    188188        else: 
    189             from zine.database import users, user_privileges, privileges 
     189            from zine.database import users, user_privileges, privileges, \ 
     190                 schema_versions 
    190191            from zine.privileges import BLOG_ADMIN 
     192 
     193            # a newly created database has a schema version corresponding 
     194            # to the latest available version in the repository 
     195            from zine.upgrades import REPOSITORY_PATH 
     196            from zine.upgrades.customisation import Repository 
     197            repo = Repository(REPOSITORY_PATH, 'Zine') 
     198            e.execute(schema_versions.insert(), 
     199                      repository_id=repo.config.get('repository_id'), 
     200                      repository_path=repo.path, 
     201                      version=int(repo.latest)) 
    191202 
    192203            # create admin account 
     
    200211                display_name='$username', 
    201212                is_author=True 
    202             ).last_inserted_ids()[0] 
     213            ).inserted_primary_key[0] 
    203214 
    204215            # insert a privilege for the user 
    205216            privilege_id = e.execute(privileges.insert(), 
    206217                name=BLOG_ADMIN.name 
    207             ).last_inserted_ids()[0] 
     218            ).inserted_primary_key[0] 
    208219            e.execute(user_privileges.insert(), 
    209220                user_id=user_id, 
Note: See TracChangeset for help on using the changeset viewer.