resin 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/amber/bin/amberc +4 -3
  2. data/amber/js/IDE.deploy.js +147 -45
  3. data/amber/js/IDE.js +155 -53
  4. data/amber/js/Kernel-Classes.deploy.js +20 -14
  5. data/amber/js/Kernel-Classes.js +29 -18
  6. data/amber/js/Kernel-Collections.deploy.js +82 -0
  7. data/amber/js/Kernel-Collections.js +102 -0
  8. data/amber/js/Kernel-Methods.deploy.js +374 -261
  9. data/amber/js/Kernel-Methods.js +417 -269
  10. data/amber/js/Kernel-Objects.deploy.js +90 -28
  11. data/amber/js/Kernel-Objects.js +121 -34
  12. data/amber/js/Kernel-Tests.deploy.js +35 -0
  13. data/amber/js/Kernel-Tests.js +45 -0
  14. data/amber/js/SUnit.deploy.js +175 -17
  15. data/amber/js/SUnit.js +237 -24
  16. data/amber/js/amber.js +2 -1
  17. data/amber/js/boot.js +74 -18
  18. data/amber/js/lib/es5-shim-2.0.2/CHANGES +93 -0
  19. data/amber/js/lib/es5-shim-2.0.2/CONTRIBUTORS.md +25 -0
  20. data/amber/js/lib/es5-shim-2.0.2/LICENSE +19 -0
  21. data/amber/js/lib/es5-shim-2.0.2/README.md +161 -0
  22. data/amber/js/lib/es5-shim-2.0.2/es5-sham.js +348 -0
  23. data/amber/js/lib/es5-shim-2.0.2/es5-sham.min.js +6 -0
  24. data/amber/js/lib/es5-shim-2.0.2/es5-shim.js +963 -0
  25. data/amber/js/lib/es5-shim-2.0.2/es5-shim.min.js +16 -0
  26. data/amber/js/lib/es5-shim-2.0.2/minify +2 -0
  27. data/amber/js/lib/es5-shim-2.0.2/package.json +31 -0
  28. data/amber/js/lib/es5-shim-2.0.2/tests/helpers/h-kill.js +59 -0
  29. data/amber/js/lib/es5-shim-2.0.2/tests/helpers/h-matchers.js +34 -0
  30. data/amber/js/lib/es5-shim-2.0.2/tests/helpers/h.js +3 -0
  31. data/amber/js/lib/es5-shim-2.0.2/tests/index.html +62 -0
  32. data/amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine-html.js +190 -0
  33. data/amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine.css +166 -0
  34. data/amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine.js +2477 -0
  35. data/amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine_favicon.png +0 -0
  36. data/amber/js/lib/es5-shim-2.0.2/tests/lib/json2.js +478 -0
  37. data/amber/js/lib/es5-shim-2.0.2/tests/spec/s-array.js +1138 -0
  38. data/amber/js/lib/es5-shim-2.0.2/tests/spec/s-date.js +117 -0
  39. data/amber/js/lib/es5-shim-2.0.2/tests/spec/s-function.js +147 -0
  40. data/amber/js/lib/es5-shim-2.0.2/tests/spec/s-object.js +84 -0
  41. data/amber/js/lib/es5-shim-2.0.2/tests/spec/s-string.js +24 -0
  42. data/amber/st/IDE.st +15 -16
  43. data/amber/st/Kernel-Classes.st +9 -9
  44. data/amber/st/Kernel-Collections.st +37 -0
  45. data/amber/st/Kernel-Methods.st +63 -8
  46. data/amber/st/Kernel-Objects.st +34 -7
  47. data/amber/st/Kernel-Tests.st +10 -0
  48. data/amber/st/SUnit.st +86 -9
  49. metadata +44 -21
  50. data/amber/js/compat.js +0 -22
@@ -1487,6 +1487,43 @@ includes: anObject
1487
1487
  ^elements includes: anObject
1488
1488
  ! !
1489
1489
 
1490
+ Object subclass: #Queue
1491
+ instanceVariableNames: 'read readIndex write'
1492
+ package: 'Kernel-Collections'!
1493
+
1494
+ !Queue methodsFor: 'accessing'!
1495
+
1496
+ back: anObject
1497
+ write add: anObject
1498
+ !
1499
+
1500
+ front
1501
+ ^self frontIfAbsent: [ self error: 'Cannot read from empty Queue.']
1502
+ !
1503
+
1504
+ frontIfAbsent: aBlock
1505
+ | result |
1506
+ result := read at: readIndex ifAbsent: [
1507
+ write isEmpty ifTrue: [
1508
+ readIndex > 1 ifTrue: [ read := #(). readIndex := 1 ].
1509
+ ^aBlock value ].
1510
+ read := write.
1511
+ readIndex := 1.
1512
+ write := OrderedCollection new.
1513
+ read first ].
1514
+ read at: readIndex put: nil.
1515
+ readIndex := readIndex + 1.
1516
+ ^result
1517
+ ! !
1518
+
1519
+ !Queue methodsFor: 'initialization'!
1520
+
1521
+ initialize
1522
+ read := #().
1523
+ readIndex := 1.
1524
+ write := OrderedCollection new
1525
+ ! !
1526
+
1490
1527
  Object subclass: #RegularExpression
1491
1528
  instanceVariableNames: ''
1492
1529
  package: 'Kernel-Collections'!
@@ -56,13 +56,7 @@ applyTo: anObject arguments: aCollection
56
56
  !
57
57
 
58
58
  ensure: aBlock
59
- | success |
60
- success := false.
61
- ^[self value. success := true. aBlock value]
62
- on: Error
63
- do: [:ex |
64
- success ifFalse: [aBlock value].
65
- ex signal]
59
+ <try{self()}finally{return aBlock._value()}>
66
60
  !
67
61
 
68
62
  new
@@ -121,6 +115,10 @@ valueWithPossibleArguments: aCollection
121
115
 
122
116
  !BlockClosure methodsFor: 'timeout/interval'!
123
117
 
118
+ fork
119
+ ForkPool default fork: self
120
+ !
121
+
124
122
  valueWithInterval: aNumber
125
123
  <return setInterval(self, aNumber)>
126
124
  !
@@ -162,7 +160,16 @@ category
162
160
  !
163
161
 
164
162
  category: aString
165
- self basicAt: 'category' put: aString
163
+ | oldCategory |
164
+ oldCategory := self category.
165
+ self basicAt: 'category' put: aString.
166
+
167
+ self methodClass ifNotNil: [
168
+ self methodClass organization addElement: aString.
169
+
170
+ (self methodClass methods
171
+ select: [ :each | each category = oldCategory ])
172
+ ifEmpty: [ self methodClass organization removeElement: oldCategory ] ]
166
173
  !
167
174
 
168
175
  fn
@@ -205,6 +212,54 @@ source: aString
205
212
  self basicAt: 'source' put: aString
206
213
  ! !
207
214
 
215
+ Object subclass: #ForkPool
216
+ instanceVariableNames: 'poolSize maxPoolSize queue worker'
217
+ package: 'Kernel-Methods'!
218
+
219
+ !ForkPool methodsFor: 'action'!
220
+
221
+ addWorker
222
+ worker valueWithTimeout: 0.
223
+ poolSize := poolSize + 1
224
+ !
225
+
226
+ fork: aBlock
227
+ poolSize < maxPoolSize ifTrue: [ self addWorker ].
228
+ queue back: aBlock
229
+ ! !
230
+
231
+ !ForkPool methodsFor: 'initialization'!
232
+
233
+ initialize
234
+ | sentinel |
235
+ poolSize := 0.
236
+ maxPoolSize := self class defaultMaxPoolSize.
237
+ queue := Queue new.
238
+ sentinel := Object new.
239
+ worker := [
240
+ | block |
241
+ poolSize := poolSize - 1.
242
+ block := queue frontIfAbsent: [ sentinel ].
243
+ block == sentinel ifFalse: [
244
+ [ block value ] ensure: [ self addWorker ]]].
245
+ ! !
246
+
247
+ ForkPool class instanceVariableNames: 'default'!
248
+
249
+ !ForkPool class methodsFor: 'accessing'!
250
+
251
+ default
252
+ ^default ifNil: [ default := self new ]
253
+ !
254
+
255
+ defaultMaxPoolSize
256
+ ^100
257
+ !
258
+
259
+ resetDefault
260
+ default := nil
261
+ ! !
262
+
208
263
  Object subclass: #Message
209
264
  instanceVariableNames: 'selector arguments'
210
265
  package: 'Kernel-Methods'!
@@ -990,6 +990,24 @@ pi
990
990
  <return Math.PI>
991
991
  ! !
992
992
 
993
+ Object subclass: #Organizer
994
+ instanceVariableNames: ''
995
+ package: 'Kernel-Objects'!
996
+
997
+ !Organizer methodsFor: 'accessing'!
998
+
999
+ addElement: anObject
1000
+ <self.addElement(anObject)>
1001
+ !
1002
+
1003
+ elements
1004
+ ^ (self basicAt: 'elements') copy
1005
+ !
1006
+
1007
+ removeElement: anObject
1008
+ <self.removeElement(anObject)>
1009
+ ! !
1010
+
993
1011
  Object subclass: #Package
994
1012
  instanceVariableNames: 'commitPathJs commitPathSt'
995
1013
  package: 'Kernel-Objects'!
@@ -1047,6 +1065,10 @@ name: aString
1047
1065
  <self.pkgName = aString>
1048
1066
  !
1049
1067
 
1068
+ organization
1069
+ ^ self basicAt: 'organization'
1070
+ !
1071
+
1050
1072
  properties
1051
1073
  ^Smalltalk current readJSObject: (self basicAt: 'properties')
1052
1074
  !
@@ -1065,8 +1087,7 @@ properties: aDict
1065
1087
  !Package methodsFor: 'classes'!
1066
1088
 
1067
1089
  classes
1068
- "We need to do a reverse scan."
1069
- ^Smalltalk current classes select: [:c | c package == self]
1090
+ ^ self organization elements
1070
1091
  !
1071
1092
 
1072
1093
  sortedClasses
@@ -1373,10 +1394,6 @@ basicParse: aString
1373
1394
  <return smalltalk.parser.parse(aString)>
1374
1395
  !
1375
1396
 
1376
- classes
1377
- <return self.classes()>
1378
- !
1379
-
1380
1397
  parse: aString
1381
1398
  | result |
1382
1399
  self try: [result := self basicParse: aString] catch: [:ex | (self parseError: ex parsing: aString) signal].
@@ -1415,6 +1432,10 @@ send: aSelector to: anObject arguments: aCollection
1415
1432
 
1416
1433
  !Smalltalk methodsFor: 'classes'!
1417
1434
 
1435
+ classes
1436
+ <return self.classes()>
1437
+ !
1438
+
1418
1439
  removeClass: aClass
1419
1440
  aClass isMetaclass ifTrue: [self error: aClass asString, ' is a Metaclass and cannot be removed!!'].
1420
1441
 
@@ -1424,7 +1445,7 @@ removeClass: aClass
1424
1445
  aClass class methodDictionary values do: [:each |
1425
1446
  aClass class removeCompiledMethod: each].
1426
1447
 
1427
- self basicDelete: aClass name.
1448
+ self deleteClass: aClass.
1428
1449
 
1429
1450
  SystemAnnouncer current
1430
1451
  announce: (ClassRemoved new
@@ -1492,6 +1513,12 @@ createPackage: packageName properties: aDict
1492
1513
  <return smalltalk.addPackage(packageName, object)>
1493
1514
  !
1494
1515
 
1516
+ deleteClass: aClass
1517
+ "Deletes a class by deleting its binding only. Use #removeClass instead"
1518
+
1519
+ <self.removeClass(aClass)>
1520
+ !
1521
+
1495
1522
  deletePackage: packageName
1496
1523
  "Deletes a package by deleting its binding, but does not check if it contains classes etc.
1497
1524
  To remove a package, use #removePackage instead."
@@ -13,6 +13,10 @@ testEnsure
13
13
  self assert: ([Error new] ensure: [true])
14
14
  !
15
15
 
16
+ testEnsureRaises
17
+ self should: [[Error new signal] ensure: [true]] raise: Error
18
+ !
19
+
16
20
  testNumArgs
17
21
  self assert: [] numArgs equals: 0.
18
22
  self assert: [:a :b | ] numArgs equals: 2
@@ -150,6 +154,12 @@ testLogicKeywords
150
154
  assert: (false or: [ 1 > 0 ]);
151
155
  assert: ((1 > 0) or: [ false ]);
152
156
  assert: ((1 > 0) or: [ 1 > 2 ])
157
+ !
158
+
159
+ testNonBooleanError
160
+ |b|
161
+ b := < '' >.
162
+ self should: [nonBoolean ifTrue: [] ifFalse: []] raise: NonBooleanReceiver
153
163
  ! !
154
164
 
155
165
  TestCase subclass: #ClassBuilderTest
@@ -1,4 +1,18 @@
1
1
  Smalltalk current createPackage: 'SUnit' properties: #{}!
2
+ Object subclass: #ResultAnnouncement
3
+ instanceVariableNames: 'result'
4
+ package: 'SUnit'!
5
+
6
+ !ResultAnnouncement methodsFor: 'accessing'!
7
+
8
+ result
9
+ ^result
10
+ !
11
+
12
+ result: aTestResult
13
+ result := aTestResult
14
+ ! !
15
+
2
16
  Object subclass: #TestCase
3
17
  instanceVariableNames: 'testSelector'
4
18
  package: 'SUnit'!
@@ -23,17 +37,15 @@ signalFailure: aString
23
37
 
24
38
  !TestCase methodsFor: 'running'!
25
39
 
26
- performTestFor: aResult
27
- [[self perform: self selector]
28
- on: TestFailure do: [:ex | aResult addFailure: self]]
29
- on: Error do: [:ex | aResult addError: self]
40
+ performTest
41
+ self perform: self selector
30
42
  !
31
43
 
32
- runCaseFor: aTestResult
33
- self setUp.
34
- aTestResult increaseRuns.
35
- self performTestFor: aTestResult.
36
- self tearDown
44
+ runCase
45
+ [ self setUp.
46
+ self performTest ] ensure: [
47
+ self tearDown.
48
+ "self cleanUpInstanceVariables" ]
37
49
  !
38
50
 
39
51
  setUp
@@ -180,3 +192,68 @@ initialize
180
192
  total := 0
181
193
  ! !
182
194
 
195
+ !TestResult methodsFor: 'running'!
196
+
197
+ nextRunDo: aBlock
198
+ "Runs aBlock with index of next run
199
+ or does nothing if no more runs"
200
+ ^self runs == self total
201
+ ifFalse: [ aBlock value: self runs + 1 ]
202
+ !
203
+
204
+ runCase: aTestCase
205
+ [[ self increaseRuns.
206
+ aTestCase runCase]
207
+ on: TestFailure do: [:ex | self addFailure: aTestCase]]
208
+ on: Error do: [:ex | self addError: aTestCase]
209
+ ! !
210
+
211
+ Object subclass: #TestSuiteRunner
212
+ instanceVariableNames: 'suite result announcer'
213
+ package: 'SUnit'!
214
+
215
+ !TestSuiteRunner methodsFor: 'accessing'!
216
+
217
+ announcer
218
+ ^announcer
219
+ !
220
+
221
+ result
222
+ ^result
223
+ !
224
+
225
+ suite: aCollection
226
+ suite := aCollection
227
+ ! !
228
+
229
+ !TestSuiteRunner methodsFor: 'actions'!
230
+
231
+ run
232
+ | worker |
233
+ result total: suite size.
234
+ announcer announce: (ResultAnnouncement new result: result).
235
+ worker := [ result nextRunDo: [ :index |
236
+ [ result runCase: (suite at: index) ]
237
+ ensure: [ worker fork.
238
+ announcer announce: (ResultAnnouncement new result: result) ]]].
239
+ worker fork
240
+ ! !
241
+
242
+ !TestSuiteRunner methodsFor: 'initialization'!
243
+
244
+ initialize
245
+ super initialize.
246
+ announcer := Announcer new.
247
+ result := TestResult new
248
+ ! !
249
+
250
+ !TestSuiteRunner class methodsFor: 'instance creation'!
251
+
252
+ new
253
+ self shouldNotImplement
254
+ !
255
+
256
+ on: aCollection
257
+ ^super new suite: aCollection
258
+ ! !
259
+
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.3.0
4
+ version: 0.3.1
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-12-01 00:00:00.000000000 Z
12
+ date: 2012-12-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &5027820 !ruby/object:Gem::Requirement
16
+ requirement: &10777680 !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: *5027820
24
+ version_requirements: *10777680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &5027080 !ruby/object:Gem::Requirement
27
+ requirement: &10776980 !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: *5027080
35
+ version_requirements: *10776980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shotgun
38
- requirement: &5026260 !ruby/object:Gem::Requirement
38
+ requirement: &10776180 !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: *5026260
46
+ version_requirements: *10776180
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &5025480 !ruby/object:Gem::Requirement
49
+ requirement: &10775220 !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: *5025480
57
+ version_requirements: *10775220
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rack-test
60
- requirement: &5024440 !ruby/object:Gem::Requirement
60
+ requirement: &10774040 !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: *5024440
68
+ version_requirements: *10774040
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: haml
71
- requirement: &5023260 !ruby/object:Gem::Requirement
71
+ requirement: &10789120 !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: *5023260
79
+ version_requirements: *10789120
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: sinatra
82
- requirement: &5038320 !ruby/object:Gem::Requirement
82
+ requirement: &10787700 !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: *5038320
90
+ version_requirements: *10787700
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: json
93
- requirement: &5036780 !ruby/object:Gem::Requirement
93
+ requirement: &10786400 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *5036780
101
+ version_requirements: *10786400
102
102
  description:
103
103
  email: tyler@linux.com
104
104
  executables:
@@ -140,6 +140,30 @@ files:
140
140
  - amber/js/lib/bootstrap/js/bootstrap.min.js
141
141
  - amber/js/lib/bootstrap/js/bootstrap.js
142
142
  - amber/js/lib/showdown.js
143
+ - amber/js/lib/es5-shim-2.0.2/es5-sham.js
144
+ - amber/js/lib/es5-shim-2.0.2/es5-shim.min.js
145
+ - amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine.css
146
+ - amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine-html.js
147
+ - amber/js/lib/es5-shim-2.0.2/tests/lib/json2.js
148
+ - amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine.js
149
+ - amber/js/lib/es5-shim-2.0.2/tests/lib/jasmine_favicon.png
150
+ - amber/js/lib/es5-shim-2.0.2/tests/helpers/h-matchers.js
151
+ - amber/js/lib/es5-shim-2.0.2/tests/helpers/h.js
152
+ - amber/js/lib/es5-shim-2.0.2/tests/helpers/h-kill.js
153
+ - amber/js/lib/es5-shim-2.0.2/tests/index.html
154
+ - amber/js/lib/es5-shim-2.0.2/tests/spec/s-string.js
155
+ - amber/js/lib/es5-shim-2.0.2/tests/spec/s-function.js
156
+ - amber/js/lib/es5-shim-2.0.2/tests/spec/s-date.js
157
+ - amber/js/lib/es5-shim-2.0.2/tests/spec/s-object.js
158
+ - amber/js/lib/es5-shim-2.0.2/tests/spec/s-array.js
159
+ - amber/js/lib/es5-shim-2.0.2/es5-shim.js
160
+ - amber/js/lib/es5-shim-2.0.2/CHANGES
161
+ - amber/js/lib/es5-shim-2.0.2/es5-sham.min.js
162
+ - amber/js/lib/es5-shim-2.0.2/minify
163
+ - amber/js/lib/es5-shim-2.0.2/package.json
164
+ - amber/js/lib/es5-shim-2.0.2/CONTRIBUTORS.md
165
+ - amber/js/lib/es5-shim-2.0.2/README.md
166
+ - amber/js/lib/es5-shim-2.0.2/LICENSE
143
167
  - amber/js/lib/peg-0.6.2.min.js
144
168
  - amber/js/lib/CodeMirror/smalltalk.js
145
169
  - amber/js/lib/CodeMirror/codemirror.css
@@ -206,7 +230,6 @@ files:
206
230
  - amber/js/Compiler-AST.deploy.js
207
231
  - amber/js/Compiler-Tests.js
208
232
  - amber/js/Examples.deploy.js
209
- - amber/js/compat.js
210
233
  - amber/js/Documentation.deploy.js
211
234
  - amber/js/Kernel-Exceptions.js
212
235
  - amber/js/Kernel-Exceptions.deploy.js
@@ -280,7 +303,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
280
303
  version: '0'
281
304
  segments:
282
305
  - 0
283
- hash: -3056217880712448120
306
+ hash: -4232258665751550036
284
307
  required_rubygems_version: !ruby/object:Gem::Requirement
285
308
  none: false
286
309
  requirements:
@@ -289,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
289
312
  version: '0'
290
313
  segments:
291
314
  - 0
292
- hash: -3056217880712448120
315
+ hash: -4232258665751550036
293
316
  requirements: []
294
317
  rubyforge_project:
295
318
  rubygems_version: 1.8.10