faraday-xml 0.2.0 → 0.2.1

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: fd31db052ce943d7b8f60e8396449da83c134b70f3fe59f52e105edf1105f20d
4
- data.tar.gz: 80348c82aa221ff79dbb488bf11b7df6adecbb877887165899a6d057197bc12d
3
+ metadata.gz: '04786b19e7983cba95b256a974cc0624c69e693ddb64b40e7d7a40753691d779'
4
+ data.tar.gz: 0207e10a74a4130183379db1c99470c63b332b7c489103fb4d0efb47685dc0f7
5
5
  SHA512:
6
- metadata.gz: 33acfe362ff340f1e39f40a1610c77b98ccd89d7b0e107625fd2d7fc4ef08ed52c34166a3903cdb64514f5861a7420d181495355572d772be0b697870fb5986f
7
- data.tar.gz: 347b1ab466889029e44fb4cba75d5845bcf959544154d4fc8cb653a2988397f8a7edb19e4e7115d77594e83962ac07a017c0ab15f8fba76339fc3124b6676b23
6
+ metadata.gz: ee0a896484ea4884d05f192df27800017fe255dfe19357dcaf1d5799e36e8e436eeeacf4a7c9a7bc734b4208e7a93e57572fc2913f91703ba93846f1d590456c
7
+ data.tar.gz: fe11c2aacb78691b099b295424e749572ebdb67881cec6abbf0546dbdaf598eb8fd1397a83e83ce029cac880b3e20001005a8044f84fd1243e279acaf1ed9f70
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased](https://github.com/gemhome/faraday-xml/compare/v0.2.0...main)
3
+ ## [Unreleased](https://github.com/gemhome/faraday-xml/compare/v0.2.1...main)
4
+
5
+ ## [0.2.1](https://github.com/gemhome/faraday-xml/compare/v0.2.0...v0.2.1)
6
+
7
+ * feat: extract Faraday::XML::Encoder
8
+ * feat: extract Faraday::XML::Parser
4
9
 
5
10
  ## [0.2.0](https://github.com/gemhome/faraday-xml/compare/v0.1.0...v0.2.0)
6
11
 
data/README.md CHANGED
@@ -44,6 +44,21 @@ conn = Faraday.new do |builder|
44
44
  end
45
45
  ```
46
46
 
47
+ There is also basic support for first class XML encoding/parsing
48
+
49
+ ```ruby
50
+ require 'faraday'
51
+ require 'faraday/xml'
52
+ hash = { 'user' => { 'name' => 'Erik Michaels-Ober', 'screen_name' => 'sferik' } }
53
+ xml = '<user><name>Erik Michaels-Ober</name><screen_name>sferik</screen_name></user>'
54
+
55
+ encoder = Faraday::XML::Encoder.build!(indent: 0)
56
+ encoder.encode(hash) == xml
57
+
58
+ parser = Faraday::XML::Parser.build!
59
+ parser.parse(xml) == hash
60
+ ```
61
+
47
62
  ## Development
48
63
 
49
64
  After checking out the repo, run `bin/setup` to install dependencies.
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module XML
5
+ # Utility fucntion that encodes input as XML.
6
+ #
7
+ # Doesn't try to encode input which already are in string form.
8
+ class Encoder
9
+ def self.build!(encoder_options = {})
10
+ encoder = new(encoder_options)
11
+ encoder.encoder!
12
+ encoder
13
+ end
14
+
15
+ def initialize(encoder_options = {})
16
+ @encoder_options = encoder_options || {}
17
+ end
18
+
19
+ def encode(data)
20
+ encoder.call(data)
21
+ end
22
+
23
+ def encoder
24
+ @encoder ||= nil
25
+ if @encoder.nil?
26
+ @encoder = set_encoder
27
+ @encoder && test_encoder
28
+ end
29
+ @encoder or raise 'Missing dependencies Builder'
30
+ end
31
+ alias encoder! encoder
32
+
33
+ def test_encoder
34
+ encode({ success: true })
35
+ end
36
+
37
+ def set_encoder
38
+ @encoder ||= # rubocop:disable Naming/MemoizedInstanceVariableName
39
+ begin
40
+ require 'builder'
41
+ lambda do |parameter_hash|
42
+ parameters_as_xml(parameter_hash)
43
+ end
44
+ rescue LoadError # rubocop:disable Lint/SuppressedException
45
+ end
46
+ end
47
+
48
+ def parameters_as_xml(parameter_hash) # rubocop:disable Metrics/MethodLength
49
+ xml_markup = build_xml_markup(skip_instruct: true)
50
+ parameter_hash.each_pair do |key, value|
51
+ key = key.to_s
52
+ if _parameter_as_xml?(value)
53
+ xml_markup.tag!(key) do
54
+ xml = _parameter_as_xml(value)
55
+ xml_markup << xml
56
+ end
57
+ else
58
+ xml_markup.tag!(key, _parameter_as_xml(value))
59
+ end
60
+ end
61
+ xml_markup.target!
62
+ end
63
+
64
+ def _parameter_as_xml?(value)
65
+ case value
66
+ when Hash, Array then true
67
+ else false
68
+ end
69
+ end
70
+
71
+ def _parameter_as_xml(value)
72
+ case value
73
+ when Hash
74
+ parameters_as_xml(value) # recursive case
75
+ when Array
76
+ _parameter_as_list_xml(value) # recursive case
77
+ else
78
+ value.to_s.encode(xml: :text) # end case
79
+ end
80
+ end
81
+
82
+ def _parameter_as_list_xml(array_of_hashes)
83
+ xml_markup = build_xml_markup(skip_instruct: true)
84
+ array_of_hashes.each do |value|
85
+ xml_markup << parameters_as_xml(value) # recursive case
86
+ end
87
+ xml_markup.target!
88
+ end
89
+
90
+ def build_xml_markup(**options)
91
+ # https://github.com/rails/rails/blob/86fd8d0143b1a0578b359f4b86fea94c718139ae/activesupport/lib/active_support/builder.rb
92
+ # https://github.com/rails/rails/blob/86fd8d0143b1a0578b359f4b86fea94c718139ae/activesupport/lib/active_support/core_ext/hash/conversions.rb
93
+ require 'builder'
94
+ options.merge!(@encoder_options)
95
+ options[:indent] = 2 unless options.key?(:indent)
96
+ xml_markup = ::Builder::XmlMarkup.new(**options)
97
+ if !options.delete(:skip_instruct) # rubocop:disable Style/NegatedIf
98
+ xml_markup.instruct! :xml, version: '1.0', encoding: 'UTF-8'
99
+ end
100
+ xml_markup
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module XML
5
+ # Utility fucntion that parses XML input.
6
+ class Parser
7
+ def self.build!
8
+ parser = new
9
+ parser.parser!
10
+ parser
11
+ end
12
+
13
+ def parse(xml, parser_options = {})
14
+ parser.call(xml, parser_options)
15
+ end
16
+
17
+ def parser
18
+ @parser ||= nil
19
+ if @parser.nil?
20
+ @parser = set_parser
21
+ @parser && test_parser
22
+ end
23
+ @parser or raise 'Missing dependencies ActiveSupport::XmlMini or MultiXml'
24
+ end
25
+ alias parser! parser
26
+
27
+ def test_parser
28
+ parse('<success>true</success>')
29
+ end
30
+
31
+ def set_parser # rubocop:disable Metrics/MethodLength
32
+ @parser ||=
33
+ begin
34
+ require 'multi_xml'
35
+ lambda do |xml, options|
36
+ ::MultiXml.parse(xml, options)
37
+ end
38
+ rescue LoadError # rubocop:disable Lint/SuppressedException
39
+ end
40
+ @parser ||= # rubocop:disable Naming/MemoizedInstanceVariableName
41
+ begin
42
+ require 'active_support'
43
+ require 'active_support/xml_mini'
44
+ require 'active_support/core_ext/hash/conversions'
45
+ require 'active_support/core_ext/array/conversions'
46
+ lambda do |xml, options|
47
+ disallowed_types = options[:disallowed_types]
48
+ Hash.from_xml(xml, disallowed_types)
49
+ end
50
+ rescue LoadError # rubocop:disable Lint/SuppressedException
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'encoder'
4
+
3
5
  module Faraday
4
6
  module XML
5
7
  # Request middleware that encodes the body as XML.
@@ -9,7 +11,7 @@ module Faraday
9
11
  # to XML MIME-type.
10
12
  #
11
13
  # Doesn't try to encode bodies that already are in string form.
12
- class Request < Middleware # rubocop:disable Metrics/ClassLength
14
+ class Request < Middleware
13
15
  MIME_TYPE = 'application/xml'
14
16
  MIME_TYPE_REGEX = %r{^application/(vnd\..+\+)?xml$}.freeze
15
17
 
@@ -20,40 +22,16 @@ module Faraday
20
22
 
21
23
  def on_request(env)
22
24
  match_content_type(env) do |data|
23
- env[:body] = encode(data)
25
+ env[:body] = encoder.encode(data)
24
26
  end
25
27
  end
26
28
 
27
29
  def encoder
28
- @encoder ||= nil
29
- if @encoder.nil?
30
- @encoder = set_encoder
31
- @encoder && test_encoder
32
- end
33
- @encoder or raise 'Missing dependencies Builder'
30
+ @encoder ||= Encoder.build!(@encoder_options)
34
31
  end
35
32
 
36
33
  private
37
34
 
38
- def encode(data)
39
- encoder.call(data)
40
- end
41
-
42
- def test_encoder
43
- encode({ success: true })
44
- end
45
-
46
- def set_encoder
47
- @encoder ||= # rubocop:disable Naming/MemoizedInstanceVariableName
48
- begin
49
- require 'builder'
50
- lambda do |parameter_hash|
51
- parameters_as_xml(parameter_hash)
52
- end
53
- rescue LoadError # rubocop:disable Lint/SuppressedException
54
- end
55
- end
56
-
57
35
  def match_content_type(env)
58
36
  return unless process_request?(env)
59
37
 
@@ -75,61 +53,6 @@ module Faraday
75
53
  type = type.split(';', 2).first if type.index(';')
76
54
  type
77
55
  end
78
-
79
- def parameters_as_xml(parameter_hash) # rubocop:disable Metrics/MethodLength
80
- xml_markup = build_xml_markup(skip_instruct: true)
81
- parameter_hash.each_pair do |key, value|
82
- key = key.to_s
83
- if _parameter_as_xml?(value)
84
- xml_markup.tag!(key) do
85
- xml = _parameter_as_xml(value)
86
- xml_markup << xml
87
- end
88
- else
89
- xml_markup.tag!(key, _parameter_as_xml(value))
90
- end
91
- end
92
- xml_markup.target!
93
- end
94
-
95
- def _parameter_as_xml?(value)
96
- case value
97
- when Hash, Array then true
98
- else false
99
- end
100
- end
101
-
102
- def _parameter_as_xml(value)
103
- case value
104
- when Hash
105
- parameters_as_xml(value) # recursive case
106
- when Array
107
- _parameter_as_list_xml(value) # recursive case
108
- else
109
- value.to_s.encode(xml: :text) # end case
110
- end
111
- end
112
-
113
- def _parameter_as_list_xml(array_of_hashes)
114
- xml_markup = build_xml_markup(skip_instruct: true)
115
- array_of_hashes.each do |value|
116
- xml_markup << parameters_as_xml(value) # recursive case
117
- end
118
- xml_markup.target!
119
- end
120
-
121
- def build_xml_markup(**options)
122
- # https://github.com/rails/rails/blob/86fd8d0143b1a0578b359f4b86fea94c718139ae/activesupport/lib/active_support/builder.rb
123
- # https://github.com/rails/rails/blob/86fd8d0143b1a0578b359f4b86fea94c718139ae/activesupport/lib/active_support/core_ext/hash/conversions.rb
124
- require 'builder'
125
- options.merge!(@encoder_options)
126
- options[:indent] = 2 unless options.key?(:indent)
127
- xml_markup = ::Builder::XmlMarkup.new(**options)
128
- if !options.delete(:skip_instruct) # rubocop:disable Style/NegatedIf
129
- xml_markup.instruct! :xml, version: '1.0', encoding: 'UTF-8'
130
- end
131
- xml_markup
132
- end
133
56
  end
134
57
  end
135
58
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'parser'
4
+
3
5
  module Faraday
4
6
  module XML
5
7
  # Parse response bodies as XML
@@ -17,12 +19,7 @@ module Faraday
17
19
  end
18
20
 
19
21
  def parser
20
- @parser ||= nil
21
- if @parser.nil?
22
- @parser = set_parser
23
- @parser && test_parser
24
- end
25
- @parser or raise 'Missing dependencies ActiveSupport::XmlMini or MultiXml'
22
+ @parser ||= Parser.build!
26
23
  end
27
24
 
28
25
  private
@@ -37,34 +34,7 @@ module Faraday
37
34
  def parse(body)
38
35
  return nil if body.strip.empty?
39
36
 
40
- parser.call(body, @parser_options || {})
41
- end
42
-
43
- def test_parser
44
- parse('<success>true</success>')
45
- end
46
-
47
- def set_parser # rubocop:disable Metrics/MethodLength
48
- @parser ||=
49
- begin
50
- require 'multi_xml'
51
- lambda do |xml, options|
52
- ::MultiXml.parse(xml, options)
53
- end
54
- rescue LoadError # rubocop:disable Lint/SuppressedException
55
- end
56
- @parser ||= # rubocop:disable Naming/MemoizedInstanceVariableName
57
- begin
58
- require 'active_support'
59
- require 'active_support/xml_mini'
60
- require 'active_support/core_ext/hash/conversions'
61
- require 'active_support/core_ext/array/conversions'
62
- lambda do |xml, options|
63
- disallowed_types = options[:disallowed_types]
64
- Hash.from_xml(xml, disallowed_types)
65
- end
66
- rescue LoadError # rubocop:disable Lint/SuppressedException
67
- end
37
+ parser.parse(body, @parser_options || {})
68
38
  end
69
39
 
70
40
  def parse_response?(env)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Faraday
4
4
  module XML
5
- VERSION = '0.2.0'
5
+ VERSION = '0.2.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday-xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Fleischer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-23 00:00:00.000000000 Z
11
+ date: 2023-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -155,6 +155,8 @@ files:
155
155
  - LICENSE.md
156
156
  - README.md
157
157
  - lib/faraday/xml.rb
158
+ - lib/faraday/xml/encoder.rb
159
+ - lib/faraday/xml/parser.rb
158
160
  - lib/faraday/xml/request.rb
159
161
  - lib/faraday/xml/response.rb
160
162
  - lib/faraday/xml/version.rb
@@ -163,8 +165,8 @@ licenses:
163
165
  - MIT
164
166
  metadata:
165
167
  bug_tracker_uri: https://github.com/gemhome/faraday-xml/issues
166
- changelog_uri: https://github.com/gemhome/faraday-xml/blob/v0.2.0/CHANGELOG.md
167
- documentation_uri: http://www.rubydoc.info/gems/faraday-xml/0.2.0
168
+ changelog_uri: https://github.com/gemhome/faraday-xml/blob/v0.2.1/CHANGELOG.md
169
+ documentation_uri: http://www.rubydoc.info/gems/faraday-xml/0.2.1
168
170
  homepage_uri: https://github.com/gemhome/faraday-xml
169
171
  rubygems_mfa_required: 'true'
170
172
  source_code_uri: https://github.com/gemhome/faraday-xml