gooddata 1.3.2-java → 1.3.3-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 255c29e00e16da21230f71cf95157cd1df682b5f
4
- data.tar.gz: fe596a91c2128d20c2a36c87a763ff219d5aa4bd
2
+ SHA256:
3
+ metadata.gz: b088417656bd604e2e3ddefa7919c748d5c8feb093386092776cc3c4ddca8566
4
+ data.tar.gz: c5834668e787cdef66f31ccc7322ac50de894aac64b4f8ba41b9a933a015adce
5
5
  SHA512:
6
- metadata.gz: a4b2469dd2bc82b0085a577b620a6ad1657c52a43b85c46955e27050d0667904cd6218448b7ee23d11efd2b6be772bf72608f8a0419873bf8adc34d193374c78
7
- data.tar.gz: ff57ede3f0f63b9cba9ee463e221938363a305922ba4ef0b29cad1fb2c7dffa64efda5e0741da7db762340bba006d1edb709dbcd855bf41a8ade9e5cef9275ec
6
+ metadata.gz: fd97a0d53c64c3e9431015c8b6052fd67fa9a2014719d93766c81838b878265b4dc543832ed852d9830023450f9be0461e1208f05430d176be78904568772f10
7
+ data.tar.gz: 00bcfd05b42557d530361a4f74d6cf825058b4e55a97af1aebba5cf7da3cf1b38c10a4a97bf7b93cecf3e71fd9e8a53047507ef193ded8acc100c9138829121c
@@ -1,12 +1,9 @@
1
1
  root = true
2
2
 
3
- [*]
3
+ [*.rb]
4
4
  indent_style = space
5
5
  indent_size = 2
6
- end_of_line = lf
7
6
  charset = utf-8
7
+ end_of_line = lf
8
8
  trim_trailing_whitespace = true
9
9
  insert_final_newline = true
10
-
11
- [*.{sh,markdown}]
12
- indent_size = 4
data/.gitignore CHANGED
@@ -43,4 +43,4 @@ deprecations.txt
43
43
  .vscode/settings.json
44
44
 
45
45
  # test cache files
46
- ./spec/cache/
46
+ spec/cache/
@@ -1,24 +1,44 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  stages:
4
- - unit
4
+ - name: unit
5
+ if: type IN (push, pull_request)
5
6
  - name: integration
6
- if: type IN (api, cron)
7
+ if: type IN (api)
8
+ - name: periodic
9
+ if: type IN (cron)
10
+ - name: cleanup
11
+ if: type IN (cron)
7
12
  jobs:
8
13
  include:
14
+ # unit
9
15
  - stage: unit
10
16
  name: unit tests
11
17
  script: bundle exec rake test:unit
12
18
  rvm:
13
19
  - 2.3
14
- - jruby-9.1.7
20
+ - 2.4
21
+ - 2.5
22
+ - jruby-9.1.5
23
+ - jruby-9.1.14
24
+ - jruby-1.7.19
15
25
  - stage: unit
16
26
  name: pronto code review
17
27
  script: |
18
28
  git remote add upstream https://github.com/gooddata/gooddata-ruby.git
19
29
  git fetch upstream master
20
30
  bundle exec pronto run -c upstream/master --exit-code
21
- - stage: integration
31
+ - stage: unit
32
+ name: sdk vcr tests
33
+ script: VCR_RECORD_MODE=none bundle exec rake test:sdk
34
+ rvm: jruby-9.1.14
35
+ - stage: unit
36
+ name: sdk vcr tests (project)
37
+ script: VCR_RECORD_MODE=none bundle exec rake test:project
38
+ rvm: jruby-9.1.14
39
+ # integration
40
+ - &lcm-integration-tests
41
+ stage: integration
22
42
  name: lcm integration tests
23
43
  script: |
24
44
  bundle exec rake -f lcm.rake docker:build
@@ -26,11 +46,88 @@ jobs:
26
46
  bundle exec rake -f lcm.rake test:integration:docker
27
47
  rvm:
28
48
  - jruby-9.1.7
29
- - stage: integration
49
+ - &sdk-integration-tests
50
+ stage: integration
30
51
  name: sdk integration tests
31
52
  script: bundle exec rake test:sdk
32
- rvm: jruby-9.1.7
33
- - stage: integration
53
+ rvm: 2.5
54
+ env: VCR_ON=false
55
+ - &sdk-integration-tests-project
56
+ stage: integration
34
57
  name: sdk integration tests (project)
35
58
  script: bundle exec rake test:project
36
- rvm: jruby-9.1.7
59
+ env: VCR_ON=false
60
+ rvm: 2.5
61
+ # periodic
62
+ # staging 1
63
+ - <<: *lcm-integration-tests
64
+ stage: periodic
65
+ name: staging1 - lcm integration tests
66
+ env:
67
+ - GD_ENV=staging
68
+ - VCR_ON=false
69
+ - <<: *sdk-integration-tests
70
+ stage: periodic
71
+ name: staging1 - sdk integration tests
72
+ env:
73
+ - GD_ENV=staging
74
+ - VCR_ON=false
75
+ - <<: *sdk-integration-tests-project
76
+ stage: periodic
77
+ name: staging1 - sdk integration tests (project)
78
+ env:
79
+ - GD_ENV=staging
80
+ - VCR_ON=false
81
+ # staging 2
82
+ - <<: *lcm-integration-tests
83
+ stage: periodic
84
+ name: staging2 - lcm integration tests
85
+ env:
86
+ - GD_ENV=testing
87
+ - VCR_ON=false
88
+ - <<: *sdk-integration-tests
89
+ stage: periodic
90
+ name: staging2 - sdk integration tests
91
+ env:
92
+ - GD_ENV=testing
93
+ - VCR_ON=false
94
+ - <<: *sdk-integration-tests-project
95
+ stage: periodic
96
+ name: staging2 - sdk integration tests (project)
97
+ env:
98
+ - GD_ENV=testing
99
+ - VCR_ON=false
100
+ # staging 3
101
+ - <<: *lcm-integration-tests
102
+ stage: periodic
103
+ name: staging3 - lcm integration tests
104
+ env:
105
+ - GD_ENV=development
106
+ - VCR_ON=false
107
+ - <<: *sdk-integration-tests
108
+ stage: periodic
109
+ name: staging3 - sdk integration tests
110
+ env:
111
+ - GD_ENV=development
112
+ - VCR_ON=false
113
+ - <<: *sdk-integration-tests-project
114
+ stage: periodic
115
+ name: staging3 - sdk integration tests (project)
116
+ env:
117
+ - GD_ENV=development
118
+ - VCR_ON=false
119
+ - &cleanup
120
+ stage: cleanup
121
+ name: staging1 - test environment clean-up
122
+ script: bundle exec ruby bin/test_projects_cleanup.rb -f
123
+ env: GD_ENV=staging
124
+ - <<: *cleanup
125
+ name: staging2 - test environment clean-up
126
+ env: GD_ENV=testing
127
+ - <<: *cleanup
128
+ name: staging3 - test environment clean-up
129
+ env: GD_ENV=development
130
+ notifications:
131
+ slack:
132
+ secure: TyYks8rEBJMouWRjRtHZJJm+BIajxgwsoSIpxidZmD5zRk5ssEkGVbuYIvjUN+if1NyM1bmWspTSVX+8g5IDmt9PgcujXVqCbPRvfK90r3obs8A5pHbDnKEue6inqYUjNoqa1D6PkWTS1dTb6xvy8WiAwMGqoFGHnlNs4WFF9N4=
133
+ on_pull_requests: false
@@ -1,4 +1,45 @@
1
1
  # GoodData Ruby SDK Changelog
2
+ ## 1.3.3
3
+ - Fix git-ignoring project cache
4
+ - Fix style in vcr configurer
5
+ - TMA-1205: Fix vcr configurer setup
6
+ - Describe releasing process more accurately
7
+ - Fix editorconfig
8
+ - TMA-1190: Add cleanup stage to travis.yml
9
+ - gemspec cleanup: transitive deps, email, authors
10
+ - TMA-1190: Add test env clean-up script
11
+ - TMA-1185: Record vcr cassettes
12
+ - TMA-1185: Fix vcr for project cache
13
+ - TMA-1182: UFB extended spec passing
14
+ - TRIVIAL: remove redundant suffix
15
+ - BUGFIX: TMA-1183 don't use make_tmpname
16
+ - TMA-1181: use correct exit code from lcm integ. docker-compose
17
+ - TMA-782: do not rely on spec extensions
18
+ - Revert "TMA-1181: do not use docker for lcm-integration-tests"
19
+ - TMA-1152: logout and delete users after spec
20
+ - FEATURE: TMA-1165 Create Help brick and make it default entry point in Docker image
21
+ - TMA-1181: passing userprov spec
22
+ - TRIVIAL: use the correct ruby version's for tests in travis
23
+ - TMA-1181: do not use docker for lcm-integration-tests
24
+ - Add pry-byebug to dev dependencies
25
+ - Fix standalone calls to rspec expect
26
+ - TMA-782: transfer component type process thru lcm
27
+ - FEATURE: TMA-1165 Remove unused info bricks
28
+ - Enable travis notifications in slack
29
+ - Update gooddata.gemspec
30
+ - TMA-1048 update ads driver dependency
31
+ - Run unit tests in supported rubies
32
+ - Run cron job on staging env 1/2/3
33
+ - FEATURE: TMA-1034 Add Docker label containing LCM bricks version
34
+ - SETI-2444 fix docker run on jenkins slaves
35
+ - TMA-1014: parallel do_not_touch logic in UFB
36
+ - TMA-905: do not print dynamic schedule param value if the param is set as secure
37
+ - BUGFIX: TMA-1153 Adjust LCM brick syslog to be able to log to Splunk
38
+ - TMA-1100 fix productized connector deployment
39
+ - TMA-1071: Record VCR cassettes
40
+ - TMA-1071: Reenable VCR
41
+ - Add pry-byebug to dev dependencies
42
+
2
43
  ## 1.3.2
3
44
  - Add rake task for changelog preview
4
45
  - added possibility to run tests on PI
data/Dockerfile CHANGED
@@ -1,11 +1,14 @@
1
1
  FROM harbor.intgdc.com/tools/gdc-java-8-jre:b057b53
2
2
 
3
3
  ARG GIT_COMMIT=unspecified
4
+ ARG BRICKS_VERSION=unspecified
5
+
4
6
  LABEL image_name="GDC LCM Bricks"
5
7
  LABEL maintainer="LCM <lcm@gooddata.com>"
6
8
  LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/"
7
9
  LABEL parent_image="harbor.intgdc.com/tools/gdc-java-8-jre:b057b53"
8
10
  LABEL git_commit=$GIT_COMMIT
11
+ LABEL bricks_version=$BRICKS_VERSION
9
12
 
10
13
  # which is required by RVM
11
14
  RUN yum install -y curl which \
@@ -32,4 +35,4 @@ ADD ./gooddata.gemspec .
32
35
 
33
36
  RUN /bin/bash -l -c ". /usr/local/rvm/scripts/rvm && bundle install"
34
37
 
35
- CMD [ "./bin/hello_world.sh" ]
38
+ CMD [ "./bin/help.sh" ]
@@ -2,7 +2,7 @@ FROM ruby:2.3-alpine
2
2
 
3
3
  MAINTAINER Tomas Korcak <korczis@gmail.com>
4
4
 
5
- RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ openssl cmake
5
+ RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ openssl cmake curl-dev
6
6
 
7
7
  RUN ln -s /usr/bin/make /usr/bin/gmake
8
8
 
@@ -9,7 +9,10 @@ def config = [
9
9
  'microservices': [
10
10
  'lcm-bricks': [
11
11
  'docker': [
12
- 'dockerfile': './Dockerfile'
12
+ 'dockerfile': './Dockerfile',
13
+ 'arguments': [
14
+ 'BRICKS_VERSION': { readFile('./VERSION').trim() }
15
+ ]
13
16
  ]
14
17
  ]
15
18
  ]
@@ -7,7 +7,7 @@
7
7
  1. `bundle install`
8
8
  1. bump version in [lib/gooddata/version.rb](lib/gooddata/version.rb)
9
9
  1. `bundle exec rake version:bump`
10
- 1. push to master
10
+ 1. create PR to upstream and have it merged
11
11
  1. `git push origin tags/{version}`
12
12
  1. `rake gem:release`
13
13
  1. `rvm use jruby && rm Gemfile.lock && bundle install`
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 3.5.0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+
3
+ /bin/bash -l -c ". /usr/local/rvm/scripts/rvm && bundle exec ./bin/run_brick.rb help_brick"
@@ -9,7 +9,7 @@ BRICK_PARAM_PREFIX = 'BRICK_PARAM_'
9
9
  brick_type = !ARGV.empty? ? ARGV[0] : DEFAULT_BRICK
10
10
 
11
11
  syslog_node = ENV['NODE_NAME']
12
- log = RemoteSyslogLogger.new(syslog_node, 514, :program => brick_type)
12
+ log = RemoteSyslogLogger.new(syslog_node, 514, :program => "ruby_#{brick_type}", :facility => 'local2')
13
13
 
14
14
  log.info "action=#{brick_type}_execution status=init"
15
15
 
@@ -0,0 +1,97 @@
1
+ example = 'GD_ENV=testing GD_SPEC_PASSWORD=secret bundle exec ruby bin/test_projects_cleanup.rb'
2
+
3
+ if ARGV.include?('-h')
4
+ puts 'Example:'
5
+ puts example
6
+ exit 0
7
+ end
8
+
9
+ require 'gooddata'
10
+ require_relative '../spec/environment/environment'
11
+ GoodData::Environment.load
12
+ config = GoodData::Environment::ConnectionHelper::LCM_ENVIRONMENT
13
+ secrets = GoodData::Environment::ConnectionHelper::SECRETS
14
+
15
+ def delete_project_by_title(title, projects, days = 14, force = false)
16
+ dead_line = Time.now - days * 60 * 60 * 24
17
+ filtered_projects = projects.select do |p|
18
+ p.title.match(title) && p.created < dead_line
19
+ end
20
+ filtered_projects.each do |project|
21
+ if force
22
+ puts "Deleting: #{project.pid} - #{project.title} - #{project.created}"
23
+ project_add = project.add
24
+ project_add && project_add.output_stage && project_add.output_stage.delete
25
+ project.delete
26
+ else
27
+ puts "Would delete: #{project.pid} - #{project.title} - #{project.created}"
28
+ end
29
+ end
30
+ puts "#{filtered_projects.length} projects matching \"#{title}\" #{'would be ' unless force}deleted."
31
+ end
32
+
33
+ def delete_ads_by_title(title, client, days = 14, force = false)
34
+ warehouses = client.warehouses
35
+ return if warehouses.empty?
36
+
37
+ deleted = 0
38
+ warehouses.each do |warehouse|
39
+ warehouse_title = warehouse.title
40
+ next unless warehouse_title.match(title)
41
+
42
+ dead_line = Time.now - days * 60 * 60 * 24
43
+ created = Time.parse(warehouse.data["created"])
44
+ next if created > dead_line
45
+
46
+ begin
47
+ if force
48
+ puts "Deleting: #{warehouse_title} - #{created}"
49
+ warehouse.delete
50
+ else
51
+ puts "Would delete: #{warehouse_title} - #{created}"
52
+ end
53
+ deleted += 1
54
+ rescue StandardError => e
55
+ puts "Failed to delete #{warehouse_title}: #{e}"
56
+ end
57
+ end
58
+ puts "#{deleted} ADS instances with title \"#{title}\" #{'would be ' unless force}deleted."
59
+ end
60
+
61
+ def clean_up!(client, force, days)
62
+ projects = client.projects
63
+ delete_project_by_title(/Insurance Demo Master/, projects, days, force)
64
+ delete_project_by_title(/Car Demo Master/, projects, days, force)
65
+ delete_project_by_title(/Insurance Demo Workspace/, projects, days, force)
66
+ delete_project_by_title(/Client With Conflicting LDM/, projects, days, force)
67
+ delete_project_by_title(/Development Project/, projects, days, force)
68
+ delete_project_by_title(/lcm-test-fixture/, projects, days, force)
69
+ delete_project_by_title(/Test MASTER project/, projects, days, force)
70
+ delete_project_by_title(/Test MINOR project/, projects, days, force)
71
+ delete_project_by_title(/^Test project$/, projects, days, force)
72
+ delete_project_by_title(/userprov-e2e-testing/, projects, days, force)
73
+ delete_ads_by_title(/Development ADS/, client, days, force)
74
+ delete_ads_by_title(/Production ADS/, client, days, force)
75
+ end
76
+
77
+ def init_client(username, password, server)
78
+ GoodData.connect(
79
+ username,
80
+ password,
81
+ server: server,
82
+ verify_ssl: false,
83
+ timeout: nil
84
+ )
85
+ end
86
+
87
+ username = config[:username]
88
+ password = secrets[:password]
89
+ dev_client = init_client(username, password, "https://#{config[:dev_server]}")
90
+ prod_client = init_client(username, password, "https://#{config[:prod_server]}")
91
+
92
+ force = ARGV.include?('-f')
93
+ days = 14
94
+ clean_up!(dev_client, force, days)
95
+ clean_up!(prod_client, force, days)
96
+
97
+ dev_client.disconnect
@@ -13,12 +13,15 @@ Gem::Specification.new do |s|
13
13
  'Pavel Kolesnikov',
14
14
  'Thomas Watson Steen',
15
15
  'Tomas Svarovsky',
16
- 'Tomas Korcak'
16
+ 'Tomas Korcak',
17
+ 'Jan Zdrahal',
18
+ 'Petr Gadorek',
19
+ 'Jakub Mahnert'
17
20
  ]
18
21
 
19
22
  s.summary = 'A convenient Ruby wrapper around the GoodData RESTful API'
20
23
  s.description = 'Use the GoodData::Client class to integrate GoodData into your own application or use the CLI to work with GoodData directly from the command line.'
21
- s.email = 'pavel@gooddata.com'
24
+ s.email = 'lcm@gooddata.com'
22
25
  s.extra_rdoc_files = %w(LICENSE README.md)
23
26
 
24
27
  s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
@@ -42,6 +45,8 @@ Gem::Specification.new do |s|
42
45
  s.add_development_dependency 'yard-rspec', '~> 0.1'
43
46
  s.add_development_dependency 'ZenTest', '~> 4.11'
44
47
  s.add_development_dependency 'pry'
48
+ s.add_development_dependency 'pry-byebug', '~> 3.6' if RUBY_PLATFORM != 'java'
49
+
45
50
  s.add_development_dependency 'pronto', '~> 0.9.5' if RUBY_PLATFORM != 'java'
46
51
  s.add_development_dependency 'pronto-rubocop', '~> 0.9.0' if RUBY_PLATFORM != 'java'
47
52
  s.add_development_dependency 'pronto-reek', '~> 0.9.0' if RUBY_PLATFORM != 'java'
@@ -53,8 +58,7 @@ Gem::Specification.new do |s|
53
58
  s.add_dependency 'docile', '~> 1.1'
54
59
  s.add_dependency 'erubis', '~> 2.7'
55
60
  s.add_dependency 'gli', '~> 2.15'
56
- s.add_dependency 'gooddata_datawarehouse' if RUBY_PLATFORM == 'java'
57
- s.add_dependency 'gooddata-dss-jdbc', '0.1.12' if RUBY_PLATFORM == 'java'
61
+ s.add_dependency 'gooddata_datawarehouse', '~> 0.0.9' if RUBY_PLATFORM == 'java'
58
62
  s.add_dependency 'highline', '= 2.0.0.pre.develop.14'
59
63
  s.add_dependency 'json_pure', '~> 1.8'
60
64
  s.add_dependency 'multi_json', '~> 1.12'
data/lcm.rake CHANGED
@@ -92,12 +92,8 @@ namespace :test do
92
92
  namespace :integration do
93
93
  desc 'Run integration tests in Docker'
94
94
  task :docker do
95
- system('docker-compose -f docker-compose.lcm.yml up --force-recreate --abort-on-container-exit appstore')
96
-
97
- # TODO: use exit-code-from after update to docker-compose >= 1.12
98
- # system('docker-compose up --exit-code-from appstore') ||
99
- # fail('Test execution failed')
100
- system(check_exit_code) || fail('Test execution failed!')
95
+ system('docker-compose -f docker-compose.lcm.yml up --force-recreate --abort-on-container-exit --exit-code-from appstore appstore') ||
96
+ fail('Test execution failed!')
101
97
  end
102
98
  end
103
99
  namespace :load do
@@ -14,7 +14,7 @@ module GoodData
14
14
  # @option [String] 'message' text to be returned in result, if nill - nothing is returned
15
15
  # :reek:UtilityFunction
16
16
  def call(params)
17
- GoodData::LCM2.perform('hello_world', params)
17
+ GoodData::LCM2.perform('hello', params)
18
18
  end
19
19
  end
20
20
  end
@@ -0,0 +1,17 @@
1
+ require_relative 'brick'
2
+
3
+ module GoodData
4
+ module Bricks
5
+ # Simple brick used for printing help message about bricks
6
+ class HelpBrick < GoodData::Bricks::Brick
7
+ def version
8
+ '0.0.1'
9
+ end
10
+
11
+ # Help brick entry-point
12
+ def call(params)
13
+ GoodData::LCM2.perform('help', params)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -99,6 +99,17 @@ module GoodData
99
99
  ]
100
100
  )
101
101
  end
102
+
103
+ def self.help_brick_pipeline
104
+ prepare(
105
+ [
106
+ DecodeParamsMiddleware,
107
+ LoggerMiddleware,
108
+ BenchMiddleware,
109
+ HelpBrick
110
+ ]
111
+ )
112
+ end
102
113
  end
103
114
  end
104
115
  end
@@ -231,7 +231,10 @@ module GoodData
231
231
  end
232
232
 
233
233
  def decrypt(database64, key)
234
- return '' if key.nil? || key.empty?
234
+ if key.nil? || key.empty?
235
+ puts 'WARNING: No encryption key provided.'
236
+ return 'no_key_provided'
237
+ end
235
238
 
236
239
  data = Base64.decode64(database64)
237
240
 
@@ -26,6 +26,9 @@ module GoodData
26
26
 
27
27
  description 'Value Column'
28
28
  param :param_value_column, instance_of(Type::StringType), required: false
29
+
30
+ description 'Should the param be hidden?'
31
+ param :param_secure_column, instance_of(Type::StringType), required: false
29
32
  end
30
33
 
31
34
  class << self
@@ -36,6 +39,7 @@ module GoodData
36
39
  client_id_column = params.client_id_column || 'client_id'
37
40
  param_name_column = params.param_name_column || 'param_name'
38
41
  param_value_column = params.param_value_column || 'param_value'
42
+ param_secure_column = params.param_secure_column || 'param_secure'
39
43
  results = []
40
44
 
41
45
  input_source = params.dynamic_params.input_source
@@ -43,16 +47,18 @@ module GoodData
43
47
  input_data = without_check(PARAMS, params) do
44
48
  File.open(data_source.realize(params), 'r:UTF-8')
45
49
  end
46
- GoodData.logger.debug("Input data: #{input_data.read}")
47
50
 
48
51
  schedule_params = {}
49
52
 
50
53
  CSV.foreach(input_data, :headers => true, :return_headers => false, encoding: 'utf-8') do |row|
51
- GoodData.logger.debug("Processing row: #{row}")
52
- results << row.to_hash
53
-
54
- client_id = row[client_id_column] ? row[client_id_column] : :all_clients
55
- schedule_name = row[schedule_title_column] ? row[schedule_title_column] : :all_schedules
54
+ is_param_secure = row[param_secure_column] == 'true'
55
+ safe_to_print_row = row.to_hash
56
+ safe_to_print_row[param_value_column] = '******' if is_param_secure
57
+ GoodData.logger.debug("Processing row: #{safe_to_print_row}")
58
+ results << safe_to_print_row
59
+
60
+ client_id = row[client_id_column] || :all_clients
61
+ schedule_name = row[schedule_title_column] || :all_schedules
56
62
 
57
63
  schedule_params[client_id] ||= {}
58
64
  schedule_params[client_id][schedule_name] ||= {}
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2010-2018 GoodData Corporation. All rights reserved.
2
+ # This source code is licensed under the BSD-style license found in the
3
+ # LICENSE file in the root directory of this source tree.
4
+
5
+ require 'gooddata/bricks/pipeline'
6
+
7
+ require_relative 'base_action'
8
+
9
+ module GoodData
10
+ module LCM2
11
+ # Action responsible for printing bricks help
12
+ class Help < BaseAction
13
+ DESCRIPTION = 'Print Help Message'
14
+
15
+ PARAMS = {}
16
+
17
+ class << self
18
+ BRICK_PIPELINE_SUFFIX = /_brick_pipeline$/
19
+
20
+ def create_help
21
+ GoodData::Bricks::Pipeline.methods
22
+ .grep(BRICK_PIPELINE_SUFFIX)
23
+ .map { |method| method.to_s.sub(BRICK_PIPELINE_SUFFIX, '') }
24
+ .map { |available_brick| { available_brick: available_brick } }
25
+ end
26
+
27
+ def call(_params)
28
+ { results: create_help }
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -19,10 +19,16 @@ module GoodData
19
19
  param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
20
20
 
21
21
  description 'Schedule Additional Parameters'
22
- param :additional_params, instance_of(Type::HashType), required: false
22
+ param :additional_params, instance_of(Type::HashType), required: false, deprecated: true, replacement: :schedule_additional_params
23
23
 
24
24
  description 'Schedule Additional Secure Parameters'
25
- param :additional_hidden_params, instance_of(Type::HashType), required: false
25
+ param :additional_hidden_params, instance_of(Type::HashType), required: false, deprecated: true, replacement: :schedule_additional_hidden_params
26
+
27
+ description 'Schedule Additional Parameters'
28
+ param :schedule_additional_params, instance_of(Type::HashType), required: false
29
+
30
+ description 'Schedule Additional Secure Parameters'
31
+ param :schedule_additional_hidden_params, instance_of(Type::HashType), required: false
26
32
 
27
33
  description 'Schedule Parameters'
28
34
  param :schedule_params, instance_of(Type::HashType), required: false, default: {}
@@ -50,6 +56,10 @@ module GoodData
50
56
  def call(params)
51
57
  client = params.gdc_gd_client
52
58
  data_product = params.data_product
59
+
60
+ schedule_additional_params = params.schedule_additional_params || params.additional_params
61
+ schedule_additional_hidden_params = params.schedule_additional_hidden_params || params.additional_hidden_params
62
+
53
63
  synchronize_segments = params.synchronize.group_by do |info|
54
64
  info[:segment_id]
55
65
  end
@@ -125,14 +135,14 @@ module GoodData
125
135
  end
126
136
  end
127
137
 
128
- schedule.update_params(params.additional_params) if params.additional_params
138
+ schedule.update_params(schedule_additional_params) if schedule_additional_params
129
139
 
130
140
  schedule.update_params(params_for_all_schedules_in_all_projects) if params_for_all_schedules_in_all_projects
131
141
  schedule.update_params(params_for_all_projects[schedule.name]) if params_for_all_projects[schedule.name]
132
142
  schedule.update_params(params_for_all_schedules_in_this_client) if params_for_all_schedules_in_this_client
133
143
  schedule.update_params(params_for_this_client[schedule.name]) if params_for_this_client[schedule.name]
134
144
 
135
- schedule.update_hidden_params(params.additional_hidden_params) if params.additional_hidden_params
145
+ schedule.update_hidden_params(schedule_additional_hidden_params) if schedule_additional_hidden_params
136
146
  schedule.enable
137
147
  schedule.save
138
148
  end
@@ -24,8 +24,8 @@ module GoodData
24
24
  description 'Logger'
25
25
  param :gdc_logger, instance_of(Type::GdLogger), required: true
26
26
 
27
- description 'Additional Hidden Parameters'
28
- param :additional_hidden_params, instance_of(Type::HashType), required: false
27
+ description 'Additional Hidden Parameters of Processes'
28
+ param :process_additional_hidden_params, instance_of(Type::HashType), required: false
29
29
  end
30
30
 
31
31
  RESULT_HEADER = [
@@ -59,7 +59,8 @@ module GoodData
59
59
  from,
60
60
  to_project,
61
61
  ads_output_stage_uri: info.ads_output_stage_uri,
62
- ads_output_stage_prefix: info.ads_output_stage_prefix
62
+ ads_output_stage_prefix: info.ads_output_stage_prefix,
63
+ additional_hidden_params: params.process_additional_hidden_params
63
64
  )
64
65
 
65
66
  to_project.add.output_stage.client_id = client_id if client_id && to_project.add.output_stage
@@ -22,10 +22,16 @@ module GoodData
22
22
  param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
23
23
 
24
24
  description 'Schedule Additional Parameters'
25
- param :additional_params, instance_of(Type::HashType), required: false
25
+ param :additional_params, instance_of(Type::HashType), required: false, deprecated: true, replacement: :schedule_additional_params
26
26
 
27
27
  description 'Schedule Additional Secure Parameters'
28
- param :additional_hidden_params, instance_of(Type::HashType), required: false
28
+ param :additional_hidden_params, instance_of(Type::HashType), required: false, deprecated: true, replacement: :schedule_additional_hidden_params
29
+
30
+ description 'Schedule Additional Parameters'
31
+ param :schedule_additional_params, instance_of(Type::HashType), required: false
32
+
33
+ description 'Schedule Additional Secure Parameters'
34
+ param :schedule_additional_hidden_params, instance_of(Type::HashType), required: false
29
35
 
30
36
  description 'Logger'
31
37
  param :gdc_logger, instance_of(Type::GdLogger), required: true
@@ -47,6 +53,9 @@ module GoodData
47
53
  client = params.gdc_gd_client
48
54
  development_client = params.development_client
49
55
 
56
+ schedule_additional_params = params.schedule_additional_params || params.additional_params
57
+ schedule_additional_hidden_params = params.schedule_additional_hidden_params || params.additional_hidden_params
58
+
50
59
  params.synchronize.peach do |info|
51
60
  from_project = info.from
52
61
  to_projects = info.to
@@ -68,8 +77,8 @@ module GoodData
68
77
  # s.update_params('GOODOT_CUSTOM_PROJECT_ID' => c.id)
69
78
  # s.update_params('CLIENT_ID' => c.id)
70
79
  # s.update_params('SEGMENT_ID' => segment.id)
71
- schedule.update_params(params.additional_params || {})
72
- schedule.update_hidden_params(params.additional_hidden_params || {})
80
+ schedule.update_params(schedule_additional_params || {})
81
+ schedule.update_hidden_params(schedule_additional_hidden_params || {})
73
82
  schedule.disable
74
83
  schedule.save
75
84
 
@@ -90,13 +90,16 @@ module GoodData
90
90
  client = params.gdc_gd_client
91
91
  domain_name = params.organization || params.domain
92
92
  fail "Either organisation or domain has to be specified in params" unless domain_name
93
+
93
94
  domain = client.domain(domain_name) if domain_name
94
95
  project = client.projects(params.gdc_project) || client.projects(params.gdc_project_id)
95
96
  fail "Either project or project_id has to be specified in params" unless project
97
+
96
98
  data_product = params.data_product
97
99
 
98
100
  config = params.filters_config
99
101
  fail 'User filters brick requires configuration how the filter should be setup. For this use the param "filters_config"' if config.blank?
102
+
100
103
  symbolized_config = GoodData::Helpers.deep_dup(config)
101
104
  symbolized_config = GoodData::Helpers.symbolize_keys(symbolized_config)
102
105
  symbolized_config[:labels] = symbolized_config[:labels].map { |l| GoodData::Helpers.symbolize_keys(l) }
@@ -133,6 +136,7 @@ module GoodData
133
136
  user_filters.group_by { |u| u[:pid] }.flat_map.pmap do |id, new_filters|
134
137
  users = users_by_project[id]
135
138
  fail "The #{multiple_projects_column} cannot be empty" if id.blank?
139
+
136
140
  if mode == 'sync_multiple_projects_based_on_custom_id'
137
141
  current_project = domain.clients(id, data_product).project
138
142
  elsif mode == 'sync_multiple_projects_based_on_pid'
@@ -154,40 +158,34 @@ module GoodData
154
158
  user_filters.group_by { |u| u[multiple_projects_column] }.flat_map.pmap do |client_id, new_filters|
155
159
  users = users_by_project[client_id]
156
160
  fail "Client id cannot be empty" if client_id.blank?
161
+
157
162
  c = domain.clients(client_id, data_product)
158
163
  if params.segments && !segment_uris.include?(c.segment_uri)
159
- puts "Client #{client_id} is outside segments_filter #{params.segments}"
164
+ params.gdc_logger.warn "Client #{client_id} is outside segments_filter #{params.segments}"
160
165
  next
161
166
  end
162
167
  current_project = c.project
163
168
  fail "Client #{client_id} does not have project." unless current_project
169
+
164
170
  working_client_ids << client_id
165
171
  partial_results = sync_user_filters(current_project, new_filters, run_params.merge(users_brick_input: users), symbolized_config)
166
172
  results.concat(partial_results[:results])
167
173
  end
168
174
 
169
175
  unless run_params[:do_not_touch_filters_that_are_not_mentioned]
170
- domain_clients.each do |c|
176
+ domain_clients.peach do |c|
171
177
  next if working_client_ids.include?(c.client_id)
178
+
172
179
  begin
173
180
  current_project = c.project
174
- rescue => e
175
- puts "Error when accessing project of client #{c.client_id}. Error: #{e}"
176
- next
177
- end
178
- unless current_project
179
- puts "Client #{c.client_id} has no project."
180
- next
181
- end
182
- if current_project.deleted?
183
- puts "Project #{current_project.pid} of client #{c.client_id} is deleted."
184
- next
185
- end
181
+ users = users_by_project[c.client_id]
182
+ params.gdc_logger.info "Delete all filters in project #{current_project.pid} of client #{c.client_id}"
183
+ current_results = sync_user_filters(current_project, [], run_params.merge(users_brick_input: users), symbolized_config)
186
184
 
187
- puts "Delete all filters in project #{current_project.pid} of client #{c.client_id}"
188
- users = users_by_project[c.client_id]
189
- delete_results = current_project.add_data_permissions([], run_params.merge(users_brick_input: users))
190
- results.concat(delete_results[:results])
185
+ results.concat(current_results[:results])
186
+ rescue StandardError => e
187
+ params.gdc_logger.error "Failed to clear filters of #{c.client_id} due to: #{e.inspect}"
188
+ end
191
189
  end
192
190
  end
193
191
 
@@ -75,32 +75,15 @@ module GoodData
75
75
  end
76
76
 
77
77
  MODES = {
78
- # Low Level Commands
79
-
80
- actions: [
81
- PrintActions
82
- ],
83
78
 
84
79
  hello: [
85
80
  HelloWorld
86
81
  ],
87
82
 
88
- modes: [
89
- PrintModes
90
- ],
91
-
92
- info: [
93
- PrintTypes,
94
- PrintActions,
95
- PrintModes
96
- ],
97
-
98
- types: [
99
- PrintTypes
83
+ help: [
84
+ Help
100
85
  ],
101
86
 
102
- ## Bricks
103
-
104
87
  release: [
105
88
  EnsureReleaseTable,
106
89
  CollectDataProduct,
@@ -170,11 +153,8 @@ module GoodData
170
153
 
171
154
  schedules_execution: [
172
155
  ExecuteSchedules
173
- ],
174
-
175
- hello_world: [
176
- HelloWorld
177
156
  ]
157
+
178
158
  }
179
159
 
180
160
  MODE_NAMES = MODES.keys
@@ -365,7 +365,10 @@ Available values for setting language are: #{available_languages}."
365
365
  # use fuzzy_get_user.
366
366
  #
367
367
  # @param [String] name Name to look for
368
- # @param [Array<GoodData::User>]user_list Optional cached list of users used for look-ups
368
+ # @param [Array<GoodData::User>] user_list
369
+ # Optional cached list of users used for look-ups.
370
+ # WARNING: If not specified, in the worst case the
371
+ # method gets all users from the domain!
369
372
  # @return [GoodDta::Membership] User
370
373
  def get_user(name, user_list = users)
371
374
  return member(name, user_list) if name.instance_of?(GoodData::Membership)
@@ -187,8 +187,8 @@ module GoodData
187
187
  def deploy_component(data, options = { client: GoodData.client, project: GoodData.project })
188
188
  client, project = GoodData.get_client_and_project(options)
189
189
  data = { process: data } unless data[:process]
190
- data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| [:type, :name, :component].include? k }
191
- data[:process][:component] = GoodData::Helpers.symbolize_keys(data[:process][:component]).select { |k| [:name, :version].include? k }
190
+ data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component].include? k }
191
+ data[:process][:component] = GoodData::Helpers.symbolize_keys(data[:process][:component]).select { |k| %i[name version configLocation].include? k }
192
192
 
193
193
  # a feature flag is required to create component type processes
194
194
  client.post "/gdc/projects/#{project.pid}/projectFeatureFlags",
@@ -262,6 +262,7 @@ module GoodData
262
262
  def transfer_processes(from_project, to_project, options = {})
263
263
  options = GoodData::Helpers.symbolize_keys(options)
264
264
  to_project_processes = to_project.processes
265
+ additional_hidden_params = options[:additional_hidden_params] || {}
265
266
  result = from_project.processes.uniq(&:name).map do |process|
266
267
  fail "The process name #{process.name} must be unique in transfered project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
267
268
  next if process.type == :dataload
@@ -272,7 +273,8 @@ module GoodData
272
273
  GoodData::Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project)
273
274
  elsif process.component
274
275
  to_process.delete if to_process
275
- GoodData::Process.deploy_component(GoodData::Helpers.symbolize_keys(process.to_hash), project: to_project, client: to_project.client)
276
+ process_hash = GoodData::Helpers::DeepMergeableHash[GoodData::Helpers.symbolize_keys(process.to_hash)].deep_merge(additional_hidden_params)
277
+ GoodData::Process.deploy_component(process_hash, project: to_project, client: to_project.client)
276
278
  else
277
279
  Dir.mktmpdir('etl_transfer') do |dir|
278
280
  dir = Pathname(dir)
@@ -6,7 +6,7 @@
6
6
 
7
7
  # GoodData Module
8
8
  module GoodData
9
- VERSION = '1.3.2'
9
+ VERSION = '1.3.3'
10
10
 
11
11
  class << self
12
12
  # Version
metadata CHANGED
@@ -1,17 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gooddata
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.3
5
5
  platform: java
6
6
  authors:
7
7
  - Pavel Kolesnikov
8
8
  - Thomas Watson Steen
9
9
  - Tomas Svarovsky
10
10
  - Tomas Korcak
11
+ - Jan Zdrahal
12
+ - Petr Gadorek
13
+ - Jakub Mahnert
11
14
  autorequire:
12
15
  bindir: bin
13
16
  cert_chain: []
14
- date: 2018-10-05 00:00:00.000000000 Z
17
+ date: 2018-11-23 00:00:00.000000000 Z
15
18
  dependencies:
16
19
  - !ruby/object:Gem::Dependency
17
20
  requirement: !ruby/object:Gem::Requirement
@@ -282,31 +285,17 @@ dependencies:
282
285
  - !ruby/object:Gem::Dependency
283
286
  requirement: !ruby/object:Gem::Requirement
284
287
  requirements:
285
- - - ">="
288
+ - - "~>"
286
289
  - !ruby/object:Gem::Version
287
- version: '0'
290
+ version: 0.0.9
288
291
  name: gooddata_datawarehouse
289
292
  prerelease: false
290
293
  type: :runtime
291
294
  version_requirements: !ruby/object:Gem::Requirement
292
295
  requirements:
293
- - - ">="
294
- - !ruby/object:Gem::Version
295
- version: '0'
296
- - !ruby/object:Gem::Dependency
297
- requirement: !ruby/object:Gem::Requirement
298
- requirements:
299
- - - '='
300
- - !ruby/object:Gem::Version
301
- version: 0.1.12
302
- name: gooddata-dss-jdbc
303
- prerelease: false
304
- type: :runtime
305
- version_requirements: !ruby/object:Gem::Requirement
306
- requirements:
307
- - - '='
296
+ - - "~>"
308
297
  - !ruby/object:Gem::Version
309
- version: 0.1.12
298
+ version: 0.0.9
310
299
  - !ruby/object:Gem::Dependency
311
300
  requirement: !ruby/object:Gem::Requirement
312
301
  requirements:
@@ -497,15 +486,17 @@ dependencies:
497
486
  version: '0'
498
487
  description: Use the GoodData::Client class to integrate GoodData into your own application
499
488
  or use the CLI to work with GoodData directly from the command line.
500
- email: pavel@gooddata.com
489
+ email: lcm@gooddata.com
501
490
  executables:
502
491
  - gitflow-init.sh
503
492
  - gooddata
504
493
  - hello_world.sh
494
+ - help.sh
505
495
  - provisioning.sh
506
496
  - release.sh
507
497
  - rollout.sh
508
498
  - run_brick.rb
499
+ - test_projects_cleanup.rb
509
500
  - user_filters.sh
510
501
  - users.sh
511
502
  extensions: []
@@ -539,14 +530,17 @@ files:
539
530
  - RELEASING.md
540
531
  - Rakefile
541
532
  - TODO.md
533
+ - VERSION
542
534
  - authors.sh
543
535
  - bin/gitflow-init.sh
544
536
  - bin/gooddata
545
537
  - bin/hello_world.sh
538
+ - bin/help.sh
546
539
  - bin/provisioning.sh
547
540
  - bin/release.sh
548
541
  - bin/rollout.sh
549
542
  - bin/run_brick.rb
543
+ - bin/test_projects_cleanup.rb
550
544
  - bin/user_filters.sh
551
545
  - bin/users.sh
552
546
  - ci.rake
@@ -566,6 +560,7 @@ files:
566
560
  - lib/gooddata/bricks/brick.rb
567
561
  - lib/gooddata/bricks/bricks.rb
568
562
  - lib/gooddata/bricks/hello_world_brick.rb
563
+ - lib/gooddata/bricks/help_brick.rb
569
564
  - lib/gooddata/bricks/middleware/aws_middleware.rb
570
565
  - lib/gooddata/bricks/middleware/base_middleware.rb
571
566
  - lib/gooddata/bricks/middleware/bench_middleware.rb
@@ -677,10 +672,8 @@ files:
677
672
  - lib/gooddata/lcm/actions/ensure_technical_users_project.rb
678
673
  - lib/gooddata/lcm/actions/execute_schedules.rb
679
674
  - lib/gooddata/lcm/actions/hello_world.rb
675
+ - lib/gooddata/lcm/actions/help.rb
680
676
  - lib/gooddata/lcm/actions/import_object_collections.rb
681
- - lib/gooddata/lcm/actions/print_actions.rb
682
- - lib/gooddata/lcm/actions/print_modes.rb
683
- - lib/gooddata/lcm/actions/print_types.rb
684
677
  - lib/gooddata/lcm/actions/provision_clients.rb
685
678
  - lib/gooddata/lcm/actions/purge_clients.rb
686
679
  - lib/gooddata/lcm/actions/rename_existing_client_projects.rb
@@ -908,7 +901,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
908
901
  version: '0'
909
902
  requirements: []
910
903
  rubyforge_project:
911
- rubygems_version: 2.6.14
904
+ rubygems_version: 2.6.13
912
905
  signing_key:
913
906
  specification_version: 4
914
907
  summary: A convenient Ruby wrapper around the GoodData RESTful API
@@ -1,58 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
- # This source code is licensed under the BSD-style license found in the
5
- # LICENSE file in the root directory of this source tree.
6
-
7
- require_relative 'base_action'
8
-
9
- module GoodData
10
- module LCM2
11
- class PrintActions < BaseAction
12
- DESCRIPTION = 'Print Information About Actions'
13
-
14
- PARAMS = {
15
- }
16
-
17
- class << self
18
- def call(params)
19
- results = []
20
-
21
- actions = GoodData::LCM2::BaseAction.descendants
22
-
23
- actions.each do |action|
24
- action_params = action.const_get(:PARAMS)
25
- action_params_keys = action_params.keys
26
- params = action_params_keys.map do |param|
27
- param
28
- end
29
-
30
- types = action_params.map do |_k, param|
31
- param[:type].class.short_name
32
- end
33
-
34
- required = action_params.map do |_k, param|
35
- param[:opts][:required]
36
- end
37
-
38
- defaults = action_params.map do |_k, param|
39
- param[:opts][:default]
40
- end
41
-
42
- results << {
43
- name: action.short_name,
44
- description: action.const_get(:DESCRIPTION),
45
- params: params.join("\n"),
46
- types: types.join("\n"),
47
- required: required.join("\n"),
48
- default: defaults.join("\n")
49
- }
50
- end
51
-
52
- # Return results
53
- results
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,69 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
- # This source code is licensed under the BSD-style license found in the
5
- # LICENSE file in the root directory of this source tree.
6
-
7
- require_relative 'base_action'
8
-
9
- module GoodData
10
- module LCM2
11
- class PrintModes < BaseAction
12
- DESCRIPTION = 'Print Modes'
13
-
14
- PARAMS = {
15
- }
16
-
17
- class << self
18
- def call(params)
19
- results = []
20
- GoodData::LCM2::MODES.keys.each_with_index do |mode, index|
21
- actions = GoodData::LCM2::MODES[mode]
22
- action_names = actions.map do |k, _action|
23
- params_length = k.const_get(:PARAMS).keys.length
24
- k.short_name + ("\n" * (params_length > 1 ? params_length - 1 : 0))
25
- end
26
-
27
- params = actions.map do |action|
28
- action.const_get(:PARAMS).map do |_k, param|
29
- param[:name]
30
- end
31
- end
32
-
33
- types = actions.map do |action|
34
- action.const_get(:PARAMS).map do |_k, param|
35
- param[:type]
36
- # param[:type].class.short_name
37
- end
38
- end
39
-
40
- required = actions.map do |action|
41
- action.const_get(:PARAMS).map do |_k, param|
42
- param[:opts][:required]
43
- end
44
- end
45
-
46
- defaults = actions.map do |action|
47
- action.const_get(:PARAMS).map do |_k, param|
48
- param[:opts][:default]
49
- end
50
- end
51
-
52
- results << {
53
- '#' => index,
54
- mode: mode,
55
- actions: action_names.join("\n"),
56
- params: params.join("\n"),
57
- types: types.join("\n"),
58
- required: required.join("\n"),
59
- default: defaults.join("\n")
60
- }
61
- end
62
-
63
- # Return results
64
- results
65
- end
66
- end
67
- end
68
- end
69
- end
@@ -1,52 +0,0 @@
1
- # encoding: UTF-8
2
- #
3
- # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
- # This source code is licensed under the BSD-style license found in the
5
- # LICENSE file in the root directory of this source tree.
6
-
7
- require_relative 'base_action'
8
-
9
- module GoodData
10
- module LCM2
11
- class PrintTypes < BaseAction
12
- DESCRIPTION = 'Print Information About Defined Types'
13
-
14
- PARAMS = {
15
- }
16
-
17
- class << self
18
- def call(_params)
19
- results = []
20
-
21
- GoodData::LCM2::Dsl::Dsl::TYPES.each_pair do |k, v|
22
- vals = []
23
- v.each_pair do |_name, val|
24
- vals << val[:type]
25
- end
26
-
27
- required = []
28
- v.each_pair do |_name, val|
29
- required << val[:opts][:required]
30
- end
31
-
32
- defaults = []
33
- v.each_pair do |_name, val|
34
- defaults << val[:opts][:default]
35
- end
36
-
37
- results << {
38
- class: k.short_name,
39
- param: v.keys.join("\n"),
40
- type: vals.join("\n"),
41
- required: required.join("\n"),
42
- default: defaults.join("\n")
43
- }
44
- end
45
-
46
- # Return results
47
- results
48
- end
49
- end
50
- end
51
- end
52
- end