jexml 0.1.0-jruby

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.
@@ -0,0 +1,4 @@
1
+ === 0.1.0 2010-02-01
2
+
3
+ * Initial release, extracted from code developed for another project.
4
+ * Represents the functionality required for this project; later releases with flesh out to cover additional JDK functionality as required.
@@ -0,0 +1,28 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ lib/core_ext/blank.rb
6
+ lib/jdom.LICENSE.txt
7
+ lib/jdom.jar
8
+ lib/jexml.rb
9
+ lib/jexml/document.rb
10
+ lib/jexml/element.rb
11
+ lib/jexml/node.rb
12
+ script/console
13
+ script/destroy
14
+ script/generate
15
+ tasks/jruby.rake
16
+ test/mydoc.xml
17
+ test/mydoc_unformatted.xml
18
+ test/mydoc_updated_item.xml
19
+ test/test_format.rb
20
+ test/test_helper.rb
21
+ test/test_new_doc_file.rb
22
+ test/test_new_doc_string.rb
23
+ test/test_query_item_names.rb
24
+ test/test_query_item_stock_number.rb
25
+ test/test_query_item_upcs.rb
26
+ test/test_query_sections.rb
27
+ test/test_update_change_item.rb
28
+ test/test_validate_bad_xml.rb
@@ -0,0 +1,108 @@
1
+ = jexml
2
+
3
+ * http://github.com/gboersma/jexml
4
+
5
+ == Description
6
+
7
+ JEXML is a JRuby gem that provides a thin Ruby wrapper around the XML APIs in the JDK.
8
+
9
+ == Features
10
+
11
+ * Most compelling feature is the JDK support for XML document validation.
12
+ * Full XPath support.
13
+ * Supports parsing and updating XML documents.
14
+ * Currently only DOM support; SAX support not yet implemented.
15
+ * 3 to 5 times better performance than REXML under JRuby.
16
+ * Uses JDOM to properly format a document, due to bug in JDK.
17
+
18
+ The implementation approach is to keep the Ruby classes as thin as possible. Currently, it
19
+ represents what was required for a specific project; the interface will get fleshed out
20
+ to more completely cover JDK functionality in later releases.
21
+
22
+ Check out Nick Sieger's JREXML gem at http://github.com/nicksieger/jrexml/
23
+ for a different approach for improving REXML performance under JRuby.
24
+ This is a better way to go if you want to maintain REXML compatibility
25
+ and do not need XML document validation.
26
+
27
+ == Synopsis
28
+
29
+ Create a new JEXML::Document object, either from a File:
30
+
31
+ file = File.new("mydoc.xml")
32
+ doc = JEXML::Document.new file
33
+
34
+ or a String:
35
+
36
+ str = File.new("mydoc.xml").read
37
+ doc = JEXML::Document.new str
38
+
39
+ Use the methods on Document and XPath expressions to access nodes within the document:
40
+
41
+ doc.nodes("//inventory/section").each do |node|
42
+ puts "Found section #{node.name}..."
43
+ end
44
+
45
+ To validate the XML (i.e. against the DTD):
46
+
47
+ str = File.new("mydoc.xml").read
48
+ doc = JEXML::Document.validate(str)
49
+
50
+ To generate formatted XML as a String for a document:
51
+
52
+ doc.format
53
+
54
+ which only accepts a boolean parameter to indicate if the XML declaration should be omitted.
55
+
56
+ There are also methods for updating a document and nodes within a document. Check out the rdocs.
57
+
58
+ == Requirements
59
+
60
+ JRuby / Java. Tested on JRuby 1.4.0 using Java 1.6.0_17 under Mac OS/X.
61
+
62
+ This product includes software developed by the JDOM Project (http://www.jdom.org/).
63
+ The JDOM 1.1.1 library is included as part of the gem.
64
+
65
+ Includes software developed by the ActiveSupport Project (http://as.rubyonrails.org/). MIT license.
66
+ The core_ext/blank.rb is included as part of the gem (unmodified from ActiveSupport 2.2.2).
67
+
68
+ == Install
69
+
70
+ Install the gem under JRuby:
71
+
72
+ jruby -S gem install jexml
73
+
74
+ And require 'jexml'.
75
+
76
+ gem 'jexml'
77
+ require 'jexml'
78
+
79
+ == Source
80
+
81
+ You can get the JEXML source using Git:
82
+
83
+ git clone git://github.com/gboersma/jexml.git
84
+
85
+ == License
86
+
87
+ (The MIT License)
88
+
89
+ Copyright (c) 2010 Gerald Boersma (gerald.boersma@gmail.com)
90
+
91
+ Permission is hereby granted, free of charge, to any person obtaining
92
+ a copy of this software and associated documentation files (the
93
+ 'Software'), to deal in the Software without restriction, including
94
+ without limitation the rights to use, copy, modify, merge, publish,
95
+ distribute, sublicense, and/or sell copies of the Software, and to
96
+ permit persons to whom the Software is furnished to do so, subject to
97
+ the following conditions:
98
+
99
+ The above copyright notice and this permission notice shall be
100
+ included in all copies or substantial portions of the Software.
101
+
102
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
103
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
104
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
105
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
106
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
107
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
108
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+ require './lib/jexml'
6
+
7
+ Hoe.plugin :newgem
8
+ # Hoe.plugin :website
9
+ # Hoe.plugin :cucumberfeatures
10
+
11
+ # Generate all the Rake tasks
12
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
+ $hoe = Hoe.spec 'jexml' do
14
+ self.developer 'Gerald Boersma', 'gerald.boersma@gmail.com'
15
+ self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
16
+ self.rubyforge_name = self.name # TODO this is default value
17
+ # self.extra_deps = [['activesupport','>= 2.0.2']]
18
+
19
+ self.spec_extras['platform'] = 'jruby' # JRuby gem created, e.g. jexml-X.Y.Z-jruby.gem
20
+
21
+ end
22
+
23
+ require 'newgem/tasks'
24
+ Dir['tasks/**/*.rake'].each { |t| load t }
25
+
26
+ # TODO - want other tests/tasks run by default? Add them to the list
27
+ # remove_task :default
28
+ # task :default => [:spec, :features]
@@ -0,0 +1,58 @@
1
+ class Object
2
+ # An object is blank if it's false, empty, or a whitespace string.
3
+ # For example, "", " ", +nil+, [], and {} are blank.
4
+ #
5
+ # This simplifies
6
+ #
7
+ # if !address.nil? && !address.empty?
8
+ #
9
+ # to
10
+ #
11
+ # if !address.blank?
12
+ def blank?
13
+ respond_to?(:empty?) ? empty? : !self
14
+ end
15
+
16
+ # An object is present if it's not blank.
17
+ def present?
18
+ !blank?
19
+ end
20
+ end
21
+
22
+ class NilClass #:nodoc:
23
+ def blank?
24
+ true
25
+ end
26
+ end
27
+
28
+ class FalseClass #:nodoc:
29
+ def blank?
30
+ true
31
+ end
32
+ end
33
+
34
+ class TrueClass #:nodoc:
35
+ def blank?
36
+ false
37
+ end
38
+ end
39
+
40
+ class Array #:nodoc:
41
+ alias_method :blank?, :empty?
42
+ end
43
+
44
+ class Hash #:nodoc:
45
+ alias_method :blank?, :empty?
46
+ end
47
+
48
+ class String #:nodoc:
49
+ def blank?
50
+ self !~ /\S/
51
+ end
52
+ end
53
+
54
+ class Numeric #:nodoc:
55
+ def blank?
56
+ false
57
+ end
58
+ end
@@ -0,0 +1,56 @@
1
+ /*--
2
+
3
+ $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $
4
+
5
+ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin.
6
+ All rights reserved.
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions
10
+ are met:
11
+
12
+ 1. Redistributions of source code must retain the above copyright
13
+ notice, this list of conditions, and the following disclaimer.
14
+
15
+ 2. Redistributions in binary form must reproduce the above copyright
16
+ notice, this list of conditions, and the disclaimer that follows
17
+ these conditions in the documentation and/or other materials
18
+ provided with the distribution.
19
+
20
+ 3. The name "JDOM" must not be used to endorse or promote products
21
+ derived from this software without prior written permission. For
22
+ written permission, please contact <request_AT_jdom_DOT_org>.
23
+
24
+ 4. Products derived from this software may not be called "JDOM", nor
25
+ may "JDOM" appear in their name, without prior written permission
26
+ from the JDOM Project Management <request_AT_jdom_DOT_org>.
27
+
28
+ In addition, we request (but do not require) that you include in the
29
+ end-user documentation provided with the redistribution and/or in the
30
+ software itself an acknowledgement equivalent to the following:
31
+ "This product includes software developed by the
32
+ JDOM Project (http://www.jdom.org/)."
33
+ Alternatively, the acknowledgment may be graphical using the logos
34
+ available at http://www.jdom.org/images/logos.
35
+
36
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39
+ DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
40
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47
+ SUCH DAMAGE.
48
+
49
+ This software consists of voluntary contributions made by many
50
+ individuals on behalf of the JDOM Project and was originally
51
+ created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
52
+ Brett McLaughlin <brett_AT_jdom_DOT_org>. For more information
53
+ on the JDOM Project, please see <http://www.jdom.org/>.
54
+
55
+ */
56
+
Binary file
@@ -0,0 +1,20 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module JEXML
5
+ VERSION = '0.1.0'
6
+ end
7
+
8
+ # Always need Java.
9
+ require 'java'
10
+
11
+ # We use JDOM for formatting. Java SDK formatting is broken.
12
+ require "jdom.jar"
13
+
14
+ # Handy extension borrowed from Active Support.
15
+ require 'core_ext/blank'
16
+
17
+ # JEXML components.
18
+ require 'jexml/node'
19
+ require 'jexml/element'
20
+ require 'jexml/document'
@@ -0,0 +1,116 @@
1
+ module JEXML
2
+ # Wraps an underlying org.w3c.dom.Document (http://java.sun.com/javase/6/docs/api/org/w3c/dom/Document.html).
3
+ class Document < Node
4
+ # Create a new Document from either a file or a String containing the XML content.
5
+ def self.new(source)
6
+ if source.kind_of?(File)
7
+ new_from_string(source.read)
8
+ elsif source.kind_of?(String)
9
+ new_from_string(source)
10
+ else
11
+ super
12
+ end
13
+ end
14
+
15
+ # Create a new Document from a String containing the XML content.
16
+ # This uses a non-validating parser.
17
+ def self.new_from_string(str)
18
+ is = java.io.ByteArrayInputStream.new(java.lang.String.new(str).getBytes)
19
+ factory = javax.xml.parsers.DocumentBuilderFactory.newInstance
20
+ factory.setNamespaceAware(true)
21
+ builder = factory.newDocumentBuilder
22
+ doc = builder.parse(is)
23
+ # Create a new object where the document is the node.
24
+ Node.create(doc)
25
+ end
26
+
27
+ # Validate the XML in the provided string.
28
+ # Will raise an exception with the validation error if not valid.
29
+ # This uses a validating parser.
30
+ def self.validate(str)
31
+ is = java.io.ByteArrayInputStream.new(java.lang.String.new(str).getBytes)
32
+ factory = javax.xml.parsers.DocumentBuilderFactory.newInstance
33
+ factory.setValidating(true)
34
+ factory.setNamespaceAware(true)
35
+ builder = factory.newDocumentBuilder
36
+ builder.setErrorHandler(MyErrorHandler.new)
37
+ builder.parse(is)
38
+ end
39
+
40
+
41
+ # Initialize the Ruby Document object with the corresponding Java Document object.
42
+ def initialize(java_node = nil)
43
+ # If a java_node is not specified, create a new one.
44
+ if java_node == nil
45
+ factory = javax.xml.parsers.DocumentBuilderFactory.newInstance
46
+ builder = factory.newDocumentBuilder
47
+ java_node = builder.newDocument
48
+ end
49
+
50
+ # Create the node as normal.
51
+ super(java_node)
52
+ end
53
+
54
+ # Return the document in nice format (as a String).
55
+ # Because the Java JDK cannot properly format the XML, we will give it to JDOM and have it do it.
56
+ # Set the optional parameter omit_xml_decl to false to generate the XML declaration for the document.
57
+ def format(omit_xml_decl = true)
58
+ builder = org.jdom.input.DOMBuilder.new
59
+ doc = builder.build(@java_node)
60
+ out = org.jdom.output.XMLOutputter.new
61
+ format = org.jdom.output.Format.getPrettyFormat
62
+ format.setOmitDeclaration(omit_xml_decl)
63
+ out.setFormat(format)
64
+ out.outputString(doc)
65
+ end
66
+
67
+ # Get the root element for this document.
68
+ def root
69
+ Node.create(@java_node.getDocumentElement)
70
+ end
71
+
72
+ # Import the specified node into this document.
73
+ def import_node(src_node)
74
+ Node.create(@java_node.importNode(src_node.java_node, true))
75
+ end
76
+
77
+ # Create an element with the specified tag name, attributes, and text content.
78
+ def create_element(tag_name, attrs = {}, text = nil)
79
+ element = Node.create(@java_node.createElement(tag_name))
80
+ if attrs != nil
81
+ attrs.each do |name, value|
82
+ element.set_attribute(name.to_s, value.to_s)
83
+ end
84
+ end
85
+ element.text = text if text != nil
86
+ element
87
+ end
88
+
89
+ # Create a CDATA node with the specified contents.
90
+ def create_cdata_node(contents)
91
+ Node.create(@java_node.createCDATASection(contents))
92
+ end
93
+
94
+ # Set the provided element as the root of the document.
95
+ # This assumes that the element is an element, and that the
96
+ # document does not yet have any children.
97
+ def root=(element)
98
+ @java_node.appendChild(element.java_node)
99
+ end
100
+ end
101
+
102
+ # Implementation class for catching validation errors.
103
+ class MyErrorHandler < org.xml.sax.helpers.DefaultHandler
104
+ def fatalError(e)
105
+ raise "#{e}"
106
+ end
107
+
108
+ def error(e)
109
+ raise "#{e}"
110
+ end
111
+
112
+ def warning(e)
113
+ raise "#{e}"
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,21 @@
1
+ module JEXML
2
+ # Wraps an underlying org.w3c.dom.Element (http://java.sun.com/javase/6/docs/api/org/w3c/dom/Element.html).
3
+ class Element < Node
4
+ # Get the value of the attribute with the specified name.
5
+ def attribute(name)
6
+ value = java_node.getAttribute(name.to_s)
7
+ # For some reason, the Java SDK returns a blank string if an attribute is not found.
8
+ # Let's map that back to the more meaningful nil value.
9
+ if not value.blank?
10
+ value
11
+ else
12
+ nil
13
+ end
14
+ end
15
+
16
+ # Get the value of the attribute with the specified name.
17
+ def set_attribute(name, value)
18
+ java_node.setAttribute(name.to_s, value)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,161 @@
1
+ module JEXML
2
+ # Wraps an underlying org.w3c.dom.Node (http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html).
3
+ # Generic Ruby representation of an underlying Java node, if no special handling provided.
4
+ class Node
5
+ # Allow read access to the underlying Java Node object.
6
+ attr_reader :java_node
7
+
8
+ # Instantiate the correct JEXML object depending on the type of the Node object.
9
+ def self.create(java_node)
10
+ # Comparing to the code values rather than the constants in Node can be dangerous.
11
+ # Possible that the actual values can change. However, unlikely.
12
+ # Difficult to get to the Interface constants using JRuby.
13
+ if java_node.getNodeType == 1
14
+ # Element
15
+ Element.new(java_node)
16
+ elsif java_node.getNodeType == 9
17
+ # Document
18
+ Document.new(java_node)
19
+ else
20
+ # No special handling. Treat as a generic node.
21
+ Node.new(java_node)
22
+ end
23
+ end
24
+
25
+ # Initialize the Ruby Node object with the corresponding Java Node object.
26
+ def initialize(java_node)
27
+ @java_node = java_node
28
+ @nodeset_constant = javax.xml.xpath.XPathConstants.java_class.declared_field('NODESET').static_value
29
+ @xpath_factory = javax.xml.xpath.XPathFactory.newInstance
30
+ end
31
+
32
+ # Search for nodes within the context of this node according to the XPath expression.
33
+ def nodes(xpath)
34
+ nodes = []
35
+ xpath_expr = @xpath_factory.newXPath.compile(xpath)
36
+ xpath_nodes = xpath_expr.evaluate(@java_node, @nodeset_constant)
37
+ (0..xpath_nodes.getLength - 1).each do |index|
38
+ xpath_node = xpath_nodes.item(index)
39
+ nodes << Node.create(xpath_node)
40
+ end
41
+ nodes
42
+ end
43
+
44
+ # Return the first matching node, if any, for the provided XPath expression.
45
+ def node(xpath)
46
+ nodes = nodes(xpath)
47
+ nodes.size > 0 ? nodes[0] : nil
48
+ end
49
+
50
+ # Get all the child nodes of this node.
51
+ # If a name is specified, only the child nodes with the same name are returned.
52
+ def child_nodes(name = nil)
53
+ nodes = []
54
+ child_nodes = @java_node.getChildNodes
55
+ (0..child_nodes.getLength - 1).each do |index|
56
+ child_node = child_nodes.item(index)
57
+ if name != nil
58
+ nodes << Node.create(child_node) if child_node.getNodeName == name
59
+ else
60
+ nodes << Node.create(child_node)
61
+ end
62
+ end
63
+ nodes
64
+ end
65
+
66
+ # Get the first child node with the specified name.
67
+ def first_child_node(name = nil)
68
+ child_nodes = child_nodes(name)
69
+ child_nodes.size > 0 ? child_nodes[0] : nil
70
+ end
71
+
72
+ # Remove all the child nodes for this node with the specified name.
73
+ def remove_child_nodes(name)
74
+ @java_node.getChildNodes.each do |child_node|
75
+ @java_node.removeChild(child_node) if child_node.getNodeName == name
76
+ end
77
+ end
78
+
79
+ # Replace the specified node with the new one provided.
80
+ def replace_child_node(old_node, new_node)
81
+ @java_node.replaceChild(new_node.java_node, old_node.java_node)
82
+ end
83
+
84
+ # Add the provided node as a child of this node.
85
+ def add_child_node(node)
86
+ @java_node.appendChild(node.java_node)
87
+ end
88
+
89
+ # Get the elements of this node according to the provided XPath expression.
90
+ def elements(xpath)
91
+ extract_elements(nodes(xpath))
92
+ end
93
+
94
+ # Get the first element of this node according to the provided XPath expression.
95
+ def element(xpath)
96
+ elements = elements(xpath)
97
+ elements.size > 0 ? elements[0] : nil
98
+ end
99
+
100
+ # Get the child elements of this node with the specified name (if provided).
101
+ def child_elements(name = nil)
102
+ extract_elements(child_nodes(name))
103
+ end
104
+
105
+ # Get the first child elements of this node with the specified name (if provided).
106
+ def first_child_element(name = nil)
107
+ child_elements = child_elements(name)
108
+ child_elements.size > 0 ? child_elements[0] : nil
109
+ end
110
+
111
+ # Get the name of the node.
112
+ def name
113
+ @java_node.getNodeName
114
+ end
115
+
116
+ # Get the value of the node.
117
+ def value
118
+ @java_node.getNodeValue
119
+ end
120
+
121
+ # Get the type code for the node.
122
+ def type_code
123
+ @java_node.getNodeType
124
+ end
125
+
126
+ # Get the text content for the node.
127
+ def text
128
+ @java_node.getTextContent
129
+ end
130
+
131
+ # Set the text content for the node.
132
+ def text=(text)
133
+ @java_node.setTextContent(text)
134
+ end
135
+
136
+ # Normalize the node.
137
+ def normalize
138
+ @java_node.normalize
139
+ end
140
+
141
+ # Append the specified node to the children of this node.
142
+ def <<(node)
143
+ @java_node.appendChild(node.java_node)
144
+ end
145
+
146
+ # Get the owner document for this node.
147
+ def document
148
+ Node.create(@java_node.getOwnerDocument)
149
+ end
150
+
151
+ private
152
+
153
+ def extract_elements(nodes)
154
+ elements = []
155
+ nodes.each do |node|
156
+ elements << node if node.class == JEXML::Element
157
+ end
158
+ elements
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/jexml.rb'}"
9
+ puts "Loading jexml gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,7 @@
1
+ if RUBY_PLATFORM =~ /java/
2
+ require 'java'
3
+ else
4
+ puts "Java RubyGem only! You are not running within jruby."
5
+ puts "Try: jruby -S rake #{ARGV.join(' ')}"
6
+ exit(1)
7
+ end
@@ -0,0 +1,27 @@
1
+ <inventory title="OmniCorp Store #45x10^3">
2
+ <section name="health">
3
+ <item upc="123456789" stock="12">
4
+ <name>Invisibility Cream</name>
5
+ <price>14.50</price>
6
+ <description>Makes you invisible</description>
7
+ </item>
8
+ <item upc="445322344" stock="18">
9
+ <name>Levitation Salve</name>
10
+ <price>23.99</price>
11
+ <description>Levitate yourself for up to 3 hours per application</description>
12
+ </item>
13
+ </section>
14
+ <section name="food">
15
+ <item upc="485672034" stock="653">
16
+ <name>Blork and Freen Instameal</name>
17
+ <price>4.95</price>
18
+ <description>A tasty meal in a tablet; just add water</description>
19
+ </item>
20
+ <item upc="132957764" stock="44">
21
+ <name>Grob winglets</name>
22
+ <price>3.56</price>
23
+ <description>Tender winglets of Grob. Just add water</description>
24
+ </item>
25
+ </section>
26
+ </inventory>
27
+
@@ -0,0 +1,2 @@
1
+ <inventory title="OmniCorp Store #45x10^3"><section name="health"><item upc="123456789" stock="12"><name>Invisibility Cream</name><price>14.50</price><description>Makes you invisible</description></item><item upc="445322344" stock="18"><name>Levitation Salve</name><price>23.99</price><description>Levitate yourself for up to 3 hours per application</description></item></section><section name="food"><item upc="485672034" stock="653"><name>Blork and Freen Instameal</name><price>4.95</price><description>A tasty meal in a tablet; just add water</description></item><item upc="132957764" stock="44"><name>Grob winglets</name><price>3.56</price><description>Tender winglets of Grob. Just add water</description></item></section></inventory>
2
+
@@ -0,0 +1,27 @@
1
+ <inventory title="OmniCorp Store #45x10^3">
2
+ <section name="health">
3
+ <item upc="123456789" stock="12">
4
+ <name>Invisibility Cream</name>
5
+ <price>14.50</price>
6
+ <description>Makes you invisible</description>
7
+ </item>
8
+ <item upc="445322344" stock="18">
9
+ <name>Levitation Salve</name>
10
+ <price>23.99</price>
11
+ <description>Levitate yourself for up to 3 hours per application</description>
12
+ </item>
13
+ </section>
14
+ <section name="food">
15
+ <item upc="485672034" stock="653">
16
+ <name>Blork and Freen Instameal</name>
17
+ <price>4.95</price>
18
+ <description>A tasty meal in a tablet; just add water</description>
19
+ </item>
20
+ <item upc="132957765" stock="45">
21
+ <name>Grob leglets</name>
22
+ <price>3.57</price>
23
+ <description>Tender leglets of Grob. Just add water</description>
24
+ </item>
25
+ </section>
26
+ </inventory>
27
+
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestFormat < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc_unformatted.xml")
6
+ @doc = JEXML::Document.new(file)
7
+ end
8
+
9
+ def test_truth
10
+ formatted_xml = @doc.format
11
+ file = File.new("test/mydoc.xml")
12
+ formatted_xml == file.read
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/jexml'
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestNewDocFile < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file)
7
+ end
8
+
9
+ def test_truth
10
+ @doc != nil and @doc.root.attribute("title") == "OmniCorp Store #45x10^3"
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestNewDocString < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file.read)
7
+ end
8
+
9
+ def test_truth
10
+ @doc != nil and @doc.root.attribute("title") == "OmniCorp Store #45x10^3"
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestQueryItemNames < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file.read)
7
+ end
8
+
9
+ def test_truth
10
+ item_names = @doc.nodes("//inventory/section/item").collect do |node|
11
+ name_node = node.first_child_node("name")
12
+ name_node.text
13
+ end
14
+ item_names == ["Invisibility Cream", "Levitation Salve", "Blork and Freen Instameal", "Grob winglets"]
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestQueryItemStockNumber < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file.read)
7
+ end
8
+
9
+ def test_truth
10
+ item_upcs = @doc.nodes("//inventory/section/item[@stock='44']").collect do |node|
11
+ node.attribute("upc")
12
+ end
13
+ item_upcs += @doc.nodes("//inventory/section/item[@stock='653']").collect do |node|
14
+ node.attribute("upc")
15
+ end
16
+ item_upcs += @doc.nodes("//inventory/section/item[@stock='18']").collect do |node|
17
+ node.attribute("upc")
18
+ end
19
+ item_upcs += @doc.nodes("//inventory/section/item[@stock='12']").collect do |node|
20
+ node.attribute("upc")
21
+ end
22
+ item_upcs == ["123456789", "445322344", "485672034", "132957764"].reverse
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestQueryItemUpcs < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file.read)
7
+ end
8
+
9
+ def test_truth
10
+ item_upcs = @doc.nodes("//inventory/section/item").collect do |node|
11
+ node.attribute("upc")
12
+ end
13
+ item_upcs == ["123456789", "445322344", "485672034", "132957764"]
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestQuerySections < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file.read)
7
+ end
8
+
9
+ def test_truth
10
+ sections = @doc.nodes("//inventory/section").collect do |node|
11
+ node.attribute("name")
12
+ end
13
+ sections == ["health", "food"]
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestUpdateChangeItem < Test::Unit::TestCase
4
+ def setup
5
+ file = File.new("test/mydoc.xml")
6
+ @doc = JEXML::Document.new(file)
7
+ end
8
+
9
+ def test_truth
10
+ item_node = @doc.node("//inventory/section/item[@upc='132957764']")
11
+ item_node.set_attribute("upc", "132957765")
12
+ item_node.set_attribute("stock", "45")
13
+ name_node = item_node.first_child_node("name")
14
+ name_node.text = "Grob leglets"
15
+ price_node = item_node.first_child_node("price")
16
+ price_node.text = "3.57"
17
+ description_node = item_node.first_child_node("description")
18
+ description_node.text = "Tender leglets of Grob. Just add water"
19
+ @doc.format == File.new("test/mydoc_updated_item.xml").read
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestValidateBadXml < Test::Unit::TestCase
4
+ def setup
5
+ end
6
+
7
+ def test_truth
8
+ error = false
9
+ begin
10
+ xml = "This is bad XML."
11
+ JEXML::Document.validate(xml)
12
+ rescue
13
+ error = true
14
+ end
15
+ error
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jexml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: jruby
6
+ authors:
7
+ - Gerald Boersma
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-03 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rubyforge
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.0.3
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: gemcutter
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: hoe
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.5.0
44
+ version:
45
+ description: JEXML is a JRuby gem that provides a thin Ruby wrapper around the XML APIs in the JDK.
46
+ email:
47
+ - gerald.boersma@gmail.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files:
53
+ - History.txt
54
+ - Manifest.txt
55
+ - lib/jdom.LICENSE.txt
56
+ files:
57
+ - History.txt
58
+ - Manifest.txt
59
+ - README.rdoc
60
+ - Rakefile
61
+ - lib/core_ext/blank.rb
62
+ - lib/jdom.LICENSE.txt
63
+ - lib/jdom.jar
64
+ - lib/jexml.rb
65
+ - lib/jexml/document.rb
66
+ - lib/jexml/element.rb
67
+ - lib/jexml/node.rb
68
+ - script/console
69
+ - script/destroy
70
+ - script/generate
71
+ - tasks/jruby.rake
72
+ - test/mydoc.xml
73
+ - test/mydoc_unformatted.xml
74
+ - test/mydoc_updated_item.xml
75
+ - test/test_format.rb
76
+ - test/test_helper.rb
77
+ - test/test_new_doc_file.rb
78
+ - test/test_new_doc_string.rb
79
+ - test/test_query_item_names.rb
80
+ - test/test_query_item_stock_number.rb
81
+ - test/test_query_item_upcs.rb
82
+ - test/test_query_sections.rb
83
+ - test/test_update_change_item.rb
84
+ - test/test_validate_bad_xml.rb
85
+ has_rdoc: true
86
+ homepage: http://github.com/gboersma/jexml
87
+ licenses: []
88
+
89
+ post_install_message: PostInstall.txt
90
+ rdoc_options:
91
+ - --main
92
+ - README.rdoc
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
100
+ version:
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: "0"
106
+ version:
107
+ requirements: []
108
+
109
+ rubyforge_project: jexml
110
+ rubygems_version: 1.3.5
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: JEXML is a JRuby gem that provides a thin Ruby wrapper around the XML APIs in the JDK.
114
+ test_files:
115
+ - test/test_format.rb
116
+ - test/test_helper.rb
117
+ - test/test_new_doc_file.rb
118
+ - test/test_new_doc_string.rb
119
+ - test/test_query_item_names.rb
120
+ - test/test_query_item_stock_number.rb
121
+ - test/test_query_item_upcs.rb
122
+ - test/test_query_sections.rb
123
+ - test/test_update_change_item.rb
124
+ - test/test_validate_bad_xml.rb