gd_bam 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/bin/bam CHANGED
@@ -49,14 +49,14 @@ command :sf_jack_in do |c|
49
49
  end
50
50
  end
51
51
 
52
- desc 'Jacks into project.'
53
- # arg_name 'Describe arguments to new here'
54
- command :project_jack_in do |c|
55
-
56
- c.action do |global_options,options,args|
57
- GoodData::Bam::Commands::project_jack_in(PARAMS)
58
- end
59
- end
52
+ # desc 'Jacks into project.'
53
+ # # arg_name 'Describe arguments to new here'
54
+ # command :project_jack_in do |c|
55
+ #
56
+ # c.action do |global_options,options,args|
57
+ # GoodData::Bam::Commands::project_jack_in(PARAMS)
58
+ # end
59
+ # end
60
60
 
61
61
 
62
62
  desc 'Validatates connection to SalesForce.'
@@ -125,6 +125,26 @@ command :generate_downloaders do |c|
125
125
  end
126
126
  end
127
127
 
128
+ command :generate_history_downloaders do |c|
129
+
130
+ c.desc 's3 backup'
131
+ c.arg_name 'backup'
132
+ c.flag :backup
133
+
134
+ c.action do |global_options,options,args|
135
+ params = global_options[:user_params]
136
+ params = PARAMS.merge({
137
+ :project_name => "downloaders-#{PARAMS[:project_name]}",
138
+ :graph_repos => [
139
+ GoodData::Bam::Repository.create(:type => :file, :base => './local_graphs'),
140
+ GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)]
141
+ })
142
+ GoodData::Bam::Commands::generate_history_downloaders(".", params)
143
+ end
144
+ end
145
+
146
+
147
+
128
148
  desc 'Validates that the tap has the fields it is claimed it should have. This is supposed to make the mitigate errors during deploy.'
129
149
  # arg_name 'Describe arguments to new here'
130
150
  command :sf_taps_validate do |c|
@@ -269,7 +289,7 @@ command :model_sync do |c|
269
289
  c.switch :dry
270
290
 
271
291
  c.action do |global_options,options,args|
272
- GoodData::Bam::Commands::model_sync(options)
292
+ GoodData::Bam::Commands::model_sync('.', options)
273
293
  end
274
294
  end
275
295
 
data/bin/bam.orig ADDED
@@ -0,0 +1,375 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gli'
3
+ require 'bam'
4
+
5
+ include GLI::App
6
+
7
+ program_desc 'Describe your application here'
8
+
9
+ version Bam::VERSION
10
+
11
+ # desc 'Describe some switch here'
12
+ # switch [:s,:switch]
13
+ #
14
+ desc 'Verbose'
15
+ default_value false
16
+ arg_name 'verbose'
17
+ switch [:v,:verbose]
18
+
19
+ desc 'Http logger'
20
+ default_value false
21
+ arg_name 'logger'
22
+ switch [:l,:logger]
23
+
24
+ desc 'Generates clover project based on information in current directory. The default ouptut is the directory ./clover-project'
25
+ # arg_name 'Describe arguments to new here'
26
+ command :generate do |c|
27
+
28
+ c.desc 'generate only specified flow'
29
+ c.arg_name 'only'
30
+ c.flag :only
31
+
32
+ c.action do |global_options,options,args|
33
+ params = PARAMS.merge(options).merge({
34
+ :project_name => "etl-#{PARAMS[:project_name]}",
35
+ :graph_repos => [
36
+ GoodData::Bam::Repository.create(:type => :file, :base => Pathname('./local_graphs').expand_path),
37
+ GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)
38
+ ]})
39
+ GoodData::Bam::Commands::generate('.', params)
40
+ end
41
+ end
42
+
43
+ desc 'Jacks into SF.'
44
+ # arg_name 'Describe arguments to new here'
45
+ command :sf_jack_in do |c|
46
+
47
+ c.action do |global_options,options,args|
48
+ GoodData::Bam::Commands::sf_jack_in(PARAMS)
49
+ end
50
+ end
51
+
52
+ # desc 'Jacks into project.'
53
+ # # arg_name 'Describe arguments to new here'
54
+ # command :project_jack_in do |c|
55
+ #
56
+ # c.action do |global_options,options,args|
57
+ # GoodData::Bam::Commands::project_jack_in(PARAMS)
58
+ # end
59
+ # end
60
+
61
+
62
+ desc 'Validatates connection to SalesForce.'
63
+ # arg_name 'Describe arguments to new here'
64
+ command :sf_validate_connection do |c|
65
+
66
+ c.action do |global_options,options,args|
67
+ GoodData::Bam::Commands::sf_validate_connection(PARAMS)
68
+ end
69
+ end
70
+
71
+
72
+ desc 'Generate data validator.'
73
+ # arg_name 'Describe arguments to new here'
74
+ command :generate_validator do |c|
75
+ c.action do |global_options,options,args|
76
+ GoodData::Bam::Commands::generate_validators('.', PARAMS.merge(options).merge({
77
+ :project_name => "validator-#{PARAMS[:project_name]}",
78
+ :graph_repos => [
79
+ GoodData::Bam::Repository.create(:type => :file, :base => './local_graphs'),
80
+ GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)
81
+ ]
82
+ }))
83
+ end
84
+ end
85
+
86
+ desc 'Run data validator.'
87
+ # arg_name 'Describe arguments to new here'
88
+ command :run_validator do |c|
89
+
90
+ c.desc 'Checker process ID'
91
+ c.arg_name 'process'
92
+ c.flag :process
93
+
94
+ c.action do |global_options,options,args|
95
+ process = options[:process]
96
+ files = args.map {|f| Pathname(f)}
97
+ files.each do |f|
98
+ fail "Provded file \"#{f}\" does not exist." unless File.exist?(f)
99
+ end
100
+ fail "You need to specify process" if process.blank?
101
+
102
+ GoodData::Bam::Commands::connect_to_gd()
103
+ GoodData::Bam::Commands::run_validator(process, files, PARAMS)
104
+ end
105
+ end
106
+
107
+
108
+ desc 'Generates clover project for downloaders.'
109
+ # arg_name 'Describe arguments to new here'
110
+ command :generate_downloaders do |c|
111
+
112
+ c.desc 's3 backup'
113
+ c.arg_name 'backup'
114
+ c.flag :backup
115
+
116
+ c.action do |global_options,options,args|
117
+ params = global_options[:user_params]
118
+ params = PARAMS.merge({
119
+ :project_name => "downloaders-#{PARAMS[:project_name]}",
120
+ :graph_repos => [
121
+ GoodData::Bam::Repository.create(:type => :file, :base => './local_graphs'),
122
+ GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)]
123
+ })
124
+ GoodData::Bam::Commands::generate_downloaders(".", params)
125
+ end
126
+ end
127
+
128
+ command :generate_history_downloaders do |c|
129
+
130
+ c.desc 's3 backup'
131
+ c.arg_name 'backup'
132
+ c.flag :backup
133
+
134
+ c.action do |global_options,options,args|
135
+ params = global_options[:user_params]
136
+ params = PARAMS.merge({
137
+ :project_name => "downloaders-#{PARAMS[:project_name]}",
138
+ :graph_repos => [
139
+ GoodData::Bam::Repository.create(:type => :file, :base => './local_graphs'),
140
+ GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)]
141
+ })
142
+ <<<<<<< HEAD
143
+ GoodData::Bam::Commands::generate_downloaders(".", params)
144
+ =======
145
+ GoodData::Bam::Commands::generate_history_downloaders(".", params)
146
+ >>>>>>> Added historical SF downloader
147
+ end
148
+ end
149
+
150
+
151
+
152
+ desc 'Validates that the tap has the fields it is claimed it should have. This is supposed to make the mitigate errors during deploy.'
153
+ # arg_name 'Describe arguments to new here'
154
+ command :sf_taps_validate do |c|
155
+ c.action do |global_options,options,args|
156
+ verbose = global_options[:v]
157
+ params = PARAMS.merge({
158
+ :graph_repos => [
159
+ GoodData::Bam::Repository.create(:type => :file, :base => './local_graphs'),
160
+ GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)]})
161
+ result = GoodData::Bam::Commands::validate_sf_taps(params)
162
+
163
+ error = false
164
+ result.each_pair do |obj, fields|
165
+ if fields.empty?
166
+ puts HighLine::color("GOOD", :green) + " #{obj}"
167
+ else
168
+ error = true
169
+ puts HighLine::color("BAD", :red) + " #{obj} [" + fields.join(', ') + "]"
170
+ end
171
+ end
172
+ exit_now!("Errors found",exit_code=1) if error
173
+ end
174
+ end
175
+
176
+ desc "Prepares params.prm file for debugging that particular graph"
177
+ command :debug do |c|
178
+ c.action do |global_options,options,args|
179
+ fail "Arguments should be passed as \"project\" \"flow\" \"graph\"" if args.length < 3
180
+ GoodData::Bam::Commands::set_up_debug(args.first, args[1], args[2])
181
+ end
182
+ end
183
+
184
+ desc 'Validates that the tap has the fields it is claimed it should have. This is supposed to make the mitigate errors during deploy.'
185
+ # arg_name 'Describe arguments to new here'
186
+ command :docs do |c|
187
+ c.action do |global_options,options,args|
188
+ GoodData::Bam::Commands::generate_docs
189
+ end
190
+ end
191
+
192
+ desc 'Lists processes for the project.'
193
+ # arg_name 'Describe arguments to new here'
194
+ command :procs do |c|
195
+
196
+ c.desc 'procs for all projects'
197
+ c.arg_name 'all'
198
+ c.switch :all
199
+
200
+ c.action do |global_options,options,args|
201
+ out = GoodData::Bam::Commands::procs_list(options)
202
+ out.each do |proc|
203
+ puts proc.join(',')
204
+ end
205
+ end
206
+ end
207
+
208
+
209
+ desc 'Creates project'
210
+ command :project do |c|
211
+
212
+ c.desc 'blueprint name. Currently support goodsales'
213
+ c.arg_name 'blueprint'
214
+ c.flag :blueprint
215
+
216
+ c.desc 'token'
217
+ c.arg_name 'token'
218
+ c.flag :token
219
+
220
+ c.action do |global_options,options,args|
221
+ fail "You need to specify token to create a project" if options[:token].nil?
222
+
223
+ GoodData::Bam::Commands::connect_to_gd()
224
+ pid = case options[:blueprint]
225
+ when "goodsales"
226
+ "nt935rwzls50zfqwy6dh62tabu8h0ocy"
227
+ end
228
+
229
+ params = PARAMS.merge({:token => options[:token]})
230
+
231
+ new_project = if pid
232
+ GoodData::Bam::Commands.clone_project(pid, params)
233
+ else
234
+ GoodData::Bam::Commands.create_project(params)
235
+ end
236
+
237
+ puts "Your project pid is #{new_project}"
238
+ end
239
+
240
+ end
241
+
242
+
243
+ desc 'Generates structures'
244
+ arg_name 'what you want to generate project, tap, flow, sink'
245
+ command :scaffold do |c|
246
+
247
+ c.desc 'blueprint name. Currently support goodsales'
248
+ c.arg_name 'blueprint'
249
+ c.flag :blueprint
250
+
251
+ c.action do |global_options,options,args|
252
+ command = args.first
253
+ fail "You did not provide what I should scaffold. I can generate project, tap, flow, sink, graph_template nothing else" unless ["project", "tap", "flow", "sink", "graph_template"].include?(command)
254
+ case command
255
+ when "project"
256
+ directory = args[1]
257
+ fail "Directory has to be provided as an argument. See help" if directory.nil?
258
+ if options[:blueprint].nil?
259
+ GoodData::Bam::Commands::setup_bash_structure(directory)
260
+ else
261
+ case options[:blueprint]
262
+ when "goodsales"
263
+ system "git clone git://github.com/gooddata/goodsales_base.git #{directory}"
264
+ end
265
+ end
266
+ when "flow"
267
+ name = args[1]
268
+ fail "Name of the flow has to be provided as an argument. See help" if name.nil?
269
+ GoodData::Bam::Commands::setup_flow(name)
270
+ when "tap"
271
+ name = args[1]
272
+ fail "Name of the tap has to be provided as an argument. See help" if name.nil?
273
+ GoodData::Bam::Commands::setup_tap(name)
274
+ when "sink"
275
+ name = args[1]
276
+ fail "Name of the sink has to be provided as an argument. See help" if name.nil?
277
+ GoodData::Bam::Commands::setup_sink(name)
278
+ when "graph_template"
279
+ name = args[1]
280
+ target = args[2]
281
+ fail "Name of the template has to be provided as an argument. See help" if name.nil?
282
+ fail "Name of the target has to be provided as an argument. See help" if target.nil?
283
+ GoodData::Bam::Commands::generate_graph_template(name, target)
284
+ end
285
+ end
286
+ end
287
+
288
+ desc 'Runs the project on server'
289
+ command :model_sync do |c|
290
+
291
+ c.desc 'do not execute'
292
+ c.arg_name 'dry'
293
+ c.switch :dry
294
+
295
+ c.action do |global_options,options,args|
296
+ GoodData::Bam::Commands::model_sync('.', options)
297
+ end
298
+ end
299
+
300
+
301
+ desc 'Deploys the project on server and schedules it'
302
+ command :deploy do |c|
303
+
304
+ c.desc 'existing process id under which it is going to be redeployed'
305
+ c.arg_name 'process'
306
+ c.flag :process
307
+
308
+ c.desc 'name of the process'
309
+ c.arg_name 'name'
310
+ c.flag :name
311
+
312
+ c.action do |global_options,options,args|
313
+ dir = args.first
314
+ fail "You have to specify directory to deploy as an argument" if dir.nil?
315
+ fail "Specified directory does not exist" unless File.exist?(dir)
316
+
317
+ GoodData::Bam::Commands::connect_to_gd()
318
+ params = PARAMS.merge(global_options.merge(options))
319
+ response = GoodData::Bam::Commands::deploy(dir, params)
320
+ end
321
+ end
322
+
323
+ desc 'Runs the project on server'
324
+ command :run do |c|
325
+
326
+ c.desc 'email to addresses when the run is finished'
327
+ c.arg_name 'email'
328
+ c.flag :email
329
+
330
+ c.action do |global_options,options,args|
331
+
332
+ dir = args.first
333
+ fail "You have to specify directory to deploy as an argument" if dir.nil?
334
+ fail "Specified directory does not exist" unless File.exist?(dir)
335
+
336
+ params = PARAMS.merge(global_options.merge(options))
337
+ GoodData::Bam::Commands::connect_to_gd()
338
+ GoodData::Bam::Commands::run(dir, params)
339
+ end
340
+ end
341
+
342
+
343
+ pre do |global_options,command,options,args|
344
+
345
+ logger = Logger.new(STDOUT) if global_options[:l]
346
+ GoodData.logger = logger
347
+ params = GoodData::Bam::Utils::get_user_params('.')
348
+ s3_backup = GoodData::Bam::Utils::should_backup_to_s3?(params)
349
+ PARAMS = params.merge({:s3_backup => s3_backup})
350
+
351
+ # Pre logic here
352
+ # Return true to proceed; false to abort and not call the
353
+ # chosen command
354
+ # Use skips_pre before a command to skip this block
355
+ # on that command only
356
+
357
+ true
358
+ end
359
+
360
+ post do |global_options,command,options,args|
361
+ # Post logic here
362
+ # Use skips_post before a command to skip this
363
+ # block on that command only
364
+ verbose = global_options[:v]
365
+ puts HighLine::color("DONE", :green) if verbose
366
+ end
367
+
368
+ on_error do |exception|
369
+ pp exception.backtrace
370
+ # Error logic here
371
+ # return false to skip default error handling
372
+ true
373
+ end
374
+
375
+ exit run(ARGV)
data/lib/bam/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bam
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.5'
3
3
  end
data/lib/base/project.rb CHANGED
@@ -42,7 +42,7 @@ module GoodData
42
42
  found.first
43
43
  end
44
44
 
45
- def self.load_taps(project, path="./taps/")
45
+ def self.load_taps(project, path)
46
46
  p = Pathname(path)
47
47
  taps = Pathname.glob(p + "*.json").map do |p|
48
48
  Tap.create(JSON.parse(File.read(p), :symbolize_names => true))
@@ -64,7 +64,7 @@ module GoodData
64
64
  Project.create(project.merge({:graph_repos => repos}))
65
65
  end
66
66
 
67
- def self.load_sinks(project, path="./sinks/")
67
+ def self.load_sinks(project, path)
68
68
  p = Pathname(path)
69
69
  sinks = Pathname.glob(p + "*.json").map do |p|
70
70
  Sink.create(JSON.parse(File.read(p), :symbolize_names => true))
@@ -72,7 +72,7 @@ module GoodData
72
72
  Project.create(project.merge({:sinks => sinks}))
73
73
  end
74
74
 
75
- def self.load_flows_definitions(project, path="./flows/")
75
+ def self.load_flows_definitions(project, path)
76
76
  p = Pathname(path)
77
77
  flows = Pathname.glob(p + "*.rb").map do |p|
78
78
  GoodData::Bam::DSL.class_eval(File.read p).to_hash
@@ -80,13 +80,14 @@ module GoodData
80
80
  Project.create(project.merge({:flows_definitions => flows}))
81
81
  end
82
82
 
83
- def self.build_project(options={})
83
+ def self.build_project(home='.', options={})
84
+ home = Pathname(home)
84
85
  project = Project.create({})
85
86
  paths = options[:graph_repos] || []
86
- p = Project.load_taps(project)
87
- p = Project.load_sinks(p)
87
+ p = Project.load_taps(project, home + 'taps')
88
+ p = Project.load_sinks(p, home + 'sinks')
88
89
  p = Project.set_graph_repos(p, paths)
89
- p = Project.load_flows_definitions(p)
90
+ p = Project.load_flows_definitions(p, home + "flows")
90
91
  p = Compiler.compile_dsl(p)
91
92
  end
92
93
 
data/lib/base/tap.rb CHANGED
@@ -162,6 +162,10 @@ module GoodData
162
162
  Tap.remove_acts_as(tap)
163
163
  end
164
164
 
165
+ def self.get_mandatory_fields(tap)
166
+ tap[:fields].reject {|f| f[:is_mandatory] == false }
167
+ end
168
+
165
169
  end
166
170
  end
167
171
  end
@@ -34,7 +34,7 @@ module GoodData
34
34
  f[:type] || "attribute"
35
35
  end
36
36
 
37
- memo[f[:name]] = {
37
+ memo[f[:meta] || f[:name]] = {
38
38
  :name => f[:name],
39
39
  :type => type
40
40
  }
@@ -2,8 +2,20 @@ module GoodData
2
2
  module CloudConnect
3
3
  module Helpers
4
4
 
5
- def self.generate_select(tap)
6
- fields = tap[:fields].map do |f|
5
+ def self.objects_for_history(client, tap)
6
+ sf_module = tap[:object]
7
+ modules = client.modules.map {|o| o[:name]}
8
+ modules.find_all {|m| ["#{sf_module}History", "#{sf_module}FieldHistory"].include?(m) }
9
+ end
10
+
11
+ def self.generate_select(tap, options={})
12
+ field = options[:only]
13
+ fields = if field.nil?
14
+ tap[:fields]
15
+ else
16
+ tap[:fields].find_all {|f| f[:name] == field}
17
+ end
18
+ fields = fields.map do |f|
7
19
  f.has_key?(:multi_currency) ? "convertCurrency(#{f[:name]})" : f[:name]
8
20
  end
9
21
  condition = tap[:condition].nil?() ? "" : "WHERE #{tap[:condition]}"
@@ -20,6 +32,25 @@ module GoodData
20
32
  generate_select(tap)
21
33
  end
22
34
 
35
+ def self.generate_history_query(client, field, sf_object, for_sf_object)
36
+ fields = client.fields(sf_object)
37
+ generic_field_history = ["NewValue", "OldValue", "ParentId"].all? {|f| fields.include?(f)}
38
+ specific_field_history = ["NewValue", "OldValue", "#{for_sf_object}Id"].all? {|f| fields.include?(f)}
39
+ specific_history = ["SystemModstamp", "#{for_sf_object}Id"].all? {|f| fields.include?(f)}
40
+
41
+
42
+ if generic_field_history
43
+ "SELECT NewValue, CreatedDate, ParentId FROM #{sf_object} WHERE Field = '#{field}'"
44
+ elsif specific_field_history
45
+ "SELECT NewValue, CreatedDate, ParentId FROM #{sf_object} WHERE Field = '#{field}'"
46
+ elsif specific_history
47
+ return nil unless fields.include?(field)
48
+ "SELECT #{field}, SystemModstamp, #{for_sf_object}Id FROM #{sf_object}"
49
+ else
50
+ fail "Unrecognized fields configuration for historization in SF."
51
+ end
52
+ end
53
+
23
54
  def self.sf_connection(builder, data)
24
55
  builder.Connection({
25
56
  :clientId => "${SFDC_CLIENT_ID}",
@@ -13,16 +13,16 @@ module GoodData
13
13
  render_template(template_name, PARAMS, :to_file => USER_DEFINED_GRAPHS_ROOT + target)
14
14
  end
15
15
 
16
- def self.project_jack_in(params)
17
- project = GoodData::Bam::Project.build_project
18
- end
16
+ # def self.project_jack_in(params)
17
+ # project = GoodData::Bam::Project.build_project
18
+ # end
19
19
 
20
20
  def self.generate_validators(home, params)
21
21
  home = Pathname(home)
22
22
  clobber_contract_project(home, params)
23
23
  setup_contract_project(home, params)
24
24
 
25
- project = GoodData::Bam::Project.build_project(params)
25
+ project = GoodData::Bam::Project.build_project(home, params)
26
26
  file_taps = Taps.get_file(project[:taps])
27
27
  file_taps = file_taps.find_all {|t| t[:validation_source]}
28
28
  file_taps.each do |t|
@@ -90,16 +90,24 @@ module GoodData
90
90
  def self.generate_downloaders(home, params)
91
91
  home = Pathname(home)
92
92
  clobber_downloaders_project(home)
93
- project = GoodData::Bam::Project.build_project(params)
93
+ project = GoodData::Bam::Project.build_project(home, params)
94
94
  setup_downloaders_project(home, params)
95
95
  GoodData::Bam::Generators::Downloaders.generate_downloaders(home + DOWNLOADERS_HOME + "graphs", project, params)
96
96
  end
97
97
 
98
+ def self.generate_history_downloaders(home, params)
99
+ home = Pathname(home)
100
+ clobber_downloaders_project(home)
101
+ project = GoodData::Bam::Project.build_project(params)
102
+ setup_downloaders_project(home, params)
103
+ GoodData::Bam::Generators::Downloaders.generate_history_downloaders(home + DOWNLOADERS_HOME + "graphs", project, params)
104
+ end
105
+
98
106
  def self.generate(home, params)
99
107
  # fail "The flow you specified was not found" if flows.empty? && !only_flow.nil?
100
- GoodData::Bam::Commands::clobber_etl_project('.')
101
- GoodData::Bam::Commands::setup_etl_project('.', params)
102
- GoodData::Bam::Generators::Etl.generate('.', params)
108
+ clobber_etl_project(home)
109
+ setup_etl_project(home, params)
110
+ GoodData::Bam::Generators::Etl.generate(home, params)
103
111
  end
104
112
 
105
113
  end
@@ -3,7 +3,7 @@ module GoodData
3
3
  module Commands
4
4
 
5
5
  def self.generate_docs(path=".")
6
- project = GoodData::Bam::Project.build_project
6
+ project = GoodData::Bam::Project.build_project(path)
7
7
 
8
8
  taps = ""
9
9
  project[:taps].each do |tap|
@@ -18,9 +18,9 @@ module GoodData
18
18
  end
19
19
  end
20
20
 
21
- def self.model_sync(options)
21
+ def self.model_sync(path, options)
22
22
  dry_run = options[:dry]
23
- project = build_project
23
+ project = build_project(path, options)
24
24
  datasets = project.sinks
25
25
  model_update_dir = Pathname('model_update')
26
26
  cl_home = ENV['CL_HOME'] || PARAMS['CL_HOME'] || fail("Home of cl tool cannot be found. Either set up CL_HOME in your env with 'export CL_HOME=path/to/cl or set it up in your params.json. Point to the directory of CL not to the bin dir.'")
@@ -3,7 +3,7 @@ module GoodData
3
3
  module Commands
4
4
 
5
5
  def self.validate_sf_taps(params)
6
- project = GoodData::Bam::Project.build_project(params)
6
+ project = GoodData::Bam::Project.build_project(params[:home], params)
7
7
  client = get_sf_client(params)
8
8
  validate_sf_metadata(client, Taps.get_salesforce(project[:taps]))
9
9
  end
@@ -6,7 +6,7 @@ module GoodData
6
6
  def visit(node, state)
7
7
  case node[:type]
8
8
  when :project
9
- FileUtils::cd(GoodData::Bam::Commands::ETL_HOME) do
9
+ FileUtils::cd(Pathname(state[:home]) + GoodData::Bam::Commands::ETL_HOME) do
10
10
  flows = if state[:only]
11
11
  node[:flows].find_all {|f| f[:name] == state[:only]}
12
12
  else