puree 0.14.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -1
- data/README.md +16 -339
- data/lib/puree.rb +15 -2
- data/lib/puree/collection.rb +161 -32
- data/lib/puree/configuration.rb +1 -5
- data/lib/puree/dataset.rb +95 -88
- data/lib/puree/download.rb +170 -12
- data/lib/puree/event.rb +16 -11
- data/lib/puree/journal.rb +5 -2
- data/lib/puree/map.rb +13 -2
- data/lib/puree/organisation.rb +16 -15
- data/lib/puree/person.rb +38 -16
- data/lib/puree/project.rb +163 -3
- data/lib/puree/publication.rb +132 -15
- data/lib/puree/publisher.rb +6 -2
- data/lib/puree/resource.rb +95 -70
- data/lib/puree/server.rb +147 -0
- data/lib/puree/version.rb +1 -1
- data/puree.gemspec +2 -2
- data/spec/collection.rb +15 -6
- data/spec/dataset.rb +25 -24
- data/spec/spec_helper.rb +14 -2
- metadata +8 -7
data/lib/puree/download.rb
CHANGED
@@ -1,26 +1,184 @@
|
|
1
1
|
module Puree
|
2
2
|
|
3
|
-
# Download
|
3
|
+
# Download
|
4
4
|
#
|
5
|
-
class Download
|
5
|
+
class Download
|
6
|
+
attr_reader :response
|
6
7
|
|
7
8
|
# @param endpoint [String]
|
8
9
|
# @param optional username [String]
|
9
10
|
# @param optional password [String]
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# @param optional basic_auth [Boolean]
|
12
|
+
def initialize(endpoint: nil,
|
13
|
+
username: nil,
|
14
|
+
password: nil,
|
15
|
+
basic_auth: nil)
|
16
|
+
@resource_type = :download
|
17
|
+
@api_map = Puree::Map.new.get
|
18
|
+
@endpoint = endpoint.nil? ? Puree.endpoint : endpoint
|
19
|
+
@basic_auth = basic_auth.nil? ? Puree.basic_auth : basic_auth
|
20
|
+
if @basic_auth === true
|
21
|
+
@username = username.nil? ? Puree.username : username
|
22
|
+
@password = password.nil? ? Puree.password : password
|
23
|
+
end
|
15
24
|
end
|
16
25
|
|
26
|
+
# Get
|
27
|
+
#
|
28
|
+
# @param optional limit [Integer]
|
29
|
+
# @param optional offset [Integer]
|
30
|
+
# @param optional resource [Symbol]
|
31
|
+
# @return [Array<Hash>]
|
32
|
+
def get(limit: 20,
|
33
|
+
offset: 0,
|
34
|
+
resource: nil)
|
35
|
+
missing = missing_credentials
|
36
|
+
if !missing.empty?
|
37
|
+
missing.each do |m|
|
38
|
+
puts "#{self.class.name}" + '#' + "#{__method__} missing #{m}"
|
39
|
+
end
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
|
43
|
+
# strip any trailing slash
|
44
|
+
@endpoint = @endpoint.sub(/(\/)+$/, '')
|
45
|
+
@auth = Base64::strict_encode64(@username + ':' + @password)
|
46
|
+
|
47
|
+
@options = {
|
48
|
+
basic_auth: @basic_auth,
|
49
|
+
latest_api: true,
|
50
|
+
resource_type: @resource_type.to_sym,
|
51
|
+
rendering: :system,
|
52
|
+
limit: limit,
|
53
|
+
offset: offset,
|
54
|
+
resource: resource.to_sym
|
55
|
+
}
|
56
|
+
headers = {
|
57
|
+
'Accept' => 'application/xml',
|
58
|
+
'Authorization' => 'Basic ' + @auth
|
59
|
+
}
|
60
|
+
query = {}
|
61
|
+
query['rendering'] = @options[:rendering]
|
62
|
+
|
63
|
+
if @options[:limit]
|
64
|
+
query['window.size'] = @options[:limit]
|
65
|
+
end
|
66
|
+
|
67
|
+
if @options[:offset]
|
68
|
+
query['window.offset'] = @options[:offset]
|
69
|
+
end
|
70
|
+
|
71
|
+
if @options[:resource]
|
72
|
+
query['contentType'] = service_family
|
73
|
+
end
|
74
|
+
|
75
|
+
begin
|
76
|
+
url = build_url
|
77
|
+
req = HTTP.headers accept: headers['Accept']
|
78
|
+
if @options[:basic_auth]
|
79
|
+
req = req.auth headers['Authorization']
|
80
|
+
end
|
81
|
+
@response = req.get(url, params: query)
|
82
|
+
@doc = Nokogiri::XML @response.body
|
83
|
+
@doc.remove_namespaces!
|
84
|
+
rescue HTTP::Error => e
|
85
|
+
puts 'HTTP::Error '+ e.message
|
86
|
+
end
|
87
|
+
|
88
|
+
get_data? ? metadata : []
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
17
94
|
# All metadata
|
18
95
|
#
|
19
|
-
# @return [Hash]
|
20
|
-
|
21
|
-
|
22
|
-
|
96
|
+
# @return [Array<Hash>]
|
97
|
+
def metadata
|
98
|
+
statistic
|
99
|
+
end
|
23
100
|
|
24
|
-
end
|
25
101
|
|
102
|
+
private
|
103
|
+
|
104
|
+
# Is there any data after get?
|
105
|
+
#
|
106
|
+
# @return [Boolean]
|
107
|
+
def get_data?
|
108
|
+
# n.b. arbitrary element existence check
|
109
|
+
path = service_response_name + '/downloadCount'
|
110
|
+
xpath_result = @doc.xpath path
|
111
|
+
xpath_result.size ? true : false
|
112
|
+
end
|
113
|
+
|
114
|
+
# Statistic
|
115
|
+
#
|
116
|
+
# @return [Array<Hash>]
|
117
|
+
def statistic
|
118
|
+
path = service_response_name + '/downloadCount'
|
119
|
+
xpath_result = xpath_query path
|
120
|
+
data_arr = []
|
121
|
+
xpath_result.each { |i|
|
122
|
+
data = {}
|
123
|
+
data['uuid'] = i.attr('uuid').strip
|
124
|
+
data['download'] = i.attr('downloads').strip
|
125
|
+
data_arr << data
|
126
|
+
}
|
127
|
+
data_arr.uniq
|
128
|
+
end
|
129
|
+
|
130
|
+
def service_family
|
131
|
+
resource_type = @options[:resource]
|
132
|
+
if @api_map[:resource_type].has_key? resource_type
|
133
|
+
@api_map[:resource_type][resource_type][:family]
|
134
|
+
else
|
135
|
+
puts "#{resource_type} is an unrecognised resource type"
|
136
|
+
exit
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def service_name
|
141
|
+
resource_type = @options[:resource_type]
|
142
|
+
@api_map[:resource_type][resource_type][:service]
|
143
|
+
end
|
144
|
+
|
145
|
+
def service_response_name
|
146
|
+
resource_type = @options[:resource_type]
|
147
|
+
@api_map[:resource_type][resource_type][:response]
|
148
|
+
end
|
149
|
+
|
150
|
+
def build_url
|
151
|
+
service = service_name
|
152
|
+
if @options[:latest_api] === false
|
153
|
+
service_api_mode = service
|
154
|
+
else
|
155
|
+
service_api_mode = service + '.current'
|
156
|
+
end
|
157
|
+
@endpoint + '/' + service_api_mode
|
158
|
+
end
|
159
|
+
|
160
|
+
def xpath_query(path)
|
161
|
+
xml = @response.body
|
162
|
+
doc = Nokogiri::XML xml
|
163
|
+
doc.remove_namespaces!
|
164
|
+
doc.xpath path
|
165
|
+
end
|
166
|
+
|
167
|
+
def missing_credentials
|
168
|
+
missing = []
|
169
|
+
if @endpoint.nil?
|
170
|
+
missing << 'endpoint'
|
171
|
+
end
|
172
|
+
if @username.nil?
|
173
|
+
missing << 'username'
|
174
|
+
end
|
175
|
+
if @password.nil?
|
176
|
+
missing << 'password'
|
177
|
+
end
|
178
|
+
missing
|
179
|
+
end
|
180
|
+
|
181
|
+
alias :find :get
|
182
|
+
|
183
|
+
end
|
26
184
|
end
|
data/lib/puree/event.rb
CHANGED
@@ -7,18 +7,23 @@ module Puree
|
|
7
7
|
# @param endpoint [String]
|
8
8
|
# @param optional username [String]
|
9
9
|
# @param optional password [String]
|
10
|
-
|
10
|
+
# @param optional basic_auth [Boolean]
|
11
|
+
def initialize(endpoint: nil, username: nil, password: nil, basic_auth: nil)
|
11
12
|
super(api: :event,
|
12
13
|
endpoint: endpoint,
|
13
14
|
username: username,
|
14
|
-
password: password
|
15
|
+
password: password,
|
16
|
+
basic_auth: basic_auth)
|
15
17
|
end
|
16
18
|
|
19
|
+
|
20
|
+
|
21
|
+
|
17
22
|
# City
|
18
23
|
#
|
19
24
|
# @return [String]
|
20
25
|
def city
|
21
|
-
path = '
|
26
|
+
path = '/city'
|
22
27
|
xpath_query(path).text.strip
|
23
28
|
end
|
24
29
|
|
@@ -26,7 +31,7 @@ module Puree
|
|
26
31
|
#
|
27
32
|
# @return [String]
|
28
33
|
def country
|
29
|
-
path = '
|
34
|
+
path = '/country/term/localizedString'
|
30
35
|
xpath_query(path).text.strip
|
31
36
|
end
|
32
37
|
|
@@ -35,7 +40,7 @@ module Puree
|
|
35
40
|
# @return [Hash]
|
36
41
|
def date
|
37
42
|
data = {}
|
38
|
-
path = '
|
43
|
+
path = '/dateRange'
|
39
44
|
range = xpath_query path
|
40
45
|
data['start'] = range.xpath('startDate').text.strip
|
41
46
|
data['end'] = range.xpath('startDate').text.strip
|
@@ -46,7 +51,7 @@ module Puree
|
|
46
51
|
#
|
47
52
|
# @return [String]
|
48
53
|
def description
|
49
|
-
path = '
|
54
|
+
path = '/description'
|
50
55
|
xpath_query(path).text.strip
|
51
56
|
end
|
52
57
|
|
@@ -54,7 +59,7 @@ module Puree
|
|
54
59
|
#
|
55
60
|
# @return [String]
|
56
61
|
def location
|
57
|
-
path = '
|
62
|
+
path = '/location'
|
58
63
|
xpath_query(path).text.strip
|
59
64
|
end
|
60
65
|
|
@@ -62,16 +67,16 @@ module Puree
|
|
62
67
|
#
|
63
68
|
# @return [String]
|
64
69
|
def title
|
65
|
-
path = '
|
66
|
-
|
70
|
+
path = '/title/localizedString'
|
71
|
+
xpath_query_for_single_value path
|
67
72
|
end
|
68
73
|
|
69
74
|
# Type
|
70
75
|
#
|
71
76
|
# @return [String]
|
72
77
|
def type
|
73
|
-
path = '//
|
74
|
-
|
78
|
+
path = '//typeClassification/term/localizedString'
|
79
|
+
xpath_query_for_single_value path
|
75
80
|
end
|
76
81
|
|
77
82
|
# All metadata
|
data/lib/puree/journal.rb
CHANGED
@@ -7,13 +7,16 @@ module Puree
|
|
7
7
|
# @param endpoint [String]
|
8
8
|
# @param optional username [String]
|
9
9
|
# @param optional password [String]
|
10
|
-
|
10
|
+
# @param optional basic_auth [Boolean]
|
11
|
+
def initialize(endpoint: nil, username: nil, password: nil, basic_auth: nil)
|
11
12
|
super(api: :journal,
|
12
13
|
endpoint: endpoint,
|
13
14
|
username: username,
|
14
|
-
password: password
|
15
|
+
password: password,
|
16
|
+
basic_auth: basic_auth)
|
15
17
|
end
|
16
18
|
|
19
|
+
|
17
20
|
# All metadata
|
18
21
|
#
|
19
22
|
# @return [Hash]
|
data/lib/puree/map.rb
CHANGED
@@ -21,13 +21,19 @@ module Puree
|
|
21
21
|
family: 'dk.atira.pure.modules.datasets.external.model.dataset.DataSet'
|
22
22
|
},
|
23
23
|
download: {
|
24
|
-
|
25
|
-
|
24
|
+
service: 'downloadcount',
|
25
|
+
response: 'GetDownloadCountResponse'
|
26
26
|
},
|
27
|
+
server: {
|
28
|
+
service: 'servermeta',
|
29
|
+
response: 'GetServerMetaResponse'
|
30
|
+
},
|
31
|
+
|
27
32
|
}
|
28
33
|
}
|
29
34
|
|
30
35
|
add_convention
|
36
|
+
# add_family
|
31
37
|
end
|
32
38
|
|
33
39
|
# Pure API map
|
@@ -38,6 +44,7 @@ module Puree
|
|
38
44
|
end
|
39
45
|
|
40
46
|
|
47
|
+
|
41
48
|
private
|
42
49
|
|
43
50
|
def add_convention
|
@@ -49,6 +56,10 @@ module Puree
|
|
49
56
|
end
|
50
57
|
end
|
51
58
|
|
59
|
+
# def add_family
|
60
|
+
# @api_map[:resource_type][:event][:family] = 'dk.atira.pure.api.shared.model.event.Event'
|
61
|
+
# end
|
62
|
+
|
52
63
|
|
53
64
|
end
|
54
65
|
|
data/lib/puree/organisation.rb
CHANGED
@@ -7,19 +7,23 @@ module Puree
|
|
7
7
|
# @param endpoint [String]
|
8
8
|
# @param optional username [String]
|
9
9
|
# @param optional password [String]
|
10
|
-
|
10
|
+
# @param optional basic_auth [Boolean]
|
11
|
+
def initialize(endpoint: nil, username: nil, password: nil, basic_auth: nil)
|
11
12
|
super(api: :organisation,
|
12
13
|
endpoint: endpoint,
|
13
14
|
username: username,
|
14
|
-
password: password
|
15
|
+
password: password,
|
16
|
+
basic_auth: basic_auth)
|
15
17
|
end
|
16
18
|
|
19
|
+
|
20
|
+
|
17
21
|
# Address
|
18
22
|
#
|
19
23
|
# @return [Array<Hash>]
|
20
24
|
def address
|
21
|
-
path = '
|
22
|
-
xpath_result =
|
25
|
+
path = '/addresses/classifiedAddress'
|
26
|
+
xpath_result = xpath_query path
|
23
27
|
|
24
28
|
data = []
|
25
29
|
|
@@ -39,7 +43,7 @@ module Puree
|
|
39
43
|
#
|
40
44
|
# @return [Array<String>]
|
41
45
|
def email
|
42
|
-
path = '
|
46
|
+
path = '/emails/classificationDefinedStringFieldExtension/value'
|
43
47
|
xpath_result = xpath_query path
|
44
48
|
arr = []
|
45
49
|
xpath_result.each { |i| arr << i.text.strip }
|
@@ -50,8 +54,8 @@ module Puree
|
|
50
54
|
#
|
51
55
|
# @return [String]
|
52
56
|
def name
|
53
|
-
|
54
|
-
|
57
|
+
path = '/name/localizedString'
|
58
|
+
xpath_query_for_single_value path
|
55
59
|
end
|
56
60
|
|
57
61
|
# Parent
|
@@ -70,7 +74,7 @@ module Puree
|
|
70
74
|
#
|
71
75
|
# @return [Array<String>]
|
72
76
|
def phone
|
73
|
-
path = '
|
77
|
+
path = '/phoneNumbers/classificationDefinedStringFieldExtension/value'
|
74
78
|
xpath_result = xpath_query path
|
75
79
|
arr = []
|
76
80
|
xpath_result.each { |i| arr << i.text.strip }
|
@@ -81,16 +85,15 @@ module Puree
|
|
81
85
|
#
|
82
86
|
# @return [String]
|
83
87
|
def type
|
84
|
-
path = '
|
85
|
-
|
86
|
-
xpath_result ? xpath_result.text.strip : ''
|
88
|
+
path = '/typeClassification/term/localizedString'
|
89
|
+
xpath_query_for_single_value path
|
87
90
|
end
|
88
91
|
|
89
92
|
# URL
|
90
93
|
#
|
91
94
|
# @return [Array<String>]
|
92
95
|
def url
|
93
|
-
path = '
|
96
|
+
path = '/webAddresses/classificationDefinedFieldExtension/value/localizedString'
|
94
97
|
xpath_result = xpath_query path
|
95
98
|
arr = []
|
96
99
|
xpath_result.each { |i| arr << i.text.strip }
|
@@ -113,14 +116,12 @@ module Puree
|
|
113
116
|
end
|
114
117
|
|
115
118
|
|
116
|
-
private
|
117
|
-
|
118
119
|
|
119
120
|
# Organisation
|
120
121
|
#
|
121
122
|
# @return [Array<Hash>]
|
122
123
|
def organisation
|
123
|
-
path = '
|
124
|
+
path = '/organisations/organisation'
|
124
125
|
xpath_result = xpath_query path
|
125
126
|
|
126
127
|
data = []
|
data/lib/puree/person.rb
CHANGED
@@ -7,29 +7,49 @@ module Puree
|
|
7
7
|
# @param endpoint [String]
|
8
8
|
# @param optional username [String]
|
9
9
|
# @param optional password [String]
|
10
|
-
|
10
|
+
# @param optional basic_auth [Boolean]
|
11
|
+
def initialize(endpoint: nil, username: nil, password: nil, basic_auth: nil)
|
11
12
|
super(api: :person,
|
12
13
|
endpoint: endpoint,
|
13
14
|
username: username,
|
14
|
-
password: password
|
15
|
+
password: password,
|
16
|
+
basic_auth: basic_auth)
|
15
17
|
end
|
16
18
|
|
19
|
+
|
20
|
+
|
17
21
|
# Affiliation
|
18
22
|
#
|
19
|
-
# @return [Array<
|
23
|
+
# @return [Array<Hash>]
|
20
24
|
def affiliation
|
21
|
-
path = '//organisation
|
25
|
+
path = '//organisation'
|
22
26
|
xpath_result = xpath_query path
|
23
|
-
|
24
|
-
xpath_result.each { |i|
|
25
|
-
|
27
|
+
data_arr = []
|
28
|
+
xpath_result.each { |i|
|
29
|
+
data = {}
|
30
|
+
data['uuid'] = i.attr('uuid').strip
|
31
|
+
data['name'] = i.xpath('name/localizedString').text.strip
|
32
|
+
data_arr << data
|
33
|
+
}
|
34
|
+
data_arr.uniq
|
26
35
|
end
|
27
36
|
|
28
|
-
#
|
37
|
+
# Email
|
38
|
+
#
|
39
|
+
# @return [Array]
|
40
|
+
def email
|
41
|
+
path = '//emails/classificationDefinedStringFieldExtension/value'
|
42
|
+
xpath_result = xpath_query path
|
43
|
+
data = []
|
44
|
+
xpath_result.each { |i| data << i.text }
|
45
|
+
data.uniq
|
46
|
+
end
|
47
|
+
|
48
|
+
# Image URL
|
29
49
|
#
|
30
50
|
# @return [Array<String>]
|
31
51
|
def image
|
32
|
-
path = '
|
52
|
+
path = '/photos/file/url'
|
33
53
|
xpath_result = xpath_query path
|
34
54
|
data = []
|
35
55
|
xpath_result.each { |i| data << i.text }
|
@@ -51,12 +71,13 @@ module Puree
|
|
51
71
|
#
|
52
72
|
# @return [Hash]
|
53
73
|
def name
|
54
|
-
|
74
|
+
path = '/name'
|
75
|
+
xpath_result = xpath_query path
|
76
|
+
first = xpath_result.xpath('firstName').text.strip
|
77
|
+
last = xpath_result.xpath('lastName').text.strip
|
55
78
|
o = {}
|
56
|
-
|
57
|
-
|
58
|
-
o['last'] = data['lastName'].strip
|
59
|
-
end
|
79
|
+
o['first'] = first
|
80
|
+
o['last'] = last
|
60
81
|
o
|
61
82
|
end
|
62
83
|
|
@@ -64,8 +85,8 @@ module Puree
|
|
64
85
|
#
|
65
86
|
# @return [String]
|
66
87
|
def orcid
|
67
|
-
|
68
|
-
|
88
|
+
path = '/orcid'
|
89
|
+
xpath_query_for_single_value path
|
69
90
|
end
|
70
91
|
|
71
92
|
# All metadata
|
@@ -74,6 +95,7 @@ module Puree
|
|
74
95
|
def metadata
|
75
96
|
o = super
|
76
97
|
o['affiliation'] = affiliation
|
98
|
+
o['email'] = email
|
77
99
|
o['image'] = image
|
78
100
|
o['keyword'] = keyword
|
79
101
|
o['name'] = name
|