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.
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'