gooddata 0.6.51 → 0.6.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +13 -1
  4. data/CONTRIBUTING.md +25 -0
  5. data/PULL_REQUEST_TEMPLATE.md +5 -0
  6. data/README.md +7 -4
  7. data/gooddata.gemspec +2 -3
  8. data/lib/gooddata.rb +1 -0
  9. data/lib/gooddata/bricks/base_downloader.rb +6 -6
  10. data/lib/gooddata/bricks/middleware/aws_middleware.rb +15 -5
  11. data/lib/gooddata/bricks/middleware/dwh_middleware.rb +15 -3
  12. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +13 -4
  13. data/lib/gooddata/bricks/middleware/logger_middleware.rb +3 -0
  14. data/lib/gooddata/exceptions/no_project_error.rb +5 -1
  15. data/lib/gooddata/goodzilla/goodzilla.rb +7 -6
  16. data/lib/gooddata/helpers/data_helper.rb +4 -4
  17. data/lib/gooddata/helpers/global_helpers_params.rb +61 -39
  18. data/lib/gooddata/lcm/actions/apply_custom_maql.rb +9 -0
  19. data/lib/gooddata/lcm/actions/associate_clients.rb +23 -4
  20. data/lib/gooddata/lcm/actions/collect_attrs.rb +56 -0
  21. data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
  22. data/lib/gooddata/lcm/actions/collect_clients.rb +25 -3
  23. data/lib/gooddata/lcm/actions/collect_meta.rb +83 -0
  24. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +12 -4
  25. data/lib/gooddata/lcm/actions/collect_segments.rb +4 -4
  26. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +74 -0
  27. data/lib/gooddata/lcm/actions/create_segment_masters.rb +16 -30
  28. data/lib/gooddata/lcm/actions/ensure_release_table.rb +0 -3
  29. data/lib/gooddata/lcm/actions/ensure_segments.rb +1 -4
  30. data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +5 -5
  31. data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +8 -5
  32. data/lib/gooddata/lcm/actions/hello_world.rb +0 -3
  33. data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
  34. data/lib/gooddata/lcm/actions/print_actions.rb +0 -3
  35. data/lib/gooddata/lcm/actions/print_modes.rb +0 -3
  36. data/lib/gooddata/lcm/actions/print_types.rb +1 -4
  37. data/lib/gooddata/lcm/actions/provision_clients.rb +5 -5
  38. data/lib/gooddata/lcm/actions/purge_clients.rb +4 -10
  39. data/lib/gooddata/lcm/actions/segments_filter.rb +0 -6
  40. data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +8 -4
  41. data/lib/gooddata/lcm/actions/synchronize_cas.rb +61 -0
  42. data/lib/gooddata/lcm/actions/synchronize_clients.rb +9 -3
  43. data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +13 -5
  44. data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +71 -17
  45. data/lib/gooddata/lcm/actions/synchronize_label_types.rb +8 -5
  46. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +17 -8
  47. data/lib/gooddata/lcm/actions/synchronize_meta.rb +0 -3
  48. data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +9 -4
  49. data/lib/gooddata/lcm/actions/synchronize_processes.rb +9 -5
  50. data/lib/gooddata/lcm/actions/synchronize_schedules.rb +15 -5
  51. data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +61 -0
  52. data/lib/gooddata/lcm/actions/update_release_table.rb +0 -3
  53. data/lib/gooddata/lcm/helpers/tags_helper.rb +35 -0
  54. data/lib/gooddata/lcm/lcm.rb +22 -4
  55. data/lib/gooddata/lcm/lcm2.rb +66 -13
  56. data/lib/gooddata/lcm/types/complex/update_preference.rb +1 -1
  57. data/lib/gooddata/mixins/md_finders.rb +4 -2
  58. data/lib/gooddata/mixins/md_object_indexer.rb +13 -3
  59. data/lib/gooddata/mixins/md_object_query.rb +8 -2
  60. data/lib/gooddata/models/blueprint/date_dimension.rb +6 -0
  61. data/lib/gooddata/models/blueprint/project_blueprint.rb +41 -11
  62. data/lib/gooddata/models/blueprint/project_builder.rb +20 -0
  63. data/lib/gooddata/models/blueprint/to_wire.rb +7 -0
  64. data/lib/gooddata/models/client.rb +6 -0
  65. data/lib/gooddata/models/domain.rb +6 -6
  66. data/lib/gooddata/models/from_wire.rb +5 -1
  67. data/lib/gooddata/models/metadata.rb +55 -9
  68. data/lib/gooddata/models/metadata/attribute.rb +19 -4
  69. data/lib/gooddata/models/metadata/dashboard.rb +15 -3
  70. data/lib/gooddata/models/metadata/dataset.rb +5 -2
  71. data/lib/gooddata/models/metadata/dimension.rb +4 -1
  72. data/lib/gooddata/models/metadata/fact.rb +9 -2
  73. data/lib/gooddata/models/metadata/folder.rb +4 -1
  74. data/lib/gooddata/models/metadata/metric.rb +11 -3
  75. data/lib/gooddata/models/metadata/report.rb +7 -2
  76. data/lib/gooddata/models/metadata/report_definition.rb +11 -4
  77. data/lib/gooddata/models/metadata/scheduled_mail.rb +4 -1
  78. data/lib/gooddata/models/metadata/variable.rb +7 -2
  79. data/lib/gooddata/models/model.rb +14 -3
  80. data/lib/gooddata/models/process.rb +10 -9
  81. data/lib/gooddata/models/project.rb +134 -36
  82. data/lib/gooddata/models/project_creator.rb +43 -20
  83. data/lib/gooddata/models/report_data_result.rb +6 -2
  84. data/lib/gooddata/models/schedule.rb +6 -3
  85. data/lib/gooddata/models/subscription.rb +8 -1
  86. data/lib/gooddata/models/user_filters/user_filter.rb +1 -0
  87. data/lib/gooddata/models/user_filters/user_filter_builder.rb +18 -4
  88. data/lib/gooddata/models/user_filters/variable_user_filter.rb +3 -1
  89. data/lib/gooddata/rest/client.rb +4 -6
  90. data/lib/gooddata/rest/connection.rb +10 -2
  91. data/lib/gooddata/version.rb +1 -1
  92. data/spec/data/blueprints/test_blueprint.json +1 -0
  93. data/spec/data/wire_models/test_blueprint.json +3 -0
  94. data/spec/data/workspace_table.csv +3 -0
  95. data/spec/environment/development.rb +4 -1
  96. data/spec/environment/environment.rb +1 -1
  97. data/spec/environment/staging.rb +5 -1
  98. data/spec/environment/testing.rb +5 -2
  99. data/spec/integration/blueprint_with_ca_spec.rb +56 -0
  100. data/spec/integration/clients_spec.rb +21 -0
  101. data/spec/integration/command_datawarehouse_spec.rb +7 -1
  102. data/spec/integration/create_from_template_spec.rb +9 -3
  103. data/spec/integration/project_spec.rb +7 -0
  104. data/spec/integration/segments_spec.rb +0 -53
  105. data/spec/integration/subscription_spec.rb +29 -4
  106. data/spec/integration/urn_date_dim_spec.rb +53 -0
  107. data/spec/integration/user_filters_spec.rb +6 -0
  108. data/spec/integration/variables_spec.rb +1 -2
  109. data/spec/spec_helper.rb +5 -30
  110. data/spec/unit/actions/collect_clients_spec.rb +38 -0
  111. data/spec/unit/actions/collect_meta_spec.rb +87 -0
  112. data/spec/unit/actions/collect_segment_clients_spec.rb +40 -0
  113. data/spec/unit/actions/collect_tagged_objects_spec.rb +110 -0
  114. data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +51 -0
  115. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +55 -1
  116. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +15 -0
  117. data/spec/unit/helpers/data_helper_spec.rb +3 -5
  118. data/spec/unit/helpers/global_helpers_spec.rb +29 -0
  119. data/spec/unit/helpers_spec.rb +18 -1
  120. data/spec/unit/models/blueprint/project_blueprint_spec.rb +1 -23
  121. data/spec/unit/models/domain_spec.rb +19 -0
  122. data/spec/unit/models/metadata_spec.rb +34 -0
  123. data/spec/unit/models/schedule_spec.rb +31 -0
  124. data/spec/unit/models/to_manifest_spec.rb +10 -2
  125. data/spec/unit/models/unit_project_spec.rb +6 -1
  126. data/spec/unit/rest/polling_spec.rb +13 -1
  127. metadata +49 -31
@@ -17,6 +17,15 @@ module GoodData
17
17
  DESCRIPTION = 'Apply Custom MAQL DDL'
18
18
 
19
19
  PARAMS = define_params(self) do
20
+ description 'Client Used for Connecting to GD'
21
+ param :gdc_gd_client, instance_of(Type::GdClientType), required: true
22
+
23
+ description 'Organization Name'
24
+ param :organization, instance_of(Type::StringType), required: true
25
+
26
+ description 'Segments to manage'
27
+ param :segments, array_of(instance_of(Type::SegmentType)), required: true
28
+
20
29
  description 'Should be custom MAQL DDL Applied'
21
30
  param :apply_maql_ddl, instance_of(Type::BooleanType), required: false, default: false
22
31
  end
@@ -14,6 +14,21 @@ module GoodData
14
14
  PARAMS = define_params(self) do
15
15
  description 'Client Used for Connecting to GD'
16
16
  param :gdc_gd_client, instance_of(Type::GdClientType), required: true
17
+
18
+ description 'Organization Name'
19
+ param :organization, instance_of(Type::StringType), required: true
20
+
21
+ description 'Delete Extra Clients'
22
+ param :delete_extra, instance_of(Type::BooleanType), required: false, default: false
23
+
24
+ description 'Physically Delete Client Projects'
25
+ param :delete_projects, instance_of(Type::BooleanType), required: false, default: false
26
+
27
+ description 'Clients'
28
+ param :clients, array_of(instance_of(Type::HashType)), required: true, generated: true
29
+
30
+ description 'Segments to provision'
31
+ param :segments_filter, array_of(instance_of(Type::StringType)), required: false
17
32
  end
18
33
 
19
34
  RESULT_HEADER = [
@@ -26,14 +41,18 @@ module GoodData
26
41
 
27
42
  class << self
28
43
  def call(params)
29
- # Check if all required parameters were passed
30
- BaseAction.check_params(PARAMS, params)
31
-
32
44
  client = params.gdc_gd_client
33
45
 
34
46
  domain_name = params.organization || params.domain
35
47
  domain = client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
36
48
 
49
+ params.clients.group_by { |data| data[:segment] }.each do |segment_name, clients|
50
+ segment = domain.segments(segment_name)
51
+ (clients.map(&:id) - segment.clients.map(&:id)).each do |c|
52
+ segment.create_client(id: c)
53
+ end
54
+ end
55
+
37
56
  domain.update_clients_settings(params.clients)
38
57
 
39
58
  delete_projects = GoodData::Helpers.to_boolean(params.delete_projects)
@@ -50,7 +69,7 @@ module GoodData
50
69
  if params.segments_filter && params.segments_filter.any?
51
70
  { delete_extra_in_segments: params.segments_filter }
52
71
  else
53
- { delete_extra: delete_extra }
72
+ { delete_extra: GoodData::Helpers.to_boolean(params.delete_extra) }
54
73
  end
55
74
  end
56
75
  end
@@ -0,0 +1,56 @@
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 CollectAttributes < BaseAction
12
+ DESCRIPTION = "Collect all attributes (include CAs) to transfer label type and drill path"
13
+
14
+ PARAMS = define_params(self) do
15
+ description 'Development Client Used for Connecting to GD'
16
+ param :development_client, instance_of(Type::GdClientType), required: true
17
+
18
+ description 'Synchronization Info'
19
+ param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
20
+ end
21
+
22
+ class << self
23
+ def call(params)
24
+ results = []
25
+
26
+ development_client = params.development_client
27
+
28
+ synchronize = params.synchronize.pmap do |info|
29
+ from = info.from
30
+ from_project = development_client.projects(from) || fail("Invalid 'from' project specified - '#{from}'")
31
+ objects = (from_project.attributes.to_a + from_project.labels.to_a).map(&:uri)
32
+
33
+ info[:transfer_uris] ||= []
34
+ info[:transfer_uris] += objects
35
+
36
+ results += objects.map do |uri|
37
+ {
38
+ project: from,
39
+ transfer_uri: uri
40
+ }
41
+ end
42
+
43
+ info
44
+ end
45
+
46
+ {
47
+ results: results,
48
+ params: {
49
+ synchronize: synchronize
50
+ }
51
+ }
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,53 @@
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 CollectComputedAttributeMetrics < BaseAction
12
+ DESCRIPTION = 'Collect all metrics which is used in computed attributes in development projects'
13
+
14
+ PARAMS = define_params(self) do
15
+ description 'Client Used for Connecting to GD'
16
+ param :gdc_gd_client, instance_of(Type::GdClientType), required: true
17
+ end
18
+
19
+ class << self
20
+ def call(params)
21
+ results = []
22
+ development_client = params.development_client
23
+
24
+ synchronize = params.synchronize.pmap do |info|
25
+ from = info.from
26
+ from_project = development_client.projects(from) || fail("Invalid 'from' project specified - '#{from}'")
27
+
28
+ metric_uris = from_project.computed_attributes.flat_map { |a| a.using('metric').map { |m| m['link'] } }
29
+
30
+ info[:transfer_uris] ||= []
31
+ info[:transfer_uris] += metric_uris
32
+
33
+ results += metric_uris.map do |uri|
34
+ {
35
+ project: from,
36
+ transfer_uri: uri
37
+ }
38
+ end
39
+
40
+ info
41
+ end
42
+
43
+ {
44
+ results: results,
45
+ params: {
46
+ synchronize: synchronize
47
+ }
48
+ }
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -14,6 +14,27 @@ module GoodData
14
14
  PARAMS = define_params(self) do
15
15
  description 'Client Used for Connecting to GD'
16
16
  param :gdc_gd_client, instance_of(Type::GdClientType), required: true
17
+
18
+ description 'Segments to manage'
19
+ param :segments, array_of(instance_of(Type::SegmentType)), required: true
20
+
21
+ description 'Client Id Column'
22
+ param :client_id_column, instance_of(Type::StringType), required: false
23
+
24
+ description 'Segment Id Column'
25
+ param :segment_id_column, instance_of(Type::StringType), required: false
26
+
27
+ description 'Project Id Column'
28
+ param :project_id_column, instance_of(Type::StringType), required: false
29
+
30
+ description 'Client Project Title Column'
31
+ param :project_title_column, instance_of(Type::StringType), required: false
32
+
33
+ description 'Client Project Token Column'
34
+ param :project_token_column, instance_of(Type::StringType), required: false
35
+
36
+ description 'Input Source'
37
+ param :input_source, instance_of(Type::HashType), required: true
17
38
  end
18
39
 
19
40
  RESULT_HEADER = [
@@ -24,9 +45,6 @@ module GoodData
24
45
 
25
46
  class << self
26
47
  def call(params)
27
- # Check if all required parameters were passed
28
- BaseAction.check_params(PARAMS, params)
29
-
30
48
  segment_names = params.segments.map(&:segment_id)
31
49
 
32
50
  clients = collect_clients(params, segment_names)
@@ -58,8 +76,12 @@ module GoodData
58
76
  clients = []
59
77
  data_source = GoodData::Helpers::DataSource.new(params.input_source)
60
78
  input_data = File.open(data_source.realize(params), 'r:UTF-8')
79
+ GoodData.logger.debug("Input data: #{input_data.read}")
80
+ GoodData.logger.debug("Segment names: #{segment_names}")
61
81
  CSV.foreach(input_data, :headers => true, :return_headers => false, encoding: 'utf-8') do |row|
82
+ GoodData.logger.debug("Processing row: #{row}")
62
83
  segment_name = row[segment_id_column]
84
+ GoodData.logger.debug("Segment name: #{segment_name}")
63
85
  if segment_names.nil? || segment_names.include?(segment_name)
64
86
  clients << {
65
87
  id: row[client_id_column],
@@ -0,0 +1,83 @@
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 CollectMeta < BaseAction
12
+ DESCRIPTION = "Collect tagged dashboards (or all dashboards if not specify production tag) \
13
+ with objects inside dashboards (reports, metrics ...) from development projects"
14
+
15
+ PARAMS = define_params(self) do
16
+ description 'Production Tag Name'
17
+ param :production_tag, instance_of(Type::StringType), required: false
18
+
19
+ description 'Development Client Used for Connecting to GD'
20
+ param :development_client, instance_of(Type::GdClientType), required: true
21
+
22
+ description 'Synchronization Info'
23
+ param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
24
+
25
+ description 'Segments to search for segment-specific production tags'
26
+ param :segments, array_of(instance_of(Type::SegmentType)), required: false
27
+
28
+ description 'Flag to mark if we need to transfer all objects'
29
+ param :transfer_all, instance_of(Type::BooleanType), required: false, default: false
30
+ end
31
+
32
+ class << self
33
+ def call(params)
34
+ results = []
35
+
36
+ development_client = params.development_client
37
+ segments_to_tags = Helpers.segment_production_tags(params.segments)
38
+ transfer_all = GoodData::Helpers.to_boolean(params.transfer_all)
39
+
40
+ synchronize = params.synchronize.pmap do |info|
41
+ from = info.from
42
+ from_project = development_client.projects(from) || fail("Invalid 'from' project specified - '#{from}'")
43
+
44
+ segment_tags = segments_to_tags[info.segment]
45
+ production_tags = Helpers.parse_production_tags(params.production_tag, segment_tags)
46
+
47
+ if transfer_all || production_tags.empty?
48
+ objects = GoodData::Dashboard.all(
49
+ project: from_project,
50
+ client: development_client
51
+ )
52
+ else
53
+ objects = GoodData::Dashboard.find_by_tag(
54
+ production_tags,
55
+ project: from_project,
56
+ client: development_client
57
+ )
58
+ end
59
+
60
+ info[:transfer_uris] ||= []
61
+ info[:transfer_uris] += objects.map(&:uri)
62
+
63
+ results += objects.map do |uri|
64
+ {
65
+ project: from,
66
+ transfer_uri: uri
67
+ }
68
+ end
69
+
70
+ info
71
+ end
72
+
73
+ {
74
+ results: results,
75
+ params: {
76
+ synchronize: synchronize
77
+ }
78
+ }
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -20,6 +20,12 @@ module GoodData
20
20
 
21
21
  description 'ADS Client'
22
22
  param :ads_client, instance_of(Type::AdsClientType), required: true
23
+
24
+ description 'Segments to manage'
25
+ param :segments, array_of(instance_of(Type::SegmentType)), required: true
26
+
27
+ description 'Table Name'
28
+ param :release_table_name, instance_of(Type::StringType), required: false
23
29
  end
24
30
 
25
31
  RESULT_HEADER = [
@@ -33,9 +39,6 @@ module GoodData
33
39
 
34
40
  class << self
35
41
  def call(params)
36
- # Check if all required parameters were passed
37
- BaseAction.check_params(PARAMS, params)
38
-
39
42
  client = params.gdc_gd_client
40
43
 
41
44
  domain_name = params.organization || params.domain
@@ -50,6 +53,11 @@ module GoodData
50
53
 
51
54
  results = []
52
55
  synchronize_clients = segments.map do |segment|
56
+ segment_clients = segment.clients
57
+ missing_project_clients = segment_clients.reject(&:project?).map(&:client_id)
58
+
59
+ raise "Client(s) missing workspace: #{missing_project_clients.join(', ')}. Please make sure all clients have workspace." unless missing_project_clients.empty?
60
+
53
61
  replacements = {
54
62
  table_name: params.release_table_name || DEFAULT_TABLE_NAME,
55
63
  segment_id: segment.segment_id
@@ -68,7 +76,7 @@ module GoodData
68
76
  sync_info = {
69
77
  segment_id: segment.segment_id,
70
78
  from: master_pid,
71
- to: segment.clients.map do |segment_client|
79
+ to: segment_clients.map do |segment_client|
72
80
  client_project = segment_client.project
73
81
  to_pid = client_project.pid
74
82
  results << {
@@ -17,13 +17,13 @@ module GoodData
17
17
 
18
18
  description 'Organization Name'
19
19
  param :organization, instance_of(Type::StringType), required: true
20
+
21
+ description 'Segments to provision'
22
+ param :segments_filter, array_of(instance_of(Type::StringType)), required: false
20
23
  end
21
24
 
22
25
  class << self
23
26
  def call(params)
24
- # Check if all required parameters were passed
25
- BaseAction.check_params(PARAMS, params)
26
-
27
27
  client = params.gdc_gd_client
28
28
 
29
29
  domain_name = params.organization || params.domain
@@ -36,7 +36,7 @@ module GoodData
36
36
  end
37
37
  end
38
38
 
39
- segments = domain_segments.map do |segment|
39
+ segments = domain_segments.pmap do |segment|
40
40
  project = nil
41
41
 
42
42
  begin
@@ -0,0 +1,74 @@
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
+ require_relative '../helpers/helpers'
9
+
10
+ module GoodData
11
+ module LCM2
12
+ class CollectTaggedObjects < BaseAction
13
+ DESCRIPTION = 'Collect all objects tagged with the +$PRODUCTION_TAG+ from development projects'
14
+
15
+ PARAMS = define_params(self) do
16
+ description 'Development Client Used for Connecting to GD'
17
+ param :development_client, instance_of(Type::GdClientType), required: true
18
+
19
+ description 'Synchronization Info'
20
+ param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
21
+
22
+ description 'Tag Name'
23
+ param :production_tag, instance_of(Type::StringType), required: false
24
+
25
+ description 'Segments to search for segment-specific production tags'
26
+ param :segments, array_of(instance_of(Type::SegmentType)), required: false
27
+
28
+ description 'Flag to mark if we need to transfer all objects'
29
+ param :transfer_all, instance_of(Type::BooleanType), required: false, default: false
30
+ end
31
+
32
+ class << self
33
+ def call(params)
34
+ results = []
35
+ segments_to_tags = Helpers.segment_production_tags(params.segments)
36
+ transfer_all = GoodData::Helpers.to_boolean(params.transfer_all)
37
+ return results unless params.production_tag || segments_to_tags.any? || transfer_all
38
+ development_client = params.development_client
39
+
40
+ synchronize = params.synchronize.pmap do |info|
41
+ from = info.from
42
+ from_project = development_client.projects(from) || fail("Invalid 'from' project specified - '#{from}'")
43
+
44
+ segment_tags = segments_to_tags[info.segment]
45
+ production_tags = Helpers.parse_production_tags(params.production_tag, segment_tags)
46
+ if production_tags.any?
47
+ objects = from_project.find_by_tag(production_tags)
48
+ else
49
+ objects = (from_project.reports.to_a + from_project.metrics.to_a + from_project.variables.to_a).map(&:uri)
50
+ end
51
+
52
+ info[:transfer_uris] ||= []
53
+ info[:transfer_uris] += objects
54
+
55
+ results += objects.map do |uri|
56
+ {
57
+ project: from,
58
+ transfer_uri: uri
59
+ }
60
+ end
61
+
62
+ info
63
+ end
64
+ {
65
+ results: results,
66
+ params: {
67
+ synchronize: synchronize
68
+ }
69
+ }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end