cxml-ruby 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 06f3a92004a0de57a2c595125aef836e25e4b59c52fc26b2ae349404b31dee88
4
- data.tar.gz: 9ff26daee0357c90ed5ee4526a8acb5548a7079b75acb7f41127b7b2e232d889
3
+ metadata.gz: ce8099da5b031d246dc2a1b8d30573135a3c35c233a003f337093d427cefbf1c
4
+ data.tar.gz: f5c612fcfbd98677ee6c1997a9d99f8b696434cef5a8b9df10cc02019b609451
5
5
  SHA512:
6
- metadata.gz: acc6d892e319799d7b3c82d53e629d061022c5fe01eef31045221793319158bdbd30076849bbd8ea3afed63bf94c592f3df6e9f9cb20d2474a087a83a69d9a15
7
- data.tar.gz: 924e231c90767fa651cd7c9e245ad7af0d8f9eff00425d38ad95515219e25268e361c630a41c76928ca38507d4c61347a3702bbb709473a8f16abb1f3201d5e9
6
+ metadata.gz: 83392422960e9a04d9a1d1a0becf00de7d424e7f79167a204fbfd3a582be98280c9f063658537a4c7a07d4d0931f0167b6265cb5c662cc5b1b0f63f96836a057
7
+ data.tar.gz: b55b5c92d354643dcd877016a6ef0ca8f0599d21cd5a3ab419eeddafa9864ef888a8c7c396caf634eb93944c61919f5900eb0ed2097a2b7b6903353046d513f9
data/.rubocop.yml CHANGED
@@ -69,6 +69,10 @@ Lint/RaiseException:
69
69
  Lint/StructNewOverride:
70
70
  Enabled: true
71
71
 
72
+ Naming/FileName:
73
+ Exclude:
74
+ - lib/cxml-ruby.rb
75
+
72
76
  # # Mixing the styles looks just silly.
73
77
  # Style/HashSyntax:
74
78
  # EnforcedStyle: ruby19_no_mixed_keys
data/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+ ### Added
9
+ ### Changed
10
+ ### Deprecated
11
+ ### Removed
12
+ ### Fixed
13
+ ### Security
14
+
15
+ ---
16
+
17
+ ## [0.3.0] - 2020-04-19
18
+ ### Changed
19
+ - Drop Nokogiri and XMLSimple in favor of Ox.
20
+ - Change Parser class interface to be OO.
data/README.md CHANGED
@@ -22,7 +22,11 @@ Currently supports these top-level documents in v1.2.037:
22
22
 
23
23
  ```rb
24
24
  some_xml = '....'
25
+ parsed_hash = CXML::Parser.new(data: some_xml).parse
26
+ # or
25
27
  doc = CXML::Document.new.from_xml(some_xml)
28
+ # or
29
+ doc = CXML::Document.new(parsed_hash)
26
30
  # raises CXML::UnknownAttributeError if unknown fields are present
27
31
 
28
32
  doc.response.status.code
@@ -31,17 +35,17 @@ doc.response.status.success?
31
35
  # => true
32
36
 
33
37
  # initialize docs with a hash
34
- CXML::Document.new(response: { status: { code: '200' } }).render.to_xml
38
+ CXML::Document.new(response: { status: { code: '200' } }).to_xml
35
39
  # => '<?xml.....'
36
40
 
37
41
  # initialize docs with instances
38
42
  status = CXML::Status.new(code: '200')
39
43
  response = CXML::Response.new(status: status)
40
- CXML::Document.new(response: response).render.to_xml
44
+ CXML::Document.new(response: response).to_xml
41
45
  # => '<?xml.....'
42
46
 
43
47
  # Set a different version
44
- CXML::Document.new(version: '1.1.0', response: { status: { code: '200' } }).render.to_xml
48
+ CXML::Document.new(version: '1.1.0', response: { status: { code: '200' } }).to_xml
45
49
  # => '<?xml.....'
46
50
  ```
47
51
 
data/cxml-ruby.gemspec CHANGED
@@ -12,14 +12,13 @@ Gem::Specification.new do |s|
12
12
  s.authors = ['Josh Beckman', 'Eleni Chappen']
13
13
  s.email = ['josh@officeluv.com', 'eleni@officeluv.com']
14
14
 
15
+ s.add_dependency('ox', '~> 2.13')
16
+
15
17
  s.add_development_dependency('pry', '~> 0.12')
16
18
  s.add_development_dependency('rake', '~> 13.0')
17
19
  s.add_development_dependency('rspec', '~> 3.9')
18
20
  s.add_development_dependency('rubocop', '~> 0.81')
19
21
 
20
- s.add_dependency('nokogiri', '~> 1.10')
21
- s.add_dependency('xml-simple', '~> 1.1')
22
-
23
22
  s.files = `git ls-files`.split("\n")
24
23
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
24
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
@@ -5,9 +5,5 @@ module CXML
5
5
  accessible_nodes %i[
6
6
  url
7
7
  ]
8
-
9
- def render_nodes(node)
10
- node.URL(url)
11
- end
12
8
  end
13
9
  end
data/lib/cxml/document.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require('time')
4
-
5
3
  module CXML
6
4
  class Document < DocumentNode
7
5
  accessible_attributes %i[
@@ -29,11 +27,6 @@ module CXML
29
27
  @version ||= '1.2.037'
30
28
  end
31
29
 
32
- def from_xml(xml_string)
33
- initialize(Parser.new.parse(xml_string))
34
- self
35
- end
36
-
37
30
  # Check if document is request
38
31
  # @return [Boolean]
39
32
  def request?
@@ -52,20 +45,35 @@ module CXML
52
45
  !message.nil?
53
46
  end
54
47
 
55
- def render
56
- node = CXML.builder
57
- node.doc.create_internal_subset(
58
- 'cXML',
59
- nil,
60
- "http://xml.cxml.org/schemas/cXML/#{version}/cXML.dtd"
61
- )
62
- node.cXML(node_attributes) do |doc|
63
- header&.render(doc)
64
- request&.render(doc)
65
- response&.render(doc)
66
- message&.render(doc)
67
- end
68
- node
48
+ def from_xml(xml_string)
49
+ initialize(Parser.new(data: xml_string).parse)
50
+ self
51
+ end
52
+
53
+ def to_xml(doc = ox_doc)
54
+ doc << to_element
55
+ Ox.dump doc
56
+ end
57
+
58
+ def node_name
59
+ 'cXML'
60
+ end
61
+
62
+ private
63
+
64
+ def dtd_url
65
+ "http://xml.cxml.org/schemas/cXML/#{version}/cXML.dtd"
66
+ end
67
+
68
+ def ox_doc
69
+ doc = Ox::Document.new
70
+ instruct = Ox::Instruct.new(:xml)
71
+ instruct[:version] = '1.0'
72
+ instruct[:encoding] = 'UTF-8'
73
+ instruct[:standalone] = 'yes'
74
+ doc << instruct
75
+ doc << Ox::DocType.new("cXML SYSTEM \"#{dtd_url}\"")
76
+ doc
69
77
  end
70
78
  end
71
79
  end
@@ -48,37 +48,55 @@ module CXML
48
48
  end
49
49
  end
50
50
 
51
- def render(node = CXML.builder)
52
- node.send(self.class.name.split('::').last, node_attributes) do |n|
53
- n.text(content) if content
54
- render_nodes(n)
55
- end
56
- node
51
+ def node_name
52
+ self.class.name.split('::').last
57
53
  end
58
54
 
59
- def render_nodes(node)
55
+ def to_element
56
+ element = ox_element
57
+ element << content if content
60
58
  self.class.nodes.each do |child_node_name|
61
59
  child_value = send(child_node_name)
62
60
  if child_value.is_a?(Array)
63
61
  child_value.each do |child_value_n|
64
- render_child_node(node, child_node_name, child_value_n)
62
+ render_child_node(element, child_node_name, child_value_n)
65
63
  end
66
64
  else
67
- render_child_node(node, child_node_name, child_value)
65
+ render_child_node(element, child_node_name, child_value)
68
66
  end
69
67
  end
68
+ element
70
69
  end
71
70
 
72
71
  private
73
72
 
74
- def render_child_node(node, name, value)
73
+ def ox_element
74
+ element = Ox::Element.new node_name
75
+ node_attributes.each do |key, val|
76
+ element[key] = val
77
+ end
78
+ element
79
+ end
80
+
81
+ def render_child_node(element, name, value)
75
82
  return if value.respond_to?(:empty?) ? value.empty? : !value
76
83
 
77
84
  if value.is_a?(DocumentNode)
78
- value.render(node)
85
+ element << value.to_element
86
+ return element
87
+ end
88
+ value_element = Ox::Element.new(camelize(name))
89
+ if value.is_a? Hash
90
+ value.each do |value_key, value_val|
91
+ next value_element << value_val if value_key == :content
92
+
93
+ value_element[value_key] = value_val
94
+ end
79
95
  else
80
- node.send(camelize(name), value)
96
+ value_element << value
81
97
  end
98
+ element << value_element
99
+ element
82
100
  end
83
101
 
84
102
  def node_attributes
@@ -118,6 +136,8 @@ module CXML
118
136
  else
119
137
  string.to_s.sub(/^(?:(?=\b|[A-Z_])|\w)/, &:downcase)
120
138
  end
139
+ return 'URL' if string.match?(/^url$/i)
140
+
121
141
  string.gsub(/_id(_)?$/, '_ID\1').gsub(%r{(?:_|(/))([a-z\d]*)}) do
122
142
  "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}"
123
143
  end.gsub('/', '::')
data/lib/cxml/parser.rb CHANGED
@@ -1,26 +1,42 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require('nokogiri')
4
- require('xmlsimple')
5
-
6
3
  module CXML
7
4
  class Parser
8
- def parse(data)
9
- hash = XmlSimple.xml_in(data, { 'ForceArray' => false })
10
- hash.transform_keys!(&method(:underscore_key))
11
- hash.transform_values!(&method(:underscore_hash_values))
12
- hash
5
+ attr_accessor :data,
6
+ :parsed_data
7
+
8
+ def initialize(data:)
9
+ @data = data
10
+ end
11
+
12
+ def parse
13
+ @parsed_data = node_to_hash document
14
+ end
15
+
16
+ def document
17
+ doc = Ox.load(data)
18
+ doc.nodes.detect do |node|
19
+ node.value&.match?(/^cxml$/i)
20
+ end || doc
13
21
  end
14
22
 
15
23
  private
16
24
 
17
- def underscore_hash_values(value)
18
- return value.map(&method(:underscore_hash_values)) if value.is_a?(Array)
19
- return value unless value.is_a?(Hash)
25
+ def node_to_hash(node)
26
+ return node if node.is_a? String
27
+
28
+ hash = node.attributes || {}
29
+ hash.transform_keys!(&method(:underscore_key))
30
+ node.nodes.reduce(hash) do |acc, child_node|
31
+ next acc if child_node.is_a?(Ox::Comment)
20
32
 
21
- value.transform_keys!(&method(:underscore_key))
22
- value.transform_values!(&method(:underscore_hash_values))
23
- value
33
+ node_hash = {}
34
+ name = child_node.is_a?(String) ? :content : child_node.value
35
+ node_hash[underscore_key(name)] = node_to_hash(child_node)
36
+ acc.merge(node_hash) do |_key, val1, val2|
37
+ [val1, val2].flatten
38
+ end
39
+ end
24
40
  end
25
41
 
26
42
  def underscore_key(key)
@@ -5,9 +5,5 @@ module CXML
5
5
  accessible_nodes %i[
6
6
  url
7
7
  ]
8
-
9
- def render_nodes(node)
10
- node.URL(url)
11
- end
12
8
  end
13
9
  end
@@ -5,9 +5,5 @@ module CXML
5
5
  accessible_nodes %i[
6
6
  url
7
7
  ]
8
-
9
- def render_nodes(node)
10
- node.URL(url)
11
- end
12
8
  end
13
9
  end
data/lib/cxml/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CXML
4
- VERSION = '0.2.1'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/cxml-ruby.rb CHANGED
@@ -1,18 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require('time')
4
- require('nokogiri')
5
4
  require('logger')
5
+ require('ox')
6
6
  require('cxml/document_node')
7
7
  Dir[File.join(__dir__, 'cxml', '*.rb')].sort.each { |file| require file }
8
8
 
9
9
  module CXML
10
10
  def self.parse(str)
11
- CXML::Parser.new.parse(str)
12
- end
13
-
14
- def self.builder
15
- Nokogiri::XML::Builder.new(encoding: 'UTF-8')
11
+ CXML::Parser.new(data: str).parse
16
12
  end
17
13
 
18
14
  def self.configure
@@ -9,12 +9,10 @@ describe CXML::Credential do
9
9
  it { should respond_to :credential_mac }
10
10
  it { should respond_to :identity }
11
11
 
12
- let(:parser) { CXML::Parser.new }
13
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
12
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
14
13
  let(:doc) { CXML::Document.new(data) }
15
14
  let(:sender) { doc.header.sender }
16
15
  let(:credential) { sender.credential }
17
- let(:builder) { doc.render }
18
16
 
19
17
  describe '#initialize' do
20
18
  it 'sets the attributes that are passed' do
@@ -24,8 +22,8 @@ describe CXML::Credential do
24
22
  end
25
23
 
26
24
  describe '#render' do
27
- let(:output_xml) { builder.to_xml }
28
- let(:output_data) { parser.parse(output_xml) }
25
+ let(:output_xml) { doc.to_xml }
26
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
29
27
  let(:sender_output_data) { output_data[:header][:sender] }
30
28
  let(:credential_output_data) { sender_output_data[:credential] }
31
29
 
@@ -33,8 +33,6 @@ describe CXML::Document do
33
33
  end
34
34
  end
35
35
 
36
- let(:parser) { CXML::Parser.new }
37
-
38
36
  it { should respond_to :version }
39
37
  it { should respond_to :payload_id }
40
38
  it { should respond_to :timestamp }
@@ -56,7 +54,7 @@ describe CXML::Document do
56
54
  end
57
55
 
58
56
  context 'when a request document is passed' do
59
- let(:data) { parser.parse(fixture('request_doc.xml')) }
57
+ let(:data) { CXML::Parser.new(data: fixture('request_doc.xml')).parse }
60
58
  include_examples :document_has_mandatory_values
61
59
  include_examples :document_has_a_header
62
60
  include_examples :document_has_a_timestamp
@@ -71,7 +69,7 @@ describe CXML::Document do
71
69
  end
72
70
 
73
71
  context 'when a response document is passed' do
74
- let(:data) { parser.parse(fixture('response_status_200.xml')) }
72
+ let(:data) { CXML::Parser.new(data: fixture('response_status_200.xml')).parse }
75
73
  include_examples :document_has_mandatory_values
76
74
  include_examples :document_has_a_timestamp
77
75
 
@@ -85,7 +83,7 @@ describe CXML::Document do
85
83
  end
86
84
 
87
85
  context 'when a punch out order message is passed' do
88
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
86
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
89
87
  include_examples :document_has_mandatory_values
90
88
  include_examples :document_has_a_header
91
89
  include_examples :document_has_a_timestamp
@@ -100,21 +98,20 @@ describe CXML::Document do
100
98
  end
101
99
  end
102
100
 
103
- describe '#render' do
101
+ describe '#to_xml' do
104
102
  let(:doc) { CXML::Document.new(data) }
105
- let(:builder) { doc.render }
106
- let(:output_xml) { builder.to_xml }
107
- let(:output_data) { parser.parse(output_xml) }
103
+ let(:output_xml) { doc.to_xml }
104
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
108
105
 
109
- it { should respond_to :render }
106
+ it { should respond_to :to_xml }
110
107
 
111
108
  context 'when a request document is rendered' do
112
- let(:data) { parser.parse(fixture('request_doc.xml')) }
109
+ let(:data) { CXML::Parser.new(data: fixture('request_doc.xml')).parse }
113
110
  include_examples :document_render_defaults
114
111
  end
115
112
 
116
113
  context 'when a valid response is rendered' do
117
- let(:data) { parser.parse(fixture('response_status_200.xml')) }
114
+ let(:data) { CXML::Parser.new(data: fixture('response_status_200.xml')).parse }
118
115
  it 'returns xml content' do
119
116
  output_xml.should_not be_nil
120
117
  end
@@ -131,7 +128,7 @@ describe CXML::Document do
131
128
  end
132
129
 
133
130
  context 'when a invalid response is rendered' do
134
- let(:data) { parser.parse(fixture('response_status_400.xml')) }
131
+ let(:data) { CXML::Parser.new(data: fixture('response_status_400.xml')).parse }
135
132
  it 'returns xml content' do
136
133
  output_xml.should_not be_nil
137
134
  end
@@ -143,7 +140,7 @@ describe CXML::Document do
143
140
  end
144
141
 
145
142
  context 'when a punch out order message document is rendered' do
146
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
143
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
147
144
  include_examples :document_render_defaults
148
145
 
149
146
  it 'outputs the punch out order message xml' do
data/spec/header_spec.rb CHANGED
@@ -18,13 +18,11 @@ describe CXML::Header do
18
18
  it { should respond_to :from }
19
19
  it { should respond_to :to }
20
20
  it { should respond_to :sender }
21
- it { should respond_to :render }
22
21
 
23
22
  let(:parser) { CXML::Parser.new }
24
23
  let(:doc) { CXML::Document.new(data) }
25
- let(:builder) { doc.render }
26
24
  let(:header) { doc.header }
27
- let(:data) { parser.parse(fixture('request_doc.xml')) }
25
+ let(:data) { CXML::Parser.new(data: fixture('request_doc.xml')).parse }
28
26
 
29
27
  describe '#initialize' do
30
28
  it 'sets the mandatory attributes' do
@@ -35,8 +33,8 @@ describe CXML::Header do
35
33
  end
36
34
 
37
35
  describe '#render' do
38
- let(:output_xml) { builder.to_xml }
39
- let(:output_data) { parser.parse(output_xml) }
36
+ let(:output_xml) { doc.to_xml }
37
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
40
38
  let(:header_output_data) { output_data[:header] }
41
39
  let(:from_identity) { header_output_data[:from][:credential][:identity] }
42
40
  let(:to_identity) { header_output_data[:to][:credential][:identity] }
@@ -44,7 +42,7 @@ describe CXML::Header do
44
42
  include_examples :render_defaults
45
43
 
46
44
  context 'when the header is rendered as not a response' do
47
- let(:data) { parser.parse(fixture('request_doc.xml')) }
45
+ let(:data) { CXML::Parser.new(data: fixture('request_doc.xml')).parse }
48
46
  it 'will NOT swap the to and from attributes' do
49
47
  from_identity.should eq(header.from.credential.identity)
50
48
  to_identity.should eq(header.to.credential.identity)
@@ -10,35 +10,35 @@ describe CXML::InvoiceDetailRequest do
10
10
 
11
11
  describe '#initialize' do
12
12
  it 'sets invoice_detail_request_header' do
13
- data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line.xml'))
13
+ data = CXML::Parser.new(data: fixture('invoice_taxes_at_line.xml')).parse
14
14
  doc = CXML::Document.new(data)
15
15
  instance = doc.request.invoice_detail_request
16
16
  instance.invoice_detail_request_header
17
17
  .should be_an_instance_of CXML::InvoiceDetailRequestHeader
18
18
  end
19
19
  it 'sets invoice_detail_request_header' do
20
- data = CXML::Parser.new.parse(fixture('invoice_taxes_at_total.xml'))
20
+ data = CXML::Parser.new(data: fixture('invoice_taxes_at_total.xml')).parse
21
21
  doc = CXML::Document.new(data)
22
22
  instance = doc.request.invoice_detail_request
23
23
  instance.invoice_detail_request_header
24
24
  .should be_an_instance_of CXML::InvoiceDetailRequestHeader
25
25
  end
26
26
  it 'sets invoice_detail_request_header' do
27
- data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line_multiple_taxes.xml'))
27
+ data = CXML::Parser.new(data: fixture('invoice_taxes_at_line_multiple_taxes.xml')).parse
28
28
  doc = CXML::Document.new(data)
29
29
  instance = doc.request.invoice_detail_request
30
30
  instance.invoice_detail_request_header
31
31
  .should be_an_instance_of CXML::InvoiceDetailRequestHeader
32
32
  end
33
33
  it 'sets invoice_detail_request_header' do
34
- data = CXML::Parser.new.parse(fixture('invoice_backed_and_unbacked_by_pos.xml'))
34
+ data = CXML::Parser.new(data: fixture('invoice_backed_and_unbacked_by_pos.xml')).parse
35
35
  doc = CXML::Document.new(data)
36
36
  instance = doc.request.invoice_detail_request
37
37
  instance.invoice_detail_request_header
38
38
  .should be_an_instance_of CXML::InvoiceDetailRequestHeader
39
39
  end
40
40
  it 'sets invoice_detail_request_header' do
41
- data = CXML::Parser.new.parse(fixture('invoice_backed_by_multiple_pos.xml'))
41
+ data = CXML::Parser.new(data: fixture('invoice_backed_by_multiple_pos.xml')).parse
42
42
  doc = CXML::Document.new(data)
43
43
  instance = doc.request.invoice_detail_request
44
44
  instance.invoice_detail_request_header
@@ -47,30 +47,30 @@ describe CXML::InvoiceDetailRequest do
47
47
  end
48
48
  describe '#to_xml' do
49
49
  it 'serializes the same output' do
50
- data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line.xml'))
50
+ data = CXML::Parser.new(data: fixture('invoice_taxes_at_line.xml')).parse
51
51
  doc = CXML::Document.new(data)
52
- CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
52
+ CXML::Parser.new(data: doc.to_xml).parse.should eq(data)
53
53
  end
54
54
  it 'serializes the same output' do
55
- data = CXML::Parser.new.parse(fixture('invoice_backed_and_unbacked_by_pos.xml'))
55
+ data = CXML::Parser.new(data: fixture('invoice_backed_and_unbacked_by_pos.xml')).parse
56
56
  doc = CXML::Document.new(data)
57
- CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
57
+ CXML::Parser.new(data: doc.to_xml).parse.should eq(data)
58
58
  end
59
59
  it 'serializes the same output' do
60
- data = CXML::Parser.new.parse(fixture('invoice_backed_by_multiple_pos.xml'))
60
+ data = CXML::Parser.new(data: fixture('invoice_backed_by_multiple_pos.xml')).parse
61
61
  doc = CXML::Document.new(data)
62
- CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
62
+ CXML::Parser.new(data: doc.to_xml).parse.should eq(data)
63
63
  end
64
64
  it 'serializes the same output' do
65
- data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line_multiple_taxes.xml'))
65
+ data = CXML::Parser.new(data: fixture('invoice_taxes_at_line_multiple_taxes.xml')).parse
66
66
  doc = CXML::Document.new(data)
67
- CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
67
+ CXML::Parser.new(data: doc.to_xml).parse.should eq(data)
68
68
  end
69
69
  it 'serializes the same output' do
70
70
  fixture_xml = fixture('invoice_taxes_at_total.xml')
71
- data = CXML::Parser.new.parse(fixture_xml)
71
+ data = CXML::Parser.new(data: fixture_xml).parse
72
72
  doc = CXML::Document.new(data)
73
- CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
73
+ CXML::Parser.new(data: doc.to_xml).parse.should eq(data)
74
74
  end
75
75
  it 'serializes from an instance' do
76
76
  money = CXML::Money.new(amount: '5', currency: 'USD')
@@ -78,7 +78,7 @@ describe CXML::InvoiceDetailRequest do
78
78
  instance = described_class.new(invoice_detail_summary: summary)
79
79
  data = CXML::Request.new(invoice_detail_request: instance)
80
80
  doc = CXML::Document.new(request: data)
81
- parsed = CXML::Parser.new.parse(doc.render.to_xml)
81
+ parsed = CXML::Parser.new(data: doc.to_xml).parse
82
82
  parsed[:request][:invoice_detail_request]
83
83
  .should eq(instance.serializable_hash)
84
84
  parsed[:request][:invoice_detail_request][:invoice_detail_summary][:gross_amount][:money]
@@ -7,14 +7,12 @@ describe CXML::ItemDetail do
7
7
  it { should respond_to :unit_of_measure }
8
8
  it { should respond_to :unit_price }
9
9
 
10
- let(:parser) { CXML::Parser.new }
11
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
10
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
12
11
  let(:doc) { CXML::Document.new(data) }
13
12
  let(:punch_out_order_message) { doc.message.punch_out_order_message }
14
- let(:builder) { doc.render }
15
13
 
16
14
  describe '#initialize' do
17
- let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
15
+ let(:item_in) { CXML::ItemIn.new(build_item_in) }
18
16
  let(:item_detail) { item_in.item_detail }
19
17
 
20
18
  it 'sets the mandatory attributes' do
@@ -26,11 +24,11 @@ describe CXML::ItemDetail do
26
24
 
27
25
  describe '#render' do
28
26
  before(:each) do
29
- punch_out_order_message.add_item(build_item_in(parser))
27
+ punch_out_order_message.add_item(build_item_in)
30
28
  end
31
29
 
32
- let(:output_xml) { builder.to_xml }
33
- let(:output_data) { parser.parse(output_xml) }
30
+ let(:output_xml) { doc.to_xml }
31
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
34
32
  let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
35
33
  let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
36
34
  let(:item_detail_output_data) { item_in_output_data[:item_detail] }
data/spec/item_id_spec.rb CHANGED
@@ -6,14 +6,12 @@ describe CXML::ItemID do
6
6
  it { should respond_to :supplier_part_id }
7
7
  it { should respond_to :supplier_part_auxiliary_id }
8
8
 
9
- let(:parser) { CXML::Parser.new }
10
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
9
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
11
10
  let(:doc) { CXML::Document.new(data) }
12
11
  let(:punch_out_order_message) { doc.message.punch_out_order_message }
13
- let(:builder) { doc.render }
14
12
 
15
13
  describe '#initialize' do
16
- let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
14
+ let(:item_in) { CXML::ItemIn.new(build_item_in) }
17
15
  let(:item_id) { item_in.item_id }
18
16
 
19
17
  it 'sets the attributes that are passed' do
@@ -23,11 +21,11 @@ describe CXML::ItemID do
23
21
 
24
22
  describe '#render' do
25
23
  before(:each) do
26
- punch_out_order_message.add_item(build_item_in(parser))
24
+ punch_out_order_message.add_item(build_item_in)
27
25
  end
28
26
 
29
- let(:output_xml) { builder.to_xml }
30
- let(:output_data) { parser.parse(output_xml) }
27
+ let(:output_xml) { doc.to_xml }
28
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
31
29
  let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
32
30
  let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
33
31
  let(:item_id_output_data) { item_in_output_data[:item_id] }
data/spec/item_in_spec.rb CHANGED
@@ -8,14 +8,12 @@ describe CXML::ItemIn do
8
8
  it { should respond_to :line_number }
9
9
  it { should respond_to :quantity }
10
10
 
11
- let(:parser) { CXML::Parser.new }
12
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
11
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
13
12
  let(:doc) { CXML::Document.new(data) }
14
13
  let(:punch_out_order_message) { doc.message.punch_out_order_message }
15
- let(:builder) { doc.render }
16
14
 
17
15
  describe '#initialize' do
18
- let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
16
+ let(:item_in) { CXML::ItemIn.new(build_item_in) }
19
17
 
20
18
  it 'sets the mandatory attributes' do
21
19
  item_in.quantity.should_not be_nil
@@ -24,11 +22,11 @@ describe CXML::ItemIn do
24
22
 
25
23
  describe '#render' do
26
24
  before(:each) do
27
- punch_out_order_message.add_item(build_item_in(parser))
25
+ punch_out_order_message.add_item(build_item_in)
28
26
  end
29
27
 
30
- let(:output_xml) { builder.to_xml }
31
- let(:output_data) { parser.parse(output_xml) }
28
+ let(:output_xml) { doc.to_xml }
29
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
32
30
  let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
33
31
  let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
34
32
 
data/spec/money_spec.rb CHANGED
@@ -8,12 +8,10 @@ describe CXML::Money do
8
8
  it { should respond_to :alternate_amount }
9
9
  it { should respond_to :amount }
10
10
 
11
- let(:parser) { CXML::Parser.new }
12
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
11
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
13
12
  let(:doc) { CXML::Document.new(data) }
14
13
  let(:punch_out_order_message) { doc.message.punch_out_order_message }
15
- let(:builder) { doc.render }
16
- let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
14
+ let(:item_in) { CXML::ItemIn.new(build_item_in) }
17
15
  let(:item_detail) { item_in.item_detail }
18
16
  let(:money) { item_detail.unit_price.money }
19
17
 
@@ -26,11 +24,11 @@ describe CXML::Money do
26
24
 
27
25
  describe '#render' do
28
26
  before(:each) do
29
- punch_out_order_message.add_item(build_item_in(parser))
27
+ punch_out_order_message.add_item(build_item_in)
30
28
  end
31
29
 
32
- let(:output_xml) { builder.to_xml }
33
- let(:output_data) { parser.parse(output_xml) }
30
+ let(:output_xml) { doc.to_xml }
31
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
34
32
  let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
35
33
  let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
36
34
  let(:item_detail_output_data) { item_in_output_data[:item_detail] }
@@ -5,13 +5,10 @@ require 'spec_helper'
5
5
  describe CXML::PunchOutOrderMessageHeader do
6
6
  it { should respond_to :total }
7
7
  it { should respond_to :operation_allowed }
8
- it { should respond_to :render }
9
8
 
10
- let(:parser) { CXML::Parser.new }
11
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
9
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
12
10
  let(:doc) { CXML::Document.new(data) }
13
11
  let(:punch_out_order_message_header) { doc.message.punch_out_order_message.punch_out_order_message_header }
14
- let(:builder) { doc.render }
15
12
 
16
13
  describe '#initialize' do
17
14
  it 'sets the mandatory attributes' do
@@ -20,8 +17,8 @@ describe CXML::PunchOutOrderMessageHeader do
20
17
  end
21
18
 
22
19
  describe '#render' do
23
- let(:output_xml) { builder.to_xml }
24
- let(:output_data) { parser.parse(output_xml) }
20
+ let(:output_xml) { doc.to_xml }
21
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
25
22
  let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
26
23
  let(:punch_out_order_message_header_output_data) do
27
24
  punch_out_order_message_output_data[:punch_out_order_message_header]
@@ -6,13 +6,10 @@ describe CXML::PunchOutOrderMessage do
6
6
  it { should respond_to :add_item }
7
7
  it { should respond_to :buyer_cookie }
8
8
  it { should respond_to :items_in }
9
- it { should respond_to :render }
10
9
 
11
- let(:parser) { CXML::Parser.new }
12
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
10
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
13
11
  let(:doc) { CXML::Document.new(data) }
14
12
  let(:punch_out_order_message) { doc.message.punch_out_order_message }
15
- let(:builder) { doc.render }
16
13
 
17
14
  describe '#initialize' do
18
15
  it 'sets the mandatory attributes' do
@@ -23,18 +20,18 @@ describe CXML::PunchOutOrderMessage do
23
20
 
24
21
  describe '#add_item' do
25
22
  it 'adds items to the order' do
26
- punch_out_order_message.add_item(build_item_in(parser))
23
+ punch_out_order_message.add_item(build_item_in)
27
24
  punch_out_order_message.items_in.count.should == 1
28
25
  end
29
26
  end
30
27
 
31
28
  describe '#render' do
32
- let(:output_xml) { builder.to_xml }
33
- let(:output_data) { parser.parse(output_xml) }
29
+ let(:output_xml) { doc.to_xml }
30
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
34
31
  let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
35
32
 
36
33
  it 'contains the required nodes' do
37
- punch_out_order_message.add_item(build_item_in(parser))
34
+ punch_out_order_message.add_item(build_item_in)
38
35
  punch_out_order_message_output_data[:punch_out_order_message_header].should_not be_empty
39
36
  punch_out_order_message_output_data[:buyer_cookie].should_not be_empty
40
37
  punch_out_order_message_output_data.should include(:item_in)
@@ -10,9 +10,8 @@ describe CXML::PunchOutSetupRequest do
10
10
  it { should respond_to :extrinsics }
11
11
  it { should respond_to :contact }
12
12
 
13
- let(:parser) { CXML::Parser.new }
14
- let(:data) { parser.parse(fixture('punch_out_setup_request_doc.xml')) }
15
- let(:data_coupa) { parser.parse(fixture('punch_out_setup_request_doc_coupa.xml')) }
13
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_setup_request_doc.xml')).parse }
14
+ let(:data_coupa) { CXML::Parser.new(data: fixture('punch_out_setup_request_doc_coupa.xml')).parse }
16
15
  let(:doc) { CXML::Document.new(data) }
17
16
  let(:doc_coupa) { CXML::Document.new(data_coupa) }
18
17
  let(:request) { doc.request }
@@ -34,7 +33,7 @@ describe CXML::PunchOutSetupRequest do
34
33
  punch_out_setup_request_coupa.extrinsics.first.name.should_not be_nil
35
34
  end
36
35
  it 'sets the shipping attributes when present' do
37
- data = parser.parse(fixture('punch_out_setup_request_doc_with_ship_to.xml'))
36
+ data = CXML::Parser.new(data: fixture('punch_out_setup_request_doc_with_ship_to.xml')).parse
38
37
  doc = CXML::Document.new(data)
39
38
  doc.request.punch_out_setup_request.ship_to.should_not be_nil
40
39
  doc.request.punch_out_setup_request.ship_to.address.name.should_not be_nil
@@ -43,12 +42,10 @@ describe CXML::PunchOutSetupRequest do
43
42
 
44
43
  describe '#render' do
45
44
  it 'contains the required nodes' do
46
- parser = CXML::Parser.new
47
- data = parser.parse(fixture('punch_out_setup_request_doc_with_ship_to.xml'))
45
+ data = CXML::Parser.new(data: fixture('punch_out_setup_request_doc_with_ship_to.xml')).parse
48
46
  doc = CXML::Document.new(data)
49
- builder = doc.render
50
- output_xml = builder.to_xml
51
- output_data = parser.parse(output_xml)
47
+ output_xml = doc.to_xml
48
+ output_data = CXML::Parser.new(data: output_xml).parse
52
49
  output_data[:request][:punch_out_setup_request][:buyer_cookie]
53
50
  .should eq data[:request][:punch_out_setup_request][:buyer_cookie]
54
51
  output_data[:request][:punch_out_setup_request][:browser_form_post]
@@ -3,20 +3,17 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe CXML::OrderRequest do
6
- it { should respond_to :render }
7
6
  it { should respond_to :order_request_header }
8
7
  it { should respond_to :items_out }
9
8
 
10
- let(:parser) { CXML::Parser.new }
11
- let(:data) { parser.parse(fixture('purchase_order_request_200.xml')) }
9
+ let(:data) { CXML::Parser.new(data: fixture('purchase_order_request_200.xml')).parse }
12
10
  let(:doc) { CXML::Document.new(data) }
13
11
  let(:order_request) { doc.request.order_request }
14
- let(:builder) { doc.render }
15
- let(:output_xml) { builder.to_xml }
16
- let(:output_data) { parser.parse(output_xml) }
12
+ let(:output_xml) { doc.to_xml }
13
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
17
14
  let(:order_request_output_data) { output_data[:request][:order_request] }
18
15
 
19
- describe '#render' do
16
+ describe '#to_xml' do
20
17
  it 'contains the required nodes' do
21
18
  order_request_output_data[:order_request_header].should_not be_empty
22
19
  order_request_output_data[:item_out].should be_a Array
data/spec/request_spec.rb CHANGED
@@ -9,24 +9,21 @@ describe CXML::Request do
9
9
 
10
10
  describe '#initialize' do
11
11
  it 'sets punch_out_setup_request attributes' do
12
- parser = CXML::Parser.new
13
- data = parser.parse(fixture('punch_out_setup_request_doc.xml'))
12
+ data = CXML::Parser.new(data: fixture('punch_out_setup_request_doc.xml')).parse
14
13
  doc = CXML::Document.new(data)
15
14
  doc.request.deployment_mode.should_not be_nil
16
15
  doc.request.punch_out_setup_request
17
16
  .should be_an_instance_of CXML::PunchOutSetupRequest
18
17
  end
19
18
  it 'sets purchase_order_request attributes' do
20
- parser = CXML::Parser.new
21
- data = parser.parse(fixture('purchase_order_request_200.xml'))
19
+ data = CXML::Parser.new(data: fixture('purchase_order_request_200.xml')).parse
22
20
  doc = CXML::Document.new(data)
23
21
  doc.request.deployment_mode.should_not be_nil
24
22
  doc.request.order_request
25
23
  .should be_an_instance_of CXML::OrderRequest
26
24
  end
27
25
  it 'sets invoice_detail_request attributes' do
28
- parser = CXML::Parser.new
29
- data = parser.parse(fixture('invoice_taxes_at_line.xml'))
26
+ data = CXML::Parser.new(data: fixture('invoice_taxes_at_line.xml')).parse
30
27
  doc = CXML::Document.new(data)
31
28
  doc.request.deployment_mode.should_not be_nil
32
29
  doc.request.invoice_detail_request
@@ -7,11 +7,9 @@ describe CXML::Response do
7
7
  it { should respond_to :status }
8
8
  it { should respond_to :punch_out_setup_response }
9
9
 
10
- let(:parser) { CXML::Parser.new }
11
- let(:data) { parser.parse(fixture('response_status_200.xml')) }
10
+ let(:data) { CXML::Parser.new(data: fixture('response_status_200.xml')).parse }
12
11
  let(:doc) { CXML::Document.new(data) }
13
12
  let(:response) { doc.response }
14
- let(:builder) { doc.render }
15
13
 
16
14
  describe '#initialize' do
17
15
  it 'sets the mandatory attributes' do
@@ -21,11 +19,11 @@ describe CXML::Response do
21
19
  end
22
20
 
23
21
  describe '#render' do
24
- let(:output_xml) { builder.to_xml }
25
- let(:output_data) { parser.parse(output_xml) }
22
+ let(:output_xml) { doc.to_xml }
23
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
26
24
 
27
25
  context 'when a valid response is rendered' do
28
- let(:data) { parser.parse(fixture('response_status_200.xml')) }
26
+ let(:data) { CXML::Parser.new(data: fixture('response_status_200.xml')).parse }
29
27
 
30
28
  it 'returns xml content' do
31
29
  output_xml.should_not be_nil
@@ -43,7 +41,7 @@ describe CXML::Response do
43
41
  end
44
42
 
45
43
  context 'when a invalid response is rendered' do
46
- let(:data) { parser.parse(fixture('response_status_400.xml')) }
44
+ let(:data) { CXML::Parser.new(data: fixture('response_status_400.xml')).parse }
47
45
 
48
46
  it 'returns xml content' do
49
47
  output_xml.should_not be_nil
data/spec/sender_spec.rb CHANGED
@@ -6,11 +6,9 @@ describe CXML::Sender do
6
6
  it { should respond_to :credential }
7
7
  it { should respond_to :user_agent }
8
8
 
9
- let(:parser) { CXML::Parser.new }
10
- let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
9
+ let(:data) { CXML::Parser.new(data: fixture('punch_out_order_message_doc.xml')).parse }
11
10
  let(:doc) { CXML::Document.new(data) }
12
11
  let(:sender) { doc.header.sender }
13
- let(:builder) { doc.render }
14
12
 
15
13
  describe '#initialize' do
16
14
  it 'sets the mandatory attributes' do
@@ -20,8 +18,8 @@ describe CXML::Sender do
20
18
  end
21
19
 
22
20
  describe '#render' do
23
- let(:output_xml) { builder.to_xml }
24
- let(:output_data) { parser.parse(output_xml) }
21
+ let(:output_xml) { doc.to_xml }
22
+ let(:output_data) { CXML::Parser.new(data: output_xml).parse }
25
23
  let(:sender_output_data) { output_data[:header][:sender] }
26
24
 
27
25
  it 'contains the required nodes' do
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  $LOAD_PATH.unshift File.expand_path('..', __dir__)
4
4
 
5
- require 'cxml'
5
+ require 'cxml-ruby'
6
6
  require 'pry'
7
7
 
8
8
  Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- def build_item_in(parser)
4
- parser.parse(fixture('item_in.xml'))
3
+ def build_item_in
4
+ CXML::Parser.new(data: fixture('item_in.xml')).parse
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cxml-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Beckman
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-04-16 00:00:00.000000000 Z
12
+ date: 2020-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ox
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.13'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.13'
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: pry
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -67,34 +81,6 @@ dependencies:
67
81
  - - "~>"
68
82
  - !ruby/object:Gem::Version
69
83
  version: '0.81'
70
- - !ruby/object:Gem::Dependency
71
- name: nokogiri
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: '1.10'
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: '1.10'
84
- - !ruby/object:Gem::Dependency
85
- name: xml-simple
86
- requirement: !ruby/object:Gem::Requirement
87
- requirements:
88
- - - "~>"
89
- - !ruby/object:Gem::Version
90
- version: '1.1'
91
- type: :runtime
92
- prerelease: false
93
- version_requirements: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - "~>"
96
- - !ruby/object:Gem::Version
97
- version: '1.1'
98
84
  description: Ruby library to parse/generate documents with the cXML protocol
99
85
  email:
100
86
  - josh@officeluv.com
@@ -107,6 +93,7 @@ files:
107
93
  - ".gitignore"
108
94
  - ".rspec"
109
95
  - ".rubocop.yml"
96
+ - CHANGELOG.md
110
97
  - Gemfile
111
98
  - LICENSE
112
99
  - README.md