puree 0.15.0 → 0.16.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b99d2257bc1a5acc9a02e0518d722e741f75953d
4
- data.tar.gz: f29a0057bcd27d84c01b90c2a1316986765442a4
3
+ metadata.gz: 1ddcb83b0373dc8b7ed99439c036f9df30e78e33
4
+ data.tar.gz: 725e1793dfce63c7ef1508a136e370e3854059f6
5
5
  SHA512:
6
- metadata.gz: 8a043447e965f65c4ef360cd2cb8eaf7eff0043bf252c232207f2d55428573c915e8989150053e4a2cb0640e4d1976c0a73041fbcd9a711819853c0ec9b4d0d3
7
- data.tar.gz: 09cde7525b2d29e54529b4a1710ff02fa8774aca8e051ebf5fefa3e223dc75324c8ffae2e5c68d46e9695a0b2aba52c6691aae053f82109ee5b7c641d16fa90f
6
+ metadata.gz: ec189df00f33a2024f24071ec2723e34a147bc6fad2b6bd759e5728aca27d8b434582e01502a68c8ed183abf7abd113ba8dff9734e9ea7e8e6c48aa3eaf69efc
7
+ data.tar.gz: 71c81c922c09a0b501d3229ff0dbcaa6d1d26cdd051f7224952c51e5d8a72b5c5cbf48148ef3ad63bcf93284c2ebd8cd5dda8fab11e639fdfdfa7a01cbc57f3c
@@ -3,8 +3,18 @@ All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  ## Unreleased
6
- Metadata :journal, publisher
7
- Factory to make resource objects?
6
+ - Metadata: clipping?, externalPerson?, journal?, publisher?
7
+ - Factory to make resource objects?
8
+ - Make ALL dates ISO 8601 YYYY-MM-DD, rather than mirror varying formats from Pure?
9
+
10
+ ## 0.16.0 - 2016-08-19
11
+ ### Added
12
+ - Collection - instance parameter.
13
+
14
+ ### Changed
15
+ - Parameter endpoint renamed to base_url.
16
+ - Dataset (geographical renamed to spatial).
17
+ - Metadata methods return pre-extracted data.
8
18
 
9
19
  ## 0.15.0 - 2016-06-22
10
20
  ### Added
data/README.md CHANGED
@@ -32,14 +32,20 @@ metadata = d.find uuid: 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
32
32
  metadata['doi']
33
33
  ```
34
34
 
35
- ### Collection of 50 resources
35
+ ...or using a method...
36
+
37
+ ```ruby
38
+ d.doi
39
+ ```
40
+
41
+ ### Collection of resources
36
42
  Tell Purée what you are looking for...
37
43
 
38
44
  ```ruby
39
45
  c = Puree::Collection.new resource: :dataset
40
46
  metadata = c.find limit: 50
41
47
  ```
42
- ...and get the data from an array of hashes.
48
+ ...and get the data from an array of hashes or from an array of instances.
43
49
 
44
50
  ## Documentation
45
51
  [API in YARD](http://www.rubydoc.info/gems/puree/frames)
@@ -5,18 +5,18 @@ module Puree
5
5
  class Collection
6
6
 
7
7
  # @param resource [Symbol]
8
- # @param endpoint [String]
9
- # @param optional username [String]
10
- # @param optional password [String]
11
- # @param optional basic_auth [Boolean]
8
+ # @param base_url [String]
9
+ # @param username [String]
10
+ # @param password [String]
11
+ # @param basic_auth [Boolean]
12
12
  def initialize(resource: nil,
13
- endpoint: nil,
13
+ base_url: nil,
14
14
  username: nil,
15
15
  password: nil,
16
16
  basic_auth: nil)
17
17
  @resource_type = resource
18
18
  @api_map = Puree::Map.new.get
19
- @endpoint = endpoint.nil? ? Puree.endpoint : endpoint
19
+ @base_url = base_url.nil? ? Puree.base_url : base_url
20
20
  @basic_auth = basic_auth.nil? ? Puree.basic_auth : basic_auth
21
21
  if @basic_auth === true
22
22
  @username = username.nil? ? Puree.username : username
@@ -27,14 +27,16 @@ module Puree
27
27
 
28
28
  # Gets an array of objects of resource type specified in constructor
29
29
  #
30
- # @param optional limit [Integer]
31
- # @param optional offset [Integer]
32
- # @param optional created_start [String]
33
- # @param optional created_end [String]
34
- # @param optional modified_start [String]
35
- # @param optional modified_end [String]
36
- # @param optional full [Boolean]
30
+ # @param limit [Integer]
31
+ # @param offset [Integer]
32
+ # @param created_start [String]
33
+ # @param created_end [String]
34
+ # @param modified_start [String]
35
+ # @param modified_end [String]
36
+ # @param full [Boolean]
37
+ # @param instance [Boolean]
37
38
  # @return [Array<Object>]
39
+ # @return [Array<Resource subtype>]
38
40
  def get(
39
41
  limit: 20,
40
42
  offset: 0,
@@ -43,6 +45,7 @@ module Puree
43
45
  modified_start: nil,
44
46
  modified_end: nil,
45
47
  full: true,
48
+ instance: false,
46
49
  rendering: :xml_long
47
50
  )
48
51
 
@@ -58,6 +61,7 @@ module Puree
58
61
  modified_start: modified_start,
59
62
  modified_end: modified_end,
60
63
  full: full,
64
+ instance: instance,
61
65
  record_rendering: rendering
62
66
  }
63
67
 
@@ -70,7 +74,7 @@ module Puree
70
74
  end
71
75
 
72
76
  # strip any trailing slash
73
- @endpoint = @endpoint.sub(/(\/)+$/, '')
77
+ @base_url = @base_url.sub(/(\/)+$/, '')
74
78
 
75
79
  headers = {}
76
80
  headers['Accept'] = 'application/xml'
@@ -129,7 +133,7 @@ module Puree
129
133
  @doc = Nokogiri::XML @response.body
130
134
  @doc.remove_namespaces!
131
135
 
132
- code = @response.code
136
+ # code = @response.code
133
137
  # body = @response.body
134
138
  # puts "#{self.class.name} #{code}"
135
139
  # puts "#{self.class.name} #{body}"
@@ -170,12 +174,12 @@ module Puree
170
174
  resource_class = 'Puree::' + @resource_type.to_s.capitalize
171
175
 
172
176
  if @options[:basic_auth] === true
173
- r = Object.const_get(resource_class).new endpoint: @endpoint,
177
+ r = Object.const_get(resource_class).new base_url: @base_url,
174
178
  username: @username,
175
179
  password: @password,
176
180
  basic_auth: true
177
181
  else
178
- r = Object.const_get(resource_class).new endpoint: @endpoint
182
+ r = Object.const_get(resource_class).new base_url: @base_url
179
183
  end
180
184
  # whitelist symbol
181
185
  if @api_map[:resource_type].has_key?(@resource_type)
@@ -184,7 +188,12 @@ module Puree
184
188
  rendering: @options[:record_rendering]
185
189
  # puts JSON.pretty_generate( record, :indent => ' ')
186
190
  # p u
187
- data << record
191
+ if @options[:instance]
192
+ data << r
193
+ else
194
+ # just the data
195
+ data << record
196
+ end
188
197
  end
189
198
  data
190
199
  else
@@ -217,7 +226,7 @@ module Puree
217
226
  else
218
227
  service_api_mode = service + '.current'
219
228
  end
220
- @endpoint + '/' + service_api_mode
229
+ @base_url + '/' + service_api_mode
221
230
  end
222
231
 
223
232
  def xpath_query(path)
@@ -227,8 +236,8 @@ module Puree
227
236
 
228
237
  def missing_credentials
229
238
  missing = []
230
- if @endpoint.nil?
231
- missing << 'endpoint'
239
+ if @base_url.nil?
240
+ missing << 'base_url'
232
241
  end
233
242
 
234
243
  if @options[:basic_auth] === true
@@ -2,7 +2,7 @@ module Puree
2
2
 
3
3
  module Configuration
4
4
 
5
- attr_accessor :endpoint, :username, :password, :basic_auth
5
+ attr_accessor :base_url, :username, :password, :basic_auth
6
6
 
7
7
  def configure
8
8
  yield self
@@ -4,60 +4,160 @@ module Puree
4
4
  #
5
5
  class Dataset < Resource
6
6
 
7
- # @param endpoint [String]
8
- # @param optional username [String]
9
- # @param optional password [String]
10
- # @param optional basic_auth [Boolean]
11
- def initialize(endpoint: nil, username: nil, password: nil, basic_auth: nil)
7
+ # @param base_url [String]
8
+ # @param username [String]
9
+ # @param password [String]
10
+ # @param basic_auth [Boolean]
11
+ def initialize(base_url: nil, username: nil, password: nil, basic_auth: nil)
12
12
  super(api: :dataset,
13
- endpoint: endpoint,
13
+ base_url: base_url,
14
14
  username: username,
15
15
  password: password,
16
16
  basic_auth: basic_auth)
17
17
  end
18
18
 
19
+ # Open access permission
20
+ #
21
+ # @return [String]
22
+ def access
23
+ @metadata['access']
24
+ end
25
+
26
+ # Combines project and publication
27
+ #
28
+ # @return [Array<Hash>]
29
+ def associated
30
+ @metadata['associated']
31
+ end
32
+
33
+ # Date made available
34
+ #
35
+ # @return [Hash]
36
+ def available
37
+ @metadata['available']
38
+ end
39
+
40
+ # Description
41
+ #
42
+ # @return [String]
43
+ def description
44
+ @metadata['description']
45
+ end
46
+
47
+ # Digital Object Identifier
48
+ #
49
+ # @return [String]
50
+ def doi
51
+ @metadata['doi']
52
+ end
53
+
54
+ # Supporting file
55
+ #
56
+ # @return [Array<Hash>]
57
+ def file
58
+ @metadata['file']
59
+ end
60
+
61
+ # Keyword
62
+ #
63
+ # @return [Array<String>]
64
+ def keyword
65
+ @metadata['keyword']
66
+ end
19
67
 
20
68
  # Link
21
69
  #
22
70
  # @return [Array<Hash>]
23
71
  def link
24
- path = '/links/link'
25
- xpath_result = xpath_query path
26
- data = []
27
- xpath_result.each { |i|
28
- o = {}
29
- o['url'] = i.xpath('url').text.strip
30
- o['description'] = i.xpath('description').text.strip
31
- data << o
32
- }
33
- data.uniq
72
+ @metadata['link']
73
+ end
74
+
75
+ # Organisation
76
+ #
77
+ # @return [Array<Hash>]
78
+ def organisation
79
+ @metadata['organisation']
34
80
  end
35
81
 
36
82
  # Owner
37
83
  #
38
84
  # @return [Hash]
39
85
  def owner
40
- path = '/managedBy'
41
- xpath_result = xpath_query path
42
- o = {}
43
- o['uuid'] = xpath_result.xpath('@uuid').text.strip
44
- o['name'] = xpath_result.xpath('name/localizedString').text.strip
45
- o['type'] = xpath_result.xpath('typeClassification/term/localizedString').text.strip
46
- o
86
+ @metadata['owner']
87
+ end
88
+
89
+ # Person (internal, external, other)
90
+ #
91
+ # @return [Array<Hash>]
92
+ def person
93
+ @metadata['person']
94
+ end
95
+
96
+ # Date of data production
97
+ #
98
+ # @return [Hash]
99
+ def production
100
+ @metadata['production']
101
+ end
102
+
103
+ # Project
104
+ #
105
+ # @return [Array<Hash>]
106
+ def project
107
+ @metadata['project']
108
+ end
109
+
110
+ # Publication
111
+ #
112
+ # @return [Array<Hash>]
113
+ def publication
114
+ @metadata['publication']
47
115
  end
48
116
 
49
117
  # Publisher
50
118
  #
51
119
  # @return [String]
52
120
  def publisher
53
- path = '/publisher/name'
54
- xpath_query_for_single_value path
121
+ @metadata['publisher']
55
122
  end
56
123
 
57
- # Combines project and publication
124
+ # Spatial coverage
58
125
  #
59
- # @return [Array<Hash>]
60
- def associated
126
+ # @return [Array<String>]
127
+ def spatial
128
+ @metadata['spatial']
129
+ end
130
+
131
+ # Temporal coverage
132
+ #
133
+ # @return [Hash]
134
+ def temporal
135
+ @metadata['temporal']
136
+ end
137
+
138
+ # Title
139
+ #
140
+ # @return [String]
141
+ def title
142
+ @metadata['title']
143
+ end
144
+
145
+ # All metadata
146
+ #
147
+ # @return [Hash]
148
+ def metadata
149
+ @metadata
150
+ end
151
+
152
+
153
+ private
154
+
155
+ def extract_access
156
+ path = '/openAccessPermission/term/localizedString'
157
+ xpath_query_for_single_value path
158
+ end
159
+
160
+ def extract_associated
61
161
  path = '/associatedContent//relatedContent'
62
162
  xpath_result = xpath_query path
63
163
  data_arr = []
@@ -71,57 +171,71 @@ module Puree
71
171
  data_arr.uniq
72
172
  end
73
173
 
74
- # Project
75
- #
76
- # @return [Array<Hash>]
77
- def project
78
- associated_type('Research').uniq
174
+ def extract_available
175
+ temporal_start_date 'dateMadeAvailable'
79
176
  end
80
177
 
81
- # Publication
82
- #
83
- # @return [Array<Hash>]
84
- def publication
85
- data_arr = []
86
- associated.each do |i|
87
- if i['type'] != 'Research'
88
- data_arr << i
89
- end
90
- end
91
- data_arr.uniq
178
+ def extract_description
179
+ path = '/descriptions/classificationDefinedField/value/localizedString'
180
+ xpath_query_for_single_value path
92
181
  end
93
182
 
94
-
95
- # Title
96
- #
97
- # @return [String]
98
- def title
99
- path = '/title/localizedString'
183
+ def extract_doi
184
+ path = '/doi'
100
185
  xpath_query_for_single_value path
101
186
  end
102
187
 
103
- # Keyword
104
- #
105
- # @return [Array<String>]
106
- def keyword
188
+ def extract_file
189
+ path = '/documents/document'
190
+ xpath_result = xpath_query path
191
+
192
+ docs = []
193
+
194
+ xpath_result.each do |d|
195
+ doc = {}
196
+ # doc['id'] = f.xpath('id').text.strip
197
+ doc['name'] = d.xpath('fileName').text.strip
198
+ doc['mime'] = d.xpath('mimeType').text.strip
199
+ doc['size'] = d.xpath('size').text.strip
200
+ doc['url'] = d.xpath('url').text.strip
201
+ doc['title'] = d.xpath('title').text.strip
202
+ # doc['createdDate'] = d.xpath('createdDate').text.strip
203
+ # doc['visibleOnPortalDate'] = d.xpath('visibleOnPortalDate').text.strip
204
+ # doc['limitedVisibility'] = d.xpath('limitedVisibility').text.strip
205
+
206
+ license = {}
207
+ license_name = d.xpath('documentLicense/term/localizedString').text.strip
208
+ license['name'] = license_name
209
+ license_url = d.xpath('documentLicense/description/localizedString').text.strip
210
+ license['url'] = license_url
211
+ doc['license'] = license
212
+ docs << doc
213
+
214
+ end
215
+ docs.uniq
216
+ end
217
+
218
+ def extract_keyword
107
219
  path = '/keywordGroups/keywordGroup/keyword/userDefinedKeyword/freeKeyword'
108
220
  xpath_result = xpath_query path
109
221
  data_arr = xpath_result.map { |i| i.text.strip }
110
222
  data_arr.uniq
111
223
  end
112
224
 
113
- # Description
114
- #
115
- # @return [String]
116
- def description
117
- path = '/descriptions/classificationDefinedField/value/localizedString'
118
- xpath_query_for_single_value path
225
+ def extract_link
226
+ path = '/links/link'
227
+ xpath_result = xpath_query path
228
+ data = []
229
+ xpath_result.each { |i|
230
+ o = {}
231
+ o['url'] = i.xpath('url').text.strip
232
+ o['description'] = i.xpath('description').text.strip
233
+ data << o
234
+ }
235
+ data.uniq
119
236
  end
120
237
 
121
- # Organisation
122
- #
123
- # @return [Array<Hash>]
124
- def organisation
238
+ def extract_organisation
125
239
  path = '/organisations/organisation'
126
240
  xpath_result = xpath_query path
127
241
  data = []
@@ -135,10 +249,17 @@ module Puree
135
249
  data
136
250
  end
137
251
 
138
- # Person (internal, external, other)
139
- #
140
- # @return [Array<Hash>]
141
- def person
252
+ def extract_owner
253
+ path = '/managedBy'
254
+ xpath_result = xpath_query path
255
+ o = {}
256
+ o['uuid'] = xpath_result.xpath('@uuid').text.strip
257
+ o['name'] = xpath_result.xpath('name/localizedString').text.strip
258
+ o['type'] = xpath_result.xpath('typeClassification/term/localizedString').text.strip
259
+ o
260
+ end
261
+
262
+ def extract_person
142
263
  data = {}
143
264
  # internal
144
265
  path = '/persons/dataSetPersonAssociation'
@@ -174,17 +295,30 @@ module Puree
174
295
  data
175
296
  end
176
297
 
177
- # Date made available
178
- #
179
- # @return [Hash]
180
- def available
181
- temporal_start_date 'dateMadeAvailable'
298
+ def extract_production
299
+ temporal_range 'dateOfDataProduction', 'endDateOfDataProduction'
182
300
  end
183
301
 
184
- # Geographical coverage
185
- #
186
- # @return [Array<String>]
187
- def geographical
302
+ def extract_project
303
+ associated_type('Research').uniq
304
+ end
305
+
306
+ def extract_publication
307
+ data_arr = []
308
+ extract_associated.each do |i|
309
+ if i['type'] != 'Research'
310
+ data_arr << i
311
+ end
312
+ end
313
+ data_arr.uniq
314
+ end
315
+
316
+ def extract_publisher
317
+ path = '/publisher/name'
318
+ xpath_query_for_single_value path
319
+ end
320
+
321
+ def extract_spatial
188
322
  path = '/geographicalCoverage/localizedString'
189
323
  xpath_result = xpath_query path
190
324
  data = []
@@ -194,68 +328,12 @@ module Puree
194
328
  data
195
329
  end
196
330
 
197
- # Date of data production
198
- #
199
- # @return [Hash]
200
- def production
201
- temporal_range 'dateOfDataProduction', 'endDateOfDataProduction'
202
- end
203
-
204
-
205
- # Temporal coverage
206
- #
207
- # @return [Hash]
208
- def temporal
331
+ def extract_temporal
209
332
  temporal_range 'temporalCoverageStartDate', 'temporalCoverageEndDate'
210
333
  end
211
334
 
212
- # Open access permission
213
- #
214
- # @return [String]
215
- def access
216
- path = '/openAccessPermission/term/localizedString'
217
- xpath_query_for_single_value path
218
- end
219
-
220
-
221
- # Supporting file
222
- #
223
- # @return [Array<Hash>]
224
- def file
225
- path = '/documents/document'
226
- xpath_result = xpath_query path
227
-
228
- docs = []
229
-
230
- xpath_result.each do |d|
231
- doc = {}
232
- # doc['id'] = f.xpath('id').text.strip
233
- doc['name'] = d.xpath('fileName').text.strip
234
- doc['mime'] = d.xpath('mimeType').text.strip
235
- doc['size'] = d.xpath('size').text.strip
236
- doc['url'] = d.xpath('url').text.strip
237
- doc['title'] = d.xpath('title').text.strip
238
- # doc['createdDate'] = d.xpath('createdDate').text.strip
239
- # doc['visibleOnPortalDate'] = d.xpath('visibleOnPortalDate').text.strip
240
- # doc['limitedVisibility'] = d.xpath('limitedVisibility').text.strip
241
-
242
- license = {}
243
- license_name = d.xpath('documentLicense/term/localizedString').text.strip
244
- license['name'] = license_name
245
- license_url = d.xpath('documentLicense/description/localizedString').text.strip
246
- license['url'] = license_url
247
- doc['license'] = license
248
- docs << doc
249
-
250
- end
251
- docs.uniq
252
- end
253
-
254
- # Digital Object Identifier
255
- #
256
- # @return [String]
257
- def doi
258
- path = '/doi'
335
+ def extract_title
336
+ path = '/title/localizedString'
259
337
  xpath_query_for_single_value path
260
338
  end
261
339
 
@@ -265,34 +343,29 @@ module Puree
265
343
  # !data.empty? ? data['startedWorkflow']['state'] : ''
266
344
  # end
267
345
 
268
- # All metadata
269
- #
270
- # @return [Hash]
271
- def metadata
346
+ def combine_metadata
272
347
  o = super
273
- o['access'] = access
274
- o['associated'] = associated
275
- o['available'] = available
276
- o['description'] = description
277
- o['doi'] = doi
278
- o['file'] = file
279
- o['geographical'] = geographical
280
- o['keyword'] = keyword
281
- o['link'] = link
282
- o['organisation'] = organisation
283
- o['owner'] = owner
284
- o['person'] = person
285
- o['project'] = project
286
- o['production'] = production
287
- o['publication'] = publication
288
- o['publisher'] = publisher
289
- o['temporal'] = temporal
290
- o['title'] = title
291
- o
348
+ o['access'] = extract_access
349
+ o['associated'] = extract_associated
350
+ o['available'] = extract_available
351
+ o['description'] = extract_description
352
+ o['doi'] = extract_doi
353
+ o['file'] = extract_file
354
+ o['keyword'] = extract_keyword
355
+ o['link'] = extract_link
356
+ o['organisation'] = extract_organisation
357
+ o['owner'] = extract_owner
358
+ o['person'] = extract_person
359
+ o['project'] = extract_project
360
+ o['production'] = extract_production
361
+ o['publication'] = extract_publication
362
+ o['publisher'] = extract_publisher
363
+ o['spatial'] = extract_spatial
364
+ o['temporal'] = extract_temporal
365
+ o['title'] = extract_title
366
+ @metadata = o
292
367
  end
293
368
 
294
- private
295
-
296
369
  # Assembles basic information about a person
297
370
  #
298
371
  # @param generic_data [Hash]
@@ -355,7 +428,7 @@ module Puree
355
428
  #
356
429
  # @return [Hash]
357
430
  def associated_type(type)
358
- associated_arr = associated
431
+ associated_arr = extract_associated
359
432
  data_arr = []
360
433
  associated_arr.each do |i|
361
434
  data = {}