extreml 0.1.1 → 2.0.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/lib/extreml.rb +86 -37
- data/lib/extreml/type_element.rb +116 -5
- data/lib/extreml/xml_header.rb +65 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8ce77cbbe37518250fd8c88a7ac26541804fd4d6d01fdd647e7d9b839638966
|
4
|
+
data.tar.gz: 3fd36d023fd14a44ed7010e23c2335ee1eb3c3fe5109feb5f381d0c89af57f98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 191d4e328f54409ab5a0562cfab9b9f10180af318b8495bcc9e1e706bcf5fe85b8f50892e25be5fed24bb44c690e0ac858e8d3f5d8d7ff82f9e55b5da629d12f
|
7
|
+
data.tar.gz: 29982ef3e554190b4fc0cd1b48840740ab2264fda7130306704f4e1a9faab98dd212d7fedda9ba8bba018b62260b777c2d2519600f48b5985cdab09d7c2c12d0
|
data/lib/extreml.rb
CHANGED
@@ -20,10 +20,6 @@
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
|
-
require 'extreml/type_element'
|
24
|
-
|
25
|
-
class XmlHeader
|
26
|
-
end
|
27
23
|
|
28
24
|
class Extreml
|
29
25
|
|
@@ -31,60 +27,108 @@ class Extreml
|
|
31
27
|
|
32
28
|
# Warnings flag
|
33
29
|
@warnings = warnings
|
34
|
-
@header = xml_header
|
30
|
+
@header = XmlHeader.new xml_header
|
35
31
|
|
36
32
|
if xml_file.nil?
|
37
|
-
|
38
|
-
elsif !File.file? xml_file
|
39
|
-
raise "Error: file #{xml_file} not found."
|
33
|
+
@document = Array.new
|
40
34
|
else
|
35
|
+
if !File.file? xml_file
|
36
|
+
raise "Error: file #{xml_file} not found."
|
37
|
+
else
|
41
38
|
|
42
|
-
|
43
|
-
|
39
|
+
# Read file
|
40
|
+
xml = File.read xml_file
|
44
41
|
|
45
|
-
|
42
|
+
@body = Hash.new
|
46
43
|
|
47
|
-
|
48
|
-
|
44
|
+
# Get xml header informations
|
45
|
+
header = xml[/^\<\?xml (.*)\?\>/]
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
else
|
56
|
-
h = header.scan /([\w\?\<]*)=["|']([^'"]*)["|']/
|
57
|
-
|
58
|
-
@xml_header = XmlHeader.new
|
59
|
-
h.each do |param|
|
60
|
-
@xml_header.instance_eval do
|
61
|
-
define_singleton_method param[0].to_sym do
|
62
|
-
return param[1]
|
63
|
-
end
|
47
|
+
if header.nil?
|
48
|
+
puts "Warning: #{xml_file}: xml header missing." if @warnings
|
49
|
+
define_singleton_method :header do
|
50
|
+
return nil
|
64
51
|
end
|
65
|
-
|
52
|
+
else
|
53
|
+
h = header.scan /([\w\?\<]*)=["|']([^'"]*)["|']/
|
66
54
|
|
67
|
-
|
68
|
-
|
55
|
+
@xml_header = XmlHeader.new header
|
56
|
+
|
57
|
+
define_singleton_method :header do
|
58
|
+
return @xml_header
|
59
|
+
end
|
69
60
|
end
|
61
|
+
|
70
62
|
end
|
71
63
|
|
64
|
+
# Read document
|
65
|
+
doc = xml.match /(?:\<\?xml .*?(?: ?\?\>))?[\t\n\r\f ]*(.*)/m
|
66
|
+
@document = unpack doc[1]
|
67
|
+
|
72
68
|
end
|
73
69
|
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns the document in an Hash form
|
73
|
+
def to_hash
|
74
|
+
return self.document.to_hash
|
75
|
+
end
|
77
76
|
|
77
|
+
def to_json
|
78
|
+
return self.document.to_json
|
79
|
+
end
|
80
|
+
|
81
|
+
# Retrurns the document in XML format
|
82
|
+
def to_xml
|
83
|
+
if @xml_header.nil?
|
84
|
+
xml = ''
|
85
|
+
else
|
86
|
+
xml = @xml_header.to_xml + "\n"
|
87
|
+
end
|
88
|
+
self.document.__types.each do |t|
|
89
|
+
xml += self.document.send(t).to_xml
|
90
|
+
end
|
91
|
+
return xml
|
78
92
|
end
|
79
93
|
|
80
94
|
# Expose the entire document
|
81
95
|
def document
|
82
|
-
return TypeElement.new({name: 'document', content: @document})
|
96
|
+
return TypeElement.new({name: 'document', content: @document}, main_element: self)
|
97
|
+
end
|
98
|
+
|
99
|
+
# update content from a subsequent element
|
100
|
+
def update_content key, content
|
101
|
+
# byebug
|
102
|
+
# @document = content.to_hash
|
103
|
+
# upd = false
|
104
|
+
# @document.each do |e|
|
105
|
+
# byebug
|
106
|
+
# if e[:name] == key
|
107
|
+
# upd = true
|
108
|
+
# content.each do |k,v|
|
109
|
+
# e[k] = v
|
110
|
+
# end
|
111
|
+
# break
|
112
|
+
# end
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# unless upd
|
116
|
+
# @document << content
|
117
|
+
# end
|
118
|
+
# if @document[key].nil?
|
119
|
+
# @document[key] = content
|
120
|
+
# else
|
121
|
+
# unless @document[key].class = Array
|
122
|
+
# @document[key] = [@document[key]]
|
123
|
+
# end
|
124
|
+
# @document[key] << content.to_hash
|
125
|
+
# end
|
126
|
+
|
83
127
|
end
|
84
128
|
|
85
129
|
# Print the entire document tree. For debug purposes
|
86
130
|
def tree attributes: false
|
87
|
-
self.document.__tree attributes
|
131
|
+
self.document.__tree attributes: attributes
|
88
132
|
end
|
89
133
|
|
90
134
|
private
|
@@ -105,7 +149,8 @@ class Extreml
|
|
105
149
|
return string
|
106
150
|
else
|
107
151
|
attributes = Array.new
|
108
|
-
a = parts[:attributes].scan /[\t\n\r\f ]*(?:(?<namespace>[
|
152
|
+
a = parts[:attributes].scan /[\t\n\r\f ]*(?:(?<namespace>[^\:\=\n\r\f\t ]*):)?(?<property>[^\:\=\n\r\f\t ]*)[\t ]*=[\t ]*"(?<value>[^"]*)"[\t\n\r\f]*/m
|
153
|
+
|
109
154
|
a.each do |p|
|
110
155
|
attributes << {
|
111
156
|
:namespace => p[0],
|
@@ -127,7 +172,7 @@ class Extreml
|
|
127
172
|
attributes = nil
|
128
173
|
else
|
129
174
|
attributes = Array.new
|
130
|
-
a = tags[:attributes].scan /[\t\n\r\f ]*(?:(?<namespace>[
|
175
|
+
a = tags[:attributes].scan /[\t\n\r\f ]*(?:(?<namespace>[^\:\=\n\r\f\t ]*):)?(?<property>[^\:\=\n\r\f\t ]*)[\t ]*=[\t ]*"(?<value>[^"]*)"[\t\n\r\f]*/m
|
131
176
|
a.each do |p|
|
132
177
|
attributes << {
|
133
178
|
:namespace => p[0],
|
@@ -151,3 +196,7 @@ class Extreml
|
|
151
196
|
end
|
152
197
|
|
153
198
|
end
|
199
|
+
|
200
|
+
|
201
|
+
require 'extreml/type_element'
|
202
|
+
require 'extreml/xml_header'
|
data/lib/extreml/type_element.rb
CHANGED
@@ -21,10 +21,11 @@
|
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
23
|
require 'pp'
|
24
|
+
require 'json'
|
24
25
|
|
25
|
-
class TypeElement
|
26
|
+
class Extreml::TypeElement
|
26
27
|
|
27
|
-
def initialize document
|
28
|
+
def initialize document = nil, main_element: nil
|
28
29
|
|
29
30
|
# document model:
|
30
31
|
#
|
@@ -49,6 +50,7 @@ class TypeElement
|
|
49
50
|
@attributes = document[:attributes]
|
50
51
|
@content = document[:content]
|
51
52
|
@types = Array.new
|
53
|
+
@main_element = main_element
|
52
54
|
|
53
55
|
# Add a type for every element in content
|
54
56
|
unless @content.nil?
|
@@ -101,14 +103,33 @@ class TypeElement
|
|
101
103
|
if self.__types.any? name.to_sym
|
102
104
|
array = self.send name.to_sym
|
103
105
|
define_singleton_method name.to_sym do
|
104
|
-
|
106
|
+
content = [array].flatten + [(content.class == Hash ? (Extreml::TypeElement.new content, main_element: self) : content)]
|
107
|
+
case content.length
|
108
|
+
when 0
|
109
|
+
return nil
|
110
|
+
when 1
|
111
|
+
return content[0]
|
112
|
+
else
|
113
|
+
return content
|
114
|
+
end
|
105
115
|
end
|
106
116
|
else
|
107
117
|
define_singleton_method name.to_sym do
|
108
118
|
if content.class == Hash
|
109
|
-
return TypeElement.new content
|
119
|
+
return Extreml::TypeElement.new content, main_element: self
|
110
120
|
else
|
111
|
-
|
121
|
+
if content.class == Array
|
122
|
+
case content.length
|
123
|
+
when 0
|
124
|
+
return nil
|
125
|
+
when 1
|
126
|
+
return content[0]
|
127
|
+
else
|
128
|
+
return content
|
129
|
+
end
|
130
|
+
else
|
131
|
+
return content
|
132
|
+
end
|
112
133
|
end
|
113
134
|
end
|
114
135
|
@types << name.to_sym
|
@@ -117,12 +138,102 @@ class TypeElement
|
|
117
138
|
end
|
118
139
|
alias __add_type add_type
|
119
140
|
|
141
|
+
def add_new_type name, content
|
142
|
+
|
143
|
+
self.__add_type name, {name: name, namespace: nil, attributes: [], content: [content].flatten}
|
144
|
+
self.__update_content name, content
|
145
|
+
|
146
|
+
end
|
147
|
+
alias __add_new_type add_new_type
|
148
|
+
|
149
|
+
# update content from a subsequent element
|
150
|
+
# recursively call update on main_element
|
151
|
+
def update_content name, content
|
152
|
+
|
153
|
+
@content << {name: name, namespace: nil, attributes: [], content: [content].flatten}
|
154
|
+
|
155
|
+
unless @main_element.nil?
|
156
|
+
@main_element.update_content @name, self
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
alias __update_content update_content
|
161
|
+
|
120
162
|
# Override to_s to use in strings (useful for the last nesting level)
|
121
163
|
def to_s
|
122
164
|
return self.__content
|
123
165
|
end
|
124
166
|
alias __to_s to_s
|
125
167
|
|
168
|
+
# Returns the document in XML format
|
169
|
+
def to_xml level = 0
|
170
|
+
xml = ''
|
171
|
+
xml += "#{' ' * level}<#{@namespace.nil? ? '' : "#{@namespace}:"}#{@name}"
|
172
|
+
unless @attributes.nil?
|
173
|
+
@attributes.each do |a|
|
174
|
+
xml += " #{a[:namespace].nil? ? '' : "#{a[:namespace]}:"}#{a[:property]}=\"#{a[:value]}\""
|
175
|
+
end
|
176
|
+
end
|
177
|
+
if @content.nil?
|
178
|
+
xml += "/>"
|
179
|
+
else
|
180
|
+
xml += ">"
|
181
|
+
if @types.empty?
|
182
|
+
xml += "#{@content.join}"
|
183
|
+
else
|
184
|
+
@types.each do |t|
|
185
|
+
content = self.send(t)
|
186
|
+
if content.class == Array
|
187
|
+
content.each do |c|
|
188
|
+
xml += "\n#{c.to_xml (level + 1)}"
|
189
|
+
end
|
190
|
+
else
|
191
|
+
xml += "\n#{content.to_xml (level + 1)}"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
xml += "#{@types.empty? ? '' : "\n#{' ' * level}"}</#{@namespace.nil? ? '' : "#{@namespace}:"}#{@name}>"
|
196
|
+
end
|
197
|
+
return xml
|
198
|
+
end
|
199
|
+
alias __to_xml to_xml
|
200
|
+
|
201
|
+
# Returns the document in JSON format
|
202
|
+
def to_json
|
203
|
+
return self.to_hash.to_json
|
204
|
+
end
|
205
|
+
alias __to_json to_json
|
206
|
+
|
207
|
+
# Returns a hash of the document
|
208
|
+
def to_hash
|
209
|
+
hash = Hash.new
|
210
|
+
hash = {
|
211
|
+
namespace: @namespace,
|
212
|
+
attributes: @attributes
|
213
|
+
}
|
214
|
+
if @types.empty?
|
215
|
+
hash[:content] = @content
|
216
|
+
else
|
217
|
+
@types.each do |t|
|
218
|
+
obj = self.send(t)
|
219
|
+
if obj.class == Array
|
220
|
+
hash[t] = Array.new
|
221
|
+
obj.each do |o|
|
222
|
+
hash[t] << o.to_hash
|
223
|
+
end
|
224
|
+
else
|
225
|
+
if obj.class == Extreml::TypeElement
|
226
|
+
hash[t] = obj.to_hash
|
227
|
+
else
|
228
|
+
hash[t] = obj
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
return hash
|
234
|
+
end
|
235
|
+
alias __to_hash to_hash
|
236
|
+
|
126
237
|
# This method is for debug purposes only, it prints a tree of the document
|
127
238
|
def tree level: 0, attributes: false
|
128
239
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# MIT License
|
2
|
+
#
|
3
|
+
# Copyright (c) 2020 Fabio Boccacini - fboccacini@gmail.com
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# SOFTWARE.
|
22
|
+
|
23
|
+
# Exposes the xml header properties as methods
|
24
|
+
class Extreml::XmlHeader
|
25
|
+
|
26
|
+
# Initialize
|
27
|
+
#
|
28
|
+
# @param header [Hash|String] the header.
|
29
|
+
# @return [XmlHeader] the object.
|
30
|
+
def initialize header = nil
|
31
|
+
if header.nil?
|
32
|
+
h = [
|
33
|
+
["version",1.0],
|
34
|
+
["encoding","UTF-8"]
|
35
|
+
]
|
36
|
+
else
|
37
|
+
h = header.scan /([\w\?\<]*)=["|']([^'"]*)["|']/
|
38
|
+
end
|
39
|
+
if h.empty?
|
40
|
+
@attributes = nil
|
41
|
+
else
|
42
|
+
@attributes = Array.new
|
43
|
+
h.each do |param|
|
44
|
+
@attributes << param[0].to_sym
|
45
|
+
define_singleton_method param[0].to_sym do
|
46
|
+
return param[1]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_xml
|
53
|
+
if @attributes.nil?
|
54
|
+
header = ''
|
55
|
+
else
|
56
|
+
header = '<?xml'
|
57
|
+
@attributes.each do |a|
|
58
|
+
header += " #{a.to_s}=\"#{self.send(a)}\""
|
59
|
+
end
|
60
|
+
header += '?>'
|
61
|
+
end
|
62
|
+
|
63
|
+
return header
|
64
|
+
end
|
65
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extreml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Boccacini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
|
-
This gem allows to read an XML file and access its elements using methods named after the tags
|
15
|
-
|
14
|
+
This gem allows to read an XML/Json file or string and access its elements using methods named after the tags.
|
15
|
+
Also there are methods to return the object as an Hash or XML/Json string.
|
16
|
+
See https://github.com/fboccacini/extreml for reference and usage.
|
16
17
|
email: fboccacini@gmail.com
|
17
18
|
executables: []
|
18
19
|
extensions: []
|
@@ -20,6 +21,7 @@ extra_rdoc_files: []
|
|
20
21
|
files:
|
21
22
|
- lib/extreml.rb
|
22
23
|
- lib/extreml/type_element.rb
|
24
|
+
- lib/extreml/xml_header.rb
|
23
25
|
homepage: https://github.com/fboccacini/extreml
|
24
26
|
licenses:
|
25
27
|
- MIT
|