pact_broker 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +11 -9
- data/lib/pact_broker/api/decorators/base_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +24 -0
- data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +3 -3
- data/lib/pact_broker/api/decorators/pact_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/tag_decorator.rb +19 -0
- data/lib/pact_broker/api/decorators.rb +2 -1
- data/lib/pact_broker/api/{decorators/pact_broker_urls.rb → pact_broker_urls.rb} +14 -1
- data/lib/pact_broker/api/resources/base_resource.rb +14 -1
- data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
- data/lib/pact_broker/api/resources/pact.rb +3 -9
- data/lib/pact_broker/api/resources/pacticipant.rb +8 -21
- data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
- data/lib/pact_broker/api/resources/tag.rb +44 -0
- data/lib/pact_broker/api.rb +2 -0
- data/lib/pact_broker/logging.rb +4 -0
- data/lib/pact_broker/models/tag.rb +5 -0
- data/lib/pact_broker/repositories/tag_repository.rb +25 -0
- data/lib/pact_broker/repositories/version_repository.rb +8 -0
- data/lib/pact_broker/repositories.rb +5 -0
- data/lib/pact_broker/services/pacticipant_service.rb +9 -9
- data/lib/pact_broker/services/tag_service.rb +25 -0
- data/lib/pact_broker/services.rb +5 -0
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +1 -1
- data/spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/resources/tag_spec.rb +118 -0
- data/spec/lib/pact_broker/repositories/tag_repository_spec.rb +53 -0
- data/spec/lib/pact_broker/repositories/version_repository_spec.rb +38 -0
- data/spec/lib/pact_broker/services/tag_service_spec.rb +31 -0
- data/spec/service_consumers/pact_helper.rb +1 -0
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +9 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/provider_state_builder.rb +25 -0
- metadata +22 -9
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,20 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
$ git log --date=relative --pretty=format:' * %h - %s (%an, %ad)' 'package/pact-broker-0.0.PRODVERSION'..'package/pact-broker-0.0.NEWVERSION'
|
4
4
|
|
5
|
+
#### 0.0.10 (2014-03-24)
|
6
|
+
|
7
|
+
* 7aee2ae - Implemented version tagging (Beth, 2 days ago)
|
8
|
+
* cc78f92 - Added 'latest' pact url to pact representation in the 'latest pacts' response (Beth, 2 days ago)
|
9
|
+
|
10
|
+
#### 0.0.9 (2014-02-27)
|
11
|
+
|
12
|
+
* d07f4b7 - Using default gem publish tasks (Beth, 4 weeks ago)
|
13
|
+
* d60b7ee - Comment (Beth, 7 weeks ago)
|
14
|
+
* 836347c - Using local pacts (Beth, 7 weeks ago)
|
15
|
+
* a2cb2bb - Fixed bug querying mysql DB, rather than sqlite (Beth, 7 weeks ago)
|
16
|
+
* 9d5f83b - Using the to_json options to pass in the base_url instead of the nasty hack. (Beth, 4 months ago)
|
17
|
+
* adb6148 - Changed 'last' to 'latest' (Beth, 4 months ago)
|
18
|
+
|
5
19
|
#### 0.0.8 (2013-11-18)
|
6
20
|
|
7
21
|
* 6022baa - Changed name to title in list pacticipants response (Beth, 7 hours ago)
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pact_broker (0.0.
|
4
|
+
pact_broker (0.0.10)
|
5
5
|
httparty
|
6
6
|
json
|
7
7
|
roar
|
@@ -20,6 +20,7 @@ GEM
|
|
20
20
|
ci_reporter (1.9.0)
|
21
21
|
builder (>= 2.1.2)
|
22
22
|
coderay (1.0.9)
|
23
|
+
colored (1.2)
|
23
24
|
columnize (0.3.6)
|
24
25
|
debugger (1.6.2)
|
25
26
|
columnize (>= 0.3.1)
|
@@ -30,7 +31,7 @@ GEM
|
|
30
31
|
diff-lcs (1.2.5)
|
31
32
|
fakefs (0.4.3)
|
32
33
|
find_a_port (1.0.1)
|
33
|
-
httparty (0.
|
34
|
+
httparty (0.13.0)
|
34
35
|
json (~> 1.8)
|
35
36
|
multi_xml (>= 0.5.2)
|
36
37
|
i18n (0.6.9)
|
@@ -41,8 +42,9 @@ GEM
|
|
41
42
|
multi_xml (0.5.5)
|
42
43
|
nokogiri (1.6.1)
|
43
44
|
mini_portile (~> 0.5.0)
|
44
|
-
pact (1.0.
|
45
|
+
pact (1.1.0.rc1)
|
45
46
|
awesome_print (~> 1.1)
|
47
|
+
colored
|
46
48
|
find_a_port (~> 1.0.1)
|
47
49
|
json
|
48
50
|
rack-test (~> 0.6.2)
|
@@ -59,11 +61,11 @@ GEM
|
|
59
61
|
rack (>= 1.0)
|
60
62
|
rake (10.0.4)
|
61
63
|
randexp (0.1.7)
|
62
|
-
representable (1.
|
64
|
+
representable (1.7.7)
|
63
65
|
multi_json
|
64
66
|
nokogiri
|
65
|
-
roar (0.12.
|
66
|
-
representable (
|
67
|
+
roar (0.12.4)
|
68
|
+
representable (>= 1.6.0)
|
67
69
|
rspec (2.14.1)
|
68
70
|
rspec-core (~> 2.14.0)
|
69
71
|
rspec-expectations (~> 2.14.0)
|
@@ -74,7 +76,7 @@ GEM
|
|
74
76
|
rspec-fire (1.2.0)
|
75
77
|
rspec (~> 2.11)
|
76
78
|
rspec-mocks (2.14.4)
|
77
|
-
sequel (4.
|
79
|
+
sequel (4.8.0)
|
78
80
|
shotgun (0.9)
|
79
81
|
rack (>= 1.0)
|
80
82
|
simplecov (0.7.1)
|
@@ -82,7 +84,7 @@ GEM
|
|
82
84
|
simplecov-html (~> 0.7.1)
|
83
85
|
simplecov-html (0.7.1)
|
84
86
|
slop (3.4.6)
|
85
|
-
sqlite3 (1.3.
|
87
|
+
sqlite3 (1.3.9)
|
86
88
|
thor (0.18.1)
|
87
89
|
versionomy (0.4.4)
|
88
90
|
blockenspiel (>= 0.4.5)
|
@@ -99,7 +101,7 @@ DEPENDENCIES
|
|
99
101
|
ci_reporter
|
100
102
|
debugger
|
101
103
|
fakefs (~> 0.4)
|
102
|
-
pact
|
104
|
+
pact (= 1.1.0.rc1)
|
103
105
|
pact_broker!
|
104
106
|
pry
|
105
107
|
rake (~> 10.0.3)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'pact_decorator'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
|
5
|
+
module Api
|
6
|
+
|
7
|
+
module Decorators
|
8
|
+
|
9
|
+
class LatestPactDecorator < PactDecorator
|
10
|
+
|
11
|
+
links :self do | options |
|
12
|
+
[
|
13
|
+
{
|
14
|
+
href: latest_pact_url(options[:base_url], represented)
|
15
|
+
},{
|
16
|
+
href: pact_url(options[:base_url], represented)
|
17
|
+
}
|
18
|
+
]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'base_decorator'
|
2
2
|
require_relative 'version_decorator'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'latest_pact_decorator'
|
4
4
|
require_relative 'representable_pact'
|
5
5
|
|
6
6
|
module PactBroker
|
@@ -9,11 +9,11 @@ module PactBroker
|
|
9
9
|
|
10
10
|
module Decorators
|
11
11
|
|
12
|
-
class
|
12
|
+
class PactCollectionDecorator < BaseDecorator
|
13
13
|
include Roar::Representer::JSON::HAL
|
14
14
|
include PactBroker::Api::PactBrokerUrls
|
15
15
|
|
16
|
-
collection :pacts, decorator_scope: true, :class => PactBroker::Models::Pact, :extend => PactBroker::Api::Decorators::
|
16
|
+
collection :pacts, decorator_scope: true, :class => PactBroker::Models::Pact, :extend => PactBroker::Api::Decorators::LatestPactDecorator
|
17
17
|
|
18
18
|
def pacts
|
19
19
|
represented.collect{ | pact | create_representable_pact(pact) }
|
@@ -7,7 +7,7 @@ module PactBroker
|
|
7
7
|
|
8
8
|
module Decorators
|
9
9
|
|
10
|
-
class
|
10
|
+
class PactDecorator < BaseDecorator
|
11
11
|
|
12
12
|
property :consumer, :extend => PactBroker::Api::Decorators::PactPacticipantRepresenter, :embedded => true
|
13
13
|
property :provider, :extend => PactBroker::Api::Decorators::PactPacticipantRepresenter, :embedded => true
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'base_decorator'
|
2
|
+
require_relative 'pact_pacticipant_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
|
6
|
+
module Api
|
7
|
+
|
8
|
+
module Decorators
|
9
|
+
|
10
|
+
class TagDecorator < BaseDecorator
|
11
|
+
|
12
|
+
link :self do | options |
|
13
|
+
tag_url(options[:base_url], represented)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -3,4 +3,5 @@ require 'pact_broker/api/decorators/pacticipant_collection_decorator'
|
|
3
3
|
require 'pact_broker/api/decorators/version_decorator'
|
4
4
|
require 'pact_broker/api/decorators/pact_collection_decorator'
|
5
5
|
require 'pact_broker/api/decorators/pact_pacticipant_decorator'
|
6
|
-
require 'pact_broker/api/decorators/pact_decorator'
|
6
|
+
require 'pact_broker/api/decorators/pact_decorator'
|
7
|
+
require 'pact_broker/api/decorators/tag_decorator'
|
@@ -23,7 +23,8 @@ module PactBroker
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def pact_url base_url, pact
|
26
|
-
|
26
|
+
representable_pact = representable_pact(pact)
|
27
|
+
"#{pactigration_base_url(base_url, representable_pact)}/version/#{representable_pact.consumer.version.number}"
|
27
28
|
end
|
28
29
|
|
29
30
|
def latest_pact_url base_url, pact
|
@@ -34,8 +35,20 @@ module PactBroker
|
|
34
35
|
"#{base_url}/pacts/latest"
|
35
36
|
end
|
36
37
|
|
38
|
+
def tags_url base_url, version
|
39
|
+
"#{version_url(base_url, version)}/tags"
|
40
|
+
end
|
41
|
+
|
42
|
+
def tag_url base_url, tag
|
43
|
+
"#{tags_url(base_url, tag.version)}/#{tag.name}"
|
44
|
+
end
|
45
|
+
|
37
46
|
private
|
38
47
|
|
48
|
+
def representable_pact pact
|
49
|
+
Decorators::RepresentablePact === pact ? pact : Decorators::RepresentablePact.new(pact)
|
50
|
+
end
|
51
|
+
|
39
52
|
def pactigration_base_url base_url, pact
|
40
53
|
"#{base_url}/pact/provider/#{url_encode(pact.provider.name)}/consumer/#{url_encode(pact.consumer.name)}"
|
41
54
|
end
|
@@ -1,13 +1,21 @@
|
|
1
1
|
require 'webmachine'
|
2
2
|
require 'pact_broker/services'
|
3
3
|
require 'pact_broker/api/decorators'
|
4
|
+
require 'pact_broker/logging'
|
5
|
+
require 'pact_broker/api/pact_broker_urls'
|
4
6
|
|
5
7
|
module PactBroker::Api
|
6
8
|
|
7
9
|
module Resources
|
8
10
|
|
11
|
+
|
9
12
|
class ErrorHandler
|
13
|
+
|
14
|
+
include PactBroker::Logging
|
15
|
+
|
10
16
|
def self.handle_exception e, response
|
17
|
+
logger.error e
|
18
|
+
logger.error e.backtrace
|
11
19
|
response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
|
12
20
|
response.code = 500
|
13
21
|
end
|
@@ -16,6 +24,7 @@ module PactBroker::Api
|
|
16
24
|
class BaseResource < Webmachine::Resource
|
17
25
|
|
18
26
|
include PactBroker::Services
|
27
|
+
include PactBroker::Api::PactBrokerUrls
|
19
28
|
|
20
29
|
def identifier_from_path
|
21
30
|
request.path_info.each_with_object({}) do | pair, hash|
|
@@ -23,13 +32,17 @@ module PactBroker::Api
|
|
23
32
|
end
|
24
33
|
end
|
25
34
|
|
26
|
-
def
|
35
|
+
def resource_url
|
27
36
|
request.uri.to_s.gsub(/#{request.uri.path}$/,'')
|
28
37
|
end
|
29
38
|
|
30
39
|
def handle_exception e
|
31
40
|
PactBroker::Api::Resources::ErrorHandler.handle_exception(e, response)
|
32
41
|
end
|
42
|
+
|
43
|
+
def params
|
44
|
+
JSON.parse(request.body.to_s, symbolize_names: true)
|
45
|
+
end
|
33
46
|
end
|
34
47
|
end
|
35
48
|
end
|
@@ -19,7 +19,7 @@ module PactBroker::Api
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def generate_json pacts
|
22
|
-
PactBroker::Api::Decorators::
|
22
|
+
PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(base_url: resource_url)
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
@@ -25,15 +25,9 @@ module PactBroker::Api
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def from_json
|
28
|
-
pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
|
29
|
-
response.
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
def finish_request
|
34
|
-
if @manual_response_code
|
35
|
-
response.code = @manual_response_code
|
36
|
-
end
|
28
|
+
@pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
|
29
|
+
response.headers["Location"] = pact_url(resource_url, @pact) if created
|
30
|
+
response.body = to_json
|
37
31
|
end
|
38
32
|
|
39
33
|
def to_json
|
@@ -31,12 +31,13 @@ module PactBroker::Api
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def from_json
|
34
|
-
pacticipant
|
35
|
-
name: identifier_from_path[:name]
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
if @pacticipant
|
35
|
+
@pacticipant = pacticipant_service.update params.merge(name: identifier_from_path[:name])
|
36
|
+
else
|
37
|
+
@pacticipant = pacticipant_service.create params.merge(name: identifier_from_path[:name])
|
38
|
+
response.headers["Location"] = pacticipant_url(resource_url, @pacticipant)
|
39
|
+
end
|
40
|
+
response.body = to_json
|
40
41
|
end
|
41
42
|
|
42
43
|
def resource_exists?
|
@@ -44,22 +45,8 @@ module PactBroker::Api
|
|
44
45
|
@pacticipant != nil
|
45
46
|
end
|
46
47
|
|
47
|
-
def finish_request
|
48
|
-
if @manual_response_code
|
49
|
-
response.code = @manual_response_code
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
48
|
def to_json
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
def generate_json pacticipant
|
58
|
-
PactBroker::Api::Decorators::PacticipantRepresenter.new(pacticipant).to_json(base_url: request_base_url)
|
59
|
-
end
|
60
|
-
|
61
|
-
def params
|
62
|
-
JSON.parse(request.body.to_s)
|
49
|
+
PactBroker::Api::Decorators::PacticipantRepresenter.new(@pacticipant).to_json(base_url: resource_url)
|
63
50
|
end
|
64
51
|
|
65
52
|
end
|
@@ -19,7 +19,7 @@ module PactBroker::Api
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def generate_json pacticipants
|
22
|
-
PactBroker::Api::Decorators::PacticipantCollectionRepresenter.new(pacticipants).to_json(base_url:
|
22
|
+
PactBroker::Api::Decorators::PacticipantCollectionRepresenter.new(pacticipants).to_json(base_url: resource_url)
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
2
|
+
|
3
|
+
module PactBroker::Api
|
4
|
+
|
5
|
+
module Resources
|
6
|
+
|
7
|
+
class Tag < BaseResource
|
8
|
+
|
9
|
+
def content_types_provided
|
10
|
+
[["application/hal+json", :to_json]]
|
11
|
+
end
|
12
|
+
|
13
|
+
def content_types_accepted
|
14
|
+
[["application/json", :from_json]]
|
15
|
+
end
|
16
|
+
|
17
|
+
def allowed_methods
|
18
|
+
["GET","PUT"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def from_json
|
22
|
+
unless @tag
|
23
|
+
@tag = tag_service.create identifier_from_path
|
24
|
+
response.headers["Location"] = tag_url(resource_url, @tag)
|
25
|
+
end
|
26
|
+
response.body = generate_json @tag
|
27
|
+
end
|
28
|
+
|
29
|
+
def resource_exists?
|
30
|
+
@tag = tag_service.find identifier_from_path
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_json
|
34
|
+
generate_json(@tag)
|
35
|
+
end
|
36
|
+
|
37
|
+
def generate_json tag
|
38
|
+
PactBroker::Api::Decorators::TagDecorator.new(tag).to_json(base_url: resource_url)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/lib/pact_broker/api.rb
CHANGED
@@ -3,6 +3,7 @@ require 'pact_broker/api/resources/latest_pact'
|
|
3
3
|
require 'pact_broker/api/resources/latest_pacts'
|
4
4
|
require 'pact_broker/api/resources/pacticipant'
|
5
5
|
require 'pact_broker/api/resources/pacticipants'
|
6
|
+
require 'pact_broker/api/resources/tag'
|
6
7
|
require 'pact_broker/api/resources/index'
|
7
8
|
|
8
9
|
require 'webmachine/adapters/rack'
|
@@ -18,6 +19,7 @@ module PactBroker
|
|
18
19
|
add ['pacts', 'latest'], Api::Resources::LatestPacts
|
19
20
|
add ['pacticipants'], Api::Resources::Pacticipants
|
20
21
|
add ['pacticipants', :name], Api::Resources::Pacticipant
|
22
|
+
add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number, 'tags', :tag_name], Api::Resources::Tag
|
21
23
|
add [], Api::Resources::Index
|
22
24
|
end
|
23
25
|
end
|
data/lib/pact_broker/logging.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'pact_broker/models/tag'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Repositories
|
5
|
+
class TagRepository
|
6
|
+
|
7
|
+
|
8
|
+
def create args
|
9
|
+
Models::Tag.new(name: args.fetch(:name), version: args.fetch(:version)).save
|
10
|
+
end
|
11
|
+
|
12
|
+
def find args
|
13
|
+
PactBroker::Models::Tag
|
14
|
+
.select(:tags__name, :tags__version_id)
|
15
|
+
.join(:versions, {id: :version_id})
|
16
|
+
.join(:pacticipants, {pacticipants__id: :versions__pacticipant_id})
|
17
|
+
.where(:tags__name => args.fetch(:tag_name))
|
18
|
+
.where(:versions__number => args.fetch(:pacticipant_version_number))
|
19
|
+
.where(:pacticipants__name => args.fetch(:pacticipant_name))
|
20
|
+
.single_record
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -9,6 +9,14 @@ module PactBroker
|
|
9
9
|
PactBroker::Models::Version.where(number: number, pacticipant_id: pacticipant_id).single_record
|
10
10
|
end
|
11
11
|
|
12
|
+
def find_by_pacticipant_name_and_number pacticipant_name, number
|
13
|
+
PactBroker::Models::Version
|
14
|
+
.where(number: number)
|
15
|
+
.join(:pacticipants, {id: :pacticipant_id})
|
16
|
+
.where(name: pacticipant_name)
|
17
|
+
.single_record
|
18
|
+
end
|
19
|
+
|
12
20
|
def create args
|
13
21
|
PactBroker.logger.info "Creating version #{args[:number]} for pacticipant_id=#{args[:pacticipant_id]}"
|
14
22
|
PactBroker::Models::Version.new(number: args[:number], pacticipant_id: args[:pacticipant_id]).save
|
@@ -2,6 +2,7 @@ require 'pact_broker/models'
|
|
2
2
|
require 'pact_broker/repositories/pacticipant_repository'
|
3
3
|
require 'pact_broker/repositories/version_repository'
|
4
4
|
require 'pact_broker/repositories/pact_repository'
|
5
|
+
require 'pact_broker/repositories/tag_repository'
|
5
6
|
|
6
7
|
module PactBroker
|
7
8
|
module Repositories
|
@@ -17,6 +18,10 @@ module PactBroker
|
|
17
18
|
PactRepository.new
|
18
19
|
end
|
19
20
|
|
21
|
+
def tag_repository
|
22
|
+
TagRepository.new
|
23
|
+
end
|
24
|
+
|
20
25
|
extend self
|
21
26
|
end
|
22
27
|
end
|
@@ -24,16 +24,16 @@ module PactBroker
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def self.
|
28
|
-
pacticipant = pacticipant_repository.find_by_name(params
|
29
|
-
|
30
|
-
|
31
|
-
return pacticipant, false
|
32
|
-
else
|
33
|
-
pacticipant = pacticipant_repository.create(name: params[:name], repository_url: params[:repository_url])
|
34
|
-
return pacticipant, true
|
35
|
-
end
|
27
|
+
def self.update params
|
28
|
+
pacticipant = pacticipant_repository.find_by_name(params.fetch(:name))
|
29
|
+
pacticipant.update(params)
|
30
|
+
pacticipant_repository.find_by_name(params.fetch(:name))
|
36
31
|
end
|
32
|
+
|
33
|
+
def self.create params
|
34
|
+
pacticipant_repository.create(params)
|
35
|
+
end
|
36
|
+
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'pact_broker/repositories'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
|
5
|
+
module Services
|
6
|
+
module TagService
|
7
|
+
|
8
|
+
extend self
|
9
|
+
|
10
|
+
extend PactBroker::Repositories
|
11
|
+
|
12
|
+
def create args
|
13
|
+
pacticipant = pacticipant_repository.find_by_name_or_create args.fetch(:pacticipant_name)
|
14
|
+
version = version_repository.find_by_pacticipant_id_and_number_or_create pacticipant.id, args.fetch(:pacticipant_version_number)
|
15
|
+
tag_repository.create version: version, name: args.fetch(:tag_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def find args
|
19
|
+
tag_repository.find args
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/pact_broker/services.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'pact_broker/services/pact_service'
|
2
2
|
require 'pact_broker/services/pacticipant_service'
|
3
|
+
require 'pact_broker/services/tag_service'
|
3
4
|
|
4
5
|
module PactBroker
|
5
6
|
module Services
|
@@ -10,5 +11,9 @@ module PactBroker
|
|
10
11
|
def pacticipant_service
|
11
12
|
PacticipantService
|
12
13
|
end
|
14
|
+
|
15
|
+
def tag_service
|
16
|
+
TagService
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
data/lib/pact_broker/version.rb
CHANGED
data/pact_broker.gemspec
CHANGED
@@ -36,5 +36,5 @@ Gem::Specification.new do |gem|
|
|
36
36
|
gem.add_development_dependency 'ci_reporter'
|
37
37
|
gem.add_development_dependency 'simplecov'
|
38
38
|
gem.add_development_dependency 'shotgun'
|
39
|
-
gem.add_development_dependency 'pact'
|
39
|
+
gem.add_development_dependency 'pact', '1.1.0.rc1'
|
40
40
|
end
|
@@ -5,7 +5,7 @@ require 'pact_broker/api/decorators'
|
|
5
5
|
|
6
6
|
module PactBroker::Api::Decorators
|
7
7
|
|
8
|
-
describe
|
8
|
+
describe PactCollectionDecorator do
|
9
9
|
|
10
10
|
let(:pact) do
|
11
11
|
provider = PactBroker::Models::Pacticipant.create(:name => 'Pricing Service')
|
@@ -16,7 +16,7 @@ module PactBroker::Api::Decorators
|
|
16
16
|
end
|
17
17
|
|
18
18
|
xit "should description" do
|
19
|
-
puts
|
19
|
+
puts PactCollectionDecorator.new([pact]).to_json
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/api/resources/tag'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
|
7
|
+
module Resources
|
8
|
+
|
9
|
+
describe Tag do
|
10
|
+
|
11
|
+
let(:tag) { double("PactBroker::Models::Tag") }
|
12
|
+
let(:tag_decorator) { instance_double("PactBroker::Api::Decorators::TagDecorator", :to_json => tag_json) }
|
13
|
+
let(:tag_json) { {"some" => "tag"}.to_json }
|
14
|
+
let(:tag_attributes) {
|
15
|
+
{
|
16
|
+
:pacticipant_name => "Condor",
|
17
|
+
:pacticipant_version_number => "1.3.0",
|
18
|
+
:tag_name => "prod"
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
describe "GET" do
|
23
|
+
before do
|
24
|
+
allow(Services::TagService).to receive(:find).and_return(tag)
|
25
|
+
allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
|
26
|
+
end
|
27
|
+
|
28
|
+
subject { get("/pacticipants/Condor/versions/1.3.0/tags/prod" ) }
|
29
|
+
|
30
|
+
context "when the tag exists" do
|
31
|
+
|
32
|
+
it "renders the tag" do
|
33
|
+
subject
|
34
|
+
expect(last_response.body).to eq tag_json
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns a success response" do
|
38
|
+
subject
|
39
|
+
expect(last_response).to be_successful
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when the tag does not exist" do
|
45
|
+
let(:tag) { nil }
|
46
|
+
|
47
|
+
it "returns a 404" do
|
48
|
+
subject
|
49
|
+
expect(last_response.status).to eq 404
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "PUT" do
|
55
|
+
|
56
|
+
let(:tag_url) { 'http://example.org/tag/url'}
|
57
|
+
|
58
|
+
before do
|
59
|
+
allow_any_instance_of(PactBroker::Api::Resources::Tag).to receive(:tag_url).and_return(tag_url)
|
60
|
+
allow(Services::TagService).to receive(:find).and_return(tag)
|
61
|
+
allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
|
62
|
+
end
|
63
|
+
|
64
|
+
subject { put("/pacticipants/Condor/versions/1.3.0/tags/prod", nil, "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "application/json") }
|
65
|
+
|
66
|
+
it "returns a success response" do
|
67
|
+
subject
|
68
|
+
expect(last_response).to be_successful
|
69
|
+
end
|
70
|
+
|
71
|
+
context "when the tag already exists" do
|
72
|
+
|
73
|
+
it "returns a 200" do
|
74
|
+
subject
|
75
|
+
expect(last_response.status).to be 200
|
76
|
+
end
|
77
|
+
|
78
|
+
it "renders the tag" do
|
79
|
+
expect(tag_decorator).to receive(:to_json).with(base_url: "http://example.org")
|
80
|
+
subject
|
81
|
+
expect(last_response.body).to eq tag_json
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when the tag does not exist" do
|
87
|
+
before do
|
88
|
+
allow(Services::TagService).to receive(:find).and_return(nil)
|
89
|
+
allow(Services::TagService).to receive(:create).and_return(tag)
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
it "creates the tag" do
|
94
|
+
expect(Services::TagService).to receive(:create).with(tag_attributes)
|
95
|
+
subject
|
96
|
+
end
|
97
|
+
|
98
|
+
it "returns a 201" do
|
99
|
+
subject
|
100
|
+
expect(last_response.status).to be 201
|
101
|
+
end
|
102
|
+
|
103
|
+
it "renders the tag" do
|
104
|
+
expect(tag_decorator).to receive(:to_json).with(base_url: "http://example.org")
|
105
|
+
subject
|
106
|
+
expect(last_response.body).to eq tag_json
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/repositories/tag_repository'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Repositories
|
6
|
+
describe TagRepository do
|
7
|
+
|
8
|
+
describe ".find" do
|
9
|
+
|
10
|
+
let(:pacticipant_name) { "test_pacticipant" }
|
11
|
+
let(:version_number) { "1.2.3" }
|
12
|
+
let(:tag_name) { "prod" }
|
13
|
+
|
14
|
+
subject { TagRepository.new }
|
15
|
+
let(:options) { {pacticipant_name: pacticipant_name, pacticipant_version_number: version_number, tag_name: tag_name} }
|
16
|
+
let(:find_tag) { subject.find options }
|
17
|
+
|
18
|
+
let!(:provider_state_builder) do
|
19
|
+
ProviderStateBuilder.new
|
20
|
+
.create_pacticipant("wrong_pacticipant")
|
21
|
+
.create_version(version_number)
|
22
|
+
.create_tag(tag_name) #Tag with wrong pacticipant
|
23
|
+
.create_pacticipant(pacticipant_name)
|
24
|
+
.create_version("2.0.0")
|
25
|
+
.create_tag(tag_name) # Tag with wrong version number
|
26
|
+
.create_version(version_number)
|
27
|
+
.create_tag("wrong tag") #Tag with wrong name
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when the tag exists" do
|
31
|
+
|
32
|
+
before do
|
33
|
+
provider_state_builder.create_tag(tag_name) # Right tag!
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns the tag" do
|
37
|
+
expect(find_tag.name).to eq tag_name
|
38
|
+
expect(find_tag.version.number).to eq version_number
|
39
|
+
expect(find_tag.version.pacticipant.name).to eq pacticipant_name
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when the tag does not exist" do
|
45
|
+
it "returns nil" do
|
46
|
+
expect(find_tag).to be_nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/repositories/version_repository'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Repositories
|
6
|
+
describe VersionRepository do
|
7
|
+
|
8
|
+
describe "#find_by_pacticipant_name_and_number" do
|
9
|
+
|
10
|
+
let(:pacticipant_name) { "test_pacticipant" }
|
11
|
+
let(:version_number) { "1.2.3" }
|
12
|
+
|
13
|
+
subject { described_class.new.find_by_pacticipant_name_and_number pacticipant_name, version_number }
|
14
|
+
|
15
|
+
context "when the version exists" do
|
16
|
+
before do
|
17
|
+
ProviderStateBuilder.new.create_version_with_hierarchy "other_pacticipant", version_number
|
18
|
+
ProviderStateBuilder.new.create_version_with_hierarchy pacticipant_name, version_number
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns the version" do
|
22
|
+
expect(subject.number).to eq version_number
|
23
|
+
expect(subject.pacticipant.name).to eq pacticipant_name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "when the version doesn't exist" do
|
28
|
+
it "returns nil" do
|
29
|
+
expect(subject).to be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/services/tag_service'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Services
|
6
|
+
describe TagService do
|
7
|
+
|
8
|
+
describe ".create" do
|
9
|
+
|
10
|
+
let(:pacticipant_name) { "test_pacticipant" }
|
11
|
+
let(:version_number) { "1.2.3" }
|
12
|
+
let(:tag_name) { "prod" }
|
13
|
+
|
14
|
+
let(:options) { {pacticipant_name: pacticipant_name, pacticipant_version_number: version_number, tag_name: tag_name}}
|
15
|
+
let(:provider_state_builder) { ProviderStateBuilder.new }
|
16
|
+
|
17
|
+
subject { TagService.create(options) }
|
18
|
+
|
19
|
+
# Naughty integration test... didn't seem much point unit testing this
|
20
|
+
|
21
|
+
it "creates the new tag" do
|
22
|
+
expect(subject.name).to eq tag_name
|
23
|
+
expect(subject.version.number).to eq version_number
|
24
|
+
expect(subject.version.pacticipant.name).to eq pacticipant_name
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -54,6 +54,15 @@ Pact.provider_states_for "Pact Broker Client" do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
provider_state "'Condor' exists in the pact-broker with version 1.3.0, tagged with 'prod'" do
|
58
|
+
set_up do
|
59
|
+
ProviderStateBuilder.new
|
60
|
+
.create_pacticipant("Condor")
|
61
|
+
.create_version('1.3.0')
|
62
|
+
.create_tag('prod')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
57
66
|
provider_state "'Condor' does not exist in the pact-broker" do
|
58
67
|
no_op
|
59
68
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,11 @@ RACK_ENV = 'test'
|
|
4
4
|
|
5
5
|
$: << File.expand_path("../../", __FILE__)
|
6
6
|
|
7
|
+
require 'rack/test'
|
7
8
|
require 'pact_broker/db'
|
9
|
+
require './spec/support/provider_state_builder'
|
10
|
+
require 'pact_broker/api'
|
11
|
+
require 'rspec/fire'
|
8
12
|
|
9
13
|
RSpec.configure do | config |
|
10
14
|
config.before :suite do
|
@@ -19,4 +23,10 @@ RSpec.configure do | config |
|
|
19
23
|
DB::PACT_BROKER_DB[:pacticipants].truncate
|
20
24
|
end
|
21
25
|
|
26
|
+
config.include Rack::Test::Methods
|
27
|
+
config.include RSpec::Fire
|
28
|
+
|
29
|
+
def app
|
30
|
+
PactBroker::API
|
31
|
+
end
|
22
32
|
end
|
@@ -62,6 +62,31 @@ class ProviderStateBuilder
|
|
62
62
|
PactBroker::Models::Pact.create(:consumer_version => version, :provider => provider)
|
63
63
|
end
|
64
64
|
|
65
|
+
def create_version_with_hierarchy pacticipant_name, pacticipant_version
|
66
|
+
pacticipant = PactBroker::Models::Pacticipant.create(:name => pacticipant_name)
|
67
|
+
PactBroker::Models::Version.create(:number => pacticipant_version, :pacticipant => pacticipant)
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_tag_with_hierarchy pacticipant_name, pacticipant_version, tag_name
|
71
|
+
version = create_version_with_hierarchy pacticipant_name, pacticipant_version
|
72
|
+
PactBroker::Models::Tag.create(name: tag_name, version: version)
|
73
|
+
end
|
74
|
+
|
75
|
+
def create_pacticipant pacticipant_name
|
76
|
+
@pacticipant = PactBroker::Models::Pacticipant.create(:name => pacticipant_name)
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_version version_number
|
81
|
+
@version = PactBroker::Models::Version.create(:number => version_number, :pacticipant => @pacticipant)
|
82
|
+
self
|
83
|
+
end
|
84
|
+
|
85
|
+
def create_tag tag_name
|
86
|
+
@tag = PactBroker::Models::Tag.create(name: tag_name, version: @version)
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
65
90
|
private
|
66
91
|
|
67
92
|
# def create_pacticipant name
|
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: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-
|
14
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: httparty
|
@@ -258,17 +258,17 @@ dependencies:
|
|
258
258
|
requirement: !ruby/object:Gem::Requirement
|
259
259
|
none: false
|
260
260
|
requirements:
|
261
|
-
- -
|
261
|
+
- - '='
|
262
262
|
- !ruby/object:Gem::Version
|
263
|
-
version:
|
263
|
+
version: 1.1.0.rc1
|
264
264
|
type: :development
|
265
265
|
prerelease: false
|
266
266
|
version_requirements: !ruby/object:Gem::Requirement
|
267
267
|
none: false
|
268
268
|
requirements:
|
269
|
-
- -
|
269
|
+
- - '='
|
270
270
|
- !ruby/object:Gem::Version
|
271
|
-
version:
|
271
|
+
version: 1.1.0.rc1
|
272
272
|
description: A server that stores and returns pact files generated by the pact gem.
|
273
273
|
It enables head/prod cross testing of the consumer and provider projects.
|
274
274
|
email:
|
@@ -299,14 +299,16 @@ files:
|
|
299
299
|
- lib/pact_broker/api.rb
|
300
300
|
- lib/pact_broker/api/decorators.rb
|
301
301
|
- lib/pact_broker/api/decorators/base_decorator.rb
|
302
|
-
- lib/pact_broker/api/decorators/
|
302
|
+
- lib/pact_broker/api/decorators/latest_pact_decorator.rb
|
303
303
|
- lib/pact_broker/api/decorators/pact_collection_decorator.rb
|
304
304
|
- lib/pact_broker/api/decorators/pact_decorator.rb
|
305
305
|
- lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb
|
306
306
|
- lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb
|
307
307
|
- lib/pact_broker/api/decorators/pacticipant_decorator.rb
|
308
308
|
- lib/pact_broker/api/decorators/representable_pact.rb
|
309
|
+
- lib/pact_broker/api/decorators/tag_decorator.rb
|
309
310
|
- lib/pact_broker/api/decorators/version_decorator.rb
|
311
|
+
- lib/pact_broker/api/pact_broker_urls.rb
|
310
312
|
- lib/pact_broker/api/resources/base_resource.rb
|
311
313
|
- lib/pact_broker/api/resources/index.rb
|
312
314
|
- lib/pact_broker/api/resources/latest_pact.rb
|
@@ -314,6 +316,7 @@ files:
|
|
314
316
|
- lib/pact_broker/api/resources/pact.rb
|
315
317
|
- lib/pact_broker/api/resources/pacticipant.rb
|
316
318
|
- lib/pact_broker/api/resources/pacticipants.rb
|
319
|
+
- lib/pact_broker/api/resources/tag.rb
|
317
320
|
- lib/pact_broker/db.rb
|
318
321
|
- lib/pact_broker/logging.rb
|
319
322
|
- lib/pact_broker/models.rb
|
@@ -325,10 +328,12 @@ files:
|
|
325
328
|
- lib/pact_broker/repositories.rb
|
326
329
|
- lib/pact_broker/repositories/pact_repository.rb
|
327
330
|
- lib/pact_broker/repositories/pacticipant_repository.rb
|
331
|
+
- lib/pact_broker/repositories/tag_repository.rb
|
328
332
|
- lib/pact_broker/repositories/version_repository.rb
|
329
333
|
- lib/pact_broker/services.rb
|
330
334
|
- lib/pact_broker/services/pact_service.rb
|
331
335
|
- lib/pact_broker/services/pacticipant_service.rb
|
336
|
+
- lib/pact_broker/services/tag_service.rb
|
332
337
|
- lib/pact_broker/services/version_service.rb
|
333
338
|
- lib/pact_broker/tasks.rb
|
334
339
|
- lib/pact_broker/tasks/migration_task.rb
|
@@ -337,8 +342,12 @@ files:
|
|
337
342
|
- pact_broker_client-pact_broker.json
|
338
343
|
- spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
|
339
344
|
- spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
|
345
|
+
- spec/lib/pact_broker/api/resources/tag_spec.rb
|
340
346
|
- spec/lib/pact_broker/models/order_versions_spec.rb
|
341
347
|
- spec/lib/pact_broker/repositories/pact_repository_spec.rb
|
348
|
+
- spec/lib/pact_broker/repositories/tag_repository_spec.rb
|
349
|
+
- spec/lib/pact_broker/repositories/version_repository_spec.rb
|
350
|
+
- spec/lib/pact_broker/services/tag_service_spec.rb
|
342
351
|
- spec/service_consumers/pact_helper.rb
|
343
352
|
- spec/service_consumers/provider_states_for_pact_broker_client.rb
|
344
353
|
- spec/spec_helper.rb
|
@@ -361,7 +370,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
361
370
|
version: '0'
|
362
371
|
segments:
|
363
372
|
- 0
|
364
|
-
hash:
|
373
|
+
hash: -449205238157124147
|
365
374
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
366
375
|
none: false
|
367
376
|
requirements:
|
@@ -370,7 +379,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
370
379
|
version: '0'
|
371
380
|
segments:
|
372
381
|
- 0
|
373
|
-
hash:
|
382
|
+
hash: -449205238157124147
|
374
383
|
requirements: []
|
375
384
|
rubyforge_project:
|
376
385
|
rubygems_version: 1.8.23
|
@@ -380,8 +389,12 @@ summary: See description
|
|
380
389
|
test_files:
|
381
390
|
- spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
|
382
391
|
- spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
|
392
|
+
- spec/lib/pact_broker/api/resources/tag_spec.rb
|
383
393
|
- spec/lib/pact_broker/models/order_versions_spec.rb
|
384
394
|
- spec/lib/pact_broker/repositories/pact_repository_spec.rb
|
395
|
+
- spec/lib/pact_broker/repositories/tag_repository_spec.rb
|
396
|
+
- spec/lib/pact_broker/repositories/version_repository_spec.rb
|
397
|
+
- spec/lib/pact_broker/services/tag_service_spec.rb
|
385
398
|
- spec/service_consumers/pact_helper.rb
|
386
399
|
- spec/service_consumers/provider_states_for_pact_broker_client.rb
|
387
400
|
- spec/spec_helper.rb
|