genx4r 0.04 → 0.05
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +12 -0
- data/ext/genx4r/genx4r.c +9 -23
- data/genx4r.gemspec +11 -7
- data/lib/genx4r/builder.rb +123 -0
- data/test/builder.rb +49 -0
- data/test/declare.rb +5 -1
- metadata +22 -13
data/CHANGES
CHANGED
@@ -1,7 +1,19 @@
|
|
1
|
+
[ Changes for 0.05 - Nov 25, 2004 ]
|
2
|
+
|
3
|
+
* Added GenX::Builder, which works much like Jim Weirich's Builder
|
4
|
+
library, but filters the output through GenX, so you get the benefit
|
5
|
+
of sanity checking.
|
6
|
+
|
7
|
+
* Fixed some bugs in the element, namespace, and attribute declaration
|
8
|
+
code that could have resulted in spurious errors when there was nothing
|
9
|
+
wrong.
|
10
|
+
|
1
11
|
[ Changes for 0.04 - Oct 1, 2004 ]
|
2
12
|
|
3
13
|
* Ruby 1.6.8 compatability. Really. I mean it this time. Sigh.
|
14
|
+
|
4
15
|
* Update to latest genx, fixes a memory leak in genxDispose.
|
16
|
+
|
5
17
|
* Added a gemspec for RubyGems installation.
|
6
18
|
|
7
19
|
[ Changes for 0.03 - Jul 11, 2004 ]
|
data/ext/genx4r/genx4r.c
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
20
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
21
21
|
|
22
|
-
/* $Id: genx4r.c
|
22
|
+
/* $Id: genx4r.c 494 2004-11-25 15:21:41Z rooneg $ */
|
23
23
|
|
24
24
|
#include "ruby.h"
|
25
25
|
|
@@ -400,26 +400,12 @@ writer_new (VALUE klass)
|
|
400
400
|
static VALUE
|
401
401
|
writer_declare_namespace (int argc, VALUE *argv, VALUE self)
|
402
402
|
{
|
403
|
-
VALUE uri, prefix;
|
403
|
+
VALUE uri, prefix = 0;
|
404
|
+
genxStatus st = 0;
|
404
405
|
genxNamespace ns;
|
405
|
-
genxStatus st;
|
406
406
|
genxWriter w;
|
407
407
|
|
408
|
-
|
409
|
-
{
|
410
|
-
case 1:
|
411
|
-
uri = argv[0];
|
412
|
-
prefix = 0;
|
413
|
-
break;
|
414
|
-
|
415
|
-
case 2:
|
416
|
-
uri = argv[0];
|
417
|
-
prefix = argv[1];
|
418
|
-
break;
|
419
|
-
|
420
|
-
default:
|
421
|
-
rb_raise (rb_eRuntimeError, "invalid arguments");
|
422
|
-
}
|
408
|
+
rb_scan_args (argc, argv, "11", &uri, &prefix);
|
423
409
|
|
424
410
|
Check_Type (uri, T_STRING);
|
425
411
|
if (prefix)
|
@@ -433,7 +419,7 @@ writer_declare_namespace (int argc, VALUE *argv, VALUE self)
|
|
433
419
|
&st);
|
434
420
|
|
435
421
|
if (st)
|
436
|
-
rb_raise (rb_cGenXException, "%s",
|
422
|
+
rb_raise (rb_cGenXException, "%s", genxGetErrorMessage (w, st));
|
437
423
|
|
438
424
|
return Data_Wrap_Struct (rb_cGenXNamespace, NULL, NULL, ns);
|
439
425
|
}
|
@@ -442,8 +428,8 @@ static VALUE
|
|
442
428
|
writer_declare_element (int argc, VALUE *argv, VALUE self)
|
443
429
|
{
|
444
430
|
genxNamespace ns = 0;
|
431
|
+
genxStatus st = 0;
|
445
432
|
genxElement elem;
|
446
|
-
genxStatus st;
|
447
433
|
genxWriter w;
|
448
434
|
VALUE name;
|
449
435
|
|
@@ -472,7 +458,7 @@ writer_declare_element (int argc, VALUE *argv, VALUE self)
|
|
472
458
|
|
473
459
|
elem = genxDeclareElement (w, ns, RSTRING (name)->ptr, &st);
|
474
460
|
if (st)
|
475
|
-
rb_raise (rb_cGenXException, "%s",
|
461
|
+
rb_raise (rb_cGenXException, "%s", genxGetErrorMessage (w, st));
|
476
462
|
|
477
463
|
return Data_Wrap_Struct (rb_cGenXElement, NULL, NULL, elem);
|
478
464
|
}
|
@@ -482,7 +468,7 @@ writer_declare_attribute (int argc, VALUE *argv, VALUE self)
|
|
482
468
|
{
|
483
469
|
genxNamespace ns = 0;
|
484
470
|
genxAttribute attr;
|
485
|
-
genxStatus st;
|
471
|
+
genxStatus st = 0;
|
486
472
|
genxWriter w;
|
487
473
|
VALUE name;
|
488
474
|
|
@@ -511,7 +497,7 @@ writer_declare_attribute (int argc, VALUE *argv, VALUE self)
|
|
511
497
|
|
512
498
|
attr = genxDeclareAttribute (w, ns, RSTRING (name)->ptr, &st);
|
513
499
|
if (st)
|
514
|
-
rb_raise (rb_cGenXException, "%s",
|
500
|
+
rb_raise (rb_cGenXException, "%s", genxGetErrorMessage (w, st));
|
515
501
|
|
516
502
|
return Data_Wrap_Struct (rb_cGenXAttribute, NULL, NULL, attr);
|
517
503
|
}
|
data/genx4r.gemspec
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
3
|
spec = Gem::Specification.new do |s|
|
4
|
-
s.name
|
5
|
-
s.version = '0.
|
4
|
+
s.name = 'genx4r'
|
5
|
+
s.version = '0.05'
|
6
|
+
|
6
7
|
s.summary = <<-EOF
|
7
8
|
GenX4r is a Ruby wrapper around the GenX library, which allows you to
|
8
9
|
programatically generate correct, cannonical XML output.
|
9
10
|
EOF
|
11
|
+
|
10
12
|
s.description = <<-EOF
|
11
13
|
GenX4r is a Ruby wrapper around the GenX library, which allows you to
|
12
14
|
programatically generate correct, cannonical XML output.
|
@@ -16,14 +18,16 @@ spec = Gem::Specification.new do |s|
|
|
16
18
|
|
17
19
|
s.extensions << "ext/genx4r/extconf.rb"
|
18
20
|
|
19
|
-
s.require_path = 'lib'
|
21
|
+
s.require_path = 'lib'
|
22
|
+
|
20
23
|
s.autorequire = 'genx4r'
|
21
24
|
|
22
25
|
s.has_rdoc = false
|
23
|
-
s.test_suite_file = "test/basics.rb"
|
24
26
|
|
25
|
-
s.
|
26
|
-
|
27
|
-
s.
|
27
|
+
s.test_files = Dir.glob('test/*.rb')
|
28
|
+
|
29
|
+
s.author = "Garrett Rooney"
|
30
|
+
s.email = "rooneg@electricjellyfish.net"
|
31
|
+
s.homepage = "http://genx4r.rubyforge.org"
|
28
32
|
s.rubyforge_project = "genx4r"
|
29
33
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'genx4r'
|
2
|
+
|
3
|
+
# $Id: builder.rb 449 2004-10-02 20:15:49Z rooneg $
|
4
|
+
|
5
|
+
module GenX
|
6
|
+
class Blank
|
7
|
+
instance_methods.each do |m|
|
8
|
+
undef_method m unless m =~ /^(__|instance_eval)/
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Builder < Blank
|
13
|
+
def initialize(writer)
|
14
|
+
@writer = writer
|
15
|
+
|
16
|
+
@elements = {}
|
17
|
+
@attributes = {}
|
18
|
+
@namespaces = {}
|
19
|
+
|
20
|
+
@indent = 2
|
21
|
+
@level = 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(sym, *args, &block)
|
25
|
+
text = nil
|
26
|
+
attrs = nil
|
27
|
+
|
28
|
+
args.each do |arg|
|
29
|
+
case arg
|
30
|
+
when Hash
|
31
|
+
attrs ||= {}
|
32
|
+
attrs.merge!(arg)
|
33
|
+
else
|
34
|
+
text ||= ''
|
35
|
+
text << arg.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
_cache_element(sym)
|
40
|
+
_cache_attrs(attrs) unless attrs.nil?
|
41
|
+
|
42
|
+
if block
|
43
|
+
raise ArgumentError, 'can\'t have both text and block' unless text.nil?
|
44
|
+
_indent
|
45
|
+
@writer.element(@elements[sym]) do
|
46
|
+
_write_attrs(attrs) unless attrs.nil?
|
47
|
+
_write_contents(block)
|
48
|
+
end
|
49
|
+
_newline
|
50
|
+
else
|
51
|
+
_indent
|
52
|
+
@writer.element(@elements[sym]) do
|
53
|
+
_write_attrs(attrs) unless attrs.nil?
|
54
|
+
@writer.text(text) unless text.nil?
|
55
|
+
end
|
56
|
+
_newline
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def _write_contents(block)
|
61
|
+
begin
|
62
|
+
@level += 1
|
63
|
+
_newline
|
64
|
+
block.call(self)
|
65
|
+
ensure
|
66
|
+
@level -= 1
|
67
|
+
_indent
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def _write_attrs(attrs)
|
72
|
+
attrs.each_key do |attr|
|
73
|
+
@writer.attribute(@attributes[attr], attrs[attr])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def _cache_attrs(attrs)
|
78
|
+
attrs.each_key do |attr|
|
79
|
+
unless @attributes.has_key?(attr)
|
80
|
+
@attributes[attr] = @writer.declare_attribute(attr.to_s)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def _cache_element(sym)
|
86
|
+
unless @elements.has_key?(sym.to_s)
|
87
|
+
@elements[sym] = @writer.declare_element(sym.to_s)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def _newline
|
92
|
+
unless @indent == 0 || @level == 0
|
93
|
+
@writer.text("\n")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def _indent
|
98
|
+
unless @indent == 0 || @level == 0
|
99
|
+
@writer.text(" " * (@indent * @level))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def _begin_doc(io)
|
104
|
+
@writer.begin_document(io)
|
105
|
+
end
|
106
|
+
|
107
|
+
def _end_doc
|
108
|
+
@writer.end_document
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class Writer
|
113
|
+
def builder(io, &block)
|
114
|
+
b = Builder.new(self)
|
115
|
+
begin
|
116
|
+
b._begin_doc(io)
|
117
|
+
block.call(b)
|
118
|
+
ensure
|
119
|
+
b._end_doc
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/test/builder.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift('ext/genx4r')
|
4
|
+
$LOAD_PATH.unshift('lib')
|
5
|
+
|
6
|
+
require 'genx4r/builder'
|
7
|
+
|
8
|
+
# $Id: builder.rb 493 2004-11-25 15:17:36Z rooneg $
|
9
|
+
|
10
|
+
class BuilderTest < Test::Unit::TestCase
|
11
|
+
def test_basics
|
12
|
+
w = GenX::Writer.new()
|
13
|
+
|
14
|
+
s = ''
|
15
|
+
|
16
|
+
w.builder(s) do |b|
|
17
|
+
b.foo
|
18
|
+
end
|
19
|
+
|
20
|
+
assert s == '<foo></foo>'
|
21
|
+
|
22
|
+
s = ''
|
23
|
+
|
24
|
+
w.builder(s) do |b|
|
25
|
+
b.foo('bar')
|
26
|
+
end
|
27
|
+
|
28
|
+
assert s == '<foo>bar</foo>'
|
29
|
+
|
30
|
+
s = ''
|
31
|
+
|
32
|
+
w.builder(s) do |b|
|
33
|
+
b.foo do
|
34
|
+
b.bar('baz')
|
35
|
+
b.baz('zot', 'foo' => 'bar')
|
36
|
+
b.zim
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# the \n is just so this works with the here doc...
|
41
|
+
assert (s + "\n") == <<EOF
|
42
|
+
<foo>
|
43
|
+
<bar>baz</bar>
|
44
|
+
<baz foo="bar">zot</baz>
|
45
|
+
<zim></zim>
|
46
|
+
</foo>
|
47
|
+
EOF
|
48
|
+
end
|
49
|
+
end
|
data/test/declare.rb
CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift('ext/genx4r')
|
|
5
5
|
|
6
6
|
require 'genx4r'
|
7
7
|
|
8
|
-
# $Id: declare.rb
|
8
|
+
# $Id: declare.rb 491 2004-11-25 03:26:54Z rooneg $
|
9
9
|
|
10
10
|
class DeclareTest < Test::Unit::TestCase
|
11
11
|
def init_writer
|
@@ -55,5 +55,9 @@ class DeclareTest < Test::Unit::TestCase
|
|
55
55
|
|
56
56
|
assert io.string == "<bar:blah xmlns:bar=\"http://foo.com/bar\"" +
|
57
57
|
" bar:zot=\"zang\"></bar:blah>"
|
58
|
+
|
59
|
+
assert_raise(ArgumentError) do
|
60
|
+
w.declare_namespace
|
61
|
+
end
|
58
62
|
end
|
59
63
|
end
|
metadata
CHANGED
@@ -3,16 +3,18 @@ rubygems_version: 0.8.1
|
|
3
3
|
specification_version: 1
|
4
4
|
name: genx4r
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
date: 2004-
|
8
|
-
summary: "GenX4r is a Ruby wrapper around the GenX library, which allows you to
|
6
|
+
version: "0.05"
|
7
|
+
date: 2004-11-25
|
8
|
+
summary: "GenX4r is a Ruby wrapper around the GenX library, which allows you to
|
9
|
+
programatically generate correct, cannonical XML output."
|
9
10
|
require_paths:
|
10
11
|
- lib
|
11
12
|
author: Garrett Rooney
|
12
13
|
email: rooneg@electricjellyfish.net
|
13
14
|
homepage: http://genx4r.rubyforge.org
|
14
15
|
rubyforge_project: genx4r
|
15
|
-
description: "GenX4r is a Ruby wrapper around the GenX library, which allows you to
|
16
|
+
description: "GenX4r is a Ruby wrapper around the GenX library, which allows you to
|
17
|
+
programatically generate correct, cannonical XML output."
|
16
18
|
autorequire: genx4r
|
17
19
|
default_executable:
|
18
20
|
bindir: bin
|
@@ -26,26 +28,33 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
26
28
|
version:
|
27
29
|
platform: ruby
|
28
30
|
files:
|
29
|
-
-
|
31
|
+
- test
|
30
32
|
- ext
|
31
|
-
-
|
33
|
+
- lib
|
32
34
|
- LICENSE
|
33
|
-
- README
|
34
35
|
- setup.rb
|
35
|
-
- test
|
36
36
|
- TODO
|
37
|
+
- CHANGES
|
38
|
+
- README
|
39
|
+
- genx4r.gemspec
|
40
|
+
- test/non-io.rb
|
41
|
+
- test/declare.rb
|
42
|
+
- test/basics.rb
|
43
|
+
- test/builder.rb
|
37
44
|
- ext/genx4r
|
38
45
|
- ext/genx4r/charProps.c
|
39
|
-
- ext/genx4r/extconf.rb
|
40
46
|
- ext/genx4r/genx.c
|
47
|
+
- ext/genx4r/MANIFEST
|
41
48
|
- ext/genx4r/genx.h
|
49
|
+
- ext/genx4r/extconf.rb
|
42
50
|
- ext/genx4r/genx4r.c
|
43
|
-
-
|
44
|
-
-
|
45
|
-
- test/declare.rb
|
46
|
-
- test/non-io.rb
|
51
|
+
- lib/genx4r
|
52
|
+
- lib/genx4r/builder.rb
|
47
53
|
test_files:
|
54
|
+
- test/non-io.rb
|
55
|
+
- test/declare.rb
|
48
56
|
- test/basics.rb
|
57
|
+
- test/builder.rb
|
49
58
|
rdoc_options: []
|
50
59
|
extra_rdoc_files: []
|
51
60
|
executables: []
|