pact_broker 1.14.0 → 1.15.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +11 -0
  4. data/LICENSE.txt +2 -0
  5. data/README.md +6 -2
  6. data/example/Gemfile +3 -3
  7. data/lib/pact_broker.rb +6 -1
  8. data/lib/pact_broker/api.rb +8 -1
  9. data/lib/pact_broker/api/contracts/pacticipant_name_contract.rb +2 -4
  10. data/lib/pact_broker/api/contracts/put_pact_params_contract.rb +25 -32
  11. data/lib/pact_broker/api/contracts/request_validations.rb +5 -11
  12. data/lib/pact_broker/api/contracts/webhook_contract.rb +28 -15
  13. data/lib/pact_broker/api/decorators/versions_decorator.rb +41 -0
  14. data/lib/pact_broker/api/resources/base_resource.rb +7 -3
  15. data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
  16. data/lib/pact_broker/api/resources/latest_pacts.rb +2 -2
  17. data/lib/pact_broker/api/resources/latest_provider_pacts.rb +1 -1
  18. data/lib/pact_broker/api/resources/pact.rb +2 -2
  19. data/lib/pact_broker/api/resources/pact_content_diff.rb +2 -5
  20. data/lib/pact_broker/api/resources/pact_versions.rb +1 -1
  21. data/lib/pact_broker/api/resources/pact_webhooks.rb +8 -5
  22. data/lib/pact_broker/api/resources/pacticipant.rb +1 -1
  23. data/lib/pact_broker/api/resources/pacticipants.rb +2 -2
  24. data/lib/pact_broker/api/resources/tag.rb +2 -2
  25. data/lib/pact_broker/api/resources/version.rb +1 -1
  26. data/lib/pact_broker/api/resources/versions.rb +34 -0
  27. data/lib/pact_broker/api/resources/webhook.rb +2 -2
  28. data/lib/pact_broker/api/resources/webhook_execution.rb +1 -1
  29. data/lib/pact_broker/domain/version.rb +4 -0
  30. data/lib/pact_broker/domain/webhook.rb +2 -0
  31. data/lib/pact_broker/locale/en.yml +9 -1
  32. data/lib/pact_broker/pacts/diff.rb +26 -27
  33. data/lib/pact_broker/repositories/pacticipant_repository.rb +7 -0
  34. data/lib/pact_broker/services/pacticipant_service.rb +4 -0
  35. data/lib/pact_broker/services/webhook_service.rb +2 -2
  36. data/lib/pact_broker/version.rb +1 -1
  37. data/pact_broker.gemspec +4 -6
  38. data/spec/features/get_versions_spec.rb +36 -0
  39. data/spec/lib/pact_broker/api/contracts/put_pact_params_contract_spec.rb +12 -19
  40. data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +7 -9
  41. data/spec/lib/pact_broker/api/decorators/embedded_tag_decorator_spec.rb +2 -2
  42. data/spec/lib/pact_broker/api/decorators/embedded_version_decorator_spec.rb +1 -1
  43. data/spec/lib/pact_broker/api/decorators/latest_pact_decorator_spec.rb +1 -1
  44. data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +2 -2
  45. data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +1 -1
  46. data/spec/lib/pact_broker/api/decorators/tag_decorator_spec.rb +1 -1
  47. data/spec/lib/pact_broker/api/decorators/version_decorator_spec.rb +1 -1
  48. data/spec/lib/pact_broker/api/decorators/versions_decorator_spec.rb +44 -0
  49. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +35 -39
  50. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +2 -2
  51. data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +2 -2
  52. data/spec/lib/pact_broker/api/resources/pact_spec.rb +2 -3
  53. data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +3 -3
  54. data/spec/lib/pact_broker/api/resources/tag_spec.rb +2 -2
  55. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +1 -1
  56. data/spec/lib/pact_broker/api/resources/webhook_spec.rb +1 -1
  57. data/spec/lib/pact_broker/pacts/diff_spec.rb +1 -1
  58. metadata +28 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 082fae49739e644a0b575b9242ac248f63606e04
4
- data.tar.gz: 19c28520e5b3076c27d7e5f806f8aafae3ba0c1d
3
+ metadata.gz: ee70ece82ed0bd78c3ab1d09fef1248d7686e252
4
+ data.tar.gz: 30b3bf57e83a827fbd7e62fb80dd4fe8414662b6
5
5
  SHA512:
6
- metadata.gz: be084a3e0fb139081fdb05acd03317cd0a7b7b9617196a0a8f2c1accd2b5df18d94cc4532f4e4ac03c6613c3acaf60f8cebc5f2fc1806674f1d0c7c33049b25e
7
- data.tar.gz: 0bfcd1da43d8f1ebb81fa5b5661d5632a0c82be9383b1dfc0217c338386cf4b337be32c488a41a13853e600ae647475ae0f92ac971d4f6ec5ba946deaf13b0ac
6
+ metadata.gz: c416ab1439d9975218b456a03f3f5cf67784f1f785f27c2a84da53022daa1fc99af14105949b8e26191180ed10487d49eff97aac5754d916e6ffaf4a91ff9108
7
+ data.tar.gz: 964b25fcd0b9bfabd935b5830fbad6706aab0886c554456c085ca08a47c79a2b9e165e3e231a8c68bfbbfe31b2fef2438a28c64fe55654a48c7c90cf2174d1b4
data/.travis.yml CHANGED
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 2.2.5
4
4
  - 2.3.1
5
+ - 2.4.0
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@ Do this to generate your change history
2
2
 
3
3
  $ git log --pretty=format:' * %h - %s (%an, %ad)' vX.Y.Z..HEAD
4
4
 
5
+ #### 1.15.0 (2017-03-28)
6
+ * 588c33e - Adds versions decorator spec (Ivan Vojinovic, Wed Feb 22 00:00:46 2017 -0500)
7
+ * c4a7daf - Adds pacticipant versions endpoint (Ivan Vojinovic, Tue Feb 21 21:15:39 2017 -0500)
8
+ * 06bcbc8 - Added ruby 2.4.0 to travis.yml (Beth Skurrie, Tue Mar 28 19:09:06 2017 +1100)
9
+ * 6d7653b - Bump pact_broker version to 1.14.0 to resolve twisted dependencies. (Tan Le, Mon Mar 27 22:36:22 2017 +1100)
10
+ * c8eeab4 - Remove trailblazer dependency. (Tan Le, Mon Mar 27 21:56:43 2017 +1100)
11
+ * e62c5ec - Added copyright year and owner. (Beth Skurrie, Fri Mar 24 10:39:39 2017 +1100)
12
+ * 5007f5b - Bump trailblazer version due to roar compatibility. (Tan Le, Mon Feb 20 10:22:41 2017 +1100)
13
+ * 4865948 - Bump reform and friends versions. (Tan Le, Wed Feb 15 09:16:29 2017 +1100)
14
+ * 0920e45 - Add hosted pact broker to usage section in README (Matt Fellows, Sat Feb 4 11:28:36 2017 +1100)
15
+
5
16
  #### 1.14.0 (2017-01-30)
6
17
  * 83ac7a5 - Adds ability to delete tags (Ivan Vojinovic, Fri Jan 27 15:19:51 2017 -0500)
7
18
 
data/LICENSE.txt CHANGED
@@ -1,3 +1,5 @@
1
+ Copyright (c) 2013 Bethany Skurrie
2
+
1
3
  MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
data/README.md CHANGED
@@ -80,7 +80,7 @@ Use the HAL browser to view documentation as you browse.
80
80
 
81
81
  ### To have a play around on your local machine
82
82
 
83
- * Install ruby 1.9.3 or later and bundler >= 1.12.0
83
+ * Install ruby 1.9.3 or later and bundler >= 1.12.0 (NOTE! Currently broken on ruby 2.4.0. See [issue 78](https://github.com/bethesque/pact_broker/issues/78). )
84
84
  * Run `git clone git@github.com:bethesque/pact_broker.git && cd pact_broker/example`
85
85
  * Run `bundle`
86
86
  * Run `bundle exec rackup -p 8080`
@@ -90,6 +90,11 @@ Use the HAL browser to view documentation as you browse.
90
90
  * Click on the HAL Browser link to have a poke around the API.
91
91
  * Click on the book icon under "docs" to view documentation related to a given relation.
92
92
 
93
+ ### Hosted
94
+
95
+ In a hurry? Hate having to run your own infrastructure? Check out
96
+ the [Hosted Pact Broker](https://pact.dius.com.au/?utm_source=github&utm_campaign=GITHUB_BROKER&utm_medium=github) - it's fast, it's secure and it's free!
97
+
93
98
  ### For reals
94
99
 
95
100
  You can use the [Pact Broker Docker container][docker] or [Terraform on AWS][terraform] or to roll your own...
@@ -109,4 +114,3 @@ You can use the [Pact Broker Docker container][docker] or [Terraform on AWS][ter
109
114
  [different-teams]: https://github.com/realestate-com-au/pact/wiki/Using-pact-where-the-consumer-team-is-different-from-the-provider-team
110
115
  [docker]: https://registry.hub.docker.com/u/dius/pact_broker/
111
116
  [terraform]: https://github.com/nadnerb/terraform-pact-broker
112
-
data/example/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "pact_broker", "~>1.9.3"
4
- gem "sqlite3" # Replace with your choice of database driver eg. gem "pg"
5
- gem "thin" # Keep, or replace with your choice of web server
3
+ gem 'pact_broker', '~> 1.14'
4
+ gem 'sqlite3' # Replace with your choice of database driver eg. gem "pg"
5
+ gem 'thin' # Keep, or replace with your choice of web server
data/lib/pact_broker.rb CHANGED
@@ -1,7 +1,12 @@
1
+ require 'reform'
2
+ require 'reform/form/dry'
3
+
1
4
  require 'pact_broker/version'
2
5
  require 'pact_broker/logging'
3
6
  require 'pact_broker/app'
4
7
 
5
8
  module PactBroker
6
-
9
+ Reform::Form.class_eval do
10
+ feature Reform::Form::Dry
11
+ end
7
12
  end
@@ -1,3 +1,9 @@
1
+ require 'reform'
2
+ require 'reform/form/dry'
3
+ Reform::Form.class_eval do
4
+ feature Reform::Form::Dry
5
+ end
6
+
1
7
  require 'pact_broker/api/resources/pact'
2
8
  require 'pact_broker/api/resources/latest_pact'
3
9
  require 'pact_broker/api/resources/latest_pacts'
@@ -13,11 +19,11 @@ require 'pact_broker/api/resources/webhooks'
13
19
  require 'pact_broker/api/resources/webhook'
14
20
  require 'pact_broker/api/resources/webhook_execution'
15
21
  require 'pact_broker/api/resources/version'
22
+ require 'pact_broker/api/resources/versions'
16
23
  require 'pact_broker/api/resources/pact_content_diff'
17
24
  require 'pact_broker/api/resources/previous_distinct_pact_version'
18
25
  require 'pact_broker/api/resources/latest_provider_pacts'
19
26
 
20
-
21
27
  require 'webmachine/adapters/rack_mapped'
22
28
 
23
29
  module PactBroker
@@ -44,6 +50,7 @@ module PactBroker
44
50
  add ['pacts', 'latest'], Api::Resources::LatestPacts
45
51
  add ['pacticipants'], Api::Resources::Pacticipants
46
52
  add ['pacticipants', :name], Api::Resources::Pacticipant
53
+ add ['pacticipants', :pacticipant_name, 'versions'], Api::Resources::Versions
47
54
  add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number], Api::Resources::Version
48
55
  add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number, 'tags', :tag_name], Api::Resources::Tag
49
56
  add ['relationships'], Api::Resources::Relationships
@@ -1,17 +1,15 @@
1
1
  require 'reform'
2
- require 'reform/contract'
2
+ require 'reform/form'
3
3
 
4
4
  module PactBroker
5
5
  module Api
6
6
  module Contracts
7
-
8
- class PacticipantNameContract < Reform::Contract
7
+ class PacticipantNameContract < Reform::Form
9
8
  property :name
10
9
  property :name_in_pact
11
10
  property :pacticipant
12
11
  property :message_args
13
12
 
14
-
15
13
  include PactBroker::Messages
16
14
 
17
15
  def blank? string
@@ -1,54 +1,47 @@
1
1
  require 'reform'
2
- require 'reform/contract'
3
- require 'pact_broker/messages'
4
- require 'pact_broker/constants'
5
- require 'pact_broker/api/contracts/pacticipant_name_contract'
6
- require 'pact_broker/api/contracts/consumer_version_number_validation'
2
+ require 'reform/form'
7
3
 
8
4
  module PactBroker
9
5
  module Api
10
6
  module Contracts
7
+ class PutPacticipantNameContract < Reform::Form
8
+ property :name
9
+ property :name_in_pact
10
+ property :pacticipant
11
+ property :message_args
12
+
13
+ validation do
14
+ configure do
15
+ config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
16
+ end
11
17
 
12
- class PutPacticipantNameContract < PacticipantNameContract
13
-
14
- validates :name, presence: true, blank: false
15
- validate :name_in_path_matches_name_in_pact
18
+ required(:name).maybe
19
+ required(:name_in_pact).maybe
16
20
 
17
- def name_in_path_matches_name_in_pact
18
- if present?(name) && present?(name_in_pact)
19
- if name != name_in_pact
20
- errors.add(:name, validation_message('pacticipant_name_mismatch', message_args))
21
- end
21
+ rule(name_in_path_matches_name_in_pact?: [:name, :name_in_pact]) do |name, name_in_pact|
22
+ name_in_pact.filled?.then(name.eql?(value(:name_in_pact)))
22
23
  end
23
24
  end
24
-
25
- def present? string
26
- string && !blank?(string)
27
- end
28
-
29
25
  end
30
26
 
31
- class PutPactParamsContract < Reform::Contract
32
-
33
- include PactBroker::Messages
34
-
27
+ class PutPactParamsContract < Reform::Form
35
28
  property :consumer_version_number
36
29
  property :consumer, form: PutPacticipantNameContract
37
30
  property :provider, form: PutPacticipantNameContract
38
31
 
39
- validates :consumer_version_number, presence: true
40
- validate :consumer_version_number_valid
41
-
32
+ validation do
33
+ configure do
34
+ config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
42
35
 
43
- include ConsumerVersionNumberValidation
36
+ def valid_consumer_version_number?(value)
37
+ parsed_version_number = PactBroker.configuration.version_parser.call(value)
38
+ !parsed_version_number.nil?
39
+ end
40
+ end
44
41
 
45
- def consumer_version_number_validation_message
46
- validation_message('consumer_version_number_invalid', consumer_version_number: consumer_version_number)
42
+ required(:consumer_version_number).filled(:valid_consumer_version_number?)
47
43
  end
48
-
49
44
  end
50
-
51
-
52
45
  end
53
46
  end
54
47
  end
@@ -8,9 +8,7 @@ module PactBroker
8
8
 
9
9
  module RequestValidations
10
10
  def method_is_valid
11
- if http_method && !valid_method?
12
- errors.add(:method, "is not a recognised HTTP method")
13
- end
11
+ http_method && !valid_method?
14
12
  end
15
13
 
16
14
  def valid_method?
@@ -18,9 +16,7 @@ module PactBroker
18
16
  end
19
17
 
20
18
  def url_is_valid
21
- if url && !url_valid?
22
- errors.add(:url, "is not a valid URL eg. http://example.org")
23
- end
19
+ url && !url_valid?
24
20
  end
25
21
 
26
22
  def url_valid?
@@ -28,11 +24,9 @@ module PactBroker
28
24
  end
29
25
 
30
26
  def uri
31
- begin
32
- URI(url)
33
- rescue URI::InvalidURIError
34
- nil
35
- end
27
+ URI(url)
28
+ rescue URI::InvalidURIError
29
+ nil
36
30
  end
37
31
  end
38
32
  end
@@ -1,31 +1,44 @@
1
1
  require 'reform'
2
- require 'reform/contract'
3
- require 'pact_broker/api/contracts/request_validations'
2
+ require 'reform/form'
4
3
 
5
4
  module PactBroker
6
5
  module Api
7
6
  module Contracts
8
-
9
- class WebhookContract < Reform::Contract
10
-
7
+ class WebhookContract < Reform::Form
11
8
  property :request
12
- validates :request, presence: true
13
9
 
14
- property :request do
10
+ validation do
11
+ configure do
12
+ config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
13
+ end
15
14
 
16
- include RequestValidations
15
+ required(:request).filled
16
+ end
17
17
 
18
+ property :request do
18
19
  property :url
19
20
  property :http_method
20
21
 
21
- validates :url, presence: true
22
- validates :http_method, presence: true
23
-
24
- validate :method_is_valid
25
- validate :url_is_valid
26
-
22
+ validation do
23
+ configure do
24
+ config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
25
+
26
+ def valid_method?(value)
27
+ Net::HTTP.const_defined?(value.capitalize)
28
+ end
29
+
30
+ def valid_url?(value)
31
+ uri = URI(value)
32
+ uri.scheme && uri.host
33
+ rescue URI::InvalidURIError
34
+ false
35
+ end
36
+ end
37
+
38
+ required(:http_method).filled(:valid_method?)
39
+ required(:url).filled(:valid_url?)
40
+ end
27
41
  end
28
-
29
42
  end
30
43
  end
31
44
  end
@@ -0,0 +1,41 @@
1
+ require_relative 'base_decorator'
2
+ require_relative 'version_decorator'
3
+
4
+ module PactBroker
5
+
6
+ module Api
7
+
8
+ module Decorators
9
+
10
+
11
+ class VersionsDecorator < BaseDecorator
12
+
13
+ collection :entries, as: :versions, embedded: true, :extend => PactBroker::Api::Decorators::VersionDecorator
14
+
15
+ link :self do | context |
16
+ {
17
+ href: context[:resource_url],
18
+ title: "All versions of the pacticipant #{context[:pacticipant_name]}"
19
+ }
20
+ end
21
+
22
+ link :pacticipant do | context |
23
+ {
24
+ href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:pacticipant_name])),
25
+ title: context[:pacticipant_name]
26
+ }
27
+ end
28
+
29
+ links :'versions' do | context |
30
+ represented.collect do | version |
31
+ {
32
+ :href => version_url(context[:base_url], version),
33
+ :title => version.version_and_updated_date
34
+ }
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -89,6 +89,10 @@ module PactBroker
89
89
  identifier_from_path[:provider_name]
90
90
  end
91
91
 
92
+ def pacticipant_name
93
+ identifier_from_path[:pacticipant_name]
94
+ end
95
+
92
96
  def invalid_json?
93
97
  begin
94
98
  JSON.parse(request_body, PACT_PARSING_OPTIONS) #Not load! Otherwise it will try to load Ruby classes.
@@ -110,9 +114,9 @@ module PactBroker
110
114
  end
111
115
  end
112
116
 
113
- def contract_validation_errors? contract
114
- if (invalid = !contract.validate)
115
- set_json_validation_error_messages contract.errors.full_messages
117
+ def contract_validation_errors? contract, pact_params
118
+ if (invalid = !contract.validate(pact_params))
119
+ set_json_validation_error_messages contract.errors.messages
116
120
  end
117
121
  invalid
118
122
  end
@@ -22,7 +22,7 @@ module PactBroker
22
22
 
23
23
  def to_json
24
24
  response.headers['X-Pact-Consumer-Version'] = pact.consumer_version_number
25
- PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(base_url: base_url)
25
+ PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(user_options: { base_url: base_url })
26
26
  end
27
27
 
28
28
  def to_html
@@ -15,7 +15,7 @@ module PactBroker
15
15
  end
16
16
 
17
17
  def to_json
18
- PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(base_url: base_url)
18
+ PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(user_options: { base_url: base_url })
19
19
  end
20
20
 
21
21
  def pacts
@@ -26,4 +26,4 @@ module PactBroker
26
26
  end
27
27
 
28
28
  end
29
- end
29
+ end
@@ -21,7 +21,7 @@ module PactBroker
21
21
  end
22
22
 
23
23
  def to_json
24
- PactBroker::Api::Decorators::ProviderPactsDecorator.new(pacts).to_json(decorator_context(identifier_from_path))
24
+ PactBroker::Api::Decorators::ProviderPactsDecorator.new(pacts).to_json(user_options: decorator_context(identifier_from_path))
25
25
  end
26
26
 
27
27
  def pacts
@@ -49,7 +49,7 @@ module PactBroker
49
49
  def malformed_request?
50
50
  if request.patch? || request.put?
51
51
  invalid_json? ||
52
- contract_validation_errors?(Contracts::PutPactParamsContract.new(pact_params))
52
+ contract_validation_errors?(Contracts::PutPactParamsContract.new(pact_params), pact_params)
53
53
  else
54
54
  false
55
55
  end
@@ -73,7 +73,7 @@ module PactBroker
73
73
  end
74
74
 
75
75
  def to_json
76
- PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(base_url: base_url)
76
+ PactBroker::Api::Decorators::PactDecorator.new(pact).to_json(user_options: { base_url: base_url })
77
77
  end
78
78
 
79
79
  def delete_resource