resync-client 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +4 -0
- data/lib/resync/client/mixins/change_index.rb +37 -0
- data/lib/resync/client/mixins/zipped_resource.rb +0 -1
- data/lib/resync/client/version.rb +1 -1
- data/spec/data/examples/change-list-1.xml +25 -0
- data/spec/data/examples/change-list-2.xml +25 -0
- data/spec/data/examples/change-list-3.xml +16 -0
- data/spec/rspec_custom_matchers.rb +22 -0
- data/spec/unit/resync/client/extensions_spec.rb +68 -0
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dc391cfdfcafd5a808a5a4736daf19a1e52d418
|
4
|
+
data.tar.gz: 2f983d3560d4bf3390faaeda241e5b6a570be8f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65e5d83731a97afab8e3d1d6cbcca7ef716f7acf2e3e7d1ef490763dff15c8daef6539591bd51069b11ddae2f530bcd005928e92b57fdd0805b092e66da7b961
|
7
|
+
data.tar.gz: 468e546e76abb8f29ca6f6a968efd17ab46f785fd082148f0b9b343fca139a69cc2f9dcbd0f491ad37834dab454d104fae35edca5f0e055fcbcba0f34558effc
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# 0.2.5
|
2
|
+
|
3
|
+
- Added `#all_changes` to transparently download and flatten changes in `ChangeListIndex` and `ChangeDumpIndex` documents, with filtering by time and type
|
4
|
+
|
1
5
|
# 0.2.4
|
2
6
|
|
3
7
|
- Added `#all_resources` to transparently download and flatten lists in `ChangeListIndex` and `ResourceListIndex`
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'resync'
|
2
|
+
require_relative 'resource_client_delegate'
|
3
|
+
|
4
|
+
module Resync
|
5
|
+
class Client
|
6
|
+
module Mixins
|
7
|
+
# A resource container whose resources are lists of changes.
|
8
|
+
module ChangeIndex
|
9
|
+
prepend ResourceClientDelegate
|
10
|
+
|
11
|
+
# Downloads and parses each resource list and returns a flattened enumeration
|
12
|
+
# of all changes in each contained list, filtering by date/time, change type,
|
13
|
+
# or both. (Each contained list is only downloaded as needed, and only downloaded
|
14
|
+
# once.) The lists of lists are filtered by +from_time+ and +until_time+, in
|
15
|
+
# non-strict mode (only excluding those lists provably not in the range, i.e.,
|
16
|
+
# including lists without +from_time+ or +until_time+); the individual changes
|
17
|
+
# are filtered by +modified_time+.
|
18
|
+
#
|
19
|
+
# @param of_type [Resync::Types::Change, nil] the change type
|
20
|
+
# @param in_range [Range<Time>, nil] the time range
|
21
|
+
# @return [Enumerator::Lazy<Resync::Resource>] the flattened enumeration of changes
|
22
|
+
def all_changes(of_type: nil, in_range: nil)
|
23
|
+
@change_lists ||= {}
|
24
|
+
lists = in_range ? change_lists(in_range: in_range, strict: false) : resources
|
25
|
+
lists.flat_map do |cl|
|
26
|
+
@change_lists[cl] ||= cl.get_and_parse
|
27
|
+
@change_lists[cl].changes(of_type: of_type, in_range: in_range)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class BaseChangeIndex
|
35
|
+
prepend Client::Mixins::ChangeIndex
|
36
|
+
end
|
37
|
+
end
|
@@ -12,7 +12,6 @@ module Resync
|
|
12
12
|
# it to a temporary file if necessary.
|
13
13
|
# @return [Resync::Client::Zip::ZipPackage] the zipped contents of this resource
|
14
14
|
def zip_package
|
15
|
-
puts self
|
16
15
|
@zip_package ||= Resync::Client::Zip::ZipPackage.new(download_to_temp_file)
|
17
16
|
end
|
18
17
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
3
|
+
xmlns:rs="http://www.openarchives.org/rs/terms/">
|
4
|
+
<rs:ln rel="up"
|
5
|
+
href="http://example.com/dataset1/capabilitylist.xml"/>
|
6
|
+
<rs:md capability="changelist"
|
7
|
+
from="2013-01-01T00:00:00Z"
|
8
|
+
until="2013-01-02T00:00:00Z"/>
|
9
|
+
<url>
|
10
|
+
<loc>http://example.com/res1</loc>
|
11
|
+
<lastmod>2013-01-01T01:00:00Z</lastmod>
|
12
|
+
<rs:md change="updated"
|
13
|
+
hash="md5:51b99b46c9980623b36b27e06a7e4a46"
|
14
|
+
length="446"
|
15
|
+
type="text/plain"/>
|
16
|
+
</url>
|
17
|
+
<url>
|
18
|
+
<loc>http://example.com/res2</loc>
|
19
|
+
<lastmod>2013-01-01T23:00:00Z</lastmod>
|
20
|
+
<rs:md change="updated"
|
21
|
+
hash="md5:6205d276e0c120eb4bac47c14a8297d8"
|
22
|
+
length="447"
|
23
|
+
type="text/plain"/>
|
24
|
+
</url>
|
25
|
+
</urlset>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
3
|
+
xmlns:rs="http://www.openarchives.org/rs/terms/">
|
4
|
+
<rs:ln rel="up"
|
5
|
+
href="http://example.com/dataset1/capabilitylist.xml"/>
|
6
|
+
<rs:md capability="changelist"
|
7
|
+
from="2013-01-02T00:00:00Z"
|
8
|
+
until="2013-01-03T00:00:00Z"/>
|
9
|
+
<url>
|
10
|
+
<loc>http://example.com/res1</loc>
|
11
|
+
<lastmod>2013-01-02T01:00:00Z</lastmod>
|
12
|
+
<rs:md change="updated"
|
13
|
+
hash="md5:6205d276e0c120eb4bac47c14a8297d8"
|
14
|
+
length="447"
|
15
|
+
type="text/plain"/>
|
16
|
+
</url>
|
17
|
+
<url>
|
18
|
+
<loc>http://example.com/res2</loc>
|
19
|
+
<lastmod>2013-01-02T23:00:00Z</lastmod>
|
20
|
+
<rs:md change="updated"
|
21
|
+
hash="md5:51b99b46c9980623b36b27e06a7e4a46"
|
22
|
+
length="446"
|
23
|
+
type="text/plain"/>
|
24
|
+
</url>
|
25
|
+
</urlset>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
3
|
+
xmlns:rs="http://www.openarchives.org/rs/terms/">
|
4
|
+
<rs:ln rel="up"
|
5
|
+
href="http://example.com/dataset1/capabilitylist.xml"/>
|
6
|
+
<rs:md capability="changelist"
|
7
|
+
from="2013-01-03T00:00:00Z"/>
|
8
|
+
<url>
|
9
|
+
<loc>http://example.com/res1</loc>
|
10
|
+
<lastmod>2013-01-03T01:00:00Z</lastmod>
|
11
|
+
<rs:md change="updated"
|
12
|
+
hash="md5:51b99b46c9980623b36b27e06a7e4a46"
|
13
|
+
length="446"
|
14
|
+
type="text/plain"/>
|
15
|
+
</url>
|
16
|
+
</urlset>
|
@@ -9,3 +9,25 @@ RSpec::Matchers.define :request_for do |h|
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
RSpec::Matchers.define :be_time do |expected|
|
14
|
+
|
15
|
+
def to_string(time)
|
16
|
+
time.is_a?(Time) ? time.utc.round(2).iso8601(2) : time.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
match do |actual|
|
20
|
+
if expected
|
21
|
+
fail "Expected value #{expected} is not a Time" unless expected.is_a?(Time)
|
22
|
+
actual.is_a?(Time) && (to_string(expected) == to_string(actual))
|
23
|
+
else
|
24
|
+
return actual.nil?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
failure_message do |actual|
|
29
|
+
expected_str = to_string(expected)
|
30
|
+
actual_str = to_string(actual)
|
31
|
+
"expected time:\n#{expected_str}\n\nbut was:\n#{actual_str}"
|
32
|
+
end
|
33
|
+
end
|
@@ -41,6 +41,74 @@ module Resync
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
describe BaseChangeIndex do
|
45
|
+
before(:each) do
|
46
|
+
@helper = instance_double(Client::HTTPHelper)
|
47
|
+
@client = Client.new(helper: @helper)
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#all_changes' do
|
51
|
+
it 'flattens the child changelists' do
|
52
|
+
change_index_uri = URI('http://example.com/dataset1/changelist.xml')
|
53
|
+
change_index_data = File.read('spec/data/examples/change-list-index.xml')
|
54
|
+
expect(@helper).to receive(:fetch).with(uri: change_index_uri).and_return(change_index_data)
|
55
|
+
|
56
|
+
list1_uri = URI('http://example.com/20130101-changelist.xml')
|
57
|
+
list1_data = File.read('spec/data/examples/change-list-1.xml')
|
58
|
+
expect(@helper).to receive(:fetch).with(uri: list1_uri).and_return(list1_data)
|
59
|
+
|
60
|
+
list2_uri = URI('http://example.com/20130102-changelist.xml')
|
61
|
+
list2_data = File.read('spec/data/examples/change-list-2.xml')
|
62
|
+
expect(@helper).to receive(:fetch).with(uri: list2_uri).and_return(list2_data)
|
63
|
+
|
64
|
+
list3_uri = URI('http://example.com/20130103-changelist.xml')
|
65
|
+
list3_data = File.read('spec/data/examples/change-list-3.xml')
|
66
|
+
expect(@helper).to receive(:fetch).with(uri: list3_uri).and_return(list3_data)
|
67
|
+
|
68
|
+
expected_mtimes = [
|
69
|
+
Time.utc(2013, 1, 1, 1),
|
70
|
+
Time.utc(2013, 1, 1, 23),
|
71
|
+
Time.utc(2013, 1, 2, 1),
|
72
|
+
Time.utc(2013, 1, 2, 23),
|
73
|
+
Time.utc(2013, 1, 3, 1)
|
74
|
+
]
|
75
|
+
|
76
|
+
change_index = @client.get_and_parse(change_index_uri)
|
77
|
+
index = 0
|
78
|
+
change_index.all_changes(in_range: (Time.utc(0)..Time.new)).each do |c|
|
79
|
+
res = index.even? ? 1 : 2
|
80
|
+
expect(c.uri).to eq(URI("http://example.com/res#{res}"))
|
81
|
+
expect(c.modified_time).to be_time(expected_mtimes[index])
|
82
|
+
index += 1
|
83
|
+
end
|
84
|
+
expect(index).to eq(5)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'doesn\'t download unnecessary changelists' do
|
88
|
+
change_index_uri = URI('http://example.com/dataset1/changelist.xml')
|
89
|
+
change_index_data = File.read('spec/data/examples/change-list-index.xml')
|
90
|
+
expect(@helper).to receive(:fetch).with(uri: change_index_uri).and_return(change_index_data)
|
91
|
+
|
92
|
+
list2_uri = URI('http://example.com/20130102-changelist.xml')
|
93
|
+
list2_data = File.read('spec/data/examples/change-list-2.xml')
|
94
|
+
expect(@helper).to receive(:fetch).with(uri: list2_uri).and_return(list2_data)
|
95
|
+
|
96
|
+
list3_uri = URI('http://example.com/20130103-changelist.xml')
|
97
|
+
list3_data = File.read('spec/data/examples/change-list-3.xml')
|
98
|
+
expect(@helper).to receive(:fetch).with(uri: list3_uri).and_return(list3_data)
|
99
|
+
|
100
|
+
change_index = @client.get_and_parse(change_index_uri)
|
101
|
+
count = 0
|
102
|
+
change_index.all_changes(in_range: (Time.utc(2013, 1, 2, 12)..Time.utc(2013, 1, 3, 0, 30))).each do |c|
|
103
|
+
expect(c.modified_time).to be_time(Time.utc(2013, 1, 2, 23))
|
104
|
+
expect(c.uri).to eq(URI('http://example.com/res2'))
|
105
|
+
count += 1
|
106
|
+
end
|
107
|
+
expect(count).to eq(1)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
44
112
|
describe Augmented do
|
45
113
|
it 'proxies all link client requests to its own client' do
|
46
114
|
client = instance_double(Resync::Client)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resync-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Moles
|
@@ -163,6 +163,7 @@ files:
|
|
163
163
|
- lib/resync/client/http_helper.rb
|
164
164
|
- lib/resync/client/mixins.rb
|
165
165
|
- lib/resync/client/mixins/bitstream_resource.rb
|
166
|
+
- lib/resync/client/mixins/change_index.rb
|
166
167
|
- lib/resync/client/mixins/client_delegator.rb
|
167
168
|
- lib/resync/client/mixins/downloadable.rb
|
168
169
|
- lib/resync/client/mixins/dump.rb
|
@@ -182,6 +183,9 @@ files:
|
|
182
183
|
- spec/data/examples/capability-list.xml
|
183
184
|
- spec/data/examples/change-dump-manifest.xml
|
184
185
|
- spec/data/examples/change-dump.xml
|
186
|
+
- spec/data/examples/change-list-1.xml
|
187
|
+
- spec/data/examples/change-list-2.xml
|
188
|
+
- spec/data/examples/change-list-3.xml
|
185
189
|
- spec/data/examples/change-list-index.xml
|
186
190
|
- spec/data/examples/change-list.xml
|
187
191
|
- spec/data/examples/resource-dump-manifest.xml
|
@@ -243,6 +247,9 @@ test_files:
|
|
243
247
|
- spec/data/examples/capability-list.xml
|
244
248
|
- spec/data/examples/change-dump-manifest.xml
|
245
249
|
- spec/data/examples/change-dump.xml
|
250
|
+
- spec/data/examples/change-list-1.xml
|
251
|
+
- spec/data/examples/change-list-2.xml
|
252
|
+
- spec/data/examples/change-list-3.xml
|
246
253
|
- spec/data/examples/change-list-index.xml
|
247
254
|
- spec/data/examples/change-list.xml
|
248
255
|
- spec/data/examples/resource-dump-manifest.xml
|