~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to setup/listmake.py

  • Committer: wagrant
  • Date: 2008-12-20 03:46:56 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1060
Make IVLE work fine in Firefox 3.1 (ie. Gecko/XULRunner 1.9.1). Gecko 1.9.1 has
a built-in JSON object, so our json2.js isn't used, and compatibility problems
arise. The only one significant to us is that Gecko's doesn't support having
a primitive as the root object. Unfortunately we use that sort of thing in a
few places, so IVLE ends up pretty much broken.

A few adjustments were needed both client- and server-side for proto changes:

 - consoleservice and the JS interacting with it now deal with the key returned
   by start_server in a dict like {'key': ...}.
 - tutorialservice and interacting JS deal with code returned by getattempt in
   a dict like {'code': ...}.


The JS repr() implementation used JSON.stringify on the given object, and was
used only with primitive objects in order to create function calls. This needed
to be eliminated for compatibility with the new Gecko, so these call
constructions were replaced with better events:

 - listing.js constructed events for generated file listings by repr()ing some
   strings. That is foul, so we instead use DOM operations from 'this' in a
   somewhat nicer event handler.
 - tutorial.js previously created save_exercise() call strings by repr()ing
   lots of stuff. That was really bad, and broke like the rest. I replaced it
   with something that's still bad, but not quite as awful - grabbing the call
   string from the save button. This should be fixed at some point.
 - console.js had some strange Firebug logging stuff which used repr(). I
   removed it, as it shouldn't have been in released code in the first place.

repr() itself was removed after all references were.
   

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# IVLE - Informatics Virtual Learning Environment
 
2
# Copyright (C) 2007-2008 The University of Melbourne
 
3
#
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; either version 2 of the License, or
 
7
# (at your option) any later version.
 
8
#
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program; if not, write to the Free Software
 
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
17
 
 
18
# Module: setup/listmake
 
19
# Author: Matt Giuca, Refactored by David Coles
 
20
# Date:   03/07/2008
 
21
 
 
22
# setup/listmake.py
 
23
# (for developer use only)
 
24
# Recurses through the source tree and builds a list of all files which should
 
25
# be copied upon installation. This should be run by the developer before
 
26
# cutting a distribution, and the listfile it generates should be included in
 
27
# the distribution, avoiding the administrator having to run it.
 
28
 
 
29
import optparse
 
30
import os
 
31
import mimetypes
 
32
import sys
 
33
from setuputil import filter_mutate
 
34
 
 
35
# Mime types which will automatically be placed in the list by listmake.
 
36
# Note that listmake is not intended to be run by the final user (the system
 
37
# administrator who installs this), so the developers can customize the list
 
38
# as necessary, and include it in the distribution.
 
39
listmake_mimetypes = ['text/x-python', 'text/html',
 
40
    'application/x-javascript', 'application/javascript',
 
41
    'text/css', 'image/png', 'image/gif', 'application/xml']
 
42
 
 
43
def listmake(args):
 
44
    usage = """usage: %prog listmake [options]
 
45
(For developer use only)
 
46
Recurses through the source tree and builds a list of all files which should
 
47
be copied upon installation. This should be run by the developer before
 
48
cutting a distribution, and the listfile it generates should be included in
 
49
the distribution, avoiding the administrator having to run it."""
 
50
 
 
51
    # Parse arguments
 
52
    parser = optparse.OptionParser(usage)
 
53
    (options, args) = parser.parse_args(args)
 
54
 
 
55
    # Call the real function
 
56
    __listmake()
 
57
 
 
58
def __listmake():
 
59
    # We build two separate lists, by walking www and console
 
60
    list_www = build_list_py_files('www')
 
61
    list_lib = build_list_py_files('lib')
 
62
    list_subjects = build_list_py_files('subjects', no_top_level=True)
 
63
    list_exercises = build_list_py_files('exercises', no_top_level=True)
 
64
    list_scripts = [
 
65
        "scripts/python-console",
 
66
        "scripts/fileservice",
 
67
        "scripts/serveservice",
 
68
        "scripts/interpretservice",
 
69
        "scripts/usrmgt-server",
 
70
        "scripts/diffservice",
 
71
        "scripts/svnlogservice",
 
72
    ]
 
73
    # Make sure that the files generated by conf are in the list
 
74
    # (since listmake is typically run before conf)
 
75
    if "lib/conf/conf.py" not in list_lib:
 
76
        list_lib.append("lib/conf/conf.py")
 
77
    # Write these out to a file
 
78
    cwd = os.getcwd()
 
79
    # the files that will be created/overwritten
 
80
    listfile = os.path.join(cwd, "install_list.py")
 
81
 
 
82
    try:
 
83
        file = open(listfile, "w")
 
84
 
 
85
        file.write("""# IVLE Configuration File
 
86
# install_list.py
 
87
# Provides lists of all files to be installed by `setup.py install' from
 
88
# certain directories.
 
89
# Note that any files with the given filename plus 'c' or 'o' (that is,
 
90
# compiled .pyc or .pyo files) will be copied as well.
 
91
 
 
92
# List of all installable files in www directory.
 
93
list_www = """)
 
94
        writelist_pretty(file, list_www)
 
95
        file.write("""
 
96
# List of all installable files in lib directory.
 
97
list_lib = """)
 
98
        writelist_pretty(file, list_lib)
 
99
        file.write("""
 
100
# List of all installable files in scripts directory.
 
101
list_scripts = """)
 
102
        writelist_pretty(file, list_scripts)
 
103
        file.write("""
 
104
# List of all installable files in subjects directory.
 
105
# This is to install sample subjects and material.
 
106
list_subjects = """)
 
107
        writelist_pretty(file, list_subjects)
 
108
        file.write("""
 
109
# List of all installable files in exercises directory.
 
110
# This is to install sample exercise material.
 
111
list_exercises = """)
 
112
        writelist_pretty(file, list_exercises)
 
113
 
 
114
        file.close()
 
115
    except IOError, (errno, strerror):
 
116
        print "IO error(%s): %s" % (errno, strerror)
 
117
        sys.exit(1)
 
118
 
 
119
    print "Successfully wrote install_list.py"
 
120
 
 
121
    print
 
122
    print ("You may modify the set of installable files before cutting the "
 
123
            "distribution:")
 
124
    print listfile
 
125
    print
 
126
 
 
127
    return 0
 
128
 
 
129
def build_list_py_files(dir, no_top_level=False):
 
130
    """Builds a list of all py files found in a directory and its
 
131
    subdirectories. Returns this as a list of strings.
 
132
    no_top_level=True means the file paths will not include the top-level
 
133
    directory.
 
134
    """
 
135
    pylist = []
 
136
    for (dirpath, dirnames, filenames) in os.walk(dir):
 
137
        # Exclude directories beginning with a '.' (such as '.svn')
 
138
        filter_mutate(lambda x: x[0] != '.', dirnames)
 
139
        # All *.py files are added to the list
 
140
        pylist += [os.path.join(dirpath, item) for item in filenames
 
141
            if mimetypes.guess_type(item)[0] in listmake_mimetypes]
 
142
    if no_top_level:
 
143
        for i in range(0, len(pylist)):
 
144
            _, pylist[i] = pylist[i].split(os.sep, 1)
 
145
    return pylist
 
146
 
 
147
def writelist_pretty(file, list):
 
148
    """Writes a list one element per line, to a file."""
 
149
    if list == []:
 
150
        file.write("[]\n")
 
151
    else:
 
152
        file.write('[\n')
 
153
        for elem in list:
 
154
            file.write('    %s,\n' % repr(elem))
 
155
        file.write(']\n')
 
156