tracksperanto 2.9.5 → 2.9.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/Gemfile +1 -1
  2. data/History.txt +5 -0
  3. data/bin/tracksperanto +32 -22
  4. data/lib/export/equalizer3.rb +1 -1
  5. data/lib/export/equalizer4.rb +1 -1
  6. data/lib/import/flame_stabilizer.rb +3 -3
  7. data/lib/import/nuke_script.rb +25 -7
  8. data/lib/middleware/base.rb +14 -7
  9. data/lib/middleware/crop.rb +9 -2
  10. data/lib/middleware/flip.rb +5 -3
  11. data/lib/middleware/flop.rb +4 -2
  12. data/lib/middleware/golden.rb +5 -2
  13. data/lib/middleware/length_cutoff.rb +6 -2
  14. data/lib/middleware/lerp.rb +5 -2
  15. data/lib/middleware/lint.rb +5 -0
  16. data/lib/middleware/move_to_first.rb +50 -0
  17. data/lib/middleware/pad.rb +8 -2
  18. data/lib/middleware/prefix.rb +6 -2
  19. data/lib/middleware/reformat.rb +6 -3
  20. data/lib/middleware/scaler.rb +6 -2
  21. data/lib/middleware/shift.rb +7 -2
  22. data/lib/middleware/slipper.rb +6 -2
  23. data/lib/middleware/start_trim.rb +6 -6
  24. data/lib/pipeline/base.rb +34 -38
  25. data/lib/tracksperanto.rb +18 -1
  26. data/lib/tracksperanto/format_detector.rb +26 -26
  27. data/lib/tracksperanto/parameters.rb +56 -0
  28. data/lib/tracksperanto/yield_non_empty.rb +15 -0
  29. data/test/import/test_nuke_import.rb +16 -1
  30. data/test/middleware/test_crop_middleware.rb +5 -0
  31. data/test/middleware/test_flip_middleware.rb +4 -19
  32. data/test/middleware/test_flop_middleware.rb +4 -9
  33. data/test/middleware/test_golden_middleware.rb +3 -10
  34. data/test/middleware/test_length_cutoff_middleware.rb +5 -0
  35. data/test/middleware/test_lerp_middleware.rb +6 -20
  36. data/test/middleware/test_lint_middleware.rb +5 -0
  37. data/test/middleware/test_move_to_first_frame_middleware.rb +38 -0
  38. data/test/middleware/test_pad_middleware.rb +5 -0
  39. data/test/middleware/test_prefix.rb +4 -0
  40. data/test/middleware/test_reformat_middleware.rb +3 -2
  41. data/test/middleware/test_scaler_middleware.rb +5 -0
  42. data/test/middleware/test_shift_middleware.rb +5 -0
  43. data/test/middleware/test_slip_middleware.rb +5 -0
  44. data/test/middleware/test_start_trim_middleware.rb +3 -9
  45. data/test/test_cli.rb +3 -3
  46. data/test/test_format_detector.rb +1 -1
  47. data/test/test_parameters.rb +38 -0
  48. data/test/test_tracksperanto.rb +10 -0
  49. data/test/test_yield_non_empty.rb +11 -0
  50. data/tracksperanto.gemspec +11 -5
  51. metadata +27 -21
@@ -2,14 +2,9 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class FlopMiddlewareTest < Test::Unit::TestCase
5
- def test_shift_supports_hash_init
6
- receiver = flexmock
7
-
8
- m = Tracksperanto::Middleware::Flop.new(receiver)
9
- assert !m.enabled
10
-
11
- m = Tracksperanto::Middleware::Flop.new(receiver, :enabled => true)
12
- assert m.enabled
5
+
6
+ def test_action_description
7
+ assert_equal "Mirror all the tracker paths vertically", Tracksperanto::Middleware::Flop.action_description
13
8
  end
14
9
 
15
10
  def test_export_flip_and_flop
@@ -17,7 +12,7 @@ class FlopMiddlewareTest < Test::Unit::TestCase
17
12
  receiver.should_receive(:start_export).once.with(110, 120)
18
13
  receiver.should_receive(:export_point).once.with(1, 10, 25, 0)
19
14
 
20
- m = Tracksperanto::Middleware::Flop.new(receiver, :enabled => true)
15
+ m = Tracksperanto::Middleware::Flop.new(receiver)
21
16
  m.start_export(110, 120)
22
17
  m.export_point(1, 10, 95, 0)
23
18
  end
@@ -2,16 +2,9 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class GoldenMiddlewareTest < Test::Unit::TestCase
5
- def test_default_golden_set_to_false
6
- receiver = flexmock
7
- m = Tracksperanto::Middleware::Golden.new(receiver)
8
- assert_nil m.enabled
9
- end
10
5
 
11
- def test_golden_supports_hash_init
12
- receiver = flexmock
13
- m = Tracksperanto::Middleware::Golden.new(receiver, :enabled => true)
14
- assert_equal true, m.enabled
6
+ def test_action_description
7
+ assert_equal "Reset residual of all the trackers to zero", Tracksperanto::Middleware::Golden.action_description
15
8
  end
16
9
 
17
10
  def test_golden_bypasses_methods
@@ -23,7 +16,7 @@ class GoldenMiddlewareTest < Test::Unit::TestCase
23
16
  receiver.should_receive(:end_tracker_segment).once
24
17
  receiver.should_receive(:end_export).once
25
18
 
26
- m = Tracksperanto::Middleware::Golden.new(receiver, :enabled => true)
19
+ m = Tracksperanto::Middleware::Golden.new(receiver)
27
20
  m.start_export(120, 120)
28
21
  m.start_tracker_segment("Tracker")
29
22
  m.export_point(0, 100, 100, 0.56)
@@ -2,6 +2,11 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class LengthCutoffMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Remove trackers that have less than the specified number of keyframes", Tracksperanto::Middleware::LengthCutoff.action_description
8
+ end
9
+
5
10
  def test_default_length_set_to_zero_and_ignored
6
11
  receiver = flexmock
7
12
  m = Tracksperanto::Middleware::LengthCutoff.new(receiver)
@@ -2,9 +2,14 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class LerpMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Interpolate missing keyframes of all the trackers", Tracksperanto::Middleware::Lerp.action_description
8
+ end
9
+
5
10
  def test_lerp
6
11
  receiver = flexmock
7
- m = Tracksperanto::Middleware::Lerp.new(receiver, :enabled => true)
12
+ m = Tracksperanto::Middleware::Lerp.new(receiver)
8
13
  receiver.should_receive(:start_export).with(720, 576).once
9
14
  receiver.should_receive(:start_tracker_segment).with("Foo").once
10
15
  receiver.should_receive(:export_point).with(1, 1.0, 2.0, 0).once
@@ -21,23 +26,4 @@ class LerpMiddlewareTest < Test::Unit::TestCase
21
26
  m.end_tracker_segment
22
27
  m.end_export
23
28
  end
24
-
25
- def test_lerp_should_react_to_enabled_flag
26
- receiver = flexmock
27
- m = Tracksperanto::Middleware::Lerp.new(receiver, :enabled => false)
28
- receiver.should_receive(:start_export).with(720, 576).once
29
- receiver.should_receive(:start_tracker_segment).with("Foo").once
30
- receiver.should_receive(:export_point).with(1, 1.0, 2.0, 0).once
31
- receiver.should_receive(:export_point).with(4, 4.0, 5.0, 0).once
32
- receiver.should_receive(:end_tracker_segment).once
33
- receiver.should_receive(:end_export).once
34
-
35
- m.start_export(720, 576)
36
- m.start_tracker_segment("Foo")
37
- m.export_point(1, 1.0, 2.0, 0)
38
- m.export_point(4, 4.0, 5.0, 0)
39
- m.end_tracker_segment
40
- m.end_export
41
- end
42
-
43
29
  end
@@ -2,6 +2,11 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class LintMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Verify all the exported trackers and check for errors", Tracksperanto::Middleware::Lint.action_description
8
+ end
9
+
5
10
  def test_empty_export_raises
6
11
  m = flexmock
7
12
  m.should_receive(:start_export).once
@@ -0,0 +1,38 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
+
4
+ class MoveToFirstFrameMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Move all the keyframes in time so that the first frame is the first animated keyframe", Tracksperanto::Middleware::MoveToFirst.action_description
8
+ end
9
+
10
+ def test_move_to_first_frame
11
+ receiver = flexmock
12
+ receiver.should_receive(:start_export).with(120,120)
13
+
14
+ receiver.should_receive(:start_tracker_segment).with("Tracker1")
15
+ receiver.should_receive(:export_point).with(4, 100, 100, 0)
16
+ receiver.should_receive(:end_tracker_segment)
17
+
18
+ receiver.should_receive(:start_tracker_segment).with("Tracker2")
19
+ receiver.should_receive(:export_point).with(0, 100, 100, 0)
20
+ receiver.should_receive(:end_tracker_segment)
21
+
22
+ receiver.should_receive(:end_export)
23
+
24
+ m = Tracksperanto::Middleware::MoveToFirst.new(receiver)
25
+
26
+ m.start_export(120, 120)
27
+
28
+ m.start_tracker_segment("Tracker1")
29
+ m.export_point(14, 100, 100, 0)
30
+ m.end_tracker_segment
31
+
32
+ m.start_tracker_segment("Tracker1")
33
+ m.export_point(10, 100, 100, 0)
34
+ m.end_tracker_segment
35
+
36
+ m.end_export
37
+ end
38
+ end
@@ -2,6 +2,11 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class PadMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Pad or crop the image by a fraction of it's original size", Tracksperanto::Middleware::Pad.action_description
8
+ end
9
+
5
10
  def test_shift_supports_hash_init
6
11
  receiver = flexmock
7
12
  m = Tracksperanto::Middleware::Pad.new(receiver,
@@ -3,6 +3,10 @@ require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class PrefixMiddlewareTest < Test::Unit::TestCase
5
5
 
6
+ def test_action_description
7
+ assert_equal "Prefix tracker names with text", Tracksperanto::Middleware::Prefix.action_description
8
+ end
9
+
6
10
  def test_prefix_supports_hash_init
7
11
  receiver = flexmock
8
12
  m = Tracksperanto::Middleware::Prefix.new(receiver, :prefix => "foo")
@@ -2,8 +2,9 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class ReformatMiddlewareTest < Test::Unit::TestCase
5
- def test_inherits_and_thus_complies
6
- assert Tracksperanto::Middleware::Reformat.ancestors.include?(Tracksperanto::Middleware::Base)
5
+
6
+ def test_action_description
7
+ assert_equal "Reformat the comp together with it's trackers to conform to a specific format", Tracksperanto::Middleware::Reformat.action_description
7
8
  end
8
9
 
9
10
  def test_default_params_zeroed
@@ -2,6 +2,11 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class ScalerMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Scale the comp by a specified factor", Tracksperanto::Middleware::Scaler.action_description
8
+ end
9
+
5
10
  def test_default_factor_set_to_one
6
11
  receiver = flexmock
7
12
  m = Tracksperanto::Middleware::Scaler.new(receiver)
@@ -2,6 +2,11 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class ShiftMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Move all the trackers by a specified number of pixels", Tracksperanto::Middleware::Shift.action_description
8
+ end
9
+
5
10
  def test_shift_supports_hash_init
6
11
  receiver = flexmock
7
12
  m = Tracksperanto::Middleware::Shift.new(receiver, :x_shift => 1.2)
@@ -2,6 +2,11 @@
2
2
  require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class SlipMiddlewareTest < Test::Unit::TestCase
5
+
6
+ def test_action_description
7
+ assert_equal "Slip all the tracker keyframes in time", Tracksperanto::Middleware::Slipper.action_description
8
+ end
9
+
5
10
  def test_default_slip_set_to_zero
6
11
  receiver = flexmock
7
12
  m = Tracksperanto::Middleware::Slipper.new(receiver)
@@ -3,14 +3,8 @@ require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class StartTrimMiddlewareTest < Test::Unit::TestCase
5
5
 
6
- def test_default_set_to_false
7
- m = Tracksperanto::Middleware::StartTrim.new(nil)
8
- assert_nil m.enabled
9
- end
10
-
11
- def test_start_trim_supports_hash_init
12
- m = Tracksperanto::Middleware::StartTrim.new(nil, :enabled => true)
13
- assert_equal true, m.enabled
6
+ def test_action_description
7
+ assert_equal "Remove all the keyframes that are on frames below 1", Tracksperanto::Middleware::StartTrim.action_description
14
8
  end
15
9
 
16
10
  def test_start_mw_works
@@ -22,7 +16,7 @@ class StartTrimMiddlewareTest < Test::Unit::TestCase
22
16
  x.should_receive(:end_tracker_segment).once
23
17
  x.should_receive(:end_export).once
24
18
 
25
- m = Tracksperanto::Middleware::StartTrim.new(x, :enabled => true)
19
+ m = Tracksperanto::Middleware::StartTrim.new(x)
26
20
 
27
21
  m.start_export(720, 576)
28
22
  m.start_tracker_segment("TrackerBehind")
data/test/test_cli.rb CHANGED
@@ -42,20 +42,20 @@ class TestCli < Test::Unit::TestCase
42
42
  flm_pftrack_v5.2dt flm_shake_trackers.txt flm_syntheyes_2dt.txt flm_flame_cornerpin.stabilizer
43
43
  flm_tracksperanto_ruby.rb flm_mayaLocators.ma flm_createNulls.jsx
44
44
  )
45
-
45
+ assert_match /Found and converted 1 trackers with 232 keyframes\./, o, "Should have output coversion statistics"
46
46
  assert_same_set fs, Dir.entries(TEMP_DIR)
47
47
  end
48
48
 
49
49
  def test_cli_with_nonexisting_only_exporter_prints_proper_error_message
50
50
  status, o, e = cli("--only microsoftfuckingword " + TEMP_DIR + "/flm.stabilizer")
51
- assert_equal 2, status, "Should exit with abnormal state"
51
+ assert_not_equal 0, status, "Should exit with abnormal state"
52
52
  assert e.include?("Unknown exporter \"microsoftfuckingword\"")
53
53
  assert e.include?("The following export modules are available")
54
54
  end
55
55
 
56
56
  def test_cli_with_nonexisting_importer_prints_proper_error_message
57
57
  status, o, e = cli("--from microsoftfuckingword " + TEMP_DIR + "/flm.stabilizer")
58
- assert_equal 2, status, "Should exit with abnormal state"
58
+ assert_not_equal 0, status, "Should exit with abnormal state"
59
59
  assert e.include?("Unknown importer \"microsoftfuckingword\"")
60
60
  assert e.include?("The following import modules are available")
61
61
  end
@@ -23,7 +23,7 @@ class TestFormatDetector < Test::Unit::TestCase
23
23
  assert d.match?
24
24
  assert !d.auto_size?
25
25
  assert_equal Tracksperanto::Import::NukeScript, d.importer_klass
26
- assert_equal "Nuke .nk script file", d.human_importer_name
26
+ assert_equal Tracksperanto::Import::NukeScript.human_name, d.human_importer_name
27
27
  end
28
28
 
29
29
  def test_match_flame
@@ -0,0 +1,38 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__)) + '/helper'
3
+
4
+ class TestParameters < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @class = Class.new do
8
+ include Tracksperanto::Parameters
9
+ end
10
+ end
11
+
12
+ def test_parameters_empty_by_default
13
+ assert_equal [], @class.parameters
14
+ end
15
+
16
+ def test_parameter_initialization
17
+ flexmock(@class).should_receive(:attr_accessor).once.with(:foo)
18
+ @class.parameter :foo
19
+ assert_equal 1, @class.parameters.length
20
+
21
+ first_param = @class.parameters[0]
22
+ assert_equal :foo, first_param.name
23
+ assert_nil first_param.desc
24
+ end
25
+
26
+ def test_parameter_initialization_with_safety
27
+ flexmock(@class).should_receive(:attr_accessor).once.with(:foo)
28
+ flexmock(@class).should_receive(:safe_reader).once.with(:foo)
29
+ @class.parameter :foo, :required => true
30
+ end
31
+
32
+ def test_parameter_initialization_with_cast
33
+ flexmock(@class).should_receive(:attr_accessor).once.with(:foo)
34
+ flexmock(@class).should_receive(:cast_to_junk).once.with(:foo)
35
+ @class.parameter :foo, :cast => :junk
36
+ end
37
+
38
+ end
@@ -23,6 +23,16 @@ class TracksperantoTest < Test::Unit::TestCase
23
23
  end
24
24
  end
25
25
 
26
+ def test_importers_array_sorted_by_description
27
+ m = Tracksperanto.importers.map{|e| e.human_name }
28
+ assert_equal m.sort, m
29
+ end
30
+
31
+ def test_exporters_array_sorted_by_description
32
+ m = Tracksperanto.exporters.map{|e| e.human_name }
33
+ assert_equal m.sort, m
34
+ end
35
+
26
36
  def test_middleware_names
27
37
  m = Tracksperanto.middleware_names
28
38
  assert m.include?("Golden")
@@ -0,0 +1,11 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__)) + '/helper'
3
+
4
+ class TestYieldNonEmpty < Test::Unit::TestCase
5
+
6
+ def test_yield_non_empty
7
+ arr = ["", "a"]
8
+ assert_equal ["a"], Tracksperanto::YieldNonEmpty.new(arr).to_a
9
+ end
10
+
11
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "tracksperanto"
8
- s.version = "2.9.5"
8
+ s.version = "2.9.6"
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-02-16"
12
+ s.date = "2012-03-14"
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"]
@@ -67,6 +67,7 @@ Gem::Specification.new do |s|
67
67
  "lib/middleware/length_cutoff.rb",
68
68
  "lib/middleware/lerp.rb",
69
69
  "lib/middleware/lint.rb",
70
+ "lib/middleware/move_to_first.rb",
70
71
  "lib/middleware/pad.rb",
71
72
  "lib/middleware/prefix.rb",
72
73
  "lib/middleware/reformat.rb",
@@ -84,11 +85,13 @@ Gem::Specification.new do |s|
84
85
  "lib/tracksperanto/ext_io.rb",
85
86
  "lib/tracksperanto/format_detector.rb",
86
87
  "lib/tracksperanto/keyframe.rb",
88
+ "lib/tracksperanto/parameters.rb",
87
89
  "lib/tracksperanto/returning.rb",
88
90
  "lib/tracksperanto/safety.rb",
89
91
  "lib/tracksperanto/simple_export.rb",
90
92
  "lib/tracksperanto/tracker.rb",
91
93
  "lib/tracksperanto/uv_coordinates.rb",
94
+ "lib/tracksperanto/yield_non_empty.rb",
92
95
  "lib/tracksperanto/zip_tuples.rb",
93
96
  "test/export/README_EXPORT_TESTS.txt",
94
97
  "test/export/samples/ref_AfterEffects.jsx",
@@ -150,6 +153,7 @@ Gem::Specification.new do |s|
150
153
  "test/middleware/test_length_cutoff_middleware.rb",
151
154
  "test/middleware/test_lerp_middleware.rb",
152
155
  "test/middleware/test_lint_middleware.rb",
156
+ "test/middleware/test_move_to_first_frame_middleware.rb",
153
157
  "test/middleware/test_pad_middleware.rb",
154
158
  "test/middleware/test_prefix.rb",
155
159
  "test/middleware/test_reformat_middleware.rb",
@@ -165,11 +169,13 @@ Gem::Specification.new do |s|
165
169
  "test/test_extio.rb",
166
170
  "test/test_format_detector.rb",
167
171
  "test/test_keyframe.rb",
172
+ "test/test_parameters.rb",
168
173
  "test/test_pipeline.rb",
169
174
  "test/test_safety.rb",
170
175
  "test/test_simple_export.rb",
171
176
  "test/test_tracker.rb",
172
177
  "test/test_tracksperanto.rb",
178
+ "test/test_yield_non_empty.rb",
173
179
  "test/test_zip_tuples.rb",
174
180
  "tracksperanto.gemspec"
175
181
  ]
@@ -183,7 +189,7 @@ Gem::Specification.new do |s|
183
189
  s.specification_version = 3
184
190
 
185
191
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
186
- s.add_runtime_dependency(%q<obuf>, ["~> 1.0.4"])
192
+ s.add_runtime_dependency(%q<obuf>, ["~> 1.1.0"])
187
193
  s.add_runtime_dependency(%q<progressive_io>, ["~> 1.0"])
188
194
  s.add_runtime_dependency(%q<flame_channel_parser>, ["~> 4.0"])
189
195
  s.add_runtime_dependency(%q<progressbar>, ["= 0.10.0"])
@@ -193,7 +199,7 @@ Gem::Specification.new do |s|
193
199
  s.add_development_dependency(%q<flexmock>, ["~> 0.8"])
194
200
  s.add_development_dependency(%q<cli_test>, ["~> 1.0"])
195
201
  else
196
- s.add_dependency(%q<obuf>, ["~> 1.0.4"])
202
+ s.add_dependency(%q<obuf>, ["~> 1.1.0"])
197
203
  s.add_dependency(%q<progressive_io>, ["~> 1.0"])
198
204
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
199
205
  s.add_dependency(%q<progressbar>, ["= 0.10.0"])
@@ -204,7 +210,7 @@ Gem::Specification.new do |s|
204
210
  s.add_dependency(%q<cli_test>, ["~> 1.0"])
205
211
  end
206
212
  else
207
- s.add_dependency(%q<obuf>, ["~> 1.0.4"])
213
+ s.add_dependency(%q<obuf>, ["~> 1.1.0"])
208
214
  s.add_dependency(%q<progressive_io>, ["~> 1.0"])
209
215
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
210
216
  s.add_dependency(%q<progressbar>, ["= 0.10.0"])