tap 0.12.4 → 0.17.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 (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,60 +0,0 @@
1
- module Tap
2
- module Generator
3
-
4
- # A mixin defining how to run manifest actions in reverse.
5
- module Destroy
6
-
7
- # Iterates over the actions in reverse, and collects the results.
8
- def iterate(actions)
9
- results = []
10
- actions.reverse_each {|action| results << yield(action) }
11
- results
12
- end
13
-
14
- # Removes the target directory if it exists. Missing, non-directory and
15
- # non-empty targets are simply logged and not removed. When pretend is
16
- # true, removal is logged but does not actually happen.
17
- #
18
- # No options currently affect the behavior of this method.
19
- def directory(target, options={})
20
- target = File.expand_path(target)
21
-
22
- case
23
- when !File.exists?(target)
24
- log_relative :missing, target
25
- when !File.directory?(target)
26
- log_relative 'not a directory', target
27
- when !Root.empty?(target)
28
- log_relative 'not empty', target
29
- else
30
- log_relative :rm, target
31
- FileUtils.rmdir(target) unless pretend
32
- end
33
-
34
- target
35
- end
36
-
37
- # Removes the target file if it exists. Missing and non-file and targets
38
- # are simply logged and not removed. When pretend is true, removal is
39
- # logged but does not actually happen.
40
- #
41
- # No options currently affect the behavior of this method.
42
- def file(target, options={})
43
- target = File.expand_path(target)
44
-
45
- case
46
- when File.file?(target)
47
- log_relative :rm, target
48
- FileUtils.rm(target) unless pretend
49
- when File.directory?(target)
50
- log_relative 'not a file', target
51
- else
52
- log_relative :missing, target
53
- end
54
-
55
- target
56
- end
57
-
58
- end
59
- end
60
- end
@@ -1,93 +0,0 @@
1
- autoload(:Tempfile, 'tempfile')
2
-
3
- module Tap
4
- module Generator
5
-
6
- # A mixin defining how to run manifest actions.
7
- module Generate
8
-
9
- # Creates the target directory if it doesn't exist. When pretend is
10
- # true, creation is logged but does not actually happen.
11
- #
12
- # No options currently affect the behavior of this method.
13
- def directory(target, options={})
14
- target = File.expand_path(target)
15
-
16
- case
17
- when File.exists?(target)
18
- log_relative :exists, target
19
- else
20
- log_relative :create, target
21
- FileUtils.mkdir_p(target) unless pretend
22
- end
23
-
24
- target
25
- end
26
-
27
- # Creates the target file; content may be added to the file by providing
28
- # block. If the target file already exists, the new and existing content
29
- # is compared and the user will be prompted for how to handle collisions.
30
- # All activity is logged. When pretend is true, creation is logged but
31
- # does not actually happen.
32
- #
33
- # No options currently affect the behavior of this method.
34
- def file(target, options={})
35
- source_file = Tempfile.new('generate')
36
- yield(source_file) if block_given?
37
- source_file.close
38
-
39
- source = source_file.path
40
- target = File.expand_path(target)
41
-
42
- copy_file = true
43
- msg = case
44
- when !File.exists?(target)
45
- :create
46
- when FileUtils.cmp(source, target)
47
- :exists
48
- when force_file_collision?(target)
49
- :force
50
- else
51
- copy_file = false
52
- :skip
53
- end
54
-
55
- log_relative msg, target
56
- if copy_file && !pretend
57
- dir = File.dirname(target)
58
- FileUtils.mkdir_p(dir) unless File.exists?(dir)
59
- FileUtils.mv(source, target, :force => true)
60
- end
61
-
62
- target
63
- end
64
-
65
- protected
66
-
67
- # Ask the user interactively whether to force collision.
68
- def force_file_collision?(target)
69
- return false if skip
70
- return true if force
71
-
72
- prompt_out.print "overwrite #{target}? [Ynaiq] "
73
- prompt_out.flush
74
- case prompt_in.gets.strip
75
- when /^y(es)?$/i
76
- true
77
- when /^n(o)?$/i
78
- false
79
- when /^a(ll)?$/i
80
- self.force = true
81
- true
82
- when /^i(gnore)?$/i
83
- self.skip = true
84
- false
85
- when /^q(uit)?$/i
86
- prompt_out.puts "aborting"
87
- raise SystemExit
88
- else force_file_collision?(target)
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,21 +0,0 @@
1
- module Tap::Generator::Generators
2
-
3
- # :startdoc: Tap::Generator::Generators::CommandGenerator::generator a new tap command
4
- #
5
- # Generates a new tap command under the cmd directory. The
6
- # new command can be run from the command line using:
7
- #
8
- # % tap <command>
9
- #
10
- class CommandGenerator < Tap::Generator::Base
11
-
12
- def manifest(m, command_name)
13
- m.directory path('cmd')
14
-
15
- template_files do |source, target|
16
- m.template path('cmd', "#{command_name}.rb"), source, :command_name => command_name
17
- end
18
- end
19
-
20
- end
21
- end
@@ -1,32 +0,0 @@
1
- # tap <%= command_name %> {options} ARGS...
2
- #
3
- # The default command simply prints the input arguments
4
- # and application information, then exits.
5
- #
6
-
7
- env = Tap::Env.instance
8
- app = Tap::App.instance
9
-
10
- #
11
- # handle options
12
- #
13
-
14
- ConfigParser.new do |opts|
15
- opts.separator ""
16
- opts.separator "options:"
17
-
18
- opts.on("-h", "--help", "Show this message") do
19
- puts Lazydoc.usage(__FILE__)
20
- puts opts
21
- exit
22
- end
23
-
24
- end.parse!(ARGV)
25
-
26
-
27
- #
28
- # add your script code here
29
- #
30
-
31
- puts "Received: #{ARGV.join(', ')}"
32
- puts app.info
@@ -1,98 +0,0 @@
1
- module Tap::Generator::Generators
2
-
3
- # :startdoc: Tap::Generator::Generators::ConfigGenerator::generator a config file for a task
4
- #
5
- # Generates a new config file for a task. The configurations, defaults,
6
- # and documentation is determined from the task source file.
7
- class ConfigGenerator < Tap::Generator::Base
8
-
9
- # Dumps a nested configuration.
10
- DUMP_DELEGATES = lambda do |leader, delegate, block|
11
- nested_delegates = delegate.default(false).delegates
12
- indented_dump = Configurable::Utils.dump(nested_delegates, &block).gsub(/^/, " ")
13
- "#{leader}: \n#{indented_dump}"
14
- end
15
-
16
- # Dumps configurations as YAML with documentation,
17
- # used when the doc config is true.
18
- DOC_FORMAT = lambda do |key, delegate|
19
- # get the description
20
- desc = delegate.attributes[:desc]
21
- doc = desc.to_s
22
- doc = desc.comment if doc.empty?
23
-
24
- # wrap as lines
25
- lines = Lazydoc::Utils.wrap(doc, 50).collect {|line| "# #{line}"}
26
- lines << "" unless lines.empty?
27
-
28
- if delegate.is_nest?
29
- leader = "#{lines.join("\n")}#{key}"
30
- DUMP_DELEGATES[leader, delegate, DOC_FORMAT]
31
- else
32
- default = delegate.default
33
-
34
- # setup formatting
35
- leader = default == nil ? '# ' : ''
36
- config = YAML.dump({key => default})[5..-1]
37
- "#{lines.join("\n")}#{leader}#{config.strip}\n\n"
38
- end
39
- end
40
-
41
- # Dumps configurations as YAML without documentation,
42
- # used when the doc config is false.
43
- NODOC_FORMAT = lambda do |key, delegate|
44
- if delegate.is_nest?
45
- DUMP_DELEGATES[key, delegate, NODOC_FORMAT]
46
- else
47
- default = delegate.default
48
-
49
- # setup formatting
50
- leader = default == nil ? '# ' : ''
51
- config = YAML.dump({key => default})[5..-1]
52
- "#{leader}#{config.strip}\n"
53
- end
54
- end
55
-
56
- config :doc, true, &c.switch # include documentation in the config
57
- config :nest, false, &c.switch # generate nested config files
58
- config :blanks, true, &c.switch # allow generation of empty config files
59
-
60
- # Lookup the named task class. Lookup happens through the active Env
61
- # instance, specifically using:
62
- #
63
- # Env.instance.tasks.search(name)
64
- #
65
- # Raises an error if the name cannot be resolved to a task.
66
- def lookup(name)
67
- const = Tap::Env.instance.tasks.search(name) or raise "unknown task: #{name}"
68
- const.constantize
69
- end
70
-
71
- def manifest(m, name, config_name=nil)
72
- # setup
73
- tasc = lookup(name)
74
- config_name ||= tasc.default_name
75
- config_file = path('config', config_name)
76
- config_file += ".yml" if File.extname(config_file).empty?
77
-
78
- # generate the dumps
79
- dumps = Configurable::Utils.dump_file(tasc.configurations, config_file, nest, true, &format_block)
80
-
81
- # now put the dumps to the manifest
82
- m.directory(path('config'))
83
-
84
- dumps.each do |path, content|
85
- next if content.empty? && !blanks
86
- m.file(path) do |file|
87
- file << content
88
- end
89
- end
90
- end
91
-
92
- # A hook to set a formatting block. By default format_blocks
93
- # returns DOC_FORMAT or NODOC_FORMAT as per the doc config.
94
- def format_block
95
- doc ? DOC_FORMAT : NODOC_FORMAT
96
- end
97
- end
98
- end
@@ -1,37 +0,0 @@
1
- module Tap::Generator::Generators
2
-
3
- # :startdoc: Tap::Generator::Generators::GeneratorGenerator::generator a generator task and test
4
- #
5
- # Generates a new generator.
6
- class GeneratorGenerator < Tap::Generator::Base
7
-
8
- config :test, true, &c.switch # specifies creation of a test file
9
-
10
- def manifest(m, const_name)
11
- const = Tap::Support::Constant.new(const_name.camelize)
12
- dir = path('lib', const.path)
13
-
14
- # make the directory
15
- m.directory dir
16
-
17
- # make the generator
18
- m.template path(dir, "#{const.basename}_generator.rb"), "task.erb", :const => const
19
-
20
- # make the templates directory
21
- m.directory path(dir, 'templates')
22
-
23
- # make a template file
24
- # (note it's easier to do this as a file since erb is
25
- # added, and would have to be escaped in a template)
26
- m.file path(dir, 'templates', 'template_file.erb') do |file|
27
- file << "# A sample template file.\nkey: <%= key %>\n"
28
- end
29
-
30
- if test
31
- test_path = path('test', "#{const.path}_generator_test.rb")
32
- m.directory File.dirname(test_path)
33
- m.template test_path, "test.erb", :const => const
34
- end
35
- end
36
- end
37
- end
@@ -1,27 +0,0 @@
1
- <% redirect do |target| %># <%= const.name %>::generator <replace with manifest summary>
2
- # <replace with command line description>
3
-
4
- # <%= const.const_name %> Documentation
5
- class <%= const.const_name %>Generator < Tap::Generator::Base
6
-
7
- config :key, 'value' # a sample config
8
-
9
- # The generator will receive the inputs on the command line, and
10
- # m, a Manifest object that records the actions of this method.
11
- def manifest(m, *inputs)
12
-
13
- # make a directory
14
- # m.directory path
15
-
16
- # make a file
17
- # m.file path do |file|
18
- # file << contents
19
- # end
20
-
21
- # template a file in the templates directory using ERB.
22
- # The (key, value) pairs will be available in the
23
- # template as local variables.
24
- m.template "<%= const.const_name.underscore %>_file.txt", "template_file.erb", config.to_hash
25
-
26
- end
27
- end <% module_nest(const.nesting, ' ') { target } end %>
@@ -1,26 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '<%= '../' * const.nesting_depth %>tap_test_helper.rb')
2
- require '<%= const.path %>'
3
- require 'tap/generator/preview.rb'
4
-
5
- class <%= const.name %>Test < Test::Unit::TestCase
6
-
7
- # Preview fakes out a generator for testing
8
- Preview = Tap::Generator::Preview
9
-
10
- acts_as_tap_test
11
-
12
- def test_<%= const.basename %>
13
- g = <%= const.name %>.new.extend Preview
14
-
15
- # check the files and directories
16
- assert_equal %w{
17
- <%= const.const_name.underscore %>_file.txt
18
- }, g.process
19
-
20
- # check the content as necessary
21
- assert_equal %q{
22
- # A sample template file.
23
- key: value
24
- }, "\n" + g.builds['<%= const.const_name.underscore %>_file.txt']
25
- end
26
- end
@@ -1,84 +0,0 @@
1
- require 'tap/generator/base'
2
-
3
- module Tap::Generator::Generators
4
-
5
- # :startdoc: Tap::Generator::Generators::RootGenerator::generator a basic tap directory structure
6
- #
7
- # Generates a tap root directory structure. Use the switches to turn on or
8
- # off the creation of various files:
9
- #
10
- # project
11
- # |- MIT-LICENSE
12
- # |- README
13
- # |- Rakefile
14
- # |- lib
15
- # |- project.gemspec
16
- # |- tap.yml
17
- # `- test
18
- # `- tap_test_helper.rb
19
- #
20
- class RootGenerator < Tap::Generator::Base
21
-
22
- config :config_file, false, &c.switch # Create a full tap.yml file
23
- config :license, true, &c.switch # Create an MIT-LICENSE
24
- config :history, true, &c.switch # Create History file
25
- config :rapfile, false, &c.switch # Create a Rapfile
26
-
27
- # ::args ROOT, PROJECT_NAME=basename(ROOT)
28
- def manifest(m, root, project_name=nil)
29
- r = Tap::Root.new(root)
30
- project_name = File.basename(r.root) if project_name == nil
31
-
32
- m.directory r.root
33
- m.directory r['lib']
34
- m.directory r['test']
35
-
36
- template_files do |source, target|
37
- case
38
- when File.directory?(source)
39
- m.directory r[target]
40
- next
41
- when source =~ /gemspec$/
42
- m.template r[project_name + '.gemspec'], source, {
43
- :project_name => project_name,
44
- :config_file => config_file,
45
- :license => license,
46
- :history => history
47
- }
48
- next
49
- when source =~ /Rapfile$/
50
- next unless rapfile
51
- when source =~ /MIT-LICENSE$/
52
- next unless license
53
- end
54
-
55
- m.template r[target], source, :project_name => project_name, :license => license
56
- end
57
-
58
- m.file(r['History']) if history
59
- m.file(r['tap.yml']) do |file|
60
- Configurable::Utils.dump(Tap::Env.configurations, file) do |key, delegate|
61
- default = delegate.default(false)
62
-
63
- # get the description
64
- desc = delegate.attributes[:desc]
65
- doc = desc.to_s
66
- doc = desc.comment if doc.empty?
67
-
68
- # wrap as lines
69
- lines = Lazydoc::Utils.wrap(doc, 78).collect {|line| "# #{line}"}
70
- lines << "" unless lines.empty?
71
-
72
- # note: this causes order to be lost...
73
- default = default.to_hash if delegate.is_nest?
74
-
75
- # setup formatting
76
- leader = key == 'root' || default == nil ? '# ' : ''
77
- config = YAML.dump({key => default})[5..-1].strip.gsub(/\n+/, "\n#{leader}")
78
- "#{lines.join("\n")}#{leader}#{config}\n\n"
79
- end if config_file
80
- end
81
- end
82
-
83
- end
84
- end