ox 1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ox might be problematic. Click here for more details.

Files changed (52) hide show
  1. data/LICENSE +27 -0
  2. data/README +153 -0
  3. data/ext/ox/base64.c +123 -0
  4. data/ext/ox/base64.h +44 -0
  5. data/ext/ox/cache.c +148 -0
  6. data/ext/ox/cache.h +43 -0
  7. data/ext/ox/cache8.c +80 -0
  8. data/ext/ox/cache8.h +43 -0
  9. data/ext/ox/cache8_test.c +69 -0
  10. data/ext/ox/cache_test.c +69 -0
  11. data/ext/ox/dump.c +901 -0
  12. data/ext/ox/extconf.rb +7 -0
  13. data/ext/ox/gen_load.c +196 -0
  14. data/ext/ox/obj_load.c +802 -0
  15. data/ext/ox/ox.c +456 -0
  16. data/ext/ox/ox.h +190 -0
  17. data/ext/ox/parse.c +629 -0
  18. data/lib/ox.rb +97 -0
  19. data/lib/ox/cdata.rb +12 -0
  20. data/lib/ox/comment.rb +13 -0
  21. data/lib/ox/doctype.rb +13 -0
  22. data/lib/ox/document.rb +20 -0
  23. data/lib/ox/element.rb +67 -0
  24. data/lib/ox/node.rb +24 -0
  25. data/test/Sample.graffle +2318 -0
  26. data/test/cache16_test.rb +17 -0
  27. data/test/cache8_test.rb +17 -0
  28. data/test/cache_test.rb +17 -0
  29. data/test/files.rb +34 -0
  30. data/test/func.rb +228 -0
  31. data/test/gen_sample.rb +22 -0
  32. data/test/obj_sample.rb +19 -0
  33. data/test/ox/change.rb +16 -0
  34. data/test/ox/dir.rb +21 -0
  35. data/test/ox/doc.rb +39 -0
  36. data/test/ox/file.rb +33 -0
  37. data/test/ox/group.rb +18 -0
  38. data/test/ox/hasprops.rb +18 -0
  39. data/test/ox/layer.rb +14 -0
  40. data/test/ox/line.rb +22 -0
  41. data/test/ox/oval.rb +12 -0
  42. data/test/ox/rect.rb +12 -0
  43. data/test/ox/shape.rb +37 -0
  44. data/test/ox/text.rb +23 -0
  45. data/test/perf_gen.rb +193 -0
  46. data/test/perf_mars.rb +97 -0
  47. data/test/perf_obj.rb +201 -0
  48. data/test/perf_pod.rb +88 -0
  49. data/test/perf_write.rb +80 -0
  50. data/test/sample.rb +62 -0
  51. data/test/test.rb +70 -0
  52. metadata +106 -0
data/test/perf_obj.rb ADDED
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env ruby -wW1
2
+
3
+ $: << '.'
4
+ $: << '..'
5
+ $: << '../lib'
6
+ $: << '../ext'
7
+
8
+ if __FILE__ == $0
9
+ if (i = ARGV.index('-I'))
10
+ x,path = ARGV.slice!(i, 2)
11
+ $: << path
12
+ end
13
+ end
14
+
15
+ require 'optparse'
16
+ require 'ox'
17
+ require 'sample'
18
+ require 'test/ox/doc'
19
+ require 'files'
20
+
21
+ $verbose = 0
22
+ $ox_only = false
23
+ $circular = false
24
+
25
+ do_sample = false
26
+ do_files = false
27
+
28
+ do_load = false
29
+ do_dump = false
30
+ do_read = false
31
+ do_write = false
32
+ $iter = 1000
33
+
34
+ opts = OptionParser.new
35
+ opts.on("-v", "increase verbosity") { $verbose += 1 }
36
+
37
+ opts.on("-x", "ox only") { $ox_only = true }
38
+ opts.on("-c", "circular options") { $circular = true }
39
+
40
+ opts.on("-s", "load and dump as sample Ruby object") { do_sample = true }
41
+ opts.on("-f", "load and dump as files Ruby object") { do_files = true }
42
+
43
+ opts.on("-l", "load") { do_load = true }
44
+ opts.on("-d", "dump") { do_dump = true }
45
+ opts.on("-r", "read") { do_read = true }
46
+ opts.on("-w", "write") { do_write = true }
47
+ opts.on("-a", "load, dump, read and write") { do_load = true; do_dump = true; do_read = true; do_write = true }
48
+
49
+ opts.on("-i", "--iterations [Int]", Integer, "iterations") { |i| $iter = i }
50
+
51
+ opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
52
+ files = opts.parse(ARGV)
53
+
54
+ if files.empty?
55
+ data = []
56
+ obj = do_sample ? sample_doc(2) : files('..')
57
+ mars = Marshal.dump(obj)
58
+ xml = Ox.dump(obj, :indent => 0, circular: $circular)
59
+ File.open('sample.xml', 'w') { |f| f.write(xml) }
60
+ File.open('sample.marshal', 'w') { |f| f.write(mars) }
61
+ data << { :file => 'sample.xml', :obj => obj, :xml => xml, :marshal => mars }
62
+ else
63
+ puts "loading and parsing #{files}\n\n"
64
+ data = files.map do |f|
65
+ xml = File.read(f)
66
+ obj = Ox.load(xml);
67
+ mars = Marshal.dump(obj)
68
+ { :file => f, :obj => obj, :xml => xml, :marshal => mars }
69
+ end
70
+ end
71
+
72
+ $ox_load_time = 0
73
+ $mars_load_time = 0
74
+ $ox_dump_time = 0
75
+ $mars_dump_time = 0
76
+
77
+ def perf_load(d)
78
+ filename = d[:file]
79
+ marshal_filename = 'sample.marshal'
80
+ xml = d[:xml]
81
+ mars = d[:marshal]
82
+
83
+ if 0 < $verbose
84
+ obj = Ox.load(xml, :mode => :object, :trace => $verbose)
85
+ return
86
+ end
87
+ start = Time.now
88
+ (1..$iter).each do
89
+ obj = Ox.load(xml, :mode => :object)
90
+ end
91
+ $ox_load_time = Time.now - start
92
+ puts "Parsing #{$iter} times with Ox took #{$ox_load_time} seconds."
93
+
94
+ return if $ox_only
95
+
96
+ start = Time.now
97
+ (1..$iter).each do
98
+ obj = Marshal.load(mars)
99
+ end
100
+ $mars_load_time = Time.now - start
101
+ puts "Marshalling #{$iter} times took #{$mars_load_time} seconds."
102
+ puts ">>> Ox is %0.1f faster than Marshal loading.\n\n" % [$mars_load_time/$ox_load_time]
103
+ end
104
+
105
+ def perf_dump(d)
106
+ obj = d[:obj]
107
+
108
+ start = Time.now
109
+ (1..$iter).each do
110
+ xml = Ox.dump(obj, :indent => 2, :circular => $circular)
111
+ #puts "*** ox:\n#{xml}"
112
+ end
113
+ $ox_dump_time = Time.now - start
114
+ puts "Ox dumping #{$iter} times with ox took #{$ox_dump_time} seconds."
115
+
116
+ return if $ox_only
117
+
118
+ obj = d[:obj]
119
+ start = Time.now
120
+ (1..$iter).each do
121
+ m = Marshal.dump(obj)
122
+ end
123
+ $mars_dump_time = Time.now - start
124
+ puts "Marshal dumping #{$iter} times took #{$mars_dump_time} seconds."
125
+ puts ">>> Ox is %0.1f faster than Marshal dumping.\n\n" % [$mars_dump_time/$ox_dump_time]
126
+ end
127
+
128
+ def perf_read(d)
129
+ ox_read_time = 0
130
+ mars_read_time = 0
131
+
132
+ filename = d[:file]
133
+ marshal_filename = 'sample.marshal'
134
+ xml = d[:xml]
135
+ mars = d[:marshal]
136
+
137
+ # now load from the file
138
+ start = Time.now
139
+ (1..$iter).each do
140
+ obj = Ox.load_file(filename, :mode => :object)
141
+ end
142
+ ox_read_time = Time.now - start
143
+ puts "Loading and parsing #{$iter} times with ox took #{ox_read_time} seconds."
144
+
145
+ if !$ox_only
146
+ start = Time.now
147
+ (1..$iter).each do
148
+ m = File.read(marshal_filename)
149
+ obj = Marshal.load(m)
150
+ end
151
+ mars_read_time = Time.now - start
152
+ puts "Reading and marshalling #{$iter} times took #{mars_read_time} seconds."
153
+ puts ">>> Ox is %0.1f faster than Marshal loading and parsing.\n\n" % [mars_read_time/ox_read_time]
154
+
155
+ end
156
+ end
157
+
158
+ def perf_write(d)
159
+ ox_write_time = 0
160
+ mars_write_time = 0
161
+
162
+ ox_filename = 'out.xml'
163
+ marshal_filename = 'out.marshal'
164
+ obj = d[:obj]
165
+
166
+ start = Time.now
167
+ (1..$iter).each do
168
+ xml = Ox.to_file(ox_filename, obj, :indent => 0)
169
+ end
170
+ ox_write_time = Time.now - start
171
+ puts "Ox dumping #{$iter} times with ox took #{ox_write_time} seconds."
172
+
173
+ if !$ox_only
174
+ start = Time.now
175
+ (1..$iter).each do
176
+ m = Marshal.dump(obj, circular: $circular)
177
+ File.open(marshal_filename, "w") { |f| f.write(m) }
178
+ end
179
+ mars_write_time = Time.now - start
180
+ puts "Marshal dumping and writing #{$iter} times took #{mars_write_time} seconds."
181
+ puts ">>> Ox is %0.1f faster than Marshal dumping.\n\n" % [mars_write_time/ox_write_time]
182
+
183
+ end
184
+ end
185
+
186
+ #if do_sample or do_files
187
+ data.each do |d|
188
+ puts "Using file #{d[:file]}."
189
+
190
+ perf_load(d) if do_load
191
+ perf_dump(d) if do_dump
192
+ if do_load and do_dump
193
+ puts ">>> Ox is %0.1f faster than Marshal dumping and loading.\n\n" % [($mars_load_time + $mars_dump_time)/($ox_load_time + $ox_dump_time)] unless 0 == $mars_load_time
194
+ end
195
+
196
+ perf_read(d) if do_read
197
+ perf_write(d) if do_write
198
+
199
+ end
200
+ #end
201
+
data/test/perf_pod.rb ADDED
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env ruby -wW1
2
+
3
+ $: << '.'
4
+ $: << '..'
5
+ $: << '../lib'
6
+ $: << '../ext'
7
+
8
+ if __FILE__ == $0
9
+ if (i = ARGV.index('-I'))
10
+ x,path = ARGV.slice!(i, 2)
11
+ $: << path
12
+ end
13
+ end
14
+
15
+ require 'optparse'
16
+ require 'ox'
17
+ require 'pod/cfg'
18
+ require 'pod/xml'
19
+
20
+ $verbose = 0
21
+ $use_opt_format = false
22
+
23
+ do_load = false
24
+ do_dump = false
25
+
26
+ opts = OptionParser.new
27
+ opts.on("-v", "increase verbosity") { $verbose += 1 }
28
+ opts.on("-o", "optimized format") { $use_opt_format = true }
29
+ opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
30
+ files = opts.parse(ARGV)
31
+
32
+
33
+ $ox_load_time = 0
34
+ $opt_load_time = 0
35
+ $no_load_time = 0
36
+ $ox_dump_time = 0
37
+ $no_dump_time = 0
38
+
39
+ files = Dir.glob('data/**/*.xml')
40
+ xml_data = files.map { |f| File.read(f) }
41
+
42
+ objs = []
43
+ start = Time.now
44
+ xml_data.each do |xml|
45
+ objs << Ox.load(xml, :mode => :object, :trace => 0)
46
+ end
47
+ $ox_load_time = Time.now - start
48
+ puts "Loading #{files.size} files with Ox took #{$ox_load_time} seconds."
49
+
50
+ start = Time.now
51
+ objs.each do |o|
52
+ xml = Ox.dump(o, :opt_format => $use_opt_format, :indent => 0)
53
+ end
54
+ $ox_dump_time = Time.now - start
55
+ puts "Dumping #{files.size} files with Ox took #{$ox_dump_time} seconds."
56
+
57
+
58
+ opt_data = objs.map { |o| Ox.dump(o, :opt_format => $use_opt_format, :indent => 0) }
59
+ mode = $use_opt_format ? :optimized : :object
60
+ objs = []
61
+ start = Time.now
62
+ opt_data.each do |xml|
63
+ objs << Ox.load(xml, :mode => mode, :trace => 0)
64
+ end
65
+ $opt_load_time = Time.now - start
66
+ puts "Loading #{files.size} files with Optimized Ox took #{$opt_load_time} seconds.\n\n"
67
+
68
+
69
+ objs = []
70
+ start = Time.now
71
+ xml_data.each do |xml|
72
+ objs << ::Pod::Xml.to_obj(xml)
73
+ end
74
+ $no_load_time = Time.now - start
75
+ puts "Loading Pod::Xml #{files.size} files took #{$no_load_time} seconds."
76
+
77
+ start = Time.now
78
+ objs.each do |o|
79
+ xml = ::Pod::Xml.to_xml(o)
80
+ end
81
+ $no_dump_time = Time.now - start
82
+ puts "Dumping #{files.size} files with Pod::Xml took #{$no_dump_time} seconds.\n\n"
83
+
84
+ puts ">>> Ox is %0.1f faster than Pod::Xml loading." % [$no_load_time/$ox_load_time]
85
+ puts ">>> Optimized Ox is %0.1f faster than Pod::Xml loading." % [$no_load_time/$opt_load_time]
86
+ puts ">>> Ox is %0.1f faster than Pod::Xml dumping.\n\n" % [$no_dump_time/$ox_dump_time]
87
+
88
+ puts ">>> Ox is %0.1f faster than Pod::Xml dumping and loading." % [($no_dump_time + $no_load_time)/($ox_dump_time + $opt_load_time)]
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby -wW1
2
+
3
+ $: << '.'
4
+
5
+ if __FILE__ == $0
6
+ if (i = ARGV.index('-I'))
7
+ x,path = ARGV.slice!(i, 2)
8
+ $: << path
9
+ end
10
+ end
11
+
12
+ require 'optparse'
13
+ require 'pp'
14
+ require 'nokogiri'
15
+ require 'ox'
16
+
17
+ ox_only = false
18
+ it = 1000
19
+
20
+ opts = OptionParser.new
21
+ opts.on("-x", "ox only") { ox_only = true }
22
+ opts.on("-i", "--iterations [Int]", Integer, "iterations") { |i| it = i }
23
+ opts.on("-h", "--help", "Show this display") { puts opts }
24
+ files = opts.parse(ARGV)
25
+
26
+ obj = nil
27
+
28
+ puts "to String and writing #{files}\n\n"
29
+
30
+ data = files.map do |f|
31
+ ox_obj = Ox.parse_file(f)
32
+ xml = File.read(f)
33
+ no_obj = Nokogiri::XML::Document.parse(xml, nil, nil, Nokogiri::XML::ParseOptions::DEFAULT_XML | Nokogiri::XML::ParseOptions::NOBLANKS)
34
+ [f, ox_obj, no_obj]
35
+ end
36
+
37
+ start = Time.now
38
+ data.each do |d|
39
+ (1..it).each do
40
+ xml = d[1].to_s
41
+ end
42
+ end
43
+ ox_time = Time.now - start
44
+ puts "to String #{it} times with ox took #{ox_time} seconds."
45
+
46
+ #puts obj.to_s
47
+
48
+ =begin
49
+ start = Time.now
50
+ data.each do |d|
51
+ (1..it).each do
52
+ xml = d[1].to_s
53
+ end
54
+ end
55
+ ox_time = Time.now - start
56
+ puts "to file #{it} times with ox took #{ox_time} seconds.\n\n"
57
+ =end
58
+ if !ox_only
59
+
60
+ start = Time.now
61
+ data.each do |d|
62
+ (1..it).each do
63
+ xml = d[2].to_s
64
+ end
65
+ end
66
+ no_time = Time.now - start
67
+ puts "to String #{it} times with nokogiri took #{no_time} seconds."
68
+ =begin
69
+ start = Time.now
70
+ data.each do |d|
71
+ xml = d[1]
72
+ (1..it).each do
73
+ xml = d[2].to_s
74
+ end
75
+ end
76
+ no_time = Time.now - start
77
+ puts "to file #{it} times with nokogiri took #{no_time} seconds.\n\n"
78
+ =end
79
+ puts "Ox is %0.1f faster than Nokogiri" % [no_time/ox_time]
80
+ end
data/test/sample.rb ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby -wW2
2
+
3
+ if $0 == __FILE__
4
+ $: << '.'
5
+ $: << '..'
6
+ $: << '../lib'
7
+ $: << '../ext'
8
+ end
9
+
10
+ require 'pp'
11
+ require 'ox'
12
+ require 'test/ox/doc'
13
+
14
+
15
+ def sample_doc(size=3)
16
+ colors = [ :black, :gray, :white, :red, :blue, :yellow, :green, :purple, :orange ]
17
+
18
+ d = ::Test::Ox::Doc.new('Sample')
19
+
20
+ # add some history
21
+ (0..size * 10).each do |i|
22
+ d.add_change("Changed at t+#{i}.")
23
+ end
24
+
25
+ # add some layers
26
+ (1..size).each do |i|
27
+ layer = ::Test::Ox::Layer.new("Layer-#{i}")
28
+ (1..size).each do |j|
29
+ g = ::Test::Ox::Group.new
30
+ (1..size).each do |k|
31
+ g2 = ::Test::Ox::Group.new
32
+ r = ::Test::Ox::Rect.new(j * 40 + 10.0, i * 10.0,
33
+ 10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
34
+ r.add_prop(:part_of, layer.name)
35
+ g2 << r
36
+ g2 << ::Test::Ox::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
37
+ g << g2
38
+ end
39
+ g2 = ::Test::Ox::Group.new
40
+ (1..size).each do |k|
41
+ o = ::Test::Ox::Oval.new(j * 40 + 12.0, i * 10.0 + 2.0,
42
+ 6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
43
+ o.add_prop(:inside, true)
44
+ g << o
45
+ end
46
+ g << g2
47
+ layer << g
48
+ end
49
+ d.layers[layer.name] = layer
50
+ end
51
+
52
+ # some properties
53
+ d.add_prop(:purpose, 'an example')
54
+
55
+ #pp d
56
+ #Ox.dump(d, :indent => 0)
57
+ d
58
+ end
59
+
60
+ if $0 == __FILE__
61
+ File.open('foo.xml', "w") { |f| f.write(Ox.dump(sample_doc(3), :indent => 2)) }
62
+ end
data/test/test.rb ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby -wW1
2
+
3
+ $: << '.'
4
+ $: << 'lib'
5
+ $: << 'ext'
6
+
7
+ if __FILE__ == $0
8
+ if (i = ARGV.index('-I'))
9
+ x,path = ARGV.slice!(i, 2)
10
+ $: << path
11
+ end
12
+ end
13
+
14
+ require 'optparse'
15
+ require 'pp'
16
+ require 'ox'
17
+
18
+ opts = OptionParser.new
19
+ opts.on("-v", "--verbose", "display parse information") { Ox.debug = Ox.debug + 1 }
20
+ opts.on("-h", "--help", "Show this display") { puts opts }
21
+ files = opts.parse(ARGV)
22
+
23
+ module Park
24
+ class Animal
25
+ def initialize
26
+ @type = nil
27
+ end
28
+ end
29
+
30
+ class Zoo
31
+
32
+ def self.create(n)
33
+ z = self.new
34
+ z.lion = n
35
+ z.tiger = n * 2
36
+ x
37
+ end
38
+
39
+ def initialize
40
+ @lion = nil
41
+ @tiger = nil
42
+ @bear = nil
43
+ @oh_my = nil
44
+ @oh_pi = nil
45
+ @big_guy = nil
46
+ @tea_time = nil
47
+ @minutes = nil
48
+ @empty = nil
49
+ @mixed = nil
50
+ @clueless = nil
51
+ @clues = nil
52
+ @nest = nil
53
+ @bb = "<base64>"
54
+ @roar = (3..7)
55
+ end
56
+
57
+ end # Zoo
58
+ end # Park
59
+
60
+ files.each do |f|
61
+ puts "parsing #{f}"
62
+ obj = Ox.file_to_obj(f)
63
+ puts "result:"
64
+ pp obj
65
+ #puts "***\n#{obj.instance_variable_get(:@raw)}***"
66
+ obj.instance_variable_set(:@roar, (3..7))
67
+ #Ox.to_file(obj, "foo.xml")
68
+ s = Ox.dump(obj, :indent => -1)
69
+ puts s
70
+ end