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 +1 -0
- data/History.txt +4 -0
- data/README.rdoc +4 -4
- data/bin/tracksperanto +7 -4
- data/lib/import/nuke_script.rb +29 -1
- data/lib/middleware/lens_disto.rb +37 -44
- data/lib/pipeline/base.rb +1 -1
- data/lib/tracksperanto.rb +1 -1
- data/test/helper.rb +1 -0
- data/test/import/test_nuke_import.rb +15 -0
- data/test/middleware/test_lens_middleware.rb +6 -3
- data/tracksperanto.gemspec +5 -2
- metadata +32 -21
data/Gemfile
CHANGED
data/History.txt
CHANGED
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
|
-
==
|
77
|
+
== Editing your tracks while converting
|
78
78
|
|
79
|
-
Tracksperanto
|
80
|
-
|
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
|
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
|
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,
|
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,
|
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
|
data/lib/import/nuke_script.rb
CHANGED
@@ -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,
|
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
|
62
|
-
|
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(
|
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(
|
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 = ["
|
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
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.
|
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,
|
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
|
|
data/tracksperanto.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "tracksperanto"
|
8
|
-
s.version = "2.
|
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-
|
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.
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *81500
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: progressive_io
|
27
|
-
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: *
|
35
|
+
version_requirements: *80900
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: flame_channel_parser
|
38
|
-
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: *
|
46
|
+
version_requirements: *80430
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: progressbar
|
49
|
-
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: *
|
57
|
+
version_requirements: *79900
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: update_hints
|
60
|
-
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: *
|
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: &
|
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: *
|
90
|
+
version_requirements: *78640
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: rake
|
82
|
-
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: *
|
101
|
+
version_requirements: *78050
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: flexmock
|
93
|
-
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: *
|
112
|
+
version_requirements: *524110
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: cli_test
|
104
|
-
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: *
|
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:
|
313
|
+
hash: -819741475
|
303
314
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
304
315
|
none: false
|
305
316
|
requirements:
|