pact_broker 2.83.0 → 2.84.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Dockerfile +1 -1
  4. data/db/migrations/20210816_create_branches_tables.rb +40 -0
  5. data/db/migrations/20210831_add_index_to_pact_publications.rb +7 -0
  6. data/db/migrations/20210908_add_auto_created.rb +24 -0
  7. data/issue-reproduction/Dockerfile-pact-broker +1 -1
  8. data/lib/pact_broker/api/contracts/{verifiable_pacts_json_query_schema.rb → pacts_for_verification_json_query_schema.rb} +1 -1
  9. data/lib/pact_broker/api/contracts/{verifiable_pacts_query_schema.rb → pacts_for_verification_query_string_schema.rb} +1 -1
  10. data/lib/pact_broker/api/decorators/branch_version_decorator.rb +20 -0
  11. data/lib/pact_broker/api/decorators/dashboard_decorator.rb +4 -2
  12. data/lib/pact_broker/api/decorators/embedded_branch_version_decorator.rb +21 -0
  13. data/lib/pact_broker/api/decorators/embedded_tag_decorator.rb +0 -5
  14. data/lib/pact_broker/api/decorators/matrix_decorator.rb +11 -2
  15. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +8 -0
  16. data/lib/pact_broker/api/decorators/{verifiable_pacts_query_decorator.rb → pacts_for_verification_query_decorator.rb} +2 -2
  17. data/lib/pact_broker/api/decorators/version_decorator.rb +1 -1
  18. data/lib/pact_broker/api/pact_broker_urls.rb +8 -0
  19. data/lib/pact_broker/api/resources/branch_version.rb +48 -0
  20. data/lib/pact_broker/api/resources/index.rb +6 -0
  21. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +6 -6
  22. data/lib/pact_broker/api/resources/version.rb +0 -8
  23. data/lib/pact_broker/api.rb +1 -0
  24. data/lib/pact_broker/config/runtime_configuration.rb +12 -0
  25. data/lib/pact_broker/contracts/service.rb +1 -1
  26. data/lib/pact_broker/db/data_migrations/create_branches.rb +97 -0
  27. data/lib/pact_broker/db/data_migrations/set_pacticipant_main_branch.rb +2 -0
  28. data/lib/pact_broker/db/migrate_data.rb +1 -1
  29. data/lib/pact_broker/db/models.rb +6 -0
  30. data/lib/pact_broker/deployments/deployed_version.rb +4 -0
  31. data/lib/pact_broker/deployments/deployed_version_service.rb +4 -3
  32. data/lib/pact_broker/deployments/environment.rb +4 -0
  33. data/lib/pact_broker/deployments/environment_service.rb +13 -8
  34. data/lib/pact_broker/doc/views/index/pacticipant-branch-version.markdown +14 -0
  35. data/lib/pact_broker/doc/views/webhooks.markdown +1 -0
  36. data/lib/pact_broker/domain/index_item.rb +15 -17
  37. data/lib/pact_broker/domain/pacticipant.rb +11 -0
  38. data/lib/pact_broker/domain/tag.rb +1 -2
  39. data/lib/pact_broker/domain/verification.rb +16 -13
  40. data/lib/pact_broker/domain/version.rb +87 -33
  41. data/lib/pact_broker/index/service.rb +8 -4
  42. data/lib/pact_broker/locale/en.yml +1 -0
  43. data/lib/pact_broker/matrix/quick_row.rb +6 -6
  44. data/lib/pact_broker/metrics/service.rb +7 -1
  45. data/lib/pact_broker/pacts/pact_publication.rb +22 -25
  46. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +74 -33
  47. data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +18 -13
  48. data/lib/pact_broker/pacts/pact_publication_wip_dataset_module.rb +16 -4
  49. data/lib/pact_broker/pacts/pact_version.rb +11 -0
  50. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +3 -3
  51. data/lib/pact_broker/pacts/selected_pact.rb +2 -2
  52. data/lib/pact_broker/pacts/selector.rb +98 -33
  53. data/lib/pact_broker/repositories.rb +5 -0
  54. data/lib/pact_broker/services.rb +9 -0
  55. data/lib/pact_broker/test/http_test_data_builder.rb +32 -7
  56. data/lib/pact_broker/test/test_data_builder.rb +25 -24
  57. data/lib/pact_broker/ui/view_models/index_item.rb +11 -0
  58. data/lib/pact_broker/ui/view_models/matrix_branch.rb +39 -0
  59. data/lib/pact_broker/ui/view_models/matrix_line.rb +11 -16
  60. data/lib/pact_broker/ui/views/index/show-with-tags.haml +12 -11
  61. data/lib/pact_broker/ui/views/matrix/show.haml +8 -8
  62. data/lib/pact_broker/version.rb +1 -1
  63. data/lib/pact_broker/versions/branch.rb +29 -0
  64. data/lib/pact_broker/versions/branch_head.rb +45 -0
  65. data/lib/pact_broker/versions/branch_service.rb +24 -0
  66. data/lib/pact_broker/versions/branch_version.rb +64 -0
  67. data/lib/pact_broker/versions/branch_version_repository.rb +34 -0
  68. data/lib/pact_broker/versions/eager_loaders.rb +0 -42
  69. data/lib/pact_broker/versions/repository.rb +25 -12
  70. data/lib/pact_broker/versions/service.rb +3 -22
  71. data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +11 -2
  72. data/lib/sequel/plugins/insert_ignore.rb +4 -0
  73. data/lib/sequel/plugins/upsert.rb +4 -0
  74. data/public/javascripts/index.js +129 -34
  75. data/scaffolding/templates/decorator.rb.erb +3 -1
  76. data/scaffolding/templates/migration.erb +1 -1
  77. data/scaffolding/templates/model.erb +2 -2
  78. data/scaffolding/templates/repository.rb.erb +2 -2
  79. data/scaffolding/templates/repository_spec.rb.erb +1 -1
  80. data/scaffolding/templates/resource.erb +2 -2
  81. data/scaffolding/templates/resource_spec.rb.erb +1 -1
  82. data/scaffolding/templates/service.rb.erb +3 -3
  83. data/scaffolding/templates/service_spec.rb.erb +1 -1
  84. data/script/data/branches.rb +35 -0
  85. data/script/data/issue-494.rb +25 -0
  86. data/spec/features/create_branch_version_spec.rb +29 -0
  87. data/spec/features/create_tag_spec.rb +1 -1
  88. data/spec/features/create_version_spec.rb +2 -4
  89. data/spec/features/get_branch_version_spec.rb +12 -0
  90. data/spec/features/publish_pact_all_in_one_spec.rb +0 -1
  91. data/spec/features/update_version_spec.rb +0 -55
  92. data/spec/fixtures/approvals/modifiable_resources.approved.json +3 -0
  93. data/spec/fixtures/approvals/publish_contract_nothing_exists.approved.json +1 -2
  94. data/spec/fixtures/approvals/publish_contract_nothing_exists_with_webhook.approved.json +1 -2
  95. data/spec/fixtures/approvals/publish_contract_verification_already_exists.approved.json +1 -2
  96. data/spec/fixtures/dashboard.json +4 -2
  97. data/spec/integration/ui/index_spec.rb +0 -2
  98. data/spec/integration/ui/matrix_spec.rb +0 -1
  99. data/spec/lib/pact_broker/api/contracts/{verifiable_pacts_json_query_schema_combinations_spec.rb → pacts_for_verification_json_query_schema_combinations_spec.rb} +6 -6
  100. data/spec/lib/pact_broker/api/contracts/{verifiable_pacts_json_query_schema_spec.rb → pacts_for_verification_json_query_schema_spec.rb} +3 -3
  101. data/spec/lib/pact_broker/api/contracts/{verifiable_pacts_query_schema_spec.rb → pacts_for_verification_query_string_schema_spec.rb} +3 -3
  102. data/spec/lib/pact_broker/api/decorators/dashboard_decorator_spec.rb +7 -7
  103. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +19 -4
  104. data/spec/lib/pact_broker/api/decorators/{verifiable_pacts_query_decorator_spec.rb → pacts_for_verification_query_decorator_spec.rb} +3 -3
  105. data/spec/lib/pact_broker/api/decorators/version_decorator_spec.rb +7 -3
  106. data/spec/lib/pact_broker/contracts/service_spec.rb +24 -3
  107. data/spec/lib/pact_broker/db/data_migrations/create_branches_spec.rb +57 -0
  108. data/spec/lib/pact_broker/domain/index_item_spec.rb +1 -1
  109. data/spec/lib/pact_broker/domain/version_spec.rb +1 -35
  110. data/spec/lib/pact_broker/metrics/service_spec.rb +4 -1
  111. data/spec/lib/pact_broker/pacts/pact_publication_dataset_module_spec.rb +109 -10
  112. data/spec/lib/pact_broker/pacts/pact_publication_selector_dataset_module_spec.rb +3 -2
  113. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +5 -5
  114. data/spec/lib/pact_broker/pacts/repository_find_for_currently_deployed_spec.rb +2 -2
  115. data/spec/lib/pact_broker/pacts/repository_find_for_currently_supported_releases_spec.rb +2 -2
  116. data/spec/lib/pact_broker/pacts/selector_spec.rb +45 -3
  117. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +5 -5
  118. data/spec/lib/pact_broker/relationships/groupify_spec.rb +0 -5
  119. data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +15 -3
  120. data/spec/lib/pact_broker/verifications/repository_spec.rb +1 -1
  121. data/spec/lib/pact_broker/versions/branch_service_spec.rb +71 -0
  122. data/spec/lib/pact_broker/versions/branch_version_repository_spec.rb +81 -0
  123. data/spec/lib/pact_broker/versions/branch_version_spec.rb +27 -0
  124. data/spec/lib/pact_broker/versions/repository_spec.rb +91 -6
  125. data/spec/lib/pact_broker/versions/service_spec.rb +4 -3
  126. data/spec/lib/pact_broker/webhooks/render_spec.rb +6 -0
  127. data/spec/lib/sequel/plugins/upsert_spec.rb +11 -5
  128. data/spec/migrations/44_add_provider_version_to_verification_spec.rb +6 -9
  129. metadata +42 -15
  130. data/lib/pact_broker/versions/lazy_loaders.rb +0 -13
@@ -16,28 +16,31 @@ module PactBroker
16
16
  # Do the "latest" logic last so that the provider/consumer criteria get included in the "latest" query before the join, rather than after
17
17
  query = query.latest_for_main_branches if selector.latest_for_main_branch?
18
18
  query = query.latest_for_consumer_branch(selector.branch) if selector.latest_for_branch?
19
- query = query.latest_for_consumer_tag(selector.tag) if selector.latest_for_tag?
19
+ query = query.for_latest_consumer_versions_with_tag(selector.tag) if selector.latest_for_tag?
20
20
  query = query.overall_latest if selector.overall_latest?
21
21
  query
22
22
  end
23
23
  # rubocop: enable Metrics/CyclomaticComplexity
24
24
 
25
+ # Updated logic - the pacts for the latest version of each main branch,
26
+ # not the latest pact that belongs to the main branch.
25
27
  def latest_for_main_branches
26
- self_join = {
27
- Sequel[:pact_publications][:provider_id] => Sequel[:pp2][:provider_id],
28
- Sequel[:pact_publications][:consumer_id] => Sequel[:pp2][:consumer_id],
29
- Sequel[:cv][:branch] => Sequel[:pp2][:branch]
30
- }
31
-
32
- base_query = join_consumers(:consumers)
33
- .join_consumer_versions(:cv, { Sequel[:cv][:branch] => Sequel[:consumers][:main_branch] })
28
+ consumers_join = { Sequel[:pact_publications][:consumer_id] => Sequel[:consumers][:id] }
34
29
 
35
- base_query = base_query.select_all_qualified if no_columns_selected?
30
+ branch_heads_join = {
31
+ Sequel[:pact_publications][:consumer_version_id] => Sequel[:branch_heads][:version_id],
32
+ Sequel[:consumers][:main_branch] => Sequel[:branch_heads][:branch_name]
33
+ }
36
34
 
37
- base_query.left_join(base_query.select(:provider_id, :consumer_id, Sequel[:cv][:branch], :consumer_version_order), self_join, { table_alias: :pp2 }) do
38
- Sequel[:pp2][:consumer_version_order] > Sequel[:pact_publications][:consumer_version_order]
35
+ query = self
36
+ if no_columns_selected?
37
+ query = query.select_all_qualified.select_append(Sequel[:branch_heads][:branch_name].as(:branch_name))
39
38
  end
40
- .where(Sequel[:pp2][:consumer_version_order] => nil)
39
+
40
+ query
41
+ .join(:pacticipants, consumers_join, { table_alias: :consumers })
42
+ .join(:branch_heads, branch_heads_join)
43
+ .remove_overridden_revisions_from_complete_query
41
44
  end
42
45
 
43
46
  def for_currently_deployed_versions(environment_name)
@@ -60,6 +63,7 @@ module PactBroker
60
63
  .join(:deployed_versions, deployed_versions_join)
61
64
  .join(:currently_deployed_version_ids, currently_deployed_versions_join)
62
65
  .join(:environments, environments_join)
66
+ .remove_overridden_revisions_from_complete_query
63
67
  end
64
68
 
65
69
  def for_currently_supported_versions(environment_name)
@@ -79,6 +83,7 @@ module PactBroker
79
83
  query
80
84
  .join(:released_versions, released_versions_join)
81
85
  .join(:environments, environments_join)
86
+ .remove_overridden_revisions_from_complete_query
82
87
  end
83
88
 
84
89
  def for_environment(environment_name)
@@ -16,14 +16,22 @@ module PactBroker
16
16
  from_self(alias: :pp)
17
17
  .select(Sequel[:pp].*)
18
18
  .join_successful_non_wip_verifications_for_provider_id(provider_id)
19
- .join_provider_versions_for_provider_id(provider_id) do
20
- Sequel.lit("provider_versions.branch != ?", provider_version_branch)
21
- end
19
+ .join_provider_versions_for_provider_id(provider_id)
20
+ .join_branch_versions_excluding_branch(provider_version_branch)
22
21
  .where(Sequel[:pp][:provider_id] => provider_id)
23
22
  .verified_before_creation_date_of(first_version_for_branch)
24
23
  .distinct
25
24
  end
26
25
 
26
+ def join_branch_versions_excluding_branch(branch_name)
27
+ branch_versions_join = {
28
+ Sequel[:provider_versions][:id] => Sequel[:branch_versions][:version_id]
29
+ }
30
+ join(:branch_versions, branch_versions_join) do
31
+ Sequel.lit("branch_versions.branch_name != ?", branch_name)
32
+ end
33
+ end
34
+
27
35
  def successfully_verified_by_provider_tag_when_not_wip(provider_id, provider_tag)
28
36
  from_self(alias: :pp)
29
37
  .select(Sequel[:pp].*)
@@ -80,10 +88,14 @@ module PactBroker
80
88
  def join_provider_versions_for_provider_id_and_branch(provider_id, provider_version_branch)
81
89
  versions_join = {
82
90
  Sequel[:verifications][:provider_version_id] => Sequel[:provider_versions][:id],
83
- Sequel[:provider_versions][:branch] => provider_version_branch,
84
91
  Sequel[:provider_versions][:pacticipant_id] => provider_id
85
92
  }
93
+ branch_versions_join = {
94
+ Sequel[:provider_versions][:id] => Sequel[:branch_versions][:version_id],
95
+ Sequel[:branch_versions][:branch_name] => provider_version_branch
96
+ }
86
97
  join(:versions, versions_join, { table_alias: :provider_versions } )
98
+ .join(:branch_versions, branch_versions_join)
87
99
  end
88
100
 
89
101
  def join_provider_versions_for_provider_id(provider_id, &block)
@@ -2,6 +2,7 @@ require "sequel"
2
2
  require "pact_broker/repositories/helpers"
3
3
  require "pact_broker/verifications/latest_verification_for_pact_version"
4
4
  require "pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version"
5
+ require "pact_broker/pacts/content"
5
6
 
6
7
  module PactBroker
7
8
  module Pacts
@@ -125,6 +126,16 @@ module PactBroker
125
126
  .join_successful_verifications
126
127
  .any?
127
128
  end
129
+
130
+ def set_interactions_and_messages_counts!
131
+ if interactions_count.nil? || messages_count.nil?
132
+ content_object = PactBroker::Pacts::Content.from_json(content)
133
+ update(
134
+ messages_count: content_object.messages&.count || 0,
135
+ interactions_count: content_object.interactions&.count || 0
136
+ )
137
+ end
138
+ end
128
139
  end
129
140
  end
130
141
  end
@@ -215,7 +215,7 @@ module PactBroker
215
215
  if pact_publication.values[:tag_name]
216
216
  Selectors.create_for_latest_for_tag(pact_publication.values[:tag_name])
217
217
  else
218
- Selectors.create_for_latest_for_branch(pact_publication.consumer_version.branch)
218
+ Selectors.create_for_latest_for_branch(pact_publication.values.fetch(:branch_name))
219
219
  end
220
220
  end
221
221
 
@@ -285,8 +285,8 @@ module PactBroker
285
285
  pact_publications_query.eager(:provider).eager(:consumer).eager(:consumer_version).order(:consumer_version_order).all.sort.collect do |p|
286
286
  suffix = if p.values[:tag_name]
287
287
  " (tag #{p.values[:tag_name]})"
288
- elsif p.values[:branch]
289
- " (branch #{p.values[:branch]})"
288
+ elsif p.values[:branch_name]
289
+ " (branch #{p.values[:branch_name]})"
290
290
  else
291
291
  ""
292
292
  end
@@ -15,8 +15,8 @@ module PactBroker
15
15
  selected_pacts
16
16
  .group_by{ |p| [p.consumer_name, p.pact_version_sha] }
17
17
  .values
18
- .collect do | selected_pacts_for_pact_version_id |
19
- SelectedPact.merge(selected_pacts_for_pact_version_id)
18
+ .collect do | selected_pacts_for_pact_version_sha |
19
+ SelectedPact.merge(selected_pacts_for_pact_version_sha)
20
20
  end
21
21
  .sort
22
22
  end
@@ -2,6 +2,7 @@ require "pact_broker/hash_refinements"
2
2
 
3
3
  module PactBroker
4
4
  module Pacts
5
+ # rubocop: disable Metrics/ClassLength
5
6
  class Selector < Hash
6
7
  using PactBroker::HashRefinements
7
8
 
@@ -266,51 +267,89 @@ module PactBroker
266
267
  other.class == self.class && super
267
268
  end
268
269
 
269
- # rubocop: disable Metrics/CyclomaticComplexity, Metrics/MethodLength
270
+ # rubocop: disable Metrics/CyclomaticComplexity
270
271
  def <=> other
272
+ # elsif consumer || other.consumer
273
+ # consumer_comparison(other)
271
274
  if overall_latest? || other.overall_latest?
272
- if overall_latest? == other.overall_latest?
273
- 0
274
- else
275
- overall_latest? ? -1 : 1
276
- end
275
+ overall_latest_comparison(other)
277
276
  elsif latest_for_branch? || other.latest_for_branch?
278
- if latest_for_branch? == other.latest_for_branch?
279
- branch <=> other.branch
280
- else
281
- latest_for_branch? ? -1 : 1
282
- end
277
+ branch_comparison(other)
278
+ elsif latest_for_tag? || other.latest_for_tag?
279
+ latest_for_tag_comparison(other)
280
+ elsif tag || other.tag
281
+ tag_comparison(other)
283
282
  elsif currently_deployed? || other.currently_deployed?
284
- if currently_deployed? == other.currently_deployed?
285
- environment_name <=> other.environment_name
286
- else
287
- currently_deployed? ? -1 : 1
288
- end
283
+ currently_deployed_comparison(other)
289
284
  elsif currently_supported? || other.currently_supported?
290
- if currently_supported? == other.currently_supported?
291
- environment_name <=> other.environment_name
292
- else
293
- currently_supported? ? -1 : 1
294
- end
295
- elsif latest_for_tag? || other.latest_for_tag?
296
- if latest_for_tag? == other.latest_for_tag?
297
- tag <=> other.tag
285
+ currently_supported_comparison(other)
286
+ else
287
+ 0
288
+ end
289
+ end
290
+ # rubocop: enable Metrics/CyclomaticComplexity
291
+
292
+ private
293
+
294
+ def overall_latest_comparison(other)
295
+ if overall_latest? == other.overall_latest?
296
+ 0
297
+ else
298
+ overall_latest? ? -1 : 1
299
+ end
300
+ end
301
+
302
+ def branch_comparison(other)
303
+ if latest_for_branch? == other.latest_for_branch?
304
+ branch <=> other.branch
305
+ else
306
+ latest_for_branch? ? -1 : 1
307
+ end
308
+ end
309
+
310
+ def currently_deployed_comparison(other)
311
+ if currently_deployed? == other.currently_deployed?
312
+ environment_name <=> other.environment_name
313
+ else
314
+ currently_deployed? ? -1 : 1
315
+ end
316
+ end
317
+
318
+ def currently_supported_comparison(other)
319
+ if currently_supported? == other.currently_supported?
320
+ environment_name <=> other.environment_name
321
+ else
322
+ currently_supported? ? -1 : 1
323
+ end
324
+ end
325
+
326
+ def latest_for_tag_comparison(other)
327
+ if latest_for_tag? == other.latest_for_tag?
328
+ tag <=> other.tag
329
+ else
330
+ latest_for_tag? ? -1 : 1
331
+ end
332
+ end
333
+
334
+ def tag_comparison(other)
335
+ if tag && other.tag
336
+ if tag == other.tag
337
+ consumer_comparison(other)
298
338
  else
299
- latest_for_tag? ? -1 : 1
300
- end
301
- elsif consumer || other.consumer
302
- if consumer == other.consumer
303
339
  tag <=> other.tag
304
- else
305
- consumer ? -1 : 1
306
340
  end
307
341
  else
308
- tag <=> other.tag
342
+ tag ? -1 : 1
309
343
  end
310
344
  end
311
- # rubocop: enable Metrics/CyclomaticComplexity, Metrics/MethodLength
312
345
 
313
- private
346
+ def consumer_comparison(other)
347
+ if consumer == other.consumer
348
+ 0
349
+ else
350
+ consumer ? -1 : 1
351
+ end
352
+ end
314
353
 
315
354
  def latest?
316
355
  !!self[:latest]
@@ -347,6 +386,32 @@ module PactBroker
347
386
  comparison
348
387
  end
349
388
  end
389
+
390
+ def currently_deployed_comparison(other)
391
+ if currently_deployed? == other.currently_deployed?
392
+ production_comparison(other)
393
+ else
394
+ currently_deployed? ? -1 : 1
395
+ end
396
+
397
+ end
398
+
399
+ def currently_supported_comparison(other)
400
+ if currently_supported? == other.currently_supported?
401
+ production_comparison(other)
402
+ else
403
+ currently_supported? ? -1 : 1
404
+ end
405
+ end
406
+
407
+ def production_comparison(other)
408
+ if environment.production? == other.environment.production?
409
+ environment.name <=> other.environment.name
410
+ else
411
+ environment.production? ? 1 : -1
412
+ end
413
+ end
350
414
  end
415
+ # rubocop: enable Metrics/ClassLength
351
416
  end
352
417
  end
@@ -42,6 +42,11 @@ module PactBroker
42
42
  Matrix::Repository.new
43
43
  end
44
44
 
45
+ def branch_version_repository
46
+ require "pact_broker/versions/branch_version_repository"
47
+ PactBroker::Versions::BranchVersionRepository.new
48
+ end
49
+
45
50
  extend self
46
51
  end
47
52
  end
@@ -89,6 +89,10 @@ module PactBroker
89
89
  get(:contract_service)
90
90
  end
91
91
 
92
+ def branch_service
93
+ get(:branch_service)
94
+ end
95
+
92
96
  # rubocop: disable Metrics/MethodLength
93
97
  def register_default_services
94
98
  register_service(:index_service) do
@@ -185,6 +189,11 @@ module PactBroker
185
189
  require "pact_broker/contracts/service"
186
190
  PactBroker::Contracts::Service
187
191
  end
192
+
193
+ register_service(:branch_service) do
194
+ require "pact_broker/versions/branch_service"
195
+ PactBroker::Versions::BranchService
196
+ end
188
197
  end
189
198
  # rubocop: enable Metrics/MethodLength
190
199
  end
@@ -3,6 +3,7 @@ require "faraday_middleware"
3
3
  require "logger"
4
4
  require "erb"
5
5
  require "yaml"
6
+ require "base64"
6
7
 
7
8
  module PactBroker
8
9
  module Test
@@ -53,11 +54,12 @@ module PactBroker
53
54
  self
54
55
  end
55
56
 
56
- def create_version(pacticipant:, version:, branch:)
57
- request_body = {
58
- branch: branch
59
- }
60
- client.put("pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}", request_body).tap { |response| check_for_error(response) }
57
+ def create_version(pacticipant:, version:, branch: nil)
58
+ if branch
59
+ client.put("pacticipants/#{encode(pacticipant)}/branches/#{encode(branch)}/versions/#{encode(version)}", {}).tap { |response| check_for_error(response) }
60
+ else
61
+ client.put("pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}").tap { |response| check_for_error(response) }
62
+ end
61
63
  self
62
64
  end
63
65
 
@@ -100,6 +102,29 @@ module PactBroker
100
102
  self
101
103
  end
102
104
 
105
+ def publish_contract(consumer: last_consumer_name, consumer_version:, provider: last_provider_name, content_id:, tag: nil, branch: nil)
106
+ content = generate_content(consumer, provider, content_id)
107
+ request_body_hash = {
108
+ :pacticipantName => consumer,
109
+ :pacticipantVersionNumber => consumer_version,
110
+ :branch => branch,
111
+ :tags => tag ? [tag] : nil,
112
+ :contracts => [
113
+ {
114
+ :consumerName => consumer,
115
+ :providerName => provider,
116
+ :specification => "pact",
117
+ :contentType => "application/json",
118
+ :content => Base64.strict_encode64(content.to_json)
119
+ }
120
+ ]
121
+ }.compact
122
+ response = client.post("contracts/publish", request_body_hash).tap { |resp| check_for_error(resp) }
123
+ puts response.body["logs"].collect{ |log| log["message"]}
124
+ separate
125
+ self
126
+ end
127
+
103
128
  def publish_pact(consumer: last_consumer_name, consumer_version:, provider: last_provider_name, content_id:, tag: nil, branch: nil)
104
129
  @last_consumer_name = consumer
105
130
  @last_provider_name = provider
@@ -120,7 +145,7 @@ module PactBroker
120
145
  self
121
146
  end
122
147
 
123
- def get_pacts_for_verification(provider: last_provider_name, provider_version_tag: nil, provider_version_branch: nil, consumer_version_selectors: [], enable_pending: false, include_wip_pacts_since: nil)
148
+ def get_pacts_for_verification(provider: last_provider_name, provider_version_tag: nil, provider_version_branch: nil, consumer_version_selectors: nil, enable_pending: false, include_wip_pacts_since: nil)
124
149
  @last_provider_name = provider
125
150
  @last_provider_version_tag = provider_version_tag
126
151
  @last_provder_version_branch = provider_version_branch
@@ -258,7 +283,7 @@ module PactBroker
258
283
  def can_i_deploy(pacticipant:, version:, to: nil, to_environment: nil)
259
284
  can_i_deploy_response = client.get("can-i-deploy", { pacticipant: pacticipant, version: version, to: to, environment: to_environment}.compact ).tap { |response| check_for_error(response) }
260
285
  can = !!(can_i_deploy_response.body["summary"] || {})["deployable"]
261
- puts "can-i-deploy #{pacticipant} version #{version} to #{to}: #{can ? 'yes' : 'no'}"
286
+ puts "can-i-deploy #{pacticipant} version #{version} to #{to || to_environment}: #{can ? 'yes' : 'no'}"
262
287
  summary = can_i_deploy_response.body["summary"]
263
288
  verification_result_urls = (can_i_deploy_response.body["matrix"] || []).collect do | row |
264
289
  row.dig("verificationResult", "_links", "self", "href")
@@ -29,6 +29,7 @@ require "pact_broker/matrix/row"
29
29
  require "pact_broker/deployments/environment_service"
30
30
  require "pact_broker/deployments/deployed_version_service"
31
31
  require "pact_broker/deployments/released_version_service"
32
+ require "pact_broker/versions/branch_version_repository"
32
33
  require "ostruct"
33
34
 
34
35
  module PactBroker
@@ -162,37 +163,17 @@ module PactBroker
162
163
  end
163
164
 
164
165
  def create_version version_number = "1.0.#{model_counter}", params = {}
165
- params.delete(:comment)
166
- @version = PactBroker::Domain::Version.create(:number => version_number, :pacticipant => @pacticipant)
166
+ @version = create_pacticipant_version(version_number, pacticipant, params)
167
167
  self
168
168
  end
169
169
 
170
170
  def create_consumer_version version_number = "1.0.#{model_counter}", params = {}
171
- params.delete(:comment)
172
- tag_names = [params.delete(:tag_names), params.delete(:tag_name)].flatten.compact
173
- @consumer_version = PactBroker::Domain::Version.create(
174
- number: version_number,
175
- pacticipant: @consumer,
176
- branch: params[:branch],
177
- build_url: params[:build_url]
178
- )
179
- set_created_at_if_set params[:created_at], :versions, { id: @consumer_version.id }
180
- tag_names.each do | tag_name |
181
- tag = PactBroker::Domain::Tag.create(name: tag_name, version: consumer_version)
182
- set_created_at_if_set(params[:created_at], :tags, { name: tag.name, version_id: consumer_version.id })
183
- end
171
+ @consumer_version = create_pacticipant_version(version_number, consumer, params)
184
172
  self
185
173
  end
186
174
 
187
175
  def create_provider_version version_number = "1.0.#{model_counter}", params = {}
188
- params.delete(:comment)
189
- tag_names = [params.delete(:tag_names), params.delete(:tag_name)].flatten.compact
190
- @version = PactBroker::Domain::Version.create(:number => version_number, :pacticipant => @provider, branch: params[:branch])
191
- @provider_version = @version
192
- tag_names.each do | tag_name |
193
- tag = PactBroker::Domain::Tag.create(name: tag_name, version: provider_version)
194
- set_created_at_if_set(params[:created_at], :tags, { name: tag.name, version_id: provider_version.id })
195
- end
176
+ @provider_version = create_pacticipant_version(version_number, provider, params)
196
177
  self
197
178
  end
198
179
 
@@ -376,7 +357,7 @@ module PactBroker
376
357
  pact_version = PactBroker::Pacts::Repository.new.find_pact_version(@consumer, @provider, pact.pact_version_sha)
377
358
  @verification = PactBroker::Verifications::Repository.new.create(verification, provider_version_number, pact_version)
378
359
  @provider_version = PactBroker::Domain::Version.where(pacticipant_id: @provider.id, number: provider_version_number).single_record
379
- @provider_version.update(branch: branch) if branch
360
+ PactBroker::Versions::BranchVersionRepository.new.add_branch(@provider_version, branch) if branch
380
361
 
381
362
  set_created_at_if_set(parameters[:created_at], :verifications, id: @verification.id)
382
363
  set_created_at_if_set(parameters[:created_at], :versions, id: @provider_version.id)
@@ -542,6 +523,26 @@ module PactBroker
542
523
 
543
524
  private
544
525
 
526
+ def create_pacticipant_version(version_number, pacticipant, params = {})
527
+ params.delete(:comment)
528
+ tag_names = [params.delete(:tag_names), params.delete(:tag_name)].flatten.compact
529
+ args = {
530
+ number: version_number,
531
+ pacticipant_id: pacticipant.id,
532
+ branch: params[:branch],
533
+ build_url: params[:build_url]
534
+ }
535
+
536
+ version = PactBroker::Versions::Repository.new.create(args)
537
+
538
+ set_created_at_if_set params[:created_at], :versions, { id: version.id }
539
+ tag_names.each do | tag_name |
540
+ tag = PactBroker::Domain::Tag.create(name: tag_name, version: version)
541
+ set_created_at_if_set(params[:created_at], :tags, { name: tag.name, version_id: version.id })
542
+ end
543
+ version
544
+ end
545
+
545
546
  def create_deployed_version(uuid: , currently_deployed: , version:, environment_name: , target: nil, created_at: nil)
546
547
  env = find_environment(environment_name)
547
548
  @deployed_version = PactBroker::Deployments::DeployedVersionService.find_or_create(uuid, version, env, target)