pact_broker 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/.gitignore +2 -0
- data/CHANGELOG.md +5 -0
- data/README.md +2 -1
- data/Rakefile +1 -3
- data/db/migrations/07_increase_json_content_length.rb +6 -1
- data/db/migrations/08_create_latest_pact_view.rb +7 -5
- data/db/migrations/14_add_timestamps_to_pact_views.rb +28 -0
- data/lib/pact_broker/api.rb +0 -4
- data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +4 -1
- data/lib/pact_broker/api/decorators/pact_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/pact_version_decorator.rb +3 -4
- data/lib/pact_broker/api/decorators/pact_versions_decorator.rb +4 -4
- data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +3 -2
- data/lib/pact_broker/api/decorators/tag_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/timestamps.rb +24 -0
- data/lib/pact_broker/api/decorators/webhook_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/webhooks_decorator.rb +4 -4
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +16 -4
- data/lib/pact_broker/api/resources/base_resource.rb +0 -1
- data/lib/pact_broker/api/resources/group.rb +11 -6
- data/lib/pact_broker/api/resources/index.rb +5 -6
- data/lib/pact_broker/api/resources/latest_pact.rb +8 -5
- data/lib/pact_broker/api/resources/latest_pacts.rb +3 -3
- data/lib/pact_broker/api/resources/pact.rb +9 -5
- data/lib/pact_broker/api/resources/pact_webhooks.rb +9 -5
- data/lib/pact_broker/api/resources/pacticipant.rb +10 -5
- data/lib/pact_broker/api/resources/relationships.rb +3 -3
- data/lib/pact_broker/api/resources/tag.rb +8 -7
- data/lib/pact_broker/api/resources/webhook.rb +1 -1
- data/lib/pact_broker/api/resources/webhook_execution.rb +1 -1
- data/lib/pact_broker/app.rb +8 -57
- data/lib/pact_broker/logging.rb +1 -0
- data/lib/pact_broker/models/pact.rb +6 -8
- data/lib/pact_broker/repositories/pact.rb +29 -0
- data/lib/pact_broker/repositories/pact_content.rb +0 -0
- data/lib/pact_broker/repositories/pact_repository.rb +66 -21
- data/lib/pact_broker/repositories/tag_repository.rb +1 -1
- data/lib/pact_broker/repositories/version_repository.rb +2 -1
- data/lib/pact_broker/services/pact_service.rb +14 -16
- data/lib/pact_broker/ui.rb +2 -0
- data/lib/pact_broker/ui/app.rb +81 -0
- data/lib/pact_broker/ui/controllers/groups.rb +1 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/rack/pact_broker/convert_file_extension_to_accept_header.rb +44 -0
- data/pact_broker.gemspec +1 -0
- data/public/javascripts/highlight.pack.js +1 -0
- data/public/stylesheets/github-json.css +127 -0
- data/public/stylesheets/pact.css +4 -0
- data/spec/fixtures/consumer-provider.json +21 -0
- data/spec/integration/app_spec.rb +165 -0
- data/spec/integration/endpoints/pact_put_spec.rb +43 -0
- data/spec/lib/pact_broker/api/decorators/latest_pact_decorator_spec.rb +42 -0
- data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +5 -0
- data/spec/lib/pact_broker/api/decorators/pacticipant_decorator_spec.rb +2 -1
- data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +9 -2
- data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +14 -3
- data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +88 -4
- data/spec/lib/pact_broker/repositories/tag_repository_spec.rb +2 -0
- data/spec/lib/pact_broker/repositories/version_repository_spec.rb +20 -2
- data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +1 -1
- data/spec/service_consumers/pact_helper.rb +2 -17
- data/spec/spec_helper.rb +4 -22
- data/spec/support/database_cleaner.rb +18 -0
- data/spec/support/fixture_helpers.rb +10 -0
- data/spec/support/provider_state_builder.rb +4 -15
- metadata +82 -47
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YzNkZTQzNTE1OWIzZDNlYmQ0Y2IzODEyZmRkYzhjZWI0YjIwMDIxMg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
N2QwYjkzYzk0YWQ1NjFkODVkZjIyOGJiYThhMzEwYzRlNGIxM2RkNw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NzlkN2YyYzI4YWM1OTNmNWVmN2RkYTcwMjU1ZWJiNGI2OGE2NDFjYmZmNTY0
|
10
|
+
MmE3Yzc1NGVmZDA0YmQ2YjJlYjZhODIwODAxOGRhYTgxZGI1MTZmODRlOGY5
|
11
|
+
ZGYyMDRiNzBkN2MzMmIxOWI4ZTI4MDM1MDIwNmFiNTU5N2I0ZTk=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDNkNzJkNjgwYzI2ZjdiOGM2NTNhZmJiMDBmNWZjNWVjZTVmM2VlYTQyOTI4
|
14
|
+
NzEwN2JjYzUxYWViMzJiZGI1NzQwYTkyNTJjZTM2NGI1Y2FmNjE4OWVhYTUx
|
15
|
+
NTA1NDgyYjYxZDQyNDE4NGEyYWY3Yzc5M2VlYWJiYjBjNjRiYmY=
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,11 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
$ git log --pretty=format:' * %h - %s (%an, %ad)'
|
4
4
|
|
5
|
+
#### 1.3.0 (2014-10-14)
|
6
|
+
|
7
|
+
* ed08811 - Converted raw SQL create view statements to Sequel so they will run on Postgres (Beth, Sat Oct 11 22:07:37 2014 +1100)
|
8
|
+
* 457edf4 - Added syntax highlighting to JSON in autogenerated HTML docs. (Beth, Wed Sep 24 22:12:14 2014 +1000)
|
9
|
+
|
5
10
|
#### 1.2.0 (2014-09-22)
|
6
11
|
|
7
12
|
* 0ccde50 - Made webhook creation code more Webmachiney. (Beth, Tue Sep 16 10:07:56 2014 +1000)
|
data/README.md
CHANGED
@@ -18,7 +18,8 @@ See the [wiki](https://github.com/bethesque/pact_broker/wiki) for documentation.
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
* 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). At time of writing, Sequel has adapters for: ADO, Amalgalite, CUBRID, DataObjects, DB2, DBI, Firebird, IBM_DB, Informix, JDBC, MySQL, Mysql2, ODBC, OpenBase, Oracle, PostgreSQL, SQLAnywhere, SQLite3, Swift, and TinyTDS
|
21
|
+
* 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). At time of writing, Sequel has adapters for: ADO, Amalgalite, CUBRID, DataObjects, DB2, DBI, Firebird, IBM_DB, Informix, JDBC, MySQL, Mysql2, ODBC, OpenBase, Oracle, PostgreSQL, SQLAnywhere, SQLite3, Swift, and TinyTDS.
|
22
|
+
* __Note:__ It is recommended to use __PostgreSQL__ as it will support JSON search features that are planned in a future release.
|
22
23
|
* Install ruby 1.9.3 or later
|
23
24
|
* Copy the [example](/example) directory to your workstation.
|
24
25
|
* Modify the config.ru and Gemfile as desired (eg. choose database driver gem, set your database credentials)
|
data/Rakefile
CHANGED
@@ -10,13 +10,11 @@ rescue Bundler::BundlerError => e
|
|
10
10
|
$stderr.puts "Run `bundle install` to install missing gems"
|
11
11
|
exit e.status_code
|
12
12
|
end
|
13
|
-
require 'rake'
|
14
|
-
|
15
13
|
|
16
14
|
FileList['lib/tasks/**/*.rake'].each { |task| load "#{Dir.pwd}/#{task}" }
|
17
15
|
FileList['tasks/**/*.rake'].each { |task| load "#{Dir.pwd}/#{task}" }
|
18
16
|
|
19
|
-
task :default => ['db:prepare:test', :boot, :spec]
|
17
|
+
task :default => ['db:prepare:test', :boot, :spec, 'pact:verify']
|
20
18
|
|
21
19
|
task :boot do
|
22
20
|
require File.join(File.dirname(__FILE__), 'config/boot')
|
@@ -1,7 +1,12 @@
|
|
1
1
|
Sequel.migration do
|
2
2
|
change do
|
3
3
|
alter_table(:pacts) do
|
4
|
-
|
4
|
+
if Sequel::Model.db.adapter_scheme == :postgres
|
5
|
+
set_column_type(:json_content, :text)
|
6
|
+
else
|
7
|
+
# Assume mysql
|
8
|
+
set_column_type(:json_content, :mediumtext)
|
9
|
+
end
|
5
10
|
end
|
6
11
|
end
|
7
12
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
Sequel.migration do
|
2
2
|
change do
|
3
3
|
create_view(:all_pacts,
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
join
|
4
|
+
Sequel::Model.db[:pacts].select(:pacts__id, :c__id___consumer_id, :c__name___consumer_name,
|
5
|
+
:cv__number___consumer_version_number, :cv__order___consumer_version_order,
|
6
|
+
:p__id___provider_id, :p__name___provider_name,
|
7
|
+
:pacts__json_content).
|
8
|
+
join(:versions, {:id => :version_id}, {:table_alias => :cv, implicit_qualifier: :pacts}).
|
9
|
+
join(:pacticipants, {:id => :pacticipant_id}, {:table_alias => :c, implicit_qualifier: :cv}).
|
10
|
+
join(:pacticipants, {:id => :provider_id}, {:table_alias => :p, implicit_qualifier: :pacts}))
|
9
11
|
|
10
12
|
create_view(:latest_pact_consumer_version_orders,
|
11
13
|
"select provider_id, consumer_id, max(consumer_version_order) as latest_consumer_version_order
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
create_or_replace_view(:all_pacts,
|
4
|
+
Sequel::Model.db[:pacts].select(:pacts__id, :c__id___consumer_id, :c__name___consumer_name,
|
5
|
+
:cv__number___consumer_version_number, :cv__order___consumer_version_order,
|
6
|
+
:p__id___provider_id, :p__name___provider_name,
|
7
|
+
:pacts__json_content, :pacts__created_at, :pacts__updated_at).
|
8
|
+
join(:versions, {:id => :version_id}, {:table_alias => :cv, implicit_qualifier: :pacts}).
|
9
|
+
join(:pacticipants, {:id => :pacticipant_id}, {:table_alias => :c, implicit_qualifier: :cv}).
|
10
|
+
join(:pacticipants, {:id => :provider_id}, {:table_alias => :p, implicit_qualifier: :pacts}))
|
11
|
+
|
12
|
+
create_or_replace_view(:latest_pact_consumer_version_orders,
|
13
|
+
"select provider_id, consumer_id, max(consumer_version_order) as latest_consumer_version_order
|
14
|
+
from all_pacts
|
15
|
+
group by provider_id, consumer_id"
|
16
|
+
)
|
17
|
+
|
18
|
+
create_or_replace_view(:latest_pacts,
|
19
|
+
"select ap.*
|
20
|
+
from all_pacts ap
|
21
|
+
inner join latest_pact_consumer_version_orders lp
|
22
|
+
on ap.consumer_id = lp.consumer_id
|
23
|
+
and ap.provider_id = lp.provider_id
|
24
|
+
and ap.consumer_version_order = latest_consumer_version_order"
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/lib/pact_broker/api.rb
CHANGED
@@ -35,10 +35,6 @@ module PactBroker
|
|
35
35
|
add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number, 'tags', :tag_name], Api::Resources::Tag
|
36
36
|
add ['relationships'], Api::Resources::Relationships
|
37
37
|
add ['groups', :pacticipant_name], Api::Resources::Group
|
38
|
-
# If the HTML and the CSV resources are both requested by the browser,
|
39
|
-
# Chrome gets confused by the content types, and when you click back, it tries to load the CSV
|
40
|
-
# instead of the HTML page. So we have to give it a different URL.
|
41
|
-
add ['groups', :pacticipant_name, 'csv'], Api::Resources::Group
|
42
38
|
add ['webhooks', 'provider', :provider_name, 'consumer', :consumer_name ], Api::Resources::PactWebhooks
|
43
39
|
add ['webhooks', :uuid ], Api::Resources::Webhook
|
44
40
|
add ['webhooks', :uuid, 'execute' ], Api::Resources::WebhookExecution
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'pact_details_decorator'
|
2
|
+
require 'pact_broker/api/decorators/timestamps'
|
2
3
|
|
3
4
|
module PactBroker
|
4
5
|
|
@@ -8,6 +9,8 @@ module PactBroker
|
|
8
9
|
|
9
10
|
class LatestPactDecorator < PactDetailsDecorator
|
10
11
|
|
12
|
+
include Timestamps
|
13
|
+
|
11
14
|
links :self do | options |
|
12
15
|
[
|
13
16
|
{
|
@@ -21,4 +24,4 @@ module PactBroker
|
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
24
|
-
end
|
27
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'base_decorator'
|
2
2
|
require 'pact_broker/json'
|
3
|
+
require 'pact_broker/api/decorators/timestamps'
|
3
4
|
|
4
5
|
module PactBroker
|
5
6
|
|
@@ -9,8 +10,7 @@ module PactBroker
|
|
9
10
|
|
10
11
|
class PactDecorator < BaseDecorator
|
11
12
|
|
12
|
-
|
13
|
-
property :updatedAt, getter: lambda { |_| updated_at.xmlschema }, writeable: false
|
13
|
+
include Timestamps
|
14
14
|
|
15
15
|
def to_hash(options = {})
|
16
16
|
::JSON.parse(represented.json_content, PACT_PARSING_OPTIONS).merge super
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'base_decorator'
|
2
2
|
require_relative 'pact_pacticipant_decorator'
|
3
|
+
require 'pact_broker/api/decorators/timestamps'
|
3
4
|
|
4
5
|
module PactBroker
|
5
6
|
|
@@ -18,16 +19,14 @@ module PactBroker
|
|
18
19
|
|
19
20
|
class PactVersionDecorator < BaseDecorator
|
20
21
|
|
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
|
22
|
+
include Timestamps
|
24
23
|
|
25
24
|
property :consumer_version, as: :consumerVersion, embedded: true, decorator: EmbeddedVersionDecorator
|
26
25
|
|
27
26
|
|
28
27
|
link :self do | options |
|
29
28
|
{
|
30
|
-
href: pact_url(options
|
29
|
+
href: pact_url(options[:base_url], represented),
|
31
30
|
title: represented.name
|
32
31
|
}
|
33
32
|
|
@@ -14,21 +14,21 @@ module PactBroker
|
|
14
14
|
|
15
15
|
link :self do | context |
|
16
16
|
{
|
17
|
-
href: context
|
17
|
+
href: context[:resource_url],
|
18
18
|
title: "All versions of the pact between #{context[:consumer_name]} and #{context[:provider_name]}"
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
22
22
|
link :consumer do | context |
|
23
23
|
{
|
24
|
-
href: pacticipant_url(context
|
24
|
+
href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:consumer_name])),
|
25
25
|
title: context[:consumer_name]
|
26
26
|
}
|
27
27
|
end
|
28
28
|
|
29
29
|
link :provider do | context |
|
30
30
|
{
|
31
|
-
href: pacticipant_url(context
|
31
|
+
href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:provider_name])),
|
32
32
|
title: context[:provider_name]
|
33
33
|
}
|
34
34
|
end
|
@@ -36,7 +36,7 @@ module PactBroker
|
|
36
36
|
links :'pact-versions' do | context |
|
37
37
|
represented.collect do | pact |
|
38
38
|
{
|
39
|
-
:href => pact_url(context
|
39
|
+
:href => pact_url(context[:base_url], pact),
|
40
40
|
:title => pact.version_and_updated_date
|
41
41
|
}
|
42
42
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'base_decorator'
|
2
2
|
require_relative 'version_decorator'
|
3
|
+
require 'pact_broker/api/decorators/timestamps'
|
3
4
|
|
4
5
|
module PactBroker
|
5
6
|
|
@@ -13,8 +14,8 @@ module PactBroker
|
|
13
14
|
property :repository_url, as: :repositoryUrl
|
14
15
|
|
15
16
|
property :latest_version, as: :'latest-version', :class => PactBroker::Models::Version, :extend => PactBroker::Api::Decorators::VersionRepresenter, :embedded => true, writeable: false
|
16
|
-
|
17
|
-
|
17
|
+
|
18
|
+
include Timestamps
|
18
19
|
|
19
20
|
link :self do | options |
|
20
21
|
pacticipant_url(options[:base_url], represented)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'base_decorator'
|
2
2
|
require_relative 'pact_pacticipant_decorator'
|
3
|
+
require_relative 'timestamps'
|
3
4
|
|
4
5
|
module PactBroker
|
5
6
|
|
@@ -9,8 +10,7 @@ module PactBroker
|
|
9
10
|
|
10
11
|
class TagDecorator < BaseDecorator
|
11
12
|
|
12
|
-
|
13
|
-
property :updatedAt, getter: lambda { |_| updated_at ? updated_at.xmlschema : nil }
|
13
|
+
include Timestamps
|
14
14
|
|
15
15
|
link :self do | options |
|
16
16
|
tag_url(options[:base_url], represented)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'roar/representer/json'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
|
5
|
+
module Api
|
6
|
+
|
7
|
+
module Decorators
|
8
|
+
|
9
|
+
module Timestamps
|
10
|
+
|
11
|
+
include Roar::Representer::JSON
|
12
|
+
|
13
|
+
property :optional_updated_at, as: :updatedAt, exec_context: :decorator, writeable: false
|
14
|
+
property :createdAt, getter: lambda { |_| created_at.xmlschema }, writeable: false
|
15
|
+
|
16
|
+
def optional_updated_at
|
17
|
+
if represented.updated_at != represented.created_at
|
18
|
+
represented.updated_at.xmlschema
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'base_decorator'
|
2
2
|
require 'pact_broker/api/decorators/webhook_request_decorator'
|
3
|
+
require 'pact_broker/api/decorators/timestamps'
|
3
4
|
require 'pact_broker/models/webhook_request'
|
4
5
|
require 'pact_broker/api/decorators/basic_pacticipant_decorator'
|
5
6
|
|
@@ -10,8 +11,7 @@ module PactBroker
|
|
10
11
|
|
11
12
|
property :request, :class => PactBroker::Models::WebhookRequest, :extend => WebhookRequestDecorator
|
12
13
|
|
13
|
-
|
14
|
-
property :updatedAt, getter: lambda { |_| updated_at.xmlschema }, writeable: false
|
14
|
+
include Timestamps
|
15
15
|
|
16
16
|
property :consumer, :extend => PactBroker::Api::Decorators::BasicPacticipantRepresenter, :embedded => true, writeable: false
|
17
17
|
property :provider, :extend => PactBroker::Api::Decorators::BasicPacticipantRepresenter, :embedded => true, writeable: false
|
@@ -9,8 +9,8 @@ module PactBroker
|
|
9
9
|
|
10
10
|
link :'pb:self' do | context |
|
11
11
|
{
|
12
|
-
title: context
|
13
|
-
href: context
|
12
|
+
title: context[:resource_title],
|
13
|
+
href: context[:resource_url]
|
14
14
|
}
|
15
15
|
end
|
16
16
|
|
@@ -19,7 +19,7 @@ module PactBroker
|
|
19
19
|
{
|
20
20
|
title: webhook.description,
|
21
21
|
name: webhook.request_description,
|
22
|
-
href: webhook_url(webhook.uuid, context
|
22
|
+
href: webhook_url(webhook.uuid, context[:base_url])
|
23
23
|
}
|
24
24
|
end
|
25
25
|
end
|
@@ -27,7 +27,7 @@ module PactBroker
|
|
27
27
|
curies do | context |
|
28
28
|
[{
|
29
29
|
name: :pb,
|
30
|
-
href: context
|
30
|
+
href: context[:base_url] + '/doc/webhooks',
|
31
31
|
}]
|
32
32
|
end
|
33
33
|
|
@@ -19,14 +19,22 @@ module PactBroker
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def call
|
22
|
-
"<html
|
22
|
+
"<html>
|
23
|
+
<head>#{head}</head>
|
24
|
+
<body>
|
25
|
+
#{pact_metadata}#{html}
|
26
|
+
</body>
|
27
|
+
</html>"
|
23
28
|
end
|
24
29
|
|
25
30
|
private
|
26
31
|
|
27
32
|
def head
|
28
|
-
|
29
|
-
|
33
|
+
"<link rel='stylesheet' type='text/css' href='/stylesheets/github.css'>
|
34
|
+
<link rel='stylesheet' type='text/css' href='/stylesheets/pact.css'>
|
35
|
+
<link rel='stylesheet' type='text/css' href='/stylesheets/github-json.css'>
|
36
|
+
<script src='/javascripts/highlight.pack.js'></script>
|
37
|
+
<script>hljs.initHighlightingOnLoad();</script>"
|
30
38
|
end
|
31
39
|
|
32
40
|
def pact_metadata
|
@@ -38,7 +46,7 @@ module PactBroker
|
|
38
46
|
</li>
|
39
47
|
<li>
|
40
48
|
<span class='name'>Date published:</span>
|
41
|
-
<span class='value'>#{
|
49
|
+
<span class='value'>#{published_date}</span>
|
42
50
|
</li>
|
43
51
|
<li>
|
44
52
|
<a href=\"#{json_url}\">View in HAL Browser</a>
|
@@ -47,6 +55,10 @@ module PactBroker
|
|
47
55
|
</div>"
|
48
56
|
end
|
49
57
|
|
58
|
+
def published_date
|
59
|
+
@pact.updated_at.to_time.localtime.to_datetime.strftime("%d/%m/%Y %l:%M%p %:z")
|
60
|
+
end
|
61
|
+
|
50
62
|
def json_url
|
51
63
|
PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url
|
52
64
|
end
|
@@ -16,21 +16,26 @@ module PactBroker
|
|
16
16
|
["GET"]
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
19
|
+
def resource_exists?
|
20
|
+
pacticipant
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def to_csv
|
24
24
|
PactBroker::Api::Decorators::RelationshipsCsvDecorator.new(group).to_csv
|
25
25
|
end
|
26
26
|
|
27
|
+
private
|
28
|
+
|
27
29
|
def pacticipant_name
|
28
30
|
identifier_from_path[:pacticipant_name]
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
32
|
-
@pacticipant
|
33
|
-
|
33
|
+
def pacticipant
|
34
|
+
@pacticipant ||= pacticipant_service.find_pacticipant_by_name(pacticipant_name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def group
|
38
|
+
@group ||= group_service.find_group_containing pacticipant
|
34
39
|
end
|
35
40
|
|
36
41
|
end
|
@@ -15,37 +15,36 @@ module PactBroker
|
|
15
15
|
["GET"]
|
16
16
|
end
|
17
17
|
|
18
|
-
# TODO change to use request.base_url to avoid params getting included!!!
|
19
18
|
def to_json
|
20
19
|
{
|
21
20
|
_links: {
|
22
21
|
'pb:self' =>
|
23
22
|
{
|
24
|
-
href:
|
23
|
+
href: base_url,
|
25
24
|
title: 'The Pact Broker index page',
|
26
25
|
templated: false
|
27
26
|
},
|
28
27
|
'pb:latest-pacts' =>
|
29
28
|
{
|
30
|
-
href:
|
29
|
+
href: base_url + '/pacts/latest',
|
31
30
|
title: 'Retrieve latest pacts',
|
32
31
|
templated: false
|
33
32
|
},
|
34
33
|
'pb:pacticipants' =>
|
35
34
|
{
|
36
|
-
href:
|
35
|
+
href: base_url + '/pacticipants',
|
37
36
|
title: 'Retrieve pacticipants',
|
38
37
|
templated: false
|
39
38
|
},
|
40
39
|
'pb:webhooks' =>
|
41
40
|
{
|
42
|
-
href:
|
41
|
+
href: base_url + '/webhooks',
|
43
42
|
title: 'Webhooks',
|
44
43
|
templated: false
|
45
44
|
},'curies' =>
|
46
45
|
[{
|
47
46
|
name: 'pb',
|
48
|
-
href:
|
47
|
+
href: base_url + '/doc/{rel}',
|
49
48
|
templated: true
|
50
49
|
}]
|
51
50
|
}
|