pact_broker 2.95.1 → 2.98.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/Gemfile +1 -0
  4. data/docs/CONFIGURATION.md +120 -66
  5. data/lib/db.rb +1 -7
  6. data/lib/pact_broker/api/middleware/http_debug_logs.rb +36 -0
  7. data/lib/pact_broker/app.rb +3 -7
  8. data/lib/pact_broker/config/basic_auth_configuration.rb +7 -0
  9. data/lib/pact_broker/config/runtime_configuration.rb +22 -4
  10. data/lib/pact_broker/config/runtime_configuration_coercion_methods.rb +11 -0
  11. data/lib/pact_broker/config/runtime_configuration_database_methods.rb +6 -1
  12. data/lib/pact_broker/config/runtime_configuration_logging_methods.rb +13 -2
  13. data/lib/pact_broker/configuration.rb +2 -12
  14. data/lib/pact_broker/db/models.rb +2 -2
  15. data/lib/pact_broker/index/service.rb +2 -3
  16. data/lib/pact_broker/integrations/integration.rb +21 -6
  17. data/lib/pact_broker/integrations/service.rb +1 -1
  18. data/lib/pact_broker/matrix/repository.rb +2 -3
  19. data/lib/pact_broker/matrix/service.rb +0 -1
  20. data/lib/pact_broker/metrics/service.rb +2 -2
  21. data/lib/pact_broker/pacts/lazy_loaders.rb +26 -0
  22. data/lib/pact_broker/pacts/pact_publication.rb +13 -34
  23. data/lib/pact_broker/pacts/pact_version.rb +24 -28
  24. data/lib/pact_broker/pacts/pact_version_association_loaders.rb +36 -0
  25. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +9 -13
  26. data/lib/pact_broker/pacts/repository.rb +29 -25
  27. data/lib/pact_broker/repositories/helpers.rb +4 -0
  28. data/lib/pact_broker/test/http_test_data_builder.rb +8 -1
  29. data/lib/pact_broker/test/test_data_builder.rb +2 -1
  30. data/lib/pact_broker/ui/controllers/matrix.rb +14 -11
  31. data/lib/pact_broker/version.rb +1 -1
  32. data/pact_broker.gemspec +1 -1
  33. metadata +9 -16
  34. data/lib/pact_broker/matrix/aggregated_row.rb +0 -79
  35. data/lib/pact_broker/matrix/head_row.rb +0 -80
  36. data/lib/pact_broker/matrix/row.rb +0 -287
@@ -23,7 +23,7 @@ module PactBroker
23
23
  :provider,
24
24
  :consumer,
25
25
  :consumer_version,
26
- pact_version: :latest_verification
26
+ :pact_version
27
27
  ]
28
28
 
29
29
  def find(provider_name, consumer_version_selectors)
@@ -162,16 +162,14 @@ module PactBroker
162
162
 
163
163
  def find_pacts_for_which_the_latest_version_for_the_fallback_tag_is_required(provider_name, selectors)
164
164
  selectors.collect do | selector |
165
- query = scope_for(PactPublication).for_provider_name(provider_name).for_latest_consumer_versions_with_tag(selector.fallback_tag)
165
+ query = scope_for(PactPublication).eager_for_domain_with_content.for_provider_name(provider_name).for_latest_consumer_versions_with_tag(selector.fallback_tag)
166
166
  query = query.for_consumer_name(selector.consumer) if selector.consumer
167
- query.all
168
- .collect do | latest_tagged_pact_publication |
169
- pact_publication = unscoped(PactPublication).find(id: latest_tagged_pact_publication.id)
170
- SelectedPact.new(
171
- pact_publication.to_domain,
172
- Selectors.new(selector.resolve_for_fallback(pact_publication.consumer_version))
173
- )
174
- end
167
+ query.all.collect do | pact_publication |
168
+ SelectedPact.new(
169
+ pact_publication.to_domain,
170
+ Selectors.new(selector.resolve_for_fallback(pact_publication.consumer_version))
171
+ )
172
+ end
175
173
  end.flatten
176
174
  end
177
175
 
@@ -300,9 +298,7 @@ module PactBroker
300
298
 
301
299
  def collect_consumer_name_and_version_number(pact_publications_query)
302
300
  pact_publications = pact_publications_query
303
- .eager(:provider)
304
- .eager(:consumer)
305
- .eager(:consumer_version)
301
+ .eager(:consumer, :consumer_version)
306
302
  .order(:consumer_version_order)
307
303
  .all_forbidding_lazy_load
308
304
  .sort
@@ -7,7 +7,6 @@ require "pact_broker/pacts/pact_version"
7
7
  require "pact/shared/json_differ"
8
8
  require "pact_broker/domain"
9
9
  require "pact_broker/pacts/parse"
10
- require "pact_broker/matrix/head_row"
11
10
  require "pact_broker/pacts/latest_pact_publication_id_for_consumer_version"
12
11
  require "pact_broker/pacts/verifiable_pact"
13
12
  require "pact_broker/repositories/helpers"
@@ -117,8 +116,8 @@ module PactBroker
117
116
 
118
117
  def find_all_pact_versions_between consumer_name, options
119
118
  find_all_database_versions_between(consumer_name, options)
120
- .eager(:tags)
121
119
  .reverse_order(:consumer_version_order)
120
+ .all
122
121
  .collect(&:to_domain)
123
122
  end
124
123
 
@@ -143,7 +142,7 @@ module PactBroker
143
142
  def find_latest_pacts_for_provider provider_name, tag = nil
144
143
  query = scope_for(PactPublication)
145
144
  .for_provider_name(provider_name)
146
- .eager(:consumer)
145
+ .eager_for_domain_with_content
147
146
 
148
147
  if tag
149
148
  query = query.latest_for_consumer_tag(tag)
@@ -151,7 +150,7 @@ module PactBroker
151
150
  query = query.overall_latest
152
151
  end
153
152
 
154
- query.sort_by{ | p| p.consumer_name.downcase }.collect(&:to_head_pact)
153
+ query.all.sort_by{ | p| p.consumer_name.downcase }.collect(&:to_head_pact)
155
154
  end
156
155
 
157
156
  def find_for_verification(provider_name, consumer_version_selectors)
@@ -165,41 +164,45 @@ module PactBroker
165
164
  def find_pact_versions_for_provider provider_name, tag = nil
166
165
  query = scope_for(PactPublication)
167
166
  .select_all_qualified
167
+ .eager_for_domain_with_content
168
168
  .for_provider_name(provider_name)
169
- .eager(:consumer)
170
- .eager(:provider)
171
169
  query = query.for_consumer_version_tag(tag) if tag
172
- query.collect(&:to_domain).sort
170
+ query.all.collect(&:to_domain).sort
173
171
  end
174
172
 
175
173
  # Returns latest pact version for the consumer_version_number
176
174
  def find_by_consumer_version consumer_name, consumer_version_number
177
175
  scope_for(PactPublication)
176
+ .eager_for_domain_with_content
178
177
  .for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
179
178
  .remove_overridden_revisions_from_complete_query
179
+ .all
180
180
  .collect(&:to_domain_with_content)
181
181
  end
182
182
 
183
183
  def find_by_version_and_provider version_id, provider_id
184
184
  scope_for(PactPublication)
185
- .eager(:tags)
185
+ .eager_for_domain_with_content
186
186
  .where(consumer_version_id: version_id, provider_id: provider_id)
187
187
  .remove_overridden_revisions_from_complete_query
188
188
  .limit(1)
189
+ .all
189
190
  .collect(&:to_domain_with_content)[0]
190
191
  end
191
192
 
192
193
  def find_latest_pacts
193
194
  scope_for(PactPublication)
195
+ .eager_for_domain_with_content
194
196
  .overall_latest
195
- .eager(:consumer)
196
197
  .eager(:provider)
198
+ .all
197
199
  .collect(&:to_domain)
198
200
  .sort
199
201
  end
200
202
 
201
203
  def find_latest_pact(consumer_name, provider_name, tag = nil)
202
204
  query = scope_for(PactPublication)
205
+ .eager_for_domain_with_content
203
206
  .select_all_qualified
204
207
  .for_consumer_name(consumer_name)
205
208
  .for_provider_name(provider_name)
@@ -214,7 +217,7 @@ module PactBroker
214
217
 
215
218
  # Allows optional consumer_name and provider_name
216
219
  def search_for_latest_pact(consumer_name, provider_name, tag = nil)
217
- query = scope_for(PactPublication).select_all_qualified
220
+ query = scope_for(PactPublication).select_all_qualified.eager_for_domain_with_content
218
221
  query = query.for_consumer_name(consumer_name) if consumer_name
219
222
  query = query.for_provider_name(provider_name) if provider_name
220
223
 
@@ -233,6 +236,7 @@ module PactBroker
233
236
  # rubocop: disable Metrics/CyclomaticComplexity, Metrics/MethodLength
234
237
  def find_pact consumer_name, consumer_version_number, provider_name, pact_version_sha = nil
235
238
  pact_publication_by_consumer_version = scope_for(PactPublication)
239
+ .eager_for_domain_with_content
236
240
  .select_all_qualified
237
241
  .for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
238
242
  .for_provider_name(provider_name)
@@ -240,6 +244,7 @@ module PactBroker
240
244
  .limit(1)
241
245
 
242
246
  latest_pact_publication_by_sha = scope_for(PactPublication)
247
+ .eager_for_domain_with_content
243
248
  .select_all_qualified
244
249
  .for_consumer_name(consumer_name)
245
250
  .for_provider_name(provider_name)
@@ -249,44 +254,39 @@ module PactBroker
249
254
 
250
255
  if consumer_version_number && !pact_version_sha
251
256
  pact_publication_by_consumer_version
252
- .eager(:tags)
253
- .collect(&:to_domain_with_content).first
257
+ .first&.to_domain_with_content
254
258
  elsif pact_version_sha && !consumer_version_number
255
259
  latest_pact_publication_by_sha
256
- .eager(:tags)
257
- .collect(&:to_domain_with_content).first
260
+ .first&.to_domain_with_content
258
261
  elsif consumer_version_number && pact_version_sha
259
- pact_publication = pact_publication_by_consumer_version.all.first
260
- pact_publication&.allow_lazy_load
262
+ pact_publication = pact_publication_by_consumer_version.first
261
263
  if pact_publication && pact_publication.pact_version.sha == pact_version_sha
262
- pact_publication.tags
263
264
  pact_publication.to_domain_with_content
264
265
  else
265
- latest_pact_publication_by_sha
266
- .eager(:tags)
267
- .collect(&:to_domain_with_content).first
266
+ latest_pact_publication_by_sha.first&.to_domain_with_content
268
267
  end
269
268
  else
270
269
  pact_publication_by_consumer_version
271
- .eager(:tags)
272
270
  .reverse_order(:consumer_version_order, :revision_number)
273
- .collect(&:to_domain_with_content).first
271
+ .first&.to_domain_with_content
274
272
  end
275
273
  end
276
274
  # rubocop: enable Metrics/CyclomaticComplexity, Metrics/MethodLength
277
275
 
278
276
  def find_all_revisions consumer_name, consumer_version_number, provider_name
279
277
  scope_for(PactPublication)
278
+ .eager_for_domain_with_content
280
279
  .for_provider_name(provider_name)
281
280
  .for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
282
281
  .order_by_consumer_version_order
282
+ .all
283
283
  .collect(&:to_domain_with_content)
284
284
  end
285
285
 
286
286
  def find_previous_pact pact, tag = nil
287
287
  query = scope_for(PactPublication)
288
+ .eager_for_domain_with_content
288
289
  .remove_overridden_revisions
289
- .eager(:tags)
290
290
  .for_consumer_name(pact.consumer.name)
291
291
  .for_provider_name(pact.provider.name)
292
292
 
@@ -299,17 +299,19 @@ module PactBroker
299
299
  query
300
300
  .consumer_version_order_before(pact.consumer_version.order)
301
301
  .latest_by_consumer_version_order
302
+ .all
302
303
  .collect(&:to_domain_with_content)[0]
303
304
  end
304
305
 
305
306
  def find_next_pact pact
306
307
  scope_for(PactPublication)
307
- .eager(:tags)
308
+ .eager_for_domain_with_content
308
309
  .for_consumer_name(pact.consumer.name)
309
310
  .for_provider_name(pact.provider.name)
310
311
  .remove_overridden_revisions
311
312
  .consumer_version_order_after(pact.consumer_version.order)
312
313
  .earliest
314
+ .all_allowing_lazy_load
313
315
  .collect(&:to_domain_with_content)[0]
314
316
  end
315
317
 
@@ -341,12 +343,13 @@ module PactBroker
341
343
  def find_previous_distinct_pact_by_sha pact
342
344
  pact_version = PactVersion.for_pact_domain(pact)
343
345
  scope_for(PactPublication)
344
- .eager(:tags)
346
+ .eager_for_domain_with_content
345
347
  .for_consumer_name(pact.consumer.name)
346
348
  .for_provider_name(pact.provider.name)
347
349
  .consumer_version_order_before(pact.consumer_version.order)
348
350
  .exclude(pact_version_id: pact_version.id)
349
351
  .latest_by_consumer_version_order
352
+ .all_allowing_lazy_load
350
353
  .collect(&:to_domain_with_content)[0]
351
354
  end
352
355
 
@@ -375,6 +378,7 @@ module PactBroker
375
378
  provider_name = options.fetch(:and)
376
379
 
377
380
  query = scope_for(PactPublication)
381
+ .eager_for_domain_with_content
378
382
  .for_consumer_name(consumer_name)
379
383
  .for_provider_name(provider_name)
380
384
  .remove_overridden_revisions
@@ -10,6 +10,10 @@ module PactBroker
10
10
  all.each{ | row | row.forbid_lazy_load if row.respond_to?(:forbid_lazy_load) }
11
11
  end
12
12
 
13
+ def all_allowing_lazy_load
14
+ all.each{ | row | row.allow_lazy_load if row.respond_to?(:allow_lazy_load) }
15
+ end
16
+
13
17
  def name_like column_name, value
14
18
  if PactBroker.configuration.use_case_sensitive_resource_names
15
19
  if mysql?
@@ -74,8 +74,15 @@ module PactBroker
74
74
  def record_deployment(pacticipant:, version:, environment_name:)
75
75
  puts "Recording deployment of #{pacticipant} version #{version} to #{environment_name}"
76
76
  version_body = client.get("/pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}").tap { |response| check_for_error(response) }.body
77
+
77
78
  environment_relation = version_body["_links"]["pb:record-deployment"].find { |relation| relation["name"] == environment_name }
78
- client.post(environment_relation["href"], { replacedPreviousDeployedVersion: true }).tap { |response| check_for_error(response) }
79
+ if environment_relation.nil?
80
+ available_environments = version_body["_links"]["pb:record-deployment"].collect{ | relation | relation["name"]}.join
81
+ puts "Environment with name #{environment_name} not found. Available environments: #{available_environments}"
82
+ else
83
+ client.post(environment_relation["href"], { replacedPreviousDeployedVersion: true }).tap { |response| check_for_error(response) }
84
+ end
85
+
79
86
  separate
80
87
  self
81
88
  end
@@ -25,7 +25,6 @@ require "pact_broker/verifications/service"
25
25
  require "pact_broker/tags/repository"
26
26
  require "pact_broker/webhooks/repository"
27
27
  require "pact_broker/certificates/certificate"
28
- require "pact_broker/matrix/row"
29
28
  require "pact_broker/deployments/environment_service"
30
29
  require "pact_broker/deployments/deployed_version_service"
31
30
  require "pact_broker/deployments/released_version_service"
@@ -260,6 +259,8 @@ module PactBroker
260
259
  set_created_at_if_set(params[:created_at], :pact_versions, sha: @pact.pact_version_sha) if pact_versions_count_after > pact_versions_count_before
261
260
  set_created_at_if_set(params[:created_at], :latest_pact_publication_ids_for_consumer_versions, consumer_version_id: @consumer_version.id)
262
261
  @pact = PactBroker::Pacts::PactPublication.find(id: @pact.id).to_domain
262
+ consumer_version.reload
263
+ consumer_version.pact_publications.each{ | pp | pp.allow_lazy_load if pp.respond_to?(:allow_lazy_load) }
263
264
  self
264
265
  end
265
266
 
@@ -46,19 +46,22 @@ module PactBroker
46
46
  end
47
47
 
48
48
  get "/provider/:provider_name/consumer/:consumer_name" do
49
- selectors = [ PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:consumer_name]), PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:provider_name]) ]
50
- options = {latestby: "cvpv", limit: 100}
49
+ selectors = [
50
+ PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:consumer_name]),
51
+ PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:provider_name])
52
+ ]
53
+ options = { latestby: "cvpv", limit: 100 }
51
54
  lines = matrix_service.find(selectors, options)
52
55
  lines = PactBroker::UI::ViewDomain::MatrixLines.new(lines, base_url: base_url)
53
- locals = {
54
- lines: lines,
55
- consumer_name: params[:consumer_name],
56
- provider_name: params[:provider_name],
57
- selectors: create_selector_objects(selectors),
58
- options: create_options_model(options),
59
- badge_url: nil,
60
- base_url: base_url
61
- }
56
+ locals = {
57
+ lines: lines,
58
+ consumer_name: params[:consumer_name],
59
+ provider_name: params[:provider_name],
60
+ selectors: create_selector_objects(selectors),
61
+ options: create_options_model(options),
62
+ badge_url: nil,
63
+ base_url: base_url
64
+ }
62
65
  haml :'matrix/show', { locals: locals, layout: :'layouts/main', escape_html: true }
63
66
  end
64
67
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = "2.95.1"
2
+ VERSION = "2.98.0"
3
3
  end
data/pact_broker.gemspec CHANGED
@@ -73,7 +73,7 @@ Gem::Specification.new do |gem|
73
73
  gem.add_runtime_dependency "dry-logic", "0.4.2" # Later version cases ArgumentError: wrong number of arguments
74
74
  gem.add_runtime_dependency "table_print", "~> 1.5"
75
75
  gem.add_runtime_dependency "semantic_logger", "~> 4.3"
76
- gem.add_runtime_dependency "sanitize", ">= 5.2.1", "~> 5.2"
76
+ gem.add_runtime_dependency "sanitize", "6.0"
77
77
  gem.add_runtime_dependency "wisper", "~> 2.0"
78
78
  gem.add_runtime_dependency "anyway_config", "~> 2.1"
79
79
  gem.add_runtime_dependency "request_store", "~> 1.5"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.95.1
4
+ version: 2.98.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bethany Skurrie
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-03-21 00:00:00.000000000 Z
13
+ date: 2022-03-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -346,22 +346,16 @@ dependencies:
346
346
  name: sanitize
347
347
  requirement: !ruby/object:Gem::Requirement
348
348
  requirements:
349
- - - ">="
350
- - !ruby/object:Gem::Version
351
- version: 5.2.1
352
- - - "~>"
349
+ - - '='
353
350
  - !ruby/object:Gem::Version
354
- version: '5.2'
351
+ version: '6.0'
355
352
  type: :runtime
356
353
  prerelease: false
357
354
  version_requirements: !ruby/object:Gem::Requirement
358
355
  requirements:
359
- - - ">="
360
- - !ruby/object:Gem::Version
361
- version: 5.2.1
362
- - - "~>"
356
+ - - '='
363
357
  - !ruby/object:Gem::Version
364
- version: '5.2'
358
+ version: '6.0'
365
359
  - !ruby/object:Gem::Dependency
366
360
  name: wisper
367
361
  requirement: !ruby/object:Gem::Requirement
@@ -689,6 +683,7 @@ files:
689
683
  - lib/pact_broker/api/decorators/webhooks_decorator.rb
690
684
  - lib/pact_broker/api/middleware/basic_auth.rb
691
685
  - lib/pact_broker/api/middleware/configuration.rb
686
+ - lib/pact_broker/api/middleware/http_debug_logs.rb
692
687
  - lib/pact_broker/api/pact_broker_urls.rb
693
688
  - lib/pact_broker/api/paths.rb
694
689
  - lib/pact_broker/api/renderers/html_pact_renderer.rb
@@ -918,11 +913,9 @@ files:
918
913
  - lib/pact_broker/locale/en.yml
919
914
  - lib/pact_broker/logging.rb
920
915
  - lib/pact_broker/logging/default_formatter.rb
921
- - lib/pact_broker/matrix/aggregated_row.rb
922
916
  - lib/pact_broker/matrix/can_i_deploy_query_schema.rb
923
917
  - lib/pact_broker/matrix/deployment_status_summary.rb
924
918
  - lib/pact_broker/matrix/every_row.rb
925
- - lib/pact_broker/matrix/head_row.rb
926
919
  - lib/pact_broker/matrix/integration.rb
927
920
  - lib/pact_broker/matrix/parse_can_i_deploy_query.rb
928
921
  - lib/pact_broker/matrix/parse_query.rb
@@ -934,7 +927,6 @@ files:
934
927
  - lib/pact_broker/matrix/reason.rb
935
928
  - lib/pact_broker/matrix/repository.rb
936
929
  - lib/pact_broker/matrix/resolved_selector.rb
937
- - lib/pact_broker/matrix/row.rb
938
930
  - lib/pact_broker/matrix/service.rb
939
931
  - lib/pact_broker/matrix/unresolved_selector.rb
940
932
  - lib/pact_broker/messages.rb
@@ -963,6 +955,7 @@ files:
963
955
  - lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb
964
956
  - lib/pact_broker/pacts/pact_publication_wip_dataset_module.rb
965
957
  - lib/pact_broker/pacts/pact_version.rb
958
+ - lib/pact_broker/pacts/pact_version_association_loaders.rb
966
959
  - lib/pact_broker/pacts/pacts_for_verification_repository.rb
967
960
  - lib/pact_broker/pacts/parse.rb
968
961
  - lib/pact_broker/pacts/placeholder_pact.rb
@@ -1229,7 +1222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1229
1222
  - !ruby/object:Gem::Version
1230
1223
  version: '0'
1231
1224
  requirements: []
1232
- rubygems_version: 3.3.9
1225
+ rubygems_version: 3.3.10
1233
1226
  signing_key:
1234
1227
  specification_version: 4
1235
1228
  summary: See description
@@ -1,79 +0,0 @@
1
- require "forwardable"
2
- require "pact_broker/verifications/repository"
3
-
4
- # A collection of matrix rows with the same pact publication id
5
- # It's basically a normalised view of a denormalised view :(
6
- # A pact publication may be the overall latest, and/or the latest for a tag
7
- module PactBroker
8
- module Matrix
9
- class AggregatedRow
10
- extend Forwardable
11
-
12
- delegate [:consumer, :consumer_name, :consumer_version, :consumer_version_number, :consumer_version_order, :consumer_version_tags] => :first_row
13
- delegate [:provider, :provider_name, :provider_version, :provider_version_number, :provider_version_order, :provider_version_tags] => :first_row
14
- delegate [:pact, :pact_version, :pact_revision_number, :webhooks, :latest_triggered_webhooks, :'<=>'] => :first_row
15
- delegate [:verification_id, :verification] => :first_row
16
-
17
- def initialize matrix_rows
18
- @matrix_rows = matrix_rows
19
- @first_row = matrix_rows.first
20
- end
21
-
22
- def overall_latest?
23
- !!matrix_rows.find{ | row| row.consumer_version_tag_name.nil? }
24
- end
25
-
26
- # If this comes back nil, it won't be "cached", but it's a reasonably
27
- # quick query, so it's probably ok.
28
- # The collection of pacts that belong to the same tag can be considered
29
- # a pseudo branch. Find the latest verification for each pseudo branch
30
- # and return the most recent. If this pact is the most recent overall,
31
- # and there were no verifications found for any of the tags, then
32
- # return the most recent verification
33
- def latest_verification_for_pseudo_branch
34
- @latest_verification ||= begin
35
- verification = matrix_rows.collect do | row|
36
- row.verification || latest_verification_for_consumer_version_tag(row)
37
- end.compact.sort_by(&:id).last
38
-
39
- if !verification && overall_latest?
40
- overall_latest_verification
41
- else
42
- verification
43
- end
44
- end
45
- end
46
-
47
- def latest_verification_for_pact_version
48
- @latest_verificaton_for_pact_version ||= begin
49
- matrix_rows.collect(&:verification).compact.sort_by(&:id).last
50
- end
51
- end
52
-
53
- # The list of tag names for which this pact publication is the most recent with that tag
54
- # There could, however, be a later consumer version that does't have a pact (perhaps because it was deleted)
55
- # that has the same tag.
56
- # TODO show a warning when the data is "corrupted" as above.
57
- def consumer_head_tag_names
58
- matrix_rows.collect(&:consumer_version_tag_name).compact
59
- end
60
-
61
- private
62
-
63
- attr_reader :matrix_rows, :first_row
64
-
65
- def latest_verification_for_consumer_version_tag row
66
- row.latest_verification_for_consumer_version_tag if row.consumer_version_tag_name
67
- end
68
-
69
- def overall_latest_verification
70
- # not eager loaded because it shouldn't be called that often
71
- first_row.latest_verification_for_consumer_and_provider
72
- end
73
-
74
- def consumer_version_tag_names
75
- matrix_rows.collect(&:consumer_version_tag_name)
76
- end
77
- end
78
- end
79
- end
@@ -1,80 +0,0 @@
1
- require "pact_broker/matrix/row"
2
- require "pact_broker/webhooks/webhook"
3
-
4
- module PactBroker
5
- module Matrix
6
- # A row for each of the overall latest pacts, and a row for each of the latest tagged pacts
7
- # Rows with a nil consumer_tag_name are the overall latest
8
- class HeadRow < Row
9
- set_dataset(:head_matrix)
10
-
11
- # one_to_one :latest_verification_for_consumer_version_tag,
12
- # :class => "PactBroker::Verifications::LatestVerificationForConsumerVersionTag",
13
- # primary_key: [:provider_id, :consumer_id, :consumer_version_tag_name], key: [:provider_id, :consumer_id, :consumer_version_tag_name]
14
-
15
- # Loading the latest_verification_for_consumer_version_tag objects this way is quicker than
16
- # doing it using an inbult relation with primary_key/key, if we are loading the relation for
17
- # the entire HeadRow table
18
- # Using the inbuilt relation puts constraints on the columns that are not necessary and slow
19
- # the query down.
20
- # This relation relies on consumer_version_tags already being loaded
21
- one_to_one :latest_verification_for_consumer_version_tag, :class => "PactBroker::Verifications::LatestVerificationForConsumerVersionTag", primary_keys: [], key: [], :eager_loader=>(proc do |eo_opts|
22
- # create an index of provider_id/consumer_id/consumer_version_tag_name => row
23
- tag_to_row = eo_opts[:rows].each_with_object({}) { | row, map | map[[row.provider_id, row.consumer_id, row.consumer_version_tag_name]] = row }
24
- # Initialise the association with nil - not sure why?
25
- eo_opts[:rows].each{|row| row.associations[:latest_verification_for_consumer_version_tag] = nil}
26
-
27
- # Need the all then the each to ensure the eager loading works
28
- PactBroker::Verifications::LatestVerificationForConsumerVersionTag.each do | verification |
29
- key = [verification.provider_id, verification.consumer_id, verification.consumer_version_tag_name]
30
- if tag_to_row[key]
31
- tag_to_row[key].associations[:latest_verification_for_consumer_version_tag] = verification
32
- end
33
- end
34
- end)
35
-
36
- # When viewing the index, every webhook in the database will match at least one of the rows, so
37
- # it makes sense to load the entire table and match each webhook to the appropriate row.
38
- # This will only work when using eager loading. The keys are just blanked out to avoid errors.
39
- # I don't understand how they work at all.
40
- # It would be nice to do this declaratively.
41
- many_to_many :webhooks, class: :'PactBroker::Webhooks::Webhook', :left_key => [], left_primary_key: [], :eager_loader=>(proc do |eo_opts|
42
- eo_opts[:rows].each do |row|
43
- row.associations[:webhooks] = []
44
- end
45
-
46
- PactBroker::Webhooks::Webhook.each do | webhook |
47
- eo_opts[:rows].each do | row |
48
- if webhook.is_for?(row)
49
- row.associations[:webhooks] << webhook
50
- end
51
- end
52
- end
53
- end)
54
- end
55
- end
56
- end
57
-
58
- # Table: head_matrix
59
- # Columns:
60
- # consumer_id | integer |
61
- # consumer_name | text |
62
- # consumer_version_id | integer |
63
- # consumer_version_number | text |
64
- # consumer_version_order | integer |
65
- # pact_publication_id | integer |
66
- # pact_version_id | integer |
67
- # pact_version_sha | text |
68
- # pact_revision_number | integer |
69
- # pact_created_at | timestamp without time zone |
70
- # provider_id | integer |
71
- # provider_name | text |
72
- # provider_version_id | integer |
73
- # provider_version_number | text |
74
- # provider_version_order | integer |
75
- # verification_id | integer |
76
- # success | boolean |
77
- # verification_number | integer |
78
- # verification_executed_at | timestamp without time zone |
79
- # verification_build_url | text |
80
- # consumer_version_tag_name | text |