relaton-doi 1.20.2 → 2.0.0.pre.alpha.1
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/.github/workflows/rake.yml +0 -1
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -1
- data/CLAUDE.md +45 -0
- data/README.adoc +24 -25
- data/lib/relaton/doi/crossref.rb +64 -0
- data/lib/relaton/doi/parser.rb +827 -0
- data/lib/relaton/doi/processor.rb +64 -0
- data/lib/relaton/doi/util.rb +8 -0
- data/lib/relaton/doi/version.rb +7 -0
- data/lib/relaton/doi.rb +24 -0
- data/relaton-doi.gemspec +8 -8
- metadata +21 -23
- data/lib/relaton_doi/crossref.rb +0 -74
- data/lib/relaton_doi/parser.rb +0 -806
- data/lib/relaton_doi/processor.rb +0 -57
- data/lib/relaton_doi/util.rb +0 -6
- data/lib/relaton_doi/version.rb +0 -5
- data/lib/relaton_doi.rb +0 -27
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require "relaton/core/processor"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Doi
|
|
5
|
+
class Processor < Core::Processor
|
|
6
|
+
attr_reader :idtype
|
|
7
|
+
|
|
8
|
+
def initialize # rubocop:disable Lint/MissingSuper
|
|
9
|
+
@short = :relaton_doi
|
|
10
|
+
@prefix = "DOI"
|
|
11
|
+
@defaultprefix = %r{^doi:}
|
|
12
|
+
@idtype = "DOI"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @param code [String] DOI
|
|
16
|
+
# @param date [String, nil] year
|
|
17
|
+
# @param opts [Hash]
|
|
18
|
+
# @return [RelatonBib::BibliographicItem]
|
|
19
|
+
def get(code, _date, _opts)
|
|
20
|
+
require_relative "../doi"
|
|
21
|
+
Crossref.get(code)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# @param [String] source source name
|
|
26
|
+
# @param [Hash] opts
|
|
27
|
+
# @option opts [String] :output directory to output documents
|
|
28
|
+
# @option opts [String] :format
|
|
29
|
+
#
|
|
30
|
+
def fetch_data(_source, _opts)
|
|
31
|
+
Util.info "This processor does not support fetching data by source name. Use `get` method with DOI instead."
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param xml [String]
|
|
35
|
+
# @return [Bib::ItemData]
|
|
36
|
+
def from_xml(xml)
|
|
37
|
+
require_relative "../doi"
|
|
38
|
+
Bib::Item.from_xml xml
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param yaml [String]
|
|
42
|
+
# @return [Bib::ItemData]
|
|
43
|
+
def from_yaml(yaml)
|
|
44
|
+
require_relative "../doi"
|
|
45
|
+
Bib::Item.from_yaml yaml
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns hash of XML grammar
|
|
49
|
+
# @return [String]
|
|
50
|
+
def grammar_hash
|
|
51
|
+
require_relative "../doi"
|
|
52
|
+
@grammar_hash ||= ::Relaton::Doi.grammar_hash
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def remove_index_file
|
|
56
|
+
Util.info "This processor does not support index file. No action taken."
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Returns number of threads
|
|
60
|
+
# @return [Integer]
|
|
61
|
+
def threads = 2
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
data/lib/relaton/doi.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "relaton/bipm"
|
|
4
|
+
require "relaton/ietf"
|
|
5
|
+
require "relaton/ieee"
|
|
6
|
+
require "relaton/nist"
|
|
7
|
+
require_relative "doi/version"
|
|
8
|
+
require_relative "doi/util"
|
|
9
|
+
require_relative "doi/parser"
|
|
10
|
+
require_relative "doi/crossref"
|
|
11
|
+
|
|
12
|
+
module Relaton
|
|
13
|
+
module Doi
|
|
14
|
+
extend self
|
|
15
|
+
|
|
16
|
+
def grammar_hash
|
|
17
|
+
bipm_ver = Gem.loaded_specs["relaton-bipm"].version.to_s
|
|
18
|
+
Digest::MD5.hexdigest(
|
|
19
|
+
Relaton::Nist::VERSION + Relaton::Ietf::VERSION + Relaton::Ieee::VERSION +
|
|
20
|
+
bipm_ver + Relaton::Bib::VERSION,
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/relaton-doi.gemspec
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "lib/
|
|
3
|
+
require_relative "lib/relaton/doi/version"
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "relaton-doi"
|
|
7
|
-
spec.version =
|
|
7
|
+
spec.version = Relaton::Doi::VERSION
|
|
8
8
|
spec.authors = ["Ribose Inc."]
|
|
9
9
|
spec.email = ["open.source@ribose.com"]
|
|
10
10
|
|
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
|
14
14
|
"using DOI through Crossrefand provide Relaton object."
|
|
15
15
|
spec.homepage = "https://github.com/relaton/relaton-doi"
|
|
16
16
|
spec.license = "BSD-2-Clause"
|
|
17
|
-
spec.required_ruby_version = ">= 2.
|
|
17
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 3.2.0")
|
|
18
18
|
|
|
19
19
|
# spec.metadata["allowed_push_host"] = "TODO: Set to 'https://mygemserver.com'"
|
|
20
20
|
|
|
@@ -34,11 +34,11 @@ Gem::Specification.new do |spec|
|
|
|
34
34
|
# Uncomment to register a new dependency of your gem
|
|
35
35
|
# spec.add_dependency "example-gem", "~> 1.0"
|
|
36
36
|
|
|
37
|
-
spec.add_dependency "relaton-bib", "~>
|
|
38
|
-
spec.add_dependency "relaton-bipm", "~>
|
|
39
|
-
spec.add_dependency "relaton-ieee", "~>
|
|
40
|
-
spec.add_dependency "relaton-ietf", "~>
|
|
41
|
-
spec.add_dependency "relaton-nist", "~>
|
|
37
|
+
spec.add_dependency "relaton-bib", "~> 2.0.0-alpha.4"
|
|
38
|
+
spec.add_dependency "relaton-bipm", "~> 2.0.0-alpha.1"
|
|
39
|
+
spec.add_dependency "relaton-ieee", "~> 2.0.0-alpha.1"
|
|
40
|
+
spec.add_dependency "relaton-ietf", "~> 2.0.0-alpha.2"
|
|
41
|
+
spec.add_dependency "relaton-nist", "~> 2.0.0-alpha.2"
|
|
42
42
|
# spec.add_dependency "relaton-w3c", "~> 1.10.0"
|
|
43
43
|
spec.add_dependency "faraday", "~> 2.7"
|
|
44
44
|
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: relaton-doi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.0.pre.alpha.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: relaton-bib
|
|
@@ -16,70 +15,70 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
18
|
+
version: 2.0.0.pre.alpha.4
|
|
20
19
|
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - "~>"
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
25
|
+
version: 2.0.0.pre.alpha.4
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
27
|
name: relaton-bipm
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - "~>"
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
32
|
+
version: 2.0.0.pre.alpha.1
|
|
34
33
|
type: :runtime
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - "~>"
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
39
|
+
version: 2.0.0.pre.alpha.1
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
41
|
name: relaton-ieee
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
44
43
|
requirements:
|
|
45
44
|
- - "~>"
|
|
46
45
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
46
|
+
version: 2.0.0.pre.alpha.1
|
|
48
47
|
type: :runtime
|
|
49
48
|
prerelease: false
|
|
50
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
50
|
requirements:
|
|
52
51
|
- - "~>"
|
|
53
52
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
53
|
+
version: 2.0.0.pre.alpha.1
|
|
55
54
|
- !ruby/object:Gem::Dependency
|
|
56
55
|
name: relaton-ietf
|
|
57
56
|
requirement: !ruby/object:Gem::Requirement
|
|
58
57
|
requirements:
|
|
59
58
|
- - "~>"
|
|
60
59
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
60
|
+
version: 2.0.0.pre.alpha.2
|
|
62
61
|
type: :runtime
|
|
63
62
|
prerelease: false
|
|
64
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
64
|
requirements:
|
|
66
65
|
- - "~>"
|
|
67
66
|
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
67
|
+
version: 2.0.0.pre.alpha.2
|
|
69
68
|
- !ruby/object:Gem::Dependency
|
|
70
69
|
name: relaton-nist
|
|
71
70
|
requirement: !ruby/object:Gem::Requirement
|
|
72
71
|
requirements:
|
|
73
72
|
- - "~>"
|
|
74
73
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
74
|
+
version: 2.0.0.pre.alpha.2
|
|
76
75
|
type: :runtime
|
|
77
76
|
prerelease: false
|
|
78
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
78
|
requirements:
|
|
80
79
|
- - "~>"
|
|
81
80
|
- !ruby/object:Gem::Version
|
|
82
|
-
version:
|
|
81
|
+
version: 2.0.0.pre.alpha.2
|
|
83
82
|
- !ruby/object:Gem::Dependency
|
|
84
83
|
name: faraday
|
|
85
84
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -107,6 +106,7 @@ files:
|
|
|
107
106
|
- ".gitignore"
|
|
108
107
|
- ".rspec"
|
|
109
108
|
- ".rubocop.yml"
|
|
109
|
+
- CLAUDE.md
|
|
110
110
|
- Gemfile
|
|
111
111
|
- LICENSE.txt
|
|
112
112
|
- README.adoc
|
|
@@ -114,19 +114,18 @@ files:
|
|
|
114
114
|
- bin/console
|
|
115
115
|
- bin/rspec
|
|
116
116
|
- bin/setup
|
|
117
|
-
- lib/
|
|
118
|
-
- lib/
|
|
119
|
-
- lib/
|
|
120
|
-
- lib/
|
|
121
|
-
- lib/
|
|
122
|
-
- lib/
|
|
117
|
+
- lib/relaton/doi.rb
|
|
118
|
+
- lib/relaton/doi/crossref.rb
|
|
119
|
+
- lib/relaton/doi/parser.rb
|
|
120
|
+
- lib/relaton/doi/processor.rb
|
|
121
|
+
- lib/relaton/doi/util.rb
|
|
122
|
+
- lib/relaton/doi/version.rb
|
|
123
123
|
- relaton-doi.gemspec
|
|
124
124
|
homepage: https://github.com/relaton/relaton-doi
|
|
125
125
|
licenses:
|
|
126
126
|
- BSD-2-Clause
|
|
127
127
|
metadata:
|
|
128
128
|
homepage_uri: https://github.com/relaton/relaton-doi
|
|
129
|
-
post_install_message:
|
|
130
129
|
rdoc_options: []
|
|
131
130
|
require_paths:
|
|
132
131
|
- lib
|
|
@@ -134,15 +133,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
134
133
|
requirements:
|
|
135
134
|
- - ">="
|
|
136
135
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: 2.
|
|
136
|
+
version: 3.2.0
|
|
138
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
138
|
requirements:
|
|
140
139
|
- - ">="
|
|
141
140
|
- !ruby/object:Gem::Version
|
|
142
141
|
version: '0'
|
|
143
142
|
requirements: []
|
|
144
|
-
rubygems_version: 3.
|
|
145
|
-
signing_key:
|
|
143
|
+
rubygems_version: 3.6.9
|
|
146
144
|
specification_version: 4
|
|
147
145
|
summary: 'RelatonDOI: retrieve Standards for bibliographic using DOI through Crossrefand
|
|
148
146
|
provide Relaton object.'
|
data/lib/relaton_doi/crossref.rb
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require "faraday"
|
|
2
|
-
require "uri"
|
|
3
|
-
|
|
4
|
-
module RelatonDoi
|
|
5
|
-
module Crossref
|
|
6
|
-
extend self
|
|
7
|
-
|
|
8
|
-
HEADER = {
|
|
9
|
-
"User-Agent" => "Relaton/RelatonDoi (https://www.relaton.org/guides/doi/; mailto:open.source@ribose.com)"
|
|
10
|
-
}.freeze
|
|
11
|
-
|
|
12
|
-
MAX_REDIRECTS = 5
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
# Get a document by DOI from the CrossRef API.
|
|
16
|
-
#
|
|
17
|
-
# @param [String] doi The DOI.
|
|
18
|
-
#
|
|
19
|
-
# @return [RelatonBib::BibliographicItem, RelatonIetf::IetfBibliographicItem,
|
|
20
|
-
# RelatonBipm::BipmBibliographicItem, RelatonIeee::IeeeBibliographicItem,
|
|
21
|
-
# RelatonNist::NistBibliographicItem] The bibitem.
|
|
22
|
-
#
|
|
23
|
-
def get(doi)
|
|
24
|
-
Util.info "Fetching from search.crossref.org ...", key: doi
|
|
25
|
-
id = doi.sub(%r{^doi:}, "")
|
|
26
|
-
message = get_by_id id
|
|
27
|
-
if message
|
|
28
|
-
Util.info "Found: `#{message['DOI']}`", key: doi
|
|
29
|
-
Parser.parse message
|
|
30
|
-
else
|
|
31
|
-
Util.info "Not found.", key: doi
|
|
32
|
-
nil
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
#
|
|
37
|
-
# Get a document by DOI from the CrossRef API.
|
|
38
|
-
#
|
|
39
|
-
# @param [String] id The DOI.
|
|
40
|
-
#
|
|
41
|
-
# @return [Hash] The document.
|
|
42
|
-
#
|
|
43
|
-
def get_by_id(id) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
44
|
-
n = 0
|
|
45
|
-
redirects = 0
|
|
46
|
-
url = "https://api.crossref.org/works/#{CGI.escape(id)}"
|
|
47
|
-
loop do
|
|
48
|
-
resp = Faraday.get url, nil, HEADER
|
|
49
|
-
case resp.status
|
|
50
|
-
when 200
|
|
51
|
-
work = JSON.parse resp.body
|
|
52
|
-
return work["message"] if work["status"] == "ok"
|
|
53
|
-
when 404 then return nil
|
|
54
|
-
when 301, 302
|
|
55
|
-
raise RelatonBib::RequestError, "Crossref error: too many redirects" if redirects >= MAX_REDIRECTS
|
|
56
|
-
|
|
57
|
-
location = resp.headers["location"] || resp.headers["Location"]
|
|
58
|
-
raise RelatonBib::RequestError, "Crossref error: redirect without Location" if location.nil? || location.empty?
|
|
59
|
-
|
|
60
|
-
url = URI.join(url, location).to_s
|
|
61
|
-
redirects += 1
|
|
62
|
-
next
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
if n > 1
|
|
66
|
-
raise RelatonBib::RequestError, "Crossref error: #{resp.body}"
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
n += 1
|
|
70
|
-
sleep resp.headers["x-rate-limit-interval"].to_i * n
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|