resync-client 0.2.3 → 0.2.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f077335c97ed2009691229c16b7a09a67dcdd26a
4
- data.tar.gz: 6e9ead882a801b98dfcae84a79a144829eafc624
3
+ metadata.gz: 8314c851c5631164009f9a2d88d0c3d403cc70ad
4
+ data.tar.gz: 533203c8b735acb0c29063efa8112feb80921e45
5
5
  SHA512:
6
- metadata.gz: 7e624c546a773172d6001790e28bbd1a1a2ed1dfde653ec2e8b22e30dbd463e1e7390ae335fde5a396bb2b10ee53333582cfbc291a0a7a582d88991332148422
7
- data.tar.gz: bc379b7fdbe407d309c6da128724a805dcd88c016750b71d17da4cee7f8b847ec13ba63f2533b476bb7fd948a81e9168a45833938d9713092c08a04646a4bbce
6
+ metadata.gz: 2be76b5aaf5d2141a009ef77336ebb1d78877971d94a1069e369bb25e97251726b548898f3906e9852097e53cde6ec28f68638bebfd14c90f6c124bddbcd14d9
7
+ data.tar.gz: 0071b77513fc26fee16832f7885e414801e65c4895df3911c4093b5fff0c187c478209605447db5cf9f27eb97a4ae5e457bb093f436eed3bf7cce0c03fe5439c
data/.gitignore CHANGED
@@ -15,15 +15,9 @@
15
15
  *.a
16
16
  mkmf.log
17
17
 
18
- # Rails engine
19
-
20
- .bundle/
21
- log/*.log
22
- spec/dummy/db/*.sqlite3
23
- spec/dummy/db/*.sqlite3-journal
24
- spec/dummy/log/*.log
25
- spec/dummy/tmp/
26
- spec/dummy/.sass-cache
18
+ # gem build
19
+
20
+ *.gem
27
21
 
28
22
  # IntellJ
29
23
 
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.2.4
2
+
3
+ - Added `#all_resources` to transparently download and flatten lists in `ChangeListIndex` and `ResourceListIndex`
4
+ - Added `#all_zip_packages` to transparently download and flatten dumps in `ChangeDumpIndex` and `ResourceDumpIndex`
5
+ - Fix issue where documentation on mixin modules was mistakenly applied to the `Resync` module
6
+
1
7
  # 0.2.3
2
8
 
3
9
  - Update to depend on [resync](https://github.com/dmolesUC3/resync) 0.2.2
@@ -1,13 +1,13 @@
1
1
  require_relative '../zip'
2
2
 
3
- # A resource that refers to a bitsream within a zipped bitstream package.
4
- #
5
- # @!attribute [rw] zip_package_delegate
6
- # @return [ZipPackage] the provider of the containing package,
7
- # e.g. its manifest
8
3
  module Resync
9
4
  class Client
10
5
  module Mixins
6
+ # A resource that refers to a bitsream within a zipped bitstream package.
7
+ #
8
+ # @!attribute [rw] zip_package_delegate
9
+ # @return [ZipPackage] the provider of the containing package,
10
+ # e.g. its manifest
11
11
  module BitstreamResource
12
12
  attr_accessor :zip_package_delegate
13
13
 
@@ -1,13 +1,13 @@
1
1
  require_relative '../../client'
2
2
 
3
- # An object that delegates to another to provide a {Client} for downloading
4
- # resources and links.
5
- #
6
- # @!attribute [rw] client_delegate
7
- # @return [#client] The client provider.
8
3
  module Resync
9
4
  class Client
10
5
  module Mixins
6
+ # An object that delegates to another to provide a {Client} for downloading
7
+ # resources and links.
8
+ #
9
+ # @!attribute [rw] client_delegate
10
+ # @return [#client] The client provider.
11
11
  module ClientDelegator
12
12
  attr_accessor :client_delegate
13
13
 
@@ -1,9 +1,10 @@
1
+ require 'resync'
1
2
  require_relative 'client_delegator'
2
3
 
3
- # A downloadable resource or link.
4
4
  module Resync
5
5
  class Client
6
6
  module Mixins
7
+ # A downloadable resource or link.
7
8
  module Downloadable
8
9
  prepend ClientDelegator
9
10
 
@@ -33,4 +34,12 @@ module Resync
33
34
  end
34
35
  end
35
36
  end
37
+
38
+ class Link
39
+ prepend Client::Mixins::Downloadable
40
+ end
41
+
42
+ class Resource
43
+ prepend Client::Mixins::Downloadable
44
+ end
36
45
  end
@@ -1,14 +1,16 @@
1
+ require 'resync'
1
2
  require_relative '../zip'
2
3
  require_relative 'zipped_resource'
3
4
 
4
- # A list of resources each of which refers to a zipped bitstream package.
5
5
  module Resync
6
6
  class Client
7
7
  module Mixins
8
- module ZippedResourceList
8
+ # A list of resources each of which refers to a zipped bitstream package.
9
+ module Dump
9
10
  def resources=(value)
10
11
  super
11
12
  resources.each do |r|
13
+ next if r.respond_to?(:zip_package)
12
14
  class << r
13
15
  prepend ZippedResource
14
16
  end
@@ -23,4 +25,12 @@ module Resync
23
25
  end
24
26
  end
25
27
  end
28
+
29
+ class ResourceDump
30
+ prepend Client::Mixins::Dump
31
+ end
32
+
33
+ class ChangeDump
34
+ prepend Client::Mixins::Dump
35
+ end
26
36
  end
@@ -0,0 +1,33 @@
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 {ZippedResourceList}s
8
+ module DumpIndex
9
+ prepend ResourceClientDelegate
10
+
11
+ # Downloads and parses each resource list and returns a flattened enumeration
12
+ # of all zip packages in each contained list. Each contained list is only downloaded
13
+ # as needed, and only downloaded once.
14
+ # @return [Enumerator::Lazy<Resync::Client::Zip::ZipPackages>] the flattened enumeration of resources
15
+ def all_zip_packages
16
+ @zipped_resource_lists ||= {}
17
+ resources.flat_map do |r|
18
+ @zipped_resource_lists[r] ||= r.get_and_parse
19
+ @zipped_resource_lists[r].respond_to?(:zip_packages) ? @zipped_resource_lists[r].zip_packages : []
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ class ChangeDumpIndex
27
+ prepend Client::Mixins::DumpIndex
28
+ end
29
+
30
+ class ResourceDumpIndex
31
+ prepend Client::Mixins::DumpIndex
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ require 'resync'
2
+ require_relative '../zip'
3
+ require_relative 'bitstream_resource'
4
+
5
+ module Resync
6
+ class Client
7
+ module Mixins
8
+ # A list of resources within a single zipped bitstream package, e.g. as provided
9
+ # by the package manifest.
10
+ #
11
+ # @!attribute [rw] zip_package
12
+ # @return [ZipPackage] the package.
13
+ module DumpManifest
14
+ attr_accessor :zip_package
15
+
16
+ # Makes each provided resource a {BitstreamResource}
17
+ # @param value [Array<Resource>] the resources for this list
18
+ def resources=(value)
19
+ super
20
+ resources.each do |r|
21
+ unless r.respond_to?(:bitstream) && r.respond_to?(:containing_package)
22
+ class << r
23
+ prepend BitstreamResource
24
+ end
25
+ end
26
+ r.zip_package_delegate = self
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ class ResourceDumpManifest
34
+ prepend Client::Mixins::DumpManifest
35
+ end
36
+
37
+ class ChangeDumpManifest
38
+ prepend Client::Mixins::DumpManifest
39
+ end
40
+ end
@@ -1,9 +1,10 @@
1
+ require 'resync'
1
2
  require_relative 'client_delegator'
2
3
 
3
- # A link container that is capable of providing those resources with a {Client}
4
4
  module Resync
5
5
  class Client
6
6
  module Mixins
7
+ # A link container that is capable of providing those resources with a {Client}
7
8
  module LinkClientDelegate
8
9
  prepend ClientDelegator
9
10
 
@@ -16,4 +17,8 @@ module Resync
16
17
  end
17
18
  end
18
19
  end
20
+
21
+ class Augmented
22
+ prepend Client::Mixins::LinkClientDelegate
23
+ end
19
24
  end
@@ -0,0 +1,33 @@
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, themselves, resource containers
8
+ module ListIndex
9
+ prepend ResourceClientDelegate
10
+
11
+ # Downloads and parses each resource list and returns a flattened enumeration
12
+ # of all resources in each contained list. Each contained list is only downloaded
13
+ # as needed, and only downloaded once.
14
+ # @return [Enumerator::Lazy<Resync::Resource>] the flattened enumeration of resources
15
+ def all_resources
16
+ @resource_lists ||= {}
17
+ resources.flat_map do |r|
18
+ @resource_lists[r] ||= r.get_and_parse
19
+ @resource_lists[r].resources
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ class ChangeListIndex
27
+ prepend Client::Mixins::ListIndex
28
+ end
29
+
30
+ class ResourceListIndex
31
+ prepend Client::Mixins::ListIndex
32
+ end
33
+ end
@@ -1,9 +1,10 @@
1
+ require 'resync'
1
2
  require_relative 'client_delegator'
2
3
 
3
- # A resource container that is capable of providing those resources with a {Client}
4
4
  module Resync
5
5
  class Client
6
6
  module Mixins
7
+ # A resource container that is capable of providing those resources with a {Client}
7
8
  module ResourceClientDelegate
8
9
  prepend ClientDelegator
9
10
 
@@ -16,4 +17,8 @@ module Resync
16
17
  end
17
18
  end
18
19
  end
20
+
21
+ class BaseResourceList
22
+ prepend Client::Mixins::ResourceClientDelegate
23
+ end
19
24
  end
@@ -1,10 +1,10 @@
1
1
  require_relative '../zip'
2
2
  require_relative 'downloadable'
3
3
 
4
- # A resource that refers to a zipped bitstream package.
5
4
  module Resync
6
5
  class Client
7
6
  module Mixins
7
+ # A resource that refers to a zipped bitstream package.
8
8
  module ZippedResource
9
9
  prepend Downloadable
10
10
 
@@ -12,6 +12,7 @@ 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
15
16
  @zip_package ||= Resync::Client::Zip::ZipPackage.new(download_to_temp_file)
16
17
  end
17
18
  end
@@ -1,6 +1,6 @@
1
1
  module Resync
2
2
  class Client
3
3
  # The version of this gem.
4
- VERSION = '0.2.3'
4
+ VERSION = '0.2.4'
5
5
  end
6
6
  end
@@ -1,6 +1,6 @@
1
1
  require 'zip'
2
2
  require 'resync'
3
- require_relative '../../extensions'
3
+ require_relative '../mixins'
4
4
  require_relative 'bitstream'
5
5
 
6
6
  module Resync
@@ -1,5 +1,5 @@
1
1
  require 'resync'
2
- require_relative '../../extensions'
2
+ require_relative '../mixins'
3
3
  require_relative 'zip_package'
4
4
 
5
5
  module Resync
@@ -53,6 +53,16 @@ module Resync
53
53
  yield package_for(resource)
54
54
  end
55
55
  end
56
+
57
+ # Eagerly gets the zip package for each resource, downloading
58
+ # as necessary. (For compatbility with {::Enumerator::Lazy#flat_map})
59
+ # @return [Array<ZipPackage>] the zip package for each resource
60
+ def force
61
+ @resources.map { |r| package_for(r) }.to_a
62
+ end
63
+
64
+ # Alias for {#force} (for compatbility with {::Enumerable#flat_map})
65
+ alias_method :to_ary, :force
56
66
  end
57
67
  end
58
68
  end
data/lib/resync/client.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'resync'
2
- require_relative 'extensions'
2
+ require_relative 'client/mixins'
3
3
 
4
4
  Dir.glob(File.expand_path('../client/*.rb', __FILE__), &method(:require))
5
5
 
@@ -0,0 +1,24 @@
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:ln rel="index"
7
+ href="http://example.com/dataset1/resourcelist-index.xml"/>
8
+ <rs:md capability="resourcelist"
9
+ at="2013-01-03T09:00:00Z"/>
10
+ <url>
11
+ <loc>http://example.com/res1</loc>
12
+ <lastmod>2013-01-02T13:00:00Z</lastmod>
13
+ <rs:md hash="md5:1584abdf8ebdc9802ac0c6a7402c8753"
14
+ length="4385"
15
+ type="application/pdf"/>
16
+ </url>
17
+ <url>
18
+ <loc>http://example.com/res2</loc>
19
+ <lastmod>2013-01-02T14:00:00Z</lastmod>
20
+ <rs:md hash="md5:4556abdf8ebdc9802ac0c6a7402c9881"
21
+ length="883"
22
+ type="image/png"/>
23
+ </url>
24
+ </urlset>
@@ -0,0 +1,24 @@
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:ln rel="index"
7
+ href="http://example.com/dataset1/resourcelist-index.xml"/>
8
+ <rs:md capability="resourcelist"
9
+ at="2013-01-03T09:00:00Z"/>
10
+ <url>
11
+ <loc>http://example.com/res3</loc>
12
+ <lastmod>2013-01-02T13:00:00Z</lastmod>
13
+ <rs:md hash="md5:1584abdf8ebdc9802ac0c6a7402c8753"
14
+ length="4385"
15
+ type="application/pdf"/>
16
+ </url>
17
+ <url>
18
+ <loc>http://example.com/res4</loc>
19
+ <lastmod>2013-01-02T14:00:00Z</lastmod>
20
+ <rs:md hash="md5:4556abdf8ebdc9802ac0c6a7402c9881"
21
+ length="883"
22
+ type="image/png"/>
23
+ </url>
24
+ </urlset>
@@ -0,0 +1,24 @@
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:ln rel="index"
7
+ href="http://example.com/dataset1/resourcelist-index.xml"/>
8
+ <rs:md capability="resourcelist"
9
+ at="2013-01-03T09:00:00Z"/>
10
+ <url>
11
+ <loc>http://example.com/res5</loc>
12
+ <lastmod>2013-01-02T13:00:00Z</lastmod>
13
+ <rs:md hash="md5:1584abdf8ebdc9802ac0c6a7402c8753"
14
+ length="4385"
15
+ type="application/pdf"/>
16
+ </url>
17
+ <url>
18
+ <loc>http://example.com/res6</loc>
19
+ <lastmod>2013-01-02T14:00:00Z</lastmod>
20
+ <rs:md hash="md5:4556abdf8ebdc9802ac0c6a7402c9881"
21
+ length="883"
22
+ type="image/png"/>
23
+ </url>
24
+ </urlset>
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ module Resync
4
+ class Client
5
+ module Mixins
6
+ describe DumpIndex do
7
+ before(:each) do
8
+ @helper = instance_double(Client::HTTPHelper)
9
+ @client = Client.new(helper: @helper)
10
+ end
11
+
12
+ describe '#all_zip_packages' do
13
+ it 'flattens the child resourcelists' do
14
+ resources = Array.new(6) { instance_double(ZippedResource) }
15
+ all_zip_packages = Array.new(6) do |i|
16
+ zip_package = instance_double(Zip::ZipPackage)
17
+ expect(resources[i]).to receive(:zip_package).once.and_return(zip_package)
18
+ allow(resources[i]).to receive(:client_delegate=)
19
+ zip_package
20
+ end
21
+
22
+ dump1 = ResourceDump.new(resources: resources[0, 3])
23
+ dump2 = ResourceDump.new(resources: resources[3, 3])
24
+
25
+ dump1_resource = instance_double(Resource)
26
+ allow(dump1_resource).to receive(:client_delegate=)
27
+ expect(dump1_resource).to receive(:get_and_parse).and_return(dump1)
28
+
29
+ dump2_resource = instance_double(Resource)
30
+ allow(dump2_resource).to receive(:client_delegate=)
31
+ expect(dump2_resource).to receive(:get_and_parse).and_return(dump2)
32
+
33
+ index = ResourceDumpIndex.new(resources: [dump1_resource, dump2_resource])
34
+ all_packages = index.all_zip_packages
35
+
36
+ expect(all_packages.to_a).to eq(all_zip_packages)
37
+ end
38
+
39
+ it 'is lazy enough not to download anything till it\'s iterated' do
40
+ dump1_resource = instance_double(Resource)
41
+ allow(dump1_resource).to receive(:client_delegate=)
42
+ expect(dump1_resource).not_to receive(:get_and_parse)
43
+
44
+ dump2_resource = instance_double(Resource)
45
+ allow(dump2_resource).to receive(:client_delegate=)
46
+ expect(dump2_resource).not_to receive(:get_and_parse)
47
+
48
+ index = ResourceDumpIndex.new(resources: [dump1_resource, dump2_resource])
49
+ index.all_zip_packages
50
+ end
51
+
52
+ it 'is lazy enough not to download resources it doesn\'t need' do
53
+ resources = Array.new(3) { instance_double(ZippedResource) }
54
+ resources.each do |r|
55
+ allow(r).to receive(:client_delegate=)
56
+ zip_package = instance_double(Zip::ZipPackage)
57
+ expect(r).to receive(:zip_package).once.and_return(zip_package)
58
+ end
59
+
60
+ dump1 = ResourceDump.new(resources: resources[0, 3])
61
+
62
+ dump1_resource = instance_double(Resource)
63
+ allow(dump1_resource).to receive(:client_delegate=)
64
+ expect(dump1_resource).to receive(:get_and_parse).and_return(dump1)
65
+
66
+ dump2_resource = instance_double(Resource)
67
+ allow(dump2_resource).to receive(:client_delegate=)
68
+ expect(dump2_resource).not_to receive(:get_and_parse)
69
+
70
+ index = ResourceDumpIndex.new(resources: [dump1_resource, dump2_resource])
71
+ index.all_zip_packages.each_with_index do |_, i|
72
+ break if i >= 2
73
+ end
74
+ end
75
+
76
+ it 'caches downloaded resources' do
77
+ resources = Array.new(6) { instance_double(ZippedResource) }
78
+ resources.each do |r|
79
+ allow(r).to receive(:client_delegate=)
80
+ zip_package = instance_double(Zip::ZipPackage)
81
+ expect(r).to receive(:zip_package).once.and_return(zip_package)
82
+ end
83
+
84
+ dump1 = ResourceDump.new(resources: resources[0, 3])
85
+ dump2 = ResourceDump.new(resources: resources[3, 3])
86
+
87
+ dump1_resource = instance_double(Resource)
88
+ allow(dump1_resource).to receive(:client_delegate=)
89
+ expect(dump1_resource).to receive(:get_and_parse).once.and_return(dump1)
90
+
91
+ dump2_resource = instance_double(Resource)
92
+ allow(dump2_resource).to receive(:client_delegate=)
93
+ expect(dump2_resource).to receive(:get_and_parse).once.and_return(dump2)
94
+
95
+ index = ResourceDumpIndex.new(resources: [dump1_resource, dump2_resource])
96
+ all_packages = index.all_zip_packages
97
+
98
+ a1 = all_packages.to_a
99
+ a2 = all_packages.to_a
100
+ a1.each_with_index do |pkg, i|
101
+ expect(pkg).to be(a2[i])
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module Resync
4
4
  class Client
5
5
  module Mixins
6
- describe ZippedResourceList do
6
+ describe Dump do
7
7
  it "works for #{ResourceDump}" do
8
8
  path = 'spec/data/resourcedump/resourcedump.xml'
9
9
  package_uri = URI('http://example.com/resourcedump.zip')
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ module Resync
4
+ class Client
5
+ module Mixins
6
+ describe ListIndex do
7
+ before(:each) do
8
+ @helper = instance_double(Client::HTTPHelper)
9
+ @client = Client.new(helper: @helper)
10
+ end
11
+
12
+ describe '#all_resources' do
13
+ it 'flattens the child resourcelists' do
14
+ index_uri = URI('http://example.com/resource-list-index.xml')
15
+ index_data = File.read('spec/data/examples/resource-list-index.xml')
16
+ expect(@helper).to receive(:fetch).with(uri: index_uri).and_return(index_data)
17
+
18
+ list_1_uri = URI('http://example.com/resourcelist1.xml')
19
+ list_1_data = File.read('spec/data/examples/resource-list-1.xml')
20
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
21
+
22
+ list_1_uri = URI('http://example.com/resourcelist2.xml')
23
+ list_1_data = File.read('spec/data/examples/resource-list-2.xml')
24
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
25
+
26
+ list_1_uri = URI('http://example.com/resourcelist3.xml')
27
+ list_1_data = File.read('spec/data/examples/resource-list-3.xml')
28
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
29
+
30
+ index = @client.get_and_parse(index_uri)
31
+ all_resources = index.all_resources.to_a
32
+ expect(all_resources.size).to eq(6)
33
+ all_resources.each_with_index do |r, i|
34
+ expected_uri = URI("http://example.com/res#{i + 1}")
35
+ expect(r.uri).to eq(expected_uri)
36
+ end
37
+ end
38
+
39
+ it 'is lazy enough not to download anything till it \'s iterated ' do
40
+ index_uri = URI('http://example.com/resource-list-index.xml')
41
+ index_data = File.read('spec/data/examples/resource-list-index.xml')
42
+ expect(@helper).to receive(:fetch).with(uri: index_uri).and_return(index_data)
43
+
44
+ list_1_uri = URI('http://example.com/resourcelist1.xml')
45
+ expect(@helper).not_to receive(:fetch).with(uri: list_1_uri)
46
+
47
+ list_1_uri = URI('http://example.com/resourcelist2.xml')
48
+ expect(@helper).not_to receive(:fetch).with(uri: list_1_uri)
49
+
50
+ list_1_uri = URI('http://example.com/resourcelist3.xml')
51
+ expect(@helper).not_to receive(:fetch).with(uri: list_1_uri)
52
+
53
+ index = @client.get_and_parse(index_uri)
54
+ index.all_resources
55
+ end
56
+
57
+ it 'is lazy enough not to download resources it doesn\'t need' do
58
+ index_uri = URI('http://example.com/resource-list-index.xml')
59
+ index_data = File.read('spec/data/examples/resource-list-index.xml')
60
+ expect(@helper).to receive(:fetch).with(uri: index_uri).and_return(index_data)
61
+
62
+ list_1_uri = URI('http://example.com/resourcelist1.xml')
63
+ list_1_data = File.read('spec/data/examples/resource-list-1.xml')
64
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
65
+
66
+ list_1_uri = URI('http://example.com/resourcelist2.xml')
67
+ list_1_data = File.read('spec/data/examples/resource-list-2.xml')
68
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
69
+
70
+ list_1_uri = URI('http://example.com/resourcelist3.xml')
71
+ expect(@helper).not_to receive(:fetch).with(uri: list_1_uri)
72
+
73
+ index = @client.get_and_parse(index_uri)
74
+ index.all_resources.each_with_index do |_, i|
75
+ break if i >= 3
76
+ end
77
+ end
78
+
79
+ it 'caches downloaded resources' do
80
+ index_uri = URI('http://example.com/resource-list-index.xml')
81
+ index_data = File.read('spec/data/examples/resource-list-index.xml')
82
+ expect(@helper).to receive(:fetch).with(uri: index_uri).and_return(index_data)
83
+
84
+ list_1_uri = URI('http://example.com/resourcelist1.xml')
85
+ list_1_data = File.read('spec/data/examples/resource-list-1.xml')
86
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
87
+
88
+ list_1_uri = URI('http://example.com/resourcelist2.xml')
89
+ list_1_data = File.read('spec/data/examples/resource-list-2.xml')
90
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
91
+
92
+ list_1_uri = URI('http://example.com/resourcelist3.xml')
93
+ list_1_data = File.read('spec/data/examples/resource-list-3.xml')
94
+ expect(@helper).to receive(:fetch).with(uri: list_1_uri).once.and_return(list_1_data)
95
+
96
+ index = @client.get_and_parse(index_uri)
97
+ a1 = index.all_resources.to_a
98
+ a2 = index.all_resources.to_a
99
+ a1.each_with_index do |r, i|
100
+ expect(r).to be(a2[i])
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -29,6 +29,30 @@ module Resync
29
29
  expect(zip_packages[1]).to be(zip_package)
30
30
  end
31
31
 
32
+ it 'flatmaps' do
33
+ resources = Array.new(6) { |i| Resource.new(uri: "http://example.org/res#{i}") }
34
+ all_packages = Array.new(6) do |i|
35
+ zip_package = instance_double(ZipPackage)
36
+ expect(resources[i]).to receive(:zip_package).once.and_return(zip_package)
37
+ zip_package
38
+ end
39
+
40
+ zip_packages_1 = ZipPackages.new(resources[0, 3])
41
+ zip_packages_2 = ZipPackages.new(resources[3, 3])
42
+
43
+ zrl1 = instance_double(Resync::Client::Mixins::Dump)
44
+ expect(zrl1).to receive(:zip_packages).twice.and_return(zip_packages_1)
45
+
46
+ zrl2 = instance_double(Resync::Client::Mixins::Dump)
47
+ expect(zrl2).to receive(:zip_packages).twice.and_return(zip_packages_2)
48
+
49
+ flat_mapped = [zrl1, zrl2].flat_map(&:zip_packages)
50
+ expect(flat_mapped).to eq(all_packages)
51
+
52
+ lazy_flat_mapped = [zrl1, zrl2].lazy.flat_map(&:zip_packages).to_a
53
+ expect(lazy_flat_mapped).to eq(all_packages)
54
+ end
55
+
32
56
  it 'supports lazy iteration' do
33
57
  manifests = Array.new(3) { instance_double(ChangeDumpManifest) }
34
58
  all_packages = Array.new(3) do |index|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resync-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
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-10 00:00:00.000000000 Z
11
+ date: 2015-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: resync
@@ -163,19 +163,20 @@ 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/bitstream_resource_list.rb
167
166
  - lib/resync/client/mixins/client_delegator.rb
168
167
  - lib/resync/client/mixins/downloadable.rb
168
+ - lib/resync/client/mixins/dump.rb
169
+ - lib/resync/client/mixins/dump_index.rb
170
+ - lib/resync/client/mixins/dump_manifest.rb
169
171
  - lib/resync/client/mixins/link_client_delegate.rb
172
+ - lib/resync/client/mixins/list_index.rb
170
173
  - lib/resync/client/mixins/resource_client_delegate.rb
171
174
  - lib/resync/client/mixins/zipped_resource.rb
172
- - lib/resync/client/mixins/zipped_resource_list.rb
173
175
  - lib/resync/client/version.rb
174
176
  - lib/resync/client/zip.rb
175
177
  - lib/resync/client/zip/bitstream.rb
176
178
  - lib/resync/client/zip/zip_package.rb
177
179
  - lib/resync/client/zip/zip_packages.rb
178
- - lib/resync/extensions.rb
179
180
  - resync-client.gemspec
180
181
  - spec/acceptance/example_spec.rb
181
182
  - spec/data/examples/capability-list.xml
@@ -185,6 +186,9 @@ files:
185
186
  - spec/data/examples/change-list.xml
186
187
  - spec/data/examples/resource-dump-manifest.xml
187
188
  - spec/data/examples/resource-dump.xml
189
+ - spec/data/examples/resource-list-1.xml
190
+ - spec/data/examples/resource-list-2.xml
191
+ - spec/data/examples/resource-list-3.xml
188
192
  - spec/data/examples/resource-list-index.xml
189
193
  - spec/data/examples/resource-list.xml
190
194
  - spec/data/examples/source-description.xml
@@ -203,11 +207,13 @@ files:
203
207
  - spec/todo.rb
204
208
  - spec/unit/resync/client/bitstream_spec.rb
205
209
  - spec/unit/resync/client/client_spec.rb
210
+ - spec/unit/resync/client/dump_index_spec.rb
211
+ - spec/unit/resync/client/dump_spec.rb
206
212
  - spec/unit/resync/client/extensions_spec.rb
207
213
  - spec/unit/resync/client/http_helper_spec.rb
214
+ - spec/unit/resync/client/list_index_spec.rb
208
215
  - spec/unit/resync/client/zip_package_spec.rb
209
216
  - spec/unit/resync/client/zip_packages_spec.rb
210
- - spec/unit/resync/client/zipped_resource_list_spec.rb
211
217
  homepage: http://github.com/dmolesUC3/resync-client
212
218
  licenses:
213
219
  - MIT
@@ -241,6 +247,9 @@ test_files:
241
247
  - spec/data/examples/change-list.xml
242
248
  - spec/data/examples/resource-dump-manifest.xml
243
249
  - spec/data/examples/resource-dump.xml
250
+ - spec/data/examples/resource-list-1.xml
251
+ - spec/data/examples/resource-list-2.xml
252
+ - spec/data/examples/resource-list-3.xml
244
253
  - spec/data/examples/resource-list-index.xml
245
254
  - spec/data/examples/resource-list.xml
246
255
  - spec/data/examples/source-description.xml
@@ -259,9 +268,11 @@ test_files:
259
268
  - spec/todo.rb
260
269
  - spec/unit/resync/client/bitstream_spec.rb
261
270
  - spec/unit/resync/client/client_spec.rb
271
+ - spec/unit/resync/client/dump_index_spec.rb
272
+ - spec/unit/resync/client/dump_spec.rb
262
273
  - spec/unit/resync/client/extensions_spec.rb
263
274
  - spec/unit/resync/client/http_helper_spec.rb
275
+ - spec/unit/resync/client/list_index_spec.rb
264
276
  - spec/unit/resync/client/zip_package_spec.rb
265
277
  - spec/unit/resync/client/zip_packages_spec.rb
266
- - spec/unit/resync/client/zipped_resource_list_spec.rb
267
278
  has_rdoc:
@@ -1,29 +0,0 @@
1
- require_relative '../zip'
2
- require_relative 'bitstream_resource'
3
-
4
- # A list of resources within a single zipped bitstream package, e.g. as provided
5
- # by the package manifest.
6
- #
7
- # @!attribute [rw] zip_package
8
- # @return [ZipPackage] the package.
9
- module Resync
10
- class Client
11
- module Mixins
12
- module BitstreamResourceList
13
- attr_accessor :zip_package
14
-
15
- # Makes each provided resource a {BitstreamResource}
16
- # @param value [Array<Resource>] the resources for this list
17
- def resources=(value)
18
- super
19
- resources.each do |r|
20
- class << r
21
- prepend BitstreamResource
22
- end
23
- r.zip_package_delegate = self
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,36 +0,0 @@
1
- require 'resync'
2
- require_relative 'client/mixins'
3
-
4
- module Resync
5
- class Link
6
- prepend Client::Mixins::Downloadable
7
- end
8
-
9
- class Augmented
10
- prepend Client::Mixins::LinkClientDelegate
11
- end
12
-
13
- class Resource
14
- prepend Client::Mixins::Downloadable
15
- end
16
-
17
- class BaseResourceList
18
- prepend Client::Mixins::ResourceClientDelegate
19
- end
20
-
21
- class ResourceDump
22
- prepend Client::Mixins::ZippedResourceList
23
- end
24
-
25
- class ChangeDump
26
- prepend Client::Mixins::ZippedResourceList
27
- end
28
-
29
- class ResourceDumpManifest
30
- prepend Client::Mixins::BitstreamResourceList
31
- end
32
-
33
- class ChangeDumpManifest
34
- prepend Client::Mixins::BitstreamResourceList
35
- end
36
- end