resin 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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