pact_broker 1.14.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
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