valise 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/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
|