filigree 0.4.0 → 0.4.1
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 +5 -1
- data/Rakefile +0 -10
- data/lib/filigree/commands.rb +23 -7
- data/lib/filigree/configuration.rb +27 -8
- data/lib/filigree/match.rb +3 -7
- data/lib/filigree/version.rb +1 -1
- data/lib/filigree/visitor.rb +3 -3
- data/test/tc_match.rb +4 -4
- data/test/tc_string.rb +0 -3
- metadata +29 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3c0573e398b2736c8f1e314ba3feb5aa21871c2
|
4
|
+
data.tar.gz: bbf5700aea71b6176e4b715f5667d732d30c454f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6517ac40aa42375670719f675c356b9cb25d6ba494ee44a30dffa3f44307a875d19139ae27350f42851f6a540dbab415adc887d13d3318987313c178344bdace
|
7
|
+
data.tar.gz: e15b6c5359816097a848e5a8bcf66a2ae83e98d6d421c8d79567e215427355d5ddcc02e08b2b4250ba9e5c3d4e0f656f4fb81d9770e8f863bb27049600a7ef39
|
data/README.md
CHANGED
@@ -164,7 +164,11 @@ Filigree's implementation of the visitor pattern is built on the pattern matchin
|
|
164
164
|
```Ruby
|
165
165
|
class Binary < Struct.new(:x, :y)
|
166
166
|
extend Filigree::Destructurable
|
167
|
-
include Filigree::
|
167
|
+
include Filigree::Visitable
|
168
|
+
|
169
|
+
def children
|
170
|
+
[x, y]
|
171
|
+
end
|
168
172
|
|
169
173
|
def destructure(_)
|
170
174
|
[x, y]
|
data/Rakefile
CHANGED
@@ -76,16 +76,6 @@ request_file('reek/rake/task', 'Reek is not installed.') do
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
##################
|
80
|
-
# Rubygems Tasks #
|
81
|
-
##################
|
82
|
-
|
83
|
-
request_file('rubygems/tasks', 'Rubygems-tasks is not installed.') do
|
84
|
-
Gem::Tasks.new do |t|
|
85
|
-
t.console.command = 'pry'
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
79
|
########
|
90
80
|
# YARD #
|
91
81
|
########
|
data/lib/filigree/commands.rb
CHANGED
@@ -30,6 +30,8 @@ end
|
|
30
30
|
|
31
31
|
module Filigree
|
32
32
|
module Commands
|
33
|
+
using Filigree
|
34
|
+
|
33
35
|
include ClassMethodsModule
|
34
36
|
|
35
37
|
####################
|
@@ -38,14 +40,23 @@ module Filigree
|
|
38
40
|
|
39
41
|
# This will find the appropriate command and execute it.
|
40
42
|
#
|
41
|
-
# @param [String]
|
43
|
+
# @param [String, Array<String>] overloaded String containing the command to be processed and its arguments
|
42
44
|
#
|
43
45
|
# @return [Object] Result of invoking the command's block
|
44
|
-
def call(
|
45
|
-
|
46
|
+
def call(overloaded)
|
47
|
+
split_line =
|
48
|
+
if overloaded.is_a?(String)
|
49
|
+
overloaded.split
|
50
|
+
elsif overloaded.is_a?(Array)
|
51
|
+
overloaded
|
52
|
+
else
|
53
|
+
raise TypeError, "Expected a String or Array of Strings."
|
54
|
+
end
|
55
|
+
|
56
|
+
namespace, rest = self.class.get_namespace(split_line)
|
46
57
|
|
47
58
|
if namespace == self.class.commands
|
48
|
-
raise CommandNotFoundError,
|
59
|
+
raise CommandNotFoundError, split_line.join(' ')
|
49
60
|
end
|
50
61
|
|
51
62
|
command = namespace[:nil]
|
@@ -63,7 +74,9 @@ module Filigree
|
|
63
74
|
if command.action.arity < 0 or command.action.arity == rest.length
|
64
75
|
self.instance_exec(*rest, &action)
|
65
76
|
else
|
66
|
-
raise ArgumentError,
|
77
|
+
raise ArgumentError,
|
78
|
+
"Wrong number of arguments for command: #{command.name}. " +
|
79
|
+
"Expected #{command.action.arity} but got #{rest.length}."
|
67
80
|
end
|
68
81
|
end
|
69
82
|
|
@@ -209,7 +222,8 @@ module Filigree
|
|
209
222
|
#################
|
210
223
|
|
211
224
|
# The POD representing a command.
|
212
|
-
Command
|
225
|
+
class Command < Struct.new(:name, :help, :param_help, :config, :action)
|
226
|
+
end
|
213
227
|
|
214
228
|
########################
|
215
229
|
# Pre-defined Commands #
|
@@ -243,6 +257,8 @@ module Filigree
|
|
243
257
|
puts Filigree::Configuration::Option.to_s(options, max_length + 4)
|
244
258
|
end
|
245
259
|
|
260
|
+
puts
|
261
|
+
puts "\t#{comm.help}"
|
246
262
|
puts
|
247
263
|
|
248
264
|
if !comm.param_help.empty?
|
@@ -253,7 +269,7 @@ module Filigree
|
|
253
269
|
|
254
270
|
segment_indent = max_param_len + 8
|
255
271
|
comm.param_help.each do |name, help|
|
256
|
-
printf "
|
272
|
+
printf "\t%-#{max_param_len}s - %s\n", name, help.segment(segment_indent)
|
257
273
|
end
|
258
274
|
end
|
259
275
|
end
|
@@ -13,6 +13,12 @@
|
|
13
13
|
require 'filigree/class_methods_module'
|
14
14
|
require 'filigree/string'
|
15
15
|
|
16
|
+
#########
|
17
|
+
# Notes #
|
18
|
+
#########
|
19
|
+
|
20
|
+
# TODO: Add support for configuration destructors
|
21
|
+
|
16
22
|
#######################
|
17
23
|
# Classes and Modules #
|
18
24
|
#######################
|
@@ -92,7 +98,7 @@ module Filigree
|
|
92
98
|
|
93
99
|
case overloaded
|
94
100
|
when Array
|
95
|
-
handle_array_options(overloaded, set_opts)
|
101
|
+
handle_array_options(overloaded.clone, set_opts)
|
96
102
|
|
97
103
|
when String, IO
|
98
104
|
handle_serialized_options(overloaded, set_opts)
|
@@ -109,6 +115,13 @@ module Filigree
|
|
109
115
|
self.class.required_options.each do |option|
|
110
116
|
raise ArgumentError, "Option #{option} not set." if self.send(option).nil?
|
111
117
|
end
|
118
|
+
|
119
|
+
# Initialize the auto options
|
120
|
+
self.class.auto_blocks.each do |name, block|
|
121
|
+
result = self.instance_exec(&block)
|
122
|
+
|
123
|
+
self.define_singleton_method(name) { result }
|
124
|
+
end
|
112
125
|
end
|
113
126
|
|
114
127
|
# Find the appropriate option object given a string.
|
@@ -127,6 +140,8 @@ module Filigree
|
|
127
140
|
|
128
141
|
# Configure the object from an array of strings.
|
129
142
|
#
|
143
|
+
# TODO: Improve the way arguments are pulled out of the ARGV array.
|
144
|
+
#
|
130
145
|
# @param [Array<String>] argv String options
|
131
146
|
# @param [Array<String>] set_opts List of names of options already added
|
132
147
|
#
|
@@ -185,6 +200,8 @@ module Filigree
|
|
185
200
|
#################
|
186
201
|
|
187
202
|
module ClassMethods
|
203
|
+
# @return [Hash<Symbol, Block>] Hash of names to blocks used for auto configuration
|
204
|
+
attr_reader :auto_blocks
|
188
205
|
# @return [Hash<String, Option>] Hash of options with long names used as keys
|
189
206
|
attr_reader :options_long
|
190
207
|
# @return [Hash<String, Option>] hash of options with short name used as keys
|
@@ -209,7 +226,7 @@ module Filigree
|
|
209
226
|
#
|
210
227
|
# @return [void]
|
211
228
|
def auto(name, &block)
|
212
|
-
|
229
|
+
@auto_blocks[name.to_sym] = block
|
213
230
|
end
|
214
231
|
|
215
232
|
# Define a boolean option. The variable will be set to true if
|
@@ -248,6 +265,7 @@ module Filigree
|
|
248
265
|
#
|
249
266
|
# @return [void]
|
250
267
|
def install_icvars
|
268
|
+
@auto_blocks = Hash.new
|
251
269
|
@help_string = ''
|
252
270
|
@next_default = nil
|
253
271
|
@next_required = false
|
@@ -266,8 +284,7 @@ module Filigree
|
|
266
284
|
#
|
267
285
|
# @return [void]
|
268
286
|
def option(long, short = nil, conversions: nil, &block)
|
269
|
-
|
270
|
-
long = long.to_s
|
287
|
+
long = long.to_s.gsub('-', '_')
|
271
288
|
short = short.to_s if short
|
272
289
|
|
273
290
|
add_option Option.new(long, short, @help_string, @next_default,
|
@@ -337,6 +354,8 @@ module Filigree
|
|
337
354
|
# This class represents an option that can appear in the
|
338
355
|
# configuration.
|
339
356
|
class Option < Struct.new(:long, :short, :help, :default, :handler)
|
357
|
+
using Filigree
|
358
|
+
|
340
359
|
# Returns the number of arguments that this option takes.
|
341
360
|
#
|
342
361
|
# @return [Fixnum] Number of arguments the option takes
|
@@ -350,7 +369,7 @@ module Filigree
|
|
350
369
|
# Print the option information out as a string.
|
351
370
|
#
|
352
371
|
# Layout:
|
353
|
-
# | ||--`long`,|| ||-`short`||
|
372
|
+
# | ||--`long`,|| ||-`short`|| |
|
354
373
|
# |_______||_________||_||________||___|
|
355
374
|
# indent max_l+3 1 max_s+1 3
|
356
375
|
#
|
@@ -364,9 +383,9 @@ module Filigree
|
|
364
383
|
segmented_help = self.help.segment(segment_indent)
|
365
384
|
|
366
385
|
if self.short
|
367
|
-
sprintf "#{' ' * indent}%-#{max_long + 3}s %-#{max_short + 1}s
|
386
|
+
sprintf "#{' ' * indent}%-#{max_long + 3}s %-#{max_short + 1}s %s", "--#{self.long},", '-' + self.short, segmented_help
|
368
387
|
else
|
369
|
-
sprintf "#{' ' * indent}%-#{max_long + max_short + 5}s
|
388
|
+
sprintf "#{' ' * indent}%-#{max_long + max_short + 5}s %s", '--' + self.long, segmented_help
|
370
389
|
end
|
371
390
|
end
|
372
391
|
|
@@ -396,7 +415,7 @@ module Filigree
|
|
396
415
|
|
397
416
|
# The default help option. This can be added to your class via
|
398
417
|
# add_option.
|
399
|
-
HELP_OPTION = Option.new('help', 'h', 'Prints this help message
|
418
|
+
HELP_OPTION = Option.new('help', 'h', 'Prints this help message', nil, Proc.new do
|
400
419
|
puts "Usage: #{self.class.usage}"
|
401
420
|
puts
|
402
421
|
puts 'Options:'
|
data/lib/filigree/match.rb
CHANGED
@@ -22,9 +22,9 @@ require 'filigree/class'
|
|
22
22
|
# An error that indicates that no pattern matched a given object.
|
23
23
|
class MatchError < RuntimeError; end
|
24
24
|
|
25
|
-
|
26
|
-
#
|
27
|
-
|
25
|
+
#######################
|
26
|
+
# Classes and Modules #
|
27
|
+
#######################
|
28
28
|
|
29
29
|
# This is an implementation of pattern matching. The objects passed to match
|
30
30
|
# are tested against the patterns defined inside the match block. The return
|
@@ -162,10 +162,6 @@ def match(*objects, &block)
|
|
162
162
|
me.find_match(objects)
|
163
163
|
end
|
164
164
|
|
165
|
-
#######################
|
166
|
-
# Classes and Modules #
|
167
|
-
#######################
|
168
|
-
|
169
165
|
module Filigree
|
170
166
|
|
171
167
|
using Filigree
|
data/lib/filigree/version.rb
CHANGED
data/lib/filigree/visitor.rb
CHANGED
@@ -241,17 +241,17 @@ module Filigree
|
|
241
241
|
children.flatten.compact.inject(false) { |mod, child| child.visit(visitor, :preorder) || mod } || res
|
242
242
|
|
243
243
|
when :inorder
|
244
|
-
|
244
|
+
lmod = false
|
245
245
|
nodes = [self]
|
246
246
|
|
247
247
|
# Not all Ruby implementations support modifying arrays while
|
248
248
|
# you are iterating over them.
|
249
249
|
while node = nodes.shift
|
250
250
|
nodes += node.children.flatten.compact
|
251
|
-
|
251
|
+
lmod = visitor.visit(node) || lmod
|
252
252
|
end
|
253
253
|
|
254
|
-
|
254
|
+
lmod
|
255
255
|
|
256
256
|
when :postorder
|
257
257
|
res = children.flatten.compact.inject(false) { |modified, child| child.visit(visitor, :postorder) || modified }
|
data/test/tc_match.rb
CHANGED
@@ -153,16 +153,16 @@ class MatchTester < Minitest::Test
|
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
156
|
-
def match_tester_tuple(*
|
157
|
-
match(*
|
156
|
+
def match_tester_tuple(*tuple)
|
157
|
+
match(*tuple)do
|
158
158
|
with(1, 2) { :FOO }
|
159
159
|
with(3, 4) { :BAR }
|
160
160
|
with(5) { :BAF }
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
def match_tester_tuple_wildcard(*
|
165
|
-
match(*
|
164
|
+
def match_tester_tuple_wildcard(*tuple)
|
165
|
+
match(*tuple)do
|
166
166
|
with(1)
|
167
167
|
with(2, 3) { :DEF }
|
168
168
|
with(4, _) { :PART_WILD }
|
data/test/tc_string.rb
CHANGED
metadata
CHANGED
@@ -1,167 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filigree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wailes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: flay
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: flog
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
66
|
+
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: rake
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- - "
|
73
|
+
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
75
|
version: '0'
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- - "
|
80
|
+
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: rake-notes
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- - "
|
87
|
+
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
89
|
version: '0'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- - "
|
94
|
+
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
96
|
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: reek
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
|
-
- - "
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: rubygems-tasks
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
101
|
+
- - "~>"
|
130
102
|
- !ruby/object:Gem::Version
|
131
103
|
version: '0'
|
132
104
|
type: :development
|
133
105
|
prerelease: false
|
134
106
|
version_requirements: !ruby/object:Gem::Requirement
|
135
107
|
requirements:
|
136
|
-
- - "
|
108
|
+
- - "~>"
|
137
109
|
- !ruby/object:Gem::Version
|
138
110
|
version: '0'
|
139
111
|
- !ruby/object:Gem::Dependency
|
140
112
|
name: simplecov
|
141
113
|
requirement: !ruby/object:Gem::Requirement
|
142
114
|
requirements:
|
143
|
-
- - "
|
115
|
+
- - "~>"
|
144
116
|
- !ruby/object:Gem::Version
|
145
117
|
version: '0'
|
146
118
|
type: :development
|
147
119
|
prerelease: false
|
148
120
|
version_requirements: !ruby/object:Gem::Requirement
|
149
121
|
requirements:
|
150
|
-
- - "
|
122
|
+
- - "~>"
|
151
123
|
- !ruby/object:Gem::Version
|
152
124
|
version: '0'
|
153
125
|
- !ruby/object:Gem::Dependency
|
154
126
|
name: yard
|
155
127
|
requirement: !ruby/object:Gem::Requirement
|
156
128
|
requirements:
|
157
|
-
- - "
|
129
|
+
- - "~>"
|
158
130
|
- !ruby/object:Gem::Version
|
159
131
|
version: 0.9.9
|
160
132
|
type: :development
|
161
133
|
prerelease: false
|
162
134
|
version_requirements: !ruby/object:Gem::Requirement
|
163
135
|
requirements:
|
164
|
-
- - "
|
136
|
+
- - "~>"
|
165
137
|
- !ruby/object:Gem::Version
|
166
138
|
version: 0.9.9
|
167
139
|
description: Filigree provides new classes and extensions to core library classes
|
@@ -205,7 +177,7 @@ files:
|
|
205
177
|
- test/ts_filigree.rb
|
206
178
|
homepage: https://github.com/chriswailes/filigree
|
207
179
|
licenses:
|
208
|
-
-
|
180
|
+
- NCSA
|
209
181
|
metadata: {}
|
210
182
|
post_install_message:
|
211
183
|
rdoc_options: []
|
@@ -228,16 +200,16 @@ signing_key:
|
|
228
200
|
specification_version: 4
|
229
201
|
summary: Extra functionality for Ruby.
|
230
202
|
test_files:
|
231
|
-
- test/tc_boolean.rb
|
232
|
-
- test/tc_object.rb
|
233
|
-
- test/tc_types.rb
|
234
|
-
- test/tc_configuration.rb
|
235
203
|
- test/tc_commands.rb
|
204
|
+
- test/tc_types.rb
|
205
|
+
- test/tc_class.rb
|
236
206
|
- test/tc_string.rb
|
207
|
+
- test/tc_application.rb
|
208
|
+
- test/tc_match.rb
|
237
209
|
- test/tc_abstract_class.rb
|
238
|
-
- test/
|
210
|
+
- test/tc_object.rb
|
239
211
|
- test/tc_class_methods_module.rb
|
240
|
-
- test/
|
241
|
-
- test/
|
242
|
-
- test/
|
212
|
+
- test/tc_configuration.rb
|
213
|
+
- test/tc_boolean.rb
|
214
|
+
- test/tc_visitor.rb
|
243
215
|
- test/ts_filigree.rb
|