gooddata 0.6.7 → 0.6.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -1
  3. data/README.md +10 -2
  4. data/TODO.md +32 -0
  5. data/gooddata.gemspec +5 -0
  6. data/lib/gooddata.rb +4 -0
  7. data/lib/gooddata/app/app.rb +12 -0
  8. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +4 -3
  9. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +2 -1
  10. data/lib/gooddata/cli/commands/console_cmd.rb +23 -5
  11. data/lib/gooddata/cli/commands/domain_cmd.rb +9 -10
  12. data/lib/gooddata/cli/commands/process_cmd.rb +11 -9
  13. data/lib/gooddata/cli/commands/project_cmd.rb +25 -27
  14. data/lib/gooddata/cli/commands/projects_cmd.rb +2 -2
  15. data/lib/gooddata/cli/commands/run_ruby_cmd.rb +1 -1
  16. data/lib/gooddata/cli/commands/user_cmd.rb +2 -2
  17. data/lib/gooddata/cli/hooks.rb +4 -2
  18. data/lib/gooddata/cli/shared.rb +1 -1
  19. data/lib/gooddata/cli/terminal.rb +1 -1
  20. data/lib/gooddata/commands/api.rb +1 -1
  21. data/lib/gooddata/commands/auth.rb +4 -28
  22. data/lib/gooddata/commands/domain.rb +9 -4
  23. data/lib/gooddata/commands/process.rb +26 -23
  24. data/lib/gooddata/commands/project.rb +74 -50
  25. data/lib/gooddata/commands/projects.rb +3 -2
  26. data/lib/gooddata/commands/role.rb +9 -3
  27. data/lib/gooddata/commands/user.rb +6 -4
  28. data/lib/gooddata/connection.rb +11 -45
  29. data/lib/gooddata/core/logging.rb +0 -1
  30. data/lib/gooddata/core/project.rb +22 -22
  31. data/lib/gooddata/core/rest.rb +9 -8
  32. data/lib/gooddata/core/user.rb +0 -11
  33. data/lib/gooddata/exceptions/project_not_found.rb +1 -0
  34. data/lib/gooddata/extensions/enumerable.rb +10 -0
  35. data/lib/gooddata/extensions/hash.rb +25 -0
  36. data/lib/gooddata/goodzilla/goodzilla.rb +4 -4
  37. data/lib/gooddata/helper/class_helper.rb +1 -0
  38. data/lib/gooddata/helper/helpers.rb +8 -0
  39. data/lib/gooddata/helpers/auth_helpers.rb +41 -0
  40. data/lib/gooddata/mixins/author.rb +1 -1
  41. data/lib/gooddata/mixins/contributor.rb +1 -1
  42. data/lib/gooddata/mixins/data_property_reader.rb +2 -0
  43. data/lib/gooddata/mixins/data_property_writer.rb +2 -0
  44. data/lib/gooddata/mixins/inspector.rb +49 -0
  45. data/lib/gooddata/mixins/md_finders.rb +16 -8
  46. data/lib/gooddata/mixins/md_id_to_uri.rb +12 -4
  47. data/lib/gooddata/mixins/md_object_indexer.rb +15 -4
  48. data/lib/gooddata/mixins/md_object_query.rb +42 -20
  49. data/lib/gooddata/mixins/md_relations.rb +21 -12
  50. data/lib/gooddata/mixins/meta_getter.rb +2 -0
  51. data/lib/gooddata/mixins/meta_property_reader.rb +2 -0
  52. data/lib/gooddata/mixins/meta_property_writer.rb +2 -0
  53. data/lib/gooddata/mixins/rest_resource.rb +32 -10
  54. data/lib/gooddata/mixins/root_key_getter.rb +1 -1
  55. data/lib/gooddata/models/data_result.rb +3 -1
  56. data/lib/gooddata/models/domain.rb +31 -22
  57. data/lib/gooddata/models/empty_result.rb +22 -0
  58. data/lib/gooddata/models/invitation.rb +11 -9
  59. data/lib/gooddata/models/links.rb +5 -3
  60. data/lib/gooddata/models/membership.rb +23 -28
  61. data/lib/gooddata/models/metadata.rb +35 -35
  62. data/lib/gooddata/models/metadata/attribute.rb +10 -8
  63. data/lib/gooddata/models/metadata/dashboard.rb +1 -1
  64. data/lib/gooddata/models/metadata/fact.rb +3 -3
  65. data/lib/gooddata/models/metadata/label.rb +4 -4
  66. data/lib/gooddata/models/metadata/metric.rb +76 -38
  67. data/lib/gooddata/models/metadata/report.rb +52 -17
  68. data/lib/gooddata/models/metadata/report_definition.rb +178 -28
  69. data/lib/gooddata/models/model.rb +13 -6
  70. data/lib/gooddata/models/process.rb +93 -30
  71. data/lib/gooddata/models/profile.rb +18 -20
  72. data/lib/gooddata/models/project.rb +344 -127
  73. data/lib/gooddata/models/project_creator.rb +32 -22
  74. data/lib/gooddata/models/project_metadata.rb +26 -14
  75. data/lib/gooddata/models/project_role.rb +15 -17
  76. data/lib/gooddata/models/report_data_result.rb +4 -0
  77. data/lib/gooddata/models/schedule.rb +51 -20
  78. data/lib/gooddata/models/schema_blueprint.rb +9 -3
  79. data/lib/gooddata/rest/README.md +37 -0
  80. data/lib/gooddata/rest/client.rb +318 -0
  81. data/lib/gooddata/rest/connection.rb +235 -0
  82. data/lib/gooddata/rest/connections/connections.rb +8 -0
  83. data/lib/gooddata/rest/connections/dummy_connection.rb +52 -0
  84. data/lib/gooddata/rest/connections/rest_client_connection.rb +177 -0
  85. data/lib/gooddata/rest/object.rb +32 -0
  86. data/lib/gooddata/rest/object_factory.rb +67 -0
  87. data/lib/gooddata/rest/resource.rb +17 -0
  88. data/lib/gooddata/rest/rest.rb +20 -0
  89. data/lib/gooddata/version.rb +1 -1
  90. data/spec/data/cc/data/source/commits.csv +4 -0
  91. data/spec/data/cc/data/source/devs.csv +4 -0
  92. data/spec/data/cc/data/source/repos.csv +3 -0
  93. data/spec/data/cc/devel.prm +0 -0
  94. data/spec/data/cc/graph/graph.grf +11 -0
  95. data/spec/data/cc/workspace.prm +19 -0
  96. data/spec/data/hello_world_process/hello_world.rb +1 -0
  97. data/spec/data/hello_world_process/hello_world.zip +0 -0
  98. data/spec/data/users.csv +12 -12
  99. data/spec/helpers/connection_helper.rb +6 -0
  100. data/spec/helpers/process_helper.rb +12 -0
  101. data/spec/helpers/project_helper.rb +2 -2
  102. data/spec/integration/command_projects_spec.rb +11 -9
  103. data/spec/integration/create_from_template_spec.rb +6 -2
  104. data/spec/integration/full_process_schedule_spec.rb +49 -36
  105. data/spec/integration/full_project_spec.rb +221 -256
  106. data/spec/integration/partial_md_export_import_spec.rb +18 -17
  107. data/spec/logging_in_logging_out_spec.rb +17 -8
  108. data/spec/spec_helper.rb +4 -2
  109. data/spec/unit/cli/commands/cmd_api_spec.rb +1 -1
  110. data/spec/unit/cli/commands/cmd_auth_spec.rb +1 -1
  111. data/spec/unit/cli/commands/cmd_domain_spec.rb +29 -3
  112. data/spec/unit/cli/commands/cmd_process_spec.rb +1 -1
  113. data/spec/unit/cli/commands/cmd_project_spec.rb +1 -1
  114. data/spec/unit/cli/commands/cmd_role_spec.rb +13 -2
  115. data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +1 -1
  116. data/spec/unit/cli/commands/cmd_scaffold_spec.rb +1 -1
  117. data/spec/unit/cli/commands/cmd_user_spec.rb +1 -1
  118. data/spec/unit/commands/command_api_spec.rb +0 -19
  119. data/spec/unit/commands/command_auth_spec.rb +20 -13
  120. data/spec/unit/commands/command_dataset_spec.rb +2 -2
  121. data/spec/unit/commands/command_process_spec.rb +24 -21
  122. data/spec/unit/commands/command_projects_spec.rb +2 -2
  123. data/spec/unit/commands/command_scaffold_spec.rb +2 -2
  124. data/spec/unit/commands/command_user_spec.rb +3 -3
  125. data/spec/unit/core/connection_spec.rb +9 -10
  126. data/spec/unit/core/project_spec.rb +8 -4
  127. data/spec/unit/core/rest_spec.rb +6 -6
  128. data/spec/unit/models/domain_spec.rb +14 -7
  129. data/spec/unit/models/invitation_spec.rb +2 -2
  130. data/spec/unit/models/membership_spec.rb +5 -5
  131. data/spec/unit/models/metric_spec.rb +92 -0
  132. data/spec/unit/models/profile_spec.rb +25 -21
  133. data/spec/unit/models/project_blueprint_spec.rb +6 -6
  134. data/spec/unit/models/project_role_spec.rb +3 -5
  135. data/spec/unit/models/project_spec.rb +43 -37
  136. data/spec/unit/models/schedule_spec.rb +58 -107
  137. data/spec/unit/rest/resource_spec.rb +6 -0
  138. metadata +87 -10
  139. data/lib/gooddata/cli/commands/role_cmd.rb +0 -28
  140. data/lib/gooddata/core/connection.rb +0 -392
  141. data/lib/gooddata/core/threaded.rb +0 -14
  142. data/lib/gooddata/models/md_object.rb +0 -25
  143. data/lib/gooddata/models/metadata/folder.rb +0 -24
  144. data/spec/unit/models/md_object_spec.rb +0 -55
  145. data/spec/unit/models/metric.rb +0 -92
@@ -0,0 +1,8 @@
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
@@ -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
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GoodData Module
4
4
  module GoodData
5
- VERSION = '0.6.7'
5
+ VERSION = '0.6.8'
6
6
 
7
7
  class << self
8
8
  # Version
@@ -0,0 +1,4 @@
1
+ lines_changed,committed_on,dev_id,repo_id
2
+ 1,01/01/2014,1,1
3
+ 3,01/02/2014,2,2
4
+ 5,05/02/2014,3,1
@@ -0,0 +1,4 @@
1
+ dev_id,email
2
+ 1,tomas@gooddata.com
3
+ 2,petr@gooddata.com
4
+ 3,jirka@gooddata.com
@@ -0,0 +1,3 @@
1
+ repo_id,name
2
+ 1,gooddata-gem
3
+ 2,gooddata-platform
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'