filigree 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|