tumugi 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/.travis.yml +17 -6
- data/CHANGELOG.md +17 -1
- data/README.md +1 -1
- data/examples/config_section.rb +8 -0
- data/examples/tumugi_config_with_section.rb +8 -0
- data/lib/tumugi.rb +1 -3
- data/lib/tumugi/application.rb +42 -2
- data/lib/tumugi/cli.rb +15 -14
- data/lib/tumugi/command/run.rb +1 -4
- data/lib/tumugi/command/show.rb +2 -0
- data/lib/tumugi/config.rb +39 -0
- data/lib/tumugi/error.rb +4 -0
- data/lib/tumugi/target.rb +4 -0
- data/lib/tumugi/version.rb +1 -1
- data/tumugi.gemspec +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c59de7fccebbe6c040ae40cbf9c50acb0efd0e9
|
4
|
+
data.tar.gz: 92a74c2333d2b346c85c4536d93fd96faa502cb6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b49c7ab0b98ad42c33bddeee8ee2653a66d4679874170a368cac814b2a96f5deb68fe6373234e3b615da8c17fc93fa2d41b9b1543b621c5014e6ab201753333f
|
7
|
+
data.tar.gz: 5736bd6b520a2b42a959bcf75fe3a198a34458899ec1b6b5dc4abaf8987e62d34ff574c59e94fee365b7aff6a90d65c2afb3b42e403f36a05c28ca7b977e44c5
|
data/.travis.yml
CHANGED
@@ -1,11 +1,22 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
|
3
|
+
matrix:
|
4
|
+
include:
|
5
|
+
- rvm: 2.1.10
|
6
|
+
os: linux
|
7
|
+
- rvm: 2.2.5
|
8
|
+
os: linux
|
9
|
+
- rvm: 2.3.1
|
10
|
+
os: linux
|
11
|
+
- rvm: ruby-head
|
12
|
+
os: linux
|
13
|
+
- rvm: jruby-9.0.5.0
|
14
|
+
os: linux
|
15
|
+
allow_failures:
|
16
|
+
- rvm: ruby-head
|
17
|
+
|
8
18
|
cache: bundler
|
19
|
+
|
9
20
|
addons:
|
10
21
|
apt:
|
11
22
|
packages:
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [0.4.0](https://github.com/tumugi/tumugi/tree/0.4.0) (2016-05-09)
|
4
|
+
[Full Changelog](https://github.com/tumugi/tumugi/compare/v0.3.0...0.4.0)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- \[Breaking Change\] Remove support ruby 2.0 [\#33](https://github.com/tumugi/tumugi/issues/33)
|
9
|
+
- Add config section [\#31](https://github.com/tumugi/tumugi/issues/31)
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- Refactoring error handling [\#37](https://github.com/tumugi/tumugi/pull/37) ([hakobera](https://github.com/hakobera))
|
14
|
+
- Change config section spec [\#35](https://github.com/tumugi/tumugi/pull/35) ([hakobera](https://github.com/hakobera))
|
15
|
+
- Remove support Ruby 2.0 [\#34](https://github.com/tumugi/tumugi/pull/34) ([hakobera](https://github.com/hakobera))
|
16
|
+
- Implement config section [\#32](https://github.com/tumugi/tumugi/pull/32) ([hakobera](https://github.com/hakobera))
|
17
|
+
|
18
|
+
## [v0.3.0](https://github.com/tumugi/tumugi/tree/v0.3.0) (2016-05-06)
|
4
19
|
[Full Changelog](https://github.com/tumugi/tumugi/compare/v0.2.0...v0.3.0)
|
5
20
|
|
6
21
|
**Implemented enhancements:**
|
@@ -14,6 +29,7 @@
|
|
14
29
|
|
15
30
|
**Merged pull requests:**
|
16
31
|
|
32
|
+
- Prepare for release v0.3.0 [\#27](https://github.com/tumugi/tumugi/pull/27) ([hakobera](https://github.com/hakobera))
|
17
33
|
- Update README [\#26](https://github.com/tumugi/tumugi/pull/26) ([hakobera](https://github.com/hakobera))
|
18
34
|
- Implement workflow run result report [\#24](https://github.com/tumugi/tumugi/pull/24) ([hakobera](https://github.com/hakobera))
|
19
35
|
- Implement parameter feature [\#22](https://github.com/tumugi/tumugi/pull/22) ([hakobera](https://github.com/hakobera))
|
data/README.md
CHANGED
data/lib/tumugi.rb
CHANGED
data/lib/tumugi/application.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'tumugi/dag'
|
2
2
|
require 'tumugi/dsl'
|
3
|
+
require 'tumugi/error'
|
3
4
|
require 'tumugi/plugin'
|
4
5
|
require 'tumugi/target'
|
5
6
|
require 'tumugi/command/run'
|
@@ -15,7 +16,8 @@ module Tumugi
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def execute(command, root_task_id, options)
|
18
|
-
|
19
|
+
process_common_options(options)
|
20
|
+
load_workflow_file(options[:file])
|
19
21
|
dag = create_dag(root_task_id)
|
20
22
|
command_module = Kernel.const_get("Tumugi").const_get("Command")
|
21
23
|
cmd = command_module.const_get("#{command.to_s.capitalize}").new
|
@@ -28,17 +30,55 @@ module Tumugi
|
|
28
30
|
|
29
31
|
def find_task(id)
|
30
32
|
task = @tasks[id.to_s]
|
31
|
-
raise "Task not found: #{id}" if task.nil?
|
33
|
+
raise Tumugi::Error, "Task not found: #{id}" if task.nil?
|
32
34
|
task
|
33
35
|
end
|
34
36
|
|
35
37
|
private
|
36
38
|
|
39
|
+
def load_workflow_file(file)
|
40
|
+
load(file, true)
|
41
|
+
rescue LoadError => e
|
42
|
+
raise Tumugi::Error, e
|
43
|
+
end
|
44
|
+
|
37
45
|
def create_dag(id)
|
38
46
|
dag = Tumugi::DAG.new
|
39
47
|
task = find_task(id)
|
40
48
|
dag.add_task(task)
|
41
49
|
dag
|
42
50
|
end
|
51
|
+
|
52
|
+
def process_common_options(options)
|
53
|
+
setup_logger(options)
|
54
|
+
load_config(options)
|
55
|
+
set_params(options)
|
56
|
+
end
|
57
|
+
|
58
|
+
def logger
|
59
|
+
@logger ||= Tumugi.logger
|
60
|
+
end
|
61
|
+
|
62
|
+
def setup_logger(options)
|
63
|
+
logger.verbose! if options[:verbose]
|
64
|
+
logger.quiet! if options[:quiet]
|
65
|
+
end
|
66
|
+
|
67
|
+
def load_config(options)
|
68
|
+
config_file = options[:config]
|
69
|
+
if config_file && File.exists?(config_file) && File.extname(config_file) == '.rb'
|
70
|
+
logger.info "Load config from #{config_file}"
|
71
|
+
load(config_file)
|
72
|
+
end
|
73
|
+
rescue LoadError => e
|
74
|
+
raise Tumugi::Error, e
|
75
|
+
end
|
76
|
+
|
77
|
+
def set_params(options)
|
78
|
+
if options[:params]
|
79
|
+
@params = options[:params]
|
80
|
+
logger.info "Parameters: #{@params}"
|
81
|
+
end
|
82
|
+
end
|
43
83
|
end
|
44
84
|
end
|
data/lib/tumugi/cli.rb
CHANGED
@@ -8,8 +8,10 @@ module Tumugi
|
|
8
8
|
class << self
|
9
9
|
def common_options
|
10
10
|
option :file, aliases: '-f', desc: 'Task definition file name', required: true
|
11
|
-
option :config, aliases: '-c', desc: 'Configuration file name', default: '
|
11
|
+
option :config, aliases: '-c', desc: 'Configuration file name', default: 'tumugi_config.rb'
|
12
12
|
option :params, aliases: '-p', type: :hash, desc: 'Task parameters'
|
13
|
+
option :quiet, type: :boolean, desc: 'Suppress log', default: false
|
14
|
+
option :verbose, type: :boolean, desc: 'Show verbose log', default: false
|
13
15
|
end
|
14
16
|
|
15
17
|
def exit_on_failure?
|
@@ -25,12 +27,9 @@ module Tumugi
|
|
25
27
|
desc "run TASK", "Run TASK in a workflow"
|
26
28
|
map "run" => "run_" # run is thor's reserved word, so this trick is needed
|
27
29
|
option :workers, aliases: '-w', type: :numeric, desc: 'Number of workers to run task concurrently'
|
28
|
-
option :quiet, type: :boolean, desc: 'Suppress log', default: false
|
29
|
-
option :verbose, type: :boolean, desc: 'Show verbose log', default: false
|
30
30
|
common_options
|
31
31
|
def run_(task)
|
32
|
-
|
33
|
-
Tumugi.application.execute(:run, task, options)
|
32
|
+
execute(:run, task, options)
|
34
33
|
end
|
35
34
|
|
36
35
|
desc "show TASK", "Show DAG of TASK in a workflow"
|
@@ -38,20 +37,22 @@ module Tumugi
|
|
38
37
|
option :out, aliases: '-o', desc: 'Output file name. If not specified, output result to STDOUT'
|
39
38
|
option :format, aliases: '-t', desc: 'Output file format. Only affected --out option is specified.', enum: ['dot', 'png', 'svg']
|
40
39
|
def show(task)
|
41
|
-
|
42
|
-
Tumugi.application.execute(:show, task, options)
|
40
|
+
execute(:show, task, options)
|
43
41
|
end
|
44
42
|
|
45
43
|
private
|
46
44
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
def execute(command, task, options)
|
46
|
+
success = Tumugi.application.execute(command, task, options)
|
47
|
+
unless success
|
48
|
+
Tumugi.logger.error "#{command} command failed"
|
49
|
+
raise Thor::Error, 'failed'
|
51
50
|
end
|
52
|
-
|
53
|
-
|
54
|
-
Tumugi.
|
51
|
+
rescue => e
|
52
|
+
Tumugi.logger.error "#{command} command failed"
|
53
|
+
Tumugi.logger.error "Stacktrace:"
|
54
|
+
e.backtrace.each { |line| Tumugi.logger.error line }
|
55
|
+
raise Thor::Error, 'failed'
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
data/lib/tumugi/command/run.rb
CHANGED
@@ -15,9 +15,6 @@ module Tumugi
|
|
15
15
|
settings = { in_threads: workers }
|
16
16
|
logger = Tumugi.logger
|
17
17
|
|
18
|
-
logger.verbose! if options[:verbose]
|
19
|
-
logger.quiet! if options[:quiet]
|
20
|
-
|
21
18
|
Parallel.each(dag.tsort, settings) do |t|
|
22
19
|
logger.info "start: #{t.id}"
|
23
20
|
until t.ready? || t.requires_failed?
|
@@ -50,7 +47,7 @@ module Tumugi
|
|
50
47
|
end
|
51
48
|
|
52
49
|
show_result_report(dag)
|
53
|
-
|
50
|
+
return !dag.tsort.any? { |t| t.state == :failed }
|
54
51
|
end
|
55
52
|
|
56
53
|
private
|
data/lib/tumugi/command/show.rb
CHANGED
data/lib/tumugi/config.rb
CHANGED
@@ -1,12 +1,51 @@
|
|
1
1
|
module Tumugi
|
2
|
+
class ConfigError < StandardError
|
3
|
+
end
|
4
|
+
|
2
5
|
class Config
|
3
6
|
attr_accessor :workers, :max_retry, :retry_interval, :param_auto_bind_enabled
|
4
7
|
|
8
|
+
@@sections ||= {}
|
9
|
+
|
10
|
+
def self.register_section(name, *args)
|
11
|
+
@@sections[name] = Struct.new(camelize(name), *args)
|
12
|
+
Tumugi.logger.debug "registered config section '#{name}' with '#{args}'"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.camelize(term)
|
16
|
+
string = term.to_s
|
17
|
+
string = string.sub(/^[a-z\d]*/) { $&.capitalize }
|
18
|
+
string.gsub!(/(?:_|(\/))([a-z\d]*)/) { $2.capitalize }
|
19
|
+
string
|
20
|
+
end
|
21
|
+
|
5
22
|
def initialize
|
6
23
|
@workers = 1
|
7
24
|
@max_retry = 3
|
8
25
|
@retry_interval = 300 #seconds
|
9
26
|
@param_auto_bind_enabled = true
|
27
|
+
@section_procs = {}
|
28
|
+
@section_instances = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def section(name, &block)
|
32
|
+
section_class = @@sections[name]
|
33
|
+
if block_given?
|
34
|
+
@section_procs[name] ||= block
|
35
|
+
elsif section_class.nil?
|
36
|
+
raise ConfigError, "Config section '#{name}' is not registered."
|
37
|
+
else
|
38
|
+
@section_instances[name] ||= section_class.new
|
39
|
+
if @section_procs[name]
|
40
|
+
begin
|
41
|
+
@section_procs[name].call(@section_instances[name])
|
42
|
+
rescue NoMethodError => e
|
43
|
+
Tumugi.logger.error "#{e.message}. Available attributes are #{@section_instances[name].members}"
|
44
|
+
raise e
|
45
|
+
end
|
46
|
+
end
|
47
|
+
@section_instances[name]
|
48
|
+
end
|
10
49
|
end
|
11
50
|
end
|
12
51
|
end
|
data/lib/tumugi/error.rb
ADDED
data/lib/tumugi/target.rb
CHANGED
data/lib/tumugi/version.rb
CHANGED
data/tumugi.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.required_ruby_version = '>= 2.
|
21
|
+
spec.required_ruby_version = '>= 2.1'
|
22
22
|
|
23
23
|
spec.add_runtime_dependency 'parallel', '~> 1.8.0'
|
24
24
|
spec.add_runtime_dependency 'retriable', '~> 2.1'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tumugi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kazuyuki Honda
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parallel
|
@@ -182,6 +182,7 @@ files:
|
|
182
182
|
- bin/console
|
183
183
|
- bin/setup
|
184
184
|
- examples/concurrent_task_run.rb
|
185
|
+
- examples/config_section.rb
|
185
186
|
- examples/data_pipeline.rb
|
186
187
|
- examples/fail_first_task.rb
|
187
188
|
- examples/fail_intermediate_task.rb
|
@@ -191,6 +192,7 @@ files:
|
|
191
192
|
- examples/task_inheritance.rb
|
192
193
|
- examples/task_parameter.rb
|
193
194
|
- examples/tumugi_config.rb
|
195
|
+
- examples/tumugi_config_with_section.rb
|
194
196
|
- exe/tumugi
|
195
197
|
- lib/tumugi.rb
|
196
198
|
- lib/tumugi/application.rb
|
@@ -201,6 +203,7 @@ files:
|
|
201
203
|
- lib/tumugi/config.rb
|
202
204
|
- lib/tumugi/dag.rb
|
203
205
|
- lib/tumugi/dsl.rb
|
206
|
+
- lib/tumugi/error.rb
|
204
207
|
- lib/tumugi/file_system.rb
|
205
208
|
- lib/tumugi/file_system_error.rb
|
206
209
|
- lib/tumugi/logger.rb
|
@@ -234,7 +237,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
234
237
|
requirements:
|
235
238
|
- - ">="
|
236
239
|
- !ruby/object:Gem::Version
|
237
|
-
version: '2.
|
240
|
+
version: '2.1'
|
238
241
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
239
242
|
requirements:
|
240
243
|
- - ">="
|