tracksperanto 2.6.3 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -73,7 +73,7 @@ class PFTrackImportTest < Test::Unit::TestCase
73
73
  def test_stereoscopy
74
74
  fixture = File.open(File.dirname(__FILE__) + '/samples/pftrack5/stereo.2dt')
75
75
  parser = Tracksperanto::Import::PFTrack.new(:io => fixture, :width => 1920, :height => 1080)
76
- acc = Tracksperanto::Accumulator.new
76
+ acc = Obuf.new
77
77
  parser.each{|t| acc << t }
78
78
 
79
79
  assert_equal 1690, acc.size, "Should have recovered 1690 trackers"
@@ -5,7 +5,7 @@ class ShakeTextImportTest < Test::Unit::TestCase
5
5
 
6
6
  def test_introspects_properly
7
7
  i = Tracksperanto::Import::ShakeText
8
- assert_equal "Shake .txt tracker file", i.human_name
8
+ assert_equal "Shake .txt tracker file and Nuke CameraTracker auto tracks export", i.human_name
9
9
  assert !i.autodetects_size?
10
10
  end
11
11
 
@@ -48,4 +48,24 @@ class ShakeTextImportTest < Test::Unit::TestCase
48
48
  t2 = trackers[-1]
49
49
  assert_equal "track2", t2.name
50
50
  end
51
+
52
+ def test_parsing_from_nuke_camera_tracker
53
+ fixture = File.open(File.dirname(__FILE__) + '/samples/shake_text/nuke_camtracker.txt')
54
+ trackers = Tracksperanto::Import::ShakeText.new(:io => fixture).to_a
55
+
56
+ assert_kind_of Enumerable, trackers
57
+ assert_equal 261, trackers.length
58
+
59
+ t = trackers[0]
60
+
61
+ assert_equal "autotrack0", t.name
62
+ assert_kind_of Tracksperanto::Tracker, t
63
+ assert_equal 11, t.keyframes.length
64
+
65
+ second_kf = t.keyframes[1]
66
+ assert_in_delta 1, second_kf.frame, DELTA
67
+
68
+ t2 = trackers[-1]
69
+ assert_equal "autotrack260", t2.name
70
+ end
51
71
  end
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/helper'
2
+
3
+ class TestBufferingReader < Test::Unit::TestCase
4
+ def test_reads_once
5
+ s = StringIO.new("This is a string")
6
+
7
+ reader = Tracksperanto::BufferingReader.new(s)
8
+ assert_equal "T", reader.read_one_byte
9
+ assert_equal "h", reader.read_one_byte
10
+ assert !reader.data_exhausted?
11
+ end
12
+
13
+ def test_reads_set_buffer_size
14
+ s = StringIO.new("abcd")
15
+ flexmock(s).should_receive(:read).with(4).once.and_return("abcd")
16
+ reader = Tracksperanto::BufferingReader.new(s, 4)
17
+ reader.read_one_byte
18
+ end
19
+
20
+ def test_reads_in_10kb_chunks_by_default
21
+ s = StringIO.new("abcd")
22
+ flexmock(s).should_receive(:read).with(10240).once.and_return("abcd")
23
+ reader = Tracksperanto::BufferingReader.new(s)
24
+ reader.read_one_byte
25
+ end
26
+
27
+ def test_eof_with_empty
28
+ s = StringIO.new
29
+ reader = Tracksperanto::BufferingReader.new(s)
30
+ assert s.eof?
31
+ end
32
+
33
+ def test_eof_with_io_at_eof
34
+ s = StringIO.new("foo")
35
+ s.read(3)
36
+ reader = Tracksperanto::BufferingReader.new(s)
37
+ assert reader.data_exhausted?
38
+ end
39
+
40
+ def test_eof_with_string_to_size
41
+ s = "Foobarboo another"
42
+ s = StringIO.new(s)
43
+ reader = Tracksperanto::BufferingReader.new(s, 1)
44
+ s.length.times { reader.read_one_byte }
45
+ assert reader.data_exhausted?
46
+ end
47
+ end
@@ -52,8 +52,8 @@ class PipelineTest < Test::Unit::TestCase
52
52
 
53
53
  pipeline = Tracksperanto::Pipeline::Base.new(:progress_block => accum)
54
54
  assert_nothing_raised { pipeline.run(@stabilizer) }
55
- reference = File.read(File.dirname(__FILE__) + "/fixtures/processing_log.txt")
56
- assert_equal reference, processing_log, "The log output should be the same"
55
+ assert processing_log.include?("Parsing the file")
56
+ assert processing_log.include?("Parsing channel \"tracker1/ref/y\"")
57
57
  end
58
58
 
59
59
  def test_run_crashes_with_empty_file
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: tracksperanto
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 2.6.3
5
+ version: 2.7.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Julik Tarkhanov
@@ -10,74 +10,96 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-31 00:00:00 Z
13
+ date: 2011-10-12 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: flame_channel_parser
16
+ name: obuf
17
17
  prerelease: false
18
18
  requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: "1.0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: progressive_io
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: "1.0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: flame_channel_parser
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
19
41
  none: false
20
42
  requirements:
21
43
  - - "="
22
44
  - !ruby/object:Gem::Version
23
45
  version: 2.2.1
24
46
  type: :runtime
25
- version_requirements: *id001
47
+ version_requirements: *id003
26
48
  - !ruby/object:Gem::Dependency
27
49
  name: progressbar
28
50
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
51
+ requirement: &id004 !ruby/object:Gem::Requirement
30
52
  none: false
31
53
  requirements:
32
54
  - - ~>
33
55
  - !ruby/object:Gem::Version
34
56
  version: "0.9"
35
57
  type: :runtime
36
- version_requirements: *id002
58
+ version_requirements: *id004
37
59
  - !ruby/object:Gem::Dependency
38
60
  name: update_hints
39
61
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
62
+ requirement: &id005 !ruby/object:Gem::Requirement
41
63
  none: false
42
64
  requirements:
43
65
  - - ~>
44
66
  - !ruby/object:Gem::Version
45
67
  version: "1.0"
46
68
  type: :runtime
47
- version_requirements: *id003
69
+ version_requirements: *id005
48
70
  - !ruby/object:Gem::Dependency
49
71
  name: flexmock
50
72
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
73
+ requirement: &id006 !ruby/object:Gem::Requirement
52
74
  none: false
53
75
  requirements:
54
76
  - - ~>
55
77
  - !ruby/object:Gem::Version
56
78
  version: "0.8"
57
79
  type: :development
58
- version_requirements: *id004
80
+ version_requirements: *id006
59
81
  - !ruby/object:Gem::Dependency
60
82
  name: cli_test
61
83
  prerelease: false
62
- requirement: &id005 !ruby/object:Gem::Requirement
84
+ requirement: &id007 !ruby/object:Gem::Requirement
63
85
  none: false
64
86
  requirements:
65
87
  - - ~>
66
88
  - !ruby/object:Gem::Version
67
89
  version: "1.0"
68
90
  type: :development
69
- version_requirements: *id005
91
+ version_requirements: *id007
70
92
  - !ruby/object:Gem::Dependency
71
93
  name: hoe
72
94
  prerelease: false
73
- requirement: &id006 !ruby/object:Gem::Requirement
95
+ requirement: &id008 !ruby/object:Gem::Requirement
74
96
  none: false
75
97
  requirements:
76
98
  - - ~>
77
99
  - !ruby/object:Gem::Version
78
100
  version: "2.10"
79
101
  type: :development
80
- version_requirements: *id006
102
+ version_requirements: *id008
81
103
  description: Tracksperanto is a universal 2D-track translator between many apps.
82
104
  email:
83
105
  - me@julik.nl
@@ -145,16 +167,15 @@ files:
145
167
  - lib/middleware/start_trim.rb
146
168
  - lib/pipeline/base.rb
147
169
  - lib/tracksperanto.rb
148
- - lib/tracksperanto/accumulator.rb
149
170
  - lib/tracksperanto/block_init.rb
150
171
  - lib/tracksperanto/buffer_io.rb
172
+ - lib/tracksperanto/buffering_reader.rb
151
173
  - lib/tracksperanto/casts.rb
152
174
  - lib/tracksperanto/const_name.rb
153
175
  - lib/tracksperanto/ext_io.rb
154
176
  - lib/tracksperanto/flame_builder.rb
155
177
  - lib/tracksperanto/format_detector.rb
156
178
  - lib/tracksperanto/keyframe.rb
157
- - lib/tracksperanto/progressive_io.rb
158
179
  - lib/tracksperanto/returning.rb
159
180
  - lib/tracksperanto/safety.rb
160
181
  - lib/tracksperanto/simple_export.rb
@@ -188,7 +209,6 @@ files:
188
209
  - test/export/test_pftrack_export.rb
189
210
  - test/export/test_shake_export.rb
190
211
  - test/export/test_syntheyes_export.rb
191
- - test/fixtures/processing_log.txt
192
212
  - test/helper.rb
193
213
  - test/import/samples/3de_v3/3de_export_v3.txt
194
214
  - test/import/samples/3de_v4/3de_export_cube.txt
@@ -229,6 +249,7 @@ files:
229
249
  - test/import/samples/shake_script/three_tracks_in_one_stabilizer.shk
230
250
  - test/import/samples/shake_script/track.shk
231
251
  - test/import/samples/shake_script/two_tracks_in_one_tracker.shk
252
+ - test/import/samples/shake_text/nuke_camtracker.txt
232
253
  - test/import/samples/shake_text/one_shake_tracker.txt
233
254
  - test/import/samples/shake_text/one_shake_tracker_from_first.txt
234
255
  - test/import/samples/shake_text/two_shake_trackers.txt
@@ -262,8 +283,8 @@ files:
262
283
  - test/middleware/test_shift_middleware.rb
263
284
  - test/middleware/test_slip_middleware.rb
264
285
  - test/middleware/test_start_trim_middleware.rb
265
- - test/test_accumulator.rb
266
286
  - test/test_buffer_io.rb
287
+ - test/test_bufferingreader.rb
267
288
  - test/test_cli.rb
268
289
  - test/test_const_name.rb
269
290
  - test/test_extio.rb
@@ -271,7 +292,6 @@ files:
271
292
  - test/test_format_detector.rb
272
293
  - test/test_keyframe.rb
273
294
  - test/test_pipeline.rb
274
- - test/test_progressive_io.rb
275
295
  - test/test_simple_export.rb
276
296
  - test/test_tracker.rb
277
297
  - test/test_tracksperanto.rb
@@ -343,8 +363,8 @@ test_files:
343
363
  - test/middleware/test_shift_middleware.rb
344
364
  - test/middleware/test_slip_middleware.rb
345
365
  - test/middleware/test_start_trim_middleware.rb
346
- - test/test_accumulator.rb
347
366
  - test/test_buffer_io.rb
367
+ - test/test_bufferingreader.rb
348
368
  - test/test_cli.rb
349
369
  - test/test_const_name.rb
350
370
  - test/test_extio.rb
@@ -352,7 +372,6 @@ test_files:
352
372
  - test/test_format_detector.rb
353
373
  - test/test_keyframe.rb
354
374
  - test/test_pipeline.rb
355
- - test/test_progressive_io.rb
356
375
  - test/test_simple_export.rb
357
376
  - test/test_tracker.rb
358
377
  - test/test_tracksperanto.rb
@@ -1,103 +0,0 @@
1
- # An accumulator buffer for Ruby objects. Use it to sequentially store a shitload
2
- # of objects on disk and then retreive them one by one. Make sure to call clear when done
3
- # with it to discard the stored blob. It can be used like a disk-based object buffer.
4
- # (Tracksperanto stores parsed trackers into it)
5
- #
6
- # a = Tracksperanto::Accumulator.new
7
- # parse_big_file do | one_node |
8
- # a.push(one_node)
9
- # end
10
- #
11
- # a.size #=> 30932 # We've stored 30 thousand objects on disk without breaking a sweat
12
- # a.each do | node_read_from_disk |
13
- # # do something with node that has been recovered from disk
14
- # end
15
- #
16
- # a.clear # ensure that the file is deleted
17
- class Tracksperanto::Accumulator
18
- include Enumerable
19
-
20
- DELIM = "\n"
21
-
22
- # Returns the number of objects stored so far
23
- attr_reader :size
24
-
25
- def initialize
26
- @store = Tracksperanto::BufferIO.new
27
- @size = 0
28
-
29
- super
30
- end
31
-
32
- def empty?
33
- @size.zero?
34
- end
35
-
36
- # Store an object
37
- def push(object_to_store)
38
- blob = marshal_object(object_to_store)
39
- @store.write(blob)
40
- @size += 1
41
-
42
- object_to_store
43
- end
44
-
45
- alias_method :<<, :push
46
-
47
- # Retreive each stored object in succession. All other Enumerable
48
- # methods are also available (but be careful with Enumerable#map and to_a)
49
- def each
50
- with_separate_read_io do | iterable |
51
- @size.times { yield(recover_object_from(iterable)) }
52
- end
53
- end
54
-
55
- # Calls close! on the datastore and deletes the objects in it
56
- def clear
57
- @store.close!
58
- @size = 0
59
- end
60
-
61
- # Retreive a concrete object at index
62
- def [](idx)
63
- idx.respond_to?(:each) ? idx.map{|i| recover_at(i) } : recover_at(idx)
64
- end
65
-
66
- private
67
-
68
- def recover_at(idx)
69
- with_separate_read_io do | iterable |
70
- iterable.seek(0)
71
-
72
- # Do not unmarshal anything but wind the IO in fixed offsets
73
- idx.times do
74
- skip_bytes = iterable.gets("\t").to_i
75
- iterable.seek(iterable.pos + skip_bytes)
76
- end
77
-
78
- recover_object_from(iterable)
79
- end
80
- end
81
-
82
- # We first ensure that we have a disk-backed file, then reopen it as read-only
83
- # and iterate through that (we will have one IO handle per loop nest)
84
- def with_separate_read_io
85
- iterable = File.open(@store.to_file.path, "r")
86
- yield(iterable)
87
- ensure
88
- iterable.close
89
- end
90
-
91
- def marshal_object(object_to_store)
92
- d = Marshal.dump(object_to_store)
93
- blob = [d.size, "\t", d, DELIM].join
94
- end
95
-
96
- def recover_object_from(io)
97
- # Up to the tab is the amount of bytes to read
98
- demarshal_bytes = io.gets("\t").to_i
99
- blob = io.read(demarshal_bytes)
100
-
101
- Marshal.load(blob)
102
- end
103
- end
@@ -1,78 +0,0 @@
1
- # Used for IO objects that need to report the current offset at each operation that changes the said offset
2
- # (useful for building progress bars that report on a file read operation). Pass the actual IO and a block to
3
- # report progress to the constructor.
4
- class Tracksperanto::ProgressiveIO < DelegateClass(IO)
5
- include Tracksperanto::Returning
6
-
7
- # Get or set the total size of the contained IO. If the passed IO is a File object
8
- # the size will be preset automatically
9
- attr_accessor :total_size
10
- attr_accessor :progress_block
11
-
12
- def initialize(with_file, &blk)
13
- __setobj__(with_file)
14
- @total_size = with_file.stat.size if with_file.respond_to?(:stat)
15
- @progress_block = blk.to_proc if blk
16
- end
17
-
18
- # Report offset at each line
19
- def each(sep_string = $/, &blk)
20
- # Report offset at each call of the iterator
21
- result = super(sep_string) do | line |
22
- yield(line)
23
- notify_read
24
- end
25
- end
26
- alias_method :each_line, :each
27
-
28
- def each_byte(&blk)
29
- # Report offset at each call of the iterator
30
- super { |b| yield(b); notify_read }
31
- end
32
-
33
- def getc
34
- returning(super) { notify_read }
35
- end
36
-
37
- def gets
38
- returning(super) { notify_read }
39
- end
40
-
41
- def read(*a)
42
- returning(super) { notify_read }
43
- end
44
-
45
- def readbytes(*a)
46
- returning(super) { notify_read }
47
- end
48
-
49
- def readchar
50
- returning(super) { notify_read }
51
- end
52
-
53
- def readline(*a)
54
- returning(super) { notify_read }
55
- end
56
-
57
- def readlines(*a)
58
- returning(super) { notify_read }
59
- end
60
-
61
- def seek(*a)
62
- returning(super) { notify_read }
63
- end
64
-
65
- def ungetc(*a)
66
- returning(super) { notify_read }
67
- end
68
-
69
- def pos=(p)
70
- returning(super) { notify_read }
71
- end
72
-
73
- private
74
-
75
- def notify_read
76
- @progress_block.call(pos, @total_size) if @progress_block
77
- end
78
- end
@@ -1,50 +0,0 @@
1
- 0 -> Starting the parser
2
- 0 -> Extracting setup size
3
- 0 -> Extracting all animation channels
4
- 3 -> Parsing the file
5
- 6 -> Parsing the file
6
- 9 -> Parsing the file
7
- 13 -> Parsing the file
8
- 16 -> Parsing the file
9
- 19 -> Parsing the file
10
- 22 -> Parsing the file
11
- 25 -> Parsing the file
12
- 28 -> Parsing the file
13
- 31 -> Parsing the file
14
- 34 -> Parsing the file
15
- 37 -> Parsing the file
16
- 40 -> Parsing the file
17
- 43 -> Parsing the file
18
- 46 -> Parsing the file
19
- 49 -> Parsing the file
20
- 50 -> Assembling tracker curves from channels
21
- 50 -> Detected reference channel tracker1/ref/x
22
- 50 -> Extracting tracker tracker1
23
- 50 -> Detecting base value
24
- 50 -> Extracting keyframe 2 of tracker1
25
- 50 -> Extracting keyframe 3 of tracker1
26
- 50 -> Extracting keyframe 4 of tracker1
27
- 50 -> Detected reference channel tracker2/ref/x
28
- 50 -> Extracting tracker tracker2
29
- 50 -> Detecting base value
30
- 50 -> Extracting keyframe 2 of tracker2
31
- 50 -> Extracting keyframe 3 of tracker2
32
- 50 -> Extracting keyframe 4 of tracker2
33
- 50 -> Detected reference channel tracker3/ref/x
34
- 50 -> Extracting tracker tracker3
35
- 50 -> Detecting base value
36
- 50 -> Extracting keyframe 2 of tracker3
37
- 50 -> Extracting keyframe 3 of tracker3
38
- 50 -> Extracting keyframe 4 of tracker3
39
- 50 -> Validating 3 imported trackers
40
- 50 -> Starting export
41
- 55 -> Writing keyframe 1 of "tracker1", 3 trackers to go
42
- 61 -> Writing keyframe 2 of "tracker1", 3 trackers to go
43
- 66 -> Writing keyframe 3 of "tracker1", 3 trackers to go
44
- 72 -> Writing keyframe 1 of "tracker2", 2 trackers to go
45
- 77 -> Writing keyframe 2 of "tracker2", 2 trackers to go
46
- 83 -> Writing keyframe 3 of "tracker2", 2 trackers to go
47
- 88 -> Writing keyframe 1 of "tracker3", 1 trackers to go
48
- 94 -> Writing keyframe 2 of "tracker3", 1 trackers to go
49
- 100 -> Writing keyframe 3 of "tracker3", 1 trackers to go
50
- 100 -> Wrote 3 points and 9 keyframes
@@ -1,74 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__)) + '/helper'
2
-
3
- class TestAccumulator < Test::Unit::TestCase
4
-
5
- def test_accumulator_saves_objs
6
- a = Tracksperanto::Accumulator.new
7
- values = [3, {:foo => "bar"}, "foo"]
8
- values.map(&a.method(:push))
9
-
10
- assert_equal 3, a.size
11
- assert_equal values, a.map{|e| e }, "Should return the same elements from the storage"
12
- end
13
-
14
- def test_accumulator_saves_shitload_of_objs
15
- a = Tracksperanto::Accumulator.new
16
- 50_000.times { a.push("A string" => rand) }
17
- assert_equal 50_000, a.size
18
- end
19
-
20
- def test_accumulator_saves_shitload_of_objs
21
- a = Tracksperanto::Accumulator.new
22
- 4.times { a.push("A \tstring") }
23
- a.each {|e| assert_equal "A \tstring", e }
24
- end
25
-
26
- def test_accumulator_empty
27
- a = Tracksperanto::Accumulator.new
28
- assert a.empty?
29
- a.push(1)
30
- assert !a.empty?
31
- end
32
-
33
- def test_accumulator_supports_nested_iteration
34
- a = Tracksperanto::Accumulator.new
35
- ("A".."Z").each{|e| a << e}
36
-
37
- accumulated = []
38
- seen_g = false
39
- a.each do | first_level |
40
- if first_level == "G"
41
- seen_g = true
42
- # Force a nested iteration and break it midway
43
- a.each do | second_level |
44
- accumulated.push(second_level)
45
- break if second_level == "E"
46
- end
47
- elsif seen_g
48
- assert_equal "H", first_level
49
- return
50
- end
51
- end
52
- end
53
-
54
- def test_random_access
55
- a = Tracksperanto::Accumulator.new
56
- letters = ("A".."Z").map{|e| "#{e}\r\nWow!"}.to_a
57
- letters.map(&a.method(:push))
58
-
59
- assert_equal "B\r\nWow!", a[1]
60
- assert_equal "E\r\nWow!", a[4]
61
- end
62
-
63
- def test_clear_calls_close_on_buffer
64
- io = Tracksperanto::BufferIO.new
65
- flexmock(io).should_receive(:close!)
66
- flexmock(Tracksperanto::BufferIO).should_receive(:new).once.and_return(io)
67
-
68
- a = Tracksperanto::Accumulator.new
69
- 40.times { a.push("A string" => rand) }
70
- assert_equal 40, a.size
71
- a.clear
72
- assert_equal 0, a.size
73
- end
74
- end