diff --git a/lib/relaton_bib/hash_converter.rb b/lib/relaton_bib/hash_converter.rb index c2d55ca..c21404c 100644 --- a/lib/relaton_bib/hash_converter.rb +++ b/lib/relaton_bib/hash_converter.rb @@ -308,9 +308,7 @@ def contacts_hash_to_bib(entity) # rubocop:disable Metrics/AbcSize,Metrics/Metho when :street, :city, :state, :country, :postcode # it's for old version compatibility, should be removed in the future a[:street] = RelatonBib.array(a[:street]) Address.new(**a) - when :address - a[:address][:street] = RelatonBib.array(a[:address][:street]) - Address.new(**a[:address]) + when :address then create_address(a[:address]) when :phone, :email, :uri Contact.new(type: type.to_s, value: value, subtype: a[:type]) else # it's for old version compatibility, should be removed in the future @@ -319,6 +317,15 @@ def contacts_hash_to_bib(entity) # rubocop:disable Metrics/AbcSize,Metrics/Metho end end + def create_address(adr) + if adr.is_a?(Hash) + adr[:street] = RelatonBib.array(adr[:street]) + Address.new(**adr) + else + Address.new(formatted_address: adr) + end + end + # @param ret [Hash] def copyright_hash_to_bib(ret) return unless ret[:copyright] diff --git a/lib/relaton_bib/renderer/bibxml.rb b/lib/relaton_bib/renderer/bibxml.rb index a4a1b4d..10ae959 100644 --- a/lib/relaton_bib/renderer/bibxml.rb +++ b/lib/relaton_bib/renderer/bibxml.rb @@ -124,12 +124,10 @@ def render_authors(builder) # rubocop:disable Metrics/AbcSize # @param [RelatonBib::ContributionInfo] contrib contributor # def render_address(builder, contrib) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity - # addr = contrib.entity.contact.reject do |cn| - # cn.is_a?(Address) && cn.postcode.nil? - # end - if contrib.entity.contact.any? + address, contact = address_contact contrib.entity.contact + if address || contact.any? builder.address do |xml| - address = contrib.entity.contact.detect { |cn| cn.is_a? Address } + # address = contrib.entity.contact.detect { |cn| cn.is_a? Address } if address xml.postal do xml.city address.city if address.city @@ -139,11 +137,19 @@ def render_address(builder, contrib) # rubocop:disable Metrics/AbcSize, Metrics/ xml.street address.street[0] if address.street.any? end end - render_contact xml, contrib.entity.contact + render_contact xml, contact end end end + def address_contact(contact) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity + addr = contact.detect do |c| + c.is_a?(Address) && (c.city || c.postcode || c.country || c.state || c.street.any?) + end + cont = contact.select { |c| c.is_a?(Contact) } + [addr, cont] + end + # # Render contact # diff --git a/lib/relaton_bib/version.rb b/lib/relaton_bib/version.rb index b56e1b0..2ea3412 100644 --- a/lib/relaton_bib/version.rb +++ b/lib/relaton_bib/version.rb @@ -1,3 +1,3 @@ module RelatonBib - VERSION = "1.18.0".freeze + VERSION = "1.18.1".freeze end diff --git a/spec/examples/asciibib.adoc b/spec/examples/asciibib.adoc index 331fc00..cf15274 100644 --- a/spec/examples/asciibib.adoc +++ b/spec/examples/asciibib.adoc @@ -199,6 +199,7 @@ contributor.organization.name:: Institute of Electrical and Electronics Engineer contributor.organization.abbreviation:: IEEE contributor.organization.identifier.type:: uri contributor.organization.identifier.value:: www.ieee.org +contributor.organization.address.formatted_address:: Formatted address contributor.role:: contributor.role.description:: Publisher description contributor.role.type:: publisher @@ -245,6 +246,7 @@ contributor.person.name.surname.script:: Latn contributor.role.type:: editor contributor:: contributor.organization.name:: World Wide Web Consortium +contributor.organization.address.formatted_address:: Address string contributor.role.description:: sponsor contributor.role.type:: distributor relation:: diff --git a/spec/examples/bib_item.xml b/spec/examples/bib_item.xml index 2fadcc0..c5c7681 100644 --- a/spec/examples/bib_item.xml +++ b/spec/examples/bib_item.xml @@ -1,5 +1,5 @@ - 2024-01-05 + 2024-01-10 Geographic information Geographic information Information géographique @@ -78,6 +78,9 @@ Institute of Electrical and Electronics Engineers IEEE www.ieee.org +
+ Formatted address +
@@ -126,6 +129,9 @@ World Wide Web Consortium +
+ Address string +
Edition 1 diff --git a/spec/examples/bib_item.yml b/spec/examples/bib_item.yml index 6fd182e..11e0b2c 100644 --- a/spec/examples/bib_item.yml +++ b/spec/examples/bib_item.yml @@ -143,6 +143,9 @@ contributor: identifier: type: uri id: www.ieee.org + contact: + address: + formatted_address: Formatted address role: - type: publisher description: Publisher description @@ -205,6 +208,8 @@ contributor: - organization: name: World Wide Web Consortium + contact: + address: Address string role: type: distributor description: sponsor diff --git a/spec/examples/bibdata_item.xml b/spec/examples/bibdata_item.xml index 8e4a418..5054bbc 100644 --- a/spec/examples/bibdata_item.xml +++ b/spec/examples/bibdata_item.xml @@ -1,5 +1,5 @@ - 2024-01-05 + 2024-01-10 Geographic information Geographic information Information géographique @@ -78,6 +78,9 @@ Institute of Electrical and Electronics Engineers IEEE www.ieee.org +
+ Formatted address +
@@ -126,6 +129,9 @@ World Wide Web Consortium +
+ Address string +
Edition 1 diff --git a/spec/examples/bibdata_item_fr.xml b/spec/examples/bibdata_item_fr.xml index f85c642..6478c79 100644 --- a/spec/examples/bibdata_item_fr.xml +++ b/spec/examples/bibdata_item_fr.xml @@ -1,5 +1,5 @@ - 2024-01-05 + 2024-01-10 Information géographique https://www.iso.org/standard/53798.html https://www.iso.org/obp/ui/#!iso:std:53798:en @@ -76,6 +76,9 @@ Institute of Electrical and Electronics Engineers IEEE www.ieee.org +
+ Formatted address +
@@ -124,6 +127,9 @@ World Wide Web Consortium +
+ Address string +
Edition 1 diff --git a/spec/examples/hash.yml b/spec/examples/hash.yml index 6a8ee07..b335e39 100644 --- a/spec/examples/hash.yml +++ b/spec/examples/hash.yml @@ -123,6 +123,9 @@ contributor: identifier: - type: uri id: www.ieee.org + contact: + - address: + formatted_address: Formatted address role: - description: - content: Publisher description @@ -203,6 +206,9 @@ contributor: - organization: name: - content: World Wide Web Consortium + contact: + - address: + formatted_address: Address string role: - description: - content: sponsor diff --git a/spec/relaton_bib/hash_converter_spec.rb b/spec/relaton_bib/hash_converter_spec.rb index 75a428a..ffc2bf1 100644 --- a/spec/relaton_bib/hash_converter_spec.rb +++ b/spec/relaton_bib/hash_converter_spec.rb @@ -23,13 +23,13 @@ expect(ls).to be_instance_of RelatonBib::LocalizedString end - it "make localityStack form unwrapped loclaity" do + it "make localityStack from unwrapped loclaity" do hash = { locality: [{ type: "section", reference_from: "1" }] } RelatonBib::HashConverter.relation_locality_hash_to_bib hash expect(hash[:locality].first).to be_instance_of RelatonBib::LocalityStack end - it "make sourceLocalityStack form unwrapped sourceLoclaity" do + it "make sourceLocalityStack from unwrapped sourceLoclaity" do hash = { source_locality: [{ type: "section", reference_from: "1" }] } RelatonBib::HashConverter.relation_source_locality_hash_to_bib hash expect(hash[:source_locality].first).to be_instance_of( @@ -53,7 +53,7 @@ end context "contacts_hash_to_bib" do - it "create address form old hash" do + it "create address from old hash" do hash = { contact: [{ street: "Street", city: "City", country: "Country" }] } address = described_class.contacts_hash_to_bib hash expect(address).to be_instance_of Array @@ -71,7 +71,15 @@ expect(address.first.formatted_address).to eq "Address" end - it "create contact form old hash" do + it "create formatted address from string" do + entity = { contact: [{ address: "Address" }] } + address = RelatonBib::HashConverter.contacts_hash_to_bib entity + expect(address).to be_instance_of Array + expect(address.first).to be_instance_of RelatonBib::Address + expect(address.first.formatted_address).to eq "Address" + end + + it "create contact from old hash" do hash = { contact: [{ type: "phone", value: "123" }] } contact = described_class.contacts_hash_to_bib hash expect(contact).to be_instance_of Array