Module: Relaton::Ecma::Bibliography
- Defined in:
- lib/relaton/ecma/bibliography.rb
Overview
IETF bibliography module
Constant Summary collapse
- ENDPOINT =
"https://raw.githubusercontent.com/relaton/relaton-data-ecma/refs/heads/data-v2/"
Class Method Summary collapse
- .compare_edition_volume(aaa, bbb) ⇒ Object
-
.fetch_doc(code) ⇒ Object
rubocop:disable Metrics/AbcSize.
-
.get(code, _year = nil, _opts = {}) ⇒ Relaton::Ecma::ItemData
Relaton of reference.
-
.match_ref(refparts, row) ⇒ Object
rubocop:disable Metrics/AbcSize.
- .parse_ref(ref) ⇒ Object
-
.search(ref) ⇒ Array<Hash>
Search for a reference on the IETF website.
Class Method Details
.compare_edition_volume(aaa, bbb) ⇒ Object
57 58 59 60 |
# File 'lib/relaton/ecma/bibliography.rb', line 57 def compare_edition_volume(aaa, bbb) comp = bbb[:id][:ed] <=> aaa[:id][:ed] comp.zero? ? aaa[:id][:vol] <=> bbb[:id][:vol] : comp end |
.fetch_doc(code) ⇒ Object
rubocop:disable Metrics/AbcSize
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/relaton/ecma/bibliography.rb', line 62 def fetch_doc(code) # rubocop:disable Metrics/AbcSize row = search(code).min { |a, b| compare_edition_volume a, b } return unless row url = "#{ENDPOINT}#{row[:file]}" resp = Mechanize.new.get(url) Item.from_yaml(resp.body).tap { |item| item.fetched = Date.today.to_s } rescue Mechanize::ResponseCodeError => e return if e.response_code == "404" raise Relaton::RequestError, "No document found for #{code} reference. #{e.}" rescue Mechanize::RedirectLimitReachedError, Timeout::Error, Mechanize::UnauthorizedError, Mechanize::UnsupportedSchemeError, Mechanize::ResponseReadError, Mechanize::ChunkedTerminationError => e raise Relaton::RequestError, "No document found for #{code} reference. #{e.}" end |
.get(code, _year = nil, _opts = {}) ⇒ Relaton::Ecma::ItemData
Returns Relaton of reference.
45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/relaton/ecma/bibliography.rb', line 45 def get(code, _year = nil, _opts = {}) Util.info "Fetching from Relaton repository ...", key: code result = fetch_doc(code) if result Util.info "Found: `#{result.docidentifier.first.content}`", key: code # item else Util.info "Not found.", key: code end result end |
.match_ref(refparts, row) ⇒ Object
rubocop:disable Metrics/AbcSize
35 36 37 38 39 |
# File 'lib/relaton/ecma/bibliography.rb', line 35 def match_ref(refparts, row) # rubocop:disable Metrics/AbcSize row[:id][:id].match?(/^ECMA[-\s]#{refparts[:id]}/) && (refparts[:ed].nil? || row[:id][:ed] == refparts[:ed]) && (refparts[:vol].nil? || row[:id][:vol] == refparts[:vol]) end |
.parse_ref(ref) ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/relaton/ecma/bibliography.rb', line 27 def parse_ref(ref) %r{^ECMA[-\s] (?<id>(?:\d[\d-]*|\w+/\d+)) (?:\sed(?<ed>[\d.]+))? (?:\svol(?<vol>\d+))? }x.match ref end |
.search(ref) ⇒ Array<Hash>
Search for a reference on the IETF website.
19 20 21 22 23 24 25 |
# File 'lib/relaton/ecma/bibliography.rb', line 19 def search(ref) refparts = parse_ref ref return [] unless refparts index = Relaton::Index.find_or_create :ECMA, url: "#{ENDPOINT}#{INDEXFILE}.zip", id_keys: %i[id ed vol] index.search { |row| match_ref refparts, row } end |