gooddata 0.6.51 → 0.6.52
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/.rubocop.yml +1 -1
- data/CHANGELOG.md +13 -1
- data/CONTRIBUTING.md +25 -0
- data/PULL_REQUEST_TEMPLATE.md +5 -0
- data/README.md +7 -4
- data/gooddata.gemspec +2 -3
- data/lib/gooddata.rb +1 -0
- data/lib/gooddata/bricks/base_downloader.rb +6 -6
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +15 -5
- data/lib/gooddata/bricks/middleware/dwh_middleware.rb +15 -3
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +13 -4
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +3 -0
- data/lib/gooddata/exceptions/no_project_error.rb +5 -1
- data/lib/gooddata/goodzilla/goodzilla.rb +7 -6
- data/lib/gooddata/helpers/data_helper.rb +4 -4
- data/lib/gooddata/helpers/global_helpers_params.rb +61 -39
- data/lib/gooddata/lcm/actions/apply_custom_maql.rb +9 -0
- data/lib/gooddata/lcm/actions/associate_clients.rb +23 -4
- data/lib/gooddata/lcm/actions/collect_attrs.rb +56 -0
- data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
- data/lib/gooddata/lcm/actions/collect_clients.rb +25 -3
- data/lib/gooddata/lcm/actions/collect_meta.rb +83 -0
- data/lib/gooddata/lcm/actions/collect_segment_clients.rb +12 -4
- data/lib/gooddata/lcm/actions/collect_segments.rb +4 -4
- data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +74 -0
- data/lib/gooddata/lcm/actions/create_segment_masters.rb +16 -30
- data/lib/gooddata/lcm/actions/ensure_release_table.rb +0 -3
- data/lib/gooddata/lcm/actions/ensure_segments.rb +1 -4
- data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +5 -5
- data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +8 -5
- data/lib/gooddata/lcm/actions/hello_world.rb +0 -3
- data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
- data/lib/gooddata/lcm/actions/print_actions.rb +0 -3
- data/lib/gooddata/lcm/actions/print_modes.rb +0 -3
- data/lib/gooddata/lcm/actions/print_types.rb +1 -4
- data/lib/gooddata/lcm/actions/provision_clients.rb +5 -5
- data/lib/gooddata/lcm/actions/purge_clients.rb +4 -10
- data/lib/gooddata/lcm/actions/segments_filter.rb +0 -6
- data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +8 -4
- data/lib/gooddata/lcm/actions/synchronize_cas.rb +61 -0
- data/lib/gooddata/lcm/actions/synchronize_clients.rb +9 -3
- data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +13 -5
- data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +71 -17
- data/lib/gooddata/lcm/actions/synchronize_label_types.rb +8 -5
- data/lib/gooddata/lcm/actions/synchronize_ldm.rb +17 -8
- data/lib/gooddata/lcm/actions/synchronize_meta.rb +0 -3
- data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +9 -4
- data/lib/gooddata/lcm/actions/synchronize_processes.rb +9 -5
- data/lib/gooddata/lcm/actions/synchronize_schedules.rb +15 -5
- data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +61 -0
- data/lib/gooddata/lcm/actions/update_release_table.rb +0 -3
- data/lib/gooddata/lcm/helpers/tags_helper.rb +35 -0
- data/lib/gooddata/lcm/lcm.rb +22 -4
- data/lib/gooddata/lcm/lcm2.rb +66 -13
- data/lib/gooddata/lcm/types/complex/update_preference.rb +1 -1
- data/lib/gooddata/mixins/md_finders.rb +4 -2
- data/lib/gooddata/mixins/md_object_indexer.rb +13 -3
- data/lib/gooddata/mixins/md_object_query.rb +8 -2
- data/lib/gooddata/models/blueprint/date_dimension.rb +6 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +41 -11
- data/lib/gooddata/models/blueprint/project_builder.rb +20 -0
- data/lib/gooddata/models/blueprint/to_wire.rb +7 -0
- data/lib/gooddata/models/client.rb +6 -0
- data/lib/gooddata/models/domain.rb +6 -6
- data/lib/gooddata/models/from_wire.rb +5 -1
- data/lib/gooddata/models/metadata.rb +55 -9
- data/lib/gooddata/models/metadata/attribute.rb +19 -4
- data/lib/gooddata/models/metadata/dashboard.rb +15 -3
- data/lib/gooddata/models/metadata/dataset.rb +5 -2
- data/lib/gooddata/models/metadata/dimension.rb +4 -1
- data/lib/gooddata/models/metadata/fact.rb +9 -2
- data/lib/gooddata/models/metadata/folder.rb +4 -1
- data/lib/gooddata/models/metadata/metric.rb +11 -3
- data/lib/gooddata/models/metadata/report.rb +7 -2
- data/lib/gooddata/models/metadata/report_definition.rb +11 -4
- data/lib/gooddata/models/metadata/scheduled_mail.rb +4 -1
- data/lib/gooddata/models/metadata/variable.rb +7 -2
- data/lib/gooddata/models/model.rb +14 -3
- data/lib/gooddata/models/process.rb +10 -9
- data/lib/gooddata/models/project.rb +134 -36
- data/lib/gooddata/models/project_creator.rb +43 -20
- data/lib/gooddata/models/report_data_result.rb +6 -2
- data/lib/gooddata/models/schedule.rb +6 -3
- data/lib/gooddata/models/subscription.rb +8 -1
- data/lib/gooddata/models/user_filters/user_filter.rb +1 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +18 -4
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +3 -1
- data/lib/gooddata/rest/client.rb +4 -6
- data/lib/gooddata/rest/connection.rb +10 -2
- data/lib/gooddata/version.rb +1 -1
- data/spec/data/blueprints/test_blueprint.json +1 -0
- data/spec/data/wire_models/test_blueprint.json +3 -0
- data/spec/data/workspace_table.csv +3 -0
- data/spec/environment/development.rb +4 -1
- data/spec/environment/environment.rb +1 -1
- data/spec/environment/staging.rb +5 -1
- data/spec/environment/testing.rb +5 -2
- data/spec/integration/blueprint_with_ca_spec.rb +56 -0
- data/spec/integration/clients_spec.rb +21 -0
- data/spec/integration/command_datawarehouse_spec.rb +7 -1
- data/spec/integration/create_from_template_spec.rb +9 -3
- data/spec/integration/project_spec.rb +7 -0
- data/spec/integration/segments_spec.rb +0 -53
- data/spec/integration/subscription_spec.rb +29 -4
- data/spec/integration/urn_date_dim_spec.rb +53 -0
- data/spec/integration/user_filters_spec.rb +6 -0
- data/spec/integration/variables_spec.rb +1 -2
- data/spec/spec_helper.rb +5 -30
- data/spec/unit/actions/collect_clients_spec.rb +38 -0
- data/spec/unit/actions/collect_meta_spec.rb +87 -0
- data/spec/unit/actions/collect_segment_clients_spec.rb +40 -0
- data/spec/unit/actions/collect_tagged_objects_spec.rb +110 -0
- data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +51 -0
- data/spec/unit/bricks/middleware/aws_middelware_spec.rb +55 -1
- data/spec/unit/bricks/middleware/logger_middleware_spec.rb +15 -0
- data/spec/unit/helpers/data_helper_spec.rb +3 -5
- data/spec/unit/helpers/global_helpers_spec.rb +29 -0
- data/spec/unit/helpers_spec.rb +18 -1
- data/spec/unit/models/blueprint/project_blueprint_spec.rb +1 -23
- data/spec/unit/models/domain_spec.rb +19 -0
- data/spec/unit/models/metadata_spec.rb +34 -0
- data/spec/unit/models/schedule_spec.rb +31 -0
- data/spec/unit/models/to_manifest_spec.rb +10 -2
- data/spec/unit/models/unit_project_spec.rb +6 -1
- data/spec/unit/rest/polling_spec.rb +13 -1
- metadata +49 -31
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4b52bbc7d6883ecc03056e9bd3b8d40814b1c7e6
|
|
4
|
+
data.tar.gz: d9016a67965073aa35cc99d6285200b2217aafdb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9c84503bccbc716e9a55fd77c2ceaa105ec3790fcf0af44282c01cc1704c0095bf65777a63ebea9e89d193806e349c4c081fdf8f235530c211f42716ae8da355
|
|
7
|
+
data.tar.gz: b8bd3acdca2aaac173bc92dbd9aef01c32a8b5f2a99267686b02e97d66d15521577e1cfedfa96814d5eb3cc3e7b42611945980871732eb5658e94cfcc4d3f531
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# GoodData Ruby SDK Changelog
|
|
2
2
|
|
|
3
3
|
## 0.6.52
|
|
4
|
+
- Add support for computed attribute in blueprint
|
|
5
|
+
- Fix bug with transfering schedules without their state
|
|
6
|
+
- Support segment-specific production tags (TMA-309)
|
|
7
|
+
- Rewrite deprecated schedule parameter "GRAPH" (TMA-453)
|
|
8
|
+
- Add parameter HTTP_LOGGING to LoggerMiddleware
|
|
9
|
+
- Resolve also hidden reference parameters (TMA-411)
|
|
10
|
+
- Support integer type id in Domain#clients (TMA-450)
|
|
11
|
+
- Support urn for date dimension (TMA-221)
|
|
12
|
+
- Implement "skip_actions" for LCM2
|
|
13
|
+
- Support MAQL DIFF API (TMA-219)
|
|
14
|
+
- Support for restricted flag
|
|
15
|
+
- Fix deployment via SDK on Windows
|
|
4
16
|
|
|
5
17
|
## 0.6.50
|
|
6
18
|
- Add support for Email Notification Rules on Process
|
|
@@ -11,7 +23,7 @@
|
|
|
11
23
|
- Handle export/import async task errors (TMA-231)
|
|
12
24
|
- Support for custom color palette
|
|
13
25
|
- Support for trasfering attribute drill paths
|
|
14
|
-
- Implemented basic version of LCM2
|
|
26
|
+
- Implemented basic version of LCM2
|
|
15
27
|
- Add more logging for user, user filter management
|
|
16
28
|
|
|
17
29
|
## 0.6.49
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
### Contribution acceptance criteria
|
|
2
|
+
|
|
3
|
+
1. The change is as small as possible. It fixes one specific issue or implements
|
|
4
|
+
one specific feature. Do not combine things, send separate pull requests if needed.
|
|
5
|
+
1. Include proper tests and make all tests pass (unless it contains a test
|
|
6
|
+
exposing a bug in existing code). Every new class should have corresponding
|
|
7
|
+
unit tests, even if the class is exercised at a higher level, such as a feature test.
|
|
8
|
+
1. Every bug-fix has a regression test.
|
|
9
|
+
1. If you suspect a failing CI build is unrelated to your contribution, you may
|
|
10
|
+
try and restart the failing CI job or ask a developer to fix the
|
|
11
|
+
aforementioned failing test.
|
|
12
|
+
1. Code conforms to this [style guide](https://github.com/bbatsov/ruby-style-guide).
|
|
13
|
+
1. When writing tests, please follow [these guidelines](http://betterspecs.org/).
|
|
14
|
+
1. Changes do not adversely degrade performance.
|
|
15
|
+
1. Your PR contains a single commit (please use `git rebase -i` to squash commits)
|
|
16
|
+
1. When writing commit messages, please follow
|
|
17
|
+
[these](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
|
18
|
+
[guidelines](http://chris.beams.io/posts/git-commit/).
|
|
19
|
+
1. Your changes can merge without problems (if not please rebase if you're the
|
|
20
|
+
only one working on your feature branch, otherwise, merge `master`).
|
|
21
|
+
1. If the pull request adds any new libraries, they should be in line with our
|
|
22
|
+
[license](/LICENSE).
|
|
23
|
+
1. Use `GoodData.logger` for logging instead of `puts`.
|
|
24
|
+
|
|
25
|
+
_Based on [GitLab's contribution guide](https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md)._
|
data/README.md
CHANGED
|
@@ -36,7 +36,7 @@ If you are using gems just
|
|
|
36
36
|
gem install gooddata
|
|
37
37
|
|
|
38
38
|
## Note on Patches/Pull Requests
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
* Fork the project.
|
|
41
41
|
* Make your feature addition or bug fix.
|
|
42
42
|
* Add tests for it. This is important so I don't break it in a
|
|
@@ -47,15 +47,19 @@ If you are using gems just
|
|
|
47
47
|
* run `rake cop` and make sure you did not introduce any new coding rules issues
|
|
48
48
|
* Send us a pull request. Bonus points for topic branches.
|
|
49
49
|
|
|
50
|
+
## Contributing
|
|
51
|
+
|
|
52
|
+
See our [contribution guidelines](/CONTRIBUTING.md).
|
|
53
|
+
|
|
50
54
|
## Credits
|
|
51
55
|
|
|
52
56
|
**Originally started by**
|
|
53
57
|
|
|
54
|
-
Pavel Kolesnikov [ <mailto:pavel@gooddata.com> / [@koles](http://twitter.com/koles) ]
|
|
58
|
+
Pavel Kolesnikov [ <mailto:pavel@gooddata.com> / [@koles](http://twitter.com/koles) ]
|
|
55
59
|
|
|
56
60
|
**Actively developed and maintained by**
|
|
57
61
|
|
|
58
|
-
- [Tomas Korcak](https://github.com/korczis) [ <mailto:korczis@gmail.com> / [@korczis](http://twitter.com/korczis) ]
|
|
62
|
+
- [Tomas Korcak](https://github.com/korczis) [ <mailto:korczis@gmail.com> / [@korczis](http://twitter.com/korczis) ]
|
|
59
63
|
- [Tomas Svarovsky](https://github.com/fluke777) [ <mailto:svarovsky.tomas@gmail.com> / [@fluke777](http://twitter.com/fluke777) ]
|
|
60
64
|
|
|
61
65
|
**Contributors**
|
|
@@ -72,4 +76,3 @@ For full contributor info see [contributors page](https://github.com/gooddata/go
|
|
|
72
76
|
## Copyright
|
|
73
77
|
|
|
74
78
|
Copyright (c) 2010 - 2015 GoodData Corporation and Thomas Watson Steen. See LICENSE for details.
|
|
75
|
-
|
data/gooddata.gemspec
CHANGED
|
@@ -42,9 +42,7 @@ Gem::Specification.new do |s|
|
|
|
42
42
|
s.add_development_dependency 'ZenTest', '~> 4.11'
|
|
43
43
|
s.add_development_dependency 'pry'
|
|
44
44
|
|
|
45
|
-
s.add_dependency 'aws-sdk', '~> 2.
|
|
46
|
-
s.add_dependency 'nokogiri', '~> 1.6.8'
|
|
47
|
-
s.add_dependency 'aws-sdk-v1', '~> 1.45'
|
|
45
|
+
s.add_dependency 'aws-sdk', '~> 2.9', '>= 2.9.42'
|
|
48
46
|
s.add_dependency 'docile', '~> 1.1'
|
|
49
47
|
s.add_dependency 'erubis', '~> 2.7'
|
|
50
48
|
s.add_dependency 'gli', '~> 2.15'
|
|
@@ -61,4 +59,5 @@ Gem::Specification.new do |s|
|
|
|
61
59
|
s.add_dependency 'salesforce_bulk_query', '~> 0.2'
|
|
62
60
|
s.add_dependency 'terminal-table', '~> 1.7'
|
|
63
61
|
s.add_dependency 'thread_safe'
|
|
62
|
+
s.add_dependency 'backports'
|
|
64
63
|
end
|
data/lib/gooddata.rb
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# LICENSE file in the root directory of this source tree.
|
|
6
6
|
|
|
7
7
|
require 'pathname'
|
|
8
|
-
require 'aws'
|
|
8
|
+
require 'aws-sdk'
|
|
9
9
|
|
|
10
10
|
module GoodData
|
|
11
11
|
module Bricks
|
|
@@ -33,19 +33,19 @@ module GoodData
|
|
|
33
33
|
|
|
34
34
|
bucket_name = @params['s3_backup_bucket_name']
|
|
35
35
|
|
|
36
|
-
s3 =
|
|
36
|
+
s3 = Aws::S3::Resource.new(
|
|
37
37
|
:access_key_id => @params['aws_access_key_id'],
|
|
38
38
|
:secret_access_key => @params['aws_secret_access_key']
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
-
bucket = s3.
|
|
42
|
-
bucket = s3.
|
|
41
|
+
bucket = s3.bucket(bucket_name)
|
|
42
|
+
bucket = s3.create_bucket(bucket_name) unless bucket.exists?
|
|
43
43
|
|
|
44
44
|
files.each do |file|
|
|
45
45
|
file_path = Pathname.new(file)
|
|
46
46
|
target_path = Pathname.new(@params['s3_backup_path'] || '') + file_path.basename
|
|
47
|
-
obj = bucket.objects
|
|
48
|
-
obj.
|
|
47
|
+
obj = bucket.objects(target_path)
|
|
48
|
+
obj.upload_file(file_path)
|
|
49
49
|
@logger.info "Backed up file #{file_path} to s3 #{target_path}" if @logger
|
|
50
50
|
end
|
|
51
51
|
|
|
@@ -17,15 +17,25 @@ module GoodData
|
|
|
17
17
|
raise 'Unable to connect to AWS. Parameter "aws_client" seems to be empty' unless params['aws_client']
|
|
18
18
|
raise 'Unable to connect to AWS. Parameter "access_key_id" is missing' if params['aws_client']['access_key_id'].blank?
|
|
19
19
|
raise 'Unable to connect to AWS. Parameter "secret_access_key" is missing' if params['aws_client']['secret_access_key'].blank?
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
end
|
|
24
|
-
s3 = AWS::S3.new(params['aws_client'])
|
|
20
|
+
params['aws_client'] = rewrite_for_aws_sdk_v2(params['aws_client'])
|
|
21
|
+
symbolized_config = GoodData::Helpers.symbolize_keys(params['aws_client'])
|
|
22
|
+
s3 = Aws::S3::Resource.new(symbolized_config)
|
|
25
23
|
params['aws_client']['s3_client'] = s3
|
|
26
24
|
end
|
|
27
25
|
@app.call(params)
|
|
28
26
|
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def rewrite_for_aws_sdk_v2(config)
|
|
31
|
+
config['region'] = 'us-west-2' unless config['region']
|
|
32
|
+
if config['use_ssl']
|
|
33
|
+
fail 'Parameter use_ssl has been deprecated. Version 2 of the AWS ' \
|
|
34
|
+
'SDK uses SSL everywhere. To disable SSL you must ' \
|
|
35
|
+
'configure an endpoint that uses http://.'
|
|
36
|
+
end
|
|
37
|
+
config
|
|
38
|
+
end
|
|
29
39
|
end
|
|
30
40
|
end
|
|
31
41
|
end
|
|
@@ -15,10 +15,22 @@ module GoodData
|
|
|
15
15
|
def call(params)
|
|
16
16
|
if params.key?('ads_client') && (RUBY_PLATFORM == 'java')
|
|
17
17
|
GoodData.logger.info "Setting up ADS connection to #{params['ads_client']['ads_id'] || params['ads_client']['jdbc_url']}"
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
unless params['ads_client']['username'] || params['GDC_USERNAME']
|
|
19
|
+
raise "ADS middleware needs username either as part of " \
|
|
20
|
+
"ads_client spec or as a global 'GDC_USERNAME' parameter"
|
|
21
|
+
end
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
unless params['ads_client']['password'] || params['GDC_PASSWORD']
|
|
24
|
+
raise "ADS middleware needs password either as part of " \
|
|
25
|
+
"ads_client spec or as a global 'GDC_PASSWORD' parameter"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
ads = GoodData::Datawarehouse.new(
|
|
29
|
+
params['ads_client']['username'] || params['GDC_USERNAME'],
|
|
30
|
+
params['ads_client']['password'] || params['GDC_PASSWORD'],
|
|
31
|
+
params['ads_client']['ads_id'],
|
|
32
|
+
jdbc_url: params['ads_client']['jdbc_url']
|
|
33
|
+
)
|
|
22
34
|
@app.call(params.merge('ads_client' => ads, :ads_client => ads))
|
|
23
35
|
else
|
|
24
36
|
@app.call(params)
|
|
@@ -25,9 +25,15 @@ module GoodData
|
|
|
25
25
|
logger = params['GDC_LOGGER']
|
|
26
26
|
GoodData.logger = logger
|
|
27
27
|
|
|
28
|
+
# Set parallelism
|
|
29
|
+
max_concurrency = params['max_concurrency'] || params['MAX_CONCURRENCY']
|
|
30
|
+
if max_concurrency && max_concurrency.to_i > 0
|
|
31
|
+
$pmap_default_thread_count = max_concurrency.to_i # rubocop:disable GlobalVars
|
|
32
|
+
end
|
|
33
|
+
|
|
28
34
|
# Connect Client
|
|
29
|
-
protocol = params['CLIENT_GDC_PROTOCOL'] || DEFAULT_PROTOCOL
|
|
30
|
-
hostname = params['CLIENT_GDC_HOSTNAME'] || DEFAULT_HOSTNAME
|
|
35
|
+
protocol = params['CLIENT_GDC_PROTOCOL'] || params['GDC_PROTOCOL'] || DEFAULT_PROTOCOL
|
|
36
|
+
hostname = params['CLIENT_GDC_HOSTNAME'] || params['GDC_HOSTNAME'] || DEFAULT_HOSTNAME
|
|
31
37
|
server = "#{protocol}://#{hostname}"
|
|
32
38
|
client = GoodDataMiddleware.connect(
|
|
33
39
|
server,
|
|
@@ -91,11 +97,14 @@ module GoodData
|
|
|
91
97
|
if username.nil? || password.nil?
|
|
92
98
|
puts "Connecting with SST to server #{server}"
|
|
93
99
|
raise 'SST (SuperSecureToken) not present in params' if sst_token.nil?
|
|
94
|
-
GoodData.connect(sst_token: sst_token, server: server, verify_ssl: verify_ssl)
|
|
100
|
+
conn = GoodData.connect(sst_token: sst_token, server: server, verify_ssl: verify_ssl)
|
|
95
101
|
else
|
|
96
102
|
puts "Connecting as #{username} to server #{server}"
|
|
97
|
-
GoodData.connect(username, password, server: server, verify_ssl: verify_ssl)
|
|
103
|
+
conn = GoodData.connect(username, password, server: server, verify_ssl: verify_ssl)
|
|
98
104
|
end
|
|
105
|
+
conn.stats_on
|
|
106
|
+
|
|
107
|
+
conn
|
|
99
108
|
end
|
|
100
109
|
end
|
|
101
110
|
end
|
|
@@ -18,9 +18,12 @@ module GoodData
|
|
|
18
18
|
logger = NilLogger.new
|
|
19
19
|
else
|
|
20
20
|
logger = params[:GDC_LOGGER_FILE].nil? ? Logger.new(STDOUT) : Logger.new(params[:GDC_LOGGER_FILE])
|
|
21
|
+
logger.level = params['GDC_LOG_LEVEL'] if params['GDC_LOG_LEVEL']
|
|
21
22
|
logger.info('Pipeline starts')
|
|
22
23
|
end
|
|
23
24
|
params['GDC_LOGGER'] = logger
|
|
25
|
+
GoodData.logging_http_on if params['HTTP_LOGGING'] && params['HTTP_LOGGING'].to_b
|
|
26
|
+
|
|
24
27
|
returning(@app.call(params)) do |_result|
|
|
25
28
|
logger.info('Pipeline ending')
|
|
26
29
|
end
|
|
@@ -6,7 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
module GoodData
|
|
8
8
|
class NoProjectError < RuntimeError
|
|
9
|
-
DEFAULT_MSG = 'You have to provide "project_id". You can either provide
|
|
9
|
+
DEFAULT_MSG = 'You have to provide "project_id". You can either provide ' \
|
|
10
|
+
'it through -p flag or even better way is to fill it in in ' \
|
|
11
|
+
'your Goodfile under key "project_id". If you just started ' \
|
|
12
|
+
'a project you have to create it first. One way might be ' \
|
|
13
|
+
'through "gooddata project build"'
|
|
10
14
|
|
|
11
15
|
def initialize(msg = DEFAULT_MSG)
|
|
12
16
|
super(msg)
|
|
@@ -96,18 +96,19 @@ module GoodData
|
|
|
96
96
|
pairs = get_uris(expression).pmap do |uri|
|
|
97
97
|
if uri =~ /elements/
|
|
98
98
|
begin
|
|
99
|
-
[uri, Attribute.find_element_value(uri, opts)]
|
|
99
|
+
['element', uri, Attribute.find_element_value(uri, opts)]
|
|
100
100
|
rescue AttributeElementNotFound
|
|
101
|
-
[uri, '(empty value)']
|
|
101
|
+
['element', uri, '(empty value)']
|
|
102
102
|
end
|
|
103
103
|
else
|
|
104
|
-
[uri, GoodData::MdObject[uri, opts].title]
|
|
104
|
+
['object', uri, GoodData::MdObject[uri, opts].title]
|
|
105
105
|
end
|
|
106
106
|
end
|
|
107
|
+
pairs.sort_by! { |p| p[0] }
|
|
107
108
|
pairs.each do |el|
|
|
108
|
-
uri = el[
|
|
109
|
-
obj = el[
|
|
110
|
-
temp.
|
|
109
|
+
uri = el[1]
|
|
110
|
+
obj = el[2]
|
|
111
|
+
temp.gsub!(uri, obj)
|
|
111
112
|
end
|
|
112
113
|
temp
|
|
113
114
|
end
|
|
@@ -104,17 +104,17 @@ module GoodData
|
|
|
104
104
|
def realize_s3(params)
|
|
105
105
|
params = GoodData::Helpers.stringify_keys(params)
|
|
106
106
|
s3_client = params['aws_client'] && params['aws_client']['s3_client']
|
|
107
|
-
raise 'AWS client not present. Perhaps S3Middleware is missing in the brick definition?' if !s3_client || !s3_client.respond_to?(:
|
|
107
|
+
raise 'AWS client not present. Perhaps S3Middleware is missing in the brick definition?' if !s3_client || !s3_client.respond_to?(:bucket)
|
|
108
108
|
bucket_name = @options[:bucket]
|
|
109
109
|
key = @options[:key]
|
|
110
110
|
raise 'Key "bucket" is missing in S3 datasource' if bucket_name.blank?
|
|
111
111
|
raise 'Key "key" is missing in S3 datasource' if key.blank?
|
|
112
112
|
puts "Realizing download from S3. Bucket #{bucket_name}, object with key #{key}."
|
|
113
113
|
filename = Digest::SHA256.new.hexdigest(@options.to_json)
|
|
114
|
-
bucket = s3_client.
|
|
115
|
-
obj = bucket.
|
|
114
|
+
bucket = s3_client.bucket(bucket_name)
|
|
115
|
+
obj = bucket.object(key)
|
|
116
116
|
File.open(filename, 'wb') do |file|
|
|
117
|
-
obj.
|
|
117
|
+
obj.get do |chunk|
|
|
118
118
|
file.write(chunk)
|
|
119
119
|
end
|
|
120
120
|
end
|
|
@@ -11,8 +11,12 @@ module GoodData
|
|
|
11
11
|
|
|
12
12
|
class << self
|
|
13
13
|
# Encodes parameters for passing them to GD execution platform.
|
|
14
|
-
# Core types are kept and complex types (arrays, structures, etc) are
|
|
15
|
-
#
|
|
14
|
+
# Core types are kept and complex types (arrays, structures, etc) are
|
|
15
|
+
# JSON encoded into key hash "gd_encoded_params" or
|
|
16
|
+
# "gd_encoded_hidden_params", depending on the 'hidden' method param.
|
|
17
|
+
# The two different keys are used because the params and hidden params
|
|
18
|
+
# are merged by the platform and if we use the same key,
|
|
19
|
+
# the param would be overwritten.
|
|
16
20
|
#
|
|
17
21
|
# Core types are following:
|
|
18
22
|
# - Boolean (true, false)
|
|
@@ -68,52 +72,26 @@ module GoodData
|
|
|
68
72
|
'{}'
|
|
69
73
|
end
|
|
70
74
|
|
|
75
|
+
reference_values = []
|
|
71
76
|
# Replace reference parameters by the actual values. Use backslash to escape a reference parameter, e.g: \${not_a_param},
|
|
72
77
|
# the ${not_a_param} will not be replaced
|
|
73
78
|
if options[:resolve_reference_params]
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if v.is_a? Hash
|
|
77
|
-
Hash[
|
|
78
|
-
v.map do |k, v2|
|
|
79
|
-
[k, resolve_reference.call(v2)]
|
|
80
|
-
end
|
|
81
|
-
]
|
|
82
|
-
elsif v.is_a? Array
|
|
83
|
-
v.map do |v2|
|
|
84
|
-
resolve_reference.call(v2)
|
|
85
|
-
end
|
|
86
|
-
elsif !v.is_a?(String)
|
|
87
|
-
v
|
|
88
|
-
else
|
|
89
|
-
v.gsub(regexps) do |match|
|
|
90
|
-
if match =~ /\\\\/
|
|
91
|
-
data_params.is_a?(Hash) ? '\\' : '\\\\' # rubocop: disable Metrics/BlockNesting
|
|
92
|
-
elsif match =~ /\\\$/
|
|
93
|
-
'$'
|
|
94
|
-
elsif match =~ /\$\{(\w+)\}/
|
|
95
|
-
params["#{$1}"] || raise("The gd_encoded_params parameter contains unknow reference #{$1}") # rubocop: disable Style/PerlBackrefs
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
data_params = if data_params.is_a? Hash
|
|
102
|
-
Hash[
|
|
103
|
-
data_params.map do |k, v|
|
|
104
|
-
[k, resolve_reference.call(v)]
|
|
105
|
-
end
|
|
106
|
-
]
|
|
107
|
-
else
|
|
108
|
-
resolve_reference.call(data_params)
|
|
109
|
-
end
|
|
79
|
+
data_params, reference_values = resolve_reference_params(data_params, params)
|
|
80
|
+
hidden_data_params, = resolve_reference_params(hidden_data_params, params)
|
|
110
81
|
end
|
|
111
82
|
|
|
112
83
|
begin
|
|
113
84
|
parsed_data_params = data_params.is_a?(Hash) ? data_params : JSON.parse(data_params)
|
|
85
|
+
rescue JSON::ParserError => exception
|
|
86
|
+
reason = exception.message
|
|
87
|
+
reference_values.each { |secret_value| reason.gsub!("\"#{secret_value}\"", '"***"') }
|
|
88
|
+
raise exception.class, "Error reading json from '#{key}', reason: #{reason}"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
begin
|
|
114
92
|
parsed_hidden_data_params = hidden_data_params.is_a?(Hash) ? hidden_data_params : JSON.parse(hidden_data_params)
|
|
115
93
|
rescue JSON::ParserError => exception
|
|
116
|
-
raise exception.class, "Error reading json from '#{
|
|
94
|
+
raise exception.class, "Error reading json from '#{hidden_key}'"
|
|
117
95
|
end
|
|
118
96
|
|
|
119
97
|
# Add the nil on ENCODED_HIDDEN_PARAMS_KEY
|
|
@@ -260,6 +238,50 @@ module GoodData
|
|
|
260
238
|
value.to_s
|
|
261
239
|
end
|
|
262
240
|
end
|
|
241
|
+
|
|
242
|
+
private
|
|
243
|
+
|
|
244
|
+
def resolve_reference_params(data_params, params)
|
|
245
|
+
reference_values = []
|
|
246
|
+
regexps = Regexp.union(/\\\\/, /\\\$/, /\$\{(\w+)\}/)
|
|
247
|
+
resolve_reference = lambda do |v|
|
|
248
|
+
if v.is_a? Hash
|
|
249
|
+
Hash[
|
|
250
|
+
v.map do |k, v2|
|
|
251
|
+
[k, resolve_reference.call(v2)]
|
|
252
|
+
end
|
|
253
|
+
]
|
|
254
|
+
elsif v.is_a? Array
|
|
255
|
+
v.map do |v2|
|
|
256
|
+
resolve_reference.call(v2)
|
|
257
|
+
end
|
|
258
|
+
elsif !v.is_a?(String)
|
|
259
|
+
v
|
|
260
|
+
else
|
|
261
|
+
v.gsub(regexps) do |match|
|
|
262
|
+
if match =~ /\\\\/
|
|
263
|
+
data_params.is_a?(Hash) ? '\\' : '\\\\' # rubocop: disable Metrics/BlockNesting
|
|
264
|
+
elsif match =~ /\\\$/
|
|
265
|
+
'$'
|
|
266
|
+
elsif match =~ /\$\{(\w+)\}/
|
|
267
|
+
val = params["#{$1}"] || raise("The gd_encoded_params parameter contains unknow reference #{$1}") # rubocop: disable Style/PerlBackrefs
|
|
268
|
+
reference_values << val
|
|
269
|
+
val
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
data_params = if data_params.is_a? Hash
|
|
276
|
+
Hash[data_params.map do |k, v|
|
|
277
|
+
[k, resolve_reference.call(v)]
|
|
278
|
+
end]
|
|
279
|
+
else
|
|
280
|
+
resolve_reference.call(data_params)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
[data_params, reference_values]
|
|
284
|
+
end
|
|
263
285
|
end
|
|
264
286
|
end
|
|
265
287
|
end
|