tumugi 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +3 -0
  4. data/CHANGELOG.md +44 -2
  5. data/README.md +5 -91
  6. data/Rakefile +0 -4
  7. data/examples/task_inheritance.rb +9 -0
  8. data/examples/task_parameter.rb +4 -5
  9. data/lib/tumugi.rb +6 -3
  10. data/lib/tumugi/cli.rb +31 -6
  11. data/lib/tumugi/command/new.rb +64 -0
  12. data/lib/tumugi/command/run.rb +14 -104
  13. data/lib/tumugi/config.rb +2 -2
  14. data/lib/tumugi/dag_result_reporter.rb +37 -0
  15. data/lib/tumugi/data/new/Gemfile.erb +4 -0
  16. data/lib/tumugi/data/new/README.md.erb +59 -0
  17. data/lib/tumugi/data/new/Rakefile.erb +10 -0
  18. data/lib/tumugi/data/new/examples/example.rb.erb +4 -0
  19. data/lib/tumugi/data/new/gemspec.erb +28 -0
  20. data/lib/tumugi/data/new/gitignore.erb +6 -0
  21. data/lib/tumugi/data/new/lib/tumugi/plugin/target/target.rb.erb +20 -0
  22. data/lib/tumugi/data/new/lib/tumugi/plugin/task/task.rb.erb +22 -0
  23. data/lib/tumugi/data/new/test/plugin/target/target_test.rb.erb +9 -0
  24. data/lib/tumugi/data/new/test/plugin/task/task_test.rb.erb +27 -0
  25. data/lib/tumugi/data/new/test/test.rb.erb +7 -0
  26. data/lib/tumugi/data/new/test/test_helper.rb.erb +8 -0
  27. data/lib/tumugi/executor/local_executor.rb +128 -0
  28. data/lib/tumugi/logger.rb +31 -2
  29. data/lib/tumugi/mixin/parameterizable.rb +11 -2
  30. data/lib/tumugi/parameter/parameter.rb +3 -3
  31. data/lib/tumugi/parameter/parameter_proxy.rb +1 -1
  32. data/lib/tumugi/task.rb +84 -3
  33. data/lib/tumugi/task_definition.rb +37 -18
  34. data/lib/tumugi/test/helper.rb +46 -0
  35. data/lib/tumugi/version.rb +1 -1
  36. data/lib/tumugi/{application.rb → workflow.rb} +11 -4
  37. data/tumugi.gemspec +3 -3
  38. metadata +39 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee5ae43e408b981ed963063ab589495702a573ba
4
- data.tar.gz: 0bded13c3f3eb229613b724b04c96963741b0d09
3
+ metadata.gz: 8245cbb305b7100cc7b3c522ee232d89ac6704c6
4
+ data.tar.gz: 3a7b0605e4f5b7e7fbc5b8fa0b77c1c5c9c932c2
5
5
  SHA512:
6
- metadata.gz: 50c955ce2e7f277bcda63d977aae3eaafe1c4ed0e989df7a490592b61d43cc1478fa844221dc2f3c6f6187f50dbc15882f4beceefdd0ca1a64ad5acaff51ffe0
7
- data.tar.gz: a4e031251a9b2a4077bde42d735f7aa06f29c55ec1c9b6452bd5d3b0dbd672a933fbb9a89cb384bda9ac53bc0bf0e52863c3cb3ca2b540c029d98842a20f8f03
6
+ metadata.gz: 081770a32be9360b5c3dec706f5277cfe22c42b1d2ad21771bfa3567b83a75451d7f2ab71dfcf69c5e0391e11b8224172d9ec71a9e7c1b1c40ddf2eaed0c05cf
7
+ data.tar.gz: 010e6fcb0d19a20c8e7e33fddb06f63cbac19b5f15a45f40cc381cc0c36522fee4ef80b7939358318d2e7b20566ffb65c0f0b4174e2ccb74fdc0aaa0f35dfd38
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /.ruby-version
11
+ /tumugi-plugin-*
@@ -6,11 +6,14 @@ rvm:
6
6
  - 2.3.1
7
7
  - ruby-head
8
8
  - jruby-9.0.5.0
9
+ - jruby-9.1.2.0
10
+ - jruby-head
9
11
  before_install:
10
12
  - gem install bundler
11
13
  matrix:
12
14
  allow_failures:
13
15
  - rvm: ruby-head
16
+ - rvm: jruby-head
14
17
  addons:
15
18
  apt:
16
19
  packages:
@@ -1,12 +1,54 @@
1
1
  # Change Log
2
2
 
3
- ## [0.5.3](https://github.com/tumugi/tumugi/tree/0.5.3) (2016-06-14)
4
- [Full Changelog](https://github.com/tumugi/tumugi/compare/v0.5.2...0.5.3)
3
+ ## [0.6.0](https://github.com/tumugi/tumugi/tree/0.6.0) (2016-07-09)
4
+ [Full Changelog](https://github.com/tumugi/tumugi/compare/v0.5.3...0.6.0)
5
+
6
+ **Implemented enhancements:**
7
+
8
+ - Refactoring executor [\#95](https://github.com/tumugi/tumugi/issues/95)
9
+ - Improve log [\#87](https://github.com/tumugi/tumugi/issues/87)
10
+ - DSL improvement [\#81](https://github.com/tumugi/tumugi/issues/81)
11
+ - Support dryrun option [\#55](https://github.com/tumugi/tumugi/issues/55)
12
+ - param\_set accept block [\#53](https://github.com/tumugi/tumugi/issues/53)
13
+ - Plugin test helper [\#29](https://github.com/tumugi/tumugi/issues/29)
14
+ - Plugin template generator [\#28](https://github.com/tumugi/tumugi/issues/28)
15
+ - Add Tumugi.app which is alias of Tumugi.application [\#92](https://github.com/tumugi/tumugi/pull/92) ([hakobera](https://github.com/hakobera))
16
+ - Add short cut method to set parmeter in DSL [\#84](https://github.com/tumugi/tumugi/pull/84) ([hakobera](https://github.com/hakobera))
17
+ - Improve result table [\#83](https://github.com/tumugi/tumugi/pull/83) ([hakobera](https://github.com/hakobera))
18
+ - Introduce new DSL syntax: set [\#82](https://github.com/tumugi/tumugi/pull/82) ([hakobera](https://github.com/hakobera))
19
+
20
+ **Fixed bugs:**
21
+
22
+ - Fix result reporting failed if parameter type is not :string [\#96](https://github.com/tumugi/tumugi/pull/96) ([hakobera](https://github.com/hakobera))
23
+ - Fix task timeout logic [\#93](https://github.com/tumugi/tumugi/pull/93) ([hakobera](https://github.com/hakobera))
24
+
25
+ **Closed issues:**
26
+
27
+ - \[Breaking Change\] Remove auto\_bind feature and make accessible CLI param from task [\#88](https://github.com/tumugi/tumugi/issues/88)
28
+
29
+ **Merged pull requests:**
30
+
31
+ - Remove File.exists? [\#100](https://github.com/tumugi/tumugi/pull/100) ([hakobera](https://github.com/hakobera))
32
+ - Remove development dependency: github\_changelog\_generator [\#98](https://github.com/tumugi/tumugi/pull/98) ([hakobera](https://github.com/hakobera))
33
+ - Refactoring executor [\#97](https://github.com/tumugi/tumugi/pull/97) ([hakobera](https://github.com/hakobera))
34
+ - Update README [\#94](https://github.com/tumugi/tumugi/pull/94) ([hakobera](https://github.com/hakobera))
35
+ - Test with jruby 9.1.2.0 on travis [\#91](https://github.com/tumugi/tumugi/pull/91) ([hakobera](https://github.com/hakobera))
36
+ - Add command to create plugin template project [\#90](https://github.com/tumugi/tumugi/pull/90) ([hakobera](https://github.com/hakobera))
37
+ - Improve log [\#89](https://github.com/tumugi/tumugi/pull/89) ([hakobera](https://github.com/hakobera))
38
+ - Add plugin test helper [\#86](https://github.com/tumugi/tumugi/pull/86) ([hakobera](https://github.com/hakobera))
39
+ - Parameter can be set by block [\#85](https://github.com/tumugi/tumugi/pull/85) ([hakobera](https://github.com/hakobera))
40
+
41
+ ## [v0.5.3](https://github.com/tumugi/tumugi/tree/v0.5.3) (2016-06-14)
42
+ [Full Changelog](https://github.com/tumugi/tumugi/compare/v0.5.2...v0.5.3)
5
43
 
6
44
  **Fixed bugs:**
7
45
 
8
46
  - Fix logger not defiend in Tumugi::Config [\#79](https://github.com/tumugi/tumugi/pull/79) ([hakobera](https://github.com/hakobera))
9
47
 
48
+ **Merged pull requests:**
49
+
50
+ - Preapre release for 0.5.3 [\#80](https://github.com/tumugi/tumugi/pull/80) ([hakobera](https://github.com/hakobera))
51
+
10
52
  ## [v0.5.2](https://github.com/tumugi/tumugi/tree/v0.5.2) (2016-06-13)
11
53
  [Full Changelog](https://github.com/tumugi/tumugi/compare/v0.5.1...v0.5.2)
12
54
 
data/README.md CHANGED
@@ -1,102 +1,16 @@
1
1
  [![Build Status](https://travis-ci.org/tumugi/tumugi.svg)](https://travis-ci.org/tumugi/tumugi) [![Code Climate](https://codeclimate.com/github/tumugi/tumugi/badges/gpa.svg)](https://codeclimate.com/github/tumugi/tumugi) [![Coverage Status](https://coveralls.io/repos/tumugi/tumugi/badge.svg?branch=master&service=github)](https://coveralls.io/github/tumugi/tumugi?branch=master) [![Gem Version](https://badge.fury.io/rb/tumugi.svg)](https://badge.fury.io/rb/tumugi)
2
2
 
3
+ ![tumugi](http://tumugi.github.io/images/logo.png)
4
+
3
5
  # Tumugi
4
6
 
5
7
  Tumugi is a ruby library to build, run and manage complex workflows. Tumugi enables you to define workflows as a ruby code.
6
8
 
7
- ## Installation
8
-
9
- **Tumugi only support Ruby 2.1 and above**
10
-
11
- Add this line to your application's Gemfile:
12
-
13
- ```ruby
14
- gem 'tumugi'
15
- ```
16
-
17
- And then execute:
18
-
19
- ```bash
20
- $ bundle
21
- ```
22
-
23
- Or install it yourself as:
24
-
25
- ```bash
26
- $ gem install tumugi
27
- ```
28
-
29
- ## Usage
30
-
31
- ![Alt text](http://g.gravizo.com/g?
32
- digraph G {
33
- rankdir=LR;
34
- Task2 -> Task1
35
- Task3 -> Task1;
36
- Task4 -> Task2;
37
- Task4 -> Task3;
38
- }
39
- )
40
-
41
- You can define workflow above as ruby code:
42
-
43
- ```rb
44
- task :task1 do
45
- requires [:task2, :task3]
46
- run { puts 'task1#run' }
47
- end
48
-
49
- task :task2 do
50
- requires [:task4]
51
- run { puts 'task2#run' }
52
- end
53
-
54
- task :task3 do
55
- requires [:task4]
56
- run { puts 'task3#run' }
57
- end
58
-
59
- task :task4 do
60
- # You can use do ... end style
61
- run do
62
- puts 'task4#run'
63
- sleep 3
64
- end
65
- end
66
- ```
9
+ **Tumugi only support Ruby >= 2.1 and JRuby >= 9.0.0.0**
67
10
 
68
- Save these code into `workflow.rb`,
69
- then run this script by `tumugi` command like this:
11
+ ## [Documentation](https://tumugi.github.io)
70
12
 
71
- ```bash
72
- $ tumugi run -f workflow.rb task1
73
- I, [2016-05-06T22:58:28.271234 #76156] INFO -- : start: task4
74
- I, [2016-05-06T22:58:28.271310 #76156] INFO -- : run: task4
75
- I, [2016-05-06T22:58:28.271386 #76156] INFO -- : task4#run
76
- I, [2016-05-06T22:58:29.276218 #76156] INFO -- : completed: task4
77
- I, [2016-05-06T22:58:29.276373 #76156] INFO -- : start: task2
78
- I, [2016-05-06T22:58:29.276437 #76156] INFO -- : run: task2
79
- I, [2016-05-06T22:58:29.276546 #76156] INFO -- : task2#run
80
- I, [2016-05-06T22:58:29.276606 #76156] INFO -- : completed: task2
81
- I, [2016-05-06T22:58:29.276650 #76156] INFO -- : start: task3
82
- I, [2016-05-06T22:58:29.276688 #76156] INFO -- : run: task3
83
- I, [2016-05-06T22:58:29.276733 #76156] INFO -- : task3#run
84
- I, [2016-05-06T22:58:29.276765 #76156] INFO -- : completed: task3
85
- I, [2016-05-06T22:58:29.276798 #76156] INFO -- : start: task1
86
- I, [2016-05-06T22:58:29.276823 #76156] INFO -- : run: task1
87
- I, [2016-05-06T22:58:29.276861 #76156] INFO -- : task1#run
88
- I, [2016-05-06T22:58:29.276899 #76156] INFO -- : completed: task1
89
- I, [2016-05-06T22:58:29.278919 #76156] INFO -- : Result report:
90
- +-------+----------+------------+-----------+
91
- | Task | Requires | Parameters | State |
92
- +-------+----------+------------+-----------+
93
- | task1 | task2 | | completed |
94
- | | task3 | | |
95
- | task3 | task4 | | completed |
96
- | task2 | task4 | | completed |
97
- | task4 | | | completed |
98
- +-------+----------+------------+-----------+
99
- ```
13
+ Please check [tumugi.github.io](https://tumugi.github.io) for installation & usage.
100
14
 
101
15
  ## Development
102
16
 
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
- require "github_changelog_generator/task"
4
3
 
5
4
  Rake::TestTask.new(:test) do |t|
6
5
  t.libs << "test"
@@ -8,7 +7,4 @@ Rake::TestTask.new(:test) do |t|
8
7
  t.test_files = FileList['test/**/*_test.rb']
9
8
  end
10
9
 
11
- GitHubChangelogGenerator::RakeTask.new :changelog do |config|
12
- end
13
-
14
10
  task :default => :test
@@ -1,12 +1,15 @@
1
1
  class FileTask < Tumugi::Task
2
2
  Tumugi::Plugin.register_task(:file, self)
3
3
 
4
+ param :param1, type: :string
5
+
4
6
  def output
5
7
  target(:local_file, "tmp/#{id}.txt")
6
8
  end
7
9
 
8
10
  def run
9
11
  log "#{id}#run"
12
+ log param1
10
13
  output.open('w') do |f|
11
14
  f.puts('done')
12
15
  end
@@ -16,16 +19,22 @@ end
16
19
  # Task type can specified by task plugin ID
17
20
  task :task1, type: :file do
18
21
  requires [:task2, :task3]
22
+ param1 'param1 of task1'
19
23
  end
20
24
 
21
25
  task :task2, type: :file do
22
26
  requires [:task4]
27
+ param1 'param1 of task2'
23
28
  end
24
29
 
25
30
  # You can also specify type by Class object
26
31
  task :task3, type: FileTask do
27
32
  requires [:task4]
33
+ param1 'param1 of task3'
28
34
  end
29
35
 
30
36
  task :task4, type: FileTask do
37
+ param1 do
38
+ 'param1 of task4'
39
+ end
31
40
  end
@@ -1,5 +1,5 @@
1
1
  task :task1 do
2
- param :key1, auto_bind: true, required: true #=> 'value1', get value from CLI parameter
2
+ param :key1, auto_bind: true, required: true #=> get value from CLI parameter
3
3
 
4
4
  requires :task2
5
5
  run do
@@ -8,10 +8,9 @@ task :task1 do
8
8
  end
9
9
 
10
10
  task :task2 do
11
- # If you want do disable auto binding feature, set `auto_bind: false`
12
- param :key1, auto_bind: false #=> nil
13
- param :key2
14
- param_set :key2, 'value2' #=> 'value'
11
+ param :key1
12
+ param :key2, type: :time
13
+ key2 Time.parse('2016-06-27')
15
14
 
16
15
  requires :task3
17
16
  run do
@@ -1,4 +1,4 @@
1
- require 'tumugi/application'
1
+ require 'tumugi/workflow'
2
2
  require 'tumugi/config'
3
3
  require 'tumugi/error'
4
4
  require 'tumugi/logger'
@@ -6,9 +6,12 @@ require 'tumugi/version'
6
6
 
7
7
  module Tumugi
8
8
  class << self
9
- def application
10
- @application ||= Tumugi::Application.new
9
+ def workflow
10
+ @workflow ||= Tumugi::Workflow.new
11
11
  end
12
+ # alias for backward compatibility
13
+ alias_method :app, :workflow
14
+ alias_method :application, :workflow
12
15
 
13
16
  def configure(&block)
14
17
  raise Tumugi::ConfigError.new 'Tumugi.configure must have block' unless block_given?
@@ -1,5 +1,6 @@
1
1
  require 'thor'
2
2
  require 'tumugi'
3
+ require 'tumugi/command/new'
3
4
 
4
5
  module Tumugi
5
6
  class CLI < Thor
@@ -12,6 +13,7 @@ module Tumugi
12
13
  option :params, aliases: '-p', type: :hash, desc: 'Task parameters'
13
14
  option :quiet, type: :boolean, desc: 'Suppress log', default: false
14
15
  option :verbose, type: :boolean, desc: 'Show verbose log', default: false
16
+ option :log_format, type: :string, desc: 'Log format', enum: ['text', 'json'], default: 'text'
15
17
  end
16
18
 
17
19
  def exit_on_failure?
@@ -43,20 +45,43 @@ module Tumugi
43
45
  execute(:show, task, opts.freeze)
44
46
  end
45
47
 
48
+ desc "new PLUGIN_NAME", "Create new plugin project"
49
+ def new(name)
50
+ generate_plugin(name, options)
51
+ end
52
+
46
53
  private
47
54
 
48
55
  def execute(command, task, options)
49
- success = Tumugi.application.execute(command, task, options)
56
+ success = Tumugi.workflow.execute(command, task, options)
50
57
  unless success
51
- logger.error "#{command} command failed"
52
- raise Thor::Error, 'failed'
58
+ raise Thor::Error, "execute finished, but return it's failed"
53
59
  end
54
- success
60
+ logger.info "status: success, command: #{command}, task: #{task}, options: #{options}"
55
61
  rescue => e
56
62
  logger.error "#{command} command failed"
57
63
  logger.error e.message
58
- e.backtrace.each { |line| logger.error line }
59
- raise Thor::Error, 'failed'
64
+ if options[:verbose]
65
+ e.backtrace.each { |line| logger.debug line }
66
+ else
67
+ logger.error "If you want to know more detail, run with '--verbose' option"
68
+ end
69
+ logger.error "status: failed, command: #{command}, task: #{task}, options: #{options}"
70
+ raise Thor::Error.new("tumugi #{command} failed, please check log")
71
+ end
72
+
73
+ def generate_plugin(name, options)
74
+ Tumugi::Command::New.new.execute(name, options)
75
+ logger.info "status: success, command: new, name: #{name}, options: #{options}"
76
+ rescue => e
77
+ logger.error e.message
78
+ if options[:verbose]
79
+ e.backtrace.each { |line| logger.debug line }
80
+ else
81
+ logger.error "If you want to know more detail, run with '--verbose' option"
82
+ end
83
+ logger.error "status: failed, command: new, name: #{name}, options: #{options}"
84
+ raise Thor::Error.new("tumugi new failed, please check log")
60
85
  end
61
86
 
62
87
  def logger
@@ -0,0 +1,64 @@
1
+ require 'fileutils'
2
+ require 'erubis'
3
+
4
+ module Tumugi
5
+ module Command
6
+ class New
7
+ def execute(name, options={})
8
+ full_project_name = "tumugi-plugin-#{name}"
9
+ templates = [
10
+ [ "Gemfile.erb", "Gemfile" ],
11
+ [ "gemspec.erb", "#{full_project_name}.gemspec" ],
12
+ [ "gitignore.erb", ".gitignore" ],
13
+ [ "Rakefile.erb", "Rakefile" ],
14
+ [ "README.md.erb", "README.md" ],
15
+ [ "examples/example.rb.erb", "examples/example.rb" ],
16
+ [ "lib/tumugi/plugin/target/target.rb.erb", "lib/tumugi/plugin/target/#{name}.rb" ],
17
+ [ "lib/tumugi/plugin/task/task.rb.erb", "lib/tumugi/plugin/task/#{name}.rb" ],
18
+ [ "test/test_helper.rb.erb", "test/test_helper.rb" ],
19
+ [ "test/test.rb.erb", "test/#{name}_test.rb" ],
20
+ [ "test/plugin/target/target_test.rb.erb", "test/plugin/target/#{name}_test.rb" ],
21
+ [ "test/plugin/task/task_test.rb.erb", "test/plugin/task/#{name}_test.rb" ],
22
+ ]
23
+
24
+ @data_dir = "#{File.expand_path(File.dirname(__FILE__))}/../data/new"
25
+ @dest_dir = "#{(options[:path] || '.')}/#{full_project_name}"
26
+ if File.exist?(@dest_dir)
27
+ logger.error("#{@dest_dir} is already exists. Please delete it first")
28
+ return false
29
+ end
30
+
31
+ FileUtils.mkdir_p(@dest_dir)
32
+
33
+ templates.each do |value|
34
+ src_file, dest_file = value
35
+ eruby = Erubis::Eruby.new(File.read(src_path(src_file)))
36
+ eruby.filename = src_path(src_file)
37
+ context = {
38
+ full_project_name: full_project_name,
39
+ name: name,
40
+ tumugi_version: Tumugi::VERSION,
41
+ }
42
+ logger.info("Create #{dest_path(dest_file)}")
43
+ FileUtils.mkdir_p(File.dirname(dest_path(dest_file)))
44
+ File.write(dest_path(dest_file), eruby.result(context))
45
+ end
46
+ return true
47
+ end
48
+
49
+ def logger
50
+ Tumugi::Logger.instance
51
+ end
52
+
53
+ private
54
+
55
+ def src_path(file)
56
+ "#{@data_dir}/#{file}"
57
+ end
58
+
59
+ def dest_path(file)
60
+ "#{@dest_dir}/#{file}"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,120 +1,30 @@
1
- require 'parallel'
2
- require 'retriable'
3
- require 'terminal-table'
4
- require 'thor'
5
- require 'timeout'
6
-
7
- require 'tumugi/error'
8
- require 'tumugi/mixin/listable'
1
+ require 'tumugi/dag_result_reporter'
2
+ require 'tumugi/executor/local_executor'
9
3
 
10
4
  module Tumugi
11
5
  module Command
12
6
  class Run
13
- include Tumugi::Mixin::Listable
14
-
15
7
  def execute(dag, options={})
16
- workers = options[:workers] || Tumugi.config.workers
17
- settings = { in_threads: workers }
18
- start(task_queue(dag), settings)
8
+ worker_num = options[:workers] || Tumugi.config.workers
9
+ executor = Tumugi::Executor::LocalExecutor.new(dag, logger, worker_num: worker_num)
10
+ result = start(executor)
19
11
  show_result_report(dag)
20
- !dag.tsort.any? { |t| t.state == :failed }
12
+ result
21
13
  end
22
14
 
23
15
  private
24
16
 
25
- def task_queue(dag)
26
- waiting_task_queue = Queue.new
27
- available_task_queue = Queue.new
28
- dag.tsort.each do |t|
29
- if t.ready?
30
- available_task_queue << t
31
- else
32
- waiting_task_queue << t
33
- end
34
- end
35
- lambda {
36
- task = (available_task_queue.empty? ? nil : available_task_queue.pop)
37
- if task.nil?
38
- task = (waiting_task_queue.empty? ? nil : waiting_task_queue.pop)
39
- end
40
- task || Parallel::Stop
41
- }
42
- end
43
-
44
- def start(proc, settings)
45
- Parallel.each(proc, settings) do |t|
46
- logger.info "start: #{t.id}"
47
- timeout = t.timeout || Tumugi.config.timeout
48
- Timeout::timeout(timeout, Tumugi::TimeoutError) do
49
- until t.ready? || t.requires_failed?
50
- sleep 5
51
- end
52
-
53
- if t.completed?
54
- t.state = :skipped
55
- logger.info "#{t.state}: #{t.id} is already completed"
56
- elsif t.requires_failed?
57
- t.state = :requires_failed
58
- logger.info "#{t.state}: #{t.id} has failed requires task"
59
- else
60
- logger.info "run: #{t.id}"
61
- t.state = :running
62
-
63
- begin
64
- Retriable.retriable retry_options do
65
- t.run
66
- end
67
- rescue => e
68
- t.state = :failed
69
- logger.info "#{t.state}: #{t.id}"
70
- logger.error "#{e.message}"
71
- logger.error e.backtrace.join("\n")
72
- else
73
- t.state = :completed
74
- logger.info "#{t.state}: #{t.id}"
75
- end
76
- end
77
- end
78
- end
79
- end
80
-
81
- def retry_options
82
- {
83
- tries: Tumugi.config.max_retry,
84
- base_interval: Tumugi.config.retry_interval,
85
- max_interval: Tumugi.config.retry_interval * Tumugi.config.max_retry,
86
- max_elapsed_time: Tumugi.config.retry_interval * Tumugi.config.max_retry,
87
- multiplier: 1.0,
88
- rand_factor: 0.0,
89
- on_retry: on_retry
90
- }
91
- end
92
-
93
- def on_retry
94
- Proc.new do |exception, try, elapsed_time, next_interval|
95
- if next_interval
96
- logger.error "#{exception.class}: '#{exception.message}' - #{try} tries in #{elapsed_time} seconds and #{next_interval} seconds until the next try."
97
- else
98
- logger.error "#{exception.class}: '#{exception.message}' - #{try} tries in #{elapsed_time} seconds. Task failed."
99
- end
100
- end
17
+ def start(executor)
18
+ logger.info "start workflow: #{Tumugi.workflow.id}"
19
+ result = executor.execute
20
+ logger.info "end workflow: #{Tumugi.workflow.id}"
21
+ result
101
22
  end
102
23
 
103
24
  def show_result_report(dag)
104
- headings = ['Task', 'Requires', 'Parameters', 'State']
105
- table = Terminal::Table.new headings: headings do |t|
106
- dag.tsort.reverse.map do |task|
107
- proxy = task.class.merged_parameter_proxy
108
- requires = list(task.requires).map do |r|
109
- r.id
110
- end
111
- params = proxy.params.map do |name, _|
112
- "#{name}=#{task.send(name.to_sym)}"
113
- end
114
- t << [ task.id, requires.join("\n"), params.join("\n"), task.state ]
115
- end
116
- end
117
- logger.info "Result report:\n#{table.to_s}"
25
+ reporter = Tumugi::DAGResultReporter.new
26
+ report = reporter.show(dag)
27
+ logger.info "Result report:\n#{report.to_s}"
118
28
  end
119
29
 
120
30
  def logger