pact_broker 0.0.4 → 0.0.5
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.
- data/CHANGELOG.md +16 -2
- data/Gemfile.lock +12 -21
- data/config.ru +2 -1
- data/db/migrations/05_add_order_column_to_version.rb +7 -0
- data/db/pact_broker_database.sqlite3 +0 -0
- data/lib/pact_broker/api.rb +23 -11
- data/lib/pact_broker/api/representors.rb +4 -1
- data/lib/pact_broker/api/representors/pact_broker_urls.rb +8 -0
- data/lib/pact_broker/api/representors/pact_collection_representor.rb +34 -0
- data/lib/pact_broker/api/representors/pact_pacticipant_representor.rb +27 -0
- data/lib/pact_broker/api/representors/pact_representor.rb +27 -0
- data/lib/pact_broker/api/representors/pacticipant_collection_representor.rb +20 -0
- data/lib/pact_broker/api/representors/pacticipant_empty_collection_representor.rb +33 -0
- data/lib/pact_broker/api/representors/representable_pact.rb +19 -0
- data/lib/pact_broker/api/representors/version_representor.rb +1 -0
- data/lib/pact_broker/models/order_versions.rb +33 -0
- data/lib/pact_broker/models/pact.rb +7 -2
- data/lib/pact_broker/models/pacticipant.rb +3 -1
- data/lib/pact_broker/models/version.rb +7 -1
- data/lib/pact_broker/repositories/pact_repository.rb +26 -5
- data/lib/pact_broker/resources/json_resource.rb +37 -0
- data/lib/pact_broker/resources/latest_pact.rb +41 -0
- data/lib/pact_broker/resources/latest_pacts.rb +49 -0
- data/lib/pact_broker/resources/pact.rb +49 -0
- data/lib/pact_broker/resources/pacticipant.rb +80 -0
- data/lib/pact_broker/resources/pacticipants.rb +41 -0
- data/lib/pact_broker/services/pact_service.rb +11 -9
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +2 -3
- data/spec/lib/pact_broker/api/representors/pact_collection_representor_spec.rb +23 -0
- data/spec/lib/pact_broker/api/representors/representable_pact_spec.rb +29 -0
- data/spec/lib/pact_broker/models/order_versions_spec.rb +23 -0
- data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +39 -0
- data/spec/service_consumers/pact_helper.rb +2 -19
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +1 -48
- data/spec/spec_helper.rb +19 -0
- data/spec/support/provider_state_builder.rb +91 -0
- metadata +32 -29
- data/lib/pact_broker/api/base_api.rb +0 -40
- data/lib/pact_broker/api/index_api.rb +0 -23
- data/lib/pact_broker/api/pact_api.rb +0 -33
- data/lib/pact_broker/api/pacticipant_api.rb +0 -54
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'sequel'
|
2
|
+
require 'pact_broker/models/order_versions'
|
2
3
|
|
3
4
|
module PactBroker
|
4
5
|
|
@@ -6,8 +7,13 @@ module PactBroker
|
|
6
7
|
|
7
8
|
class Version < Sequel::Model
|
8
9
|
|
10
|
+
set_primary_key :id
|
9
11
|
one_to_many :pacts
|
10
|
-
|
12
|
+
associate(:many_to_one, :pacticipant, :class => "PactBroker::Models::Pacticipant", :key => :pacticipant_id, :primary_key => :id)
|
13
|
+
|
14
|
+
def after_create
|
15
|
+
OrderVersions.(self.pacticipant_id)
|
16
|
+
end
|
11
17
|
|
12
18
|
def to_s
|
13
19
|
"Version: number=#{number}, pacticipant=#{pacticipant_id}"
|
@@ -10,15 +10,25 @@ module PactBroker
|
|
10
10
|
PactBroker::Models::Pact.where(version_id: version_id, provider_id: provider_id).single_record
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def find_latest_pacts
|
14
|
+
|
15
|
+
# TODO Work out a more elegant and efficient way of executing this query.
|
16
|
+
# Haven't found a max/group by combination that works with Sequel Models
|
17
|
+
latest_versions = PactBroker::Models::Version.new.db.execute('select max(id) as id from versions where id in (select distinct(version_id) from pacts) group by pacticipant_id').collect{ | it | it }.flatten
|
18
|
+
|
14
19
|
PactBroker::Models::Pact.select(:pacts__id, :pacts__json_content, :pacts__version_id, :pacts__provider_id, :versions__number___consumer_version_number).
|
15
20
|
join(:versions, {:id => :version_id}, {implicit_qualifier: :pacts}).
|
16
21
|
join(:pacticipants, {:id => :pacticipant_id}, {:table_alias => :consumers, implicit_qualifier: :versions}).
|
17
22
|
join(:pacticipants, {:id => :provider_id}, {:table_alias => :providers, implicit_qualifier: :pacts}).
|
18
|
-
where('
|
19
|
-
|
20
|
-
|
21
|
-
|
23
|
+
where('versions.id in ?', latest_versions).all
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_latest_pact(consumer_name, provider_name)
|
27
|
+
pact_finder(consumer_name, provider_name).order(:order).last
|
28
|
+
end
|
29
|
+
|
30
|
+
def find_pact consumer_name, consumer_version, provider_name
|
31
|
+
pact_finder(consumer_name, provider_name).where('versions.number = ?', consumer_version).single_record
|
22
32
|
end
|
23
33
|
|
24
34
|
def create params
|
@@ -33,6 +43,17 @@ module PactBroker
|
|
33
43
|
end
|
34
44
|
end
|
35
45
|
|
46
|
+
private
|
47
|
+
|
48
|
+
def pact_finder consumer_name, provider_name
|
49
|
+
PactBroker::Models::Pact.select(:pacts__id, :pacts__json_content, :pacts__version_id, :pacts__provider_id, :versions__number___consumer_version_number).
|
50
|
+
join(:versions, {:id => :version_id}, {implicit_qualifier: :pacts}).
|
51
|
+
join(:pacticipants, {:id => :pacticipant_id}, {:table_alias => :consumers, implicit_qualifier: :versions}).
|
52
|
+
join(:pacticipants, {:id => :provider_id}, {:table_alias => :providers, implicit_qualifier: :pacts}).
|
53
|
+
where('providers.name = ?', provider_name).
|
54
|
+
where('consumers.name = ?', consumer_name)
|
55
|
+
end
|
56
|
+
|
36
57
|
end
|
37
58
|
end
|
38
59
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'webmachine'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
|
6
|
+
module Resources
|
7
|
+
|
8
|
+
module PathInfo
|
9
|
+
def identifier_from_path
|
10
|
+
request.path_info.each_with_object({}) do | pair, hash|
|
11
|
+
hash[pair.first] = CGI::unescape(pair.last)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class ErrorHandler
|
17
|
+
def self.handle_exception e, response
|
18
|
+
response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
|
19
|
+
response.code = 500
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class JsonResource < Webmachine::Resource
|
24
|
+
def content_types_provided
|
25
|
+
[["application/json", :to_json]]
|
26
|
+
end
|
27
|
+
|
28
|
+
def content_types_accepted
|
29
|
+
[["application/json", :from_json]]
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_exception e
|
33
|
+
PactBroker::Resources::ErrorHandler.handle_exception(e, response)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'webmachine'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'pact_broker/services'
|
5
|
+
require 'pact_broker/resources/json_resource'
|
6
|
+
|
7
|
+
module PactBroker
|
8
|
+
|
9
|
+
module Resources
|
10
|
+
|
11
|
+
class LatestPact < Webmachine::Resource
|
12
|
+
|
13
|
+
include PactBroker::Services
|
14
|
+
include PactBroker::Resources::PathInfo
|
15
|
+
|
16
|
+
def content_types_provided
|
17
|
+
[["application/json", :to_json]]
|
18
|
+
end
|
19
|
+
|
20
|
+
def allowed_methods
|
21
|
+
["GET"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def resource_exists?
|
25
|
+
@pact = pact_service.find_pact(identifier_from_path.merge(:consumer_version_number => 'last'))
|
26
|
+
@pact != nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_json
|
30
|
+
response.headers['X-Pact-Consumer-Version'] = @pact.consumer_version_number
|
31
|
+
@pact.json_content
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_exception e
|
35
|
+
PactBroker::Resources::ErrorHandler.handle_exception(e, response)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'webmachine'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'pact_broker/services'
|
5
|
+
require 'pact_broker/resources/json_resource'
|
6
|
+
|
7
|
+
require 'pact_broker/api/representors/representable_pact'
|
8
|
+
|
9
|
+
module PactBroker
|
10
|
+
|
11
|
+
module Resources
|
12
|
+
|
13
|
+
class LatestPacts < Webmachine::Resource
|
14
|
+
|
15
|
+
include PactBroker::Services
|
16
|
+
|
17
|
+
#FIX to hal+json
|
18
|
+
def content_types_provided
|
19
|
+
[["application/hal+json", :to_json]]
|
20
|
+
end
|
21
|
+
|
22
|
+
def allowed_methods
|
23
|
+
["GET"]
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json
|
27
|
+
generate_json(pact_service.find_latest_pacts)
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_json pacts
|
31
|
+
pacts = pacts.collect{ | pact | create_representable_pact(pact) }
|
32
|
+
pacts.extend(PactBroker::Api::Representors::PactCollectionRepresenter)
|
33
|
+
pacts.to_json
|
34
|
+
end
|
35
|
+
|
36
|
+
def handle_exception e
|
37
|
+
PactBroker::Resources::ErrorHandler.handle_exception(e, response)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def create_representable_pact pact
|
43
|
+
PactBroker::Api::Representors::RepresentablePact.new(pact)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'webmachine'
|
2
|
+
require 'json'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
require 'pact_broker/services'
|
6
|
+
require 'pact_broker/resources/json_resource'
|
7
|
+
|
8
|
+
module PactBroker
|
9
|
+
|
10
|
+
module Resources
|
11
|
+
|
12
|
+
class Pact < JsonResource
|
13
|
+
|
14
|
+
include PactBroker::Services
|
15
|
+
include PactBroker::Resources::PathInfo
|
16
|
+
|
17
|
+
def allowed_methods
|
18
|
+
["GET", "PUT"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def resource_exists?
|
22
|
+
@pact = pact_service.find_pact(identifier_from_path)
|
23
|
+
@pact != nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def from_json
|
27
|
+
pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
|
28
|
+
response.body = pact.json_content
|
29
|
+
@manual_response_code = 201 if created
|
30
|
+
end
|
31
|
+
|
32
|
+
def finish_request
|
33
|
+
if @manual_response_code
|
34
|
+
response.code = @manual_response_code
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_json
|
39
|
+
@pact.json_content
|
40
|
+
end
|
41
|
+
|
42
|
+
def pact_content
|
43
|
+
request.body.to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'webmachine'
|
2
|
+
require 'json'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
require 'pact_broker/services'
|
6
|
+
require 'pact_broker/resources/json_resource'
|
7
|
+
require 'pact_broker/api/representors'
|
8
|
+
|
9
|
+
module PactBroker
|
10
|
+
|
11
|
+
module Resources
|
12
|
+
|
13
|
+
class Pacticipant < Webmachine::Resource
|
14
|
+
|
15
|
+
include PactBroker::Services
|
16
|
+
include PactBroker::Resources::PathInfo
|
17
|
+
|
18
|
+
def content_types_provided
|
19
|
+
[["application/hal+json", :to_json]]
|
20
|
+
end
|
21
|
+
|
22
|
+
def content_types_accepted
|
23
|
+
[["application/json", :from_json]]
|
24
|
+
end
|
25
|
+
|
26
|
+
def handle_exception e
|
27
|
+
PactBroker::Resources::ErrorHandler.handle_exception(e, response)
|
28
|
+
end
|
29
|
+
|
30
|
+
def allowed_methods
|
31
|
+
["GET", "PATCH"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def known_methods
|
35
|
+
super + ['PATCH']
|
36
|
+
end
|
37
|
+
|
38
|
+
def from_json
|
39
|
+
pacticipant, created = pacticipant_service.create_or_update_pacticipant(
|
40
|
+
name: identifier_from_path[:name],
|
41
|
+
repository_url: params[:repository_url]
|
42
|
+
)
|
43
|
+
@manual_response_code = 201 if created
|
44
|
+
response.body = generate_json(pacticipant)
|
45
|
+
end
|
46
|
+
|
47
|
+
def finish_request
|
48
|
+
if @manual_response_code
|
49
|
+
response.code = @manual_response_code
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def resource_exists?
|
54
|
+
#Terrible hack to allow Webmachine to continue when a PATCH is used - does not seem to support it
|
55
|
+
if request.method == 'PATCH'
|
56
|
+
def request.method
|
57
|
+
'PUT'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
@pacticipant = pacticipant_service.find_pacticipant_by_name(identifier_from_path[:name])
|
61
|
+
@pacticipant != nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_json
|
65
|
+
generate_json(@pacticipant)
|
66
|
+
end
|
67
|
+
|
68
|
+
def generate_json pacticipant
|
69
|
+
pacticipant.extend(PactBroker::Api::Representors::PacticipantRepresenter)
|
70
|
+
pacticipant.to_json
|
71
|
+
end
|
72
|
+
|
73
|
+
def params
|
74
|
+
JSON.parse(request.body.to_s)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'webmachine'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'pact_broker/services'
|
5
|
+
require 'pact_broker/resources/json_resource'
|
6
|
+
require 'pact_broker/api/representors'
|
7
|
+
|
8
|
+
module PactBroker
|
9
|
+
|
10
|
+
module Resources
|
11
|
+
|
12
|
+
class Pacticipants < Webmachine::Resource
|
13
|
+
|
14
|
+
include PactBroker::Services
|
15
|
+
include PactBroker::Resources::PathInfo
|
16
|
+
|
17
|
+
def content_types_provided
|
18
|
+
[["application/hal+json", :to_json]]
|
19
|
+
end
|
20
|
+
|
21
|
+
def handle_exception e
|
22
|
+
PactBroker::Resources::ErrorHandler.handle_exception(e, response)
|
23
|
+
end
|
24
|
+
|
25
|
+
def allowed_methods
|
26
|
+
["GET"]
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_json
|
30
|
+
generate_json(pacticipant_service.find_all_pacticipants)
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_json pacticipants
|
34
|
+
pacticipants.extend(PactBroker::Api::Representors::PacticipantCollectionRepresenter)
|
35
|
+
pacticipants.to_json
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -10,25 +10,27 @@ module PactBroker
|
|
10
10
|
extend PactBroker::Repositories
|
11
11
|
|
12
12
|
def find_pact params
|
13
|
-
if params[:
|
14
|
-
pact_repository.
|
13
|
+
if params[:consumer_version_number] == 'last'
|
14
|
+
pact_repository.find_latest_pact(params[:consumer_name], params[:provider_name])
|
15
15
|
else
|
16
|
-
|
16
|
+
pact_repository.find_pact(params[:consumer_name], params[:consumer_version_number], params[:provider_name])
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def find_latest_pacts
|
21
|
+
pact_repository.find_latest_pacts
|
22
|
+
end
|
23
|
+
|
20
24
|
def create_or_update_pact params
|
21
|
-
provider = pacticipant_repository.find_by_name_or_create params[:
|
22
|
-
consumer = pacticipant_repository.find_by_name_or_create params[:
|
23
|
-
version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:
|
25
|
+
provider = pacticipant_repository.find_by_name_or_create params[:provider_name]
|
26
|
+
consumer = pacticipant_repository.find_by_name_or_create params[:consumer_name]
|
27
|
+
version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:consumer_version_number]
|
24
28
|
|
25
29
|
if pact = pact_repository.find_by_version_and_provider(version.id, provider.id)
|
26
|
-
http_status = 200
|
27
30
|
pact.update(json_content: params[:json_content])
|
28
31
|
return pact, false
|
29
32
|
else
|
30
|
-
|
31
|
-
pact_repository.create json_content: params[:json_content], version_id: version.id, provider_id: provider.id
|
33
|
+
pact = pact_repository.create json_content: params[:json_content], version_id: version.id, provider_id: provider.id
|
32
34
|
return pact, true
|
33
35
|
end
|
34
36
|
|
data/lib/pact_broker/version.rb
CHANGED
data/pact_broker.gemspec
CHANGED
@@ -22,12 +22,11 @@ Gem::Specification.new do |gem|
|
|
22
22
|
#gem.add_runtime_dependency 'pact'
|
23
23
|
gem.add_runtime_dependency 'httparty'
|
24
24
|
gem.add_runtime_dependency 'json'
|
25
|
-
gem.add_runtime_dependency 'sinatra'
|
26
|
-
gem.add_runtime_dependency 'sinatra-contrib'
|
27
|
-
gem.add_runtime_dependency 'sinatra-param'
|
28
25
|
gem.add_runtime_dependency 'roar'
|
29
26
|
gem.add_runtime_dependency 'sequel'
|
30
27
|
gem.add_runtime_dependency 'sqlite3'
|
28
|
+
gem.add_runtime_dependency 'webmachine'
|
29
|
+
gem.add_runtime_dependency 'versionomy'
|
31
30
|
|
32
31
|
gem.add_development_dependency 'rake', '~> 10.0.3'
|
33
32
|
gem.add_development_dependency 'pry'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'pact_broker/models'
|
4
|
+
require 'pact_broker/api/representors'
|
5
|
+
|
6
|
+
module PactBroker::Api::Representors
|
7
|
+
|
8
|
+
describe PactCollectionRepresenter do
|
9
|
+
|
10
|
+
let(:pact) do
|
11
|
+
provider = PactBroker::Models::Pacticipant.create(:name => 'Pricing Service')
|
12
|
+
consumer = PactBroker::Models::Pacticipant.create(:name => 'Condor')
|
13
|
+
version = PactBroker::Models::Version.create(:number => '1.3.0', :pacticipant => consumer)
|
14
|
+
pact = PactBroker::Models::Pact.create(:consumer_version => version, :provider => provider)
|
15
|
+
pact
|
16
|
+
end
|
17
|
+
|
18
|
+
xit "should description" do
|
19
|
+
puts [pact].extend(PactCollectionRepresenter).to_json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|