pact_broker 1.14.0 → 1.15.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|