pact-support 1.20.0 → 1.21.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa78275d3a1427e18c502011cbda176ace86f52481454ae560a364e3dc32b94a
4
- data.tar.gz: 0d7b5b2ec8336e32c2b4d5b87940dab547497666e6e50b07e3924165a660ad2f
3
+ metadata.gz: 1a1d8408789e443f4f23362177536a1277752c6aa454d5efddf506577bd2f722
4
+ data.tar.gz: b7efcdbb52294fc754c8d73bb21c556eb120fa3ea32ca23c4deb8c13252b4b5b
5
5
  SHA512:
6
- metadata.gz: 00ca57b4165b257361813bbf850a2fe066e75126bf9a3726563acdf17c04ac3555187359b1fd5e887eeb1f7d7a569607370c51bf16239e7c63f0e60305c70756
7
- data.tar.gz: 70d6322bfd0c0eacf6230416677586032164686deee79f4c3d50a9101306423e09d79d6d1e48ac07528f0fc342b6c02d2ea3ed866a04acfe7d299cd7669bc6bc
6
+ metadata.gz: cadfe471bebe7b2fdd4c8235e3d81a2f43662b8cb796d621cb8ca5392264d2d4733dd32d59203610a0413241434ae9201f97e70837386515aa24bf5b9092650b
7
+ data.tar.gz: 33d1dd99bf19f44b2fe63b218f88d13a6075fe31c39d83957fbcb36bbf07706f4bea40dca41fd2b0a8d1fc7e330b2686dedeac6eba4233a2ea25ba7070ef179a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,88 @@
1
+ <a name="v1.21.7"></a>
2
+ ### v1.21.7 (2026-07-21)
3
+
4
+ <a name="v1.21.6"></a>
5
+ ### v1.21.6 (2026-02-09)
6
+
7
+ #### Bug Fixes
8
+
9
+ * **deps**
10
+ * update fakefs for irb addition ([4ae866c](/../../commit/4ae866c))
11
+
12
+ * add jsonpath gem for generator code ([d66170e](/../../commit/d66170e))
13
+ * add jsonpath dependency ([81fa4e7](/../../commit/81fa4e7))
14
+
15
+ <a name="v1.21.5"></a>
16
+ ### v1.21.5 (2026-01-09)
17
+
18
+ #### Bug Fixes
19
+
20
+ * **deps**
21
+ * explictly add logger & irb/fiddle - dev for fake fs for ruby 4.0.0 support ([b5d906e](/../../commit/b5d906e))
22
+
23
+ <a name="v1.21.4"></a>
24
+ ### v1.21.4 (2025-10-03)
25
+
26
+ #### Bug Fixes
27
+
28
+ * **deps**
29
+ * Replace awesome_print with amazing_print #122 (#123) ([e894445](/../../commit/e894445))
30
+
31
+ * **spec**
32
+ * workaround for diff formatted errors in ruby 3.4 ([5627237](/../../commit/5627237))
33
+
34
+ * json load diff regression downstream ([1ed2ce7](/../../commit/1ed2ce7))
35
+
36
+ <a name="v1.21.3"></a>
37
+ ### v1.21.3 (2025-06-26)
38
+
39
+ #### Bug Fixes
40
+
41
+ * use the safe json load to fix deprecation warnings. ([5d12ac6](/../../commit/5d12ac6))
42
+
43
+ <a name="v1.21.2"></a>
44
+ ### v1.21.2 (2024-12-04)
45
+
46
+ #### Bug Fixes
47
+
48
+ * prevent insertion of extra new lines in JSON ([50189f2](/../../commit/50189f2))
49
+
50
+ <a name="v1.21.1"></a>
51
+ ### v1.21.1 (2024-11-29)
52
+
53
+ #### Bug Fixes
54
+
55
+ * add blank lines to empty hashs - json 2.8.x regression for pact-ruby ([f8cb384](/../../commit/f8cb384))
56
+
57
+ <a name="v1.21.0"></a>
58
+ ### v1.21.0 (2024-11-28)
59
+
60
+ #### Features
61
+
62
+ * add like_integer / like_decimal helpers ([75a36cd](/../../commit/75a36cd))
63
+ * add v3/v4 generators (thanks @slt) ([fe04975](/../../commit/fe04975))
64
+
65
+ #### Bug Fixes
66
+
67
+ * add blank lines to empty hashs - json 2.8.x regression ([66910bd](/../../commit/66910bd))
68
+
69
+ <a name="v1.20.2"></a>
70
+ ### v1.20.2 (2024-10-23)
71
+
72
+ #### Bug Fixes
73
+
74
+ * **test**
75
+ * explicitly require ostruct as non stdlib in ruby 3.5.x ([e06a057](/../../commit/e06a057))
76
+
77
+ * use single quotes for pact term creation err msg ([d770791](/../../commit/d770791))
78
+
79
+ <a name="v1.20.1"></a>
80
+ ### v1.20.1 (2024-08-08)
81
+
82
+ #### Bug Fixes
83
+
84
+ * enable color on non-tty if color_enabled ([0585424](/../../commit/0585424))
85
+
1
86
  <a name="v1.20.0"></a>
2
87
  ### v1.20.0 (2023-10-19)
3
88
 
data/README.md CHANGED
@@ -1,5 +1,74 @@
1
1
  # Pact Support
2
-
2
+ [![Gem Version](https://badge.fury.io/rb/pact-support.svg)](http://badge.fury.io/rb/pact-support)
3
3
  ![Build status](https://github.com/pact-foundation/pact-support/workflows/Test/badge.svg)
4
+ [![Join the chat at https://pact-foundation.slack.com/](https://img.shields.io/badge/chat-on%20slack-blue.svg?logo=slack)](https://slack.pact.io)
4
5
 
5
6
  Provides shared code for the Pact gems
7
+
8
+ __Note:__ If you are using Pact-Ruby v2.x, you no longer need `pact-support`
9
+
10
+ ## Compatibility
11
+
12
+ <details><summary>Specification Compatibility</summary>
13
+
14
+ | Version | Stable | [Spec] Compatibility |
15
+ | ------- | ------ | -------------------- |
16
+ | 1.x.x | Yes | 2, 3\* |
17
+
18
+ _\*_ v3 support is limited to the subset of functionality required to enable language inter-operable [Message support].
19
+
20
+ - See V3 tracking [issue](https://github.com/pact-foundation/pact-ruby/issues/318).
21
+ - See V4 tracking [issue](https://github.com/pact-foundation/pact-ruby/issues/319).
22
+
23
+ Want V3/V4 support now? See the new standalone [pact-verifier](https://github.com/pact-foundation/pact-reference/tree/master/rust/pact_verifier_cli#standalone-pact-verifier)
24
+
25
+ [message support]: https://github.com/pact-foundation/pact-specification/tree/version-3#introduces-messages-for-services-that-communicate-via-event-streams-and-message-queues
26
+
27
+ </details>
28
+
29
+ ### Supported matching rules
30
+
31
+ | matcher | Spec Version | Implemented | Usage|
32
+ |---------------|--------------|-------------|-------------|
33
+ | Equality | V1 | | |
34
+ | Regex | V2 | ✅ | `Pact.term(generate, matcher)` |
35
+ | Type | V2 | ✅ | `Pact.like(generate)` |
36
+ | MinType | V2 | ✅ | `Pact.each_like(generate, min: <val>)` |
37
+ | MaxType | V2 | | |
38
+ | MinMaxType | V2 | | |
39
+ | Include | V3 | | |
40
+ | Integer | V3 | | |
41
+ | Decimal | V3 | | |
42
+ | Number | V3 | | |
43
+ | Timestamp | V3 | | |
44
+ | Time | V3 | | |
45
+ | Date | V3 | | |
46
+ | Null | V3 | | |
47
+ | Boolean | V3 | | |
48
+ | ContentType | V3 | | |
49
+ | Values | V3 | | |
50
+ | ArrayContains | V4 | | |
51
+ | StatusCode | V4 | | |
52
+ | NotEmpty | V4 | | |
53
+ | Semver | V4 | | |
54
+ | EachKey | V4 | | |
55
+ | EachValue | V4 | | |
56
+
57
+ ### Supported generators
58
+
59
+ Currently limited to provider verification only. No current way to set in consumer tests.
60
+
61
+ | Generator | Spec Version | Implemented |
62
+ |------------------------|--------------|----|
63
+ | RandomInt | V3 | ✅ |
64
+ | RandomDecimal | V3 | ✅ |
65
+ | RandomHexadecimal | V3 | ✅ |
66
+ | RandomString | V3 | ✅ |
67
+ | Regex | V3 | ✅ |
68
+ | Uuid | V3/V4 | ✅ |
69
+ | Date | V3 | ✅ |
70
+ | Time | V3 | ✅ |
71
+ | DateTime | V3 | ✅ |
72
+ | RandomBoolean | V3 | ✅ |
73
+ | ProviderState | V4 | ✅ |
74
+ | MockServerURL | V4 | 🚧 |
@@ -6,6 +6,7 @@ require 'pact/shared/json_differ'
6
6
  require 'pact/shared/text_differ'
7
7
  require 'pact/shared/form_differ'
8
8
  require 'pact/shared/multipart_form_differ'
9
+ require 'rainbow'
9
10
 
10
11
 
11
12
  module Pact
@@ -114,7 +115,9 @@ module Pact
114
115
 
115
116
  def color_enabled
116
117
  # Can't use ||= when the variable might be false, it will execute the expression if it's false
117
- defined?(@color_enabled) ? @color_enabled : true
118
+ color_enabled = defined?(@color_enabled) ? @color_enabled : true
119
+ Rainbow.enabled = true if color_enabled
120
+ color_enabled
118
121
  end
119
122
 
120
123
  def color_enabled= color_enabled
@@ -48,7 +48,7 @@ module Pact
48
48
  end
49
49
 
50
50
  def self.from_json string
51
- deserialised_object = JSON.load(maintain_backwards_compatiblity_with_producer_keys(string))
51
+ deserialised_object = JSON.unsafe_load(maintain_backwards_compatiblity_with_producer_keys(string))
52
52
  from_hash(deserialised_object)
53
53
  end
54
54
 
@@ -0,0 +1,62 @@
1
+ require 'date'
2
+
3
+ module Pact
4
+ module Generator
5
+ # Date provides the time generator which will give the current date in the defined format
6
+ class Date
7
+ def can_generate?(hash)
8
+ hash.key?('type') && hash['type'] == type
9
+ end
10
+
11
+ def call(hash, _params = nil, _example_value = nil)
12
+ format = hash['format'] || default_format
13
+ ::Time.now.strftime(convert_from_java_simple_date_format(format))
14
+ end
15
+
16
+ def type
17
+ 'Date'
18
+ end
19
+
20
+ def default_format
21
+ 'yyyy-MM-dd'
22
+ end
23
+
24
+ # Format for the pact specficiation should be the Java DateTimeFormmater
25
+ # This tries to convert to something Ruby can format.
26
+ def convert_from_java_simple_date_format(format)
27
+ # Year
28
+ format.sub!(/(?<!%)y{4,}/, '%Y')
29
+ format.sub!(/(?<!%)y{1,}/, '%y')
30
+
31
+ # Month
32
+ format.sub!(/(?<!%)M{4,}/, '%B')
33
+ format.sub!(/(?<!%)M{3}/, '%b')
34
+ format.sub!(/(?<!%)M{1,2}/, '%m')
35
+
36
+ # Week
37
+ format.sub!(/(?<!%)M{1,}/, '%W')
38
+
39
+ # Day
40
+ format.sub!(/(?<!%)D{1,}/, '%j')
41
+ format.sub!(/(?<!%)d{1,}/, '%d')
42
+ format.sub!(/(?<!%)E{4,}/, '%A')
43
+ format.sub!(/(?<!%)D{1,}/, '%a')
44
+ format.sub!(/(?<!%)u{1,}/, '%u')
45
+
46
+ # Time
47
+ format.sub!(/(?<!%)a{1,}/, '%p')
48
+ format.sub!(/(?<!%)k{1,}/, '%H')
49
+ format.sub!(/(?<!%)n{1,}/, '%M')
50
+ format.sub!(/(?<!%)s{1,}/, '%S')
51
+ format.sub!(/(?<!%)S{1,}/, '%L')
52
+
53
+ # Timezone
54
+ format.sub!(/(?<!%)z{1,}/, '%z')
55
+ format.sub!(/(?<!%)Z{1,}/, '%z')
56
+ format.sub!(/(?<!%)X{1,}/, '%Z')
57
+
58
+ format
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,16 @@
1
+ require 'date'
2
+
3
+ module Pact
4
+ module Generator
5
+ # DateTime provides the time generator which will give the current date time in the defined format
6
+ class DateTime < Date
7
+ def type
8
+ 'DateTime'
9
+ end
10
+
11
+ def default_format
12
+ 'yyyy-MM-dd HH:mm'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,53 @@
1
+ require 'pact/logging'
2
+
3
+ module Pact
4
+ module Generator
5
+ # ProviderState provides the provider state generator which will inject
6
+ # values provided by the provider state setup url.
7
+ class ProviderState
8
+ include Pact::Logging
9
+
10
+ # rewrite of https://github.com/DiUS/pact-jvm/blob/master/core/support/src/main/kotlin/au/com/dius/pact/core/support/expressions/ExpressionParser.kt#L27
11
+ VALUES_SEPARATOR = ','
12
+ START_EXPRESSION = "\${"
13
+ END_EXPRESSION = '}'
14
+
15
+ def can_generate?(hash)
16
+ hash.key?('type') && hash['type'] == 'ProviderState'
17
+ end
18
+
19
+ def call(hash, params = nil, _example_value = nil)
20
+ params ||= {}
21
+ parse_expression hash['expression'], params
22
+ end
23
+
24
+ def parse_expression(expression, params)
25
+ return_string = []
26
+ buffer = expression
27
+ # initial value
28
+ position = buffer.index(START_EXPRESSION)
29
+
30
+ while position && position >= 0
31
+ if position.positive?
32
+ # add string
33
+ return_string.push(buffer[0...position])
34
+ end
35
+ end_position = buffer.index(END_EXPRESSION, position)
36
+ raise 'Missing closing brace in expression string' if !end_position || end_position.negative?
37
+
38
+ variable = buffer[position + 2...end_position]
39
+
40
+ logger.info "Could not subsitute provider state key #{variable}, have #{params}" unless params[variable]
41
+
42
+ expression = params[variable] || ''
43
+ return_string.push(expression)
44
+
45
+ buffer = buffer[end_position + 1...-1]
46
+ position = buffer.index(START_EXPRESSION)
47
+ end
48
+
49
+ return_string.join('')
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,14 @@
1
+ module Pact
2
+ module Generator
3
+ # Boolean provides the boolean generator which will give a true or false value
4
+ class RandomBoolean
5
+ def can_generate?(hash)
6
+ hash.key?('type') && hash['type'] == 'RandomBoolean'
7
+ end
8
+
9
+ def call(_hash, _params = nil, _example_value = nil)
10
+ [true, false].sample
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ require 'bigdecimal'
2
+
3
+ module Pact
4
+ module Generator
5
+ # RandomDecimal provides the random decimal generator which will generate a decimal value of digits length
6
+ class RandomDecimal
7
+ def can_generate?(hash)
8
+ hash.key?('type') && hash['type'] == 'RandomDecimal'
9
+ end
10
+
11
+ def call(hash, _params = nil, _example_value = nil)
12
+ digits = hash['digits'] || 6
13
+
14
+ raise 'RandomDecimalGenerator digits must be > 0, got $digits' if digits < 1
15
+
16
+ return rand(0..9) if digits == 1
17
+
18
+ return rand(0..9) + rand(1..9) / 10 if digits == 2
19
+
20
+ pos = rand(1..digits - 1)
21
+ precision = digits - pos
22
+ integers = ''
23
+ decimals = ''
24
+ while pos.positive?
25
+ integers += String(rand(1..9))
26
+ pos -= 1
27
+ end
28
+ while precision.positive?
29
+ decimals += String(rand(1..9))
30
+ precision -= 1
31
+ end
32
+
33
+ Float("#{integers}.#{decimals}")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ require 'securerandom'
2
+
3
+ module Pact
4
+ module Generator
5
+ # RandomHexadecimal provides the random hexadecimal generator which will generate a hexadecimal
6
+ class RandomHexadecimal
7
+ def can_generate?(hash)
8
+ hash.key?('type') && hash['type'] == 'RandomHexadecimal'
9
+ end
10
+
11
+ def call(hash, _params = nil, _example_value = nil)
12
+ digits = hash['digits'] || 8
13
+ bytes = (digits / 2).ceil
14
+ string = SecureRandom.hex(bytes)
15
+ string[0, digits]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ module Pact
2
+ module Generator
3
+ # RandomInt provides the random int generator which generate a random integer, with a min/max
4
+ class RandomInt
5
+ def can_generate?(hash)
6
+ hash.key?('type') && hash['type'] == 'RandomInt'
7
+ end
8
+
9
+ def call(hash, _params = nil, _example_value = nil)
10
+ min = hash['min'] || 0
11
+ max = hash['max'] || 2_147_483_647
12
+ rand(min..max)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Pact
2
+ module Generator
3
+ # RandomString provides the random string generator which generate a random string of size length
4
+ class RandomString
5
+ def can_generate?(hash)
6
+ hash.key?('type') && hash['type'] == 'RandomString'
7
+ end
8
+
9
+ def call(hash, _params = nil, _example_value = nil)
10
+ size = hash['size'] || 20
11
+ string = rand(36**(size + 2)).to_s(36)
12
+ string[0, size]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require 'string_pattern'
2
+
3
+ module Pact
4
+ module Generator
5
+ # Regex provides the regex generator which will generate a value based on the regex pattern provided
6
+ class Regex
7
+ def can_generate?(hash)
8
+ hash.key?('type') && hash['type'] == 'Regex'
9
+ end
10
+
11
+ def call(hash, _params = nil, _example_value = nil)
12
+ pattern = hash['pattern'] || ''
13
+ StringPattern.generate(Regexp.new(pattern))
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ require 'date'
2
+
3
+ module Pact
4
+ module Generator
5
+ # Time provides the time generator which will give the current time in the defined format
6
+ class Time < Date
7
+ def type
8
+ 'Time'
9
+ end
10
+
11
+ def default_format
12
+ 'HH:mm'
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require 'securerandom'
2
+
3
+ module Pact
4
+ module Generator
5
+ # Uuid provides the uuid generator
6
+ class Uuid
7
+ def can_generate?(hash)
8
+ hash.key?('type') && hash['type'] == 'Uuid'
9
+ end
10
+
11
+ # If we had the example value, we could determine what type of uuid
12
+ # to send, this is what pact-jvm does
13
+ # See https://github.com/pact-foundation/pact-jvm/blob/master/core/model/src/main/kotlin/au/com/dius/pact/core/model/generators/Generator.kt
14
+ def call(_hash, _params = nil, _example_value = nil)
15
+ SecureRandom.uuid
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,63 @@
1
+ require 'pact/generator/random_boolean'
2
+ require 'pact/generator/date'
3
+ require 'pact/generator/datetime'
4
+ require 'pact/generator/provider_state'
5
+ require 'pact/generator/random_decimal'
6
+ require 'pact/generator/random_hexadecimal'
7
+ require 'pact/generator/random_int'
8
+ require 'pact/generator/random_string'
9
+ require 'pact/generator/regex'
10
+ require 'pact/generator/time'
11
+ require 'pact/generator/uuid'
12
+ require 'jsonpath'
13
+ require 'pact/matching_rules/v3/extract'
14
+
15
+ module Pact
16
+ class Generators
17
+ def self.add_generator(generator)
18
+ generators.unshift(generator)
19
+ end
20
+
21
+ def self.generators
22
+ @generators ||= []
23
+ end
24
+
25
+ def self.execute_generators(object, state_params = nil, example_value = nil)
26
+ generators.each do |parser|
27
+ return parser.call(object, state_params, example_value) if parser.can_generate?(object)
28
+ end
29
+
30
+ raise Pact::UnrecognizePactFormatError, "This document does not use a recognised Pact generator: #{object}"
31
+ end
32
+
33
+ def self.apply_generators(expected_request, component, example_value, state_params)
34
+ # Latest pact-support is required to have generators exposed
35
+ if expected_request.methods.include?(:generators) && expected_request.generators[component]
36
+ # Some component will have single generator without selectors, i.e. path
37
+ generators = expected_request.generators[component]
38
+ if generators.is_a?(Hash) && generators.key?('type')
39
+ return execute_generators(generators, state_params, example_value)
40
+ end
41
+
42
+ generators.each do |selector, generator|
43
+ val = JsonPath.new(selector).on(example_value)
44
+ replace = execute_generators(generator, state_params, val)
45
+ example_value = JsonPath.for(example_value).gsub(selector) { |_v| replace }.to_hash
46
+ end
47
+ end
48
+ example_value
49
+ end
50
+
51
+ add_generator(Generator::RandomBoolean.new)
52
+ add_generator(Generator::Date.new)
53
+ add_generator(Generator::DateTime.new)
54
+ add_generator(Generator::ProviderState.new)
55
+ add_generator(Generator::RandomDecimal.new)
56
+ add_generator(Generator::RandomHexadecimal.new)
57
+ add_generator(Generator::RandomInt.new)
58
+ add_generator(Generator::RandomString.new)
59
+ add_generator(Generator::Regex.new)
60
+ add_generator(Generator::Time.new)
61
+ add_generator(Generator::Uuid.new)
62
+ end
63
+ end
data/lib/pact/helpers.rb CHANGED
@@ -47,6 +47,16 @@ module Pact
47
47
  Pact::Term.new(generate: date, matcher: /^\d{4}-[01]\d-[0-3]\d$/)
48
48
  end
49
49
 
50
+ # regex matched with pact-jvm
51
+ # https://github.com/pact-foundation/pact-jvm/blob/00442e6df51e5be906ed470b19859246312e5c83/core/matchers/src/main/kotlin/au/com/dius/pact/core/matchers/MatcherExecutor.kt#L56-L59
52
+ def like_integer int
53
+ Pact::Term.new(generate: int, matcher: /^-?\d+$/)
54
+ end
55
+
56
+ def like_decimal float
57
+ Pact::Term.new(generate: float, matcher: /^0|-?\d+\.\d*$/)
58
+ end
59
+
50
60
  def like_datetime_rfc822 datetime
51
61
  Pact::Term.new(
52
62
  generate: datetime,
@@ -1,4 +1,4 @@
1
- require 'awesome_print' # The .ai method comes from awesome_print
1
+ require 'amazing_print' # The .ai method comes from awesome_print
2
2
 
3
3
  module Pact
4
4
  module Matchers
@@ -100,4 +100,4 @@ module Pact
100
100
 
101
101
  end
102
102
  end
103
- end
103
+ end
@@ -61,6 +61,12 @@ module Pact
61
61
  alias_method :structure_diff, :type_diff # Backwards compatibility
62
62
 
63
63
  def term_diff term, actual, options
64
+ if actual.is_a?(Float) || actual.is_a?(Integer)
65
+ options[:original] = actual
66
+ options[:was_float] = actual.is_a?(Float)
67
+ options[:was_int] = actual.is_a?(Integer)
68
+ actual = actual.to_s
69
+ end
64
70
  if actual.is_a?(String)
65
71
  actual_term_diff term, actual, options
66
72
  else
@@ -72,7 +78,7 @@ module Pact
72
78
  if term.matcher.match(actual)
73
79
  NO_DIFF
74
80
  else
75
- RegexpDifference.new term.matcher, actual, "Expected a String matching #{term.matcher.inspect} (like #{term.generate.inspect}) but got #{actual.inspect} at <path>"
81
+ RegexpDifference.new term.matcher, options[:original] ||= actual, "Expected a Value matching #{term.matcher.inspect} (like #{term.generate.inspect}) but got #{options[:was_float] || options[:was_int] ? class_name_with_value_in_brackets(options[:original]) : actual.inspect} at <path>"
76
82
  end
77
83
  end
78
84
 
@@ -62,6 +62,8 @@ module Pact
62
62
  begin
63
63
  # Can't think of an elegant way to check if we can pretty generate other than to try it and maybe fail
64
64
  json = fix_blank_lines_in_empty_hashes JSON.pretty_generate(comparable)
65
+ json = add_blank_lines_in_empty_hashes json
66
+ json = add_blank_lines_in_empty_arrays json
65
67
  add_comma_to_end_of_arrays json
66
68
  rescue JSON::GeneratorError
67
69
  comparable.to_s
@@ -42,10 +42,11 @@ module Pact
42
42
  # Oh ActiveSupport, why....
43
43
  def fix_json_formatting json
44
44
  if json =~ /\{".*?":"/
45
- JSON.pretty_generate(JSON.parse(json, create_additions: false))
45
+ json = JSON.pretty_generate(JSON.parse(json, create_additions: false))
46
46
  else
47
47
  json
48
48
  end
49
+ fix_empty_hash_and_array json
49
50
  end
50
51
 
51
52
  def remove_unicode json
@@ -61,5 +62,13 @@ module Pact
61
62
  end
62
63
  end
63
64
  end
65
+
66
+ private
67
+
68
+ def fix_empty_hash_and_array json
69
+ json
70
+ .gsub(/({\s*})(?=,?$)/, "{\n }")
71
+ .gsub(/\[\s*\](?=,?$)/, "[\n ]")
72
+ end
64
73
  end
65
74
  end
@@ -14,5 +14,14 @@ module Pact
14
14
  json.gsub(/({\n)\n(\s*})/,'\1\2')
15
15
  end
16
16
 
17
+ # preserve pre json 2.8.x behaviour
18
+ # https://github.com/ruby/json/pull/626
19
+ def add_blank_lines_in_empty_hashes(json)
20
+ json.gsub(/({\s*})/, "{\n }")
21
+ end
22
+
23
+ def add_blank_lines_in_empty_arrays(json)
24
+ json.gsub(/\[\s*\]/, "[\n ]")
25
+ end
17
26
  end
18
27
  end
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module Support
3
- VERSION = "1.20.0"
3
+ VERSION = "1.21.7"
4
4
  end
5
5
  end
data/lib/pact/term.rb CHANGED
@@ -29,7 +29,11 @@ module Pact
29
29
  @matcher = attributes[:matcher]
30
30
  raise Pact::Error.new("Please specify a matcher for the Term") unless @matcher != nil
31
31
  raise Pact::Error.new("Please specify a value to generate for the Term") unless @generate != nil
32
- raise Pact::Error.new("Value to generate \"#{@generate}\" does not match regular expression #{@matcher.inspect}") unless @generate =~ @matcher
32
+ if @generate.is_a?(Float) || @generate.is_a?(Integer)
33
+ raise Pact::Error.new("#{@generate.is_a?(Float) ? "Float" : "Integer"} Value to generate '#{@generate}' does not match regular expression #{@matcher.inspect} when converted to string") unless @generate.to_s =~ @matcher
34
+ else
35
+ raise Pact::Error.new("Value to generate '#{@generate}' does not match regular expression #{@matcher.inspect}") unless @generate =~ @matcher
36
+ end
33
37
  end
34
38
 
35
39
  def to_hash
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact-support
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.0
4
+ version: 1.21.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Fraser
@@ -9,10 +9,9 @@ authors:
9
9
  - Brent Snook
10
10
  - Ronald Holshausen
11
11
  - Beth Skurrie
12
- autorequire:
13
12
  bindir: bin
14
13
  cert_chain: []
15
- date: 2023-10-18 00:00:00.000000000 Z
14
+ date: 1980-01-02 00:00:00.000000000 Z
16
15
  dependencies:
17
16
  - !ruby/object:Gem::Dependency
18
17
  name: rainbow
@@ -29,33 +28,33 @@ dependencies:
29
28
  - !ruby/object:Gem::Version
30
29
  version: 3.1.1
31
30
  - !ruby/object:Gem::Dependency
32
- name: awesome_print
31
+ name: amazing_print
33
32
  requirement: !ruby/object:Gem::Requirement
34
33
  requirements:
35
34
  - - "~>"
36
35
  - !ruby/object:Gem::Version
37
- version: '1.9'
36
+ version: '2.0'
38
37
  type: :runtime
39
38
  prerelease: false
40
39
  version_requirements: !ruby/object:Gem::Requirement
41
40
  requirements:
42
41
  - - "~>"
43
42
  - !ruby/object:Gem::Version
44
- version: '1.9'
43
+ version: '2.0'
45
44
  - !ruby/object:Gem::Dependency
46
45
  name: diff-lcs
47
46
  requirement: !ruby/object:Gem::Requirement
48
47
  requirements:
49
48
  - - "~>"
50
49
  - !ruby/object:Gem::Version
51
- version: '1.5'
50
+ version: '1.6'
52
51
  type: :runtime
53
52
  prerelease: false
54
53
  version_requirements: !ruby/object:Gem::Requirement
55
54
  requirements:
56
55
  - - "~>"
57
56
  - !ruby/object:Gem::Version
58
- version: '1.5'
57
+ version: '1.6'
59
58
  - !ruby/object:Gem::Dependency
60
59
  name: expgen
61
60
  requirement: !ruby/object:Gem::Requirement
@@ -70,6 +69,62 @@ dependencies:
70
69
  - - "~>"
71
70
  - !ruby/object:Gem::Version
72
71
  version: '0.1'
72
+ - !ruby/object:Gem::Dependency
73
+ name: string_pattern
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - "~>"
77
+ - !ruby/object:Gem::Version
78
+ version: '2.0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '2.0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: jsonpath
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.0'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1.0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: logger
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "<"
105
+ - !ruby/object:Gem::Version
106
+ version: '2.0'
107
+ type: :runtime
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "<"
112
+ - !ruby/object:Gem::Version
113
+ version: '2.0'
114
+ - !ruby/object:Gem::Dependency
115
+ name: stringio
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '3'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '3'
73
128
  - !ruby/object:Gem::Dependency
74
129
  name: rspec
75
130
  requirement: !ruby/object:Gem::Requirement
@@ -138,14 +193,28 @@ dependencies:
138
193
  requirements:
139
194
  - - "~>"
140
195
  - !ruby/object:Gem::Version
141
- version: 2.4.0
196
+ version: 3.2.0
142
197
  type: :development
143
198
  prerelease: false
144
199
  version_requirements: !ruby/object:Gem::Requirement
145
200
  requirements:
146
201
  - - "~>"
147
202
  - !ruby/object:Gem::Version
148
- version: 2.4.0
203
+ version: 3.2.0
204
+ - !ruby/object:Gem::Dependency
205
+ name: fiddle
206
+ requirement: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ type: :development
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
149
218
  - !ruby/object:Gem::Dependency
150
219
  name: hashie
151
220
  requirement: !ruby/object:Gem::Requirement
@@ -216,7 +285,34 @@ dependencies:
216
285
  - - "~>"
217
286
  - !ruby/object:Gem::Version
218
287
  version: '0.5'
219
- description:
288
+ - !ruby/object:Gem::Dependency
289
+ name: base64
290
+ requirement: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - "~>"
293
+ - !ruby/object:Gem::Version
294
+ version: '0.2'
295
+ type: :development
296
+ prerelease: false
297
+ version_requirements: !ruby/object:Gem::Requirement
298
+ requirements:
299
+ - - "~>"
300
+ - !ruby/object:Gem::Version
301
+ version: '0.2'
302
+ - !ruby/object:Gem::Dependency
303
+ name: ostruct
304
+ requirement: !ruby/object:Gem::Requirement
305
+ requirements:
306
+ - - ">="
307
+ - !ruby/object:Gem::Version
308
+ version: '0'
309
+ type: :development
310
+ prerelease: false
311
+ version_requirements: !ruby/object:Gem::Requirement
312
+ requirements:
313
+ - - ">="
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
220
316
  email:
221
317
  - james.fraser@alumni.swinburne.edu
222
318
  - sergei.matheson@gmail.com
@@ -253,6 +349,18 @@ files:
253
349
  - lib/pact/consumer_contract/service_provider.rb
254
350
  - lib/pact/consumer_contract/string_with_matching_rules.rb
255
351
  - lib/pact/errors.rb
352
+ - lib/pact/generator/date.rb
353
+ - lib/pact/generator/datetime.rb
354
+ - lib/pact/generator/provider_state.rb
355
+ - lib/pact/generator/random_boolean.rb
356
+ - lib/pact/generator/random_decimal.rb
357
+ - lib/pact/generator/random_hexadecimal.rb
358
+ - lib/pact/generator/random_int.rb
359
+ - lib/pact/generator/random_string.rb
360
+ - lib/pact/generator/regex.rb
361
+ - lib/pact/generator/time.rb
362
+ - lib/pact/generator/uuid.rb
363
+ - lib/pact/generators.rb
256
364
  - lib/pact/helpers.rb
257
365
  - lib/pact/http/authorization_header_redactor.rb
258
366
  - lib/pact/logging.rb
@@ -304,7 +412,6 @@ homepage: https://github.com/pact-foundation/pact-support
304
412
  licenses:
305
413
  - MIT
306
414
  metadata: {}
307
- post_install_message:
308
415
  rdoc_options: []
309
416
  require_paths:
310
417
  - lib
@@ -312,15 +419,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
312
419
  requirements:
313
420
  - - ">="
314
421
  - !ruby/object:Gem::Version
315
- version: '2.0'
422
+ version: 3.1.0
316
423
  required_rubygems_version: !ruby/object:Gem::Requirement
317
424
  requirements:
318
425
  - - ">="
319
426
  - !ruby/object:Gem::Version
320
427
  version: '0'
321
428
  requirements: []
322
- rubygems_version: 3.4.21
323
- signing_key:
429
+ rubygems_version: 4.0.16
324
430
  specification_version: 4
325
431
  summary: Shared code for Pact gems
326
432
  test_files: []