Class: Elibri::XmlVariant

Inherits:
Object
  • Object
show all
Defined in:
lib/elibri_onix_mocks/xml_variant.rb

Overview

Klasa implementująca logikę wariantów XML produktów. Gdy klient zapłaci za pełne informacje o produkcie, to dostaje bogatszy XML. Poniższa klasa jest tylko helperem, który upraszcza i redukuje kod w innych miejscach aplikacji.

Defined Under Namespace

Classes: InvalidFeature

Constant Summary collapse

FEATURES_SEPARATOR =
':'
FEATURES =

Dostępne elementy XML produktu. Gdy nic nie będzie wybrane, XML będzie zawierał tylko RecordReference.

ActiveSupport::OrderedHash.new
ALL_FEATURES_COMBINATIONS =

Wszystkie możliwe kombinacje wariantów XML - zbiór uzupełniany na końcu klasy. Upraszcza kod odświeżacza XML. W celu odświeżenia wszystkich możliwych wariantów XML dla produktu, po prostu iteruję po tej kolekcji.

Set.new
FULL_VARIANT =

Wariant zawierający wszystkie możliwe dane:

self.new(FEATURES.keys)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*features) ⇒ XmlVariant

jeśli ostatni argument to true, to nie waliduj, czy kobinacja jest prawidłowa, a więc jest jedną z ALL_FEATURES_COMBINATIONS



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 27

def initialize(*features)
  @features = Array(features).flatten
  if @features[-1] === true
    ignore_unknow_combinations = true
    @features.pop
  else
    ignore_unknow_combinations = false
  end
  @features = @features.reject(&:blank?).map(&:to_sym).to_set

  unless (@features - FEATURES.keys).empty?
    raise InvalidFeature.new("Unknown xml features #{@features.inspect}")
  end
  unless ignore_unknow_combinations
    if @features.present? and !ALL_FEATURES_COMBINATIONS.map(&:features).include?(@features)
      raise InvalidFeature.new("Unknow combination of xml features #{@features.inspect}")
    end
  end
end

Instance Attribute Details

#featuresObject (readonly)

Returns the value of attribute features.



10
11
12
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 10

def features
  @features
end

Class Method Details

.deserialize(features_str, ignore_unknow_combinations = false) ⇒ Object

Fabryka budująca instancę XmlVariant ze stringu ‘basic_meta:media_files:other_texts:stocks’



57
58
59
60
61
62
63
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 57

def self.deserialize(features_str, ignore_unknow_combinations = false)
  if ignore_unknow_combinations
    XmlVariant.new(features_str.to_s.split(FEATURES_SEPARATOR), true)
  else
    XmlVariant.new(features_str.to_s.split(FEATURES_SEPARATOR))
  end
end

Instance Method Details

#==(other_xml_variant) ⇒ Object



71
72
73
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 71

def ==(other_xml_variant)
  self.features == other_xml_variant.features
end

#eql?(other_xml_variant) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 76

def eql?(other_xml_variant)
  self == other_xml_variant
end

#equal?(other_xml_variant) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 81

def equal?(other_xml_variant)
  self == other_xml_variant
end

#except(*features) ⇒ Object



65
66
67
68
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 65

def except(*features)
  excluded_features = Array(features).flatten.map(&:to_sym)
  XmlVariant.new( (self.features - excluded_features).to_a )
end

#feature_included?(feature) ⇒ Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 92

def feature_included?(feature)
  self.features.include?(feature.to_sym)
end

#hashObject

Żeby działało porównywanie w Set`ach



87
88
89
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 87

def hash
  self.features.hash
end

#serializeObject

Wykorzystywane do utworzenia nazwy pliku XML oraz serializacji wariantu w MySQL. Zwraca np. ‘basic_meta:media_files:other_texts:stocks’



108
109
110
111
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 108

def serialize
  # features muszą być posortowane, aby za każdym razem generować tę samą nazwę - Set nie gwarantuje kolejności.
  self.features.map(&:to_s).sort.join(FEATURES_SEPARATOR) 
end

#to_sObject



114
115
116
# File 'lib/elibri_onix_mocks/xml_variant.rb', line 114

def to_s
  "#<Elibri::XmlVariant: features=#{self.features.inspect}>"
end