pact_broker 2.52.2 → 2.56.1

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +81 -0
  3. data/README.md +2 -4
  4. data/lib/pact_broker/api.rb +8 -0
  5. data/lib/pact_broker/api/contracts/webhook_contract.rb +8 -6
  6. data/lib/pact_broker/api/decorators/decorator_context.rb +6 -11
  7. data/lib/pact_broker/api/decorators/reason_decorator.rb +17 -0
  8. data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +6 -1
  9. data/lib/pact_broker/api/pact_broker_urls.rb +6 -2
  10. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +14 -14
  11. data/lib/pact_broker/api/resources/badge.rb +6 -2
  12. data/lib/pact_broker/api/resources/base_resource.rb +8 -3
  13. data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
  14. data/lib/pact_broker/api/resources/matrix_badge.rb +5 -0
  15. data/lib/pact_broker/api/resources/pact.rb +3 -19
  16. data/lib/pact_broker/api/resources/pacticipant.rb +0 -4
  17. data/lib/pact_broker/api/resources/verifications.rb +0 -4
  18. data/lib/pact_broker/app.rb +13 -4
  19. data/lib/pact_broker/badges/service.rb +16 -13
  20. data/lib/pact_broker/db.rb +9 -1
  21. data/lib/pact_broker/doc/controllers/app.rb +11 -1
  22. data/lib/pact_broker/doc/views/layouts/main.haml +1 -1
  23. data/lib/pact_broker/domain/verification.rb +13 -0
  24. data/lib/pact_broker/integrations/service.rb +2 -2
  25. data/lib/pact_broker/locale/en.yml +1 -1
  26. data/lib/pact_broker/logging.rb +3 -1
  27. data/lib/pact_broker/matrix/deployment_status_summary.rb +23 -1
  28. data/lib/pact_broker/matrix/reason.rb +9 -0
  29. data/lib/pact_broker/matrix/unresolved_selector.rb +4 -0
  30. data/lib/pact_broker/pacticipants/repository.rb +6 -0
  31. data/lib/pact_broker/pacticipants/service.rb +8 -0
  32. data/lib/pact_broker/pacts/content.rb +26 -2
  33. data/lib/pact_broker/pacts/repository.rb +5 -4
  34. data/lib/pact_broker/tasks/migration_task.rb +20 -1
  35. data/lib/pact_broker/test/test_data_builder.rb +1 -1
  36. data/lib/pact_broker/ui/app.rb +1 -0
  37. data/lib/pact_broker/ui/controllers/base_controller.rb +3 -0
  38. data/lib/pact_broker/ui/controllers/clusters.rb +2 -2
  39. data/lib/pact_broker/ui/controllers/groups.rb +3 -2
  40. data/lib/pact_broker/ui/controllers/index.rb +3 -2
  41. data/lib/pact_broker/ui/controllers/matrix.rb +19 -3
  42. data/lib/pact_broker/ui/helpers/url_helper.rb +4 -4
  43. data/lib/pact_broker/ui/view_models/index_item.rb +16 -11
  44. data/lib/pact_broker/ui/view_models/index_items.rb +2 -2
  45. data/lib/pact_broker/ui/view_models/matrix_line.rb +12 -7
  46. data/lib/pact_broker/ui/view_models/matrix_lines.rb +2 -2
  47. data/lib/pact_broker/ui/views/groups/show.html.erb +3 -3
  48. data/lib/pact_broker/ui/views/index/_css_and_js.haml +9 -9
  49. data/lib/pact_broker/ui/views/index/_navbar.haml +3 -3
  50. data/lib/pact_broker/ui/views/index/_pagination.haml +1 -1
  51. data/lib/pact_broker/ui/views/index/show-with-tags.haml +3 -3
  52. data/lib/pact_broker/ui/views/index/show.haml +3 -3
  53. data/lib/pact_broker/ui/views/layouts/main.haml +4 -4
  54. data/lib/pact_broker/ui/views/matrix/show.haml +14 -11
  55. data/lib/pact_broker/verifications/repository.rb +4 -5
  56. data/lib/pact_broker/version.rb +1 -1
  57. data/lib/pact_broker/webhooks/service.rb +4 -3
  58. data/lib/pact_broker/webhooks/webhook_event.rb +1 -1
  59. data/lib/pact_broker/webhooks/webhook_request_logger.rb +8 -8
  60. data/pact_broker.gemspec +2 -2
  61. data/public/javascripts/pact.js +7 -6
  62. data/public/stylesheets/matrix.css +13 -0
  63. data/script/foo-bar-verification.json +3 -1
  64. data/script/foo-bar.json +11 -0
  65. data/script/seed.rb +1 -1
  66. data/spec/features/create_webhook_spec.rb +1 -1
  67. data/spec/features/delete_integration_spec.rb +2 -2
  68. data/spec/features/get_matrix_badge_spec.rb +9 -0
  69. data/spec/fixtures/webhook_valid.json +1 -1
  70. data/spec/fixtures/webhook_valid_with_pacticipants.json +1 -1
  71. data/spec/integration/ui/index_spec.rb +16 -0
  72. data/spec/integration/ui/matrix_spec.rb +11 -4
  73. data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +12 -0
  74. data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +1 -1
  75. data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +18 -1
  76. data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +1 -1
  77. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +8 -0
  78. data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +1 -1
  79. data/spec/lib/pact_broker/api/resources/badge_spec.rb +42 -22
  80. data/spec/lib/pact_broker/api/resources/latest_pact_spec.rb +1 -0
  81. data/spec/lib/pact_broker/api/resources/pact_spec.rb +1 -0
  82. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +1 -1
  83. data/spec/lib/pact_broker/badges/service_spec.rb +15 -3
  84. data/spec/lib/pact_broker/doc/controllers/app_spec.rb +16 -0
  85. data/spec/lib/pact_broker/domain/version_spec.rb +7 -7
  86. data/spec/lib/pact_broker/integrations/service_spec.rb +6 -0
  87. data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +6 -2
  88. data/spec/lib/pact_broker/matrix/integration_spec.rb +43 -0
  89. data/spec/lib/pact_broker/pacts/content_spec.rb +125 -0
  90. data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +18 -1
  91. data/spec/lib/pact_broker/verifications/repository_spec.rb +20 -0
  92. data/spec/lib/pact_broker/webhooks/webhook_request_logger_spec.rb +4 -1
  93. data/vendor/hal-browser/README.adoc +169 -0
  94. data/vendor/hal-browser/browser.html +36 -22
  95. data/vendor/hal-browser/js/hal.js +30 -7
  96. data/vendor/hal-browser/js/hal/http/client.js +14 -6
  97. data/vendor/hal-browser/js/hal/resource.js +4 -2
  98. data/vendor/hal-browser/js/hal/views/documentation.js +1 -1
  99. data/vendor/hal-browser/js/hal/views/embedded_resource.js +10 -4
  100. data/vendor/hal-browser/js/hal/views/links.js +3 -2
  101. data/vendor/hal-browser/js/hal/views/non_safe_request_dialog.js +1 -1
  102. data/vendor/hal-browser/js/hal/views/properties.js +101 -2
  103. data/vendor/hal-browser/js/hal/views/query_uri_dialog.js +1 -1
  104. data/vendor/hal-browser/js/hal/views/request_headers.js +1 -1
  105. data/vendor/hal-browser/js/hal/views/resource.js +4 -3
  106. data/vendor/hal-browser/js/hal/views/response_headers.js +12 -1
  107. data/vendor/hal-browser/login.html +76 -0
  108. data/vendor/hal-browser/styles.css +3 -1
  109. data/vendor/hal-browser/vendor/js/URI.min.js +84 -0
  110. metadata +28 -27
  111. data/lib/pact_broker/verifications/all_verifications.rb +0 -41
  112. data/vendor/hal-browser/README.md +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afd447b5cac167d4f764356d1c15c826a7de019d1871c684853ef602862cf387
4
- data.tar.gz: '07328be4c8851d55e5a5834f69ce83e22df99c93cf83a21a657e1587f7afd8b3'
3
+ metadata.gz: 78ca82ae8d3f9574d9844689ebb3423e5a2c2966f5907253f82e996aa0dbdcd4
4
+ data.tar.gz: 64a1cec77d11ae9f82e4408736147afe69d294def7b07afa31bdab1c38947a72
5
5
  SHA512:
6
- metadata.gz: 9b8420208b660677ba8f93373346ad39e80069ba282dd9ebd7206bf65ebdf05f7803c303c1e6e0a4ebc7f69d3ff6ea2b55ecfe4e56a2735975827bad26e10370
7
- data.tar.gz: fecbcc5f5a4824d2dc3669d6bb4bb15456ad1434031dad96e71bd571e9f92fd73d1b90b142f0d0359d6943ab618768ba607f99119fa61ffb56f75f6fb8e29ef3
6
+ metadata.gz: c43133723319d295e3e3a9a818ef668e5f15b75b65589c90d77902737e807145e5647b92e4d7c80880e9886a4e75c20f23140716310f5c28dc77cd8a726e381c
7
+ data.tar.gz: 92cd37b6e992d89886fe7f9f6f9b220879b92c48f081c64ea344201229e45d8ca6a12fb676d0cecdba9d15da0ccd70163e54392acda943d4e66adea46706d9b6
@@ -1,3 +1,84 @@
1
+ <a name="v2.56.1"></a>
2
+ ### v2.56.1 (2020-06-01)
3
+
4
+
5
+ #### Bug Fixes
6
+
7
+ * **matrix ui**
8
+ * fix home link ([67065b7d](/../../commit/67065b7d))
9
+
10
+
11
+ <a name="v2.56.0"></a>
12
+ ### v2.56.0 (2020-06-01)
13
+
14
+
15
+ #### Features
16
+
17
+ * **database**
18
+ * log schema versions and migration info on startup ([b385e535](/../../commit/b385e535))
19
+ * allow options to be passed to Sequel migrate via the MigrationTask ([143613e7](/../../commit/143613e7))
20
+
21
+ * allow Pactflow messages in logs to be hidden by setting PACT_BROKER_HIDE_PACTFLOW_MESSAGES=true ([a7550105](/../../commit/a7550105))
22
+
23
+ * **can-i-deploy**
24
+ * experimental - add a warning message if there are interactions missing verification test results. ([f7ab8cc5](/../../commit/f7ab8cc5))
25
+
26
+
27
+ #### Bug Fixes
28
+
29
+ * use relative URLs when base_url not explictly set to ensure app is not vulnerable to host header attacks ([92c45a0a](/../../commit/92c45a0a))
30
+ * raise PactBroker::Error when either pacticipant is not found in the business layer while attempting to delete an integration ([3c209a46](/../../commit/3c209a46))
31
+
32
+
33
+ <a name="v2.55.0"></a>
34
+ ### v2.55.0 (2020-05-22)
35
+
36
+
37
+ #### Features
38
+
39
+ * support non root context (#344) ([dc480499](/../../commit/dc480499))
40
+
41
+
42
+ <a name="v2.54.0"></a>
43
+ ### v2.54.0 (2020-05-13)
44
+
45
+
46
+ #### Features
47
+
48
+ * **hal browser**
49
+ * update to latest code ([a79ad290](/../../commit/a79ad290))
50
+
51
+
52
+ #### Bug Fixes
53
+
54
+ * update rack for CVE-2020-8161 ([96c3386a](/../../commit/96c3386a))
55
+
56
+ * **hal browser**
57
+ * fix xss vulnerability ([ac564412](/../../commit/ac564412))
58
+
59
+ * **webhooks**
60
+ * add missing validation for event names when creating webhooks ([5fc0563c](/../../commit/5fc0563c))
61
+
62
+
63
+ <a name="v2.53.0"></a>
64
+ ### v2.53.0 (2020-05-12)
65
+
66
+
67
+ #### Features
68
+
69
+ * **badge**
70
+ * include tag names in matrix badge ([cce7cd01](/../../commit/cce7cd01))
71
+
72
+
73
+ #### Bug Fixes
74
+
75
+ * **pacts for verification**
76
+ * ensure a separate pact URL is returned for each consumer when multiple consumers share the same pact json content ([13e7b640](/../../commit/13e7b640))
77
+
78
+ * gracefully handle fetching matrix badge when specified pact does not exist ([e8ec4101](/../../commit/e8ec4101))
79
+ * include the base URL in the link to the webhook docs ([5363ab2e](/../../commit/5363ab2e))
80
+
81
+
1
82
  <a name="v2.52.2"></a>
2
83
  ### v2.52.2 (2020-04-16)
3
84
 
data/README.md CHANGED
@@ -64,8 +64,6 @@ If you don't have a [Pact Broker CI Nerf Gun][nerf], you'll probably want to rea
64
64
 
65
65
  #### Step 3. Back to the Consumer CI build
66
66
 
67
- The following funcationality is in beta release. Your feedback would be appreciated.
68
-
69
67
  1. The Consumer CI determines if the pact has been verified by running `pact-broker can-i-deploy --pacticipant CONSUMER_NAME --version CONSUMER_VERSION ...` (see documentation [here](https://github.com/pact-foundation/pact_broker-client#can-i-deploy))
70
68
  1. If the pact has been verified, the deployment can proceed.
71
69
 
@@ -123,8 +121,8 @@ Use the HAL browser to view documentation as you browse.
123
121
  * unix users just use your package manager
124
122
  * Run `git clone git@github.com:pact-foundation/pact_broker.git && cd pact_broker/example`
125
123
  * Run `bundle install`
126
- * Run `bundle exec rackup -p 8080` (this will use a Sqlite database. If you want to try it out with a Postgres database, see the [README](https://github.com/pact-foundation/pact_broker/tree/master/example) in the example directory.)
127
- * Open [http://localhost:8080](http://localhost:8080) and you should see a list containing the pact between the Zoo App and the Animal Service.
124
+ * Run `bundle exec rackup -p 9292 -o 0.0.0.0` (this will use a Sqlite database. If you want to try it out with a Postgres database, see the [README](https://github.com/pact-foundation/pact_broker/tree/master/example) in the example directory.)
125
+ * Open [http://localhost:9292](http://localhost:9292) and you should see a list containing the pact between the Zoo App and the Animal Service.
128
126
  * Click on the arrow to see the generated HTML documentation.
129
127
  * Click on either service to see an autogenerated network diagram.
130
128
  * Click on the HAL Browser link to have a poke around the API.
@@ -3,6 +3,14 @@ require 'webmachine/rack_adapter_monkey_patch'
3
3
  require 'pact_broker/api/resources'
4
4
  require 'pact_broker/feature_toggle'
5
5
 
6
+ module Webmachine
7
+ class Request
8
+ def patch?
9
+ method == "PATCH"
10
+ end
11
+ end
12
+ end
13
+
6
14
  module PactBroker
7
15
 
8
16
  API ||= begin
@@ -2,6 +2,7 @@ require 'pact_broker/api/contracts/base_contract'
2
2
  require 'pact_broker/webhooks/check_host_whitelist'
3
3
  require 'pact_broker/webhooks/render'
4
4
  require 'pact_broker/pacticipants/service'
5
+ require 'pact_broker/webhooks/webhook_event'
5
6
 
6
7
  module PactBroker
7
8
  module Api
@@ -13,11 +14,13 @@ module PactBroker
13
14
  # I just cannot seem to get the validation to stop on the first error.
14
15
  # If one rule fails, they all come back failed, and it's driving me nuts.
15
16
  # Why on earth would I want that behaviour?
16
- new_errors = Reform::Contract::Errors.new
17
- errors.messages.each do | key, value |
18
- new_errors.add(key, value.first)
17
+ # I cannot believe I have to do this shit.
18
+ @first_errors = errors
19
+ @first_errors.messages.keys.each do | key |
20
+ @first_errors.messages[key] = @first_errors.messages[key][0...1]
19
21
  end
20
- @errors = new_errors
22
+
23
+ def self.errors; @first_errors end
21
24
  result
22
25
  end
23
26
 
@@ -46,7 +49,6 @@ module PactBroker
46
49
 
47
50
  required(:name).filled(:pacticipant_exists?)
48
51
  end
49
-
50
52
  end
51
53
 
52
54
  property :provider do
@@ -155,7 +157,7 @@ module PactBroker
155
157
  property :name
156
158
 
157
159
  validation do
158
- required(:name).filled
160
+ required(:name).filled(included_in?: PactBroker::Webhooks::WebhookEvent::EVENT_NAMES)
159
161
  end
160
162
  end
161
163
  end
@@ -1,20 +1,15 @@
1
1
  module PactBroker
2
2
  module Api
3
3
  module Decorators
4
-
5
4
  class DecoratorContext < Hash
6
5
 
7
- attr_reader :base_url, :resource_url, :resource_title
6
+ attr_reader :base_url, :resource_url, :resource_title, :env
8
7
 
9
- def initialize base_url, resource_url, options = {}
10
- @base_url = base_url
11
- self[:base_url] = base_url
12
- @resource_url = resource_url
13
- self[:resource_url] = resource_url
14
- if options[:resource_title]
15
- @resource_title = options[:resource_title]
16
- self[:resource_title] = resource_title
17
- end
8
+ def initialize base_url, resource_url, env, options = {}
9
+ @base_url = self[:base_url] = base_url
10
+ @resource_url = self[:resource_url]= resource_url
11
+ @resource_title = self[:resource_title] = options[:resource_title]
12
+ @env = self[:env] = env
18
13
  merge!(options)
19
14
  end
20
15
 
@@ -22,6 +22,11 @@ module PactBroker
22
22
  "There are no missing dependencies"
23
23
  when PactBroker::Matrix::Successful
24
24
  "All required verification results are published and successful"
25
+ when PactBroker::Matrix::InteractionsMissingVerifications
26
+ descriptions = reason.interactions.collect do | interaction |
27
+ interaction_description(interaction)
28
+ end.join('; ')
29
+ "WARNING: Although the verification was reported as successful, the results for #{reason.consumer_selector.description} and #{reason.provider_selector.description} may be missing tests for the following interactions: #{descriptions}"
25
30
  else
26
31
  reason
27
32
  end
@@ -44,6 +49,18 @@ module PactBroker
44
49
  ""
45
50
  end
46
51
  end
52
+
53
+ # TODO move this somewhere else
54
+ def interaction_description(interaction)
55
+ if interaction['providerState'] && interaction['providerState'] != ''
56
+ "#{interaction['description']} given #{interaction['providerState']}"
57
+ elsif interaction['providerStates'] && interaction['providerStates'].is_a?(Array) && interaction['providerStates'].any?
58
+ provider_states = interaction['providerStates'].collect{ |ps| ps['name'] }.compact.join(', ')
59
+ "#{interaction['description']} given #{provider_states}"
60
+ else
61
+ interaction['description']
62
+ end
63
+ end
47
64
  end
48
65
  end
49
66
  end
@@ -78,8 +78,13 @@ module PactBroker
78
78
  }
79
79
  end
80
80
 
81
+ def to_hash(options)
82
+ @to_hash_options = options
83
+ super
84
+ end
85
+
81
86
  def response_hidden_message
82
- PactBroker::Messages.message('messages.response_body_hidden')
87
+ PactBroker::Messages.message('messages.response_body_hidden', base_url: @to_hash_options[:user_options][:base_url])
83
88
  end
84
89
  end
85
90
  end
@@ -253,6 +253,10 @@ module PactBroker
253
253
  "/matrix/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}"
254
254
  end
255
255
 
256
+ def matrix_badge_url_for_selectors consumer_selector, provider_selector, base_url = ''
257
+ "#{base_url}/matrix/provider/#{url_encode(provider_selector.pacticipant_name)}/latest/#{url_encode(provider_selector.tag)}/consumer/#{url_encode(consumer_selector.pacticipant_name)}/latest/#{url_encode(consumer_selector.tag)}/badge.svg"
258
+ end
259
+
256
260
  def matrix_for_pacticipant_version_url(version, base_url = '')
257
261
  query = {
258
262
  q: [{ pacticipant: version.pacticipant.name, version: version.number }],
@@ -280,8 +284,8 @@ module PactBroker
280
284
  "#{base_url}/groups/#{pacticipant_name}"
281
285
  end
282
286
 
283
- def hal_browser_url target_url
284
- "/hal-browser/browser.html#" + target_url
287
+ def hal_browser_url target_url, base_url = ''
288
+ "#{base_url}/hal-browser/browser.html#" + target_url
285
289
  end
286
290
 
287
291
  def url_encode param
@@ -37,18 +37,18 @@ module PactBroker
37
37
 
38
38
  def head
39
39
  "<title>#{title}</title>
40
- <link rel='stylesheet' type='text/css' href='/stylesheets/github.css'>
41
- <link rel='stylesheet' type='text/css' href='/stylesheets/pact.css'>
42
- <link rel='stylesheet' type='text/css' href='/stylesheets/github-json.css'>
43
- <link rel='stylesheet' type='text/css' href='/css/bootstrap.min.css'>
44
- <link rel='stylesheet' type='text/css' href='/stylesheets/material-menu.css'>
45
- <link rel='stylesheet' type='text/css' href='/stylesheets/jquery-confirm.min.css'>
46
- <script src='/javascripts/highlight.pack.js'></script>
47
- <script src='/javascripts/jquery-3.3.1.min.js'></script>
48
- <script src='/js/bootstrap.min.js'></script>
49
- <script src='/javascripts/material-menu.js'></script>
50
- <script src='/javascripts/pact.js'></script>
51
- <script src='/javascripts/jquery-confirm.min.js'></script>
40
+ <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github.css'>
41
+ <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/pact.css'>
42
+ <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github-json.css'>
43
+ <link rel='stylesheet' type='text/css' href='#{base_url}/css/bootstrap.min.css'>
44
+ <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/material-menu.css'>
45
+ <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/jquery-confirm.min.css'>
46
+ <script src='#{base_url}/javascripts/highlight.pack.js'></script>
47
+ <script src='#{base_url}/javascripts/jquery-3.3.1.min.js'></script>
48
+ <script src='#{base_url}/js/bootstrap.min.js'></script>
49
+ <script src='#{base_url}/javascripts/material-menu.js'></script>
50
+ <script src='#{base_url}/javascripts/pact.js'></script>
51
+ <script src='#{base_url}/javascripts/jquery-confirm.min.js'></script>
52
52
  <script>hljs.initHighlightingOnLoad();</script>"
53
53
  end
54
54
 
@@ -72,7 +72,7 @@ module PactBroker
72
72
  <a href=\"#{matrix_url}\">View Matrix</a>
73
73
  </li>
74
74
  <li>
75
- <a href=\"/\">Home</a>
75
+ <a href=\"#{base_url}\">Home</a>
76
76
  </li>
77
77
  <li>
78
78
  <span data-consumer-name=\"#{@pact.consumer.name}\"
@@ -129,7 +129,7 @@ module PactBroker
129
129
  end
130
130
 
131
131
  def json_url
132
- PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url
132
+ PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url, base_url
133
133
  end
134
134
 
135
135
  def pact_url
@@ -34,12 +34,12 @@ module PactBroker
34
34
 
35
35
  def to_svg
36
36
  response.headers['Cache-Control'] = 'no-cache'
37
- comment + badge_service.pact_verification_badge(pact, label, initials, pseudo_branch_verification_status)
37
+ comment + badge_service.pact_verification_badge(pact, label, initials, pseudo_branch_verification_status, tags)
38
38
  end
39
39
 
40
40
  def moved_temporarily?
41
41
  response.headers['Cache-Control'] = 'no-cache'
42
- badge_service.pact_verification_badge_url(pact, label, initials, pseudo_branch_verification_status)
42
+ badge_service.pact_verification_badge_url(pact, label, initials, pseudo_branch_verification_status, tags)
43
43
  end
44
44
 
45
45
  private
@@ -72,6 +72,10 @@ module PactBroker
72
72
  verification_number = latest_verification ? latest_verification.number : "?"
73
73
  "<!-- #{identifier_from_path[:consumer_name]} version #{consumer_version_number} revision #{pact_revision} #{identifier_from_path[:provider_name]} version #{provider_version_number} number #{verification_number} -->\n"
74
74
  end
75
+
76
+ def tags
77
+ {}
78
+ end
75
79
  end
76
80
  end
77
81
  end
@@ -33,8 +33,8 @@ module PactBroker
33
33
  { 'Access-Control-Allow-Methods' => allowed_methods.join(", ")}
34
34
  end
35
35
 
36
- def update_matrix_after_request?
37
- false
36
+ def known_methods
37
+ super + ['PATCH']
38
38
  end
39
39
 
40
40
  def finish_request
@@ -62,6 +62,11 @@ module PactBroker
62
62
  PactBroker.configuration.base_url || request.base_uri.to_s.chomp('/')
63
63
  end
64
64
 
65
+ # See comments for base_url in lib/pact_broker/doc/controllers/app.rb
66
+ def ui_base_url
67
+ PactBroker.configuration.base_url || ''
68
+ end
69
+
65
70
  def charsets_provided
66
71
  [['utf-8', :encode]]
67
72
  end
@@ -76,7 +81,7 @@ module PactBroker
76
81
  end
77
82
 
78
83
  def decorator_context options = {}
79
- Decorators::DecoratorContext.new(base_url, resource_url, options)
84
+ Decorators::DecoratorContext.new(base_url, resource_url, request.env, options)
80
85
  end
81
86
 
82
87
  def handle_exception e
@@ -36,7 +36,7 @@ module PactBroker
36
36
  def to_html
37
37
  PactBroker.configuration.html_pact_renderer.call(
38
38
  pact, {
39
- base_url: base_url,
39
+ base_url: ui_base_url,
40
40
  badge_url: "#{resource_url}/badge.svg"
41
41
  })
42
42
  end
@@ -7,7 +7,12 @@ module PactBroker
7
7
 
8
8
  private
9
9
 
10
+ def tags
11
+ { consumer_tag: identifier_from_path[:tag], provider_tag: identifier_from_path[:provider_tag] }
12
+ end
13
+
10
14
  def latest_verification
15
+ return nil unless pact
11
16
  @latest_verification ||= verification_service.find_latest_verification_for_tags(
12
17
  identifier_from_path[:consumer_name],
13
18
  identifier_from_path[:provider_name],
@@ -9,14 +9,6 @@ require 'pact_broker/api/contracts/put_pact_params_contract'
9
9
  require 'pact_broker/webhooks/execution_configuration'
10
10
  require 'pact_broker/api/resources/webhook_execution_methods'
11
11
 
12
- module Webmachine
13
- class Request
14
- def patch?
15
- method == "PATCH"
16
- end
17
- end
18
- end
19
-
20
12
  module PactBroker
21
13
  module Api
22
14
  module Resources
@@ -41,10 +33,6 @@ module PactBroker
41
33
  ["GET", "PUT", "DELETE", "PATCH", "OPTIONS"]
42
34
  end
43
35
 
44
- def known_methods
45
- super + ['PATCH']
46
- end
47
-
48
36
  def is_conflict?
49
37
  merge_conflict = request.patch? && resource_exists? &&
50
38
  Pacts::Merger.conflict?(pact.json_content, pact_params.json_content)
@@ -89,8 +77,8 @@ module PactBroker
89
77
  def to_html
90
78
  PactBroker.configuration.html_pact_renderer.call(
91
79
  pact, {
92
- base_url: base_url,
93
- badge_url: badge_url_for_latest_pact(pact, base_url)
80
+ base_url: ui_base_url,
81
+ badge_url: badge_url_for_latest_pact(pact, ui_base_url)
94
82
  })
95
83
  end
96
84
 
@@ -110,13 +98,9 @@ module PactBroker
110
98
  @pact_params ||= PactBroker::Pacts::PactParams.from_request request, path_info
111
99
  end
112
100
 
113
- def update_matrix_after_request?
114
- request.put? || request.patch?
115
- end
116
-
117
101
  def set_post_deletion_response
118
102
  latest_pact = pact_service.find_latest_pact(pact_params)
119
- response_body = { "_links" => {} }
103
+ response_body = { "_links" => { index: { href: base_url } } }
120
104
  if latest_pact
121
105
  response_body["_links"]["pb:latest-pact-version"] = {
122
106
  href: latest_pact_url(base_url, latest_pact),