masamune 0.18.1 → 0.18.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00d8f2eadd5197f9d6bc29ea6ad781184a0e6cc0
4
- data.tar.gz: 2916c960c93dba409c0f8cf5f9dc0aab40362c93
3
+ metadata.gz: fb31759e76d58c026aeee2bcf241611e9821da4f
4
+ data.tar.gz: fb82f3c5215527397b742bd0b8108f9f8d58b4c5
5
5
  SHA512:
6
- metadata.gz: 1f214ac8bc7f480c60308ca49c856df221f344b77231cff5b0983ad9b55079c4c3c1ccf8bc2179355b87c2c1626641a76a6138e95489cd858f7e7eb6b919f187
7
- data.tar.gz: b63e53edf5bcd55c059ad38f302baec66c6f0ab7595e216a978888d31c4532cf694e1595f752b55a5d224264cb25d7e507d4f46c1db204a0373d447e70d10883
6
+ metadata.gz: a8c29df50f07a4d7bbc56b66940bbb1b4352ad8d2489740741cabe056803d196375c75c217d28be4d0feabf257f3a1f84788594163467b36885ae6565aa4e1b2
7
+ data.tar.gz: 4e0b4decd60fe42953ccd0ac92c7c4077137e4c85db42e238893e769b86c5f159a94f505b13cc0bc681a20d0b819562afb9c121e6f435e06e9010667c51b9c7b
@@ -35,13 +35,16 @@ module Masamune::Actions
35
35
  end
36
36
 
37
37
  def invoke_parallel(*task_group)
38
- opts = task_group.last.is_a?(Hash) ? task_group.pop.dup : {}
39
- max_tasks = [opts.delete(:max_tasks), task_group.count].min
38
+ per_task_opts = task_group.last.is_a?(Array) ? task_group.pop : [{}]
39
+ all_task_opts = task_group.last.is_a?(Hash) ? task_group.pop : {}
40
+ max_tasks = [all_task_opts.delete(:max_tasks), task_group.count].min
40
41
  console("Setting max_tasks to #{max_tasks}")
41
- bail_fast task_group, opts if opts[:version]
42
- Parallel.each(task_group, in_processes: max_tasks) do |task_name|
42
+ bail_fast task_group, all_task_opts if all_task_opts[:version]
43
+ task_group_by_task_opts = task_group.product(per_task_opts)
44
+ Parallel.each(task_group_by_task_opts, in_processes: max_tasks) do |task_name, task_opts|
45
+ task_env = task_opts[:env] || {}
43
46
  begin
44
- execute(thor_wrapper, task_name, *task_args(opts), interactive: true, detach: false)
47
+ execute(thor_wrapper, task_name, *task_args(all_task_opts.merge(task_opts)), interactive: true, detach: false, env: task_env)
45
48
  rescue SystemExit # rubocop:disable Lint/HandleExceptions
46
49
  end
47
50
  end
@@ -55,12 +58,13 @@ module Masamune::Actions
55
58
 
56
59
  def bail_fast(task_group, opts = {})
57
60
  task_name = task_group.first
58
- execute($PROGRAM_NAME, task_name, *task_args(opts))
61
+ task_env = task_opts[:env] || {}
62
+ execute($PROGRAM_NAME, task_name, *task_args(opts), env: task_env)
59
63
  exit
60
64
  end
61
65
 
62
66
  def task_args(opts = {})
63
- opts.map do |k, v|
67
+ opts.except(:env).map do |k, v|
64
68
  case v
65
69
  when true
66
70
  "--#{k.to_s.tr('_', '-')}"
@@ -21,5 +21,5 @@
21
21
  # THE SOFTWARE.
22
22
 
23
23
  module Masamune
24
- VERSION = '0.18.1'.freeze
24
+ VERSION = '0.18.2'.freeze
25
25
  end
@@ -37,18 +37,29 @@ describe Masamune::Actions::AwsEmr do
37
37
  end
38
38
 
39
39
  describe '.aws_emr' do
40
- before do
41
- mock_command(/\Aaws emr/, mock_success)
40
+ subject(:action) { instance.aws_emr }
41
+
42
+ context 'when success' do
43
+ before do
44
+ mock_command(/\Aaws emr/, mock_success)
45
+ end
46
+
47
+ it { is_expected.to be_success }
42
48
  end
43
49
 
44
- subject { instance.aws_emr }
50
+ context 'when failure' do
51
+ before do
52
+ mock_command(/\Aaws emr/, mock_failure)
53
+ end
45
54
 
46
- it { is_expected.to be_success }
55
+ it { expect { action }.to raise_error RuntimeError, 'fail_fast: aws emr ssh' }
56
+ end
47
57
 
48
58
  context 'with retries and backoff' do
49
59
  before do
50
60
  allow(instance).to receive_message_chain(:configuration, :commands, :aws_emr).and_return(retries: 1, backoff: 10)
51
61
  expect(Masamune::Commands::RetryWithBackoff).to receive(:new).with(anything, hash_including(retries: 1, backoff: 10)).once.and_call_original
62
+ mock_command(/\Aaws emr/, mock_success)
52
63
  end
53
64
 
54
65
  it { is_expected.to be_success }
@@ -31,18 +31,29 @@ describe Masamune::Actions::HadoopFilesystem do
31
31
  let(:instance) { klass.new }
32
32
 
33
33
  describe '.hadoop_filesystem' do
34
- before do
35
- mock_command(/\Ahadoop/, mock_success)
34
+ subject(:action) { instance.hadoop_filesystem }
35
+
36
+ context 'when success' do
37
+ before do
38
+ mock_command(/\Ahadoop/, mock_success)
39
+ end
40
+
41
+ it { is_expected.to be_success }
36
42
  end
37
43
 
38
- subject { instance.hadoop_filesystem }
44
+ context 'when failure' do
45
+ before do
46
+ mock_command(/\Ahadoop/, mock_failure)
47
+ end
39
48
 
40
- it { is_expected.to be_success }
49
+ it { is_expected.not_to be_success }
50
+ end
41
51
 
42
52
  context 'with retries and backoff' do
43
53
  before do
44
54
  allow(instance).to receive_message_chain(:configuration, :commands, :hadoop_filesystem).and_return(retries: 1, backoff: 10)
45
55
  expect(Masamune::Commands::RetryWithBackoff).to receive(:new).with(anything, hash_including(retries: 1, backoff: 10)).once.and_call_original
56
+ mock_command(/\Ahadoop/, mock_success)
46
57
  end
47
58
 
48
59
  it { is_expected.to be_success }
@@ -31,21 +31,33 @@ describe Masamune::Actions::HadoopStreaming do
31
31
  let(:extra) { [] }
32
32
  let(:instance) { klass.new }
33
33
 
34
+ before do
35
+ allow(instance).to receive_message_chain(:configuration, :commands, :hadoop_streaming).and_return({})
36
+ allow(instance).to receive_message_chain(:configuration, :commands, :aws_emr).and_return({})
37
+ end
38
+
34
39
  describe '.hadoop_streaming' do
35
- before do
36
- allow(instance).to receive_message_chain(:configuration, :commands, :hadoop_streaming).and_return({})
37
- allow(instance).to receive_message_chain(:configuration, :commands, :aws_emr).and_return({})
38
- mock_command(/\Ahadoop/, mock_success)
40
+ subject(:action) { instance.hadoop_streaming(extra: extra) }
41
+
42
+ context 'when success' do
43
+ before do
44
+ mock_command(/\Ahadoop/, mock_success)
45
+ end
46
+
47
+ it { is_expected.to be_success }
39
48
  end
40
49
 
41
- subject { instance.hadoop_streaming(extra: extra) }
50
+ context 'when failure' do
51
+ before do
52
+ mock_command(/\Ahadoop/, mock_failure)
53
+ end
42
54
 
43
- it { is_expected.to be_success }
55
+ it { expect { action }.to raise_error RuntimeError, /\Afail_fast: hadoop/ }
56
+ end
44
57
 
45
58
  context 'with cluster_id' do
46
59
  before do
47
60
  allow(instance).to receive_message_chain(:configuration, :commands, :aws_emr).and_return(cluster_id: 'j-XYZ')
48
- mock_command(/\Ahadoop/, mock_failure)
49
61
  mock_command(/\Aaws emr/, mock_success, StringIO.new('ssh fakehost exit'))
50
62
  mock_command(/\Assh fakehost hadoop/, mock_success)
51
63
  end
@@ -58,9 +70,7 @@ describe Masamune::Actions::HadoopStreaming do
58
70
 
59
71
  before do
60
72
  allow(instance).to receive_message_chain(:configuration, :commands, :aws_emr).and_return(cluster_id: 'j-XYZ')
61
- mock_command(/\Ahadoop/, mock_failure)
62
73
  mock_command(/\Aaws emr/, mock_success, StringIO.new('ssh fakehost exit'))
63
- mock_command(/\Assh fakehost -D EXTRA hadoop/, mock_failure)
64
74
  mock_command(/\Assh fakehost hadoop .*? -D EXTRA/, mock_success)
65
75
  end
66
76
 
@@ -71,6 +81,7 @@ describe Masamune::Actions::HadoopStreaming do
71
81
  before do
72
82
  allow(instance).to receive_message_chain(:configuration, :commands, :hadoop_streaming).and_return(retries: 1, backoff: 10)
73
83
  expect(Masamune::Commands::RetryWithBackoff).to receive(:new).with(anything, hash_including(retries: 1, backoff: 10)).once.and_call_original
84
+ mock_command(/\Ahadoop/, mock_success)
74
85
  end
75
86
 
76
87
  it { is_expected.to be_success }
@@ -43,18 +43,27 @@ describe Masamune::Actions::Hive do
43
43
  end
44
44
 
45
45
  describe '.hive' do
46
- before do
47
- mock_command(/\Ahive/, mock_success)
46
+ subject(:action) { instance.hive }
47
+
48
+ context 'when success' do
49
+ before do
50
+ mock_command(/\Ahive/, mock_success)
51
+ end
52
+
53
+ it { is_expected.to be_success }
48
54
  end
49
55
 
50
- subject { instance.hive }
56
+ context 'when failure' do
57
+ before do
58
+ mock_command(/\Ahive/, mock_failure)
59
+ end
51
60
 
52
- it { is_expected.to be_success }
61
+ it { is_expected.not_to be_success }
62
+ end
53
63
 
54
64
  context 'with cluster_id' do
55
65
  before do
56
66
  allow(instance).to receive_message_chain(:configuration, :commands, :aws_emr).and_return(cluster_id: 'j-XYZ')
57
- mock_command(/\Ahive/, mock_failure)
58
67
  mock_command(/\Aaws emr/, mock_success, StringIO.new('ssh fakehost exit'))
59
68
  mock_command(/\Assh fakehost hive/, mock_success)
60
69
  end
@@ -68,6 +77,7 @@ describe Masamune::Actions::Hive do
68
77
  before do
69
78
  allow(instance).to receive_message_chain(:configuration, :commands, :hive).and_return(retries: 1, backoff: 10)
70
79
  expect(Masamune::Commands::RetryWithBackoff).to receive(:new).with(anything, hash_including(retries: 1, backoff: 10)).once.and_call_original
80
+ mock_command(/\Ahive/, mock_success)
71
81
  end
72
82
 
73
83
  it { is_expected.to be_success }
@@ -31,13 +31,54 @@ describe Masamune::Actions::InvokeParallel do
31
31
  let(:instance) { klass.new }
32
32
 
33
33
  describe '.invoke_parallel' do
34
- context 'with a simple thor command' do
34
+ context 'with a single thor command' do
35
35
  before do
36
36
  mock_command(/\Athor list/, mock_success)
37
37
  end
38
38
 
39
39
  subject do
40
- instance.invoke_parallel('list', max_tasks: 1)
40
+ instance.invoke_parallel('list', max_tasks: 0)
41
+ end
42
+
43
+ it { expect { subject }.to_not raise_error }
44
+ end
45
+
46
+ context 'with a single thor command and multiple arguments' do
47
+ before do
48
+ mock_command(/\Athor list --a/, mock_success)
49
+ mock_command(/\Athor list --b/, mock_success)
50
+ end
51
+
52
+ subject do
53
+ instance.invoke_parallel('list', { max_tasks: 0 }, [{ a: true, b: false }, { a: false, b: true }])
54
+ end
55
+
56
+ it { expect { subject }.to_not raise_error }
57
+ end
58
+
59
+ context 'with a single thor command and multiple environments' do
60
+ before do
61
+ mock_command(/\AMASAMUNE_ENV=test_1 thor list/, mock_success)
62
+ mock_command(/\AMASAMUNE_ENV=test_2 thor list/, mock_success)
63
+ end
64
+
65
+ subject do
66
+ instance.invoke_parallel('list', { max_tasks: 0 }, [{ env: { 'MASAMUNE_ENV' => 'test_1' } }, { env: { 'MASAMUNE_ENV' => 'test_2' } }])
67
+ end
68
+
69
+ it { expect { subject }.to_not raise_error }
70
+ end
71
+
72
+ context 'with a multiple thor command and multiple environments' do
73
+ before do
74
+ mock_command(/\AMASAMUNE_ENV=test_1 thor list/, mock_success)
75
+ mock_command(/\AMASAMUNE_ENV=test_2 thor list/, mock_success)
76
+ mock_command(/\AMASAMUNE_ENV=test_1 thor help/, mock_success)
77
+ mock_command(/\AMASAMUNE_ENV=test_2 thor help/, mock_success)
78
+ end
79
+
80
+ subject do
81
+ instance.invoke_parallel('list', 'help', { max_tasks: 0 }, [{ env: { 'MASAMUNE_ENV' => 'test_1' } }, { env: { 'MASAMUNE_ENV' => 'test_2' } }])
41
82
  end
42
83
 
43
84
  it { expect { subject }.to_not raise_error }
@@ -37,7 +37,7 @@ describe Masamune::Actions::PostgresAdmin do
37
37
  let(:action) { :create }
38
38
 
39
39
  before do
40
- mock_command(/\Acreatedb/, mock_success)
40
+ mock_command(/\APGOPTIONS=.* createdb/, mock_success)
41
41
  end
42
42
 
43
43
  it { is_expected.to be_success }
@@ -47,7 +47,7 @@ describe Masamune::Actions::PostgresAdmin do
47
47
  let(:action) { :drop }
48
48
 
49
49
  before do
50
- mock_command(/\Adropdb/, mock_success)
50
+ mock_command(/\APGOPTIONS=.* dropdb/, mock_success)
51
51
  end
52
52
 
53
53
  it { is_expected.to be_success }
@@ -46,18 +46,29 @@ describe Masamune::Actions::Postgres do
46
46
  end
47
47
 
48
48
  describe '.postgres' do
49
- before do
50
- mock_command(/\Apsql/, mock_success)
49
+ subject(:action) { instance.postgres }
50
+
51
+ context 'when success' do
52
+ before do
53
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
54
+ end
55
+
56
+ it { is_expected.to be_success }
51
57
  end
52
58
 
53
- subject { instance.postgres }
59
+ context 'when failure' do
60
+ before do
61
+ mock_command(/\APGOPTIONS=.* psql/, mock_failure)
62
+ end
54
63
 
55
- it { is_expected.to be_success }
64
+ it { is_expected.not_to be_success }
65
+ end
56
66
 
57
67
  context 'with retries and backoff' do
58
68
  before do
59
69
  allow(instance).to receive_message_chain(:configuration, :commands, :postgres).and_return(retries: 1, backoff: 10)
60
70
  expect(Masamune::Commands::RetryWithBackoff).to receive(:new).with(anything, hash_including(retries: 1, backoff: 10)).once.and_call_original
71
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
61
72
  end
62
73
 
63
74
  it { is_expected.to be_success }
@@ -83,7 +83,7 @@ describe Masamune::Actions::Transform do
83
83
  context 'without :map' do
84
84
  before do
85
85
  expect_any_instance_of(Masamune::Schema::Map).to_not receive(:apply)
86
- mock_command(/\Apsql/, mock_success)
86
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
87
87
  end
88
88
 
89
89
  it { is_expected.to be_success }
@@ -104,7 +104,7 @@ describe Masamune::Actions::Transform do
104
104
  end
105
105
 
106
106
  expect_any_instance_of(Masamune::Schema::Map).to receive(:apply).and_call_original
107
- mock_command(/\Apsql/, mock_success)
107
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
108
108
  end
109
109
 
110
110
  it { is_expected.to be_success }
@@ -113,7 +113,7 @@ describe Masamune::Actions::Transform do
113
113
 
114
114
  describe '.relabel_dimension' do
115
115
  before do
116
- mock_command(/\Apsql/, mock_success)
116
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
117
117
  end
118
118
 
119
119
  subject { instance.relabel_dimension(postgres.user_dimension, options) }
@@ -123,7 +123,7 @@ describe Masamune::Actions::Transform do
123
123
 
124
124
  describe '.consolidate_dimension' do
125
125
  before do
126
- mock_command(/\Apsql/, mock_success)
126
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
127
127
  end
128
128
 
129
129
  subject { instance.consolidate_dimension(postgres.user_dimension, options) }
@@ -137,7 +137,7 @@ describe Masamune::Actions::Transform do
137
137
  context 'without :map' do
138
138
  before do
139
139
  expect_any_instance_of(Masamune::Schema::Map).to_not receive(:apply)
140
- mock_command(/\Apsql/, mock_success)
140
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
141
141
  end
142
142
 
143
143
  subject { instance.load_fact(source_file, postgres.visits_hourly_file, postgres.visits_hourly_fact, date, options) }
@@ -152,7 +152,7 @@ describe Masamune::Actions::Transform do
152
152
  end
153
153
 
154
154
  expect_any_instance_of(Masamune::Schema::Map).to receive(:apply).and_call_original
155
- mock_command(/\Apsql/, mock_success)
155
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
156
156
  end
157
157
 
158
158
  subject { instance.load_fact(source_file, postgres.visits_hourly_file, postgres.visits_hourly_fact, date, options) }
@@ -165,7 +165,7 @@ describe Masamune::Actions::Transform do
165
165
  let(:date) { DateTime.civil(2014, 8) }
166
166
 
167
167
  before do
168
- mock_command(/\Apsql/, mock_success)
168
+ mock_command(/\APGOPTIONS=.* psql/, mock_success)
169
169
  end
170
170
 
171
171
  subject { instance.rollup_fact(postgres.visits_hourly_fact, postgres.visits_daily_fact, date, options) }
@@ -46,11 +46,21 @@ module Masamune::MockCommand
46
46
  def reset!
47
47
  @patterns = {}
48
48
  end
49
+
50
+ def match(pattern)
51
+ # nop
52
+ end
53
+ end
54
+
55
+ def command_env_and_args
56
+ command_env = @delegate.respond_to?(:command_env) ? @delegate.command_env.map { |key, val| "#{key}=#{val}" } : []
57
+ (command_env + @delegate.command_args).join(' ')
49
58
  end
50
59
 
51
60
  def around_execute(&block)
52
61
  self.class.patterns.each do |pattern, (value, io)|
53
- next unless @delegate.command_args.join(' ') =~ pattern
62
+ next unless command_env_and_args =~ pattern
63
+ CommandMatcher.match(pattern)
54
64
  until io.eof?
55
65
  line = io.gets
56
66
  line_no ||= 0
@@ -90,6 +100,7 @@ module Masamune::MockCommand
90
100
  end
91
101
 
92
102
  def mock_command(pattern, value = nil, io = StringIO.new, &block)
103
+ expect(CommandMatcher).to receive(:match).with(pattern)
93
104
  CommandMatcher.add_pattern(pattern, block_given? ? block.to_proc : value, io, &block)
94
105
  end
95
106
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: masamune
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 0.18.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Andrews
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-10 00:00:00.000000000 Z
11
+ date: 2016-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor