gooddata 2.1.19 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/.gdc-ii-config.yaml +1 -1
  3. data/.github/workflows/build.yml +66 -0
  4. data/.github/workflows/pre-merge.yml +72 -0
  5. data/CHANGELOG.md +38 -0
  6. data/Dockerfile +21 -14
  7. data/Dockerfile.jruby +1 -11
  8. data/LICENSE +4409 -16
  9. data/README.md +1 -2
  10. data/SDK_VERSION +1 -1
  11. data/VERSION +1 -1
  12. data/ci/mssql/pom.xml +62 -0
  13. data/ci/mysql/pom.xml +57 -0
  14. data/ci/redshift/pom.xml +1 -1
  15. data/docker-compose.lcm.yml +0 -3
  16. data/gooddata.gemspec +2 -1
  17. data/k8s/charts/lcm-bricks/Chart.yaml +1 -1
  18. data/lcm.rake +2 -8
  19. data/lib/gooddata/bricks/middleware/aws_middleware.rb +35 -9
  20. data/lib/gooddata/cloud_resources/blobstorage/blobstorage_client.rb +98 -0
  21. data/lib/gooddata/cloud_resources/mssql/drivers/.gitkeepme +0 -0
  22. data/lib/gooddata/cloud_resources/mssql/mssql_client.rb +122 -0
  23. data/lib/gooddata/cloud_resources/mysql/drivers/.gitkeepme +0 -0
  24. data/lib/gooddata/cloud_resources/mysql/mysql_client.rb +111 -0
  25. data/lib/gooddata/cloud_resources/postgresql/postgresql_client.rb +0 -1
  26. data/lib/gooddata/cloud_resources/snowflake/snowflake_client.rb +18 -1
  27. data/lib/gooddata/helpers/data_helper.rb +9 -4
  28. data/lib/gooddata/lcm/actions/collect_meta.rb +3 -1
  29. data/lib/gooddata/lcm/actions/migrate_gdc_date_dimension.rb +3 -2
  30. data/lib/gooddata/lcm/actions/synchronize_clients.rb +56 -7
  31. data/lib/gooddata/lcm/actions/synchronize_dataset_mappings.rb +64 -0
  32. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +19 -8
  33. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +12 -9
  34. data/lib/gooddata/lcm/actions/update_metric_formats.rb +185 -0
  35. data/lib/gooddata/lcm/data/delete_from_lcm_release.sql.erb +5 -0
  36. data/lib/gooddata/lcm/helpers/release_table_helper.rb +42 -8
  37. data/lib/gooddata/lcm/lcm2.rb +5 -0
  38. data/lib/gooddata/mixins/md_object_query.rb +1 -0
  39. data/lib/gooddata/models/data_source.rb +5 -1
  40. data/lib/gooddata/models/dataset_mapping.rb +36 -0
  41. data/lib/gooddata/models/metadata/label.rb +26 -27
  42. data/lib/gooddata/models/project.rb +34 -9
  43. data/lib/gooddata/models/schedule.rb +13 -1
  44. data/lib/gooddata/models/user_filters/user_filter_builder.rb +58 -53
  45. data/lib/gooddata/rest/phmap.rb +1 -0
  46. metadata +45 -18
  47. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +0 -37
@@ -0,0 +1,36 @@
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 DatasetMapping
10
+ DATASET_MAPPING_GET_URI = '/gdc/dataload/projects/%<project_id>s/modelMapping/datasets'
11
+ DATASET_MAPPING_UPDATE_URI = '/gdc/dataload/projects/%<project_id>s/modelMapping/datasets/bulk/upsert'
12
+
13
+ class << self
14
+ def [](opts = { :client => GoodData.connection, :project => GoodData.project })
15
+ client, project = GoodData.get_client_and_project(opts)
16
+ get_uri = DATASET_MAPPING_GET_URI % { project_id: project.pid }
17
+ res = client.get(get_uri)
18
+ res
19
+ end
20
+
21
+ alias_method :get, :[]
22
+ end
23
+
24
+ def initialize(data)
25
+ @data = data
26
+ end
27
+
28
+ def save(opts)
29
+ client, project = GoodData.get_client_and_project(opts)
30
+
31
+ post_uri = DATASET_MAPPING_UPDATE_URI % { project_id: project.pid }
32
+ res = client.post(post_uri, @data, opts)
33
+ res
34
+ end
35
+ end
36
+ end
@@ -40,22 +40,20 @@ module GoodData
40
40
  end
41
41
  end
42
42
 
43
- # Gets valid elements using /validElements? API
43
+ # Gets valid elements of a label for a specific paging (:offset and :limit) or get validElements of a specific value (:filter).
44
+ # In the case filter a specific value, because the API /validElements only filter by partial match, we need to filter again at client side for exact match.
44
45
  # @return [Array] Results
45
46
  def get_valid_elements(*args)
46
- results, params = valid_elements(*args)
47
- # TMA-775 - the validElements API can possibly return more matches than requested (usually 1)
48
- # so we do a preliminary first request to check and then increase the limit if needed
49
- if results['validElements']['paging']['total'].to_i != params[:limit]
47
+ if args && !args.empty? && args.first[:filter]
48
+ params = args.first
50
49
  params[:limit] = 100_000
51
50
  results, = valid_elements params
52
- if params[:filter]
53
- results['validElements']['items'] = results['validElements']['items'].reject do |i|
54
- i['element']['title'] != params[:filter]
55
- end
51
+ results['validElements']['items'] = results['validElements']['items'].select do |i|
52
+ i['element']['title'] == params[:filter]
56
53
  end
54
+ else
55
+ results, = valid_elements(*args)
57
56
  end
58
-
59
57
  results
60
58
  end
61
59
 
@@ -74,24 +72,25 @@ module GoodData
74
72
  # @option options [Number] :limit limits the number of values to certain number. Default is 100
75
73
  # @return [Array]
76
74
  def values(options = {})
77
- Enumerator.new do |y|
78
- offset = options[:offset] || 0
79
- page_limit = options[:limit] || 100
80
- loop do
81
- results = get_valid_elements(limit: page_limit, offset: offset)
82
-
83
- elements = results['validElements']
84
- elements['items'].map do |el|
85
- v = el['element']
86
- y << {
87
- :value => v['title'],
88
- :uri => v['uri']
89
- }
90
- end
91
- break if elements['items'].count < page_limit
92
- offset += page_limit
75
+ all_values = []
76
+ offset = options[:offset] || 0
77
+ page_limit = options[:limit] || 100
78
+ loop do
79
+ results = get_valid_elements(limit: page_limit, offset: offset)
80
+
81
+ elements = results['validElements']
82
+ elements['items'].map do |el|
83
+ v = el['element']
84
+ all_values << {
85
+ :value => v['title'],
86
+ :uri => v['uri']
87
+ }
93
88
  end
89
+ break if elements['items'].count < page_limit
90
+
91
+ offset += page_limit
94
92
  end
93
+ all_values
95
94
  end
96
95
 
97
96
  def values_count
@@ -136,7 +135,7 @@ module GoodData
136
135
  if status_url
137
136
  results = client.poll_on_response(status_url) do |body|
138
137
  status = body['taskState'] && body['taskState']['status']
139
- status == 'RUNNING' || status == 'PREPARED'
138
+ status == 'RUNNING' || status == 'PREPARED' || body['uri']
140
139
  end
141
140
  end
142
141
 
@@ -30,6 +30,7 @@ require_relative 'process'
30
30
  require_relative 'project_log_formatter'
31
31
  require_relative 'project_role'
32
32
  require_relative 'blueprint/blueprint'
33
+ require_relative 'dataset_mapping'
33
34
 
34
35
  require_relative 'metadata/scheduled_mail'
35
36
  require_relative 'metadata/scheduled_mail/dashboard_attachment'
@@ -255,6 +256,22 @@ module GoodData
255
256
  transfer_schedules(from_project, to_project)
256
257
  end
257
258
 
259
+ def get_dataset_mapping(from_project)
260
+ GoodData::DatasetMapping.get(:client => from_project.client, :project => from_project)
261
+ end
262
+
263
+ def update_dataset_mapping(model_mapping_json, to_project)
264
+ dataset_mapping = GoodData::DatasetMapping.new(model_mapping_json)
265
+ res = dataset_mapping.save(:client => to_project.client, :project => to_project)
266
+ status = res&.dig('datasetMappings', 'items').nil? ? "Failed" : "OK"
267
+ count = "OK".eql?(status) ? res['datasetMappings']['items'].length : 0
268
+ {
269
+ to: to_project.pid,
270
+ count: count,
271
+ status: status
272
+ }
273
+ end
274
+
258
275
  # @param from_project The source project
259
276
  # @param to_project The target project
260
277
  # @param options Optional parameters
@@ -337,20 +354,16 @@ module GoodData
337
354
  def get_data_source_alias(data_source_id, client, aliases)
338
355
  unless aliases[data_source_id]
339
356
  data_source = GoodData::DataSource.from_id(data_source_id, client: client)
340
- if data_source&.dig('dataSource', 'alias')
357
+ if data_source&.alias
341
358
  aliases[data_source_id] = {
342
- :type => get_data_source_type(data_source),
343
- :alias => data_source['dataSource']['alias']
359
+ :type => data_source.type,
360
+ :alias => data_source.alias
344
361
  }
345
362
  end
346
363
  end
347
364
  aliases[data_source_id]
348
365
  end
349
366
 
350
- def get_data_source_type(data_source_data)
351
- data_source_data&.dig('dataSource', 'connectionInfo') ? data_source_data['dataSource']['connectionInfo'].first[0].upcase : ""
352
- end
353
-
354
367
  def replace_process_data_source_ids(process_data, client, aliases)
355
368
  component = process_data.dig(:process, :component)
356
369
  if component&.dig(:configLocation, :dataSourceConfig)
@@ -460,7 +473,9 @@ module GoodData
460
473
  local_stuff = local_schedules.map do |s|
461
474
  v = s.to_hash
462
475
  after_schedule = local_schedules.find { |s2| s.trigger_id == s2.obj_id }
463
- v[:after] = s.trigger_id && after_schedule && after_schedule.name
476
+ after_process_schedule = from_project_processes.find { |p| after_schedule && p.obj_id == after_schedule.process_id }
477
+ v[:after] = s.trigger_id && after_process_schedule && after_schedule && after_schedule.name
478
+ v[:trigger_execution_status] = s.trigger_execution_status
464
479
  v[:remote_schedule] = s
465
480
  v[:params] = v[:params].except("EXECUTABLE", "PROCESS_ID")
466
481
  v.compact
@@ -529,6 +544,7 @@ module GoodData
529
544
  schedule.params = (schedule_spec[:params] || {})
530
545
  schedule.cron = schedule_spec[:cron] if schedule_spec[:cron]
531
546
  schedule.after = schedule_cache[schedule_spec[:after]] if schedule_spec[:after]
547
+ schedule.trigger_execution_status = schedule_cache[schedule_spec[:trigger_execution_status]] if schedule_spec[:after]
532
548
  schedule.hidden_params = schedule_spec[:hidden_params] || {}
533
549
  if process_spec.type != :dataload
534
550
  schedule.executable = schedule_spec[:executable] || (process_spec.type == :ruby ? 'main.rb' : 'main.grf')
@@ -589,7 +605,8 @@ module GoodData
589
605
  hidden_params: schedule_spec[:hidden_params],
590
606
  name: schedule_spec[:name],
591
607
  reschedule: schedule_spec[:reschedule],
592
- state: schedule_spec[:state]
608
+ state: schedule_spec[:state],
609
+ trigger_execution_status: schedule_spec[:trigger_execution_status]
593
610
  }
594
611
  end
595
612
  end
@@ -2022,6 +2039,14 @@ module GoodData
2022
2039
  GoodData::Project.transfer_etl(client, self, target)
2023
2040
  end
2024
2041
 
2042
+ def dataset_mapping
2043
+ GoodData::Project.get_dataset_mapping(self)
2044
+ end
2045
+
2046
+ def update_dataset_mapping(model_mapping_json)
2047
+ GoodData::Project.update_dataset_mapping(model_mapping_json, self)
2048
+ end
2049
+
2025
2050
  def transfer_processes(target)
2026
2051
  GoodData::Project.transfer_processes(self, target)
2027
2052
  end
@@ -101,6 +101,7 @@ module GoodData
101
101
 
102
102
  schedule.name = options[:name]
103
103
  schedule.set_trigger(trigger)
104
+ schedule.trigger_execution_status = options[:trigger_execution_status]
104
105
  schedule.params = default_opts[:params].merge(options[:params] || {})
105
106
  schedule.hidden_params = options[:hidden_params] || {}
106
107
  schedule.timezone = options[:timezone] || default_opts[:timezone]
@@ -468,6 +469,7 @@ module GoodData
468
469
  hidden_params: hidden_params,
469
470
  cron: cron,
470
471
  trigger_id: trigger_id,
472
+ trigger_execution_status: trigger_execution_status,
471
473
  timezone: timezone,
472
474
  uri: uri,
473
475
  reschedule: reschedule,
@@ -486,6 +488,16 @@ module GoodData
486
488
  self
487
489
  end
488
490
 
491
+ def trigger_execution_status
492
+ json['schedule']['triggerExecutionStatus']
493
+ end
494
+
495
+ def trigger_execution_status=(trigger_execution_status)
496
+ json['schedule']['triggerExecutionStatus'] = trigger_execution_status
497
+ @dirty = true
498
+ self # rubocop:disable Lint/Void
499
+ end
500
+
489
501
  def name
490
502
  json['schedule']['name']
491
503
  end
@@ -530,7 +542,7 @@ module GoodData
530
542
  'hiddenParams' => GoodData::Helpers.encode_hidden_params(hidden_params)
531
543
  }
532
544
  }
533
-
545
+ res['schedule']['triggerExecutionStatus'] = trigger_execution_status if trigger_execution_status
534
546
  res['schedule']['reschedule'] = reschedule if reschedule
535
547
 
536
548
  res
@@ -203,7 +203,7 @@ module GoodData
203
203
  # so it precaches the values and still be able to function for larger ones even
204
204
  # though that would mean tons of requests
205
205
  def self.get_small_labels(labels_cache)
206
- labels_cache.values.select { |label| label && label.values_count && label.values_count < 100_000 }
206
+ labels_cache.values.select { |label| label &.values_count &. < 100_000 }
207
207
  end
208
208
 
209
209
  # Creates a MAQL expression(s) based on the filter defintion.
@@ -421,68 +421,73 @@ module GoodData
421
421
  results: create_results + delete_results }
422
422
  end
423
423
 
424
- create_results = to_create.each_slice(100).flat_map do |batch|
425
- batch.pmapcat do |related_uri, group|
426
- group.each(&:save)
427
- res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
428
- items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
429
-
430
- payload = {
431
- 'userFilters' => {
432
- 'items' => [{
433
- 'user' => related_uri,
434
- 'userFilters' => items.concat(group.map(&:uri))
435
- }]
424
+ if to_create.empty?
425
+ create_results = []
426
+ else
427
+ create_results = to_create.each_slice(100).flat_map do |batch|
428
+ batch.pmapcat do |related_uri, group|
429
+ group.each(&:save)
430
+ res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
431
+ items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
432
+
433
+ payload = {
434
+ 'userFilters' => {
435
+ 'items' => [{
436
+ 'user' => related_uri,
437
+ 'userFilters' => items.concat(group.map(&:uri))
438
+ }]
439
+ }
436
440
  }
437
- }
438
- res = client.post("/gdc/md/#{project.pid}/userfilters", payload)
441
+ res = client.post("/gdc/md/#{project.pid}/userfilters", payload)
439
442
 
440
- # turn the errors from hashes into array of hashes
441
- update_result = res['userFiltersUpdateResult'].flat_map do |k, v|
442
- v.map { |r| { status: k.to_sym, user: r, type: :create } }
443
- end
443
+ # turn the errors from hashes into array of hashes
444
+ update_result = res['userFiltersUpdateResult'].flat_map do |k, v|
445
+ v.map { |r| { status: k.to_sym, user: r, type: :create } }
446
+ end
444
447
 
445
- update_result.map do |result|
446
- result[:status] == :failed ? result.merge(GoodData::Helpers.symbolize_keys(result[:user])) : result
448
+ update_result.map do |result|
449
+ result[:status] == :failed ? result.merge(GoodData::Helpers.symbolize_keys(result[:user])) : result
450
+ end
447
451
  end
448
452
  end
453
+ project_log_formatter.log_user_filter_results(create_results, to_create)
454
+ create_errors = create_results.select { |r| r[:status] == :failed }
455
+ fail "Creating MUFs resulted in errors: #{create_errors}" if create_errors.any?
449
456
  end
450
457
 
451
- project_log_formatter.log_user_filter_results(create_results, to_create)
452
- create_errors = create_results.select { |r| r[:status] == :failed }
453
- fail "Creating MUFs resulted in errors: #{create_errors}" if create_errors.any?
454
-
455
- delete_results = unless options[:do_not_touch_filters_that_are_not_mentioned]
456
- to_delete.each_slice(100).flat_map do |batch|
457
- batch.flat_map do |related_uri, group|
458
- results = []
459
- if related_uri
460
- res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
461
- items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
462
- payload = {
463
- 'userFilters' => {
464
- 'items' => [
465
- {
466
- 'user' => related_uri,
467
- 'userFilters' => items - group.map(&:uri)
468
- }
469
- ]
470
- }
471
- }
472
- res = client.post("/gdc/md/#{project.pid}/userfilters", payload)
473
- results.concat(res['userFiltersUpdateResult']
458
+ if to_delete.empty?
459
+ delete_results = []
460
+ elsif !options[:do_not_touch_filters_that_are_not_mentioned]
461
+ delete_results = to_delete.each_slice(100).flat_map do |batch|
462
+ batch.flat_map do |related_uri, group|
463
+ results = []
464
+ if related_uri
465
+ res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
466
+ items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
467
+ payload = {
468
+ 'userFilters' => {
469
+ 'items' => [
470
+ {
471
+ 'user' => related_uri,
472
+ 'userFilters' => items - group.map(&:uri)
473
+ }
474
+ ]
475
+ }
476
+ }
477
+ res = client.post("/gdc/md/#{project.pid}/userfilters", payload)
478
+ results.concat(res['userFiltersUpdateResult']
474
479
  .flat_map { |k, v| v.map { |r| { status: k.to_sym, user: r, type: :delete } } }
475
480
  .map { |result| result[:status] == :failed ? result.merge(GoodData::Helpers.symbolize_keys(result[:user])) : result })
476
- end
477
- group.peach(&:delete)
478
- results
479
- end
480
- end
481
- end
481
+ end
482
+ group.peach(&:delete)
483
+ results
484
+ end
482
485
 
483
- project_log_formatter.log_user_filter_results(delete_results, to_delete)
484
- delete_errors = delete_results.select { |r| r[:status] == :failed } if delete_results
485
- fail "Deleting MUFs resulted in errors: #{delete_errors}" if delete_errors && delete_errors.any?
486
+ project_log_formatter.log_user_filter_results(delete_results, to_delete)
487
+ delete_errors = delete_results.select { |r| r[:status] == :failed } if delete_results
488
+ fail "Deleting MUFs resulted in errors: #{delete_errors}" if delete_errors&.any?
489
+ end
490
+ end
486
491
 
487
492
  { created: to_create, deleted: to_delete, results: create_results + (delete_results || []) }
488
493
  end
@@ -82,6 +82,7 @@ module GoodData
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
+ ['/gdc/dataload/projects/{id}/modelMapping/datasets/bulk/upsert', %r{/gdc/dataload/projects/[^\/]+/modelMapping/datasets/bulk/upsert}],
85
86
  ['/gdc/md/{id}/variables/item/{id}', %r{/gdc/md/[^\/]+/variables/item/[\d]+}],
86
87
  ['/gdc/md/{id}/validate/task/{id}', %r{/gdc/md/[^\/]+/validate/task/[^\/]+}],
87
88
  ['/gdc/md/{id}/using2/{id}/{id}', %r{/gdc/md/[^\/]+/using2/[\d]+/[\d]+}],
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.19
4
+ version: 2.2.0
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-05-21 00:00:00.000000000 Z
17
+ date: 2022-02-15 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: license_finder
@@ -336,6 +336,34 @@ dependencies:
336
336
  - - "<"
337
337
  - !ruby/object:Gem::Version
338
338
  version: 1.4.0
339
+ - !ruby/object:Gem::Dependency
340
+ name: azure-storage-blob
341
+ requirement: !ruby/object:Gem::Requirement
342
+ requirements:
343
+ - - "~>"
344
+ - !ruby/object:Gem::Version
345
+ version: 1.1.0
346
+ type: :runtime
347
+ prerelease: false
348
+ version_requirements: !ruby/object:Gem::Requirement
349
+ requirements:
350
+ - - "~>"
351
+ - !ruby/object:Gem::Version
352
+ version: 1.1.0
353
+ - !ruby/object:Gem::Dependency
354
+ name: nokogiri
355
+ requirement: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - "~>"
358
+ - !ruby/object:Gem::Version
359
+ version: 1.10.0
360
+ type: :runtime
361
+ prerelease: false
362
+ version_requirements: !ruby/object:Gem::Requirement
363
+ requirements:
364
+ - - "~>"
365
+ - !ruby/object:Gem::Version
366
+ version: 1.10.0
339
367
  - !ruby/object:Gem::Dependency
340
368
  name: gli
341
369
  requirement: !ruby/object:Gem::Requirement
@@ -488,20 +516,6 @@ dependencies:
488
516
  - - ">="
489
517
  - !ruby/object:Gem::Version
490
518
  version: 1.2.1
491
- - !ruby/object:Gem::Dependency
492
- name: salesforce_bulk_query
493
- requirement: !ruby/object:Gem::Requirement
494
- requirements:
495
- - - "~>"
496
- - !ruby/object:Gem::Version
497
- version: '0.2'
498
- type: :runtime
499
- prerelease: false
500
- version_requirements: !ruby/object:Gem::Requirement
501
- requirements:
502
- - - "~>"
503
- - !ruby/object:Gem::Version
504
- version: '0.2'
505
519
  - !ruby/object:Gem::Dependency
506
520
  name: terminal-table
507
521
  requirement: !ruby/object:Gem::Requirement
@@ -584,6 +598,8 @@ files:
584
598
  - ".flayignore"
585
599
  - ".gdc-ii-config-chart.yaml"
586
600
  - ".gdc-ii-config.yaml"
601
+ - ".github/workflows/build.yml"
602
+ - ".github/workflows/pre-merge.yml"
587
603
  - ".gitignore"
588
604
  - ".pronto.yml"
589
605
  - ".rspec"
@@ -623,6 +639,8 @@ files:
623
639
  - bin/users.sh
624
640
  - ci.rake
625
641
  - ci/bigquery/pom.xml
642
+ - ci/mssql/pom.xml
643
+ - ci/mysql/pom.xml
626
644
  - ci/postgresql/pom.xml
627
645
  - ci/redshift/pom.xml
628
646
  - ci/snowflake/pom.xml
@@ -651,7 +669,6 @@ files:
651
669
  - lib/gooddata/bricks/middleware/aws_middleware.rb
652
670
  - lib/gooddata/bricks/middleware/base_middleware.rb
653
671
  - lib/gooddata/bricks/middleware/bench_middleware.rb
654
- - lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb
655
672
  - lib/gooddata/bricks/middleware/context_logger_decorator.rb
656
673
  - lib/gooddata/bricks/middleware/context_manager.rb
657
674
  - lib/gooddata/bricks/middleware/decode_params_middleware.rb
@@ -686,9 +703,14 @@ files:
686
703
  - lib/gooddata/client.rb
687
704
  - lib/gooddata/cloud_resources/bigquery/bigquery_client.rb
688
705
  - lib/gooddata/cloud_resources/bigquery/drivers/.gitkeepme
706
+ - lib/gooddata/cloud_resources/blobstorage/blobstorage_client.rb
689
707
  - lib/gooddata/cloud_resources/cloud_resource_client.rb
690
708
  - lib/gooddata/cloud_resources/cloud_resource_factory.rb
691
709
  - lib/gooddata/cloud_resources/cloud_resources.rb
710
+ - lib/gooddata/cloud_resources/mssql/drivers/.gitkeepme
711
+ - lib/gooddata/cloud_resources/mssql/mssql_client.rb
712
+ - lib/gooddata/cloud_resources/mysql/drivers/.gitkeepme
713
+ - lib/gooddata/cloud_resources/mysql/mysql_client.rb
692
714
  - lib/gooddata/cloud_resources/postgresql/drivers/.gitkeepme
693
715
  - lib/gooddata/cloud_resources/postgresql/postgresql_client.rb
694
716
  - lib/gooddata/cloud_resources/redshift/drivers/log4j.properties
@@ -790,6 +812,7 @@ files:
790
812
  - lib/gooddata/lcm/actions/synchronize_cas.rb
791
813
  - lib/gooddata/lcm/actions/synchronize_clients.rb
792
814
  - lib/gooddata/lcm/actions/synchronize_color_palette.rb
815
+ - lib/gooddata/lcm/actions/synchronize_dataset_mappings.rb
793
816
  - lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb
794
817
  - lib/gooddata/lcm/actions/synchronize_label_types.rb
795
818
  - lib/gooddata/lcm/actions/synchronize_ldm.rb
@@ -801,9 +824,11 @@ files:
801
824
  - lib/gooddata/lcm/actions/synchronize_user_filters.rb
802
825
  - lib/gooddata/lcm/actions/synchronize_user_groups.rb
803
826
  - lib/gooddata/lcm/actions/synchronize_users.rb
827
+ - lib/gooddata/lcm/actions/update_metric_formats.rb
804
828
  - lib/gooddata/lcm/actions/update_release_table.rb
805
829
  - lib/gooddata/lcm/brick_logger.rb
806
830
  - lib/gooddata/lcm/data/create_lcm_release.sql.erb
831
+ - lib/gooddata/lcm/data/delete_from_lcm_release.sql.erb
807
832
  - lib/gooddata/lcm/data/insert_into_lcm_release.sql.erb
808
833
  - lib/gooddata/lcm/data/select_from_lcm_release.sql.erb
809
834
  - lib/gooddata/lcm/data/update_lcm_release.sql.erb
@@ -917,6 +942,7 @@ files:
917
942
  - lib/gooddata/models/client_synchronization_result_details.rb
918
943
  - lib/gooddata/models/data_product.rb
919
944
  - lib/gooddata/models/data_source.rb
945
+ - lib/gooddata/models/dataset_mapping.rb
920
946
  - lib/gooddata/models/datawarehouse.rb
921
947
  - lib/gooddata/models/domain.rb
922
948
  - lib/gooddata/models/execution.rb
@@ -1016,7 +1042,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1016
1042
  - !ruby/object:Gem::Version
1017
1043
  version: '0'
1018
1044
  requirements: []
1019
- rubygems_version: 3.0.8
1045
+ rubyforge_project:
1046
+ rubygems_version: 2.5.2.3
1020
1047
  signing_key:
1021
1048
  specification_version: 4
1022
1049
  summary: A convenient Ruby wrapper around the GoodData RESTful API
@@ -1,37 +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 'salesforce_bulk_query'
8
-
9
- require_relative 'base_middleware'
10
-
11
- module GoodData
12
- module Bricks
13
- class BulkSalesforceMiddleware < Bricks::Middleware
14
- DEFAULT_VERSION = '29.0'.freeze
15
-
16
- def self.create_client(params)
17
- salesforce = nil
18
- if params['salesforce_client']
19
-
20
- client = params['salesforce_client']
21
- client.authenticate!
22
-
23
- salesforce = SalesforceBulkQuery::Api.new(client, logger: params['GDC_LOGGER'])
24
- # SalesforceBulkQuery adds its own Restforce logging so turn it off
25
- Restforce.log = false if params['GDC_LOGGER']
26
- end
27
- params.merge('salesforce_bulk_client' => salesforce)
28
- end
29
-
30
- def call(params)
31
- params = params.to_hash
32
- params = self.class.create_client(params)
33
- @app.call(params)
34
- end
35
- end
36
- end
37
- end