Class: RelatonBib::HashConverter
- Defined in:
- lib/relaton_bib/hash_converter.rb
Class Method Summary collapse
- .abstract_hash_to_bib(ret) ⇒ Object
- .accesslocation_hash_to_bib(ret) ⇒ Object
-
.affiliation_hash_to_bib(person) ⇒ Object
rubocop:disable Metrics/AbcSize, Metrics/MethodLength.
- .array(arr) ⇒ Array
- .bib_item(item_hash) ⇒ RelatonBib::BibliographicItem
-
.biblionote_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/AbcSize.
- .classification_hash_to_bib(ret) ⇒ Object
-
.contacts_hash_to_bib(entity) ⇒ Object
rubocop:disable Metrics/AbcSize, Metrics/MethodLength.
-
.contributors_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength,Metrics/PerceivedComplexity.
- .copyright_hash_to_bib(ret) ⇒ Object
-
.dates_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/AbcSize.
-
.docid_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/AbcSize.
- .docstatus_hash_to_bib(ret) ⇒ Object
- .editorialgroup_hash_to_bib(ret) ⇒ Object
- .extent_hash_to_bib(ret) ⇒ Object
- .formattedref(frf) ⇒ RelatonBib::FormattedRef
- .formattedref_hash_to_bib(ret) ⇒ Object
-
.fullname_hash_to_bib(person) ⇒ Object
rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity.
- .hash_to_bib(args, nested = false) ⇒ Hash
- .ics_hash_to_bib(ret) ⇒ Object
- .language_hash_to_bib(ret) ⇒ Object
- .link_hash_to_bib(ret) ⇒ Object
- .localizedstring(lst) ⇒ RelatonBib::LocalizedString
- .localname(name, person) ⇒ RelatonBib::LocalizedString
- .medium_hash_to_bib(ret) ⇒ Object
- .org_hash_to_bib(org) ⇒ Object
- .parse_validity_time(val, period) ⇒ Object
- .person_hash_to_bib(person) ⇒ Object
- .person_identifiers_hash_to_bib(person) ⇒ Object
- .place_hash_to_bib(ret) ⇒ Object
- .relation_bibitem_hash_to_bib(rel) ⇒ Object
- .relation_locality_hash_to_bib(rel) ⇒ RelatonBib::LocalityStack
- .relation_source_locality_hash_to_bib(rel) ⇒ Object
- .relations_hash_to_bib(ret) ⇒ Object
- .script_hash_to_bib(ret) ⇒ Object
- .series_hash_to_bib(ret) ⇒ Object
- .stage(stg) ⇒ RelatonBib::DocumentStatus::Stage
- .structuredidentifier_hash_to_bib(ret) ⇒ Object
- .symbolize(obj) ⇒ Hash, ...
-
.timestamp_hash(ret) ⇒ Object
rubocop:enable Metrics/MethodLength, Metrics/AbcSize.
- .title_hash_to_bib(ret) ⇒ Object
- .typed_title_strig(title) ⇒ RelatonBib::TypedTitleString
- .validity_hash_to_bib(ret) ⇒ Object
- .version_hash_to_bib(ret) ⇒ Object
Class Method Details
.abstract_hash_to_bib(ret) ⇒ Object
82 83 84 85 86 87 88 |
# File 'lib/relaton_bib/hash_converter.rb', line 82 def abstract_hash_to_bib(ret) return unless ret[:abstract] ret[:abstract] = array(ret[:abstract]).map do |a| a.is_a?(String) ? FormattedString.new(content: a) : a end end |
.accesslocation_hash_to_bib(ret) ⇒ Object
104 105 106 107 108 |
# File 'lib/relaton_bib/hash_converter.rb', line 104 def accesslocation_hash_to_bib(ret) return unless ret[:accesslocation] ret[:accesslocation] = array(ret[:accesslocation]) end |
.affiliation_hash_to_bib(person) ⇒ Object
rubocop:disable Metrics/AbcSize, Metrics/MethodLength
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
# File 'lib/relaton_bib/hash_converter.rb', line 241 def affiliation_hash_to_bib(person) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength return [] unless person[:affiliation] array(person[:affiliation]).map do |a| a[:description] = array(a[:description])&.map do |d| cnt = if d.is_a?(Hash) { content: d[:content], language: d[:language], script: d[:script], format: d[:format] } else { content: d } end FormattedString.new(**cnt) end Affiliation.new( organization: Organization.new(**org_hash_to_bib(a[:organization])), description: a[:description], ) end end |
.array(arr) ⇒ Array
452 453 454 455 456 457 |
# File 'lib/relaton_bib/hash_converter.rb', line 452 def array(arr) return [] unless arr return [arr] unless arr.is_a?(Array) arr end |
.bib_item(item_hash) ⇒ RelatonBib::BibliographicItem
312 313 314 |
# File 'lib/relaton_bib/hash_converter.rb', line 312 def bib_item(item_hash) BibliographicItem.new(**item_hash) end |
.biblionote_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/AbcSize
143 144 145 146 147 148 149 150 151 152 |
# File 'lib/relaton_bib/hash_converter.rb', line 143 def biblionote_hash_to_bib(ret) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize return unless ret[:biblionote] ret[:biblionote] = array(ret[:biblionote]) .reduce(BiblioNoteCollection.new([])) do |mem, n| mem << if n.is_a?(String) then BiblioNote.new content: n else BiblioNote.new(**n) end end end |
.classification_hash_to_bib(ret) ⇒ Object
376 377 378 379 380 381 382 |
# File 'lib/relaton_bib/hash_converter.rb', line 376 def classification_hash_to_bib(ret) if ret[:classification] ret[:classification] = array(ret[:classification]).map do |cls| Classification.new(**cls) end end end |
.contacts_hash_to_bib(entity) ⇒ Object
rubocop:disable Metrics/AbcSize, Metrics/MethodLength
260 261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'lib/relaton_bib/hash_converter.rb', line 260 def contacts_hash_to_bib(entity) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength return [] unless entity[:contact] array(entity[:contact]).map do |a| if a[:city] || a[:country] RelatonBib::Address.new( street: Array(a[:street]), city: a[:city], postcode: a[:postcode], country: a[:country], state: a[:state] ) else RelatonBib::Contact.new(type: a[:type], value: a[:value]) end end end |
.contributors_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength,Metrics/PerceivedComplexity
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/relaton_bib/hash_converter.rb', line 176 def contributors_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength,Metrics/PerceivedComplexity return unless ret[:contributor] ret[:contributor] = array(ret[:contributor]) ret[:contributor]&.each_with_index do |c, i| roles = array(ret[:contributor][i][:role]).map do |r| if r.is_a? Hash { type: r[:type], description: array(r[:description]) } # elsif r.is_a? Array # { type: r[0], description: r.fetch(1) } else { type: r } end end ret[:contributor][i][:role] = roles ret[:contributor][i][:entity] = if c[:person] person_hash_to_bib(c[:person]) else org_hash_to_bib(c[:organization]) end ret[:contributor][i].delete(:person) ret[:contributor][i].delete(:organization) end end |
.copyright_hash_to_bib(ret) ⇒ Object
276 277 278 279 280 281 282 283 |
# File 'lib/relaton_bib/hash_converter.rb', line 276 def copyright_hash_to_bib(ret) return unless ret[:copyright] ret[:copyright] = array(ret[:copyright]).map do |c| c[:owner] = array(c[:owner]) c end end |
.dates_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/AbcSize
110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/relaton_bib/hash_converter.rb', line 110 def dates_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize return unless ret[:date] ret[:date] = array(ret[:date]) ret[:date].each_with_index do |d, i| # value is synonym of on: it is reserved word in YAML if d[:value] ret[:date][i][:on] ||= d[:value] ret[:date][i].delete(:value) end end end |
.docid_hash_to_bib(ret) ⇒ Object
rubocop:disable Metrics/AbcSize
123 124 125 126 127 128 129 130 131 132 |
# File 'lib/relaton_bib/hash_converter.rb', line 123 def docid_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize return unless ret[:docid] ret[:docid] = array(ret[:docid]) ret[:docid]&.each_with_index do |id, i| type = id[:type] || id[:id].match(/^\w+(?=\s)/)&.to_s ret[:docid][i] = DocumentIdentifier.new(id: id[:id], type: type, scope: id[:scope]) end end |
.docstatus_hash_to_bib(ret) ⇒ Object
159 160 161 162 163 164 165 |
# File 'lib/relaton_bib/hash_converter.rb', line 159 def docstatus_hash_to_bib(ret) ret[:docstatus] && ret[:docstatus] = DocumentStatus.new( stage: stage(ret[:docstatus][:stage]), substage: stage(ret[:docstatus][:substage]), iteration: ret[:docstatus][:iteration], ) end |
.editorialgroup_hash_to_bib(ret) ⇒ Object
409 410 411 412 413 414 415 416 |
# File 'lib/relaton_bib/hash_converter.rb', line 409 def editorialgroup_hash_to_bib(ret) return unless ret[:editorialgroup] technical_committee = array(ret[:editorialgroup]).map do |wg| TechnicalCommittee.new WorkGroup.new(**wg) end ret[:editorialgroup] = EditorialGroup.new technical_committee end |
.extent_hash_to_bib(ret) ⇒ Object
48 49 50 51 52 53 54 55 56 |
# File 'lib/relaton_bib/hash_converter.rb', line 48 def extent_hash_to_bib(ret) return unless ret[:extent] ret[:extent] = array(ret[:extent]) ret[:extent]&.each_with_index do |e, i| ret[:extent][i] = BibItemLocality.new(e[:type], e[:reference_from], e[:reference_to]) end end |
.formattedref(frf) ⇒ RelatonBib::FormattedRef
486 487 488 489 490 491 492 |
# File 'lib/relaton_bib/hash_converter.rb', line 486 def formattedref(frf) if frf.is_a?(Hash) RelatonBib::FormattedRef.new(**frf) else RelatonBib::FormattedRef.new(content: frf) end end |
.formattedref_hash_to_bib(ret) ⇒ Object
154 155 156 157 |
# File 'lib/relaton_bib/hash_converter.rb', line 154 def formattedref_hash_to_bib(ret) ret[:formattedref] && ret[:formattedref] = formattedref(ret[:formattedref]) end |
.fullname_hash_to_bib(person) ⇒ Object
rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
223 224 225 226 227 228 229 230 231 232 233 |
# File 'lib/relaton_bib/hash_converter.rb', line 223 def fullname_hash_to_bib(person) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity n = person[:name] FullName.new( forename: array(n[:forename])&.map { |f| localname(f, person) }, initial: array(n[:initial])&.map { |f| localname(f, person) }, addition: array(n[:addition])&.map { |f| localname(f, person) }, prefix: array(n[:prefix])&.map { |f| localname(f, person) }, surname: localname(n[:surname], person), completename: localname(n[:completename], person), ) end |
.hash_to_bib(args, nested = false) ⇒ Hash
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/relaton_bib/hash_converter.rb', line 9 def hash_to_bib(args, nested = false) return nil unless args.is_a?(Hash) ret = Marshal.load(Marshal.dump(symbolize(args))) # deep copy (ret) unless nested title_hash_to_bib(ret) link_hash_to_bib(ret) language_hash_to_bib(ret) script_hash_to_bib(ret) dates_hash_to_bib(ret) docid_hash_to_bib(ret) version_hash_to_bib(ret) biblionote_hash_to_bib(ret) abstract_hash_to_bib(ret) formattedref_hash_to_bib(ret) docstatus_hash_to_bib(ret) contributors_hash_to_bib(ret) copyright_hash_to_bib(ret) relations_hash_to_bib(ret) series_hash_to_bib(ret) medium_hash_to_bib(ret) place_hash_to_bib(ret) extent_hash_to_bib(ret) accesslocation_hash_to_bib(ret) classification_hash_to_bib(ret) validity_hash_to_bib(ret) ret[:keyword] = array(ret[:keyword]) ret[:license] = array(ret[:license]) editorialgroup_hash_to_bib ret ics_hash_to_bib ret structuredidentifier_hash_to_bib ret ret end |
.ics_hash_to_bib(ret) ⇒ Object
419 420 421 422 423 |
# File 'lib/relaton_bib/hash_converter.rb', line 419 def ics_hash_to_bib(ret) return unless ret[:ics] ret[:ics] = array(ret[:ics]).map { |ics| ICS.new(**ics) } end |
.language_hash_to_bib(ret) ⇒ Object
70 71 72 73 74 |
# File 'lib/relaton_bib/hash_converter.rb', line 70 def language_hash_to_bib(ret) return unless ret[:language] ret[:language] = array(ret[:language]) end |
.link_hash_to_bib(ret) ⇒ Object
90 91 92 93 94 |
# File 'lib/relaton_bib/hash_converter.rb', line 90 def link_hash_to_bib(ret) return unless ret[:link] ret[:link] = array(ret[:link]) end |
.localizedstring(lst) ⇒ RelatonBib::LocalizedString
475 476 477 478 479 480 481 482 |
# File 'lib/relaton_bib/hash_converter.rb', line 475 def localizedstring(lst) if lst.is_a?(Hash) RelatonBib::LocalizedString.new(lst[:content], lst[:language], lst[:script]) else RelatonBib::LocalizedString.new(lst) end end |
.localname(name, person) ⇒ RelatonBib::LocalizedString
462 463 464 465 466 467 468 469 470 471 |
# File 'lib/relaton_bib/hash_converter.rb', line 462 def localname(name, person) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize return nil if name.nil? lang = name[:language] if name.is_a?(Hash) lang ||= person[:name][:language] script = name[:script] if name.is_a?(Hash) script ||= person[:name][:script] n = name.is_a?(Hash) ? name[:content] : name RelatonBib::LocalizedString.new(n, lang, script) end |
.medium_hash_to_bib(ret) ⇒ Object
371 372 373 |
# File 'lib/relaton_bib/hash_converter.rb', line 371 def medium_hash_to_bib(ret) ret[:medium] = Medium.new(**ret[:medium]) if ret[:medium] end |
.org_hash_to_bib(org) ⇒ Object
201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/relaton_bib/hash_converter.rb', line 201 def org_hash_to_bib(org) return nil if org.nil? org[:identifier] = array(org[:identifier])&.map do |a| OrgIdentifier.new(a[:type], a[:id]) end org[:subdivision] = array(org[:subdivision]).map do |sd| LocalizedString.new sd end org[:contact] = contacts_hash_to_bib(org) org end |
.parse_validity_time(val, period) ⇒ Object
394 395 396 397 398 399 400 401 402 403 404 405 406 |
# File 'lib/relaton_bib/hash_converter.rb', line 394 def parse_validity_time(val, period) t = val[period]&.to_s return unless t p = period == :ends ? -1 : 1 case t when /^\d{4}$/ Date.new(t.to_i, p, p).to_time when /^(?<year>\d{4})-(?<month>\d{1,2})$/ Date.new($~[:year].to_i, $~[:month].to_i, p).to_time else Time.parse t end end |
.person_hash_to_bib(person) ⇒ Object
214 215 216 217 218 219 220 221 |
# File 'lib/relaton_bib/hash_converter.rb', line 214 def person_hash_to_bib(person) Person.new( name: fullname_hash_to_bib(person), affiliation: affiliation_hash_to_bib(person), contact: contacts_hash_to_bib(person), identifier: person_identifiers_hash_to_bib(person), ) end |
.person_identifiers_hash_to_bib(person) ⇒ Object
235 236 237 238 239 |
# File 'lib/relaton_bib/hash_converter.rb', line 235 def person_identifiers_hash_to_bib(person) array(person[:identifier])&.map do |a| PersonIdentifier.new(a[:type], a[:id]) end end |
.place_hash_to_bib(ret) ⇒ Object
96 97 98 99 100 101 102 |
# File 'lib/relaton_bib/hash_converter.rb', line 96 def place_hash_to_bib(ret) return unless ret[:place] ret[:place] = array(ret[:place]).map do |pl| pl.is_a?(String) ? Place.new(name: pl) : Place.new(**pl) end end |
.relation_bibitem_hash_to_bib(rel) ⇒ Object
301 302 303 304 305 306 307 308 |
# File 'lib/relaton_bib/hash_converter.rb', line 301 def relation_bibitem_hash_to_bib(rel) if rel[:bibitem] rel[:bibitem] = bib_item hash_to_bib(rel[:bibitem], true) else warn "[relaton-bib] bibitem missing: #{rel}" rel[:bibitem] = nil end end |
.relation_locality_hash_to_bib(rel) ⇒ RelatonBib::LocalityStack
318 319 320 321 322 323 324 325 326 327 328 329 330 331 |
# File 'lib/relaton_bib/hash_converter.rb', line 318 def relation_locality_hash_to_bib(rel) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength rel[:locality] = array(rel[:locality])&.map do |bl| ls = if bl[:locality_stack] array(bl[:locality_stack]).map do |l| Locality.new(l[:type], l[:reference_from], l[:reference_to]) end else l = Locality.new(bl[:type], bl[:reference_from], bl[:reference_to]) [l] end LocalityStack.new ls end end |
.relation_source_locality_hash_to_bib(rel) ⇒ Object
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 |
# File 'lib/relaton_bib/hash_converter.rb', line 334 def relation_source_locality_hash_to_bib(rel) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength rel[:source_locality] = array(rel[:source_locality])&.map do |sl| sls = if sl[:source_locality_stack] array(sl[:source_locality_stack]).map do |l| SourceLocality.new(l[:type], l[:reference_from], l[:reference_to]) end else l = SourceLocality.new(sl[:type], sl[:reference_from], sl[:reference_to]) [l] end SourceLocalityStack.new sls end end |
.relations_hash_to_bib(ret) ⇒ Object
286 287 288 289 290 291 292 293 294 295 296 297 298 |
# File 'lib/relaton_bib/hash_converter.rb', line 286 def relations_hash_to_bib(ret) return unless ret[:relation] ret[:relation] = array(ret[:relation]) ret[:relation]&.each do |r| if r[:description] r[:description] = FormattedString.new(**r[:description]) end relation_bibitem_hash_to_bib(r) relation_locality_hash_to_bib(r) relation_source_locality_hash_to_bib(r) end end |
.script_hash_to_bib(ret) ⇒ Object
76 77 78 79 80 |
# File 'lib/relaton_bib/hash_converter.rb', line 76 def script_hash_to_bib(ret) return unless ret[:script] ret[:script] = array(ret[:script]) end |
.series_hash_to_bib(ret) ⇒ Object
351 352 353 354 355 356 357 358 359 360 361 362 |
# File 'lib/relaton_bib/hash_converter.rb', line 351 def series_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity ret[:series] = array(ret[:series])&.map do |s| s[:formattedref] && s[:formattedref] = formattedref(s[:formattedref]) if s[:title] s[:title] = { content: s[:title] } unless s[:title].is_a?(Hash) s[:title] = typed_title_strig(s[:title]) end s[:abbreviation] && s[:abbreviation] = localizedstring(s[:abbreviation]) Series.new(**s) end end |
.stage(stg) ⇒ RelatonBib::DocumentStatus::Stage
169 170 171 172 173 174 |
# File 'lib/relaton_bib/hash_converter.rb', line 169 def stage(stg) return unless stg args = stg.is_a?(String) ? { value: stg } : stg DocumentStatus::Stage.new(**args) end |
.structuredidentifier_hash_to_bib(ret) ⇒ Object
426 427 428 429 430 431 432 433 434 |
# File 'lib/relaton_bib/hash_converter.rb', line 426 def structuredidentifier_hash_to_bib(ret) return unless ret[:structuredidentifier] sids = array(ret[:structuredidentifier]).map do |si| si[:agency] = array si[:agency] StructuredIdentifier.new(**si) end ret[:structuredidentifier] = StructuredIdentifierCollection.new sids end |
.symbolize(obj) ⇒ Hash, ...
438 439 440 441 442 443 444 445 446 447 448 |
# File 'lib/relaton_bib/hash_converter.rb', line 438 def symbolize(obj) case obj when Hash obj.reduce({}) do |memo, (k, v)| memo[k.to_sym] = symbolize(v) memo end when Array then obj.reduce([]) { |memo, v| memo << symbolize(v) } else obj end end |
.timestamp_hash(ret) ⇒ Object
rubocop:enable Metrics/MethodLength, Metrics/AbcSize
44 45 46 |
# File 'lib/relaton_bib/hash_converter.rb', line 44 def (ret) ret[:fetched] ||= Date.today.to_s end |
.title_hash_to_bib(ret) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/relaton_bib/hash_converter.rb', line 58 def title_hash_to_bib(ret) return unless ret[:title] ret[:title] = array(ret[:title]) .reduce(TypedTitleStringCollection.new) do |m, t| if t.is_a?(Hash) then m << t else m + TypedTitleString.from_string(t) end end end |
.typed_title_strig(title) ⇒ RelatonBib::TypedTitleString
366 367 368 |
# File 'lib/relaton_bib/hash_converter.rb', line 366 def typed_title_strig(title) TypedTitleString.new(**title) end |
.validity_hash_to_bib(ret) ⇒ Object
385 386 387 388 389 390 391 392 |
# File 'lib/relaton_bib/hash_converter.rb', line 385 def validity_hash_to_bib(ret) return unless ret[:validity] b = parse_validity_time(ret[:validity], :begins) e = parse_validity_time(ret[:validity], :ends) r = parse_validity_time(ret[:validity], :revision) ret[:validity] = Validity.new(begins: b, ends: e, revision: r) end |
.version_hash_to_bib(ret) ⇒ Object
134 135 136 137 138 139 140 141 |
# File 'lib/relaton_bib/hash_converter.rb', line 134 def version_hash_to_bib(ret) return unless ret[:version] ret[:version][:draft] = array(ret[:version][:draft]) ret[:version] && ret[:version] = BibliographicItem::Version.new( ret[:version][:revision_date], ret[:version][:draft] ) end |