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
@@ -0,0 +1,58 @@
1
+ require 'tap/task'
2
+
3
+ module Tap
4
+ module Tasks
5
+ # :startdoc::task the default dump task
6
+ #
7
+ # Dumps data to $stdout or a file output.
8
+ #
9
+ # % tap run -- dump content --output FILEPATH
10
+ #
11
+ # Dump faciliates normal redirection:
12
+ #
13
+ # % tap run -- load hello --: dump | more
14
+ # hello
15
+ #
16
+ # % tap run -- load hello --: dump 1> results.txt
17
+ # % more results.txt
18
+ # hello
19
+ #
20
+ # Note that dumps are appended to the file. Dump only accepts one object
21
+ # at a time, so joins that produce an array (like sync) need to iterate
22
+ # outputs to dump:
23
+ #
24
+ # % tap run -- load hello -- load world -- dump --[0,1][2]i.sync
25
+ # hello
26
+ # world
27
+ #
28
+ # :startdoc::task-
29
+ #
30
+ # Dump serves as a baseclass for more complicated dumps. A YAML dump
31
+ # (see {tap-tasks}[http://tap.rubyforge.org/tap-tasks]) looks like this:
32
+ #
33
+ # class Yaml < Tap::Dump
34
+ # def dump(obj, io)
35
+ # YAML.dump(obj, io)
36
+ # end
37
+ # end
38
+ #
39
+ class Dump < Tap::Task
40
+ config :output, $stdout, &c.io(:<<, :puts, :print) # The dump target file
41
+ config :overwrite, false, &c.flag # Overwrite the existing target
42
+
43
+ # The default process prints dump headers as specified in the config,
44
+ # then append the audit value to io.
45
+ def process(input)
46
+ open_io(output, overwrite ? 'w' : 'a') do |io|
47
+ dump(input, io)
48
+ end
49
+ output
50
+ end
51
+
52
+ # Dumps the object to io, by default dump puts (not prints) obj.to_s.
53
+ def dump(input, io)
54
+ io.puts input.to_s
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,62 @@
1
+ require 'tap/task'
2
+ require 'stringio'
3
+
4
+ module Tap
5
+ module Tasks
6
+ # :startdoc::task the default load task
7
+ #
8
+ # Loads data from $stdin. String data may be passed directly. Load
9
+ # is typically used as a gateway to other tasks.
10
+ #
11
+ # % tap run -- load string --: dump
12
+ # string
13
+ #
14
+ # Load facilitates normal redirection:
15
+ #
16
+ # % echo goodnight moon | tap run -- load --: dump
17
+ # goodnight moon
18
+ #
19
+ # % tap run -- load --: dump < somefile.txt
20
+ # contents of somefile
21
+ #
22
+ # :startdoc::task-
23
+ #
24
+ # Load serves as a baseclass for more complicated loads. A YAML load
25
+ # (see {tap-tasks}[http://tap.rubyforge.org/tap-tasks]) looks like this:
26
+ #
27
+ # class Yaml < Tap::Load
28
+ # def load(io)
29
+ # YAML.load(io)
30
+ # end
31
+ # end
32
+ #
33
+ class Load < Tap::Task
34
+
35
+ config :file, false, &c.flag # opens the input as a file
36
+
37
+ # The default process simply reads the input data and returns it.
38
+ # See load.
39
+ def process(io=$stdin)
40
+ # read on an empty stdin ties up the command line;
41
+ # this facilitates the intended behavior
42
+ if io.kind_of?(IO) && io.stat.size == 0
43
+ io = ''
44
+ end
45
+
46
+ if io.kind_of?(String)
47
+ io = StringIO.new(io)
48
+ end unless file
49
+
50
+ open_io(io) do |data|
51
+ load(data)
52
+ end
53
+ end
54
+
55
+ # Loads data from the io; the return of load is the return of process. By
56
+ # default load simply reads data from io.
57
+ def load(io)
58
+ io.read
59
+ end
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.4
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Chiang
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-23 00:00:00 -06:00
12
+ date: 2009-05-25 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.4.1
23
+ version: 0.5.0
24
24
  version:
25
25
  description:
26
26
  email: simon.a.chiang@gmail.com
@@ -32,93 +32,50 @@ extra_rdoc_files:
32
32
  - README
33
33
  - MIT-LICENSE
34
34
  - History
35
+ - doc/API
35
36
  - doc/Class Reference
36
- - doc/Command Reference
37
- - doc/Syntax Reference
38
- - doc/Tutorial
37
+ - doc/Examples/Command Line
38
+ - doc/Examples/Workflow
39
39
  files:
40
40
  - cmd/console.rb
41
- - cmd/destroy.rb
42
- - cmd/generate.rb
43
41
  - cmd/manifest.rb
44
42
  - cmd/run.rb
45
- - bin/tap
46
43
  - lib/tap.rb
47
44
  - lib/tap/app.rb
45
+ - lib/tap/app/node.rb
46
+ - lib/tap/app/queue.rb
47
+ - lib/tap/app/stack.rb
48
+ - lib/tap/app/state.rb
48
49
  - lib/tap/constants.rb
50
+ - lib/tap/tasks/dump.rb
49
51
  - lib/tap/env.rb
52
+ - lib/tap/env/constant.rb
53
+ - lib/tap/env/gems.rb
54
+ - lib/tap/env/manifest.rb
55
+ - lib/tap/env/minimap.rb
56
+ - lib/tap/env/string_ext.rb
50
57
  - lib/tap/exe.rb
51
- - lib/tap/file_task.rb
52
- - lib/tap/generator/arguments.rb
53
- - lib/tap/generator/base.rb
54
- - lib/tap/generator/destroy.rb
55
- - lib/tap/generator/generate.rb
56
- - lib/tap/generator/generators/command/command_generator.rb
57
- - lib/tap/generator/generators/command/templates/command.erb
58
- - lib/tap/generator/generators/config/config_generator.rb
59
- - lib/tap/generator/generators/generator/generator_generator.rb
60
- - lib/tap/generator/generators/generator/templates/task.erb
61
- - lib/tap/generator/generators/generator/templates/test.erb
62
- - lib/tap/generator/generators/root/root_generator.rb
63
- - lib/tap/generator/generators/root/templates/MIT-LICENSE
64
- - lib/tap/generator/generators/root/templates/README
65
- - lib/tap/generator/generators/root/templates/Rakefile
66
- - lib/tap/generator/generators/root/templates/Rapfile
67
- - lib/tap/generator/generators/root/templates/gemspec
68
- - lib/tap/generator/generators/root/templates/test/tap_test_helper.rb
69
- - lib/tap/generator/generators/task/task_generator.rb
70
- - lib/tap/generator/generators/task/templates/task.erb
71
- - lib/tap/generator/generators/task/templates/test.erb
72
- - lib/tap/generator/manifest.rb
73
- - lib/tap/generator/preview.rb
58
+ - lib/tap/join.rb
59
+ - lib/tap/joins.rb
60
+ - lib/tap/joins/switch.rb
61
+ - lib/tap/joins/sync.rb
62
+ - lib/tap/tasks/load.rb
74
63
  - lib/tap/root.rb
75
- - lib/tap/spec.rb
76
- - lib/tap/support/aggregator.rb
77
- - lib/tap/support/audit.rb
78
- - lib/tap/support/constant.rb
79
- - lib/tap/support/constant_manifest.rb
80
- - lib/tap/support/dependencies.rb
81
- - lib/tap/support/dependency.rb
82
- - lib/tap/support/executable.rb
83
- - lib/tap/support/executable_queue.rb
84
- - lib/tap/support/gems.rb
64
+ - lib/tap/root/utils.rb
65
+ - lib/tap/root/versions.rb
66
+ - lib/tap/schema.rb
67
+ - lib/tap/schema/parser.rb
68
+ - lib/tap/schema/utils.rb
85
69
  - lib/tap/support/intern.rb
86
- - lib/tap/support/join.rb
87
- - lib/tap/support/joins.rb
88
- - lib/tap/support/joins/switch.rb
89
- - lib/tap/support/joins/sync_merge.rb
90
- - lib/tap/support/manifest.rb
91
- - lib/tap/support/minimap.rb
92
- - lib/tap/support/node.rb
93
- - lib/tap/support/parser.rb
94
- - lib/tap/support/schema.rb
95
- - lib/tap/support/shell_utils.rb
96
- - lib/tap/support/string_ext.rb
97
70
  - lib/tap/support/templater.rb
98
- - lib/tap/support/versions.rb
99
71
  - lib/tap/task.rb
100
- - lib/tap/dump.rb
101
- - lib/tap/load.rb
102
- - lib/tap/test.rb
103
- - lib/tap/test/assertions.rb
104
- - lib/tap/test/env_vars.rb
105
- - lib/tap/test/extensions.rb
106
- - lib/tap/test/file_test.rb
107
- - lib/tap/test/file_test_class.rb
108
- - lib/tap/test/regexp_escape.rb
109
- - lib/tap/test/script_test.rb
110
- - lib/tap/test/script_tester.rb
111
- - lib/tap/test/subset_test.rb
112
- - lib/tap/test/subset_test_class.rb
113
- - lib/tap/test/tap_test.rb
114
- - lib/tap/test/utils.rb
115
72
  - README
116
73
  - MIT-LICENSE
117
74
  - History
75
+ - doc/API
118
76
  - doc/Class Reference
119
- - doc/Command Reference
120
- - doc/Syntax Reference
121
- - doc/Tutorial
77
+ - doc/Examples/Command Line
78
+ - doc/Examples/Workflow
122
79
  has_rdoc: true
123
80
  homepage: http://tap.rubyforge.org
124
81
  post_install_message:
@@ -149,6 +106,6 @@ rubyforge_project: tap
149
106
  rubygems_version: 1.3.1
150
107
  signing_key:
151
108
  specification_version: 2
152
- summary: A framework for creating configurable, distributable tasks and workflows.
109
+ summary: A configurable, distributable workflow framework.
153
110
  test_files: []
154
111
 
data/cmd/destroy.rb DELETED
@@ -1,27 +0,0 @@
1
- # usage: tap destroy GENERATOR ...
2
- #
3
- # Runs a generator in reverse. Each generator works a little differently; the
4
- # best way to figure out what a generator does is to use --help. For example:
5
- #
6
- # % tap generate root --help
7
- #
8
-
9
- require 'tap/generator/base'
10
- require 'tap/generator/destroy'
11
-
12
- env = Tap::Env.instance
13
-
14
- if ARGV.empty? || ARGV == ['--help']
15
- puts Lazydoc.usage(__FILE__)
16
- puts
17
- puts "generators:"
18
- puts env.summarize(:generators)
19
- exit
20
- end
21
-
22
- name = ARGV.shift
23
- const = env.generators.search(name) or raise "unknown generator: #{name}"
24
-
25
- generator_class = const.constantize
26
- generator, argv = generator_class.parse(ARGV)
27
- generator.extend(Tap::Generator::Destroy).process(*argv)
data/cmd/generate.rb DELETED
@@ -1,27 +0,0 @@
1
- # usage: tap generate GENERATOR ...
2
- #
3
- # Runs a generator. Each generator works a little differently; the best way to
4
- # figure out what a generator does is to use --help. For example:
5
- #
6
- # % tap generate root --help
7
- #
8
-
9
- require 'tap/generator/base'
10
- require 'tap/generator/generate'
11
-
12
- env = Tap::Env.instance
13
-
14
- if ARGV.empty? || ARGV == ['--help']
15
- puts Lazydoc.usage(__FILE__)
16
- puts
17
- puts "generators:"
18
- puts env.summarize(:generators)
19
- exit
20
- end
21
-
22
- name = ARGV.shift
23
- const = env.generators.search(name) or raise "unknown generator: #{name}"
24
-
25
- generator_class = const.constantize
26
- generator, argv = generator_class.parse(ARGV)
27
- generator.extend(Tap::Generator::Generate).process(*argv)
@@ -1,105 +0,0 @@
1
- = Command Reference
2
-
3
- Tap comes the tap executable. For help on the command line, type:
4
-
5
- % tap --help
6
-
7
- == console
8
-
9
- Console opens an irb session after loading the tap environment. Console
10
- defines variables 'app' and 'env' referencing Tap::App.instance and
11
- Tap::Env.instance, for easy access.
12
-
13
- % tap console
14
- irb(main):001:0> app.log(:hello)
15
- I[17:18:53] hello
16
- => true
17
- irb(main):002:0>
18
-
19
- == generate/destroy
20
-
21
- Generate and destroy launch generator scripts, similar to those in
22
- {Rails}[http://www.rubyonrails.org/]. By default Tap provides generators for:
23
-
24
- {command}[link:classes/Tap/Generator/Generators/CommandGenerator.html]:: a new command
25
- {config}[link:classes/Tap/Generator/Generators/ConfigGenerator.html]:: a static config file for the specified task
26
- {generator}[link:classes/Tap/Generator/Generators/GeneratorGenerator.html]:: a new generator
27
- {root}[link:classes/Tap/Generator/Generators/RootGenerator.html]:: the basic directory structure
28
- {task}[link:classes/Tap/Generator/Generators/TaskGenerator.html]:: a task class and test
29
-
30
- For example:
31
-
32
- % tap generate root .
33
- % tap generate task sample_task
34
- % tap generate config sample_task
35
-
36
- % tap destroy config sample_task
37
- % tap destroy task sample_task
38
- % tap destroy root .
39
-
40
- Each generator works a little differently. For help:
41
-
42
- % tap generate --help
43
- % tap generate <generator> --help
44
-
45
- == manifest
46
-
47
- Manifest prints a list of all resources (commands, tasks, generators, etc)
48
- available to tap. Environments are listed in the same order as they are
49
- searched, and at the end a tree diagram is printed showing how the
50
- environments are nested.
51
-
52
- % tap manifest
53
- --------------------------------------------------------------------------------
54
- Desktop: (/Users/username/Desktop)
55
- --------------------------------------------------------------------------------
56
- tap: (/Library/Ruby/Gems/1.8/gems/tap-0.10.8)
57
- generators
58
- command (lib/tap/generator/generators/command/command_generator.rb)
59
- config (lib/tap/generator/generators/config/config_generator.rb)
60
- generator (lib/tap/generator/generators/generator/generator_generator.rb)
61
- root (lib/tap/generator/generators/root/root_generator.rb)
62
- task (lib/tap/generator/generators/task/task_generator.rb)
63
- commands
64
- console (cmd/console.rb)
65
- destroy (cmd/destroy.rb)
66
- generate (cmd/generate.rb)
67
- manifest (cmd/manifest.rb)
68
- run (cmd/run.rb)
69
- tasks
70
- dump (lib/tap/tasks/dump.rb)
71
- load (lib/tap/tasks/load.rb)
72
- rake (lib/tap/tasks/rake.rb)
73
- --------------------------------------------------------------------------------
74
-
75
- Desktop
76
- `- tap
77
-
78
- == run
79
-
80
- Run configures, enqueues, and executes tasks. Run has a rich syntax allowing
81
- the specification of any number of tasks with configurations and inputs, but
82
- simplifies under most circumstances. The run syntax is detailed in the {Syntax Reference}[link:files/doc/Syntax%20Reference.html], but a couple examples
83
- illustrate the key points:
84
-
85
- % tap run sample/task
86
- % tap run -- sample/task --key=value input_one -- another/task input_two
87
-
88
- The second statement specifies two tasks with inputs, and specifies a
89
- configuration for sample/task. As can be seen, run separates tasks using a
90
- double-dash, the standard option break. Options for the run command can be
91
- specified before the first break.
92
-
93
- % tap run --debug -- sample/task --key=value
94
-
95
- Here run receives the <tt>--debug</tt> option and sample/task receives the
96
- <tt>--key=value</tt> option. Inputs work the same way. For example:
97
-
98
- % tap run -- sample/task --key=value one -- another/task two three
99
-
100
- Specifies the following:
101
-
102
- Sample::Task.new(:key => 'value').enq('one')
103
- Another::Task.new.enq('two', 'three')
104
-
105
- Any number of tasks, configurations, and inputs may be specified in this way.
@@ -1,234 +0,0 @@
1
- = Syntax Reference
2
-
3
- Tap uses several domain-specific languages to declare tasks and workflows.
4
- This is a reference for:
5
-
6
- * class definitions
7
- * workflows
8
-
9
- == Task Classes
10
-
11
- This is a verbose prototype for Tap::Task subclasses:
12
-
13
- # <ClassName>::manifest summary description
14
- #
15
- # Extended documentation...
16
- #
17
- class ClassName < Tap::Task
18
-
19
- # Sets up a configuration and makes the 'key' and 'key=' accessors.
20
- #
21
- # This documentation appears in static config files, and in RDoc.
22
- #
23
- config :key, 'default value' do |value| # config summary
24
- "the config is set to the return value"
25
- end
26
-
27
- # Subclasses BaseClass with the specified configs, using the block
28
- # to override process.
29
- #
30
- # Also creates the methods 'name', 'name_config', 'name_config='.
31
- # The first will access an instance-specific instance of the
32
- # subclass, the other two are accessors for the instance configs.
33
- #
34
- # Primarily used in conjunction with workflow.
35
- #
36
- define :name, <BaseClass>, {<configs>} do |*args|
37
- # this is the process block
38
- end
39
-
40
- # Causes each instance to depend on DependencyClass.instance.
41
- #
42
- # Also defines a reader 'name' which will access the results
43
- # of the dependency.
44
- depends_on :name, <DependencyClass>
45
-
46
- def process(*args)
47
- # the method defining what this task does
48
- end
49
-
50
- protected
51
-
52
- def workflow
53
- # a hook to setup joins between various tasks used
54
- # by the current instance. workflow is called
55
- # during initialize
56
- end
57
-
58
- def before_execute()
59
- # a hook to execute code before process
60
- # (only works in workflows)
61
- end
62
-
63
- def after_execute()
64
- # a hook to execute code after process
65
- # (only works in workflows)
66
- end
67
-
68
- def on_execute_error(err)
69
- # a hook to handle errors during process
70
- # (only works in workflows)
71
- end
72
- end
73
-
74
- == Workflows
75
-
76
- The tap workflow syntax is designed to specify an arbitrary number of tasks,
77
- inputs, configurations, and joins. The syntax works both as text and as YAML;
78
- 'tap run' uses it to specify which tasks to execute. Basically, the syntax
79
- uses double-dash delimiters to separate task vectors and modified delimiters
80
- to specify joins for the tasks.
81
-
82
- These both specify three tasks (x,y,z) joined in a sequence:
83
-
84
- % tap run -- x --: y --: z
85
- % tap run -- x -- y -- z --0:1:2
86
-
87
- The modified delimiters use numbers to indicate which tasks participate in a
88
- join and punctuation to indicate the join type. In the first example, the
89
- numbers are implicitly added for the preceding and following task. A variety
90
- of joins are supported:
91
-
92
- delimiter function syntax example meaning
93
- -- delimiter a -- b -- c enques/configures tasks a, b, c
94
- --* dependency --* a enques dependency instance
95
- --+ round --+ a --++ b enques a to round one, b to round two
96
- --+[] round shorthand +round[targets] --+2[0,1] enques (a,b) to round two
97
-
98
- --: sequence source:target --0:1:2 sequence a, b, c
99
- --[] fork source[targets...] --0[1,2] fork a to (b,c)
100
- --{} merge target{sources...} --2{0,1} merge (a,b) to c
101
- --() sync_merge target(sources...) --2(0,1) synchronize merge (a,b) to c
102
-
103
- Inputs may be specified between delimiters:
104
-
105
- % tap run -- x alpha beta --: y gamma --: z delta
106
-
107
- As may be configurations, in a variety of formats:
108
-
109
- % tap run -- x alpha beta -k --: y gamma --key value --: z delta --key=value
110
-
111
- These are the corresponding task vectors:
112
-
113
- ['x', 'alpha', 'beta', '-k']
114
- ['y', 'gamma', '--key', 'value']
115
- ['z', 'delta', '--key=value']
116
-
117
- This is how it would look as YAML:
118
-
119
- - - x
120
- - alpha
121
- - beta
122
- - -k
123
- - - y
124
- - gamma
125
- - key: value
126
- - - z
127
- - delta
128
- - --key=value
129
- - 0:1:2
130
-
131
- The task vectors are converted into a task and an argument vector by first
132
- looking up a task class and then calling TaskClass.parse. The parse method
133
- returns a configured instance of the task and an argv to be executed by the
134
- task. Once the task are instantiated, instances are joined and enqued to
135
- Tap::App for execution (see Tap::Support::Schema#build).
136
-
137
- ==== Class Lookup
138
-
139
- Tap looks up classes via Tap::Env. Tap can find tasks from multiple
140
- environments; by adding in environments for gems, Tap can find tasks
141
- within a gem.
142
-
143
- During lookup, classes are treated like filepaths which match from the
144
- basename up:
145
-
146
- class lookup matched by
147
- Sample::Task sample/task task, sample/task
148
- A::Nested::Task a/nested/task task, nested/task, a/nested/task
149
-
150
- In the event of a name conflict, the path of the environment may also be
151
- specified. It seems like this could get confusing, but the tap executable
152
- produces manifests that specify the minimal path required to uniquely
153
- identify a class. Fragments of the minimized paths will be resolved in order
154
- from top to bottom within the specified environment. For example:
155
-
156
- % tap run -T
157
- one:
158
- sample/task # some sample task
159
- another/task # another task
160
- two:
161
- sample/task # a conflicting sample task
162
-
163
- Runs the 'one' sample/task:
164
-
165
- % tap run -- sample/task
166
- % tap run -- one:sample/task
167
-
168
- Runs the 'two' sample/task:
169
-
170
- % tap run -- two:sample/task
171
-
172
- Runs the 'one' sample/task:
173
-
174
- % tap run -- task
175
-
176
- Runs the 'two' sample/task:
177
-
178
- % tap run -- two:task
179
-
180
- Runs another/task:
181
-
182
- % tap run -- another/task
183
- % tap run -- one:another/task
184
-
185
- Notice that the full minimized path ('another/task') is required because simply
186
- using 'task' will be matched to sample/task. The order of tasks is obviously
187
- not alphabetical -- rather it corresponds to the order in which Tap::Env
188
- discovers the tasks.
189
-
190
- ==== Dependencies (--*)
191
-
192
- Normally each task vector specifies a new instance of a task. This specifies
193
- three instance of the 'a' task.
194
-
195
- % tap run -- a -- a -- a
196
-
197
- When you want to specify a 'singleton' instance of a task, the instance
198
- specified by TaskClass.instance, use the dependency delimiter '--*'.
199
-
200
- % tap run --* a
201
-
202
- The dependency instance will be configured and enqued with the arguments.
203
- Dependency instances will be executed first, even if they are specified at the
204
- end of a workflow, they cannot participate in workflows, and any single
205
- dependency may only be specified once in a workflow. These are equivalent:
206
-
207
- % tap run --* a -- b -- c
208
- % tap run b -- c --* a
209
-
210
- While these raise errors:
211
-
212
- % tap run --* a --* a
213
- % tap run --* a --: b
214
-
215
- ==== Rounds (--+)
216
-
217
- The workflow syntax allows multiple execution rounds to be specified All tasks
218
- in a round are run to completion before the next round begins. Rounds are
219
- specified by adding '+' characters after the double-dash break.
220
-
221
- % tap run -- round_one_task --+ round_two_task
222
-
223
- Tasks may be added to rounds in any order and may use the shorthand for multiple
224
- tasks. These are equivalents:
225
-
226
- % tap run -- a --+ b --+ c --++ d
227
- % tap run --+ b --++ d -- a --+ c
228
- % tap run -- a -- b -- c -- d --+1[1,2] --+2[3]
229
-
230
- Rounds are particularly useful for dump tasks; add a dump task as a final round
231
- to capture all results from previous rounds:
232
-
233
- % tap run -- task -- task --+ dump
234
-