tracksperanto 3.3.12 → 3.3.13

Sign up to get free protection for your applications and to get access to all the features.
data/CONTRIBUTING.md CHANGED
@@ -7,7 +7,7 @@ can chew on. Contributions or patches without tests will be rejected at sight.
7
7
 
8
8
  ### Development environment
9
9
 
10
- Tracksperanto is currently being developed on Ruby 1.9.3 but it should also work fine on 1.8.7.
10
+ Tracksperanto is currently being developed on Ruby 2.0.0 but we maintain compatibility down to 1.8.7.
11
11
  What you will need is everything mentioned in the Gemfile plus Bundler.
12
12
  Development should be done agains the git checkout because the gem does not contain the test files
13
13
  (various example files in different formats that are used for verifying all the import and export modules).
@@ -24,30 +24,42 @@ So, to get started:
24
24
 
25
25
  ### Internal tracker representation
26
26
 
27
- The trackers are represented by Tracker objects, which work like addressable hashes per frame number. The Tracker objects
27
+ The trackers are represented by Tracker objects, which walk and quack like Arrays of frames. The Tracker objects
28
28
  contain Keyframe objects, and those in turn contain coordinates. The coordinates are stored in absolute pixels, relative to
29
- the zero coordinate in the lower left corner.
29
+ the zero coordinate in the lower left corner. The Tracker objects wacth after you so that you don't put multiple Keyframes on
30
+ the same frame number, keep Keyframes sorted and so on - in short, they are a nice container. They are also what is `yield`ed
31
+ when you import.
30
32
 
31
- Note on subpixel precision: the absolute left/bottom of the image has coordinates 0,0
32
- (at the lower left corner of the leftmost bottommost pixel) and 0.5x0.5 in the middle of that pixel.
33
+ ### Coordinate system
34
+
35
+ Tracksperanto uses the **bottom left** coordinate system, with positive values going **up and right**.
36
+ Pixel registration is on the **lower left corner of the pixel**. Thus the absolute left/bottom of the image
37
+ has coordinates 0,0 (at the lower left corner of the leftmost bottommost pixel) and 0.5x0.5 in the middle of that pixel.
38
+
39
+ When importing data, each import module will conform the coordinate system to these conventions. Each export module will
40
+ convert from this system to whichever is required by the consumer of the file being exported.
33
41
 
34
42
  ### Importing your own formats
35
43
 
36
- To write an import module refer to Tracksperanto::Import::Base
37
- docs. Your importer will be configured with width and height of the comp that it is importing, and will get an IO
38
- object with the file that you are processing. You should then yield parsed trackers within the each method (tracker objects should
39
- be Tracksperanto::Tracker objects or compatibles)
44
+ To write an import module refer to `Tracksperanto::Import::Base` docs. Your importer will be configured with width and height
45
+ of the comp that it is importing, and will get an IO object with the file that you are processing. You should then `yield` the parsed
46
+ trackers packed into `Tracker` objects within the `each` method (tracker objects should be Tracksperanto::Tracker objects or compatibles)
47
+
48
+ Since the importer objects also mix-in `Enumerable` you can quickly import into an `Array` and so on.
40
49
 
41
50
  ### Exporting your own formats
42
51
 
43
- You can easily write an exporter. Refer to the Tracksperanto::Export::Base docs. Note that your exporter should be able to chew alot of data
52
+ You can easily write an exporter. Refer to the `Tracksperanto::Export::Base` docs. Note that your exporter should be able to chew alot of data
44
53
  (hundreds of trackers with thousands of keyframes with exported files growing up to 5-10 megs in size are not uncommon!). This means that
45
54
  the exporter should work with streams (smaller parts of the file being exported will be held in memory at a time).
46
55
 
56
+ Export modules are decoupled from the internal `Tracker` representation - all the export module ever sees are raw strings, `Integers`
57
+ and `Floats`
58
+
47
59
  ### Ading your own processing steps
48
60
 
49
- You probably want to write a Tool (consult the Tracksperanto::Tool::Base docs) if you need some processing applied to the tracks
50
- or their data. A Tool is just like an export module, except that instead it sits between the exporter and the exporting routine. Tools wrap export
61
+ You probably want to write a `Tool` (consult the Tracksperanto::Tool::Base docs) if you need some processing applied to the tracks
62
+ or their data. A `Tool` is just like an export module, except that instead it sits between the exporter and the exporting routine. Tools wrap export
51
63
  modules or each other, so you can stack different tool modules together (like "scale first, then move").
52
64
 
53
65
  ### Writing your own processing pipelines from start to finish
@@ -79,8 +91,7 @@ the software user-friendly. A well-behaved Tracksperanto module should manage it
79
91
  some_importer.io = File.open("source_file.shk")
80
92
 
81
93
  # The importer responds to each() so if your file is not too big you can just load all the trackers
82
- # as an array. If you expect to have alot of trackers investigate a way to buffer them on disk
83
- # instead (see Obuf)
94
+ # as an array.
84
95
  trackers = some_importer.to_a
85
96
 
86
97
  # Create the exporter and pass the output file to it
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source 'http://rubygems.org'
4
4
  gem "bundler"
5
5
 
6
6
  gem "obuf", "~> 1.1"
7
- gem "tickly", "~> 2.1.3"
7
+ gem "tickly", "~> 2.1.4"
8
8
  gem "bychar", "~> 2"
9
9
  gem "progressive_io", "~> 1.0"
10
10
  gem "flame_channel_parser", "~> 4.0"
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 3.3.13
2
+
3
+ * Fix the bug in Shake script imports where the import would fail if animation curves contained a non-numeric value
4
+
1
5
  === 3.3.12
2
6
 
3
7
  * Fix the bug in MatchMover imports that caused the import to fail if the file contained a multiline path
@@ -1,13 +1,17 @@
1
1
  Tracksperanto is a universal 2D-track translator between many apps.
2
2
 
3
- == Why Tracksperanto?
3
+ ## Is it any good?
4
+
5
+ Yes.
6
+
7
+ ## Why Tracksperanto?
4
8
 
5
9
  Historically, every matchmoving app uses it's own UI for tracking 2D features.
6
10
  Unfortunately, the UIs of these are all different and not very user-friendly. It happens
7
11
  that an app cannot solve a shot that another one will, but you usually have to redo your 2D
8
12
  tracks in each one of them.
9
13
 
10
- === Efficiency when doing tracks
14
+ ### Efficiency when doing tracks
11
15
 
12
16
  Another problem with today's matchmoving apps is that they are vastly inefficient when
13
17
  doing 2D tracks. Almost all of them use OpenGL and want to load the whole frame into memory
@@ -29,14 +33,14 @@ So it's very natural to track in a modern compositing app that has selective ima
29
33
  loading, and then export one single group of tracks into all of the matchmoving
30
34
  applications at once.
31
35
 
32
- === Evaluating different camera solvers
36
+ ### Evaluating different camera solvers
33
37
 
34
38
  Since your 2D tracking data is now freely interchangeable you can load the same tracks
35
39
  into multiple 3D tracking applications and see which one gives you a better solve.
36
40
  Should all the 3D camera trackers fail, you can still take your tracks into the 2D
37
41
  compositing world to do the job.
38
42
 
39
- === Processing 2D tracking data
43
+ ### Processing 2D tracking data
40
44
 
41
45
  Sometimes you need to offset your tracks in time, or resize them to a different pixel format.
42
46
  Very few apps allow you to convert your tracks in one step from format to format - like doing
@@ -47,13 +51,13 @@ way to solve the shot will be to retrack it from scratch.
47
51
  To circumvent this, Tracksperanto allows you to apply transformations to the tracking data
48
52
  that you export - and you can apply multiple transformations if desired.
49
53
 
50
- == Using Tracksperanto from the command line
54
+ ## Using Tracksperanto from the command line
51
55
 
52
56
  To run on your own computer, make sure you have Ruby installed. Versions from 1.8.7
53
- and up are supported. Wea re also testing on Ruby 2.0.0 now.
57
+ and up are supported.
54
58
 
55
59
  $ ruby -v
56
- ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
60
+ ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin13.0.0]
57
61
 
58
62
  Then install tracksperanto. It will be downloaded and unpacked automatically for you by the
59
63
  RubyGems system:
@@ -71,7 +75,7 @@ To see the supported options, run
71
75
  The converted files will be saved in the same directory as the source, if resulting
72
76
  converted files already exist <b>they will be overwritten without warning</b>.
73
77
 
74
- == Using Tracksperanto through the web
78
+ ## Using Tracksperanto through the web
75
79
 
76
80
  For situations where you cannot install anything on your machine, or you run a shitty OS that cannot
77
81
  run Ruby decently, or you are in a locked-down environment, we offer a web-enabled version of
@@ -86,10 +90,11 @@ data (like script and footage paths) from the files before adding them to the re
86
90
 
87
91
  If you want your own copy of the web application at your facility we can discuss that, but it's not free.
88
92
 
89
- == Format support
93
+ ## Format support
90
94
 
91
95
  ---
92
- === Formats Tracksperanto can read
96
+
97
+ ### Formats Tracksperanto can read
93
98
 
94
99
  * 3DE v3 point export file
95
100
  * 3DE v4 point export file
@@ -105,7 +110,7 @@ If you want your own copy of the web application at your facility we can discuss
105
110
  * Syntheyes "All Tracker Paths" export .txt file
106
111
  * Syntheyes 2D tracker paths file
107
112
 
108
- === Formats Tracksperanto can export to
113
+ ### Formats Tracksperanto can export to
109
114
 
110
115
  * 3DE v3 point export .txt file
111
116
  * 3DE v4 point export .txt file
@@ -126,29 +131,30 @@ If you want your own copy of the web application at your facility we can discuss
126
131
  * Shake trackers in a .txt file
127
132
  * Syntheyes 2D tracker paths file
128
133
  * boujou feature tracks
134
+
129
135
  ---
130
136
 
131
137
 
132
- == Editing your tracks while converting
138
+ ## Editing your tracks while converting
133
139
 
134
140
  Tracksperanto has a number of features to scale, move, slip, distort and rename trackers.
135
141
  Consult the --help option to see what is available.
136
142
 
137
- == Development
143
+ ## Development
138
144
 
139
- {<img src="https://secure.travis-ci.org/guerilla-di/tracksperanto.png" />}[http://travis-ci.org/guerilla-di/tracksperanto]
145
+ ![Gem Version](https://badge.fury.io/rb/tracksperanto.png)
146
+ ![tests](https://secure.travis-ci.org/guerilla-di/tracksperanto.png)
140
147
 
141
148
  If you are interested in reusing Tracksperanto's code or adding modules to the software consult
142
- the {short developer introduction}[https://github.com/guerilla-di/tracksperanto/blob/master/CONTRIBUTING.md]
149
+ the [short developer introduction](https://github.com/guerilla-di/tracksperanto/blob/master/CONTRIBUTING.md)
143
150
 
144
- == Limitations
151
+ ## Limitations
145
152
 
146
153
  Information about the search area, reference area and offset is not passed along (outside
147
154
  of scope for the app and different trackers handle these differently, if at all). For some
148
155
  modules no residual will be passed along (3D tracking apps generally do not export residual
149
156
  with backprojected 3D features).
150
157
 
151
-
152
- == Licensing
158
+ ## Licensing
153
159
 
154
160
  Tracksperanto is made avalable under the MIT license that is included in the package.
data/Rakefile CHANGED
@@ -38,27 +38,30 @@ after :test do
38
38
  formats = StringIO.new
39
39
 
40
40
  formats.puts(" ")
41
- formats.puts('=== Formats Tracksperanto can read')
41
+ formats.puts(" ")
42
+ formats.puts('### Formats Tracksperanto can read')
42
43
  formats.puts(" ")
43
44
  Tracksperanto.importers.each do | import_mdoule |
44
45
  formats.puts("* %s" % import_mdoule.human_name)
45
46
  end
46
47
 
47
48
  formats.puts(" ")
48
- formats.puts('=== Formats Tracksperanto can export to')
49
+ formats.puts('### Formats Tracksperanto can export to')
49
50
  formats.puts(" ")
50
51
  Tracksperanto.exporters.each do | export_module |
51
52
  formats.puts("* %s" % export_module.human_name)
52
53
  end
54
+ formats.puts(" ")
53
55
 
54
- readme_text = File.read(File.dirname(__FILE__) + "/README.rdoc")
56
+ readme_text = File.read(File.dirname(__FILE__) + "/README.md")
55
57
  three = readme_text.split('---')
56
58
  raise "Should split in 3" unless three.length == 3
57
59
  three[1] = formats.string
58
60
 
59
- File.open(File.dirname(__FILE__) + "/README.rdoc", "w") do | f |
61
+ File.open(File.dirname(__FILE__) + "/README.md", "w") do | f |
60
62
  f.write(three.join('---'))
61
63
  end
64
+
62
65
  end
63
66
 
64
67
  task :default => [ :test ]
@@ -14,11 +14,12 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
14
14
 
15
15
  def self.known_snags
16
16
  "The only supported nodes that we can extract tracks from are Transform2D, Reconcile3D, " +
17
- "PlanarTracker and Tracker (supported Nuke versions are 5, 6 and 7)"
17
+ "PlanarTracker and Tracker (we support Nuke 5 up to and including 8)"
18
18
  end
19
19
 
20
20
  def each
21
21
  parser = Tickly::NodeProcessor.new
22
+
22
23
  parser.add_node_handler_class(Tracker3)
23
24
  parser.add_node_handler_class(Reconcile3D)
24
25
  parser.add_node_handler_class(PlanarTracker1_0)
@@ -262,15 +262,24 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
262
262
  end.compact
263
263
  end
264
264
 
265
+ # Remove tuples which have more than 2 values, and tuples that
266
+ # have non-Numeric members
267
+ def clean_tuples(frame_and_value_tuples)
268
+ frame_and_value_tuples.reject do | element |
269
+ element.length > 2
270
+ end.reject do | element |
271
+ element.any?{|e| !e.is_a?(Numeric) }
272
+ end
273
+ end
274
+
265
275
  def collect_stabilizer_tracker(name, x_curve, y_curve)
266
276
  return unless valid_curves?(x_curve, y_curve)
267
277
 
268
278
  report_progress("Assembling Stabilizer node tracker #{name}")
269
279
 
270
- keyframes = zip_curve_tuples(x_curve, y_curve).map do | (frame, x, y) |
280
+ keyframes = zip_curve_tuples(clean_tuples(x_curve), clean_tuples(y_curve)).map do | (frame, x, y) |
271
281
  Tracksperanto::Keyframe.new(:frame => frame - 1, :abs_x => x, :abs_y => y)
272
282
  end
273
-
274
283
  Tracksperanto::Tracker.new(:name => name, :keyframes => keyframes)
275
284
  end
276
285
 
data/lib/tracksperanto.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  # -*- encoding : utf-8 -*-
2
- %w( stringio delegate tempfile ).map(&method(:require))
2
+ require 'stringio'
3
+ require 'forwardable'
4
+ require 'tempfile'
3
5
 
4
6
  module Tracksperanto
5
7
  PATH = File.expand_path(File.dirname(__FILE__))
6
- VERSION = '3.3.12'
8
+ VERSION = '3.3.13'
7
9
 
8
10
  module Import; end
9
11
  module Export; end
@@ -86,6 +88,8 @@ module Tracksperanto
86
88
 
87
89
  end
88
90
 
91
+ # We do get loaded as a library so do not add to the load paths,
92
+ # just load directly
89
93
  %w(
90
94
  returning
91
95
  const_name
@@ -96,6 +100,7 @@ end
96
100
  keyframe
97
101
  tracker
98
102
  format_detector
103
+ io_wrapper
99
104
  ext_io
100
105
  buffer_io
101
106
  simple_export
@@ -1,16 +1,24 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  require "tempfile"
3
+ require 'forwardable'
4
+
5
+ class IOWrapper
6
+ extend Forwardable
7
+ attr_reader :backing_buffer
8
+ IO_METHODS = (IO.instance_methods - Object.instance_methods - Enumerable.instance_methods).map{|e| e.to_sym }
9
+ def_delegators :backing_buffer, *IO_METHODS
10
+ end
3
11
 
4
12
  # BufferIO is used for writing big segments of text. It works like a StringIO, but when the size
5
13
  # of the underlying string buffer exceeds MAX_IN_MEM_BYTES the string will be flushed to disk
6
14
  # and it automagically becomes a Tempfile
7
- class Tracksperanto::BufferIO < DelegateClass(IO)
15
+ class Tracksperanto::BufferIO < Tracksperanto::IOWrapper
8
16
  include Tracksperanto::Returning
9
17
 
10
18
  MAX_IN_MEM_BYTES = 5_000_000
11
19
 
12
20
  def initialize
13
- __setobj__(StringIO.new)
21
+ @backing_buffer = StringIO.new
14
22
  end
15
23
 
16
24
  def write(s)
@@ -27,8 +35,8 @@ class Tracksperanto::BufferIO < DelegateClass(IO)
27
35
  end
28
36
 
29
37
  def close!
30
- __getobj__.close! if @tempfile_in
31
- __setobj__(nil)
38
+ @backing_buffer.close! if @tempfile_in
39
+ @backing_buffer = nil
32
40
  end
33
41
 
34
42
  # Sometimes you just need to upgrade to a File forcibly (for example if you want)
@@ -47,7 +55,7 @@ class Tracksperanto::BufferIO < DelegateClass(IO)
47
55
  private
48
56
 
49
57
  def replace_with_tempfile
50
- sio = __getobj__
58
+ sio = @backing_buffer
51
59
  tf = Tempfile.new("tracksperanto-xbuf")
52
60
  tf.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding)
53
61
  tf.binmode
@@ -55,7 +63,7 @@ class Tracksperanto::BufferIO < DelegateClass(IO)
55
63
  tf.flush # Needed of we will reopen this file soon from another thread/loop
56
64
  sio.string = ""
57
65
  GC.start
58
- __setobj__(tf)
66
+ @backing_buffer = tf
59
67
 
60
68
  @tempfile_in = true
61
69
  end
@@ -6,10 +6,9 @@
6
6
  #
7
7
  # io = ExtIO.new(my_open_file)
8
8
  # io.gets_non_empty #=> "This is the first line after 2000 linebreaks"
9
- #
10
- class Tracksperanto::ExtIO < DelegateClass(IO)
9
+ class Tracksperanto::ExtIO < Tracksperanto::IOWrapper
11
10
  def initialize(with)
12
- __setobj__ with
11
+ @backing_buffer = with
13
12
  end
14
13
 
15
14
  # Similar to IO#gets however it will also strip the returned result. This is useful
@@ -0,0 +1,8 @@
1
+ # A wrapper for IO which works on the backing buffer
2
+ # and proxies all IO methods
3
+ class Tracksperanto::IOWrapper
4
+ extend Forwardable
5
+ attr_reader :backing_buffer
6
+ IO_METHODS = (IO.instance_methods - Object.instance_methods - Enumerable.instance_methods).map{|e| e.to_sym }
7
+ def_delegators :backing_buffer, *IO_METHODS
8
+ end
@@ -175,6 +175,34 @@ class NukeImportTest < Test::Unit::TestCase
175
175
  assert_equal 1, trackers.length
176
176
  end
177
177
 
178
+ def test_parsing_nuke8_tracker4_without_LF_at_end_of_file
179
+ fixture = File.open(File.dirname(__FILE__) + '/samples/nuke/nuke8_tracker4_copypastes.nk')
180
+
181
+ parser = Tracksperanto::Import::NukeScript.new(:io => fixture)
182
+ parser.width = 2048
183
+ parser.height = 1152
184
+ trackers = parser.to_a
185
+
186
+ assert_equal 4, trackers.length
187
+ first_t = trackers[0]
188
+ assert_equal 'Tracker1_track_1', first_t.name
189
+ assert_equal 48, first_t.length
190
+ end
191
+
192
+ def test_parsing_nuke8_tracker4
193
+ fixture = File.open(File.dirname(__FILE__) + '/samples/nuke/track_nuke8.nk')
194
+
195
+ parser = Tracksperanto::Import::NukeScript.new(:io => fixture)
196
+ parser.width = 2048
197
+ parser.height = 1152
198
+ trackers = parser.to_a
199
+
200
+ assert_equal 5, trackers.length
201
+ first_t = trackers[0]
202
+ assert_equal 'Tracker1_track_1', first_t.name
203
+ assert_equal 88, first_t.length
204
+ end
205
+
178
206
  def test_parsing_nuke708_tracker4_with_curve_error
179
207
  fixture = File.open(File.dirname(__FILE__) + '/samples/nuke/A099_L008_0207TW_001_head_R.nk')
180
208
  parser = Tracksperanto::Import::NukeScript.new(:io => fixture, :width => 4800, :height => 2700)
@@ -141,6 +141,13 @@ class ShakeScriptImportTest < Test::Unit::TestCase
141
141
  assert_equal 850, trackers[0].length
142
142
  end
143
143
 
144
+ def test_stabilize_nodes_in_great_numbers
145
+ fixture = File.open(File.dirname(__FILE__) + "/samples/shake_script/cliff_many_stabilize.shk")
146
+ trackers = Tracksperanto::Import::ShakeScript.new(:io => fixture, :width => 1920, :height => 1080).to_a
147
+ assert_equal 40, trackers.length
148
+ assert_equal 711, trackers[22].length
149
+ end
150
+
144
151
  def test_tracker_supernode_with_curves_having_keyframes_at_negative_offsets
145
152
  fixture = File.open(File.dirname(__FILE__) + "/samples/shake_script/designated_global_range_starting_at_negative_frame.shk")
146
153
  trackers = Tracksperanto::Import::ShakeScript.new(:io => fixture, :width => 720, :height => 576).to_a
@@ -6,14 +6,14 @@ class TestBufferIO < Test::Unit::TestCase
6
6
  def test_write_in_mem_has_a_stringio
7
7
  io = Tracksperanto::BufferIO.new
8
8
  9000.times { io.write("a") }
9
- assert_kind_of StringIO, io.__getobj__
9
+ assert_kind_of StringIO, io.backing_buffer
10
10
  assert_nothing_raised { io.close! }
11
11
  end
12
12
 
13
13
  def test_write_larger_than_max_swaps_tempfile
14
14
  io = Tracksperanto::BufferIO.new
15
15
  io.write("a" * 6_000_001)
16
- f = io.__getobj__
16
+ f = io.backing_buffer
17
17
  assert_kind_of Tempfile, f
18
18
  f.rewind
19
19
  assert_equal 6_000_001, f.read.length
@@ -4,24 +4,25 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = "tracksperanto"
8
- s.version = "3.3.12"
7
+ s.name = %q{tracksperanto}
8
+ s.version = "3.3.13"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julik Tarkhanov"]
12
- s.date = "2013-11-07"
13
- s.description = "Converts 2D track exports between different apps like Flame, MatchMover, PFTrack..."
14
- s.email = "me@julik.nl"
12
+ s.date = %q{2014-02-07}
13
+ s.default_executable = %q{tracksperanto}
14
+ s.description = %q{Converts 2D track exports between different apps like Flame, MatchMover, PFTrack...}
15
+ s.email = %q{me@julik.nl}
15
16
  s.executables = ["tracksperanto"]
16
17
  s.extra_rdoc_files = [
17
- "README.rdoc"
18
+ "README.md"
18
19
  ]
19
20
  s.files = [
20
21
  "CONTRIBUTING.md",
21
22
  "Gemfile",
22
23
  "History.txt",
23
24
  "MIT_LICENSE.txt",
24
- "README.rdoc",
25
+ "README.md",
25
26
  "Rakefile",
26
27
  "bin/tracksperanto",
27
28
  "lib/export/base.rb",
@@ -86,6 +87,7 @@ Gem::Specification.new do |s|
86
87
  "lib/tracksperanto/const_name.rb",
87
88
  "lib/tracksperanto/ext_io.rb",
88
89
  "lib/tracksperanto/format_detector.rb",
90
+ "lib/tracksperanto/io_wrapper.rb",
89
91
  "lib/tracksperanto/keyframe.rb",
90
92
  "lib/tracksperanto/parameters.rb",
91
93
  "lib/tracksperanto/pf_coords.rb",
@@ -199,11 +201,11 @@ Gem::Specification.new do |s|
199
201
  "test/tools/test_start_trim_middleware.rb",
200
202
  "tracksperanto.gemspec"
201
203
  ]
202
- s.homepage = "http://guerilla-di.org/tracksperanto"
204
+ s.homepage = %q{http://guerilla-di.org/tracksperanto}
203
205
  s.licenses = ["MIT"]
204
206
  s.require_paths = ["lib"]
205
- s.rubygems_version = "1.8.25"
206
- s.summary = "A universal 2D tracks converter"
207
+ s.rubygems_version = %q{1.6.2}
208
+ s.summary = %q{A universal 2D tracks converter}
207
209
 
208
210
  if s.respond_to? :specification_version then
209
211
  s.specification_version = 3
@@ -211,7 +213,7 @@ Gem::Specification.new do |s|
211
213
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
212
214
  s.add_runtime_dependency(%q<bundler>, [">= 0"])
213
215
  s.add_runtime_dependency(%q<obuf>, ["~> 1.1"])
214
- s.add_runtime_dependency(%q<tickly>, ["~> 2.1.3"])
216
+ s.add_runtime_dependency(%q<tickly>, ["~> 2.1.4"])
215
217
  s.add_runtime_dependency(%q<bychar>, ["~> 2"])
216
218
  s.add_runtime_dependency(%q<progressive_io>, ["~> 1.0"])
217
219
  s.add_runtime_dependency(%q<flame_channel_parser>, ["~> 4.0"])
@@ -227,7 +229,7 @@ Gem::Specification.new do |s|
227
229
  else
228
230
  s.add_dependency(%q<bundler>, [">= 0"])
229
231
  s.add_dependency(%q<obuf>, ["~> 1.1"])
230
- s.add_dependency(%q<tickly>, ["~> 2.1.3"])
232
+ s.add_dependency(%q<tickly>, ["~> 2.1.4"])
231
233
  s.add_dependency(%q<bychar>, ["~> 2"])
232
234
  s.add_dependency(%q<progressive_io>, ["~> 1.0"])
233
235
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
@@ -244,7 +246,7 @@ Gem::Specification.new do |s|
244
246
  else
245
247
  s.add_dependency(%q<bundler>, [">= 0"])
246
248
  s.add_dependency(%q<obuf>, ["~> 1.1"])
247
- s.add_dependency(%q<tickly>, ["~> 2.1.3"])
249
+ s.add_dependency(%q<tickly>, ["~> 2.1.4"])
248
250
  s.add_dependency(%q<bychar>, ["~> 2"])
249
251
  s.add_dependency(%q<progressive_io>, ["~> 1.0"])
250
252
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
metadata CHANGED
@@ -1,270 +1,258 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tracksperanto
3
- version: !ruby/object:Gem::Version
4
- version: 3.3.12
3
+ version: !ruby/object:Gem::Version
4
+ hash: 17
5
5
  prerelease:
6
+ segments:
7
+ - 3
8
+ - 3
9
+ - 13
10
+ version: 3.3.13
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Julik Tarkhanov
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-11-07 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: bundler
16
- requirement: !ruby/object:Gem::Requirement
17
+
18
+ date: 2014-02-07 00:00:00 +01:00
19
+ default_executable: tracksperanto
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ requirement: &id001 !ruby/object:Gem::Requirement
17
23
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 0
30
+ version: "0"
22
31
  type: :runtime
32
+ name: bundler
33
+ version_requirements: *id001
23
34
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
31
- name: obuf
32
- requirement: !ruby/object:Gem::Requirement
35
+ - !ruby/object:Gem::Dependency
36
+ requirement: &id002 !ruby/object:Gem::Requirement
33
37
  none: false
34
- requirements:
38
+ requirements:
35
39
  - - ~>
36
- - !ruby/object:Gem::Version
37
- version: '1.1'
40
+ - !ruby/object:Gem::Version
41
+ hash: 13
42
+ segments:
43
+ - 1
44
+ - 1
45
+ version: "1.1"
38
46
  type: :runtime
47
+ name: obuf
48
+ version_requirements: *id002
39
49
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: '1.1'
46
- - !ruby/object:Gem::Dependency
47
- name: tickly
48
- requirement: !ruby/object:Gem::Requirement
50
+ - !ruby/object:Gem::Dependency
51
+ requirement: &id003 !ruby/object:Gem::Requirement
49
52
  none: false
50
- requirements:
53
+ requirements:
51
54
  - - ~>
52
- - !ruby/object:Gem::Version
53
- version: 2.1.3
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 2
59
+ - 1
60
+ - 4
61
+ version: 2.1.4
54
62
  type: :runtime
63
+ name: tickly
64
+ version_requirements: *id003
55
65
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
66
+ - !ruby/object:Gem::Dependency
67
+ requirement: &id004 !ruby/object:Gem::Requirement
57
68
  none: false
58
- requirements:
69
+ requirements:
59
70
  - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 2.1.3
62
- - !ruby/object:Gem::Dependency
63
- name: bychar
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: '2'
71
+ - !ruby/object:Gem::Version
72
+ hash: 7
73
+ segments:
74
+ - 2
75
+ version: "2"
70
76
  type: :runtime
77
+ name: bychar
78
+ version_requirements: *id004
71
79
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: '2'
78
- - !ruby/object:Gem::Dependency
79
- name: progressive_io
80
- requirement: !ruby/object:Gem::Requirement
80
+ - !ruby/object:Gem::Dependency
81
+ requirement: &id005 !ruby/object:Gem::Requirement
81
82
  none: false
82
- requirements:
83
+ requirements:
83
84
  - - ~>
84
- - !ruby/object:Gem::Version
85
- version: '1.0'
85
+ - !ruby/object:Gem::Version
86
+ hash: 15
87
+ segments:
88
+ - 1
89
+ - 0
90
+ version: "1.0"
86
91
  type: :runtime
92
+ name: progressive_io
93
+ version_requirements: *id005
87
94
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
95
+ - !ruby/object:Gem::Dependency
96
+ requirement: &id006 !ruby/object:Gem::Requirement
89
97
  none: false
90
- requirements:
98
+ requirements:
91
99
  - - ~>
92
- - !ruby/object:Gem::Version
93
- version: '1.0'
94
- - !ruby/object:Gem::Dependency
95
- name: flame_channel_parser
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ~>
100
- - !ruby/object:Gem::Version
101
- version: '4.0'
100
+ - !ruby/object:Gem::Version
101
+ hash: 27
102
+ segments:
103
+ - 4
104
+ - 0
105
+ version: "4.0"
102
106
  type: :runtime
107
+ name: flame_channel_parser
108
+ version_requirements: *id006
103
109
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
110
+ - !ruby/object:Gem::Dependency
111
+ requirement: &id007 !ruby/object:Gem::Requirement
105
112
  none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: '4.0'
110
- - !ruby/object:Gem::Dependency
111
- name: progressbar
112
- requirement: !ruby/object:Gem::Requirement
113
- none: false
114
- requirements:
115
- - - '='
116
- - !ruby/object:Gem::Version
113
+ requirements:
114
+ - - "="
115
+ - !ruby/object:Gem::Version
116
+ hash: 55
117
+ segments:
118
+ - 0
119
+ - 10
120
+ - 0
117
121
  version: 0.10.0
118
122
  type: :runtime
123
+ name: progressbar
124
+ version_requirements: *id007
119
125
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - '='
124
- - !ruby/object:Gem::Version
125
- version: 0.10.0
126
- - !ruby/object:Gem::Dependency
127
- name: update_hints
128
- requirement: !ruby/object:Gem::Requirement
126
+ - !ruby/object:Gem::Dependency
127
+ requirement: &id008 !ruby/object:Gem::Requirement
129
128
  none: false
130
- requirements:
129
+ requirements:
131
130
  - - ~>
132
- - !ruby/object:Gem::Version
133
- version: '1.0'
131
+ - !ruby/object:Gem::Version
132
+ hash: 15
133
+ segments:
134
+ - 1
135
+ - 0
136
+ version: "1.0"
134
137
  type: :runtime
138
+ name: update_hints
139
+ version_requirements: *id008
135
140
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ~>
140
- - !ruby/object:Gem::Version
141
- version: '1.0'
142
- - !ruby/object:Gem::Dependency
143
- name: approximately
144
- requirement: !ruby/object:Gem::Requirement
141
+ - !ruby/object:Gem::Dependency
142
+ requirement: &id009 !ruby/object:Gem::Requirement
145
143
  none: false
146
- requirements:
147
- - - ! '>='
148
- - !ruby/object:Gem::Version
149
- version: '0'
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ hash: 3
148
+ segments:
149
+ - 0
150
+ version: "0"
150
151
  type: :development
152
+ name: approximately
153
+ version_requirements: *id009
151
154
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
158
- - !ruby/object:Gem::Dependency
159
- name: jeweler
160
- requirement: !ruby/object:Gem::Requirement
155
+ - !ruby/object:Gem::Dependency
156
+ requirement: &id010 !ruby/object:Gem::Requirement
161
157
  none: false
162
- requirements:
163
- - - ! '>='
164
- - !ruby/object:Gem::Version
165
- version: '0'
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ hash: 3
162
+ segments:
163
+ - 0
164
+ version: "0"
166
165
  type: :development
166
+ name: jeweler
167
+ version_requirements: *id010
167
168
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
- requirements:
171
- - - ! '>='
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- - !ruby/object:Gem::Dependency
175
- name: rake
176
- requirement: !ruby/object:Gem::Requirement
169
+ - !ruby/object:Gem::Dependency
170
+ requirement: &id011 !ruby/object:Gem::Requirement
177
171
  none: false
178
- requirements:
179
- - - ! '>='
180
- - !ruby/object:Gem::Version
181
- version: '0'
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ hash: 3
176
+ segments:
177
+ - 0
178
+ version: "0"
182
179
  type: :development
180
+ name: rake
181
+ version_requirements: *id011
183
182
  prerelease: false
184
- version_requirements: !ruby/object:Gem::Requirement
183
+ - !ruby/object:Gem::Dependency
184
+ requirement: &id012 !ruby/object:Gem::Requirement
185
185
  none: false
186
- requirements:
187
- - - ! '>='
188
- - !ruby/object:Gem::Version
189
- version: '0'
190
- - !ruby/object:Gem::Dependency
191
- name: linebyline
192
- requirement: !ruby/object:Gem::Requirement
193
- none: false
194
- requirements:
195
- - - ! '>='
196
- - !ruby/object:Gem::Version
197
- version: '0'
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ hash: 3
190
+ segments:
191
+ - 0
192
+ version: "0"
198
193
  type: :development
194
+ name: linebyline
195
+ version_requirements: *id012
199
196
  prerelease: false
200
- version_requirements: !ruby/object:Gem::Requirement
197
+ - !ruby/object:Gem::Dependency
198
+ requirement: &id013 !ruby/object:Gem::Requirement
201
199
  none: false
202
- requirements:
203
- - - ! '>='
204
- - !ruby/object:Gem::Version
205
- version: '0'
206
- - !ruby/object:Gem::Dependency
207
- name: flexmock
208
- requirement: !ruby/object:Gem::Requirement
209
- none: false
210
- requirements:
200
+ requirements:
211
201
  - - ~>
212
- - !ruby/object:Gem::Version
202
+ - !ruby/object:Gem::Version
203
+ hash: 31
204
+ segments:
205
+ - 1
206
+ - 3
207
+ - 2
213
208
  version: 1.3.2
214
209
  type: :development
210
+ name: flexmock
211
+ version_requirements: *id013
215
212
  prerelease: false
216
- version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
- requirements:
219
- - - ~>
220
- - !ruby/object:Gem::Version
221
- version: 1.3.2
222
- - !ruby/object:Gem::Dependency
223
- name: cli_test
224
- requirement: !ruby/object:Gem::Requirement
213
+ - !ruby/object:Gem::Dependency
214
+ requirement: &id014 !ruby/object:Gem::Requirement
225
215
  none: false
226
- requirements:
216
+ requirements:
227
217
  - - ~>
228
- - !ruby/object:Gem::Version
229
- version: '1.0'
218
+ - !ruby/object:Gem::Version
219
+ hash: 15
220
+ segments:
221
+ - 1
222
+ - 0
223
+ version: "1.0"
230
224
  type: :development
225
+ name: cli_test
226
+ version_requirements: *id014
231
227
  prerelease: false
232
- version_requirements: !ruby/object:Gem::Requirement
233
- none: false
234
- requirements:
235
- - - ~>
236
- - !ruby/object:Gem::Version
237
- version: '1.0'
238
- - !ruby/object:Gem::Dependency
239
- name: rake-hooks
240
- requirement: !ruby/object:Gem::Requirement
228
+ - !ruby/object:Gem::Dependency
229
+ requirement: &id015 !ruby/object:Gem::Requirement
241
230
  none: false
242
- requirements:
243
- - - ! '>='
244
- - !ruby/object:Gem::Version
245
- version: '0'
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ hash: 3
235
+ segments:
236
+ - 0
237
+ version: "0"
246
238
  type: :development
239
+ name: rake-hooks
240
+ version_requirements: *id015
247
241
  prerelease: false
248
- version_requirements: !ruby/object:Gem::Requirement
249
- none: false
250
- requirements:
251
- - - ! '>='
252
- - !ruby/object:Gem::Version
253
- version: '0'
254
- description: Converts 2D track exports between different apps like Flame, MatchMover,
255
- PFTrack...
242
+ description: Converts 2D track exports between different apps like Flame, MatchMover, PFTrack...
256
243
  email: me@julik.nl
257
- executables:
244
+ executables:
258
245
  - tracksperanto
259
246
  extensions: []
260
- extra_rdoc_files:
261
- - README.rdoc
262
- files:
247
+
248
+ extra_rdoc_files:
249
+ - README.md
250
+ files:
263
251
  - CONTRIBUTING.md
264
252
  - Gemfile
265
253
  - History.txt
266
254
  - MIT_LICENSE.txt
267
- - README.rdoc
255
+ - README.md
268
256
  - Rakefile
269
257
  - bin/tracksperanto
270
258
  - lib/export/base.rb
@@ -329,6 +317,7 @@ files:
329
317
  - lib/tracksperanto/const_name.rb
330
318
  - lib/tracksperanto/ext_io.rb
331
319
  - lib/tracksperanto/format_detector.rb
320
+ - lib/tracksperanto/io_wrapper.rb
332
321
  - lib/tracksperanto/keyframe.rb
333
322
  - lib/tracksperanto/parameters.rb
334
323
  - lib/tracksperanto/pf_coords.rb
@@ -441,32 +430,39 @@ files:
441
430
  - test/tools/test_slip_middleware.rb
442
431
  - test/tools/test_start_trim_middleware.rb
443
432
  - tracksperanto.gemspec
433
+ has_rdoc: true
444
434
  homepage: http://guerilla-di.org/tracksperanto
445
- licenses:
435
+ licenses:
446
436
  - MIT
447
437
  post_install_message:
448
438
  rdoc_options: []
449
- require_paths:
439
+
440
+ require_paths:
450
441
  - lib
451
- required_ruby_version: !ruby/object:Gem::Requirement
442
+ required_ruby_version: !ruby/object:Gem::Requirement
452
443
  none: false
453
- requirements:
454
- - - ! '>='
455
- - !ruby/object:Gem::Version
456
- version: '0'
457
- segments:
444
+ requirements:
445
+ - - ">="
446
+ - !ruby/object:Gem::Version
447
+ hash: 3
448
+ segments:
458
449
  - 0
459
- hash: -3669593721904683814
460
- required_rubygems_version: !ruby/object:Gem::Requirement
450
+ version: "0"
451
+ required_rubygems_version: !ruby/object:Gem::Requirement
461
452
  none: false
462
- requirements:
463
- - - ! '>='
464
- - !ruby/object:Gem::Version
465
- version: '0'
453
+ requirements:
454
+ - - ">="
455
+ - !ruby/object:Gem::Version
456
+ hash: 3
457
+ segments:
458
+ - 0
459
+ version: "0"
466
460
  requirements: []
461
+
467
462
  rubyforge_project:
468
- rubygems_version: 1.8.25
463
+ rubygems_version: 1.6.2
469
464
  signing_key:
470
465
  specification_version: 3
471
466
  summary: A universal 2D tracks converter
472
467
  test_files: []
468
+