resin 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/amber/bin/amberc ADDED
@@ -0,0 +1,352 @@
1
+ #!/bin/bash
2
+ #
3
+ # This is a "compiler" for Amber code. Run without arguments for help.
4
+ #
5
+ # Get Amber root directory from the location of this script so that
6
+ # we can find the st and js directories etc.
7
+
8
+ # Earlier we used this but it does not work on Mac
9
+ # Amber=$(readlink -f `dirname ${0}`/..)
10
+ TARGET=`dirname ${0}`/..
11
+ pushd . >/dev/null
12
+ cd $TARGET
13
+ AMBER="`\pwd -P`"
14
+ popd >/dev/null
15
+
16
+ function usage {
17
+ cat <<ENDOFHELP
18
+ Usage: $0 [-l lib1,lib2...] [-i file] [-m class] [-M file]
19
+ [-o] [-O|-A] [-d] [-s suffix] [-S suffix] [file1 [file2 ...]] [Program]
20
+
21
+ Will compile Amber files - either separately or into a runnable complete
22
+ program. If no .st files are listed only a linking stage is performed.
23
+ Files listed will be handled using these rules:
24
+
25
+ *.js
26
+ Files are linked (concatenated) in listed order.
27
+ If not found we look in $AMBER/js
28
+
29
+ *.st
30
+ Files are compiled into .js files before concatenated.
31
+ If not found we look in $AMBER/st.
32
+
33
+ NOTE: Each file is currently considered to be a fileout of a single class
34
+ category of the same name as the file!
35
+
36
+ If no Program is specified each given .st file will be compiled into
37
+ a .js file. Otherwise a <Program>.js file is linked together based on
38
+ the options:
39
+
40
+ -l library1,library2
41
+ Additionally add listed libraries (no spaces or .js) in listed order.
42
+
43
+ -i file
44
+ Add library initializer <file> instead of default $AMBER/js/init.js
45
+
46
+ -m class
47
+ Add at end a call to #main in class <class>.
48
+
49
+ -M file
50
+ Add at end javascript file <file> acting as main.
51
+
52
+ -o
53
+ Optimize each js file using the Google closure compiler.
54
+ Using Closure compiler found at ~/compiler.jar
55
+
56
+ -O
57
+ Optimize final <Program>.js using the Google closure compiler.
58
+ Using Closure compiler found at ~/compiler.jar
59
+
60
+ -A Same as -O but use --compilation_level ADVANCED_OPTIMIZATIONS
61
+
62
+ -d
63
+ Additionally export code for deploy - stripped from source etc.
64
+ Uses suffix ".deploy.js" in addition to any explicit given suffic using -s.
65
+
66
+ -s suffix
67
+ Add <suffix> to compiled js files so that File.st is compiled into
68
+ File.<suffix>.js.
69
+
70
+ -S suffix
71
+ Use <suffix> for all libraries accessed using -L or -l. This makes it possible
72
+ to have multiple flavors of Amber and libraries in the same place.
73
+
74
+
75
+ Example invocations:
76
+
77
+ Just compile Kernel-Objects.st to Kernel-Objects.js:
78
+
79
+ amberc Kernel-Objects.st
80
+
81
+ Compile Hello.st to Hello.js and create complete program called
82
+ Program.js and adding a call to class method #main in class Hello:
83
+
84
+ amberc -m Hello Hello.st Program
85
+
86
+ Compile two .st files into corresponding .js files,
87
+ and link with specific myboot.js, myKernel.js, myinit.js
88
+ and main.js and create complete program called Program.js:
89
+
90
+ amberc -M main.js myinit.js myboot.js myKernel.js Cat1.st Cat2.st Program
91
+
92
+ ENDOFHELP
93
+ exit 1;
94
+ }
95
+
96
+ # Check we at least got one argument
97
+ if [ -z $1 ] ; then
98
+ usage
99
+ fi
100
+
101
+ # Define our predefined library combinations
102
+ KERNEL="boot Kernel-Objects Kernel-Classes Kernel-Methods Kernel-Collections Kernel-Exceptions Kernel-Transcript"
103
+ COMPILER="$KERNEL parser Compiler"
104
+
105
+ # Predefined initializer
106
+ INITIALIZER="$AMBER/js/init.js"
107
+
108
+ # Default values
109
+ ENV=
110
+ INIT=$INITIALIZER
111
+ MAIN=
112
+ MAINFILE=
113
+ BASE=$KERNEL
114
+ LOAD=
115
+ CLOSUREOPTS=
116
+ # Ok, bad coding practice but hey, who would use such a suffix?
117
+ SUFFIX=no-silly-suffix
118
+ SUFFIXUSED=
119
+ DEPLOY=false
120
+ NODECOMPILE=nodecompile
121
+
122
+ # Read options and shift them away
123
+ while getopts "l:i:m:M:oOAds:S:h?" o; do
124
+ case "$o" in
125
+ l) LOAD=$OPTARG;;
126
+ i) INIT=$OPTARG;;
127
+ m) MAIN=$OPTARG;;
128
+ M) MAINFILE=$OPTARG;;
129
+ o) CLOSURE=true
130
+ CLOSUREPARTS=true;;
131
+ O) CLOSURE=true
132
+ CLOSUREFULL=true;;
133
+ A) CLOSURE=true
134
+ CLOSUREOPTS="$CLOSUREOPTS --compilation_level ADVANCED_OPTIMIZATIONS"
135
+ CLOSUREFULL=true;;
136
+ d) DEPLOY=true;;
137
+ s) SUFFIX=$OPTARG
138
+ SUFFIXUSED=$SUFFIX;;
139
+ S) LOADSUFFIX=$OPTARG
140
+ SUFFIXUSED=$SUFFIX;;
141
+ h) usage;;
142
+ [?]) usage;;
143
+ esac
144
+ done
145
+ shift $(($OPTIND - 1))
146
+
147
+ # Check for Closure compiler and Java
148
+ if [ ! -z $CLOSURE ]; then
149
+ java > /dev/null
150
+ if [ $? -eq 0 ]; then
151
+ if [ ! -f ~/compiler.jar ]; then
152
+ echo "Can not find Closure compiler at ~/compiler.jar"
153
+ exit 1
154
+ fi
155
+ else
156
+ echo "java is not installed and is needed for -O, -A or -o (Closure compiler)."
157
+ exit 1
158
+ fi
159
+ fi
160
+
161
+ # Function for looking up listed js files
162
+ function resolvejs {
163
+ FNAME="$1$LOADSUFFIX.js"
164
+ if [ -f $FNAME ]; then
165
+ RESOLVED="$FNAME"
166
+ else
167
+ if [ -f $AMBER/js/$FNAME ]; then
168
+ RESOLVED="$AMBER/js/$FNAME"
169
+ else
170
+ echo "Javascript file not found: $FNAME"
171
+ exit 1
172
+ fi
173
+ fi
174
+ }
175
+
176
+ # Resolve listed libraries in $BASE deparated by spaces
177
+ for FILE in $BASE
178
+ do
179
+ resolvejs $FILE
180
+ TOBASE="$TOBASE $RESOLVED"
181
+ done
182
+
183
+ # Resolve listed libraries in $LOAD separated by ,
184
+ LOAD=${LOAD//,/\ }
185
+ for FILE in $LOAD
186
+ do
187
+ resolvejs $FILE
188
+ TOLOAD="$TOLOAD $RESOLVED"
189
+ done
190
+
191
+ # Resolve COMPILER
192
+ for FILE in $COMPILER
193
+ do
194
+ resolvejs $FILE
195
+ TOCOMPILER="$TOCOMPILER $RESOLVED"
196
+ done
197
+
198
+ # Add supplied libraries we have not already loaded (they are already resolved)
199
+ #for FILE in $EXTRA
200
+ #do
201
+ # resolvejs $FILE
202
+ # TOEXTRA="$TOEXTRA $RESOLVED"
203
+ #done
204
+
205
+ TOCOMPILER="$TOCOMPILER$TOLOAD"
206
+
207
+ # Resolve init and nodecompile
208
+ THEREST="init $AMBER/bin/$NODECOMPILE"
209
+ for FILE in $THEREST
210
+ do
211
+ resolvejs $FILE
212
+ TOCOMPILER="$TOCOMPILER $RESOLVED"
213
+ done
214
+
215
+ # Add supplied libraries
216
+ LIBS="$TOBASE $TOLOAD"
217
+
218
+ # Get a unique tempdir and make it get auto removed on exit
219
+ TMPDIR=`mktemp -d amberc.XXXXXX`
220
+ trap "rm -rf $TMPDIR" EXIT
221
+
222
+
223
+ # --------------------------------------------------
224
+ # Collect libraries and Smalltalk files looking
225
+ # both locally and in $AMBER/js and $AMBER/st
226
+ # --------------------------------------------------
227
+ PROGRAM=
228
+ until [ "$*" = "" ]
229
+ do
230
+ case $1 in
231
+ *.st)
232
+ CATEGORY=`basename $1 .st`
233
+ if [ -f "$1" ]; then
234
+ COMPILE="$COMPILE $1 $CATEGORY"
235
+ COMPILED="$COMPILED $CATEGORY$SUFFIXUSED.js"
236
+ else
237
+ if [ -f $AMBER/st/$1 ]; then
238
+ COMPILE="$COMPILE $AMBER/st/$1 $CATEGORY"
239
+ COMPILED="$COMPILED $CATEGORY$SUFFIXUSED.js"
240
+ else
241
+ echo "Amber file not found: $1"
242
+ exit 1
243
+ fi
244
+ fi
245
+ ;;
246
+
247
+ *.js)
248
+ resolvejs $1
249
+ LIBS="$LIBS $RESOLVED"
250
+ ;;
251
+ *)
252
+ # Will end up being the last non js/st argument
253
+ PROGRAM=$1
254
+ ;;
255
+ esac
256
+ shift
257
+ done
258
+
259
+ # --------------------------------------------------
260
+ # Actual compilation phase of collected .st files
261
+ # --------------------------------------------------
262
+
263
+ # Create compiler dynamically
264
+ cat $TOCOMPILER > $TMPDIR/compiler.js
265
+
266
+ # Compile all collected .st files to .js
267
+ echo "Loading libraries$TOCOMPILER and compiling ..."
268
+ node $TMPDIR/compiler.js $DEPLOY $SUFFIX $COMPILE
269
+
270
+ # Verify all .js files corresponding to .st files were created, otherwise exit
271
+ IFS=" "
272
+ for FILE in $COMPILED
273
+ do
274
+ if [ ! -f "$FILE" ]; then
275
+ echo "Failed compilation of $FILE, exiting."
276
+ exit 1
277
+ fi
278
+ done
279
+
280
+ if [ ! -z $CLOSUREPARTS ]; then
281
+ echo "Compiling all js files using Google closure compiler."
282
+
283
+ ALLJSFILES="$COMPILED $LIBS"
284
+ for FILE in $ALLJSFILES
285
+ do
286
+ mv $FILE $FILE.original
287
+ java -jar ~/compiler.jar $CLOSUREOPTS --js $FILE.original --js_output_file $FILE
288
+ rm $FILE.original
289
+ done
290
+ fi
291
+
292
+
293
+ if [ -z $PROGRAM ]; then
294
+ echo "Done."
295
+ exit 0
296
+ fi
297
+
298
+ # --------------------------------------------------
299
+ # Now we start composing resulting javascript file.
300
+ # --------------------------------------------------
301
+
302
+ # Add collected libraries to libs.js file.
303
+ if [ ! -z "$LIBS" ]; then
304
+ echo "Adding libraries $LIBS ..."
305
+ cat $LIBS > $TMPDIR/libs.js
306
+ LIBS=$TMPDIR/libs.js
307
+ fi
308
+
309
+ echo "Adding Amber code$COMPILED ..."
310
+
311
+ # Check for init file
312
+ if [ ! -z "$INIT" ]; then
313
+ if [ -f "$INIT" ]; then
314
+ echo "Adding initializer $INIT ..."
315
+ else
316
+ echo "Can not find init file $INIT, exiting."
317
+ exit 1
318
+ fi
319
+ fi
320
+
321
+ # Check for adding main
322
+ if [ ! -z "$MAIN" ]; then
323
+ echo "Adding call to $MAIN class >> main ..."
324
+ echo "smalltalk.$MAIN._main()" > $TMPDIR/main.js
325
+ MAIN=$TMPDIR/main.js
326
+ fi
327
+
328
+ # Check for adding main file
329
+ if [ ! -z "$MAINFILE" ]; then
330
+ if [ -f "$MAINFILE" ]; then
331
+ echo "Adding main as $MAINFILE ..."
332
+ else
333
+ echo "Can not find main file $MAINFILE, exiting."
334
+ exit 1
335
+ fi
336
+ MAIN=$MAINFILE
337
+ fi
338
+
339
+ # And finally concatenate Program.js
340
+ echo "Writing $PROGRAM.js ..."
341
+ cat $LIBS $COMPILED $INIT $MAIN > $PROGRAM.js
342
+ echo "Done."
343
+
344
+
345
+ if [ ! -z $CLOSUREFULL ]; then
346
+ echo "Compiling $PROGRAM.js file using Google closure compiler."
347
+ mv $PROGRAM.js $PROGRAM.js.original
348
+ java -jar ~/compiler.jar $CLOSUREOPTS --js $PROGRAM.js.original --js_output_file $PROGRAM.js
349
+ rm $PROGRAM.js.original
350
+ echo "Done."
351
+ fi
352
+
@@ -0,0 +1,33 @@
1
+ // NOTE: This code is called using the amberc bash script - do not use directly.
2
+ // The arguments variable is a series of .st filenames and category names.
3
+ // If it is a .st file we import it, if it is a category name we export it
4
+ // as aCategoryName.js.
5
+ var sys = require('sys'), fs = require('fs');
6
+
7
+ // Only care about our arguments, strip away node, all.js and debug flag.
8
+ var arguments = process.argv.splice(4);
9
+
10
+ // First argument is also produce deploy files: "true" or "false"
11
+ var deploy = (process.argv[2] == "true");
12
+
13
+ // Second argument is suffix: "no-silly-suffix" means none
14
+ suffix = process.argv[3];
15
+ if (suffix == "no-silly-suffix") {
16
+ suffix = "";
17
+ }
18
+
19
+ // If it ends with .st, import it, otherwise export category as .js
20
+ arguments.forEach(function(val, index, array) {
21
+ if (/\.st/.test(val)) {
22
+ sys.puts("Reading file " + val);
23
+ code = fs.readFileSync(val, "utf8");
24
+ smalltalk.Importer._new()._import_(code._stream());
25
+ } else {
26
+ sys.puts("Exporting " + (deploy ? "(debug + deploy)" : "(debug)") + " category "
27
+ + val + " as " + val + suffix + ".js" + (deploy ? " and " + val + suffix + ".deploy.js" : ""));
28
+ fs.writeFileSync(val + suffix + ".js", smalltalk.Exporter._new()._exportPackage_(val));
29
+ if (deploy) {
30
+ fs.writeFileSync(val + suffix + ".deploy.js", smalltalk.StrippedExporter._new()._exportPackage_(val));
31
+ }
32
+ }
33
+ });
data/bin/resin-compile ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'resin/compiler'
5
+
6
+ Resin::Compiler.run
@@ -0,0 +1,81 @@
1
+
2
+ module Resin
3
+ module Compiler
4
+ CORE = ['boot', 'Kernel-Objects', 'Kernel-Classes', 'Kernel-Methods',
5
+ 'Kernel-Collections', 'Kernel-Exceptions', 'Canvas']
6
+
7
+ def self.write_file(handle, filepath)
8
+ package = File.basename(filepath).split('.').first
9
+ puts "#{package} #{filepath}"
10
+ handle.write("/* start #{package} */\n")
11
+ handle.write(File.open(filepath, 'r').read)
12
+ handle.write("\n/* end #{package} */\n")
13
+
14
+ end
15
+
16
+ def self.run(additional_files=nil)
17
+ begin
18
+ spec = Gem::Specification.find_by_name('resin')
19
+ amber_path = File.join(spec.full_gem_path, 'amber')
20
+ rescue Gem::LoadError
21
+ amber_path = File.expand_path(File.dirname(__FILE__) + '/../amber/')
22
+ end
23
+ project_path = Dir.pwd
24
+
25
+
26
+ files = Dir["#{project_path}/js/*.deploy.js"]
27
+ drop_files = Dir["#{project_path}/drops/**/js/*.deploy.js"]
28
+ out = File.open('resin-app.deploy.js', 'w')
29
+
30
+ write_file(out, File.join(amber_path, 'js', 'lib', 'jQuery', 'jquery-1.6.4.min.js'))
31
+
32
+ puts ">> Writing the Amber core: "
33
+ CORE.each do |package|
34
+ # Default to try to load the deploy script if it exists
35
+ path = File.join(amber_path, 'js', "#{package}.deploy.js")
36
+ unless File.exists? path
37
+ path = File.join(amber_path, 'js', "#{package}.js")
38
+ unless File.exists? path
39
+ puts "Missing #{package}!"
40
+ puts "(looked for #{path})"
41
+ puts "Aborting."
42
+ exit 1
43
+ end
44
+ end
45
+ write_file(out, path)
46
+ end
47
+ puts
48
+
49
+ puts ">> Writing project files: "
50
+ files.each do |path|
51
+ if path =~ /.*-Tests.*/
52
+ next
53
+ end
54
+ write_file(out, path)
55
+ end
56
+ puts
57
+
58
+ puts ">> Writing drop files: "
59
+ drop_files.each do |path|
60
+ if path =~ /.*-Tests.*/
61
+ next
62
+ end
63
+ write_file(out, path)
64
+ end
65
+ puts
66
+
67
+ unless additional_files.nil?
68
+ additional_files.each do |path|
69
+ path = File.join(project_path, 'js', additional_files)
70
+ write_file(out, path)
71
+ end
72
+ end
73
+
74
+ write_file(out, File.join(amber_path, 'js', 'init.js'))
75
+
76
+ out.close
77
+
78
+ end
79
+ end
80
+ end
81
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-21 00:00:00.000000000 Z
12
+ date: 2012-03-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &3285240 !ruby/object:Gem::Requirement
16
+ requirement: &7640840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *3285240
24
+ version_requirements: *7640840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &3284540 !ruby/object:Gem::Requirement
27
+ requirement: &7640400 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *3284540
35
+ version_requirements: *7640400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shotgun
38
- requirement: &3283740 !ruby/object:Gem::Requirement
38
+ requirement: &7639920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *3283740
46
+ version_requirements: *7639920
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &3283020 !ruby/object:Gem::Requirement
49
+ requirement: &7639500 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *3283020
57
+ version_requirements: *7639500
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rack-test
60
- requirement: &3282340 !ruby/object:Gem::Requirement
60
+ requirement: &7639040 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *3282340
68
+ version_requirements: *7639040
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: thin
71
- requirement: &3298000 !ruby/object:Gem::Requirement
71
+ requirement: &7638620 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *3298000
79
+ version_requirements: *7638620
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: haml
82
- requirement: &3297320 !ruby/object:Gem::Requirement
82
+ requirement: &7638200 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *3297320
90
+ version_requirements: *7638200
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sinatra
93
- requirement: &3296460 !ruby/object:Gem::Requirement
93
+ requirement: &7637780 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *3296460
101
+ version_requirements: *7637780
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: json
104
- requirement: &3295300 !ruby/object:Gem::Requirement
104
+ requirement: &7637300 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,18 +109,21 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *3295300
112
+ version_requirements: *7637300
113
113
  description:
114
114
  email: tyler@linux.com
115
115
  executables:
116
116
  - runresin
117
+ - resin-compile
117
118
  extensions: []
118
119
  extra_rdoc_files:
119
120
  - README.markdown
120
121
  files:
121
122
  - bin/runresin
123
+ - bin/resin-compile
122
124
  - lib/resin/helpers.rb
123
125
  - lib/resin/app.rb
126
+ - lib/resin/compiler.rb
124
127
  - lib/resin.rb
125
128
  - lib/resin/views/index.haml
126
129
  - amber/css/amber-normalize.css
@@ -203,6 +206,8 @@ files:
203
206
  - amber/images/amber.png
204
207
  - amber/images/offHover.png
205
208
  - amber/images/amber_small.png
209
+ - amber/bin/amberc
210
+ - amber/bin/nodecompile.js
206
211
  - README.markdown
207
212
  homepage: https://github.com/rtyler/resin
208
213
  licenses: []
@@ -216,18 +221,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
221
  - - ! '>='
217
222
  - !ruby/object:Gem::Version
218
223
  version: '0'
219
- segments:
220
- - 0
221
- hash: 2600024671058263064
222
224
  required_rubygems_version: !ruby/object:Gem::Requirement
223
225
  none: false
224
226
  requirements:
225
227
  - - ! '>='
226
228
  - !ruby/object:Gem::Version
227
229
  version: '0'
228
- segments:
229
- - 0
230
- hash: 2600024671058263064
231
230
  requirements: []
232
231
  rubyforge_project:
233
232
  rubygems_version: 1.8.10