Class: ONIX::ONIXMessage

Inherits:
SubsetDSL show all
Extended by:
Forwardable
Defined in:
lib/onix/onix_message.rb

Instance Attribute Summary collapse

Attributes included from Attributes

#attributes

High level collapse

Low level collapse

Instance Method Summary collapse

Methods inherited from SubsetDSL

element, elements, get_class, inherited, n, ref_to_short, register_elements, register_scopes, #register_subset_array, registered_elements, #registered_elements, registered_scopes, scope, short_to_ref

Methods inherited from Subset

parse, #tag_match, #unsupported

Methods included from Attributes

attribute_class, #parse_attributes, #serialized_attributes

Constructor Details

#initializeONIXMessage

Returns a new instance of ONIXMessage.



32
33
34
35
# File 'lib/onix/onix_message.rb', line 32

def initialize
  @products = []
  @vault = {}
end

Instance Attribute Details

#releaseObject

Returns the value of attribute release.



17
18
19
# File 'lib/onix/onix_message.rb', line 17

def release
  @release
end

Instance Method Details

#addresseeAddressee

Forwarded to Header#addressee

Returns:



23
# File 'lib/onix/onix_message.rb', line 23

def_delegator :header, :addressee

#default_currency_codeString

Returns:

  • (String)


25
# File 'lib/onix/onix_message.rb', line 25

def_delegator :header, :default_currency_code

#default_language_of_textDefaultLanguageOfText

Returns:

  • (DefaultLanguageOfText)


24
# File 'lib/onix/onix_message.rb', line 24

def_delegator :header, :default_language_of_text

#detect_release(element) ⇒ String

detect ONIX version from XML tags

Returns:

  • (String)


117
118
119
120
121
122
123
124
125
# File 'lib/onix/onix_message.rb', line 117

def detect_release(element)
  if element
    return "3.0" if element.search("//DescriptiveDetail").length > 0
    return "3.0" if element.search("//CollateralDetail").length > 0
    return "3.0" if element.search("//ContentDetail").length > 0
    return "3.0" if element.search("//PublishingDetail").length > 0
  end
  "2.1"
end

#get_class(name) ⇒ Object



141
142
143
144
145
146
147
# File 'lib/onix/onix_message.rb', line 141

def get_class(name)
  if name == "Product"
    self.product_klass
  else
    super(name)
  end
end

#headerHeader

Returns:



19
# File 'lib/onix/onix_message.rb', line 19

element "Header", :subset, :cardinality => 1

#init_vaultObject

initialize hash between ID and product object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/onix/onix_message.rb', line 62

def init_vault
  @vault = {}
  @products.each do |product|
    product.identifiers.each do |ident|
      @vault[ident.uniq_id] = product
    end
    product.default_language_of_text = self.default_language_of_text if @header
    product.default_currency_code = self.default_currency_code if @header
  end

  @products.each do |product|
    product.related.each do |rel|
      rel.identifiers.each do |ident|
        if @vault[ident.uniq_id]
          rel.product = @vault[ident.uniq_id]
        end
      end
    end

    product.parts.each do |prt|
      prt.identifiers.each do |ident|
        if @vault[ident.uniq_id]
          prt.product = @vault[ident.uniq_id]
        end
      end
    end
  end
end

#merge!(other) ⇒ Object

merge another message in this one current object erase other values



47
48
49
50
51
52
# File 'lib/onix/onix_message.rb', line 47

def merge!(other)
  @products += other.products
  @products = @products.uniq { |p| p.ean }
  init_vault
  self
end

#open(arg, force_encoding = nil) ⇒ Object

open with arg detection

Parameters:

  • arg (String, File)


93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/onix/onix_message.rb', line 93

def open(arg, force_encoding = nil)
  data = ONIX::Helper.arg_to_data(arg)

  xml = nil
  if force_encoding
    xml = Nokogiri::XML.parse(data, nil, force_encoding)
  else
    xml = Nokogiri::XML.parse(data)
  end

  xml.remove_namespaces!
  xml
end

#parse(arg, force_encoding = nil, force_release = nil) ⇒ Object

parse filename or file

Parameters:

  • arg (String, File)


151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/onix/onix_message.rb', line 151

def parse(arg, force_encoding = nil, force_release = nil)
  @products = []
  xml = open(arg, force_encoding)
  root = xml.root
  set_release_from_xml(root, force_release)
  case root
  when tag_match("Product")
    @products << self.product_klass.parse(root)
  else # ONIXMessage
    super(root)
  end

  init_vault
end

#product_klassObject



137
138
139
# File 'lib/onix/onix_message.rb', line 137

def product_klass
  self.version >= 300 ? Product : ONIX21::Product
end

#productsArray<Product>

Returns:



20
# File 'lib/onix/onix_message.rb', line 20

elements "Product", :subset, :cardinality => 0..n

#select!(&block) ⇒ Object

keep products for which block return true



55
56
57
58
59
# File 'lib/onix/onix_message.rb', line 55

def select! &block
  @products.select! { |p| block.call(p) }
  init_vault
  self
end

#senderSender

Forwarded to Header#sender

Returns:



22
# File 'lib/onix/onix_message.rb', line 22

def_delegator :header, :sender

#sent_date_timeObject

Forwarded to Header#sent_date_time



26
# File 'lib/onix/onix_message.rb', line 26

def_delegator :header, :sent_date_time

#set_release_from_xml(node, force_release) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'lib/onix/onix_message.rb', line 127

def set_release_from_xml(node, force_release)
  @release = node["release"]
  unless @release
    @release = detect_release(node)
  end
  if force_release
    @release = force_release.to_s
  end
end

#vaultObject



37
38
39
# File 'lib/onix/onix_message.rb', line 37

def vault
  @vault
end

#vault=(v) ⇒ Object



41
42
43
# File 'lib/onix/onix_message.rb', line 41

def vault= v
  @vault = v
end

#versionNumber

release as an integer eg: 210, 300, 301

Returns:

  • (Number)


109
110
111
112
113
# File 'lib/onix/onix_message.rb', line 109

def version
  if @release
    @release.gsub(/\./, "").to_i * 10 ** (3 - @release.scan(".").length - 1)
  end
end