pact_broker 1.7.0 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +4 -0
- data/db/migrations/22_create_latest_tagged_pacts_view.rb +20 -0
- data/example/basic_auth/Gemfile +5 -0
- data/example/basic_auth/Procfile +1 -0
- data/example/basic_auth/README.md +43 -0
- data/example/basic_auth/config.ru +19 -0
- data/lib/pact_broker/api.rb +3 -0
- data/lib/pact_broker/api/decorators/provider_pacts_decorator.rb +41 -0
- data/lib/pact_broker/api/resources/index.rb +6 -0
- data/lib/pact_broker/api/resources/latest_provider_pacts.rb +34 -0
- data/lib/pact_broker/pacts/latest_tagged_pacts.rb +11 -0
- data/lib/pact_broker/pacts/repository.rb +10 -1
- data/lib/pact_broker/pacts/service.rb +7 -3
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +1 -1
- data/spec/features/get_provider_pacts.rb +72 -0
- data/spec/lib/pact_broker/pacts/repository_spec.rb +70 -2
- data/spec/lib/pact_broker/pacts/service_spec.rb +1 -1
- metadata +68 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8743214a344901e8cc75cc159a44113ec371bcc
|
4
|
+
data.tar.gz: e4896ed8041a01d95c50c73366532c56beea87f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1af8a1a03263bc9e06adb104945576f023edaff95063f9b0885323d12eff57ccc12aa548c4576a8e0925e02e91070f4380ec69d4e2624f2db1750cba31abe770
|
7
|
+
data.tar.gz: 594b39972c370fd2a8bbf60051f6ba825f3fef1e31f3dfbac096dfb6484e81ac4ece3c123f81b796f7849c623af28f402dd43f9321ceb825f1e2c976312d0e76
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@ 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.8.0 (2015-05-28)
|
6
|
+
|
7
|
+
* 6c40e9c - Added ability to specify a tag when retrieving pacts for a given provider (Beth Skurrie, Thu May 28 09:03:46 2015 +1000)
|
8
|
+
* dda9f1d - Added endpoint to retrieve latest pacts by provider (Beth Skurrie, Sun May 10 21:28:33 2015 +1000)
|
9
|
+
* 21e676a - Pact broker example for heroku with basic auth (BrunoChauvet, Sat Apr 25 13:04:54 2015 +1000)
|
10
|
+
|
5
11
|
#### 1.7.0 (2015-03-20)
|
6
12
|
|
7
13
|
* a26402c - Allow configuration of version parsing. (Beth Skurrie, Tue Apr 14 09:39:05 2015 +1000)
|
data/README.md
CHANGED
@@ -18,6 +18,7 @@ Features:
|
|
18
18
|
* Dynamically generated network diagrams.
|
19
19
|
* Enables a pact version to be tagged (ie. "prod") so a provider can verify itself against a fixed version of a pact to ensure backwards compatibility.
|
20
20
|
* Webhooks to trigger a provider build when a consumer publishes a change to a pact.
|
21
|
+
* [Docker Pact Broker][docker]
|
21
22
|
|
22
23
|
Travis CI Status: [![Build Status](https://travis-ci.org/bethesque/pact_broker.svg?branch=master)](https://travis-ci.org/bethesque/pact_broker)
|
23
24
|
|
@@ -88,6 +89,8 @@ Use the HAL browser to view documentation as you browse.
|
|
88
89
|
|
89
90
|
### For reals
|
90
91
|
|
92
|
+
You can use the [Pact Broker Docker container][docker] or...
|
93
|
+
|
91
94
|
* Create a database using a product that is supported by the Sequel gem (listed on this page http://sequel.jeremyevans.net/rdoc/files/README_rdoc.html). The migrations have been tested on MySQL and PostgreSQL - your milage will vary on other databases.
|
92
95
|
* __Note:__ It is recommended to use __PostgreSQL__ as it will support JSON search features that are planned in a future release, however MySQL the other well supported database.
|
93
96
|
* Install ruby 1.9.3 or later
|
@@ -101,3 +104,4 @@ Use the HAL browser to view documentation as you browse.
|
|
101
104
|
[pact]: https://github.com/realestate-com-au/pact
|
102
105
|
[nerf]: https://github.com/bethesque/pact_broker/wiki/pact-broker-ci-nerf-gun
|
103
106
|
[different-teams]: https://github.com/realestate-com-au/pact/wiki/Using-pact-where-the-consumer-team-is-different-from-the-provider-team
|
107
|
+
[docker]: https://registry.hub.docker.com/u/dius/pact_broker/
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
create_or_replace_view(:latest_tagged_pact_consumer_version_orders,
|
4
|
+
"select provider_id, consumer_id, t.name as tag_name, max(consumer_version_order) as latest_consumer_version_order
|
5
|
+
from all_pacts ap
|
6
|
+
inner join tags t
|
7
|
+
on t.version_id = ap.consumer_version_id
|
8
|
+
group by provider_id, consumer_id, t.name"
|
9
|
+
)
|
10
|
+
|
11
|
+
create_or_replace_view(:latest_tagged_pacts,
|
12
|
+
"select ap.*, lp.tag_name
|
13
|
+
from all_pacts ap
|
14
|
+
inner join latest_tagged_pact_consumer_version_orders lp
|
15
|
+
on ap.consumer_id = lp.consumer_id
|
16
|
+
and ap.provider_id = lp.provider_id
|
17
|
+
and ap.consumer_version_order = latest_consumer_version_order"
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
web: bundle exec thin start -p $PORT
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Example of Pact Broker configuration on heroku with basic authentication
|
2
|
+
|
3
|
+
## Create your Pact Broker project
|
4
|
+
|
5
|
+
```
|
6
|
+
$ mkdir my-pact-broker
|
7
|
+
$ cd my-pact-broker
|
8
|
+
$ git init
|
9
|
+
```
|
10
|
+
|
11
|
+
Then copy the files `Gemfile`, `Procfile` and `config.ru` into your project and run bundle
|
12
|
+
```
|
13
|
+
$ bundle
|
14
|
+
$ gid add .
|
15
|
+
$ git commit -m "Initial commit"
|
16
|
+
```
|
17
|
+
|
18
|
+
It's now time to deploy to heroku! Assuming you already have an account, you need to create a new application with a postgres add-on:
|
19
|
+
```
|
20
|
+
$ gem install heroku
|
21
|
+
$ heroku create
|
22
|
+
$ heroku addons:add heroku-postgresql
|
23
|
+
$ heroku config:set PACT_BROKER_USERNAME=admin
|
24
|
+
$ heroku config:set PACT_BROKER_PASSWORD=changeme
|
25
|
+
$ git push heroku master
|
26
|
+
```
|
27
|
+
Your Pact Broker instance is now available!
|
28
|
+
|
29
|
+
## Publish consumer pacts - consumer side
|
30
|
+
You will need to set these environment variables with your basic auth credentials
|
31
|
+
```
|
32
|
+
export PACT_BROKER_USERNAME=admin
|
33
|
+
export PACT_BROKER_PASSWORD=changeme
|
34
|
+
rake pact:publish
|
35
|
+
```
|
36
|
+
|
37
|
+
## Verify pacts - provider side
|
38
|
+
In your pact_helper.rb file, you need to specify the basic auth credentials in the pact uris
|
39
|
+
```ruby
|
40
|
+
pact_uri URI.encode("http://#{ENV['PACT_BROKER_USERNAME']}:#{ENV['PACT_BROKER_PASSWORD']}@my-pact-broker.herokuapp.com/pacts/provider_pact_endpoint")
|
41
|
+
```
|
42
|
+
|
43
|
+
Enjoy!
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'logger'
|
3
|
+
require 'sequel'
|
4
|
+
require 'pact_broker'
|
5
|
+
require 'pg'
|
6
|
+
|
7
|
+
use Rack::Auth::Basic, "Restricted Area" do |username, password|
|
8
|
+
username == ENV['PACT_BROKER_USERNAME'] and password == ENV['PACT_BROKER_PASSWORD']
|
9
|
+
end
|
10
|
+
|
11
|
+
app = PactBroker::App.new do | config |
|
12
|
+
# change these from their default values if desired
|
13
|
+
# config.log_dir = "./log"
|
14
|
+
# config.auto_migrate_db = true
|
15
|
+
# config.use_hal_browser = true
|
16
|
+
config.database_connection = Sequel.connect(ENV['DATABASE_URL'], adapter: "postgres", encoding: 'utf8')
|
17
|
+
end
|
18
|
+
|
19
|
+
run app
|
data/lib/pact_broker/api.rb
CHANGED
@@ -15,6 +15,7 @@ require 'pact_broker/api/resources/webhook_execution'
|
|
15
15
|
require 'pact_broker/api/resources/version'
|
16
16
|
require 'pact_broker/api/resources/pact_content_diff'
|
17
17
|
require 'pact_broker/api/resources/previous_distinct_pact_version'
|
18
|
+
require 'pact_broker/api/resources/latest_provider_pacts'
|
18
19
|
|
19
20
|
|
20
21
|
require 'webmachine/adapters/rack'
|
@@ -34,6 +35,8 @@ module PactBroker
|
|
34
35
|
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'versions', :consumer_version_number], Api::Resources::Pact
|
35
36
|
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'version', :consumer_version_number, 'previous-distinct'], Api::Resources::PreviousDistinctPactVersion
|
36
37
|
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'version', :consumer_version_number, 'diff', 'previous-distinct'], Api::Resources::PactContentDiff
|
38
|
+
add ['pacts', 'provider', :provider_name, 'latest'], Api::Resources::LatestProviderPacts
|
39
|
+
add ['pacts', 'provider', :provider_name, 'latest', :tag], Api::Resources::LatestProviderPacts
|
37
40
|
|
38
41
|
add ['pact', 'provider', :provider_name, 'consumer', :consumer_name, 'version', :consumer_version_number], Api::Resources::Pact
|
39
42
|
add ['pact', 'provider', :provider_name, 'consumer', :consumer_name, 'latest'], Api::Resources::LatestPact
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'base_decorator'
|
2
|
+
require_relative 'pact_version_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
|
6
|
+
module Api
|
7
|
+
|
8
|
+
module Decorators
|
9
|
+
|
10
|
+
|
11
|
+
class ProviderPactsDecorator < BaseDecorator
|
12
|
+
|
13
|
+
link :self do | context |
|
14
|
+
suffix = context[:tag] ? " with tag '#{context[:tag]}'" : ""
|
15
|
+
{
|
16
|
+
href: context[:resource_url],
|
17
|
+
title: "Latest pact versions for the provider #{context[:provider_name]}#{suffix}"
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
link :provider do | context |
|
22
|
+
{
|
23
|
+
href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:provider_name])),
|
24
|
+
title: context[:provider_name]
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
links :'pacts' do | context |
|
29
|
+
represented.collect do | pact |
|
30
|
+
{
|
31
|
+
:href => pact_url(context[:base_url], pact),
|
32
|
+
:title => pact.name,
|
33
|
+
:name => pact.consumer.name
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -36,6 +36,12 @@ module PactBroker
|
|
36
36
|
title: 'Pacticipants',
|
37
37
|
templated: false
|
38
38
|
},
|
39
|
+
'pb:latest-provider-pacts' =>
|
40
|
+
{
|
41
|
+
href: base_url + '/pacts/provider/{provider}/latest',
|
42
|
+
title: 'Latest pacts by provider',
|
43
|
+
templated: true
|
44
|
+
},
|
39
45
|
'pb:webhooks' =>
|
40
46
|
{
|
41
47
|
href: base_url + '/webhooks',
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
2
|
+
require 'pact_broker/configuration'
|
3
|
+
require 'pact_broker/api/decorators/provider_pacts_decorator'
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
module Api
|
7
|
+
module Resources
|
8
|
+
|
9
|
+
class LatestProviderPacts < BaseResource
|
10
|
+
|
11
|
+
def content_types_provided
|
12
|
+
[["application/hal+json", :to_json]]
|
13
|
+
end
|
14
|
+
|
15
|
+
def allowed_methods
|
16
|
+
["GET"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def resource_exists?
|
20
|
+
pacticipant_service.find_pacticipant_by_name(provider_name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_json
|
24
|
+
PactBroker::Api::Decorators::ProviderPactsDecorator.new(pacts).to_json(decorator_context(identifier_from_path))
|
25
|
+
end
|
26
|
+
|
27
|
+
def pacts
|
28
|
+
pact_service.find_latest_pact_versions_for_provider provider_name, tag: identifier_from_path[:tag]
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -5,6 +5,7 @@ require 'pact_broker/logging'
|
|
5
5
|
require 'pact_broker/pacts/database_model'
|
6
6
|
require 'pact_broker/pacts/all_pacts'
|
7
7
|
require 'pact_broker/pacts/latest_pacts'
|
8
|
+
require 'pact_broker/pacts/latest_tagged_pacts'
|
8
9
|
require 'pact/shared/json_differ'
|
9
10
|
|
10
11
|
module PactBroker
|
@@ -37,7 +38,7 @@ module PactBroker
|
|
37
38
|
DatabaseModel.where(id: id).delete
|
38
39
|
end
|
39
40
|
|
40
|
-
def
|
41
|
+
def find_all_pact_versions_between consumer_name, options
|
41
42
|
AllPacts
|
42
43
|
.eager(:tags)
|
43
44
|
.consumer(consumer_name)
|
@@ -46,6 +47,14 @@ module PactBroker
|
|
46
47
|
.collect(&:to_domain)
|
47
48
|
end
|
48
49
|
|
50
|
+
def find_latest_pact_versions_for_provider provider_name, tag = nil
|
51
|
+
if tag
|
52
|
+
LatestTaggedPacts.provider(provider_name).where(tag_name: tag).collect(&:to_domain)
|
53
|
+
else
|
54
|
+
LatestPacts.provider(provider_name).collect(&:to_domain)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
49
58
|
def find_by_version_and_provider version_id, provider_id
|
50
59
|
AllPacts
|
51
60
|
.eager(:tags)
|
@@ -39,8 +39,12 @@ module PactBroker
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
pact_repository.
|
42
|
+
def find_all_pact_versions_between consumer, options
|
43
|
+
pact_repository.find_all_pact_versions_between consumer, options
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_latest_pact_versions_for_provider provider_name, options = {}
|
47
|
+
pact_repository.find_latest_pact_versions_for_provider provider_name, options[:tag]
|
44
48
|
end
|
45
49
|
|
46
50
|
def find_previous_distinct_pact_version params
|
@@ -51,7 +55,7 @@ module PactBroker
|
|
51
55
|
|
52
56
|
def find_distinct_pacts_between consumer, options
|
53
57
|
# Assumes pacts are sorted from newest to oldest
|
54
|
-
all = pact_repository.
|
58
|
+
all = pact_repository.find_all_pact_versions_between consumer, options
|
55
59
|
distinct = []
|
56
60
|
(0...all.size).each do | i |
|
57
61
|
if i == all.size - 1
|
data/lib/pact_broker/version.rb
CHANGED
data/pact_broker.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
|
|
30
30
|
gem.add_runtime_dependency 'rack'
|
31
31
|
gem.add_runtime_dependency 'redcarpet', '~>3.1'
|
32
32
|
gem.add_runtime_dependency 'pact', '~>1.4'
|
33
|
-
gem.add_runtime_dependency 'pact-support', '~>0.
|
33
|
+
gem.add_runtime_dependency 'pact-support', '~>0.4', '>=0.4.2'
|
34
34
|
gem.add_runtime_dependency 'padrino-core', '~>0.12.4'
|
35
35
|
gem.add_runtime_dependency 'haml'
|
36
36
|
gem.add_runtime_dependency 'trailblazer', '~>0.1.0'
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec/support/provider_state_builder'
|
2
|
+
|
3
|
+
describe "Get provider pacts" do
|
4
|
+
|
5
|
+
let(:path) { "/pacts/provider/Provider/latest" }
|
6
|
+
let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
|
7
|
+
|
8
|
+
subject { get path; last_response }
|
9
|
+
|
10
|
+
context "when the provider exists" do
|
11
|
+
|
12
|
+
before do
|
13
|
+
ProviderStateBuilder.new
|
14
|
+
.create_provider("Provider")
|
15
|
+
.create_consumer("Consumer")
|
16
|
+
.create_consumer_version("1.0.0")
|
17
|
+
.create_consumer_version_tag("prod")
|
18
|
+
.create_pact
|
19
|
+
.create_consumer_version("1.2.3")
|
20
|
+
.create_pact
|
21
|
+
.create_consumer("Consumer 2")
|
22
|
+
.create_consumer_version("4.5.6")
|
23
|
+
.create_pact
|
24
|
+
end
|
25
|
+
|
26
|
+
context "with no tag specified" do
|
27
|
+
|
28
|
+
it "returns a 200 HAL JSON response" do
|
29
|
+
expect(subject).to be_a_hal_json_success_response
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns a list of links to the pacts" do
|
33
|
+
expect(last_response_body[:_links][:pacts].size).to eq 2
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with a tag specified" do
|
38
|
+
|
39
|
+
let(:path) { "/pacts/provider/Provider/latest/prod" }
|
40
|
+
|
41
|
+
it "returns a 200 HAL JSON response" do
|
42
|
+
expect(subject).to be_a_hal_json_success_response
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns a list of links to the pacts" do
|
46
|
+
expect(last_response_body[:_links][:pacts].size).to eq 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with a tag with no pacts" do
|
51
|
+
|
52
|
+
let(:path) { "/pacts/provider/Provider/latest/foo" }
|
53
|
+
|
54
|
+
it "returns a 200 HAL JSON response" do
|
55
|
+
expect(subject).to be_a_hal_json_success_response
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns a list of links to the pacts" do
|
59
|
+
expect(last_response_body[:_links][:pacts].size).to eq 0
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
context "when the provider does not exist" do
|
66
|
+
|
67
|
+
it "returns a 404 response" do
|
68
|
+
expect(subject).to be_a_404_response
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -158,7 +158,7 @@ module PactBroker
|
|
158
158
|
|
159
159
|
end
|
160
160
|
|
161
|
-
describe "#
|
161
|
+
describe "#find_all_pact_versions_between" do
|
162
162
|
|
163
163
|
before do
|
164
164
|
ProviderStateBuilder.new
|
@@ -174,7 +174,7 @@ module PactBroker
|
|
174
174
|
.create_pact
|
175
175
|
end
|
176
176
|
|
177
|
-
subject { Repository.new.
|
177
|
+
subject { Repository.new.find_all_pact_versions_between consumer_name, :and => provider_name }
|
178
178
|
|
179
179
|
it "returns the pacts between the specified consumer and provider" do
|
180
180
|
expect(subject.size).to eq 2
|
@@ -187,6 +187,74 @@ module PactBroker
|
|
187
187
|
|
188
188
|
end
|
189
189
|
|
190
|
+
describe "#find_latest_pact_versions_for_provider" do
|
191
|
+
|
192
|
+
context "with no tag specified" do
|
193
|
+
before do
|
194
|
+
ProviderStateBuilder.new
|
195
|
+
.create_consumer(consumer_name)
|
196
|
+
.create_consumer_version("1.0.0")
|
197
|
+
.create_provider(provider_name)
|
198
|
+
.create_pact
|
199
|
+
.create_consumer_version("1.2.3")
|
200
|
+
.create_pact
|
201
|
+
.create_consumer("another consumer")
|
202
|
+
.create_consumer_version("4.0.0")
|
203
|
+
.create_pact
|
204
|
+
.create_consumer_version("4.5.6")
|
205
|
+
.create_pact
|
206
|
+
.create_provider("not the provider")
|
207
|
+
.create_pact
|
208
|
+
end
|
209
|
+
|
210
|
+
subject { Repository.new.find_latest_pact_versions_for_provider provider_name }
|
211
|
+
|
212
|
+
it "returns the pacts between the specified consumer and provider" do
|
213
|
+
expect(subject.size).to eq 2
|
214
|
+
expect(subject.first.consumer.name).to eq consumer_name
|
215
|
+
expect(subject.first.provider.name).to eq provider_name
|
216
|
+
expect(subject.first.consumer_version.number).to eq "1.2.3"
|
217
|
+
expect(subject.first.json_content).to be nil
|
218
|
+
expect(subject.last.consumer.name).to eq "another consumer"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context "with a tag specified" do
|
223
|
+
before do
|
224
|
+
ProviderStateBuilder.new
|
225
|
+
.create_consumer(consumer_name)
|
226
|
+
.create_consumer_version("1.2.3")
|
227
|
+
.create_consumer_version_tag("prod")
|
228
|
+
.create_provider(provider_name)
|
229
|
+
.create_pact
|
230
|
+
.create_consumer_version("2.0.0")
|
231
|
+
.create_pact
|
232
|
+
.create_consumer("another consumer")
|
233
|
+
.create_consumer_version("4.5.6")
|
234
|
+
.create_pact
|
235
|
+
.create_consumer_version("5.0.0")
|
236
|
+
.create_consumer_version_tag("prod")
|
237
|
+
.create_consumer_version_tag("test")
|
238
|
+
.create_pact
|
239
|
+
.create_provider("not the provider")
|
240
|
+
.create_pact
|
241
|
+
end
|
242
|
+
|
243
|
+
subject { Repository.new.find_latest_pact_versions_for_provider provider_name, "prod" }
|
244
|
+
|
245
|
+
it "returns the pacts between the specified consumer and provider with the given tag" do
|
246
|
+
expect(subject.size).to eq 2
|
247
|
+
expect(subject.first.provider.name).to eq provider_name
|
248
|
+
expect(subject.first.consumer.name).to eq consumer_name
|
249
|
+
expect(subject.first.consumer_version.number).to eq "1.2.3"
|
250
|
+
expect(subject.first.json_content).to be nil
|
251
|
+
expect(subject.last.consumer.name).to eq "another consumer"
|
252
|
+
expect(subject.last.consumer_version.number).to eq "5.0.0"
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
257
|
+
|
190
258
|
describe "find_pact" do
|
191
259
|
before do
|
192
260
|
ProviderStateBuilder.new
|
@@ -15,7 +15,7 @@ module PactBroker
|
|
15
15
|
let(:all_pacts) { [pact_4, pact_3, pact_2, pact_1]}
|
16
16
|
|
17
17
|
before do
|
18
|
-
allow_any_instance_of(Pacts::Repository).to receive(:
|
18
|
+
allow_any_instance_of(Pacts::Repository).to receive(:find_all_pact_versions_between).and_return(all_pacts)
|
19
19
|
end
|
20
20
|
|
21
21
|
subject { Service.find_distinct_pacts_between 'consumer', :and => 'provider' }
|
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: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bethany Skurrie
|
@@ -10,76 +10,76 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-05-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - '>='
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: json
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - '>='
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '0'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - '>='
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: roar
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- -
|
47
|
+
- - ~>
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: 1.0.0.beta2
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- -
|
54
|
+
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: 1.0.0.beta2
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: reform
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
|
-
- -
|
61
|
+
- - ~>
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: '1.0'
|
64
64
|
type: :runtime
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- -
|
68
|
+
- - ~>
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '1.0'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: sequel
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- -
|
75
|
+
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '4.12'
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- -
|
82
|
+
- - ~>
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '4.12'
|
85
85
|
- !ruby/object:Gem::Dependency
|
@@ -100,244 +100,244 @@ dependencies:
|
|
100
100
|
name: versionomy
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
|
-
- -
|
103
|
+
- - ~>
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: '0.4'
|
106
106
|
type: :runtime
|
107
107
|
prerelease: false
|
108
108
|
version_requirements: !ruby/object:Gem::Requirement
|
109
109
|
requirements:
|
110
|
-
- -
|
110
|
+
- - ~>
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0.4'
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: rack
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
|
-
- -
|
117
|
+
- - '>='
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '0'
|
120
120
|
type: :runtime
|
121
121
|
prerelease: false
|
122
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
123
|
requirements:
|
124
|
-
- -
|
124
|
+
- - '>='
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: '0'
|
127
127
|
- !ruby/object:Gem::Dependency
|
128
128
|
name: redcarpet
|
129
129
|
requirement: !ruby/object:Gem::Requirement
|
130
130
|
requirements:
|
131
|
-
- -
|
131
|
+
- - ~>
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: '3.1'
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
|
-
- -
|
138
|
+
- - ~>
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: '3.1'
|
141
141
|
- !ruby/object:Gem::Dependency
|
142
142
|
name: pact
|
143
143
|
requirement: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
|
-
- -
|
145
|
+
- - ~>
|
146
146
|
- !ruby/object:Gem::Version
|
147
147
|
version: '1.4'
|
148
148
|
type: :runtime
|
149
149
|
prerelease: false
|
150
150
|
version_requirements: !ruby/object:Gem::Requirement
|
151
151
|
requirements:
|
152
|
-
- -
|
152
|
+
- - ~>
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: '1.4'
|
155
155
|
- !ruby/object:Gem::Dependency
|
156
156
|
name: pact-support
|
157
157
|
requirement: !ruby/object:Gem::Requirement
|
158
158
|
requirements:
|
159
|
-
- -
|
159
|
+
- - ~>
|
160
160
|
- !ruby/object:Gem::Version
|
161
|
-
version: '0.
|
162
|
-
- -
|
161
|
+
version: '0.4'
|
162
|
+
- - '>='
|
163
163
|
- !ruby/object:Gem::Version
|
164
|
-
version: 0.
|
164
|
+
version: 0.4.2
|
165
165
|
type: :runtime
|
166
166
|
prerelease: false
|
167
167
|
version_requirements: !ruby/object:Gem::Requirement
|
168
168
|
requirements:
|
169
|
-
- -
|
169
|
+
- - ~>
|
170
170
|
- !ruby/object:Gem::Version
|
171
|
-
version: '0.
|
172
|
-
- -
|
171
|
+
version: '0.4'
|
172
|
+
- - '>='
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version: 0.
|
174
|
+
version: 0.4.2
|
175
175
|
- !ruby/object:Gem::Dependency
|
176
176
|
name: padrino-core
|
177
177
|
requirement: !ruby/object:Gem::Requirement
|
178
178
|
requirements:
|
179
|
-
- -
|
179
|
+
- - ~>
|
180
180
|
- !ruby/object:Gem::Version
|
181
181
|
version: 0.12.4
|
182
182
|
type: :runtime
|
183
183
|
prerelease: false
|
184
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
185
|
requirements:
|
186
|
-
- -
|
186
|
+
- - ~>
|
187
187
|
- !ruby/object:Gem::Version
|
188
188
|
version: 0.12.4
|
189
189
|
- !ruby/object:Gem::Dependency
|
190
190
|
name: haml
|
191
191
|
requirement: !ruby/object:Gem::Requirement
|
192
192
|
requirements:
|
193
|
-
- -
|
193
|
+
- - '>='
|
194
194
|
- !ruby/object:Gem::Version
|
195
195
|
version: '0'
|
196
196
|
type: :runtime
|
197
197
|
prerelease: false
|
198
198
|
version_requirements: !ruby/object:Gem::Requirement
|
199
199
|
requirements:
|
200
|
-
- -
|
200
|
+
- - '>='
|
201
201
|
- !ruby/object:Gem::Version
|
202
202
|
version: '0'
|
203
203
|
- !ruby/object:Gem::Dependency
|
204
204
|
name: trailblazer
|
205
205
|
requirement: !ruby/object:Gem::Requirement
|
206
206
|
requirements:
|
207
|
-
- -
|
207
|
+
- - ~>
|
208
208
|
- !ruby/object:Gem::Version
|
209
209
|
version: 0.1.0
|
210
210
|
type: :runtime
|
211
211
|
prerelease: false
|
212
212
|
version_requirements: !ruby/object:Gem::Requirement
|
213
213
|
requirements:
|
214
|
-
- -
|
214
|
+
- - ~>
|
215
215
|
- !ruby/object:Gem::Version
|
216
216
|
version: 0.1.0
|
217
217
|
- !ruby/object:Gem::Dependency
|
218
218
|
name: sqlite3
|
219
219
|
requirement: !ruby/object:Gem::Requirement
|
220
220
|
requirements:
|
221
|
-
- -
|
221
|
+
- - '>='
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '0'
|
224
224
|
type: :development
|
225
225
|
prerelease: false
|
226
226
|
version_requirements: !ruby/object:Gem::Requirement
|
227
227
|
requirements:
|
228
|
-
- -
|
228
|
+
- - '>='
|
229
229
|
- !ruby/object:Gem::Version
|
230
230
|
version: '0'
|
231
231
|
- !ruby/object:Gem::Dependency
|
232
232
|
name: pry
|
233
233
|
requirement: !ruby/object:Gem::Requirement
|
234
234
|
requirements:
|
235
|
-
- -
|
235
|
+
- - '>='
|
236
236
|
- !ruby/object:Gem::Version
|
237
237
|
version: '0'
|
238
238
|
type: :development
|
239
239
|
prerelease: false
|
240
240
|
version_requirements: !ruby/object:Gem::Requirement
|
241
241
|
requirements:
|
242
|
-
- -
|
242
|
+
- - '>='
|
243
243
|
- !ruby/object:Gem::Version
|
244
244
|
version: '0'
|
245
245
|
- !ruby/object:Gem::Dependency
|
246
246
|
name: rake
|
247
247
|
requirement: !ruby/object:Gem::Requirement
|
248
248
|
requirements:
|
249
|
-
- -
|
249
|
+
- - ~>
|
250
250
|
- !ruby/object:Gem::Version
|
251
251
|
version: '10.0'
|
252
252
|
type: :development
|
253
253
|
prerelease: false
|
254
254
|
version_requirements: !ruby/object:Gem::Requirement
|
255
255
|
requirements:
|
256
|
-
- -
|
256
|
+
- - ~>
|
257
257
|
- !ruby/object:Gem::Version
|
258
258
|
version: '10.0'
|
259
259
|
- !ruby/object:Gem::Dependency
|
260
260
|
name: fakefs
|
261
261
|
requirement: !ruby/object:Gem::Requirement
|
262
262
|
requirements:
|
263
|
-
- -
|
263
|
+
- - ~>
|
264
264
|
- !ruby/object:Gem::Version
|
265
265
|
version: '0.4'
|
266
266
|
type: :development
|
267
267
|
prerelease: false
|
268
268
|
version_requirements: !ruby/object:Gem::Requirement
|
269
269
|
requirements:
|
270
|
-
- -
|
270
|
+
- - ~>
|
271
271
|
- !ruby/object:Gem::Version
|
272
272
|
version: '0.4'
|
273
273
|
- !ruby/object:Gem::Dependency
|
274
274
|
name: mysql2
|
275
275
|
requirement: !ruby/object:Gem::Requirement
|
276
276
|
requirements:
|
277
|
-
- -
|
277
|
+
- - ~>
|
278
278
|
- !ruby/object:Gem::Version
|
279
279
|
version: 0.3.15
|
280
280
|
type: :development
|
281
281
|
prerelease: false
|
282
282
|
version_requirements: !ruby/object:Gem::Requirement
|
283
283
|
requirements:
|
284
|
-
- -
|
284
|
+
- - ~>
|
285
285
|
- !ruby/object:Gem::Version
|
286
286
|
version: 0.3.15
|
287
287
|
- !ruby/object:Gem::Dependency
|
288
288
|
name: webmock
|
289
289
|
requirement: !ruby/object:Gem::Requirement
|
290
290
|
requirements:
|
291
|
-
- -
|
291
|
+
- - '>='
|
292
292
|
- !ruby/object:Gem::Version
|
293
293
|
version: '0'
|
294
294
|
type: :development
|
295
295
|
prerelease: false
|
296
296
|
version_requirements: !ruby/object:Gem::Requirement
|
297
297
|
requirements:
|
298
|
-
- -
|
298
|
+
- - '>='
|
299
299
|
- !ruby/object:Gem::Version
|
300
300
|
version: '0'
|
301
301
|
- !ruby/object:Gem::Dependency
|
302
302
|
name: rspec
|
303
303
|
requirement: !ruby/object:Gem::Requirement
|
304
304
|
requirements:
|
305
|
-
- -
|
305
|
+
- - ~>
|
306
306
|
- !ruby/object:Gem::Version
|
307
307
|
version: '3.0'
|
308
308
|
type: :development
|
309
309
|
prerelease: false
|
310
310
|
version_requirements: !ruby/object:Gem::Requirement
|
311
311
|
requirements:
|
312
|
-
- -
|
312
|
+
- - ~>
|
313
313
|
- !ruby/object:Gem::Version
|
314
314
|
version: '3.0'
|
315
315
|
- !ruby/object:Gem::Dependency
|
316
316
|
name: rspec-its
|
317
317
|
requirement: !ruby/object:Gem::Requirement
|
318
318
|
requirements:
|
319
|
-
- -
|
319
|
+
- - '>='
|
320
320
|
- !ruby/object:Gem::Version
|
321
321
|
version: '0'
|
322
322
|
type: :development
|
323
323
|
prerelease: false
|
324
324
|
version_requirements: !ruby/object:Gem::Requirement
|
325
325
|
requirements:
|
326
|
-
- -
|
326
|
+
- - '>='
|
327
327
|
- !ruby/object:Gem::Version
|
328
328
|
version: '0'
|
329
329
|
- !ruby/object:Gem::Dependency
|
330
330
|
name: database_cleaner
|
331
331
|
requirement: !ruby/object:Gem::Requirement
|
332
332
|
requirements:
|
333
|
-
- -
|
333
|
+
- - '>='
|
334
334
|
- !ruby/object:Gem::Version
|
335
335
|
version: '0'
|
336
336
|
type: :development
|
337
337
|
prerelease: false
|
338
338
|
version_requirements: !ruby/object:Gem::Requirement
|
339
339
|
requirements:
|
340
|
-
- -
|
340
|
+
- - '>='
|
341
341
|
- !ruby/object:Gem::Version
|
342
342
|
version: '0'
|
343
343
|
description: A server that stores and returns pact files generated by the pact gem.
|
@@ -350,9 +350,9 @@ executables: []
|
|
350
350
|
extensions: []
|
351
351
|
extra_rdoc_files: []
|
352
352
|
files:
|
353
|
-
-
|
354
|
-
-
|
355
|
-
-
|
353
|
+
- .gitignore
|
354
|
+
- .rspec
|
355
|
+
- .travis.yml
|
356
356
|
- CHANGELOG.md
|
357
357
|
- Gemfile
|
358
358
|
- README.md
|
@@ -382,9 +382,14 @@ files:
|
|
382
382
|
- db/migrations/19_make_pact_version_content_sha_not_nullable.rb
|
383
383
|
- db/migrations/20_add_pact_version_content_sha_to_all_pacts_view.rb
|
384
384
|
- db/migrations/21_recreate_latest_pacts_view.rb
|
385
|
+
- db/migrations/22_create_latest_tagged_pacts_view.rb
|
385
386
|
- db/migrations/migration_helper.rb
|
386
387
|
- db/pact_broker_database.sqlite3
|
387
388
|
- example/Gemfile
|
389
|
+
- example/basic_auth/Gemfile
|
390
|
+
- example/basic_auth/Procfile
|
391
|
+
- example/basic_auth/README.md
|
392
|
+
- example/basic_auth/config.ru
|
388
393
|
- example/config.ru
|
389
394
|
- example/pact_broker_database.sqlite3
|
390
395
|
- lib/db.rb
|
@@ -411,6 +416,7 @@ files:
|
|
411
416
|
- lib/pact_broker/api/decorators/pact_versions_decorator.rb
|
412
417
|
- lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb
|
413
418
|
- lib/pact_broker/api/decorators/pacticipant_decorator.rb
|
419
|
+
- lib/pact_broker/api/decorators/provider_pacts_decorator.rb
|
414
420
|
- lib/pact_broker/api/decorators/relationships_csv_decorator.rb
|
415
421
|
- lib/pact_broker/api/decorators/representable_pact.rb
|
416
422
|
- lib/pact_broker/api/decorators/tag_decorator.rb
|
@@ -427,6 +433,7 @@ files:
|
|
427
433
|
- lib/pact_broker/api/resources/index.rb
|
428
434
|
- lib/pact_broker/api/resources/latest_pact.rb
|
429
435
|
- lib/pact_broker/api/resources/latest_pacts.rb
|
436
|
+
- lib/pact_broker/api/resources/latest_provider_pacts.rb
|
430
437
|
- lib/pact_broker/api/resources/pact.rb
|
431
438
|
- lib/pact_broker/api/resources/pact_content_diff.rb
|
432
439
|
- lib/pact_broker/api/resources/pact_versions.rb
|
@@ -487,6 +494,7 @@ files:
|
|
487
494
|
- lib/pact_broker/pacts/database_model.rb
|
488
495
|
- lib/pact_broker/pacts/diff.rb
|
489
496
|
- lib/pact_broker/pacts/latest_pacts.rb
|
497
|
+
- lib/pact_broker/pacts/latest_tagged_pacts.rb
|
490
498
|
- lib/pact_broker/pacts/pact_params.rb
|
491
499
|
- lib/pact_broker/pacts/pact_version_content.rb
|
492
500
|
- lib/pact_broker/pacts/repository.rb
|
@@ -560,6 +568,7 @@ files:
|
|
560
568
|
- spec/features/delete_pact_spec.rb
|
561
569
|
- spec/features/get_diff.rb
|
562
570
|
- spec/features/get_previous_distinct_version.rb
|
571
|
+
- spec/features/get_provider_pacts.rb
|
563
572
|
- spec/features/get_version.rb
|
564
573
|
- spec/features/publish_not_a_pact_spec.rb
|
565
574
|
- spec/features/publish_pact_spec.rb
|
@@ -692,17 +701,17 @@ require_paths:
|
|
692
701
|
- lib
|
693
702
|
required_ruby_version: !ruby/object:Gem::Requirement
|
694
703
|
requirements:
|
695
|
-
- -
|
704
|
+
- - '>='
|
696
705
|
- !ruby/object:Gem::Version
|
697
706
|
version: '0'
|
698
707
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
699
708
|
requirements:
|
700
|
-
- -
|
709
|
+
- - '>='
|
701
710
|
- !ruby/object:Gem::Version
|
702
711
|
version: '0'
|
703
712
|
requirements: []
|
704
713
|
rubyforge_project:
|
705
|
-
rubygems_version: 2.
|
714
|
+
rubygems_version: 2.0.14
|
706
715
|
signing_key:
|
707
716
|
specification_version: 4
|
708
717
|
summary: See description
|
@@ -711,6 +720,7 @@ test_files:
|
|
711
720
|
- spec/features/delete_pact_spec.rb
|
712
721
|
- spec/features/get_diff.rb
|
713
722
|
- spec/features/get_previous_distinct_version.rb
|
723
|
+
- spec/features/get_provider_pacts.rb
|
714
724
|
- spec/features/get_version.rb
|
715
725
|
- spec/features/publish_not_a_pact_spec.rb
|
716
726
|
- spec/features/publish_pact_spec.rb
|