fled 0.0.2 → 0.0.3
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/README.md +459 -89
- data/bin/fled +341 -53
- data/lib/dtc/utils/exec.rb +13 -2
- data/lib/dtc/utils/interactive_edit.rb +10 -0
- data/lib/dtc/utils/meta.rb +47 -0
- data/lib/dtc/utils/text/html.rb +107 -0
- data/lib/dtc/utils/text/line_writer.rb +70 -0
- data/lib/dtc/utils/text.rb +23 -0
- data/lib/dtc/utils/visitor/dsl.rb +98 -0
- data/lib/dtc/utils/visitor/folder.rb +87 -0
- data/lib/dtc/utils/visitor.rb +272 -0
- data/lib/dtc/utils.rb +3 -1
- data/lib/fled/file_listing.rb +35 -62
- data/lib/fled/file_listing_builder.rb +43 -0
- data/lib/fled.rb +18 -5
- data/tests/helper.rb +14 -26
- data/tests/readme.rb +139 -85
- metadata +9 -3
- data/lib/dtc/utils/dsldsl.rb +0 -259
- data/lib/dtc/utils/file_visitor.rb +0 -79
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fled
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -19,13 +19,19 @@ executables:
|
|
19
19
|
extensions: []
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
|
-
- lib/dtc/utils/dsldsl.rb
|
23
22
|
- lib/dtc/utils/exec.rb
|
24
|
-
- lib/dtc/utils/file_visitor.rb
|
25
23
|
- lib/dtc/utils/interactive_edit.rb
|
24
|
+
- lib/dtc/utils/meta.rb
|
26
25
|
- lib/dtc/utils/mini_select.rb
|
26
|
+
- lib/dtc/utils/text/html.rb
|
27
|
+
- lib/dtc/utils/text/line_writer.rb
|
28
|
+
- lib/dtc/utils/text.rb
|
29
|
+
- lib/dtc/utils/visitor/dsl.rb
|
30
|
+
- lib/dtc/utils/visitor/folder.rb
|
31
|
+
- lib/dtc/utils/visitor.rb
|
27
32
|
- lib/dtc/utils.rb
|
28
33
|
- lib/fled/file_listing.rb
|
34
|
+
- lib/fled/file_listing_builder.rb
|
29
35
|
- lib/fled.rb
|
30
36
|
- bin/fled
|
31
37
|
- tests/helper.rb
|
data/lib/dtc/utils/dsldsl.rb
DELETED
@@ -1,259 +0,0 @@
|
|
1
|
-
module DTC
|
2
|
-
module Utils
|
3
|
-
module DSLDSL
|
4
|
-
class DSLVisitor
|
5
|
-
# very approximate visitor =)
|
6
|
-
def enter key, *args ; end
|
7
|
-
def leave ; end
|
8
|
-
def add key, *args ; end
|
9
|
-
def visit_dsl &blk
|
10
|
-
builder = self.class.delegate_klass.new(self)
|
11
|
-
self.class.context_klass.new(builder).__instance_exec(&blk)
|
12
|
-
builder.flush
|
13
|
-
end
|
14
|
-
protected
|
15
|
-
def self.delegate_klass ; StaticTreeDSLDelegate ; end
|
16
|
-
def self.context_klass ; StaticTreeDSLContextBlank ; end
|
17
|
-
end
|
18
|
-
|
19
|
-
class DSLArrayWriter < DSLVisitor
|
20
|
-
attr_reader :stack
|
21
|
-
def initialize
|
22
|
-
@stack = [[]]
|
23
|
-
end
|
24
|
-
def enter sym, *args
|
25
|
-
@stack.push [[sym, *args]]
|
26
|
-
end
|
27
|
-
def leave
|
28
|
-
@stack.pop
|
29
|
-
end
|
30
|
-
def add sym, *args
|
31
|
-
@stack.last << [sym, *args]
|
32
|
-
end
|
33
|
-
def each &blk
|
34
|
-
return enum_for(:each) unless block_given?
|
35
|
-
each_call_of @stack.first, &blk
|
36
|
-
end
|
37
|
-
protected
|
38
|
-
def each_call_of parent, &block
|
39
|
-
parent.each do |item|
|
40
|
-
if item.first.is_a?(Symbol)
|
41
|
-
yield item
|
42
|
-
else
|
43
|
-
each_call_of item, &block
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class DSLHashWriter < DSLVisitor
|
50
|
-
def initialize target
|
51
|
-
@stack = [target]
|
52
|
-
end
|
53
|
-
def enter key, *args
|
54
|
-
container = add_container(key, *args)
|
55
|
-
@stack.push(container) if container
|
56
|
-
container
|
57
|
-
end
|
58
|
-
def leave
|
59
|
-
@stack.pop
|
60
|
-
end
|
61
|
-
def add key, *args
|
62
|
-
add_key key, args
|
63
|
-
end
|
64
|
-
def self.write_static_tree_dsl target = {}, &blk
|
65
|
-
visitor = self.new(result = target)
|
66
|
-
visitor.visit_dsl(&blk)
|
67
|
-
result
|
68
|
-
end
|
69
|
-
def add_container key, *args
|
70
|
-
container = {}
|
71
|
-
container[:options] = args unless args.empty?
|
72
|
-
add_key key, container
|
73
|
-
end
|
74
|
-
def add_key key, val
|
75
|
-
container = @stack.last
|
76
|
-
key = key.to_s
|
77
|
-
raise RuntimeError, "Key #{key.inspect} already defined" if container[key]
|
78
|
-
container[key] = val
|
79
|
-
val
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
class StaticTreeDSLDelegate
|
84
|
-
def initialize visitor, prefix = nil
|
85
|
-
@visitor = visitor
|
86
|
-
@prefix = prefix
|
87
|
-
@pending_prefix = nil
|
88
|
-
@called = false
|
89
|
-
end
|
90
|
-
def prefix sym
|
91
|
-
@called = true
|
92
|
-
flush
|
93
|
-
@pending_prefix = self.class.new(@visitor, with_prefix(sym))
|
94
|
-
end
|
95
|
-
def flush
|
96
|
-
if @pending_prefix
|
97
|
-
@pending_prefix.add_unless_called
|
98
|
-
@pending_prefix = nil
|
99
|
-
end
|
100
|
-
end
|
101
|
-
def add sym, *args
|
102
|
-
@called = true
|
103
|
-
@visitor.add(with_prefix(sym), *args)
|
104
|
-
end
|
105
|
-
def enter sym, *args
|
106
|
-
flush
|
107
|
-
@called = true
|
108
|
-
@visitor.enter(with_prefix(sym), *args)
|
109
|
-
end
|
110
|
-
def leave
|
111
|
-
flush
|
112
|
-
@visitor.leave
|
113
|
-
end
|
114
|
-
protected
|
115
|
-
def with_prefix sym
|
116
|
-
@prefix ? (sym ? "#{@prefix}.#{sym}".to_sym : @prefix) : sym
|
117
|
-
end
|
118
|
-
def add_unless_called
|
119
|
-
flush
|
120
|
-
@visitor.add(@prefix) unless @called
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
class StaticTreeDSLContextBlank
|
125
|
-
alias_method :__instance_exec, :instance_exec
|
126
|
-
alias_method :__class, :class
|
127
|
-
instance_methods.each { |meth| undef_method(meth) unless meth =~ /\A__/ || meth == :object_id }
|
128
|
-
def initialize delegate, unprefixed = delegate
|
129
|
-
@delegate = delegate
|
130
|
-
@unprefixed = unprefixed
|
131
|
-
end
|
132
|
-
def method_missing(meth, *args, &block)
|
133
|
-
if block
|
134
|
-
@delegate.enter meth, *args
|
135
|
-
__class.new(@unprefixed, @unprefixed).__instance_exec(&block)
|
136
|
-
@unprefixed.flush
|
137
|
-
@delegate.leave
|
138
|
-
else
|
139
|
-
if args.empty?
|
140
|
-
return __class.new(@delegate.prefix(meth), @unprefixed)
|
141
|
-
else
|
142
|
-
@delegate.add(meth, *args)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
self
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
if __FILE__ == $0
|
150
|
-
|
151
|
-
class DebugStaticTreeDSLDelegate < StaticTreeDSLDelegate
|
152
|
-
def prefix sym
|
153
|
-
p [:prefix, sym, @prefix]
|
154
|
-
super
|
155
|
-
end
|
156
|
-
def flush
|
157
|
-
p [:flush, @prefix] if @pending_prefix
|
158
|
-
super
|
159
|
-
end
|
160
|
-
def add sym, *args
|
161
|
-
p [:add, sym, @prefix]
|
162
|
-
super
|
163
|
-
end
|
164
|
-
def enter sym, *args
|
165
|
-
p [:enter, sym, @prefix]
|
166
|
-
super
|
167
|
-
end
|
168
|
-
def leave
|
169
|
-
p [:leave, @prefix]
|
170
|
-
super
|
171
|
-
end
|
172
|
-
def add_unless_called
|
173
|
-
p [:flush_self, @prefix] unless @called
|
174
|
-
super
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
class DebugDSLHashWriter < DSLHashWriter
|
179
|
-
def enter sym, *args
|
180
|
-
p [:wenter, sym]
|
181
|
-
super
|
182
|
-
end
|
183
|
-
def leave
|
184
|
-
p [:wleave]
|
185
|
-
super
|
186
|
-
end
|
187
|
-
def add sym, *args
|
188
|
-
p [:wadd, sym, args]
|
189
|
-
super
|
190
|
-
end
|
191
|
-
def self.delegate_klass ; DebugStaticTreeDSLDelegate ; end
|
192
|
-
end
|
193
|
-
|
194
|
-
module Examples
|
195
|
-
module Simple
|
196
|
-
result = DSLHashWriter.write_static_tree_dsl do
|
197
|
-
fichier "value"
|
198
|
-
fichier2.txt "one", "two"
|
199
|
-
end
|
200
|
-
result # => {"fichier"=>["value"], "fichier2.txt"=>["one", "two"]}
|
201
|
-
|
202
|
-
result = DSLHashWriter.write_static_tree_dsl do
|
203
|
-
dossier {
|
204
|
-
sous.dossier "valeur" do
|
205
|
-
file.txt
|
206
|
-
end
|
207
|
-
}
|
208
|
-
end
|
209
|
-
result # => {"dossier"=>{"sous.dossier"=>{:options=>["valeur"], "file.txt"=>[]}}}
|
210
|
-
|
211
|
-
result = DSLHashWriter.write_static_tree_dsl do
|
212
|
-
%w[hdpi mdpi ldpi].each do |resolution|
|
213
|
-
image.__send__(resolution.to_sym).png
|
214
|
-
end
|
215
|
-
end
|
216
|
-
result # => {"image.ldpi.png"=>[], "image.hdpi.png"=>[], "image.mdpi.png"=>[]}
|
217
|
-
|
218
|
-
result = DSLHashWriter.write_static_tree_dsl do
|
219
|
-
user {
|
220
|
-
name :string
|
221
|
-
email :string
|
222
|
-
address(:json) {
|
223
|
-
line :string
|
224
|
-
country
|
225
|
-
}
|
226
|
-
}
|
227
|
-
end
|
228
|
-
result # => {"user"=>{"address"=>{"country"=>[], "line"=>[:string], :options=>[:json]}, "name"=>[:string], "email"=>[:string]}}
|
229
|
-
|
230
|
-
result = DSLHashWriter.write_static_tree_dsl do
|
231
|
-
def base_file
|
232
|
-
yes.this.is.base
|
233
|
-
end
|
234
|
-
base_file.txt
|
235
|
-
base_file.png
|
236
|
-
end
|
237
|
-
result # => {"yes.this.is.base.png"=>[], "yes.this.is.base.txt"=>[]}
|
238
|
-
end
|
239
|
-
module CustomBuilder
|
240
|
-
class EscapableStaticTreeDSLContextBlank < StaticTreeDSLContextBlank
|
241
|
-
def method_missing(meth, *args, &block)
|
242
|
-
meth = args.shift if meth == :raw
|
243
|
-
super(meth, *args, &block)
|
244
|
-
end
|
245
|
-
end
|
246
|
-
class EscapableDSLHashWriter < DSLHashWriter
|
247
|
-
def self.context_klass ; EscapableStaticTreeDSLContextBlank ; end
|
248
|
-
end
|
249
|
-
result = EscapableDSLHashWriter.write_static_tree_dsl do
|
250
|
-
3.times { |i| raw(i).png }
|
251
|
-
image.raw("%!") { file }
|
252
|
-
end
|
253
|
-
result # => {"0.png"=>[], "1.png"=>[], "image.%!"=>{"file"=>[]}, "2.png"=>[]}
|
254
|
-
end
|
255
|
-
end
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
259
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
module DTC
|
2
|
-
module Utils
|
3
|
-
class FileVisitor
|
4
|
-
def depth ; @folders.nil? ? 0 : @folders.count ; end
|
5
|
-
def current_path *args ; File.join(@folders + args) ; end
|
6
|
-
attr_accessor :next_visitor
|
7
|
-
def enter_folder dir
|
8
|
-
return false unless next_visitor ? next_visitor.enter_folder(dir) : true
|
9
|
-
(@folders ||= []) << dir
|
10
|
-
true
|
11
|
-
end
|
12
|
-
def visit_file name, full_path
|
13
|
-
next_visitor.visit_file(name, full_path) if next_visitor
|
14
|
-
end
|
15
|
-
def leave_folder
|
16
|
-
next_visitor.leave_folder if next_visitor
|
17
|
-
@folders.pop
|
18
|
-
end
|
19
|
-
def self.browse path, visitor, max_depth = -1
|
20
|
-
return unless File.readable?(path)
|
21
|
-
dir = Dir.new(path)
|
22
|
-
return unless visitor.enter_folder path
|
23
|
-
dir.each do |f|
|
24
|
-
full_path = File.join(path, f)
|
25
|
-
next if f == "." || f == ".."
|
26
|
-
if File.directory? full_path
|
27
|
-
self.browse(full_path, visitor, max_depth - 1) unless max_depth == 0
|
28
|
-
else
|
29
|
-
visitor.visit_file f, full_path
|
30
|
-
end
|
31
|
-
end
|
32
|
-
visitor.leave_folder
|
33
|
-
end
|
34
|
-
end
|
35
|
-
class FilteringFileVisitor < FileVisitor
|
36
|
-
def initialize listener, options = {}
|
37
|
-
@excluded = compile_regexp(options[:excluded])
|
38
|
-
@excluded_files = compile_regexp(options[:excluded_files])
|
39
|
-
@excluded_directories = compile_regexp(options[:excluded_directories])
|
40
|
-
@included = compile_regexp(options[:included])
|
41
|
-
@included_files = compile_regexp(options[:included_files])
|
42
|
-
@included_directories = compile_regexp(options[:included_directories])
|
43
|
-
@recurse = options[:max_depth] || -1
|
44
|
-
self.next_visitor = listener
|
45
|
-
end
|
46
|
-
def enter_folder dir
|
47
|
-
return false unless include?(File.basename(dir), false)
|
48
|
-
if (result = super) && !descend?(dir)
|
49
|
-
leave_folder
|
50
|
-
return false
|
51
|
-
end
|
52
|
-
result
|
53
|
-
end
|
54
|
-
def visit_file name, full_path
|
55
|
-
return false unless include?(name, true)
|
56
|
-
super
|
57
|
-
end
|
58
|
-
protected
|
59
|
-
def compile_regexp(rx_list)
|
60
|
-
return nil if rx_list.nil? || rx_list.reject { |e| e.length == 0 }.empty?
|
61
|
-
Regexp.union(*rx_list.map { |e| /#{e}/i })
|
62
|
-
end
|
63
|
-
def descend?(name)
|
64
|
-
@recurse == -1 || @recurse >= (depth - 1)
|
65
|
-
end
|
66
|
-
def include?(name, is_file)
|
67
|
-
can_include = (@included.nil? || @included.match(name)) &&
|
68
|
-
((is_file && (@included_files.nil? || @included_files.match(name))) ||
|
69
|
-
(!is_file && (@included_directories.nil? || @included_directories.match(name))))
|
70
|
-
if can_include
|
71
|
-
can_include = (@excluded.nil? || !@excluded.match(name)) &&
|
72
|
-
((is_file && (@excluded_files.nil? || !@excluded_files.match(name))) ||
|
73
|
-
(!is_file && (@excluded_directories.nil? || !@excluded_directories.match(name))))
|
74
|
-
end
|
75
|
-
can_include
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|