Class: RelatonItu::RecommendationParser

Inherits:
Object
  • Object
show all
Includes:
Relaton::Core::ArrayWrapper
Defined in:
lib/relaton_itu/recommendation_parser.rb

Overview

Parse ITU Radio Regulations from XML to Relaton format.

Constant Summary collapse

RECHDR =
"https://www.itu.int/mws/api/recommendations/getRecHdrDetail?idrec=%{idrec}&lang=en".freeze
RECEDITIONS =
"https://www.itu.int/mws/api/recommendations/getRecEditions?idrec=%{idrec}&lang=en".freeze
RECSUPPLEMENTS =
"https://www.itu.int/mws/api/recommendations/getRecSupplements?idrec=%{idrec}&lang=en".freeze
IMPLGUIDES =
"https://www.itu.int/mws/api/recommendations/getImplGuides?idrec=%{idrec}&lang=en".freeze

Instance Method Summary collapse

Constructor Details

#initialize(hit, idrec, imp) ⇒ RecommendationParser

Returns a new instance of RecommendationParser.



11
12
13
14
15
# File 'lib/relaton_itu/recommendation_parser.rb', line 11

def initialize(hit, idrec, imp)
  @hit = hit
  @idrec = idrec
  @imp = imp
end

Instance Method Details

#docObject



17
18
19
20
21
22
23
# File 'lib/relaton_itu/recommendation_parser.rb', line 17

def doc
  @doc ||= begin
    url = (imp ? IMPLGUIDES : RECHDR ) % { idrec: idrec }
    resp = get_data url
    imp ? resp.first : resp
  end
end

#doc_dateObject



82
83
84
85
86
87
# File 'lib/relaton_itu/recommendation_parser.rb', line 82

def doc_date
  return @doc_date if defined? @doc_date

  date = imp ? doc["imp_approval_date"] : doc["approval_date"]
  @doc_date = Date.parse(date).to_s rescue date
end

#fetch_abstractArray<Hash>

Fetch abstracts.

Returns:

  • (Array<Hash>)


66
67
68
69
70
# File 'lib/relaton_itu/recommendation_parser.rb', line 66

def fetch_abstract
  array(doc["summary"]).map do |content|
    { content: content, language: "en", script: "Latn" }
  end
end

#fetch_datesArray<Hash>

Fetch dates

Returns:

  • (Array<Hash>)


51
52
53
# File 'lib/relaton_itu/recommendation_parser.rb', line 51

def fetch_dates
  array(doc_date).map { |on| { type: "published", on: on } }
end

#fetch_editionStrign?

Returns:

  • (Strign, nil)


26
27
28
# File 'lib/relaton_itu/recommendation_parser.rb', line 26

def fetch_edition
  self_edition.dig("Version")
end

Fetch links.

Returns:

  • (Array<Hash>)


74
75
76
77
78
79
80
# File 'lib/relaton_itu/recommendation_parser.rb', line 74

def fetch_link
  link = imp ? doc["imp_dms_link"] : doc["handle_id"]
  links = [{ type: "src", content: link }]
  links << typed_link("pdf", doc["handle_id_pdf_link"]) if doc["handle_id_pdf_link"]
  imp_word_link { |wlink| links << typed_link("word", wlink) }
  links
end

#fetch_relationsArray<Hash>

Fetch relations.

Returns:

  • (Array<Hash>)


91
92
93
94
95
96
97
98
99
100
101
# File 'lib/relaton_itu/recommendation_parser.rb', line 91

def fetch_relations
  relations = []
  editions.each do |ed|
    next if ed["idrec"] == idrec

    relations << create_relation("hasEdition", ed["title"], ed["rec_name"])
  end

  supplements.each { |supp| relations << create_relation("complementOf", supp["title_text"], supp["rec_name"]) }
  relations
end

#fetch_statusRelatonBib::DocumentStatus, NilClass

Fetch status.

Returns:

  • (RelatonBib::DocumentStatus, NilClass)


41
42
43
44
45
46
47
# File 'lib/relaton_itu/recommendation_parser.rb', line 41

def fetch_status
  inforce = imp ? imp_status : doc["status"]
  return if inforce.nil? || inforce.empty?

  status = inforce == "In force" ? "Published" : "Withdrawal"
  RelatonBib::DocumentStatus.new(stage: status)
end

#fetch_titlesRelatonBib::TypedTitleStringCollection

Fetch titles.

Returns:

  • (RelatonBib::TypedTitleStringCollection)


32
33
34
35
36
37
# File 'lib/relaton_itu/recommendation_parser.rb', line 32

def fetch_titles
  title = imp ? doc["imp_title_e"] : doc["rec_title"]
  return [] if title.nil? || title.empty?

  RelatonBib::TypedTitleString.from_string title, "en", "Latn"
end

#fetch_workgroupRelatonItu::EditorialGroup, NilClass

Fetch workgroup.

Returns:



57
58
59
60
61
62
# File 'lib/relaton_itu/recommendation_parser.rb', line 57

def fetch_workgroup
  group = itugroup(doc["sg"])
  EditorialGroup.new(
    bureau: hit.hit[:code].match(/(?<=-)./).to_s, group: group
  )
end