gooddata 0.6.7 → 0.6.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|