gooddata 0.6.7 → 0.6.8
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 +4 -4
- data/CHANGELOG.md +19 -1
- data/README.md +10 -2
- data/TODO.md +32 -0
- data/gooddata.gemspec +5 -0
- data/lib/gooddata.rb +4 -0
- data/lib/gooddata/app/app.rb +12 -0
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +4 -3
- data/lib/gooddata/bricks/middleware/restforce_middleware.rb +2 -1
- data/lib/gooddata/cli/commands/console_cmd.rb +23 -5
- data/lib/gooddata/cli/commands/domain_cmd.rb +9 -10
- data/lib/gooddata/cli/commands/process_cmd.rb +11 -9
- data/lib/gooddata/cli/commands/project_cmd.rb +25 -27
- data/lib/gooddata/cli/commands/projects_cmd.rb +2 -2
- data/lib/gooddata/cli/commands/run_ruby_cmd.rb +1 -1
- data/lib/gooddata/cli/commands/user_cmd.rb +2 -2
- data/lib/gooddata/cli/hooks.rb +4 -2
- data/lib/gooddata/cli/shared.rb +1 -1
- data/lib/gooddata/cli/terminal.rb +1 -1
- data/lib/gooddata/commands/api.rb +1 -1
- data/lib/gooddata/commands/auth.rb +4 -28
- data/lib/gooddata/commands/domain.rb +9 -4
- data/lib/gooddata/commands/process.rb +26 -23
- data/lib/gooddata/commands/project.rb +74 -50
- data/lib/gooddata/commands/projects.rb +3 -2
- data/lib/gooddata/commands/role.rb +9 -3
- data/lib/gooddata/commands/user.rb +6 -4
- data/lib/gooddata/connection.rb +11 -45
- data/lib/gooddata/core/logging.rb +0 -1
- data/lib/gooddata/core/project.rb +22 -22
- data/lib/gooddata/core/rest.rb +9 -8
- data/lib/gooddata/core/user.rb +0 -11
- data/lib/gooddata/exceptions/project_not_found.rb +1 -0
- data/lib/gooddata/extensions/enumerable.rb +10 -0
- data/lib/gooddata/extensions/hash.rb +25 -0
- data/lib/gooddata/goodzilla/goodzilla.rb +4 -4
- data/lib/gooddata/helper/class_helper.rb +1 -0
- data/lib/gooddata/helper/helpers.rb +8 -0
- data/lib/gooddata/helpers/auth_helpers.rb +41 -0
- data/lib/gooddata/mixins/author.rb +1 -1
- data/lib/gooddata/mixins/contributor.rb +1 -1
- data/lib/gooddata/mixins/data_property_reader.rb +2 -0
- data/lib/gooddata/mixins/data_property_writer.rb +2 -0
- data/lib/gooddata/mixins/inspector.rb +49 -0
- data/lib/gooddata/mixins/md_finders.rb +16 -8
- data/lib/gooddata/mixins/md_id_to_uri.rb +12 -4
- data/lib/gooddata/mixins/md_object_indexer.rb +15 -4
- data/lib/gooddata/mixins/md_object_query.rb +42 -20
- data/lib/gooddata/mixins/md_relations.rb +21 -12
- data/lib/gooddata/mixins/meta_getter.rb +2 -0
- data/lib/gooddata/mixins/meta_property_reader.rb +2 -0
- data/lib/gooddata/mixins/meta_property_writer.rb +2 -0
- data/lib/gooddata/mixins/rest_resource.rb +32 -10
- data/lib/gooddata/mixins/root_key_getter.rb +1 -1
- data/lib/gooddata/models/data_result.rb +3 -1
- data/lib/gooddata/models/domain.rb +31 -22
- data/lib/gooddata/models/empty_result.rb +22 -0
- data/lib/gooddata/models/invitation.rb +11 -9
- data/lib/gooddata/models/links.rb +5 -3
- data/lib/gooddata/models/membership.rb +23 -28
- data/lib/gooddata/models/metadata.rb +35 -35
- data/lib/gooddata/models/metadata/attribute.rb +10 -8
- data/lib/gooddata/models/metadata/dashboard.rb +1 -1
- data/lib/gooddata/models/metadata/fact.rb +3 -3
- data/lib/gooddata/models/metadata/label.rb +4 -4
- data/lib/gooddata/models/metadata/metric.rb +76 -38
- data/lib/gooddata/models/metadata/report.rb +52 -17
- data/lib/gooddata/models/metadata/report_definition.rb +178 -28
- data/lib/gooddata/models/model.rb +13 -6
- data/lib/gooddata/models/process.rb +93 -30
- data/lib/gooddata/models/profile.rb +18 -20
- data/lib/gooddata/models/project.rb +344 -127
- data/lib/gooddata/models/project_creator.rb +32 -22
- data/lib/gooddata/models/project_metadata.rb +26 -14
- data/lib/gooddata/models/project_role.rb +15 -17
- data/lib/gooddata/models/report_data_result.rb +4 -0
- data/lib/gooddata/models/schedule.rb +51 -20
- data/lib/gooddata/models/schema_blueprint.rb +9 -3
- data/lib/gooddata/rest/README.md +37 -0
- data/lib/gooddata/rest/client.rb +318 -0
- data/lib/gooddata/rest/connection.rb +235 -0
- data/lib/gooddata/rest/connections/connections.rb +8 -0
- data/lib/gooddata/rest/connections/dummy_connection.rb +52 -0
- data/lib/gooddata/rest/connections/rest_client_connection.rb +177 -0
- data/lib/gooddata/rest/object.rb +32 -0
- data/lib/gooddata/rest/object_factory.rb +67 -0
- data/lib/gooddata/rest/resource.rb +17 -0
- data/lib/gooddata/rest/rest.rb +20 -0
- data/lib/gooddata/version.rb +1 -1
- data/spec/data/cc/data/source/commits.csv +4 -0
- data/spec/data/cc/data/source/devs.csv +4 -0
- data/spec/data/cc/data/source/repos.csv +3 -0
- data/spec/data/cc/devel.prm +0 -0
- data/spec/data/cc/graph/graph.grf +11 -0
- data/spec/data/cc/workspace.prm +19 -0
- data/spec/data/hello_world_process/hello_world.rb +1 -0
- data/spec/data/hello_world_process/hello_world.zip +0 -0
- data/spec/data/users.csv +12 -12
- data/spec/helpers/connection_helper.rb +6 -0
- data/spec/helpers/process_helper.rb +12 -0
- data/spec/helpers/project_helper.rb +2 -2
- data/spec/integration/command_projects_spec.rb +11 -9
- data/spec/integration/create_from_template_spec.rb +6 -2
- data/spec/integration/full_process_schedule_spec.rb +49 -36
- data/spec/integration/full_project_spec.rb +221 -256
- data/spec/integration/partial_md_export_import_spec.rb +18 -17
- data/spec/logging_in_logging_out_spec.rb +17 -8
- data/spec/spec_helper.rb +4 -2
- data/spec/unit/cli/commands/cmd_api_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_auth_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_domain_spec.rb +29 -3
- data/spec/unit/cli/commands/cmd_process_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_project_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_role_spec.rb +13 -2
- data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_scaffold_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_user_spec.rb +1 -1
- data/spec/unit/commands/command_api_spec.rb +0 -19
- data/spec/unit/commands/command_auth_spec.rb +20 -13
- data/spec/unit/commands/command_dataset_spec.rb +2 -2
- data/spec/unit/commands/command_process_spec.rb +24 -21
- data/spec/unit/commands/command_projects_spec.rb +2 -2
- data/spec/unit/commands/command_scaffold_spec.rb +2 -2
- data/spec/unit/commands/command_user_spec.rb +3 -3
- data/spec/unit/core/connection_spec.rb +9 -10
- data/spec/unit/core/project_spec.rb +8 -4
- data/spec/unit/core/rest_spec.rb +6 -6
- data/spec/unit/models/domain_spec.rb +14 -7
- data/spec/unit/models/invitation_spec.rb +2 -2
- data/spec/unit/models/membership_spec.rb +5 -5
- data/spec/unit/models/metric_spec.rb +92 -0
- data/spec/unit/models/profile_spec.rb +25 -21
- data/spec/unit/models/project_blueprint_spec.rb +6 -6
- data/spec/unit/models/project_role_spec.rb +3 -5
- data/spec/unit/models/project_spec.rb +43 -37
- data/spec/unit/models/schedule_spec.rb +58 -107
- data/spec/unit/rest/resource_spec.rb +6 -0
- metadata +87 -10
- data/lib/gooddata/cli/commands/role_cmd.rb +0 -28
- data/lib/gooddata/core/connection.rb +0 -392
- data/lib/gooddata/core/threaded.rb +0 -14
- data/lib/gooddata/models/md_object.rb +0 -25
- data/lib/gooddata/models/metadata/folder.rb +0 -24
- data/spec/unit/models/md_object_spec.rb +0 -55
- data/spec/unit/models/metric.rb +0 -92
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../connection'
|
|
4
|
+
|
|
5
|
+
module GoodData
|
|
6
|
+
module Rest
|
|
7
|
+
module Connections
|
|
8
|
+
# Implementation of GoodData::Rest::Connection using https://rubygems.org/gems/rest-client
|
|
9
|
+
class DummyConnection < GoodData::Rest::Connection
|
|
10
|
+
def initialize(opts = {})
|
|
11
|
+
super
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Connect using username and password
|
|
15
|
+
def connect(username, password)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Disconnect
|
|
19
|
+
def disconnect
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# HTTP DELETE
|
|
23
|
+
#
|
|
24
|
+
# @param uri [String] Target URI
|
|
25
|
+
def delete(uri, options = {})
|
|
26
|
+
puts "DELETE #{uri}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# HTTP GET
|
|
30
|
+
#
|
|
31
|
+
# @param uri [String] Target URI
|
|
32
|
+
def get(uri, options = {})
|
|
33
|
+
puts "GET #{uri}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# HTTP PUT
|
|
37
|
+
#
|
|
38
|
+
# @param uri [String] Target URI
|
|
39
|
+
def put(uri, data, options = {})
|
|
40
|
+
puts "PUT #{uri}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# HTTP POST
|
|
44
|
+
#
|
|
45
|
+
# @param uri [String] Target URI
|
|
46
|
+
def post(uri, data, options = {})
|
|
47
|
+
puts "POST #{uri}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative '../connection'
|
|
4
|
+
|
|
5
|
+
require 'multi_json'
|
|
6
|
+
require 'rest-client'
|
|
7
|
+
|
|
8
|
+
module GoodData
|
|
9
|
+
module Rest
|
|
10
|
+
module Connections
|
|
11
|
+
# Implementation of GoodData::Rest::Connection using https://rubygems.org/gems/rest-client
|
|
12
|
+
class RestClientConnection < GoodData::Rest::Connection
|
|
13
|
+
def initialize(opts = {})
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
@headers = DEFAULT_HEADERS.dup
|
|
17
|
+
@user = nil
|
|
18
|
+
@server = nil
|
|
19
|
+
|
|
20
|
+
@opts = opts
|
|
21
|
+
headers = opts[:headers] || {}
|
|
22
|
+
@headers.merge! headers
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Connect using username and password
|
|
26
|
+
def connect(username, password, options = {})
|
|
27
|
+
server = options[:server] || DEFAULT_URL
|
|
28
|
+
@server = RestClient::Resource.new server, DEFAULT_LOGIN_PAYLOAD
|
|
29
|
+
|
|
30
|
+
super
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# HTTP DELETE
|
|
34
|
+
#
|
|
35
|
+
# @param uri [String] Target URI
|
|
36
|
+
def delete(uri, options = {})
|
|
37
|
+
GoodData.logger.debug "DELETE: #{uri}"
|
|
38
|
+
profile "DELETE #{uri}" do
|
|
39
|
+
b = proc { @server[uri].delete cookies }
|
|
40
|
+
process_response(options, &b)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# HTTP GET
|
|
45
|
+
#
|
|
46
|
+
# @param uri [String] Target URI
|
|
47
|
+
def get(uri, options = {})
|
|
48
|
+
GoodData.logger.debug "GET: #{uri}"
|
|
49
|
+
profile "GET #{uri}" do
|
|
50
|
+
b = proc { @server[uri].get cookies }
|
|
51
|
+
process_response(options, &b)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# HTTP PUT
|
|
56
|
+
#
|
|
57
|
+
# @param uri [String] Target URI
|
|
58
|
+
def put(uri, data, options = {})
|
|
59
|
+
payload = data.is_a?(Hash) ? data.to_json : data
|
|
60
|
+
GoodData.logger.debug "PUT: #{uri}, #{data}"
|
|
61
|
+
profile "PUT #{uri}" do
|
|
62
|
+
b = proc { @server[uri].put payload, cookies }
|
|
63
|
+
process_response(options, &b)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# HTTP POST
|
|
68
|
+
#
|
|
69
|
+
# @param uri [String] Target URI
|
|
70
|
+
def post(uri, data, options = {})
|
|
71
|
+
GoodData.logger.debug "POST: #{uri}, #{data}"
|
|
72
|
+
profile "POST #{uri}" do
|
|
73
|
+
payload = data.is_a?(Hash) ? data.to_json : data
|
|
74
|
+
b = proc { @server[uri].post payload, cookies }
|
|
75
|
+
process_response(options, &b)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Uploads a file to GoodData server
|
|
80
|
+
# /uploads/ resources are special in that they use a different
|
|
81
|
+
# host and a basic authentication.
|
|
82
|
+
def upload(file, options = {})
|
|
83
|
+
dir = options[:directory] || ''
|
|
84
|
+
staging_uri = options[:staging_url].to_s
|
|
85
|
+
url = dir.empty? ? staging_uri : URI.join(staging_uri, "#{dir}/").to_s
|
|
86
|
+
|
|
87
|
+
# Make a directory, if needed
|
|
88
|
+
unless dir.empty?
|
|
89
|
+
method = :get
|
|
90
|
+
GoodData.logger.debug "#{method}: #{url}"
|
|
91
|
+
begin
|
|
92
|
+
# first check if it does exits
|
|
93
|
+
raw = {
|
|
94
|
+
:method => method,
|
|
95
|
+
:url => url,
|
|
96
|
+
# :timeout => @options[:timeout],
|
|
97
|
+
:headers => @headers
|
|
98
|
+
}.merge(cookies)
|
|
99
|
+
RestClient::Request.execute(raw)
|
|
100
|
+
rescue RestClient::Exception => e
|
|
101
|
+
if e.http_code == 404
|
|
102
|
+
method = :mkcol
|
|
103
|
+
GoodData.logger.debug "#{method}: #{url}"
|
|
104
|
+
raw = {
|
|
105
|
+
:method => method,
|
|
106
|
+
:url => url,
|
|
107
|
+
# :timeout => @options[:timeout],
|
|
108
|
+
:headers => @headers
|
|
109
|
+
}.merge(cookies)
|
|
110
|
+
RestClient::Request.execute(raw)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
payload = options[:stream] ? 'file' : File.read(file)
|
|
116
|
+
filename = options[:filename] || options[:stream] ? 'randome-filename.txt' : File.basename(file)
|
|
117
|
+
|
|
118
|
+
# Upload the file
|
|
119
|
+
# puts "uploading the file #{URI.join(url, filename).to_s}"
|
|
120
|
+
raw = {
|
|
121
|
+
:method => :put,
|
|
122
|
+
:url => URI.join(url, filename).to_s,
|
|
123
|
+
# :timeout => @options[:timeout],
|
|
124
|
+
:headers => {
|
|
125
|
+
:user_agent => GoodData.gem_version_string
|
|
126
|
+
},
|
|
127
|
+
:payload => payload,
|
|
128
|
+
:raw_response => true,
|
|
129
|
+
# :user => @username,
|
|
130
|
+
# :password => @password
|
|
131
|
+
}.merge(cookies)
|
|
132
|
+
RestClient::Request.execute(raw)
|
|
133
|
+
true
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
private
|
|
137
|
+
|
|
138
|
+
def process_response(options = {}, &block)
|
|
139
|
+
begin
|
|
140
|
+
response = block.call
|
|
141
|
+
rescue RestClient::Unauthorized
|
|
142
|
+
raise $ERROR_INFO if options[:dont_reauth]
|
|
143
|
+
refresh_token
|
|
144
|
+
response = block.call
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
merge_cookies! response.cookies
|
|
148
|
+
content_type = response.headers[:content_type]
|
|
149
|
+
return response if options[:process] == false
|
|
150
|
+
|
|
151
|
+
if content_type == 'application/json' || content_type == 'application/json;charset=UTF-8'
|
|
152
|
+
result = response.to_str == '""' ? {} : MultiJson.load(response.to_str)
|
|
153
|
+
GoodData.logger.debug "Response: #{result.inspect}"
|
|
154
|
+
elsif ['text/plain;charset=UTF-8', 'text/plain; charset=UTF-8', 'text/plain'].include?(content_type)
|
|
155
|
+
result = response
|
|
156
|
+
GoodData.logger.debug 'Response: plain text'
|
|
157
|
+
elsif content_type == 'application/zip'
|
|
158
|
+
result = response
|
|
159
|
+
GoodData.logger.debug 'Response: a zipped stream'
|
|
160
|
+
elsif response.headers[:content_length].to_s == '0'
|
|
161
|
+
result = nil
|
|
162
|
+
GoodData.logger.debug 'Response: Empty response possibly 204'
|
|
163
|
+
elsif response.code == 204
|
|
164
|
+
result = nil
|
|
165
|
+
GoodData.logger.debug 'Response: 204 no content'
|
|
166
|
+
else
|
|
167
|
+
fail "Unsupported response content type '%s':\n%s" % [content_type, response.to_str[0..127]]
|
|
168
|
+
end
|
|
169
|
+
result
|
|
170
|
+
rescue RestClient::Exception => e
|
|
171
|
+
GoodData.logger.debug "Response: #{e.response}"
|
|
172
|
+
raise $ERROR_INFO
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module GoodData
|
|
4
|
+
module Rest
|
|
5
|
+
# Base class dealing with REST endpoints
|
|
6
|
+
#
|
|
7
|
+
# MUST Be interface for objects dealing with REST endpoints
|
|
8
|
+
# MUST provide way to work with remote REST-like API in unified manner.
|
|
9
|
+
# MUST NOT create new connections.
|
|
10
|
+
class Object
|
|
11
|
+
attr_writer :client
|
|
12
|
+
attr_accessor :project
|
|
13
|
+
|
|
14
|
+
def initialize(opts = {})
|
|
15
|
+
@client = nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def client(opts = {})
|
|
19
|
+
@client || GoodData::Rest::Object.client(opts)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
def default_client
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def client(opts = { :client => GoodData.connection })
|
|
27
|
+
opts[:client] # || GoodData.client
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative 'object'
|
|
4
|
+
|
|
5
|
+
module GoodData
|
|
6
|
+
module Rest
|
|
7
|
+
# Bridge between Rest::Object and Rest::Connection
|
|
8
|
+
#
|
|
9
|
+
# MUST be Responsible for creating new Rest::Object instances using proper Rest::Connection
|
|
10
|
+
# SHOULD be used for throttling, statistics, custom 'allocation strategies' ...
|
|
11
|
+
class ObjectFactory
|
|
12
|
+
attr_accessor :client
|
|
13
|
+
attr_accessor :connection
|
|
14
|
+
attr_accessor :objects
|
|
15
|
+
attr_accessor :resources
|
|
16
|
+
|
|
17
|
+
#################################
|
|
18
|
+
# Class methods
|
|
19
|
+
#################################
|
|
20
|
+
class << self
|
|
21
|
+
# Gets list of all GoodData::Rest::Object subclasses
|
|
22
|
+
#
|
|
23
|
+
# @return [Array<GoodData::Rest::Object>] Subclasses of GoodData::Rest::Object
|
|
24
|
+
def objects
|
|
25
|
+
ObjectSpace.each_object(Class).select { |klass| klass < GoodData::Rest::Object }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Gets list of all GoodData::Rest::Resource subclasses
|
|
29
|
+
#
|
|
30
|
+
# @return [Array<GoodData::Rest::Resource>] Subclasses of GoodData::Rest::Resource
|
|
31
|
+
def resources
|
|
32
|
+
ObjectSpace.each_object(Class).select { |klass| klass < GoodData::Rest::Resource }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Initializes instance of factory
|
|
37
|
+
#
|
|
38
|
+
# @param connection [GoodData::Rest::Connection] Connection used by factory
|
|
39
|
+
# @return [GoodData::Rest::ObjectFactory] Factory instance
|
|
40
|
+
def initialize(client)
|
|
41
|
+
fail ArgumentError 'Invalid connection passed' if client.nil?
|
|
42
|
+
|
|
43
|
+
@client = client
|
|
44
|
+
|
|
45
|
+
# Set connection used by factory
|
|
46
|
+
@connection = @client.connection
|
|
47
|
+
|
|
48
|
+
# Initialize internal factory map of GoodData::Rest::Object instances
|
|
49
|
+
@objects = ObjectFactory.objects
|
|
50
|
+
|
|
51
|
+
# Initialize internal factory map of GoodData::Rest::Resource instances
|
|
52
|
+
@resources = ObjectFactory.resources
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def create(type, data = {}, opts = {})
|
|
56
|
+
res = type.new(data)
|
|
57
|
+
res.client = client
|
|
58
|
+
res.project = opts[:project]
|
|
59
|
+
res
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def find(type, opts = {})
|
|
63
|
+
type.send('find', opts, @client)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require_relative 'object'
|
|
4
|
+
|
|
5
|
+
module GoodData
|
|
6
|
+
module Rest
|
|
7
|
+
# Base class for REST resources implementing (at least 'somehow') full CRUD
|
|
8
|
+
#
|
|
9
|
+
# IS responsible for wrapping full CRUD interface
|
|
10
|
+
class Resource < Object
|
|
11
|
+
# Default constructor passing all arguments to parent
|
|
12
|
+
def initialize(opts = {})
|
|
13
|
+
super
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require 'pathname'
|
|
4
|
+
|
|
5
|
+
base = Pathname(__FILE__).dirname.expand_path
|
|
6
|
+
Dir.glob(base + '*.rb').each do |file|
|
|
7
|
+
require_relative file
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module GoodData
|
|
11
|
+
module Rest
|
|
12
|
+
class << self
|
|
13
|
+
# Print GoodData::Rest internal info
|
|
14
|
+
def info
|
|
15
|
+
# TODO: Print objects
|
|
16
|
+
# TODO: Print resources
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/gooddata/version.rb
CHANGED
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><Graph author="tomaskorcak" created="Mon Jul 14 14:09:10 PDT 2014" guiVersion="3.4.4.P" id="1405372466943" licenseType="Commercial" modified="Mon Jul 14 14:19:14 PDT 2014" modifiedBy="tomaskorcak" name="graph" revision="1.1" showComponentDetails="true">
|
|
2
|
+
<Global>
|
|
3
|
+
<Property fileURL="workspace.prm" id="GraphParameter0"/>
|
|
4
|
+
<Dictionary/>
|
|
5
|
+
</Global>
|
|
6
|
+
<Phase number="0">
|
|
7
|
+
<Node enabled="enabled" fileURL="${DATA_SOURCE_DIR}/commits.csv" guiName="CSV Reader" guiX="68" guiY="191" id="CSV_READER" type="DATA_READER"/>
|
|
8
|
+
<Node enabled="enabled" guiName="CSV Writer" guiX="542" guiY="191" id="CSV_WRITER" type="DATA_WRITER"/>
|
|
9
|
+
<Edge fromNode="CSV_READER:0" guiBendpoints="" guiRouter="Manhattan" id="Edge0" inPort="Port 0 (in)" outPort="Port 0 (output)" toNode="CSV_WRITER:0"/>
|
|
10
|
+
</Phase>
|
|
11
|
+
</Graph>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#(Please use slash '/' character as a path delimiter in all path specifications, e.g., C:/Users/username/workspace/project)
|
|
2
|
+
|
|
3
|
+
PROJECT= .
|
|
4
|
+
DATA_DIR=${PROJECT}/data
|
|
5
|
+
DATA_SOURCE_DIR=${PROJECT}/data/source
|
|
6
|
+
DATA_TRANSFORM_DIR=${PROJECT}/data/transform
|
|
7
|
+
DATA_GOODDATA_DIR=${PROJECT}/data/gooddata
|
|
8
|
+
DATA_TMP_DIR=${PROJECT}/data/tmp
|
|
9
|
+
GRAPH_DIR=${PROJECT}/graph
|
|
10
|
+
META_DIR=${PROJECT}/meta
|
|
11
|
+
TRANS_DIR=${PROJECT}/trans
|
|
12
|
+
MODEL_DIR=${PROJECT}/model
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# GoodData working project
|
|
16
|
+
# GDC_PROJECT_ID identifies the GoodData working project. Transformed data will be uploaded into the datasets of the GoodData working project.
|
|
17
|
+
# The data model information necessary for transformation definition is also obtained from this project.
|
|
18
|
+
# You can find the ID of a project in the project context menu in Server Explorer.
|
|
19
|
+
GDC_PROJECT_ID=xjpnhabzbnpn9cgngnmf9kwpih4hpkni
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
puts 'HELLO WORLD'
|
|
Binary file
|