Ignore:
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pyweek_upload.py

    r0 r2  
    44Handles authentication and gives upload progress feedback.
    55'''
    6 import sys, os, httplib, cStringIO, socket, time, getopt
    7 
    8 class Upload:
     6import sys
     7import os
     8import httplib
     9import cStringIO
     10import socket
     11import time
     12import getopt
     13
     14
     15class Upload(object):
    916    def __init__(self, filename):
    1017        self.filename = filename
     
    1320sep_boundary = '\n--' + boundary
    1421end_boundary = sep_boundary + '--'
     22
    1523
    1624def mimeEncode(data, sep_boundary=sep_boundary, end_boundary=end_boundary):
     
    2129    for key, value in data.items():
    2230        # handle multiple entries for the same name
    23         if type(value) != type([]): value = [value]
     31        if not isinstance(value, list):
     32            value = [value]
    2433        for value in value:
    2534            ret.write(sep_boundary)
    2635            if isinstance(value, Upload):
    27                 ret.write('\nContent-Disposition: form-data; name="%s"'%key)
     36                ret.write('\nContent-Disposition: form-data; name="%s"' % key)
    2837                filename = os.path.basename(value.filename)
    29                 ret.write('; filename="%s"\n\n'%filename)
     38                ret.write('; filename="%s"\n\n' % filename)
    3039                value = open(os.path.join(value.filename), "rb").read()
    3140            else:
    32                 ret.write('\nContent-Disposition: form-data; name="%s"'%key)
     41                ret.write('\nContent-Disposition: form-data; name="%s"' % key)
    3342                ret.write("\n\n")
    3443                value = str(value)
     
    3948    return ret.getvalue()
    4049
    41 class Progress:
     50
     51class Progress(object):
    4252    def __init__(self, info, data):
    4353        self.info = info
    4454        self.tosend = len(data)
    45         self.total = self.tosend/1024
     55        self.total = self.tosend / 1024
    4656        self.data = cStringIO.StringIO(data)
    4757        self.start = self.now = time.time()
     
    5262        self.display()
    5363
    54     def __iter__(self): return self
     64    def __iter__(self):
     65        return self
    5566
    5667    def next(self):
    5768        self.num += 1
    5869        if self.sent >= self.tosend:
    59             print self.info, 'done', ' '*(75-len(self.info)-6)
     70            print self.info, 'done', ' ' * (75 - len(self.info) - 6)
    6071            sys.stdout.flush()
    6172            raise StopIteration
     
    7990        steptime = sum(self.steptimes) / len(self.steptimes)
    8091        self.now = now
    81         eta = steptime * ((self.total - self.num)/self.stepsize)
     92        eta = steptime * ((self.total - self.num) / self.stepsize)
    8293
    8394        # tell it like it is (or might be)
     
    8899            S = eta % 60
    89100            if self.total:
    90                 s = '%s %2d%% (ETA %02d:%02d:%02d)'%(self.info,
     101                s = '%s %2d%% (ETA %02d:%02d:%02d)' % (self.info,
    91102                    self.num * 100. / self.total, H, M, S)
    92103            else:
    93                 s = '%s 0%% (ETA %02d:%02d:%02d)'%(self.info, H, M, S)
     104                s = '%s 0%% (ETA %02d:%02d:%02d)' % (self.info, H, M, S)
    94105        elif self.total:
    95             s = '%s %2d%%'%(self.info, self.num * 100. / self.total)
     106            s = '%s %2d%%' % (self.info, self.num * 100. / self.total)
    96107        else:
    97             s = '%s %d done'%(self.info, self.num)
    98         sys.stdout.write(s + ' '*(75-len(s)) + '\r')
     108            s = '%s %d done' % (self.info, self.num)
     109        sys.stdout.write(s + ' ' * (75 - len(s)) + '\r')
    99110        sys.stdout.flush()
     111
    100112
    101113class progressHTTPConnection(httplib.HTTPConnection):
     
    117129                p.display()
    118130
     131
    119132class progressHTTP(httplib.HTTP):
    120133    _connection_class = progressHTTPConnection
     134
    121135    def _setup(self, conn):
    122136        httplib.HTTP._setup(self, conn)
    123137        self.progress_send = self._conn.progress_send
    124138
     139
    125140def http_request(data, server, port, url):
    126141    h = progressHTTP(server, port)
     
    128143    data = mimeEncode(data)
    129144    h.putrequest('POST', url)
    130     h.putheader('Content-type', 'multipart/form-data; boundary=%s'%boundary)
     145    h.putheader('Content-type', 'multipart/form-data; boundary=%s' % boundary)
    131146    h.putheader('Content-length', str(len(data)))
    132147    h.putheader('Host', server)
     
    141156    f.close()
    142157
    143     print '%s %s'%(errcode, errmsg)
    144     if response: print response
     158    print '%s %s' % (errcode, errmsg)
     159    if response:
     160        print response
     161
    145162
    146163def usage():
     
    179196    url = None
    180197    for opt, arg in optlist:
    181         if opt == '-u': data['user'] = arg
    182         elif opt == '-p': data['password'] = arg
    183         elif opt == '-s': optional['is_screenshot'] = 'yes'
    184         elif opt == '-f': optional['is_final'] = 'yes'
    185         elif opt == '-d': data['description'] = arg
    186         elif opt == '-c': data['content_file'] = Upload(arg)
    187         elif opt == '-e': url = '/e/%s/oup/'%arg
    188         elif opt == '-h': host = arg
    189         elif opt == '-P': port = int(arg)
     198        if opt == '-u':
     199            data['user'] = arg
     200        elif opt == '-p':
     201            data['password'] = arg
     202        elif opt == '-s':
     203            optional['is_screenshot'] = 'yes'
     204        elif opt == '-f':
     205            optional['is_final'] = 'yes'
     206        elif opt == '-d':
     207            data['description'] = arg
     208        elif opt == '-c':
     209            data['content_file'] = Upload(arg)
     210        elif opt == '-e':
     211            url = '/e/%s/oup/' % arg
     212        elif opt == '-h':
     213            host = arg
     214        elif opt == '-P':
     215            port = int(arg)
    190216
    191217    if len(data) < 4 or url is None:
     
    196222    data.update(optional)
    197223    http_request(data, host, port, url)
    198 
  • setup.py

    r0 r3  
    1 import os
     1# setup.py
     2# -*- coding: utf8 -*-
     3# vim:fileencoding=utf8 ai ts=4 sts=4 et sw=4
    24
    3 # usage: python setup.py command
    4 #
    5 # sdist - build a source dist
    6 # py2exe - build an exe
    7 # py2app - build an app
    8 # cx_freeze - build a linux binary (not implemented)
    9 #
    10 # the goods are placed in the dist dir for you to .zip up or whatever...
     5"""Setuptools setup.py file for nagslang."""
    116
     7from setuptools import setup, find_packages
    128
    13 APP_NAME = 'nagslang'
    14 DESCRIPTION = open('README.txt').read()
    15 CHANGES = open('CHANGES.txt').read()
    16 TODO = open('TODO.txt').read()
     9try:
     10    import py2exe
     11    py2exe  # To make pyflakes happy.
     12except ImportError:
     13    pass
    1714
     15# This should probably be pulled from constants.py
     16VERSION_STR = "0.1a"
    1817
     18setup(   # Metadata
     19    name="nagslang",
     20    version=VERSION_STR,
     21    description="naglsang: Game for PyWeek 17",
    1922
    20 METADATA = {
    21     'name':APP_NAME,
    22     'version':          '0.0.1',
    23     'license':          'short_licence',
    24     'description':      '',
    25     'author':           '',
    26     #'author_email':     '',
    27     'url':              'http://pyweek.org/e/nagslang',
    28     'classifiers':      [
    29             'Development Status :: 4 - Beta',
    30             'Intended Audience :: End Users/Desktop',
    31             'Intended Audience :: Information Technology',
    32             'License :: OSI Approved :: BSD License',
    33             'Operating System :: OS Independent',
    34             'Programming Language :: Python :: 2',
    35             'Programming Language :: Python :: 2.5',
    36             'Programming Language :: Python :: 2.6',
    37             'Programming Language :: Python :: 2.7',
    38             'Programming Language :: Python :: 3',
    39             'Programming Language :: Python :: 3.0',
    40             'Programming Language :: Python :: 3.1',
    41             'Programming Language :: Python :: 3.2',
    42             'Topic :: Software Development :: Libraries :: pygame',
    43             'Topic :: Games/Entertainment :: Real Time Strategy',
     23    author=(", ".join([
     24        "Adrianna Pinska",
     25        "Jeremy Thurgood",
     26        "Neil Muller",
     27        "Simon Cross",
     28        "Stefano Rivera"])),
     29    author_email="",
     30
     31    maintainer="Nagslang Team",
     32    maintainer_email="ctpug@googlegroups.com",
     33
     34    url="http://ctpug.org.za/",
     35    download_url="https://ctpug.org.za/hg/nagslang/",
     36
     37    license="MIT",
     38
     39    classifiers=[
     40        'Development Status :: 4 - Beta',
     41        'Environment :: MacOS X',
     42        'Environment :: Win32 (MS Windows)',
     43        'Environment :: X11 Applications',
     44        'Intended Audience :: End Users/Desktop',
     45        'License :: OSI Approved :: MIT License',
     46        'Natural Language :: English',
     47        'Operating System :: Microsoft :: Windows',
     48        'Operating System :: POSIX',
     49        'Operating System :: MacOS :: MacOS X',
     50        'Programming Language :: Python :: 2.5',
     51        'Programming Language :: Python :: 2.6',
     52        'Topic :: Games/Entertainment :: Role-Playing',
     53        'Topic :: Games/Entertainment :: Arcade',
    4454    ],
    4555
     56    platforms=[
     57        'Linux',
     58        'Mac OS X',
     59        'Windows',
     60    ],
    4661
    47     'py2exe.target':'',
    48     #'py2exe.icon':'icon.ico', #64x64
    49     'py2exe.binary':APP_NAME, #leave off the .exe, it will be added
    50    
    51     'py2app.target':APP_NAME,
    52     'py2app.icon':'icon.icns', #128x128
    53    
    54     #'cx_freeze.cmd':'~/src/cx_Freeze-3.0.3/FreezePython',
    55     'cx_freeze.cmd':'cxfreeze',
    56     'cx_freeze.target':'%s_linux' % APP_NAME,
    57     'cx_freeze.binary':APP_NAME,
    58     }
    59    
    60 files_to_remove = ['tk84.dll',
    61                     '_ssl.pyd',
    62                     'tcl84.dll',
    63                     os.path.join('numpy','core', '_dotblas.pyd'),
    64                     os.path.join('numpy', 'linalg', 'lapack_lite.pyd'),
    65 ]
     62    # Dependencies
     63    install_requires=[],
    6664
     65    # Files
     66    packages=find_packages(),
     67    scripts=[
     68        'scripts/nagslang',
     69    ],
    6770
    68 directories_to_remove = [os.path.join('numpy', 'distutils'),
    69                          'distutils',
    70                          'tcl',
    71 ]
    72 
    73 
    74 cmdclass = {}
    75 PACKAGEDATA = {
    76     'cmdclass':    cmdclass,
    77 
    78     'package_dir': {'nagslang': 'nagslang',
    79                    },
    80     'packages': ['nagslang',
    81                 ],
    82     'scripts': ['scripts/nagslang'],
    83 }
    84 
    85 PACKAGEDATA.update(METADATA)
    86 
    87 
    88 from distutils.core import setup, Extension
    89 try:
    90     import py2exe
    91 except:
    92     pass
    93 
    94 import sys
    95 import glob
    96 import os
    97 import shutil
    98 
    99 try:
    100     cmd = sys.argv[1]
    101 except IndexError:
    102     print 'Usage: setup.py install|py2exe|py2app|cx_freeze'
    103     raise SystemExit
    104 
    105 # utility for adding subdirectories
    106 def add_files(dest,generator):
    107     for dirpath, dirnames, filenames in generator:
    108         for name in 'CVS', '.svn':
    109             if name in dirnames:
    110                 dirnames.remove(name)
    111 
    112         for name in filenames:
    113             if '~' in name: continue
    114             suffix = os.path.splitext(name)[1]
    115             if suffix in ('.pyc', '.pyo'): continue
    116             if name[0] == '.': continue
    117             filename = os.path.join(dirpath, name)
    118             dest.append(filename)
    119 
    120 # define what is our data
    121 _DATA_DIR = os.path.join('nagslang', 'data')
    122 data = []
    123 add_files(data,os.walk(_DATA_DIR))
    124 
    125 
    126 
    127 
    128 #data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data'), '*') for f2 in data]
    129 data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data')) for f2 in data]
    130 PACKAGEDATA['package_data'] = {'nagslang': data_dirs}
    131 
    132 
    133 
    134 
    135 
    136 data.extend(glob.glob('*.txt'))
    137 #data.append('MANIFEST.in')
    138 # define what is our source
    139 src = []
    140 add_files(src,os.walk('nagslang'))
    141 src.extend(glob.glob('*.py'))
    142 
    143 
    144 
    145 
    146 # build the sdist target
    147 if cmd not in "py2exe py2app cx_freeze".split():
    148     f = open("MANIFEST.in","w")
    149     for l in data: f.write("include "+l+"\n")
    150     for l in src: f.write("include "+l+"\n")
    151     f.close()
    152    
    153     setup(**PACKAGEDATA)
    154 
    155 # build the py2exe target
    156 if cmd in ('py2exe',):
    157     dist_dir = os.path.join('dist',METADATA['py2exe.target'])
    158     data_dir = dist_dir
    159    
    160     src = 'run_game.py'
    161     dest = METADATA['py2exe.binary']+'.py'
    162     shutil.copy(src,dest)
    163    
    164     setup(
    165         options={'py2exe':{
    166             'dist_dir':dist_dir,
    167             'dll_excludes':['_dotblas.pyd','_numpy.pyd', 'numpy.linalg.lapack_lite.pyd', 'numpy.core._dotblas.pyd'] + files_to_remove,
    168             'excludes':['matplotlib', 'tcl', 'OpenGL'],
    169             'ignores':['matplotlib', 'tcl', 'OpenGL'],
    170             'bundle_files':1,
    171             }},
    172 #        windows=[{
    173        console=[{
    174             'script':dest,
    175             #'icon_resources':[(1,METADATA['py2exe.icon'])],
    176             }],
    177         )
    178 
    179 # build the py2app target
    180 if cmd == 'py2app':
    181     dist_dir = os.path.join('dist',METADATA['py2app.target']+'.app')
    182     data_dir = os.path.join(dist_dir,'Contents','Resources')
    183     from setuptools import setup
    184 
    185     src = 'run_game.py'
    186     dest = METADATA['py2app.target']+'.py'
    187     shutil.copy(src,dest)
    188 
    189     APP = [dest]
    190     DATA_FILES = []
    191     OPTIONS = {'argv_emulation': True,
    192                #'iconfile':METADATA['py2app.icon']
    193               }
    194 
    195     setup(
    196         app=APP,
    197         data_files=DATA_FILES,
    198         options={'py2app': OPTIONS},
    199         setup_requires=['py2app'],
    200     )
    201 
    202 # make the cx_freeze target
    203 if cmd == 'cx_freeze':
    204     app_dist_dir = METADATA['cx_freeze.target'] + "_" + METADATA['version']
    205     dist_dir = os.path.join('dist', app_dist_dir)
    206     data_dir = dist_dir
    207 
    208     modules_exclude = "tcl,tk"
    209     cmd_args = (METADATA['cx_freeze.cmd'], dist_dir, METADATA['cx_freeze.binary'], modules_exclude)
    210     sys_cmd = '%s --install-dir=%s --target-name=%s --exclude-modules=%s run_game.py' % cmd_args
    211     print sys_cmd
    212     os.system(sys_cmd)
    213 
    214     import shutil
    215     if os.path.exists(os.path.join(data_dir, "tcl")):
    216         shutil.rmtree( os.path.join(data_dir, "tcl") )
    217     if os.path.exists(os.path.join(data_dir, "tk")):
    218         shutil.rmtree( os.path.join(data_dir, "tk") )
    219 
    220 
    221 
    222 # recursively make a bunch of folders
    223 def make_dirs(dname_):
    224     parts = list(os.path.split(dname_))
    225     dname = None
    226     while len(parts):
    227         if dname == None:
    228             dname = parts.pop(0)
    229         else:
    230             dname = os.path.join(dname,parts.pop(0))
    231         if not os.path.isdir(dname):
    232             os.mkdir(dname)
    233 
    234 # copy data into the binaries
    235 if cmd in ('py2exe','cx_freeze','py2app'):
    236     dest = data_dir
    237     for fname in data:
    238         dname = os.path.join(dest,os.path.dirname(fname))
    239         make_dirs(dname)
    240         if not os.path.isdir(fname):
    241             #print (fname,dname)
    242             shutil.copy(fname,dname)
    243 
    244 # make a tgz files.
    245 if cmd == 'cx_freeze':
    246     sys_cmd = "cd dist; tar -vczf %s.tgz %s/" % (app_dist_dir,app_dist_dir) 
    247     os.system(sys_cmd)
    248 
    249 
    250 # remove files from the zip.
    251 if 0 and cmd in ('py2exe'):
    252     import shutil
    253 
    254     #shutil.rmtree( os.path.join('dist') )
    255     #shutil.rmtree( os.path.join('build') )
    256 
    257 
    258     os.system("unzip dist/library.zip -d dist\library")
    259 
    260     for fn in files_to_remove:
    261         os.remove( os.path.join('dist', 'library', fn) )
    262 
    263 
    264     for d in directories_to_remove:
    265         if os.path.exists( os.path.join('dist', 'library', d) ):
    266             shutil.rmtree( os.path.join('dist', 'library', d) )
    267 
    268     os.remove( os.path.join('dist', 'library.zip') )
    269 
    270 
    271     os.chdir("dist")
    272     os.chdir("library")
    273 
    274     os.system("zip -r -9 ..\library.zip .")
    275 
    276     os.chdir("..")
    277     os.chdir("..")
     71    # py2exe
     72    console=['scripts/testconsole.py'],
     73    windows=[{
     74        'script': 'scripts/nagslang',
     75        'icon_resources': [(0, "data/icons/program/icon.ico")],
     76    }],
     77    app=['scripts/nagslang'],
     78    options={
     79        'py2exe': {
     80            'skip_archive': 1,
     81            'dist_dir': 'dist/nagslang-%s' % VERSION_STR,
     82            'packages': [
     83                'logging', 'encodings', 'nagslang',
     84            ],
     85            'includes': [
     86                'pygame',
     87            ],
     88            'excludes': [
     89                'numpy',
     90            ],
     91            'ignores': [
     92                # all database modules
     93                'pgdb', 'Sybase', 'adodbapi',
     94                'kinterbasdb', 'psycopg', 'psycopg2', 'pymssql',
     95                'sapdb', 'pysqlite2', 'sqlite', 'sqlite3',
     96                'MySQLdb', 'MySQLdb.connections',
     97                'MySQLdb.constants.CR', 'MySQLdb.constants.ER',
     98                # old datetime equivalents
     99                'DateTime', 'DateTime.ISO',
     100                'mx', 'mx.DateTime', 'mx.DateTime.ISO',
     101                # email modules
     102                'email.Generator', 'email.Iterators', 'email.Utils',
     103            ],
     104        },
     105        'py2app': {
     106            'app': ['run_game.py'],
     107            'argv_emulation': True,
     108            'iconfile': 'data/icons/program/icon.icns',
     109            'packages': [
     110                'logging', 'encodings', 'pygame', 'nagslang', 'data',
     111            ],
     112            'excludes': ['numpy'],
     113        }},
     114    data_files=[
     115        # 'COPYRIGHT',
     116        'LICENSE.txt',
     117        'README.txt',
     118    ],
     119    include_package_data=True,
     120)
Note: See TracChangeset for help on using the changeset viewer.