clifton_lib 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,35 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ # Gemfile.lock
30
+ # .ruby-version
31
+ # .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
35
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in clifton_lib.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ clifton_lib (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.2.2)
10
+
11
+ PLATFORMS
12
+ x86-mingw32
13
+
14
+ DEPENDENCIES
15
+ bundler (~> 1.3)
16
+ clifton_lib!
17
+ rake
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Marc Clifton
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.
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Marc Clifton
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # CliftonLib
2
+
3
+ This is a collection of useful functionality that I require for various projects that I'm working on.
4
+
5
+ In version 0.0.1, I've implemented several XML helper classes, similar to .NET's XmlDocument, to facilitate the
6
+ creation and serialization of XML. In this version, the support is bare bones but sufficient for what I need done.
7
+
8
+ Why do this?
9
+
10
+ All the implementations for XML support that I've seen in Ruby utilize the "method missing" feature, so that markup is written in a DSL manner. For example:
11
+
12
+ doc.product = 'Apples'
13
+
14
+ will yield something like:
15
+
16
+ <product>Apples</product>
17
+
18
+ I have several issues with this:
19
+
20
+ 1. It isn't object oriented.
21
+ 2. It assumes you know the element and attribute names, which isn't convenient when generating XML dynamically from other data sources
22
+ 3. It leverages "method missing", which affects performance and creates an internal DSL which isn't necessary.
23
+ 4. Frequently, the parameters are passed as hashes, which I find particularly evil in Ruby as they don't document what the valid parameter-hashes are via function parameters.
24
+
25
+ Instead, I want to base XML document generation (and eventually parsing) on Microsoft's implementation of the XmlDocument class in .NET:
26
+
27
+ http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx
28
+
29
+ This implementation:
30
+
31
+ 1. Is a decent object-oriented solution for creating XML documents
32
+ 2. Inherently supports dynamic XML generation
33
+ 3. Isn't DSL-ish.
34
+
35
+ ## A note about the code
36
+
37
+ You'll find that I do certain things, like explicitly return nil when the function isn't intended to return anything. This avoids accidental usage of a return from a function where
38
+ that is an unintended consequence of the last line executed in the function.
39
+
40
+ ## Installation
41
+
42
+ Add this line to your application's Gemfile:
43
+
44
+ gem 'clifton_lib'
45
+
46
+ And then execute:
47
+
48
+ $ bundle
49
+
50
+ Or install it yourself as:
51
+
52
+ $ gem install clifton_lib
53
+
54
+ ## Usage
55
+
56
+ XML Serialization Example:
57
+
58
+ ```ruby
59
+ require 'test/unit'
60
+ require 'clifton_lib/xml/xml_document'
61
+ require 'clifton_lib/xml/xml_declaration_node'
62
+ require 'clifton_lib/xml/xml_text_writer'
63
+
64
+ include CliftonXml
65
+
66
+ def test_serialization
67
+ xdoc = XmlDocument.new()
68
+ decl_node = xdoc.create_xml_declaration('1.0', 'UTF-8')
69
+ xdoc.append_child(decl_node)
70
+
71
+ products = xdoc.create_element('Products')
72
+ xdoc.append_child(products)
73
+
74
+ product1 = xdoc.create_element('Product')
75
+ id_attr1 = xdoc.create_attribute('ID')
76
+ name_attr1 = xdoc.create_attribute('Name')
77
+ id_attr1.value = '1'
78
+ name_attr1.value = 'Apples'
79
+ product1.append_attribute(id_attr1)
80
+ product1.append_attribute(name_attr1)
81
+ product1.inner_text = 'foobar'
82
+
83
+ product2 = xdoc.create_element('Product')
84
+ id_attr2 = xdoc.create_attribute('ID')
85
+ name_attr2 = xdoc.create_attribute('Name')
86
+ id_attr2.value = '2'
87
+ name_attr2.value = 'Oranges'
88
+ product2.append_attribute(id_attr2)
89
+ product2.append_attribute(name_attr2)
90
+
91
+ products.append_child(product1)
92
+ products.append_child(product2)
93
+
94
+ tw = XmlTextWriter.new()
95
+ tw.formatting = :indented
96
+ xdoc.save(tw)
97
+ output = tw.output
98
+ assert_equal %Q|<?xml version="1.0" encoding="UTF-8"?>\r\n<Products>\r\n <Product ID="1" Name="Apples">foobar</Product>\r\n <Product ID="2" Name="Oranges"/>\r\n</Products>|, output
99
+ end
100
+ ```
101
+
102
+ The result looks like:
103
+
104
+ ```XML
105
+ <Products>
106
+ <Product ID="1" Name="Apples">foobar</Product>
107
+ <Product ID="2" Name="Oranges" />
108
+ </Products>
109
+ ```
110
+
111
+ For further examples, see the xml_document_tests.rb file.
112
+
113
+ ## Contributing
114
+
115
+ 1. Fork it
116
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
117
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
118
+ 4. Push to the branch (`git push origin my-new-feature`)
119
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'clifton_lib/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "clifton_lib"
8
+ spec.version = CliftonLib::VERSION
9
+ spec.authors = ["Marc Clifton"]
10
+ spec.email = ["marc.clifton@gmail.com"]
11
+ spec.description = %q{A collection of useful helper classes, initially a set of classes to support creation and serialization of XML.}
12
+ spec.summary = %q{Collection of useful helper classes.}
13
+ spec.homepage = "https://github.com/cliftonm/clifton_lib"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,17 @@
1
+ require "clifton_lib/version"
2
+
3
+ module CliftonLib
4
+ end
5
+
6
+
7
+ =begin
8
+
9
+ To build this:
10
+
11
+ from RubyMine, Tools -> Gem -> Build Gem
12
+
13
+ Locally install the gem:
14
+
15
+ C:\rails-gems\clifton_lib>gem install .\clifton_lib-0.0.1.gem
16
+
17
+ =end
@@ -0,0 +1,3 @@
1
+ module CliftonLib
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,19 @@
1
+ require "clifton_lib/version"
2
+
3
+ module CliftonXml
4
+ class XmlAttribute
5
+ attr_accessor :name
6
+ attr_accessor :value
7
+
8
+ # XmlAttribute.new() {@name = [name]; @value = [value]}
9
+ def initialize(&block)
10
+ # this can use the form {@<attr> = <value>}
11
+ # allow for default constructor.
12
+ instance_eval(&block) unless block.nil?
13
+ # yield self if block_given?
14
+ # this requires the form {|inst| inst.<attr> = <value>}
15
+
16
+ self
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ require "clifton_lib/version"
2
+ require "clifton_lib/xml/xml_attribute"
3
+ require "clifton_lib/xml/xml_node"
4
+
5
+ module CliftonXml
6
+ class XmlDeclarationNode < XmlNode
7
+
8
+ # XmlDeclarationNode.new() {... attribute initialization ... }
9
+ def initialize(&block)
10
+ super()
11
+ instance_eval(&block) unless block.nil?
12
+
13
+ self
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,136 @@
1
+ require "clifton_lib/version"
2
+ require "clifton_lib/xml/xml_attribute"
3
+ require "clifton_lib/xml/xml_element"
4
+ require "clifton_lib/xml/xml_node"
5
+ require "clifton_lib/xml/xml_declaration_node"
6
+
7
+ module CliftonXml
8
+ class XmlDocument < XmlNode
9
+
10
+ # XmlDocument.new()
11
+ def initialize
12
+ super()
13
+ end
14
+
15
+ # XmlDeclarationNode create_xml_declaration(string version, string encoding)
16
+ def create_xml_declaration(version, encoding)
17
+ declNode = XmlDeclarationNode.new() {
18
+ @attributes << XmlAttribute.new() {@name='version'; @value=version}
19
+ @attributes << XmlAttribute.new() {@name='encoding'; @value=encoding}
20
+ }
21
+
22
+ declNode
23
+ end
24
+
25
+ # XmlAttribute create_attribute(string name)
26
+ def create_attribute(name)
27
+ attr = XmlAttribute.new() {@name = name}
28
+
29
+ attr
30
+ end
31
+
32
+ # XmlElement create_element(string name)
33
+ def create_element(name)
34
+ elem = XmlElement.new() {@name = name}
35
+
36
+ elem
37
+ end
38
+
39
+ def document_element()
40
+ # TODO
41
+ end
42
+
43
+ def document_type()
44
+ # TODO
45
+ end
46
+
47
+ # void save(XmlTextWriter writer)
48
+ def save(writer)
49
+ write_nodes(writer, @child_nodes)
50
+
51
+ nil
52
+ end
53
+
54
+ private
55
+
56
+ # void write_nodes(XmlTextWriter writer, XmlNodes[] nodes)
57
+ def write_nodes(writer, nodes)
58
+ nodes.each_with_index do |node, idx|
59
+ # write xml declaration if it exists.
60
+ # TODO: Should throw somewhere if this isn't the first node.
61
+ if node.is_a?(XmlDeclarationNode)
62
+ writer.write('<?xml')
63
+ write_attributes(writer, node)
64
+ writer.write('?>')
65
+ writer.new_line()
66
+ else
67
+ # begin element tag and attributes
68
+ writer.write('<' + node.name)
69
+ write_attributes(writer, node)
70
+
71
+ # if inner text, write it out now.
72
+ if node.inner_text
73
+ writer.write('>' + node.inner_text)
74
+ writer.write('</' + node.name + '>')
75
+ crlf_if_more_nodes(writer, nodes, idx)
76
+ else
77
+ # Children are allowed only if there is no inner text.
78
+ if node.has_child_nodes()
79
+ # close element tag, indent, and recurse.
80
+ writer.write('>')
81
+ writer.indent()
82
+ writer.new_line()
83
+ write_nodes(writer, node.child_nodes)
84
+ writer.outdent()
85
+ writer.new_line()
86
+ # close the element
87
+ writer.write('</' + node.name + '>')
88
+ crlf_if_more_nodes(writer, nodes, idx)
89
+ else
90
+ # if no children and no inner text, use the abbreviated closing tag token.
91
+ writer.write('/>')
92
+ crlf_if_more_nodes(writer, nodes, idx)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ nil
99
+ end
100
+
101
+ # Write the attribute collection for a node.
102
+ # void write_attributes(XmlTextWriter writer, XmlNode node)
103
+ def write_attributes(writer, node)
104
+ if node.attributes.count > 0
105
+ # stuff them into an array of strings
106
+ attrs = []
107
+
108
+ node.attributes.each do |attr|
109
+ attrs << attr.name + '="' + attr.value + '"'
110
+ end
111
+
112
+ # separate them with a space
113
+ attr_str = attrs.join(' ')
114
+
115
+ # requires a leading space as well to separate from the element name.
116
+ writer.write(' ' + attr_str)
117
+ end
118
+
119
+ nil
120
+ end
121
+
122
+ # bool more_nodes(XmlNodes[] nodes, int idx)
123
+ def more_nodes(nodes, idx)
124
+ idx + 1 < nodes.count
125
+ end
126
+
127
+ # void crlf_if_more_nodes(XmlTextWriter writer, XmlNodes[] nodes, int idx)
128
+ def crlf_if_more_nodes(writer, nodes, idx)
129
+ if more_nodes(nodes, idx)
130
+ writer.new_line()
131
+ end
132
+
133
+ nil
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,32 @@
1
+ require "clifton_lib/version"
2
+ require "clifton_lib/xml/xml_node"
3
+
4
+ module CliftonXml
5
+ class XmlElement < XmlNode
6
+
7
+ # XmlElement.new()
8
+ def initialize(&block)
9
+ super()
10
+ instance_eval(&block) unless block.nil?
11
+
12
+ self
13
+ end
14
+
15
+ # void append_attributes(XmlAttribute attr)
16
+ def append_attribute(attr)
17
+ @attributes << attr
18
+
19
+ nil
20
+ end
21
+
22
+ # XmlElement previous_sibling()
23
+ def previous_sibling()
24
+ # TODO
25
+ end
26
+
27
+ # XmlElement next_sibling()
28
+ def next_sibling()
29
+ # TODO
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ require "clifton_lib/version"
2
+
3
+ module CliftonXml
4
+ class XmlNode
5
+ attr_accessor :name
6
+ attr_accessor :inner_text
7
+ attr_accessor :parent_node # Annoying rubyism -- if in the class itself, property must be read/writeable.
8
+ attr_reader :attributes
9
+ attr_reader :child_nodes
10
+
11
+ # XmlNode.new()
12
+ def initialize()
13
+ @attributes = []
14
+ @child_nodes = []
15
+ @parent_node = nil
16
+ @name = nil
17
+ @inner_text = nil
18
+
19
+ self
20
+ end
21
+
22
+ # bool has_child_nodes()
23
+ def has_child_nodes()
24
+ @child_nodes.count > 0
25
+ end
26
+
27
+ # void append_child(XmlNode node)
28
+ def append_child(node)
29
+ @child_nodes << node
30
+ node.parent_node = self
31
+
32
+ nil
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,55 @@
1
+ require "clifton_lib/version"
2
+
3
+ module CliftonXml
4
+ # For the moment, simply builds a string locally.
5
+ # TODO: Implement streams, passing in an output stream to the constructor, like a StringWriter or FileWriter stream.
6
+ class XmlTextWriter
7
+ attr_accessor :formatting
8
+ attr_reader :output
9
+
10
+ # XmlTextWriter.new()
11
+ def initialize()
12
+ @output = ''
13
+ @indent = 0
14
+ @formatting = :none
15
+ end
16
+
17
+ # void write(string str)
18
+ def write(str)
19
+ @output << str
20
+
21
+ nil
22
+ end
23
+
24
+ # void new_line()
25
+ def new_line()
26
+ if @formatting == :indented
27
+ @output << "\r\n"
28
+ @output << indentation(@indent)
29
+ end
30
+
31
+ nil
32
+ end
33
+
34
+ # void indent()
35
+ def indent()
36
+ @indent = @indent + 2
37
+
38
+ nil
39
+ end
40
+
41
+ # void outdent()
42
+ def outdent()
43
+ @indent = @indent - 2
44
+
45
+ nil
46
+ end
47
+
48
+ private
49
+
50
+ # string indentation(int amt)
51
+ def indentation(amt)
52
+ ' ' * amt
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,109 @@
1
+ require 'test/unit'
2
+ require 'clifton_lib/xml/xml_document'
3
+ require 'clifton_lib/xml/xml_declaration_node'
4
+ require 'clifton_lib/xml/xml_text_writer'
5
+
6
+ include CliftonXml
7
+
8
+ class XmlDocumentTests < Test::Unit::TestCase
9
+ # Create a document and verify that no child nodes and attributes exist.
10
+ def test_create_node
11
+ xdoc = XmlDocument.new()
12
+ assert_equal xdoc.child_nodes.count, 0
13
+ assert_equal xdoc.attributes.count, 0
14
+ end
15
+
16
+ # Create an XML declaration header and verify the attribute and node counts.
17
+ def test_xml_declaration
18
+ xdoc = XmlDocument.new()
19
+ node = xdoc.create_xml_declaration('1.0', 'UTF-8')
20
+ assert_equal node.attributes.count, 2
21
+ xdoc.append_child(node)
22
+ assert_equal xdoc.child_nodes.count, 1
23
+ assert_equal xdoc.attributes.count, 0
24
+ end
25
+
26
+ # Create a document with one root and two children.
27
+ def test_element_creation
28
+ xdoc = XmlDocument.new()
29
+ products = xdoc.create_element('Products')
30
+ xdoc.append_child(products)
31
+
32
+ product1 = xdoc.create_element('Product')
33
+ product2 = xdoc.create_element('Product')
34
+
35
+ products.append_child(product1)
36
+ products.append_child(product2)
37
+
38
+ assert_equal xdoc.child_nodes.count, 1
39
+ assert_equal xdoc.child_nodes[0].child_nodes.count, 2
40
+ end
41
+
42
+ # Create a document with one root, two children, and two attributes for each child.
43
+ def test_element_attributes
44
+ xdoc = XmlDocument.new()
45
+ products = xdoc.create_element('Products')
46
+ xdoc.append_child(products)
47
+
48
+ product1 = xdoc.create_element('Product')
49
+ id_attr1 = xdoc.create_attribute('ID')
50
+ name_attr1 = xdoc.create_attribute('Name')
51
+ id_attr1.value = '1'
52
+ name_attr1.value = 'Apples'
53
+ product1.append_attribute(id_attr1)
54
+ product1.append_attribute(name_attr1)
55
+
56
+ product2 = xdoc.create_element('Product')
57
+ id_attr2 = xdoc.create_attribute('ID')
58
+ name_attr2 = xdoc.create_attribute('Name')
59
+ id_attr2.value = '2'
60
+ name_attr2.value = 'Oranges'
61
+ product2.append_attribute(id_attr1)
62
+ product2.append_attribute(name_attr1)
63
+
64
+ products.append_child(product1)
65
+ products.append_child(product2)
66
+
67
+ assert_equal xdoc.child_nodes.count, 1
68
+ assert_equal xdoc.child_nodes[0].child_nodes.count, 2
69
+ assert_equal xdoc.child_nodes[0].child_nodes[0].attributes.count, 2
70
+ assert_equal xdoc.child_nodes[0].child_nodes[1].attributes.count, 2
71
+ end
72
+
73
+ # test the serialization of a simple structure with an inner element having inner text.
74
+ def test_serialization
75
+ xdoc = XmlDocument.new()
76
+ decl_node = xdoc.create_xml_declaration('1.0', 'UTF-8')
77
+ xdoc.append_child(decl_node)
78
+
79
+ products = xdoc.create_element('Products')
80
+ xdoc.append_child(products)
81
+
82
+ product1 = xdoc.create_element('Product')
83
+ id_attr1 = xdoc.create_attribute('ID')
84
+ name_attr1 = xdoc.create_attribute('Name')
85
+ id_attr1.value = '1'
86
+ name_attr1.value = 'Apples'
87
+ product1.append_attribute(id_attr1)
88
+ product1.append_attribute(name_attr1)
89
+ product1.inner_text = 'foobar'
90
+
91
+ product2 = xdoc.create_element('Product')
92
+ id_attr2 = xdoc.create_attribute('ID')
93
+ name_attr2 = xdoc.create_attribute('Name')
94
+ id_attr2.value = '2'
95
+ name_attr2.value = 'Oranges'
96
+ product2.append_attribute(id_attr2)
97
+ product2.append_attribute(name_attr2)
98
+
99
+ products.append_child(product1)
100
+ products.append_child(product2)
101
+
102
+ tw = XmlTextWriter.new()
103
+ tw.formatting = :indented
104
+ xdoc.save(tw)
105
+ output = tw.output
106
+ assert_equal %Q|<?xml version="1.0" encoding="UTF-8"?>\r\n<Products>\r\n <Product ID="1" Name="Apples">foobar</Product>\r\n <Product ID="2" Name="Oranges"/>\r\n</Products>|, output
107
+ end
108
+ end
109
+
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clifton_lib
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Marc Clifton
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-04-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: &26145264 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *26145264
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &26144784 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *26144784
36
+ description: A collection of useful helper classes, initially a set of classes to
37
+ support creation and serialization of XML.
38
+ email:
39
+ - marc.clifton@gmail.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - Gemfile.lock
47
+ - LICENSE
48
+ - LICENSE.txt
49
+ - README.md
50
+ - Rakefile
51
+ - clifton_lib.gemspec
52
+ - lib/clifton_lib.rb
53
+ - lib/clifton_lib/version.rb
54
+ - lib/clifton_lib/xml/xml_attribute.rb
55
+ - lib/clifton_lib/xml/xml_declaration_node.rb
56
+ - lib/clifton_lib/xml/xml_document.rb
57
+ - lib/clifton_lib/xml/xml_element.rb
58
+ - lib/clifton_lib/xml/xml_node.rb
59
+ - lib/clifton_lib/xml/xml_text_writer.rb
60
+ - test/xml_document_tests.rb
61
+ homepage: https://github.com/cliftonm/clifton_lib
62
+ licenses:
63
+ - MIT
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 1.8.16
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Collection of useful helper classes.
86
+ test_files:
87
+ - test/xml_document_tests.rb