ox 1.4.6 → 1.5.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.

@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby -wW1
2
2
 
3
3
  $: << '.'
4
- $: << '..'
5
4
  $: << '../lib'
6
5
  $: << '../ext'
7
6
 
@@ -14,13 +13,13 @@ end
14
13
 
15
14
  require 'optparse'
16
15
  require 'ox'
16
+ require 'oj'
17
+ require 'perf'
17
18
  require 'sample'
18
- require 'test/ox/doc'
19
19
  require 'files'
20
20
 
21
- $verbose = 0
22
- $ox_only = false
23
21
  $circular = false
22
+ $indent = 0
24
23
 
25
24
  do_sample = false
26
25
  do_files = false
@@ -32,9 +31,6 @@ do_write = false
32
31
  $iter = 1000
33
32
 
34
33
  opts = OptionParser.new
35
- opts.on("-v", "increase verbosity") { $verbose += 1 }
36
-
37
- opts.on("-x", "ox only") { $ox_only = true }
38
34
  opts.on("-c", "circular options") { $circular = true }
39
35
 
40
36
  opts.on("-s", "load and dump as sample Ruby object") { do_sample = true }
@@ -51,151 +47,78 @@ opts.on("-i", "--iterations [Int]", Integer, "iterations") { |i| $iter = i }
51
47
  opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
52
48
  files = opts.parse(ARGV)
53
49
 
50
+ $obj = nil
51
+ $xml = nil
52
+ $mars = nil
53
+ $json = nil
54
+
55
+ unless do_load || do_dump || do_read || do_write
56
+ do_load = true
57
+ do_dump = true
58
+ do_read = true
59
+ do_write = true
60
+ end
61
+
62
+ # prepare all the formats for input
54
63
  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 }
64
+ $obj = do_sample ? sample_doc(2) : files('..')
65
+ $mars = Marshal.dump($obj)
66
+ $xml = Ox.dump($obj, :indent => $indent, circular: $circular)
67
+ $json = Oj.dump($obj, :indent => $indent, circular: $circular)
68
+ File.open('sample.xml', 'w') { |f| f.write($xml) }
69
+ File.open('sample.json', 'w') { |f| f.write($json) }
70
+ File.open('sample.marshal', 'w') { |f| f.write($mars) }
62
71
  else
63
72
  puts "loading and parsing #{files}\n\n"
73
+ # TBD change to allow xml and json
64
74
  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 }
75
+ $xml = File.read(f)
76
+ $obj = Ox.load($xml);
77
+ $mars = Marshal.dump($obj)
78
+ $json = Oj.dump($obj, :indent => $indent, circular: $circular)
69
79
  end
70
80
  end
71
81
 
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
+ Oj.default_options = { :mode => :object, :indent => $indent }
82
83
 
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]
84
+ if do_load
85
+ puts '-' * 80
86
+ puts "Load Performance"
87
+ perf = Perf.new()
88
+ perf.add('Ox', 'load') { Ox.load($xml, :mode => :object) }
89
+ perf.add('Oj', 'load') { Oj.load($json) }
90
+ perf.add('Marshal', 'load') { Marshal.load($mars) }
91
+ perf.run($iter)
103
92
  end
104
93
 
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]
94
+ if do_dump
95
+ puts '-' * 80
96
+ puts "Dump Performance"
97
+ perf = Perf.new()
98
+ perf.add('Ox', 'dump') { Ox.dump($obj, :indent => $indent, :circular => $circular) }
99
+ perf.add('Oj', 'dump') { Oj.dump($obj) }
100
+ perf.add('Marshal', 'dump') { Marshal.dump($obj) }
101
+ perf.run($iter)
126
102
  end
127
103
 
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
104
+ if do_read
105
+ puts '-' * 80
106
+ puts "Read from file Performance"
107
+ perf = Perf.new()
108
+ perf.add('Ox', 'load_file') { Ox.load_file('sample.xml', :mode => :object) }
109
+ perf.add('Oj', 'load') { Oj.load_file('sample.json') }
110
+ perf.add('Marshal', 'load') { Marshal.load(File.new('sample.marshal')) }
111
+ perf.run($iter)
156
112
  end
157
113
 
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
114
+ if do_write
115
+ puts '-' * 80
116
+ puts "Write to file Performance"
117
+ perf = Perf.new()
118
+ perf.add('Ox', 'to_file') { Ox.to_file('sample.xml', $obj, :indent => $indent, :circular => $circular) }
119
+ perf.add('Oj', 'to_file') { Oj.to_file('sample.json', $obj) }
120
+ perf.add('Marshal', 'dump') { Marshal.dump($obj, File.new('sample.marshal', 'w')) }
121
+ perf.run($iter)
184
122
  end
185
123
 
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
124
 
@@ -8,14 +8,13 @@ if $0 == __FILE__
8
8
  end
9
9
 
10
10
  require 'pp'
11
- require 'ox'
12
- require 'test/ox/doc'
11
+ require 'sample/doc'
13
12
 
14
13
 
15
14
  def sample_doc(size=3)
16
15
  colors = [ :black, :gray, :white, :red, :blue, :yellow, :green, :purple, :orange ]
17
16
 
18
- d = ::Test::Ox::Doc.new('Sample')
17
+ d = ::Sample::Doc.new('Sample')
19
18
 
20
19
  # add some history
21
20
  (0..size * 10).each do |i|
@@ -24,21 +23,21 @@ def sample_doc(size=3)
24
23
 
25
24
  # add some layers
26
25
  (1..size).each do |i|
27
- layer = ::Test::Ox::Layer.new("Layer-#{i}")
26
+ layer = ::Sample::Layer.new("Layer-#{i}")
28
27
  (1..size).each do |j|
29
- g = ::Test::Ox::Group.new
28
+ g = ::Sample::Group.new
30
29
  (1..size).each do |k|
31
- g2 = ::Test::Ox::Group.new
32
- r = ::Test::Ox::Rect.new(j * 40 + 10.0, i * 10.0,
30
+ g2 = ::Sample::Group.new
31
+ r = ::Sample::Rect.new(j * 40 + 10.0, i * 10.0,
33
32
  10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
34
33
  r.add_prop(:part_of, layer.name)
35
34
  g2 << r
36
- g2 << ::Test::Ox::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
35
+ g2 << ::Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
37
36
  g << g2
38
37
  end
39
- g2 = ::Test::Ox::Group.new
38
+ g2 = ::Sample::Group.new
40
39
  (1..size).each do |k|
41
- o = ::Test::Ox::Oval.new(j * 40 + 12.0, i * 10.0 + 2.0,
40
+ o = ::Sample::Oval.new(j * 40 + 12.0, i * 10.0 + 2.0,
42
41
  6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
43
42
  o.add_prop(:inside, true)
44
43
  g << o
@@ -52,11 +51,5 @@ def sample_doc(size=3)
52
51
  # some properties
53
52
  d.add_prop(:purpose, 'an example')
54
53
 
55
- #pp d
56
- #Ox.dump(d, :indent => 0)
57
54
  d
58
55
  end
59
-
60
- if $0 == __FILE__
61
- File.open('foo.xml', "w") { |f| f.write(Ox.dump(sample_doc(3), :indent => 2)) }
62
- end
@@ -0,0 +1,14 @@
1
+
2
+ module Sample
3
+ class Change
4
+ attr_accessor :time
5
+ attr_accessor :user
6
+ attr_accessor :comment
7
+
8
+ def initialize(comment=nil, time=nil, user=nil)
9
+ @user = user || ENV['USER']
10
+ @time = time || Time.now
11
+ @comment = comment
12
+ end
13
+ end # Change
14
+ end # Sample
@@ -0,0 +1,19 @@
1
+
2
+ require 'etc'
3
+
4
+ module Sample
5
+
6
+ class Dir < File
7
+ attr_accessor :files
8
+
9
+ def initialize(filename)
10
+ super
11
+ @files = []
12
+ end
13
+
14
+ def <<(f)
15
+ @files << f
16
+ end
17
+
18
+ end # Dir
19
+ end # Sample
@@ -0,0 +1,36 @@
1
+
2
+ require 'sample/hasprops'
3
+ require 'sample/group'
4
+ require 'sample/layer'
5
+ require 'sample/line'
6
+ require 'sample/shape'
7
+ require 'sample/oval'
8
+ require 'sample/rect'
9
+ require 'sample/text'
10
+ require 'sample/change'
11
+
12
+ module Sample
13
+ class Doc
14
+ include HasProps
15
+
16
+ attr_accessor :title
17
+ attr_accessor :create_time
18
+ attr_accessor :user
19
+ # Hash of layers in the document indexed by layer name.
20
+ attr_reader :layers
21
+ attr_reader :change_history
22
+
23
+ def initialize(title)
24
+ @title = title
25
+ @user = ENV['USER']
26
+ @create_time = Time.now
27
+ @layers = { }
28
+ @change_history = []
29
+ end
30
+
31
+ def add_change(comment, time=nil, user=nil)
32
+ @change_history << Change.new(comment, time, user)
33
+ end
34
+
35
+ end # Doc
36
+ end # Sample
@@ -0,0 +1,48 @@
1
+
2
+ require 'etc'
3
+
4
+ module Sample
5
+
6
+ class File
7
+ attr_accessor :name, :ctime, :mtime, :size, :owner, :group, :permissions
8
+
9
+ def initialize(filename)
10
+ @name = ::File.basename(filename)
11
+ stat = ::File.stat(filename)
12
+ @ctime = stat.ctime
13
+ @mtime = stat.mtime
14
+ @size = stat.size
15
+ @owner = Etc.getpwuid(stat.uid).name
16
+ @group = Etc.getgrgid(stat.gid).name
17
+ if false
18
+ @permissions = {
19
+ 'user' => {
20
+ 'read' => (0 != (stat.mode & 0x0100)),
21
+ 'write' => (0 != (stat.mode & 0x0080)),
22
+ 'execute' => (0 != (stat.mode & 0x0040))},
23
+ 'group' => {
24
+ 'read' => (0 != (stat.mode & 0x0020)),
25
+ 'write' => (0 != (stat.mode & 0x0010)),
26
+ 'execute' => (0 != (stat.mode & 0x0008))},
27
+ 'other' => {
28
+ 'read' => (0 != (stat.mode & 0x0004)),
29
+ 'write' => (0 != (stat.mode & 0x0002)),
30
+ 'execute' => (0 != (stat.mode & 0x0001))}
31
+ }
32
+ else
33
+ @permissions = {
34
+ 'user' => [(0 != (stat.mode & 0x0100)) ? 'r' : '-',
35
+ (0 != (stat.mode & 0x0080)) ? 'w' : '-',
36
+ (0 != (stat.mode & 0x0040)) ? 'x' : '-'].join(''),
37
+ 'group' => [(0 != (stat.mode & 0x0020)) ? 'r' : '-',
38
+ (0 != (stat.mode & 0x0010)) ? 'w' : '-',
39
+ (0 != (stat.mode & 0x0008)) ? 'x' : '-'].join(''),
40
+ 'other' => [(0 != (stat.mode & 0x0004)) ? 'r' : '-',
41
+ (0 != (stat.mode & 0x0002)) ? 'w' : '-',
42
+ (0 != (stat.mode & 0x0001)) ? 'x' : '-'].join('')
43
+ }
44
+ end
45
+ end
46
+
47
+ end # File
48
+ end # Sample
@@ -0,0 +1,16 @@
1
+
2
+ module Sample
3
+ class Group
4
+ attr_reader :members
5
+
6
+ def initialize()
7
+ @members = []
8
+ end
9
+
10
+ def <<(member)
11
+ @members << member
12
+ end
13
+
14
+ end # Group
15
+ end # Sample
16
+
@@ -0,0 +1,16 @@
1
+
2
+ module Sample
3
+ module HasProps
4
+
5
+ def add_prop(key, value)
6
+ @props = { } unless self.instance_variable_defined?(:@props)
7
+ @props[key] = value
8
+ end
9
+
10
+ def props
11
+ @props = { } unless self.instance_variable_defined?(:@props)
12
+ @props
13
+ end
14
+
15
+ end # HasProps
16
+ end # Sample