pact_broker 1.14.0 → 1.15.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +11 -0
- data/LICENSE.txt +2 -0
- data/README.md +6 -2
- data/example/Gemfile +3 -3
- data/lib/pact_broker.rb +6 -1
- data/lib/pact_broker/api.rb +8 -1
- data/lib/pact_broker/api/contracts/pacticipant_name_contract.rb +2 -4
- data/lib/pact_broker/api/contracts/put_pact_params_contract.rb +25 -32
- data/lib/pact_broker/api/contracts/request_validations.rb +5 -11
- data/lib/pact_broker/api/contracts/webhook_contract.rb +28 -15
- data/lib/pact_broker/api/decorators/versions_decorator.rb +41 -0
- data/lib/pact_broker/api/resources/base_resource.rb +7 -3
- data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
- data/lib/pact_broker/api/resources/latest_pacts.rb +2 -2
- data/lib/pact_broker/api/resources/latest_provider_pacts.rb +1 -1
- data/lib/pact_broker/api/resources/pact.rb +2 -2
- data/lib/pact_broker/api/resources/pact_content_diff.rb +2 -5
- data/lib/pact_broker/api/resources/pact_versions.rb +1 -1
- data/lib/pact_broker/api/resources/pact_webhooks.rb +8 -5
- data/lib/pact_broker/api/resources/pacticipant.rb +1 -1
- data/lib/pact_broker/api/resources/pacticipants.rb +2 -2
- data/lib/pact_broker/api/resources/tag.rb +2 -2
- data/lib/pact_broker/api/resources/version.rb +1 -1
- data/lib/pact_broker/api/resources/versions.rb +34 -0
- data/lib/pact_broker/api/resources/webhook.rb +2 -2
- data/lib/pact_broker/api/resources/webhook_execution.rb +1 -1
- data/lib/pact_broker/domain/version.rb +4 -0
- data/lib/pact_broker/domain/webhook.rb +2 -0
- data/lib/pact_broker/locale/en.yml +9 -1
- data/lib/pact_broker/pacts/diff.rb +26 -27
- data/lib/pact_broker/repositories/pacticipant_repository.rb +7 -0
- data/lib/pact_broker/services/pacticipant_service.rb +4 -0
- data/lib/pact_broker/services/webhook_service.rb +2 -2
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +4 -6
- data/spec/features/get_versions_spec.rb +36 -0
- data/spec/lib/pact_broker/api/contracts/put_pact_params_contract_spec.rb +12 -19
- data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +7 -9
- data/spec/lib/pact_broker/api/decorators/embedded_tag_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/embedded_version_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/decorators/latest_pact_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/decorators/tag_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/decorators/version_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/decorators/versions_decorator_spec.rb +44 -0
- data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +35 -39
- data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/resources/pact_spec.rb +2 -3
- data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +3 -3
- data/spec/lib/pact_broker/api/resources/tag_spec.rb +2 -2
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +1 -1
- data/spec/lib/pact_broker/api/resources/webhook_spec.rb +1 -1
- data/spec/lib/pact_broker/pacts/diff_spec.rb +1 -1
- metadata +28 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee70ece82ed0bd78c3ab1d09fef1248d7686e252
|
4
|
+
data.tar.gz: 30b3bf57e83a827fbd7e62fb80dd4fe8414662b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c416ab1439d9975218b456a03f3f5cf67784f1f785f27c2a84da53022daa1fc99af14105949b8e26191180ed10487d49eff97aac5754d916e6ffaf4a91ff9108
|
7
|
+
data.tar.gz: 964b25fcd0b9bfabd935b5830fbad6706aab0886c554456c085ca08a47c79a2b9e165e3e231a8c68bfbbfe31b2fef2438a28c64fe55654a48c7c90cf2174d1b4
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,17 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
$ git log --pretty=format:' * %h - %s (%an, %ad)' vX.Y.Z..HEAD
|
4
4
|
|
5
|
+
#### 1.15.0 (2017-03-28)
|
6
|
+
* 588c33e - Adds versions decorator spec (Ivan Vojinovic, Wed Feb 22 00:00:46 2017 -0500)
|
7
|
+
* c4a7daf - Adds pacticipant versions endpoint (Ivan Vojinovic, Tue Feb 21 21:15:39 2017 -0500)
|
8
|
+
* 06bcbc8 - Added ruby 2.4.0 to travis.yml (Beth Skurrie, Tue Mar 28 19:09:06 2017 +1100)
|
9
|
+
* 6d7653b - Bump pact_broker version to 1.14.0 to resolve twisted dependencies. (Tan Le, Mon Mar 27 22:36:22 2017 +1100)
|
10
|
+
* c8eeab4 - Remove trailblazer dependency. (Tan Le, Mon Mar 27 21:56:43 2017 +1100)
|
11
|
+
* e62c5ec - Added copyright year and owner. (Beth Skurrie, Fri Mar 24 10:39:39 2017 +1100)
|
12
|
+
* 5007f5b - Bump trailblazer version due to roar compatibility. (Tan Le, Mon Feb 20 10:22:41 2017 +1100)
|
13
|
+
* 4865948 - Bump reform and friends versions. (Tan Le, Wed Feb 15 09:16:29 2017 +1100)
|
14
|
+
* 0920e45 - Add hosted pact broker to usage section in README (Matt Fellows, Sat Feb 4 11:28:36 2017 +1100)
|
15
|
+
|
5
16
|
#### 1.14.0 (2017-01-30)
|
6
17
|
* 83ac7a5 - Adds ability to delete tags (Ivan Vojinovic, Fri Jan 27 15:19:51 2017 -0500)
|
7
18
|
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -80,7 +80,7 @@ Use the HAL browser to view documentation as you browse.
|
|
80
80
|
|
81
81
|
### To have a play around on your local machine
|
82
82
|
|
83
|
-
* Install ruby 1.9.3 or later and bundler >= 1.12.0
|
83
|
+
* Install ruby 1.9.3 or later and bundler >= 1.12.0 (NOTE! Currently broken on ruby 2.4.0. See [issue 78](https://github.com/bethesque/pact_broker/issues/78). )
|
84
84
|
* Run `git clone git@github.com:bethesque/pact_broker.git && cd pact_broker/example`
|
85
85
|
* Run `bundle`
|
86
86
|
* Run `bundle exec rackup -p 8080`
|
@@ -90,6 +90,11 @@ Use the HAL browser to view documentation as you browse.
|
|
90
90
|
* Click on the HAL Browser link to have a poke around the API.
|
91
91
|
* Click on the book icon under "docs" to view documentation related to a given relation.
|
92
92
|
|
93
|
+
### Hosted
|
94
|
+
|
95
|
+
In a hurry? Hate having to run your own infrastructure? Check out
|
96
|
+
the [Hosted Pact Broker](https://pact.dius.com.au/?utm_source=github&utm_campaign=GITHUB_BROKER&utm_medium=github) - it's fast, it's secure and it's free!
|
97
|
+
|
93
98
|
### For reals
|
94
99
|
|
95
100
|
You can use the [Pact Broker Docker container][docker] or [Terraform on AWS][terraform] or to roll your own...
|
@@ -109,4 +114,3 @@ You can use the [Pact Broker Docker container][docker] or [Terraform on AWS][ter
|
|
109
114
|
[different-teams]: https://github.com/realestate-com-au/pact/wiki/Using-pact-where-the-consumer-team-is-different-from-the-provider-team
|
110
115
|
[docker]: https://registry.hub.docker.com/u/dius/pact_broker/
|
111
116
|
[terraform]: https://github.com/nadnerb/terraform-pact-broker
|
112
|
-
|
data/example/Gemfile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem
|
4
|
-
gem
|
5
|
-
gem
|
3
|
+
gem 'pact_broker', '~> 1.14'
|
4
|
+
gem 'sqlite3' # Replace with your choice of database driver eg. gem "pg"
|
5
|
+
gem 'thin' # Keep, or replace with your choice of web server
|
data/lib/pact_broker.rb
CHANGED
data/lib/pact_broker/api.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
require 'reform'
|
2
|
+
require 'reform/form/dry'
|
3
|
+
Reform::Form.class_eval do
|
4
|
+
feature Reform::Form::Dry
|
5
|
+
end
|
6
|
+
|
1
7
|
require 'pact_broker/api/resources/pact'
|
2
8
|
require 'pact_broker/api/resources/latest_pact'
|
3
9
|
require 'pact_broker/api/resources/latest_pacts'
|
@@ -13,11 +19,11 @@ require 'pact_broker/api/resources/webhooks'
|
|
13
19
|
require 'pact_broker/api/resources/webhook'
|
14
20
|
require 'pact_broker/api/resources/webhook_execution'
|
15
21
|
require 'pact_broker/api/resources/version'
|
22
|
+
require 'pact_broker/api/resources/versions'
|
16
23
|
require 'pact_broker/api/resources/pact_content_diff'
|
17
24
|
require 'pact_broker/api/resources/previous_distinct_pact_version'
|
18
25
|
require 'pact_broker/api/resources/latest_provider_pacts'
|
19
26
|
|
20
|
-
|
21
27
|
require 'webmachine/adapters/rack_mapped'
|
22
28
|
|
23
29
|
module PactBroker
|
@@ -44,6 +50,7 @@ module PactBroker
|
|
44
50
|
add ['pacts', 'latest'], Api::Resources::LatestPacts
|
45
51
|
add ['pacticipants'], Api::Resources::Pacticipants
|
46
52
|
add ['pacticipants', :name], Api::Resources::Pacticipant
|
53
|
+
add ['pacticipants', :pacticipant_name, 'versions'], Api::Resources::Versions
|
47
54
|
add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number], Api::Resources::Version
|
48
55
|
add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number, 'tags', :tag_name], Api::Resources::Tag
|
49
56
|
add ['relationships'], Api::Resources::Relationships
|
@@ -1,17 +1,15 @@
|
|
1
1
|
require 'reform'
|
2
|
-
require 'reform/
|
2
|
+
require 'reform/form'
|
3
3
|
|
4
4
|
module PactBroker
|
5
5
|
module Api
|
6
6
|
module Contracts
|
7
|
-
|
8
|
-
class PacticipantNameContract < Reform::Contract
|
7
|
+
class PacticipantNameContract < Reform::Form
|
9
8
|
property :name
|
10
9
|
property :name_in_pact
|
11
10
|
property :pacticipant
|
12
11
|
property :message_args
|
13
12
|
|
14
|
-
|
15
13
|
include PactBroker::Messages
|
16
14
|
|
17
15
|
def blank? string
|
@@ -1,54 +1,47 @@
|
|
1
1
|
require 'reform'
|
2
|
-
require 'reform/
|
3
|
-
require 'pact_broker/messages'
|
4
|
-
require 'pact_broker/constants'
|
5
|
-
require 'pact_broker/api/contracts/pacticipant_name_contract'
|
6
|
-
require 'pact_broker/api/contracts/consumer_version_number_validation'
|
2
|
+
require 'reform/form'
|
7
3
|
|
8
4
|
module PactBroker
|
9
5
|
module Api
|
10
6
|
module Contracts
|
7
|
+
class PutPacticipantNameContract < Reform::Form
|
8
|
+
property :name
|
9
|
+
property :name_in_pact
|
10
|
+
property :pacticipant
|
11
|
+
property :message_args
|
12
|
+
|
13
|
+
validation do
|
14
|
+
configure do
|
15
|
+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
|
16
|
+
end
|
11
17
|
|
12
|
-
|
13
|
-
|
14
|
-
validates :name, presence: true, blank: false
|
15
|
-
validate :name_in_path_matches_name_in_pact
|
18
|
+
required(:name).maybe
|
19
|
+
required(:name_in_pact).maybe
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
if name != name_in_pact
|
20
|
-
errors.add(:name, validation_message('pacticipant_name_mismatch', message_args))
|
21
|
-
end
|
21
|
+
rule(name_in_path_matches_name_in_pact?: [:name, :name_in_pact]) do |name, name_in_pact|
|
22
|
+
name_in_pact.filled?.then(name.eql?(value(:name_in_pact)))
|
22
23
|
end
|
23
24
|
end
|
24
|
-
|
25
|
-
def present? string
|
26
|
-
string && !blank?(string)
|
27
|
-
end
|
28
|
-
|
29
25
|
end
|
30
26
|
|
31
|
-
class PutPactParamsContract < Reform::
|
32
|
-
|
33
|
-
include PactBroker::Messages
|
34
|
-
|
27
|
+
class PutPactParamsContract < Reform::Form
|
35
28
|
property :consumer_version_number
|
36
29
|
property :consumer, form: PutPacticipantNameContract
|
37
30
|
property :provider, form: PutPacticipantNameContract
|
38
31
|
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
validation do
|
33
|
+
configure do
|
34
|
+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
|
42
35
|
|
43
|
-
|
36
|
+
def valid_consumer_version_number?(value)
|
37
|
+
parsed_version_number = PactBroker.configuration.version_parser.call(value)
|
38
|
+
!parsed_version_number.nil?
|
39
|
+
end
|
40
|
+
end
|
44
41
|
|
45
|
-
|
46
|
-
validation_message('consumer_version_number_invalid', consumer_version_number: consumer_version_number)
|
42
|
+
required(:consumer_version_number).filled(:valid_consumer_version_number?)
|
47
43
|
end
|
48
|
-
|
49
44
|
end
|
50
|
-
|
51
|
-
|
52
45
|
end
|
53
46
|
end
|
54
47
|
end
|
@@ -8,9 +8,7 @@ module PactBroker
|
|
8
8
|
|
9
9
|
module RequestValidations
|
10
10
|
def method_is_valid
|
11
|
-
|
12
|
-
errors.add(:method, "is not a recognised HTTP method")
|
13
|
-
end
|
11
|
+
http_method && !valid_method?
|
14
12
|
end
|
15
13
|
|
16
14
|
def valid_method?
|
@@ -18,9 +16,7 @@ module PactBroker
|
|
18
16
|
end
|
19
17
|
|
20
18
|
def url_is_valid
|
21
|
-
|
22
|
-
errors.add(:url, "is not a valid URL eg. http://example.org")
|
23
|
-
end
|
19
|
+
url && !url_valid?
|
24
20
|
end
|
25
21
|
|
26
22
|
def url_valid?
|
@@ -28,11 +24,9 @@ module PactBroker
|
|
28
24
|
end
|
29
25
|
|
30
26
|
def uri
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
nil
|
35
|
-
end
|
27
|
+
URI(url)
|
28
|
+
rescue URI::InvalidURIError
|
29
|
+
nil
|
36
30
|
end
|
37
31
|
end
|
38
32
|
end
|
@@ -1,31 +1,44 @@
|
|
1
1
|
require 'reform'
|
2
|
-
require 'reform/
|
3
|
-
require 'pact_broker/api/contracts/request_validations'
|
2
|
+
require 'reform/form'
|
4
3
|
|
5
4
|
module PactBroker
|
6
5
|
module Api
|
7
6
|
module Contracts
|
8
|
-
|
9
|
-
class WebhookContract < Reform::Contract
|
10
|
-
|
7
|
+
class WebhookContract < Reform::Form
|
11
8
|
property :request
|
12
|
-
validates :request, presence: true
|
13
9
|
|
14
|
-
|
10
|
+
validation do
|
11
|
+
configure do
|
12
|
+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
|
13
|
+
end
|
15
14
|
|
16
|
-
|
15
|
+
required(:request).filled
|
16
|
+
end
|
17
17
|
|
18
|
+
property :request do
|
18
19
|
property :url
|
19
20
|
property :http_method
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
validation do
|
23
|
+
configure do
|
24
|
+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
|
25
|
+
|
26
|
+
def valid_method?(value)
|
27
|
+
Net::HTTP.const_defined?(value.capitalize)
|
28
|
+
end
|
29
|
+
|
30
|
+
def valid_url?(value)
|
31
|
+
uri = URI(value)
|
32
|
+
uri.scheme && uri.host
|
33
|
+
rescue URI::InvalidURIError
|
34
|
+
false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
required(:http_method).filled(:valid_method?)
|
39
|
+
required(:url).filled(:valid_url?)
|
40
|
+
end
|
27
41
|
end
|
28
|
-
|
29
42
|
end
|
30
43
|
end
|
31
44
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'base_decorator'
|
2
|
+
require_relative 'version_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
|
6
|
+
module Api
|
7
|
+
|
8
|
+
module Decorators
|
9
|
+
|
10
|
+
|
11
|
+
class VersionsDecorator < BaseDecorator
|
12
|
+
|
13
|
+
collection :entries, as: :versions, embedded: true, :extend => PactBroker::Api::Decorators::VersionDecorator
|
14
|
+
|
15
|
+
link :self do | context |
|
16
|
+
{
|
17
|
+
href: context[:resource_url],
|
18
|
+
title: "All versions of the pacticipant #{context[:pacticipant_name]}"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
link :pacticipant do | context |
|
23
|
+
{
|
24
|
+
href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:pacticipant_name])),
|
25
|
+
title: context[:pacticipant_name]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
links :'versions' do | context |
|
30
|
+
represented.collect do | version |
|
31
|
+
{
|
32
|
+
:href => version_url(context[:base_url], version),
|
33
|
+
:title => version.version_and_updated_date
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -89,6 +89,10 @@ module PactBroker
|
|
89
89
|
identifier_from_path[:provider_name]
|
90
90
|
end
|
91
91
|
|
92
|
+
def pacticipant_name
|
93
|
+
identifier_from_path[:pacticipant_name]
|
94
|
+
end
|
95
|
+
|
92
96
|
def invalid_json?
|
93
97
|
begin
|
94
98
|
JSON.parse(request_body, PACT_PARSING_OPTIONS) #Not load! Otherwise it will try to load Ruby classes.
|
@@ -110,9 +114,9 @@ module PactBroker
|
|
110
114
|
end
|
111
115
|
end
|
112
116
|
|
113
|
-
def contract_validation_errors? contract
|
114
|
-
if (invalid = !contract.validate)
|
115
|
-
set_json_validation_error_messages contract.errors.
|
117
|
+
def contract_validation_errors? contract, pact_params
|
118
|
+
if (invalid = !contract.validate(pact_params))
|
119
|
+
set_json_validation_error_messages contract.errors.messages
|
116
120
|
end
|
117
121
|
invalid
|
118
122
|
end
|
@@ -22,7 +22,7 @@ module PactBroker
|
|
22
22
|
|
23
23
|
def to_json
|
24
24
|
response.headers['X-Pact-Consumer-Version'] = pact.consumer_version_number
|
25
|
-
PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(base_url: base_url)
|
25
|
+
PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(user_options: { base_url: base_url })
|
26
26
|
end
|
27
27
|
|
28
28
|
def to_html
|
@@ -15,7 +15,7 @@ module PactBroker
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def to_json
|
18
|
-
PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(base_url: base_url)
|
18
|
+
PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(user_options: { base_url: base_url })
|
19
19
|
end
|
20
20
|
|
21
21
|
def pacts
|
@@ -26,4 +26,4 @@ module PactBroker
|
|
26
26
|
end
|
27
27
|
|
28
28
|
end
|
29
|
-
end
|
29
|
+
end
|
@@ -21,7 +21,7 @@ module PactBroker
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def to_json
|
24
|
-
PactBroker::Api::Decorators::ProviderPactsDecorator.new(pacts).to_json(decorator_context(identifier_from_path))
|
24
|
+
PactBroker::Api::Decorators::ProviderPactsDecorator.new(pacts).to_json(user_options: decorator_context(identifier_from_path))
|
25
25
|
end
|
26
26
|
|
27
27
|
def pacts
|
@@ -49,7 +49,7 @@ module PactBroker
|
|
49
49
|
def malformed_request?
|
50
50
|
if request.patch? || request.put?
|
51
51
|
invalid_json? ||
|
52
|
-
contract_validation_errors?(Contracts::PutPactParamsContract.new(pact_params))
|
52
|
+
contract_validation_errors?(Contracts::PutPactParamsContract.new(pact_params), pact_params)
|
53
53
|
else
|
54
54
|
false
|
55
55
|
end
|
@@ -73,7 +73,7 @@ module PactBroker
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def to_json
|
76
|
-
PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(base_url: base_url)
|
76
|
+
PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(user_options: { base_url: base_url })
|
77
77
|
end
|
78
78
|
|
79
79
|
def delete_resource
|