reapack-index 1.0beta2
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 +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +8 -0
- data/Gemfile +3 -0
- data/README.md +167 -0
- data/Rakefile +7 -0
- data/bin/reapack-index +8 -0
- data/lib/reapack/index.rb +351 -0
- data/lib/reapack/index/cli.rb +437 -0
- data/lib/reapack/index/gem_version.rb +5 -0
- data/lib/reapack/index/metadata.rb +185 -0
- data/lib/reapack/index/named_node.rb +68 -0
- data/lib/reapack/index/package.rb +65 -0
- data/lib/reapack/index/parsers.rb +35 -0
- data/lib/reapack/index/version.rb +178 -0
- data/reapack-index.gemspec +33 -0
- data/setup/.gitignore +1 -0
- data/setup/reapack-index.nsi +148 -0
- data/test/data/index.xml +11 -0
- data/test/data/noindex.lua +1 -0
- data/test/helper.rb +25 -0
- data/test/test_changelog.rb +76 -0
- data/test/test_cli.rb +846 -0
- data/test/test_index.rb +817 -0
- data/test/test_metadata.rb +403 -0
- data/test/test_named_node.rb +100 -0
- data/test/test_package.rb +95 -0
- data/test/test_parsers.rb +35 -0
- data/test/test_version.rb +215 -0
- metadata +238 -0
@@ -0,0 +1,403 @@
|
|
1
|
+
require File.expand_path '../helper', __FILE__
|
2
|
+
|
3
|
+
class TestMetadata < MiniTest::Test
|
4
|
+
include XMLHelper
|
5
|
+
|
6
|
+
def test_website_link
|
7
|
+
before = make_node '<index/>'
|
8
|
+
after = <<-XML
|
9
|
+
<index>
|
10
|
+
<metadata>
|
11
|
+
<link rel="website">http://cfillion.tk</link>
|
12
|
+
</metadata>
|
13
|
+
</index>
|
14
|
+
XML
|
15
|
+
|
16
|
+
md = ReaPack::Index::Metadata.new before
|
17
|
+
assert_empty md.links(:website)
|
18
|
+
|
19
|
+
link = md.push_link :website, 'http://cfillion.tk'
|
20
|
+
assert_equal true, link.is_new?
|
21
|
+
assert_equal true, link.modified?
|
22
|
+
|
23
|
+
links = md.links :website
|
24
|
+
assert_equal 1, links.size
|
25
|
+
assert_equal links.first.url, links.first.name
|
26
|
+
assert_equal 'http://cfillion.tk', links.first.url
|
27
|
+
|
28
|
+
assert_equal false, links.first.is_new?
|
29
|
+
assert_equal false, links.first.modified?
|
30
|
+
|
31
|
+
assert_empty md.links(:donation)
|
32
|
+
assert_equal after.chomp, before.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_donation_link
|
36
|
+
before = make_node '<index/>'
|
37
|
+
after = <<-XML
|
38
|
+
<index>
|
39
|
+
<metadata>
|
40
|
+
<link rel="donation">http://cfillion.tk</link>
|
41
|
+
</metadata>
|
42
|
+
</index>
|
43
|
+
XML
|
44
|
+
|
45
|
+
md = ReaPack::Index::Metadata.new before
|
46
|
+
assert_empty md.links(:donation)
|
47
|
+
|
48
|
+
md.push_link :donation, 'http://cfillion.tk'
|
49
|
+
|
50
|
+
links = md.links :donation
|
51
|
+
assert_equal 1, links.size
|
52
|
+
assert_equal links.first.url, links.first.name
|
53
|
+
assert_equal 'http://cfillion.tk', links.first.url
|
54
|
+
|
55
|
+
assert_empty md.links(:website)
|
56
|
+
assert_equal after.chomp, before.to_s
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_invalid_type
|
60
|
+
md = ReaPack::Index::Metadata.new make_node('<index/>')
|
61
|
+
|
62
|
+
assert_raises ArgumentError do
|
63
|
+
md.links :hello
|
64
|
+
end
|
65
|
+
|
66
|
+
assert_raises ArgumentError do
|
67
|
+
md.push_link :hello, 'world'
|
68
|
+
end
|
69
|
+
|
70
|
+
assert_raises ArgumentError do
|
71
|
+
md.remove_link :hello, 'world'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_link_label
|
76
|
+
before = make_node '<index/>'
|
77
|
+
after = <<-XML
|
78
|
+
<index>
|
79
|
+
<metadata>
|
80
|
+
<link rel="website" href="http://cfillion.tk/">Hello World</link>
|
81
|
+
</metadata>
|
82
|
+
</index>
|
83
|
+
XML
|
84
|
+
|
85
|
+
md = ReaPack::Index::Metadata.new before
|
86
|
+
md.push_link :website, 'Hello World', 'http://cfillion.tk/'
|
87
|
+
|
88
|
+
links = md.links :website
|
89
|
+
assert_equal 1, links.size
|
90
|
+
assert_equal 'Hello World', links.first.name
|
91
|
+
assert_equal 'http://cfillion.tk/', links.first.url
|
92
|
+
|
93
|
+
assert_equal after.chomp, before.to_s
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_read_links
|
97
|
+
node = make_node <<-XML
|
98
|
+
<index version="1">
|
99
|
+
<metadata>
|
100
|
+
<link rel="website" href="http://cfillion.tk/" />
|
101
|
+
<link rel="website" href="https://github.com/cfillion"></link>
|
102
|
+
<link rel="website">http://twitter.com/cfi30</link>
|
103
|
+
<link>http://google.com</link>
|
104
|
+
<link />
|
105
|
+
<link rel="donation" href="http://paypal.com">Donate</link>
|
106
|
+
<link rel="website" href="/"></link>
|
107
|
+
</metadata>
|
108
|
+
</index>
|
109
|
+
XML
|
110
|
+
|
111
|
+
md = ReaPack::Index::Metadata.new node
|
112
|
+
|
113
|
+
links = md.links :website
|
114
|
+
assert_equal 4, links.size
|
115
|
+
assert_equal 'http://cfillion.tk/', links[0].name
|
116
|
+
assert_equal links[0].name, links[0].url
|
117
|
+
assert_equal 'https://github.com/cfillion', links[1].name
|
118
|
+
assert_equal links[1].name, links[1].url
|
119
|
+
assert_equal 'http://twitter.com/cfi30', links[2].name
|
120
|
+
assert_equal links[2].name, links[2].url
|
121
|
+
assert_equal 'http://google.com', links[3].name
|
122
|
+
assert_equal links[3].name, links[3].url
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_invalid_link
|
126
|
+
after = '<index/>'
|
127
|
+
before = make_node after
|
128
|
+
|
129
|
+
md = ReaPack::Index::Metadata.new before
|
130
|
+
|
131
|
+
error = assert_raises ReaPack::Index::Error do
|
132
|
+
md.push_link :website, 'hello'
|
133
|
+
end
|
134
|
+
|
135
|
+
assert_equal 'invalid URL: hello', error.message
|
136
|
+
assert_equal after.chomp, before.to_s
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_remove_link
|
140
|
+
before = make_node <<-XML
|
141
|
+
<index>
|
142
|
+
<metadata>
|
143
|
+
<link rel="website" href="http://cfillion.tk" />
|
144
|
+
<link rel="website" href="http://google.com">Search</link>
|
145
|
+
<link rel="donation" href="http://paypal.com">Donate</link>
|
146
|
+
</metadata>
|
147
|
+
</index>
|
148
|
+
XML
|
149
|
+
|
150
|
+
after = '<index/>'
|
151
|
+
|
152
|
+
md = ReaPack::Index::Metadata.new before
|
153
|
+
assert_equal 2, md.links(:website).size
|
154
|
+
|
155
|
+
md.remove_link :website, 'http://cfillion.tk'
|
156
|
+
assert_equal 1, md.links(:website).size
|
157
|
+
|
158
|
+
md.remove_link :website, 'Search'
|
159
|
+
assert_equal 0, md.links(:website).size
|
160
|
+
|
161
|
+
assert_equal 1, md.links(:donation).size
|
162
|
+
md.remove_link :donation, 'Donate'
|
163
|
+
assert_equal 0, md.links(:donation).size
|
164
|
+
|
165
|
+
assert_equal after.chomp, before.to_s
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_remove_link_inexistant
|
169
|
+
md = ReaPack::Index::Metadata.new make_node('<index/>')
|
170
|
+
|
171
|
+
error = assert_raises ReaPack::Index::Error do
|
172
|
+
md.remove_link :website, 'hello'
|
173
|
+
end
|
174
|
+
|
175
|
+
assert_equal 'no such website link: hello', error.message
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_replace_link_url
|
179
|
+
before = make_node <<-XML
|
180
|
+
<index>
|
181
|
+
<metadata>
|
182
|
+
<link rel="website" href="http://cfillion.tk"/>
|
183
|
+
<link rel="website" href="http://cfillion.no-ip.org">Test</link>
|
184
|
+
</metadata>
|
185
|
+
</index>
|
186
|
+
XML
|
187
|
+
|
188
|
+
after = <<-XML
|
189
|
+
<index>
|
190
|
+
<metadata>
|
191
|
+
<link rel="website">http://cfillion.tk</link>
|
192
|
+
<link rel="website" href="http://cfillion.tk">Test</link>
|
193
|
+
</metadata>
|
194
|
+
</index>
|
195
|
+
XML
|
196
|
+
|
197
|
+
md = ReaPack::Index::Metadata.new before
|
198
|
+
|
199
|
+
link1 = md.push_link :website, 'http://cfillion.tk'
|
200
|
+
assert_equal false, link1.is_new?
|
201
|
+
assert_equal false, link1.modified?
|
202
|
+
|
203
|
+
link2 = md.push_link :website, 'Test', 'http://cfillion.tk'
|
204
|
+
assert_equal false, link2.is_new?
|
205
|
+
assert_equal true, link2.modified?
|
206
|
+
|
207
|
+
assert_equal after.chomp, before.to_s
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_replace_link_name
|
211
|
+
before = make_node <<-XML
|
212
|
+
<index>
|
213
|
+
<metadata>
|
214
|
+
<link rel="website" href="http://cfillion.tk">A</link>
|
215
|
+
<link rel="website">http://google.com</link>
|
216
|
+
</metadata>
|
217
|
+
</index>
|
218
|
+
XML
|
219
|
+
|
220
|
+
after = <<-XML
|
221
|
+
<index>
|
222
|
+
<metadata>
|
223
|
+
<link rel="website">http://cfillion.tk</link>
|
224
|
+
<link rel="website" href="http://google.com">B</link>
|
225
|
+
</metadata>
|
226
|
+
</index>
|
227
|
+
XML
|
228
|
+
|
229
|
+
md = ReaPack::Index::Metadata.new before
|
230
|
+
|
231
|
+
# remove name
|
232
|
+
link1 = md.push_link :website, 'http://cfillion.tk'
|
233
|
+
assert_equal false, link1.is_new?
|
234
|
+
assert_equal true, link1.modified?
|
235
|
+
|
236
|
+
# insert name
|
237
|
+
link2 = md.push_link :website, 'B', 'http://google.com'
|
238
|
+
assert_equal false, link2.is_new?
|
239
|
+
assert_equal true, link2.modified?
|
240
|
+
|
241
|
+
assert_equal after.chomp, before.to_s
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_read_description
|
245
|
+
md = ReaPack::Index::Metadata.new make_node <<-XML
|
246
|
+
<index>
|
247
|
+
<metadata>
|
248
|
+
<description><![CDATA[Hello World]]></description>
|
249
|
+
</metadata>
|
250
|
+
</index>
|
251
|
+
XML
|
252
|
+
|
253
|
+
assert_equal 'Hello World', md.description
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_read_description_empty
|
257
|
+
md = ReaPack::Index::Metadata.new make_node <<-XML
|
258
|
+
<index>
|
259
|
+
<metadata/>
|
260
|
+
</index>
|
261
|
+
XML
|
262
|
+
|
263
|
+
assert_empty md.description
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_write_description
|
267
|
+
rtf = <<-RTF
|
268
|
+
{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}
|
269
|
+
{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}
|
270
|
+
\\widowctrl\\hyphauto
|
271
|
+
|
272
|
+
{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Hello World\\par}
|
273
|
+
}
|
274
|
+
RTF
|
275
|
+
|
276
|
+
before = make_node '<index/>'
|
277
|
+
after = <<-XML
|
278
|
+
<index>
|
279
|
+
<metadata>
|
280
|
+
<description><![CDATA[#{rtf}]]></description>
|
281
|
+
</metadata>
|
282
|
+
</index>
|
283
|
+
XML
|
284
|
+
|
285
|
+
md = ReaPack::Index::Metadata.new before
|
286
|
+
assert_empty md.description
|
287
|
+
|
288
|
+
md.description = 'Hello World'
|
289
|
+
assert_equal rtf, md.description
|
290
|
+
|
291
|
+
assert_equal after.chomp, before.to_s
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_write_description_rtf
|
295
|
+
rtf = <<-RTF
|
296
|
+
{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}
|
297
|
+
{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}
|
298
|
+
\\widowctrl\\hyphauto
|
299
|
+
|
300
|
+
{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Hello World\\par}
|
301
|
+
}
|
302
|
+
RTF
|
303
|
+
|
304
|
+
before = make_node '<index/>'
|
305
|
+
after = <<-XML
|
306
|
+
<index>
|
307
|
+
<metadata>
|
308
|
+
<description><![CDATA[#{rtf}]]></description>
|
309
|
+
</metadata>
|
310
|
+
</index>
|
311
|
+
XML
|
312
|
+
|
313
|
+
md = ReaPack::Index::Metadata.new before
|
314
|
+
assert_empty md.description
|
315
|
+
|
316
|
+
md.description = rtf
|
317
|
+
assert_equal rtf, md.description
|
318
|
+
|
319
|
+
assert_equal after.chomp, before.to_s
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_replace_description
|
323
|
+
rtf = <<-RTF
|
324
|
+
RTF
|
325
|
+
|
326
|
+
before = make_node <<-XML
|
327
|
+
<index>
|
328
|
+
<metadata>
|
329
|
+
<description><![CDATA[{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}
|
330
|
+
{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}
|
331
|
+
\\widowctrl\\hyphauto
|
332
|
+
|
333
|
+
{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Hello World\\par}
|
334
|
+
}
|
335
|
+
]]></description>
|
336
|
+
</metadata>
|
337
|
+
</index>
|
338
|
+
XML
|
339
|
+
|
340
|
+
after = <<-XML
|
341
|
+
<index>
|
342
|
+
<metadata>
|
343
|
+
<description><![CDATA[{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}
|
344
|
+
{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}
|
345
|
+
\\widowctrl\\hyphauto
|
346
|
+
|
347
|
+
{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Chunky Bacon\\par}
|
348
|
+
}
|
349
|
+
]]></description>
|
350
|
+
</metadata>
|
351
|
+
</index>
|
352
|
+
XML
|
353
|
+
|
354
|
+
md = ReaPack::Index::Metadata.new before
|
355
|
+
md.description = 'Chunky Bacon'
|
356
|
+
|
357
|
+
assert_equal after.chomp, before.to_s
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_remove_description
|
361
|
+
rtf = <<-RTF
|
362
|
+
{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}
|
363
|
+
{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}
|
364
|
+
\\widowctrl\\hyphauto
|
365
|
+
|
366
|
+
{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Hello World\\par}
|
367
|
+
}
|
368
|
+
RTF
|
369
|
+
|
370
|
+
before = make_node <<-XML
|
371
|
+
<index>
|
372
|
+
<metadata>
|
373
|
+
<description><![CDATA[#{rtf}]]></description>
|
374
|
+
</metadata>
|
375
|
+
</index>
|
376
|
+
XML
|
377
|
+
|
378
|
+
after = '<index/>'
|
379
|
+
|
380
|
+
md = ReaPack::Index::Metadata.new before
|
381
|
+
refute_empty md.description
|
382
|
+
|
383
|
+
md.description = String.new
|
384
|
+
assert_empty md.description
|
385
|
+
|
386
|
+
assert_equal after, before.to_s
|
387
|
+
end
|
388
|
+
|
389
|
+
def test_pandoc_not_found
|
390
|
+
old_path = ENV['PATH']
|
391
|
+
ENV['PATH'] = String.new
|
392
|
+
|
393
|
+
md = ReaPack::Index::Metadata.new make_node('<index/>')
|
394
|
+
|
395
|
+
error = assert_raises ReaPack::Index::Error do
|
396
|
+
md.description = 'test'
|
397
|
+
end
|
398
|
+
|
399
|
+
assert_match /pandoc executable cannot be found in your PATH/i, error.message
|
400
|
+
ensure
|
401
|
+
ENV['PATH'] = old_path
|
402
|
+
end
|
403
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.expand_path '../helper', __FILE__
|
2
|
+
|
3
|
+
class TestNamedNode < MiniTest::Test
|
4
|
+
include XMLHelper
|
5
|
+
|
6
|
+
def test_no_tag_set
|
7
|
+
mock = Class.new ReaPack::Index::NamedNode
|
8
|
+
assert_raises { mock.tag }
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_find_in
|
12
|
+
node = make_node '<root><node name="hello"/><node name="world"/></root>'
|
13
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
14
|
+
|
15
|
+
instance = mock.find_in node, 'hello'
|
16
|
+
assert_nil mock.find_in node, 'bacon'
|
17
|
+
|
18
|
+
assert_kind_of mock, instance
|
19
|
+
assert_equal 'hello', instance.name
|
20
|
+
refute instance.is_new?, 'instance is new'
|
21
|
+
refute instance.modified?, 'instance is modified'
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_find_all
|
25
|
+
node = make_node '<root><node name="hello"/><node name="world"/></root>'
|
26
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
27
|
+
|
28
|
+
instances = mock.find_all node
|
29
|
+
assert_equal 2, instances.size
|
30
|
+
|
31
|
+
assert_kind_of mock, instances.first
|
32
|
+
assert_equal 'hello', instances.first.name
|
33
|
+
refute instances.first.is_new?, 'instance is new'
|
34
|
+
|
35
|
+
assert_equal 'world', instances.last.name
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_get_readonly
|
39
|
+
node = make_node '<root><node name="hello"/></root>'
|
40
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
41
|
+
|
42
|
+
instance = mock.get 'hello', node, false
|
43
|
+
assert_kind_of mock, instance
|
44
|
+
|
45
|
+
assert_nil mock.get 'world', node, false
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_get_create
|
49
|
+
node = make_node '<root></root>'
|
50
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
51
|
+
|
52
|
+
instance = mock.get 'hello', node, true
|
53
|
+
|
54
|
+
assert_kind_of mock, instance
|
55
|
+
assert instance.is_new?, 'instance is not new'
|
56
|
+
assert instance.modified?, 'instance is not modified'
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_get_null_parent
|
60
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
61
|
+
|
62
|
+
assert_nil mock.get 'hello', nil, false
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_empty
|
66
|
+
node = make_node <<-XML
|
67
|
+
<root>
|
68
|
+
<node name="first"/>
|
69
|
+
<node name="second"><something/></node>
|
70
|
+
</root>
|
71
|
+
XML
|
72
|
+
|
73
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
74
|
+
|
75
|
+
first = mock.find_in node, 'first'
|
76
|
+
assert first.empty?, 'first is not empty'
|
77
|
+
|
78
|
+
second = mock.find_in node, 'second'
|
79
|
+
refute second.empty?, 'second is empty'
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_remove
|
83
|
+
node = make_node '<root><node name="test"/></root>'
|
84
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
85
|
+
|
86
|
+
instance = mock.find_in node, 'test'
|
87
|
+
|
88
|
+
assert_equal 1, node.children.size
|
89
|
+
instance.remove
|
90
|
+
assert_equal 0, node.children.size
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_children
|
94
|
+
node = make_node '<root><node name="test"><a/><b/></root>'
|
95
|
+
mock = Class.new(ReaPack::Index::NamedNode) { @tag = 'node' }
|
96
|
+
|
97
|
+
instance = mock.find_in node, 'test'
|
98
|
+
assert_equal node.css('a').inspect, instance.children('a').inspect
|
99
|
+
end
|
100
|
+
end
|