pact_broker 2.40.0 → 2.41.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/DEVELOPER_DOCUMENTATION.md +11 -0
  4. data/db/ddl_statements/head_pact_tags.rb +10 -0
  5. data/db/ddl_statements/latest_pact_consumer_version_orders.rb +16 -0
  6. data/db/ddl_statements/latest_pact_publications_by_consumer_versions.rb +16 -0
  7. data/db/ddl_statements/latest_tagged_pact_consumer_version_orders.rb +23 -0
  8. data/db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb +15 -0
  9. data/db/ddl_statements/{latest_verification_ids_for_pact_versions_v001.rb → latest_verification_ids_for_pact_versions.rb} +0 -0
  10. data/db/migrations/000028_create_all_pact_publications.rb +1 -0
  11. data/db/migrations/20180311_optimise_head_matrix.rb +1 -9
  12. data/db/migrations/20180722_recreate_views.rb +6 -19
  13. data/db/migrations/20191028_optimise_latest_tagged_pact_cv_orders.rb +13 -0
  14. data/db/migrations/20191030_optimise_latest_pact_publications_by_consumer_versions_.rb +13 -0
  15. data/db/migrations/20191031_optimise_latest_verification_ids_for_consumer_version_tags.rb +13 -0
  16. data/db/migrations/20191101_create_head_pact_tags.rb +11 -0
  17. data/lib/db.rb +1 -0
  18. data/lib/pact_broker/api/contracts/dry_validation_predicates.rb +15 -0
  19. data/lib/pact_broker/api/contracts/dry_validation_workarounds.rb +38 -0
  20. data/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb +34 -0
  21. data/lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb +12 -20
  22. data/lib/pact_broker/api/decorators/matrix_decorator.rb +25 -6
  23. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +4 -12
  24. data/lib/pact_broker/api/decorators/verifiable_pact_decorator.rb +5 -2
  25. data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +21 -9
  26. data/lib/pact_broker/api/renderers/integrations_dot_renderer.rb +1 -1
  27. data/lib/pact_broker/api/resources/base_resource.rb +1 -1
  28. data/lib/pact_broker/api/resources/can_i_deploy.rb +2 -9
  29. data/lib/pact_broker/api/resources/matrix.rb +2 -8
  30. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +1 -0
  31. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +36 -7
  32. data/lib/pact_broker/app.rb +1 -0
  33. data/lib/pact_broker/db/data_migrations/migrate_webhook_headers.rb +1 -1
  34. data/lib/pact_broker/db/seed_example_data.rb +8 -5
  35. data/lib/pact_broker/diagnostic/resources/base_resource.rb +0 -8
  36. data/lib/pact_broker/domain/index_item.rb +47 -16
  37. data/lib/pact_broker/domain/pact.rb +12 -4
  38. data/lib/pact_broker/domain/version.rb +2 -0
  39. data/lib/pact_broker/hash_refinements.rb +48 -0
  40. data/lib/pact_broker/index/page.rb +12 -0
  41. data/lib/pact_broker/index/service.rb +156 -21
  42. data/lib/pact_broker/integrations/integration.rb +22 -0
  43. data/lib/pact_broker/locale/en.yml +2 -0
  44. data/lib/pact_broker/logging.rb +0 -1
  45. data/lib/pact_broker/matrix/aggregated_row.rb +3 -9
  46. data/lib/pact_broker/matrix/deployment_status_summary.rb +5 -5
  47. data/lib/pact_broker/matrix/head_row.rb +2 -0
  48. data/lib/pact_broker/matrix/quick_row.rb +7 -7
  49. data/lib/pact_broker/matrix/repository.rb +2 -4
  50. data/lib/pact_broker/pacticipants/repository.rb +1 -1
  51. data/lib/pact_broker/pacts/pact_publication.rb +27 -4
  52. data/lib/pact_broker/pacts/repository.rb +41 -18
  53. data/lib/pact_broker/pacts/service.rb +23 -3
  54. data/lib/pact_broker/pacts/verifiable_pact.rb +8 -2
  55. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +14 -8
  56. data/lib/pact_broker/string_refinements.rb +36 -1
  57. data/lib/pact_broker/tags/head_pact_tags.rb +12 -0
  58. data/lib/pact_broker/tags/tag_with_latest_flag.rb +0 -1
  59. data/lib/pact_broker/test/test_data_builder.rb +1 -1
  60. data/lib/pact_broker/ui/controllers/index.rb +23 -2
  61. data/lib/pact_broker/ui/view_models/index_item.rb +7 -1
  62. data/lib/pact_broker/ui/view_models/index_items.rb +10 -8
  63. data/lib/pact_broker/ui/view_models/matrix_line.rb +14 -21
  64. data/lib/pact_broker/ui/view_models/matrix_tag.rb +6 -8
  65. data/lib/pact_broker/ui/views/index/_pagination.haml +31 -0
  66. data/lib/pact_broker/ui/views/index/show-with-tags.haml +6 -3
  67. data/lib/pact_broker/ui/views/index/show.haml +5 -2
  68. data/lib/pact_broker/ui/views/matrix/show.haml +6 -9
  69. data/lib/pact_broker/version.rb +1 -1
  70. data/lib/pact_broker/webhooks/webhook.rb +2 -2
  71. data/lib/pact_broker/webhooks/webhook_execution_result.rb +3 -18
  72. data/public/javascripts/matrix.js +26 -1
  73. data/public/javascripts/pagination.js +1127 -0
  74. data/public/stylesheets/index.css +13 -0
  75. data/public/stylesheets/matrix.css +10 -1
  76. data/spec/features/get_provider_pacts_for_verification_spec.rb +44 -9
  77. data/spec/features/pending_pacts_spec.rb +1 -1
  78. data/spec/features/wip_pacts_spec.rb +138 -0
  79. data/spec/integration/app_spec.rb +1 -1
  80. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb +90 -0
  81. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_query_schema_spec.rb +26 -4
  82. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +36 -2
  83. data/spec/lib/pact_broker/api/decorators/verifiable_pact_decorator_spec.rb +24 -1
  84. data/spec/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator_spec.rb +62 -18
  85. data/spec/lib/pact_broker/api/resources/base_resource_spec.rb +10 -0
  86. data/spec/lib/pact_broker/api/resources/provider_pacts_for_verification_spec.rb +75 -6
  87. data/spec/lib/pact_broker/hash_refinements_spec.rb +24 -0
  88. data/spec/lib/pact_broker/index/service_spec.rb +38 -2
  89. data/spec/lib/pact_broker/integrations/integration_spec.rb +79 -41
  90. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +2 -0
  91. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +17 -2
  92. data/spec/lib/pact_broker/pacts/service_spec.rb +56 -0
  93. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +12 -1
  94. data/spec/lib/pact_broker/ui/controllers/index_spec.rb +28 -6
  95. data/spec/lib/pact_broker/ui/view_models/index_items_spec.rb +8 -29
  96. data/spec/lib/pact_broker/ui/view_models/matrix_line_spec.rb +41 -0
  97. metadata +24 -3
@@ -6,12 +6,21 @@ This class most accurately represents a PactPublication
6
6
  =end
7
7
 
8
8
  module PactBroker
9
-
10
9
  module Domain
11
10
  class Pact
12
-
13
11
  # The ID is the pact_publication ID
14
- attr_accessor :id, :provider, :consumer_version, :consumer, :created_at, :json_content, :consumer_version_number, :revision_number, :pact_version_sha, :latest_verification, :head_tag_names
12
+ attr_accessor :id,
13
+ :provider,
14
+ :consumer_version,
15
+ :consumer,
16
+ :created_at,
17
+ :json_content,
18
+ :consumer_version_number,
19
+ :revision_number,
20
+ :pact_version_sha,
21
+ :latest_verification,
22
+ :head_tag_names
23
+
15
24
  def initialize attributes
16
25
  attributes.each_pair do | key, value |
17
26
  self.send(key.to_s + "=", value)
@@ -80,6 +89,5 @@ module PactBroker
80
89
  db_model.pact_version
81
90
  end
82
91
  end
83
-
84
92
  end
85
93
  end
@@ -1,6 +1,7 @@
1
1
  require 'pact_broker/db'
2
2
  require 'pact_broker/domain/order_versions'
3
3
  require 'pact_broker/repositories/helpers'
4
+ require 'pact_broker/tags/tag_with_latest_flag'
4
5
 
5
6
  module PactBroker
6
7
  module Domain
@@ -9,6 +10,7 @@ module PactBroker
9
10
  one_to_many :pact_publications, order: :revision_number, class: "PactBroker::Pacts::PactPublication", key: :consumer_version_id
10
11
  associate(:many_to_one, :pacticipant, :class => "PactBroker::Domain::Pacticipant", :key => :pacticipant_id, :primary_key => :id)
11
12
  one_to_many :tags, :reciprocal => :version, order: :created_at
13
+ one_to_many :tags_with_latest_flag, class: "PactBroker::Tags::TagWithLatestFlag", key: :version_id, primary_key: :id
12
14
 
13
15
  dataset_module do
14
16
  include PactBroker::Repositories::Helpers
@@ -1,6 +1,11 @@
1
+ require 'pact_broker/string_refinements'
2
+
1
3
  module PactBroker
2
4
  module HashRefinements
5
+
3
6
  refine Hash do
7
+ using PactBroker::StringRefinements
8
+
4
9
  def deep_merge(other_hash, &block)
5
10
  block_actual = Proc.new {|key, oldval, newval|
6
11
  newval = block.call(key, oldval, newval) if block_given?
@@ -8,6 +13,49 @@ module PactBroker
8
13
  }
9
14
  merge(other_hash, &block_actual)
10
15
  end
16
+
17
+ def symbolize_keys
18
+ symbolize_keys_private(self)
19
+ end
20
+
21
+ def snakecase_keys
22
+ snakecase_keys_private(self)
23
+ end
24
+
25
+ private
26
+
27
+ def snakecase_keys_private(params)
28
+ case params
29
+ when Hash
30
+ params.inject({}) do |result, (key, value)|
31
+ snake_key = case key
32
+ when String then key.snakecase
33
+ when Symbol then key.to_s.snakecase.to_sym
34
+ else
35
+ key
36
+ end
37
+ result.merge(snake_key => snakecase_keys_private(value))
38
+ end
39
+ when Array
40
+ params.collect { |value| snakecase_keys_private(value) }
41
+ else
42
+ params
43
+ end
44
+
45
+ end
46
+
47
+ def symbolize_keys_private(params)
48
+ case params
49
+ when Hash
50
+ params.inject({}) do |result, (key, value)|
51
+ result.merge(key.to_sym => symbolize_keys_private(value))
52
+ end
53
+ when Array
54
+ params.collect { |value| symbolize_keys_private(value) }
55
+ else
56
+ params
57
+ end
58
+ end
11
59
  end
12
60
  end
13
61
  end
@@ -0,0 +1,12 @@
1
+ module PactBroker
2
+ module Index
3
+ class Page < Array
4
+ attr_reader :pagination_record_count
5
+
6
+ def initialize(array, pagination_record_count)
7
+ super(array)
8
+ @pagination_record_count = pagination_record_count
9
+ end
10
+ end
11
+ end
12
+ end
@@ -3,21 +3,40 @@ require 'pact_broker/logging'
3
3
  require 'pact_broker/domain/index_item'
4
4
  require 'pact_broker/matrix/head_row'
5
5
  require 'pact_broker/matrix/aggregated_row'
6
+ require 'pact_broker/repositories/helpers'
7
+ require 'pact_broker/index/page'
6
8
 
7
9
  module PactBroker
8
-
9
10
  module Index
10
11
  class Service
11
-
12
12
  extend PactBroker::Repositories
13
13
  extend PactBroker::Services
14
14
  extend PactBroker::Logging
15
15
 
16
+ COLS = [:id, :consumer_name, :provider_name, :consumer_version_order]
17
+ LATEST_PPS = Sequel::Model.db[:latest_pact_publications].select(*COLS)
18
+ LATEST_TAGGED_PPS = Sequel::Model.db[:latest_tagged_pact_publications].select(*COLS)
19
+ HEAD_PP_ORDER_COLUMNS = [
20
+ Sequel.asc(Sequel.function(:lower, :consumer_name)),
21
+ Sequel.desc(:consumer_version_order),
22
+ Sequel.asc(Sequel.function(:lower, :provider_name))
23
+ ].freeze
24
+ DEFAULT_PAGE_SIZE = 30
25
+ DEFAULT_PAGE_NUMBER = 1
26
+
16
27
  # This method provides data for both the OSS server side rendered index (with and without tags)
17
28
  # and the Pactflow UI. It really needs to be broken into to separate methods, as it's getting too messy
18
29
  # supporting both
19
30
 
20
31
  def self.find_index_items options = {}
32
+ if options[:optimised]
33
+ find_index_items_optimised(options)
34
+ else
35
+ find_index_items_original(options)
36
+ end
37
+ end
38
+
39
+ def self.find_index_items_original options = {}
21
40
  rows = PactBroker::Matrix::HeadRow
22
41
  .select_all_qualified
23
42
  .eager(:latest_triggered_webhooks)
@@ -38,10 +57,7 @@ module PactBroker
38
57
  end
39
58
  rows = rows.all.group_by(&:pact_publication_id).values.collect{ | rows| Matrix::AggregatedRow.new(rows) }
40
59
 
41
-
42
-
43
60
  rows.sort.collect do | row |
44
- # TODO simplify. Do we really need 3 layers of abstraction?
45
61
  PactBroker::Domain::IndexItem.create(
46
62
  row.consumer,
47
63
  row.provider,
@@ -56,31 +72,150 @@ module PactBroker
56
72
  end
57
73
  end
58
74
 
75
+ def self.find_index_items_optimised options = {}
76
+ latest_verifications_for_cv_tags = latest_verifications_for_consumer_version_tags(options)
77
+ latest_pact_publication_ids = latest_pact_publications.select(:id).all.collect{ |h| h[:id] }
78
+
79
+ # We only need to know if a webhook exists for an integration, not what its properties are
80
+ webhooks = PactBroker::Webhooks::Webhook.select(:consumer_id, :provider_id).distinct.all
81
+
82
+ pact_publication_ids = head_pact_publication_ids(options)
83
+ pagination_record_count = pact_publication_ids.pagination_record_count
84
+
85
+ pact_publications = PactBroker::Pacts::PactPublication
86
+ .where(id: pact_publication_ids)
87
+ .select_all_qualified
88
+ .eager(:consumer)
89
+ .eager(:provider)
90
+ .eager(:pact_version)
91
+ .eager(integration: [{latest_verification: :provider_version}, :latest_triggered_webhooks])
92
+ .eager(:consumer_version)
93
+ .eager(latest_verification: { provider_version: :tags_with_latest_flag })
94
+ .eager(:head_pact_tags)
95
+
96
+ index_items = pact_publications.all.collect do | pact_publication |
97
+ is_overall_latest_for_integration = latest_pact_publication_ids.include?(pact_publication.id)
98
+ latest_verification = latest_verification_for_pseudo_branch(pact_publication, is_overall_latest_for_integration, latest_verifications_for_cv_tags, options[:tags])
99
+ webhook = webhooks.find{ |webhook| webhook.is_for?(pact_publication.integration) }
100
+
101
+ PactBroker::Domain::IndexItem.create(
102
+ pact_publication.consumer,
103
+ pact_publication.provider,
104
+ pact_publication.to_domain_lightweight,
105
+ is_overall_latest_for_integration,
106
+ latest_verification,
107
+ webhook ? [webhook]: [],
108
+ pact_publication.integration.latest_triggered_webhooks,
109
+ consumer_version_tags(pact_publication, options[:tags]),
110
+ options[:tags] && latest_verification ? latest_verification.provider_version.tags_with_latest_flag.select(&:latest?) : []
111
+ )
112
+ end.sort
113
+
114
+ Page.new(index_items, pagination_record_count)
115
+ end
116
+
117
+ # Worst. Code. Ever.
118
+ #
119
+ def self.latest_verification_for_pseudo_branch(pact_publication, is_overall_latest, latest_verifications_for_cv_tags, tags_option)
120
+ if tags_option == true
121
+ latest_verifications_for_cv_tags
122
+ .select{ | v | v.consumer_id == pact_publication.consumer_id && v.provider_id == pact_publication.provider_id && pact_publication.head_pact_tags.collect(&:name).include?(v.consumer_version_tag_name) }
123
+ .sort{ |v1, v2| v1.id <=> v2.id }.last || (is_overall_latest && pact_publication.integration.latest_verification)
124
+ elsif tags_option.is_a?(Array)
125
+ latest_verifications_for_cv_tags
126
+ .select{ | v | v.consumer_id == pact_publication.consumer_id && v.provider_id == pact_publication.provider_id && pact_publication.head_pact_tags.collect(&:name).include?(v.consumer_version_tag_name) && tags_option.include?(v.consumer_version_tag_name) }
127
+ .sort{ |v1, v2| v1.id <=> v2.id }.last || (is_overall_latest && pact_publication.integration.latest_verification)
128
+ else
129
+ pact_publication.integration.latest_verification
130
+ end
131
+ end
132
+
133
+ def self.consumer_version_tags(pact_publication, tags_option)
134
+ if tags_option == true
135
+ pact_publication.head_pact_tags.collect(&:name)
136
+ elsif tags_option.is_a?(Array)
137
+ pact_publication.head_pact_tags.collect(&:name) & tags_option
138
+ else
139
+ []
140
+ end
141
+ end
142
+
59
143
  def self.find_index_items_for_api(consumer_name: nil, provider_name: nil, **ignored)
60
- rows = PactBroker::Matrix::HeadRow
61
- .eager(:consumer_version_tags)
62
- .eager(:provider_version_tags)
144
+ latest_pact_publication_ids = latest_pact_publications.select(:id).all.collect{ |h| h[:id] }
145
+ pact_publication_ids = head_pact_publication_ids(consumer_name: consumer_name, provider_name: provider_name, tags: true)
146
+
147
+ pact_publications = PactBroker::Pacts::PactPublication
148
+ .where(id: pact_publication_ids)
63
149
  .select_all_qualified
150
+ .eager(:consumer)
151
+ .eager(:provider)
152
+ .eager(:pact_version)
153
+ .eager(:consumer_version)
154
+ .eager(latest_verification: { provider_version: :tags_with_latest_flag })
155
+ .eager(:head_pact_tags)
64
156
 
65
- rows = rows.consumer(consumer_name) if consumer_name
66
- rows = rows.provider(provider_name) if provider_name
67
157
 
68
- rows = rows.all.group_by(&:pact_publication_id).values.collect{ | rows| Matrix::AggregatedRow.new(rows) }
158
+ pact_publications.all.collect do | pact_publication |
159
+
160
+ is_overall_latest_for_integration = latest_pact_publication_ids.include?(pact_publication.id)
69
161
 
70
- rows.sort.collect do | row |
71
- # TODO separate this model from IndexItem
72
- # webhook status not currently displayed in Pactflow UI, so don't query for it.
73
162
  PactBroker::Domain::IndexItem.create(
74
- row.consumer,
75
- row.provider,
76
- row.pact,
77
- row.overall_latest?,
78
- row.latest_verification_for_pact_version,
163
+ pact_publication.consumer,
164
+ pact_publication.provider,
165
+ pact_publication.to_domain_lightweight,
166
+ is_overall_latest_for_integration,
167
+ pact_publication.latest_verification,
79
168
  [],
80
169
  [],
81
- row.consumer_head_tag_names,
82
- row.provider_version_tags.select(&:latest?)
170
+ pact_publication.head_pact_tags.collect(&:name),
171
+ pact_publication.latest_verification ? pact_publication.latest_verification.provider_version.tags_with_latest_flag.select(&:latest?) : []
83
172
  )
173
+ end.sort
174
+ end
175
+
176
+ def self.latest_pact_publications
177
+ db[:latest_pact_publications]
178
+ end
179
+
180
+ def self.db
181
+ PactBroker::Pacts::PactPublication.db
182
+ end
183
+
184
+ def self.head_pact_publication_ids(options = {})
185
+ query = if options[:tags].is_a?(Array)
186
+ LATEST_PPS.union(LATEST_TAGGED_PPS.where(tag_name: options[:tags]))
187
+ elsif options[:tags]
188
+ LATEST_PPS.union(LATEST_TAGGED_PPS)
189
+ else
190
+ LATEST_PPS
191
+ end
192
+
193
+ if options[:consumer_name]
194
+ query = query.where(PactBroker::Repositories::Helpers.name_like(:consumer_name, options[:consumer_name]))
195
+ end
196
+
197
+ if options[:provider_name]
198
+ query = query.where(PactBroker::Repositories::Helpers.name_like(:provider_name, options[:provider_name]))
199
+ end
200
+
201
+ query.order(*HEAD_PP_ORDER_COLUMNS)
202
+ .paginate(options[:page_number] || DEFAULT_PAGE_NUMBER, options[:page_size] || DEFAULT_PAGE_SIZE)
203
+ .select(:id)
204
+ end
205
+
206
+ def self.latest_verifications_for_consumer_version_tags(options)
207
+ # server side rendered index page with tags[]=a&tags=[]b
208
+ if options[:tags].is_a?(Array)
209
+ PactBroker::Verifications::LatestVerificationForConsumerVersionTag
210
+ .eager(:provider_version)
211
+ .where(consumer_version_tag_name: options[:tags])
212
+ .all
213
+ elsif options[:tags] # server side rendered index page with tags=true
214
+ PactBroker::Verifications::LatestVerificationForConsumerVersionTag
215
+ .eager(:provider_version)
216
+ .all
217
+ else
218
+ nil # should not be used
84
219
  end
85
220
  end
86
221
  end
@@ -1,6 +1,8 @@
1
1
  require 'pact_broker/db'
2
2
  require 'pact_broker/verifications/pseudo_branch_status'
3
3
  require 'pact_broker/domain/verification'
4
+ require 'pact_broker/webhooks/latest_triggered_webhook'
5
+ require 'pact_broker/webhooks/webhook'
4
6
 
5
7
  module PactBroker
6
8
  module Integrations
@@ -9,6 +11,26 @@ module PactBroker
9
11
  associate(:many_to_one, :provider, :class => "PactBroker::Domain::Pacticipant", :key => :provider_id, :primary_key => :id)
10
12
  associate(:one_to_one, :latest_pact, :class => "PactBroker::Pacts::LatestPactPublications", key: [:consumer_id, :provider_id], primary_key: [:consumer_id, :provider_id])
11
13
  associate(:one_to_one, :latest_verification, :class => "PactBroker::Verifications::LatestVerificationForConsumerAndProvider", key: [:consumer_id, :provider_id], primary_key: [:consumer_id, :provider_id])
14
+ associate(:one_to_many, :latest_triggered_webhooks, :class => "PactBroker::Webhooks::LatestTriggeredWebhook", key: [:consumer_id, :provider_id], primary_key: [:consumer_id, :provider_id])
15
+
16
+ # When viewing the index, every webhook in the database will match at least one of the rows, so
17
+ # it makes sense to load the entire table and match each webhook to the appropriate row.
18
+ # This will only work when using eager loading. The keys are just blanked out to avoid errors.
19
+ # I don't understand how they work at all.
20
+ # It would be nice to do this declaratively.
21
+ many_to_many :webhooks, class: "PactBroker::Webhooks::Webhook", :left_key => [], left_primary_key: [], :eager_loader=>(proc do |eo_opts|
22
+ eo_opts[:rows].each do |row|
23
+ row.associations[:webhooks] = []
24
+ end
25
+
26
+ PactBroker::Webhooks::Webhook.each do | webhook |
27
+ eo_opts[:rows].each do | row |
28
+ if webhook.is_for?(row)
29
+ row.associations[:webhooks] << webhook
30
+ end
31
+ end
32
+ end
33
+ end)
12
34
 
13
35
  def verification_status_for_latest_pact
14
36
  @verification_status_for_latest_pact ||= PactBroker::Verifications::PseudoBranchStatus.new(latest_pact, latest_pact&.latest_verification)
@@ -13,6 +13,8 @@ en:
13
13
  pact_broker:
14
14
  messages:
15
15
  response_body_hidden: For security purposes, the response details are not logged. To enable response logging, configure the webhook_host_whitelist property. See /doc/webhooks#whitelist for more information.
16
+ matrix:
17
+ pre_verified: This pact was "pre-verified" as it has identical content to a previously verified pact.
16
18
  webhooks:
17
19
  parameters:
18
20
  pactbroker:
@@ -1,4 +1,3 @@
1
- require 'pathname'
2
1
  require 'semantic_logger'
3
2
 
4
3
  module PactBroker
@@ -33,7 +33,7 @@ module PactBroker
33
33
  @latest_verification ||= begin
34
34
  verification = matrix_rows.collect do | row|
35
35
  row.verification || latest_verification_for_consumer_version_tag(row)
36
- end.compact.sort{ |v1, v2| v1.id <=> v2.id }.last
36
+ end.compact.sort_by(&:id).last
37
37
 
38
38
  if !verification && overall_latest?
39
39
  overall_latest_verification
@@ -45,9 +45,7 @@ module PactBroker
45
45
 
46
46
  def latest_verification_for_pact_version
47
47
  @latest_verificaton_for_pact_version ||= begin
48
- matrix_rows.collect do | row|
49
- row.verification
50
- end.compact.sort{ |v1, v2| v1.id <=> v2.id }.last
48
+ matrix_rows.collect(&:verification).compact.sort_by(&:id).last
51
49
  end
52
50
  end
53
51
 
@@ -61,7 +59,7 @@ module PactBroker
61
59
 
62
60
  private
63
61
 
64
- attr_reader :matrix_rows
62
+ attr_reader :matrix_rows, :first_row
65
63
 
66
64
  def latest_verification_for_consumer_version_tag row
67
65
  row.latest_verification_for_consumer_version_tag if row.consumer_version_tag_name
@@ -72,10 +70,6 @@ module PactBroker
72
70
  first_row.latest_verification_for_consumer_and_provider
73
71
  end
74
72
 
75
- def first_row
76
- @first_row
77
- end
78
-
79
73
  def consumer_version_tag_names
80
74
  matrix_rows.collect(&:consumer_version_tag_name)
81
75
  end
@@ -17,7 +17,7 @@ module PactBroker
17
17
 
18
18
  def counts
19
19
  {
20
- success: rows.count{ |row| row.success },
20
+ success: rows.count(&:success),
21
21
  failed: rows.count { |row| row.success == false },
22
22
  unknown: required_integrations_without_a_row.count + rows.count { |row| row.success.nil? }
23
23
  }
@@ -27,7 +27,7 @@ module PactBroker
27
27
  return false if specified_selectors_that_do_not_exist.any?
28
28
  return nil if rows.any?{ |row| row.success.nil? }
29
29
  return nil if required_integrations_without_a_row.any?
30
- rows.all?{ |row| row.success } # true if rows is empty
30
+ rows.all?(&:success) # true if rows is empty
31
31
  end
32
32
 
33
33
  def reasons
@@ -72,7 +72,7 @@ module PactBroker
72
72
  end
73
73
 
74
74
  def success_messages
75
- if rows.all?{ |row| row.success } && required_integrations_without_a_row.empty?
75
+ if rows.all?(&:success) && required_integrations_without_a_row.empty?
76
76
  if rows.any?
77
77
  [Successful.new]
78
78
  else
@@ -113,7 +113,7 @@ module PactBroker
113
113
 
114
114
  def missing_reasons
115
115
  required_integrations_without_a_row.collect do | integration |
116
- pact_not_verified_by_required_provider_version(integration)
116
+ pact_not_verified_by_required_provider_version(integration)
117
117
  end.flatten
118
118
  end
119
119
 
@@ -141,7 +141,7 @@ module PactBroker
141
141
 
142
142
  def selector_for(pacticipant_name)
143
143
  resolved_selectors.find{ | s| s.pacticipant_name == pacticipant_name } ||
144
- dummy_selectors.find{ | s| s.pacticipant_name == pacticipant_name }
144
+ dummy_selectors.find{ | s| s.pacticipant_name == pacticipant_name }
145
145
  end
146
146
 
147
147
  def selectors_for(row)