gooddata 0.5.16 → 0.6.0.pre2

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 (40) hide show
  1. data/Gemfile +2 -0
  2. data/bin/gooddata +291 -8
  3. data/gooddata.gemspec +14 -5
  4. data/lib/gooddata/client.rb +34 -5
  5. data/lib/gooddata/commands/api.rb +27 -30
  6. data/lib/gooddata/commands/process.rb +137 -0
  7. data/lib/gooddata/commands/profile.rb +5 -5
  8. data/lib/gooddata/commands/projects.rb +107 -40
  9. data/lib/gooddata/commands/runners.rb +37 -0
  10. data/lib/gooddata/commands/scaffold.rb +30 -0
  11. data/lib/gooddata/connection.rb +31 -19
  12. data/lib/gooddata/extract.rb +1 -1
  13. data/lib/gooddata/goodzilla/goodzilla.rb +40 -0
  14. data/lib/gooddata/model.rb +418 -138
  15. data/lib/gooddata/models/attribute.rb +24 -0
  16. data/lib/gooddata/models/dashboard.rb +60 -0
  17. data/lib/gooddata/models/data_result.rb +4 -6
  18. data/lib/gooddata/models/data_set.rb +20 -0
  19. data/lib/gooddata/models/display_form.rb +7 -0
  20. data/lib/gooddata/models/fact.rb +17 -0
  21. data/lib/gooddata/models/metadata.rb +69 -17
  22. data/lib/gooddata/models/metric.rb +90 -0
  23. data/lib/gooddata/models/process.rb +112 -0
  24. data/lib/gooddata/models/profile.rb +1 -1
  25. data/lib/gooddata/models/project.rb +85 -29
  26. data/lib/gooddata/models/report.rb +45 -0
  27. data/lib/gooddata/models/report_definition.rb +139 -0
  28. data/lib/gooddata/version.rb +1 -1
  29. data/lib/templates/bricks/brick.rb.erb +7 -0
  30. data/lib/templates/bricks/main.rb.erb +4 -0
  31. data/spec/goodzilla_spec.rb +57 -0
  32. data/spec/model_dsl_spec.rb +22 -0
  33. data/test/test_commands.rb +1 -1
  34. data/test/test_model.rb +6 -6
  35. metadata +137 -16
  36. data/bin/igd.rb +0 -33
  37. data/lib/gooddata/command.rb +0 -75
  38. data/lib/gooddata/commands/help.rb +0 -104
  39. data/lib/gooddata/commands/version.rb +0 -7
  40. data/test/helper.rb +0 -13
@@ -0,0 +1,22 @@
1
+ require 'gooddata/model'
2
+ require 'pry'
3
+
4
+ describe GoodData::Model::SchemaBuilder do
5
+
6
+ it "should create a schema" do
7
+ builder = GoodData::Model::SchemaBuilder.new("a_title")
8
+ schema = builder.to_schema
9
+ schema.title.should == "a_title"
10
+ end
11
+
12
+ it "should create a schema with some columns" do
13
+ builder = GoodData::Model::SchemaBuilder.new("payments")
14
+ builder.add_attribute("id", :title => "My Id")
15
+ builder.add_fact("amount", :title => "Amount")
16
+
17
+ schema = builder.to_schema
18
+ schema.attributes.keys.count == 1
19
+ schema.attributes["attr.payments.id"].title.should == "My Id"
20
+ end
21
+
22
+ end
@@ -82,4 +82,4 @@ class TestRestApiBasic < Test::Unit::TestCase
82
82
  GoodData::Command.run "version", []
83
83
  end
84
84
  end
85
- end
85
+ end
data/test/test_model.rb CHANGED
@@ -9,12 +9,12 @@ GoodData.logger = Logger.new(STDOUT)
9
9
 
10
10
  class TestModel < Test::Unit::TestCase
11
11
  COLUMNS = [
12
- { 'type' => 'CONNECTION_POINT', 'name' => 'cp', 'title' => 'CP', 'folder' => 'test' },
13
- { 'type' => 'ATTRIBUTE', 'name' => 'a1', 'title' => 'A1', 'folder' => 'test' },
14
- { 'type' => 'ATTRIBUTE', 'name' => 'a2', 'title' => 'A2', 'folder' => 'test' },
15
- { 'type' => 'DATE', 'name' => 'event', 'title' => 'Event', 'folder' => 'test' },
16
- { 'type' => 'FACT', 'name' => 'f1', 'title' => 'F1', 'folder' => 'test' },
17
- { 'type' => 'FACT', 'name' => 'f2', 'title' => 'F2', 'folder' => 'test' },
12
+ { 'type' => :anchor, 'name' => 'cp', 'title' => 'CP', 'folder' => 'test' },
13
+ { 'type' => :attribute, 'name' => 'a1', 'title' => 'A1', 'folder' => 'test' },
14
+ { 'type' => :attribute, 'name' => 'a2', 'title' => 'A2', 'folder' => 'test' },
15
+ { 'type' => :date, 'name' => 'event', 'title' => 'Event', 'folder' => 'test' },
16
+ { 'type' => :fact, 'name' => 'f1', 'title' => 'F1', 'folder' => 'test' },
17
+ { 'type' => :fact, 'name' => 'f2', 'title' => 'F2', 'folder' => 'test' },
18
18
  ]
19
19
  SCHEMA = GoodData::Model::Schema.new 'title' => 'test', 'columns' => COLUMNS
20
20
 
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gooddata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.16
5
- prerelease:
4
+ version: 0.6.0.pre2
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Pavel Kolesnikov
@@ -17,17 +17,17 @@ dependencies:
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ~>
20
+ - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
- version: '1.3'
22
+ version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
28
- - - ~>
28
+ - - ! '>='
29
29
  - !ruby/object:Gem::Version
30
- version: '1.3'
30
+ version: '0'
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: thoughtbot-shoulda
33
33
  requirement: !ruby/object:Gem::Requirement
@@ -44,6 +44,54 @@ dependencies:
44
44
  - - ! '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: rspec
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
47
95
  - !ruby/object:Gem::Dependency
48
96
  name: parseconfig
49
97
  requirement: !ruby/object:Gem::Requirement
@@ -113,22 +161,85 @@ dependencies:
113
161
  requirement: !ruby/object:Gem::Requirement
114
162
  none: false
115
163
  requirements:
116
- - - <
164
+ - - ! '>='
117
165
  - !ruby/object:Gem::Version
118
- version: 1.0.0
166
+ version: '0'
119
167
  type: :runtime
120
168
  prerelease: false
121
169
  version_requirements: !ruby/object:Gem::Requirement
122
170
  none: false
123
171
  requirements:
124
- - - <
172
+ - - ! '>='
125
173
  - !ruby/object:Gem::Version
126
- version: 1.0.0
174
+ version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: highline
177
+ requirement: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ type: :runtime
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ - !ruby/object:Gem::Dependency
192
+ name: gli
193
+ requirement: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ type: :runtime
200
+ prerelease: false
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ - !ruby/object:Gem::Dependency
208
+ name: pry
209
+ requirement: !ruby/object:Gem::Requirement
210
+ none: false
211
+ requirements:
212
+ - - ! '>='
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :runtime
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ! '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: erubis
225
+ requirement: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :runtime
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
235
+ requirements:
236
+ - - ! '>='
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
127
239
  description: Use the Gooddata::Client class to integrate GoodData into your own application
128
240
  or use the CLI to work with GoodData directly from the command line.
129
241
  email: pavel@gooddata.com
130
242
  executables:
131
- - igd.rb
132
243
  - gooddata
133
244
  extensions: []
134
245
  extra_rdoc_files:
@@ -144,33 +255,43 @@ files:
144
255
  - Rakefile
145
256
  - TODO.md
146
257
  - bin/gooddata
147
- - bin/igd.rb
148
258
  - examples.rb
149
259
  - gooddata.gemspec
150
260
  - lib/gooddata.rb
151
261
  - lib/gooddata/client.rb
152
- - lib/gooddata/command.rb
153
262
  - lib/gooddata/commands/api.rb
154
263
  - lib/gooddata/commands/auth.rb
155
264
  - lib/gooddata/commands/base.rb
156
265
  - lib/gooddata/commands/datasets.rb
157
- - lib/gooddata/commands/help.rb
266
+ - lib/gooddata/commands/process.rb
158
267
  - lib/gooddata/commands/profile.rb
159
268
  - lib/gooddata/commands/projects.rb
160
- - lib/gooddata/commands/version.rb
269
+ - lib/gooddata/commands/runners.rb
270
+ - lib/gooddata/commands/scaffold.rb
161
271
  - lib/gooddata/connection.rb
162
272
  - lib/gooddata/extract.rb
273
+ - lib/gooddata/goodzilla/goodzilla.rb
163
274
  - lib/gooddata/helpers.rb
164
275
  - lib/gooddata/model.rb
276
+ - lib/gooddata/models/attribute.rb
165
277
  - lib/gooddata/models/dashboard.rb
166
278
  - lib/gooddata/models/data_result.rb
279
+ - lib/gooddata/models/data_set.rb
280
+ - lib/gooddata/models/display_form.rb
281
+ - lib/gooddata/models/fact.rb
167
282
  - lib/gooddata/models/links.rb
168
283
  - lib/gooddata/models/metadata.rb
284
+ - lib/gooddata/models/metric.rb
285
+ - lib/gooddata/models/process.rb
169
286
  - lib/gooddata/models/profile.rb
170
287
  - lib/gooddata/models/project.rb
171
288
  - lib/gooddata/models/report.rb
289
+ - lib/gooddata/models/report_definition.rb
172
290
  - lib/gooddata/version.rb
173
- - test/helper.rb
291
+ - lib/templates/bricks/brick.rb.erb
292
+ - lib/templates/bricks/main.rb.erb
293
+ - spec/goodzilla_spec.rb
294
+ - spec/model_dsl_spec.rb
174
295
  - test/test_commands.rb
175
296
  - test/test_guessing.rb
176
297
  - test/test_model.rb
data/bin/igd.rb DELETED
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'gooddata'
4
- require 'gooddata/command'
5
-
6
- require 'irb'
7
-
8
- include GoodData
9
-
10
- module IRB
11
- def IRB.start2(bind, ap_path)
12
- IRB.setup(ap_path)
13
- irb = Irb.new(WorkSpace.new(bind))
14
- @CONF[:MAIN_CONTEXT] = irb.context
15
- trap("SIGINT") do
16
- irb.signal_handle
17
- end
18
- catch(:IRB_EXIT) do
19
- irb.eval_input
20
- end
21
- end
22
- end
23
-
24
- param = ARGV.shift if ARGV.length
25
- if param == '--debug' then
26
- require 'logger'
27
- GoodData.logger = Logger.new STDOUT
28
- end
29
- Command.connect
30
- puts "Logged into GoodData as #{GoodData.profile.user} (#{GoodData.profile['login']})"
31
- puts
32
- IRB::start2 binding, $STDIN
33
- puts "Logging out"
@@ -1,75 +0,0 @@
1
- require 'pp'
2
- require 'gooddata/helpers'
3
- require 'gooddata/commands/base'
4
- Dir[File.dirname(__FILE__) + '/commands/*.rb'].each { |file| require file unless file =~ /\/base.rb$/ }
5
-
6
- module GoodData::Command
7
- class InvalidCommand < RuntimeError; end
8
- class InvalidOption < RuntimeError; end
9
- class CommandFailed < RuntimeError; end
10
-
11
- extend GoodData::Helpers
12
-
13
- class << self
14
- def run(command, args)
15
- begin
16
- run_internal command, args.dup
17
- rescue InvalidCommand
18
- error "Unknown command. Run 'gooddata help' for usage information."
19
- rescue InvalidOption
20
- error "Unknown option."
21
- rescue RestClient::Unauthorized
22
- error "Authentication failure"
23
- rescue RestClient::ResourceNotFound => e
24
- error extract_not_found(e.http_body)
25
- rescue RestClient::RequestFailed => e
26
- error extract_error(e.http_body)
27
- rescue RestClient::RequestTimeout
28
- error "API request timed out. Please try again, or contact support@gooddata.com if this issue persists."
29
- rescue CommandFailed => e
30
- error e.message
31
- rescue Interrupt => e
32
- error "\n[canceled]"
33
- end
34
- end
35
-
36
- def run_internal(command, args)
37
- klass, method = parse(command)
38
- runner = klass.new(args)
39
- raise InvalidCommand unless runner.respond_to?(method)
40
- runner.send(method)
41
- end
42
-
43
- def parse(command)
44
- parts = command.split(':')
45
-
46
- parts << :index if parts.size == 1
47
- raise InvalidCommand if parts.size > 2
48
-
49
- begin
50
- return GoodData::Command.const_get(parts[0].capitalize), parts[1]
51
- rescue NameError
52
- raise InvalidCommand
53
- end
54
- end
55
-
56
- def extract_not_found(body)
57
- body =~ /^[\w\s]+ not found$/ ? body : "Resource not found"
58
- end
59
-
60
- def extract_error(body)
61
- msg = parse_error_json(body) || 'Internal server error'
62
- msg.split("\n").map { |line| ' ! ' + line }.join("\n")
63
- end
64
-
65
- def parse_error_json(body)
66
- begin
67
- error = JSON.parse(body.to_s)['error']
68
- return error['message'] if !error['parameters']
69
- return error['message'] % error['parameters'] rescue error
70
- rescue
71
- return body
72
- end
73
- end
74
- end
75
- end
@@ -1,104 +0,0 @@
1
- module GoodData
2
- module Command
3
- class Help < Base
4
- class HelpGroup < Array
5
- attr_reader :title
6
-
7
- def initialize(title)
8
- @title = title
9
- end
10
-
11
- def command(name, description)
12
- self << [name, description]
13
- end
14
-
15
- def space
16
- self << ['', '']
17
- end
18
- end
19
-
20
- class << self
21
- def groups
22
- @groups ||= []
23
- end
24
-
25
- def group(title, &block)
26
- groups << begin
27
- group = HelpGroup.new(title)
28
- yield group
29
- group
30
- end
31
- end
32
-
33
- def create_default_groups!
34
- group 'General Commands' do |group|
35
- group.command 'help', 'show this usage'
36
- group.command 'version', 'show the gem version'
37
- group.space
38
- group.command 'api', 'general info about the current GoodData API version'
39
- group.command 'api:test', 'test you credentials and the connection to GoodData server'
40
- group.command 'api:get', 'issue a generic GET request to the GoodData API'
41
- group.space
42
- group.command 'auth:store', 'save your GoodData credentials and we won\'t ask you for them ever again'
43
- group.command 'auth:unstore', 'remove the saved GoodData credentials from your computer'
44
- group.space
45
- group.command 'datasets', 'list remote data sets in the project specified via --project'
46
- group.command 'datasets:describe', 'describe a local data set and save the description in a JSON file'
47
- group.space
48
- group.command 'profile', 'show your GoodData profile'
49
- group.space
50
- group.command 'projects', 'list available projects'
51
- group.command 'projects:create', 'create new project'
52
- group.command 'projects:show <key>', 'show project details'
53
- group.command 'projects:delete <key> [...]', 'delete one or more existing projects'
54
- end
55
-
56
- group 'General Options' do |group|
57
- group.command '--log-level <level>', 'Set the log level (fatal, error, warn [default], info, debug)'
58
- group.command '--project <project_id>', 'Set the working remote project identified by an URI or project ID'
59
- end
60
- end
61
- end
62
-
63
- def index
64
- puts usage
65
- end
66
-
67
- def version
68
- puts Client.version
69
- end
70
-
71
- def usage
72
- longest_command_length = self.class.groups.map do |group|
73
- group.map { |g| g.first.length }
74
- end.flatten.max
75
-
76
- s = StringIO.new
77
- s << <<-EOT
78
- === Usage
79
-
80
- gooddata COMMAND [options]
81
-
82
- EOT
83
-
84
- self.class.groups.inject(s) do |output, group|
85
- output.puts "=== %s" % group.title
86
- output.puts
87
-
88
- group.each do |command, description|
89
- if command.empty?
90
- output.puts
91
- else
92
- output.puts "%-*s # %s" % [longest_command_length, command, description]
93
- end
94
- end
95
-
96
- output.puts
97
- output
98
- end.string
99
- end
100
- end
101
- end
102
- end
103
-
104
- GoodData::Command::Help.create_default_groups!