puree 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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 = {}