fancy 0.8.0 → 0.9.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/LICENSE +1 -1
- data/README.md +5 -4
- data/bin/fspec +19 -1
- data/bin/ifancy +139 -35
- data/boot/README +2 -9
- data/boot/extconf.rb +0 -1
- data/boot/fancy_ext/module.rb +5 -15
- data/boot/fancy_ext/thread.rb +22 -9
- data/boot/rbx-compiler/README +0 -4
- data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
- data/boot/rbx-compiler/parser/parser.y +1 -0
- data/doc/api/fancy.css +1 -6
- data/doc/api/fancy.jsonp +1 -1
- data/doc/api/fdoc.js +2 -4
- data/doc/api/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/doc/api/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/doc/api/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
- data/doc/api/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/doc/api/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/doc/api/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
- data/doc/api/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
- data/doc/api/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
- data/doc/api/images/ui-icons_0073ea_256x240.png +0 -0
- data/doc/api/images/ui-icons_454545_256x240.png +0 -0
- data/doc/api/images/ui-icons_666666_256x240.png +0 -0
- data/doc/api/images/ui-icons_ff0084_256x240.png +0 -0
- data/doc/api/images/ui-icons_ffffff_256x240.png +0 -0
- data/doc/api/index.html +5 -4
- data/doc/api/jquery-1.8.2.min.js +2 -0
- data/doc/api/jquery-ui-1.9.0.custom.min.css +5 -0
- data/doc/api/jquery-ui-1.9.0.custom.min.js +6 -0
- data/doc/features.md +8 -3
- data/examples/argv.fy +1 -1
- data/examples/closures.fy +1 -4
- data/examples/echo.fy +2 -2
- data/examples/guess_number.fy +18 -0
- data/examples/nested_classes.fy +3 -15
- data/lib/argv.fy +23 -18
- data/lib/array.fy +18 -37
- data/lib/block.fy +125 -0
- data/lib/boot.fy +1 -0
- data/lib/compiler/ast/block.fy +1 -1
- data/lib/compiler/ast/identifier.fy +1 -1
- data/lib/compiler/ast/message_send.fy +0 -13
- data/lib/compiler/ast/method_def.fy +1 -1
- data/lib/compiler/ast/singleton_method_def.fy +1 -0
- data/lib/compiler/ast/tuple_literal.fy +1 -1
- data/lib/compiler/command.fy +1 -1
- data/lib/compiler/compiler.fy +8 -6
- data/lib/contracts.fy +1 -1
- data/lib/directory.fy +1 -1
- data/lib/dynamic_slot_object.fy +1 -1
- data/lib/enumerable.fy +316 -25
- data/lib/enumerator.fy +11 -8
- data/lib/eval.fy +0 -3
- data/lib/fancy_spec.fy +27 -0
- data/lib/fdoc.fy +8 -8
- data/lib/file.fy +25 -1
- data/lib/hash.fy +91 -0
- data/lib/html.fy +40 -11
- data/lib/integer.fy +4 -0
- data/lib/main.fy +18 -11
- data/lib/object.fy +33 -7
- data/lib/option_parser.fy +20 -1
- data/lib/package/dependency.fy +8 -0
- data/lib/package/dependency_installer.fy +3 -6
- data/lib/package/handler.fy +4 -4
- data/lib/package/installer.fy +2 -5
- data/lib/package/list.fy +3 -4
- data/lib/parser/ext/parser.y +1 -0
- data/lib/proxies.fy +0 -2
- data/lib/queue.fy +7 -0
- data/lib/rbx.fy +1 -0
- data/lib/rbx/actor.fy +3 -1
- data/lib/rbx/alpha.fy +24 -0
- data/lib/rbx/array.fy +3 -1
- data/lib/rbx/class.fy +5 -8
- data/lib/rbx/date_time.fy +14 -0
- data/lib/rbx/file.fy +6 -0
- data/lib/rbx/hash.fy +42 -0
- data/lib/rbx/thread.fy +5 -7
- data/lib/string.fy +56 -4
- data/lib/symbol.fy +29 -1
- data/lib/time.fy +17 -0
- data/lib/vars.fy +4 -3
- data/lib/version.fy +1 -1
- data/ruby_lib/interactive/hilight.rb +125 -0
- data/tests/array.fy +19 -7
- data/tests/block.fy +103 -4
- data/tests/class.fy +31 -26
- data/tests/control_flow.fy +0 -1
- data/tests/dynamic_key_hash.fy +22 -1
- data/tests/enumerable.fy +239 -7
- data/tests/enumerator.fy +7 -0
- data/tests/file.fy +16 -0
- data/tests/future.fy +1 -11
- data/tests/future_proxy.fy +8 -0
- data/tests/hash.fy +132 -9
- data/tests/html.fy +30 -13
- data/tests/integer.fy +3 -0
- data/tests/method.fy +6 -11
- data/tests/object.fy +12 -5
- data/tests/option_parser.fy +12 -3
- data/tests/string.fy +69 -1
- data/tests/symbol.fy +24 -0
- metadata +42 -12
- data/boot/rsexp_pretty_printer.rb +0 -76
- data/doc/api/jquery-ui.min.js +0 -401
- data/doc/api/jquery.tools.min.js +0 -192
- data/doc/api/themeswitchertool.js +0 -250
- data/examples/future_sends.fy +0 -15
data/tests/class.fy
CHANGED
|
@@ -355,23 +355,24 @@ FancySpec describe: Class with: {
|
|
|
355
355
|
NameSpace Array is_not: Array
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
358
|
+
it: "returns all nested classes of a class" with: 'nested_classes when: {
|
|
359
|
+
class OuterB {
|
|
360
|
+
NotAClass = 'nope
|
|
361
|
+
}
|
|
362
|
+
OuterB nested_classes is: $ Set[[]]
|
|
363
|
+
|
|
364
|
+
class OuterB {
|
|
365
|
+
class InnerB1 {
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
OuterB nested_classes is: $ Set[[OuterB::InnerB1]]
|
|
369
|
+
|
|
370
|
+
class OuterB {
|
|
371
|
+
class InnerB2 {
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
OuterB nested_classes is: $ Set[[OuterB InnerB1, OuterB InnerB2]]
|
|
375
|
+
}
|
|
375
376
|
|
|
376
377
|
it: "finds other nested classes in the same parent class" when: {
|
|
377
378
|
class MyOuter {
|
|
@@ -659,17 +660,21 @@ FancySpec describe: Class with: {
|
|
|
659
660
|
|
|
660
661
|
it: "defines a lazy slot" with: 'lazy_slot:value: when: {
|
|
661
662
|
class LazyClass {
|
|
662
|
-
|
|
663
|
-
|
|
663
|
+
read_slot: 'count
|
|
664
|
+
lazy_slot: 'foo value: { @count = @count + 1; 42 }
|
|
665
|
+
def initialize {
|
|
666
|
+
@count = 0
|
|
667
|
+
}
|
|
664
668
|
}
|
|
665
669
|
|
|
666
|
-
f = LazyClass new
|
|
667
|
-
|
|
668
|
-
f foo is:
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
f
|
|
672
|
-
|
|
670
|
+
f = LazyClass new
|
|
671
|
+
f count is: 0
|
|
672
|
+
f foo is: 42
|
|
673
|
+
f count is: 1
|
|
674
|
+
f foo is: 42
|
|
675
|
+
f count is: 1
|
|
676
|
+
10 times: { f foo }
|
|
677
|
+
f count is: 1
|
|
673
678
|
}
|
|
674
679
|
|
|
675
680
|
it: "returns a string representation of itself and its superclass, if any" with: 'inspect when: {
|
data/tests/control_flow.fy
CHANGED
data/tests/dynamic_key_hash.fy
CHANGED
|
@@ -5,12 +5,33 @@ FancySpec describe: DynamicKeyHash with: {
|
|
|
5
5
|
name: "Chris"
|
|
6
6
|
age: 25
|
|
7
7
|
country: "Germany"
|
|
8
|
+
nested: { yo: "off" }
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
hash = dkh hash
|
|
11
|
-
Set[hash keys] is: $ Set[['name, 'age, 'country]]
|
|
12
|
+
Set[hash keys] is: $ Set[['name, 'age, 'country, 'nested]]
|
|
12
13
|
hash['name] is: "Chris"
|
|
13
14
|
hash['age] is: 25
|
|
14
15
|
hash['country] is: "Germany"
|
|
16
|
+
hash['nested] is_a?: Block . is: true
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
it: "returns a deeply nested hash correctly" when: {
|
|
20
|
+
dkh = DynamicKeyHash new: true
|
|
21
|
+
dkh tap: @{
|
|
22
|
+
foo: @{
|
|
23
|
+
bar: @{
|
|
24
|
+
baz: "yo"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
dkh hash is: <[
|
|
30
|
+
'foo => <[
|
|
31
|
+
'bar => <[
|
|
32
|
+
'baz => "yo"
|
|
33
|
+
]>
|
|
34
|
+
]>
|
|
35
|
+
]>
|
|
15
36
|
}
|
|
16
37
|
}
|
data/tests/enumerable.fy
CHANGED
|
@@ -6,6 +6,17 @@ FancySpec describe: Fancy Enumerable with: {
|
|
|
6
6
|
[[1,2], [2,3,4], [-1]] superior_by: '< taking: 'first . is: [-1]
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
it: "returns an Array of mapped values" with: 'map: when: {
|
|
10
|
+
[] map: 'identity . is: []
|
|
11
|
+
(1,2,3) map: 'squared . is: [1,4,9]
|
|
12
|
+
"foo" map: 'upcase . is: ["F", "O", "O"]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
it: "returns an Array of mapped values by calling a block with each element and its index" with: 'map_with_index: when: {
|
|
16
|
+
[] map_with_index: 'identity . is: []
|
|
17
|
+
[1,2,3] map_with_index: |x i| { i * 2 } . is: [0,2,4]
|
|
18
|
+
}
|
|
19
|
+
|
|
9
20
|
it: "chain-maps all blocks on all values" with: 'map_chained: when: {
|
|
10
21
|
(1,2,3) map_chained: ('doubled, 'squared, 'to_s) . is: ["4", "16", "36"]
|
|
11
22
|
(1,2,3) map_chained: (@{ + 1 }, 'to_s) . is: ["2", "3", "4"]
|
|
@@ -14,15 +25,18 @@ FancySpec describe: Fancy Enumerable with: {
|
|
|
14
25
|
}
|
|
15
26
|
|
|
16
27
|
it: "maps over its elements with their index" with: 'map_with_index: when: {
|
|
17
|
-
(1,2,3) map_with_index: |x i| {
|
|
18
|
-
x + i
|
|
19
|
-
} . is: [1,3,5]
|
|
28
|
+
(1,2,3) map_with_index: |x i| { x + i } . is: [1,3,5]
|
|
20
29
|
|
|
21
|
-
[1,2,3,4] map_with_index: |
|
|
22
|
-
i
|
|
23
|
-
} . is: [0,1,2,3]
|
|
30
|
+
[1,2,3,4] map_with_index: |_ i| { i } . is: [0,1,2,3]
|
|
24
31
|
|
|
25
|
-
[] map_with_index: |
|
|
32
|
+
[] map_with_index: |_ i| { i } . is: []
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
it: "returns a flattened Array of mapped values" with: 'flat_map: when: {
|
|
36
|
+
[] flat_map: 'identity . is: []
|
|
37
|
+
(1,2,3) flat_map: 'identity . is: [1,2,3]
|
|
38
|
+
[(1,2,3), (4,5,6)] flat_map: 'sum . is: [6, 15]
|
|
39
|
+
[[1,2,3], [4,5,6]] flat_map: 'identity . is: [1,2,3,4,5,6]
|
|
26
40
|
}
|
|
27
41
|
|
|
28
42
|
it: "counts the amount of elements for which a block yields true" with: 'count: when: {
|
|
@@ -83,6 +97,12 @@ FancySpec describe: Fancy Enumerable with: {
|
|
|
83
97
|
"fabc" sorted? is: false
|
|
84
98
|
}
|
|
85
99
|
|
|
100
|
+
it: "sorts by a given block" with: 'sort_by: when: {
|
|
101
|
+
[[1,2], [1,2,3], [1], []] sort_by: @{ size } . is: [[], [1], [1,2], [1,2,3]]
|
|
102
|
+
[[1,2], [1,2,3], [1], []] sort_by: 'size . is: [[], [1], [1,2], [1,2,3]]
|
|
103
|
+
["abc", "abcd", "ab", "a", ""] sort_by: @{ size } . is: ["", "a", "ab", "abc", "abcd"]
|
|
104
|
+
}
|
|
105
|
+
|
|
86
106
|
it: "splits a collection at an index" with: 'split_at: when: {
|
|
87
107
|
[] split_at: 0 . is: [[],[]]
|
|
88
108
|
[1] split_at: 0 . is: [[],[1]]
|
|
@@ -114,6 +134,7 @@ FancySpec describe: Fancy Enumerable with: {
|
|
|
114
134
|
|
|
115
135
|
it: "drops elements from itself as long a block yields true" with: 'drop_while: when: {
|
|
116
136
|
(1..15) drop_while: |x| { x < 10 } . is: (10 upto: 15)
|
|
137
|
+
"aaabcd" drop_while: /a/ . is: ["b","c","d"]
|
|
117
138
|
}
|
|
118
139
|
|
|
119
140
|
it: "returns the first n elements" with: 'first: when: {
|
|
@@ -154,4 +175,215 @@ FancySpec describe: Fancy Enumerable with: {
|
|
|
154
175
|
[NoMethodError, IOError, ZeroDivisionError] join_by: '>< . is: (NoMethodError >< IOError >< ZeroDivisionError)
|
|
155
176
|
[NoMethodError, IOError, ZeroDivisionError] join_by: '<> . is: (NoMethodError <> IOError <> ZeroDivisionError)
|
|
156
177
|
}
|
|
178
|
+
|
|
179
|
+
it: "returns the element if found" with: 'find: when: {
|
|
180
|
+
[1,2,3] tap: @{
|
|
181
|
+
find: 0 . is: nil
|
|
182
|
+
find: 1 . is: 1
|
|
183
|
+
find: 2 . is: 2
|
|
184
|
+
find: 3 . is: 3
|
|
185
|
+
find: 4 . is: nil
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
it: "calls a block with the element if found" with: 'find:do: when: {
|
|
190
|
+
found = []
|
|
191
|
+
[1,2,3] tap: @{
|
|
192
|
+
insert = |x| { found << x }
|
|
193
|
+
find: 0 do: insert
|
|
194
|
+
find: 1 do: insert
|
|
195
|
+
find: 2 do: insert
|
|
196
|
+
find: 3 do: insert
|
|
197
|
+
find: 4 do: insert
|
|
198
|
+
}
|
|
199
|
+
found is: [1,2,3]
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
it: "calls a block with the element and its index if found" with: 'find_with_index:do: when: {
|
|
203
|
+
found = []
|
|
204
|
+
[1,2,3] tap: @{
|
|
205
|
+
insert = |x i| { found << (x,i) }
|
|
206
|
+
find_with_index: 0 do: insert
|
|
207
|
+
find_with_index: 1 do: insert
|
|
208
|
+
find_with_index: 2 do: insert
|
|
209
|
+
find_with_index: 3 do: insert
|
|
210
|
+
find_with_index: 4 do: insert
|
|
211
|
+
}
|
|
212
|
+
found is: [(1,0), (2,1), (3,2)]
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
it: "calls a block with an element and its indexes" with: 'for_every:with_index_do: when: {
|
|
216
|
+
found = []
|
|
217
|
+
[1,2,3,2,1] tap: @{
|
|
218
|
+
insert = |x i| { found << (x,i) }
|
|
219
|
+
for_every: 0 with_index_do: insert
|
|
220
|
+
for_every: 1 with_index_do: insert
|
|
221
|
+
for_every: 2 with_index_do: insert
|
|
222
|
+
for_every: 3 with_index_do: insert
|
|
223
|
+
for_every: 4 with_index_do: insert
|
|
224
|
+
}
|
|
225
|
+
found is: [(1,0), (1,4), (2,1), (2,3), (3,2)]
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
it: "calls a block with an element for every occurance" with: 'for_every:do: when: {
|
|
229
|
+
arr = [1,2,3,2,1]
|
|
230
|
+
|
|
231
|
+
c = 0
|
|
232
|
+
arr for_every: 0 do: { c = c + 1 }
|
|
233
|
+
c is: 0
|
|
234
|
+
|
|
235
|
+
arr for_every: 1 do: { c = c + 1 }
|
|
236
|
+
c is: 2
|
|
237
|
+
|
|
238
|
+
c = 0
|
|
239
|
+
arr for_every: 2 do: { c = c + 1 }
|
|
240
|
+
c is: 2
|
|
241
|
+
|
|
242
|
+
c = 0
|
|
243
|
+
arr for_every: 2 do: { c = c + 1 }
|
|
244
|
+
c is: 2
|
|
245
|
+
|
|
246
|
+
c = 0
|
|
247
|
+
arr for_every: 3 do: { c = c + 1 }
|
|
248
|
+
c is: 1
|
|
249
|
+
|
|
250
|
+
arr for_every: 1 do: @{ is: 1 }
|
|
251
|
+
arr for_every: 2 do: @{ is: 2 }
|
|
252
|
+
arr for_every: 3 do: @{ is: 3 }
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
it: "returns the last index of an element or nil" with: 'last_index_of: when: {
|
|
256
|
+
[] last_index_of: nil . is: nil
|
|
257
|
+
[] last_index_of: 1 . is: nil
|
|
258
|
+
[1,2,1,2] last_index_of: 1 . is: 2
|
|
259
|
+
[1,2,1,2] last_index_of: 2 . is: 3
|
|
260
|
+
[1,2,1,2] last_index_of: 3 . is: nil
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
it: "is selected from it with each index" with: 'select_with_index: when: {
|
|
264
|
+
["yooo",2,3,1,'foo,"bar"] select_with_index: |x i| { x is_a?: Fixnum } . is: [[2,1], [3,2], [1,3]]
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
it: "returns a chunked array based on a given block" with: 'chunk_by: when: {
|
|
268
|
+
[] chunk_by: @{ nil? } . is: []
|
|
269
|
+
[1] chunk_by: @{ nil? } . is: [[false, [1]]]
|
|
270
|
+
[1,2] chunk_by: @{ odd? } . is: [
|
|
271
|
+
[true, [1]],
|
|
272
|
+
[false, [2]]
|
|
273
|
+
]
|
|
274
|
+
|
|
275
|
+
[1,3,4,5,7,2,6,8,10,9] do: @{
|
|
276
|
+
chunk_by: 'even? . is: [
|
|
277
|
+
[false, [1,3]],
|
|
278
|
+
[true, [4]],
|
|
279
|
+
[false, [5,7]],
|
|
280
|
+
[true, [2,6,8,10]],
|
|
281
|
+
[false, [9]]
|
|
282
|
+
]
|
|
283
|
+
|
|
284
|
+
chunk_by: 'odd? . is: [
|
|
285
|
+
[true, [1,3]],
|
|
286
|
+
[false, [4]],
|
|
287
|
+
[true, [5,7]],
|
|
288
|
+
[false, [2,6,8,10]],
|
|
289
|
+
[true, [9]]
|
|
290
|
+
]
|
|
291
|
+
|
|
292
|
+
chunk_by: 'nil? . is: [
|
|
293
|
+
[false, [1,3,4,5,7,2,6,8,10,9]]
|
|
294
|
+
]
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
it: "returns a hash grouped by the value returned by a block called with the elements" with: 'group_by: when: {
|
|
299
|
+
[] group_by: 'nil? . is: <[]>
|
|
300
|
+
[1,3,5] group_by: @{ odd? } . is: <[true => [1,3,5]]>
|
|
301
|
+
(0,1,2,3) group_by: 'even? . is: <[false => [1,3], true => [0,2]]>
|
|
302
|
+
('foo, 1, 2, 'bar) group_by: @{ class } . is: <[Symbol => ['foo, 'bar], Fixnum => [1,2]]>
|
|
303
|
+
"FooBar" group_by: @{ uppercase? } . is: <[true => ["F", "B"], false => ["o", "o", "a", "r"]]>
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
it: "returns its min and max value" with: 'min_max when: {
|
|
307
|
+
[] min_max is: (nil, nil)
|
|
308
|
+
[1] min_max is: (1, 1)
|
|
309
|
+
(1,2,3,4) min_max is: (1, 4)
|
|
310
|
+
(4,2,1,3) min_max is: (1, 4)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
it: "returns its min and max value based on a given block" with: 'min_max_by: when: {
|
|
314
|
+
[] min_max_by: 'nil . is: (nil, nil)
|
|
315
|
+
["foo"] min_max_by: 'size . is: ("foo", "foo")
|
|
316
|
+
["a", "bc", "def"] min_max_by: @{ size } . is: ("a", "def")
|
|
317
|
+
["long", "a", "bc", "def"] min_max_by: @{ size } . is: ("a", "long")
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
it: "returns the minimum" with: 'min when: {
|
|
321
|
+
[] min is: nil
|
|
322
|
+
[100] min is: 100
|
|
323
|
+
[0, 1] min is: 0
|
|
324
|
+
[-100, 100] min is: -100
|
|
325
|
+
[-4,-3,-2,-1,0,1,2,3,4,5] min is: -4
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
it: "returns the minimum based on a block" with: 'min_by: when: {
|
|
329
|
+
[] min_by: 'size . is: nil
|
|
330
|
+
[[1, 2, 3]] min_by: 'size . is: [1, 2, 3]
|
|
331
|
+
["foo", "foobar"] min_by: @{ size } . is: "foo"
|
|
332
|
+
[[1, 2], ["foo", "bar", "baz"]] min_by: @{ size } . is: [1, 2]
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
it: "returns the maximum" with: 'max when: {
|
|
336
|
+
[] max is: nil
|
|
337
|
+
[100] max is: 100
|
|
338
|
+
[0, 1] max is: 1
|
|
339
|
+
[-100, 100] max is: 100
|
|
340
|
+
[-4,-3,-2,-1,0,1,2,3,4,5] max is: 5
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
it: "returns the maximum based on a block" with: 'max_by: when: {
|
|
344
|
+
[] max_by: 'size . is: nil
|
|
345
|
+
[[1, 2, 3]] max_by: 'size . is: [1, 2, 3]
|
|
346
|
+
["foo", "foobar"] max_by: @{ size } . is: "foobar"
|
|
347
|
+
[[1, 2], ["foo", "bar", "baz"]] max_by: @{ size } . is: ["foo", "bar", "baz"]
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
it: "returns true if exactly one element yields true with a given block" with: 'one?: when: {
|
|
351
|
+
[] one?: 'nil? . is: false
|
|
352
|
+
(1,2) one?: 'odd? . is: true
|
|
353
|
+
(1,2,3) one?: 'odd? . is: false
|
|
354
|
+
"fooBar" one?: 'uppercase? . is: true
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
it: "returns true if a given block yields true for none of the elements" with: 'none?: when: {
|
|
358
|
+
[] none?: 'nil? . is: true
|
|
359
|
+
[1] none?: 'odd? . is: false
|
|
360
|
+
[1] none?: 'even? . is: true
|
|
361
|
+
[1,3,5] none?: 'even? . is: true
|
|
362
|
+
"foobarBaz" none?: 'uppercase? . is: false
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
it: "returns the sum of all the elements" with: 'sum when: {
|
|
366
|
+
[] sum is: 0
|
|
367
|
+
[1] sum is: 1
|
|
368
|
+
[-1,0,1] sum is: 0
|
|
369
|
+
(1,2,3) sum is: 6
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
it: "returns the product of all the elements" with: 'product when: {
|
|
373
|
+
[] product is: 1
|
|
374
|
+
[1] product is: 1
|
|
375
|
+
[1,2] product is: 2
|
|
376
|
+
[1,2,3] product is: 6
|
|
377
|
+
[-1,5,2] product is: -10
|
|
378
|
+
[1,0,1] product is: 0
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
it: "retuns the average value of all elements" with: 'average when: {
|
|
382
|
+
[] average is: 0
|
|
383
|
+
[1] average is: 1
|
|
384
|
+
[1,2] average is: 1.5
|
|
385
|
+
[2,4,6] average is: 4
|
|
386
|
+
[-1,0,1] average is: 0
|
|
387
|
+
[-1,1,2] average is: $ 2.0 / 3
|
|
388
|
+
}
|
|
157
389
|
}
|
data/tests/enumerator.fy
CHANGED
|
@@ -98,6 +98,13 @@ FancySpec describe: Fancy Enumerator with: {
|
|
|
98
98
|
10 times: { enum ended? is: false; enum next } # move forward
|
|
99
99
|
enum ended? is: true
|
|
100
100
|
}
|
|
101
|
+
|
|
102
|
+
it: "is an Enumerable" when: {
|
|
103
|
+
enum = (1..9) to_enum
|
|
104
|
+
enum select: 'even? . is: [2,4,6,8]
|
|
105
|
+
enum rewind
|
|
106
|
+
enum map: @{ + 1 } . is: $ (2..10) to_a
|
|
107
|
+
}
|
|
101
108
|
}
|
|
102
109
|
|
|
103
110
|
# => [:each, :each_with_index, :each_with_object, :with_index, :with_object, :next_values, :peek_values, :next, :peek, :feed, :rewind, :inspect]
|
data/tests/file.fy
CHANGED
|
@@ -17,6 +17,10 @@ FancySpec describe: File with: {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
it: "reads all lines in a file correctly" with: 'readlines: when: {
|
|
21
|
+
File readlines: "README.md" . is: $ File read: "README.md" with: @{ readlines }
|
|
22
|
+
}
|
|
23
|
+
|
|
20
24
|
it: "writes a file correctly" with: 'write:with: when: {
|
|
21
25
|
dirname = "tmp"
|
|
22
26
|
filename = "#{dirname}/write_test.txt"
|
|
@@ -140,4 +144,16 @@ FancySpec describe: File with: {
|
|
|
140
144
|
]>
|
|
141
145
|
File delete: filename
|
|
142
146
|
}
|
|
147
|
+
|
|
148
|
+
it: "overwrites a file correctly" with: 'overwrite:with: when: {
|
|
149
|
+
filename = "/tmp/#{Time now to_i random}_overwrite_test.fy"
|
|
150
|
+
try {
|
|
151
|
+
File write: filename with: @{ println: "foo"; println: "bar" }
|
|
152
|
+
File read: filename . is: "foo\nbar\n"
|
|
153
|
+
File overwrite: filename with: @{ println: "bar"; println: "foo" }
|
|
154
|
+
File read: filename . is: "bar\nfoo\n"
|
|
155
|
+
} finally {
|
|
156
|
+
File delete!: filename
|
|
157
|
+
}
|
|
158
|
+
}
|
|
143
159
|
}
|
data/tests/future.fy
CHANGED
|
@@ -16,19 +16,9 @@ FancySpec describe: FutureSend with: {
|
|
|
16
16
|
a is: nil
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
# it: "composes Futures to create execution pipelines" with: '&& when: {
|
|
20
|
-
# def some_computation: num {
|
|
21
|
-
# num upto: (num ** num ** num)
|
|
22
|
-
# }
|
|
23
|
-
|
|
24
|
-
# f = self @ some_computation: 2 && @{select: 'even?} && @{size}
|
|
25
|
-
# f is_a?: FutureSend . is: true
|
|
26
|
-
# f value is_a?: Fixnum . is: true
|
|
27
|
-
# }
|
|
28
|
-
|
|
29
19
|
it: "accesses the same future from multiple threads and blocks them until the value is computed" when: {
|
|
30
20
|
def another_method {
|
|
31
|
-
Thread sleep: 0.
|
|
21
|
+
Thread sleep: 0.01
|
|
32
22
|
42
|
|
33
23
|
}
|
|
34
24
|
|