pact 1.54.0 → 1.55.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 668b177b7d244716ded4b592c37be8788ce6d0e1fd4036becdf5025a73e40022
4
- data.tar.gz: 3185c5eeca1d02878e916b1feb6eddc4888a139374548987fc295d90b38d67c6
3
+ metadata.gz: 5df3588ab530c1daf855cfe6277e5753d8ca788066951f3e08ef181af615b1d7
4
+ data.tar.gz: f13b6198bd1e1383a4dd978ca77bcdc65ee1a60498be14e17bb19ce1622274f5
5
5
  SHA512:
6
- metadata.gz: 217392c245364ea7df2e75851d211760a57cb5ec19285d8a5f7cd1f770ff85211115d4137d8b60a2c6c7b75ccb7a2fceb85c17ba00f4ef727f452f11e09e2d67
7
- data.tar.gz: 111d4ddd772e5367485f716c19d9a8e64f8ce3e3045c273b48535dade001913bb6af2e552f6cc9f7e767b0f14d9111f62d7f114dd7b5318cdfcaade3a1ecab0f
6
+ metadata.gz: 476546bb221362d55c77df417d04a9f00a69bedc042ab6aabc059d498dc094f24f810ec25ea3f167ad77e366c4d8fd8d95b473d2d8d74ca5a58027d9d03e0e00
7
+ data.tar.gz: 500c176acb2a0f3e4b611b373afc0a868af0ba3bfa8d2082c4e192ffe00b80a4a63a11cadd408d19c28105091b73961c09ce2193d47705a3355b870fa9f777bf
@@ -1,3 +1,42 @@
1
+ <a name="v1.55.4"></a>
2
+ ### v1.55.4 (2020-10-09)
3
+
4
+ #### Bug Fixes
5
+
6
+ * add back missing output describing the interactions filter ([1a2d7c1](/../../commit/1a2d7c1))
7
+
8
+ <a name="v1.55.3"></a>
9
+ ### v1.55.3 (2020-09-28)
10
+
11
+ #### Bug Fixes
12
+
13
+ * correct logic for determining if all interactions for a pact have been verified ([c4f968e](/../../commit/c4f968e))
14
+ * de-duplicate re-run commands ([0813498](/../../commit/0813498))
15
+
16
+ <a name="v1.55.2"></a>
17
+ ### v1.55.2 (2020-09-26)
18
+
19
+ #### Bug Fixes
20
+
21
+ * correctly calculate exit code when a mix of pending and non pending pacts are verified ([533faa1](/../../commit/533faa1))
22
+
23
+ <a name="v1.55.1"></a>
24
+ ### v1.55.1 (2020-09-26)
25
+
26
+ #### Bug Fixes
27
+
28
+ * remove accidentally committed debug logging ([081423e](/../../commit/081423e))
29
+
30
+ <a name="v1.55.0"></a>
31
+ ### v1.55.0 (2020-09-26)
32
+
33
+ #### Features
34
+
35
+ * add consumer_version_selectors to pact verification DSL, and convert consumer_version_tags to selectors ([39e6c4a](/../../commit/39e6c4a))
36
+ * allow verification task to set just a pact_helper without a URI ([303077d](/../../commit/303077d))
37
+ * split pending and failed rerun commands into separate sections ([f839391](/../../commit/f839391))
38
+ * update output during verification so the pact info shows before the describe blocks of the pact that is being verified ([15ec231](/../../commit/15ec231))
39
+
1
40
  <a name="v1.54.0"></a>
2
41
  ### v1.54.0 (2020-09-12)
3
42
 
@@ -39,9 +39,11 @@ module Pact
39
39
  log_message
40
40
  pacts_for_verification
41
41
  else
42
+ old_selectors = consumer_version_selectors.collect do | selector |
43
+ { name: selector[:tag], all: !selector[:latest], fallback: selector[:fallbackTag]}
44
+ end
42
45
  # Fall back to old method of fetching pacts
43
- consumer_version_tags = consumer_version_selectors.collect{ | selector | selector[:tag] }
44
- FetchPacts.call(provider, consumer_version_tags, broker_base_url, http_client_options)
46
+ FetchPacts.call(provider, old_selectors, broker_base_url, http_client_options)
45
47
  end
46
48
  end
47
49
 
@@ -7,7 +7,6 @@ module Pact
7
7
  if consumer_version_selectors.any?
8
8
  desc = consumer_version_selectors.collect do |selector|
9
9
  all_or_latest = !selector[:latest] ? "all for tag" : "latest for tag"
10
- # TODO support fallback
11
10
  fallback = selector[:fallback] || selector[:fallbackTag]
12
11
  name = fallback ? "#{selector[:tag]} (or #{fallback} if not found)" : selector[:tag]
13
12
  "#{all_or_latest} #{name}"
@@ -2,6 +2,7 @@ require 'pact/shared/dsl'
2
2
  require 'pact/provider/world'
3
3
  require 'pact/pact_broker/fetch_pact_uris_for_verification'
4
4
  require 'pact/errors'
5
+ require 'pact/utils/string'
5
6
 
6
7
  module Pact
7
8
  module Provider
@@ -14,12 +15,13 @@ module Pact
14
15
  # in parent scope, it will clash with these ones,
15
16
  # so put an underscore in front of the name to be safer.
16
17
 
17
- attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_provider_version_tags, :_basic_auth_options, :_enable_pending, :_include_wip_pacts_since, :_verbose
18
+ attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_provider_version_tags, :_basic_auth_options, :_enable_pending, :_include_wip_pacts_since, :_verbose, :_consumer_version_selectors
18
19
 
19
20
  def initialize(provider_name, provider_version_tags)
20
21
  @_provider_name = provider_name
21
22
  @_provider_version_tags = provider_version_tags
22
23
  @_consumer_version_tags = []
24
+ @_consumer_version_selectors = []
23
25
  @_enable_pending = false
24
26
  @_include_wip_pacts_since = nil
25
27
  @_verbose = false
@@ -35,6 +37,10 @@ module Pact
35
37
  self._consumer_version_tags = *consumer_version_tags
36
38
  end
37
39
 
40
+ def consumer_version_selectors consumer_version_selectors
41
+ self._consumer_version_selectors = *consumer_version_selectors
42
+ end
43
+
38
44
  def enable_pending enable_pending
39
45
  self._enable_pending = enable_pending
40
46
  end
@@ -73,12 +79,33 @@ module Pact
73
79
  end
74
80
 
75
81
  def consumer_version_selectors
76
- # TODO support "all"
82
+ convert_tags_to_selectors + convert_consumer_version_selectors
83
+ end
84
+
85
+ def convert_tags_to_selectors
77
86
  _consumer_version_tags.collect do | tag |
78
- {
79
- tag: tag,
80
- latest: true
81
- }
87
+ if tag.is_a?(Hash)
88
+ {
89
+ tag: tag.fetch(:name),
90
+ latest: !tag[:all],
91
+ fallbackTag: tag[:fallback]
92
+ }
93
+ elsif tag.is_a?(String)
94
+ {
95
+ tag: tag,
96
+ latest: true
97
+ }
98
+ else
99
+ raise Pact::Error.new("The value supplied for consumer_version_tags must be a String or a Hash. Found #{tag.class}")
100
+ end
101
+ end
102
+ end
103
+
104
+ def convert_consumer_version_selectors
105
+ _consumer_version_selectors.collect do | selector |
106
+ selector.each_with_object({}) do | (key, value), new_selector |
107
+ new_selector[Pact::Utils::String.camelcase(key.to_s).to_sym] = value
108
+ end
82
109
  end
83
110
  end
84
111
 
@@ -1,6 +1,7 @@
1
1
  require 'pact/consumer_contract/pact_file'
2
2
  require 'pact/hal/http_client'
3
3
  require 'pact/hal/entity'
4
+ require 'pact/consumer_contract'
4
5
 
5
6
  module Pact
6
7
  module Provider
@@ -20,6 +21,14 @@ module Pact
20
21
  @pact_hash ||= JSON.load(pact_json, nil, { max_nesting: 50 })
21
22
  end
22
23
 
24
+ def pending?
25
+ uri.metadata[:pending]
26
+ end
27
+
28
+ def consumer_contract
29
+ @consumer_contract ||= Pact::ConsumerContract.from_json(pact_json)
30
+ end
31
+
23
32
  def hal_entity
24
33
  http_client_keys = [:username, :password, :token]
25
34
  http_client_options = uri.options.reject{ |k, _| !http_client_keys.include?(k) }
@@ -11,6 +11,7 @@ require 'pact/provider/verification_results/publish_all'
11
11
  require 'pact/provider/rspec/pact_broker_formatter'
12
12
  require 'pact/provider/rspec/json_formatter'
13
13
  require 'pact/provider/rspec'
14
+ require 'pact/provider/rspec/calculate_exit_code'
14
15
 
15
16
  module Pact
16
17
  module Provider
@@ -79,6 +80,7 @@ module Pact
79
80
  executing_with_ruby = executing_with_ruby?
80
81
 
81
82
  config.after(:suite) do | suite |
83
+ Pact.provider_world.failed_examples = suite.reporter.failed_examples
82
84
  Pact::Provider::Help::Write.call(Pact.provider_world.pact_sources) if executing_with_ruby
83
85
  end
84
86
  end
@@ -90,7 +92,12 @@ module Pact
90
92
  ::RSpec::Core::CommandLine.new(NoConfigurationOptions.new)
91
93
  .run(::RSpec.configuration.output_stream, ::RSpec.configuration.error_stream)
92
94
  end
93
- pending_mode? ? 0 : exit_code
95
+
96
+ if options[:ignore_failures]
97
+ 0
98
+ else
99
+ Pact::Provider::RSpec::CalculateExitCode.call(pact_sources, Pact.provider_world.failed_examples)
100
+ end
94
101
  end
95
102
 
96
103
  def rspec_runner_options
@@ -147,8 +154,6 @@ module Pact
147
154
  end
148
155
 
149
156
  ::RSpec.configuration.full_backtrace = @options[:full_backtrace]
150
-
151
- ::RSpec.configuration.failure_color = :yellow if pending_mode?
152
157
  end
153
158
 
154
159
  def ordered_pact_json(pact_json)
@@ -159,20 +164,12 @@ module Pact
159
164
  consumer_contract.to_json
160
165
  end
161
166
 
162
- def all_pacts_pending?
163
- pact_urls.all?{ | pact_url| pact_url.metadata[:pending] }
164
- end
165
-
166
167
  def class_exists? name
167
168
  Kernel.const_get name
168
169
  rescue NameError
169
170
  false
170
171
  end
171
172
 
172
- def pending_mode?
173
- (all_pacts_pending? || options[:ignore_failures])
174
- end
175
-
176
173
  def executing_with_ruby?
177
174
  ENV['PACT_EXECUTING_LANGUAGE'] == 'ruby'
178
175
  end
@@ -24,28 +24,36 @@ module Pact
24
24
  def honour_pactfile pact_source, pact_json, options
25
25
  pact_uri = pact_source.uri
26
26
  Pact.configuration.output_stream.puts "INFO: Reading pact at #{pact_uri}"
27
- if pact_uri.metadata[:notices]
28
- pact_uri.metadata[:notices].before_verification_notices_text.each do | text |
29
- Pact.configuration.output_stream.puts("DEBUG: #{text}")
30
- end
31
- end
32
-
33
- Pact.configuration.output_stream.puts "DEBUG: Filtering interactions by: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
34
27
  consumer_contract = Pact::ConsumerContract.from_json(pact_json)
35
28
  suffix = pact_uri.metadata[:pending] ? " [PENDING]": ""
36
- ::RSpec.describe "Verifying a pact between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}#{suffix}", pactfile_uri: pact_uri do
37
- honour_consumer_contract consumer_contract, options.merge(pact_json: pact_json, pact_uri: pact_uri, pact_source: pact_source, consumer_contract: consumer_contract)
29
+ example_group_description = "Verifying a pact between #{consumer_contract.consumer.name} and #{consumer_contract.provider.name}#{suffix}"
30
+ example_group_metadata = { pactfile_uri: pact_uri, pact_criteria: options[:criteria] }
31
+
32
+ ::RSpec.describe example_group_description, example_group_metadata do
33
+ honour_consumer_contract consumer_contract, options.merge(
34
+ pact_json: pact_json,
35
+ pact_uri: pact_uri,
36
+ pact_source: pact_source,
37
+ consumer_contract: consumer_contract,
38
+ criteria: options[:criteria]
39
+ )
38
40
  end
39
41
  end
40
42
 
41
43
  def honour_consumer_contract consumer_contract, options = {}
42
- describe_consumer_contract consumer_contract, options.merge(consumer: consumer_contract.consumer.name)
44
+ describe_consumer_contract consumer_contract, options.merge(consumer: consumer_contract.consumer.name, pact_context: InteractionContext.new)
43
45
  end
44
46
 
45
47
  private
46
48
 
47
49
  def describe_consumer_contract consumer_contract, options
48
- consumer_interactions(consumer_contract, options).each do |interaction|
50
+ consumer_interactions(consumer_contract, options).tap{ |interactions|
51
+ if interactions.empty?
52
+ # If there are no interactions, the documentation formatter never fires to print this out,
53
+ # so print it out here.
54
+ Pact.configuration.output_stream.puts "DEBUG: All interactions for #{options[:pact_uri]} have been filtered out by criteria: #{options[:criteria]}" if options[:criteria] && options[:criteria].any?
55
+ end
56
+ }.each do |interaction|
49
57
  describe_interaction_with_provider_state interaction, options
50
58
  end
51
59
  end
@@ -54,7 +62,7 @@ module Pact
54
62
  if options[:criteria].nil?
55
63
  consumer_contract.interactions
56
64
  else
57
- consumer_contract.find_interactions options[:criteria]
65
+ consumer_contract.find_interactions(options[:criteria])
58
66
  end
59
67
  end
60
68
 
@@ -83,13 +91,14 @@ module Pact
83
91
  pact_interaction_example_description: interaction_description_for_rerun_command(interaction),
84
92
  pact_uri: options[:pact_uri],
85
93
  pact_source: options[:pact_source],
86
- pact_ignore_failures: options[:pact_uri].metadata[:pending] || options[:ignore_failures],
94
+ pact_ignore_failures: options[:pact_source].pending? || options[:ignore_failures],
87
95
  pact_consumer_contract: options[:consumer_contract]
88
96
  }
89
97
 
90
98
  describe description_for(interaction), metadata do
91
99
 
92
100
  interaction_context = InteractionContext.new
101
+ pact_context = options[:pact_context]
93
102
 
94
103
  before do | example |
95
104
  interaction_context.run_once :before do
@@ -0,0 +1,18 @@
1
+ module Pact
2
+ module Provider
3
+ module RSpec
4
+ module CalculateExitCode
5
+ def self.call(pact_sources, failed_examples)
6
+ any_non_pending_failures = pact_sources.any? do |pact_source|
7
+ if pact_source.pending?
8
+ nil
9
+ else
10
+ failed_examples.select { |e| e.metadata[:pact_source] == pact_source }.any?
11
+ end
12
+ end
13
+ any_non_pending_failures ? 1 : 0
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -24,6 +24,26 @@ module Pact
24
24
 
25
25
  C = ::Term::ANSIColor
26
26
 
27
+ def example_group_started(notification)
28
+ # This is the metadata on the top level "Verifying a pact between X and Y" describe block
29
+ if @group_level == 0
30
+ Pact.configuration.output_stream.puts
31
+ pact_uri = notification.group.metadata[:pactfile_uri]
32
+ ::RSpec.configuration.failure_color = pact_uri.metadata[:pending] ? :yellow : :red
33
+
34
+ if pact_uri.metadata[:notices]
35
+ pact_uri.metadata[:notices].before_verification_notices_text.each do | text |
36
+ Pact.configuration.output_stream.puts("DEBUG: #{text}")
37
+ end
38
+ end
39
+
40
+ criteria = notification.group.metadata[:pact_criteria]
41
+ Pact.configuration.output_stream.puts "DEBUG: Filtering interactions by: #{criteria}" if criteria && criteria.any?
42
+ end
43
+ super
44
+ end
45
+
46
+
27
47
  def dump_summary(summary)
28
48
  output.puts "\n" + colorized_totals_line(summary)
29
49
  return if summary.failure_count == 0
@@ -35,28 +55,26 @@ module Pact
35
55
  private
36
56
 
37
57
  def interactions_count(summary)
38
- summary.examples.collect{ |e| e.metadata[:pact_interaction_example_description] }.uniq.size
58
+ summary.examples.collect{ |e| interaction_unique_key(e) }.uniq.size
39
59
  end
40
60
 
41
61
  def failed_interactions_count(summary)
42
- summary.failed_examples.collect{ |e| e.metadata[:pact_interaction_example_description] }.uniq.size
62
+ failed_interaction_examples(summary).size
43
63
  end
44
64
 
45
- def ignore_failures?(summary)
46
- summary.failed_examples.any?{ |e| e.metadata[:pact_ignore_failures] }
65
+ def pending_interactions_count(summary)
66
+ pending_interaction_examples(summary).size
47
67
  end
48
68
 
49
69
  def failure_title summary
50
- if ignore_failures?(summary)
51
- "#{failed_interactions_count(summary)} pending"
52
- else
53
- ::RSpec::Core::Formatters::Helpers.pluralize(failed_interactions_count(summary), "failure")
54
- end
70
+ ::RSpec::Core::Formatters::Helpers.pluralize(failed_interactions_count(summary), "failure")
55
71
  end
56
72
 
57
73
  def totals_line summary
58
74
  line = ::RSpec::Core::Formatters::Helpers.pluralize(interactions_count(summary), "interaction")
59
75
  line << ", " << failure_title(summary)
76
+ pending_count = pending_interactions_count(summary)
77
+ line << ", " << "#{pending_count} pending" if pending_count > 0
60
78
  line
61
79
  end
62
80
 
@@ -69,13 +87,20 @@ module Pact
69
87
  end
70
88
 
71
89
  def print_rerun_commands summary
72
- if ignore_failures?(summary)
90
+ if pending_interactions_count(summary) > 0
91
+ set_rspec_failure_color(:yellow)
73
92
  output.puts("\nPending interactions: (Failures listed here are expected and do not affect your suite's status)\n\n")
74
- else
75
- output.puts("\nFailed interactions:\n\n")
93
+ interaction_rerun_commands(pending_interaction_examples(summary)).each do | message |
94
+ output.puts(message)
95
+ end
96
+ set_rspec_failure_color(:red)
76
97
  end
77
- interaction_rerun_commands(summary).each do | message |
78
- output.puts(message)
98
+
99
+ if failed_interactions_count(summary) > 0
100
+ output.puts("\nFailed interactions:\n\n")
101
+ interaction_rerun_commands(failed_interaction_examples(summary)).each do | message |
102
+ output.puts(message)
103
+ end
79
104
  end
80
105
  end
81
106
 
@@ -85,10 +110,34 @@ module Pact
85
110
  end
86
111
  end
87
112
 
88
- def interaction_rerun_commands summary
89
- summary.failed_examples.collect do |example|
113
+ def pending_interaction_examples(summary)
114
+ one_failed_example_per_interaction(summary).select do | example |
115
+ example.metadata[:pactfile_uri].metadata[:pending]
116
+ end
117
+ end
118
+
119
+ def failed_interaction_examples(summary)
120
+ one_failed_example_per_interaction(summary).select do | example |
121
+ !example.metadata[:pactfile_uri].metadata[:pending]
122
+ end
123
+ end
124
+
125
+ def one_failed_example_per_interaction(summary)
126
+ summary.failed_examples.group_by{| e| interaction_unique_key(e)}.values.collect(&:first)
127
+ end
128
+
129
+ def interaction_rerun_commands examples
130
+ examples.collect do |example|
90
131
  interaction_rerun_command_for example
91
- end.uniq.compact
132
+ end.compact.uniq
133
+ end
134
+
135
+ def interaction_unique_key(example)
136
+ # pending is just to make the counting easier, it isn't required for the unique key
137
+ {
138
+ pactfile_uri: example.metadata[:pactfile_uri],
139
+ index: example.metadata[:pact_interaction].index,
140
+ }
92
141
  end
93
142
 
94
143
  def interaction_rerun_command_for example
@@ -137,6 +186,10 @@ module Pact
137
186
  def executing_with_ruby?
138
187
  ENV['PACT_EXECUTING_LANGUAGE'] == 'ruby'
139
188
  end
189
+
190
+ def set_rspec_failure_color color
191
+ ::RSpec.configuration.failure_color = color
192
+ end
140
193
  end
141
194
  end
142
195
  end
@@ -28,7 +28,23 @@ module Pact
28
28
  end
29
29
 
30
30
  def publishable?
31
- executed_interactions_count == all_interactions_count && all_interactions_count > 0
31
+ if defined?(@publishable)
32
+ @publishable
33
+ else
34
+ @publishable = pact_source.consumer_contract.interactions.all? do | interaction |
35
+ examples_for_pact_uri.any?{ |e| example_is_for_interaction?(e, interaction) }
36
+ end && examples_for_pact_uri.count > 0
37
+ end
38
+ end
39
+
40
+ def example_is_for_interaction?(example, interaction)
41
+ # Use the Pact Broker id if supported
42
+ if interaction._id
43
+ example[:pact_interaction]._id == interaction._id
44
+ else
45
+ # fall back to object equality (based on the field values of the interaction)
46
+ example[:pact_interaction] == interaction
47
+ end
32
48
  end
33
49
 
34
50
  def examples_for_pact_uri
@@ -39,18 +55,6 @@ module Pact
39
55
  examples_for_pact_uri.count{ |e| e[:status] != 'passed' }
40
56
  end
41
57
 
42
- def executed_interactions_count
43
- examples_for_pact_uri
44
- .collect { |e| e[:pact_interaction].object_id }
45
- .uniq
46
- .count
47
- end
48
-
49
- def all_interactions_count
50
- interactions = (pact_source.pact_hash['interactions'] || pact_source.pact_hash['messages'])
51
- interactions ? interactions.count : 0
52
- end
53
-
54
58
  def test_results_hash_for_pact_uri
55
59
  {
56
60
  tests: examples_for_pact_uri.collect{ |e| clean_example(e) },
@@ -81,7 +81,7 @@ module Pact
81
81
  Pact.configuration.output_stream.puts "INFO: Tagging version #{provider_application_version} of #{provider_name} as #{tag.inspect}"
82
82
  tag_entity = tag_link.expand(version: provider_application_version, tag: tag).put
83
83
  unless tag_entity.success?
84
- raise PublicationError.new("Error returned from tagging request #{tag_entity.response.code} #{tag_entity.response.body}")
84
+ raise PublicationError.new("Error returned from tagging request: status=#{tag_entity.response.code} body=#{tag_entity.response.body}")
85
85
  end
86
86
  end
87
87
  end
@@ -14,7 +14,7 @@ module Pact
14
14
  module Provider
15
15
  class World
16
16
 
17
- attr_accessor :pact_sources
17
+ attr_accessor :pact_sources, :failed_examples
18
18
 
19
19
  def provider_states
20
20
  @provider_states_proxy ||= Pact::Provider::State::ProviderStateProxy.new
@@ -31,6 +31,7 @@ module Pact
31
31
  attr_reader :pact_spec_configs
32
32
  attr_accessor :rspec_opts
33
33
  attr_accessor :ignore_failures
34
+ attr_accessor :_pact_helper
34
35
 
35
36
  def initialize(name)
36
37
  @rspec_opts = nil
@@ -41,6 +42,10 @@ module Pact
41
42
  rake_task
42
43
  end
43
44
 
45
+ def pact_helper(pact_helper)
46
+ @pact_spec_configs << { pact_helper: pact_helper }
47
+ end
48
+
44
49
  def uri(uri, options = {})
45
50
  @pact_spec_configs << {uri: uri, pact_helper: options[:pact_helper]}
46
51
  end
@@ -82,6 +87,7 @@ module Pact
82
87
  Pact::TaskHelper.handle_verification_failure do
83
88
  exit_statuses.count{ | status | status != 0 }
84
89
  end
90
+
85
91
  end
86
92
  end
87
93
  end
@@ -0,0 +1,35 @@
1
+ # Can't use refinements because of Travelling Ruby
2
+
3
+ module Pact
4
+ module Utils
5
+ module String
6
+
7
+ extend self
8
+
9
+ # ripped from rubyworks/facets, thank you
10
+ def camelcase(string, *separators)
11
+ case separators.first
12
+ when Symbol, TrueClass, FalseClass, NilClass
13
+ first_letter = separators.shift
14
+ end
15
+
16
+ separators = ['_', '\s'] if separators.empty?
17
+
18
+ str = string.dup
19
+
20
+ separators.each do |s|
21
+ str = str.gsub(/(?:#{s}+)([a-z])/){ $1.upcase }
22
+ end
23
+
24
+ case first_letter
25
+ when :upper, true
26
+ str = str.gsub(/(\A|\s)([a-z])/){ $1 + $2.upcase }
27
+ when :lower, false
28
+ str = str.gsub(/(\A|\s)([A-Z])/){ $1 + $2.downcase }
29
+ end
30
+
31
+ str
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,4 +1,4 @@
1
1
  # Remember to bump pact-provider-proxy when this changes major version
2
2
  module Pact
3
- VERSION = "1.54.0"
3
+ VERSION = "1.55.4"
4
4
  end
@@ -32,7 +32,7 @@ Gem::Specification.new do |gem|
32
32
  gem.add_runtime_dependency 'webrick', '~> 1.3'
33
33
  gem.add_runtime_dependency 'term-ansicolor', '~> 1.0'
34
34
 
35
- gem.add_runtime_dependency 'pact-support', '~> 1.9'
35
+ gem.add_runtime_dependency 'pact-support', '~> 1.15'
36
36
  gem.add_runtime_dependency 'pact-mock_service', '~> 3.0', '>= 3.3.1'
37
37
 
38
38
  gem.add_development_dependency 'rake', '~> 13.0'
@@ -43,6 +43,6 @@ Gem::Specification.new do |gem|
43
43
  gem.add_development_dependency 'faraday', '~> 0.13'
44
44
  gem.add_development_dependency 'conventional-changelog', '~> 1.3'
45
45
  gem.add_development_dependency 'bump', '~> 0.5'
46
- gem.add_development_dependency 'pact-message', '~> 0.6'
46
+ gem.add_development_dependency 'pact-message', '~> 0.8'
47
47
  gem.add_development_dependency 'rspec-its', '~> 1.3'
48
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.54.0
4
+ version: 1.55.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Fraser
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2020-09-12 00:00:00.000000000 Z
15
+ date: 2020-10-09 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rspec
@@ -102,14 +102,14 @@ dependencies:
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: '1.9'
105
+ version: '1.15'
106
106
  type: :runtime
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: '1.9'
112
+ version: '1.15'
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: pact-mock_service
115
115
  requirement: !ruby/object:Gem::Requirement
@@ -248,14 +248,14 @@ dependencies:
248
248
  requirements:
249
249
  - - "~>"
250
250
  - !ruby/object:Gem::Version
251
- version: '0.6'
251
+ version: '0.8'
252
252
  type: :development
253
253
  prerelease: false
254
254
  version_requirements: !ruby/object:Gem::Requirement
255
255
  requirements:
256
256
  - - "~>"
257
257
  - !ruby/object:Gem::Version
258
- version: '0.6'
258
+ version: '0.8'
259
259
  - !ruby/object:Gem::Dependency
260
260
  name: rspec-its
261
261
  requirement: !ruby/object:Gem::Requirement
@@ -352,6 +352,7 @@ files:
352
352
  - lib/pact/provider/request.rb
353
353
  - lib/pact/provider/rspec.rb
354
354
  - lib/pact/provider/rspec/backtrace_formatter.rb
355
+ - lib/pact/provider/rspec/calculate_exit_code.rb
355
356
  - lib/pact/provider/rspec/custom_options_file
356
357
  - lib/pact/provider/rspec/formatter_rspec_2.rb
357
358
  - lib/pact/provider/rspec/formatter_rspec_3.rb
@@ -377,6 +378,7 @@ files:
377
378
  - lib/pact/tasks/verification_task.rb
378
379
  - lib/pact/templates/help.erb
379
380
  - lib/pact/templates/provider_state.erb
381
+ - lib/pact/utils/string.rb
380
382
  - lib/pact/version.rb
381
383
  - lib/tasks/pact.rake
382
384
  - pact.gemspec