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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e66ca4437d94ffeac6945497a91654da92bb5544bc56e78b3ebe0f83aeef378
4
- data.tar.gz: 54cafe810c6d76933a26b7615bcd9fcc83f83b7675a0d6f1f172b00b4e153431
3
+ metadata.gz: 5c4c9621e29ce8c9e21c5a87dc09a40ee02dbbda06339c629eb89dafc4ad198b
4
+ data.tar.gz: 220d1d32f0cf84917922683c5f6e6eeea6731d2d01e668e2336116d82c4f62ea
5
5
  SHA512:
6
- metadata.gz: 9f06ef7c398a2283fdc202ece06acaac02c97025faebd66b7d45f97c303f87198e03f026c59b7597d7f0bc9aabf6fd69214b56eff36ab34b223f1ba0279fff8a
7
- data.tar.gz: 80e7bd0e609908b924896f0649d63d6b4b50245784a4d9ec57a52ad17d9a01e215ef5e233132b0cec02fbae770b8ed7a137cee59bb3a0a5f7face5e4aef8ec15
6
+ metadata.gz: 625c124cd3d8711cd8fdb1e9eeb546ef76686a5b5abd4988545590e201127b24e162f5c1e5279c204ada49abd8cf865da013ecab18032d061810a9c8ff093bf4
7
+ data.tar.gz: 8e3e98bdd1d71630252a59e4ce033ea3f8f3572ec01d312a3cfb772a79c101dd44410b1182d8055399ce8442895bf22c152c78ee5ba68765dfcd9a397fcf254e
data/.gitignore CHANGED
@@ -10,6 +10,6 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
- .rubocop-https---raw-githubusercontent-com-riboseinc-oss-guides-master-ci-rubocop-yml
14
13
  Gemfile.lock
15
14
  .vscode/
15
+ .rubocop-remote-87c7cdd254a8d09d005ee06efac7acc0.yml
@@ -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 # rubocop:disable Metrics/AbcSize
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
- resp = Faraday.get "https://api.crossref.org/works?query=#{query}&filter=#{filter}"
392
- json = JSON.parse resp.body
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 # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
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
- resp = Faraday.get "https://api.crossref.org/works?query=#{query}&filter=#{filter}"
653
- json = JSON.parse resp.body
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RelatonDoi
4
- VERSION = "1.20.0"
4
+ VERSION = "1.20.1"
5
5
  end
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.0
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: 2024-12-13 00:00:00.000000000 Z
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.3.27
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