pact_broker 1.1.0 → 1.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/README.md +8 -11
- data/lib/pact_broker/api.rb +2 -0
- data/lib/pact_broker/api/decorators/decorator_context.rb +8 -1
- data/lib/pact_broker/api/decorators/pact_decorator.rb +18 -3
- data/lib/pact_broker/api/decorators/pact_version_decorator.rb +39 -0
- data/lib/pact_broker/api/decorators/pact_versions_decorator.rb +48 -0
- data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +3 -3
- data/lib/pact_broker/api/decorators/webhook_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/webhooks_decorator.rb +1 -1
- data/lib/pact_broker/api/pact_broker_urls.rb +16 -6
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +35 -6
- data/lib/pact_broker/api/resources/base_resource.rb +80 -33
- data/lib/pact_broker/api/resources/group.rb +26 -24
- data/lib/pact_broker/api/resources/index.rb +52 -51
- data/lib/pact_broker/api/resources/latest_pact.rb +22 -22
- data/lib/pact_broker/api/resources/latest_pacts.rb +18 -17
- data/lib/pact_broker/api/resources/pact.rb +34 -39
- data/lib/pact_broker/api/resources/pact_versions.rb +35 -0
- data/lib/pact_broker/api/resources/pact_webhooks.rb +54 -61
- data/lib/pact_broker/api/resources/pacticipant.rb +40 -39
- data/lib/pact_broker/api/resources/pacticipant_resource_methods.rb +19 -0
- data/lib/pact_broker/api/resources/pacticipants.rb +52 -17
- data/lib/pact_broker/api/resources/relationships.rb +18 -17
- data/lib/pact_broker/api/resources/tag.rb +30 -29
- data/lib/pact_broker/api/resources/webhook.rb +29 -28
- data/lib/pact_broker/api/resources/webhook_execution.rb +0 -1
- data/lib/pact_broker/api/resources/webhook_resource_methods.rb +24 -0
- data/lib/pact_broker/api/resources/webhooks.rb +18 -17
- data/lib/pact_broker/app.rb +1 -0
- data/lib/pact_broker/configuration.rb +2 -2
- data/lib/pact_broker/doc/views/webhooks.markdown +1 -1
- data/lib/pact_broker/functions/find_potential_duplicate_pacticipant_names.rb +43 -0
- data/lib/pact_broker/locale/en.yml +7 -0
- data/lib/pact_broker/messages.rb +20 -1
- data/lib/pact_broker/models/pact.rb +8 -0
- data/lib/pact_broker/models/pacticipant.rb +9 -0
- data/lib/pact_broker/models/version.rb +1 -0
- data/lib/pact_broker/repositories/pact_repository.rb +6 -0
- data/lib/pact_broker/repositories/pacticipant_repository.rb +4 -0
- data/lib/pact_broker/repositories/webhook_repository.rb +2 -3
- data/lib/pact_broker/services/pact_service.rb +20 -0
- data/lib/pact_broker/services/pacticipant_service.rb +28 -0
- data/lib/pact_broker/services/webhook_service.rb +7 -2
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +1 -1
- data/public/stylesheets/github.css +1 -1
- data/public/stylesheets/pact.css +12 -0
- data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +10 -0
- data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +49 -0
- data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +9 -1
- data/spec/lib/pact_broker/api/resources/group_spec.rb +1 -1
- data/spec/lib/pact_broker/api/resources/latest_pact_spec.rb +1 -1
- data/spec/lib/pact_broker/api/resources/pact_spec.rb +35 -6
- data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +6 -4
- data/spec/lib/pact_broker/api/resources/pacticipants_spec.rb +91 -0
- data/spec/lib/pact_broker/configuration_spec.rb +3 -3
- data/spec/lib/pact_broker/functions/find_potential_duplicate_pacticipant_names_spec.rb +82 -0
- data/spec/lib/pact_broker/messages_spec.rb +31 -0
- data/spec/lib/pact_broker/models/pacticipant_spec.rb +32 -0
- data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +29 -0
- data/spec/lib/pact_broker/repositories/pacticipant_repository_spec.rb +29 -0
- data/spec/lib/pact_broker/repositories/webhook_repository_spec.rb +7 -18
- data/spec/lib/pact_broker/services/pact_service_spec.rb +20 -0
- data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +87 -2
- data/spec/support/provider_state_builder.rb +7 -7
- data/tasks/rspec.rake +1 -1
- metadata +27 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eab6ba50f1698c583aa2c5ea2499134dccdf26fe
|
4
|
+
data.tar.gz: 90c46d03810fdaba756c7d10528193636913a159
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71d627be7fcefa1d267b9e6347bd473aea3fe9b204a2d3235b9a0df7f03701f45ff764a9e235300b3b813ba19027f9bb5b3cca18261e5a2461d8cdf134a142af
|
7
|
+
data.tar.gz: 45bebda0fb63072a4fc33c082b1990b1a0ae941e04858624a733aa94a7aab9c51ab6b8bd8a965b350c1128987590ddb4f5fc489ed1bc6e4dfcac68346c5799c8
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,24 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
$ git log --pretty=format:' * %h - %s (%an, %ad)'
|
4
4
|
|
5
|
+
#### 1.2.0 (2014-09-22)
|
6
|
+
|
7
|
+
* 0ccde50 - Made webhook creation code more Webmachiney. (Beth, Tue Sep 16 10:07:56 2014 +1000)
|
8
|
+
* 4c628e5 - Using localtime to display dates. (Beth, Fri Aug 29 13:32:20 2014 +1000)
|
9
|
+
* 7d99c51 - Fixed HAL Browser link - page title was stopping it being clickable (Beth, Fri Sep 5 16:41:03 2014 +1000)
|
10
|
+
* 8ba3be0 - Updating spec task for latest rspec (Beth, Fri Sep 5 16:40:10 2014 +1000)
|
11
|
+
* fcc25eb - Updated pact gem (Beth, Tue Aug 26 18:45:31 2014 +1000)
|
12
|
+
* 5d0d3dc - Added pact versions link to the pact response (Beth, Tue Aug 26 07:54:26 2014 +1000)
|
13
|
+
* 16971ff - Added method to find distinct pacts between a consumer and provider (Beth, Tue Aug 26 07:41:54 2014 +1000)
|
14
|
+
* 4798c09 - Added pact versions endpoint. (Beth, Mon Aug 25 22:23:48 2014 +1000)
|
15
|
+
* e1f8c97 - Changed 'Date published' to display pact.updated_at date instead of created_at date (Beth, Mon Aug 25 07:37:58 20
|
16
|
+
* 39eac31 - Fixed pact-webhooks rel title (Beth, Sun Aug 24 17:54:05 2014 +1000)
|
17
|
+
* f6fc9f7 - Added latest-pact rel to pact representation (Beth, Sun Aug 24 17:51:08 2014 +1000)
|
18
|
+
* 08b088c - Added method to pacticipant_service to find potentially duplicated pacticipants (Beth, Sat Aug 23 08:32:34 2014 +
|
19
|
+
* 24e8d5d - Adding support for creating a pacticipant through the API (as distinct from it being auto created by publishing a
|
20
|
+
* dc4d4aa - Set DB timezone to UTC. (Beth, Thu Aug 21 17:30:41 2014 +1000)
|
21
|
+
* 19693fa - Added pact metadata to HTML view (Beth, Thu Aug 21 17:30:23 2014 +1000)
|
22
|
+
|
5
23
|
#### 1.1.0 (2014-08-21)
|
6
24
|
|
7
25
|
* d25395b - Fixed pacts failing to publish because of too deeply nested JSON (Beth, Tue Aug 19 11:13:02 2014 +1000)
|
data/README.md
CHANGED
@@ -2,22 +2,19 @@
|
|
2
2
|
|
3
3
|
The Pact Broker provides a repository for pacts created using the pact gem. It solves the problem of how to share pacts between consumer and provider projects.
|
4
4
|
|
5
|
-
|
5
|
+
The Pact Broker:
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
* View a list of "pacticipants" (consumers and providers).
|
7
|
+
* Enables pacts to be shared between consumer and provider projects.
|
8
|
+
* Displays autogenerated documentation for each pact.
|
9
|
+
* Enables a pact to be tagged (ie. "prod") so a provider can verify itself against a fixed version of a pact to ensure backwards compatibility.
|
10
|
+
* Provides webhooks to trigger a provider build when a consumer publishes a change to a pact.
|
11
|
+
* Displays dynamically generated network diagrams.
|
13
12
|
|
14
13
|
See the [Pact Broker Client](https://github.com/bethesque/pact_broker-client) for documentation on how to publish a pact to the Pact Broker, and configure the URLs in the provider project.
|
15
14
|
|
16
|
-
|
15
|
+
## Documentation
|
17
16
|
|
18
|
-
|
19
|
-
* Display pacts in HTML format.
|
20
|
-
* Allow "tagging" of pacts so that the provider can be verified against the production version of a pact.
|
17
|
+
See the [wiki](https://github.com/bethesque/pact_broker/wiki) for documentation.
|
21
18
|
|
22
19
|
## Usage
|
23
20
|
|
data/lib/pact_broker/api.rb
CHANGED
@@ -8,6 +8,7 @@ require 'pact_broker/api/resources/index'
|
|
8
8
|
require 'pact_broker/api/resources/relationships'
|
9
9
|
require 'pact_broker/api/resources/group'
|
10
10
|
require 'pact_broker/api/resources/pact_webhooks'
|
11
|
+
require 'pact_broker/api/resources/pact_versions'
|
11
12
|
require 'pact_broker/api/resources/webhooks'
|
12
13
|
require 'pact_broker/api/resources/webhook'
|
13
14
|
require 'pact_broker/api/resources/webhook_execution'
|
@@ -25,6 +26,7 @@ module PactBroker
|
|
25
26
|
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'latest'], Api::Resources::LatestPact
|
26
27
|
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'latest', :tag], Api::Resources::LatestPact
|
27
28
|
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'version', :consumer_version_number], Api::Resources::Pact
|
29
|
+
add ['pacts', 'provider', :provider_name, 'consumer', :consumer_name, 'versions'], Api::Resources::PactVersions
|
28
30
|
add ['pact', 'provider', :provider_name, 'consumer', :consumer_name, 'version', :consumer_version_number], Api::Resources::Pact
|
29
31
|
add ['pact', 'provider', :provider_name, 'consumer', :consumer_name, 'latest'], Api::Resources::LatestPact
|
30
32
|
add ['pacts', 'latest'], Api::Resources::LatestPacts
|
@@ -6,13 +6,20 @@ module PactBroker
|
|
6
6
|
|
7
7
|
attr_reader :base_url, :resource_url, :resource_title
|
8
8
|
|
9
|
-
def initialize base_url, resource_url, options
|
9
|
+
def initialize base_url, resource_url, options = {}
|
10
10
|
@base_url = base_url
|
11
|
+
self[:base_url] = base_url
|
11
12
|
@resource_url = resource_url
|
13
|
+
self[:resource_url] = resource_url
|
12
14
|
@resource_title = options[:resource_title]
|
15
|
+
self[:resource_title] = resource_title
|
13
16
|
merge!(options)
|
14
17
|
end
|
15
18
|
|
19
|
+
def to_s
|
20
|
+
"DecoratorContext #{super}"
|
21
|
+
end
|
22
|
+
|
16
23
|
end
|
17
24
|
|
18
25
|
end
|
@@ -9,16 +9,31 @@ module PactBroker
|
|
9
9
|
|
10
10
|
class PactDecorator < BaseDecorator
|
11
11
|
|
12
|
-
property :createdAt, getter: lambda { |_| created_at.xmlschema }
|
13
|
-
property :updatedAt, getter: lambda { |_| updated_at.xmlschema }
|
12
|
+
property :createdAt, getter: lambda { |_| created_at.xmlschema }, writeable: false
|
13
|
+
property :updatedAt, getter: lambda { |_| updated_at.xmlschema }, writeable: false
|
14
14
|
|
15
15
|
def to_hash(options = {})
|
16
16
|
::JSON.parse(represented.json_content, PACT_PARSING_OPTIONS).merge super
|
17
17
|
end
|
18
18
|
|
19
|
+
link :'latest-pact' do | options |
|
20
|
+
{
|
21
|
+
title: "Latest version of the pact between #{represented.consumer.name} and #{represented.provider.name}",
|
22
|
+
href: latest_pact_url(options.fetch(:base_url), represented)
|
23
|
+
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
link :'pact-versions' do | options |
|
28
|
+
{
|
29
|
+
title: "All versions of the pact between #{represented.consumer.name} and #{represented.provider.name}",
|
30
|
+
href: pact_versions_url(represented.consumer.name, represented.provider.name, options.fetch(:base_url))
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
19
34
|
link :'pact-webhooks' do | options |
|
20
35
|
{
|
21
|
-
title:
|
36
|
+
title: "Webhooks for the pact between #{represented.consumer.name} and #{represented.provider.name}",
|
22
37
|
href: webhooks_for_pact_url(represented.consumer, represented.provider, options.fetch(:base_url))
|
23
38
|
}
|
24
39
|
end
|
@@ -0,0 +1,39 @@
|
|
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 EmbeddedVersionDecorator < BaseDecorator
|
11
|
+
|
12
|
+
property :number
|
13
|
+
|
14
|
+
link :self do | options |
|
15
|
+
version_url(options[:base_url], represented)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class PactVersionDecorator < BaseDecorator
|
20
|
+
|
21
|
+
|
22
|
+
property :createdAt, getter: lambda { |_| created_at.to_time.localtime.xmlschema }, writeable: false
|
23
|
+
property :updatedAt, getter: lambda { |_| updated_at.to_time.localtime.xmlschema }, writeable: false
|
24
|
+
|
25
|
+
property :consumer_version, as: :consumerVersion, embedded: true, decorator: EmbeddedVersionDecorator
|
26
|
+
|
27
|
+
|
28
|
+
link :self do | options |
|
29
|
+
{
|
30
|
+
href: pact_url(options.base_url, represented),
|
31
|
+
title: represented.name
|
32
|
+
}
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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 PactVersionsDecorator < BaseDecorator
|
12
|
+
|
13
|
+
collection :entries, as: :pacts, embedded: true, :extend => PactBroker::Api::Decorators::PactVersionDecorator
|
14
|
+
|
15
|
+
link :self do | context |
|
16
|
+
{
|
17
|
+
href: context.resource_url,
|
18
|
+
title: "All versions of the pact between #{context[:consumer_name]} and #{context[:provider_name]}"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
link :consumer do | context |
|
23
|
+
{
|
24
|
+
href: pacticipant_url(context.base_url, OpenStruct.new(name: context[:consumer_name])),
|
25
|
+
title: context[:consumer_name]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
link :provider do | context |
|
30
|
+
{
|
31
|
+
href: pacticipant_url(context.base_url, OpenStruct.new(name: context[:provider_name])),
|
32
|
+
title: context[:provider_name]
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
links :'pact-versions' do | context |
|
37
|
+
represented.collect do | pact |
|
38
|
+
{
|
39
|
+
:href => pact_url(context.base_url, pact),
|
40
|
+
:title => pact.version_and_updated_date
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -11,10 +11,10 @@ module PactBroker
|
|
11
11
|
|
12
12
|
property :name
|
13
13
|
property :repository_url, as: :repositoryUrl
|
14
|
-
property :latest_version, as: :'latest-version', :class => PactBroker::Models::Version, :extend => PactBroker::Api::Decorators::VersionRepresenter, :embedded => true
|
15
|
-
property :createdAt, getter: lambda { |_| created_at.xmlschema }
|
16
|
-
property :updatedAt, getter: lambda { |_| updated_at.xmlschema }
|
17
14
|
|
15
|
+
property :latest_version, as: :'latest-version', :class => PactBroker::Models::Version, :extend => PactBroker::Api::Decorators::VersionRepresenter, :embedded => true, writeable: false
|
16
|
+
property :createdAt, getter: lambda { |_| created_at.xmlschema }, writeable: false
|
17
|
+
property :updatedAt, getter: lambda { |_| updated_at.xmlschema }, writeable: false
|
18
18
|
|
19
19
|
link :self do | options |
|
20
20
|
pacticipant_url(options[:base_url], represented)
|
@@ -2,6 +2,8 @@ module PactBroker
|
|
2
2
|
module Api
|
3
3
|
module PactBrokerUrls
|
4
4
|
|
5
|
+
extend self
|
6
|
+
|
5
7
|
def pacticipants_url base_url
|
6
8
|
"#{base_url}/pacticipants"
|
7
9
|
end
|
@@ -35,6 +37,10 @@ module PactBroker
|
|
35
37
|
"#{base_url}/pacts/latest"
|
36
38
|
end
|
37
39
|
|
40
|
+
def pact_versions_url consumer_name, provider_name, base_url
|
41
|
+
"#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/versions"
|
42
|
+
end
|
43
|
+
|
38
44
|
def tags_url base_url, version
|
39
45
|
"#{version_url(base_url, version)}/tags"
|
40
46
|
end
|
@@ -47,8 +53,8 @@ module PactBroker
|
|
47
53
|
"#{base_url}/webhooks"
|
48
54
|
end
|
49
55
|
|
50
|
-
def webhook_url
|
51
|
-
"#{base_url}/webhooks/#{
|
56
|
+
def webhook_url uuid, base_url
|
57
|
+
"#{base_url}/webhooks/#{uuid}"
|
52
58
|
end
|
53
59
|
|
54
60
|
def webhook_execution_url webhook, base_url
|
@@ -59,6 +65,14 @@ module PactBroker
|
|
59
65
|
"#{base_url}/webhooks/provider/#{provider.name}/consumer/#{consumer.name}"
|
60
66
|
end
|
61
67
|
|
68
|
+
def hal_browser_url target_url
|
69
|
+
"/hal-browser/browser.html#" + target_url
|
70
|
+
end
|
71
|
+
|
72
|
+
def url_encode param
|
73
|
+
ERB::Util.url_encode param
|
74
|
+
end
|
75
|
+
|
62
76
|
private
|
63
77
|
|
64
78
|
def representable_pact pact
|
@@ -68,10 +82,6 @@ module PactBroker
|
|
68
82
|
def pactigration_base_url base_url, pact
|
69
83
|
"#{base_url}/pacts/provider/#{url_encode(pact.provider.name)}/consumer/#{url_encode(pact.consumer.name)}"
|
70
84
|
end
|
71
|
-
|
72
|
-
def url_encode param
|
73
|
-
ERB::Util.url_encode param
|
74
|
-
end
|
75
85
|
end
|
76
86
|
end
|
77
87
|
end
|
@@ -2,28 +2,57 @@ require 'pact/consumer_contract'
|
|
2
2
|
require 'pact/reification'
|
3
3
|
require 'redcarpet'
|
4
4
|
require 'pact/doc/markdown/consumer_contract_renderer'
|
5
|
+
require 'pact_broker/api/pact_broker_urls'
|
5
6
|
|
6
7
|
module PactBroker
|
7
8
|
module Api
|
8
9
|
module Renderers
|
9
10
|
class HtmlPactRenderer
|
10
11
|
|
11
|
-
def self.call
|
12
|
-
new(
|
12
|
+
def self.call pact
|
13
|
+
new(pact).call
|
13
14
|
end
|
14
15
|
|
15
|
-
def initialize
|
16
|
-
@json_content = json_content
|
16
|
+
def initialize pact
|
17
|
+
@json_content = pact.json_content
|
18
|
+
@pact = pact
|
17
19
|
end
|
18
20
|
|
19
21
|
def call
|
20
|
-
"<html><head>#{head}</head><body>#{html}</body></html>"
|
22
|
+
"<html><head>#{head}</head><body>#{pact_metadata}#{html}</body></html>"
|
21
23
|
end
|
22
24
|
|
23
25
|
private
|
24
26
|
|
25
27
|
def head
|
26
|
-
'<link rel="stylesheet" type="text/css" href="/stylesheets/github.css">'
|
28
|
+
'<link rel="stylesheet" type="text/css" href="/stylesheets/github.css">' + "\n" +
|
29
|
+
'<link rel="stylesheet" type="text/css" href="/stylesheets/pact.css">'
|
30
|
+
end
|
31
|
+
|
32
|
+
def pact_metadata
|
33
|
+
"<div class='pact-metadata'>
|
34
|
+
<ul>
|
35
|
+
<li>
|
36
|
+
<span class='name'>#{@pact.consumer.name} version:</span>
|
37
|
+
<span class='value'>#{@pact.consumer_version_number}</span>
|
38
|
+
</li>
|
39
|
+
<li>
|
40
|
+
<span class='name'>Date published:</span>
|
41
|
+
<span class='value'>#{@pact.updated_at.to_time.localtime.to_datetime.strftime("%d/%m/%Y %l:%M%p %:z")}</span>
|
42
|
+
</li>
|
43
|
+
<li>
|
44
|
+
<a href=\"#{json_url}\">View in HAL Browser</a>
|
45
|
+
</li>
|
46
|
+
</ul>
|
47
|
+
</div>"
|
48
|
+
end
|
49
|
+
|
50
|
+
def json_url
|
51
|
+
PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url
|
52
|
+
end
|
53
|
+
|
54
|
+
def pact_url
|
55
|
+
PactBroker::Api::PactBrokerUrls.pact_url '', @pact
|
27
56
|
end
|
28
57
|
|
29
58
|
def markdown
|
@@ -4,55 +4,102 @@ require 'pact_broker/api/decorators'
|
|
4
4
|
require 'pact_broker/logging'
|
5
5
|
require 'pact_broker/api/pact_broker_urls'
|
6
6
|
require 'pact_broker/api/decorators/decorator_context'
|
7
|
+
require 'pact_broker/json'
|
7
8
|
|
8
|
-
module PactBroker
|
9
|
+
module PactBroker
|
9
10
|
|
10
|
-
module
|
11
|
+
module Api
|
12
|
+
module Resources
|
11
13
|
|
14
|
+
class InvalidJsonError < StandardError ; end
|
12
15
|
|
13
|
-
|
16
|
+
class ErrorHandler
|
14
17
|
|
15
|
-
|
18
|
+
include PactBroker::Logging
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def self.handle_exception e, response
|
21
|
+
logger.error e
|
22
|
+
logger.error e.backtrace
|
23
|
+
response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
|
24
|
+
end
|
22
25
|
end
|
23
|
-
end
|
24
26
|
|
25
|
-
|
27
|
+
class BaseResource < Webmachine::Resource
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
include PactBroker::Services
|
30
|
+
include PactBroker::Api::PactBrokerUrls
|
31
|
+
include PactBroker::Logging
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
33
|
+
def identifier_from_path
|
34
|
+
request.path_info.each_with_object({}) do | pair, hash|
|
35
|
+
hash[pair.first] = URI.decode(pair.last)
|
36
|
+
end
|
34
37
|
end
|
35
|
-
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
# This should be called base_url
|
40
|
+
def base_url
|
41
|
+
request.uri.to_s.gsub(/#{request.uri.path}$/,'')
|
42
|
+
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
def resource_url
|
45
|
+
request.uri.to_s
|
46
|
+
end
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
48
|
+
def decorator_context options = {}
|
49
|
+
Decorators::DecoratorContext.new(base_url, resource_url, options)
|
50
|
+
end
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
def handle_exception e
|
53
|
+
PactBroker::Api::Resources::ErrorHandler.handle_exception(e, response)
|
54
|
+
end
|
55
|
+
|
56
|
+
def params
|
57
|
+
@params ||= JSON.parse(request.body.to_s, {symbolize_names: true}.merge(PACT_PARSING_OPTIONS))
|
58
|
+
end
|
59
|
+
|
60
|
+
def set_json_error_message message
|
61
|
+
response.headers['Content-Type'] = 'application/json'
|
62
|
+
response.body = {error: message}.to_json
|
63
|
+
end
|
64
|
+
|
65
|
+
def set_json_validation_error_messages errors
|
66
|
+
response.headers['Content-Type'] = 'application/json'
|
67
|
+
response.body = {errors: errors}.to_json
|
68
|
+
end
|
69
|
+
|
70
|
+
def request_body
|
71
|
+
@request_body ||= request.body.to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
def consumer_name
|
75
|
+
identifier_from_path[:consumer_name]
|
76
|
+
end
|
77
|
+
|
78
|
+
def provider_name
|
79
|
+
identifier_from_path[:provider_name]
|
80
|
+
end
|
81
|
+
|
82
|
+
def invalid_json?
|
83
|
+
begin
|
84
|
+
JSON.parse(request_body, PACT_PARSING_OPTIONS) #Not load! Otherwise it will try to load Ruby classes.
|
85
|
+
false
|
86
|
+
rescue StandardError => e
|
87
|
+
logger.error "Error parsing JSON #{e} - #{request_body}"
|
88
|
+
set_json_error_message "Error parsing JSON - #{e.message}"
|
89
|
+
response.headers['Content-Type'] = 'application/json'
|
90
|
+
true
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def validation_errors? model
|
95
|
+
if (errors = model.validate).any?
|
96
|
+
set_json_validation_error_messages errors
|
97
|
+
true
|
98
|
+
else
|
99
|
+
false
|
100
|
+
end
|
101
|
+
end
|
53
102
|
|
54
|
-
def params
|
55
|
-
JSON.parse(request.body.to_s, symbolize_names: true)
|
56
103
|
end
|
57
104
|
end
|
58
105
|
end
|