masamune 0.14.0 → 0.15.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -1
  3. data/Rakefile +37 -0
  4. data/bin/masamune-dump +22 -0
  5. data/bin/masamune-elastic-mapreduce +22 -0
  6. data/bin/masamune-hive +22 -0
  7. data/bin/masamune-psql +22 -0
  8. data/bin/masamune-shell +22 -0
  9. data/lib/masamune/cached_filesystem.rb +1 -1
  10. data/lib/masamune/commands/shell.rb +1 -1
  11. data/lib/masamune/configuration.rb +5 -7
  12. data/lib/masamune/data_plan/elem.rb +15 -7
  13. data/lib/masamune/data_plan/engine.rb +2 -0
  14. data/lib/masamune/data_plan/rule.rb +16 -5
  15. data/lib/masamune/data_plan/set.rb +8 -8
  16. data/lib/masamune/filesystem.rb +12 -6
  17. data/lib/masamune/schema/catalog.rb +6 -6
  18. data/lib/masamune/schema/column.rb +1 -1
  19. data/lib/masamune/schema/map.rb +6 -2
  20. data/lib/masamune/schema/store.rb +31 -3
  21. data/lib/masamune/tasks/shell_thor.rb +1 -1
  22. data/lib/masamune/thor.rb +12 -4
  23. data/lib/masamune/version.rb +1 -1
  24. data/lib/masamune.rb +0 -1
  25. data/spec/masamune/actions/elastic_mapreduce_spec.rb +0 -2
  26. data/spec/masamune/actions/execute_spec.rb +0 -2
  27. data/spec/masamune/actions/hadoop_filesystem_spec.rb +0 -2
  28. data/spec/masamune/actions/hadoop_streaming_spec.rb +0 -2
  29. data/spec/masamune/actions/hive_spec.rb +0 -2
  30. data/spec/masamune/actions/invoke_parallel_spec.rb +0 -2
  31. data/spec/masamune/actions/postgres_admin_spec.rb +0 -2
  32. data/spec/masamune/actions/postgres_spec.rb +0 -2
  33. data/spec/masamune/actions/s3cmd_spec.rb +0 -2
  34. data/spec/masamune/actions/transform_spec.rb +0 -2
  35. data/spec/masamune/after_initialization_callbacks_spec.rb +0 -2
  36. data/spec/masamune/cached_filesystem_spec.rb +0 -2
  37. data/spec/masamune/commands/hadoop_filesystem_spec.rb +0 -2
  38. data/spec/masamune/commands/hadoop_streaming_spec.rb +0 -2
  39. data/spec/masamune/commands/hive_spec.rb +0 -2
  40. data/spec/masamune/commands/postgres_admin_spec.rb +0 -2
  41. data/spec/masamune/commands/postgres_spec.rb +0 -2
  42. data/spec/masamune/commands/retry_with_backoff_spec.rb +0 -2
  43. data/spec/masamune/commands/s3cmd_spec.rb +0 -2
  44. data/spec/masamune/commands/shell_spec.rb +0 -2
  45. data/spec/masamune/configuration_spec.rb +12 -2
  46. data/spec/masamune/data_plan/builder_spec.rb +0 -2
  47. data/spec/masamune/data_plan/elem_spec.rb +73 -5
  48. data/spec/masamune/data_plan/engine_spec.rb +0 -2
  49. data/spec/masamune/data_plan/rule_spec.rb +51 -6
  50. data/spec/masamune/data_plan/set_spec.rb +2 -5
  51. data/spec/masamune/environment_spec.rb +0 -2
  52. data/spec/masamune/filesystem_spec.rb +33 -4
  53. data/spec/masamune/helpers/postgres_spec.rb +0 -2
  54. data/spec/masamune/rspec/job_fixture_spec.rb +365 -0
  55. data/spec/masamune/rspec/shared_example_group_spec.rb +73 -0
  56. data/spec/masamune/schema/catalog_spec.rb +14 -2
  57. data/spec/masamune/schema/column_spec.rb +0 -2
  58. data/spec/masamune/schema/dimension_spec.rb +0 -2
  59. data/spec/masamune/schema/fact_spec.rb +0 -2
  60. data/spec/masamune/schema/map_spec.rb +51 -2
  61. data/spec/masamune/schema/row_spec.rb +0 -2
  62. data/spec/masamune/schema/store_spec.rb +23 -2
  63. data/spec/masamune/schema/table_spec.rb +0 -2
  64. data/spec/masamune/string_format_spec.rb +0 -2
  65. data/spec/masamune/tasks/dump_thor_spec.rb +0 -3
  66. data/spec/masamune/tasks/elastic_mapreduce_thor_spec.rb +0 -3
  67. data/spec/masamune/tasks/hive_thor_spec.rb +0 -3
  68. data/spec/masamune/tasks/postgres_thor_spec.rb +0 -3
  69. data/spec/masamune/tasks/shell_thor_spec.rb +0 -3
  70. data/spec/masamune/template_spec.rb +0 -2
  71. data/spec/masamune/thor_spec.rb +53 -8
  72. data/spec/masamune/transform/bulk_upsert.dimension_spec.rb +0 -2
  73. data/spec/masamune/transform/consolidate_dimension_spec.rb +0 -2
  74. data/spec/masamune/transform/deduplicate_dimension_spec.rb +0 -2
  75. data/spec/masamune/transform/define_schema_spec.rb +0 -2
  76. data/spec/masamune/transform/define_table.dimension_spec.rb +0 -2
  77. data/spec/masamune/transform/define_table.fact_spec.rb +0 -2
  78. data/spec/masamune/transform/define_table.table_spec.rb +0 -2
  79. data/spec/masamune/transform/denormalize_table_spec.rb +0 -2
  80. data/spec/masamune/transform/insert_reference_values.dimension_spec.rb +0 -2
  81. data/spec/masamune/transform/insert_reference_values.fact_spec.rb +0 -2
  82. data/spec/masamune/transform/load_dimension_spec.rb +0 -2
  83. data/spec/masamune/transform/load_fact_spec.rb +0 -2
  84. data/spec/masamune/transform/relabel_dimension_spec.rb +0 -2
  85. data/spec/masamune/transform/rollup_fact_spec.rb +0 -2
  86. data/spec/masamune/transform/snapshot_dimension_spec.rb +0 -2
  87. data/spec/masamune/transform/stage_dimension_spec.rb +0 -2
  88. data/spec/masamune/transform/stage_fact_spec.rb +0 -2
  89. data/spec/masamune_spec.rb +0 -2
  90. data/spec/spec_helper.rb +2 -0
  91. data/spec/support/masamune/job_example_group.rb +62 -0
  92. data/spec/support/masamune/job_fixture.rb +137 -0
  93. data/spec/support/masamune/shared_example_group.rb +203 -0
  94. data/spec/support/masamune/step_example_group.rb +68 -0
  95. data/spec/support/masamune/step_fixture.rb +91 -0
  96. data/{lib/masamune/thor_loader.rb → spec/support/masamune/task_example_group.rb} +33 -10
  97. data/spec/support/rspec/example/action_example_group.rb +1 -1
  98. metadata +32 -3
@@ -0,0 +1,203 @@
1
+ # The MIT License (MIT)
2
+ #
3
+ # Copyright (c) 2014-2015, VMware, Inc. All Rights Reserved.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ module Masamune::SharedExampleGroup
24
+ extend ActiveSupport::Concern
25
+
26
+ def capture_popen(cmd, stdin)
27
+ stdout = StringIO.new
28
+ IO.popen(cmd, 'r+') do |io|
29
+ io.sync = true
30
+ io.write stdin
31
+ io.close_write
32
+ while !io.eof?
33
+ stdout << io.read
34
+ end
35
+ end
36
+ stdout.string
37
+ end
38
+
39
+ def capture_output
40
+ @stdout, @stderr = StringIO.new, StringIO.new
41
+ tmp_stdout, $stdout = $stdout, @stdout
42
+ tmp_stderr, $stderr = $stderr, @stderr
43
+ yield
44
+ rescue SystemExit => e
45
+ @status = e.status
46
+ ensure
47
+ $stdout, $stderr = tmp_stdout, tmp_stderr
48
+ end
49
+
50
+ def capture(enable = true)
51
+ if enable
52
+ capture_output do
53
+ yield
54
+ end
55
+ else
56
+ yield
57
+ end
58
+ end
59
+
60
+ def with_delim(data, delim = nil)
61
+ return data unless delim
62
+ case delim
63
+ when Hash
64
+ delim.each do |from, to|
65
+ data.gsub!(from, to)
66
+ end
67
+ when Array
68
+ data.gsub!(*delim)
69
+ end
70
+ data
71
+ end
72
+
73
+ def load_example_config!
74
+ filesystem.add_path(:current_dir, self.class.example_current_dir) if self.class.example_current_dir
75
+ environment.configuration.load(self.class.example_default_config) if self.class.example_default_config
76
+ end
77
+
78
+ # TODO: iterate over databases
79
+ def clean_example_run!
80
+ if configuration.postgres[:clean]
81
+ postgres_admin(action: :drop, database: configuration.postgres[:database])
82
+ postgres_admin(action: :create, database: configuration.postgres[:database])
83
+ postgres(file: define_schema(catalog, :postgres).to_file, retries: 0)
84
+ end
85
+ filesystem.paths.each do |_, (path, options)|
86
+ filesystem.remove_dir(path) if options[:clean]
87
+ end
88
+ end
89
+
90
+ # TODO encapsulate commands as runners
91
+ def setup_example_input!(fixture)
92
+ fixture.inputs.each do |input|
93
+ if input['file']
94
+ filesystem.write(with_delim(input['data'], input['delim']), input['file'])
95
+ end
96
+
97
+ if input['hive']
98
+ hive(exec: input['hive'])
99
+ end
100
+
101
+ if input['psql']
102
+ Tempfile.open('etl') do |tmp|
103
+ tmp.write(input['psql'])
104
+ tmp.flush
105
+ postgres(file: tmp.path)
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ def gather_example_output(fixture)
112
+ fail "No outputs defined for #{fixture.file_name}" if fixture.outputs.none?
113
+ fixture.outputs.each do |output|
114
+ output_file = output['file'] || Tempfile.new('masamune').path
115
+
116
+ execute_output_command(output, output_file)
117
+ next unless output['data']
118
+ actual_data = File.read(output_file).strip
119
+ expect_data = with_delim(output['data'].strip, output['delim']).strip
120
+ if output['order'] == 'random'
121
+ actual_data = actual_data.split("\n").sort.join("\n")
122
+ expect_data = expect_data.split("\n").sort.join("\n")
123
+ end
124
+ yield [actual_data, output_file, expect_data]
125
+ FileUtils.rm(output_file) if File.exists?(output_file)
126
+ end
127
+ end
128
+
129
+ def execute_output_command(output, output_file)
130
+ if output['hive'] && output['hive'].is_a?(String)
131
+ # FIXME: Replace with exec once SBI-530 is fixed
132
+ Tempfile.open('etl') do |tmp|
133
+ tmp.write(output['hive'])
134
+ tmp.flush
135
+ hive(file: tmp.path, output: output_file)
136
+ end
137
+ elsif output['table']
138
+ table = eval "catalog.#{output['table']}"
139
+ query = denormalize_table(table, output.slice('columns', 'order', 'except', 'include')).to_s
140
+ # FIXME: define format based on table.store.format
141
+ case table.store.type
142
+ when :postgres
143
+ postgres(exec: query, csv: true, output: output_file)
144
+ when :hive
145
+ # FIXME: Replace with exec once SBI-530 is fixed
146
+ Tempfile.open('etl') do |tmp|
147
+ tmp.write(query)
148
+ tmp.flush
149
+ hive(file: tmp.path, output: output_file)
150
+ end
151
+ else
152
+ raise "'table' output not supported for #{output['table']}"
153
+ end
154
+ elsif output['hive'] && output['hive'].is_a?(Hash)
155
+ hive(file: example_file(output['hive']['file']), output: output_file)
156
+ elsif output['psql'] && output['psql'].is_a?(String)
157
+ postgres(exec: output['psql'], csv: true, output: output_file)
158
+ elsif output['psql'] && output['psql'].is_a?(Hash)
159
+ postgres(file: example_file(output['psql']['file']), variables: output['psql'].fetch('variables', {}), csv: true, output: output_file)
160
+ end
161
+ end
162
+
163
+ def example_fixture(options = {})
164
+ Masamune::JobFixture.load(options.merge(type: self.class.example_type), binding)
165
+ end
166
+
167
+ module ClassMethods
168
+ def example_current_dir
169
+ example_file_path_info[:current_dir]
170
+ end
171
+
172
+ def example_default_config
173
+ return unless respond_to?(:described_class)
174
+ return unless described_class.respond_to?(:class_options)
175
+ described_class.class_options[:config].try(:default)
176
+ end
177
+
178
+ def example_fixture_file(options = {})
179
+ Masamune::JobFixture.file_name(options.merge(path: File.dirname(file_path), type: example_type))
180
+ end
181
+
182
+ def example_step
183
+ return unless respond_to?(:description)
184
+ File.join(example_current_dir, description)
185
+ end
186
+
187
+ def example_type
188
+ example_file_path_info[:example_type]
189
+ end
190
+
191
+ private
192
+
193
+ EXAMPLE_FILE_PATH_INFO = %r{(?<current_dir>.*?)/spec/((?<example_name>\w+)_)?(?<example_type>\w+)_spec\.rb\z}
194
+ def example_file_path_info
195
+ return {} unless respond_to?(:file_path)
196
+ @example_file_path_info ||= EXAMPLE_FILE_PATH_INFO.match(file_path) || {}
197
+ end
198
+
199
+ def example_name
200
+ example_file_path_info[:example_name]
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,68 @@
1
+ # The MIT License (MIT)
2
+ #
3
+ # Copyright (c) 2014-2015, VMware, Inc. All Rights Reserved.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ module Masamune::StepExampleGroup
24
+ module StepFixtureContext
25
+ shared_context 'step_fixture' do |context_options = {}|
26
+ fixture_file = example_fixture_file(context_options.slice(:fixture, :file, :path))
27
+ step_file = example_step
28
+
29
+ args = context_options[:args]
30
+ subject do
31
+ capture_popen([step_file, args].compact.join(' '), input)
32
+ end
33
+
34
+ context "with #{fixture_file} fixture" do
35
+ let(:fixture) { Masamune::StepFixture.load({file: fixture_file}, binding) }
36
+
37
+ let(:input) { fixture.input }
38
+ let(:output) { fixture.output }
39
+
40
+ it 'should match output' do
41
+ is_expected.to eq(output)
42
+ end
43
+
44
+ after(:each) do |example|
45
+ if example.exception && ENV['MASAMUNE_RECORD']
46
+ shell = Thor::Shell::Basic.new
47
+ shell.say(example.exception)
48
+ if shell.yes?('Save recording?')
49
+ fixture.output = subject
50
+ fixture.save
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ def self.included(base)
59
+ base.send(:include, Masamune::SharedExampleGroup)
60
+ base.send(:include, StepFixtureContext)
61
+ end
62
+ end
63
+
64
+ RSpec.configure do |config|
65
+ config.include Masamune::StepExampleGroup, :type => :step, :file_path => %r{.*/spec/.*step_spec\.rb}
66
+ config.include Masamune::StepExampleGroup, :type => :step, :file_path => %r{.*/spec/.*mapper_spec\.rb}
67
+ config.include Masamune::StepExampleGroup, :type => :step, :file_path => %r{.*/spec/.*reducer_spec\.rb}
68
+ end
@@ -0,0 +1,91 @@
1
+ # The MIT License (MIT)
2
+ #
3
+ # Copyright (c) 2014-2015, VMware, Inc. All Rights Reserved.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require 'active_support/core_ext/string/indent'
24
+
25
+ module Masamune
26
+ class StepFixture
27
+ INDENT = 2
28
+
29
+ def initialize(options = {})
30
+ @file = options[:file]
31
+ @data = options[:data]
32
+ @type = options[:type] || 'step'
33
+
34
+ @data['input'] ||= []
35
+ @data['output'] ||= []
36
+ end
37
+
38
+ class << self
39
+ def load(options = {}, context = binding)
40
+ file = options[:file]
41
+ raise ArgumentError, "Fixture '#{file}' does not exist" unless File.exists?(file)
42
+ YAML.load(ERB.new(File.read(file)).result(context)).tap do |data|
43
+ return new(options.merge(data: data))
44
+ end
45
+ end
46
+
47
+ protected
48
+
49
+ def suffix(options = {})
50
+ "#{options[:type] || 'step'}_fixture.yml"
51
+ end
52
+ end
53
+
54
+ def file_name
55
+ @file
56
+ end
57
+
58
+ def path
59
+ @path || File.dirname(@file)
60
+ end
61
+
62
+ def save
63
+ FileUtils.mkdir_p(path)
64
+ File.open(file_name, 'w') do |file|
65
+ file.puts '---'
66
+ file.puts 'input: |'
67
+ @data['input'].split("\n").each do |line|
68
+ file.puts line.indent(INDENT)
69
+ end
70
+ file.puts
71
+ file.puts 'output: |'
72
+ @data['output'].split("\n").each do |line|
73
+ file.puts line.indent(INDENT)
74
+ end
75
+ end
76
+ file_name
77
+ end
78
+
79
+ def input
80
+ @data['input']
81
+ end
82
+
83
+ def output
84
+ @data['output']
85
+ end
86
+
87
+ def output=(output)
88
+ @data['output'] = output
89
+ end
90
+ end
91
+ end
@@ -20,19 +20,42 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
21
  # THE SOFTWARE.
22
22
 
23
- module Masamune
24
- module ThorLoader
25
- def self.load_default_tasks
26
- Masamune::ThorLoader.load_thorfiles(File.expand_path('../../../lib/masamune/tasks', __FILE__))
27
- end
23
+ module Masamune::TaskExampleGroup
24
+ module TaskFixtureContent
25
+ shared_context 'task_fixture' do |context_options = {}|
26
+ include_context 'job_fixture', context_options
27
+ let!(:default_options) { configuration.as_options }
28
+
29
+ let(:stdout) { @stdout }
30
+ let(:stderr) { @stderr }
31
+ let(:status) { @status }
28
32
 
29
- def self.load_thorfiles(dir)
30
- Dir.chdir(dir) do
31
- thor_files = Dir.glob('**/*.rb').delete_if { |x| not File.file?(x) }
32
- thor_files.each do |f|
33
- ::Thor::Util.load_thorfile(f)
33
+ let(:command) { nil }
34
+ let(:options) { [] }
35
+
36
+ subject(:execute_command) do
37
+ n = context_options.fetch(:idempotent, false) ? 2 : 1
38
+ n = 1 if ENV['MASAMUNE_FASTER_SPEC']
39
+ capture(!default_options.include?('--debug')) do
40
+ n.times do
41
+ Array.wrap(command).each do |cmd|
42
+ described_class.start([cmd, *(default_options + options)].compact)
43
+ end
44
+ end
34
45
  end
35
46
  end
36
47
  end
37
48
  end
49
+
50
+ def self.included(base)
51
+ base.send(:include, Masamune::ExampleGroup)
52
+ base.send(:include, Masamune::Actions::Filesystem)
53
+ base.send(:include, Masamune::Actions::Hive)
54
+ base.send(:include, Masamune::Transform::DenormalizeTable)
55
+ base.send(:include, TaskFixtureContent)
56
+ end
57
+ end
58
+
59
+ RSpec.configure do |config|
60
+ config.include Masamune::TaskExampleGroup, :type => :task, :file_path => %r{.*/spec/.*task_spec\.rb}
38
61
  end
@@ -24,7 +24,7 @@ module ActionExampleGroup
24
24
  def self.included(base)
25
25
  base.let(:run_dir) { Dir.mktmpdir('masamune') }
26
26
  base.before do
27
- Masamune.filesystem.add_path(:run_dir, run_dir)
27
+ Masamune::ExampleGroup.filesystem.add_path(:run_dir, run_dir)
28
28
  end
29
29
  end
30
30
  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.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Andrews
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-22 00:00:00.000000000 Z
11
+ date: 2015-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.9'
153
+ - !ruby/object:Gem::Dependency
154
+ name: user_agent_parser
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: rspec
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -262,7 +276,6 @@ files:
262
276
  - lib/masamune/tasks/shell_thor.rb
263
277
  - lib/masamune/template.rb
264
278
  - lib/masamune/thor.rb
265
- - lib/masamune/thor_loader.rb
266
279
  - lib/masamune/topological_hash.rb
267
280
  - lib/masamune/transform.rb
268
281
  - lib/masamune/transform/bulk_upsert.rb
@@ -351,6 +364,8 @@ files:
351
364
  - spec/masamune/environment_spec.rb
352
365
  - spec/masamune/filesystem_spec.rb
353
366
  - spec/masamune/helpers/postgres_spec.rb
367
+ - spec/masamune/rspec/job_fixture_spec.rb
368
+ - spec/masamune/rspec/shared_example_group_spec.rb
354
369
  - spec/masamune/schema/catalog_spec.rb
355
370
  - spec/masamune/schema/column_spec.rb
356
371
  - spec/masamune/schema/dimension_spec.rb
@@ -387,9 +402,15 @@ files:
387
402
  - spec/masamune_spec.rb
388
403
  - spec/spec_helper.rb
389
404
  - spec/support/masamune/example_group.rb
405
+ - spec/support/masamune/job_example_group.rb
406
+ - spec/support/masamune/job_fixture.rb
390
407
  - spec/support/masamune/mock_command.rb
391
408
  - spec/support/masamune/mock_delegate.rb
392
409
  - spec/support/masamune/mock_filesystem.rb
410
+ - spec/support/masamune/shared_example_group.rb
411
+ - spec/support/masamune/step_example_group.rb
412
+ - spec/support/masamune/step_fixture.rb
413
+ - spec/support/masamune/task_example_group.rb
393
414
  - spec/support/masamune/thor_mute.rb
394
415
  - spec/support/rspec/example/action_example_group.rb
395
416
  - spec/support/rspec/example/task_example_group.rb
@@ -454,6 +475,8 @@ test_files:
454
475
  - spec/masamune/environment_spec.rb
455
476
  - spec/masamune/filesystem_spec.rb
456
477
  - spec/masamune/helpers/postgres_spec.rb
478
+ - spec/masamune/rspec/job_fixture_spec.rb
479
+ - spec/masamune/rspec/shared_example_group_spec.rb
457
480
  - spec/masamune/schema/catalog_spec.rb
458
481
  - spec/masamune/schema/column_spec.rb
459
482
  - spec/masamune/schema/dimension_spec.rb
@@ -490,9 +513,15 @@ test_files:
490
513
  - spec/masamune_spec.rb
491
514
  - spec/spec_helper.rb
492
515
  - spec/support/masamune/example_group.rb
516
+ - spec/support/masamune/job_example_group.rb
517
+ - spec/support/masamune/job_fixture.rb
493
518
  - spec/support/masamune/mock_command.rb
494
519
  - spec/support/masamune/mock_delegate.rb
495
520
  - spec/support/masamune/mock_filesystem.rb
521
+ - spec/support/masamune/shared_example_group.rb
522
+ - spec/support/masamune/step_example_group.rb
523
+ - spec/support/masamune/step_fixture.rb
524
+ - spec/support/masamune/task_example_group.rb
496
525
  - spec/support/masamune/thor_mute.rb
497
526
  - spec/support/rspec/example/action_example_group.rb
498
527
  - spec/support/rspec/example/task_example_group.rb