pact_broker 2.68.1 → 2.73.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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release_gem.yml +7 -1
  3. data/.github/workflows/test.yml +54 -0
  4. data/CHANGELOG.md +70 -0
  5. data/DEVELOPER_SETUP.md +6 -0
  6. data/Dockerfile +8 -3
  7. data/Gemfile +6 -1
  8. data/ISSUES.md +23 -0
  9. data/config/database.yml +14 -0
  10. data/db/ddl_statements/latest_verification_ids_for_consumer_and_provider.rb +25 -0
  11. data/db/migrations/20180524_create_latest_verifications_for_consumer_and_provider.rb +4 -11
  12. data/db/migrations/20180614_update_latest_verification_ids_for_consumer_and_provider.rb +6 -18
  13. data/db/migrations/20201026_update_latest_verification_ids_for_consumer_and_provider.rb +14 -0
  14. data/docker-compose-ci-mysql.yml +37 -0
  15. data/docker-compose-issue-repro.yml +11 -7
  16. data/lib/db.rb +1 -0
  17. data/lib/pact/doc/interaction_view_model.rb +12 -0
  18. data/lib/pact/doc/markdown/interaction.erb +3 -3
  19. data/lib/pact/doc/markdown/interaction_renderer.rb +2 -1
  20. data/lib/pact_broker/api/decorators/extended_pact_decorator.rb +9 -1
  21. data/lib/pact_broker/api/decorators/extended_verification_decorator.rb +8 -0
  22. data/lib/pact_broker/api/decorators/matrix_decorator.rb +9 -4
  23. data/lib/pact_broker/api/decorators/pact_decorator.rb +8 -0
  24. data/lib/pact_broker/api/decorators/tag_decorator.rb +0 -3
  25. data/lib/pact_broker/api/pact_broker_urls.rb +6 -2
  26. data/lib/pact_broker/api/resources/clean.rb +36 -0
  27. data/lib/pact_broker/api/resources/error_handler.rb +1 -1
  28. data/lib/pact_broker/api/resources/group.rb +5 -1
  29. data/lib/pact_broker/api/resources/metadata_resource_methods.rb +23 -0
  30. data/lib/pact_broker/api/resources/pact.rb +2 -13
  31. data/lib/pact_broker/api/resources/pact_content_diff.rb +1 -1
  32. data/lib/pact_broker/api/resources/pact_resource_methods.rb +23 -0
  33. data/lib/pact_broker/api/resources/pact_version.rb +3 -0
  34. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +4 -0
  35. data/lib/pact_broker/api/resources/verifications.rb +2 -4
  36. data/lib/pact_broker/api/resources/webhooks.rb +1 -1
  37. data/lib/pact_broker/app.rb +1 -0
  38. data/lib/pact_broker/configuration.rb +12 -4
  39. data/lib/pact_broker/db/clean.rb +34 -11
  40. data/lib/pact_broker/db/clean_incremental.rb +217 -0
  41. data/lib/pact_broker/db/delete_overwritten_data.rb +55 -27
  42. data/lib/pact_broker/domain/tag.rb +111 -8
  43. data/lib/pact_broker/domain/verification.rb +93 -0
  44. data/lib/pact_broker/domain/version.rb +35 -1
  45. data/lib/pact_broker/logging.rb +7 -0
  46. data/lib/pact_broker/matrix/unresolved_selector.rb +12 -0
  47. data/lib/pact_broker/metrics/service.rb +17 -4
  48. data/lib/pact_broker/pacts/all_pact_publications.rb +9 -3
  49. data/lib/pact_broker/pacts/latest_pact_publications.rb +15 -0
  50. data/lib/pact_broker/pacts/metadata.rb +3 -1
  51. data/lib/pact_broker/pacts/pact_publication.rb +7 -1
  52. data/lib/pact_broker/pacts/repository.rb +39 -13
  53. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +1 -1
  54. data/lib/pact_broker/tags/tag_with_latest_flag.rb +2 -0
  55. data/lib/pact_broker/tasks/clean_task.rb +48 -4
  56. data/lib/pact_broker/tasks/delete_overwritten_data_task.rb +23 -7
  57. data/lib/pact_broker/test/http_test_data_builder.rb +53 -6
  58. data/lib/pact_broker/test/test_data_builder.rb +24 -0
  59. data/lib/pact_broker/version.rb +1 -1
  60. data/lib/pact_broker/webhooks/triggered_webhook.rb +6 -0
  61. data/lib/sequel/extensions/statement_timeout.rb +22 -0
  62. data/pact_broker.gemspec +1 -1
  63. data/script/docker-container/test.sh +3 -0
  64. data/script/docker/db-psql.sh +3 -0
  65. data/script/docker/db-reload.sh +11 -0
  66. data/script/docker/db-start.sh +1 -1
  67. data/script/pry.rb +25 -0
  68. data/script/reproduce-issue-starting-up.rb +43 -0
  69. data/script/reproduce-issue.rb +18 -15
  70. data/script/seed.rb +1 -0
  71. data/script/test/run-rake-on-docker-compose-mysql.sh +8 -0
  72. data/spec/features/delete_tagged_pact_versions_spec.rb +2 -2
  73. data/spec/features/get_pact_spec.rb +2 -2
  74. data/spec/features/get_pact_version.rb +26 -3
  75. data/spec/fixtures/approvals/clean_incremental_dry_run.approved.json +100 -0
  76. data/spec/fixtures/approvals/modifiable_resources.approved.json +3 -0
  77. data/spec/lib/pact/doc/interaction_view_model_spec.rb +46 -0
  78. data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +11 -0
  79. data/spec/lib/pact_broker/api/decorators/extended_pact_decorator_spec.rb +1 -0
  80. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +20 -8
  81. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +15 -1
  82. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +16 -0
  83. data/spec/lib/pact_broker/api/resources/group_spec.rb +9 -7
  84. data/spec/lib/pact_broker/api/resources/pact_spec.rb +20 -9
  85. data/spec/lib/pact_broker/api/resources/tagged_pact_versions_spec.rb +10 -2
  86. data/spec/lib/pact_broker/api/resources/verifications_spec.rb +7 -3
  87. data/spec/lib/pact_broker/db/clean_incremental_spec.rb +119 -0
  88. data/spec/lib/pact_broker/db/clean_spec.rb +4 -8
  89. data/spec/lib/pact_broker/db/delete_overwritten_data_spec.rb +71 -11
  90. data/spec/lib/pact_broker/domain/tag_spec.rb +60 -0
  91. data/spec/lib/pact_broker/domain/verification_spec.rb +62 -0
  92. data/spec/lib/pact_broker/domain/version_spec.rb +23 -0
  93. data/spec/lib/pact_broker/metrics/service_spec.rb +4 -1
  94. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +3 -1
  95. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +14 -1
  96. data/spec/lib/pact_broker/pacts/repository_spec.rb +54 -7
  97. data/spec/lib/pact_broker/pacts/selected_pact_spec.rb +23 -0
  98. data/spec/migrations/change_migration_strategy_spec.rb +1 -1
  99. data/spec/support/markdown_pact_v3.json +44 -0
  100. metadata +33 -7
@@ -8,6 +8,8 @@ module Pact
8
8
 
9
9
  include Pact::ActiveSupportSupport
10
10
 
11
+ MARKDOWN_BOLD_CHARACTERS = '**'
12
+
11
13
  def initialize interaction, consumer_contract
12
14
  @interaction = interaction
13
15
  @consumer_contract = consumer_contract
@@ -52,6 +54,16 @@ module Pact
52
54
  markdown_escape apply_capitals(@interaction.provider_state.strip, start_of_sentence)
53
55
  end
54
56
 
57
+ def formatted_provider_states mark_bold: false
58
+ bold_marker = mark_bold ? MARKDOWN_BOLD_CHARACTERS : ''
59
+
60
+ (@interaction.provider_states || []).map do |ps|
61
+ "#{bold_marker}" \
62
+ "#{markdown_escape(apply_capitals(ps.name.strip, false))}" \
63
+ "#{bold_marker}"
64
+ end.join(' and ')
65
+ end
66
+
55
67
  def description start_of_sentence = false
56
68
  return '' unless @interaction.description
57
69
  markdown_escape apply_capitals(@interaction.description.strip, start_of_sentence)
@@ -1,6 +1,6 @@
1
- <a name="<%= interaction.id %>"></a>
2
- <%= if interaction.has_provider_state?
3
- "Given **#{h(interaction.provider_state)}**, upon receiving"
1
+ <a name="<%= interaction.id %>"></a><% formatted_provider_states = h(interaction.formatted_provider_states mark_bold: true) %>
2
+ <%= if !formatted_provider_states.empty?
3
+ "Given #{formatted_provider_states}, upon receiving"
4
4
  else
5
5
  "Upon receiving"
6
6
  end
@@ -13,7 +13,8 @@ module Pact
13
13
  end
14
14
 
15
15
  def render_summary
16
- suffix = interaction.has_provider_state? ? " given #{h(interaction.provider_state)}" : ""
16
+ formatted_provider_states = h(interaction.formatted_provider_states)
17
+ suffix = formatted_provider_states.empty? ? "" : " given #{formatted_provider_states}"
17
18
  "* [#{h(interaction.description(true))}](##{interaction.id})#{suffix}\n\n"
18
19
  end
19
20
 
@@ -11,6 +11,14 @@ module PactBroker
11
11
  property :name
12
12
  property :latest, getter: ->(_) { true }
13
13
 
14
+ link :self do | options |
15
+ {
16
+ title: 'Tag',
17
+ name: represented.name,
18
+ href: tag_url(options[:base_url], represented)
19
+ }
20
+ end
21
+
14
22
  link "pb:latest-pact" do | opts |
15
23
  {
16
24
  name: "The latest pact with the tag #{represented.name}",
@@ -33,7 +41,7 @@ module PactBroker
33
41
 
34
42
  def head_tags
35
43
  represented.head_tag_names.collect do | tag_name |
36
- OpenStruct.new(name: tag_name, pact: represented)
44
+ OpenStruct.new(name: tag_name, pact: represented, version: represented.consumer_version)
37
45
  end
38
46
  end
39
47
  end
@@ -7,6 +7,14 @@ module PactBroker
7
7
  class TagDecorator < BaseDecorator
8
8
  property :name
9
9
  property :latest?, as: :latest
10
+
11
+ link :self do | options |
12
+ {
13
+ title: 'Tag',
14
+ name: represented.name,
15
+ href: tag_url(options[:base_url], represented)
16
+ }
17
+ end
10
18
  end
11
19
 
12
20
  collection :provider_version_tags, as: :tags, embedded: true, extend: TagDecorator
@@ -76,7 +76,7 @@ module PactBroker
76
76
  href: version_url(base_url, consumer_version)
77
77
  }
78
78
  },
79
- tags: tags(line.consumer_version_tags)
79
+ tags: tags(line.consumer_version_tags, base_url)
80
80
  },
81
81
  _links: {
82
82
  self: {
@@ -86,11 +86,16 @@ module PactBroker
86
86
  }
87
87
  end
88
88
 
89
- def tags(tags)
89
+ def tags(tags, base_url)
90
90
  tags.collect do | tag |
91
91
  {
92
92
  name: tag.name,
93
- latest: tag.latest?
93
+ latest: tag.latest?,
94
+ _links: {
95
+ self: {
96
+ href: tag_url(base_url, tag)
97
+ }
98
+ }
94
99
  }
95
100
  end
96
101
  end
@@ -114,7 +119,7 @@ module PactBroker
114
119
  href: version_url(base_url, provider_version)
115
120
  }
116
121
  },
117
- tags: tags(line.provider_version_tags)
122
+ tags: tags(line.provider_version_tags, base_url)
118
123
  }
119
124
  end
120
125
 
@@ -50,6 +50,14 @@ module PactBroker
50
50
  }
51
51
  end
52
52
 
53
+ link :'pb:pact-version' do | options |
54
+ {
55
+ title: "Pact content version permalink",
56
+ name: represented.pact_version_sha,
57
+ href: pact_version_url(represented, options.fetch(:base_url))
58
+ }
59
+ end
60
+
53
61
  link :'pb:latest-pact-version' do | options |
54
62
  {
55
63
  title: "Latest version of this pact",
@@ -3,11 +3,8 @@ require_relative 'pact_pacticipant_decorator'
3
3
  require_relative 'timestamps'
4
4
 
5
5
  module PactBroker
6
-
7
6
  module Api
8
-
9
7
  module Decorators
10
-
11
8
  class TagDecorator < BaseDecorator
12
9
 
13
10
  property :name
@@ -75,7 +75,7 @@ module PactBroker
75
75
  end
76
76
 
77
77
  def decode_pact_metadata(metadata)
78
- if metadata
78
+ if metadata && metadata != ''
79
79
  begin
80
80
  Rack::Utils.parse_nested_query(Base64.strict_decode64(metadata)).each_with_object({}) do | (k, v), new_hash |
81
81
  new_hash[k.to_sym] = v
@@ -116,6 +116,10 @@ module PactBroker
116
116
  "#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/versions"
117
117
  end
118
118
 
119
+ def tagged_pact_versions_url consumer_name, provider_name, tag, base_url = ""
120
+ "#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/tag/#{url_encode(tag)}"
121
+ end
122
+
119
123
  def integration_url consumer_name, provider_name, base_url = ""
120
124
  "#{base_url}/integrations/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}"
121
125
  end
@@ -197,7 +201,7 @@ module PactBroker
197
201
  end
198
202
 
199
203
  def tag_url base_url, tag
200
- "#{tags_url(base_url, tag.version)}/#{tag.name}"
204
+ "#{tags_url(base_url, tag.version)}/#{url_encode(tag.name)}"
201
205
  end
202
206
 
203
207
  def templated_tag_url_for_pacticipant pacticipant_name, base_url = ""
@@ -0,0 +1,36 @@
1
+ require 'pact_broker/api/resources/base_resource'
2
+ require 'pact_broker/db/clean'
3
+ require 'pact_broker/matrix/unresolved_selector'
4
+
5
+ module PactBroker
6
+ module Api
7
+ module Resources
8
+ class Clean < BaseResource
9
+ def content_types_accepted
10
+ [["application/json"]]
11
+ end
12
+
13
+ def content_types_provided
14
+ [["application/hal+json"]]
15
+ end
16
+
17
+ def allowed_methods
18
+ ["POST", "OPTIONS"]
19
+ end
20
+
21
+ def process_post
22
+ keep_selectors = (params[:keep] || []).collect do | hash |
23
+ PactBroker::Matrix::UnresolvedSelector.new(hash)
24
+ end
25
+
26
+ result = PactBroker::DB::Clean.call(Sequel::Model.db, { keep: keep_selectors })
27
+ response.body = result.to_json
28
+ end
29
+
30
+ def policy_name
31
+ :'integrations::clean'
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -29,7 +29,7 @@ module PactBroker
29
29
  end
30
30
 
31
31
  def self.log_as_warning?(e)
32
- PactBroker.configuration.warning_error_classes.any? { |clazz| e.is_a?(clazz) }
32
+ PactBroker.configuration.warning_error_classes.any? { |clazz| e.is_a?(clazz) || e.cause&.is_a?(clazz) }
33
33
  end
34
34
 
35
35
  def self.display_message(e, obfuscated_message)
@@ -18,7 +18,11 @@ module PactBroker
18
18
  end
19
19
 
20
20
  def to_csv
21
- PactBroker::Api::Decorators::RelationshipsCsvDecorator.new(group).to_csv
21
+ if group
22
+ PactBroker::Api::Decorators::RelationshipsCsvDecorator.new(group).to_csv
23
+ else
24
+ ""
25
+ end
22
26
  end
23
27
 
24
28
  def policy_name
@@ -0,0 +1,23 @@
1
+ require 'pact_broker/hash_refinements'
2
+
3
+ module PactBroker
4
+ module Api
5
+ module Resources
6
+ module MetadataResourceMethods
7
+ using PactBroker::HashRefinements
8
+
9
+ def pact_params
10
+ @pact_params ||= PactBroker::Pacts::PactParams.from_request(request, maybe_params_with_consumer_version_number.merge(path_info))
11
+ end
12
+
13
+ def maybe_params_with_consumer_version_number
14
+ metadata.slice(:consumer_version_number)
15
+ end
16
+
17
+ def metadata
18
+ @metadata ||= PactBrokerUrls.decode_pact_metadata(identifier_from_path[:metadata])
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -8,6 +8,7 @@ require 'pact_broker/pacts/pact_params'
8
8
  require 'pact_broker/api/contracts/put_pact_params_contract'
9
9
  require 'pact_broker/webhooks/execution_configuration'
10
10
  require 'pact_broker/api/resources/webhook_execution_methods'
11
+ require 'pact_broker/api/resources/pact_resource_methods'
11
12
 
12
13
  module PactBroker
13
14
  module Api
@@ -15,6 +16,7 @@ module PactBroker
15
16
  class Pact < BaseResource
16
17
  include PacticipantResourceMethods
17
18
  include WebhookExecutionMethods
19
+ include PactResourceMethods
18
20
 
19
21
  def content_types_provided
20
22
  [
@@ -110,19 +112,6 @@ module PactBroker
110
112
  @pact_params ||= PactBroker::Pacts::PactParams.from_request request, path_info
111
113
  end
112
114
 
113
- def set_post_deletion_response
114
- latest_pact = pact_service.find_latest_pact(pact_params)
115
- response_body = { "_links" => { index: { href: base_url } } }
116
- if latest_pact
117
- response_body["_links"]["pb:latest-pact-version"] = {
118
- href: latest_pact_url(base_url, latest_pact),
119
- title: "Latest pact"
120
- }
121
- end
122
- response.body = response_body.to_json
123
- response.headers["Content-Type" => "application/hal+json;charset=utf-8"]
124
- end
125
-
126
115
  def webhook_options
127
116
  {
128
117
  database_connector: database_connector,
@@ -15,7 +15,7 @@ module PactBroker
15
15
  end
16
16
 
17
17
  def resource_exists?
18
- consumer && provider
18
+ pact
19
19
  end
20
20
 
21
21
  def to_text
@@ -0,0 +1,23 @@
1
+ module PactBroker
2
+ module Api
3
+ module Resources
4
+ module PactResourceMethods
5
+ def set_post_deletion_response
6
+ latest_pact = pact_service.find_latest_pact(
7
+ consumer_name: pact_params[:consumer_name],
8
+ provider_name: pact_params[:provider_name]
9
+ )
10
+ response_body = { "_links" => { index: { href: base_url } } }
11
+ if latest_pact
12
+ response_body["_links"]["pb:latest-pact-version"] = {
13
+ href: latest_pact_url(base_url, latest_pact),
14
+ title: "Latest pact"
15
+ }
16
+ end
17
+ response.body = response_body.to_json
18
+ response.headers["Content-Type" => "application/hal+json;charset=utf-8"]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,9 +1,12 @@
1
1
  require 'pact_broker/api/resources/pact'
2
+ require 'pact_broker/api/resources/metadata_resource_methods'
2
3
 
3
4
  module PactBroker
4
5
  module Api
5
6
  module Resources
6
7
  class PactVersion < Pact
8
+ include MetadataResourceMethods
9
+
7
10
  def allowed_methods
8
11
  ["GET", "OPTIONS"]
9
12
  end
@@ -1,11 +1,14 @@
1
1
  require 'pact_broker/api/resources/base_resource'
2
2
  require 'pact_broker/configuration'
3
3
  require 'pact_broker/api/decorators/tagged_pact_versions_decorator'
4
+ require 'pact_broker/api/resources/pact_resource_methods'
4
5
 
5
6
  module PactBroker
6
7
  module Api
7
8
  module Resources
8
9
  class TaggedPactVersions < BaseResource
10
+ include PactResourceMethods
11
+
9
12
  def content_types_provided
10
13
  [["application/hal+json", :to_json]]
11
14
  end
@@ -24,6 +27,7 @@ module PactBroker
24
27
 
25
28
  def delete_resource
26
29
  pact_service.delete_all_pact_publications_between consumer_name, and: provider_name, tag: identifier_from_path[:tag]
30
+ set_post_deletion_response
27
31
  true
28
32
  end
29
33
 
@@ -4,12 +4,14 @@ require 'pact_broker/domain/verification'
4
4
  require 'pact_broker/api/contracts/verification_contract'
5
5
  require 'pact_broker/api/decorators/verification_decorator'
6
6
  require 'pact_broker/api/resources/webhook_execution_methods'
7
+ require 'pact_broker/api/resources/metadata_resource_methods'
7
8
 
8
9
  module PactBroker
9
10
  module Api
10
11
  module Resources
11
12
  class Verifications < BaseResource
12
13
  include WebhookExecutionMethods
14
+ include MetadataResourceMethods
13
15
 
14
16
  def content_types_accepted
15
17
  [["application/json", :from_json]]
@@ -75,10 +77,6 @@ module PactBroker
75
77
  PactBroker::Api::Decorators::VerificationDecorator.new(model)
76
78
  end
77
79
 
78
- def metadata
79
- PactBrokerUrls.decode_pact_metadata(identifier_from_path[:metadata])
80
- end
81
-
82
80
  def wip?
83
81
  metadata[:wip] == 'true'
84
82
  end
@@ -51,7 +51,7 @@ module PactBroker
51
51
  end
52
52
 
53
53
  def policy_name
54
- :'webhooks::webhooks'
54
+ request.post? ? :'webhooks::webhook' : :'webhooks::webhooks'
55
55
  end
56
56
 
57
57
  private
@@ -126,6 +126,7 @@ module PactBroker
126
126
  PactBroker::DB.validate_connection_config if configuration.validate_database_connection_config
127
127
  PactBroker::DB.set_mysql_strict_mode_if_mysql
128
128
  PactBroker::DB.connection.extension(:pagination)
129
+ PactBroker::DB.connection.extension(:statement_timeout)
129
130
 
130
131
  Sequel.datetime_class = DateTime
131
132
  Sequel.database_timezone = :utc # Store all dates in UTC, assume any date without a TZ is UTC
@@ -38,7 +38,8 @@ module PactBroker
38
38
  :log_dir,
39
39
  :allow_missing_migration_files,
40
40
  :auto_migrate_db_data,
41
- :use_rack_protection
41
+ :use_rack_protection,
42
+ :metrics_sql_statement_timeout
42
43
  ]
43
44
 
44
45
  attr_accessor :base_url, :log_dir, :database_connection, :auto_migrate_db, :auto_migrate_db_data, :allow_missing_migration_files, :example_data_seeder, :seed_example_data, :use_hal_browser, :html_pact_renderer, :use_rack_protection
@@ -57,6 +58,7 @@ module PactBroker
57
58
  attr_reader :api_error_reporters
58
59
  attr_reader :custom_logger
59
60
  attr_accessor :policy_builder, :policy_scope_builder, :base_resource_class_factory
61
+ attr_accessor :metrics_sql_statement_timeout
60
62
 
61
63
  alias_method :policy_finder=, :policy_builder=
62
64
  alias_method :policy_scope_finder=, :policy_scope_builder=
@@ -125,7 +127,8 @@ module PactBroker
125
127
  require 'pact_broker/api/resources/default_base_resource'
126
128
  PactBroker::Api::Resources::DefaultBaseResource
127
129
  }
128
- config.warning_error_class_names = ['Sequel::ForeignKeyConstraintViolation']
130
+ config.warning_error_class_names = ['Sequel::ForeignKeyConstraintViolation', 'PG::QueryCanceled']
131
+ config.metrics_sql_statement_timeout = 30
129
132
  config
130
133
  end
131
134
 
@@ -247,8 +250,13 @@ module PactBroker
247
250
 
248
251
  def warning_error_classes
249
252
  warning_error_class_names.collect do | class_name |
250
- Object.const_get(class_name)
251
- end
253
+ begin
254
+ Object.const_get(class_name)
255
+ rescue NameError => e
256
+ logger.warn("Class #{class_name} couldn't be loaded as a warning error class (#{e.class} - #{e.message}). Ignoring.")
257
+ nil
258
+ end
259
+ end.compact
252
260
  end
253
261
 
254
262
  private