gooddata 2.1.17 → 2.1.19

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
2
  SHA256:
3
- metadata.gz: f14e76f590c86838c60c538ccd73ba636da3ab812658e76211a148f2e195b4da
4
- data.tar.gz: 2261df5e9488e38560209c2a8df0048f5aad04d3451ba6b637146eb3a3118704
3
+ metadata.gz: f00b6b202dc2bcd6af02eda57b326c0ccf222a57683dcf12bacf6b318a212ec7
4
+ data.tar.gz: a2f73ed25aa53295e06648efaf0961c5eed43fc3f9defae3b5e640a167c948a2
5
5
  SHA512:
6
- metadata.gz: cfdfca51d63852aec59a46ce18f5e746018106f69847bf31cf7b8f845d41ef88d85c9c585af2010164116aab7fc1aa4d5b3ad75199b6c56fe9107d5ed353dcaa
7
- data.tar.gz: 97916ca5253a378319414a9fe7f4a5d673f08168085e629ff2462df6a3f0b173f62501529eb965c69d6e361333467e7340842fa217c08075950c34b8f9f2e05e
6
+ metadata.gz: ac6f6fd25919099b44ecaa302d81dab084de7540b158e35e02bb05b970eb8bba466a77d0eba3403dca66160f8e4c9c2b02603af9a8249afe7a4ebad295f22774
7
+ data.tar.gz: c075fe2ed8d29d0612f6fc01687c1d0cedc690df830642ebdac369026f7fc3158a07fcfbadd8c079a3574e222713b0cbce60a7b6b189ac3f6b4ba950b877e7b0
data/.travis.yml CHANGED
@@ -73,23 +73,52 @@ jobs:
73
73
 
74
74
  - name: lcm integration (vcr) tests - e2e
75
75
  stage: before-merge
76
- script: bundle exec rspec spec/lcm/integration/lcm_end_to_end_spec.rb
76
+ script: bundle exec rspec spec/lcm/integration/spec/e2e/lcm_end_to_end_spec.rb
77
77
  env:
78
78
  - VCR_RECORD_MODE=none
79
79
  rvm: 2.3
80
80
 
81
81
  # AFTER MERGE
82
82
  # staging 1
83
- - &lcm-integration-tests
84
- name: staging1 - lcm integration tests
83
+ - &lcm-integration-e2e-tests
84
+ name: staging1 - lcm integration-e2e tests
85
85
  stage: after-merge
86
86
  script: |
87
87
  bundle exec rake -f lcm.rake docker:build
88
88
  bundle exec rake -f lcm.rake docker:bundle
89
- bundle exec rake -f lcm.rake test:docker:integration
89
+ bundle exec rake -f lcm.rake test:docker:integration-e2e
90
90
  env:
91
91
  - VCR_ON=false
92
92
  - GD_ENV=staging
93
+ - GD_MAX_RETRY=2
94
+ rvm: jruby-9.1.14
95
+ jdk: openjdk8
96
+
97
+ - &lcm-integration-release-tests
98
+ name: staging1 - lcm integration-release tests
99
+ stage: after-merge
100
+ script: |
101
+ bundle exec rake -f lcm.rake docker:build
102
+ bundle exec rake -f lcm.rake docker:bundle
103
+ bundle exec rake -f lcm.rake test:docker:integration-release
104
+ env:
105
+ - VCR_ON=false
106
+ - GD_ENV=staging
107
+ - GD_MAX_RETRY=2
108
+ rvm: jruby-9.1.14
109
+ jdk: openjdk8
110
+
111
+ - &lcm-integration-others-tests
112
+ name: staging1 - lcm integration-others tests
113
+ stage: after-merge
114
+ script: |
115
+ bundle exec rake -f lcm.rake docker:build
116
+ bundle exec rake -f lcm.rake docker:bundle
117
+ bundle exec rake -f lcm.rake test:docker:integration-others
118
+ env:
119
+ - VCR_ON=false
120
+ - GD_ENV=staging
121
+ - GD_MAX_RETRY=2
93
122
  rvm: jruby-9.1.14
94
123
  jdk: openjdk8
95
124
 
@@ -155,11 +184,26 @@ jobs:
155
184
  jdk: openjdk8
156
185
 
157
186
  # staging 2
158
- - <<: *lcm-integration-tests
159
- name: staging2 - lcm integration tests
187
+ - <<: *lcm-integration-e2e-tests
188
+ name: staging2 - lcm integration-e2e tests
189
+ env:
190
+ - GD_ENV=testing
191
+ - VCR_ON=false
192
+ - GD_MAX_RETRY=2
193
+
194
+ - <<: *lcm-integration-release-tests
195
+ name: staging2 - lcm integration-release tests
196
+ env:
197
+ - GD_ENV=testing
198
+ - VCR_ON=false
199
+ - GD_MAX_RETRY=2
200
+
201
+ - <<: *lcm-integration-others-tests
202
+ name: staging2 - lcm integration-others tests
160
203
  env:
161
204
  - GD_ENV=testing
162
205
  - VCR_ON=false
206
+ - GD_MAX_RETRY=2
163
207
 
164
208
  - <<: *lcm-slow-tests
165
209
  name: staging2 - lcm slow tests
@@ -192,11 +236,26 @@ jobs:
192
236
  - VCR_ON=false
193
237
 
194
238
  # staging 3
195
- - <<: *lcm-integration-tests
196
- name: staging3 - lcm integration tests
239
+ - <<: *lcm-integration-e2e-tests
240
+ name: staging3 - lcm integration-e2e tests
241
+ env:
242
+ - GD_ENV=development
243
+ - VCR_ON=false
244
+ - GD_MAX_RETRY=2
245
+
246
+ - <<: *lcm-integration-release-tests
247
+ name: staging3 - lcm integration-release tests
248
+ env:
249
+ - GD_ENV=development
250
+ - VCR_ON=false
251
+ - GD_MAX_RETRY=2
252
+
253
+ - <<: *lcm-integration-others-tests
254
+ name: staging3 - lcm integration-others tests
197
255
  env:
198
256
  - GD_ENV=development
199
257
  - VCR_ON=false
258
+ - GD_MAX_RETRY=2
200
259
 
201
260
  - <<: *lcm-slow-tests
202
261
  name: staging3 - lcm slow tests
@@ -234,15 +293,21 @@ jobs:
234
293
  stage: after-merge
235
294
  name: staging1 - test environment clean-up
236
295
  script: travis_wait 30 bundle exec ruby bin/test_projects_cleanup.rb -f
237
- env: GD_ENV=staging
296
+ env:
297
+ - GD_ENV=staging
298
+ - GD_MAX_RETRY=2
238
299
 
239
300
  - <<: *cleanup
240
- name: travis_wait 30 staging2 - test environment clean-up
241
- env: GD_ENV=testing
301
+ name: staging2 - test environment clean-up
302
+ env:
303
+ - GD_ENV=testing
304
+ - GD_MAX_RETRY=2
242
305
 
243
306
  - <<: *cleanup
244
- name: travis_wait 30 staging3 - test environment clean-up
245
- env: GD_ENV=development
307
+ name: staging3 - test environment clean-up
308
+ env:
309
+ - GD_ENV=development
310
+ - GD_MAX_RETRY=2
246
311
 
247
312
  # AFTER MERGE UNIT TESTS ON ALTERNATIVE PLATFORM
248
313
 
@@ -279,7 +344,7 @@ jobs:
279
344
  script: bundle exec rake test:unit
280
345
  os: osx
281
346
  rvm: jruby-9.1.14
282
- osx_image: xcode7.3
347
+ osx_image: xcode9.4
283
348
 
284
349
  - stage: gem-release
285
350
  name: deploy MRI gem
data/CHANGELOG.md CHANGED
@@ -1,4 +1,16 @@
1
1
  # GoodData Ruby SDK Changelog
2
+ ## 2.1.19
3
+ - BUGFIX: MSF-20827 Fix gem-smoke-test failed when release ruby SDK
4
+ - BUGFIX: MSF-20826 Failure update license file when release ruby SDK
5
+
6
+ ## 2.1.18
7
+ - BUGFIX: TMA-1700 Failed Provisioning Brick created clients without ETL
8
+ - FEATURE: BCO-1300 Add model for analytical dashboard and visualization object
9
+ - FEATURE: MSF-20118 Support PostgreSQL as input for LCM provisioning bricks
10
+ - BUGFIX: TMA-999 Improve API call statistics log: add grouping on PID for roles
11
+ - CONFIG: TMA-1714 Ruby SDK travis build is failing
12
+ - BUGFIX: TMA-707 Provisioning brick does not log client deletion
13
+
2
14
  ## 2.1.17
3
15
  - BUGFIX:TMA-1704 - Enhance error message when not found clientId in source table
4
16
  - BUGFIX: TMA-1694 [UsersBrick] Enhance messages add more log for missing users when running remove_from_organization
data/Dockerfile.jruby CHANGED
@@ -2,7 +2,7 @@ FROM jruby:9.1-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++
5
+ RUN apk add --no-cache curl make gcc git g++ python linux-headers binutils-gold gnupg libstdc++ postgresql postgresql-client openssl
6
6
 
7
7
  # Switch to directory with sources
8
8
  WORKDIR /src
@@ -20,3 +20,13 @@ ADD . .
20
20
  RUN keytool -importcert -alias gooddata-2008 -file "./data/2008.crt" -keystore $JAVA_HOME/lib/security/cacerts -trustcacerts -storepass 'changeit' -noprompt
21
21
  RUN keytool -importcert -alias gooddata-int -file "./data/new_ca.cer" -keystore $JAVA_HOME/lib/security/cacerts -trustcacerts -storepass 'changeit' -noprompt
22
22
  RUN keytool -importcert -alias gooddata-prod -file "data/new_prodgdc_ca.crt" -keystore $JAVA_HOME/lib/security/cacerts -trustcacerts -storepass 'changeit' -noprompt
23
+
24
+ ENV LANG en_US.utf8
25
+ RUN adduser -D -g '' gooddata
26
+ RUN rm -rf $HOME/spec/postgresql
27
+ RUN mkdir $HOME/spec/postgresql
28
+ RUN chmod -R 0750 $HOME/spec/postgresql
29
+ RUN chown gooddata $HOME/spec/postgresql
30
+ RUN mkdir /run/postgresql; chmod 1777 -R /run;
31
+ RUN mkdir $HOME/pre-exec.d; mkdir $HOME/pre-init.d; chmod -R 1755 $HOME/pre-exec.d; chmod -R 1755 $HOME/pre-exec.d
32
+ USER gooddata
data/SDK_VERSION CHANGED
@@ -1 +1 @@
1
- 2.1.17
1
+ 2.1.19
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.7.25
1
+ 3.7.26
@@ -22,6 +22,39 @@ require_relative '../spec/environment/environment'
22
22
  GoodData::Environment.load
23
23
  config = GoodData::Environment::ConnectionHelper::LCM_ENVIRONMENT
24
24
  secrets = GoodData::Environment::ConnectionHelper::SECRETS
25
+ default_domain = GoodData::Environment::ConnectionHelper::DEFAULT_DOMAIN
26
+
27
+ def delete_segment_by_title(title, segments, days = 14, force = false)
28
+ return if segments.empty?
29
+ dead_line = Time.now - days * 60 * 60 * 24
30
+
31
+ filtered_segments = segments.select do |s|
32
+ if s.id.match(title) && s.id.length > 14 && s.id[s.id.length-14..-1]
33
+ segment_created = s.id[s.id.length-14..-1]
34
+ created = Time.parse(segment_created) if segment_created
35
+
36
+ s if created.year >= Time.new.year && created < dead_line
37
+ end
38
+ end
39
+
40
+ filtered_segments.each do |segment|
41
+ begin
42
+ if force
43
+ segment.clients.each do |segment_client|
44
+ GoodData.logger.info("Deleting segment: #{segment.id} - client: #{segment_client.client_id}")
45
+ segment_client.dissociate
46
+ end
47
+
48
+ puts "Deleting segment: #{segment.id}"
49
+ segment && segment.delete(force: true)
50
+ else
51
+ puts "Would delete segment: #{segment.id}"
52
+ end
53
+ rescue RuntimeError, StandardError => ex
54
+ puts "Failed to delete segment #{segment.id}, reason: #{ex}"
55
+ end
56
+ end
57
+ end
25
58
 
26
59
  def delete_project_by_title(title, projects, days = 14, force = false)
27
60
  dead_line = Time.now - days * 60 * 60 * 24
@@ -73,8 +106,16 @@ def delete_ads_by_title(title, client, days = 14, force = false)
73
106
  puts "#{deleted} ADS instances with title \"#{title}\" #{'would be ' unless force}deleted."
74
107
  end
75
108
 
76
- def clean_up!(client, force, days)
109
+ def clean_up!(client, force, days, opts = {})
77
110
  projects = client.projects
111
+
112
+ if opts[:domain_id]
113
+ domain = client.domain(opts[:domain_id])
114
+
115
+ # segments id format: {title}_{hostname}_{datetime}
116
+ delete_segment_by_title(/CAR_DEMO_PREMIUM/, domain.segments, days, force)
117
+ end
118
+
78
119
  delete_project_by_title(/Insurance Demo Master/, projects, days, force)
79
120
  delete_project_by_title(/Car Demo Master/, projects, days, force)
80
121
  delete_project_by_title(/Insurance Demo Workspace/, projects, days, force)
@@ -117,7 +158,8 @@ prod_client = init_client(username, password, "https://#{config[:prod_server]}")
117
158
 
118
159
  force = options[:force]
119
160
  days = options[:days] || 3
161
+
120
162
  clean_up!(dev_client, force, days)
121
- clean_up!(prod_client, force, days)
163
+ clean_up!(prod_client, force, days, {domain_id: default_domain})
122
164
 
123
165
  dev_client.disconnect
@@ -1,40 +1,40 @@
1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pumltSDNWBbhFy2KBRS/HA6Q+AVTDSq7j9Vf5JEVG2k9KN996B3wM4XcI2WI
31
- BEIC4ZYZeVmVjxUl/hG92gprMPE8dRxcBTYfe6K9u7IP3/4LW6pLZ3QHmOw1
32
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
40
- nQTzKqg=
1
+ SRNgp8VSJ8HqV2LnLD3kYkMO39u9rn3ssPvJHQuNHnPUDcc/FkCh529uTiqq
2
+ ON9+j5fFTjsKHr437hwnUCAq5Nn3ANSAhOSXehi3wqxicQrUU2xgbQbI+hk7
3
+ mLWrLOsm9Cn19kz9yblDh4aHTQBydJ6JwdPVnd6igIDnfLMVVVpzWK08aFfc
4
+ Y5KAeyIlLn5RQPQJL85LhVTOEG871z8wCAigeGaP2vnLzBj/9GQdwdDTsQzL
5
+ k1Rz2K3tL9SoUIVZ56dr1U11MYXduRzYJMawk21t9B7yNeKyuZCXx9U8VxAr
6
+ dqecLJoBAQI2ppPikJS3ycna/lRYD0OsGv6B7AR8sAkAB0XjpJZ9nNJys/PK
7
+ bBnmmKq+hvDu9zsIba8ptz0L3F5bi+Cfa+5c/Hyj7Jm3xiq5IWyh5LmtTmOI
8
+ MQa/fUPlerGe+7VZYlIm17fjd99cgqRM8yII/bTMvAEQREu1UxEwC4JFe9Bz
9
+ eFHeg6EorQJyBBV+LCDk86WS5RJBhBoTVj/LOm3BIUVr7Xee7naJxuRpQjgl
10
+ iTft/IfVhiwEPPonasXRjD1XwPKXUz8rX1C5JWDreOQB4hCPcNm29y/dV7Z4
11
+ 7hv4ki9YgIhhmc/sNqvSE7JO2w5dvyKo05mYQj1CQUdvqpbge68J8cV84wp5
12
+ Lj3jHRXyDf/2x0IdpJTACGUy4R8XQUYpLDAfbtmgTuHu8HndxVb3O+rpwk+K
13
+ ipXb0mj4YQvc2SbCJ58HryX9i9ZfzW1/PwNtHHw4q5+BhNVvRaqJ61aIS5LP
14
+ DzjqlJ4OtpZfNjgmwgk9pfDRmYS8MOld8lNfhIh9WjyuLAW+MiaMZy8o6hTS
15
+ 5vI65QGpD7HbgKQ4tX8LXAPVB8/rF0ReRcb1wiWydeP1eh4Dz6vXvYaJ0Jju
16
+ Q0/yCzbXyGFqv4P6FcOkVAyWhtF2kH/H114DxLq759r3Hoh+IMZutWlWFWhA
17
+ qslFPWN4P9R0kPO2KeiRsLOvBplQIANExar26dRg8hFHx0y3aT3CB7sa9bYw
18
+ DE7t2gVdMEU765f+bZhZQ2M6N2GKQv/UtXUT8xJ9skxFf1aVLDNwFh+3xs1d
19
+ f2WosiqrQ/bsagdZVmuDob9qREdbRP+EF4toWFJyL4wAhTUht1jJFogIkHBl
20
+ GtuT9c/CDQ4je4gANU0vyNf0XmlwYnZ6oQfMl7XBmYeEtXBA5uQAWeFcy6vL
21
+ zqfzwksASCo9LdUqfctD3gjMsm2J+IdAh99OxRcfHvnbV6xL9m+4Ng0GJppJ
22
+ t+w42XqznLRXLTS9RcFD2GFm7mNZziDT2Mb9L4e6Bjy5SoqCftiCbDzGJyka
23
+ BHK/4+l1MsS+J4Qr4qGFF9+HVTP/EF8InQwQECaujyzsrfX8Wn4GuSX4ZdMt
24
+ F0kakkN8A+9LpmFlb8oi4bsmzFTo1tQPRJwann/5TO0jm+Vt6ETmepE0EZ1K
25
+ SIXfQT+a9laF/UJ3bGGxLXIRp3g/ICz0ofBDeSHOCjOVhXVfKnRs/2KpPPex
26
+ yPKLTUdIAtOsKTEtF9JF97C7D/JzxHbssTCj6518BHGxBepn0HZUpeGOlClj
27
+ HiKh8PGKtP0tix1NI/tmhSHCdoi6L/XEryU2pm87qKrlKJU/6z5w7rtpCxto
28
+ X5ztrFk91a3VPEzGRmh7Hw5oNzCi5jmSzZeVgIXxEkVfdUrGAi7ZmJtgEUz5
29
+ 1BJYd2MSBlqHGHF1iIQoqtyklLuqOJR1GvS1/OxQXpXXcVTy47fzlNuKuYkg
30
+ 7beiD5H0Sz/d6J4YNgaJnde+FscHuwOfjzH6uOGQMa6A1NEBW5J1TrAPiVh9
31
+ nm7pPtDg41dScUp3JqeMRA1Akm5wyGna8yocb3CwvSBEy7KrW/8mUR/TpLao
32
+ f9HuWE8UNPjqUl6nTzVpZ2TJFM4ffZbX3NsjS+wsZFtyRAD4z0bBKveUTm19
33
+ pMTBvNljgvGlS6mzYZybPh00l3kiRU9z4Xf7Y1KQH4oSxTpwmgmqiESD0Xv8
34
+ ZmJCU/4VAxbzHwogyeaQvX4pAeC2C1lqgwYdAh6lO7OwgAhkGg3p41V1j6BA
35
+ aOcqaHk+zKpP3pL3jzAZdLvL49y430UXDNN3M6nSafFzSMrPWPjGNyIXVx68
36
+ uDNKCSIcgwAGPtossk0qRKygoQUlKdKull+gOjP/bSIoENKE4rz8RdCsG5qA
37
+ 5T7/iJflhrWGlXfI0MgIe7Lpl41jQ769rI6tSuHu9EsMFOW6/W55IsUR2+p7
38
+ RxClPslQd3tR/TSZvOM5onHK8sM/Lk+rG9BTi0h0ghwVYEiTXPSKPw70z3WY
39
+ 1YlVQS9RSr0AVn9O/Esju2XFtkcE4spXgqiQx0Wx3Y9+21UryNu1amI8rzIH
40
+ N/WeNcE=
@@ -13,6 +13,9 @@ services:
13
13
  - JRUBY_OPTS=-J-Xmx1g
14
14
  - GD_SPEC_PASSWORD
15
15
  - VCR_ON
16
+ - POSTGRES_DB=gooddata
17
+ - POSTGRES_USER=gooddata
18
+ - POSTGRES_PASSWORD=changeit
16
19
  volumes:
17
20
  - .:/src
18
21
  volumes_from:
data/gooddata.gemspec CHANGED
@@ -61,7 +61,11 @@ Gem::Specification.new do |s|
61
61
  end
62
62
 
63
63
  s.add_dependency 'aws-sdk-s3', '~> 1.16'
64
- s.add_dependency 'docile', '~> 1.1'
64
+ if RUBY_VERSION >= '2.5'
65
+ s.add_dependency 'docile', '~> 1.1'
66
+ else
67
+ s.add_dependency 'docile', '> 1.1', '< 1.4.0'
68
+ end
65
69
  s.add_dependency 'gli', '~> 2.15'
66
70
  s.add_dependency 'gooddata_datawarehouse', '~> 0.0.10' if RUBY_PLATFORM == 'java'
67
71
  s.add_dependency 'highline', '= 2.0.0.pre.develop.14'
data/lcm.rake CHANGED
@@ -3,7 +3,7 @@ require 'fileutils'
3
3
  require 'pathname'
4
4
  require 'rspec/core/rake_task'
5
5
 
6
- test_cases = %i[integration slow userprov load]
6
+ test_cases = %i[integration-e2e integration-release integration-others slow userprov load]
7
7
 
8
8
  # Schema for new Bricks.
9
9
  brick_info_schema = {
@@ -79,7 +79,7 @@ namespace :test do
79
79
  test_cases.each do |test_case|
80
80
  desc "Run #{test_case} tests"
81
81
  RSpec::Core::RakeTask.new(test_case) do |task|
82
- task.pattern = "spec/lcm/#{test_case}/**/*_spec.rb"
82
+ task.pattern = test_case['integration'] ? "spec/lcm/integration/spec/#{test_case.to_s.split('-')[-1]}/*_spec.rb" : "spec/lcm/#{test_case}/**/*_spec.rb"
83
83
  end
84
84
  end
85
85
 
@@ -101,8 +101,14 @@ namespace :test do
101
101
  test_cases.each do |t|
102
102
  desc "Run #{t} tests in Docker"
103
103
  task t do
104
- system("docker-compose -f docker-compose.lcm.yml run --rm appstore bundle exec rake -f lcm.rake test:#{t}") ||
105
- fail('Test execution failed!')
104
+ if t.to_s == 'integration'
105
+ system("docker-compose -f docker-compose.lcm.yml run --rm appstore /bin/bash -c ./spec/integration_with_postgresql.sh") ||
106
+ fail('Test execution failed!')
107
+ else
108
+ system("docker-compose -f docker-compose.lcm.yml run --rm appstore bundle exec rake -f lcm.rake test:#{t}") ||
109
+ fail('Test execution failed!')
110
+ end
111
+
106
112
  end
107
113
  end
108
114
  end
@@ -43,7 +43,7 @@ module GoodData
43
43
  RESULT_HEADER = [
44
44
  :id,
45
45
  :status,
46
- :originalProject,
46
+ :project,
47
47
  :client,
48
48
  :type
49
49
  ]
@@ -102,7 +102,13 @@ module GoodData
102
102
  options = { delete_projects: delete_projects }
103
103
  options.merge!(delete_extra_option(params, delete_extra)) if delete_extra
104
104
 
105
- domain.update_clients(params.clients, options)
105
+ results = domain.update_clients(params.clients, options)
106
+ # Update status to CREATED if the client has no project
107
+ results&.each do |r|
108
+ r[:status] = 'CREATED' if r[:originalProject].nil?
109
+ r[:project] = r[:originalProject]
110
+ end
111
+ results
106
112
  end
107
113
 
108
114
  private
@@ -48,7 +48,8 @@ module GoodData
48
48
  domain_name = params.organization || params.domain
49
49
  fail "Either organisation or domain has to be specified in params" unless domain_name
50
50
  domain = client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
51
-
51
+ error_message = nil
52
+ invalid_client_ids = []
52
53
  begin
53
54
  results = params.segments.map do |segment|
54
55
  segment_object = domain.segments(segment.segment_id, data_product)
@@ -57,33 +58,53 @@ module GoodData
57
58
  end
58
59
 
59
60
  unless tmp.empty?
60
- synchronize_projects << {
61
+ synchronize_project = {
61
62
  segment_id: segment.segment_id,
62
63
  from: segment.development_pid,
63
64
  to: tmp.map do |entry|
64
65
  unless entry[:project_uri]
65
- raise "Provisioning project for client id #{entry[:id]} has error: #{entry[:error]}"
66
+ error_message = "There was error during provisioning clients: #{entry[:error]}" unless error_message
67
+ invalid_client_ids << entry[:id]
68
+ next
66
69
  end
67
70
  {
68
71
  pid: entry[:project_uri].split('/').last,
69
72
  client_id: entry[:id]
70
73
  }
71
- end
74
+ end.compact
72
75
  }
76
+
77
+ synchronize_projects << synchronize_project unless synchronize_project[:to].empty?
78
+ end
79
+
80
+ if error_message
81
+ params.gdc_logger.debug "#{error_message}. Purge all invalid clients now ..."
82
+ deleted_client_ids = []
83
+
84
+ segment_object.clients.map do |segment_client|
85
+ project = segment_client.project
86
+ if (project.nil? || project.deleted?)
87
+ client_id = segment_client.client_id
88
+ if invalid_client_ids.include?(client_id)
89
+ segment_client.delete
90
+ deleted_client_ids << client_id
91
+ end
92
+ end
93
+ end
94
+
95
+ params.gdc_logger.debug "Deleted clients: #{deleted_client_ids.join(', ')}"
96
+ raise error_message unless error_message['TooManyProjectsCreatedException'] || error_message['Max number registered projects']
97
+ break tmp
73
98
  end
74
99
 
75
100
  tmp
76
101
  end
77
102
  rescue => e
78
- params.gdc_logger.error "Problem occurs when provisioning clients. Purge all invalid clients now ..."
79
- res = LCM2.run_action PurgeClients, params
80
- params.gdc_logger.debug "Purge clients result: #{res}"
81
- deleted_client_ids = res[:results].select { |r| r[:status] == 'purged' }.map { |r| r[:client_id] }
82
- params.gdc_logger.error "Deleted clients: #{deleted_client_ids.join(', ')}"
103
+ params.gdc_logger.error "Problem occurs when provisioning clients."
83
104
  raise e
84
105
  end
85
106
 
86
- results.flatten!
107
+ results.flatten! if results
87
108
 
88
109
  # Return results
89
110
  {
@@ -456,10 +456,12 @@ Available values for setting language are: #{available_languages}."
456
456
  alias_method :add_clients_settings, :update_clients_settings
457
457
 
458
458
  def update_clients(data, options = {})
459
+ results = []
459
460
  data.group_by(&:data_product_id).each do |data_product_id, client_update_data|
460
461
  data_product = data_products(data_product_id)
461
- data_product.update_clients(client_update_data, options)
462
+ results.concat data_product.update_clients(client_update_data, options)
462
463
  end
464
+ results
463
465
  end
464
466
 
465
467
  # Update user in domain
@@ -0,0 +1,49 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+ #
4
+ # Copyright (c) 2010-2021 GoodData Corporation. All rights reserved.
5
+ # This source code is licensed under the BSD-style license found in the
6
+ # LICENSE file in the root directory of this source tree.
7
+
8
+ require_relative 'analytical_visualization_object'
9
+
10
+ module GoodData
11
+ class AnalyticalDashboard < GoodData::AnalyticalVisualizationObject
12
+ EMPTY_OBJECT = {
13
+ 'analyticalDashboard' => {
14
+ 'content' => {
15
+ 'filterContext' => '',
16
+ 'layout' => {},
17
+ 'widgets' => []
18
+ },
19
+ 'meta' => {
20
+ 'deprecated' => '0',
21
+ 'summary' => '',
22
+ 'title' => ''
23
+ }
24
+ }
25
+ }
26
+
27
+ ASSIGNABLE_MEMBERS = %i[filterContext layout widgets deprecated summary title]
28
+
29
+ class << self
30
+ # Method intended to get all AnalyticalDashboard objects in a specified project
31
+ #
32
+ # @param options [Hash] the options hash
33
+ # @option options [Boolean] :full with true value will pull in full objects. Default is false value
34
+ # @return [Array<GoodData::AnalyticalDashboard>] Return AnalyticalDashboard list
35
+ def all(options = { :client => GoodData.connection, :project => GoodData.project })
36
+ query('analyticalDashboard', AnalyticalDashboard, options)
37
+ end
38
+
39
+ # Create Analytical Dashboard in the specify project
40
+ #
41
+ # @param analytical_dashboard [Hash] the data of object will be created
42
+ # @param options [Hash] The project that the object will be created in
43
+ # @return GoodData::AnalyticalDashboard object
44
+ def create(analytical_dashboard = {}, options = { :client => GoodData.client, :project => GoodData.project })
45
+ GoodData::AnalyticalVisualizationObject.create(analytical_dashboard, AnalyticalDashboard, EMPTY_OBJECT, ASSIGNABLE_MEMBERS, options)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+ #
4
+ # Copyright (c) 2010-2021 GoodData Corporation. All rights reserved.
5
+ # This source code is licensed under the BSD-style license found in the
6
+ # LICENSE file in the root directory of this source tree.
7
+
8
+ module GoodData
9
+ class AnalyticalVisualizationObject < GoodData::MdObject
10
+ class << self
11
+ # Create a specify object in the specify project
12
+ #
13
+ # @param object_data [Hash] the data of object will be created
14
+ # @param klass [Class] A class used for instantiating the returned data
15
+ # @param empty_data_object [Hash] the empty data of object will be created
16
+ # @param assignable_properties [Hash] the properties allow updating
17
+ # @param options [Hash] The project that the object will be created in
18
+ # @return klass object
19
+ def create(object_data, klass, empty_data_object = {}, assignable_properties = [], options = { :client => GoodData.client, :project => GoodData.project })
20
+ client, project = GoodData.get_client_and_project(GoodData::Helpers.symbolize_keys(options))
21
+
22
+ res = client.create(klass, GoodData::Helpers.deep_dup(GoodData::Helpers.stringify_keys(empty_data_object)), :project => project)
23
+ object_data.each do |k, v|
24
+ res.send("#{k}=", v) if assignable_properties.include? k
25
+ end
26
+ res
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+ #
4
+ # Copyright (c) 2010-2021 GoodData Corporation. All rights reserved.
5
+ # This source code is licensed under the BSD-style license found in the
6
+ # LICENSE file in the root directory of this source tree.
7
+
8
+ require_relative 'analytical_visualization_object'
9
+
10
+ module GoodData
11
+ class VisualizationObject < GoodData::AnalyticalVisualizationObject
12
+ EMPTY_OBJECT = {
13
+ 'visualizationObject' => {
14
+ 'content' => {
15
+ 'buckets' => [],
16
+ 'properties' => '',
17
+ 'visualizationClass' => {}
18
+ },
19
+ 'links' => {},
20
+ 'meta' => {
21
+ 'deprecated' => '0',
22
+ 'summary' => '',
23
+ 'title' => ''
24
+ }
25
+ }
26
+ }
27
+
28
+ ASSIGNABLE_MEMBERS = %i[buckets properties visualizationClass deprecated summary title]
29
+
30
+ class << self
31
+ # Method intended to get all VisualizationObject objects in a specified project
32
+ #
33
+ # @param options [Hash] the options hash
34
+ # @option options [Boolean] :full with true value to pull full objects
35
+ # @return [Array<GoodData::VisualizationObject>] Return VisualizationObject list
36
+ def all(options = { :client => GoodData.connection, :project => GoodData.project })
37
+ query('visualizationObject', VisualizationObject, options)
38
+ end
39
+
40
+ # Create Visualization Object in the specify project
41
+ #
42
+ # @param visualization_object [Hash] the data of object will be created
43
+ # @param options [Hash] The project that the object will be created in
44
+ # @return GoodData::VisualizationObject object
45
+ def create(visualization_object = {}, options = { :client => GoodData.client, :project => GoodData.project })
46
+ GoodData::AnalyticalVisualizationObject.create(visualization_object, VisualizationObject, EMPTY_OBJECT, ASSIGNABLE_MEMBERS, options)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -81,7 +81,7 @@ module GoodData
81
81
  %r{/gdc/internal/lcm/domains/[^\/]+/dataproducts/[^\/]+/segments/[^\/]+/syncProcesses}],
82
82
 
83
83
  ['/gdc/internal/projects/{id}/objects/setPermissions', %r{/gdc/internal/projects/[^\/]+/objects/setPermissions}],
84
-
84
+ ['/gdc/internal/projects/{id}/roles', %r{/gdc/internal/projects/[^\/]+/roles}],
85
85
  ['/gdc/md/{id}/variables/item/{id}', %r{/gdc/md/[^\/]+/variables/item/[\d]+}],
86
86
  ['/gdc/md/{id}/validate/task/{id}', %r{/gdc/md/[^\/]+/validate/task/[^\/]+}],
87
87
  ['/gdc/md/{id}/using2/{id}/{id}', %r{/gdc/md/[^\/]+/using2/[\d]+/[\d]+}],
@@ -1,51 +1,51 @@
1
- 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
- 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
- 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
- HqZeIFpPMX/l7V4Xm2l5CRqUVoLYsHh842PUjyr1bab09t3nOtuMeWcPFxWD
5
- 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
- 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
- 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
- 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
- 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
- OJuoQWp7uAsr+G9tXS/ZyJ296fv4uuF05QFTWIxxziqzgTL5PZF8o6E+THdO
11
- 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
- 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
- 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
- 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
- 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
- 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
- j+PATgq1KXmXy6BAm0lvGHNkM9SDblPSCEDRzWw/ynBau/lfKNtKEb+DHIq2
18
- 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
- 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
- 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
- t7lbmq9Nb22GCrAfmPolBkZ2fISf4QwfABHIZEy92IEqhLuhpSou6bcq1wyy
22
- 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
- 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
- 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
- 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
- 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
- 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
- Oq1ph9kJfNq2dEFXJHoMke+qJFTdS6OMm9Gi2XkhFkA+omcoq9uo3NiBVBR4
29
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- lct25VsE5FC/Qyoh9aQqcjjHStY5uo8ss0Bf+q2tBF+2PpG7BUM4AWJh6Z/9
37
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
@@ -1,109 +1,109 @@
1
- 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
- be3D+FoHr7AzxqqUlRa1FUJSs5IJ7xp1Ayoq0iEqmtewRjUhLm5xgxnr5UYl
3
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0azxzJkKCEWpxa4TMrMcLvOI/AMk/lN835ZI53+Ot7BquJWZSDT+hXmQ1rV8
11
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- e9MW+EzUIwKX29ZNtgjPHH+n5+fRuBLarOz3/D/19b5n63XB6Nj/CK3fvp3O
25
- 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
- 8cQdDwWuk0Z8S4F32heXdK6vLbtTDVYeQnIEMym59pFj/mOKLb6BaN+srVoT
27
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- KwwE5GllL7X6raho0TAMhLRFsI74g7Oj3BbviqbkR0zKXk1EDfeA3Rr5falV
69
- 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
- wSuFpOInTKyzbomdwaDfX0e8cQVE/FAY6UTPagC0Fer5RNVsqmT6ECW+i69h
71
- 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
- 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
- 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
- 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
- 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
- sgd15inno430edeUsfFPvEujbtiVkFxEq8349z0LQYkpyJanerG8gti50yV1
77
- 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
- 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
- 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
- 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
- KjEVXNqXx+iuP3XZ4tOpmRHAYqXGZ4Ze3ni8OAeqvGAHPmoAuWUYxjU5Y19O
82
- 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
- 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
- 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
- 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
- zFHwqX7pgAApQ0jN+CpVnA0Z62tdGrGVhhyaqdVkTzn5ubmlHVP8hdt1LBX5
87
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- LUT44yZLCaMAgasqEWIwvScw7GZcYHcsUcDtmvrgmhFuqofJ4PVvBd77vKOo
101
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
109
- 5UICsw==
1
+ 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
109
+ j9/cqg==
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gooddata
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.17
4
+ version: 2.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Kolesnikov
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2021-04-09 00:00:00.000000000 Z
17
+ date: 2021-05-21 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: license_finder
@@ -320,16 +320,22 @@ dependencies:
320
320
  name: docile
321
321
  requirement: !ruby/object:Gem::Requirement
322
322
  requirements:
323
- - - "~>"
323
+ - - ">"
324
324
  - !ruby/object:Gem::Version
325
325
  version: '1.1'
326
+ - - "<"
327
+ - !ruby/object:Gem::Version
328
+ version: 1.4.0
326
329
  type: :runtime
327
330
  prerelease: false
328
331
  version_requirements: !ruby/object:Gem::Requirement
329
332
  requirements:
330
- - - "~>"
333
+ - - ">"
331
334
  - !ruby/object:Gem::Version
332
335
  version: '1.1'
336
+ - - "<"
337
+ - !ruby/object:Gem::Version
338
+ version: 1.4.0
333
339
  - !ruby/object:Gem::Dependency
334
340
  name: gli
335
341
  requirement: !ruby/object:Gem::Requirement
@@ -920,6 +926,8 @@ files:
920
926
  - lib/gooddata/models/links.rb
921
927
  - lib/gooddata/models/membership.rb
922
928
  - lib/gooddata/models/metadata.rb
929
+ - lib/gooddata/models/metadata/analytical_dashboard.rb
930
+ - lib/gooddata/models/metadata/analytical_visualization_object.rb
923
931
  - lib/gooddata/models/metadata/attribute.rb
924
932
  - lib/gooddata/models/metadata/dashboard.rb
925
933
  - lib/gooddata/models/metadata/dashboard/dashboard_item.rb
@@ -944,6 +952,7 @@ files:
944
952
  - lib/gooddata/models/metadata/scheduled_mail/dashboard_attachment.rb
945
953
  - lib/gooddata/models/metadata/scheduled_mail/report_attachment.rb
946
954
  - lib/gooddata/models/metadata/variable.rb
955
+ - lib/gooddata/models/metadata/visualization_object.rb
947
956
  - lib/gooddata/models/model.rb
948
957
  - lib/gooddata/models/models.rb
949
958
  - lib/gooddata/models/module_constants.rb