blackwinter-ruby-xquery 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,41 @@
1
+ = ruby-xquery - Libxml's XPath support + plain ol' Ruby = XQuery (kind of... ;-)
2
+
3
+ == VERSION
4
+
5
+ This documentation refers to ruby-xquery version 0.2.2
6
+
7
+
8
+ == DESCRIPTION
9
+
10
+ TODO: well, the description... ;-)
11
+
12
+
13
+ == LINKS
14
+
15
+ <b></b>
16
+ Documentation:: <http://prometheus.rubyforge.org/ruby-xquery>
17
+ Source code (old):: <http://prometheus.rubyforge.org/svn/scratch/ruby-xquery>
18
+ Source code:: <http://github.com/blackwinter/ruby-xquery>
19
+ Rubyforge project:: <http://rubyforge.org/projects/prometheus>
20
+
21
+
22
+ == AUTHORS
23
+
24
+ * Jens Wille <mailto:jens.wille@uni-koeln.de>
25
+
26
+
27
+ == LICENSE AND COPYRIGHT
28
+
29
+ Copyright (C) 2007-2008 Jens Wille
30
+
31
+ ruby-xquery is free software: you can redistribute it and/or modify it under
32
+ the terms of the GNU General Public License as published by the Free Software
33
+ Foundation, either version 3 of the License, or (at your option) any later
34
+ version.
35
+
36
+ ruby-xquery is distributed in the hope that it will be useful, but WITHOUT ANY
37
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
38
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
39
+
40
+ You should have received a copy of the GNU General Public License along with
41
+ ruby-xquery. If not, see <http://www.gnu.org/licenses/>.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'hen'
3
+ rescue LoadError
4
+ abort "Please install the 'hen' gem first."
5
+ end
6
+
7
+ require 'lib/libxml/xquery/version'
8
+
9
+ Hen.lay! {{
10
+ :rubyforge => {
11
+ :package => 'ruby-xquery'
12
+ },
13
+
14
+ :gem => {
15
+ :version => LibXML::XML::XQuery::VERSION,
16
+ :summary => "Libxml's XPath support + plain ol' Ruby = XQuery (kind of... ;-)",
17
+ :files => FileList['lib/**/*.rb'].to_a,
18
+ :extra_files => FileList['[A-Z]*', 'spec/**/*.rb', 'test_data/**/*'].to_a,
19
+ :dependencies => [['libxml-ruby', '>= 0.9.3']]
20
+ }
21
+ }}
@@ -0,0 +1,49 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-xquery, mimicking XQuery in Ruby. #
5
+ # #
6
+ # Copyright (C) 2007-2008 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@uni-koeln.de> #
10
+ # #
11
+ # ruby-xquery is free software; you can redistribute it and/or modify it #
12
+ # under the terms of the GNU General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # ruby-xquery is distributed in the hope that it will be useful, but WITHOUT #
17
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
18
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU General Public License along #
22
+ # with ruby-xquery. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ module LibXML::XML::XQuery::EnhancedFind
28
+
29
+ def enhanced_find(xpath)
30
+ find(xpath.gsub(/\*\*/, 'descendant::node()'), namespaces)
31
+ end
32
+ alias_method :[], :enhanced_find
33
+
34
+ def /(xpath)
35
+ enhanced_find(xpath.to_s)
36
+ end
37
+
38
+ def self.included(base)
39
+ # overwrite original methods
40
+ instance_methods.each { |method|
41
+ base.send(:define_method, method, instance_method(method))
42
+ }
43
+ end
44
+
45
+ end
46
+
47
+ [LibXML::XML::Document, LibXML::XML::Node].each { |klass|
48
+ klass.send :include, LibXML::XML::XQuery::EnhancedFind
49
+ }
@@ -0,0 +1,67 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-xquery, mimicking XQuery in Ruby. #
5
+ # #
6
+ # Copyright (C) 2007-2008 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@uni-koeln.de> #
10
+ # #
11
+ # ruby-xquery is free software; you can redistribute it and/or modify it #
12
+ # under the terms of the GNU General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # ruby-xquery is distributed in the hope that it will be useful, but WITHOUT #
17
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
18
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU General Public License along #
22
+ # with ruby-xquery. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ module LibXML::XML::XQuery::Namespaces
28
+
29
+ def namespaces
30
+ @namespaces ||= self.class::DEFAULT_NAMESPACES
31
+ end
32
+
33
+ def namespaces=(ns)
34
+ if url
35
+ @namespaces = self.class.namespaces[url] = ns
36
+ else
37
+ raise "can't set namespaces (document has no URL)"
38
+ end
39
+ end
40
+
41
+ def self.included(base)
42
+ base.const_set(:DEFAULT_NAMESPACES, [])
43
+
44
+ # container for XML::Node's access to its document's namespaces
45
+ base.instance_variable_set(
46
+ :@namespaces, Hash.new(base.const_get(:DEFAULT_NAMESPACES))
47
+ )
48
+
49
+ class << base; attr_reader :namespaces; end
50
+
51
+ # overwrite original methods
52
+ instance_methods.each { |method|
53
+ base.send(:define_method, method, instance_method(method))
54
+ }
55
+ end
56
+
57
+ end
58
+
59
+ [LibXML::XML::Document].each { |klass|
60
+ klass.send :include, LibXML::XML::XQuery::Namespaces
61
+ }
62
+
63
+ class LibXML::XML::Node
64
+ def namespaces
65
+ LibXML::XML::Document.namespaces[doc.url]
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-xquery, mimicking XQuery in Ruby. #
5
+ # #
6
+ # Copyright (C) 2007-2008 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@uni-koeln.de> #
10
+ # #
11
+ # ruby-xquery is free software; you can redistribute it and/or modify it #
12
+ # under the terms of the GNU General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # ruby-xquery is distributed in the hope that it will be useful, but WITHOUT #
17
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
18
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU General Public License along #
22
+ # with ruby-xquery. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ class LibXML::XML::Attr
28
+
29
+ def to_s(sep = nil)
30
+ value.strip
31
+ end
32
+
33
+ end
34
+
35
+ class LibXML::XML::Node
36
+
37
+ def to_s(sep = nil)
38
+ content.strip
39
+ end
40
+
41
+ end
42
+
43
+ class LibXML::XML::XPath::Object
44
+
45
+ def to_s(sep = ' | ')
46
+ map { |n| (c = n.to_s(sep)).empty? ? nil : c }.compact.join(sep)
47
+ end
48
+
49
+ end
@@ -0,0 +1,92 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-xquery, mimicking XQuery in Ruby. #
5
+ # #
6
+ # Copyright (C) 2007-2008 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@uni-koeln.de> #
10
+ # #
11
+ # ruby-xquery is free software; you can redistribute it and/or modify it #
12
+ # under the terms of the GNU General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # ruby-xquery is distributed in the hope that it will be useful, but WITHOUT #
17
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
18
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU General Public License along #
22
+ # with ruby-xquery. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require 'forwardable'
28
+
29
+ module LibXML::XML::XQuery::Uniqueness
30
+
31
+ extend Forwardable
32
+
33
+ DELEGATORS = %w[to_a each length size]
34
+
35
+ def_delegators *DELEGATORS
36
+
37
+ def to_a
38
+ if @_uniq
39
+ # return unique nodes according to their #to_s
40
+ seen = Hash.new { |h, k| h[k] = true; false }
41
+ uniq = []
42
+
43
+ _xquery_original_to_a.each { |n|
44
+ uniq << n unless seen[n.to_s]
45
+ }
46
+
47
+ uniq
48
+ else
49
+ _xquery_original_to_a
50
+ end
51
+ end
52
+
53
+ def uniq
54
+ proxy = self.class.new.uniq!
55
+ proxy.instance_variable_set(:@_this, self)
56
+
57
+ class << proxy
58
+ (instance_methods - DELEGATORS).each { |method|
59
+ undef_method(method) unless method =~ /\A__/
60
+ }
61
+
62
+ def method_missing(*args)
63
+ block_given? ? @_this.send(*args) { |a| yield a } : @_this.send(*args)
64
+ end
65
+ end
66
+
67
+ proxy
68
+ end
69
+
70
+ def uniq!
71
+ @_uniq = true
72
+ self
73
+ end
74
+
75
+ def uniq?
76
+ @_uniq
77
+ end
78
+
79
+ def self.included(base)
80
+ base.send(:alias_method, :_xquery_original_to_a, :to_a)
81
+
82
+ # overwrite original methods
83
+ instance_methods.each { |method|
84
+ base.send(:define_method, method, instance_method(method))
85
+ }
86
+ end
87
+
88
+ end
89
+
90
+ [LibXML::XML::XPath::Object].each { |klass|
91
+ klass.send :include, LibXML::XML::XQuery::Uniqueness
92
+ }
@@ -0,0 +1,35 @@
1
+ module LibXML
2
+
3
+ module XML
4
+
5
+ module XQuery
6
+
7
+ module Version
8
+
9
+ MAJOR = 0
10
+ MINOR = 2
11
+ TINY = 2
12
+
13
+ class << self
14
+
15
+ # Returns array representation.
16
+ def to_a
17
+ [MAJOR, MINOR, TINY]
18
+ end
19
+
20
+ # Short-cut for version string.
21
+ def to_s
22
+ to_a.join('.')
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ VERSION = Version.to_s
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,45 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # ruby-xquery -- Libxml's XPath support + plain ol' Ruby = XQuery (kind of... #
5
+ # ;-) #
6
+ # #
7
+ # Copyright (C) 2007-2008 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-xquery is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-xquery is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-xquery. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ begin
29
+ require 'rubygems'
30
+ rescue LoadError
31
+ end
32
+
33
+ require 'libxml'
34
+
35
+ raise "need libxml-ruby version >= 0.9.3, got #{LibXML::XML::VERSION}" \
36
+ unless LibXML::XML::VERSION >= '0.9.3'
37
+
38
+ # Libxml's XPath support + plain ol' Ruby = XQuery (kind of... ;-)
39
+
40
+ module LibXML::XML::XQuery
41
+ end
42
+
43
+ Dir[File.join(File.dirname(__FILE__), 'xquery', '**', '*.rb')].each { |rb|
44
+ require rb
45
+ }
data/lib/xml/xquery.rb ADDED
@@ -0,0 +1,2 @@
1
+ # for backwards-compatibility
2
+ require 'libxml/xquery'
@@ -0,0 +1,7 @@
1
+ BASE = File.join(File.dirname(__FILE__), '..') unless Object.const_defined?(:BASE)
2
+
3
+ $: << File.join(BASE, 'lib')
4
+
5
+ require 'libxml/xquery'
6
+
7
+ DOC = LibXML::XML::Document.file(File.join(BASE, 'test_data', 'hamlet.xml')) unless Object.const_defined?(:DOC)
@@ -0,0 +1,47 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe LibXML::XML::XQuery do
4
+
5
+ it 'should find all acts' do
6
+ DOC['//ACT'].size.should == 5
7
+ end
8
+
9
+ it 'should find all acts with Hpricot-style syntax' do
10
+ (DOC/'//ACT').size.should == 5
11
+ end
12
+
13
+ it 'should find all speakers per act' do
14
+ DOC['//ACT'].map { |act|
15
+ act['descendant::node()/SPEAKER'].size
16
+ }.should == [259, 202, 252, 180, 257]
17
+ end
18
+
19
+ it 'should find all unique speakers per act' do
20
+ DOC['//ACT'].map { |act|
21
+ act['descendant::node()/SPEAKER'].uniq.size
22
+ }.should == [14, 10, 15, 15, 13]
23
+ end
24
+
25
+ it 'should find descendant::node() with abbreviated syntax' do
26
+ act = DOC['//ACT'].first
27
+
28
+ act['**/SPEAKER'].to_a.should == act['descendant::node()/SPEAKER'].to_a
29
+ end
30
+
31
+ it 'should not have any side-effects when using non-bang uniq' do
32
+ speakers = DOC['//ACT'].first['descendant::node()/SPEAKER']
33
+
34
+ lambda {
35
+ speakers.uniq
36
+ }.should_not change(speakers, :size)
37
+ end
38
+
39
+ it 'should indeed have side-effects when using bang uniq' do
40
+ speakers = DOC['//ACT'].first['descendant::node()/SPEAKER']
41
+
42
+ lambda {
43
+ speakers.uniq!
44
+ }.should change(speakers, :size)
45
+ end
46
+
47
+ end