duracloud-client 0.0.3 → 0.1.0
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 +4 -4
- data/README.md +105 -24
- data/duracloud.gemspec +1 -0
- data/lib/duracloud/audit_log.rb +35 -0
- data/lib/duracloud/bit_integrity_report.rb +40 -26
- data/lib/duracloud/configuration.rb +7 -3
- data/lib/duracloud/content.rb +65 -65
- data/lib/duracloud/csv_reader.rb +18 -0
- data/lib/duracloud/durastore_request.rb +1 -1
- data/lib/duracloud/error.rb +2 -2
- data/lib/duracloud/error_handler.rb +8 -0
- data/lib/duracloud/has_properties.rb +7 -0
- data/lib/duracloud/manifest.rb +37 -14
- data/lib/duracloud/persistence.rb +1 -1
- data/lib/duracloud/properties.rb +43 -6
- data/lib/duracloud/request.rb +24 -12
- data/lib/duracloud/rest_methods.rb +49 -37
- data/lib/duracloud/space.rb +201 -35
- data/lib/duracloud/space_acls.rb +6 -2
- data/lib/duracloud/space_properties.rb +0 -12
- data/lib/duracloud/store.rb +12 -0
- data/lib/duracloud/version.rb +1 -1
- data/lib/duracloud.rb +2 -0
- data/spec/spec_helper.rb +13 -20
- data/spec/unit/audit_log_spec.rb +5 -0
- data/spec/unit/bit_integrity_report_spec.rb +5 -0
- data/spec/unit/client_spec.rb +276 -5
- data/spec/unit/content_spec.rb +107 -14
- data/spec/{fixtures/responses/GetManifest.tsv → unit/manifest_spec.rb} +9 -0
- data/spec/unit/space_spec.rb +136 -1
- data/spec/unit/store_spec.rb +36 -1
- metadata +24 -8
- data/spec/fixtures/responses/GetSpaces.xml +0 -5
- data/spec/fixtures/responses/GetStores.xml +0 -11
data/lib/duracloud/manifest.rb
CHANGED
@@ -1,23 +1,46 @@
|
|
1
|
-
require "csv"
|
2
|
-
|
3
1
|
module Duracloud
|
4
2
|
class Manifest
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
BAGIT = "BAGIT".freeze
|
5
|
+
TSV = "TSV".freeze
|
6
|
+
|
7
|
+
attr_reader :space_id, :store_id
|
8
|
+
|
9
|
+
def initialize(space_id, store_id = nil)
|
10
|
+
@space_id = space_id
|
11
|
+
@store_id = store_id
|
12
|
+
@tsv_response = nil
|
13
|
+
@bagit_response = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def csv(opts = {})
|
17
|
+
CSVReader.call(tsv, opts)
|
18
|
+
end
|
19
|
+
|
20
|
+
def tsv
|
21
|
+
tsv_response.body
|
22
|
+
end
|
23
|
+
|
24
|
+
def bagit
|
25
|
+
bagit_response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def tsv_response
|
31
|
+
@tsv_response ||= get_response(TSV)
|
32
|
+
end
|
33
|
+
|
34
|
+
def bagit_response
|
35
|
+
@bagit_response ||= get_response(BAGIT)
|
36
|
+
end
|
12
37
|
|
13
|
-
def
|
14
|
-
|
15
|
-
CSV.new(data, CSV_OPTS.merge(csv_opts))
|
38
|
+
def get_response(format)
|
39
|
+
Client.get_manifest(space_id, query(format))
|
16
40
|
end
|
17
41
|
|
18
|
-
def
|
19
|
-
|
20
|
-
response.body
|
42
|
+
def query(format)
|
43
|
+
{ storeID: store_id, format: format }
|
21
44
|
end
|
22
45
|
|
23
46
|
end
|
data/lib/duracloud/properties.rb
CHANGED
@@ -3,7 +3,11 @@ require 'time'
|
|
3
3
|
require 'date'
|
4
4
|
|
5
5
|
module Duracloud
|
6
|
+
#
|
7
|
+
# Encapsulates Duracloud "properties" which are transmitted via HTTP headers.
|
8
|
+
#
|
6
9
|
# @abstract
|
10
|
+
#
|
7
11
|
class Properties < Hashie::Mash
|
8
12
|
|
9
13
|
PREFIX = "x-dura-meta-".freeze
|
@@ -23,38 +27,69 @@ module Duracloud
|
|
23
27
|
# Properties set by the DuraCloud SyncTool
|
24
28
|
SYNCTOOL = /\A#{PREFIX}(creator|(content-file-(created|modified|last-accessed-path)))\z/
|
25
29
|
|
30
|
+
# Is the property valid for this class of properties?
|
31
|
+
# @note Subclasses should override this method rather than the `#property?'
|
32
|
+
# instance method.
|
33
|
+
# @param prop [String] the property name
|
34
|
+
# @return [Boolean]
|
26
35
|
def self.property?(prop)
|
27
|
-
|
36
|
+
duracloud_property?(prop) && !internal_property?(prop)
|
28
37
|
end
|
29
38
|
|
39
|
+
# Filter the hash of properties, selecting only the properties valid
|
40
|
+
# for this particular usage (subclass).
|
41
|
+
# @param hsh [Hash] the unfiltered properties
|
42
|
+
# @return [Hash] the filtered properties
|
30
43
|
def self.filter(hsh)
|
31
44
|
hsh.select { |k, v| property?(k) }
|
32
45
|
end
|
33
46
|
|
34
|
-
|
47
|
+
# Is the property a (theoretically) valid DuraCloud property?
|
48
|
+
# @param prop [String] the property name
|
49
|
+
# @return [Boolean]
|
50
|
+
def self.duracloud_property?(prop)
|
35
51
|
prop.start_with?(PREFIX)
|
36
52
|
end
|
37
53
|
|
54
|
+
# Is the property a reserved "internal" DuraCloud property?
|
55
|
+
# @param prop [String] the property name
|
56
|
+
# @return [Boolean]
|
38
57
|
def self.internal_property?(prop)
|
39
58
|
INTERNAL =~ prop
|
40
59
|
end
|
41
60
|
|
61
|
+
# Is the property a space property?
|
62
|
+
# @param prop [String] the property name
|
63
|
+
# @return [Boolean]
|
42
64
|
def self.space_property?(prop)
|
43
65
|
SPACE =~ prop
|
44
66
|
end
|
45
67
|
|
68
|
+
# Is the property a space ACL?
|
69
|
+
# @param prop [String] the property name
|
70
|
+
# @return [Boolean]
|
46
71
|
def self.space_acl?(prop)
|
47
72
|
SPACE_ACLS =~ prop
|
48
73
|
end
|
49
74
|
|
75
|
+
# Is the property used for copying content?
|
76
|
+
# @param prop [String] the property name
|
77
|
+
# @return [Boolean]
|
50
78
|
def self.copy_content_property?(prop)
|
51
79
|
COPY_CONTENT =~ prop
|
52
80
|
end
|
53
81
|
|
82
|
+
# Is the property valid for this class of properties?
|
83
|
+
# @note Subclasses should not override this method, but instead
|
84
|
+
# override the `.property?' class method.
|
85
|
+
# @param prop [String] the property name
|
86
|
+
# @return [Boolean]
|
87
|
+
# @api private
|
54
88
|
def property?(prop)
|
55
89
|
self.class.property?(prop)
|
56
90
|
end
|
57
91
|
|
92
|
+
# @api private
|
58
93
|
def regular_writer(key, value)
|
59
94
|
if property?(key)
|
60
95
|
super
|
@@ -63,10 +98,12 @@ module Duracloud
|
|
63
98
|
end
|
64
99
|
end
|
65
100
|
|
101
|
+
# @api private
|
66
102
|
def convert_key(key)
|
67
|
-
force_ascii(
|
103
|
+
force_ascii(duracloud_property!(super))
|
68
104
|
end
|
69
105
|
|
106
|
+
# @api private
|
70
107
|
def convert_value(value, _ = nil)
|
71
108
|
case value
|
72
109
|
when Array
|
@@ -82,12 +119,12 @@ module Duracloud
|
|
82
119
|
|
83
120
|
private
|
84
121
|
|
85
|
-
#
|
86
|
-
def
|
122
|
+
# Coerce to a DuraCloud property
|
123
|
+
def duracloud_property!(prop)
|
87
124
|
prop.dup.tap do |p|
|
88
125
|
p.gsub!(/_/, '-')
|
89
126
|
p.downcase!
|
90
|
-
p.prepend(PREFIX) unless self.class.
|
127
|
+
p.prepend(PREFIX) unless self.class.duracloud_property?(p)
|
91
128
|
end
|
92
129
|
end
|
93
130
|
|
data/lib/duracloud/request.rb
CHANGED
@@ -8,32 +8,44 @@ module Duracloud
|
|
8
8
|
# @param body [String] the body of the request
|
9
9
|
# @param headers [Hash] HTTP headers
|
10
10
|
# @param query [Hash] Query string parameters
|
11
|
-
def initialize(client, http_method, url, body: nil, headers: nil, query: nil)
|
11
|
+
# def initialize(client, http_method, url, body: nil, headers: nil, query: nil)
|
12
|
+
def initialize(client, http_method, url, **options)
|
12
13
|
@client = client
|
13
14
|
@http_method = http_method
|
14
15
|
@url = url
|
15
|
-
|
16
|
-
@headers = headers
|
17
|
-
@query = query
|
16
|
+
set_options(options.dup)
|
18
17
|
end
|
19
18
|
|
20
19
|
def execute
|
21
|
-
|
22
|
-
original_response = connection.send(http_method,
|
23
|
-
url,
|
24
|
-
body: body,
|
25
|
-
query: query,
|
26
|
-
header: headers)
|
27
|
-
Response.new(original_response)
|
28
|
-
end
|
20
|
+
response_class.new(original_response)
|
29
21
|
end
|
30
22
|
|
31
23
|
private
|
32
24
|
|
25
|
+
def original_response
|
26
|
+
connection.send(http_method,
|
27
|
+
url,
|
28
|
+
body: body,
|
29
|
+
query: query,
|
30
|
+
header: headers)
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_options(options)
|
34
|
+
@body = options.delete(:body)
|
35
|
+
@headers = options.delete(:headers)
|
36
|
+
query = options.delete(:query) || {}
|
37
|
+
# Treat other keywords args as query params and ignore empty params
|
38
|
+
@query = query.merge(options).reject { |k, v| v.to_s.empty? }
|
39
|
+
end
|
40
|
+
|
33
41
|
def base_path
|
34
42
|
'/'
|
35
43
|
end
|
36
44
|
|
45
|
+
def response_class
|
46
|
+
Response
|
47
|
+
end
|
48
|
+
|
37
49
|
def connection
|
38
50
|
@connection ||= Connection.new(client, base_path)
|
39
51
|
end
|
@@ -2,79 +2,86 @@ module Duracloud
|
|
2
2
|
module RestMethods
|
3
3
|
|
4
4
|
def get_stores
|
5
|
-
durastore
|
5
|
+
durastore(:get, "stores")
|
6
6
|
end
|
7
7
|
|
8
|
-
def get_spaces
|
9
|
-
durastore
|
8
|
+
def get_spaces(**query)
|
9
|
+
durastore(:get, "spaces", **query)
|
10
10
|
end
|
11
11
|
|
12
|
-
def get_space(space_id, query
|
13
|
-
durastore
|
12
|
+
def get_space(space_id, **query)
|
13
|
+
durastore(:get, space_id, **query)
|
14
14
|
end
|
15
15
|
|
16
|
-
def get_space_properties(space_id)
|
17
|
-
durastore
|
16
|
+
def get_space_properties(space_id, **query)
|
17
|
+
durastore(:head, space_id, **query)
|
18
18
|
end
|
19
19
|
|
20
|
-
def get_space_acls(space_id)
|
21
|
-
durastore
|
20
|
+
def get_space_acls(space_id, **query)
|
21
|
+
durastore(:head, "acl/#{space_id}", **query)
|
22
22
|
end
|
23
23
|
|
24
|
-
def set_space_acls(space_id,
|
25
|
-
durastore
|
24
|
+
def set_space_acls(space_id, **options)
|
25
|
+
durastore(:post, "acl/#{space_id}", **options)
|
26
26
|
end
|
27
27
|
|
28
|
-
def create_space(space_id)
|
29
|
-
durastore
|
28
|
+
def create_space(space_id, **query)
|
29
|
+
durastore(:put, space_id, **query)
|
30
30
|
end
|
31
31
|
|
32
|
-
def delete_space(space_id)
|
33
|
-
durastore
|
32
|
+
def delete_space(space_id, **query)
|
33
|
+
durastore(:delete, space_id, **query)
|
34
34
|
end
|
35
35
|
|
36
|
-
def get_content(
|
37
|
-
|
36
|
+
def get_content(space_id, content_id, **options)
|
37
|
+
durastore_content(:get, space_id, content_id, **options)
|
38
38
|
end
|
39
39
|
|
40
|
-
def get_content_properties(
|
41
|
-
|
40
|
+
def get_content_properties(space_id, content_id, **options)
|
41
|
+
durastore_content(:head, space_id, content_id, **options)
|
42
42
|
end
|
43
43
|
|
44
|
-
def set_content_properties(
|
45
|
-
|
44
|
+
def set_content_properties(space_id, content_id, **options)
|
45
|
+
durastore_content(:post, space_id, content_id, **options)
|
46
46
|
end
|
47
47
|
|
48
|
-
def store_content(
|
49
|
-
|
48
|
+
def store_content(space_id, content_id, **options)
|
49
|
+
durastore_content(:put, space_id, content_id, **options)
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
|
52
|
+
def copy_content(space_id, content_id, **options)
|
53
|
+
raise NotImplementedError,
|
54
|
+
"The API method 'Copy Content' has not yet been implemented."
|
54
55
|
end
|
55
56
|
|
56
|
-
def
|
57
|
-
|
57
|
+
def delete_content(space_id, content_id, **options)
|
58
|
+
durastore_content(:delete, space_id, content_id, **options)
|
58
59
|
end
|
59
60
|
|
60
|
-
def
|
61
|
-
durastore
|
61
|
+
def get_audit_log(space_id, **query)
|
62
|
+
durastore(:get, "audit/#{space_id}", **query)
|
62
63
|
end
|
63
64
|
|
64
|
-
def
|
65
|
-
durastore
|
65
|
+
def get_manifest(space_id, **query)
|
66
|
+
durastore(:get, "manifest/#{space_id}", **query)
|
66
67
|
end
|
67
68
|
|
68
|
-
def
|
69
|
-
durastore
|
69
|
+
def get_bit_integrity_report(space_id, **query)
|
70
|
+
durastore(:get, "bit-integrity/#{space_id}", **query)
|
70
71
|
end
|
71
72
|
|
72
|
-
def
|
73
|
-
|
73
|
+
def get_bit_integrity_report_properties(space_id, **query)
|
74
|
+
durastore(:head, "bit-integrity/#{space_id}", **query)
|
74
75
|
end
|
75
76
|
|
76
|
-
def
|
77
|
-
raise NotImplementedError,
|
77
|
+
def get_tasks(**query)
|
78
|
+
raise NotImplementedError,
|
79
|
+
"The API method 'Get Tasks' has not been implemented."
|
80
|
+
end
|
81
|
+
|
82
|
+
def perform_task(task_name, **query)
|
83
|
+
raise NotImplementedError,
|
84
|
+
"The API method 'Perform Task' has not been implemented."
|
78
85
|
end
|
79
86
|
|
80
87
|
private
|
@@ -83,5 +90,10 @@ module Duracloud
|
|
83
90
|
execute(DurastoreRequest, *args)
|
84
91
|
end
|
85
92
|
|
93
|
+
def durastore_content(http_method, space_id, content_id, **options)
|
94
|
+
url = [ space_id, content_id ].join("/")
|
95
|
+
durastore(http_method, url, **options)
|
96
|
+
end
|
97
|
+
|
86
98
|
end
|
87
99
|
end
|
data/lib/duracloud/space.rb
CHANGED
@@ -1,63 +1,224 @@
|
|
1
1
|
require "date"
|
2
2
|
require "nokogiri"
|
3
|
-
require "forwardable"
|
4
3
|
|
5
4
|
module Duracloud
|
5
|
+
#
|
6
|
+
# A "space" within a DuraCloud account.
|
7
|
+
#
|
6
8
|
class Space
|
7
|
-
extend Forwardable
|
8
9
|
include Persistence
|
9
10
|
include HasProperties
|
10
11
|
|
12
|
+
# Max size of content item list for one request.
|
13
|
+
# This limit is imposed by Duracloud.
|
11
14
|
MAX_RESULTS = 1000
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
class << self
|
17
|
+
# List all spaces
|
18
|
+
# @param store_id [String] the store ID (optional)
|
19
|
+
# @return [Array<Duracloud::Space>] the list of spaces
|
20
|
+
# @raise [Duracloud::Error] the store was not found
|
21
|
+
def all(store_id = nil)
|
22
|
+
ids(store_id).map { |id| new(id, store_id) }
|
23
|
+
end
|
24
|
+
|
25
|
+
# List all space IDs
|
26
|
+
# @param store_id [String] the store ID (optional)
|
27
|
+
# @return [Array<String>] the list of space IDs
|
28
|
+
# @raise [Duracloud::Error] the store was not found
|
29
|
+
def ids(store_id = nil)
|
30
|
+
response = Client.get_spaces(storeID: store_id)
|
31
|
+
doc = Nokogiri::XML(response.body)
|
32
|
+
doc.css('space').map { |s| s['id'] }
|
33
|
+
end
|
34
|
+
|
35
|
+
# Enumerates the content IDs in the space.
|
36
|
+
# @param space_id [String] the space ID
|
37
|
+
# @param store_id [String] the store ID (optional)
|
38
|
+
# @param prefix [String] the content ID prefix for filtering (optional)
|
39
|
+
# @param start_after [String] the content ID to be used as a "marker".
|
40
|
+
# Listing starts after this ID. (optional)
|
41
|
+
# @return [Enumerator] an enumerator.
|
42
|
+
# @raise [Duracloud::NotFoundError] the space or store does not exist.
|
43
|
+
def content_ids(space_id, store_id: nil, prefix: nil, start_after: nil)
|
44
|
+
space = find(space_id, store_id)
|
45
|
+
space.content_ids(prefix: prefix, start_after: start_after)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Enumerates the content items in the space.
|
49
|
+
# @param space_id [String] the space ID
|
50
|
+
# @param store_id [String] the store ID (optional)
|
51
|
+
# @param prefix [String] the content ID prefix for filtering (optional)
|
52
|
+
# @param start_after [String] the content ID to be used as a "marker".
|
53
|
+
# Listing starts after this ID. (optional)
|
54
|
+
# @return [Enumerator] an enumerator.
|
55
|
+
# @raise [Duracloud::NotFoundError] the space does not exist in Duracloud.
|
56
|
+
def items(space_id, store_id: nil, prefix: nil, start_after: nil)
|
57
|
+
space = find(space_id, store_id)
|
58
|
+
space.items(prefix: prefix, start_after: start_after)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Create a new space
|
62
|
+
# @see .new for arguments
|
63
|
+
# @return [Duracloud::Space] the space
|
64
|
+
# @raise [Duracloud::BadRequestError] the space ID is invalid.
|
65
|
+
def create(*args)
|
66
|
+
new(*args) do |space|
|
67
|
+
yield space if block_given?
|
68
|
+
space.save
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Does the space exist?
|
73
|
+
# @see .new for arguments
|
74
|
+
# @return [Boolean] whether the space exists.
|
75
|
+
def exist?(*args)
|
76
|
+
find(*args) && true
|
77
|
+
rescue NotFoundError
|
78
|
+
false
|
79
|
+
end
|
80
|
+
|
81
|
+
# Find a space
|
82
|
+
# @see .new for arguments
|
83
|
+
# @return [Duracloud::Space] the space
|
84
|
+
# @raise [Duracloud::NotFoundError] the space or store was not found
|
85
|
+
def find(*args)
|
86
|
+
new(*args) do |space|
|
87
|
+
space.load_properties
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Return the number of items in the space
|
92
|
+
# @return [Fixnum] the number of items
|
93
|
+
# @raise [Duracloud::NotFoundError] the space or store was not found
|
94
|
+
def count(*args)
|
95
|
+
find(*args).count
|
96
|
+
end
|
97
|
+
|
98
|
+
# Return the audit log for the space
|
99
|
+
# @return [Duracloud::AuditLog] the audit log
|
100
|
+
# @raise [Duracloud::NotFoundError] the space or store was not found
|
101
|
+
def audit_log(*args)
|
102
|
+
find(*args).audit_log
|
103
|
+
end
|
104
|
+
|
105
|
+
# Return the bit integrity report for the space
|
106
|
+
# @return [Duracloud::BitIntegrityReport] the report
|
107
|
+
# @raise [Duracloud::NotFoundError] the space or store was not found
|
108
|
+
def bit_integrity_report(*args)
|
109
|
+
find(*args).bit_integrity_report
|
110
|
+
end
|
111
|
+
|
112
|
+
# Return the manifest for the space
|
113
|
+
# @return [Duracloud::Manifest] the manifest
|
114
|
+
# @raise [Duracloud::NotFoundError] the space or store was not found
|
115
|
+
def manifest(*args)
|
116
|
+
find(*args).manifest
|
117
|
+
end
|
17
118
|
end
|
18
119
|
|
19
|
-
|
20
|
-
|
120
|
+
attr_reader :space_id, :store_id
|
121
|
+
alias_method :id, :space_id
|
122
|
+
|
123
|
+
after_save :reset_acls
|
124
|
+
before_delete :reset_acls
|
125
|
+
|
126
|
+
# @param space_id [String] the space ID
|
127
|
+
# @param store_id [String] the store ID (optional)
|
128
|
+
def initialize(space_id, store_id = nil)
|
129
|
+
@space_id = space_id
|
130
|
+
@store_id = store_id
|
131
|
+
yield self if block_given?
|
21
132
|
end
|
22
133
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
space
|
134
|
+
def inspect
|
135
|
+
"#<#{self.class} space_id=#{space_id.inspect}," \
|
136
|
+
" store_id=#{(store_id || '(default)').inspect}>"
|
27
137
|
end
|
28
138
|
|
29
|
-
|
139
|
+
def to_s
|
140
|
+
space_id
|
141
|
+
end
|
30
142
|
|
31
|
-
|
143
|
+
# Return the number of items in the space
|
144
|
+
# @return [Fixnum] the number of items
|
145
|
+
def count
|
146
|
+
properties.space_count.to_i
|
147
|
+
end
|
32
148
|
|
33
|
-
|
34
|
-
|
149
|
+
# Return the creation date of the space, if persisted, or nil.
|
150
|
+
# @return [DateTime] the date
|
151
|
+
def created
|
152
|
+
if space_created = properties.space_created
|
153
|
+
DateTime.parse(space_created)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# Find a content item in the space
|
158
|
+
# @return [Duracloud::Content] the content item.
|
159
|
+
# @raise [Duracloud::NotFoundError] if the content item does not exist.
|
160
|
+
def find_content(content_id)
|
161
|
+
Content.find(space_id, content_id, store_id)
|
162
|
+
end
|
163
|
+
|
164
|
+
# Return the audit log for the space
|
165
|
+
# @return [Duracloud::AuditLog] the audit log
|
166
|
+
def audit_log
|
167
|
+
AuditLog.new(space_id, store_id)
|
168
|
+
end
|
35
169
|
|
36
|
-
|
37
|
-
|
170
|
+
# Return the bit integrity report for the space
|
171
|
+
# @return [Duracloud::BitIntegrityReport] the report
|
172
|
+
def bit_integrity_report
|
173
|
+
BitIntergrityReport.new(space_id, store_id)
|
38
174
|
end
|
39
175
|
|
176
|
+
# Return the manifest for the space
|
177
|
+
# @return [Duracloud::Manifest] the manifest
|
178
|
+
def manifest
|
179
|
+
Manifest.new(space_id, store_id)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Return the ACLs for the space
|
183
|
+
# @return [Duracloud::SpaceAcls] the ACLs
|
40
184
|
def acls
|
41
185
|
@acls ||= SpaceAcls.new(self)
|
42
186
|
end
|
43
187
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
188
|
+
# Enumerates the content IDs in the space.
|
189
|
+
# @param prefix [String] the content ID prefix for filtering (optional)
|
190
|
+
# @param start_after [String] the content ID to be used as a "marker".
|
191
|
+
# Listing starts after this ID. (optional)
|
192
|
+
# @return [Enumerator] an enumerator.
|
193
|
+
# @raise [Duracloud::NotFoundError] the space does not exist in Duracloud.
|
194
|
+
def content_ids(prefix: nil, start_after: nil)
|
195
|
+
Enumerator.new do |yielder|
|
196
|
+
num = 0
|
197
|
+
marker = start_after
|
198
|
+
while num < count
|
199
|
+
q = query.merge(prefix: prefix, maxResults: MAX_RESULTS, marker: marker)
|
200
|
+
response = Client.get_space(space_id, **q)
|
201
|
+
xml = Nokogiri::XML(response.body)
|
202
|
+
ids = xml.css('item').map(&:text)
|
203
|
+
break if ids.empty?
|
204
|
+
ids.each do |content_id|
|
205
|
+
yielder << content_id
|
206
|
+
end
|
207
|
+
num += ids.length
|
208
|
+
marker = ids.last
|
53
209
|
end
|
54
|
-
num += content_ids.length
|
55
210
|
end
|
56
211
|
end
|
57
212
|
|
58
|
-
|
59
|
-
|
60
|
-
|
213
|
+
# Enumerates the content items in the space.
|
214
|
+
# @see #content_ids
|
215
|
+
# @return [Enumerator] an enumerator.
|
216
|
+
# @raise [Duracloud::NotFoundError] the space does not exist in Duracloud.
|
217
|
+
def items(*args)
|
218
|
+
Enumerator.new do |yielder|
|
219
|
+
content_ids(*args).each do |content_id|
|
220
|
+
yielder << find_content(content_id)
|
221
|
+
end
|
61
222
|
end
|
62
223
|
end
|
63
224
|
|
@@ -68,11 +229,12 @@ module Duracloud
|
|
68
229
|
end
|
69
230
|
|
70
231
|
def create
|
71
|
-
Client.create_space(id)
|
232
|
+
Client.create_space(id, **query)
|
72
233
|
end
|
73
234
|
|
74
235
|
def update
|
75
|
-
|
236
|
+
options = { headers: acls.to_h, query: query }
|
237
|
+
Client.set_space_acls(id, **options)
|
76
238
|
end
|
77
239
|
|
78
240
|
def properties_class
|
@@ -80,11 +242,11 @@ module Duracloud
|
|
80
242
|
end
|
81
243
|
|
82
244
|
def get_properties_response
|
83
|
-
Client.get_space_properties(id)
|
245
|
+
Client.get_space_properties(id, **query)
|
84
246
|
end
|
85
247
|
|
86
248
|
def do_delete
|
87
|
-
Client.delete_space(id)
|
249
|
+
Client.delete_space(id, **query)
|
88
250
|
end
|
89
251
|
|
90
252
|
def do_save
|
@@ -95,5 +257,9 @@ module Duracloud
|
|
95
257
|
end
|
96
258
|
end
|
97
259
|
|
260
|
+
def query
|
261
|
+
{ storeID: store_id }
|
262
|
+
end
|
263
|
+
|
98
264
|
end
|
99
265
|
end
|
data/lib/duracloud/space_acls.rb
CHANGED
@@ -11,10 +11,14 @@ module Duracloud
|
|
11
11
|
super()
|
12
12
|
@space = space
|
13
13
|
if space.persisted?
|
14
|
-
response = Client.get_space_acls(space.
|
15
|
-
update
|
14
|
+
response = Client.get_space_acls(space.space_id, **query)
|
15
|
+
update filter(response.headers)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def query
|
20
|
+
{ storeID: space.store_id }
|
21
|
+
end
|
22
|
+
|
19
23
|
end
|
20
24
|
end
|