fancy 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +5 -4
  3. data/bin/fspec +19 -1
  4. data/bin/ifancy +139 -35
  5. data/boot/README +2 -9
  6. data/boot/extconf.rb +0 -1
  7. data/boot/fancy_ext/module.rb +5 -15
  8. data/boot/fancy_ext/thread.rb +22 -9
  9. data/boot/rbx-compiler/README +0 -4
  10. data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
  11. data/boot/rbx-compiler/parser/parser.y +1 -0
  12. data/doc/api/fancy.css +1 -6
  13. data/doc/api/fancy.jsonp +1 -1
  14. data/doc/api/fdoc.js +2 -4
  15. data/doc/api/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  16. data/doc/api/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  17. data/doc/api/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
  18. data/doc/api/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  19. data/doc/api/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  20. data/doc/api/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  21. data/doc/api/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  22. data/doc/api/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  23. data/doc/api/images/ui-icons_0073ea_256x240.png +0 -0
  24. data/doc/api/images/ui-icons_454545_256x240.png +0 -0
  25. data/doc/api/images/ui-icons_666666_256x240.png +0 -0
  26. data/doc/api/images/ui-icons_ff0084_256x240.png +0 -0
  27. data/doc/api/images/ui-icons_ffffff_256x240.png +0 -0
  28. data/doc/api/index.html +5 -4
  29. data/doc/api/jquery-1.8.2.min.js +2 -0
  30. data/doc/api/jquery-ui-1.9.0.custom.min.css +5 -0
  31. data/doc/api/jquery-ui-1.9.0.custom.min.js +6 -0
  32. data/doc/features.md +8 -3
  33. data/examples/argv.fy +1 -1
  34. data/examples/closures.fy +1 -4
  35. data/examples/echo.fy +2 -2
  36. data/examples/guess_number.fy +18 -0
  37. data/examples/nested_classes.fy +3 -15
  38. data/lib/argv.fy +23 -18
  39. data/lib/array.fy +18 -37
  40. data/lib/block.fy +125 -0
  41. data/lib/boot.fy +1 -0
  42. data/lib/compiler/ast/block.fy +1 -1
  43. data/lib/compiler/ast/identifier.fy +1 -1
  44. data/lib/compiler/ast/message_send.fy +0 -13
  45. data/lib/compiler/ast/method_def.fy +1 -1
  46. data/lib/compiler/ast/singleton_method_def.fy +1 -0
  47. data/lib/compiler/ast/tuple_literal.fy +1 -1
  48. data/lib/compiler/command.fy +1 -1
  49. data/lib/compiler/compiler.fy +8 -6
  50. data/lib/contracts.fy +1 -1
  51. data/lib/directory.fy +1 -1
  52. data/lib/dynamic_slot_object.fy +1 -1
  53. data/lib/enumerable.fy +316 -25
  54. data/lib/enumerator.fy +11 -8
  55. data/lib/eval.fy +0 -3
  56. data/lib/fancy_spec.fy +27 -0
  57. data/lib/fdoc.fy +8 -8
  58. data/lib/file.fy +25 -1
  59. data/lib/hash.fy +91 -0
  60. data/lib/html.fy +40 -11
  61. data/lib/integer.fy +4 -0
  62. data/lib/main.fy +18 -11
  63. data/lib/object.fy +33 -7
  64. data/lib/option_parser.fy +20 -1
  65. data/lib/package/dependency.fy +8 -0
  66. data/lib/package/dependency_installer.fy +3 -6
  67. data/lib/package/handler.fy +4 -4
  68. data/lib/package/installer.fy +2 -5
  69. data/lib/package/list.fy +3 -4
  70. data/lib/parser/ext/parser.y +1 -0
  71. data/lib/proxies.fy +0 -2
  72. data/lib/queue.fy +7 -0
  73. data/lib/rbx.fy +1 -0
  74. data/lib/rbx/actor.fy +3 -1
  75. data/lib/rbx/alpha.fy +24 -0
  76. data/lib/rbx/array.fy +3 -1
  77. data/lib/rbx/class.fy +5 -8
  78. data/lib/rbx/date_time.fy +14 -0
  79. data/lib/rbx/file.fy +6 -0
  80. data/lib/rbx/hash.fy +42 -0
  81. data/lib/rbx/thread.fy +5 -7
  82. data/lib/string.fy +56 -4
  83. data/lib/symbol.fy +29 -1
  84. data/lib/time.fy +17 -0
  85. data/lib/vars.fy +4 -3
  86. data/lib/version.fy +1 -1
  87. data/ruby_lib/interactive/hilight.rb +125 -0
  88. data/tests/array.fy +19 -7
  89. data/tests/block.fy +103 -4
  90. data/tests/class.fy +31 -26
  91. data/tests/control_flow.fy +0 -1
  92. data/tests/dynamic_key_hash.fy +22 -1
  93. data/tests/enumerable.fy +239 -7
  94. data/tests/enumerator.fy +7 -0
  95. data/tests/file.fy +16 -0
  96. data/tests/future.fy +1 -11
  97. data/tests/future_proxy.fy +8 -0
  98. data/tests/hash.fy +132 -9
  99. data/tests/html.fy +30 -13
  100. data/tests/integer.fy +3 -0
  101. data/tests/method.fy +6 -11
  102. data/tests/object.fy +12 -5
  103. data/tests/option_parser.fy +12 -3
  104. data/tests/string.fy +69 -1
  105. data/tests/symbol.fy +24 -0
  106. metadata +42 -12
  107. data/boot/rsexp_pretty_printer.rb +0 -76
  108. data/doc/api/jquery-ui.min.js +0 -401
  109. data/doc/api/jquery.tools.min.js +0 -192
  110. data/doc/api/themeswitchertool.js +0 -250
  111. data/examples/future_sends.fy +0 -15
@@ -0,0 +1,8 @@
1
+ # FancySpec describe: FutureProxy with: {
2
+ # it: "returns a FutureProxy" with: 'future when: {
3
+ # f = "foo" future
4
+ # "yo: #{f to_s inspect}" println
5
+ # "foo" future: @{ println }
6
+ # }
7
+ # }
8
+ nil
data/tests/hash.fy CHANGED
@@ -1,20 +1,23 @@
1
1
  FancySpec describe: Hash with: {
2
2
  it: "is empty on initialization" with: 'empty? when: {
3
- hash = <[]>
4
- hash size is: 0
5
- hash empty? is: true
3
+ <[]> tap: @{
4
+ size is: 0
5
+ empty? is: true
6
+ }
6
7
  }
7
8
 
8
9
  it: "is empty on initialization via Hash#new" with: 'size when: {
9
- hash = Hash new
10
- hash size is: 0
11
- hash empty? is: true
10
+ Hash new tap: @{
11
+ size is: 0
12
+ empty? is: true
13
+ }
12
14
  }
13
15
 
14
16
  it: "contains one entry" when: {
15
- hash = <['foo => "bar"]>
16
- hash size is: 1
17
- hash empty? is: false
17
+ <['foo => "bar"]> tap: @{
18
+ size is: 1
19
+ empty? is: false
20
+ }
18
21
  }
19
22
 
20
23
  it: "contains 10 square values after 10 insertions" with: 'at: when: {
@@ -152,6 +155,34 @@ FancySpec describe: Hash with: {
152
155
  }
153
156
  }
154
157
 
158
+ it: "returns a nested object with slots based on key-value pairs in hashes" with: 'to_object_deep when: {
159
+ hashes = [
160
+ <[]>,
161
+ <['name => "foo", 'age => 42]>
162
+ ]
163
+
164
+ hashes each: |h| {
165
+ o = h to_object_deep
166
+ o slots each: |s| {
167
+ o receive_message: s . is: $ h[s]
168
+ }
169
+ }
170
+
171
+
172
+ people = [
173
+ <['person => <['name => "foo", 'age => 42, 'city => "London"]>]>,
174
+ <['person => { name: "foo" age: 42 city: "London" }]> # even works with blocks, yay
175
+ ]
176
+
177
+ people each: @{
178
+ to_object_deep tap: @{
179
+ person name is: "foo"
180
+ person age is: 42
181
+ person city is: "London"
182
+ }
183
+ }
184
+ }
185
+
155
186
  it: "returns a hash with all entries for which a block yields true" with: 'select_keys: when: {
156
187
  <[]> select_keys: { true } . is: <[]>
157
188
  <[]> select_keys: { false } . is: <[]>
@@ -231,4 +262,96 @@ FancySpec describe: Hash with: {
231
262
  ]>
232
263
  ]>
233
264
  }
265
+
266
+ it: "updates its values with a block" with: 'update_values: when: {
267
+ <[]> update_values: @{ to_s } . is: <[]>
268
+ h = <['name => "Tom", 'age => 21]>
269
+ h update_values: @{ * 2 }
270
+ h is: <['name => "TomTom", 'age => 42]>
271
+ }
272
+
273
+ it: "updates its keys with a block" with: 'update_keys: when: {
274
+ <[]> update_keys: @{ to_s } . is: <[]>
275
+ h = <['name => "Tom", 'age => 21]>
276
+ h update_keys: @{ to_s * 2 }
277
+ h is: <["namename" => "Tom", "ageage" => 21]>
278
+ }
279
+
280
+ it: "returns a new hash based on self with values updated with a block" with: 'with_updated_values: when: {
281
+ <[]> with_updated_values: @{ * 2 } . is: <[]>
282
+ h1 = <['name => "Tom", 'age => 21]>
283
+ h2 = h1 with_updated_values: @{ * 2 }
284
+
285
+ h1 is: <['name => "Tom", 'age => 21]>
286
+ h2 is: <['name => "TomTom", 'age => 42]>
287
+ }
288
+
289
+ it: "returns a new hash based on self with keys updated with a block" with: 'with_updated_keys: when: {
290
+ <[]> with_updated_keys: @{ * 2 } . is: <[]>
291
+ h1 = <['name => "Tom", 'age => 21]>
292
+ h2 = h1 with_updated_keys: @{ to_s * 2 }
293
+
294
+ h1 is: <['name => "Tom", 'age => 21]>
295
+ h2 is: <["namename" => "Tom", "ageage" => 21]>
296
+ }
297
+
298
+ it: "calls a block with a value for a given key, if available" with: 'with_value_for_key:do:else: when: {
299
+ h = <['hello => "world", 1 => 2, "foo" => "barbaz"]>
300
+ else_ran? = false
301
+ else_block = { else_ran? = true }
302
+
303
+ h with_value_for_key: 'hello do: @{ is: "world" } else: else_block
304
+ h with_value_for_key: 1 do: @{ is: 2 } else: else_block
305
+ h with_value_for_key: "foo" do: @{ "barbaz" } else: else_block
306
+
307
+ else_ran? = false
308
+
309
+ h with_value_for_key: "not in hash" do: {
310
+ "should not call this block!" raise!
311
+ } else: else_block
312
+
313
+ else_ran? is: true
314
+ }
315
+
316
+ it: "sets the default value on creation" when: {
317
+ h = Hash new: "default"
318
+ h['key] is: "default"
319
+ h['key]: "hallo"
320
+ h['key] is: "hallo"
321
+ }
322
+
323
+ it: "sets the default value" with: 'default: when: {
324
+ h = Hash new
325
+ h default is: nil
326
+ h default: "foo"
327
+ h default is: "foo"
328
+
329
+ block = |_ k| { k }
330
+ h default: block
331
+ h default is: block
332
+ }
333
+
334
+ it: "returns the default value" with: 'default when: {
335
+ Hash new default is: nil
336
+ Hash new: "foo" . default is: "foo"
337
+
338
+ block = |h k| { k * 2 }
339
+ Hash new: block . default is: block
340
+ Hash new: block . tap: |h| {
341
+ h[1] is: 2
342
+ h["foo"] is: "foofoo"
343
+ }
344
+ }
345
+
346
+ it: "returns the return value for a given key" with: 'default_for: when: {
347
+ Hash new: 2 . tap: @{
348
+ default_for: "foo" . is: 2
349
+ default_for: "bar" . is: 2
350
+ }
351
+
352
+ Hash new: |_ k| { k * 2 } . tap: @{
353
+ default_for: "foo" . is: "foofoo"
354
+ default_for: 100 . is: 200
355
+ }
356
+ }
234
357
  }
data/tests/html.fy CHANGED
@@ -16,18 +16,35 @@ FancySpec describe: HTML with: {
16
16
  }
17
17
  }
18
18
 
19
- h to_s is: \
20
- """<html>
21
- <head>
22
- <title>
23
- Hello
24
- </title>
25
- </head>
26
- <body>
27
- <h1>
28
- Hello, World!
29
- </h1>
30
- </body>
31
- </html>"""
19
+ html = """
20
+ <html>
21
+ <head>
22
+ <title>
23
+ Hello
24
+ </title>
25
+ </head>
26
+ <body>
27
+ <h1>
28
+ Hello, World!
29
+ </h1>
30
+ </body>
31
+ </html>
32
+ """
33
+
34
+ h to_s is: $ html skip_leading_indentation
35
+ }
36
+
37
+ it: "indents the generated html by a common offset" when: {
38
+ h = HTML new: @{
39
+ foo: @{ bar: "baz" }
40
+ } indentation: 3
41
+
42
+ h to_s lines is: [
43
+ " <foo>",
44
+ " <bar>",
45
+ " baz",
46
+ " </bar>",
47
+ " </foo>"
48
+ ]
32
49
  }
33
50
  }
data/tests/integer.fy CHANGED
@@ -5,5 +5,8 @@ FancySpec describe: Integer with: {
5
5
  100 decimals is: [1, 0, 0]
6
6
  123 decimals is: [1, 2, 3]
7
7
  998811 decimals is: [9, 9, 8, 8, 1, 1]
8
+ -0 decimals is: [0]
9
+ -10 decimals is: [1,0]
10
+ -1234 decimals is: [1, 2, 3, 4]
8
11
  }
9
12
  }
data/tests/method.fy CHANGED
@@ -3,17 +3,6 @@ FancySpec describe: Method with: {
3
3
  [1,2,3] method: "each:" . class is: Method
4
4
  }
5
5
 
6
- # it: "returns the (correct) sender object of the MessageSend" when: {
7
- # class SenderTest {
8
- # def give_me_the_sender! {
9
- # __sender__
10
- # }
11
- # }
12
-
13
- # x = SenderTest new
14
- # x give_me_the_sender! is: self
15
- # }
16
-
17
6
  it: "returns the amount of arguments a Method takes" with: 'arity when: {
18
7
  class Foo {
19
8
  def no_args
@@ -140,4 +129,10 @@ FancySpec describe: Method with: {
140
129
  def fooaa: bar ("fo");
141
130
  fooaa: 10
142
131
  }
132
+
133
+ it: "can handle a singleton method def with an empty body" when: {
134
+ obj = "foo"
135
+ def obj bar
136
+ def obj bar: @x
137
+ }
143
138
  }
data/tests/object.fy CHANGED
@@ -25,7 +25,7 @@ FancySpec describe: Object with: {
25
25
  { self a_singleton_method } raises: NoMethodError
26
26
  }
27
27
 
28
- it: "returns its class" when: {
28
+ it: "returns its class" with: 'class when: {
29
29
  nil class is: NilClass
30
30
  true class is: TrueClass
31
31
  "foo" class is: String
@@ -44,25 +44,32 @@ FancySpec describe: Object with: {
44
44
  obj this_is_not_defined: "It's true!" . is: "Got: this_is_not_defined: It's true!"
45
45
  }
46
46
 
47
- it: "returns a correct string representation" when: {
47
+ it: "returns a correct string representation" with: 'to_s when: {
48
48
  3 to_s is: "3"
49
49
  'foo to_s is: "foo"
50
50
  nil to_s is: ""
51
51
  }
52
52
 
53
- it: "returns a correct array representation" when: {
53
+ it: "returns a correct array representation" with: 'to_a when: {
54
54
  nil to_a is: []
55
55
  'foo to_a is: ['foo]
56
56
  <['foo => "bar", 'bar => "baz"]> to_a is =? [['bar, "baz"], ['foo, "bar"]]
57
57
  }
58
58
 
59
- it: "returns a correct fixnum representation" when: {
59
+ it: "returns a hash based on own slot values" with: 'to_hash when: {
60
+ nil to_hash is: <[]>
61
+ false to_hash is: <[]>
62
+ true to_hash is: <[]>
63
+ (0..10) each: @{ to_hash is: <[]> }
64
+ }
65
+
66
+ it: "returns a correct fixnum representation" with: 'to_i when: {
60
67
  nil to_i is: 0
61
68
  3 to_i is: 3
62
69
  3.28437 to_i is: 3
63
70
  }
64
71
 
65
- it: "is an Object of the correct Class (or Superclass)" when: {
72
+ it: "is an Object of the correct Class (or Superclass)" with: 'is_a?: when: {
66
73
  Object new is_a?: Object . is: true
67
74
  "foo" is_a?: String . is: true
68
75
  "foo" is_a?: Object . is: true
@@ -1,7 +1,7 @@
1
1
  require: "lib/option_parser"
2
2
 
3
3
  FancySpec describe: OptionParser with: {
4
- it: "parses an option with no argument" when: {
4
+ it: "parses an option with no argument" with: 'parse: when: {
5
5
  parsed_option? = false
6
6
 
7
7
  o = OptionParser new: @{
@@ -15,7 +15,7 @@ FancySpec describe: OptionParser with: {
15
15
  parsed_option? is: true
16
16
  }
17
17
 
18
- it: "parses no option if none are passed" when: {
18
+ it: "parses no option if none are passed" with: 'parse: when: {
19
19
  parsed_option? = false
20
20
  o = OptionParser new: @{
21
21
  with: "--foo [arg]" doc: "bla" do: |arg| {
@@ -31,7 +31,7 @@ FancySpec describe: OptionParser with: {
31
31
  parsed_option? is: false
32
32
  }
33
33
 
34
- it: "parses an option with an argument" when: {
34
+ it: "parses an option with an argument" with: 'parse: when: {
35
35
  parsed_option? = false
36
36
  passed_args = []
37
37
 
@@ -77,4 +77,13 @@ FancySpec describe: OptionParser with: {
77
77
  o parse: args
78
78
  args is: [1, 2]
79
79
  }
80
+
81
+ it: "parses options as a hash" with: 'parse_hash: when: {
82
+ o = OptionParser new: @{
83
+ with: "--some-option [some-value]" doc: "foo"
84
+ }
85
+
86
+ hash = o parse_hash: ["foo", "bar", "--some-option", "hello world!", "baz"]
87
+ hash is: <["--some-option" => "hello world!"]>
88
+ }
80
89
  }
data/tests/string.fy CHANGED
@@ -55,6 +55,25 @@ FancySpec describe: String with: {
55
55
  "hello world" drop_while: |c| { c != " " } . join: "" . is: " world"
56
56
  }
57
57
 
58
+ it: "drops the last element" with: 'drop_last: when: {
59
+ [] drop_last is: []
60
+ [1] drop_last is: []
61
+ "foo" drop_last is: ["f", "o"]
62
+ (1,2,3) drop_last is: [1,2]
63
+ }
64
+
65
+ it: "rops the last n elements" with: 'drop_last: when: {
66
+ [] drop_last: 1 . is: []
67
+ [] drop_last: 2 . is: []
68
+ [] drop_last: 0 . is: []
69
+ [1] drop_last: 0 . is: [1]
70
+ [1] drop_last: 1 . is: []
71
+ [1] drop_last: 2 . is: []
72
+ [1,2,3] drop_last: 1 . is: [1, 2]
73
+ [1,2,3] drop_last: 2 . is: [1]
74
+ [1,2,3] drop_last: 3 . is: []
75
+ }
76
+
58
77
  it: "is empty" with: 'empty? when: {
59
78
  "" empty? is: true
60
79
  " " empty? is: false
@@ -70,7 +89,7 @@ FancySpec describe: String with: {
70
89
  "hello world" at: 5 . blank? is: true
71
90
  }
72
91
 
73
- it: "is evaluated as fancy code and returns the correct value" when: {
92
+ it: "is evaluated as fancy code and returns the correct value" with: 'eval when: {
74
93
  x = "'foo" eval
75
94
  x is: 'foo
76
95
  "3 + 4" eval is: 7
@@ -78,6 +97,14 @@ FancySpec describe: String with: {
78
97
  "33.33" eval is: 33.33
79
98
  }
80
99
 
100
+ it: "parses empty code with newlines correctly" with: 'eval when: {
101
+ "" eval is: nil
102
+ "\n" eval is: nil
103
+ "\n\n" eval is: nil
104
+ "\n \n \n" eval is: nil
105
+ " \n " eval is: nil
106
+ }
107
+
81
108
  it: "returns itself times n" with: '* when: {
82
109
  "foo" * 2 is: "foofoo"
83
110
  "f" ++ ("o" * 2) ++ "bar" is: "foobar"
@@ -206,4 +233,45 @@ FancySpec describe: String with: {
206
233
 
207
234
  """ multiline? is: true
208
235
  }
236
+
237
+ it: "returns a snake cased version of itself" with: 'snake_cased when: {
238
+ "" snake_cased is: ""
239
+ "Foo" snake_cased is: "foo"
240
+ "FooB" snake_cased is: "foo_b"
241
+ "FooBarBaz" snake_cased is: "foo_bar_baz"
242
+ "Foo Bar Baz" snake_cased is: "foo bar baz"
243
+ }
244
+
245
+ it: "returns a camel cased version of itself" with: 'camel_cased when: {
246
+ "" camel_cased is: ""
247
+ "foo" camel_cased is: "Foo"
248
+ "foo_" camel_cased is: "Foo"
249
+ "foo_bar_baz" camel_cased is: "FooBarBaz"
250
+ }
251
+
252
+ it: "returns true if its uppercase" with: 'uppercase? when: {
253
+ "" uppercase? is: false
254
+ "foo" uppercase? is: false
255
+ "F" uppercase? is: true
256
+ "Foo" uppercase? is: false
257
+ "ABC" uppercase? is: true
258
+ }
259
+
260
+ it: "returns true if its lowercase" with: 'lowercase? when: {
261
+ "" lowercase? is: false
262
+ "foo" lowercase? is: true
263
+ "foA" lowercase? is: false
264
+ "A" lowercase? is: false
265
+ "abc" lowercase? is: true
266
+ }
267
+
268
+ it: "returns true if its begins with another string" with: 'starts_with?: when: {
269
+ "" starts_with?: "" . is: true
270
+ "foo" starts_with?: "f" . is: true
271
+ "foo" starts_with?: "fo" . is: true
272
+ "foo" starts_with?: "foo" . is: true
273
+ "foo" starts_with?: "fooo" . is: false
274
+ "foo" starts_with?: "oo" . is: false
275
+ "foo" starts_with?: "" . is: false
276
+ }
209
277
  }
data/tests/symbol.fy CHANGED
@@ -28,8 +28,32 @@ FancySpec describe: Symbol with: {
28
28
  if: x then: 'foo else: 'bar . is: "foo"
29
29
  }
30
30
 
31
+ it: "returns its arity correctly (when interpreted as a method name)" with: 'arity when: {
32
+ 'foo arity is: 1
33
+ 'foo_bar_baz arity is: 1
34
+ ('+, '-, '*, '/) each: @{ arity is: 2 }
35
+ 'foo: arity is: 2
36
+ 'foo:bar: arity is: 3
37
+ 'foo:bar:baz: arity is: 4
38
+ }
39
+
31
40
  it: "returns self" with: 'to_sym when: {
32
41
  'foo to_sym is: 'foo
33
42
  'bar to_sym is: 'bar
34
43
  }
44
+
45
+ it: "returns itself as a Block" with: 'to_block when: {
46
+ b = 'inspect to_block
47
+ b call: [2] . is: "2"
48
+ b call: ["foo"] . is: "\"foo\""
49
+
50
+ str = "hello, world yo!\"foo\""
51
+ b call: [str] . is: $ @{ inspect } call: [str]
52
+
53
+ add = '+ to_block
54
+ { add call: [2] } raises: ArgumentError
55
+ add call: [0,1] . is: 1
56
+ add call: [2,3] . is: 5
57
+ { add call: [2,3,4] } raises: ArgumentError
58
+ }
35
59
  }