valise 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/README +69 -0
- data/doc/Specification +72 -0
- data/doc/Specifications +81 -0
- data/doc/coverage/assets/0.5.3/app.js +88 -0
- data/doc/coverage/assets/0.5.3/fancybox/blank.gif +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_close.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_loading.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_nav_left.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_nav_right.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_left.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_main.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_over.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_right.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancybox-x.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancybox-y.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancybox.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/doc/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/doc/coverage/assets/0.5.3/favicon_green.png +0 -0
- data/doc/coverage/assets/0.5.3/favicon_red.png +0 -0
- data/doc/coverage/assets/0.5.3/favicon_yellow.png +0 -0
- data/doc/coverage/assets/0.5.3/highlight.css +129 -0
- data/doc/coverage/assets/0.5.3/highlight.pack.js +1 -0
- data/doc/coverage/assets/0.5.3/jquery-1.6.2.min.js +18 -0
- data/doc/coverage/assets/0.5.3/jquery.dataTables.min.js +152 -0
- data/doc/coverage/assets/0.5.3/jquery.timeago.js +141 -0
- data/doc/coverage/assets/0.5.3/jquery.url.js +174 -0
- data/doc/coverage/assets/0.5.3/loading.gif +0 -0
- data/doc/coverage/assets/0.5.3/magnify.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/doc/coverage/assets/0.5.3/stylesheet.css +383 -0
- data/doc/coverage/index.html +5843 -0
- data/doc/coverage/jquery-1.3.2.min.js +19 -0
- data/doc/coverage/jquery.tablesorter.min.js +15 -0
- data/doc/coverage/lib-fileset-errors_rb.html +231 -0
- data/doc/coverage/lib-fileset-item_rb.html +303 -0
- data/doc/coverage/lib-fileset-populator_rb.html +249 -0
- data/doc/coverage/lib-fileset-search-root_rb.html +1053 -0
- data/doc/coverage/lib-fileset-utils_rb.html +453 -0
- data/doc/coverage/lib-fileset_rb.html +789 -0
- data/doc/coverage/print.css +12 -0
- data/doc/coverage/rcov.js +42 -0
- data/doc/coverage/screen.css +270 -0
- data/lib/valise/errors.rb +30 -0
- data/lib/valise/item.rb +105 -0
- data/lib/valise/path-matcher.rb +113 -0
- data/lib/valise/search-root.rb +166 -0
- data/lib/valise/stack.rb +169 -0
- data/lib/valise/stem-decorator.rb +56 -0
- data/lib/valise/utils.rb +65 -0
- data/lib/valise.rb +219 -0
- data/spec/addable.rb +41 -0
- data/spec/dump_load.rb +32 -0
- data/spec/error_handling.rb +9 -0
- data/spec/fileset.rb +170 -0
- data/spec/glob_handling.rb +28 -0
- data/spec/item.rb +35 -0
- data/spec/merge_diff.rb +93 -0
- data/spec/population.rb +51 -0
- data/spec/search_root.rb +24 -0
- data/spec/stemming.rb +33 -0
- data/spec_help/file-sandbox.rb +164 -0
- data/spec_help/gem_test_suite.rb +17 -0
- data/spec_help/spec_helper.rb +3 -0
- data/spec_help/ungemmer.rb +37 -0
- metadata +220 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
function toggleCode( id ) {
|
2
|
+
if ( document.getElementById ) {
|
3
|
+
elem = document.getElementById( id );
|
4
|
+
} else if ( document.all ) {
|
5
|
+
elem = eval( "document.all." + id );
|
6
|
+
} else {
|
7
|
+
return false;
|
8
|
+
}
|
9
|
+
|
10
|
+
elemStyle = elem.style;
|
11
|
+
|
12
|
+
if ( elemStyle.display != "block" ) {
|
13
|
+
elemStyle.display = "block";
|
14
|
+
} else {
|
15
|
+
elemStyle.display = "none";
|
16
|
+
}
|
17
|
+
|
18
|
+
return true;
|
19
|
+
}
|
20
|
+
|
21
|
+
function restripe() {
|
22
|
+
i = 0;
|
23
|
+
$('table#report_table tbody tr').each(function(){
|
24
|
+
if (this.style.display != "none") {
|
25
|
+
i += 1;
|
26
|
+
classes = this.className.split(" ");
|
27
|
+
if ($.inArray("even",classes) != -1) {
|
28
|
+
classes.splice($.inArray("even",classes),1);
|
29
|
+
} else if ($.inArray("odd",classes) != -1) {
|
30
|
+
classes.splice($.inArray("odd",classes),1);
|
31
|
+
}
|
32
|
+
if (i % 2 === 0) {
|
33
|
+
this.className = classes.join(" ") + " odd";
|
34
|
+
} else {
|
35
|
+
this.className = classes.join(" ") + " even";
|
36
|
+
}
|
37
|
+
}
|
38
|
+
});
|
39
|
+
}
|
40
|
+
|
41
|
+
// Fix IE's lack of support for indexOf (!)
|
42
|
+
if (!Array.indexOf) { Array.prototype.indexOf = function(obj){ for(var i=0; i<this.length; i++){ if(this[i]==obj){return i;} } return -1; }}
|
@@ -0,0 +1,270 @@
|
|
1
|
+
/* @group General */
|
2
|
+
|
3
|
+
body {
|
4
|
+
font-family: Verdana, Helvetica, Arial, Sans-Serif;
|
5
|
+
font-size: 12px;
|
6
|
+
color: #4C4C4C;
|
7
|
+
background-color: #F4F2ED;
|
8
|
+
padding: 1em;
|
9
|
+
}
|
10
|
+
|
11
|
+
a:link {
|
12
|
+
color: #191919;
|
13
|
+
}
|
14
|
+
|
15
|
+
a:visited {
|
16
|
+
color: #191919;
|
17
|
+
}
|
18
|
+
|
19
|
+
pre, code {
|
20
|
+
color: #000000;
|
21
|
+
font-family: "Bitstream Vera Sans Mono","Monaco","Courier New",monospace;
|
22
|
+
font-size: 95%;
|
23
|
+
line-height: 1.3em;
|
24
|
+
margin-top: 0;
|
25
|
+
margin-bottom: 0;
|
26
|
+
padding: 0;
|
27
|
+
word-wrap: break-word;
|
28
|
+
}
|
29
|
+
|
30
|
+
h1, h2, h3, h4, h5, h6 {
|
31
|
+
margin: 0em 0em 1em 0em;
|
32
|
+
color: #666666;
|
33
|
+
}
|
34
|
+
|
35
|
+
h1 {
|
36
|
+
display: block;
|
37
|
+
font-size: 2em;
|
38
|
+
letter-spacing: -1px;
|
39
|
+
}
|
40
|
+
|
41
|
+
h2 {
|
42
|
+
margin-top: -1em;
|
43
|
+
}
|
44
|
+
|
45
|
+
fieldset {
|
46
|
+
display: inline;
|
47
|
+
border: 0px;
|
48
|
+
padding: 0px;
|
49
|
+
margin-right: 1em;
|
50
|
+
}
|
51
|
+
|
52
|
+
div.filters {
|
53
|
+
margin-bottom: 1em;
|
54
|
+
}
|
55
|
+
|
56
|
+
.hidden {
|
57
|
+
display: none;
|
58
|
+
}
|
59
|
+
|
60
|
+
/* @end */
|
61
|
+
|
62
|
+
/* @group Cross-References */
|
63
|
+
|
64
|
+
span.cross-ref-title {
|
65
|
+
font-size: 140%;
|
66
|
+
}
|
67
|
+
|
68
|
+
span.cross-ref a {
|
69
|
+
text-decoration: none;
|
70
|
+
}
|
71
|
+
|
72
|
+
span.cross-ref {
|
73
|
+
background-color:#f3f7fa;
|
74
|
+
border: 1px dashed #333;
|
75
|
+
margin: 1em;
|
76
|
+
padding: 0.5em;
|
77
|
+
overflow: hidden;
|
78
|
+
}
|
79
|
+
|
80
|
+
a.crossref-toggle {
|
81
|
+
text-decoration: none;
|
82
|
+
}
|
83
|
+
|
84
|
+
/* @end */
|
85
|
+
|
86
|
+
/* @group Report Table */
|
87
|
+
|
88
|
+
div.report_table_wrapper {
|
89
|
+
min-width: 900px;
|
90
|
+
}
|
91
|
+
|
92
|
+
table.report {
|
93
|
+
border-collapse: collapse;
|
94
|
+
border: 1px solid #666666;
|
95
|
+
width: 100%;
|
96
|
+
margin-bottom: 1em;
|
97
|
+
}
|
98
|
+
|
99
|
+
table.report tr {
|
100
|
+
line-height: 1.75em;
|
101
|
+
}
|
102
|
+
|
103
|
+
table.report th {
|
104
|
+
background: #666666;
|
105
|
+
color: #ffffff;
|
106
|
+
text-align: right;
|
107
|
+
text-transform: uppercase;
|
108
|
+
font-size: .8em;
|
109
|
+
font-weight: bold;
|
110
|
+
padding: 0em .5em;
|
111
|
+
border: 1px solid #666666;
|
112
|
+
}
|
113
|
+
|
114
|
+
table.report tfoot tr {
|
115
|
+
background: #dddddd;
|
116
|
+
font-weight: bold;
|
117
|
+
padding: .5em;
|
118
|
+
border: 1px solid #666666;
|
119
|
+
}
|
120
|
+
|
121
|
+
th.left_align, td.left_align {
|
122
|
+
text-align: left !important;
|
123
|
+
}
|
124
|
+
|
125
|
+
th.right_align, td.right_align {
|
126
|
+
text-align: right;
|
127
|
+
padding-right: 2em !important;
|
128
|
+
}
|
129
|
+
|
130
|
+
table.report th.header:hover {
|
131
|
+
cursor: pointer;
|
132
|
+
text-decoration: underline;
|
133
|
+
}
|
134
|
+
|
135
|
+
table.report th.headerSortUp:after{
|
136
|
+
content: "\25BC";
|
137
|
+
margin-left: 1em;
|
138
|
+
}
|
139
|
+
|
140
|
+
table.report th.headerSortDown:after {
|
141
|
+
content: "\25B2";
|
142
|
+
margin-left: 1em;
|
143
|
+
}
|
144
|
+
|
145
|
+
table.report tr.summary_row {
|
146
|
+
background: #cccccc;
|
147
|
+
border: 1px solid #cccccc;
|
148
|
+
}
|
149
|
+
|
150
|
+
table.report tr.summary_row td {
|
151
|
+
padding-left: .2em !important;
|
152
|
+
color: #333333;
|
153
|
+
font-weight: bold;
|
154
|
+
}
|
155
|
+
|
156
|
+
table.report td {
|
157
|
+
padding: .2em .5em .2em .5em;
|
158
|
+
}
|
159
|
+
|
160
|
+
table.report td a {
|
161
|
+
text-decoration: none;
|
162
|
+
}
|
163
|
+
|
164
|
+
table.report tbody tr:hover {
|
165
|
+
background: #cccccc !important;
|
166
|
+
}
|
167
|
+
|
168
|
+
table.report tr.summary_row td {
|
169
|
+
border-bottom: 1px solid #aaaaaa;
|
170
|
+
}
|
171
|
+
|
172
|
+
table.report tr {
|
173
|
+
background-color: #eeeeee;
|
174
|
+
}
|
175
|
+
|
176
|
+
table.report tr.odd {
|
177
|
+
background-color: #dddddd;
|
178
|
+
}
|
179
|
+
|
180
|
+
/* @end */
|
181
|
+
|
182
|
+
/* @group Percentage Graphs */
|
183
|
+
|
184
|
+
div.percent_graph_legend {
|
185
|
+
width: 5.5em;
|
186
|
+
float: left;
|
187
|
+
margin: .5em 1em .5em 0em;
|
188
|
+
height: 1em;
|
189
|
+
line-height: 1em;
|
190
|
+
}
|
191
|
+
|
192
|
+
div.percent_graph {
|
193
|
+
height: 1em;
|
194
|
+
border: #333333 1px solid;
|
195
|
+
empty-cells: show;
|
196
|
+
padding: 0px;
|
197
|
+
border-collapse: collapse;
|
198
|
+
width: 100px !important;
|
199
|
+
float: left;
|
200
|
+
margin: .5em 1em .5em 0em;
|
201
|
+
}
|
202
|
+
|
203
|
+
div.percent_graph div {
|
204
|
+
float: left;
|
205
|
+
height: 1em;
|
206
|
+
padding: 0px !important;
|
207
|
+
}
|
208
|
+
|
209
|
+
div.percent_graph div.covered {
|
210
|
+
background: #649632;
|
211
|
+
}
|
212
|
+
|
213
|
+
div.percent_graph div.uncovered {
|
214
|
+
background: #a92730;
|
215
|
+
}
|
216
|
+
|
217
|
+
div.percent_graph div.NA {
|
218
|
+
background: #eaeaea;
|
219
|
+
}
|
220
|
+
|
221
|
+
/* @end */
|
222
|
+
|
223
|
+
/* @group Details page */
|
224
|
+
|
225
|
+
table.details {
|
226
|
+
margin-top: 1em;
|
227
|
+
border-collapse: collapse;
|
228
|
+
width: 100%;
|
229
|
+
border: 1px solid #666666;
|
230
|
+
}
|
231
|
+
|
232
|
+
table.details tr {
|
233
|
+
line-height: 1.75em;
|
234
|
+
}
|
235
|
+
|
236
|
+
table.details td {
|
237
|
+
padding: .25em;
|
238
|
+
}
|
239
|
+
|
240
|
+
span.inferred, span.inferred1, span.marked, span.marked1, span.uncovered, span.uncovered1 {
|
241
|
+
display: block;
|
242
|
+
padding: .25em;
|
243
|
+
}
|
244
|
+
|
245
|
+
tr.inferred td, span.inferred {
|
246
|
+
background-color: #e0dedb;
|
247
|
+
}
|
248
|
+
|
249
|
+
tr.inferred1 td, span.inferred1 {
|
250
|
+
background-color: #e0dedb;
|
251
|
+
}
|
252
|
+
|
253
|
+
tr.marked td, span.marked, span.marked1 {
|
254
|
+
background-color: #bed2be;
|
255
|
+
}
|
256
|
+
|
257
|
+
tr.uncovered td, span.uncovered {
|
258
|
+
background-color: #ce8b8c;
|
259
|
+
}
|
260
|
+
|
261
|
+
tr.uncovered1 td, span.uncovered1 {
|
262
|
+
background-color: #ce8b8c;
|
263
|
+
}
|
264
|
+
|
265
|
+
div.key {
|
266
|
+
border: 1px solid #666666;
|
267
|
+
margin: 1em 0em;
|
268
|
+
}
|
269
|
+
|
270
|
+
/* @end */
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Valise
|
2
|
+
class Error < ::Exception; end
|
3
|
+
|
4
|
+
class PathOutsideOfRoot < Error; end
|
5
|
+
class PathNotInRoot < Error; end
|
6
|
+
class PathNotFound < Error; end
|
7
|
+
class ReadOnly < Error; end
|
8
|
+
class VirtualSearchPath < Error; end
|
9
|
+
class MalformedTree < Error; end
|
10
|
+
class RootNotInSet < Error; end
|
11
|
+
|
12
|
+
class WouldClobber < Error
|
13
|
+
def initialize(item)
|
14
|
+
@item = item
|
15
|
+
super("Would clobber #{item.segments.inspect}")
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :item
|
19
|
+
end
|
20
|
+
|
21
|
+
class CantPopulate < Error
|
22
|
+
def initialize(item, cause)
|
23
|
+
@item = item
|
24
|
+
@original_exception = cause
|
25
|
+
super("Couldn't populate #{item.segments.inspect}: #{cause.class}: #{cause.message}")
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_reader :item, :original_exception
|
29
|
+
end
|
30
|
+
end
|
data/lib/valise/item.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'valise/utils'
|
2
|
+
|
3
|
+
module Valise
|
4
|
+
class Serialization
|
5
|
+
@@classes = {}
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def [](index)
|
9
|
+
@@classes[index]
|
10
|
+
end
|
11
|
+
|
12
|
+
def register(index)
|
13
|
+
@@classes[index] = self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Raw < Serialization
|
18
|
+
register :raw
|
19
|
+
|
20
|
+
def self.dump(value)
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.load(raw)
|
25
|
+
raw
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class YAML < Serialization
|
30
|
+
register :yaml
|
31
|
+
|
32
|
+
def self.dump(value)
|
33
|
+
::YAML::dump(value)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.load(raw)
|
37
|
+
::YAML::load(raw)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Item
|
43
|
+
include Unpath
|
44
|
+
|
45
|
+
def initialize(stack, root, dump_load)
|
46
|
+
@stack = stack
|
47
|
+
@root = root
|
48
|
+
@dump_load = dump_load || Serialization::Raw
|
49
|
+
@contents = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
attr_reader :stack, :root
|
53
|
+
attr_accessor :contents
|
54
|
+
|
55
|
+
def inspect
|
56
|
+
"#{@root.inspect}//#{@stack.inspect}"
|
57
|
+
end
|
58
|
+
|
59
|
+
def segments
|
60
|
+
@stack.segments
|
61
|
+
end
|
62
|
+
|
63
|
+
def full_path
|
64
|
+
@root.full_path(segments)
|
65
|
+
end
|
66
|
+
|
67
|
+
def writable?
|
68
|
+
@root.writable?(segments)
|
69
|
+
end
|
70
|
+
|
71
|
+
def present?
|
72
|
+
@root.present?(segments)
|
73
|
+
end
|
74
|
+
|
75
|
+
def raw_file
|
76
|
+
File::open(full_path)
|
77
|
+
end
|
78
|
+
|
79
|
+
def open(&block)
|
80
|
+
File::open(full_path, "r", &block)
|
81
|
+
end
|
82
|
+
|
83
|
+
def save
|
84
|
+
root.write(self)
|
85
|
+
end
|
86
|
+
|
87
|
+
def contents
|
88
|
+
return @stack.merged(self)
|
89
|
+
end
|
90
|
+
|
91
|
+
def contents=(value)
|
92
|
+
@contents = @stack.diffed(self, value)
|
93
|
+
save
|
94
|
+
@contents
|
95
|
+
end
|
96
|
+
|
97
|
+
def dump_contents
|
98
|
+
@dump_load.dump(load_contents) #@contents?
|
99
|
+
end
|
100
|
+
|
101
|
+
def load_contents
|
102
|
+
@contents ||= @dump_load.load(@root.get_from(self))
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'valise/utils'
|
2
|
+
|
3
|
+
module Valise
|
4
|
+
class PathMatcher
|
5
|
+
include Unpath
|
6
|
+
|
7
|
+
def initialize(segment = nil)
|
8
|
+
@children = []
|
9
|
+
@segment = segment
|
10
|
+
@value = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :segment
|
14
|
+
|
15
|
+
def each_pair(prefix = [])
|
16
|
+
segments = prefix.dup
|
17
|
+
segments << @segment if @segment
|
18
|
+
@children.each do |child|
|
19
|
+
child.each_pair(segments) do |segments, value|
|
20
|
+
yield(segments, value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
yield(segments, @value) if @value
|
24
|
+
end
|
25
|
+
|
26
|
+
def merge!(other)
|
27
|
+
other.each_pair do |path, value|
|
28
|
+
self[path] = value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def [](path)
|
33
|
+
retreive(unpath(path))
|
34
|
+
end
|
35
|
+
|
36
|
+
def retreive(segments)
|
37
|
+
if segments.empty?
|
38
|
+
return @value
|
39
|
+
else
|
40
|
+
@children.each do |child|
|
41
|
+
val = child.access(segments)
|
42
|
+
return val unless val.nil?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
return nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def access(segments)
|
49
|
+
return retreive(segments.drop(1)) if match?(segments.first)
|
50
|
+
return nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def match?(segment)
|
54
|
+
@segment == segment
|
55
|
+
end
|
56
|
+
|
57
|
+
def []=(pattern, result)
|
58
|
+
store(unpath(pattern), result)
|
59
|
+
end
|
60
|
+
|
61
|
+
def store(segments, result)
|
62
|
+
if segments.empty?
|
63
|
+
@value = result
|
64
|
+
else
|
65
|
+
index = segments.shift
|
66
|
+
target = @children.find {|child| child.segment == index } ||
|
67
|
+
case index
|
68
|
+
when "**"; DirGlob.new.tap{|m| @children << m}
|
69
|
+
when /^[*].*/; FileGlob.new(index).tap{|m| @children << m}
|
70
|
+
else; PathMatcher.new(index).tap{|m| @children << m}
|
71
|
+
end
|
72
|
+
target.store(segments, result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class DirGlob < PathMatcher
|
78
|
+
def initialize
|
79
|
+
super('**')
|
80
|
+
end
|
81
|
+
|
82
|
+
def match?(segment)
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
def access(segments)
|
87
|
+
if segments.empty?
|
88
|
+
return nil
|
89
|
+
else
|
90
|
+
super || access(segments.drop(1))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class FileGlob < PathMatcher
|
96
|
+
def initialize(segment)
|
97
|
+
super
|
98
|
+
@regex = %r{.*#{segment.sub(/^[*]/,"")}$}
|
99
|
+
end
|
100
|
+
|
101
|
+
def match?(segment)
|
102
|
+
@regex =~ segment
|
103
|
+
end
|
104
|
+
|
105
|
+
def store(segments, result)
|
106
|
+
if segments.empty?
|
107
|
+
@value = result
|
108
|
+
else
|
109
|
+
raise "File globs can only be used as suffixes"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|