filigree 0.3.3 → 0.4.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.
- checksums.yaml +4 -4
- data/README.md +1 -5
- data/Rakefile +16 -12
- data/lib/filigree.rb +1 -1
- data/lib/filigree/abstract_class.rb +2 -2
- data/lib/filigree/application.rb +4 -9
- data/lib/filigree/boolean.rb +24 -21
- data/lib/filigree/class.rb +32 -29
- data/lib/filigree/class_methods_module.rb +4 -4
- data/lib/filigree/commands.rb +8 -6
- data/lib/filigree/configuration.rb +6 -8
- data/lib/filigree/match.rb +174 -163
- data/lib/filigree/object.rb +14 -11
- data/lib/filigree/request_file.rb +4 -4
- data/lib/filigree/string.rb +30 -28
- data/lib/filigree/types.rb +9 -10
- data/lib/filigree/version.rb +2 -2
- data/lib/filigree/visitor.rb +5 -5
- data/test/tc_abstract_class.rb +1 -1
- data/test/tc_application.rb +5 -5
- data/test/tc_boolean.rb +4 -1
- data/test/tc_class.rb +10 -6
- data/test/tc_class_methods_module.rb +1 -1
- data/test/tc_commands.rb +4 -4
- data/test/tc_configuration.rb +3 -3
- data/test/tc_match.rb +22 -22
- data/test/tc_object.rb +6 -7
- data/test/tc_string.rb +6 -4
- data/test/tc_types.rb +19 -19
- data/test/tc_visitor.rb +6 -4
- data/test/ts_filigree.rb +5 -5
- metadata +14 -15
data/lib/filigree/object.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/04
|
4
|
+
# Description: Additional features for all objects.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
@@ -29,12 +29,15 @@ end
|
|
29
29
|
# Classes and Modules #
|
30
30
|
#######################
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
module Filigree
|
33
|
+
|
34
|
+
# Object class extras.
|
35
|
+
refine Object do
|
36
|
+
# A copy and modification helper.
|
37
|
+
#
|
38
|
+
# @return [Object] A copy of the object with the block evaluated in the context of the copy.
|
39
|
+
def clone_with(&block)
|
40
|
+
self.clone.tap { |clone| clone.instance_exec(&block) }
|
41
|
+
end
|
39
42
|
end
|
40
43
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2014/1/20
|
4
|
+
# Description: A helper for require.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
data/lib/filigree/string.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2014/01/20
|
4
|
+
# Description: Class extensions for the String class.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
@@ -15,38 +15,40 @@
|
|
15
15
|
# Classes and Modules #
|
16
16
|
#######################
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
module Filigree
|
19
|
+
refine String do
|
20
|
+
# Chop up the string into multiple lines so that no line is longer than
|
21
|
+
# the specified number of characters.
|
22
|
+
#
|
23
|
+
# @param [Fixnum] indent Indentation to put before each line; it is
|
24
|
+
# assumed that this indentation is already present for the first line
|
25
|
+
# @param [Fixnum] max_length Maximum length per line
|
26
|
+
def segment(indent, max_length = 80)
|
27
|
+
lines = Array.new
|
27
28
|
|
28
|
-
|
29
|
-
|
29
|
+
words = self.split(/\s/)
|
30
|
+
line = words.shift
|
30
31
|
|
31
|
-
|
32
|
+
line_length = indent + line.length
|
32
33
|
|
33
|
-
|
34
|
-
|
34
|
+
words.each do |word|
|
35
|
+
new_length = line_length + 1 + word.length
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
if new_length < max_length
|
38
|
+
line += " #{word}"
|
39
|
+
line_length = new_length
|
39
40
|
|
40
|
-
|
41
|
-
|
41
|
+
else
|
42
|
+
lines << line
|
42
43
|
|
43
|
-
|
44
|
-
|
44
|
+
line = word
|
45
|
+
line_length = indent + word.length
|
46
|
+
end
|
45
47
|
end
|
46
|
-
end
|
47
48
|
|
48
|
-
|
49
|
+
lines << line unless line.empty?
|
49
50
|
|
50
|
-
|
51
|
+
lines.join("\n" + (' ' * indent))
|
52
|
+
end
|
51
53
|
end
|
52
54
|
end
|
data/lib/filigree/types.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/04
|
4
|
+
# Description: Extensions to help with type checking.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
@@ -27,7 +27,7 @@ require 'filigree/class_methods_module'
|
|
27
27
|
# @raise [ArgumentError] An error is raise if the type checking fails.
|
28
28
|
#
|
29
29
|
# @return [Object] The object passed as parameter obj
|
30
|
-
def check_type(obj, type, blame
|
30
|
+
def check_type(obj, type, blame: nil, nillable: false, strict: false)
|
31
31
|
type_ok = (obj.nil? && nillable) || (strict ? obj.instance_of?(type) : obj.is_a?(type))
|
32
32
|
|
33
33
|
if type_ok
|
@@ -54,7 +54,7 @@ end
|
|
54
54
|
# @raise [ArgumentError] An error is raise if the type checking fails
|
55
55
|
#
|
56
56
|
# @return [Object] The object passed in parameter array
|
57
|
-
def check_array_type(array, type, blame
|
57
|
+
def check_array_type(array, type, blame: nil, nillable: false, strict: false)
|
58
58
|
array.each do |obj|
|
59
59
|
type_ok = (obj.nil? && nillable) || (strict ? obj.instance_of?(type) : obj.is_a?(type))
|
60
60
|
|
@@ -125,7 +125,7 @@ module Filigree
|
|
125
125
|
# @return [void]
|
126
126
|
def define_typed_accessor(name, nillable, strict, type, checker)
|
127
127
|
define_method "#{name}=" do |obj|
|
128
|
-
self.instance_variable_set("@#{name}", checker.call(obj, type, name, nillable, strict))
|
128
|
+
self.instance_variable_set("@#{name}", checker.call(obj, type, blame: name, nillable: nillable, strict: strict))
|
129
129
|
end
|
130
130
|
end
|
131
131
|
private :define_typed_accessor
|
@@ -138,12 +138,11 @@ module Filigree
|
|
138
138
|
# @param [Boolean] strict To use strict checking or not
|
139
139
|
#
|
140
140
|
# @return [void]
|
141
|
-
def typed_ivar(name, type, nillable
|
141
|
+
def typed_ivar(name, type, nillable: false, strict: false)
|
142
142
|
typed_ivars << name
|
143
143
|
|
144
144
|
define_typed_accessor(name, nillable, strict, *
|
145
|
-
type.is_a?(Array) ? [type.first, method(:check_array_type)] : [type, method(:check_type)]
|
146
|
-
)
|
145
|
+
type.is_a?(Array) ? [type.first, method(:check_array_type)] : [type, method(:check_type)])
|
147
146
|
|
148
147
|
attr_reader name
|
149
148
|
end
|
data/lib/filigree/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# Author: Chris Wailes <chris.wailes@gmail.com>
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
2
|
# Project: Filigree
|
3
3
|
# Date: 2013/4/19
|
4
4
|
# Description: This file specifies the version number of Filigree.
|
5
5
|
|
6
6
|
module Filigree
|
7
|
-
VERSION = '0.
|
7
|
+
VERSION = '0.4.0'
|
8
8
|
end
|
data/lib/filigree/visitor.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Author: Chris Wailes <chris.wailes@gmail.com>
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
2
|
# Project: Filigree
|
3
3
|
# Date: 2014/02/11
|
4
4
|
# Description: An implementation of the Visitor pattern.
|
@@ -154,7 +154,7 @@ module Filigree
|
|
154
154
|
add_pattern (mp = OuterPattern.new(pattern, guard, block))
|
155
155
|
|
156
156
|
if block
|
157
|
-
@deferred.each { |
|
157
|
+
@deferred.each { |deferred_pattern| deferred_pattern.block = block }
|
158
158
|
@deferred.clear
|
159
159
|
|
160
160
|
else
|
@@ -248,18 +248,18 @@ module Filigree
|
|
248
248
|
# you are iterating over them.
|
249
249
|
while node = nodes.shift
|
250
250
|
nodes += node.children.flatten.compact
|
251
|
-
mod
|
251
|
+
mod = visitor.visit(node) || mod
|
252
252
|
end
|
253
253
|
|
254
254
|
mod
|
255
255
|
|
256
256
|
when :postorder
|
257
|
-
res = children.flatten.compact.inject(false) { |
|
257
|
+
res = children.flatten.compact.inject(false) { |modified, child| child.visit(visitor, :postorder) || modified }
|
258
258
|
(visitor.visit(self) != MatchError) || res
|
259
259
|
|
260
260
|
when :downup
|
261
261
|
res = (visitor.visit(self) != MatchError)
|
262
|
-
res = children.flatten.compact.inject(false) { |
|
262
|
+
res = children.flatten.compact.inject(false) { |modified, child| child.visit(visitor, :downup) || modified } || res
|
263
263
|
(visitor.visit(self) != MatchError) || res
|
264
264
|
end
|
265
265
|
end
|
data/test/tc_abstract_class.rb
CHANGED
data/test/tc_application.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/15
|
4
|
+
# Description: Test cases for the Application module.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
@@ -43,7 +43,7 @@ class ApplicationTester < Minitest::Test
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_application
|
46
|
-
assert_raises(NoMethodError)
|
46
|
+
assert_raises(NoMethodError) { Foo.finalize }
|
47
47
|
Bar.finalize
|
48
48
|
end
|
49
49
|
|
data/test/tc_boolean.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Author: Chris Wailes <chris.wailes@gmail.com>
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
2
|
# Project: Filigree
|
3
3
|
# Date: 2013/05/04
|
4
4
|
# Description: Test cases for Boolean extensions.
|
@@ -18,6 +18,9 @@ require 'filigree/boolean'
|
|
18
18
|
#######################
|
19
19
|
|
20
20
|
class BooleanTester < Minitest::Test
|
21
|
+
|
22
|
+
using Filigree
|
23
|
+
|
21
24
|
def setup
|
22
25
|
|
23
26
|
end
|
data/test/tc_class.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/04
|
4
|
+
# Description: Test cases for Class extensions.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
@@ -18,6 +18,9 @@ require 'filigree/class'
|
|
18
18
|
#######################
|
19
19
|
|
20
20
|
class ClassTester < Minitest::Test
|
21
|
+
|
22
|
+
using Filigree
|
23
|
+
|
21
24
|
module Foo; end
|
22
25
|
|
23
26
|
class Bar
|
@@ -36,10 +39,11 @@ class ClassTester < Minitest::Test
|
|
36
39
|
assert Bar.includes_module?(Foo)
|
37
40
|
|
38
41
|
assert_equal 'ClassTester::Bar::Baf', Bar::Baf.name
|
39
|
-
assert_equal 'Baf',
|
42
|
+
assert_equal 'Baf', Bar::Baf.short_name
|
40
43
|
|
41
44
|
assert Baz.subclass_of?(Bar)
|
42
|
-
assert !Baz.subclass_of?(
|
45
|
+
assert !Baz.subclass_of?(Integer)
|
46
|
+
|
43
47
|
assert_raises(TypeError) { Baz.subclass_of?(1) }
|
44
48
|
end
|
45
49
|
end
|
data/test/tc_commands.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Author:
|
2
|
-
# Project:
|
3
|
-
# Date:
|
4
|
-
# Description:
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/17
|
4
|
+
# Description: Test cases the Commands module.
|
5
5
|
|
6
6
|
############
|
7
7
|
# Requires #
|
data/test/tc_configuration.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Author: Chris Wailes <chris.wailes@gmail.com>
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
2
|
# Project: Filigree
|
3
3
|
# Date: 2013/05/15
|
4
4
|
# Description: Test cases the Configuration module.
|
@@ -39,8 +39,8 @@ class ConfigurationTester < Minitest::Test
|
|
39
39
|
end
|
40
40
|
|
41
41
|
help 'This does daf'
|
42
|
-
option 'daf', 'd' do |*
|
43
|
-
|
42
|
+
option 'daf', 'd' do |*strings|
|
43
|
+
strings.map { |str| str.to_sym }
|
44
44
|
end
|
45
45
|
|
46
46
|
bool_option :bool
|
data/test/tc_match.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Author: Chris Wailes <chris.wailes@gmail.com>
|
1
|
+
# Author: Chris Wailes <chris.wailes+filigree@gmail.com>
|
2
2
|
# Project: Filigree
|
3
3
|
# Date: 2013/05/04
|
4
4
|
# Description: Test cases for the match method.
|
@@ -19,7 +19,7 @@ require 'filigree/match'
|
|
19
19
|
|
20
20
|
class MatchTester < Minitest::Test
|
21
21
|
|
22
|
-
|
22
|
+
using Filigree
|
23
23
|
|
24
24
|
####################
|
25
25
|
# Internal Classes #
|
@@ -99,33 +99,33 @@ class MatchTester < Minitest::Test
|
|
99
99
|
|
100
100
|
def match_tester_class_pattern(o)
|
101
101
|
match o do
|
102
|
-
with(
|
103
|
-
with(Float.as a)
|
104
|
-
with(String.as a)
|
102
|
+
with(Integer.as a) { [:Integer, a] }
|
103
|
+
with(Float.as a) { [:Float, a] }
|
104
|
+
with(String.as a) { [:String, a] }
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
108
|
def match_tester_literal(o)
|
109
109
|
match o do
|
110
|
-
with(Literal(
|
111
|
-
with(Literal(Float))
|
112
|
-
with(Literal(/a/))
|
110
|
+
with(Literal(Integer)) { :Integer }
|
111
|
+
with(Literal(Float)) { :Float }
|
112
|
+
with(Literal(/a/)) { :Regexp }
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
116
|
def match_tester_squiggle_bind(o)
|
117
117
|
match o do
|
118
|
-
with(
|
119
|
-
with(Float.as(~:a))
|
120
|
-
with(String.as(~:a))
|
118
|
+
with(Integer.as(~:a)) { [:Integer, a] }
|
119
|
+
with(Float.as(~:a)) { [:Float, a] }
|
120
|
+
with(String.as(~:a)) { [:String, a] }
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
124
|
def match_tester_manual_bind(o)
|
125
125
|
match o do
|
126
|
-
with(
|
127
|
-
with(Float.as(Bind(:a)))
|
128
|
-
with(String.as(Bind(:a)))
|
126
|
+
with(Integer.as(Bind(:a))) { [:Integer, a] }
|
127
|
+
with(Float.as(Bind(:a))) { [:Float, a] }
|
128
|
+
with(String.as(Bind(:a))) { [:String, a] }
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
@@ -154,7 +154,7 @@ class MatchTester < Minitest::Test
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def match_tester_tuple(*touple)
|
157
|
-
match
|
157
|
+
match(*touple) do
|
158
158
|
with(1, 2) { :FOO }
|
159
159
|
with(3, 4) { :BAR }
|
160
160
|
with(5) { :BAF }
|
@@ -162,7 +162,7 @@ class MatchTester < Minitest::Test
|
|
162
162
|
end
|
163
163
|
|
164
164
|
def match_tester_tuple_wildcard(*touple)
|
165
|
-
match
|
165
|
+
match(*touple) do
|
166
166
|
with(1)
|
167
167
|
with(2, 3) { :DEF }
|
168
168
|
with(4, _) { :PART_WILD }
|
@@ -195,7 +195,7 @@ class MatchTester < Minitest::Test
|
|
195
195
|
end
|
196
196
|
|
197
197
|
def test_class_pattern
|
198
|
-
assert_equal [:
|
198
|
+
assert_equal [:Integer, 42], match_tester_class_pattern(42)
|
199
199
|
assert_equal [:Float, 42.0], match_tester_class_pattern(42.0)
|
200
200
|
assert_equal [:String, 'foo'], match_tester_class_pattern('foo')
|
201
201
|
end
|
@@ -236,19 +236,19 @@ class MatchTester < Minitest::Test
|
|
236
236
|
end
|
237
237
|
|
238
238
|
def test_literals
|
239
|
-
assert_equal :
|
240
|
-
assert_equal :Float,
|
241
|
-
assert_equal :Regexp,
|
239
|
+
assert_equal :Integer, match_tester_literal(Integer)
|
240
|
+
assert_equal :Float, match_tester_literal(Float)
|
241
|
+
assert_equal :Regexp, match_tester_literal(/a/)
|
242
242
|
end
|
243
243
|
|
244
244
|
def test_squiggle_bind
|
245
|
-
assert_equal [:
|
245
|
+
assert_equal [:Integer, 42], match_tester_squiggle_bind(42)
|
246
246
|
assert_equal [:Float, 42.0], match_tester_squiggle_bind(42.0)
|
247
247
|
assert_equal [:String, 'foo'], match_tester_squiggle_bind('foo')
|
248
248
|
end
|
249
249
|
|
250
250
|
def test_manual_bind
|
251
|
-
assert_equal [:
|
251
|
+
assert_equal [:Integer, 42], match_tester_manual_bind(42)
|
252
252
|
assert_equal [:Float, 42.0], match_tester_manual_bind(42.0)
|
253
253
|
assert_equal [:String, 'foo'], match_tester_manual_bind('foo')
|
254
254
|
end
|