tap 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,74 @@
1
+ require File.join(File.dirname(__FILE__), '../tap_test_helper')
2
+ require 'tap/support/batchable'
3
+
4
+ class BatchableTest < Test::Unit::TestCase
5
+
6
+ class BatchableClass
7
+ include Tap::Support::Batchable
8
+ def initialize
9
+ @batch = []
10
+ initialize_batch_obj
11
+ end
12
+ end
13
+
14
+ attr_accessor :t
15
+
16
+ def setup
17
+ @t = BatchableClass.new
18
+ end
19
+
20
+ #
21
+ # batch test
22
+ #
23
+
24
+ def test_batch_documentation
25
+ t1 = Tap::Task.new
26
+ t2 = Tap::Task.new
27
+ t3 = t2.initialize_batch_obj
28
+
29
+ Tap::Support::Batchable.batch(t1, t2)
30
+ assert_equal [t1,t2,t3], t3.batch
31
+ end
32
+
33
+ #
34
+ # batched? test
35
+ #
36
+
37
+ def test_batched_returns_true_if_batch_size_is_greater_than_one
38
+ assert !t.batched?
39
+ assert_equal 1, t.batch.size
40
+
41
+ t1 = t.initialize_batch_obj
42
+
43
+ assert t.batched?
44
+ assert t1.batched?
45
+ end
46
+
47
+ #
48
+ # batch_index test
49
+ #
50
+
51
+ def test_batch_index_returns_the_index_of_the_task_in_batch
52
+ t1 = t.initialize_batch_obj
53
+
54
+ assert_equal [t, t1], t.batch
55
+ assert_equal 0, t.batch_index
56
+ assert_equal 1, t1.batch_index
57
+ end
58
+
59
+ #
60
+ # initialize_batch_obj test
61
+ #
62
+
63
+ def test_created_batch_tasks_are_added_to_and_share_the_same_execute_batch
64
+ assert_equal [t], t.batch
65
+
66
+ t1 = t.initialize_batch_obj
67
+ t2 = t1.initialize_batch_obj
68
+
69
+ assert_equal [t, t1, t2], t.batch
70
+ assert_equal t.batch.object_id, t1.batch.object_id
71
+ assert_equal t.batch.object_id, t2.batch.object_id
72
+ end
73
+
74
+ end
@@ -1,24 +1,85 @@
1
1
  require File.join(File.dirname(__FILE__), '../tap_test_helper')
2
- require 'tap/support/task_configuration'
3
- require 'tap/task'
2
+ require 'tap/support/class_configuration'
3
+ require 'tap/support/validation'
4
+ require 'tap/support/configurable_methods'
5
+ require 'tap/support/tdoc'
6
+ require 'tap/support/configurable'
4
7
 
5
8
  # for documentation test
6
- class BaseTask < Tap::Task
9
+ class BaseTask
10
+ include Tap::Support::Configurable
7
11
  config :one, 1
8
12
  end
9
13
  class SubTask < BaseTask
10
14
  config :one, 'one'
11
15
  config :two, 'two'
12
16
  end
17
+ class MergeTask < BaseTask
18
+ config :three, 'three'
19
+ config_merge SubTask
20
+ end
21
+ class ValidationTask < Tap::Task
22
+ config :one, 'one', &c.check(String)
23
+ config :two, 'two', &c.yaml(/two/, Integer)
24
+ config :three, 'three' do |v|
25
+ v =~ /three/ ? v.upcase : raise("not three")
26
+ end
27
+ end
13
28
 
14
- class TaskConfigurationTest < Test::Unit::TestCase
29
+ class ClassConfigurationTest < Test::Unit::TestCase
15
30
  include Tap::Support
16
31
 
32
+ def test_config_merge
33
+ t = MergeTask.new
34
+ assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.config)
35
+ assert t.respond_to?(:two)
36
+ yaml = MergeTask.configurations.format_yaml
37
+ expected = %Q{
38
+ # BaseTask configuration
39
+ one: one
40
+
41
+ # MergeTask configuration
42
+ three: three
43
+
44
+ # SubTask configuration
45
+ two: two
46
+ }
47
+
48
+ assert_equal expected[1..-1], yaml
49
+ assert_equal({'one' => 'one', 'two' => 'two', 'three' => 'three'}, YAML.load(yaml))
50
+ end
51
+
52
+ def test_config_validations
53
+ t = ValidationTask.new
54
+ assert_equal({:one => 'one', :two => 'two', :three => 'THREE'}, t.config)
55
+
56
+ t.one = 'two'
57
+ assert_equal 'two', t.one
58
+ assert_raise(Validation::ValidationError) { t.one = 1 }
59
+
60
+ t.two = "two"
61
+ assert_equal 'two', t.two
62
+ t.two = 2
63
+ assert_equal 2, t.two
64
+ t.two = "2"
65
+ assert_equal 2, t.two
66
+ assert_raise(Validation::ValidationError) { t.two = 'three' }
67
+ assert_raise(Validation::ValidationError) { t.two = 2.2 }
68
+
69
+ t.three = "three"
70
+ assert_equal 'THREE', t.three
71
+ assert_raise(RuntimeError) { t.three = 'THREE' }
72
+ end
73
+
17
74
  def test_initialization
18
- c = TaskConfiguration.new
19
- assert_equal({}, c.declarations)
75
+ c = ClassConfiguration.new ClassConfigurationTest
76
+
77
+ assert_equal ClassConfigurationTest, c.receiver
78
+ assert_equal [], c.declarations
79
+ assert_equal [[c.receiver, []]], c.declarations_array
20
80
  assert_equal({}, c.default)
21
- assert_equal({}, c.attributes)
81
+ assert_equal({}, c.unprocessed_default)
82
+ assert_equal({}, c.process_blocks)
22
83
  end
23
84
 
24
85
  #
@@ -26,13 +87,12 @@ class TaskConfigurationTest < Test::Unit::TestCase
26
87
  #
27
88
 
28
89
  def test_format_yaml_with_single_class
29
- cc = TaskConfiguration.new
30
- cc.declare('one', TaskConfigurationTest)
31
- cc.set('one', 1)
90
+ cc = ClassConfiguration.new ClassConfigurationTest
91
+ cc.add('one', 1)
32
92
 
33
93
  yaml = cc.format_yaml
34
94
  expected = %Q{
35
- # TaskConfigurationTest configuration
95
+ # ClassConfigurationTest configuration
36
96
  one: 1
37
97
  }
38
98
 
@@ -41,13 +101,12 @@ one: 1
41
101
  end
42
102
 
43
103
  def test_format_stringifies_keys
44
- cc = TaskConfiguration.new
45
- cc.declare(:one, TaskConfigurationTest)
46
- cc.set(:one, 1)
104
+ cc = ClassConfiguration.new ClassConfigurationTest
105
+ cc.add(:one, 1)
47
106
 
48
107
  yaml = cc.format_yaml
49
108
  expected = %Q{
50
- # TaskConfigurationTest configuration
109
+ # ClassConfigurationTest configuration
51
110
  one: 1
52
111
  }
53
112
 
@@ -57,13 +116,13 @@ one: 1
57
116
  end
58
117
  class Hold
59
118
  def test_format_yaml_with_desc
60
- cc = TaskConfiguration.new
61
- cc.declare('one', TaskConfigurationTest)
119
+ cc = ClassConfiguration.new
120
+ cc.declare('one', ClassConfigurationTest)
62
121
  cc.set('one', 1, :desc => "comment")
63
122
 
64
123
  yaml = cc.format_yaml
65
124
  expected = %Q{
66
- # TaskConfigurationTest configuration
125
+ # ClassConfigurationTest configuration
67
126
  one: 1 # comment
68
127
  }
69
128
 
@@ -72,13 +131,13 @@ one: 1 # comment
72
131
  end
73
132
 
74
133
  def test_format_yaml_with_long_desc
75
- cc = TaskConfiguration.new
76
- cc.declare('one', TaskConfigurationTest)
134
+ cc = ClassConfiguration.new
135
+ cc.declare('one', ClassConfigurationTest)
77
136
  cc.set('one', 1, :desc => 'comment longer than some twenty chars')
78
137
 
79
138
  yaml = cc.format_yaml
80
139
  expected = %Q{
81
- # TaskConfigurationTest configuration
140
+ # ClassConfigurationTest configuration
82
141
  # comment longer than some twenty chars
83
142
  one: 1
84
143
  }
@@ -88,10 +147,10 @@ one: 1
88
147
  end
89
148
 
90
149
  def test_format_yaml_with_long_value
91
- cc = TaskConfiguration.new(['one', 'value longer than some twenty chars', 'comment', TaskConfigurationTest])
150
+ cc = ClassConfiguration.new(['one', 'value longer than some twenty chars', 'comment', ClassConfigurationTest])
92
151
  yaml = cc.format_yaml
93
152
  expected = %Q{
94
- # TaskConfigurationTest configuration
153
+ # ClassConfigurationTest configuration
95
154
  # comment
96
155
  one: value longer than some twenty chars
97
156
  }
@@ -101,10 +160,10 @@ one: value longer than some twenty chars
101
160
  end
102
161
 
103
162
  # def test_format_yaml_with_nil_value
104
- # cc = TaskConfiguration.new(['one', nil, 'comment', TaskConfigurationTest])
163
+ # cc = ClassConfiguration.new(['one', nil, 'comment', ClassConfigurationTest])
105
164
  # yaml = cc.format_yaml
106
165
  # expected = %Q{
107
- # # TaskConfigurationTest configuration
166
+ # # ClassConfigurationTest configuration
108
167
  # #one: # comment
109
168
  # }
110
169
  #
@@ -113,10 +172,10 @@ one: value longer than some twenty chars
113
172
  # end
114
173
 
115
174
  def test_format_yaml_with_multiline_comment
116
- cc = TaskConfiguration.new(['one', 1, "multiline\ncomment", TaskConfigurationTest])
175
+ cc = ClassConfiguration.new(['one', 1, "multiline\ncomment", ClassConfigurationTest])
117
176
  yaml = cc.format_yaml
118
177
  expected = %Q{
119
- # TaskConfigurationTest configuration
178
+ # ClassConfigurationTest configuration
120
179
  # multiline
121
180
  # comment
122
181
  one: 1
@@ -127,10 +186,10 @@ one: 1
127
186
  end
128
187
 
129
188
  def test_format_yaml_with_multiline_value
130
- cc = TaskConfiguration.new(['one', [1,2,3], "comment", TaskConfigurationTest])
189
+ cc = ClassConfiguration.new(['one', [1,2,3], "comment", ClassConfigurationTest])
131
190
  yaml = cc.format_yaml
132
191
  expected = %Q{
133
- # TaskConfigurationTest configuration
192
+ # ClassConfigurationTest configuration
134
193
  # comment
135
194
  one:
136
195
  - 1
@@ -143,17 +202,17 @@ one:
143
202
  end
144
203
 
145
204
  def test_format_yaml_with_multiple_classes
146
- cc = TaskConfiguration.new(
147
- ['one', 1, '', TaskConfigurationTest],
205
+ cc = ClassConfiguration.new(
206
+ ['one', 1, '', ClassConfigurationTest],
148
207
  ['one', 'one', 'integer', AnotherClass],
149
208
  ['two', {'key' => 'value'}, 'hash', AnotherClass],
150
209
  ['three', [1,2,3], "multiline\narray", AnotherClass])
151
210
  yaml = cc.format_yaml
152
211
  expected = %Q{
153
- # TaskConfigurationTest configuration
212
+ # ClassConfigurationTest configuration
154
213
  one: one # integer
155
214
 
156
- # TaskConfigurationTest::AnotherClass configurations
215
+ # ClassConfigurationTest::AnotherClass configurations
157
216
  # hash
158
217
  two:
159
218
  key: value
@@ -196,30 +255,30 @@ class Hold
196
255
  end
197
256
 
198
257
  def test_add
199
- cc = TaskConfiguration.new
200
- cc.add(:key, 'value', TaskConfigurationTest)
258
+ cc = ClassConfiguration.new
259
+ cc.add(:key, 'value', ClassConfigurationTest)
201
260
 
202
- assert_equal [[:key, 'value', TaskConfigurationTest]], cc.declarations
261
+ assert_equal [[:key, 'value', ClassConfigurationTest]], cc.declarations
203
262
  assert_equal({:key => 'value'}, cc.hash)
204
263
 
205
264
  cc.add(:key, 'new value', AnotherClass)
206
265
  assert_equal [
207
- [:key, 'value', TaskConfigurationTest],
266
+ [:key, 'value', ClassConfigurationTest],
208
267
  [:key, 'new value', AnotherClass]
209
268
  ], cc.declarations
210
269
  assert_equal({:key => 'new value'}, cc.hash)
211
270
  end
212
271
 
213
272
  def test_add_symbolizes_keys
214
- cc = TaskConfiguration.new
215
- cc.add('key', 'value', TaskConfigurationTest)
273
+ cc = ClassConfiguration.new
274
+ cc.add('key', 'value', ClassConfigurationTest)
216
275
 
217
- assert_equal [[:key, 'value', TaskConfigurationTest]], cc.declarations
276
+ assert_equal [[:key, 'value', ClassConfigurationTest]], cc.declarations
218
277
  assert_equal({:key => 'value'}, cc.hash)
219
278
  end
220
279
 
221
280
  # def test_add_raises_error_if_declarations_are_not_correct
222
- # cc = TaskConfiguration.new
281
+ # cc = ClassConfiguration.new
223
282
  # assert_raise(ArgumentError) { cc.add(:key, 'value')}
224
283
  # assert_raise(ArgumentError) { cc.add([:key, 'value'])}
225
284
  # end
@@ -229,8 +288,8 @@ class Hold
229
288
  #
230
289
 
231
290
  def test_remove
232
- cc = TaskConfiguration.new(
233
- [:one, 1, TaskConfigurationTest],
291
+ cc = ClassConfiguration.new(
292
+ [:one, 1, ClassConfigurationTest],
234
293
  [:one, 'one', AnotherClass],
235
294
  [:two, 'two', AnotherClass],
236
295
  [:three, 'three', AnotherClass])
@@ -244,7 +303,7 @@ class Hold
244
303
  end
245
304
 
246
305
  def test_remove_symbolizes_inputs
247
- cc = TaskConfiguration.new([:key, 'value', TaskConfigurationTest])
306
+ cc = ClassConfiguration.new([:key, 'value', ClassConfigurationTest])
248
307
  cc.remove('key')
249
308
  assert_equal [], cc.declarations
250
309
  end
@@ -254,16 +313,16 @@ class Hold
254
313
  #
255
314
 
256
315
  # def test_merge
257
- # c1 = TaskConfiguration.new([:one, 1, '', TaskConfigurationTest])
316
+ # c1 = ClassConfiguration.new([:one, 1, '', ClassConfigurationTest])
258
317
  # c2 = c1.merge([
259
318
  # [:one, 'one', '', AnotherClass],
260
319
  # [:two, 'two', '', AnotherClass]])
261
320
  #
262
321
  # assert_not_equal c1.object_id, c2.object_id
263
322
  #
264
- # assert_equal [[:one, 1, '', TaskConfigurationTest]], c1.declarations
323
+ # assert_equal [[:one, 1, '', ClassConfigurationTest]], c1.declarations
265
324
  # assert_equal [
266
- # [:one, 1, '', TaskConfigurationTest],
325
+ # [:one, 1, '', ClassConfigurationTest],
267
326
  # [:one, 'one', '', AnotherClass],
268
327
  # [:two, 'two', '', AnotherClass]], c2.declarations
269
328
  # end
@@ -0,0 +1,295 @@
1
+ require File.join(File.dirname(__FILE__), '../tap_test_helper')
2
+ require 'tap/support/class_configuration'
3
+ require 'tap/support/validation'
4
+ require 'tap/support/configurable_methods'
5
+ require 'tap/support/tdoc'
6
+ require 'tap/support/configurable'
7
+
8
+ # for documentation test
9
+ # class BaseTask
10
+ # include Tap::Support::Configurable
11
+ # config :one, 1
12
+ # end
13
+ # class SubTask < BaseTask
14
+ # config :one, 'one'
15
+ # config :two, 'two'
16
+ # end
17
+ #
18
+
19
+ class ConfigurableTest < Test::Unit::TestCase
20
+ acts_as_tap_test
21
+
22
+ class ConfigurableClassWithNoConfigs
23
+ include Tap::Support::Configurable
24
+ end
25
+
26
+ class ConfigurableClass
27
+ include Tap::Support::Configurable
28
+
29
+ config :one, 'one'
30
+ config :two, 'two'
31
+ config :three, 'three'
32
+ end
33
+
34
+ def setup
35
+ super
36
+ app.root = trs.root
37
+ end
38
+
39
+ def test_configurable_doc
40
+ t = ConfigurableClass.new
41
+ assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.config)
42
+ end
43
+
44
+ #
45
+ # include test
46
+ #
47
+
48
+ def test_include_extends_class_with_ConfigurableMethods
49
+ assert ConfigurableClassWithNoConfigs.kind_of?(Tap::Support::ConfigurableMethods)
50
+ end
51
+
52
+ #
53
+ # default_name test
54
+ #
55
+
56
+ def test_default_name
57
+ assert_equal "configurable_test/configurable_class", ConfigurableClass.default_name
58
+ end
59
+
60
+ #
61
+ # name test
62
+ #
63
+
64
+ def test_name_is_initialized_to_class_default_name_unless_specified
65
+ assert_equal ConfigurableClass.default_name, ConfigurableClass.new.name
66
+ assert_equal "alt", ConfigurableClass.new("alt").name
67
+ end
68
+
69
+ # config_file test
70
+ #
71
+
72
+ def test_config_file_is_app_config_filepath_when_config_file_exist
73
+ t = ConfigurableClass.new "configured"
74
+ app_config_filepath = app.config_filepath("configured")
75
+
76
+ assert_equal File.join(t.app['config'], "configured.yml"),app_config_filepath
77
+ assert File.exists?(app_config_filepath)
78
+ assert_equal app.config_filepath("configured"), t.config_file
79
+ end
80
+
81
+ def test_config_file_is_nil_for_nil_input_names
82
+ t = ConfigurableClass.new
83
+ assert_equal nil, t.config_file
84
+
85
+ t = ConfigurableClass.new nil
86
+ assert_equal nil, t.config_file
87
+ end
88
+
89
+ #
90
+ # config tests
91
+ #
92
+
93
+ class SampleClass
94
+ include Tap::Support::Configurable
95
+
96
+ config :key, 'value'
97
+ config_reader
98
+ config :reader_only
99
+ end
100
+
101
+ class ValidatingClass
102
+ include Tap::Support::Configurable
103
+
104
+ config :one, 'one', &c.check(String)
105
+ config :two, 'two' do |v|
106
+ v.upcase
107
+ end
108
+ end
109
+
110
+ def test_config_doc
111
+ t = SampleClass.new
112
+ assert t.respond_to?(:reader_only)
113
+ assert !t.respond_to?(:reader_only=)
114
+
115
+ assert_equal({:key => 'value', :reader_only => nil}, t.config)
116
+ assert_equal 'value', t.key
117
+ t.key = 'another'
118
+ assert_equal({:key => 'another', :reader_only => nil}, t.config)
119
+
120
+ t = ValidatingClass.new
121
+ assert_equal({:one => 'one', :two => 'TWO'}, t.config)
122
+ assert_raise(Tap::Support::Validation::ValidationError) { t.one = 1 }
123
+ assert_raise(Tap::Support::Validation::ValidationError) { t.config = {:one => 1} }
124
+
125
+ t.config = {:one => 'str', :two => 'str'}
126
+ assert_equal({:one => 'str', :two => 'STR'}, t.config)
127
+ end
128
+
129
+ def test_config_sets_config
130
+ t = ConfigurableClassWithNoConfigs.new
131
+ assert_equal({}, t.config)
132
+ t.config = {:key => 'value'}
133
+ assert_equal({:key => 'value'}, t.config)
134
+ end
135
+
136
+ def test_config_merges_default_config_and_overrides
137
+ t = ConfigurableClass.new "configured"
138
+ assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.configurations.default)
139
+ assert_equal({:one => 'one', :two => 'TWO', :three => 'THREE'}, t.config)
140
+
141
+ t.config = {:three => 3}
142
+ assert_equal({:one => 'one', :two => 'two', :three => 3}, t.config)
143
+ end
144
+
145
+ class ConfigurableClassWithManyConfigs
146
+ include Tap::Support::Configurable
147
+
148
+ config :one, 'one'
149
+
150
+ declare_config
151
+ config :two, 'two'
152
+
153
+ config_reader
154
+ config :three, 'three'
155
+
156
+ config_writer
157
+ config :four, 'four'
158
+
159
+ config_accessor
160
+ config :five, 'five'
161
+
162
+ declare_config :six
163
+ config_reader :seven
164
+ config_writer :eight
165
+ config_accessor :nine
166
+ end
167
+
168
+ def test_config_with_many_configs
169
+ t = ConfigurableClassWithManyConfigs.new
170
+
171
+ assert_equal({
172
+ :one => 'one', :six => nil,
173
+ :two => 'two', :seven => nil,
174
+ :three => 'three', :eight => nil,
175
+ :four => 'four', :nine => nil,
176
+ :five => 'five'},
177
+ t.config)
178
+
179
+ # readers only
180
+ [:three, :seven].each do |config|
181
+ assert t.respond_to?(config)
182
+ assert !t.respond_to?("#{config}=")
183
+ end
184
+
185
+ # writers only
186
+ [:four, :eight].each do |config|
187
+ assert !t.respond_to?(config)
188
+ assert t.respond_to?("#{config}=")
189
+ end
190
+
191
+ # both
192
+ [:one, :five, :nine].each do |config|
193
+ assert t.respond_to?(config)
194
+ assert t.respond_to?("#{config}=")
195
+ end
196
+
197
+ # neither
198
+ [:two, :six].each do |config|
199
+ assert !t.respond_to?(config)
200
+ assert !t.respond_to?("#{config}=")
201
+ end
202
+ end
203
+
204
+ #
205
+ # test subclass behavior
206
+ #
207
+
208
+ class DeclarationClass
209
+ include Tap::Support::Configurable
210
+
211
+ declare_config
212
+
213
+ config :one, 1
214
+ config :two, 2
215
+ config :three, 3
216
+
217
+ config_accessor :one
218
+ config_writer :two
219
+ config_reader :three
220
+ end
221
+
222
+ class DeclarationSubClass < DeclarationClass
223
+ config :one, "one"
224
+ config :four, 4
225
+ end
226
+
227
+ def test_config_accessors_are_inherited
228
+ t = DeclarationSubClass.new
229
+
230
+ assert t.respond_to?(:one)
231
+ assert t.respond_to?("one=")
232
+ assert !t.respond_to?(:two)
233
+ assert t.respond_to?("two=")
234
+ assert t.respond_to?(:three)
235
+ assert !t.respond_to?("three=")
236
+
237
+ assert t.respond_to?(:four)
238
+ assert t.respond_to?("four=")
239
+ end
240
+
241
+ def test_class_configurations_are_inherited_but_can_be_overridden
242
+ assert_equal([
243
+ [DeclarationClass, [:one, :two, :three]],
244
+ [DeclarationSubClass, [:four]]
245
+ ], DeclarationSubClass.configurations.declarations_array)
246
+
247
+ assert_equal({:one => 1, :two => 2, :three => 3}, DeclarationClass.configurations.default)
248
+ assert_equal({:one => 'one', :two => 2, :three => 3, :four => 4}, DeclarationSubClass.configurations.default)
249
+
250
+ t = DeclarationSubClass.new
251
+ assert_equal({:one => 'one', :two => 2, :three => 3, :four => 4}, t.config)
252
+ end
253
+
254
+ #
255
+ # initialize_batch_obj test
256
+ #
257
+
258
+ def test_initialize_batch_obj_merges_default_config_and_overrides
259
+ t = ConfigurableClass.new "configured", :three => 3
260
+ assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.configurations.default)
261
+ assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
262
+
263
+ t1 = t.initialize_batch_obj
264
+ assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t1.config)
265
+
266
+ t2 = t.initialize_batch_obj(nil, {:three => 3})
267
+ assert_equal({:one => 'one', :two => 'two', :three => 3}, t2.config)
268
+ end
269
+
270
+
271
+ # include Tap::Support
272
+ #
273
+ # def test_config_validations
274
+ # t = ValidationTask.new
275
+ # assert_equal({:one => 'one', :two => 'two', :three => 'THREE'}, t.config)
276
+ #
277
+ # t.one = 'two'
278
+ # assert_equal 'two', t.one
279
+ # assert_raise(Validation::ValidationError) { t.one = 1 }
280
+ #
281
+ # t.two = "two"
282
+ # assert_equal 'two', t.two
283
+ # t.two = 2
284
+ # assert_equal 2, t.two
285
+ # t.two = "2"
286
+ # assert_equal 2, t.two
287
+ # assert_raise(Validation::ValidationError) { t.two = 'three' }
288
+ # assert_raise(Validation::ValidationError) { t.two = 2.2 }
289
+ #
290
+ # t.three = "three"
291
+ # assert_equal 'THREE', t.three
292
+ # assert_raise(RuntimeError) { t.three = 'THREE' }
293
+ # end
294
+
295
+ end