fancy 0.6.0 → 0.7.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 +4 -1
- data/Rakefile +0 -52
- data/bin/fspec +22 -12
- data/bin/ifancy +1 -1
- data/boot/fancy_ext/class.rb +1 -0
- data/boot/fancy_ext/object.rb +8 -6
- data/boot/rbx-compiler/compiler/ast/method_def.rb +2 -0
- data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
- data/boot/rbx-compiler/parser/parser.y +9 -0
- data/doc/api/fancy.jsonp +1 -1
- data/examples/stupid_quicksort.fy +11 -9
- data/lib/array.fy +26 -58
- data/lib/block.fy +0 -1
- data/lib/boot.fy +2 -2
- data/lib/class.fy +85 -0
- data/lib/compiler/ast/class_def.fy +1 -1
- data/lib/compiler/ast/expression_list.fy +4 -12
- data/lib/compiler/ast/identifier.fy +3 -3
- data/lib/compiler/ast/method_def.fy +3 -1
- data/lib/compiler/ast/singleton_method_def.fy +4 -1
- data/lib/contracts.fy +53 -56
- data/lib/dynamic_slot_object.fy +39 -3
- data/lib/enumerable.fy +144 -47
- data/lib/fancy_spec.fy +2 -6
- data/lib/file.fy +67 -0
- data/lib/future.fy +42 -3
- data/lib/hash.fy +35 -29
- data/lib/html.fy +1 -1
- data/lib/integer.fy +34 -0
- data/lib/main.fy +13 -7
- data/lib/message_sink.fy +1 -1
- data/lib/number.fy +10 -0
- data/lib/object.fy +27 -1
- data/lib/package.fy +2 -0
- data/lib/package/handler.fy +56 -0
- data/lib/package/installer.fy +21 -51
- data/lib/package/specification.fy +12 -5
- data/lib/package/uninstaller.fy +22 -3
- data/lib/parser/ext/parser.y +9 -0
- data/lib/proxy.fy +25 -2
- data/lib/rbx.fy +2 -1
- data/lib/rbx/array.fy +16 -1
- data/lib/rbx/class.fy +34 -9
- data/lib/rbx/file.fy +2 -2
- data/lib/rbx/fixnum.fy +1 -11
- data/lib/rbx/io.fy +4 -0
- data/lib/rbx/module.fy +11 -0
- data/lib/rbx/object.fy +12 -12
- data/lib/rbx/proc.fy +7 -0
- data/lib/rbx/string.fy +5 -1
- data/lib/rbx/symbol.fy +9 -0
- data/lib/string.fy +1 -1
- data/lib/tuple.fy +37 -35
- data/lib/version.fy +6 -5
- data/tests/array.fy +14 -2
- data/tests/class.fy +79 -0
- data/tests/dynamic_key_hash.fy +16 -0
- data/tests/dynamic_slot_object.fy +28 -0
- data/tests/dynamic_value_array.fy +12 -0
- data/tests/enumerable.fy +46 -0
- data/tests/file.fy +38 -0
- data/tests/fixnum.fy +22 -0
- data/tests/future.fy +40 -0
- data/tests/hash.fy +8 -7
- data/tests/object.fy +31 -5
- data/tests/set.fy +1 -1
- data/tests/string.fy +18 -2
- data/tests/tuple.fy +7 -0
- data/tools/fancy-mode.el +10 -0
- metadata +9 -12
- data/examples/99bottles.fy +0 -5
- data/examples/conditions_exceptions.fy +0 -9
- data/examples/conditions_parsing.fy +0 -68
- data/examples/dynamic.fy +0 -8
- data/examples/greeter.fy +0 -9
- data/examples/parsing.fy +0 -1
- data/lib/rbx/process.fy +0 -13
- data/lib/remote_object.fy +0 -59
data/lib/fancy_spec.fy
CHANGED
@@ -175,7 +175,7 @@ class FancySpec {
|
|
175
175
|
@@current
|
176
176
|
}
|
177
177
|
|
178
|
-
def SpecTest print_failures: start_time {
|
178
|
+
def SpecTest print_failures: start_time no_failures: ok_block else: error_block {
|
179
179
|
@@failed_positive each: |test_obj failed_tests| {
|
180
180
|
failed_tests each: |t| {
|
181
181
|
Console newline
|
@@ -194,11 +194,7 @@ class FancySpec {
|
|
194
194
|
|
195
195
|
Console newline
|
196
196
|
"Ran #{@@total_tests} tests (#{@@total_expectations} expectations) with #{@@failed_count} failures in #{Time now - start_time} seconds." println
|
197
|
-
if: (@@failed_count
|
198
|
-
System exit: 1
|
199
|
-
} else: {
|
200
|
-
System exit: 0
|
201
|
-
}
|
197
|
+
if: (@@failed_count == 0) then: ok_block else: error_block
|
202
198
|
}
|
203
199
|
|
204
200
|
def initialize: @info_str block: @block {
|
data/lib/file.fy
CHANGED
@@ -26,6 +26,25 @@ class File {
|
|
26
26
|
File open: filename modes: ['read] with: block
|
27
27
|
}
|
28
28
|
|
29
|
+
def File read_binary: filename with: block {
|
30
|
+
"""
|
31
|
+
@filename Filename of @File@ to read from.
|
32
|
+
@block @Block@ called with a @File@ object to read from.
|
33
|
+
|
34
|
+
Opens a @File@ for reading and calls @block with it.
|
35
|
+
"""
|
36
|
+
|
37
|
+
File open: filename modes: ['read, 'binary] with: block
|
38
|
+
}
|
39
|
+
|
40
|
+
def File read_binary: filename {
|
41
|
+
content = nil
|
42
|
+
File read_binary: filename with: |f| {
|
43
|
+
content = f read
|
44
|
+
}
|
45
|
+
content
|
46
|
+
}
|
47
|
+
|
29
48
|
def File touch: filename {
|
30
49
|
"""
|
31
50
|
@filename Name of @File@ to be created, if not already existant.
|
@@ -39,6 +58,54 @@ class File {
|
|
39
58
|
}
|
40
59
|
}
|
41
60
|
|
61
|
+
def File eval: filename {
|
62
|
+
"""
|
63
|
+
@filename Name of Fancy source file (*.fy) to be read and evaluated.
|
64
|
+
@return Value of evaluating code in @filename.
|
65
|
+
"""
|
66
|
+
|
67
|
+
File read: filename . eval
|
68
|
+
}
|
69
|
+
|
70
|
+
def File read_config: filename {
|
71
|
+
"""
|
72
|
+
@filename @String@ that is the name of file to be read as a config file.
|
73
|
+
@return @Hash@ of key-value pairs of the config file.
|
74
|
+
|
75
|
+
Reads a .fy source file as a config file.
|
76
|
+
|
77
|
+
Example:
|
78
|
+
# Given a file config.fy with these contents:
|
79
|
+
{
|
80
|
+
host: \"127.0.0.1\"
|
81
|
+
port: 1234
|
82
|
+
names: [
|
83
|
+
'foo,
|
84
|
+
'bar,
|
85
|
+
'baz
|
86
|
+
]
|
87
|
+
something_else: {
|
88
|
+
another_value: 'foo
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
# It can be read like so:
|
93
|
+
config = File read_config: \"config.fy\"
|
94
|
+
|
95
|
+
# config is now:
|
96
|
+
<[
|
97
|
+
'host => \"127.0.0.1\",
|
98
|
+
'port => 1234,
|
99
|
+
'names => ['foo, 'bar, 'baz],
|
100
|
+
'something_else: <[
|
101
|
+
'another_value => 'foo
|
102
|
+
]>
|
103
|
+
]>
|
104
|
+
"""
|
105
|
+
|
106
|
+
File read: filename . eval to_hash_deep
|
107
|
+
}
|
108
|
+
|
42
109
|
def writeln: x {
|
43
110
|
"""
|
44
111
|
Writes a given argument as a String followed by a newline into the
|
data/lib/future.fy
CHANGED
@@ -1,11 +1,22 @@
|
|
1
1
|
class FutureSend {
|
2
|
-
|
2
|
+
"""
|
3
|
+
A @FutureSend@ gets created whenever an asynchronous message via the @@ operator gets sent, yielding a @FutureSend@.
|
4
|
+
They represent Futures/Promises in Fancy.
|
5
|
+
|
6
|
+
Example:
|
7
|
+
f = some_object @ some_method: some_argument
|
8
|
+
f class # => FutureSend
|
9
|
+
f value # => Value returned by some_method, but may block the current Thread if f hasn't completed yet.
|
10
|
+
"""
|
11
|
+
|
12
|
+
read_slots: ('receiver, 'message, 'params)
|
3
13
|
def initialize: @actor receiver: @receiver message: @message with_params: @params ([]) {
|
4
14
|
@completed_mutex = Mutex new
|
5
15
|
@condvar = ConditionVariable new
|
6
16
|
@completed = false
|
7
17
|
@failed = false
|
8
18
|
@continuations = []
|
19
|
+
@fail_continuations = []
|
9
20
|
@actor ! ('future, (@message, @params), self)
|
10
21
|
}
|
11
22
|
|
@@ -27,9 +38,20 @@ class FutureSend {
|
|
27
38
|
|
28
39
|
def completed! {
|
29
40
|
@condvar broadcast
|
30
|
-
|
31
|
-
|
41
|
+
if: @failed then: {
|
42
|
+
try {
|
43
|
+
@fail_continuations each: @{ call: [@fail_reason] }
|
44
|
+
} catch Exception => ex {
|
45
|
+
*stderr* println: "Error in FutureSend#completed! while calling fail continuations: #{ex}"
|
46
|
+
}
|
47
|
+
} else: {
|
48
|
+
try {
|
49
|
+
@continuations each: @{ call: [@value] }
|
50
|
+
} catch Exception => ex {
|
51
|
+
*stderr* println: "Error in FutureSend#completed! while calling success continuations: #{ex}"
|
52
|
+
}
|
32
53
|
}
|
54
|
+
@fail_continuations = []
|
33
55
|
@continuations = []
|
34
56
|
}
|
35
57
|
|
@@ -113,6 +135,23 @@ class FutureSend {
|
|
113
135
|
value send_future: message with_params: params
|
114
136
|
}
|
115
137
|
|
138
|
+
def when_failed: block {
|
139
|
+
"""
|
140
|
+
@block @Block@ to be registered as a continuation when @self fails.
|
141
|
+
|
142
|
+
Registers @block as a continuation to be called with @self's fail reason in case of failure.
|
143
|
+
"""
|
144
|
+
|
145
|
+
{ return nil } if: succeeded?
|
146
|
+
@completed_mutex synchronize: {
|
147
|
+
if: @failed then: {
|
148
|
+
block call: [@fail_reason]
|
149
|
+
} else: {
|
150
|
+
@fail_continuations << block
|
151
|
+
}
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
116
155
|
def when_done: block {
|
117
156
|
"""
|
118
157
|
@block @Block@ to be registered as a continuation when @self succeeds.
|
data/lib/hash.fy
CHANGED
@@ -6,6 +6,9 @@ class Hash {
|
|
6
6
|
|
7
7
|
include: Fancy Enumerable
|
8
8
|
|
9
|
+
alias_method: 'get_slot: for: 'at:
|
10
|
+
alias_method: 'set_slot:value: for: 'at:put:
|
11
|
+
|
9
12
|
def [key] {
|
10
13
|
"""
|
11
14
|
@key Key for value to get.
|
@@ -25,13 +28,44 @@ class Hash {
|
|
25
28
|
|
26
29
|
Returns the value for a given key.
|
27
30
|
If the key is not found, calls @else_block and returns the value it yields.
|
31
|
+
|
32
|
+
Example:
|
33
|
+
<['foo => 'bar]> at: 'foo else: { 42 } # => 'bar
|
34
|
+
<['foo => 'bar]> at: 'unknown else: { 42 } # => 42
|
35
|
+
<['nil => nil]> at: 'nil else: { 'not_found } # => nil
|
36
|
+
"""
|
37
|
+
|
38
|
+
if: (includes?: key) then: {
|
39
|
+
at: key
|
40
|
+
} else: {
|
41
|
+
else_block call: [key]
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
alias_method: 'fetch:else: for: 'at:else:
|
46
|
+
|
47
|
+
def at: key else_put: else_block {
|
48
|
+
"""
|
49
|
+
@key Key of value to get.
|
50
|
+
@else_block @Block@ that gets called and its value inserted into @self if @key not in @self.
|
51
|
+
|
52
|
+
Example:
|
53
|
+
h = <['foo => 'bar]>
|
54
|
+
h at: 'foo else_put: { 42 } # => 'bar
|
55
|
+
h['foo] # => 'bar
|
56
|
+
h at: 'undefined else_put: { 42 } # => 42
|
57
|
+
h['undefined] # => 42
|
28
58
|
"""
|
29
59
|
|
30
60
|
if: (includes?: key) then: {
|
31
61
|
at: key
|
32
|
-
} else:
|
62
|
+
} else: {
|
63
|
+
at: key put: $ else_block call: [key]
|
64
|
+
}
|
33
65
|
}
|
34
66
|
|
67
|
+
alias_method: 'fetch:else_put: for: 'at:else_put:
|
68
|
+
|
35
69
|
def each: block {
|
36
70
|
"""
|
37
71
|
@block @Block@ to be called with each key and value in @self.
|
@@ -85,16 +119,6 @@ class Hash {
|
|
85
119
|
map: |pair| { pair }
|
86
120
|
}
|
87
121
|
|
88
|
-
def to_s {
|
89
|
-
"""
|
90
|
-
@return @String@ representation of @self.
|
91
|
-
|
92
|
-
Returns a @String@ representation of a @Hash@.
|
93
|
-
"""
|
94
|
-
|
95
|
-
to_a to_s
|
96
|
-
}
|
97
|
-
|
98
122
|
def to_object {
|
99
123
|
"""
|
100
124
|
@return New @Object@ with slots defined by keys and values in @self.
|
@@ -139,22 +163,4 @@ class Hash {
|
|
139
163
|
|
140
164
|
keys map: |k| { at: k }
|
141
165
|
}
|
142
|
-
|
143
|
-
def fetch: key else: else_block {
|
144
|
-
"""
|
145
|
-
@key Key of value to get.
|
146
|
-
@else_block @Block@ that gets called if @key not in @self.
|
147
|
-
|
148
|
-
Example:
|
149
|
-
<['foo => 'bar]> fetch: 'foo else: { 42 } # => 'bar
|
150
|
-
<['foo => 'bar]> fetch: 'unknown else: { 42 } # => 42
|
151
|
-
<['nil => nil]> fetch: 'nil else: { 'not_found } # => nil
|
152
|
-
"""
|
153
|
-
|
154
|
-
if: (includes?: key) then: {
|
155
|
-
at: key
|
156
|
-
} else: {
|
157
|
-
else_block call: [key]
|
158
|
-
}
|
159
|
-
}
|
160
166
|
}
|
data/lib/html.fy
CHANGED
data/lib/integer.fy
CHANGED
@@ -16,4 +16,38 @@ class Integer {
|
|
16
16
|
block call: [i + offset]
|
17
17
|
}
|
18
18
|
}
|
19
|
+
|
20
|
+
def times_try: block retry_with: retry_block ({}) {
|
21
|
+
"""
|
22
|
+
@block @Block@ to be called and retries @self amount of times if exceptions get thrown.
|
23
|
+
@retry_block @Block@ to be called before retrying execution of @block. Defaults to an empty @Block@.
|
24
|
+
@return Return value of calling @block or raises an exception after @self tries.
|
25
|
+
Returns @nil if @self <= 0.
|
26
|
+
|
27
|
+
Tries to call a @Block@ @self amount of times, returning its return
|
28
|
+
value or raising the last exception raised frin @block after @self tries.
|
29
|
+
|
30
|
+
Example:
|
31
|
+
2 times_try: {
|
32
|
+
# this code will be tried 2 times.
|
33
|
+
# if it succeeds the first time, simply return its value, otherwise try once more.
|
34
|
+
# if it still fails after 2 attempts, raises the exception thrown (in this case probably an IOError).
|
35
|
+
@connection readln
|
36
|
+
} retry_with: { @connection reconnect }
|
37
|
+
"""
|
38
|
+
|
39
|
+
max_retries = self
|
40
|
+
{ return nil } if: $ max_retries <= 0
|
41
|
+
value = nil
|
42
|
+
try {
|
43
|
+
value = block call: [max_retries]
|
44
|
+
} catch Exception => e {
|
45
|
+
max_retries = max_retries - 1
|
46
|
+
{ e raise! } unless: $ max_retries > 0
|
47
|
+
retry_block call
|
48
|
+
retry
|
49
|
+
} finally {
|
50
|
+
return value
|
51
|
+
}
|
52
|
+
}
|
19
53
|
}
|
data/lib/main.fy
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
if: (ARGV size == 1) then: {
|
8
8
|
ARGV for_options: ["-v", "--version"] do: {
|
9
|
-
"Fancy "
|
9
|
+
"Fancy #{Fancy VERSION}" println
|
10
10
|
"(C) 2010, 2011, 2012 Christopher Bertels <chris@fancy-lang.org>" println
|
11
11
|
System exit
|
12
12
|
}
|
@@ -20,12 +20,13 @@ if: (ARGV size == 1) then: {
|
|
20
20
|
" -I directory Add directory to Fancy's LOAD_PATH",
|
21
21
|
" -e 'command' One line of Fancy code that gets evaluated immediately",
|
22
22
|
" -c [filenames] Compile given files to Rubinius bytecode",
|
23
|
-
" -cv [filenames] Compile given files to Rubinius bytecode verbosely (outputting the generated bytecode)
|
23
|
+
" -cv [filenames] Compile given files to Rubinius bytecode verbosely (outputting the generated bytecode)",
|
24
24
|
"",
|
25
25
|
"Fancy package management:",
|
26
26
|
" install [packagename] Install a Fancy package with a given name to $FANCYPACK_DIR",
|
27
|
-
" install --deps Install dependencies specified in .fancypack file (expected in current directory)
|
28
|
-
" uninstall [packagename] Uninstall a Fancy package with a given name from $FANCYPACK_DIR"
|
27
|
+
" install --deps Install dependencies specified in .fancypack file (expected in current directory)",
|
28
|
+
" uninstall [packagename] Uninstall a Fancy package with a given name from $FANCYPACK_DIR",
|
29
|
+
" list-packages List all installed packages"] println
|
29
30
|
System exit # quit when running --help
|
30
31
|
}
|
31
32
|
}
|
@@ -41,9 +42,14 @@ ARGV for_option: "-e" do: |eval_string| {
|
|
41
42
|
|
42
43
|
ARGV for_option: "-c" do: {
|
43
44
|
ARGV index: "-c" . if_true: |idx| {
|
44
|
-
ARGV[[idx + 1, -1]]
|
45
|
-
|
46
|
-
|
45
|
+
ARGV[[idx + 1, -1]] . tap: |filenames| {
|
46
|
+
filenames each: |filename| {
|
47
|
+
"Compiling " ++ filename println
|
48
|
+
Fancy Compiler compile_file: filename to: nil line: 1 print: false
|
49
|
+
}
|
50
|
+
files = "file"
|
51
|
+
{ files = "files" } if: $ filenames size != 1
|
52
|
+
"Compiled #{filenames size} #{files}." println
|
47
53
|
}
|
48
54
|
}
|
49
55
|
System exit
|
data/lib/message_sink.fy
CHANGED
data/lib/number.fy
CHANGED
data/lib/object.fy
CHANGED
@@ -290,13 +290,16 @@ class Object {
|
|
290
290
|
cond if_true: else_block else: block
|
291
291
|
}
|
292
292
|
|
293
|
+
alias_method: 'unless:then: for: 'unless:do:
|
294
|
+
alias_method: 'unless:then:else: for: 'unless:do:else:
|
295
|
+
|
293
296
|
def method: method_name {
|
294
297
|
"""
|
295
298
|
@return @Method@ with @method_name defined for @self, or @nil.
|
296
299
|
Returns the method with a given name for self, if defined.
|
297
300
|
"""
|
298
301
|
|
299
|
-
method(message_name
|
302
|
+
method(method_name message_name)
|
300
303
|
}
|
301
304
|
|
302
305
|
def documentation {
|
@@ -572,6 +575,29 @@ class Object {
|
|
572
575
|
}
|
573
576
|
}
|
574
577
|
|
578
|
+
def with_mutable_slots: slotnames do: block {
|
579
|
+
"""
|
580
|
+
@slotnames @Fancy Enumerable@ of slotnames to be mutable within @block.
|
581
|
+
@block @Block@ to be called with @self.
|
582
|
+
|
583
|
+
Calls @block with @self while having slots defined in @slotnames
|
584
|
+
be mutable during execution of @block.
|
585
|
+
"""
|
586
|
+
|
587
|
+
metaclass read_write_slots: slotnames
|
588
|
+
val = nil
|
589
|
+
try {
|
590
|
+
val = block call: [self]
|
591
|
+
} finally {
|
592
|
+
slotnames each: |s| {
|
593
|
+
metaclass undefine_method: s
|
594
|
+
metaclass undefine_method: "#{s}:"
|
595
|
+
}
|
596
|
+
return val
|
597
|
+
}
|
598
|
+
}
|
599
|
+
private: 'with_mutable_slots:do:
|
600
|
+
|
575
601
|
def <=> other {
|
576
602
|
"""
|
577
603
|
@other Other object to compare against.
|
data/lib/package.fy
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require: "package/handler"
|
1
2
|
require: "package/installer"
|
2
3
|
require: "package/dependency_installer"
|
3
4
|
require: "package/uninstaller"
|
@@ -29,6 +30,7 @@ class Fancy Package {
|
|
29
30
|
DEFAULT_FANCY_ROOT = ENV["HOME"] ++ "/.fancy"
|
30
31
|
DEFAULT_PACKAGES_PATH = DEFAULT_FANCY_ROOT ++ "/packages"
|
31
32
|
DEFAULT_PACKAGES_LIB_PATH = DEFAULT_PACKAGES_PATH ++ "/lib"
|
33
|
+
DEFAULT_PACKAGES_BIN_PATH = DEFAULT_PACKAGES_PATH ++ "/bin"
|
32
34
|
|
33
35
|
def self install: package_name version: version ('latest) {
|
34
36
|
"""
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class Fancy Package {
|
2
|
+
class Handler {
|
3
|
+
read_write_slots: ('user, 'repository, 'version)
|
4
|
+
|
5
|
+
def initialize: @package_name install_path: @install_path (ENV["FANCY_PACKAGE_DIR"]) {
|
6
|
+
splitted = @package_name split: "/"
|
7
|
+
@user, @repository = splitted
|
8
|
+
|
9
|
+
# check for version, e.g. when passing in:
|
10
|
+
# $ fancy install bakkdoor/fyzmq=1.0.1
|
11
|
+
splitted = @repository split: "="
|
12
|
+
if: (splitted size > 1) then: {
|
13
|
+
@repository, @version = splitted
|
14
|
+
@package_name = @user + "/" + @repository
|
15
|
+
} else: {
|
16
|
+
@version = 'latest
|
17
|
+
}
|
18
|
+
|
19
|
+
@install_path if_nil: {
|
20
|
+
@install_path = Fancy Package DEFAULT_PACKAGES_PATH
|
21
|
+
Directory create!: $ Fancy Package DEFAULT_FANCY_ROOT
|
22
|
+
Directory create!: $ Fancy Package DEFAULT_PACKAGES_PATH
|
23
|
+
Directory create!: $ Fancy Package DEFAULT_PACKAGES_LIB_PATH
|
24
|
+
Directory create!: $ Fancy Package DEFAULT_PACKAGES_BIN_PATH
|
25
|
+
Directory create!: $ Fancy Package DEFAULT_PACKAGES_PATH ++ "/downloads"
|
26
|
+
}
|
27
|
+
|
28
|
+
@download_path = @install_path ++ "/downloads"
|
29
|
+
}
|
30
|
+
|
31
|
+
def load_fancypack: success_block else: else_block ({}) {
|
32
|
+
"""
|
33
|
+
Loads the @.fancypack file within the downloaded package directory.
|
34
|
+
If no @.fancypack file is found, raise an error.
|
35
|
+
"""
|
36
|
+
|
37
|
+
Dir glob(installed_path ++ "/*.fancypack") first if_true: |fpackfile| {
|
38
|
+
require: fpackfile
|
39
|
+
}
|
40
|
+
|
41
|
+
if: (Specification[@repository]) then: success_block else: else_block
|
42
|
+
}
|
43
|
+
|
44
|
+
def installed_path {
|
45
|
+
"#{@install_path}/#{@user}_#{@repository}-#{@version}"
|
46
|
+
}
|
47
|
+
|
48
|
+
def lib_path {
|
49
|
+
@install_path + "/lib"
|
50
|
+
}
|
51
|
+
|
52
|
+
def bin_path {
|
53
|
+
@install_path + "/bin"
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|