tap 0.8.0 → 0.9.0

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.
Files changed (185) hide show
  1. data/Basic Overview +151 -0
  2. data/Command Reference +99 -0
  3. data/History +24 -0
  4. data/MIT-LICENSE +1 -1
  5. data/README +29 -57
  6. data/Rakefile +30 -37
  7. data/Tutorial +243 -191
  8. data/bin/tap +66 -35
  9. data/lib/tap.rb +47 -29
  10. data/lib/tap/app.rb +700 -342
  11. data/lib/tap/{script → cmd}/console.rb +0 -0
  12. data/lib/tap/{script → cmd}/destroy.rb +0 -0
  13. data/lib/tap/{script → cmd}/generate.rb +0 -0
  14. data/lib/tap/cmd/run.rb +156 -0
  15. data/lib/tap/constants.rb +4 -0
  16. data/lib/tap/dump.rb +57 -0
  17. data/lib/tap/env.rb +316 -0
  18. data/lib/tap/file_task.rb +106 -109
  19. data/lib/tap/generator.rb +4 -1
  20. data/lib/tap/generator/generators/command/USAGE +6 -0
  21. data/lib/tap/generator/generators/command/command_generator.rb +17 -0
  22. data/lib/tap/generator/generators/{script/templates/script.erb → command/templates/command.erb} +10 -10
  23. data/lib/tap/generator/generators/config/USAGE +21 -0
  24. data/lib/tap/generator/generators/config/config_generator.rb +17 -7
  25. data/lib/tap/generator/generators/file_task/USAGE +3 -0
  26. data/lib/tap/generator/generators/file_task/file_task_generator.rb +16 -0
  27. data/lib/tap/generator/generators/file_task/templates/file.txt +2 -0
  28. data/lib/tap/generator/generators/file_task/templates/file.yml +3 -0
  29. data/lib/tap/generator/generators/file_task/templates/task.erb +26 -20
  30. data/lib/tap/generator/generators/file_task/templates/test.erb +20 -10
  31. data/lib/tap/generator/generators/generator/generator_generator.rb +1 -1
  32. data/lib/tap/generator/generators/generator/templates/generator.erb +21 -12
  33. data/lib/tap/generator/generators/root/templates/Rakefile +33 -24
  34. data/lib/tap/generator/generators/root/templates/tap.yml +28 -31
  35. data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +1 -0
  36. data/lib/tap/generator/generators/task/USAGE +3 -0
  37. data/lib/tap/generator/generators/task/task_generator.rb +18 -5
  38. data/lib/tap/generator/generators/task/templates/task.erb +7 -12
  39. data/lib/tap/generator/generators/task/templates/test.erb +10 -11
  40. data/lib/tap/generator/generators/workflow/templates/task.erb +1 -1
  41. data/lib/tap/generator/generators/workflow/templates/test.erb +1 -1
  42. data/lib/tap/patches/rake/rake_test_loader.rb +8 -0
  43. data/lib/tap/patches/rake/testtask.rb +55 -0
  44. data/lib/tap/patches/ruby19/backtrace_filter.rb +51 -0
  45. data/lib/tap/patches/ruby19/parsedate.rb +16 -0
  46. data/lib/tap/root.rb +172 -67
  47. data/lib/tap/script.rb +70 -336
  48. data/lib/tap/support/aggregator.rb +55 -0
  49. data/lib/tap/support/audit.rb +281 -280
  50. data/lib/tap/support/batchable.rb +59 -0
  51. data/lib/tap/support/class_configuration.rb +279 -0
  52. data/lib/tap/support/configurable.rb +92 -0
  53. data/lib/tap/support/configurable_methods.rb +296 -0
  54. data/lib/tap/support/executable.rb +98 -0
  55. data/lib/tap/support/executable_queue.rb +82 -0
  56. data/lib/tap/support/logger.rb +9 -15
  57. data/lib/tap/support/rake.rb +43 -54
  58. data/lib/tap/support/run_error.rb +32 -13
  59. data/lib/tap/support/shell_utils.rb +47 -0
  60. data/lib/tap/support/tdoc.rb +9 -8
  61. data/lib/tap/support/tdoc/config_attr.rb +40 -16
  62. data/lib/tap/support/validation.rb +77 -0
  63. data/lib/tap/support/versions.rb +36 -36
  64. data/lib/tap/task.rb +276 -482
  65. data/lib/tap/test.rb +20 -261
  66. data/lib/tap/test/env_vars.rb +7 -5
  67. data/lib/tap/test/file_methods.rb +126 -121
  68. data/lib/tap/test/subset_methods.rb +86 -45
  69. data/lib/tap/test/tap_methods.rb +271 -0
  70. data/lib/tap/workflow.rb +174 -46
  71. data/test/app/config/another/task.yml +1 -0
  72. data/test/app/config/erb.yml +2 -1
  73. data/test/app/config/some/task.yml +1 -0
  74. data/test/app/config/template.yml +2 -6
  75. data/test/app_test.rb +1241 -1008
  76. data/test/env/test_configure/recurse_a.yml +2 -0
  77. data/test/env/test_configure/recurse_b.yml +2 -0
  78. data/test/env/test_configure/tap.yml +23 -0
  79. data/test/env/test_load_env_config/dir/tap.yml +3 -0
  80. data/test/env/test_load_env_config/recurse_a.yml +2 -0
  81. data/test/env/test_load_env_config/recurse_b.yml +2 -0
  82. data/test/env/test_load_env_config/tap.yml +3 -0
  83. data/test/env_test.rb +198 -0
  84. data/test/file_task_test.rb +70 -53
  85. data/{lib/tap/generator/generators/package/USAGE → test/root/file.txt} +0 -0
  86. data/test/root_test.rb +621 -454
  87. data/test/script_test.rb +38 -174
  88. data/test/support/aggregator_test.rb +99 -0
  89. data/test/support/audit_test.rb +409 -416
  90. data/test/support/batchable_test.rb +74 -0
  91. data/test/support/{task_configuration_test.rb → class_configuration_test.rb} +106 -47
  92. data/test/{task/config/overriding.yml → support/configurable/config/configured.yml} +0 -0
  93. data/test/support/configurable_test.rb +295 -0
  94. data/test/support/executable_queue_test.rb +103 -0
  95. data/test/support/executable_test.rb +38 -0
  96. data/test/support/logger_test.rb +17 -17
  97. data/test/support/rake_test.rb +4 -2
  98. data/test/support/shell_utils_test.rb +24 -0
  99. data/test/support/tdoc_test.rb +265 -258
  100. data/test/support/validation_test.rb +54 -0
  101. data/test/support/versions_test.rb +38 -38
  102. data/test/tap_test_helper.rb +19 -5
  103. data/test/tap_test_suite.rb +5 -2
  104. data/test/task_base_test.rb +13 -104
  105. data/test/task_syntax_test.rb +300 -0
  106. data/test/task_test.rb +258 -381
  107. data/test/test/env_vars_test.rb +40 -40
  108. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/expected/one.txt +0 -0
  109. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/expected/two.txt +0 -0
  110. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/input/one.txt +0 -0
  111. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/input/two.txt +0 -0
  112. data/test/test/{test_file_task_test → file_methods/test_assert_files_can_have_no_expected_files_if_specified}/input/one.txt +0 -0
  113. data/test/test/{test_file_task_test → file_methods/test_assert_files_can_have_no_expected_files_if_specified}/input/two.txt +0 -0
  114. data/test/test/file_methods/test_assert_files_fails_for_different_content/expected/one.txt +1 -0
  115. data/test/test/{test_file_task_test → file_methods/test_assert_files_fails_for_different_content}/expected/two.txt +0 -0
  116. data/test/test/file_methods/test_assert_files_fails_for_different_content/input/one.txt +1 -0
  117. data/test/test/file_methods/test_assert_files_fails_for_different_content/input/two.txt +1 -0
  118. data/test/test/{test_file_task_test → file_methods/test_assert_files_fails_for_missing_expected_file}/expected/one.txt +0 -0
  119. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/input/one.txt +1 -0
  120. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/input/two.txt +1 -0
  121. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/expected/one.txt +1 -0
  122. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/expected/two.txt +1 -0
  123. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/input/one.txt +1 -0
  124. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/input/two.txt +1 -0
  125. data/test/test/file_methods/test_assert_files_fails_for_no_expected_files/input/one.txt +1 -0
  126. data/test/test/file_methods/test_assert_files_fails_for_no_expected_files/input/two.txt +1 -0
  127. data/test/test/file_methods_doc/test_sub/expected/one.txt +1 -0
  128. data/test/test/file_methods_doc/test_sub/expected/two.txt +1 -0
  129. data/test/test/file_methods_doc/test_sub/input/one.txt +1 -0
  130. data/test/test/file_methods_doc/test_sub/input/two.txt +1 -0
  131. data/test/test/file_methods_doc_test.rb +29 -0
  132. data/test/test/file_methods_test.rb +214 -143
  133. data/test/test/subset_methods_test.rb +111 -115
  134. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/expected/task/name/a.txt +0 -0
  135. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/expected/task/name/b.txt +0 -0
  136. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/input/a.txt +0 -0
  137. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/input/b.txt +0 -0
  138. data/test/test/tap_methods_test.rb +399 -0
  139. data/test/workflow_test.rb +101 -91
  140. metadata +86 -70
  141. data/lib/tap/generator/generators/package/package_generator.rb +0 -38
  142. data/lib/tap/generator/generators/package/templates/package.erb +0 -186
  143. data/lib/tap/generator/generators/script/USAGE +0 -0
  144. data/lib/tap/generator/generators/script/script_generator.rb +0 -17
  145. data/lib/tap/script/run.rb +0 -154
  146. data/lib/tap/support/batch_queue.rb +0 -162
  147. data/lib/tap/support/combinator.rb +0 -114
  148. data/lib/tap/support/task_configuration.rb +0 -169
  149. data/lib/tap/support/template.rb +0 -81
  150. data/lib/tap/support/templater.rb +0 -155
  151. data/lib/tap/version.rb +0 -4
  152. data/test/app/config/addition_template.yml +0 -6
  153. data/test/app_class_test.rb +0 -33
  154. data/test/check/binding_eval.rb +0 -23
  155. data/test/check/define_method_check.rb +0 -22
  156. data/test/check/dependencies_check.rb +0 -175
  157. data/test/check/inheritance_check.rb +0 -22
  158. data/test/support/batch_queue_test.rb +0 -320
  159. data/test/support/combinator_test.rb +0 -249
  160. data/test/support/template_test.rb +0 -122
  161. data/test/support/templater/erb.txt +0 -2
  162. data/test/support/templater/erb.yml +0 -2
  163. data/test/support/templater/somefile.txt +0 -2
  164. data/test/support/templater_test.rb +0 -192
  165. data/test/task/config/template.yml +0 -4
  166. data/test/task_class_test.rb +0 -170
  167. data/test/task_execute_test.rb +0 -262
  168. data/test/test/file_methods/test_assert_expected/expected/file.txt +0 -1
  169. data/test/test/file_methods/test_assert_expected/expected/folder/file.txt +0 -1
  170. data/test/test/file_methods/test_assert_expected/input/file.txt +0 -1
  171. data/test/test/file_methods/test_assert_expected/input/folder/file.txt +0 -1
  172. data/test/test/file_methods/test_assert_files_exist/input/input_1.txt +0 -0
  173. data/test/test/file_methods/test_assert_files_exist/input/input_2.txt +0 -0
  174. data/test/test/file_methods/test_file_compare/expected/output_1.txt +0 -3
  175. data/test/test/file_methods/test_file_compare/expected/output_2.txt +0 -1
  176. data/test/test/file_methods/test_file_compare/input/input_1.txt +0 -3
  177. data/test/test/file_methods/test_file_compare/input/input_2.txt +0 -3
  178. data/test/test/file_methods/test_infer_glob/expected/file.yml +0 -0
  179. data/test/test/file_methods/test_infer_glob/expected/file_1.txt +0 -0
  180. data/test/test/file_methods/test_infer_glob/expected/file_2.txt +0 -0
  181. data/test/test/file_methods/test_yml_compare/expected/output_1.yml +0 -6
  182. data/test/test/file_methods/test_yml_compare/expected/output_2.yml +0 -6
  183. data/test/test/file_methods/test_yml_compare/input/input_1.yml +0 -4
  184. data/test/test/file_methods/test_yml_compare/input/input_2.yml +0 -4
  185. data/test/test_test.rb +0 -373
@@ -6,25 +6,42 @@ class ConfiguredTask < Tap::Task
6
6
  config :one, 'one'
7
7
  config :two, 'two'
8
8
  end
9
+ class ValidatingTask < Tap::Task
10
+ config :string, 'str', &c.check(String)
11
+ config :integer, 1, &c.yaml(Integer)
12
+ end
13
+
14
+ class SubclassTask < Tap::Task
15
+ attr_accessor :shared_variable, :instance_specific_variable
16
+ def initialize(*args)
17
+ @shared_variable = Object.new
18
+ super
19
+ end
20
+
21
+ def initialize_batch_obj(*args)
22
+ task = super
23
+ task.instance_specific_variable = Object.new
24
+ task
25
+ end
26
+ end
9
27
 
10
28
  class TaskTest < Test::Unit::TestCase
11
- include Tap
12
- include Benchmark
13
- include TapTestMethods
14
-
15
- acts_as_tap_test
16
- attr_accessor :t
17
-
18
- def setup
19
- super
20
- @t = Task.new
21
- end
22
-
29
+ include Tap
30
+ include TapTestMethods
31
+
32
+ acts_as_tap_test
33
+ attr_accessor :t
34
+
35
+ def setup
36
+ super
37
+ @t = Task.new
38
+ app.root = trs.root
39
+ end
40
+
23
41
  def test_documentation
24
42
  t = ConfiguredTask.new
25
- assert_equal({:one => 'one', :two => 'two'}, t.config)
26
43
  assert_equal("configured_task", t.name)
27
- assert_equal(File.join(app[:config], "configured_task.yml"), t.config_file)
44
+ assert_equal({:one => 'one', :two => 'two'}, t.config)
28
45
 
29
46
  ###
30
47
  # [/path/to/app/config/example.yml]
@@ -35,34 +52,13 @@ class TaskTest < Test::Unit::TestCase
35
52
  assert_equal(File.join(app[:config], "example.yml"), t.config_file)
36
53
  assert_equal({:one => 'ONE', :two => 'two', :three => 'three'}, t.config)
37
54
 
38
- ###
39
- runlist = []
40
- t1 = Task.new {|task, input| runlist << input}
41
- t1.enq 1
42
- t1.enq 2,3
43
- t1.app.run
44
- assert_equal([1,2,3], runlist)
45
-
46
- runlist = []
47
- t1.iterate = false
48
- t1.enq 1
49
- t1.enq 2,3
50
- t1.app.run
51
- assert_equal([[1,2,3]], runlist)
52
-
53
- ###
54
- runlist = []
55
- t1 = Task.new {|task, input| runlist << input}
56
- assert_equal([t1], t1.batch)
57
- t2 = t1.create_batch_task
58
- assert_equal([t1, t2], t1.batch)
59
-
60
- t1.enq 1
61
- t2.enq 2,3
62
- t1.app.run
63
-
64
- assert_equal([1,2,3, 1,2,3], runlist)
65
-
55
+ t = ValidatingTask.new
56
+ assert_raise(Support::Validation::ValidationError) { t.string = 1 }
57
+ assert_raise(Support::Validation::ValidationError) { t.integer = 1.1 }
58
+
59
+ t.integer = "1"
60
+ assert_equal 1, t.integer
61
+
66
62
  ####
67
63
  # [/path/to/app/config/batch.yml]
68
64
  # - one: ONE
@@ -73,371 +69,252 @@ class TaskTest < Test::Unit::TestCase
73
69
  t1, t2 = t.batch
74
70
 
75
71
  assert_equal("batch", t1.name)
76
- assert_equal({:one => 'ONE'}, t1.config_template)
77
72
  assert_equal({:one => 'ONE', :two => 'two'}, t1.config)
78
73
 
79
74
  assert_equal("batch", t2.name)
80
- assert_equal({:one => 'ANOTHER ONE'}, t2.config_template)
81
- assert_equal({:one => 'ANOTHER ONE', :two => 'two'}, t2.config)
82
-
83
-
84
- ####
85
- # [/path/to/app/config/template.yml]
86
- # one: ONE
87
- # variations!:
88
- # - two: TWO
89
- # - three: THREE
75
+ assert_equal({:one => 'ANOTHER ONE', :two => 'two'}, t2.config)
76
+
77
+ ###
78
+ runlist = []
79
+ t1 = Task.new {|task, input| runlist << input}
80
+ assert_equal [t1], t1.batch
81
+
82
+ t2 = t1.initialize_batch_obj
83
+ assert_equal [t1, t2], t1.batch
84
+ assert_equal [t1, t2], t2.batch
85
+
86
+ t1.enq 1
87
+ t2.enq 2
88
+ t1.app.run
89
+
90
+ assert_equal [1,1,2,2], runlist
91
+ end
92
+
93
+ #
94
+ # initialization tests
95
+ #
90
96
 
91
- t = ConfiguredTask.new "template"
92
- assert_equal(2, t.batch.size)
93
- t1, t2 = t.batch
94
97
 
95
- assert_equal({:one => 'ONE', :two => 'TWO'}, t1.config)
96
- assert_equal({:one => 'ONE', :two => 'two', :three => 'THREE'}, t2.config)
98
+ def test_initialize_documenation
99
+ t1 = SubclassTask.new
100
+ t2 = t1.initialize_batch_obj
101
+
102
+ assert t1.shared_variable == t2.shared_variable
103
+ assert t1.instance_specific_variable != t2.instance_specific_variable
97
104
  end
98
105
 
99
- #
100
- # initialization tests
101
- #
102
-
103
- def test_default_task_initialization
104
- assert_equal App.instance, t.app
105
- assert_equal [], t.results
106
- assert_equal({}, t.config)
107
- assert_equal({}, t.config_template)
108
- assert_equal [t], t.batch
109
- assert_nil t.condition_block
110
- assert_nil t.task_block
111
- assert_nil t.on_complete_block
112
- assert !t.multithread
113
- assert t.iterate
114
- assert_equal "tap/task", t.name
115
- end
106
+ def test_default_initialization
107
+ assert_equal App.instance, t.app
108
+ assert_equal({}, t.config)
109
+ assert_equal [t], t.batch
110
+ assert_nil t.task_block
111
+ assert_equal "tap/task", t.name
112
+ end
113
+
114
+ def test_initialization_inputs
115
+ a = App.new
116
+ b = lambda {}
117
+
118
+ t = Task.new("name", {:key => 'value'}, a, &b)
119
+ assert_equal "name", t.name
120
+ assert_equal({:key => 'value'}, t.config)
121
+ assert_equal a, t.app
122
+ assert_equal b, t.task_block
123
+ end
116
124
 
117
125
  def test_task_init_speed
118
- benchmark_test do |x|
119
- x.report("10k") { 10000.times { Task.new } }
126
+ benchmark_test(20) do |x|
127
+ x.report("10k") { 10000.times { Task.new } }
128
+ x.report("10k {}") { 10000.times { Task.new {} } }
129
+ x.report("10k name {}") { 10000.times { Task.new('name') {} } }
120
130
  end
121
131
  end
122
132
 
123
- def test_by_default_tasks_share_application_instance
124
- t1 = Task.new
125
- t2 = Task.new
126
-
127
- assert_equal t1.app, t2.app
128
- assert_equal App.instance, t1.app
129
- end
130
-
131
- class NamedTask < Task
133
+ def test_by_default_tasks_share_application_instance
134
+ t1 = Task.new
135
+ t2 = Task.new
136
+
137
+ assert_equal t1.app, t2.app
138
+ assert_equal App.instance, t1.app
132
139
  end
133
140
 
134
- def test_name_is_initialized_to_task_class_underscored
135
- t = NamedTask.new
136
- assert_equal "task_test/named_task", t.name
137
- end
138
-
139
- def test_name_configs_app_and_task_block_are_set_from_initialize
140
- a = App.new
141
- b = lambda {}
142
-
143
- t = Task.new("name", {:key => 'value'}, a, &b)
144
- assert_equal "name", t.name
145
- assert_equal({:key => 'value'}, t.config)
146
- assert_equal a, t.app
147
- assert_equal b, t.task_block
148
- end
149
-
150
- def test_config_template_is_loaded_from_config_file
151
- t = Task.new "configured"
152
- assert File.exists?(t.config_file)
153
- assert_equal "key: value", File.read(t.config_file)
154
- assert_equal({:key => 'value'}, t.config_template)
155
- end
156
-
157
- def test_batched_tasks_are_defined_with_corresponding_config_template_for_batched_config_files
158
- t = Task.new "batched"
159
- assert File.exists?(t.config_file)
160
- assert_equal "- key: first\n- key: second", File.read(t.config_file)
161
-
162
- assert_equal 2, t.batch.size
163
-
164
- t1, t2 = t.batch
165
- assert_equal({:key => 'first'}, t1.config_template)
166
- assert_equal({:key => 'second'}, t2.config_template)
167
- end
168
-
169
- def test_configs_are_merged_to_each_batched_task
170
- t = Task.new "batched", :another => 'value'
171
- t1, t2 = t.batch
172
- assert_equal({:key => 'first', :another => 'value'}, t1.config)
173
- assert_equal({:key => 'second', :another => 'value'}, t2.config)
174
- end
175
-
176
- #
177
- # create_batch_task test
178
- #
179
-
180
- def test_created_batch_tasks_are_added_to_and_share_the_same_batch
181
- assert_equal [t], t.batch
182
-
183
- t1 = t.create_batch_task
184
- t2 = t1.create_batch_task
185
-
186
- assert_equal [t, t1, t2], t.batch
187
- assert_equal t.batch.object_id, t1.batch.object_id
188
- assert_equal t.batch.object_id, t2.batch.object_id
189
- end
190
-
191
- def test_create_batch_task_uses_input_template_and_overrides
192
- t = TaskWithDefaultConfig.new "overriding", :three => 3
193
- assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.configurations.default)
194
- assert_equal({:two => 'TWO', :three => 'THREE'}, t.config_template)
195
- assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
196
-
197
- t1 = t.create_batch_task
198
- assert_equal({}, t1.config_template)
199
- assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t1.config)
141
+ #
142
+ # config tests
143
+ #
144
+
145
+ def test_config_is_loaded_from_config_file
146
+ t = Task.new "configured"
147
+ assert File.exists?(t.config_file)
148
+ assert_equal "key: value", File.read(t.config_file)
149
+ assert_equal({:key => 'value'}, t.config)
150
+ end
151
+
152
+ def test_batched_tasks_are_defined_with_corresponding_configs_for_batched_config_files
153
+ t = Task.new "batched"
154
+ assert File.exists?(t.config_file)
155
+ assert_equal "- key: first\n- key: second", File.read(t.config_file)
156
+
157
+ assert_equal 2, t.batch.size
158
+
159
+ t1, t2 = t.batch
160
+ assert_equal({:key => 'first'}, t1.config)
161
+ assert_equal({:key => 'second'}, t2.config)
162
+ end
163
+
164
+ def test_configs_are_merged_to_each_batched_task
165
+ t = Task.new "batched", :another => 'value'
166
+ t1, t2 = t.batch
167
+ assert_equal({:key => 'first', :another => 'value'}, t1.config)
168
+ assert_equal({:key => 'second', :another => 'value'}, t2.config)
169
+ end
200
170
 
201
- t2 = t.create_batch_task({:two => "TWO", :three => "THREE"}, {:three => 3})
202
- assert_equal({:two => "TWO", :three => "THREE"}, t2.config_template)
203
- assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t2.config)
204
- end
205
-
206
- #
207
- # batched? test
208
- #
209
-
210
- def test_batched_returns_true_if_batch_size_is_greater_than_one
211
- assert !t.batched?
212
- assert_equal 1, t.batch.size
213
-
214
- t1 = t.create_batch_task
215
-
216
- assert t.batched?
217
- assert t1.batched?
218
- end
219
-
220
- #
221
- # batch_index test
222
- #
223
-
224
- def test_batch_index_returns_the_index_of_the_task_in_batch
225
- t1 = t.create_batch_task
226
-
227
- assert_equal [t, t1], t.batch
228
- assert_equal 0, t.batch_index
229
- assert_equal 1, t1.batch_index
230
- end
231
-
232
- #
233
- # config_file test
234
- #
235
-
236
- def test_config_file_returns_yml_filepath_for_name_relative_to_app_config_dir
237
- assert_equal File.join(t.app['config'], t.name + ".yml"), t.config_file
238
- end
239
-
240
171
  #
241
- # iterate test
172
+ # enq test
242
173
  #
174
+
175
+ def test_enq_enqueues_task_to_app_queue_with_inputs
176
+ assert t.app.queue.empty?
177
+
178
+ t.enq 1
179
+
180
+ assert_equal 1, t.app.queue.size
181
+ assert_equal [[t, [1]]], t.app.queue.to_a
182
+
183
+ t.enq 1
184
+ t.enq 2
185
+
186
+ assert_equal [[t, [1]], [t, [1]], [t, [2]]], t.app.queue.to_a
187
+ end
243
188
 
244
- def test_iterate_defaults_to_class_iterative_variable
245
- assert Task.iterative
246
- assert t.iterate?
189
+ def test_enq_enqueues_task_batch
190
+ t2 = t.initialize_batch_obj
191
+
192
+ assert t.app.queue.empty?
193
+ assert_equal 2, t.batch.size
194
+
195
+ t.enq 1
196
+
197
+ assert_equal 2, t.app.queue.size
198
+ assert_equal [[t, [1]], [t2, [1]]], t.app.queue.to_a
247
199
  end
248
-
249
- #
250
- # config tests
251
- #
252
-
253
- class ConfigDocSampleTask < Tap::Task
254
- config :key, 'value'
200
+
201
+ def test_unbatched_enq_only_enqueues_task
202
+ t2 = t.initialize_batch_obj
255
203
 
256
- config_reader
257
- config :reader_only
204
+ assert_equal 2, t.batch.size
205
+ assert t.app.queue.empty?
206
+ t.unbatched_enq 1
207
+
208
+ assert_equal 1, t.app.queue.size
209
+ assert_equal [[t, [1]]], t.app.queue.to_a
258
210
  end
211
+
212
+ #
213
+ # on_complete test
214
+ #
215
+
216
+ def test_on_complete_completes_task_batch
217
+ t2 = t.initialize_batch_obj
218
+
219
+ assert_nil t.on_complete_block
220
+ assert_nil t2.on_complete_block
221
+
222
+ b = lambda {}
223
+ t.on_complete(&b)
224
+
225
+ assert_equal b, t.on_complete_block
226
+ assert_equal b, t2.on_complete_block
227
+ end
228
+
229
+ def test_unbatched_on_complete_only_completes_task
230
+ t2 = t.initialize_batch_obj
231
+
232
+ assert_nil t.on_complete_block
233
+ assert_nil t2.on_complete_block
259
234
 
260
- def test_config_doc
261
- t = ConfigDocSampleTask.new
262
- assert t.respond_to?(:reader_only)
263
- assert !t.respond_to?(:reader_only=)
235
+ b = lambda {}
236
+ t.unbatched_on_complete(&b)
237
+
238
+ assert_equal b, t.on_complete_block
239
+ assert_nil t2.on_complete_block
240
+ end
241
+
242
+ #
243
+ # multithread= test
244
+ #
264
245
 
265
- assert_equal({:key => 'value', :reader_only => nil}, t.config)
266
- assert_equal 'value', t.key
267
- t.key = 'another'
268
- assert_equal({:key => 'another', :reader_only => nil}, t.config)
269
- end
270
-
271
- class TaskWithDefaultConfig < Task
272
- config :one, 'one'
273
- config :two, 'two'
274
- config :three, 'three'
275
- end
276
-
277
- def test_config_sets_config
278
- assert_equal({}, t.config)
279
- t.config = {:key => 'value'}
280
- assert_equal({:key => 'value'}, t.config)
281
- end
282
-
283
- def test_config_merges_class_defaults_and_config_template_and_inputs_in_order
284
- t = TaskWithDefaultConfig.new "overriding"
285
- assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.configurations.default)
286
- assert_equal({:two => 'TWO', :three => 'THREE'}, t.config_template)
287
-
288
- t.config = {:three => 3}
289
- assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
290
- end
291
-
292
- def test_nil_is_treated_as_empty_hash
293
- t = TaskWithDefaultConfig.new "overriding"
294
- assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.configurations.default)
295
- assert_equal({:two => 'TWO', :three => 'THREE'}, t.config_template)
296
-
297
- t.config[:three] = 3
298
- assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
299
-
300
- t.config = nil
301
- assert_equal({:one => 'one', :two => 'TWO', :three => 'THREE'}, t.config)
302
- end
303
-
304
- class TaskWithManyConfigs < Task
305
- config :one, 'one'
306
-
307
- declare_config
308
- config :two, 'two'
246
+ def test_set_multithread_sets_multithread_for_task_batch
247
+ t2 = t.initialize_batch_obj
309
248
 
310
- config_reader
311
- config :three, 'three'
249
+ assert !t.multithread
250
+ assert !t2.multithread
251
+
252
+ t.multithread = true
312
253
 
313
- config_writer
314
- config :four, 'four'
254
+ assert t.multithread
255
+ assert t2.multithread
256
+ end
257
+
258
+ def test_unbatched_set_multithread_sets_multithread_for_task_only
259
+ t2 = t.initialize_batch_obj
315
260
 
316
- config_accessor
317
- config :five, 'five'
261
+ assert !t.multithread
262
+ assert !t2.multithread
263
+
264
+ t.unbatched_multithread = true
318
265
 
319
- declare_config :six
320
- config_reader :seven
321
- config_writer :eight
322
- config_accessor :nine
323
- end
324
-
325
- def test_config_with_many_configs
326
- t = TaskWithManyConfigs.new
327
-
328
- assert_equal({
329
- :one => 'one', :six => nil,
330
- :two => 'two', :seven => nil,
331
- :three => 'three', :eight => nil,
332
- :four => 'four', :nine => nil,
333
- :five => 'five'},
334
- t.config)
335
-
336
- # readers only
337
- [:three, :seven].each do |config|
338
- assert t.respond_to?(config)
339
- assert !t.respond_to?("#{config}=")
340
- end
341
-
342
- # writers only
343
- [:four, :eight].each do |config|
344
- assert !t.respond_to?(config)
345
- assert t.respond_to?("#{config}=")
346
- end
266
+ assert t.multithread
267
+ assert !t2.multithread
268
+ end
269
+
270
+ #
271
+ # to_s test
272
+ #
273
+
274
+ def test_to_s_returns_name
275
+ assert_equal t.name, t.to_s
276
+ t = Task.new("alt_name")
277
+ assert_equal "alt_name", t.to_s
278
+ end
279
+
280
+ #
281
+ # process test
282
+ #
283
+
284
+ class TaskWithTwoInputsForProcessDoc < Tap::Task
285
+ def process(a, b)
286
+ [b,a]
287
+ end
288
+ end
289
+
290
+ def test_process_documentation
291
+ t = TaskWithTwoInputsForProcessDoc.new
292
+ t.enq(1,2).enq(3,4)
293
+ t.app.run
294
+ assert_equal [[2,1], [4,3]], t.app.results(t)
295
+
296
+ t = Task.new {|task, a, b| [b,a] }
297
+ t.enq(1,2).enq(3,4)
298
+ t.app.run
299
+ assert_equal [[2,1], [4,3]], t.app.results(t)
300
+ end
301
+
302
+ def test_process_calls_task_block_with_input
303
+ b = lambda do |task, input|
304
+ runlist << input
305
+ input += 1
306
+ end
307
+ t = Task.new(&b)
308
+
309
+ assert_equal b, t.task_block
310
+ assert_equal 2, t.process(1)
311
+ assert_equal [1], runlist
312
+ end
313
+
314
+ def test_process_returns_inputs_if_task_block_is_not_set
315
+ t = Task.new
316
+ assert_nil t.task_block
317
+ assert_equal [1,2,3], t.process(1,2,3)
318
+ end
347
319
 
348
- # both
349
- [:one, :five, :nine].each do |config|
350
- assert t.respond_to?(config)
351
- assert t.respond_to?("#{config}=")
352
- end
353
-
354
- # neither
355
- [:two, :six].each do |config|
356
- assert !t.respond_to?(config)
357
- assert !t.respond_to?("#{config}=")
358
- end
359
- end
360
-
361
- #
362
- # queue test
363
- #
364
-
365
- def test_queue_enqueues_task_to_app_queue_with_inputs
366
- assert t.app.queue.empty?
367
-
368
- t.enq 1
369
-
370
- assert_equal 1, t.app.queue.size
371
- assert_equal [t, [1]], t.app.queue.deq
372
-
373
- t.enq 1
374
- t.enq 2
375
-
376
- assert_equal [t, [1,2]], t.app.queue.deq
377
- end
378
-
379
- #
380
- # process test
381
- #
382
-
383
- def test_process_calls_task_block_with_input
384
- b = lambda do |task, input|
385
- runlist << input
386
- input += 1
387
- end
388
- t = Task.new(&b)
389
-
390
- assert_equal b, t.task_block
391
- assert_equal 2, t.process(1)
392
- assert_equal [1], runlist
393
- end
394
-
395
- def test_process_returns_input_if_task_block_is_not_set
396
- t = Task.new
397
-
398
- assert_nil t.task_block
399
- assert_equal 1, t.process(1)
400
- end
401
-
402
- #
403
- # synchronize tests
404
- #
405
-
406
- def test_tasks_publically_respond_to_synchronize
407
- assert t.respond_to?(:synchronize)
408
- was_in_block = false
409
- t.synchronize { was_in_block = true }
410
- assert was_in_block
411
- end
412
-
413
- # JRuby inconsistent test?
414
- def test_duplicate_tasks_are_monitored_separately
415
- extended_test do
416
- count = 0
417
- max_count = 0
418
-
419
- t1 = Task.new do |task, inputs|
420
- task.synchronize do
421
- count += 1
422
-
423
- # max count will be 2 if both tasks execute
424
- # simultaneously (ie they are monitored
425
- # separately)
426
- max_count = count if count > max_count
427
- sleep 0.1
428
- count -= 1
429
- end
430
- end
431
- t2 = t1.dup
432
-
433
- th_1 = Thread.new { t1.execute nil }
434
- th_2 = Thread.new { t2.execute nil }
435
-
436
- th_1.join
437
- th_2.join
438
-
439
- assert_equal 0, count
440
- assert_equal 2, max_count
441
- end
442
- end
443
320
  end