relaton-iso 1.15.4 → 1.15.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 849d2ed5597da449397be8d44059b7c88d799bb118ff53cb13abcb67b90ec98c
4
- data.tar.gz: 4084d1465fee0a3bc9062734d405eb97a1a28e18e866a473433026509a8907e1
3
+ metadata.gz: fadb60d3f225174438b872a27c8632fcb9dcb685b66ef67071b7ab16dd78f052
4
+ data.tar.gz: b53c685d0adf0856851f31d1808654f59f16d0ccd8db70b2ef818b22126e505e
5
5
  SHA512:
6
- metadata.gz: 800e61c17385335e14b7fa56d9d29031db9a43ce6d908fd21dcd841db1422c2addec5a78e2a44aad4ceb170754167b79530c891d97ae54aff519900bfdcc0ebb
7
- data.tar.gz: 00eb78136a9f91335f412d5af3d64fd83fce8d94b2fcce13e252dca09ac36eb2ec1e5fd3e025cda196be92f4d6fda49b17239f8bd4a6611ba7b177f0ecc302ab
6
+ metadata.gz: a10856c01099b1590b99ab0c2102aaf6dee654bd3fdf0b6a7f0717d3f85881bc58999219168e6ba707846cbd3fc785fbc9951003d7c21ad6c134af2a0fb0d4ea
7
+ data.tar.gz: a9a4b7a79acf34a0a42218f28979ec06a41c0b6305fcfbb77ebec0cf4881e2b806548ae5603112122420f1c4ed0d365d9be50a2c291fb4d5a00fe68534f2311b
@@ -7,7 +7,8 @@ on:
7
7
  inputs:
8
8
  next_version:
9
9
  description: |
10
- Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
10
+ Next release version. Possible values: x.y.z, major, minor, patch (or pre|rc|etc).
11
+ Also, you can pass 'skip' to skip 'git tag' and do 'gem push' for the current version
11
12
  required: true
12
13
  default: 'skip'
13
14
  repository_dispatch:
data/Gemfile CHANGED
@@ -6,7 +6,10 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
  gemspec
7
7
 
8
8
  gem "byebug"
9
+ gem "equivalent-xml"
9
10
  gem "pry-byebug"
11
+ gem "rake", "~> 13.0"
12
+ gem "rspec", "~> 3.0"
10
13
  gem "rubocop"
11
14
  gem "rubocop-performance"
12
15
  gem "rubocop-rails"
data/README.adoc CHANGED
@@ -31,13 +31,24 @@ Or install it yourself as:
31
31
 
32
32
  == Usage
33
33
 
34
- === Search for standards using keywords
34
+ === Configuration
35
+
36
+ Configuration is optional. The available option is `logger` which is a `Logger` instance. By default, the logger is `Logger.new($stderr)` with `Logger::WARN` level. To change the logger level, use `RelatonIso.configure` block.
35
37
 
36
38
  [source,ruby]
37
39
  ----
38
40
  require 'relaton_iso'
39
41
  => true
40
42
 
43
+ RelatonIso.configure do |config|
44
+ config.logger.level = Logger::DEBUG
45
+ end
46
+ ----
47
+
48
+ === Search for standards using keywords
49
+
50
+ [source,ruby]
51
+ ----
41
52
  hit_collection = RelatonIso::IsoBibliography.search("ISO 19115")
42
53
  => <RelatonIso::HitCollection:0x007fa5bc847038 @ref=19115 @fetched=false>
43
54
 
@@ -49,37 +60,11 @@ item = hit_collection[2].fetch
49
60
  ...
50
61
 
51
62
  item.docidentifier
52
- => [#<RelatonIso::DocumentIdentifier:0x00007fa8b7db1f20
53
- @id=
54
- #<Pubid::Iso::Identifier:0x00007fa8b7db2a60
55
- @base=#<Pubid::Iso::Identifier:0x00007fa8b7db2c68 @edition="1", @number="19115"@4, @part="1", @publisher="ISO", @year=2014>,
56
- @number="2"@21,
57
- @publisher="ISO",
58
- @stage=#<Pubid::Iso::Stage:0x00007fa8b7db20d8 @abbr=nil, @harmonized_code=#<Pubid::Iso::HarmonizedStageCode:0x00007fa8b7db2088 @stages=["60.60"]>>,
59
- @typed_stage=#<Pubid::Iso::TypedStage:0x00007fa8b7db2920 @type=#<Pubid::Iso::Type:0x00007fa8b7db26c8 @type=:amd>, @typed_stage=nil>,
60
- @year=2020>,
61
- @language=nil,
62
- @primary=true,
63
- @scope=nil,
64
- @script=nil,
65
- @type="ISO">,
66
- #<RelatonIso::DocumentIdentifier:0x00007fa8b7db1e80
67
- @id=
68
- #<Pubid::Iso::Identifier:0x00007fa8b7db2a60
69
- @base=#<Pubid::Iso::Identifier:0x00007fa8b7db2c68 @edition="1", @number="19115"@4, @part="1", @publisher="ISO", @year=2014>,
70
- @number="2"@21,
71
- @publisher="ISO",
72
- @stage=#<Pubid::Iso::Stage:0x00007fa8b7db20d8 @abbr=nil, @harmonized_code=#<Pubid::Iso::HarmonizedStageCode:0x00007fa8b7db2088 @stages=["60.60"]>>,
73
- @typed_stage=#<Pubid::Iso::TypedStage:0x00007fa8b7db2920 @type=#<Pubid::Iso::Type:0x00007fa8b7db26c8 @type=:amd>, @typed_stage=nil>,
74
- @year=2020>,
75
- @language=nil,
76
- @primary=nil,
77
- @scope=nil,
78
- @script=nil,
79
- @type="URN">]
63
+ => [#<RelatonIso::DocumentIdentifier:0x0000000112a23a88
64
+ ...
80
65
 
81
66
  item.docidentifier.detect { |di| di.type == "URN" }.id
82
- => "urn:iso:std:iso:19115:-1:ed-1:amd:2020:v2"
67
+ => "urn:iso:std:iso:19115:-1:ed-1:stage-60.60:amd:2020:v2"
83
68
  ----
84
69
 
85
70
  === Fetch document by reference and year
@@ -93,9 +78,9 @@ item = RelatonIso::IsoBibliography.get "ISO 19115:2003"
93
78
  ...
94
79
 
95
80
  item = RelatonIso::IsoBibliography.get "ISO 19115", "2003"
96
- [relaton-iso] ("ISO 19115") fetching from ISO...
97
- [relaton-iso] ("ISO 19115:2003") Found exact match.
98
- => #<RelatonIsoBib::IsoBibliographicItem:0x00007f8c828d3180
81
+ [relaton-iso] ("ISO 19115:2003") Fetching from ISO...
82
+ [relaton-iso] ("ISO 19115:2003") Found ("ISO 19115:2003").
83
+ => #<RelatonIsoBib::IsoBibliographicItem:0x0000000112c9ca80
99
84
  ...
100
85
 
101
86
  item.docidentifier[0].id
@@ -113,7 +98,7 @@ item = RelatonIso::IsoBibliography.get "ISO 19115"
113
98
  ...
114
99
 
115
100
  item.docidentifier[0].id
116
- => "ISO 19115:2003"
101
+ => "ISO 19115"
117
102
  ----
118
103
 
119
104
  === Fetch a part document
@@ -136,13 +121,13 @@ item.docidentifier[0].id
136
121
  ----
137
122
  item = RelatonIso::IsoBibliography.get "ISO 19115 (all parts)"
138
123
  [relaton-iso] ("ISO 19115") Fetching from ISO...
139
- [relaton-iso] ("ISO 19115") Found exact match.
124
+ [relaton-iso] ("ISO 19115") Found ("ISO 19115").
140
125
  => #<RelatonIsoBib::IsoBibliographicItem:0x00007f8ca216e118
141
126
  ...
142
127
 
143
128
  item = RelatonIso::IsoBibliography.get "ISO 19115", nil, all_parts: true
144
129
  [relaton-iso] ("ISO 19115") Fetching from ISO...
145
- [relaton-iso] ("ISO 19115") Found exact match.
130
+ [relaton-iso] ("ISO 19115") Found ("ISO 19115").
146
131
  => #<RelatonIsoBib::IsoBibliographicItem:0x00007f8c830f3d38
147
132
  ...
148
133
 
@@ -151,12 +136,12 @@ item.docidentifier[0].id
151
136
 
152
137
  item = RelatonIso::IsoBibliography.get "ISO 19115-1 (all parts)"
153
138
  [relaton-iso] ("ISO 19115") Fetching from ISO...
154
- [relaton-iso] ("ISO 19115") Found exact match.
139
+ [relaton-iso] ("ISO 19115") Found ("ISO 19115").
155
140
  => #<RelatonIsoBib::IsoBibliographicItem:0x00007f8c8290e5a0
156
141
 
157
142
  item = RelatonIso::IsoBibliography.get "ISO 19115-1", nil, all_parts: true
158
143
  [relaton-iso] ("ISO 19115") Fetching from ISO...
159
- [relaton-iso] ("ISO 19115") Found exact match.
144
+ [relaton-iso] ("ISO 19115") Found ("ISO 19115").
160
145
  => #<RelatonIsoBib::IsoBibliographicItem:0x00007f8c925355b8
161
146
  ...
162
147
 
@@ -217,35 +202,31 @@ item.to_xml note: [{ text: "Note", type: "note" }]
217
202
  [source,ruby]
218
203
  ----
219
204
  item.title lang: 'en'
220
- => #<RelatonBib::TypedTitleStringCollection:0x00007fa8b7f47c90
205
+ => #<RelatonBib::TypedTitleStringCollection:0x0000000112783fd0
221
206
  @array=
222
- [#<RelatonBib::TypedTitleString:0x00007fa8b7be8a40
223
- @title=#<RelatonBib::FormattedString:0x00007fa8b7be87c0 @content="Geographic information", @format="text/plain", @language=["en"], @script=["Latn"]>,
207
+ [#<RelatonBib::TypedTitleString:0x00000001138e2380
208
+ @title=#<RelatonBib::FormattedString:0x0000000112d496b8 @content="Geographic information", @format="text/plain", @language=["en"], @script=["Latn"]>,
224
209
  @type="title-intro">,
225
- #<RelatonBib::TypedTitleString:0x00007fa8b7be84a0
226
- @title=#<RelatonBib::FormattedString:0x00007fa8b7be83d8 @content="Metadata", @format="text/plain", @language=["en"], @script=["Latn"]>,
210
+ #<RelatonBib::TypedTitleString:0x00000001138e1f70
211
+ @title=#<RelatonBib::FormattedString:0x0000000112d495c8 @content="Metadata", @format="text/plain", @language=["en"], @script=["Latn"]>,
227
212
  @type="title-main">,
228
- #<RelatonBib::TypedTitleString:0x00007fa8b7be8130
213
+ #<RelatonBib::TypedTitleString:0x00000001138e1d68
229
214
  @title=
230
- #<RelatonBib::FormattedString:0x00007fa8b7be8018
231
- @content="Geographic information – Metadata",
232
- @format="text/plain",
233
- @language=["en"],
234
- @script=["Latn"]>,
215
+ #<RelatonBib::FormattedString:0x0000000112d49488 @content="Geographic information – Metadata", @format="text/plain", @language=["en"], @script=["Latn"]>,
235
216
  @type="main">]>
236
217
 
237
218
  item.title lang: 'fr'
238
- => #<RelatonBib::TypedTitleStringCollection:0x00007fa8b7bcb4b8
219
+ => #<RelatonBib::TypedTitleStringCollection:0x0000000113067458
239
220
  @array=
240
- [#<RelatonBib::TypedTitleString:0x00007fa8b7be3ea0
241
- @title=#<RelatonBib::FormattedString:0x00007fa8b7be3dd8 @content="Information géographique", @format="text/plain", @language=["fr"], @script=["Latn"]>,
221
+ [#<RelatonBib::TypedTitleString:0x00000001138e1c28
222
+ @title=#<RelatonBib::FormattedString:0x0000000112d49438 @content="Information géographique", @format="text/plain", @language=["fr"], @script=["Latn"]>,
242
223
  @type="title-intro">,
243
- #<RelatonBib::TypedTitleString:0x00007fa8b7be3ba8
244
- @title=#<RelatonBib::FormattedString:0x00007fa8b7be3b58 @content="Métadonnées", @format="text/plain", @language=["fr"], @script=["Latn"]>,
224
+ #<RelatonBib::TypedTitleString:0x00000001138e1b10
225
+ @title=#<RelatonBib::FormattedString:0x0000000112d49398 @content="Métadonnées", @format="text/plain", @language=["fr"], @script=["Latn"]>,
245
226
  @type="title-main">,
246
- #<RelatonBib::TypedTitleString:0x00007fa8b7be38d8
227
+ #<RelatonBib::TypedTitleString:0x00000001138e1908
247
228
  @title=
248
- #<RelatonBib::FormattedString:0x00007fa8b7be3860
229
+ #<RelatonBib::FormattedString:0x0000000112d491b8
249
230
  @content="Information géographique – Métadonnées",
250
231
  @format="text/plain",
251
232
  @language=["fr"],
@@ -254,10 +235,9 @@ item.title lang: 'fr'
254
235
 
255
236
  item = RelatonIso::IsoBibliography.get "ISO 19115:2003"
256
237
  [relaton-iso] ("ISO 19115:2003") Fetching from ISO...
257
- [relaton-iso] ("ISO 19115:2003") Found exact match.
238
+ [relaton-iso] ("ISO 19115:2003") Found ("ISO 19115:2003").
258
239
  => #<RelatonIsoBib::IsoBibliographicItem:0x00007fa8870b69e0
259
240
 
260
- item.abstract lang: 'en'
261
241
  item.abstract lang: 'en'
262
242
  => #<RelatonBib::FormattedString:0x00007fa8870b4f78
263
243
  @content=
@@ -274,13 +254,13 @@ Each ISO document has `src` type link and optional `obp`, `rss`, and `pub` link
274
254
  [source,ruby]
275
255
  ----
276
256
  item.link
277
- => [#<RelatonBib::TypedUri:0x00007fa8870ac5a8
278
- @content=#<Addressable::URI:0xcc6514 URI:https://www.iso.org/standard/26020.html>,
257
+ => [#<RelatonBib::TypedUri:0x0000000112d66c40
258
+ @content=#<Addressable::URI:0x93d71c URI:https://www.iso.org/standard/26020.html>,
279
259
  @language=nil,
280
260
  @script=nil,
281
261
  @type="src">,
282
- #<RelatonBib::TypedUri:0x00007fa8870a7490
283
- @content=#<Addressable::URI:0xcc6528 URI:https://www.iso.org/contents/data/standard/02/60/26020.detail.rss>,
262
+ #<RelatonBib::TypedUri:0x0000000112d66920
263
+ @content=#<Addressable::URI:0x93d730 URI:https://www.iso.org/contents/data/standard/02/60/26020.detail.rss>,
284
264
  @language=nil,
285
265
  @script=nil,
286
266
  @type="rss">]
@@ -0,0 +1,10 @@
1
+ module RelatonIso
2
+ module Config
3
+ include RelatonBib::Config
4
+ end
5
+ extend Config
6
+
7
+ class Configuration < RelatonBib::Configuration
8
+ PROGNAME = "relaton-iso".freeze
9
+ end
10
+ end
@@ -42,9 +42,9 @@ module RelatonIso
42
42
  # @return [Pubid::Iso::Identifier]
43
43
  def pubid
44
44
  @pubid ||= Pubid::Iso::Identifier.parse_from_title(hit[:title])
45
- rescue Pubid::Iso::Errors::WrongTypeError => e
46
- warn "[relaton-iso] unable to find an identifier in \"#{hit[:title]}\"."
47
- warn "[relaton-iso] #{e.message}"
45
+ rescue Pubid::Iso::Errors::WrongTypeError, Pubid::Iso::Errors::ParseError => e
46
+ Util.warn "unable to find an identifier in `#{hit[:title]}`."
47
+ Util.warn e.message
48
48
  end
49
49
  end
50
50
  end
@@ -6,17 +6,23 @@ require "relaton_iso/hit"
6
6
  module RelatonIso
7
7
  # Page of hit collection.
8
8
  class HitCollection < RelatonBib::HitCollection
9
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
9
+ # @return [Boolean] whether the search was performed on GitHub
10
+ attr_reader :from_gh
10
11
 
11
12
  # @param text [String] reference to search
12
13
  def initialize(text)
13
14
  super
14
- @array = text.match?(/^ISO[\s\/](?:TC\s184\/SC\s?4|IEC\sDIR\s(?:\d|IEC|JTC))/) ? fetch_github : fetch_iso
15
+ @from_gh = text.match?(/^ISO[\s\/](?:TC\s184\/SC\s?4|IEC\sDIR\s(?:\d|IEC|JTC))/)
16
+ end
17
+
18
+ def fetch
19
+ @array = from_gh ? fetch_github : fetch_iso
20
+ self
15
21
  end
16
22
 
17
23
  # @param lang [String, NilClass]
18
24
  # @return [RelatonIsoBib::IsoBibliographicItem, nil]
19
- def to_all_parts(lang = nil) # rubocop:disable Metrics/CyclomaticComplexity
25
+ def to_all_parts(lang = nil) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
20
26
  # parts = @array.reject { |h| h.hit["docPart"]&.empty? }
21
27
  hit = @array.min_by { |h| h.pubid.part.to_i }
22
28
  return @array.first&.fetch lang unless hit
@@ -33,7 +39,6 @@ module RelatonIso
33
39
  end
34
40
  all_parts_item
35
41
  end
36
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
37
42
 
38
43
  private
39
44
 
@@ -63,23 +68,11 @@ module RelatonIso
63
68
  # @return [Array<RelatonIso::Hit>]
64
69
  #
65
70
  def fetch_iso # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
66
- # %r{\s(?<num>\d+)(?:-(?<part>[\d-]+))?} =~ text
67
- # http = Net::HTTP.new "www.iso.org", 443
68
- # http.use_ssl = true
69
- # search = ["status=ENT_ACTIVE,ENT_PROGRESS,ENT_INACTIVE,ENT_DELETED"]
70
- # search << "docNumber=#{num}"
71
- # search << "docPartNo=#{part}" if part
72
- # q = search.join "&"
73
- # resp = http.get("/cms/render/live/en/sites/isoorg.advancedSearch.do?#{q}",
74
- # "Accept" => "application/json, text/plain, */*")
75
71
  config = Algolia::Search::Config.new(application_id: "JCL49WV5AR", api_key: "dd1b9e1ab383f4d4817d29cd5e96d3f0")
76
- client = Algolia::Search::Client.new config, logger: ::Logger.new($stderr)
72
+ client = Algolia::Search::Client.new config, logger: RelatonIso.configuration.logger
77
73
  index = client.init_index "all_en"
78
74
  resp = index.search text, hitsPerPage: 100, filters: "category:standard"
79
- # return [] if resp.body.empty?
80
75
 
81
- # json = JSON.parse resp.body
82
- # json["standards"]
83
76
  resp[:hits].map { |h| Hit.new h, self }.sort! do |a, b|
84
77
  if a.sort_weight == b.sort_weight && b.hit[:year] = a.hit[:year]
85
78
  a.hit[:title] <=> b.hit[:title]
@@ -90,19 +83,5 @@ module RelatonIso
90
83
  end
91
84
  end
92
85
  end
93
-
94
- # @param hit [Hash]
95
- # @return [Date]
96
- # def parse_date(hit)
97
- # if hit["publicationDate"]
98
- # Date.strptime(hit["publicationDate"], "%Y-%m")
99
- # elsif %r{:(?<year>\d{4})} =~ hit["docRef"]
100
- # Date.strptime(year, "%Y")
101
- # elsif hit["newProjectDate"]
102
- # Date.parse hit["newProjectDate"]
103
- # else
104
- # Date.new 0
105
- # end
106
- # end
107
86
  end
108
87
  end
@@ -12,7 +12,7 @@ module RelatonIso
12
12
  # @param text [String]
13
13
  # @return [RelatonIso::HitCollection]
14
14
  def search(text)
15
- HitCollection.new text.gsub(/\u2013/, "-")
15
+ HitCollection.new(text.gsub("\u2013", "-")).fetch
16
16
  rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET,
17
17
  EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
18
18
  Net::ProtocolError, OpenSSL::SSL::SSLError, Errno::ETIMEDOUT,
@@ -29,7 +29,7 @@ module RelatonIso
29
29
  #
30
30
  # @return [RelatonIsoBib::IsoBibliographicItem] Relaton XML serialisation of reference
31
31
  def get(ref, year = nil, opts = {}) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity,Metrics/AbcSize
32
- code = ref.gsub(/\u2013/, "-")
32
+ code = ref.gsub("\u2013", "-")
33
33
 
34
34
  # parse "all parts" request
35
35
  code.sub! " (all parts)", ""
@@ -37,43 +37,24 @@ module RelatonIso
37
37
 
38
38
  query_pubid = Pubid::Iso::Identifier.parse(code)
39
39
  query_pubid.year = year if year
40
+ query_pubid.part = nil if opts[:all_parts]
41
+ Util.warn "(#{query_pubid}) Fetching from ISO..."
40
42
 
41
- resp = isobib_search_filter(query_pubid, opts)
42
-
43
- # Try with ISO/IEC prefix if ISO not found
44
- if resp[:hits].empty? && query_pubid.copublisher.nil? &&
45
- query_pubid.publisher == "ISO"
46
- resp_isoiec = retry_isoiec_prefix(query_pubid, opts)
47
- resp = resp_isoiec unless resp_isoiec.nil?
48
- end
43
+ hits, missed_year_ids = isobib_search_filter(query_pubid, opts)
44
+ tip_ids = look_up_with_any_types_stages(hits, ref, opts)
49
45
 
50
- # return only first one if not all_parts
51
- ret = if !opts[:all_parts] || resp[:hits].size == 1
52
- resp[:hits].any? && resp[:hits].first.fetch(opts[:lang])
46
+ ret = if !opts[:all_parts] || hits.size == 1
47
+ hits.any? && hits.first.fetch(opts[:lang])
53
48
  else
54
- resp[:hits].to_all_parts(opts[:lang])
49
+ hits.to_all_parts(opts[:lang])
55
50
  end
56
51
 
57
- return fetch_ref_err(query_pubid) unless ret
52
+ return fetch_ref_err(query_pubid, missed_year_ids, tip_ids) unless ret
58
53
 
59
- # puts "xxxxx #{ret.docidentifier.first.id.inspect}"
60
54
  response_docid = ret.docidentifier.first.id.sub(" (all parts)", "")
61
55
  response_pubid = Pubid::Iso::Identifier.parse(response_docid)
62
- # puts "xxxxx query_pubid(#{query_pubid}) response_pubid(#{response_pubid})"
63
-
64
- if query_pubid.to_s == response_pubid.to_s
65
- warn "[relaton-iso] (\"#{query_pubid}\") Found exact match."
66
- elsif matches_base?(query_pubid, response_pubid)
67
- warn "[relaton-iso] (\"#{query_pubid}\") " \
68
- "Found (\"#{response_pubid}\")."
69
- elsif matches_base?(query_pubid, response_pubid, any_types_stages: true)
70
- warn "[relaton-iso] (\"#{query_pubid}\") TIP: " \
71
- "Found with different type/stage, " \
72
- "please amend to (\"#{response_pubid}\")."
73
- else
74
- # when there are all parts
75
- warn "[relaton-iso] (\"#{query_pubid}\") Found (\"#{response_pubid}\")."
76
- end
56
+
57
+ Util.warn "(#{query_pubid}) Found `#{response_pubid}`."
77
58
 
78
59
  get_all = (
79
60
  (query_pubid.year && opts[:keep_year].nil?) ||
@@ -83,9 +64,9 @@ module RelatonIso
83
64
  return ret if get_all
84
65
 
85
66
  ret.to_most_recent_reference
86
-
87
67
  rescue Pubid::Core::Errors::ParseError
88
- warn "[relaton-iso] (\"#{code}\") is not recognized as a standards identifier."
68
+ Util.warn "(#{code}) is not recognized as a standards identifier."
69
+ nil
89
70
  end
90
71
 
91
72
  # @param query_pubid [Pubid::Iso::Identifier]
@@ -109,147 +90,113 @@ module RelatonIso
109
90
  # @return [<Type>] <description>
110
91
  #
111
92
  def matches_base?(query_pubid, pubid, any_types_stages: false) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics?PerceivedComplexity
112
- return unless pubid.respond_to?(:publisher)
93
+ return false unless pubid.respond_to?(:publisher)
113
94
 
114
95
  query_pubid.publisher == pubid.publisher &&
115
96
  query_pubid.number == pubid.number &&
116
97
  query_pubid.copublisher == pubid.copublisher &&
117
- ((any_types_stages && query_pubid.stage.nil?) || query_pubid.stage == pubid.stage) &&
118
- ((any_types_stages && query_pubid.type.nil?) || query_pubid.type == pubid.type)
98
+ (any_types_stages || query_pubid.stage == pubid.stage) &&
99
+ (any_types_stages || query_pubid.is_a?(pubid.class))
119
100
  end
120
101
 
121
102
  # @param hit_collection [RelatonIso::HitCollection]
122
103
  # @param year [String]
123
- # @return [RelatonIso::HitCollection]
124
- def filter_hits_by_year(hit_collection, year) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
125
- missed_years = []
126
- return { hits: hit_collection, missed_years: missed_years } if year.nil?
104
+ # @return [Array<RelatonIso::HitCollection, Array<String>>] hits and missed year IDs
105
+ def filter_hits_by_year(hit_collection, year)
106
+ missed_year_ids = Set.new
107
+ return [hit_collection, missed_year_ids] if year.nil?
127
108
 
128
109
  # filter by year
129
110
  hits = hit_collection.select do |hit|
130
- if (hit.pubid.base.nil? && hit.pubid.year.to_s == year.to_s) ||
131
- (!hit.pubid.base.nil? && hit.pubid.base.year.to_s == year.to_s) ||
132
- (!hit.pubid.base.nil? && hit.pubid.year.to_s == year.to_s)
133
- true
134
- elsif hit.pubid.year.nil? && hit.hit[:year].to_s == year
135
- hit.pubid.year = year
136
- true
137
- else
138
- missed_year = (hit.pubid.year || hit.hit[:year]).to_s
139
- if missed_year && !missed_year.empty? && !missed_years.include?(missed_year)
140
- missed_years << missed_year
141
- end
142
- false
143
- end
111
+ hit.pubid.year ||= hit.hit[:year]
112
+ next true if check_year(year, hit)
113
+
114
+ missed_year_ids << hit.pubid.to_s if hit.pubid.year
115
+ false
144
116
  end
145
117
 
146
- { hits: hits, missed_years: missed_years }
118
+ [hits, missed_year_ids]
147
119
  end
148
120
 
149
121
  private
150
122
 
151
- # @param query_pubid [Pubid::Iso::Identifier] PubID with no results
152
- def fetch_ref_err(query_pubid) # rubocop:disable Metrics/MethodLength
153
- warn "[relaton-iso] (\"#{query_pubid}\") " \
154
- "Not found. " \
155
- "The identifier must be exactly as shown on the ISO website."
123
+ def check_year(year, hit) # rubocop:disable Metrics/AbcSize
124
+ (hit.pubid.base.nil? && hit.pubid.year.to_s == year.to_s) ||
125
+ (!hit.pubid.base.nil? && hit.pubid.base.year.to_s == year.to_s) ||
126
+ (!hit.pubid.base.nil? && hit.pubid.year.to_s == year.to_s)
127
+ end
156
128
 
157
- if query_pubid.part
158
- warn "[relaton-iso] (\"#{query_pubid}\") TIP: " \
159
- "If it cannot be found, the document may no longer be published in parts."
160
- else
161
- warn "[relaton-iso] (\"#{query_pubid}\") TIP: " \
162
- "If you wish to cite all document parts for the reference, " \
163
- "use (\"#{query_pubid.to_s(format: :ref_undated)} (all parts)\")."
129
+ # @param pubid [Pubid::Iso::Identifier] PubID with no results
130
+ def fetch_ref_err(pubid, missed_year_ids, tip_ids) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
131
+ Util.warn "(#{pubid}) Not found."
132
+
133
+ if missed_year_ids.any?
134
+ ids = missed_year_ids.map { |i| "`#{i}`" }.join(", ")
135
+ Util.warn "(#{pubid}) TIP: No match for edition year " \
136
+ "#{pubid.year}, but matches exist for #{ids}."
164
137
  end
165
138
 
166
- unless %w(TS TR PAS Guide).include?(query_pubid.type)
167
- warn "[relaton-iso] (\"#{query_pubid}\") TIP: " \
168
- "If the document is not an International Standard, use its " \
169
- "deliverable type abbreviation (TS, TR, PAS, Guide)."
139
+ if tip_ids.any?
140
+ ids = tip_ids.map { |i| "`#{i}`" }.join(", ")
141
+ Util.warn "(#{pubid}) TIP: Matches exist for #{ids}."
170
142
  end
171
143
 
172
- nil
173
- end
144
+ if pubid.part
145
+ Util.warn "(#{pubid}) TIP: If it cannot be found, " \
146
+ "the document may no longer be published in parts."
147
+ else
148
+ Util.warn "(#{pubid}) TIP: If you wish to cite " \
149
+ "all document parts for the reference, use " \
150
+ "`#{pubid.to_s(format: :ref_undated)} (all parts)`."
151
+ end
174
152
 
175
- # @param pubid [Pubid::Iso::Identifier]
176
- # @param missed_years [Array<String>]
177
- def warn_missing_years(pubid, missed_years)
178
- warn "[relaton-iso] (\"#{pubid}\") TIP: " \
179
- "No match for edition year #{pubid.year}, " \
180
- "but matches exist for #{missed_years.uniq.join(', ')}."
153
+ nil
181
154
  end
182
155
 
183
- # Search for hits using ISO/IEC prefix.
184
- #
185
- # @param old_pubid [Pubid::Iso::Identifier] reference with ISO prefix
186
- # @param opts [Hash]
187
- # @return [Array<RelatonIso::Hit>]
188
- def retry_isoiec_prefix(old_pubid, opts) # rubocop:disable Metrics/MethodLength
189
- return nil unless old_pubid.copublisher.nil? && old_pubid.publisher == "ISO"
190
-
191
- pubid = old_pubid.dup
192
- pubid.copublisher = "IEC"
193
- warn "[relaton-iso] (\"#{old_pubid}\") Not found, trying with ISO/IEC prefix (\"#{pubid}\")..."
194
- resp_isoiec = isobib_search_filter(pubid, opts)
195
-
196
- if resp_isoiec[:hits].empty?
197
- warn "[relaton-iso] (\"#{pubid}\") Not found. "
198
- return nil
199
- end
200
-
201
- warn "[relaton-iso] (\"#{pubid}\") TIP: Found with ISO/IEC prefix, " \
202
- "please amend to (\"#{pubid}\")."
156
+ def look_up_with_any_types_stages(hits, ref, opts) # rubocop:disable Metrics/MethodLength
157
+ found_ids = []
158
+ return found_ids if hits.from_gh || hits.any? || !ref.match?(/^ISO[\/\s][A-Z]/)
203
159
 
204
- resp_isoiec
160
+ ref_no_type_stage = ref.sub(/^ISO[\/\s][A-Z]+/, "ISO")
161
+ pubid = Pubid::Iso::Identifier.parse(ref_no_type_stage)
162
+ resp, = isobib_search_filter(pubid, opts, any_types_stages: true)
163
+ resp.map &:pubid
205
164
  end
206
165
 
166
+ #
207
167
  # Search for hits. If no found then trying missed stages.
208
168
  #
209
169
  # @param query_pubid [Pubid::Iso::Identifier] reference without correction
210
170
  # @param opts [Hash]
211
- # @return [Array<RelatonIso::Hit>]
212
- def isobib_search_filter(query_pubid, opts) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
213
- missed_years = []
214
- query_pubid.part = nil if opts[:all_parts]
215
- warn "[relaton-iso] (\"#{query_pubid}\") Fetching from ISO..."
216
-
217
- # fetch hits collection
171
+ # @param any_types_stages [Boolean] match with any stages
172
+ #
173
+ # @return [Array<RelatonIso::HitCollection, Array<String>>] hits and missed years
174
+ #
175
+ def isobib_search_filter(query_pubid, opts, any_types_stages: false) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
218
176
  query_pubid_without_year = query_pubid.dup
219
177
  # remove year for query
220
178
  query_pubid_without_year.year = nil
221
179
  hit_collection = search(query_pubid_without_year.to_s)
222
180
 
223
181
  # filter only matching hits
224
- res = filter_hits hit_collection, query_pubid, all_parts: opts[:all_parts]
225
- return res unless res[:hits].empty?
226
-
227
- missed_years += res[:missed_years]
228
-
229
- # lookup for documents with stages when no match without stage
230
- res = filter_hits hit_collection, query_pubid,
231
- all_parts: opts[:all_parts], any_types_stages: true
232
- return res unless res[:hits].empty?
233
-
234
- missed_years += res[:missed_years]
235
-
236
- if missed_years.any?
237
- warn_missing_years(query_pubid, missed_years)
238
- end
239
-
240
- res
182
+ filter_hits hit_collection, query_pubid, opts[:all_parts], any_types_stages
241
183
  end
242
184
 
243
- # @param hits [RelatonIso::HitCollection]
185
+ #
186
+ # Filter hits by query_pubid.
187
+ #
188
+ # @param hit_collection [RelatonIso::HitCollection]
244
189
  # @param query_pubid [Pubid::Iso::Identifier]
245
190
  # @param all_parts [Boolean]
246
- # @param any_stages [Boolean]
247
- # @return [RelatonIso::HitCollection]
248
- def filter_hits(hit_collection, query_pubid, all_parts: false, any_types_stages: false) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
191
+ # @param any_stypes_tages [Boolean]
192
+ #
193
+ # @return [Array<RelatonIso::HitCollection, Array<String>>] hits and missed year IDs
194
+ #
195
+ def filter_hits(hit_collection, query_pubid, all_parts, any_stypes_tages) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
249
196
  # filter out
250
197
  result = hit_collection.select do |i|
251
198
  hit_pubid = i.pubid
252
- matches_base?(query_pubid, hit_pubid, any_types_stages: any_types_stages) &&
199
+ matches_base?(query_pubid, hit_pubid, any_types_stages: any_stypes_tages) &&
253
200
  matches_parts?(query_pubid, hit_pubid, all_parts: all_parts) &&
254
201
  query_pubid.corrigendums == hit_pubid.corrigendums &&
255
202
  query_pubid.amendments == hit_pubid.amendments
@@ -1,10 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "relaton_iso_bib"
4
- require "relaton_iso/hit"
5
- require "nokogiri"
6
- require "net/http"
7
-
8
3
  module RelatonIso
9
4
  # Scrapper.
10
5
  module Scrapper # rubocop:disable Metrics/ModuleLength
@@ -0,0 +1,9 @@
1
+ module RelatonIso
2
+ module Util
3
+ extend RelatonBib::Util
4
+
5
+ def self.logger
6
+ RelatonIso.configuration.logger
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RelatonIso
4
- VERSION = "1.15.4"
4
+ VERSION = "1.15.6"
5
5
  end
data/lib/relaton_iso.rb CHANGED
@@ -1,6 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "nokogiri"
4
+ require "net/http"
5
+ require "logger"
6
+ require "pubid-iso"
7
+ require "relaton_iso_bib"
3
8
  require "relaton_iso/version"
9
+ require "relaton_iso/config"
10
+ require "relaton_iso/util"
11
+ require "relaton_iso/hit"
4
12
  require "relaton_iso/iso_bibliography"
5
- require "pubid-iso"
6
13
  require "relaton_iso/document_identifier"
data/relaton_iso.gemspec CHANGED
@@ -10,10 +10,10 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ["Ribose Inc."]
11
11
  spec.email = ["open.source@ribose.com"]
12
12
 
13
- spec.summary = "RelatonIso: retrieve ISO Standards for bibliographic use "\
14
- "using the IsoBibliographicItem model"
15
- spec.description = "RelatonIso: retrieve ISO Standards for bibliographic use "\
16
- "using the IsoBibliographicItem model"
13
+ spec.summary = "RelatonIso: retrieve ISO Standards for bibliographic " \
14
+ "use using the IsoBibliographicItem model"
15
+ spec.description = "RelatonIso: retrieve ISO Standards for bibliographic " \
16
+ "use using the IsoBibliographicItem model"
17
17
 
18
18
  spec.homepage = "https://github.com/relaton/relaton-iso"
19
19
  spec.license = "BSD-2-Clause"
@@ -26,11 +26,8 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ["lib"]
27
27
  spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
28
28
 
29
- spec.add_development_dependency "equivalent-xml", "~> 0.6"
30
- spec.add_development_dependency "rake", "~> 13.0"
31
- spec.add_development_dependency "rspec", "~> 3.0"
32
-
33
29
  spec.add_dependency "algolia", "~> 2.3.0"
34
- spec.add_dependency "pubid-iso", "~> 0.5.0"
30
+ spec.add_dependency "pubid-iso", "~> 0.6.0"
31
+ spec.add_dependency "relaton-bib", "~> 1.14.13"
35
32
  spec.add_dependency "relaton-iso-bib", "~> 1.14.0"
36
33
  end
metadata CHANGED
@@ -1,85 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-iso
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.4
4
+ version: 1.15.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-18 00:00:00.000000000 Z
11
+ date: 2023-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: equivalent-xml
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.6'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0.6'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '13.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '13.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
14
+ name: algolia
43
15
  requirement: !ruby/object:Gem::Requirement
44
16
  requirements:
45
17
  - - "~>"
46
18
  - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
19
+ version: 2.3.0
20
+ type: :runtime
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
24
  - - "~>"
53
25
  - !ruby/object:Gem::Version
54
- version: '3.0'
26
+ version: 2.3.0
55
27
  - !ruby/object:Gem::Dependency
56
- name: algolia
28
+ name: pubid-iso
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
31
  - - "~>"
60
32
  - !ruby/object:Gem::Version
61
- version: 2.3.0
33
+ version: 0.6.0
62
34
  type: :runtime
63
35
  prerelease: false
64
36
  version_requirements: !ruby/object:Gem::Requirement
65
37
  requirements:
66
38
  - - "~>"
67
39
  - !ruby/object:Gem::Version
68
- version: 2.3.0
40
+ version: 0.6.0
69
41
  - !ruby/object:Gem::Dependency
70
- name: pubid-iso
42
+ name: relaton-bib
71
43
  requirement: !ruby/object:Gem::Requirement
72
44
  requirements:
73
45
  - - "~>"
74
46
  - !ruby/object:Gem::Version
75
- version: 0.5.0
47
+ version: 1.14.13
76
48
  type: :runtime
77
49
  prerelease: false
78
50
  version_requirements: !ruby/object:Gem::Requirement
79
51
  requirements:
80
52
  - - "~>"
81
53
  - !ruby/object:Gem::Version
82
- version: 0.5.0
54
+ version: 1.14.13
83
55
  - !ruby/object:Gem::Dependency
84
56
  name: relaton-iso-bib
85
57
  requirement: !ruby/object:Gem::Requirement
@@ -135,19 +107,21 @@ files:
135
107
  - bin/setup
136
108
  - bin/thor
137
109
  - lib/relaton_iso.rb
110
+ - lib/relaton_iso/config.rb
138
111
  - lib/relaton_iso/document_identifier.rb
139
112
  - lib/relaton_iso/hit.rb
140
113
  - lib/relaton_iso/hit_collection.rb
141
114
  - lib/relaton_iso/iso_bibliography.rb
142
115
  - lib/relaton_iso/processor.rb
143
116
  - lib/relaton_iso/scrapper.rb
117
+ - lib/relaton_iso/util.rb
144
118
  - lib/relaton_iso/version.rb
145
119
  - relaton_iso.gemspec
146
120
  homepage: https://github.com/relaton/relaton-iso
147
121
  licenses:
148
122
  - BSD-2-Clause
149
123
  metadata: {}
150
- post_install_message:
124
+ post_install_message:
151
125
  rdoc_options: []
152
126
  require_paths:
153
127
  - lib
@@ -162,8 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
136
  - !ruby/object:Gem::Version
163
137
  version: '0'
164
138
  requirements: []
165
- rubygems_version: 3.4.9
166
- signing_key:
139
+ rubygems_version: 3.3.26
140
+ signing_key:
167
141
  specification_version: 4
168
142
  summary: 'RelatonIso: retrieve ISO Standards for bibliographic use using the IsoBibliographicItem
169
143
  model'