tracksperanto 2.9.9 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -8,6 +8,7 @@ gem "progressbar", "0.10.0"
8
8
  gem "update_hints", "~> 1.0"
9
9
 
10
10
  group :development do
11
+ gem "approximately"
11
12
  gem "jeweler"
12
13
  gem "rake"
13
14
  gem "flexmock", "~>0.8"
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 2.10.0
2
+
3
+ * Nuke importer now supports PlanarTracker nodes and their corner-pin output
4
+
1
5
  === 2.9.9
2
6
 
3
7
  * Add lens distortion middleware. Adds the possibility to remove or add Syntheyes lens distortion to your plates.
data/README.rdoc CHANGED
@@ -55,7 +55,7 @@ converted files already exist <b>they will be overwritten without warning</b>.
55
55
  == Format support
56
56
 
57
57
  Import and export support:
58
- * Nuke v5 script (Tracker3 nodes, also known as Tracker in the UI - this is the node that you track with)
58
+ * Nuke v5 script (Tracker3 nodes, also known as Tracker in the UI - this is the node that you track with, and Reconcile3D)
59
59
  * Shake tracker node export (textfile with many tracks per file)
60
60
  * PFTrack 2dt (version 4 and 5) anf PFMatchit/PFTrack 2011 point track exports
61
61
  * Syntheyes 2D tracking data exports
@@ -74,10 +74,10 @@ Export only:
74
74
  * Ruby (will make calls to Tracksperanto to create trackers/keyframes) - useful if you want to play with trackers as data
75
75
  * Maya locators (animated locators on an image plane)
76
76
 
77
- == Modularity
77
+ == Editing your tracks while converting
78
78
 
79
- Tracksperanto is very modular and can process data passing through it (like
80
- scaling a proxy track up). Consult the --help option to see what is available.
79
+ Tracksperanto has a number of features to scale, move, slip, distort and rename trackers.
80
+ Consult the --help option to see what is available.
81
81
 
82
82
  == Development
83
83
 
data/bin/tracksperanto CHANGED
@@ -68,11 +68,14 @@ op.on("--code PATH_TO_SCRIPT", String, "Load custom Ruby code into tracksperanto
68
68
  end
69
69
  end
70
70
 
71
+ def f(module_list)
72
+ "\n" + module_list.map{|e| "\t\t\t\t\t%s\n" % e }.join
73
+ end
71
74
 
72
- op.on(" -f", "--from TRANSLATOR", String, "Use the specific import translator - #{readers.join(", ")}") { |f| options[:importer] = f }
75
+ op.on(" -f", "--from TRANSLATOR", String, "Use the specific import translator, must be one of: #{f(readers)}") { |f| options[:importer] = f }
73
76
  op.on(" -w", "--width WIDTH_IN_PIXELS", Integer, "Absolute input comp width in pixels (will try to autodetect)") { |w| options[:width] = w }
74
77
  op.on(" -h", "--height HEIGHT_IN_PIXELS", Integer, "Absolute input comp height in pixels (will try to autodetect)") {|w| options[:height] = w }
75
- op.on(" -o", "--only EXPORTER_NAME", String, "Only export the selected format, format must be one of #{writers.join(", ")}") { |f| writer_class_name = f }
78
+ op.on(" -o", "--only EXPORTER_NAME", String, "Only export the selected format, format must be one of: #{f(writers)}") { |f| writer_class_name = f }
76
79
 
77
80
  op.on(" -xs", "--xscale X_SCALING_FACTOR", Float, mwd("Scaler"), &mw("Scaler", :x_factor))
78
81
 
@@ -81,12 +84,12 @@ op.on(" -pad", "--pad PAD_FRACTION_VALUES_COMMA_SEPARATED", String, mwd("Pad"))
81
84
  $middlewares.push(["Pad", {"left_pad" => left, "right_pad"=> right, "top_pad" => top, "bottom_pad" => bottom}])
82
85
  end
83
86
 
84
- op.on(" -u", "--undistort K_AND_KCUBE_COMMA_SEPARATED", String, mwd("LensDisto")) do | coefficients |
87
+ op.on(" -u", "--undistort K_AND_KCUBE_COMMA_SEPARATED", String, "Remove lens distortion using the Syntheyes algorithm") do | coefficients |
85
88
  k, kcube = coefficients.split(",").map{|e| e.to_f }
86
89
  $middlewares.push(["LensDisto", {"k" => k, "kcube"=> kcube, "remove" => true}])
87
90
  end
88
91
 
89
- op.on(" -d", "--distort K_AND_KCUBE_COMMA_SEPARATED", String, mwd("LensDisto")) do | coefficients |
92
+ op.on(" -d", "--distort K_AND_KCUBE_COMMA_SEPARATED", String, "Add lens distortion using the Syntheyes algorithm") do | coefficients |
90
93
  k, kcube = coefficients.split(",").map{|e| e.to_f }
91
94
  $middlewares.push(["LensDisto", {"k" => k, "kcube"=> kcube, "remove" => false}])
92
95
  end
@@ -19,6 +19,8 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
19
19
  scan_tracker_node(io).each(&Proc.new)
20
20
  elsif line =~ RECONCILE_PATTERN
21
21
  scan_reconcile_node(io).each(&Proc.new)
22
+ elsif line =~ PLANAR_PATTERN
23
+ scan_planar_tracker_node(io).each(&Proc.new)
22
24
  end
23
25
  end
24
26
  end
@@ -27,10 +29,11 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
27
29
 
28
30
  TRACKER_3_PATTERN = /^Tracker3 \{/
29
31
  RECONCILE_PATTERN = /^Reconcile3D \{/
32
+ PLANAR_PATTERN = /^PlanarTracker1_0 \{/
30
33
  OUTPUT_PATTERN = /^output \{/
31
34
  TRACK_PATTERN = /^track(\d) \{/
32
35
  NODENAME = /^name ([^\n]+)/
33
-
36
+ PLANAR_CORNERS = %w( outputBottomLeft outputBottomRight outputTopLeft outputTopRight)
34
37
 
35
38
  # Scans a Reconcile3D node and returs it's output
36
39
  def scan_reconcile_node(io)
@@ -46,6 +49,31 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
46
49
  end
47
50
  end
48
51
 
52
+ # Scans a PlanarTracker node and recovers corner pin
53
+ def scan_planar_tracker_node(io)
54
+ trackers, node_name = [], nil
55
+ while line = io.gets_and_strip
56
+ PLANAR_CORNERS.each do | corner_name |
57
+ if line =~ /#{corner_name}/
58
+ t = Tracksperanto::Tracker.new
59
+ t = extract_tracker(line)
60
+ t.name = corner_name
61
+ trackers.push(t.dup)
62
+ elsif line =~ NODENAME
63
+ node_name = $1
64
+ end
65
+ end
66
+
67
+ if node_name && trackers.length == 4
68
+ trackers.each{|t| t.name = "%s_%s" % [node_name, t.name] }
69
+ return trackers
70
+ end
71
+ end
72
+
73
+ # Fail
74
+ return []
75
+ end
76
+
49
77
  # Scans a tracker node and return all tracks within that node (no more than 4)
50
78
  def scan_tracker_node(io)
51
79
  tracks_in_tracker = []
@@ -1,19 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  class Tracksperanto::Middleware::LensDisto < Tracksperanto::Middleware::Base
3
3
  include Tracksperanto::UVCoordinates
4
-
5
- class Vector2 < Struct.new(:x, :y)
6
- end
7
-
8
- class RF < Struct.new(:r, :f)
9
- def inspect
10
- '(%0.3f %0.3f)' % [r, f]
11
- end
12
-
13
- def m
14
- r * f
15
- end
16
- end
4
+
17
5
 
18
6
  parameter :k, :cast => :float, :desc => "Quartic distortion coefficient", :default => 0
19
7
  parameter :kcube, :cast => :float, :desc => "Cubic distortion coefficient", :default => 0
@@ -29,6 +17,32 @@ class Tracksperanto::Middleware::LensDisto < Tracksperanto::Middleware::Base
29
17
  @width, @height = w, h
30
18
  @aspect = @width.to_f / @height
31
19
 
20
+ generate_lut
21
+ super
22
+ end
23
+
24
+ def export_point(frame, float_x, float_y, float_residual)
25
+ x, y = remove ? undisto(float_x, float_y) : disto(float_x, float_y)
26
+ super(frame, x, y, float_residual)
27
+ end
28
+
29
+ private
30
+
31
+ class Vector2 < Struct.new(:x, :y)
32
+ end
33
+
34
+ class RF < Struct.new(:r, :f)
35
+ def inspect
36
+ '(%0.3f %0.3f)' % [r, f]
37
+ end
38
+
39
+ def m
40
+ r * f
41
+ end
42
+ end
43
+
44
+ # We apply disto using a lookup table of y = f(r)
45
+ def generate_lut
32
46
  # Generate the lookup table
33
47
  @lut = [RF.new(0.0, 1.0)]
34
48
  max_r = @aspect + 1
@@ -37,20 +51,10 @@ class Tracksperanto::Middleware::LensDisto < Tracksperanto::Middleware::Base
37
51
  r = 0
38
52
  STEPS.times do | mult |
39
53
  r += increment
40
- @lut.push(RF.new(r, disto_radius(r)))
54
+ @lut.push(RF.new(r, distort_radius(r)))
41
55
  end
42
-
43
- @lut.inspect
44
- super
45
56
  end
46
57
 
47
- def export_point(frame, float_x, float_y, float_residual)
48
- x, y = remove ? undisto(float_x, float_y) : disto(float_x, float_y)
49
- super(frame, x, y, float_residual)
50
- end
51
-
52
- private
53
-
54
58
  def with_uv(x, y)
55
59
  vec = Vector2.new(convert_to_uv(x, @width), convert_to_uv(y, @height))
56
60
  yield(vec)
@@ -58,40 +62,29 @@ class Tracksperanto::Middleware::LensDisto < Tracksperanto::Middleware::Base
58
62
  end
59
63
 
60
64
  # Radius is equal to aspect at the rightmost extremity
61
- def disto_radius(r)
62
- r2 = r ** 2
63
- # Skipping the square root speeds things up if we don't need it
64
- f = if kcube.abs > 0.00001
65
- 1 + (r2 * (k + kcube * Math.sqrt(r2)));
66
- else
67
- 1 + (r2 * k);
68
- end
65
+ def distort_radius(r)
66
+ 1 + (r*r*(k + kcube * r))
69
67
  end
70
68
 
71
69
  def disto(x, y)
72
70
  with_uv(x, y) do | pt |
73
- # Get the radius of the point
74
- x = pt.x * @aspect
75
- r = Math.sqrt(x.abs**2 + pt.y.abs**2)
76
-
77
71
  # Find the good tuples to interpolate on
78
- f = disto_interpolated(r)
79
-
72
+ f = disto_interpolated(get_radius(pt))
80
73
  pt.x = pt.x * f
81
74
  pt.y = pt.y * f
82
75
  end
83
76
  end
84
77
 
78
+ def get_radius(pt)
79
+ # Get the radius of the point
80
+ x = pt.x * @aspect
81
+ r = Math.sqrt(x.abs**2 + pt.y.abs**2)
82
+ end
85
83
 
86
84
  def undisto(x, y)
87
85
  with_uv(x, y) do | pt |
88
- # Get the radius of the point
89
- x = pt.x * @aspect
90
- r = Math.sqrt(x.abs**2 + pt.y.abs**2)
91
-
92
86
  # Find the good tuples to interpolate on
93
- f = undisto_interpolated(r)
94
-
87
+ f = undisto_interpolated(get_radius(pt))
95
88
  pt.x = pt.x / f
96
89
  pt.y = pt.y / f
97
90
  end
data/lib/pipeline/base.rb CHANGED
@@ -26,7 +26,7 @@ module Tracksperanto::Pipeline
26
26
  # applies the middlewares. Here's how a calling sequence for a pipeline looks like:
27
27
  #
28
28
  # pipe = Tracksperanto::Pipeline::Base.new
29
- # pipe.middleware_tuples = ["Golden", {:enabled => true}]
29
+ # pipe.middleware_tuples = ["Shift", {:x => 10}]
30
30
  # pipe.progress_block = lambda{|percent, msg| puts("#{msg}..#{percent.to_i}%") }
31
31
  # pipe.run("/tmp/shakescript.shk", :width => 720, :height => 576)
32
32
  #
data/lib/tracksperanto.rb CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Tracksperanto
5
5
  PATH = File.expand_path(File.dirname(__FILE__))
6
- VERSION = '2.9.9'
6
+ VERSION = '2.10.0'
7
7
 
8
8
  module Import; end
9
9
  module Export; end
data/test/helper.rb CHANGED
@@ -4,6 +4,7 @@ require File.dirname(__FILE__) + '/../lib/tracksperanto' unless defined?(Tracksp
4
4
  require 'test/unit'
5
5
  require 'flexmock'
6
6
  require 'flexmock/test_unit'
7
+ require 'approximately'
7
8
  require 'fileutils'
8
9
 
9
10
  unless File.exist?(File.dirname(__FILE__) + "/import/samples")
@@ -34,6 +34,20 @@ class NukeImportTest < Test::Unit::TestCase
34
34
  assert_equal 128, trackers[0].length
35
35
  end
36
36
 
37
+ def test_parsing_planar_tracker
38
+ fixture = File.open(File.dirname(__FILE__) + '/samples/nuke/planar.nk')
39
+
40
+ parser = Tracksperanto::Import::NukeScript.new(:io => fixture)
41
+ parser.width = 4096
42
+ parser.height = 2304
43
+
44
+ trackers = parser.to_a
45
+ assert_equal 4, trackers.length
46
+
47
+ ref_names = %w( PlanarTracker2_outputBottomLeft PlanarTracker2_outputBottomRight
48
+ PlanarTracker2_outputTopRight PlanarTracker2_outputTopLeft )
49
+ assert_equal ref_names, trackers.map{|e| e.name }
50
+ end
37
51
 
38
52
  def test_parsing_from_nuke
39
53
  fixture = File.open(File.dirname(__FILE__) + '/samples/nuke/one_tracker_with_break.nk')
@@ -121,6 +135,7 @@ x754 912.0731812 x755 913.7190552 916.0959473 918.1025391 920.0751953 922.189880
121
135
  assert_equal 754, result[7][0]
122
136
  end
123
137
 
138
+
124
139
  def test_zip_channels
125
140
  tuples_x = [[1, 125], [3, 234], [5, 456], [9,876]]
126
141
  tuples_y = [[2, 437], [3, 123], [6, 432], [9, 430]]
@@ -3,6 +3,8 @@ require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class LensMiddlewareTest < Test::Unit::TestCase
5
5
 
6
+ include Approximately
7
+
6
8
  def test_action_description
7
9
  assert_equal "Apply or remove lens distortion with the Syntheyes algorithm", Tracksperanto::Middleware::LensDisto.action_description
8
10
  end
@@ -27,7 +29,8 @@ class LensMiddlewareTest < Test::Unit::TestCase
27
29
  receiver = flexmock
28
30
  receiver.should_receive(:start_export).once.with(1920, 1080)
29
31
  receiver.should_receive(:start_tracker_segment).once.with("Tracker")
30
- receiver.should_receive(:export_point).once.with(1, 66.03001446825158, 43.978678913818925, 0)
32
+ receiver.should_receive(:export_point).once.with(1, approx(66.03), approx(43.978), approx(0))
33
+
31
34
  receiver.should_receive(:end_tracker_segment).once
32
35
  receiver.should_receive(:end_export).once
33
36
 
@@ -43,7 +46,7 @@ class LensMiddlewareTest < Test::Unit::TestCase
43
46
  receiver = flexmock
44
47
  receiver.should_receive(:start_export).once.with(1920, 1080)
45
48
  receiver.should_receive(:start_tracker_segment).once.with("Tracker")
46
- receiver.should_receive(:export_point).once.with(1, 11.999914830236555, 13.99995274335909, 0)
49
+ receiver.should_receive(:export_point).once.with(1, approx(11.999914830236555), approx(13.99995274335909), 0)
47
50
  receiver.should_receive(:end_tracker_segment).once
48
51
  receiver.should_receive(:end_export).once
49
52
 
@@ -59,7 +62,7 @@ class LensMiddlewareTest < Test::Unit::TestCase
59
62
  receiver = flexmock
60
63
  receiver.should_receive(:start_export).once.with(1920, 1080)
61
64
  receiver.should_receive(:start_tracker_segment).once.with("Tracker")
62
- receiver.should_receive(:export_point).once.with(1, 1.0, 1.0, 0)
65
+ receiver.should_receive(:export_point).once.with(1, approx(0.984), approx(0.991), 0)
63
66
  receiver.should_receive(:end_tracker_segment).once
64
67
  receiver.should_receive(:end_export).once
65
68
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "tracksperanto"
8
- s.version = "2.9.9"
8
+ s.version = "2.10.0"
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 = "2012-04-10"
12
+ s.date = "2012-05-30"
13
13
  s.description = "Converts 2D track exports between different apps like Flame, MatchMover, PFTrack..."
14
14
  s.email = "me@julik.nl"
15
15
  s.executables = ["tracksperanto"]
@@ -198,6 +198,7 @@ Gem::Specification.new do |s|
198
198
  s.add_runtime_dependency(%q<flame_channel_parser>, ["~> 4.0"])
199
199
  s.add_runtime_dependency(%q<progressbar>, ["= 0.10.0"])
200
200
  s.add_runtime_dependency(%q<update_hints>, ["~> 1.0"])
201
+ s.add_development_dependency(%q<approximately>, [">= 0"])
201
202
  s.add_development_dependency(%q<jeweler>, [">= 0"])
202
203
  s.add_development_dependency(%q<rake>, [">= 0"])
203
204
  s.add_development_dependency(%q<flexmock>, ["~> 0.8"])
@@ -208,6 +209,7 @@ Gem::Specification.new do |s|
208
209
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
209
210
  s.add_dependency(%q<progressbar>, ["= 0.10.0"])
210
211
  s.add_dependency(%q<update_hints>, ["~> 1.0"])
212
+ s.add_dependency(%q<approximately>, [">= 0"])
211
213
  s.add_dependency(%q<jeweler>, [">= 0"])
212
214
  s.add_dependency(%q<rake>, [">= 0"])
213
215
  s.add_dependency(%q<flexmock>, ["~> 0.8"])
@@ -219,6 +221,7 @@ Gem::Specification.new do |s|
219
221
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
220
222
  s.add_dependency(%q<progressbar>, ["= 0.10.0"])
221
223
  s.add_dependency(%q<update_hints>, ["~> 1.0"])
224
+ s.add_dependency(%q<approximately>, [">= 0"])
222
225
  s.add_dependency(%q<jeweler>, [">= 0"])
223
226
  s.add_dependency(%q<rake>, [">= 0"])
224
227
  s.add_dependency(%q<flexmock>, ["~> 0.8"])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tracksperanto
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.9
4
+ version: 2.10.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-10 00:00:00.000000000 Z
12
+ date: 2012-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: obuf
16
- requirement: &12549320 !ruby/object:Gem::Requirement
16
+ requirement: &81500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *12549320
24
+ version_requirements: *81500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: progressive_io
27
- requirement: &12549080 !ruby/object:Gem::Requirement
27
+ requirement: &80900 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *12549080
35
+ version_requirements: *80900
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: flame_channel_parser
38
- requirement: &12548840 !ruby/object:Gem::Requirement
38
+ requirement: &80430 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '4.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *12548840
46
+ version_requirements: *80430
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: progressbar
49
- requirement: &12548600 !ruby/object:Gem::Requirement
49
+ requirement: &79900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.10.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *12548600
57
+ version_requirements: *79900
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: update_hints
60
- requirement: &12548360 !ruby/object:Gem::Requirement
60
+ requirement: &79370 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,21 @@ dependencies:
65
65
  version: '1.0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *12548360
68
+ version_requirements: *79370
69
+ - !ruby/object:Gem::Dependency
70
+ name: approximately
71
+ requirement: &79050 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *79050
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: jeweler
71
- requirement: &12548120 !ruby/object:Gem::Requirement
82
+ requirement: &78640 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *12548120
90
+ version_requirements: *78640
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: rake
82
- requirement: &12547880 !ruby/object:Gem::Requirement
93
+ requirement: &78050 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,10 +98,10 @@ dependencies:
87
98
  version: '0'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *12547880
101
+ version_requirements: *78050
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: flexmock
93
- requirement: &12547640 !ruby/object:Gem::Requirement
104
+ requirement: &524110 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ~>
@@ -98,10 +109,10 @@ dependencies:
98
109
  version: '0.8'
99
110
  type: :development
100
111
  prerelease: false
101
- version_requirements: *12547640
112
+ version_requirements: *524110
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: cli_test
104
- requirement: &12547400 !ruby/object:Gem::Requirement
115
+ requirement: &522630 !ruby/object:Gem::Requirement
105
116
  none: false
106
117
  requirements:
107
118
  - - ~>
@@ -109,7 +120,7 @@ dependencies:
109
120
  version: '1.0'
110
121
  type: :development
111
122
  prerelease: false
112
- version_requirements: *12547400
123
+ version_requirements: *522630
113
124
  description: Converts 2D track exports between different apps like Flame, MatchMover,
114
125
  PFTrack...
115
126
  email: me@julik.nl
@@ -299,7 +310,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
299
310
  version: '0'
300
311
  segments:
301
312
  - 0
302
- hash: 179279919
313
+ hash: -819741475
303
314
  required_rubygems_version: !ruby/object:Gem::Requirement
304
315
  none: false
305
316
  requirements: