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.
Files changed (42) hide show
  1. data/CHANGELOG.md +16 -2
  2. data/Gemfile.lock +12 -21
  3. data/config.ru +2 -1
  4. data/db/migrations/05_add_order_column_to_version.rb +7 -0
  5. data/db/pact_broker_database.sqlite3 +0 -0
  6. data/lib/pact_broker/api.rb +23 -11
  7. data/lib/pact_broker/api/representors.rb +4 -1
  8. data/lib/pact_broker/api/representors/pact_broker_urls.rb +8 -0
  9. data/lib/pact_broker/api/representors/pact_collection_representor.rb +34 -0
  10. data/lib/pact_broker/api/representors/pact_pacticipant_representor.rb +27 -0
  11. data/lib/pact_broker/api/representors/pact_representor.rb +27 -0
  12. data/lib/pact_broker/api/representors/pacticipant_collection_representor.rb +20 -0
  13. data/lib/pact_broker/api/representors/pacticipant_empty_collection_representor.rb +33 -0
  14. data/lib/pact_broker/api/representors/representable_pact.rb +19 -0
  15. data/lib/pact_broker/api/representors/version_representor.rb +1 -0
  16. data/lib/pact_broker/models/order_versions.rb +33 -0
  17. data/lib/pact_broker/models/pact.rb +7 -2
  18. data/lib/pact_broker/models/pacticipant.rb +3 -1
  19. data/lib/pact_broker/models/version.rb +7 -1
  20. data/lib/pact_broker/repositories/pact_repository.rb +26 -5
  21. data/lib/pact_broker/resources/json_resource.rb +37 -0
  22. data/lib/pact_broker/resources/latest_pact.rb +41 -0
  23. data/lib/pact_broker/resources/latest_pacts.rb +49 -0
  24. data/lib/pact_broker/resources/pact.rb +49 -0
  25. data/lib/pact_broker/resources/pacticipant.rb +80 -0
  26. data/lib/pact_broker/resources/pacticipants.rb +41 -0
  27. data/lib/pact_broker/services/pact_service.rb +11 -9
  28. data/lib/pact_broker/version.rb +1 -1
  29. data/pact_broker.gemspec +2 -3
  30. data/spec/lib/pact_broker/api/representors/pact_collection_representor_spec.rb +23 -0
  31. data/spec/lib/pact_broker/api/representors/representable_pact_spec.rb +29 -0
  32. data/spec/lib/pact_broker/models/order_versions_spec.rb +23 -0
  33. data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +39 -0
  34. data/spec/service_consumers/pact_helper.rb +2 -19
  35. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +1 -48
  36. data/spec/spec_helper.rb +19 -0
  37. data/spec/support/provider_state_builder.rb +91 -0
  38. metadata +32 -29
  39. data/lib/pact_broker/api/base_api.rb +0 -40
  40. data/lib/pact_broker/api/index_api.rb +0 -23
  41. data/lib/pact_broker/api/pact_api.rb +0 -33
  42. 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
- one_to_one :pacticipant
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 find_latest_version(consumer_name, provider_name)
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('providers.name = ?', provider_name).
19
- where('consumers.name = ?', consumer_name).
20
- order(:version_id).
21
- last
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[:number] == 'last'
14
- pact_repository.find_latest_version(params[:consumer], params[:provider])
13
+ if params[:consumer_version_number] == 'last'
14
+ pact_repository.find_latest_pact(params[:consumer_name], params[:provider_name])
15
15
  else
16
- raise NotImplementedError
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[:provider]
22
- consumer = pacticipant_repository.find_by_name_or_create params[:consumer]
23
- version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:number]
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
- http_status = 201
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
 
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
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