tracksperanto 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Rakefile +1 -1
- data/lib/export/nuke_script.rb +5 -9
- data/lib/export/pftrack.rb +9 -4
- data/lib/export/pftrack_5.rb +4 -4
- data/lib/middleware/base.rb +4 -4
- data/lib/middleware/flip.rb +3 -7
- data/lib/middleware/flop.rb +2 -6
- data/lib/middleware/scaler.rb +7 -4
- data/lib/pipeline/base.rb +11 -5
- data/lib/tracksperanto.rb +1 -1
- data/lib/tracksperanto/accumulator.rb +5 -5
- data/lib/tracksperanto/tracker.rb +4 -6
- data/test/export/samples/ref_PFTrack.2dt +12 -12
- data/test/export/test_boujou_export.rb +1 -1
- data/test/export/test_equalizer3_export.rb +1 -1
- data/test/export/test_equalizer_export.rb +1 -1
- data/test/export/test_flame_stabilizer_export.rb +1 -1
- data/test/export/test_match_mover_export.rb +1 -1
- data/test/export/test_maya_live_export.rb +1 -1
- data/test/export/test_mux.rb +1 -1
- data/test/export/test_nuke_export.rb +3 -3
- data/test/export/test_pftrack5_export.rb +1 -1
- data/test/export/test_pftrack_export.rb +1 -1
- data/test/export/test_shake_export.rb +1 -1
- data/test/export/test_syntheyes_export.rb +1 -1
- data/test/import/test_3de_import.rb +1 -1
- data/test/import/test_3de_import3.rb +1 -1
- data/test/import/test_boujou_import.rb +1 -1
- data/test/import/test_flame_import.rb +1 -1
- data/test/import/test_match_mover_import.rb +1 -1
- data/test/import/test_maya_live_import.rb +1 -1
- data/test/import/test_nuke_import.rb +1 -1
- data/test/import/test_pftrack_import.rb +1 -1
- data/test/import/test_shake_catcher.rb +1 -1
- data/test/import/test_shake_lexer.rb +1 -1
- data/test/import/test_shake_script_import.rb +1 -1
- data/test/import/test_shake_text_import.rb +1 -1
- data/test/import/test_syntheyes_import.rb +1 -1
- data/test/middleware/test_flip_middleware.rb +13 -6
- data/test/middleware/test_flop_middleware.rb +1 -1
- data/test/middleware/test_golden_middleware.rb +1 -1
- data/test/middleware/test_length_cutoff_middleware.rb +1 -1
- data/test/middleware/test_lens_distort_middleware.rb +1 -1
- data/test/middleware/test_lerp_middleware.rb +1 -1
- data/test/middleware/test_prefix.rb +1 -1
- data/test/middleware/test_reformat_middleware.rb +1 -1
- data/test/middleware/test_scaler_middleware.rb +12 -2
- data/test/middleware/test_shift_middleware.rb +1 -1
- data/test/middleware/test_slip_middleware.rb +1 -1
- data/test/test_buffer_io.rb +1 -1
- data/test/test_cli.rb +1 -1
- data/test/test_const_name.rb +1 -1
- data/test/test_extio.rb +1 -1
- data/test/test_flame_builder.rb +1 -1
- data/test/test_format_detector.rb +1 -1
- data/test/test_keyframe.rb +1 -1
- data/test/test_pipeline.rb +1 -1
- data/test/test_progressive_io.rb +1 -1
- data/test/test_simple_export.rb +1 -1
- data/test/test_tracker.rb +1 -1
- data/test/test_tracksperanto.rb +1 -1
- metadata +4 -4
data/History.txt
CHANGED
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ begin
|
|
14
14
|
p.rubyforge_name = 'guerilla-di'
|
15
15
|
p.developer('Julik Tarkhanov', 'me@julik.nl')
|
16
16
|
p.extra_rdoc_files = p.extra_rdoc_files.reject{|e| e =~ "samples\/"}
|
17
|
-
p.clean_globs = %w( **/.DS_Store coverage.info )
|
17
|
+
p.clean_globs = %w( **/.DS_Store coverage.info **/*.rbc .idea)
|
18
18
|
end
|
19
19
|
rescue LoadError
|
20
20
|
$stderr.puts "Meta-operations on this package require Hoe"
|
data/lib/export/nuke_script.rb
CHANGED
@@ -27,11 +27,6 @@ Constant {
|
|
27
27
|
xpos 0
|
28
28
|
ypos -60
|
29
29
|
}]
|
30
|
-
class T < Array
|
31
|
-
attr_accessor :name
|
32
|
-
include ::Tracksperanto::BlockInit
|
33
|
-
end
|
34
|
-
|
35
30
|
#:doc:
|
36
31
|
|
37
32
|
# Offset by which the new nodes will be shifted down in the node graph
|
@@ -57,18 +52,19 @@ Constant {
|
|
57
52
|
# We accumulate a tracker and on end dump it out in one piece
|
58
53
|
def start_tracker_segment(tracker_name)
|
59
54
|
# Setup for the next tracker
|
60
|
-
@tracker =
|
55
|
+
@tracker = Tracksperanto::Tracker.new(:name => tracker_name)
|
61
56
|
end
|
62
57
|
|
63
58
|
def end_tracker_segment
|
64
|
-
@
|
65
|
-
|
59
|
+
coord_tuples = @tracker.map{|kf| [kf.frame, kf.abs_x, kf.abs_y]}
|
60
|
+
@trackers_io.puts(
|
61
|
+
NODE_TEMPLATE % [curves_from_tuples(coord_tuples), @tracker.name, (@ypos += SCHEMATIC_OFFSET)]
|
66
62
|
)
|
67
63
|
end
|
68
64
|
|
69
65
|
def export_point(frame, abs_float_x, abs_float_y, float_residual)
|
70
66
|
# Nuke uses 1-based frames
|
71
|
-
@tracker
|
67
|
+
@tracker.keyframe!(:frame => frame + 1, :abs_x => abs_float_x, :abs_y => abs_float_y)
|
72
68
|
@max_frame = frame if frame > @max_frame
|
73
69
|
end
|
74
70
|
|
data/lib/export/pftrack.rb
CHANGED
@@ -3,6 +3,9 @@ class Tracksperanto::Export::PFTrack4 < Tracksperanto::Export::Base
|
|
3
3
|
|
4
4
|
KEYFRAME_TEMPLATE = "%s %.3f %.3f %.3f"
|
5
5
|
|
6
|
+
# PFtrack wants cross-platform linebreaks
|
7
|
+
LINEBREAK = "\r\n"
|
8
|
+
|
6
9
|
def self.desc_and_extension
|
7
10
|
"pftrack_v4.2dt"
|
8
11
|
end
|
@@ -19,9 +22,11 @@ class Tracksperanto::Export::PFTrack4 < Tracksperanto::Export::Base
|
|
19
22
|
end
|
20
23
|
|
21
24
|
def end_tracker_segment
|
22
|
-
@io.write(
|
23
|
-
@io.
|
24
|
-
@io.
|
25
|
+
2.times { @io.write(LINEBREAK) }
|
26
|
+
@io.write(@tracker_name.inspect) # autoquotes
|
27
|
+
@io.write(LINEBREAK)
|
28
|
+
@io.write(@frame_count)
|
29
|
+
@io.write(LINEBREAK)
|
25
30
|
|
26
31
|
@tracker_io.rewind
|
27
32
|
@io.write(@tracker_io.read) until @tracker_io.eof?
|
@@ -32,6 +37,6 @@ class Tracksperanto::Export::PFTrack4 < Tracksperanto::Export::Base
|
|
32
37
|
@frame_count += 1
|
33
38
|
line = KEYFRAME_TEMPLATE % [frame, abs_float_x, abs_float_y, float_residual / 8]
|
34
39
|
@tracker_io.write(line)
|
35
|
-
@tracker_io.write(
|
40
|
+
@tracker_io.write(LINEBREAK)
|
36
41
|
end
|
37
42
|
end
|
data/lib/export/pftrack_5.rb
CHANGED
@@ -10,13 +10,13 @@ class Tracksperanto::Export::PFTrack5 < Tracksperanto::Export::PFTrack4
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def end_tracker_segment
|
13
|
-
@io.write(
|
13
|
+
2.times { @io.write(LINEBREAK) }
|
14
14
|
@io.write(@tracker_name.inspect) # autoquotes
|
15
|
-
@io.write(
|
15
|
+
@io.write(LINEBREAK)
|
16
16
|
@io.write("Primary".inspect) # For primary/secondary cam in stereo pair
|
17
|
-
@io.write(
|
17
|
+
@io.write(LINEBREAK)
|
18
18
|
@io.write(@frame_count)
|
19
|
-
@io.write(
|
19
|
+
@io.write(LINEBREAK)
|
20
20
|
|
21
21
|
@tracker_io.rewind
|
22
22
|
@io.write(@tracker_io.read) until @tracker_io.eof?
|
data/lib/middleware/base.rb
CHANGED
@@ -10,14 +10,14 @@ class Tracksperanto::Middleware::Base
|
|
10
10
|
# Used to automatically register your middleware in Tracksperanto.middlewares
|
11
11
|
# Normally you wouldn't need to override this
|
12
12
|
def self.inherited(by)
|
13
|
-
Tracksperanto.middlewares
|
13
|
+
Tracksperanto.middlewares.push(by)
|
14
14
|
super
|
15
15
|
end
|
16
16
|
|
17
17
|
# Constructor accepts the exporter that will be wrapped
|
18
|
-
def initialize(
|
19
|
-
@exporter =
|
20
|
-
super
|
18
|
+
def initialize(*exporter_and_args_for_block_init)
|
19
|
+
@exporter = exporter_and_args_for_block_init.shift
|
20
|
+
super
|
21
21
|
end
|
22
22
|
|
23
23
|
# Called on export start
|
data/lib/middleware/flip.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
# Flips the comp being exported horizontally
|
2
2
|
class Tracksperanto::Middleware::Flip < Tracksperanto::Middleware::Base
|
3
|
-
|
3
|
+
|
4
4
|
attr_accessor :enabled
|
5
5
|
|
6
6
|
def start_export(w, h)
|
7
|
-
|
7
|
+
factor = enabled ? -1 : 1
|
8
|
+
@exporter = Tracksperanto::Middleware::Scaler.new(@exporter, :x_factor => factor)
|
8
9
|
super
|
9
10
|
end
|
10
|
-
|
11
|
-
def export_point(frame, float_x, float_y, float_residual)
|
12
|
-
x = @enabled ? (@w - float_x) : float_x
|
13
|
-
super(frame, x, float_y, float_residual)
|
14
|
-
end
|
15
11
|
end
|
data/lib/middleware/flop.rb
CHANGED
@@ -4,12 +4,8 @@ class Tracksperanto::Middleware::Flop < Tracksperanto::Middleware::Base
|
|
4
4
|
attr_accessor :enabled
|
5
5
|
|
6
6
|
def start_export(w, h)
|
7
|
-
|
7
|
+
factor = enabled ? -1 : 1
|
8
|
+
@exporter = Tracksperanto::Middleware::Scaler.new(@exporter, :y_factor => factor)
|
8
9
|
super
|
9
10
|
end
|
10
|
-
|
11
|
-
def export_point(frame, float_x, float_y, float_residual)
|
12
|
-
y = @enabled ? (@h - float_y) : float_y
|
13
|
-
super(frame, float_x, y, float_residual)
|
14
|
-
end
|
15
11
|
end
|
data/lib/middleware/scaler.rb
CHANGED
@@ -8,7 +8,8 @@ class Tracksperanto::Middleware::Scaler < Tracksperanto::Middleware::Base
|
|
8
8
|
# Called on export start
|
9
9
|
def start_export( img_width, img_height)
|
10
10
|
set_residual_factor
|
11
|
-
|
11
|
+
@w, @h = (img_width * x_factor).to_i.abs, (img_height * y_factor).to_i.abs
|
12
|
+
super(@w, @h)
|
12
13
|
end
|
13
14
|
|
14
15
|
def y_factor
|
@@ -20,9 +21,11 @@ class Tracksperanto::Middleware::Scaler < Tracksperanto::Middleware::Base
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def export_point(frame, float_x, float_y, float_residual)
|
23
|
-
super
|
24
|
-
|
25
|
-
|
24
|
+
return super if @y_factor == DEFAULT_FACTOR && @x_factor == DEFAULT_FACTOR
|
25
|
+
|
26
|
+
super(frame,
|
27
|
+
x_factor < 0 ? (@w + (float_x * x_factor)) : (float_x * x_factor),
|
28
|
+
y_factor < 0 ? (@h + (float_y * y_factor)) : (float_y * y_factor),
|
26
29
|
(float_residual * @residual_factor)
|
27
30
|
)
|
28
31
|
end
|
data/lib/pipeline/base.rb
CHANGED
@@ -118,16 +118,18 @@ class Tracksperanto::Pipeline::Base
|
|
118
118
|
|
119
119
|
accumulator = Tracksperanto::Accumulator.new
|
120
120
|
importer.receiver = accumulator
|
121
|
-
@ios << accumulator
|
121
|
+
@ios << accumulator # Ensure the accumulator gets closed and tempfile unlinked
|
122
122
|
|
123
123
|
importer.stream_parse(io_with_progress)
|
124
124
|
|
125
125
|
report_progress(percent_complete = 50.0, "Validating #{accumulator.length} imported trackers")
|
126
|
-
|
126
|
+
if accumulator.num_objects.zero?
|
127
|
+
raise "Could not recover any non-empty trackers from this file. Wrong import format maybe?"
|
128
|
+
end
|
127
129
|
|
128
130
|
report_progress(percent_complete, "Starting export")
|
129
131
|
|
130
|
-
percent_per_tracker = (100.0 - percent_complete) / accumulator.
|
132
|
+
percent_per_tracker = (100.0 - percent_complete) / accumulator.num_objects
|
131
133
|
|
132
134
|
# Use the width and height provided by the parser itself
|
133
135
|
exporter.start_export(importer.width, importer.height)
|
@@ -140,7 +142,10 @@ class Tracksperanto::Pipeline::Base
|
|
140
142
|
t.each_with_index do | kf, idx |
|
141
143
|
keyframes += 1
|
142
144
|
exporter.export_point(kf.frame, kf.abs_x, kf.abs_y, kf.residual)
|
143
|
-
report_progress(
|
145
|
+
report_progress(
|
146
|
+
percent_complete += kf_weight,
|
147
|
+
"Writing keyframe #{idx+1} of #{t.name.inspect}, #{accumulator.num_objects - tracker_idx} trackers to go"
|
148
|
+
)
|
144
149
|
end
|
145
150
|
exporter.end_tracker_segment
|
146
151
|
end
|
@@ -150,7 +155,8 @@ class Tracksperanto::Pipeline::Base
|
|
150
155
|
|
151
156
|
[points, keyframes]
|
152
157
|
ensure
|
153
|
-
@ios.
|
158
|
+
@ios.map!{|e| e.close! rescue e.close }
|
159
|
+
@ios = []
|
154
160
|
end
|
155
161
|
|
156
162
|
# Setup output files and return a single output
|
data/lib/tracksperanto.rb
CHANGED
@@ -4,17 +4,17 @@
|
|
4
4
|
class Tracksperanto::Accumulator < DelegateClass(IO)
|
5
5
|
|
6
6
|
# Stores the number of objects stored so far
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :num_objects
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
__setobj__(Tracksperanto::BufferIO.new)
|
11
|
-
@
|
11
|
+
@num_objects = 0
|
12
12
|
end
|
13
13
|
|
14
14
|
# Store an object
|
15
15
|
def push(object_to_store)
|
16
16
|
|
17
|
-
@
|
17
|
+
@num_objects += 1
|
18
18
|
|
19
19
|
d = Marshal.dump(object_to_store)
|
20
20
|
bytelen = d.size
|
@@ -24,10 +24,10 @@ class Tracksperanto::Accumulator < DelegateClass(IO)
|
|
24
24
|
write("\n")
|
25
25
|
end
|
26
26
|
|
27
|
-
# Retreive each stored object in succession
|
27
|
+
# Retreive each stored object in succession and unlink the buffer
|
28
28
|
def each_object_with_index
|
29
29
|
rewind
|
30
|
-
@
|
30
|
+
@num_objects.times { |i| yield(recover_object, i - 1) }
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Internal representation of a tracker point with keyframes. A Tracker is an array of Keyframe objects and should act and work like one
|
2
2
|
class Tracksperanto::Tracker < DelegateClass(Array)
|
3
3
|
include Tracksperanto::Casts
|
4
|
+
include Tracksperanto::BlockInit
|
4
5
|
include Comparable
|
5
6
|
|
6
7
|
# Contains the name of the tracker
|
@@ -10,17 +11,14 @@ class Tracksperanto::Tracker < DelegateClass(Array)
|
|
10
11
|
def initialize(object_attribute_hash = {})
|
11
12
|
@name = "Tracker"
|
12
13
|
__setobj__(Array.new)
|
13
|
-
|
14
|
-
yield(self) if block_given?
|
14
|
+
super
|
15
15
|
end
|
16
16
|
|
17
17
|
def keyframes=(new_kf_array)
|
18
18
|
__setobj__(new_kf_array.dup)
|
19
19
|
end
|
20
|
-
|
21
|
-
|
22
|
-
__getobj__
|
23
|
-
end
|
20
|
+
|
21
|
+
alias_method :keyframes, :__getobj__
|
24
22
|
|
25
23
|
# Trackers sort by the position of the first keyframe
|
26
24
|
def <=>(other_tracker)
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
"Parabolic_1_from_top_left"
|
4
|
-
19
|
1
|
+
|
2
|
+
|
3
|
+
"Parabolic_1_from_top_left"
|
4
|
+
19
|
5
5
|
0 0.000 1080.000 0.000
|
6
6
|
1 96.000 874.800 0.006
|
7
7
|
2 192.000 691.200 0.012
|
@@ -21,10 +21,10 @@
|
|
21
21
|
18 1728.000 691.200 0.107
|
22
22
|
19 1824.000 874.800 0.113
|
23
23
|
20 1920.000 1080.000 0.119
|
24
|
-
|
25
|
-
|
26
|
-
"Parabolic_2_from_bottom_right"
|
27
|
-
19
|
24
|
+
|
25
|
+
|
26
|
+
"Parabolic_2_from_bottom_right"
|
27
|
+
19
|
28
28
|
0 1920.000 0.000 0.000
|
29
29
|
1 1824.000 205.200 0.006
|
30
30
|
2 1728.000 388.800 0.012
|
@@ -44,8 +44,8 @@
|
|
44
44
|
18 192.000 388.800 0.107
|
45
45
|
19 96.000 205.200 0.113
|
46
46
|
20 0.000 0.000 0.119
|
47
|
-
|
48
|
-
|
49
|
-
"SingleFrame"
|
50
|
-
1
|
47
|
+
|
48
|
+
|
49
|
+
"SingleFrame"
|
50
|
+
1
|
51
51
|
0 970.000 550.000 0.000
|
data/test/export/test_mux.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../helper'
|
2
2
|
|
3
3
|
class NukeExportTest < Test::Unit::TestCase
|
4
4
|
include ParabolicTracks
|
5
|
-
|
5
|
+
TEST_FILE = File.dirname(__FILE__) + "/samples/ref_NukeScript.nk"
|
6
6
|
PREAMBLE = 'version 5.1200
|
7
7
|
Root {
|
8
8
|
inputs 0
|
@@ -19,7 +19,7 @@ Constant {
|
|
19
19
|
ypos -60
|
20
20
|
}'
|
21
21
|
def test_export_output_written
|
22
|
-
ensure_same_output Tracksperanto::Export::NukeScript,
|
22
|
+
ensure_same_output Tracksperanto::Export::NukeScript, TEST_FILE
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_exporter_meta
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../helper'
|
2
2
|
|
3
3
|
class FlipMiddlewareTest < Test::Unit::TestCase
|
4
|
-
def
|
4
|
+
def test_flip_supports_hash_init
|
5
5
|
receiver = flexmock
|
6
6
|
|
7
7
|
m = Tracksperanto::Middleware::Flip.new(receiver)
|
@@ -11,16 +11,23 @@ class FlipMiddlewareTest < Test::Unit::TestCase
|
|
11
11
|
assert m.enabled
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def test_export_with_enabled_flip
|
15
15
|
receiver = flexmock(:exporter)
|
16
16
|
receiver.should_receive(:start_export).once.with(110, 120)
|
17
17
|
receiver.should_receive(:export_point).once.with(1, 100, 95, 0)
|
18
|
-
|
19
|
-
|
18
|
+
|
20
19
|
m = Tracksperanto::Middleware::Flip.new(receiver, :enabled => true)
|
21
20
|
m.start_export(110, 120)
|
22
21
|
m.export_point(1, 10, 95, 0)
|
23
|
-
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_export_with_disabled_flip
|
25
|
+
receiver = flexmock(:exporter)
|
26
|
+
receiver.should_receive(:start_export).once.with(110, 120)
|
27
|
+
receiver.should_receive(:export_point).once.with(1, 10, 95, 0)
|
28
|
+
|
29
|
+
m = Tracksperanto::Middleware::Flip.new(receiver, :enabled => false)
|
30
|
+
m.start_export(110, 120)
|
24
31
|
m.export_point(1, 10, 95, 0)
|
25
32
|
end
|
26
33
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../helper'
|
2
2
|
|
3
3
|
class ScalerMiddlewareTest < Test::Unit::TestCase
|
4
4
|
def test_default_factor_set_to_one
|
@@ -29,7 +29,17 @@ class ScalerMiddlewareTest < Test::Unit::TestCase
|
|
29
29
|
m.end_tracker_segment
|
30
30
|
m.end_export
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
|
+
def test_flip_using_scaler
|
34
|
+
receiver = flexmock
|
35
|
+
receiver.should_receive(:start_export).once.with(120, 80)
|
36
|
+
receiver.should_receive(:export_point).once.with(1, 100, 20, 0)
|
37
|
+
|
38
|
+
m = Tracksperanto::Middleware::Scaler.new(receiver, :x_factor => -1, :y_factor => -1)
|
39
|
+
m.start_export(120, 80)
|
40
|
+
m.export_point(1, 20, 60, 0)
|
41
|
+
end
|
42
|
+
|
33
43
|
def test_scaler_properly_affects_residual
|
34
44
|
factor = Math.sqrt( (1.5 ** 2) + (1.4 ** 2))
|
35
45
|
|
data/test/test_buffer_io.rb
CHANGED
data/test/test_cli.rb
CHANGED
data/test/test_const_name.rb
CHANGED
data/test/test_extio.rb
CHANGED
data/test/test_flame_builder.rb
CHANGED
data/test/test_keyframe.rb
CHANGED
data/test/test_pipeline.rb
CHANGED
data/test/test_progressive_io.rb
CHANGED
data/test/test_simple_export.rb
CHANGED
data/test/test_tracker.rb
CHANGED
data/test/test_tracksperanto.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tracksperanto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.
|
9
|
+
- 2
|
10
|
+
version: 2.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Julik Tarkhanov
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-02-02 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|