resync 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +6 -0
- data/lib/resync/resource_list.rb +0 -1
- data/lib/resync/shared/augmented.rb +17 -0
- data/lib/resync/shared/base_resource_list.rb +18 -7
- data/lib/resync/shared/sorted_resource_list.rb +13 -4
- data/lib/resync/util/indexable_lazy.rb +18 -0
- data/lib/resync/util.rb +6 -0
- data/lib/resync/version.rb +1 -1
- data/spec/unit/resync/capability_list_spec.rb +4 -4
- data/spec/unit/resync/resource_dump_index_spec.rb +1 -4
- data/spec/unit/resync/resource_dump_manifest_spec.rb +1 -4
- data/spec/unit/resync/resource_dump_spec.rb +1 -4
- data/spec/unit/resync/resource_list_index_spec.rb +1 -4
- data/spec/unit/resync/resource_list_spec.rb +1 -4
- data/spec/unit/resync/resource_spec.rb +7 -7
- data/spec/unit/resync/shared/augmented_examples.rb +30 -14
- data/spec/unit/resync/shared/base_resource_list_examples.rb +75 -8
- data/spec/unit/resync/shared/sorted_list_examples.rb +52 -2
- data/spec/unit/resync/source_description_spec.rb +1 -4
- data/spec/unit/resync/util/indexable_lazy_spec.rb +133 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aeaccafe9b78c6c1b73438dbc3615691e55acf37
|
4
|
+
data.tar.gz: 20ca197220dff4f8ac252d1fd3060446fad6e5e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b82cd0986b56ea9aed5f12abc1532ead2bb942128938fed721b68fee918987acbc8fdb8683074d0669c5999cd9036d6b28c72b184ab39d44ed2f8928c48f2d85
|
7
|
+
data.tar.gz: eb88c946de862ab36cf3be1f9c01ff94f1f5ebe01d586ae6424bc729c004f0c6c80fd8b8a779415502c550faed3b350ee0f56b3e6c53e3d2e6273bd3934d10a9
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.2.0
|
2
|
+
|
3
|
+
- `BaseResourceList#resources` now returns an `IndexableLazy` instead of a plain array.
|
4
|
+
- Added `BaseResourcesList#resources_in` to filter resource lists by time.
|
5
|
+
- All `Augmented` objects now expose the complete set of time attribtues, so as to avoid having to fish around in the metadata.
|
6
|
+
|
1
7
|
## 0.1.3
|
2
8
|
|
3
9
|
- Fix issue making it difficult to extend CapabilityList
|
data/lib/resync/resource_list.rb
CHANGED
@@ -72,5 +72,22 @@ module Resync
|
|
72
72
|
def link_for(rel:)
|
73
73
|
links.find { |l| l.rel == rel }
|
74
74
|
end
|
75
|
+
|
76
|
+
def at_time
|
77
|
+
metadata.at_time if metadata
|
78
|
+
end
|
79
|
+
|
80
|
+
def from_time
|
81
|
+
metadata.from_time if metadata
|
82
|
+
end
|
83
|
+
|
84
|
+
def until_time
|
85
|
+
metadata.until_time if metadata
|
86
|
+
end
|
87
|
+
|
88
|
+
def completed_time
|
89
|
+
metadata.completed_time if metadata
|
90
|
+
end
|
91
|
+
|
75
92
|
end
|
76
93
|
end
|
@@ -8,8 +8,8 @@ module Resync
|
|
8
8
|
# must define a +CAPABILITY+ constant identifying the capability
|
9
9
|
# they represent (e.g. +resourcelist+, +changelist+).
|
10
10
|
#
|
11
|
-
# @!attribute [
|
12
|
-
# @return [
|
11
|
+
# @!attribute [r] resources
|
12
|
+
# @return [Util::IndexableLazy<Resource>] the +<url>+ or +<sitemap>+ elements contained in this list.
|
13
13
|
class BaseResourceList < Augmented
|
14
14
|
include ::XML::Mapping
|
15
15
|
|
@@ -40,7 +40,7 @@ module Resync
|
|
40
40
|
|
41
41
|
# Sets the +resources+ list. +nil+ is treated as an empty list.
|
42
42
|
def resources=(value)
|
43
|
-
@resources = value || []
|
43
|
+
@resources = Util::IndexableLazy.new(value || [])
|
44
44
|
end
|
45
45
|
|
46
46
|
# Sets the metadata.
|
@@ -61,9 +61,9 @@ module Resync
|
|
61
61
|
|
62
62
|
# Finds resources with the specified capability.
|
63
63
|
# @param capability [String] the capability.
|
64
|
-
# @return [
|
64
|
+
# @return [Enumerator::Lazy<Resource>] those resources having that capability, or an empty array if none exist.
|
65
65
|
def resources_for(capability:)
|
66
|
-
resources.select { |
|
66
|
+
resources.select { |r| r.capability == capability }
|
67
67
|
end
|
68
68
|
|
69
69
|
# Shortcut to find the first resource with the specified capability (in ResourceSync there often
|
@@ -71,7 +71,18 @@ module Resync
|
|
71
71
|
# @param capability [String] the capability.
|
72
72
|
# @return [Resource] the first resource having that capability, or nil if none exists.
|
73
73
|
def resource_for(capability:)
|
74
|
-
resources.find { |
|
74
|
+
resources.find { |r| r.capability == capability }
|
75
|
+
end
|
76
|
+
|
77
|
+
# Finds only those resources falling within the specified time range. Any of the time
|
78
|
+
# attributes (+:modified_time+, +:at_time+, +:completed_time+, +:from_time+, +:until_time+)
|
79
|
+
# can be used for filtering.
|
80
|
+
# @param time_range [Range[Time]] the range of acceptable times (inclusive or exclusive)
|
81
|
+
# @param time_attr [Symbol] the time type to filter on: +:modified_time+, +:at_time+,
|
82
|
+
# +:completed_time+, +:from_time+ or +:until_time+
|
83
|
+
# @return [Enumerator::Lazy<Resource>] a lazy enumeration of the resources within the specified range.
|
84
|
+
def resources_in(time_range:, time_attr:)
|
85
|
+
resources.select { |r| time_range.cover?(r.send(time_attr)) }
|
75
86
|
end
|
76
87
|
|
77
88
|
# ------------------------------------------------------------
|
@@ -109,7 +120,7 @@ module Resync
|
|
109
120
|
capability = self.class::CAPABILITY
|
110
121
|
fail ArgumentError, "Missing constant #{self.class}::CAPABILITY" unless capability
|
111
122
|
return Metadata.new(capability: capability) unless metadata
|
112
|
-
fail ArgumentError, "
|
123
|
+
fail ArgumentError, ":metadata argument <#{metadata}> does not appear to be metadata" unless metadata.respond_to?(:capability)
|
113
124
|
fail ArgumentError, "Wrong capability for #{self.class.name} metadata; expected '#{capability}', was '#{metadata.capability}'" unless metadata.capability == capability
|
114
125
|
metadata
|
115
126
|
end
|
@@ -48,12 +48,21 @@ module Resync
|
|
48
48
|
def sorted(value)
|
49
49
|
return [] unless value
|
50
50
|
value.sort do |left, right|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
compare(left, right)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def compare(left, right)
|
56
|
+
[:modified_time, :from_time, :at_time, :until_time, :completed_time].each do |time_reader|
|
57
|
+
left_time = left.send(time_reader)
|
58
|
+
right_time = right.send(time_reader)
|
59
|
+
if left_time && right_time
|
60
|
+
return left_time <=> right_time
|
61
|
+
elsif left_time || right_time
|
62
|
+
return left_time ? -1 : 1
|
55
63
|
end
|
56
64
|
end
|
65
|
+
0
|
57
66
|
end
|
58
67
|
|
59
68
|
def by_uri(resources)
|
data/lib/resync/util.rb
ADDED
data/lib/resync/version.rb
CHANGED
@@ -80,10 +80,10 @@ module Resync
|
|
80
80
|
it 'maps resources by capability' do
|
81
81
|
resources = valid_resources
|
82
82
|
capability_list = CapabilityList.new(resources: resources, links: [Link.new(rel: 'up', uri: 'http://example.org/')])
|
83
|
-
expect(capability_list.resources_for(capability: 'resourcelist')).to eq([resources[0]])
|
84
|
-
expect(capability_list.resources_for(capability: 'resourcedump')).to eq([resources[1]])
|
85
|
-
expect(capability_list.resources_for(capability: 'changelist')).to eq([resources[2]])
|
86
|
-
expect(capability_list.resources_for(capability: 'changedump')).to eq([resources[3]])
|
83
|
+
expect(capability_list.resources_for(capability: 'resourcelist').to_a).to eq([resources[0]])
|
84
|
+
expect(capability_list.resources_for(capability: 'resourcedump').to_a).to eq([resources[1]])
|
85
|
+
expect(capability_list.resources_for(capability: 'changelist').to_a).to eq([resources[2]])
|
86
|
+
expect(capability_list.resources_for(capability: 'changedump').to_a).to eq([resources[3]])
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -3,10 +3,7 @@ require_relative 'shared/base_resource_list_examples'
|
|
3
3
|
module Resync
|
4
4
|
describe ResourceListIndex do
|
5
5
|
it_behaves_like BaseResourceList
|
6
|
-
|
7
|
-
describe 'links' do
|
8
|
-
it_behaves_like Augmented
|
9
|
-
end
|
6
|
+
it_behaves_like Augmented
|
10
7
|
|
11
8
|
describe 'XML conversion' do
|
12
9
|
describe '#from_xml' do
|
@@ -3,10 +3,7 @@ require_relative 'shared/base_resource_list_examples'
|
|
3
3
|
module Resync
|
4
4
|
describe ResourceDumpManifest do
|
5
5
|
it_behaves_like BaseResourceList
|
6
|
-
|
7
|
-
describe 'links' do
|
8
|
-
it_behaves_like Augmented
|
9
|
-
end
|
6
|
+
it_behaves_like Augmented
|
10
7
|
|
11
8
|
describe 'XML conversion' do
|
12
9
|
describe '#from_xml' do
|
@@ -3,10 +3,7 @@ require_relative 'shared/base_resource_list_examples'
|
|
3
3
|
module Resync
|
4
4
|
describe ResourceDump do
|
5
5
|
it_behaves_like BaseResourceList
|
6
|
-
|
7
|
-
describe 'links' do
|
8
|
-
it_behaves_like Augmented
|
9
|
-
end
|
6
|
+
it_behaves_like Augmented
|
10
7
|
|
11
8
|
describe 'XML conversion' do
|
12
9
|
describe '#from_xml' do
|
@@ -3,10 +3,7 @@ require_relative 'shared/base_resource_list_examples'
|
|
3
3
|
module Resync
|
4
4
|
describe ResourceListIndex do
|
5
5
|
it_behaves_like BaseResourceList
|
6
|
-
|
7
|
-
describe 'links' do
|
8
|
-
it_behaves_like Augmented
|
9
|
-
end
|
6
|
+
it_behaves_like Augmented
|
10
7
|
|
11
8
|
describe 'XML conversion' do
|
12
9
|
describe '#from_xml' do
|
@@ -3,10 +3,7 @@ require_relative 'shared/base_resource_list_examples'
|
|
3
3
|
module Resync
|
4
4
|
describe ResourceList do
|
5
5
|
it_behaves_like BaseResourceList
|
6
|
-
|
7
|
-
describe 'links' do
|
8
|
-
it_behaves_like Augmented
|
9
|
-
end
|
6
|
+
it_behaves_like Augmented
|
10
7
|
|
11
8
|
describe 'XML conversion' do
|
12
9
|
describe '#from_xml' do
|
@@ -4,6 +4,13 @@ require_relative 'shared/augmented_examples'
|
|
4
4
|
|
5
5
|
module Resync
|
6
6
|
describe Resource do
|
7
|
+
|
8
|
+
def required_arguments
|
9
|
+
{ uri: 'http://example.org' }
|
10
|
+
end
|
11
|
+
|
12
|
+
it_behaves_like Augmented
|
13
|
+
|
7
14
|
describe '#new' do
|
8
15
|
|
9
16
|
describe 'uri' do
|
@@ -23,13 +30,6 @@ module Resync
|
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
26
|
-
describe 'links' do
|
27
|
-
def required_arguments
|
28
|
-
{ uri: 'http://example.org' }
|
29
|
-
end
|
30
|
-
it_behaves_like Augmented
|
31
|
-
end
|
32
|
-
|
33
33
|
describe 'metadata' do
|
34
34
|
it 'accepts metadata' do
|
35
35
|
md = Metadata.new
|
@@ -13,15 +13,14 @@ module Resync
|
|
13
13
|
describe 'links' do
|
14
14
|
it 'accepts a list of links' do
|
15
15
|
links = [Link.new(rel: 'describedby', uri: 'http://example.org/'), Link.new(rel: 'duplicate', uri: 'http://example.com/')]
|
16
|
-
|
17
|
-
expect(
|
16
|
+
augmented = new_instance(links: links)
|
17
|
+
expect(augmented.links).to eq(links)
|
18
18
|
end
|
19
19
|
|
20
|
-
it 'defaults to an empty
|
21
|
-
|
22
|
-
expect(
|
20
|
+
it 'defaults to an empty augmented if no links are specified' do
|
21
|
+
augmented = new_instance
|
22
|
+
expect(augmented.links).to eq([])
|
23
23
|
end
|
24
|
-
|
25
24
|
end
|
26
25
|
|
27
26
|
describe '#links_for' do
|
@@ -32,10 +31,10 @@ module Resync
|
|
32
31
|
Link.new(rel: 'describedby', uri: 'http://example.org/desc2'),
|
33
32
|
Link.new(rel: 'duplicate', uri: 'http://example.com/dup2')
|
34
33
|
]
|
35
|
-
|
36
|
-
expect(
|
37
|
-
expect(
|
38
|
-
expect(
|
34
|
+
augmented = new_instance(links: links)
|
35
|
+
expect(augmented.links_for(rel: 'describedby')).to eq([links[0], links[2]])
|
36
|
+
expect(augmented.links_for(rel: 'duplicate')).to eq([links[1], links[3]])
|
37
|
+
expect(augmented.links_for(rel: 'elvis')).to eq([])
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
@@ -47,10 +46,27 @@ module Resync
|
|
47
46
|
Link.new(rel: 'describedby', uri: 'http://example.org/desc2'),
|
48
47
|
Link.new(rel: 'duplicate', uri: 'http://example.com/dup2')
|
49
48
|
]
|
50
|
-
|
51
|
-
expect(
|
52
|
-
expect(
|
53
|
-
expect(
|
49
|
+
augmented = new_instance(links: links)
|
50
|
+
expect(augmented.link_for(rel: 'describedby')).to eq(links[0])
|
51
|
+
expect(augmented.link_for(rel: 'duplicate')).to eq(links[1])
|
52
|
+
expect(augmented.link_for(rel: 'elvis')).to eq(nil)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'additional time attributes' do
|
57
|
+
it 'extracts the at_time, from_time, until_time, and completed_time from the metadata' do
|
58
|
+
capability = described_class::CAPABILITY if defined?(described_class::CAPABILITY)
|
59
|
+
md = Metadata.new(
|
60
|
+
at_time: Time.utc(1999, 1, 1),
|
61
|
+
from_time: Time.utc(2001, 1, 1),
|
62
|
+
until_time: Time.utc(2003, 1, 1),
|
63
|
+
completed_time: Time.utc(2005, 1, 1),
|
64
|
+
capability: capability
|
65
|
+
)
|
66
|
+
augmented = new_instance(metadata: md)
|
67
|
+
[:at_time, :from_time, :until_time, :completed_time].each do |t|
|
68
|
+
expect(augmented.send(t)).to be_time(md.send(t))
|
69
|
+
end
|
54
70
|
end
|
55
71
|
end
|
56
72
|
|
@@ -9,7 +9,12 @@ module Resync
|
|
9
9
|
|
10
10
|
# TODO: Find a better way to express this
|
11
11
|
def resource_list
|
12
|
-
(defined? valid_resources) ? valid_resources : [
|
12
|
+
(defined? valid_resources) ? valid_resources : [
|
13
|
+
Resource.new(uri: 'http://example.com/res1'),
|
14
|
+
Resource.new(uri: 'http://example.com/res2'),
|
15
|
+
Resource.new(uri: 'http://example.com/res3'),
|
16
|
+
Resource.new(uri: 'http://example.com/res4')
|
17
|
+
]
|
13
18
|
end
|
14
19
|
|
15
20
|
# TODO: Find a better way to express this
|
@@ -25,15 +30,34 @@ module Resync
|
|
25
30
|
describe '#new' do
|
26
31
|
describe 'resources' do
|
27
32
|
it 'accepts a list of resources' do
|
28
|
-
puts defined? valid_resources
|
29
33
|
resources = resource_list
|
30
34
|
list = new_instance(resources: resources)
|
31
|
-
expect(list.resources).to eq(resources)
|
35
|
+
expect(list.resources.to_a).to eq(resources)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is lazy' do
|
39
|
+
resources = resource_list
|
40
|
+
list = new_instance(resources: resources)
|
41
|
+
|
42
|
+
half = resources.size / 2
|
43
|
+
(0...resources.size).each do |i|
|
44
|
+
if i < half
|
45
|
+
expect(resources[i]).to receive(:priority).and_return(i)
|
46
|
+
else
|
47
|
+
expect(resources[i]).not_to receive(:priority)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
count = 0
|
52
|
+
list.resources.take(half).each do |r|
|
53
|
+
expect(r.priority).to eq(count)
|
54
|
+
count += 1
|
55
|
+
end
|
32
56
|
end
|
33
57
|
|
34
58
|
it 'defaults to an empty list if no resources are specified' do
|
35
59
|
list = new_instance
|
36
|
-
expect(list.resources).to eq([])
|
60
|
+
expect(list.resources.to_a).to eq([])
|
37
61
|
end
|
38
62
|
end
|
39
63
|
|
@@ -67,9 +91,9 @@ module Resync
|
|
67
91
|
Resource.new(uri: 'http://example.com/dataset1/changelist2.xml', metadata: Metadata.new(capability: 'changelist'))
|
68
92
|
]
|
69
93
|
list = new_instance(resources: resources)
|
70
|
-
expect(list.resources_for(capability: 'resourcedump')).to eq([resources[0], resources[2]])
|
71
|
-
expect(list.resources_for(capability: 'changelist')).to eq([resources[1], resources[3]])
|
72
|
-
expect(list.resources_for(capability: 'changedump')).to eq([])
|
94
|
+
expect(list.resources_for(capability: 'resourcedump').to_a).to eq([resources[0], resources[2]])
|
95
|
+
expect(list.resources_for(capability: 'changelist').to_a).to eq([resources[1], resources[3]])
|
96
|
+
expect(list.resources_for(capability: 'changedump').to_a).to eq([])
|
73
97
|
end
|
74
98
|
end
|
75
99
|
end
|
@@ -91,7 +115,7 @@ module Resync
|
|
91
115
|
end
|
92
116
|
end
|
93
117
|
|
94
|
-
describe 'capability' do
|
118
|
+
describe '#capability' do
|
95
119
|
it 'extracts the capability' do
|
96
120
|
metadata = Metadata.new(capability: described_class::CAPABILITY)
|
97
121
|
list = new_instance(metadata: metadata)
|
@@ -99,5 +123,48 @@ module Resync
|
|
99
123
|
end
|
100
124
|
end
|
101
125
|
|
126
|
+
describe '#resources_in' do
|
127
|
+
[:at_time, :completed_time, :from_time, :until_time, :modified_time].each do |reader|
|
128
|
+
it "allows filtering by #{reader}" do
|
129
|
+
before_time = Time.utc(1969, 1, 1)
|
130
|
+
start_time = Time.utc(1970, 1, 1)
|
131
|
+
end_time = Time.utc(1980, 1, 1)
|
132
|
+
after_time = Time.utc(1981, 1, 1)
|
133
|
+
times = [before_time, start_time, end_time, after_time]
|
134
|
+
|
135
|
+
writer = "#{reader}=".to_sym
|
136
|
+
resources = resource_list
|
137
|
+
resources.each_with_index do |r, i|
|
138
|
+
if writer == :modified_time=
|
139
|
+
r.send(writer, times[i])
|
140
|
+
else
|
141
|
+
md = r.metadata || (r.metadata = Metadata.new)
|
142
|
+
md.send(writer, times[i])
|
143
|
+
end
|
144
|
+
expect(r.send(reader)).to be_time(times[i]) # just to be sure
|
145
|
+
end
|
146
|
+
|
147
|
+
list = new_instance(resources: resources, metadata: Metadata.new(capability: described_class::CAPABILITY))
|
148
|
+
|
149
|
+
range_inclusive = start_time..end_time
|
150
|
+
|
151
|
+
filtered = list.resources_in(time_range: range_inclusive, time_attr: reader).to_a
|
152
|
+
expect(filtered.size).to eq(2)
|
153
|
+
expect(filtered).not_to include(resources[0])
|
154
|
+
expect(filtered).to include(resources[1])
|
155
|
+
expect(filtered).to include(resources[2])
|
156
|
+
expect(filtered).not_to include(resources[3])
|
157
|
+
|
158
|
+
range_exclusive = start_time...end_time
|
159
|
+
filtered = list.resources_in(time_range: range_exclusive, time_attr: reader).to_a
|
160
|
+
expect(filtered.size).to eq(1)
|
161
|
+
expect(filtered).not_to include(resources[0])
|
162
|
+
expect(filtered).to include(resources[1])
|
163
|
+
expect(filtered).not_to include(resources[2])
|
164
|
+
expect(filtered).not_to include(resources[3])
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
102
169
|
end
|
103
170
|
end
|
@@ -24,7 +24,20 @@ module Resync
|
|
24
24
|
resource0 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1997, 7, 16, 19, 20, 30.45))
|
25
25
|
resource1 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1998, 7, 16, 19, 20, 30.45))
|
26
26
|
list = new_instance(resources: [resource1, resource0])
|
27
|
-
expect(list.resources).to eq([resource0, resource1])
|
27
|
+
expect(list.resources.to_a).to eq([resource0, resource1])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is non-destructive when sorting resources with identical times' do
|
31
|
+
resource0 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1997, 7, 16, 19, 20, 30.45))
|
32
|
+
resource1 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1998, 7, 16, 19, 20, 30.45))
|
33
|
+
resource2 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1998, 7, 16, 19, 20, 30.45))
|
34
|
+
resource4 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1998, 1, 16, 19, 20, 30.45))
|
35
|
+
list = new_instance(resources: [resource1, resource4, resource2, resource0])
|
36
|
+
resources = list.resources.to_a
|
37
|
+
expect(resources[0]).to be(resource0)
|
38
|
+
expect(resources[1]).to be(resource4)
|
39
|
+
expect(resources).to include(resource1)
|
40
|
+
expect(resources).to include(resource2)
|
28
41
|
end
|
29
42
|
|
30
43
|
it 'sorts resources with modified_time before resources without' do
|
@@ -32,7 +45,44 @@ module Resync
|
|
32
45
|
resource1 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(1998, 7, 16, 19, 20, 30.45))
|
33
46
|
resource2 = Resource.new(uri: 'http://example.com')
|
34
47
|
list = new_instance(resources: [resource1, resource2, resource0])
|
35
|
-
expect(list.resources).to eq([resource0, resource1, resource2])
|
48
|
+
expect(list.resources.to_a).to eq([resource0, resource1, resource2])
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'sorts resources by from_time' do
|
52
|
+
resource0 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(from_time: Time.utc(1997, 7, 16, 19, 20, 30.45)))
|
53
|
+
resource1 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(from_time: Time.utc(1998, 7, 16, 19, 20, 30.45)))
|
54
|
+
list = new_instance(resources: [resource1, resource0])
|
55
|
+
expect(list.resources.to_a).to eq([resource0, resource1])
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'sorts resources by at_time' do
|
59
|
+
resource0 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(at_time: Time.utc(1997, 7, 16, 19, 20, 30.45)))
|
60
|
+
resource1 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(at_time: Time.utc(1998, 7, 16, 19, 20, 30.45)))
|
61
|
+
list = new_instance(resources: [resource1, resource0])
|
62
|
+
expect(list.resources.to_a).to eq([resource0, resource1])
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'sorts resources by until_time' do
|
66
|
+
resource0 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(until_time: Time.utc(1997, 7, 16, 19, 20, 30.45)))
|
67
|
+
resource1 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(until_time: Time.utc(1998, 7, 16, 19, 20, 30.45)))
|
68
|
+
list = new_instance(resources: [resource1, resource0])
|
69
|
+
expect(list.resources.to_a).to eq([resource0, resource1])
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'sorts resources by completed_time' do
|
73
|
+
resource0 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(completed_time: Time.utc(1997, 7, 16, 19, 20, 30.45)))
|
74
|
+
resource1 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(completed_time: Time.utc(1998, 7, 16, 19, 20, 30.45)))
|
75
|
+
list = new_instance(resources: [resource1, resource0])
|
76
|
+
expect(list.resources.to_a).to eq([resource0, resource1])
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'preferentially sorts by modified_time' do
|
80
|
+
resource0 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(at_time: Time.utc(1998, 7, 16, 19, 20, 30.45)))
|
81
|
+
resource1 = Resource.new(uri: 'http://example.org', metadata: Metadata.new(at_time: Time.utc(1997, 7, 16, 19, 20, 30.45)))
|
82
|
+
resource2 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(2001, 7, 16, 19, 20, 30.45), metadata: Metadata.new(at_time: Time.utc(2003, 7, 16, 19, 20, 30.45)))
|
83
|
+
resource3 = Resource.new(uri: 'http://example.org', modified_time: Time.utc(2000, 1, 16, 19, 20, 30.45), metadata: Metadata.new(at_time: Time.utc(2005, 7, 16, 19, 20, 30.45)))
|
84
|
+
list = new_instance(resources: [resource0, resource1, resource2, resource3])
|
85
|
+
expect(list.resources.to_a).to eq([resource3, resource2, resource1, resource0])
|
36
86
|
end
|
37
87
|
end
|
38
88
|
end
|
@@ -5,10 +5,7 @@ require_relative 'shared/augmented_examples'
|
|
5
5
|
module Resync
|
6
6
|
describe SourceDescription do
|
7
7
|
it_behaves_like BaseResourceList
|
8
|
-
|
9
|
-
describe 'links' do
|
10
|
-
it_behaves_like Augmented
|
11
|
-
end
|
8
|
+
it_behaves_like Augmented
|
12
9
|
|
13
10
|
describe 'XML conversion' do
|
14
11
|
describe '#from_xml' do
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Resync
|
4
|
+
module Util
|
5
|
+
describe IndexableLazy do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@size = 3
|
9
|
+
@array = Array.new(@size) { instance_double(Object) }
|
10
|
+
@lazy = IndexableLazy.new(@array)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#size' do
|
14
|
+
it 'returns the size of the underlying array' do
|
15
|
+
expect(@lazy.size).to eq(@size)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#[]' do
|
20
|
+
it 'is lazy' do
|
21
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
22
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
23
|
+
expect(@array[2]).not_to receive(:to_s)
|
24
|
+
|
25
|
+
(0...@lazy.size).each do |i|
|
26
|
+
expect(@lazy[i]).to eq(@array[i])
|
27
|
+
break if @lazy[i].to_s == '1'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#each' do
|
33
|
+
it 'is lazy' do
|
34
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
35
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
36
|
+
expect(@array[2]).not_to receive(:to_s)
|
37
|
+
|
38
|
+
@lazy.each do |v|
|
39
|
+
break if v.to_s == '1'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#each_with_index' do
|
45
|
+
it 'is lazy' do
|
46
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
47
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
48
|
+
expect(@array[2]).not_to receive(:to_s)
|
49
|
+
|
50
|
+
@lazy.each_with_index do |v, i|
|
51
|
+
break if v.to_s == '1' || i > 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#each_with_object' do
|
57
|
+
it 'is lazy' do
|
58
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
59
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
60
|
+
expect(@array[2]).not_to receive(:to_s)
|
61
|
+
|
62
|
+
acc = []
|
63
|
+
@lazy.each_with_object(acc) do |v, obj|
|
64
|
+
obj << v.to_s
|
65
|
+
break if obj[-1] == '1'
|
66
|
+
end
|
67
|
+
expect(acc).to eq(%w(0 1))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#find' do
|
72
|
+
it 'is lazy' do
|
73
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
74
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
75
|
+
expect(@array[2]).not_to receive(:to_s)
|
76
|
+
|
77
|
+
expect(@lazy.find { |v| v.to_s == '1' }).to be(@array[1])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#find_index' do
|
82
|
+
it 'is lazy' do
|
83
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
84
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
85
|
+
expect(@array[2]).not_to receive(:to_s)
|
86
|
+
|
87
|
+
expect(@lazy.find_index { |v| v.to_s == '1' }).to eq(1)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#take_while' do
|
92
|
+
it 'is lazy' do
|
93
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
94
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
95
|
+
expect(@array[2]).not_to receive(:to_s)
|
96
|
+
|
97
|
+
expect(@lazy.take_while { |v| v.to_s == '0' }.to_a).to eq([@array[0]])
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#map' do
|
102
|
+
it 'is lazy' do
|
103
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
104
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
105
|
+
expect(@array[2]).not_to receive(:to_s)
|
106
|
+
|
107
|
+
mapped = @lazy.map(&:to_s)
|
108
|
+
expect(mapped.take(2).to_a).to eq(%w(0 1))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '#take' do
|
113
|
+
it 'is lazy' do
|
114
|
+
expect(@array[0]).to receive(:to_s).and_return('0')
|
115
|
+
expect(@array[1]).to receive(:to_s).and_return('1')
|
116
|
+
expect(@array[2]).not_to receive(:to_s)
|
117
|
+
|
118
|
+
expect(@lazy.take(2).map(&:to_s).to_a).to eq(%w(0 1))
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe '#select' do
|
123
|
+
it 'is lazy' do
|
124
|
+
expect(@array[0]).not_to receive(:to_s)
|
125
|
+
expect(@array[1]).not_to receive(:to_s)
|
126
|
+
expect(@array[2]).not_to receive(:to_s)
|
127
|
+
|
128
|
+
@lazy.select(&:to_s)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Moles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mime-types
|
@@ -191,6 +191,8 @@ files:
|
|
191
191
|
- lib/resync/types.rb
|
192
192
|
- lib/resync/types/change.rb
|
193
193
|
- lib/resync/types/change_frequency.rb
|
194
|
+
- lib/resync/util.rb
|
195
|
+
- lib/resync/util/indexable_lazy.rb
|
194
196
|
- lib/resync/version.rb
|
195
197
|
- lib/resync/xml.rb
|
196
198
|
- lib/resync/xml_parser.rb
|
@@ -256,6 +258,7 @@ files:
|
|
256
258
|
- spec/unit/resync/shared/sorted_list_examples.rb
|
257
259
|
- spec/unit/resync/shared/uri_field_examples.rb
|
258
260
|
- spec/unit/resync/source_description_spec.rb
|
261
|
+
- spec/unit/resync/util/indexable_lazy_spec.rb
|
259
262
|
- spec/unit/resync/xml/timenode_spec.rb
|
260
263
|
- spec/unit/resync/xml/xml_spec.rb
|
261
264
|
- spec/unit/resync/xml_parser_spec.rb
|
@@ -279,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
282
|
version: '0'
|
280
283
|
requirements: []
|
281
284
|
rubyforge_project:
|
282
|
-
rubygems_version: 2.4.
|
285
|
+
rubygems_version: 2.4.7
|
283
286
|
signing_key:
|
284
287
|
specification_version: 4
|
285
288
|
summary: Utility library for ResourceSync
|
@@ -345,6 +348,7 @@ test_files:
|
|
345
348
|
- spec/unit/resync/shared/sorted_list_examples.rb
|
346
349
|
- spec/unit/resync/shared/uri_field_examples.rb
|
347
350
|
- spec/unit/resync/source_description_spec.rb
|
351
|
+
- spec/unit/resync/util/indexable_lazy_spec.rb
|
348
352
|
- spec/unit/resync/xml/timenode_spec.rb
|
349
353
|
- spec/unit/resync/xml/xml_spec.rb
|
350
354
|
- spec/unit/resync/xml_parser_spec.rb
|