puree 1.6.0 → 1.7.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/CHANGELOG.md +8 -0
- data/README.md +2 -2
- data/lib/puree.rb +1 -0
- data/lib/puree/api/person_request.rb +64 -0
- data/lib/puree/api/request.rb +5 -2
- data/lib/puree/extractor/dataset.rb +12 -0
- data/lib/puree/extractor/person.rb +36 -0
- data/lib/puree/model/person.rb +6 -0
- data/lib/puree/query/funding.rb +2 -17
- data/lib/puree/version.rb +1 -1
- data/lib/puree/xml_extractor/person.rb +26 -8
- data/spec/query/person_http_spec.rb +22 -0
- data/spec/resource/person_http_spec.rb +8 -0
- data/spec/spec_helper.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 585ed698743104873457d87a11f27bb057dbf058
|
4
|
+
data.tar.gz: d07c203393a1bf086334717f3ba1a7522b6ad112
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18bf2dc5e85692a4a9f575426c8716ace87239070f84545a57de4cb9936ebee91c4321ac53a1e87e0fe7ad20409c663efd3fe09f434ac28487e15acacfc343bb
|
7
|
+
data.tar.gz: 0e6696e6c19c715186622a29bb73e2175a8ed0aed1c69bf220aed3d03f9653fbe86614ee317657d56c276d9779fc582b54aba324e0030d540b41e13c5a45a6fd
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,14 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
5
5
|
## Unreleased
|
6
6
|
- Metadata: activity?, clipping?, externalPerson?
|
7
7
|
|
8
|
+
## 1.7.0 - 2017-11-03
|
9
|
+
### Added
|
10
|
+
- Person extractor - find by identifier.
|
11
|
+
- Person - HESA id, Scopus id.
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
- Person - employee_id presence.
|
15
|
+
|
8
16
|
## 1.6.0 - 2017-10-24
|
9
17
|
### Added
|
10
18
|
- ExternalOrganisation.
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# Purée
|
2
2
|
|
3
3
|
Metadata extraction from the Pure Research Information System.
|
4
4
|
|
@@ -126,7 +126,7 @@ funding_query.project_funders uuid: 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
|
|
126
126
|
#<Puree::Model::ExternalOrganisation:0x98986f0>
|
127
127
|
```
|
128
128
|
|
129
|
-
Who are the funders (if any) for a publication
|
129
|
+
Who are the funders (if any) for a publication?
|
130
130
|
|
131
131
|
```ruby
|
132
132
|
funding_query.publication_funders uuid: 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
|
data/lib/puree.rb
CHANGED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Puree
|
2
|
+
|
3
|
+
module API
|
4
|
+
|
5
|
+
# Handles requests to Pure.
|
6
|
+
#
|
7
|
+
class PersonRequest < Puree::API::Request
|
8
|
+
|
9
|
+
def initialize(url:)
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
# Perform a GET request to Pure
|
14
|
+
#
|
15
|
+
# @param uuid [String]
|
16
|
+
# @param id [String]
|
17
|
+
# @param employee_id [String]
|
18
|
+
# @param rendering [String]
|
19
|
+
# @param latest_api [Boolean]
|
20
|
+
# @param resource_type [String]
|
21
|
+
# @return [HTTP::Response]
|
22
|
+
def get(uuid: nil,
|
23
|
+
id: nil,
|
24
|
+
employee_id: nil,
|
25
|
+
rendering: :xml_long,
|
26
|
+
latest_api: true,
|
27
|
+
resource_type:)
|
28
|
+
@latest_api = latest_api
|
29
|
+
@resource_type = resource_type.to_sym
|
30
|
+
@rendering = rendering
|
31
|
+
@uuid = uuid
|
32
|
+
@id = id
|
33
|
+
@employee_id = employee_id
|
34
|
+
|
35
|
+
# strip any trailing slash
|
36
|
+
@url = @url.sub(/(\/)+$/, '')
|
37
|
+
@headers['Accept'] = 'application/xml'
|
38
|
+
@req = HTTP.headers accept: @headers['Accept']
|
39
|
+
if @headers['Authorization']
|
40
|
+
@req = @req.auth @headers['Authorization']
|
41
|
+
end
|
42
|
+
@req.get(build_url, params: parameters)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def parameters
|
48
|
+
query = {}
|
49
|
+
if @uuid
|
50
|
+
query['uuids.uuid'] = @uuid
|
51
|
+
elsif @id
|
52
|
+
query['pureInternalIds.id'] = @id
|
53
|
+
elsif @employee_id
|
54
|
+
query['personEmployeeIds.value'] = @employee_id
|
55
|
+
end
|
56
|
+
query['rendering'] = @rendering
|
57
|
+
query
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
data/lib/puree/api/request.rb
CHANGED
@@ -25,6 +25,7 @@ module Puree
|
|
25
25
|
#
|
26
26
|
# @param uuid [String]
|
27
27
|
# @param id [String]
|
28
|
+
# @param params [Hash]
|
28
29
|
# @param rendering [String]
|
29
30
|
# @param latest_api [Boolean]
|
30
31
|
# @param resource_type [String]
|
@@ -38,6 +39,7 @@ module Puree
|
|
38
39
|
# @return [HTTP::Response]
|
39
40
|
def get(uuid: nil,
|
40
41
|
id: nil,
|
42
|
+
params: {},
|
41
43
|
rendering: :xml_long,
|
42
44
|
latest_api: true,
|
43
45
|
resource_type:,
|
@@ -53,6 +55,7 @@ module Puree
|
|
53
55
|
@rendering = rendering
|
54
56
|
@uuid = uuid
|
55
57
|
@id = id
|
58
|
+
@params = params
|
56
59
|
@limit = limit
|
57
60
|
@offset = offset
|
58
61
|
@created_start = created_start
|
@@ -68,12 +71,12 @@ module Puree
|
|
68
71
|
if @headers['Authorization']
|
69
72
|
@req = @req.auth @headers['Authorization']
|
70
73
|
end
|
71
|
-
@req.get(build_url, params:
|
74
|
+
@req.get(build_url, params: parameters)
|
72
75
|
end
|
73
76
|
|
74
77
|
private
|
75
78
|
|
76
|
-
def
|
79
|
+
def parameters
|
77
80
|
query = {}
|
78
81
|
if @uuid
|
79
82
|
query['uuids.uuid'] = @uuid
|
@@ -42,6 +42,18 @@ module Puree
|
|
42
42
|
@model
|
43
43
|
end
|
44
44
|
|
45
|
+
def configure_api(config)
|
46
|
+
@config = Puree::API::Configuration.new url: config[:url]
|
47
|
+
@config.basic_auth username: config[:username],
|
48
|
+
password: config[:password]
|
49
|
+
|
50
|
+
@request = Puree::API::PersonRequest.new url: @config.url
|
51
|
+
if @config.basic_auth?
|
52
|
+
@request.basic_auth username: @config.username,
|
53
|
+
password: @config.password
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
45
57
|
end
|
46
58
|
|
47
59
|
end
|
@@ -12,6 +12,22 @@ module Puree
|
|
12
12
|
setup :person
|
13
13
|
end
|
14
14
|
|
15
|
+
# Find a person by identifier.
|
16
|
+
#
|
17
|
+
# @param uuid [String]
|
18
|
+
# @param id [String]
|
19
|
+
# @param employee_id [String]
|
20
|
+
# @return [Puree::Model::Person]
|
21
|
+
def find_by_id(uuid: nil, id: nil, employee_id: nil)
|
22
|
+
raise 'Cannot perform a request without a configuration' if @config.nil?
|
23
|
+
@response = @request.get uuid: uuid,
|
24
|
+
id: id,
|
25
|
+
employee_id: employee_id,
|
26
|
+
latest_api: @latest_api,
|
27
|
+
resource_type: @resource_type
|
28
|
+
set_content @response.body
|
29
|
+
end
|
30
|
+
|
15
31
|
private
|
16
32
|
|
17
33
|
def combine_metadata
|
@@ -19,13 +35,33 @@ module Puree
|
|
19
35
|
@model.affiliations = @extractor.affiliations
|
20
36
|
@model.email_addresses = @extractor.email_addresses
|
21
37
|
@model.employee_id = @extractor.employee_id
|
38
|
+
@model.hesa_id = @extractor.hesa_id
|
22
39
|
@model.image_urls = @extractor.image_urls
|
23
40
|
@model.keywords = @extractor.keywords
|
24
41
|
@model.name = @extractor.name
|
25
42
|
@model.orcid = @extractor.orcid
|
43
|
+
@model.scopus_id = @extractor.scopus_id
|
26
44
|
@model
|
27
45
|
end
|
28
46
|
|
47
|
+
# Configure a Pure host for API access.
|
48
|
+
#
|
49
|
+
# @param config [Hash]
|
50
|
+
# @option config [String] :url The URL of the Pure host.
|
51
|
+
# @option config [String] :username The username of the Pure host account.
|
52
|
+
# @option config [String] :password The password of the Pure host account.
|
53
|
+
def configure_api(config)
|
54
|
+
@config = Puree::API::Configuration.new url: config[:url]
|
55
|
+
@config.basic_auth username: config[:username],
|
56
|
+
password: config[:password]
|
57
|
+
|
58
|
+
@request = Puree::API::PersonRequest.new url: @config.url
|
59
|
+
if @config.basic_auth?
|
60
|
+
@request.basic_auth username: @config.username,
|
61
|
+
password: @config.password
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
29
65
|
end
|
30
66
|
|
31
67
|
end
|
data/lib/puree/model/person.rb
CHANGED
@@ -14,6 +14,9 @@ module Puree
|
|
14
14
|
# @return [String, nil]
|
15
15
|
attr_accessor :employee_id
|
16
16
|
|
17
|
+
# @return [String, nil]
|
18
|
+
attr_accessor :hesa_id
|
19
|
+
|
17
20
|
# @return [Array<String>]
|
18
21
|
attr_accessor :image_urls
|
19
22
|
|
@@ -26,6 +29,9 @@ module Puree
|
|
26
29
|
# @return [String, nil]
|
27
30
|
attr_accessor :orcid
|
28
31
|
|
32
|
+
# @return [String, nil]
|
33
|
+
attr_accessor :scopus_id
|
34
|
+
|
29
35
|
end
|
30
36
|
end
|
31
37
|
end
|
data/lib/puree/query/funding.rb
CHANGED
@@ -26,7 +26,7 @@ module Puree
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
funders.uniq { |i| i.uuid }
|
30
30
|
end
|
31
31
|
|
32
32
|
# Publication funders
|
@@ -44,22 +44,7 @@ module Puree
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def deduplicate_funders(funders)
|
53
|
-
uuids_in_list = []
|
54
|
-
funder_list = []
|
55
|
-
funders.each do |funder|
|
56
|
-
uuid = funder.uuid
|
57
|
-
unless uuids_in_list.include? uuid
|
58
|
-
funder_list << funder
|
59
|
-
uuids_in_list << uuid
|
60
|
-
end
|
61
|
-
end
|
62
|
-
funder_list
|
47
|
+
funders.uniq { |i| i.uuid }
|
63
48
|
end
|
64
49
|
|
65
50
|
end
|
data/lib/puree/version.rb
CHANGED
@@ -24,14 +24,12 @@ module Puree
|
|
24
24
|
|
25
25
|
# @return [String, nil]
|
26
26
|
def employee_id
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
27
|
+
id '/dk/atira/pure/person/personsources/employee'
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [String, nil]
|
31
|
+
def hesa_id
|
32
|
+
id '/dk/atira/pure/person/personsources/hesastaff'
|
35
33
|
end
|
36
34
|
|
37
35
|
# @return [Array<String>]
|
@@ -62,6 +60,26 @@ module Puree
|
|
62
60
|
xpath_query_for_single_value '/orcid'
|
63
61
|
end
|
64
62
|
|
63
|
+
# @return [String, nil]
|
64
|
+
def scopus_id
|
65
|
+
id '/dk/atira/pure/person/personsources/scopusauthor'
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# @return [String, nil]
|
71
|
+
def id(uri)
|
72
|
+
xpath_result = xpath_query '/sources/classificationDefinedStringFieldExtension'
|
73
|
+
if xpath_result
|
74
|
+
xpath_result.each do |i|
|
75
|
+
if i.xpath('classification/uri').text.strip === uri
|
76
|
+
return i.xpath('value').text.strip
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
|
65
83
|
end
|
66
84
|
|
67
85
|
end
|
@@ -25,6 +25,28 @@ describe 'Person' do
|
|
25
25
|
expect(publications).to all( be_a Puree::Model::Publication )
|
26
26
|
end
|
27
27
|
|
28
|
+
it '#publications_offset' do
|
29
|
+
publications = @q.publications uuid: @person_uuid,
|
30
|
+
limit: 3,
|
31
|
+
offset: 1
|
32
|
+
expect(publications).to all( be_a Puree::Model::Publication )
|
33
|
+
end
|
34
|
+
|
35
|
+
it '#publications_published_start' do
|
36
|
+
publications = @q.publications uuid: @person_uuid,
|
37
|
+
limit: 3,
|
38
|
+
published_start: '2017-01-01'
|
39
|
+
expect(publications).to all( be_a Puree::Model::Publication )
|
40
|
+
end
|
41
|
+
|
42
|
+
it '#publications_published_start_published_end' do
|
43
|
+
publications = @q.publications uuid: @person_uuid,
|
44
|
+
limit: 3,
|
45
|
+
published_start: '2017-01-01',
|
46
|
+
published_end: '2017-12-31'
|
47
|
+
expect(publications).to all( be_a Puree::Model::Publication )
|
48
|
+
end
|
49
|
+
|
28
50
|
end
|
29
51
|
|
30
52
|
end
|
@@ -31,6 +31,10 @@ describe 'Person' do
|
|
31
31
|
expect(@p.employee_id).to be_a String if @p.employee_id
|
32
32
|
end
|
33
33
|
|
34
|
+
it '#hesa_id' do
|
35
|
+
expect(@p.hesa_id).to be_a String if @p.hesa_id
|
36
|
+
end
|
37
|
+
|
34
38
|
it '#image_urls' do
|
35
39
|
expect(@p.image_urls).to all( be_a String )
|
36
40
|
end
|
@@ -47,6 +51,10 @@ describe 'Person' do
|
|
47
51
|
expect(@p.orcid).to be_a String if @p.orcid
|
48
52
|
end
|
49
53
|
|
54
|
+
it '#scopus_id' do
|
55
|
+
expect(@p.scopus_id).to be_a String if @p.scopus_id
|
56
|
+
end
|
57
|
+
|
50
58
|
end
|
51
59
|
|
52
60
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Albin-Clark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- lib/puree/api/authentication.rb
|
71
71
|
- lib/puree/api/configuration.rb
|
72
72
|
- lib/puree/api/map.rb
|
73
|
+
- lib/puree/api/person_request.rb
|
73
74
|
- lib/puree/api/request.rb
|
74
75
|
- lib/puree/extractor/collection.rb
|
75
76
|
- lib/puree/extractor/conference_paper.rb
|