gooddata 0.6.51 → 0.6.52

Sign up to get free protection for your applications and to get access to all the features.
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