Ignore:
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pyweek_upload.py

    r2 r0  
    44Handles authentication and gives upload progress feedback.
    55'''
    6 import sys
    7 import os
    8 import httplib
    9 import cStringIO
    10 import socket
    11 import time
    12 import getopt
     6import sys, os, httplib, cStringIO, socket, time, getopt
    137
    14 
    15 class Upload(object):
     8class Upload:
    169    def __init__(self, filename):
    1710        self.filename = filename
     
    2013sep_boundary = '\n--' + boundary
    2114end_boundary = sep_boundary + '--'
    22 
    2315
    2416def mimeEncode(data, sep_boundary=sep_boundary, end_boundary=end_boundary):
     
    2921    for key, value in data.items():
    3022        # handle multiple entries for the same name
    31         if not isinstance(value, list):
    32             value = [value]
     23        if type(value) != type([]): value = [value]
    3324        for value in value:
    3425            ret.write(sep_boundary)
    3526            if isinstance(value, Upload):
    36                 ret.write('\nContent-Disposition: form-data; name="%s"' % key)
     27                ret.write('\nContent-Disposition: form-data; name="%s"'%key)
    3728                filename = os.path.basename(value.filename)
    38                 ret.write('; filename="%s"\n\n' % filename)
     29                ret.write('; filename="%s"\n\n'%filename)
    3930                value = open(os.path.join(value.filename), "rb").read()
    4031            else:
    41                 ret.write('\nContent-Disposition: form-data; name="%s"' % key)
     32                ret.write('\nContent-Disposition: form-data; name="%s"'%key)
    4233                ret.write("\n\n")
    4334                value = str(value)
     
    4839    return ret.getvalue()
    4940
    50 
    51 class Progress(object):
     41class Progress:
    5242    def __init__(self, info, data):
    5343        self.info = info
    5444        self.tosend = len(data)
    55         self.total = self.tosend / 1024
     45        self.total = self.tosend/1024
    5646        self.data = cStringIO.StringIO(data)
    5747        self.start = self.now = time.time()
     
    6252        self.display()
    6353
    64     def __iter__(self):
    65         return self
     54    def __iter__(self): return self
    6655
    6756    def next(self):
    6857        self.num += 1
    6958        if self.sent >= self.tosend:
    70             print self.info, 'done', ' ' * (75 - len(self.info) - 6)
     59            print self.info, 'done', ' '*(75-len(self.info)-6)
    7160            sys.stdout.flush()
    7261            raise StopIteration
     
    9079        steptime = sum(self.steptimes) / len(self.steptimes)
    9180        self.now = now
    92         eta = steptime * ((self.total - self.num) / self.stepsize)
     81        eta = steptime * ((self.total - self.num)/self.stepsize)
    9382
    9483        # tell it like it is (or might be)
     
    9988            S = eta % 60
    10089            if self.total:
    101                 s = '%s %2d%% (ETA %02d:%02d:%02d)' % (self.info,
     90                s = '%s %2d%% (ETA %02d:%02d:%02d)'%(self.info,
    10291                    self.num * 100. / self.total, H, M, S)
    10392            else:
    104                 s = '%s 0%% (ETA %02d:%02d:%02d)' % (self.info, H, M, S)
     93                s = '%s 0%% (ETA %02d:%02d:%02d)'%(self.info, H, M, S)
    10594        elif self.total:
    106             s = '%s %2d%%' % (self.info, self.num * 100. / self.total)
     95            s = '%s %2d%%'%(self.info, self.num * 100. / self.total)
    10796        else:
    108             s = '%s %d done' % (self.info, self.num)
    109         sys.stdout.write(s + ' ' * (75 - len(s)) + '\r')
     97            s = '%s %d done'%(self.info, self.num)
     98        sys.stdout.write(s + ' '*(75-len(s)) + '\r')
    11099        sys.stdout.flush()
    111 
    112100
    113101class progressHTTPConnection(httplib.HTTPConnection):
     
    129117                p.display()
    130118
    131 
    132119class progressHTTP(httplib.HTTP):
    133120    _connection_class = progressHTTPConnection
    134 
    135121    def _setup(self, conn):
    136122        httplib.HTTP._setup(self, conn)
    137123        self.progress_send = self._conn.progress_send
    138 
    139124
    140125def http_request(data, server, port, url):
     
    143128    data = mimeEncode(data)
    144129    h.putrequest('POST', url)
    145     h.putheader('Content-type', 'multipart/form-data; boundary=%s' % boundary)
     130    h.putheader('Content-type', 'multipart/form-data; boundary=%s'%boundary)
    146131    h.putheader('Content-length', str(len(data)))
    147132    h.putheader('Host', server)
     
    156141    f.close()
    157142
    158     print '%s %s' % (errcode, errmsg)
    159     if response:
    160         print response
    161 
     143    print '%s %s'%(errcode, errmsg)
     144    if response: print response
    162145
    163146def usage():
     
    196179    url = None
    197180    for opt, arg in optlist:
    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)
     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)
    216190
    217191    if len(data) < 4 or url is None:
     
    222196    data.update(optional)
    223197    http_request(data, host, port, url)
     198
  • setup.py

    r3 r0  
    1 # setup.py
    2 # -*- coding: utf8 -*-
    3 # vim:fileencoding=utf8 ai ts=4 sts=4 et sw=4
    4 
    5 """Setuptools setup.py file for nagslang."""
    6 
    7 from setuptools import setup, find_packages
    8 
     1import os
     2
     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...
     11
     12
     13APP_NAME = 'nagslang'
     14DESCRIPTION = open('README.txt').read()
     15CHANGES = open('CHANGES.txt').read()
     16TODO = open('TODO.txt').read()
     17
     18
     19
     20METADATA = {
     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',
     44    ],
     45
     46
     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   
     60files_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]
     66
     67
     68directories_to_remove = [os.path.join('numpy', 'distutils'),
     69                         'distutils',
     70                         'tcl',
     71]
     72
     73
     74cmdclass = {}
     75PACKAGEDATA = {
     76    'cmdclass':    cmdclass,
     77
     78    'package_dir': {'nagslang': 'nagslang',
     79                   },
     80    'packages': ['nagslang',
     81                ],
     82    'scripts': ['scripts/nagslang'],
     83}
     84
     85PACKAGEDATA.update(METADATA)
     86
     87
     88from distutils.core import setup, Extension
    989try:
    1090    import py2exe
    11     py2exe  # To make pyflakes happy.
    12 except ImportError:
     91except:
    1392    pass
    1493
    15 # This should probably be pulled from constants.py
    16 VERSION_STR = "0.1a"
    17 
    18 setup(   # Metadata
    19     name="nagslang",
    20     version=VERSION_STR,
    21     description="naglsang: Game for PyWeek 17",
    22 
    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',
    54     ],
    55 
    56     platforms=[
    57         'Linux',
    58         'Mac OS X',
    59         'Windows',
    60     ],
    61 
    62     # Dependencies
    63     install_requires=[],
    64 
    65     # Files
    66     packages=find_packages(),
    67     scripts=[
    68         'scripts/nagslang',
    69     ],
    70 
    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 )
     94import sys
     95import glob
     96import os
     97import shutil
     98
     99try:
     100    cmd = sys.argv[1]
     101except IndexError:
     102    print 'Usage: setup.py install|py2exe|py2app|cx_freeze'
     103    raise SystemExit
     104
     105# utility for adding subdirectories
     106def 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')
     122data = []
     123add_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]
     129data_dirs = [os.path.join(f2.replace(_DATA_DIR, 'data')) for f2 in data]
     130PACKAGEDATA['package_data'] = {'nagslang': data_dirs}
     131
     132
     133
     134
     135
     136data.extend(glob.glob('*.txt'))
     137#data.append('MANIFEST.in')
     138# define what is our source
     139src = []
     140add_files(src,os.walk('nagslang'))
     141src.extend(glob.glob('*.py'))
     142
     143
     144
     145
     146# build the sdist target
     147if 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
     156if 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
     180if 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
     203if 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
     223def 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
     235if 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.
     245if 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.
     251if 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("..")
Note: See TracChangeset for help on using the changeset viewer.