gooddata 0.6.0 → 0.6.2
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 +13 -5
- data/.rubocop.yml +23 -0
- data/.travis.yml +9 -4
- data/CLI.md +439 -0
- data/Gemfile +0 -1
- data/README.md +2 -2
- data/Rakefile +60 -8
- data/doc/templates/default/module/setup.rb +1 -1
- data/examples.rb +2 -0
- data/gooddata +2 -0
- data/gooddata.gemspec +12 -8
- data/lib/gooddata.rb +0 -2
- data/lib/gooddata/bricks/base_downloader.rb +52 -47
- data/lib/gooddata/bricks/brick.rb +20 -31
- data/lib/gooddata/bricks/bricks.rb +1 -1
- data/lib/gooddata/bricks/middleware/base_middleware.rb +9 -7
- data/lib/gooddata/bricks/middleware/bench_middleware.rb +12 -10
- data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +28 -28
- data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +20 -16
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +21 -19
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +10 -8
- data/lib/gooddata/bricks/middleware/restforce_middleware.rb +36 -34
- data/lib/gooddata/bricks/middleware/stdout_middleware.rb +11 -9
- data/lib/gooddata/bricks/middleware/twitter_middleware.rb +14 -12
- data/lib/gooddata/bricks/pipeline.rb +28 -0
- data/lib/gooddata/bricks/utils.rb +10 -8
- data/lib/gooddata/cli/cli.rb +1 -6
- data/lib/gooddata/cli/commands/auth_cmd.rb +1 -1
- data/lib/gooddata/cli/commands/console_cmd.rb +7 -5
- data/lib/gooddata/cli/commands/domain_cmd.rb +45 -0
- data/lib/gooddata/cli/commands/process_cmd.rb +42 -5
- data/lib/gooddata/cli/commands/project_cmd.rb +96 -36
- data/lib/gooddata/cli/commands/projects_cmd.rb +21 -0
- data/lib/gooddata/cli/commands/role_cmd.rb +28 -0
- data/lib/gooddata/cli/commands/run_ruby_cmd.rb +5 -5
- data/lib/gooddata/cli/commands/scaffold_cmd.rb +1 -1
- data/lib/gooddata/cli/commands/{profile_cmd.rb → user_cmd.rb} +7 -9
- data/lib/gooddata/cli/shared.rb +3 -2
- data/lib/gooddata/client.rb +16 -304
- data/lib/gooddata/commands/api.rb +13 -5
- data/lib/gooddata/commands/auth.rb +47 -40
- data/lib/gooddata/commands/base.rb +4 -2
- data/lib/gooddata/commands/commands.rb +1 -1
- data/lib/gooddata/commands/datasets.rb +20 -7
- data/lib/gooddata/commands/domain.rb +23 -0
- data/lib/gooddata/commands/process.rb +23 -117
- data/lib/gooddata/commands/project.rb +147 -0
- data/lib/gooddata/commands/projects.rb +8 -102
- data/lib/gooddata/commands/role.rb +26 -0
- data/lib/gooddata/commands/runners.rb +41 -38
- data/lib/gooddata/commands/scaffold.rb +46 -43
- data/lib/gooddata/commands/user.rb +33 -0
- data/lib/gooddata/connection.rb +43 -353
- data/lib/gooddata/core/connection.rb +389 -0
- data/lib/gooddata/core/core.rb +5 -4
- data/lib/gooddata/core/logging.rb +48 -0
- data/lib/gooddata/core/nil_logger.rb +13 -0
- data/lib/gooddata/core/project.rb +70 -0
- data/lib/gooddata/core/rest.rb +120 -0
- data/lib/gooddata/core/threaded.rb +14 -0
- data/lib/gooddata/core/user.rb +19 -0
- data/lib/gooddata/data/data.rb +2 -1
- data/lib/gooddata/data/guesser.rb +16 -12
- data/lib/gooddata/exceptions/command_failed.rb +1 -1
- data/lib/gooddata/exceptions/exceptions.rb +2 -1
- data/lib/gooddata/exceptions/no_project_error.rb +11 -0
- data/lib/gooddata/exceptions/project_not_found.rb +1 -1
- data/lib/gooddata/extensions/big_decimal.rb +6 -2
- data/lib/gooddata/extract.rb +10 -8
- data/lib/gooddata/goodzilla/goodzilla.rb +61 -59
- data/lib/gooddata/helpers.rb +15 -9
- data/lib/gooddata/models/account_settings.rb +124 -0
- data/lib/gooddata/models/attributes/anchor.rb +37 -0
- data/lib/gooddata/models/attributes/attributes.rb +8 -0
- data/lib/gooddata/models/attributes/date_attribute.rb +25 -0
- data/lib/gooddata/models/attributes/time_attribute.rb +24 -0
- data/lib/gooddata/models/columns/attribute.rb +71 -0
- data/lib/gooddata/models/columns/columns.rb +8 -0
- data/lib/gooddata/models/columns/date_column.rb +63 -0
- data/lib/gooddata/models/columns/fact_model.rb +54 -0
- data/lib/gooddata/models/columns/label.rb +55 -0
- data/lib/gooddata/models/columns/reference.rb +57 -0
- data/lib/gooddata/models/dashboard_builder.rb +26 -0
- data/lib/gooddata/models/data_result.rb +10 -9
- data/lib/gooddata/models/domain.rb +131 -0
- data/lib/gooddata/models/empty_result.rb +5 -8
- data/lib/gooddata/models/facts/facts.rb +8 -0
- data/lib/gooddata/models/facts/time_fact.rb +20 -0
- data/lib/gooddata/models/folders/attribute_folder.rb +20 -0
- data/lib/gooddata/models/folders/fact_folder.rb +20 -0
- data/lib/gooddata/models/folders/folders.rb +8 -0
- data/lib/gooddata/models/invitation.rb +78 -0
- data/lib/gooddata/models/links.rb +6 -6
- data/lib/gooddata/models/md_object.rb +25 -0
- data/lib/gooddata/models/metadata.rb +160 -62
- data/lib/gooddata/models/metadata/attribute.rb +81 -0
- data/lib/gooddata/models/metadata/column.rb +61 -0
- data/lib/gooddata/models/{dashboard.rb → metadata/dashboard.rb} +12 -7
- data/lib/gooddata/models/{data_set.rb → metadata/data_set.rb} +5 -4
- data/lib/gooddata/models/metadata/date_dimension.rb +26 -0
- data/lib/gooddata/models/metadata/display_form.rb +61 -0
- data/lib/gooddata/models/metadata/fact.rb +36 -0
- data/lib/gooddata/models/metadata/folder.rb +24 -0
- data/lib/gooddata/models/metadata/metadata.rb +8 -0
- data/lib/gooddata/models/metadata/metric.rb +197 -0
- data/lib/gooddata/models/metadata/report.rb +115 -0
- data/lib/gooddata/models/{report_definition.rb → metadata/report_definition.rb} +16 -10
- data/lib/gooddata/models/metadata/schema.rb +227 -0
- data/lib/gooddata/models/model.rb +38 -1339
- data/lib/gooddata/models/models.rb +5 -2
- data/lib/gooddata/models/module_constants.rb +29 -0
- data/lib/gooddata/models/process.rb +142 -13
- data/lib/gooddata/models/profile.rb +4 -6
- data/lib/gooddata/models/project.rb +406 -136
- data/lib/gooddata/models/project_blueprint.rb +221 -0
- data/lib/gooddata/models/project_builder.rb +136 -0
- data/lib/gooddata/models/project_creator.rb +138 -0
- data/lib/gooddata/models/project_metadata.rb +11 -10
- data/lib/gooddata/models/project_role.rb +92 -0
- data/lib/gooddata/models/references/date_reference.rb +44 -0
- data/lib/gooddata/models/references/references.rb +8 -0
- data/lib/gooddata/models/references/time_reference.rb +13 -0
- data/lib/gooddata/models/report_data_result.rb +11 -11
- data/lib/gooddata/models/schedule.rb +284 -0
- data/lib/gooddata/models/schema_blueprint.rb +158 -0
- data/lib/gooddata/models/schema_builder.rb +81 -0
- data/lib/gooddata/models/tab_builder.rb +23 -0
- data/lib/gooddata/models/user.rb +165 -0
- data/lib/gooddata/version.rb +1 -1
- data/lib/templates/project/data/devs.csv +1 -1
- data/lib/templates/project/data/repos.csv +1 -1
- data/lib/templates/project/model/model.rb.erb +7 -11
- data/spec/bricks/bricks_spec.rb +2 -0
- data/spec/data/test-ci-data.csv +2 -0
- data/spec/data/test_project_model_spec.json +7 -27
- data/spec/helpers/blueprint_helper.rb +2 -0
- data/spec/helpers/cli_helper.rb +2 -0
- data/spec/helpers/connection_helper.rb +14 -1
- data/spec/helpers/project_helper.rb +16 -0
- data/spec/helpers/schema_helper.rb +16 -0
- data/spec/integration/command_projects_spec.rb +7 -7
- data/spec/integration/create_from_template_spec.rb +2 -2
- data/spec/integration/full_project_spec.rb +160 -7
- data/spec/integration/partial_md_export_import_spec.rb +3 -3
- data/spec/logging_in_logging_out_spec.rb +2 -1
- data/spec/spec_helper.rb +26 -4
- data/spec/unit/bricks/bricks_spec.rb +15 -7
- data/spec/unit/bricks/middleware/bench_middleware_spec.rb +2 -0
- data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +2 -0
- data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +2 -0
- data/spec/unit/bricks/middleware/logger_middleware_spec.rb +2 -0
- data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +2 -0
- data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +2 -0
- data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +2 -0
- data/spec/unit/cli/cli_spec.rb +2 -0
- data/spec/unit/cli/commands/cmd_api_spec.rb +23 -15
- data/spec/unit/cli/commands/cmd_auth_spec.rb +8 -4
- data/spec/unit/cli/commands/cmd_domain_spec.rb +82 -0
- data/spec/unit/cli/commands/cmd_process_spec.rb +29 -13
- data/spec/unit/cli/commands/cmd_project_spec.rb +51 -30
- data/spec/unit/cli/commands/cmd_role_spec.rb +44 -0
- data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +8 -4
- data/spec/unit/cli/commands/cmd_scaffold_spec.rb +48 -11
- data/spec/unit/cli/commands/cmd_user_spec.rb +29 -0
- data/spec/unit/commands/command_api_spec.rb +1 -1
- data/spec/unit/commands/command_auth_spec.rb +100 -18
- data/spec/unit/commands/command_dataset_spec.rb +4 -0
- data/spec/unit/commands/command_process_spec.rb +9 -4
- data/spec/unit/commands/command_projects_spec.rb +10 -6
- data/spec/unit/commands/command_scaffold_spec.rb +5 -1
- data/spec/unit/commands/command_user_spec.rb +22 -0
- data/spec/unit/core/connection_spec.rb +35 -6
- data/spec/unit/core/logging_spec.rb +65 -0
- data/spec/unit/core/nil_logger_spec.rb +9 -0
- data/spec/unit/core/project_spec.rb +51 -0
- data/spec/unit/core/rest_spec.rb +33 -0
- data/spec/unit/data/guesser_spec.rb +5 -0
- data/spec/unit/godzilla/goodzilla_spec.rb +2 -0
- data/spec/unit/models/account_settings_spec.rb +28 -0
- data/spec/unit/models/anchor_spec.rb +32 -0
- data/spec/unit/models/attribute_column_spec.rb +7 -0
- data/spec/unit/models/domain_spec.rb +45 -0
- data/spec/unit/models/invitation_spec.rb +13 -0
- data/spec/unit/models/md_object_spec.rb +47 -0
- data/spec/unit/models/metric.rb +92 -0
- data/spec/unit/{model → models}/model_spec.rb +9 -7
- data/spec/unit/models/project_blueprint_spec.rb +202 -0
- data/spec/unit/models/project_creator.rb +73 -0
- data/spec/unit/models/project_role_spec.rb +90 -0
- data/spec/unit/models/project_spec.rb +143 -0
- data/spec/unit/models/schedule_spec.rb +491 -0
- data/spec/unit/{model → models}/schema_builder_spec.rb +2 -0
- data/spec/unit/{model → models}/tools_spec.rb +13 -7
- data/spec/unit/models/user_spec.rb +16 -0
- data/test/test_upload.rb +2 -0
- metadata +189 -86
- data/lib/gooddata/commands/profile.rb +0 -11
- data/lib/gooddata/models/attribute.rb +0 -29
- data/lib/gooddata/models/display_form.rb +0 -9
- data/lib/gooddata/models/fact.rb +0 -19
- data/lib/gooddata/models/metric.rb +0 -99
- data/lib/gooddata/models/report.rb +0 -89
- data/spec/data/blueprint_valid.json +0 -37
- data/spec/unit/cli/commands/cmd_profile_spec.rb +0 -16
- data/spec/unit/commands/command_profile_spec.rb +0 -18
- data/spec/unit/core/core_spec.rb +0 -7
- data/spec/unit/model/blueprint_spec.rb +0 -132
- data/spec/unit/model/project_blueprint_spec.rb +0 -44
|
@@ -7,11 +7,14 @@ module GoodData
|
|
|
7
7
|
ProjectMetadata[:all].keys
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def [](key)
|
|
10
|
+
def [](key, options = {})
|
|
11
11
|
if key == :all
|
|
12
12
|
uri = "/gdc/projects/#{GoodData.project.pid}/dataload/metadata"
|
|
13
13
|
res = GoodData.get(uri)
|
|
14
|
-
res['metadataItems']['items'].reduce({})
|
|
14
|
+
res['metadataItems']['items'].reduce({}) do |memo, i|
|
|
15
|
+
memo[i['metadataItem']['key']] = i['metadataItem']['value']
|
|
16
|
+
memo
|
|
17
|
+
end
|
|
15
18
|
else
|
|
16
19
|
uri = "/gdc/projects/#{GoodData.project.pid}/dataload/metadata/#{key}"
|
|
17
20
|
res = GoodData.get(uri)
|
|
@@ -22,13 +25,11 @@ module GoodData
|
|
|
22
25
|
alias_method :get, :[]
|
|
23
26
|
alias_method :get_key, :[]
|
|
24
27
|
|
|
25
|
-
def
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
false
|
|
31
|
-
end
|
|
28
|
+
def key?(key)
|
|
29
|
+
ProjectMetadata[key]
|
|
30
|
+
true
|
|
31
|
+
rescue RestClient::ResourceNotFound
|
|
32
|
+
false
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
def []=(key, val)
|
|
@@ -41,7 +42,7 @@ module GoodData
|
|
|
41
42
|
uri = "/gdc/projects/#{GoodData.project.pid}/dataload/metadata/"
|
|
42
43
|
update_uri = uri + key
|
|
43
44
|
|
|
44
|
-
if
|
|
45
|
+
if key?(key)
|
|
45
46
|
GoodData.put(update_uri, data)
|
|
46
47
|
else
|
|
47
48
|
GoodData.post(uri, data)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative 'account_settings'
|
|
4
|
+
|
|
5
|
+
module GoodData
|
|
6
|
+
class ProjectRole
|
|
7
|
+
def initialize(json)
|
|
8
|
+
@json = json
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Gets Project Role Identifier
|
|
12
|
+
#
|
|
13
|
+
# @return [string] Project Role
|
|
14
|
+
def identifier
|
|
15
|
+
@json['projectRole']['meta']['identifier']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Gets Project Role Author
|
|
19
|
+
#
|
|
20
|
+
# @return [GoodData::AccountSettings] Project Role author
|
|
21
|
+
def author
|
|
22
|
+
url = @json['projectRole']['meta']['author']
|
|
23
|
+
tmp = GoodData.get url
|
|
24
|
+
GoodData::AccountSettings.new(tmp)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Gets Project Role Contributor
|
|
28
|
+
#
|
|
29
|
+
# @return [GoodData::AccountSettings] Project Role Contributor
|
|
30
|
+
def contributor
|
|
31
|
+
url = @json['projectRole']['meta']['contributor']
|
|
32
|
+
tmp = GoodData.get url
|
|
33
|
+
GoodData::AccountSettings.new(tmp)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Gets DateTime time when created
|
|
37
|
+
#
|
|
38
|
+
# @return [DateTime] Date time of creation
|
|
39
|
+
def created
|
|
40
|
+
DateTime.parse(@json['projectRole']['meta']['created'])
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Gets Project Role Permissions
|
|
44
|
+
#
|
|
45
|
+
# @return [string] Project Role
|
|
46
|
+
def permissions
|
|
47
|
+
@json['projectRole']['permissions']
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Gets Project Role Title
|
|
51
|
+
#
|
|
52
|
+
# @return [string] Project Role Title
|
|
53
|
+
def title
|
|
54
|
+
@json['projectRole']['meta']['title']
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Gets Project Role Summary
|
|
58
|
+
#
|
|
59
|
+
# @return [string] Project Role Summary
|
|
60
|
+
def summary
|
|
61
|
+
@json['projectRole']['meta']['summary']
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Gets DateTime time when updated
|
|
65
|
+
#
|
|
66
|
+
# @return [DateTime] Date time of last update
|
|
67
|
+
def updated
|
|
68
|
+
DateTime.parse(@json['projectRole']['meta']['updated'])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Gets Users with this Role
|
|
72
|
+
#
|
|
73
|
+
# @return [Array<GoodData::AccountSettings>] List of users
|
|
74
|
+
def users
|
|
75
|
+
res = []
|
|
76
|
+
url = @json['projectRole']['links']['roleUsers']
|
|
77
|
+
tmp = GoodData.get url
|
|
78
|
+
tmp['associatedUsers']['users'].each do |user_url|
|
|
79
|
+
user = GoodData.get user_url
|
|
80
|
+
res << GoodData::AccountSettings.new(user)
|
|
81
|
+
end
|
|
82
|
+
res
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Gets Raw object URI
|
|
86
|
+
#
|
|
87
|
+
# @return [string] URI of this project role
|
|
88
|
+
def uri
|
|
89
|
+
@json['projectRole']['links']['roleUsers'].split('/')[0...-1].join('/')
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
require_relative '../columns/reference'
|
|
4
|
+
|
|
5
|
+
module GoodData
|
|
6
|
+
module Model
|
|
7
|
+
##
|
|
8
|
+
# Date as a reference to a date dimension
|
|
9
|
+
#
|
|
10
|
+
class DateReference < Reference
|
|
11
|
+
attr_accessor :format, :output_format, :urn
|
|
12
|
+
|
|
13
|
+
def initialize(column, schema)
|
|
14
|
+
super column, schema
|
|
15
|
+
@output_format = column['format'] || 'dd/MM/yyyy'
|
|
16
|
+
@format = @output_format.gsub('yyyy', '%Y').gsub('MM', '%m').gsub('dd', '%d')
|
|
17
|
+
@urn = column[:urn] || 'URN:GOODDATA:DATE'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def identifier
|
|
21
|
+
@identifier ||= "#{@schema_ref}.#{DATE_ATTRIBUTE}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_manifest_part(mode)
|
|
25
|
+
{
|
|
26
|
+
'populates' => ["#{identifier}.#{DATE_ATTRIBUTE_DEFAULT_DISPLAY_FORM}"],
|
|
27
|
+
'mode' => mode,
|
|
28
|
+
'constraints' => { 'date' => output_format },
|
|
29
|
+
'columnName' => name,
|
|
30
|
+
'referenceKey' => 1
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# def to_maql_create
|
|
35
|
+
# # urn:chefs_warehouse_fiscal:date
|
|
36
|
+
# super_maql = super
|
|
37
|
+
# maql = ""
|
|
38
|
+
# # maql = "# Include date dimensions\n"
|
|
39
|
+
# # maql += "INCLUDE TEMPLATE \"#{urn}\" MODIFY (IDENTIFIER \"#{name}\", TITLE \"#{title || name}\");\n"
|
|
40
|
+
# maql += super_maql
|
|
41
|
+
# end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -34,7 +34,7 @@ module GoodData
|
|
|
34
34
|
to_table.each { |line| yield line }
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
alias_method :each_row, :each_line
|
|
38
38
|
|
|
39
39
|
def each_column
|
|
40
40
|
table.each { |line| yield line }
|
|
@@ -48,11 +48,11 @@ module GoodData
|
|
|
48
48
|
table.transpose
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
def [](index)
|
|
51
|
+
def [](index, options = {})
|
|
52
52
|
to_table[index]
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
alias_method :row, :[]
|
|
56
56
|
|
|
57
57
|
def column(index)
|
|
58
58
|
table[index]
|
|
@@ -66,13 +66,12 @@ module GoodData
|
|
|
66
66
|
table.include?(row)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
def ==
|
|
70
|
-
result = true
|
|
69
|
+
def ==(other)
|
|
71
70
|
csv_table = to_table
|
|
72
71
|
len = csv_table.length
|
|
73
|
-
table =
|
|
72
|
+
table = other.respond_to?(:to_table) ? other.to_table : other
|
|
74
73
|
return false if len != table.length
|
|
75
|
-
diff(
|
|
74
|
+
diff(other).empty? ? true : false
|
|
76
75
|
end
|
|
77
76
|
|
|
78
77
|
def diff(otherDataResult)
|
|
@@ -81,12 +80,13 @@ module GoodData
|
|
|
81
80
|
differences = []
|
|
82
81
|
|
|
83
82
|
csv_table.each do |row|
|
|
84
|
-
differences << row unless other_table.
|
|
83
|
+
differences << row unless other_table.find { |r| r == row }
|
|
85
84
|
end
|
|
86
85
|
differences
|
|
87
86
|
end
|
|
88
87
|
|
|
89
88
|
private
|
|
89
|
+
|
|
90
90
|
def each_level(table, level, children, lookup)
|
|
91
91
|
max_level = level + 1
|
|
92
92
|
children.each do |kid|
|
|
@@ -101,8 +101,8 @@ module GoodData
|
|
|
101
101
|
table[first + i][level] = lookup[level][kid['id'].to_s]
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
|
-
|
|
105
|
-
new_level = each_level(table, level+1, kid['children'], lookup)
|
|
104
|
+
unless kid['children'].empty?
|
|
105
|
+
new_level = each_level(table, level + 1, kid['children'], lookup)
|
|
106
106
|
max_level = [max_level, new_level].max
|
|
107
107
|
end
|
|
108
108
|
end
|
|
@@ -136,7 +136,7 @@ module GoodData
|
|
|
136
136
|
return headers, size # rubocop:disable RedundantReturn
|
|
137
137
|
end
|
|
138
138
|
|
|
139
|
-
def assemble_table
|
|
139
|
+
def assemble_table
|
|
140
140
|
# puts "=== COLUMNS === #{column_headers.size}x#{headers_height}"
|
|
141
141
|
(column_headers.size).times do |i|
|
|
142
142
|
(headers_height).times do |j|
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module GoodData
|
|
4
|
+
class Schedule
|
|
5
|
+
attr_reader :dirty
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
# Looks for schedule
|
|
9
|
+
# @param id [String] URL, ID of schedule or :all
|
|
10
|
+
# @return [GoodData::Schedule|Array<GoodData::Schedule>] List of schedules
|
|
11
|
+
def [](id, options = {})
|
|
12
|
+
if id == :all
|
|
13
|
+
GoodData::Schedule.all
|
|
14
|
+
else
|
|
15
|
+
if id =~ %r{\/gdc\/projects\/[a-zA-Z\d]+\/schedules\/?[a-zA-Z\d]*}
|
|
16
|
+
url = id
|
|
17
|
+
tmp = GoodData.get url
|
|
18
|
+
return GoodData::Schedule.new(tmp)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
tmp = GoodData.get "/gdc/projects/#{GoodData.project.pid}/schedules/#{id}"
|
|
22
|
+
GoodData::Schedule.new(tmp)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns list of all schedules for active project
|
|
27
|
+
# @return [Array<GoodData::Schedule>] List of schedules
|
|
28
|
+
def all
|
|
29
|
+
tmp = GoodData.get "/gdc/projects/#{GoodData.project.pid}/schedules"
|
|
30
|
+
tmp['schedules']['items'].map { |schedule| GoodData::Schedule.new(schedule) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Creates new schedules from parameters passed
|
|
34
|
+
#
|
|
35
|
+
# @param process_id [String] Process ID
|
|
36
|
+
# @param cron [String] Cron Settings
|
|
37
|
+
# @param executable [String] Execution executable
|
|
38
|
+
# @param options [Hash] Optional options
|
|
39
|
+
# @return [GoodData::Schedule] New GoodData::Schedule instance
|
|
40
|
+
def create(process_id, cron, executable, options = {})
|
|
41
|
+
default_opts = {
|
|
42
|
+
:type => 'MSETL',
|
|
43
|
+
:timezone => 'UTC',
|
|
44
|
+
:cron => cron,
|
|
45
|
+
:params => {
|
|
46
|
+
:process_id => process_id,
|
|
47
|
+
:executable => executable
|
|
48
|
+
},
|
|
49
|
+
:hidden_params => {}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
inject_schema = {
|
|
53
|
+
:hidden_params => 'hiddenParams'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
inject_params = {
|
|
57
|
+
:process_id => 'PROCESS_ID',
|
|
58
|
+
:executable => 'EXECUTABLE'
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
default_params = default_opts[:params].reduce({}) do |new_hash, (k, v)|
|
|
62
|
+
key = inject_params[k] || k
|
|
63
|
+
new_hash[key] = v
|
|
64
|
+
new_hash
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
default = default_opts.reduce({}) do |new_hash, (k, v)|
|
|
68
|
+
key = inject_schema[k] || k
|
|
69
|
+
new_hash[key] = v
|
|
70
|
+
new_hash
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
default[:params] = default_params
|
|
74
|
+
|
|
75
|
+
json = {
|
|
76
|
+
'schedule' => default.merge(options)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
tmp = json['schedule'][:params]['PROCESS_ID']
|
|
80
|
+
fail 'Process ID has to be provided' if tmp.nil? || tmp.empty?
|
|
81
|
+
|
|
82
|
+
tmp = json['schedule'][:params]['EXECUTABLE']
|
|
83
|
+
fail 'Executable has to be provided' if tmp.nil? || tmp.empty?
|
|
84
|
+
|
|
85
|
+
tmp = json['schedule'][:cron]
|
|
86
|
+
fail 'Cron schedule has to be provided' if tmp.nil? || tmp.empty?
|
|
87
|
+
|
|
88
|
+
tmp = json['schedule'][:timezone]
|
|
89
|
+
fail 'A timezone has to be provided' if tmp.nil? || tmp.empty?
|
|
90
|
+
|
|
91
|
+
tmp = json['schedule'][:type]
|
|
92
|
+
fail 'Schedule type has to be provided' if tmp.nil? || tmp.empty?
|
|
93
|
+
|
|
94
|
+
url = "/gdc/projects/#{GoodData.project.pid}/schedules"
|
|
95
|
+
res = GoodData.post url, json
|
|
96
|
+
|
|
97
|
+
fail 'Unable to create new schedule' if res.nil?
|
|
98
|
+
|
|
99
|
+
new_obj_json = GoodData.get res['schedule']['links']['self']
|
|
100
|
+
GoodData::Schedule.new(new_obj_json)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Initializes object from raw json
|
|
105
|
+
#
|
|
106
|
+
# @param json [Object] Raw JSON
|
|
107
|
+
# @return [GoodData::Schedule] New GoodData::Schedule instance
|
|
108
|
+
def initialize(json)
|
|
109
|
+
@json = json
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Deletes schedule
|
|
113
|
+
def delete
|
|
114
|
+
GoodData.delete uri
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Executes schedule
|
|
118
|
+
#
|
|
119
|
+
# @return [Object] Raw Response
|
|
120
|
+
def execute
|
|
121
|
+
data = {
|
|
122
|
+
:execution => {}
|
|
123
|
+
}
|
|
124
|
+
GoodData.post execution_url, data
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Returns execution URL
|
|
128
|
+
#
|
|
129
|
+
# @return [String] Executions URL
|
|
130
|
+
def execution_url
|
|
131
|
+
@json['schedule']['links']['executions']
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Returns execution state
|
|
135
|
+
#
|
|
136
|
+
# @return [String] Execution state
|
|
137
|
+
def state
|
|
138
|
+
@json['schedule']['state']
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Returns execution timezone
|
|
142
|
+
#
|
|
143
|
+
# @return [String] Execution timezone
|
|
144
|
+
def timezone
|
|
145
|
+
@json['schedule']['timezone']
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Assigns execution timezone
|
|
149
|
+
#
|
|
150
|
+
# @param new_timezone [String] Timezone to be set
|
|
151
|
+
def timezone=(new_timezone)
|
|
152
|
+
@json['schedule']['timezone'] = new_timezone
|
|
153
|
+
@dirty = true
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Returns execution type
|
|
157
|
+
#
|
|
158
|
+
# @return [String] Execution type
|
|
159
|
+
def type
|
|
160
|
+
@json['schedule']['type']
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Assigns execution type
|
|
164
|
+
#
|
|
165
|
+
# @param new_type [String] Execution type to be set
|
|
166
|
+
def type=(new_type)
|
|
167
|
+
@json['schedule']['type'] = new_type
|
|
168
|
+
@dirty = true
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Returns execution cron settings
|
|
172
|
+
#
|
|
173
|
+
# @return [String] Cron settings
|
|
174
|
+
def cron
|
|
175
|
+
@json['schedule']['cron']
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Assigns execution cron settings
|
|
179
|
+
#
|
|
180
|
+
# @param new_cron [String] Cron settings to be set
|
|
181
|
+
def cron=(new_cron)
|
|
182
|
+
@json['schedule']['cron'] = new_cron
|
|
183
|
+
@dirty = true
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Returns execution process ID
|
|
187
|
+
#
|
|
188
|
+
# @return [String] Process ID
|
|
189
|
+
def process_id
|
|
190
|
+
@json['schedule']['params']['PROCESS_ID']
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def process_id=(new_project_id)
|
|
194
|
+
@json['schedule']['params']['PROCESS_ID'] = new_project_id
|
|
195
|
+
@dirty = true
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Returns execution executable
|
|
199
|
+
#
|
|
200
|
+
# @return [String] Executable (graph) name
|
|
201
|
+
def executable
|
|
202
|
+
@json['schedule']['params']['EXECUTABLE']
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Assigns execution executable
|
|
206
|
+
#
|
|
207
|
+
# @param new_executable [String] Executable to be set.
|
|
208
|
+
def executable=(new_executable)
|
|
209
|
+
@json['schedule']['params']['EXECUTABLE'] = new_executable
|
|
210
|
+
@dirty = true
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Returns list of executions
|
|
214
|
+
#
|
|
215
|
+
# @return [Array] Raw Executions JSON
|
|
216
|
+
def executions
|
|
217
|
+
if @json
|
|
218
|
+
url = @json['schedule']['links']['executions']
|
|
219
|
+
res = GoodData.get url
|
|
220
|
+
res['executions']['items']
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Returns params as Hash
|
|
225
|
+
#
|
|
226
|
+
# @return [Hash] Parameters
|
|
227
|
+
def params
|
|
228
|
+
@json['schedule']['params']
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Assigns execution parameters
|
|
232
|
+
#
|
|
233
|
+
# @param params [String] Params to be set
|
|
234
|
+
def params=(new_param)
|
|
235
|
+
@json['schedule']['params'].merge!(new_param)
|
|
236
|
+
@dirty = true
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Returns hidden_params as Hash
|
|
240
|
+
#
|
|
241
|
+
# @return [Hash] Hidden Parameters
|
|
242
|
+
def hidden_params
|
|
243
|
+
@json['schedule']['hiddenParams'] || {}
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# Assigns hidden parameters
|
|
247
|
+
#
|
|
248
|
+
# @param new_hidden_param [String] Hidden parameters to be set
|
|
249
|
+
def hidden_params=(new_hidden_param)
|
|
250
|
+
@json['schedule']['hiddenParams'] = hidden_params.merge(new_hidden_param)
|
|
251
|
+
@dirty = true
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# Saves object if dirty
|
|
255
|
+
#
|
|
256
|
+
# @return [Boolean] True if saved
|
|
257
|
+
def save
|
|
258
|
+
if @dirty
|
|
259
|
+
update_json = {
|
|
260
|
+
'schedule' => {
|
|
261
|
+
'type' => @json['schedule']['type'],
|
|
262
|
+
'timezone' => @json['schedule']['timezone'],
|
|
263
|
+
'cron' => @json['schedule']['cron'],
|
|
264
|
+
'params' => @json['schedule']['params'],
|
|
265
|
+
'hiddenParams' => @json['schedule']['hiddenParams']
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
res = GoodData.put uri, update_json
|
|
269
|
+
|
|
270
|
+
@json = res
|
|
271
|
+
@dirty = false
|
|
272
|
+
return true
|
|
273
|
+
end
|
|
274
|
+
false
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Returns URL
|
|
278
|
+
#
|
|
279
|
+
# @return [String] Schedule URL
|
|
280
|
+
def uri
|
|
281
|
+
@json['schedule']['links']['self'] if @json && @json['schedule'] && @json['schedule']['links']
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|