tap 0.10.1 → 0.11.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 (124) hide show
  1. data/History +12 -0
  2. data/MIT-LICENSE +0 -2
  3. data/README +23 -32
  4. data/bin/rap +116 -0
  5. data/bin/tap +6 -9
  6. data/cgi/run.rb +67 -0
  7. data/cmd/console.rb +1 -1
  8. data/cmd/destroy.rb +4 -4
  9. data/cmd/generate.rb +4 -4
  10. data/cmd/manifest.rb +61 -53
  11. data/cmd/run.rb +8 -75
  12. data/doc/Class Reference +130 -121
  13. data/doc/Command Reference +76 -124
  14. data/doc/Syntax Reference +290 -0
  15. data/doc/Tutorial +305 -237
  16. data/lib/tap/app.rb +140 -467
  17. data/lib/tap/constants.rb +2 -2
  18. data/lib/tap/declarations.rb +211 -0
  19. data/lib/tap/env.rb +171 -193
  20. data/lib/tap/exe.rb +100 -21
  21. data/lib/tap/file_task.rb +3 -3
  22. data/lib/tap/generator/base.rb +1 -1
  23. data/lib/tap/generator/destroy.rb +10 -10
  24. data/lib/tap/generator/generate.rb +29 -18
  25. data/lib/tap/generator/generators/command/command_generator.rb +2 -2
  26. data/lib/tap/generator/generators/command/templates/command.erb +2 -2
  27. data/lib/tap/generator/generators/config/config_generator.rb +3 -3
  28. data/lib/tap/generator/generators/config/templates/doc.erb +1 -1
  29. data/lib/tap/generator/generators/file_task/file_task_generator.rb +1 -1
  30. data/lib/tap/generator/generators/file_task/templates/task.erb +1 -1
  31. data/lib/tap/generator/generators/file_task/templates/test.erb +1 -1
  32. data/lib/tap/generator/generators/generator/generator_generator.rb +27 -0
  33. data/lib/tap/generator/generators/generator/templates/task.erb +27 -0
  34. data/lib/tap/generator/generators/root/root_generator.rb +13 -13
  35. data/lib/tap/generator/generators/root/templates/README +0 -0
  36. data/lib/tap/generator/generators/root/templates/Rakefile +2 -2
  37. data/lib/tap/generator/generators/root/templates/gemspec +4 -5
  38. data/lib/tap/generator/generators/root/templates/tapfile +11 -8
  39. data/lib/tap/generator/generators/root/templates/test/tap_test_suite.rb +1 -1
  40. data/lib/tap/generator/generators/task/task_generator.rb +1 -3
  41. data/lib/tap/generator/generators/task/templates/test.erb +1 -3
  42. data/lib/tap/patches/optparse/summarize.rb +62 -0
  43. data/lib/tap/root.rb +41 -29
  44. data/lib/tap/support/aggregator.rb +16 -3
  45. data/lib/tap/support/assignments.rb +10 -9
  46. data/lib/tap/support/audit.rb +58 -64
  47. data/lib/tap/support/class_configuration.rb +33 -44
  48. data/lib/tap/support/combinator.rb +125 -0
  49. data/lib/tap/support/configurable.rb +13 -14
  50. data/lib/tap/support/configurable_class.rb +21 -43
  51. data/lib/tap/support/configuration.rb +55 -9
  52. data/lib/tap/support/constant.rb +87 -13
  53. data/lib/tap/support/constant_manifest.rb +116 -0
  54. data/lib/tap/support/dependencies.rb +54 -0
  55. data/lib/tap/support/dependency.rb +44 -0
  56. data/lib/tap/support/executable.rb +247 -32
  57. data/lib/tap/support/executable_queue.rb +1 -1
  58. data/lib/tap/support/gems/rake.rb +29 -8
  59. data/lib/tap/support/gems.rb +10 -30
  60. data/lib/tap/support/instance_configuration.rb +29 -3
  61. data/lib/tap/support/intern.rb +46 -0
  62. data/lib/tap/support/join.rb +143 -0
  63. data/lib/tap/support/joins/fork.rb +19 -0
  64. data/lib/tap/support/joins/merge.rb +22 -0
  65. data/lib/tap/support/joins/sequence.rb +21 -0
  66. data/lib/tap/support/joins/switch.rb +25 -0
  67. data/lib/tap/support/joins/sync_merge.rb +63 -0
  68. data/lib/tap/support/joins.rb +15 -0
  69. data/lib/tap/support/lazy_attributes.rb +17 -2
  70. data/lib/tap/support/lazydoc/comment.rb +503 -0
  71. data/lib/tap/support/lazydoc/config.rb +17 -0
  72. data/lib/tap/support/lazydoc/definition.rb +36 -0
  73. data/lib/tap/support/lazydoc/document.rb +152 -0
  74. data/lib/tap/support/lazydoc/method.rb +24 -0
  75. data/lib/tap/support/lazydoc.rb +269 -343
  76. data/lib/tap/support/manifest.rb +121 -103
  77. data/lib/tap/support/minimap.rb +90 -0
  78. data/lib/tap/support/node.rb +56 -0
  79. data/lib/tap/support/parser.rb +436 -0
  80. data/lib/tap/support/schema.rb +359 -0
  81. data/lib/tap/support/shell_utils.rb +3 -5
  82. data/lib/tap/support/string_ext.rb +60 -0
  83. data/lib/tap/support/tdoc.rb +7 -2
  84. data/lib/tap/support/templater.rb +30 -16
  85. data/lib/tap/support/validation.rb +77 -8
  86. data/lib/tap/task.rb +431 -143
  87. data/lib/tap/tasks/dump.rb +15 -10
  88. data/lib/tap/tasks/load.rb +112 -0
  89. data/lib/tap/tasks/rake.rb +4 -41
  90. data/lib/tap/test/assertions.rb +38 -0
  91. data/lib/tap/test/env_vars.rb +1 -1
  92. data/lib/tap/test/extensions.rb +79 -0
  93. data/lib/tap/test/file_test.rb +420 -0
  94. data/lib/tap/test/file_test_class.rb +12 -0
  95. data/lib/tap/test/regexp_escape.rb +87 -0
  96. data/lib/tap/test/script_test.rb +46 -0
  97. data/lib/tap/test/script_tester.rb +115 -0
  98. data/lib/tap/test/subset_test.rb +260 -0
  99. data/lib/tap/test/subset_test_class.rb +99 -0
  100. data/lib/tap/test/{tap_methods.rb → tap_test.rb} +45 -43
  101. data/lib/tap/test/utils.rb +231 -0
  102. data/lib/tap/test.rb +53 -26
  103. data/lib/tap.rb +3 -20
  104. metadata +50 -27
  105. data/lib/tap/generator/generators/root/templates/test/tapfile_test.rb +0 -15
  106. data/lib/tap/patches/rake/rake_test_loader.rb +0 -8
  107. data/lib/tap/patches/rake/testtask.rb +0 -57
  108. data/lib/tap/patches/ruby19/backtrace_filter.rb +0 -51
  109. data/lib/tap/patches/ruby19/parsedate.rb +0 -16
  110. data/lib/tap/support/batchable.rb +0 -47
  111. data/lib/tap/support/batchable_class.rb +0 -107
  112. data/lib/tap/support/command_line.rb +0 -98
  113. data/lib/tap/support/comment.rb +0 -270
  114. data/lib/tap/support/constant_utils.rb +0 -127
  115. data/lib/tap/support/declarations.rb +0 -111
  116. data/lib/tap/support/framework.rb +0 -83
  117. data/lib/tap/support/framework_class.rb +0 -180
  118. data/lib/tap/support/run_error.rb +0 -39
  119. data/lib/tap/support/summary.rb +0 -30
  120. data/lib/tap/test/file_methods.rb +0 -377
  121. data/lib/tap/test/script_methods/script_test.rb +0 -98
  122. data/lib/tap/test/script_methods.rb +0 -107
  123. data/lib/tap/test/subset_methods.rb +0 -420
  124. data/lib/tap/workflow.rb +0 -200
data/History CHANGED
@@ -1,3 +1,15 @@
1
+ == 0.11.0 / 2008-10-20
2
+
3
+ Significant update to Tap with many internal reworks.
4
+ Major changes include:
5
+
6
+ * Addition of Parser/Schema
7
+ * Addition of rap and task declarations
8
+ * Removal of Workflow in preference of workflow
9
+ definitions within Task
10
+ * Refactoring of Test modules
11
+ * Expanded/updated documentation
12
+
1
13
  == 0.10.1 / 2008-08-21
2
14
 
3
15
  Update of Tap with a few improvements to manifests
data/MIT-LICENSE CHANGED
@@ -1,6 +1,4 @@
1
1
  Copyright (c) 2006-2008, Regents of the University of Colorado.
2
- Developer:: Simon Chiang, Biomolecular Structure Program, Hansen Lab
3
- Support:: CU Denver School of Medicine Deans Academic Enrichment Fund
4
2
 
5
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of this
6
4
  software and associated documentation files (the "Software"), to deal in the Software
data/README CHANGED
@@ -5,21 +5,22 @@ A framework for creating configurable, distributable tasks and workflows.
5
5
  == Description
6
6
 
7
7
  Tap tasks are designed to be easy to test, subclass, use in scripts, and run
8
- from the command line. Tap provides methods to generate and utilize config
9
- files, join tasks into workflows, as well as dump and reuse results. Task
10
- libraries are readily shared as gems. Check out the links for tutorials,
11
- development, and bug tracking.
8
+ from the command line. Tap provides methods to join tasks into imperative
9
+ and dependecy-based workflows, utilize static config files, as well as dump
10
+ and reuse results. Task libraries are readily shared as gems.
12
11
 
13
- * {Tutorial}[link:files/doc/Tutorial.html], {Class}[link:files/doc/Class%20Reference.html] and {Command}[link:files/doc/Command%20Reference.html] Reference
12
+ Check out these links for tutorials, development, and bug tracking.
13
+
14
+ * {Tutorial}[link:files/doc/Tutorial.html], {Class}[link:files/doc/Class%20Reference.html], {Command}[link:files/doc/Command%20Reference.html], and {Syntax}[link:files/doc/Syntax%20Reference.html] References
14
15
  * Website[http://tap.rubyforge.org]
15
- * Lighthouse[http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/overview]
16
+ * Lighthouse[http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets]
16
17
  * Github[http://github.com/bahuvrihi/tap/tree/master]
17
- * Google Group[http://groups.google.com/group/ruby-on-tap]
18
+ * {Google Group}[http://groups.google.com/group/ruby-on-tap]
18
19
 
19
- === Additional Notes:
20
+ === Features
20
21
 
21
22
  - Tap and Rake[http://rake.rubyforge.org/] are targeted at different problems,
22
- but play well together. See Tap::Tasks::Rake to use rake tasks in tap.
23
+ but play well together. See the {Tutorial}[link:files/doc/Tutorial.html].
23
24
  - Tap is tested on MRI (the standard Ruby interpreter, versions 1.8.6 and
24
25
  1.9.0) and JRuby[http://jruby.codehaus.org/].
25
26
 
@@ -27,6 +28,8 @@ development, and bug tracking.
27
28
 
28
29
  A simple task illustrates the usage of tap:
29
30
 
31
+ [lib/goodnight.rb]
32
+
30
33
  # Goodnight::manifest your basic goodnight moon task
31
34
  # Says goodnight with a configurable message.
32
35
  class Goodnight < Tap::Task
@@ -46,6 +49,7 @@ Tap pulls documentation out of task classes to generate manifests:
46
49
  goodnight # your basic goodnight moon task
47
50
  tap:
48
51
  dump # the default dump task
52
+ load # the default load task
49
53
  rake # run rake tasks
50
54
 
51
55
  And help:
@@ -66,39 +70,26 @@ And help:
66
70
  --use FILE Loads inputs from file
67
71
 
68
72
 
69
- Tasks are immediately available to run:
73
+ Tasks are immediately available to run through tap or rap:
70
74
 
71
75
  % tap run -- goodnight moon
72
76
  I[00:09:55] goodnight moon
73
77
 
74
-
75
- % tap run -- goodnight moon --message hello
78
+ % rap goodnight moon --message hello
76
79
  I[00:10:01] hello moon
77
-
78
- Tap comes with generators and allows distribution of task libraries as gems.
79
- This can be illustrated by installing the
80
- {sample_tasks}[http://tap.rubyforge.org/sample_tasks] gem:
81
80
 
82
- % gem install sample_tasks
83
- % tap run -T
84
- sample:
85
- goodnight # your basic goodnight moon task
86
- sample_tasks:
87
- concat # concatenate files with formatting
88
- copy # copies files
89
- grep # search for lines matching a pattern
90
- print_tree # print a directory tree
91
- tap:
92
- dump # the default dump task
93
- rake # run rake tasks
81
+ Tap comes with generators. To get started:
82
+
83
+ % tap generate root sample
84
+ % cd sample
85
+ % tap generate task goodnight
86
+ % rap goodnight moon
94
87
 
95
88
  === Bugs/Known Issues
96
89
 
97
90
  - Some inconsequential tests on JRuby fail due to bugs in JRuby itself.
98
- - Several patches are required so that Tap runs properly on MRI 1.9.0. These
99
- will likely resolve themselves as 1.9.0 becomes stable.
100
- - Despite the talk of workflows, the Workflow class should still be considered
101
- in progress. Tasks themselves are stable.
91
+ - Joins, Parser, and Schema require additional documentation and may be
92
+ internally reworked. The workflow syntax should remain the same.
102
93
 
103
94
  == Installation
104
95
 
data/bin/rap ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env ruby
2
+ # usage: rap taskname {options} [args]
3
+
4
+ $:.unshift "#{File.dirname(__FILE__)}/../lib"
5
+ require 'tap/declarations'
6
+
7
+ # setup the environment
8
+ begin
9
+
10
+ # handle super options
11
+ $DEBUG = true if ARGV.delete('-d-')
12
+ env = Tap::Exe.instantiate
13
+ env.unshift(Tap::Declarations.env)
14
+
15
+ task_file = File.expand_path('Tapfile')
16
+ if File.exists?(task_file)
17
+ env.loads.unshift(task_file)
18
+ env.tasks.register(Dir.pwd, 'Tapfile')
19
+ end
20
+
21
+ rescue(Tap::Env::ConfigError)
22
+ # catch errors and exit gracefully
23
+ # (errors usu from gem loading errors)
24
+ puts $!.message
25
+ exit(1)
26
+ end
27
+
28
+ #
29
+ # setup after script
30
+ #
31
+
32
+ at_exit do
33
+ begin
34
+ eval(env.after) if env.after != nil
35
+ rescue(Exception)
36
+ puts "Error in after script."
37
+ env.handle_error($!)
38
+ exit(1)
39
+ end
40
+ end
41
+
42
+ #
43
+ # run before script
44
+ #
45
+
46
+ begin
47
+ eval(env.before) if env.before != nil
48
+ rescue(Exception)
49
+ puts "Error in before script."
50
+ env.handle_error($!)
51
+ exit(1)
52
+ end
53
+
54
+ #
55
+ # run rap
56
+ #
57
+
58
+ module Tap
59
+ module Tasks
60
+ autoload(:Rake, 'tap/tasks/rake')
61
+ end
62
+ end
63
+
64
+ begin
65
+ env.activate
66
+
67
+ case ARGV[0]
68
+ when '--help', nil, '-T'
69
+ rap_template = %Q{<% if count > 1 && !entries.empty? %>
70
+ <%= env_name %>:
71
+ <% end %>
72
+ <% entries.each do |name, const| %>
73
+ <% desc = if const.require_path == nil # should be a declaration %>
74
+ <% manifest = const.constantize.lazydoc[const.name]['manifest'] %>
75
+ <% next if manifest == nil || manifest.subject.empty? %>
76
+ <% manifest.subject %>
77
+ <% else %>
78
+ <% const.document[const.name]['manifest'] %>
79
+ <% end %>
80
+ <%= name.ljust(width) %><%= desc.empty? ? '' : ' # ' %><%= desc %>
81
+ <% end %>}
82
+
83
+ puts Tap::Support::Lazydoc.usage(__FILE__)
84
+ puts
85
+ puts "=== tap tasks ==="
86
+ puts env.summarize(:tasks, rap_template)
87
+ puts
88
+ puts "=== rake tasks ==="
89
+ Tap::Tasks::Rake.new.enq('-T')
90
+ Tap::App.instance.run
91
+
92
+ # this is not currently reached as rake exits on -T
93
+ puts
94
+ puts "version #{Tap::VERSION} -- #{Tap::WEBSITE}"
95
+ exit
96
+ else
97
+ queues = env.build(ARGV) do |args|
98
+ warn "warning: implict rake for [#{args.join(' ')}]"
99
+ Tap::Tasks::Rake
100
+ end
101
+ ARGV.clear
102
+
103
+ if queues.empty?
104
+ puts "no task specified"
105
+ exit
106
+ end
107
+
108
+ env.set_signals
109
+ env.run(queues)
110
+ end
111
+
112
+ rescue
113
+ env.handle_error($!)
114
+ end
115
+
116
+ exit(0)
data/bin/tap CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
  # usage: tap <command> {options} [args]
3
3
  #
4
4
  # examples:
@@ -6,19 +6,19 @@
6
6
  # tap run taskname --option input # runs the 'taskname' task
7
7
  #
8
8
  # help:
9
- # tap help # prints this help
9
+ # tap --help # prints this help
10
10
  # tap command --help # prints help for 'command'
11
11
  #
12
12
 
13
13
  require "#{File.dirname(__FILE__)}/../lib/tap.rb"
14
- require 'tap/exe'
15
14
 
16
15
  # setup the environment
17
16
  begin
18
17
 
18
+ # handle super options
19
19
  $DEBUG = true if ARGV.delete('-d-')
20
20
  env = Tap::Exe.instantiate
21
-
21
+
22
22
  rescue(Tap::Env::ConfigError)
23
23
  # catch errors and exit gracefully
24
24
  # (errors usu from gem loading errors)
@@ -58,11 +58,8 @@ end
58
58
 
59
59
  begin
60
60
  env.activate
61
- env.run do
62
- # give some help
63
- require 'tap/support/command_line'
64
-
65
- puts Tap::Support::CommandLine.usage(__FILE__)
61
+ env.execute(ARGV) do
62
+ puts Tap::Support::Lazydoc.usage(__FILE__)
66
63
  puts
67
64
  puts "available commands:"
68
65
  puts env.summarize(:commands)
data/cgi/run.rb ADDED
@@ -0,0 +1,67 @@
1
+ # ::summary
2
+ # runs a task
3
+ #
4
+ # ::description
5
+ #
6
+ ############################
7
+ require 'cgi'
8
+ require "#{File.dirname(__FILE__)}/../vendor/url_encoded_pair_parser"
9
+
10
+ env = Tap::Env.instance
11
+
12
+ module Tap
13
+ module Support
14
+ module Server
15
+ module_function
16
+
17
+ def pair_parse(params)
18
+ pairs = {}
19
+ params.each_pair do |key, values|
20
+ key = key.chomp("%w") if key =~ /%w$/
21
+
22
+ slot = pairs[key] ||= []
23
+ values.each do |value|
24
+ value = value.respond_to?(:read) ? value.read : value
25
+ if $~
26
+ slot.concat(Shellwords.shellwords(value))
27
+ else
28
+ slot << value
29
+ end
30
+ end
31
+ end
32
+
33
+ UrlEncodedPairParser.new(pairs).result
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ cgi = CGI.new("html3") # add HTML generation methods
40
+ cgi.out() do
41
+ case cgi.request_method
42
+ when /GET/i
43
+ env.render('run.erb', :env => env, :tascs => [] )
44
+
45
+ when /POST/i
46
+ action = cgi.params['action'][0]
47
+ case action
48
+ when 'add'
49
+ index = cgi.params['index'][0].to_i - 1
50
+ cgi.params['selected_tasks'].collect do |task|
51
+ index += 1
52
+ tasc = env.tasks.search(task).constantize
53
+ env.render('run/task.erb', :tasc => tasc, :index => index )
54
+ end.join("\n")
55
+
56
+ when 'remove'
57
+ when 'update'
58
+ else
59
+ cgi.pre do
60
+ argh = Tap::Support::Server.pair_parse(cgi.params)
61
+ Tap::Support::Schema.parse(argh['schema']).dump.to_yaml
62
+ end
63
+ end
64
+ else
65
+ raise ArgumentError, "unhandled request method: #{cgi.request_method}"
66
+ end
67
+ end
data/cmd/console.rb CHANGED
@@ -12,7 +12,7 @@ OptionParser.new do |opts|
12
12
  opts.separator "options:"
13
13
 
14
14
  opts.on("-h", "--help", "Show this message") do
15
- opts.banner = Tap::Support::CommandLine.usage(__FILE__)
15
+ opts.banner = Tap::Support::Lazydoc.usage(__FILE__)
16
16
  puts opts
17
17
  exit
18
18
  end
data/cmd/destroy.rb CHANGED
@@ -3,14 +3,14 @@ require 'tap/generator/destroy'
3
3
 
4
4
  env = Tap::Env.instance
5
5
 
6
- if ARGV.empty? || ARGV == ['-T']
7
- puts env.summarize(:generators) {|const| const.document[const.name]['generator'] }
6
+ if ARGV.empty? || ARGV == ['--help']
7
+ puts env.summarize(:generators)
8
8
  exit
9
9
  end
10
10
 
11
11
  name = ARGV.shift
12
- const = env.search(:generators, name) or raise "unknown generator: #{name}"
12
+ const = env.generators.search(name) or raise "unknown generator: #{name}"
13
13
 
14
14
  generator_class = const.constantize
15
- generator, argv = generator_class.instantiate(ARGV)
15
+ generator, argv = generator_class.parse(ARGV)
16
16
  generator.extend(Tap::Generator::Destroy).process(*argv)
data/cmd/generate.rb CHANGED
@@ -3,14 +3,14 @@ require 'tap/generator/generate'
3
3
 
4
4
  env = Tap::Env.instance
5
5
 
6
- if ARGV.empty? || ARGV == ['-T']
7
- puts env.summarize(:generators) {|const| const.document[const.name]['generator'] }
6
+ if ARGV.empty? || ARGV == ['--help']
7
+ puts env.summarize(:generators)
8
8
  exit
9
9
  end
10
10
 
11
11
  name = ARGV.shift
12
- const = env.search(:generators, name) or raise "unknown generator: #{name}"
12
+ const = env.generators.search(name) or raise "unknown generator: #{name}"
13
13
 
14
14
  generator_class = const.constantize
15
- generator, argv = generator_class.instantiate(ARGV)
15
+ generator, argv = generator_class.parse(ARGV)
16
16
  generator.extend(Tap::Generator::Generate).process(*argv)
data/cmd/manifest.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # tap manifest
2
2
  #
3
- # Prints information about each env.
3
+ # Prints information about the current tap environment.
4
4
  #
5
5
 
6
6
  options = {}
@@ -10,85 +10,93 @@ OptionParser.new do |opts|
10
10
  opts.separator "options:"
11
11
 
12
12
  opts.on("-h", "--help", "Show this message") do
13
- opts.banner = cmdline.usage(__FILE__)
13
+ opts.banner = Tap::Support::Lazydoc.usage(__FILE__)
14
14
  puts opts
15
15
  exit
16
16
  end
17
17
 
18
- opts.on("-e", "--envs_only", "Only list environments") do
19
- options[:envs_only] = true
20
- end
18
+ # opts.on("-t", "--tree", "Just print the env tree.") do
19
+ # options[:tree] = true
20
+ # end
21
21
 
22
- opts.on("-r", "--require FILEPATH", "Require the specified file") do |value|
23
- require value
24
- end
22
+ # opts.on("-r", "--require FILEPATH", "Require the specified file") do |value|
23
+ # require value
24
+ # end
25
25
 
26
26
  end.parse!(ARGV)
27
27
 
28
- # Simply a method to collect and format paths for
29
- # the specified manifest.
30
- def collect_map(env, manifest)
31
- width = 10
32
- map = manifest.minimize.collect do |(key, path)|
33
- path = case path
34
- when Tap::Support::Constant then path.require_path
35
- else path
36
- end
37
-
38
- width = key.length if width < key.length
39
- [key, env.root.relative_filepath(:root, path) || path]
40
- end.collect do |args|
41
- "%-#{width}s (%s)" % args
42
- end
43
-
44
- map.unshift("") unless map.empty?
45
- map
28
+ env = Tap::Env.instance
29
+ env_names = {}
30
+ env.manifest(:envs, true).minimize.each do |name, environment|
31
+ env_names[environment] = name
46
32
  end
47
33
 
48
- # Collect remaining args as
49
- env = Tap::Env.instance
50
- envs_manifest = if ARGV.empty?
51
- env.manifest(:envs, true).minimize
34
+ filter = case
35
+ when ARGV.empty? then env_names.keys
52
36
  else
53
37
  ARGV.collect do |name|
54
- entry = env.find(:envs, name, false)
55
- raise "could not find an env matching: #{name}" if entry == nil
56
- entry
38
+ unless entry = env.find(:envs, name, false)
39
+ raise "could not find an env matching: #{name}"
40
+ end
41
+
42
+ entry[1]
57
43
  end
58
44
  end
59
45
 
60
- width = 10
61
- envs_manifest.each {|(env_name, e)| width = env_name.length if width < env_name.length}
62
- width += 2
46
+ template = %Q{#{'-' * 80}
47
+ <%= (env_name + ':').ljust(width) %> (<%= env.root.root %>)
48
+ <% manifests.each do |manifest_name, entries| %>
49
+ <%= manifest_name %>
50
+ <% entries.each do |name, path| %>
51
+ <%= name.ljust(width-4) %> (<%= path %>)
52
+ <% end %>
53
+ <% end %>
54
+ }
63
55
 
64
- env.each do |current|
65
- env_name, current = envs_manifest.find {|(env_name, e)| e == current }
66
- next if env_name == nil
67
-
68
- puts '-' * 80 unless options[:envs_only]
69
- puts "%-#{width}s (%s)" % [env_name + ':', current.root.root]
70
-
71
- next if options[:envs_only]
56
+ width = 10
57
+ summary = env.inspect(template) do |templater, share|
58
+ current = templater.env
59
+ next unless filter.include?(current)
72
60
 
73
61
  manifest_keys = (Tap::Env.manifests.keys + current.manifests.keys).uniq
74
- manifest_keys.each do |name|
62
+ manifests = manifest_keys.collect do |name|
75
63
  next if name == :envs
64
+
76
65
  manifest = current.manifest(name, true)
77
66
  next if manifest.empty?
78
67
 
79
- puts " %-10s %s" % [name, collect_map(current, manifest).join("\n ")]
68
+ entries = manifest.minimize.collect do |(entry, path)|
69
+ path = case path
70
+ when Tap::Support::Constant then path.require_path
71
+ else path
72
+ end
73
+
74
+ width = entry.length if width < entry.length
75
+ [entry, current.root.relative_filepath(:root, path) || path]
76
+ end
77
+
78
+ [name, entries]
80
79
  end
80
+ templater.manifests = manifests.compact
81
+ templater.env_name = env_names[current]
82
+
83
+ width = templater.env_name.length if width < templater.env_name.length
84
+ share[:width] = width + 2
81
85
  end
86
+ puts summary
82
87
 
83
88
  if ARGV.empty?
84
- puts '-' * 80
85
- puts
86
- env.recursive_each(0, nil) do |current, nesting_depth, last_env|
87
- env_name, current = envs_manifest.find {|(env_name, e)| e == current }
88
-
89
- leader = nesting_depth == 0 ? "" : '| ' * (nesting_depth - 1) + (last_env == current ? "`- " : "|- ")
90
- puts("#{leader}#{env_name}")
89
+ tree = env.recursive_inspect("<%= leader %><%= env_name %> \n", 0, nil) do |templater, share, nesting_depth, last|
90
+ current = templater.env
91
+
92
+ templater.leader = nesting_depth == 0 ? "" : '| ' * (nesting_depth - 1) + (last == current ? "`- " : "|- ")
93
+ templater.env_name = env_names[current]
94
+
91
95
  [nesting_depth + 1, current.envs[-1]]
92
96
  end
97
+
98
+ puts '-' * 80
99
+ puts
100
+ puts tree
93
101
  puts
94
102
  end
data/cmd/run.rb CHANGED
@@ -7,7 +7,6 @@
7
7
 
8
8
  env = Tap::Env.instance
9
9
  app = Tap::App.instance
10
- cmdline = Tap::Support::CommandLine
11
10
 
12
11
  #
13
12
  # handle options
@@ -15,14 +14,13 @@ cmdline = Tap::Support::CommandLine
15
14
 
16
15
  dump = false
17
16
  OptionParser.new do |opts|
18
-
19
17
  opts.separator ""
20
18
  opts.separator "configurations:"
21
19
 
22
20
  Tap::App.configurations.each do |receiver, key, config|
23
21
  next if receiver == Tap::Root
24
22
 
25
- opts.on(*cmdline.configv(config)) do |value|
23
+ opts.on(*config.to_optparse_argv) do |value|
26
24
  app.send(config.writer, value)
27
25
  end
28
26
  end
@@ -31,96 +29,31 @@ OptionParser.new do |opts|
31
29
  opts.separator "options:"
32
30
 
33
31
  opts.on("-h", "--help", "Show this message") do
34
- opts.banner = cmdline.usage(__FILE__)
32
+ opts.banner = Tap::Support::Lazydoc.usage(__FILE__)
35
33
  Tap::App.lazydoc.resolve
36
34
  puts opts
37
35
  exit
38
36
  end
39
37
 
40
38
  opts.on('-T', '--manifest', 'Print a list of available tasks') do |v|
41
- puts env.summarize(:tasks) {|const| const.document[const.name]['manifest'] }
39
+ puts env.summarize(:tasks)
42
40
  exit
43
41
  end
44
42
 
45
43
  end.parse!(ARGV)
46
44
 
47
45
  #
48
- # handle options for each specified task
46
+ # build and run the argv
49
47
  #
50
48
 
51
- rounds = cmdline.split(ARGV).collect do |argvs|
52
- argvs.each do |argv|
53
- ARGV.clear
54
- ARGV.concat(argv)
55
-
56
- unless td = cmdline.shift(ARGV)
57
- # warn nil?
58
- next
59
- end
60
-
61
- # attempt lookup the task class
62
- const = env.search(:tasks, td) or raise "unknown task: #{td}"
63
- task_class = const.constantize or raise "unknown task: #{td}"
64
-
65
- # now let the class handle the argv
66
- task, argv = task_class.instantiate(ARGV, app)
67
- task.enq *argv.collect! {|str| cmdline.parse_yaml(str) }
68
- end
69
-
70
- app.queue.clear
71
- end
49
+ queues = env.build(ARGV)
72
50
  ARGV.clear
73
51
 
74
- rounds.delete_if {|round| round.empty? }
75
- if rounds.empty?
52
+ if queues.empty?
76
53
  puts "no task specified"
77
54
  exit
78
55
  end
79
56
 
80
- #
81
- # set signals
82
- #
83
-
84
- # info signal -- Note: some systems do
85
- # not support the INFO signal
86
- # (windows, fedora, at least)
87
- signals = Signal.list.keys
88
- if signals.include?("INFO")
89
- Signal.trap("INFO") do
90
- puts app.info
91
- end
92
- end
93
-
94
- # interuption signal
95
- if signals.include?("INT")
96
- Signal.trap("INT") do
97
- puts " interrupted!"
98
- # prompt for decision
99
- while true
100
- print "stop, terminate, exit, or resume? (s/t/e/r):"
101
- case gets.strip
102
- when /s(top)?/i
103
- app.stop
104
- break
105
- when /t(erminate)?/i
106
- app.terminate
107
- break
108
- when /e(xit)?/i
109
- exit
110
- when /r(esume)?/i
111
- break
112
- else
113
- puts "unexpected response..."
114
- end
115
- end
116
- end
117
- end
118
-
119
- #
120
- # enque tasks and run!
121
- #
57
+ env.set_signals
58
+ env.run(queues)
122
59
 
123
- rounds.each_with_index do |queue, i|
124
- app.queue.concat(queue)
125
- app.run
126
- end