relaton-doi 1.20.0 → 1.20.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/.gitignore +1 -1
- data/lib/relaton_doi/parser.rb +42 -9
- data/lib/relaton_doi/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5c4c9621e29ce8c9e21c5a87dc09a40ee02dbbda06339c629eb89dafc4ad198b
|
|
4
|
+
data.tar.gz: 220d1d32f0cf84917922683c5f6e6eeea6731d2d01e668e2336116d82c4f62ea
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 625c124cd3d8711cd8fdb1e9eeb546ef76686a5b5abd4988545590e201127b24e162f5c1e5279c204ada49abd8cf865da013ecab18032d061810a9c8ff093bf4
|
|
7
|
+
data.tar.gz: 8e3e98bdd1d71630252a59e4ce033ea3f8f3572ec01d312a3cfb772a79c101dd44410b1182d8055399ce8442895bf22c152c78ee5ba68765dfcd9a397fcf254e
|
data/.gitignore
CHANGED
data/lib/relaton_doi/parser.rb
CHANGED
|
@@ -72,6 +72,9 @@ module RelatonDoi
|
|
|
72
72
|
ATTRS = %i[type fetched title docid date link abstract contributor place
|
|
73
73
|
doctype relation extent series medium].freeze
|
|
74
74
|
|
|
75
|
+
CROSSREF_API_URL = "https://api.crossref.org/works?query=%{query}&filter=%{filter}".freeze
|
|
76
|
+
MAX_RETRIES = 3
|
|
77
|
+
|
|
75
78
|
#
|
|
76
79
|
# Initialize instance.
|
|
77
80
|
#
|
|
@@ -384,13 +387,12 @@ module RelatonDoi
|
|
|
384
387
|
#
|
|
385
388
|
# @return [Hash, nil] parent item
|
|
386
389
|
#
|
|
387
|
-
def parent_item
|
|
390
|
+
def parent_item
|
|
388
391
|
@parent_item ||= begin
|
|
389
|
-
query = [@src["container-title"][0], fetch_year].compact.join
|
|
392
|
+
query = CGI.escape [@src["container-title"][0], fetch_year].compact.join("+")
|
|
390
393
|
filter = "type:#{%w[book book-set edited-book monograph reference-book].join ',type:'}"
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
json["message"]["items"].detect { |i| i["title"].include? @src["container-title"][0] }
|
|
394
|
+
items = fetch_crossref(query: query, filter: filter)
|
|
395
|
+
items&.detect { |i| i["title"].include? @src["container-title"][0] }
|
|
394
396
|
end
|
|
395
397
|
end
|
|
396
398
|
|
|
@@ -644,14 +646,13 @@ module RelatonDoi
|
|
|
644
646
|
#
|
|
645
647
|
# @return [String, nil] The location.
|
|
646
648
|
#
|
|
647
|
-
def fetch_location
|
|
649
|
+
def fetch_location
|
|
648
650
|
title = @item[:title].first&.title&.content
|
|
649
651
|
qparts = [title, fetch_year, @src["publisher"]]
|
|
650
652
|
query = CGI.escape qparts.compact.join("+").gsub(" ", "+")
|
|
651
653
|
filter = "type:#{%w[book-chapter book-part book-section book-track].join(',type:')}"
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
json["message"]["items"].detect do |i|
|
|
654
|
+
items = fetch_crossref(query: query, filter: filter)
|
|
655
|
+
items&.detect do |i|
|
|
655
656
|
i["publisher-location"] && i["container-title"].include?(title)
|
|
656
657
|
end&.dig("publisher-location")
|
|
657
658
|
end
|
|
@@ -769,5 +770,37 @@ module RelatonDoi
|
|
|
769
770
|
|
|
770
771
|
RelatonBib::Medium.new genre: genre
|
|
771
772
|
end
|
|
773
|
+
|
|
774
|
+
#
|
|
775
|
+
# Fetch data from Crossref API with retry logic.
|
|
776
|
+
#
|
|
777
|
+
# @param [String] query The query string.
|
|
778
|
+
# @param [String] filter The filter string.
|
|
779
|
+
#
|
|
780
|
+
# @return [Array<Hash>, nil] Items array from response or nil for 4xx responses.
|
|
781
|
+
#
|
|
782
|
+
# @raise [RelatonBib::RequestError] If request fails after retries.
|
|
783
|
+
#
|
|
784
|
+
def fetch_crossref(query:, filter:) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
785
|
+
url = format(CROSSREF_API_URL, query: query, filter: filter)
|
|
786
|
+
retries = 0
|
|
787
|
+
begin
|
|
788
|
+
resp = Faraday.get url
|
|
789
|
+
case resp.status
|
|
790
|
+
when 200..299
|
|
791
|
+
JSON.parse(resp.body).dig("message", "items")
|
|
792
|
+
when 400..499
|
|
793
|
+
nil
|
|
794
|
+
else
|
|
795
|
+
raise RelatonBib::RequestError, "Crossref request failed: #{resp.status} #{resp.body}"
|
|
796
|
+
end
|
|
797
|
+
rescue Faraday::Error => e
|
|
798
|
+
retries += 1
|
|
799
|
+
retry if retries <= MAX_RETRIES
|
|
800
|
+
raise RelatonBib::RequestError, "Crossref network error after #{MAX_RETRIES} retries: #{e.message}"
|
|
801
|
+
rescue JSON::ParserError => e
|
|
802
|
+
raise RelatonBib::RequestError, "Crossref JSON parsing error: #{e.message}"
|
|
803
|
+
end
|
|
804
|
+
end
|
|
772
805
|
end
|
|
773
806
|
end
|
data/lib/relaton_doi/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: relaton-doi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.20.
|
|
4
|
+
version: 1.20.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-01-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: relaton-bib
|
|
@@ -141,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
141
141
|
- !ruby/object:Gem::Version
|
|
142
142
|
version: '0'
|
|
143
143
|
requirements: []
|
|
144
|
-
rubygems_version: 3.
|
|
144
|
+
rubygems_version: 3.5.22
|
|
145
145
|
signing_key:
|
|
146
146
|
specification_version: 4
|
|
147
147
|
summary: 'RelatonDOI: retrieve Standards for bibliographic using DOI through Crossrefand
|