tracksperanto 2.6.3 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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