Class: XeroGateway::BaseRecord
- Inherits:
-
Object
- Object
- XeroGateway::BaseRecord
show all
- Defined in:
- lib/xero_gateway/base_record.rb
Defined Under Namespace
Classes: UnsupportedAttributeType
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(params = {}) ⇒ BaseRecord
Returns a new instance of BaseRecord.
39
40
41
42
43
|
# File 'lib/xero_gateway/base_record.rb', line 39
def initialize(params = {})
params.each do |k,v|
self.send("#{k}=", v) if respond_to?("#{k}=")
end
end
|
Class Method Details
.attribute(name, value) ⇒ Object
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# File 'lib/xero_gateway/base_record.rb', line 16
def attribute(name, value)
self.attribute_definitions ||= {}
self.attribute_definitions[name] = value
case value
when Hash
value.each do |k, v|
attribute("#{name}#{k}", v)
end
else
attr_accessor name.underscore
end
end
|
.attributes(hash) ⇒ Object
10
11
12
13
14
|
# File 'lib/xero_gateway/base_record.rb', line 10
def attributes(hash)
hash.each do |k, v|
attribute k, v
end
end
|
.from_xml(base_element) ⇒ Object
30
31
32
|
# File 'lib/xero_gateway/base_record.rb', line 30
def from_xml(base_element)
new.from_xml(base_element)
end
|
.xml_element ⇒ Object
34
35
36
|
# File 'lib/xero_gateway/base_record.rb', line 34
def xml_element
element_name || self.name.split('::').last
end
|
Instance Method Details
#==(other) ⇒ Object
45
46
47
|
# File 'lib/xero_gateway/base_record.rb', line 45
def ==(other)
to_xml == other.to_xml
end
|
#array_from_xml(element, attr_definition) ⇒ Object
93
94
95
96
|
# File 'lib/xero_gateway/base_record.rb', line 93
def array_from_xml(element, attr_definition)
definition_klass = attr_definition.first
element.children.map { |child_el| definition_klass.from_xml(child_el) }
end
|
#from_xml(base_element) ⇒ Object
56
57
58
59
|
# File 'lib/xero_gateway/base_record.rb', line 56
def from_xml(base_element)
from_xml_attributes(base_element)
self
end
|
#from_xml_attributes(element, attribute = nil, attr_definition = self.class.attribute_definitions) ⇒ Object
61
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
90
91
|
# File 'lib/xero_gateway/base_record.rb', line 61
def from_xml_attributes(element, attribute = nil, attr_definition = self.class.attribute_definitions)
if Hash === attr_definition
element.children.each do |child|
next unless child.respond_to?(:name)
child_attribute = child.name
child_attr_definition = attr_definition[child_attribute]
child_attr_name = "#{attribute}#{child_attribute}"
next unless child_attr_definition
from_xml_attributes(child, child_attr_name, child_attr_definition)
end
return
end
value = case attr_definition
when :boolean then element.text == "true"
when :float then element.text.to_f
when :integer then element.text.to_i
when :currency then BigDecimal.new(element.text)
when :date then Date.strptime(element.text, "%Y-%m-%d")
when :datetime then Date.strptime(element.text, "%Y-%m-%dT%H:%M:%S")
when :datetime_utc then Date.strptime(element.text + "Z", "%Y-%m-%dT%H:%M:%S%Z")
when Array then array_from_xml(element, attr_definition)
else element.text
end if element.text.present? || element.children.present?
send("#{attribute.underscore}=", value)
end
|
#to_xml ⇒ Object
49
50
51
52
53
54
|
# File 'lib/xero_gateway/base_record.rb', line 49
def to_xml
builder = Builder::XmlMarkup.new
builder.__send__(self.class.xml_element) do
to_xml_attributes(builder)
end
end
|
#to_xml_attributes(builder = Builder::XmlMarkup.new, path = nil, attr_definitions = self.class.attribute_definitions) ⇒ Object
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/xero_gateway/base_record.rb', line 98
def to_xml_attributes(builder = Builder::XmlMarkup.new, path = nil, attr_definitions = self.class.attribute_definitions)
attr_definitions.each do |attr, value|
case value
when Hash
builder.__send__(attr) do
to_xml_attributes(builder, "#{path}#{attr}", value)
end
when Array
raise UnsupportedAttributeType.new("#{value} instances don't respond to #to_xml") unless value.first.method_defined?(:to_xml)
value = send("#{path}#{attr}".underscore) || []
builder.__send__(attr) do |array_wrapper|
value.map do |k|
k.to_xml(array_wrapper)
end
end
else
builder.__send__(attr, send("#{path}#{attr}".underscore))
end
end
end
|