gooddata 0.6.0.pre6 → 0.6.0.pre7

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.
data/bin/gooddata CHANGED
@@ -3,6 +3,12 @@ require 'gli'
3
3
  require 'gooddata'
4
4
  require 'highline/import'
5
5
  require 'gooddata/commands/projects'
6
+ require 'gooddata/commands/auth'
7
+ require 'gooddata/commands/scaffold'
8
+ require 'gooddata/commands/process'
9
+ require 'gooddata/commands/api'
10
+ require 'gooddata/commands/profile'
11
+ require 'pp'
6
12
 
7
13
  include GLI::App
8
14
 
@@ -61,66 +67,77 @@ command :process do |c|
61
67
  c.default_value nil
62
68
  c.flag :dir
63
69
 
64
- c.action do |global_options,options,args|
65
- require 'gooddata/commands/process'
66
- options = options.merge(global_options)
67
-
68
- case args.first
69
- when "list"
70
- pp GoodData::Command::Process.list(options)
71
- when "get"
72
- pp GoodData::Command::Process.get(options)
73
- when "deploy"
74
- GoodData::Command::Process.deploy_graph(options[:dir], options)
70
+ c.desc 'Specify type of deployment'
71
+ c.default_value nil
72
+ c.flag :type
73
+
74
+ c.desc 'Specify name of deployed process'
75
+ c.default_value nil
76
+ c.flag :name
77
+
78
+ c.command :list do |list|
79
+ list.action do |global_options,options,args|
80
+ pp GoodData::Command::Process.list(options.merge(global_options))
81
+ end
82
+ end
83
+
84
+ c.command :get do |get|
85
+ get.action do |global_options,options,args|
86
+ pp GoodData::Command::Process.get(options.merge(global_options))
87
+ end
88
+ end
89
+
90
+ c.command :deploy do |deploy|
91
+ deploy.action do |global_options,options,args|
92
+ pp GoodData::Command::Process.deploy(options[:dir], options.merge(global_options))
75
93
  end
76
94
  end
95
+
77
96
  end
78
97
 
79
98
  desc 'Some basic API stuff directly from CLI'
80
99
  arg_name 'info|test|get|delete'
81
100
  command :api do |c|
82
101
 
83
- c.action do |global_options,options,args|
84
- require 'gooddata/commands/api'
85
- options = options.merge(global_options)
86
-
87
- case args.first
88
- when "list", "index", "info"
102
+ c.command :info do |info|
103
+ info.action do |global_options,options,args|
89
104
  pp GoodData::Command::Api.info
90
- when "get"
91
- pp GoodData::Command::Api.get(args[1])
92
- when "deploy"
93
- GoodData::Command::Api.deploy_graph(options[:dir], options)
94
105
  end
95
106
  end
107
+
108
+ c.command :get do |get|
109
+ get.action do |global_options,options,args|
110
+ pp GoodData::Command::Api.get(args[0])
111
+ end
112
+ end
113
+
96
114
  end
97
115
 
98
116
 
99
117
  desc 'Describe add here'
100
118
  arg_name 'show'
101
119
  command :profile do |c|
102
- c.action do |global_options, options, args|
103
- require 'gooddata/commands/profile'
104
-
105
- case args.first
106
- when "show"
120
+
121
+ c.command :show do |show|
122
+ show.action do |global_options,options,args|
107
123
  pp GoodData::Command::Profile.show()
108
- else
109
- raise "command provided not right"
110
124
  end
111
125
  end
126
+
112
127
  end
113
128
 
114
129
  desc 'Scaffold things'
115
130
  arg_name 'show'
116
131
  command :scaffold do |c|
117
132
  c.action do |global_options, options, args|
118
- require 'gooddata/commands/scaffold'
119
- case args.first
120
- when "brick"
121
- pp GoodData::Command::Scaffold.brick(args[1])
122
- else
123
- raise "command provided not right"
133
+
134
+ c.command :brick do |brick|
135
+ brick.arg_name 'name'
136
+
137
+ name = args[1]
138
+ fail "Name of the brick has to be provided" if name.nil? || name.empty?
139
+
140
+ GoodData::Command::Scaffold.brick(name)
124
141
  end
125
142
  end
126
143
  end
@@ -136,6 +153,26 @@ command :project do |c|
136
153
  end
137
154
  end
138
155
 
156
+ c.command :jack_in do |jack|
157
+ jack.action do |global_options,options,args|
158
+
159
+ goodfile = JSON.parse(File.read(GoodData::Helpers.find_goodfile(Pathname('.'))), :symbolize_names => true)
160
+ model_key = goodfile[:model]
161
+ blueprint = GoodData::Model::ProjectBlueprint.new(eval(File.read(model_key)).to_hash) if File.exist?(model_key) && !File.directory?(model_key)
162
+
163
+ project_id = global_options[:project_id] || goodfile[:project_id]
164
+ fail "You have to provide 'project_id'" if project_id.nil?
165
+
166
+ GoodData.with_project(project_id) do |project|
167
+ puts "Use 'exit' to quit the interactive session. Use 'q' to jump out of displaying a large output."
168
+ binding.pry(:quiet => true,
169
+ :prompt => [proc { |target_self, nest_level, pry|
170
+ "project_live_sesion: "
171
+ }])
172
+ end
173
+ end
174
+ end
175
+
139
176
  c.command :create do |create|
140
177
  create.action do |global_options,options,args|
141
178
  title = ask "Project name"
@@ -189,9 +226,12 @@ command :project do |c|
189
226
 
190
227
  c.command :build do |show|
191
228
  show.action do |global_options,options,args|
192
- spec_path = args.first || fail("You need to specify the path of the build spec")
229
+ goodfile = JSON.parse(File.read(GoodData::Helpers.find_goodfile(Pathname('.'))), :symbolize_names => true)
230
+ spec_path = goodfile[:model] || fail("You need to specify the path of the build spec")
231
+ fail "Model path provided in Goodfile \"#{spec_path}\" does not exist" unless File.exist?(spec_path) && !File.directory?(spec_path)
232
+
193
233
  opts = options.merge(global_options)
194
- spec_path = Pathname.new(spec_path)
234
+ spec_path = Pathname(spec_path)
195
235
 
196
236
  content = File.read(spec_path)
197
237
  spec = if (spec_path.extname == ".rb")
@@ -206,6 +246,17 @@ command :project do |c|
206
246
 
207
247
  end
208
248
 
249
+ desc 'Work with your credentials'
250
+ command :auth do |c|
251
+
252
+ c.command :store do |store|
253
+ store.action do |global_options,options,args|
254
+ GoodData::Command::Auth.store
255
+ end
256
+ end
257
+
258
+ end
259
+
209
260
  desc 'Run bricks locally'
210
261
  # arg_name 'show'
211
262
  command :run_ruby do |c|
@@ -214,10 +265,6 @@ command :run_ruby do |c|
214
265
  c.default_value nil
215
266
  c.flag [:d, :dir]
216
267
 
217
- c.desc 'Project id for which you would like to run the script'
218
- c.default_value nil
219
- c.flag [:p, :project, :project_id, :project_pid]
220
-
221
268
  c.desc 'Log file. If empty STDOUT will be used instead'
222
269
  c.default_value nil
223
270
  c.flag [:l, :logger]
@@ -235,13 +282,13 @@ command :run_ruby do |c|
235
282
 
236
283
 
237
284
  c.action do |global_options, options, args|
238
- options[:params] = if (options[:params])
285
+ options[:expanded_params] = if (options[:params])
239
286
  JSON.parse(File.read(options[:params]), :symbolize_names => true)
240
287
  else
241
288
  {}
242
289
  end
243
290
 
244
- opts = options.merge(global_options).merge({:project_id => options[:project], "project_id" => options[:project], :type => "RUBY"})
291
+ opts = options.merge(global_options).merge({:type => "RUBY"})
245
292
  if options[:remote]
246
293
  fail "You have to specify name of the deploy when deploying remotely" if options[:name].nil? || options[:name].empty?
247
294
  require 'gooddata/commands/process'
@@ -255,29 +302,28 @@ command :run_ruby do |c|
255
302
  end
256
303
  end
257
304
 
258
- desc 'Manage your projects'
259
- arg_name 'project_command'
260
- command :project do |c|
261
-
262
- c.command :list do |list|
263
- list.action do |global_options,options,args|
264
- list = GoodData::Command::Projects.list()
265
- puts list.map {|p| [p.uri, p.title].join(",")}
266
- end
267
- end
268
-
269
- end
270
-
271
305
  pre do |global,command,options,args|
272
306
  require 'logger'
273
307
  GoodData.logger = Logger.new(STDOUT) if global[:l]
274
308
  username = global[:username]
275
309
  password = global[:password]
310
+ token = global[:token]
276
311
 
312
+ creds = GoodData::Command::Auth.read_credentials
313
+
314
+ username = creds[:username] if username.nil?
315
+ password = creds[:password] if password.nil?
316
+ token = creds[:auth_token] if token.nil?
317
+
318
+ global[:token] = token if global[:token].nil?
319
+ global[:username] = username if global[:username].nil?
320
+ global[:password] = password if global[:password].nil?
321
+
277
322
  GoodData.connect(global.merge(options).merge({
278
323
  :login => username,
279
324
  :password => password,
280
- :server => global[:server]
325
+ :server => global[:server],
326
+ :token => token
281
327
  }))
282
328
 
283
329
  # Pre logic here
data/gooddata.gemspec CHANGED
@@ -41,6 +41,9 @@ Gem::Specification.new do |s|
41
41
  s.add_dependency "pry"
42
42
  s.add_dependency "erubis"
43
43
  s.add_dependency "activesupport"
44
+ s.add_dependency "restforce"
45
+ s.add_dependency "salesforce_bulk"
46
+ s.add_dependency "twitter"
44
47
 
45
48
  end
46
49
 
@@ -0,0 +1,62 @@
1
+ module GoodData::Bricks
2
+ class BaseDownloader
3
+
4
+ def initialize(params)
5
+ @params = params
6
+ end
7
+
8
+ def pre_process(meta)
9
+ meta
10
+ end
11
+
12
+ def download
13
+ puts "would download data"
14
+ []
15
+ end
16
+
17
+ def backup(meta)
18
+ puts "would send a backup list of files to backup"
19
+ files = meta.reduce([]) do |memo, item|
20
+ memo << item[:filename]
21
+ end
22
+
23
+ bucket_name = @params[:s3_backup_bucket_name]
24
+
25
+ s3 = AWS::S3.new(
26
+ :access_key_id => @params[:aws_access_key_id],
27
+ :secret_access_key => @params[:aws_secret_access_key])
28
+
29
+ bucket = s3.buckets[bucket_name]
30
+ bucket = s3.buckets.create(bucket_name) unless bucket.exists?
31
+
32
+ files.each do |file|
33
+ obj = bucket.objects[file]
34
+ obj.write(Pathname.new(file))
35
+ end
36
+ meta
37
+ end
38
+
39
+ def post_process(meta)
40
+ puts "Maybe some postprocessing"
41
+ meta
42
+ end
43
+
44
+ def run
45
+ downloaded_data = download
46
+ downloaded_data = pre_process(downloaded_data)
47
+ backup(downloaded_data)
48
+ downloaded_data = post_process(downloaded_data)
49
+
50
+ downloaded_data.reduce([]) do |memo, item|
51
+ item.has_key?(:state) ? memo.concat(item[:state]) : memo
52
+ end.each do |item|
53
+ key = item[:key]
54
+ val = item[:value]
55
+
56
+ puts "Saving metadata #{}"
57
+ GoodData::ProjectMetadata[key] = val
58
+ end
59
+ end
60
+
61
+ end
62
+ end
@@ -1,42 +1,41 @@
1
1
  require 'gooddata/bricks/utils'
2
+ require 'gooddata/bricks/base_downloader'
2
3
  require 'gooddata/bricks/middleware/middleware'
3
4
  require 'gooddata/bricks/middleware/bench_middleware'
4
5
  require 'gooddata/bricks/middleware/gooddata_middleware'
5
6
  require 'gooddata/bricks/middleware/logger_middleware'
6
7
  require 'gooddata/bricks/middleware/stdout_middleware'
7
8
  require 'gooddata/bricks/middleware/restforce_middleware'
9
+ require 'gooddata/bricks/middleware/bulk_salesforce_middleware.rb'
8
10
  require 'gooddata/bricks/middleware/twitter_middleware'
9
11
 
10
- module GoodData
11
- module Bricks
12
-
13
- class Pipeline
14
- def self.prepare(pipeline)
15
- pipeline.reverse.reduce(nil) {|memo, app| memo.nil? ? app.new : app.new(memo)}
16
- end
12
+ module GoodData::Bricks
13
+ class Pipeline
14
+ def self.prepare(pipeline)
15
+ pipeline.reverse.reduce(nil) {|memo, app| memo.nil? ? app.new : app.new(memo)}
17
16
  end
18
-
19
- class Brick
20
-
21
- def log(message)
22
- logger = @params[:gdc_logger]
23
- logger.info(message) unless logger.nil?
24
- end
17
+ end
18
+
19
+ class Brick
25
20
 
26
- def name
27
- self.class
28
- end
21
+ def log(message)
22
+ logger = @params[:gdc_logger]
23
+ logger.info(message) unless logger.nil?
24
+ end
29
25
 
30
- def version
31
- fail "Method version should be reimplemented"
32
- end
26
+ def name
27
+ self.class
28
+ end
33
29
 
34
- def call(params={})
35
- @params = params
36
- ""
37
- end
30
+ def version
31
+ fail "Method version should be reimplemented"
32
+ end
38
33
 
34
+ def call(params={})
35
+ @params = params
36
+ ""
39
37
  end
40
-
38
+
41
39
  end
40
+
42
41
  end
@@ -0,0 +1,38 @@
1
+ require 'gooddata'
2
+ require 'salesforce_bulk'
3
+
4
+ module GoodData::Bricks
5
+ class BulkSalesforceMiddleware < GoodData::Bricks::Middleware
6
+
7
+ def call(params)
8
+
9
+ username = params[:salesforce_username]
10
+ password = params[:salesforce_password]
11
+ token = params[:salesforce_token]
12
+ client_id = params[:salesforce_client_id]
13
+ client_secret = params[:salesforce_client_secret]
14
+ host = params[:salesforce_host]
15
+
16
+ credentials = {}
17
+
18
+ credentials = if (username && password && token)
19
+ {
20
+ :username => username,
21
+ :password => password,
22
+ :security_token => token
23
+ }
24
+ end
25
+
26
+ client = if credentials
27
+ credentials.merge!({
28
+ :client_id => client_id,
29
+ :client_secret => client_secret,
30
+ })
31
+ credentials[:host] = host unless host.nil?
32
+ SalesforceBulk::Api.new(credentials[:username], credentials[:password] + credentials[:security_token])
33
+ end
34
+ @app.call(params.merge(:salesforce_bulk_client => client))
35
+ end
36
+
37
+ end
38
+ end
@@ -11,12 +11,14 @@ module GoodData::Bricks
11
11
  project_id = params[:GDC_PROJECT_ID]
12
12
 
13
13
  fail "SST (SuperSecureToken) not present in params" if params[token_name].nil?
14
- logger.info "Connecting to GD with SST"
15
14
  server = if !params[protocol_name].empty? && !params[server_name].empty?
16
15
  params[protocol_name] + "://" + params[server_name]
17
16
  end
18
17
 
19
- GoodData.connect_with_sst(params[token_name], {:server => server})
18
+ fail "GoodData username is missing. Expected param :GDC_USERANME" if params[:GDC_USERNAME].nil?
19
+ fail "GoodData password is missing. Expected param :GDC_PASSWORD" if params[:GDC_PASSWORD].nil?
20
+
21
+ GoodData.connect(params[:GDC_USERNAME], params[:GDC_PASSWORD], {:server => server})
20
22
  GoodData.logger = logger
21
23
  GoodData.with_project(project_id) do |p|
22
24
  @app.call(params)