tap 0.12.4 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/History +34 -0
  2. data/README +62 -41
  3. data/bin/tap +36 -40
  4. data/cmd/console.rb +14 -6
  5. data/cmd/manifest.rb +62 -58
  6. data/cmd/run.rb +49 -31
  7. data/doc/API +84 -0
  8. data/doc/Class Reference +83 -115
  9. data/doc/Examples/Command Line +36 -0
  10. data/doc/Examples/Workflow +40 -0
  11. data/lib/tap/app.rb +293 -214
  12. data/lib/tap/app/node.rb +43 -0
  13. data/lib/tap/app/queue.rb +77 -0
  14. data/lib/tap/app/stack.rb +16 -0
  15. data/lib/tap/app/state.rb +22 -0
  16. data/lib/tap/constants.rb +2 -2
  17. data/lib/tap/env.rb +400 -314
  18. data/lib/tap/env/constant.rb +227 -0
  19. data/lib/tap/env/gems.rb +63 -0
  20. data/lib/tap/env/manifest.rb +89 -0
  21. data/lib/tap/env/minimap.rb +292 -0
  22. data/lib/tap/{support → env}/string_ext.rb +2 -2
  23. data/lib/tap/exe.rb +113 -125
  24. data/lib/tap/join.rb +175 -0
  25. data/lib/tap/joins.rb +9 -0
  26. data/lib/tap/joins/switch.rb +44 -0
  27. data/lib/tap/joins/sync.rb +99 -0
  28. data/lib/tap/root.rb +100 -491
  29. data/lib/tap/root/utils.rb +220 -0
  30. data/lib/tap/{support → root}/versions.rb +31 -29
  31. data/lib/tap/schema.rb +248 -0
  32. data/lib/tap/schema/parser.rb +413 -0
  33. data/lib/tap/schema/utils.rb +82 -0
  34. data/lib/tap/support/intern.rb +19 -6
  35. data/lib/tap/support/templater.rb +8 -3
  36. data/lib/tap/task.rb +175 -171
  37. data/lib/tap/tasks/dump.rb +58 -0
  38. data/lib/tap/tasks/load.rb +62 -0
  39. metadata +30 -73
  40. data/cmd/destroy.rb +0 -27
  41. data/cmd/generate.rb +0 -27
  42. data/doc/Command Reference +0 -105
  43. data/doc/Syntax Reference +0 -234
  44. data/doc/Tutorial +0 -348
  45. data/lib/tap/dump.rb +0 -142
  46. data/lib/tap/file_task.rb +0 -384
  47. data/lib/tap/generator/arguments.rb +0 -13
  48. data/lib/tap/generator/base.rb +0 -176
  49. data/lib/tap/generator/destroy.rb +0 -60
  50. data/lib/tap/generator/generate.rb +0 -93
  51. data/lib/tap/generator/generators/command/command_generator.rb +0 -21
  52. data/lib/tap/generator/generators/command/templates/command.erb +0 -32
  53. data/lib/tap/generator/generators/config/config_generator.rb +0 -98
  54. data/lib/tap/generator/generators/generator/generator_generator.rb +0 -37
  55. data/lib/tap/generator/generators/generator/templates/task.erb +0 -27
  56. data/lib/tap/generator/generators/generator/templates/test.erb +0 -26
  57. data/lib/tap/generator/generators/root/root_generator.rb +0 -84
  58. data/lib/tap/generator/generators/root/templates/MIT-LICENSE +0 -22
  59. data/lib/tap/generator/generators/root/templates/README +0 -14
  60. data/lib/tap/generator/generators/root/templates/Rakefile +0 -84
  61. data/lib/tap/generator/generators/root/templates/Rapfile +0 -11
  62. data/lib/tap/generator/generators/root/templates/gemspec +0 -27
  63. data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +0 -3
  64. data/lib/tap/generator/generators/task/task_generator.rb +0 -25
  65. data/lib/tap/generator/generators/task/templates/task.erb +0 -14
  66. data/lib/tap/generator/generators/task/templates/test.erb +0 -19
  67. data/lib/tap/generator/manifest.rb +0 -20
  68. data/lib/tap/generator/preview.rb +0 -69
  69. data/lib/tap/load.rb +0 -64
  70. data/lib/tap/spec.rb +0 -41
  71. data/lib/tap/support/aggregator.rb +0 -65
  72. data/lib/tap/support/audit.rb +0 -333
  73. data/lib/tap/support/constant.rb +0 -143
  74. data/lib/tap/support/constant_manifest.rb +0 -126
  75. data/lib/tap/support/dependencies.rb +0 -54
  76. data/lib/tap/support/dependency.rb +0 -44
  77. data/lib/tap/support/executable.rb +0 -198
  78. data/lib/tap/support/executable_queue.rb +0 -125
  79. data/lib/tap/support/gems.rb +0 -43
  80. data/lib/tap/support/join.rb +0 -144
  81. data/lib/tap/support/joins.rb +0 -12
  82. data/lib/tap/support/joins/switch.rb +0 -27
  83. data/lib/tap/support/joins/sync_merge.rb +0 -38
  84. data/lib/tap/support/manifest.rb +0 -171
  85. data/lib/tap/support/minimap.rb +0 -90
  86. data/lib/tap/support/node.rb +0 -176
  87. data/lib/tap/support/parser.rb +0 -450
  88. data/lib/tap/support/schema.rb +0 -385
  89. data/lib/tap/support/shell_utils.rb +0 -67
  90. data/lib/tap/test.rb +0 -77
  91. data/lib/tap/test/assertions.rb +0 -38
  92. data/lib/tap/test/env_vars.rb +0 -29
  93. data/lib/tap/test/extensions.rb +0 -73
  94. data/lib/tap/test/file_test.rb +0 -362
  95. data/lib/tap/test/file_test_class.rb +0 -15
  96. data/lib/tap/test/regexp_escape.rb +0 -87
  97. data/lib/tap/test/script_test.rb +0 -46
  98. data/lib/tap/test/script_tester.rb +0 -115
  99. data/lib/tap/test/subset_test.rb +0 -260
  100. data/lib/tap/test/subset_test_class.rb +0 -99
  101. data/lib/tap/test/tap_test.rb +0 -109
  102. data/lib/tap/test/utils.rb +0 -231
@@ -1,99 +0,0 @@
1
- require 'tap/test/env_vars'
2
-
3
- module Tap
4
- module Test
5
-
6
- # Class methods extending tests which include SubsetTest.
7
- module SubsetTestClass
8
- include Tap::Test::EnvVars
9
-
10
- # Passes conditions to subclass
11
- def inherited(child) # :nodoc:
12
- super
13
- dup = {}
14
- conditions.each_pair {|key, value| dup[key] = value.dup }
15
- child.instance_variable_set(:@conditions, dup)
16
- end
17
-
18
- # Initialize conditions.
19
- def self.extended(base) # :nodoc:
20
- base.instance_variable_set(:@conditions, {})
21
- end
22
-
23
- # A hash of [name, [msg, condition_block]] pairs defined by condition.
24
- attr_reader :conditions
25
-
26
- # Defines a condition block and associated message.
27
- # Raises an error if no condition block is given.
28
- def condition(name, msg=nil, &block)
29
- raise ArgumentError, "no condition block given" unless block_given?
30
- conditions[name] = [msg, block]
31
- end
32
-
33
- # Returns true if the all blocks for the specified conditions return true.
34
- #
35
- # condition(:is_true) { true }
36
- # condition(:is_false) { false }
37
- # satisfied?(:is_true) # => true
38
- # satisfied?(:is_true, :is_false) # => false
39
- #
40
- # Yields the name and message for each unsatisfied condition to the
41
- # block, if given.
42
- def satisfied?(*names) # :yields: name-of-unsatisfied-condition, msg
43
- unsatisfied = unsatisfied_conditions(*names)
44
-
45
- unsatisfied.each do |name|
46
- yield(name, condition[name][0])
47
- end if block_given?
48
-
49
- unsatisfied.empty?
50
- end
51
-
52
- # Returns an array of the unsatified conditions. Raises
53
- # an error if a condition has not been defined.
54
- #
55
- # condition(:is_true) { true }
56
- # condition(:is_false) { false }
57
- # unsatisfied_conditions(:is_true, :is_false) # => [:is_false]
58
- #
59
- def unsatisfied_conditions(*condition_names)
60
- condition_names = conditions.keys if condition_names.empty?
61
- unsatified = []
62
- condition_names.each do |name|
63
- unless condition = conditions[name]
64
- raise ArgumentError, "Unknown condition: #{name}"
65
- end
66
-
67
- unsatified << name unless condition.last.call
68
- end
69
- unsatified
70
- end
71
-
72
- # Returns true if RUBY_PLATFORM matches one of the specfied
73
- # platforms. Use the prefix 'non_' to specify any plaform
74
- # except the specified platform (ex: 'non_mswin'). Returns
75
- # true if no platforms are specified.
76
- #
77
- # Some common platforms:
78
- # mswin Windows
79
- # darwin Mac
80
- def match_platform?(*platforms)
81
- platforms.each do |platform|
82
- platform.to_s =~ /^(non_)?(.*)/
83
-
84
- non = true if $1
85
- match_platform = !RUBY_PLATFORM.index($2).nil?
86
- return false unless (non && !match_platform) || (!non && match_platform)
87
- end
88
-
89
- true
90
- end
91
-
92
- # Returns true if the subset type or 'ALL' is specified in ENV
93
- def run_subset?(type)
94
- env_true?(type) || env_true?("ALL") ? true : false
95
- end
96
- end
97
-
98
- end
99
- end
@@ -1,109 +0,0 @@
1
- require 'tap'
2
-
3
- module Tap
4
- module Test
5
-
6
- # Tap-specific testing methods to help with testing Tasks, such as the
7
- # checking of audits and test-specific modification of application
8
- # configuration.
9
- #
10
- # === Class Methods
11
- #
12
- # See {Test::Unit::TestCase}[link:classes/Test/Unit/TestCase.html] for documentation of the class methods added by TapTest.
13
- module TapTest
14
-
15
- # Returns the test-method-specific application.
16
- attr_reader :app
17
-
18
- # Setup creates a test-method-specific application that is initialized
19
- # to the method_root, and uses the relative and absolute paths from
20
- # trs (the test root structure, see Tap::Test::FileTest).
21
- #
22
- # Also makes sure Tap::App.instance returns the test method app.
23
- def setup
24
- super
25
- @app = Tap::App.new(app_config)
26
- Tap::App.instance = @app
27
- end
28
-
29
- # Asserts that an array of audits are all equal, basically feeding
30
- # each pair of audits to assert_audit_equal.
31
- def assert_audits_equal(expected, audits, msg=nil, &block)
32
- assert_equal expected.length, audits.length, "expected <#{expected.length}> audits, but was <#{audits.length}>"
33
- Utils.each_pair_with_index(expected, audits) do |exp, audit, index|
34
- assert_audit_equal(exp, audit, &block)
35
- end
36
- end
37
-
38
- # Asserts that an audit trail matches the expected trail. By default
39
- # the expected trail should be composed of [key, value] arrays
40
- # representing each audit, but a block may be provided to collect other
41
- # attributes.
42
- #
43
- # Simple assertion:
44
- #
45
- # a = Audit.new(:a, 'a')
46
- # b = Audit.new(:b, 'b', a)
47
- #
48
- # e = [[:a, 'a'], [:b, 'b']]
49
- # assert_audit_equal(e, b)
50
- #
51
- # Assertion with merge:
52
- #
53
- # a = Audit.new(:a, 'a')
54
- # b = Audit.new(:b, 'b', a)
55
- #
56
- # c = Audit.new(:c, 'c')
57
- # d = Audit.new(:d, 'd', c)
58
- #
59
- # e = Audit.new(:e, 'e')
60
- # f = Audit.new(:f, 'f', [b,d])
61
- #
62
- # eb = [[:a, "a"], [:b, "b"]]
63
- # ed = [[:c, "c"], [:d, "d"]]
64
- # e = [[eb, ed], [:e, "e"], [:f, "f"]]
65
- #
66
- # assert_audit_equal(e, c)
67
- #
68
- def assert_audit_equal(expected, audit, msg=nil, &block)
69
- block = lambda {|a| [a.key, a.value] } unless block
70
- actual = audit.trail(&block)
71
- assert_equal(expected, actual, msg)
72
- end
73
-
74
- # The configurations used to initialize self.app
75
- def app_config
76
- {:quiet => true, :debug => true}
77
- end
78
-
79
- # Reconfigures app with the input configurations for the
80
- # duration of the block.
81
- #
82
- # app = Tap::App.new(:quiet => true, :debug => false)
83
- # with_config({:quiet => false}, app) do
84
- # app.quiet # => false
85
- # app.debug # => false
86
- # end
87
- #
88
- # app.quiet # => true
89
- # app.debug # => false
90
- #
91
- def with_config(config={}, app=self.app, &block)
92
- begin
93
- hold = app.config.to_hash
94
-
95
- app.reconfigure(config)
96
-
97
- yield block if block_given?
98
- ensure
99
- app.send(:initialize_config, hold)
100
- end
101
- end
102
-
103
- end
104
- end
105
- end
106
-
107
-
108
-
109
-
@@ -1,231 +0,0 @@
1
- require 'tap/root'
2
- require 'fileutils'
3
- require 'tempfile'
4
-
5
- module Tap
6
- module Support
7
- autoload(:Templater, 'tap/support/templater')
8
- end
9
-
10
- module Test
11
- module Utils
12
- module_function
13
-
14
- # Generates an array of [source, reference] pairs mapping source
15
- # files to reference files under the source and reference dirs,
16
- # respectively. Only files under source dir matching the pattern
17
- # will be mapped. Mappings are either (in this order):
18
- #
19
- # - the path under reference_dir contained in the source file
20
- # - a direct translation of the source file from the source to
21
- # the reference dir, minus the extname
22
- #
23
- # Notes:
24
- # - Source files may contain comments but should otherwise
25
- # consist only of indentation (which is stripped) and
26
- # the reference path.
27
- # - If a mapped path cannot be found, dereference raises
28
- # a DereferenceError.
29
- #
30
- # === example
31
- #
32
- # root
33
- # |- input
34
- # | |- dir.ref
35
- # | |- ignored.txt
36
- # | |- one.txt.ref
37
- # | `- two.txt.ref
38
- # `- ref
39
- # |- dir
40
- # |- one.txt
41
- # `- path
42
- # `- to
43
- # `- two.txt
44
- #
45
- # The 'two.txt.ref' file contains a reference path:
46
- #
47
- # File.read('/root/input/two.txt.ref') # => 'path/to/two.txt'
48
- #
49
- # Now:
50
- #
51
- # reference_map('/root/input', '/root/ref')
52
- # # => [
53
- # # ['/root/input/dir.ref', '/root/ref/dir'],
54
- # # ['/root/input/one.txt.ref', '/root/ref/one.txt'],
55
- # # ['/root/input/two.txt.ref', '/root/ref/path/to/two.txt']]
56
- #
57
- # And since no path matches 'ignored.txt':
58
- #
59
- # reference_map('/root/input', '/root/ref', '**/*.txt')
60
- # # !> DereferenceError
61
- #
62
- def reference_map(source_dir, reference_dir, pattern='**/*.ref')
63
- Dir.glob(File.join(source_dir, pattern)).sort.collect do |source|
64
- # use the path specified in the source file
65
- relative_path = File.read(source).gsub(/#.*$/, "").strip
66
-
67
- # use the relative filepath of the source file to the
68
- # source dir (minus the extname) if no path is specified
69
- if relative_path.empty?
70
- relative_path = Tap::Root.relative_filepath(source_dir, source).chomp(File.extname(source))
71
- end
72
-
73
- reference = File.join(reference_dir, relative_path)
74
-
75
- # raise an error if no reference file is found
76
- unless File.exists?(reference)
77
- raise DereferenceError, "no reference found for: #{source}"
78
- end
79
-
80
- [source, reference]
81
- end
82
- end
83
-
84
- # Dereferences source files with reference files for the duration
85
- # of the block. The mappings of source to reference files are
86
- # determined using reference_map; dereferenced files are at the
87
- # same location as the source files, but with the '.ref' extname
88
- # removed.
89
- #
90
- # Notes:
91
- # - The reference extname is implicitly specified in pattern;
92
- # the final extname of the source file is removed during
93
- # dereferencing regardless of what it is.
94
- #
95
- def dereference(source_dirs, reference_dir, pattern='**/*.ref', tempdir=Dir::tmpdir)
96
- mapped_paths = []
97
- begin
98
- [*source_dirs].each do |source_dir|
99
- reference_map(source_dir, reference_dir, pattern).each do |source, reference|
100
-
101
- # move the source file to a temporary location
102
- tempfile = Tempfile.new(File.basename(source), tempdir)
103
- tempfile.close
104
- FileUtils.mv(source, tempfile.path)
105
-
106
- # copy the reference to the target
107
- target = source.chomp(File.extname(source))
108
- FileUtils.cp_r(reference, target)
109
-
110
- mapped_paths << [target, source, tempfile]
111
- end
112
- end unless reference_dir == nil
113
-
114
- yield
115
-
116
- ensure
117
- mapped_paths.each do |target, source, tempfile|
118
- # remove the target and restore the original source file
119
- FileUtils.rm_r(target) if File.exists?(target)
120
- FileUtils.mv(tempfile.path, source)
121
- end
122
- end
123
- end
124
-
125
- # Uses a Tap::Support::Templater to template and replace the contents of path,
126
- # for the duration of the block. The attributes will be available in the
127
- # template context.
128
- def template(paths, attributes={}, tempdir=Dir::tmpdir)
129
- mapped_paths = []
130
- begin
131
- [*paths].each do |path|
132
- # move the source file to a temporary location
133
- tempfile = Tempfile.new(File.basename(path), tempdir)
134
- tempfile.close
135
- FileUtils.cp(path, tempfile.path)
136
-
137
- # template the source file
138
- content = File.read(path)
139
- File.open(path, "wb") do |file|
140
- file << Support::Templater.new(content, attributes).build
141
- end
142
-
143
- mapped_paths << [path, tempfile]
144
- end
145
-
146
- yield
147
-
148
- ensure
149
- mapped_paths.each do |path, tempfile|
150
- # restore the original source file
151
- FileUtils.rm(path) if File.exists?(path)
152
- FileUtils.mv(tempfile.path, path)
153
- end
154
- end
155
- end
156
-
157
- # Yields to the input block for each pair of entries in the input
158
- # arrays. An error is raised if the input arrays do not have equal
159
- # numbers of entries.
160
- def each_pair(a, b, &block) # :yields: entry_a, entry_b,
161
- each_pair_with_index(a,b) do |entry_a, entry_b, index|
162
- yield(entry_a, entry_b)
163
- end
164
- end
165
-
166
- # Same as each_pair but yields the index of the entries as well.
167
- def each_pair_with_index(a, b, error_msg=nil, &block) # :yields: entry_a, entry_b, index
168
- a = [a] unless a.kind_of?(Array)
169
- b = [b] unless b.kind_of?(Array)
170
-
171
- unless a.length == b.length
172
- raise ArgumentError, (error_msg || "The input arrays must have an equal number of entries.")
173
- end
174
-
175
- 0.upto(a.length-1) do |index|
176
- yield(a[index], b[index], index)
177
- end
178
- end
179
-
180
- # Attempts to recursively remove the specified method directory and all
181
- # files within it. Raises an error if the removal does not succeed.
182
- def clear_dir(dir)
183
- # clear out the folder if it exists
184
- FileUtils.rm_r(dir) if File.exists?(dir)
185
- end
186
-
187
- # Attempts to remove the specified directory. The root
188
- # will not be removed if the directory does not exist, or
189
- # is not empty.
190
- def try_remove_dir(dir)
191
- # Remove the directory if possible
192
- begin
193
- FileUtils.rmdir(dir) if File.exists?(dir) && Dir.glob(File.join(dir, "*")).empty?
194
- rescue
195
- # rescue cases where there is a hidden file, for example .svn
196
- end
197
- end
198
-
199
- # Sets ARGV to the input argv for the duration of the block.
200
- def with_argv(argv=[])
201
- current_argv = ARGV.dup
202
- begin
203
- ARGV.clear
204
- ARGV.concat(argv)
205
-
206
- yield
207
-
208
- ensure
209
- ARGV.clear
210
- ARGV.concat(current_argv)
211
- end
212
- end
213
-
214
- def whitespace_escape(str)
215
- str.to_s.gsub(/\s/) do |match|
216
- case match
217
- when "\n" then "\\n\n"
218
- when "\t" then "\\t"
219
- when "\r" then "\\r"
220
- when "\f" then "\\f"
221
- else match
222
- end
223
- end
224
- end
225
-
226
- # Raised when no reference can be found for a reference path.
227
- class DereferenceError < StandardError
228
- end
229
- end
230
- end
231
- end