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