skn_utils 3.3.12 → 3.4.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 +4 -4
- data/README.md +7 -2
- data/lib/skn_utils/converters/hash_to_xml.rb +98 -0
- data/lib/skn_utils/exploring/action_service.rb +1 -1
- data/lib/skn_utils/version.rb +2 -2
- data/lib/skn_utils.rb +4 -0
- data/skn_utils.gemspec +2 -0
- data/spec/lib/skn_utils/converters/hash_to_xml_spec.rb +120 -0
- data/spec/spec_helper.rb +0 -1
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d855808b255a82843fa3fe92df17e71473f2f61b
|
4
|
+
data.tar.gz: 6cad163a2d5269b36d874c8e524bcf74f517f1c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bae4958839f86632dbdaf840120e755e668719f3d0f49d8a25fa4ed729c25b2296c25d639fbf0f4c81f5403b0cf423a6421d39d448f65b8bd90c0be8da1f3ea
|
7
|
+
data.tar.gz: 7ac67cbc92251445e2cacb367d01658395d92e6d5ab057a15a1242140cd1c93bdbdb5ca83f29370dd341433298b6982253b8e70ab11be13a302796cee3afbbef
|
data/README.md
CHANGED
@@ -16,6 +16,9 @@ Ruby Gem containing a Ruby PORO (Plain Old Ruby Object) that can be instantiated
|
|
16
16
|
|
17
17
|
|
18
18
|
## New Features
|
19
|
+
09/2017 V3.4.0
|
20
|
+
Added HashToXml class which converts complex/simple hashes into XML. pre-req's Nokogiri 1.8.0 or higher, unless Rails present, then uses version included with rails.
|
21
|
+
|
19
22
|
08/2017 V3.3.0
|
20
23
|
Added Linked List classes which implement Single, Double, and Circular linked lists patterns. LinkedLists are implemented
|
21
24
|
with method results returning node values or the nodes themselves.
|
@@ -55,12 +58,14 @@ Ruby Gem containing a Ruby PORO (Plain Old Ruby Object) that can be instantiated
|
|
55
58
|
## Public Components
|
56
59
|
SknUtils::NestedResult # >= V 3.0.0 Primary Key/Value Container with Dot/Hash notiation support.
|
57
60
|
SknSettings # Multi-level application Configuration class, Key/Value Container with Dot/Hash notiation support.
|
58
|
-
SknUtils::Configurable # Basic one-level configuration settings module for Applications and or Gems
|
59
|
-
|
60
61
|
SknHash # Wrapper for name only, WITHOUT SknUtils namespace, inherits from SknUtils::NestedResult
|
61
62
|
SknUtils::ResultBean # Wrapper for name only, inherits from SknUtils::NestedResult
|
62
63
|
SknUtils::PageControls # Wrapper for name only, inherits from SknUtils::NestedResult
|
63
64
|
|
65
|
+
SknUtils::Configurable # Basic one-level configuration settings module for Applications and or Gems
|
66
|
+
SknUtils::Converters::HashToXml # #call(hash) to convert Ruby complex hashes into XML
|
67
|
+
|
68
|
+
|
64
69
|
SknUtils::List::LinkedList # List with forward (#next) navigation, and tail/open
|
65
70
|
SknUtils::List::DoublyLinkedList # List with forward (#next) and backward (#prev) navigation, and head/tail open
|
66
71
|
SknUtils::List::CircularLinkedList # List with forward (#next) and backward (#prev) navigation, and head/tail wrapping
|
@@ -0,0 +1,98 @@
|
|
1
|
+
## lib/skn_utils/converters/hash_to_xml.rb
|
2
|
+
#
|
3
|
+
# Converts Simple Hash to XML, or a Complex nested hash to XML
|
4
|
+
# Ref: https://stackoverflow.com/questions/11933451/converting-nested-hash-into-xml-using-nokogiri
|
5
|
+
#
|
6
|
+
# Input Format:
|
7
|
+
# {
|
8
|
+
# someKey: someValue,
|
9
|
+
# list: {item: [1,2,3]},
|
10
|
+
# listings: {
|
11
|
+
# uri: 'topic/content/topic_value',
|
12
|
+
# '@attributes' => {secured: true}
|
13
|
+
# }
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
# - produces:
|
17
|
+
# <?xml version="1.0"?>
|
18
|
+
# <root>
|
19
|
+
# <one>1</one>
|
20
|
+
# <two>2</two>
|
21
|
+
# <list>
|
22
|
+
# <item>1</item>
|
23
|
+
# <item>2</item>
|
24
|
+
# <item>3</item>
|
25
|
+
# </list>
|
26
|
+
# <listings secured="true">
|
27
|
+
# <uri>topic/content/topic_value</uri>
|
28
|
+
# </listings>
|
29
|
+
# </basic>
|
30
|
+
##
|
31
|
+
# xml_string = SknUtils::Converters::HashToXml.call(hash)
|
32
|
+
##
|
33
|
+
module SknUtils
|
34
|
+
module Converters
|
35
|
+
|
36
|
+
class HashToXml
|
37
|
+
|
38
|
+
def initialize(*args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.call(*vargs_with_at_least_one_hash, &block)
|
42
|
+
new().call(*vargs_with_at_least_one_hash, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def call(*vargs, &block)
|
46
|
+
return nil if vargs.size == 0
|
47
|
+
hash = generate_xml(*vargs )
|
48
|
+
yield hash if block_given?
|
49
|
+
hash
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
##
|
55
|
+
# generate xml from a hash of hashes or array of hashes
|
56
|
+
def generate_xml(data, parent = false, opt = {})
|
57
|
+
return if data.to_s.empty?
|
58
|
+
return unless data.is_a?(Hash)
|
59
|
+
|
60
|
+
unless parent
|
61
|
+
# assume that if the hash has a single key that it should be the root
|
62
|
+
root, data = (data.length == 1) ? [data.keys.first.to_s , data] : ["root", data]
|
63
|
+
builder = ::Nokogiri::XML::Builder.new(opt.merge(:encoding => 'UTF-8')) do |xml|
|
64
|
+
xml.send(root) {
|
65
|
+
generate_xml(data, xml)
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
return builder.to_xml
|
70
|
+
end
|
71
|
+
|
72
|
+
data.each do |label, value|
|
73
|
+
if value.is_a?(Hash)
|
74
|
+
attrs = value.fetch('@attributes', {})
|
75
|
+
# also passing 'text' as a key makes nokogiri do the same thing
|
76
|
+
text = value.fetch('@text', '')
|
77
|
+
parent.send(label, attrs, text) {
|
78
|
+
value.delete('@attributes')
|
79
|
+
value.delete('@text')
|
80
|
+
generate_xml(value, parent)
|
81
|
+
}
|
82
|
+
|
83
|
+
elsif value.is_a?(Array)
|
84
|
+
value.each do |el|
|
85
|
+
# lets trick the above into firing so we do not need to rewrite the checks
|
86
|
+
el = {label => el}
|
87
|
+
generate_xml(el, parent)
|
88
|
+
end
|
89
|
+
|
90
|
+
else
|
91
|
+
parent.send(label, value)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end # end method
|
95
|
+
|
96
|
+
end # end class
|
97
|
+
end
|
98
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
## lib/skn_utils/action_service.rb
|
2
2
|
#
|
3
|
-
#
|
3
|
+
# Exploratory Action/Service Class
|
4
4
|
# Ref: https://blog.lelonek.me/what-service-objects-are-not-7abef8aa2f99#.p64vudxq4
|
5
5
|
# http://sporto.github.io/blog/2012/11/15/a-pattern-for-service-objects-in-rails/
|
6
6
|
#
|
data/lib/skn_utils/version.rb
CHANGED
data/lib/skn_utils.rb
CHANGED
@@ -6,6 +6,7 @@ require 'date'
|
|
6
6
|
require 'time'
|
7
7
|
unless defined?(Rails)
|
8
8
|
require 'deep_merge'
|
9
|
+
require 'nokogiri'
|
9
10
|
end
|
10
11
|
require 'skn_utils/nested_result'
|
11
12
|
require 'skn_utils/result_bean'
|
@@ -23,6 +24,9 @@ require 'skn_utils/lists/circular_linked_list'
|
|
23
24
|
# require 'skn_utils/exploring/commander'
|
24
25
|
# require 'skn_utils/exploring/action_service'
|
25
26
|
# require 'skn_utils/exploring/configuration'
|
27
|
+
if defined?(::Nokogiri)
|
28
|
+
require 'skn_utils/converters/hash_to_xml'
|
29
|
+
end
|
26
30
|
require 'skn_hash'
|
27
31
|
require 'skn_settings'
|
28
32
|
|
data/skn_utils.gemspec
CHANGED
@@ -0,0 +1,120 @@
|
|
1
|
+
##
|
2
|
+
# spec/lib/skn_utils/converters/hash_to_xml_spec.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
describe SknUtils::Converters::HashToXml, "Hash to XML Converter Utility " do
|
6
|
+
|
7
|
+
context "Initializers Feature. " do
|
8
|
+
|
9
|
+
it "#new can be called without params or block without error. " do
|
10
|
+
expect( described_class.new()).to be_a described_class
|
11
|
+
end
|
12
|
+
|
13
|
+
it "#call can be called without params or block without error. " do
|
14
|
+
expect( described_class.call()).to be nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "#call called with params returns xml string as expected. " do
|
18
|
+
string = described_class.call({
|
19
|
+
one: 1,
|
20
|
+
two: 2,
|
21
|
+
list: {item: [1,2,3]},
|
22
|
+
listings: {item: [1,2,3]}
|
23
|
+
})
|
24
|
+
puts __method__, string
|
25
|
+
expect(string).to be_a String
|
26
|
+
end
|
27
|
+
|
28
|
+
it "#call called with params and block yields xml string as expected. " do
|
29
|
+
described_class.call({
|
30
|
+
one: 1,
|
31
|
+
two: 2,
|
32
|
+
list: {item: [1,2,3]},
|
33
|
+
listings: {item: [1,2,3]}
|
34
|
+
}) do |string|
|
35
|
+
puts __method__, string
|
36
|
+
expect(string).to be_a String
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
context "Handles Complex Hashes. " do
|
43
|
+
let(:array_of_hashes) {
|
44
|
+
{'resource' => [
|
45
|
+
{ 'name' => 'category1',
|
46
|
+
'subCategory' => [
|
47
|
+
{ 'name' => 'subCategory1',
|
48
|
+
'product' => [
|
49
|
+
{ 'name' => 'productName1',
|
50
|
+
'desc' => 'desc1' },
|
51
|
+
{ 'name' => 'productName2',
|
52
|
+
'desc' => 'desc2' } ]
|
53
|
+
} ]
|
54
|
+
},
|
55
|
+
{ 'name' => 'category2',
|
56
|
+
'subCategory' => [
|
57
|
+
{ 'name' => 'subCategory2.1',
|
58
|
+
'product' => [
|
59
|
+
{ 'name' => 'productName2.1.1',
|
60
|
+
'desc' => 'desc1' },
|
61
|
+
{ 'name' => 'productName2.1.2',
|
62
|
+
'desc' => 'desc2' } ]
|
63
|
+
} ]
|
64
|
+
}
|
65
|
+
]
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
let(:xml_aware_hash) {
|
70
|
+
{'xmlAwareHash' =>
|
71
|
+
{
|
72
|
+
'num' => 99,
|
73
|
+
'title' => 'something witty',
|
74
|
+
'nested' => {
|
75
|
+
'total' => [99, 98],
|
76
|
+
'@attributes' => {'foo' => 'bar', 'hello' => 'world'}
|
77
|
+
},
|
78
|
+
'anothernest' => {
|
79
|
+
'@attributes' => {'foo' => 'bar', 'hello' => 'world'},
|
80
|
+
'date' => [
|
81
|
+
'today',
|
82
|
+
{'day' => 23, 'month' => 'Dec',
|
83
|
+
'year' => {'y' => 1999, 'c' => 21},
|
84
|
+
'@attributes' => {'foo' => 'blhjkldsaf'}
|
85
|
+
}
|
86
|
+
]
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
it "#call(nested_hash) return an xml string as expected." do
|
93
|
+
string = described_class.call({
|
94
|
+
one: 1,
|
95
|
+
two: 2,
|
96
|
+
list: {item: [1,2,3]},
|
97
|
+
listings: {
|
98
|
+
uri: 'topic/content/topic_value',
|
99
|
+
'@attributes' => {secured: true}}
|
100
|
+
})
|
101
|
+
puts __method__, string
|
102
|
+
expect( string ).to be_a String
|
103
|
+
end
|
104
|
+
|
105
|
+
it "#call(array_of_hashes) return an xml string as expected." do
|
106
|
+
string = described_class.call(array_of_hashes, false)
|
107
|
+
puts __method__, string
|
108
|
+
expect( string ).to be_a String
|
109
|
+
end
|
110
|
+
|
111
|
+
it "#call(xml_aware_hash) return an xml string as expected." do
|
112
|
+
string = described_class.call(xml_aware_hash)
|
113
|
+
puts __method__, string
|
114
|
+
expect( string ).to be_a String
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -16,7 +16,6 @@ require 'skn_utils/exploring/commander'
|
|
16
16
|
require 'skn_utils/exploring/action_service'
|
17
17
|
require 'skn_utils/exploring/configuration'
|
18
18
|
require 'skn_utils/business_services/year_month'
|
19
|
-
|
20
19
|
require 'rspec'
|
21
20
|
|
22
21
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skn_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Scott Jr
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_merge
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: nokogiri
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.8.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.8.0
|
111
125
|
description: "The intent of the NestedResult class is to be a container for data values
|
112
126
|
composed of key/value pairs, \nwith easy access to its contents, and on-demand transformation
|
113
127
|
back to the hash (#to_hash).\n\nReview the RSpec tests, and or review the README
|
@@ -136,6 +150,7 @@ files:
|
|
136
150
|
- lib/skn_utils.rb
|
137
151
|
- lib/skn_utils/business_services/year_month.rb
|
138
152
|
- lib/skn_utils/configurable.rb
|
153
|
+
- lib/skn_utils/converters/hash_to_xml.rb
|
139
154
|
- lib/skn_utils/exploring/action_service.rb
|
140
155
|
- lib/skn_utils/exploring/commander.rb
|
141
156
|
- lib/skn_utils/exploring/configuration.rb
|
@@ -158,6 +173,7 @@ files:
|
|
158
173
|
- spec/lib/skn_settings_spec.rb
|
159
174
|
- spec/lib/skn_utils/business_services/year_month_spec.rb
|
160
175
|
- spec/lib/skn_utils/configurable_spec.rb
|
176
|
+
- spec/lib/skn_utils/converters/hash_to_xml_spec.rb
|
161
177
|
- spec/lib/skn_utils/exploring/action_service_spec.rb
|
162
178
|
- spec/lib/skn_utils/exploring/commander_spec.rb
|
163
179
|
- spec/lib/skn_utils/exploring/configuration_spec.rb
|
@@ -206,6 +222,7 @@ test_files:
|
|
206
222
|
- spec/lib/skn_settings_spec.rb
|
207
223
|
- spec/lib/skn_utils/business_services/year_month_spec.rb
|
208
224
|
- spec/lib/skn_utils/configurable_spec.rb
|
225
|
+
- spec/lib/skn_utils/converters/hash_to_xml_spec.rb
|
209
226
|
- spec/lib/skn_utils/exploring/action_service_spec.rb
|
210
227
|
- spec/lib/skn_utils/exploring/commander_spec.rb
|
211
228
|
- spec/lib/skn_utils/exploring/configuration_spec.rb
|