pact-support 1.20.1 → 1.21.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b9c0d84b02abb11d0ca1f14ac23d4f90dc2c55874898c22bb279db2fbf2c143
4
- data.tar.gz: a27dc43886c7643b30574c686e78cbbadc117e13cf37f8227bce6a4c661c7d07
3
+ metadata.gz: ff89b1f300df93010c7b5820db53c8433fb8793ed895e8671c59b594f28008e4
4
+ data.tar.gz: 192212e7600f9c1be43e3817b479d59293582ad324e32262513a8db4982d850d
5
5
  SHA512:
6
- metadata.gz: 8d5d1e2de94fb66036172adf61079b88a073b24280e780e48e3e667c943f17a68461ab3636e151392aeade397d53c18804ed65069cb84b1c8e03ce8c77ecedea
7
- data.tar.gz: b420f3a91cd38c334e2e2c208a815f52bfd8c7cfc0c056e788cb25427e61c9cbc71c680f9d446b8af2815108c2f527d5ff1640516c0564e83776541b5ea3f5f3
6
+ metadata.gz: b9335620e66ea4d6227973a7c2ca94f10bded7f05f9cdc8621715960619fcbde63e8d02d84c418027a4bde925d02dbc547641f8a73a34cb4269611016c0044f7
7
+ data.tar.gz: db26dea284a359a2c0b8a4e7db2a1dac2c488f228de11e2277ca4d154b342bf1338a5b574bab9326e46e05b8a0f6c21c19f2ef1899b62811f23b057ba4d57808
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ <a name="v1.21.0"></a>
2
+ ### v1.21.0 (2024-11-28)
3
+
4
+ #### Features
5
+
6
+ * add like_integer / like_decimal helpers ([75a36cd](/../../commit/75a36cd))
7
+ * add v3/v4 generators (thanks @slt) ([fe04975](/../../commit/fe04975))
8
+
9
+ #### Bug Fixes
10
+
11
+ * add blank lines to empty hashs - json 2.8.x regression ([66910bd](/../../commit/66910bd))
12
+
13
+ <a name="v1.20.2"></a>
14
+ ### v1.20.2 (2024-10-23)
15
+
16
+ #### Bug Fixes
17
+
18
+ * **test**
19
+ * explicitly require ostruct as non stdlib in ruby 3.5.x ([e06a057](/../../commit/e06a057))
20
+
21
+ * use single quotes for pact term creation err msg ([d770791](/../../commit/d770791))
22
+
1
23
  <a name="v1.20.1"></a>
2
24
  ### v1.20.1 (2024-08-08)
3
25
 
data/README.md CHANGED
@@ -1,5 +1,72 @@
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
+ ## Compatibility
9
+
10
+ <details><summary>Specification Compatibility</summary>
11
+
12
+ | Version | Stable | [Spec] Compatibility |
13
+ | ------- | ------ | -------------------- |
14
+ | 1.x.x | Yes | 2, 3\* |
15
+
16
+ _\*_ v3 support is limited to the subset of functionality required to enable language inter-operable [Message support].
17
+
18
+ - See V3 tracking [issue](https://github.com/pact-foundation/pact-ruby/issues/318).
19
+ - See V4 tracking [issue](https://github.com/pact-foundation/pact-ruby/issues/319).
20
+
21
+ 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)
22
+
23
+ [message support]: https://github.com/pact-foundation/pact-specification/tree/version-3#introduces-messages-for-services-that-communicate-via-event-streams-and-message-queues
24
+
25
+ </details>
26
+
27
+ ### Supported matching rules
28
+
29
+ | matcher | Spec Version | Implemented | Usage|
30
+ |---------------|--------------|-------------|-------------|
31
+ | Equality | V1 | | |
32
+ | Regex | V2 | ✅ | `Pact.term(generate, matcher)` |
33
+ | Type | V2 | ✅ | `Pact.like(generate)` |
34
+ | MinType | V2 | ✅ | `Pact.each_like(generate, min: <val>)` |
35
+ | MaxType | V2 | | |
36
+ | MinMaxType | V2 | | |
37
+ | Include | V3 | | |
38
+ | Integer | V3 | | |
39
+ | Decimal | V3 | | |
40
+ | Number | V3 | | |
41
+ | Timestamp | V3 | | |
42
+ | Time | V3 | | |
43
+ | Date | V3 | | |
44
+ | Null | V3 | | |
45
+ | Boolean | V3 | | |
46
+ | ContentType | V3 | | |
47
+ | Values | V3 | | |
48
+ | ArrayContains | V4 | | |
49
+ | StatusCode | V4 | | |
50
+ | NotEmpty | V4 | | |
51
+ | Semver | V4 | | |
52
+ | EachKey | V4 | | |
53
+ | EachValue | V4 | | |
54
+
55
+ ### Supported generators
56
+
57
+ Currently limited to provider verification only. No current way to set in consumer tests.
58
+
59
+ | Generator | Spec Version | Implemented |
60
+ |------------------------|--------------|----|
61
+ | RandomInt | V3 | ✅ |
62
+ | RandomDecimal | V3 | ✅ |
63
+ | RandomHexadecimal | V3 | ✅ |
64
+ | RandomString | V3 | ✅ |
65
+ | Regex | V3 | ✅ |
66
+ | Uuid | V3/V4 | ✅ |
67
+ | Date | V3 | ✅ |
68
+ | Time | V3 | ✅ |
69
+ | DateTime | V3 | ✅ |
70
+ | RandomBoolean | V3 | ✅ |
71
+ | ProviderState | V4 | ✅ |
72
+ | MockServerURL | V4 | 🚧 |
@@ -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,64 @@
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 'pact/matching_rules/jsonpath'
13
+ require 'pact/matching_rules/v3/extract'
14
+ require 'jsonpath'
15
+
16
+ module Pact
17
+ class Generators
18
+ def self.add_generator(generator)
19
+ generators.unshift(generator)
20
+ end
21
+
22
+ def self.generators
23
+ @generators ||= []
24
+ end
25
+
26
+ def self.execute_generators(object, state_params = nil, example_value = nil)
27
+ generators.each do |parser|
28
+ return parser.call(object, state_params, example_value) if parser.can_generate?(object)
29
+ end
30
+
31
+ raise Pact::UnrecognizePactFormatError, "This document does not use a recognised Pact generator: #{object}"
32
+ end
33
+
34
+ def self.apply_generators(expected_request, component, example_value, state_params)
35
+ # Latest pact-support is required to have generators exposed
36
+ if expected_request.methods.include?(:generators) && expected_request.generators[component]
37
+ # Some component will have single generator without selectors, i.e. path
38
+ generators = expected_request.generators[component]
39
+ if generators.is_a?(Hash) && generators.key?('type')
40
+ return execute_generators(generators, state_params, example_value)
41
+ end
42
+
43
+ generators.each do |selector, generator|
44
+ val = JsonPath.new(selector).on(example_value)
45
+ replace = execute_generators(generator, state_params, val)
46
+ example_value = JsonPath.for(example_value).gsub(selector) { |_v| replace }.to_hash
47
+ end
48
+ end
49
+ example_value
50
+ end
51
+
52
+ add_generator(Generator::RandomBoolean.new)
53
+ add_generator(Generator::Date.new)
54
+ add_generator(Generator::DateTime.new)
55
+ add_generator(Generator::ProviderState.new)
56
+ add_generator(Generator::RandomDecimal.new)
57
+ add_generator(Generator::RandomHexadecimal.new)
58
+ add_generator(Generator::RandomInt.new)
59
+ add_generator(Generator::RandomString.new)
60
+ add_generator(Generator::Regex.new)
61
+ add_generator(Generator::Time.new)
62
+ add_generator(Generator::Uuid.new)
63
+ end
64
+ 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,
@@ -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
@@ -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.1"
3
+ VERSION = "1.21.0"
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.1
4
+ version: 1.21.0
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: 2024-08-08 00:00:00.000000000 Z
15
+ date: 2024-11-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rainbow
@@ -70,6 +70,34 @@ dependencies:
70
70
  - - "~>"
71
71
  - !ruby/object:Gem::Version
72
72
  version: '0.1'
73
+ - !ruby/object:Gem::Dependency
74
+ name: string_pattern
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '2.0'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '2.0'
87
+ - !ruby/object:Gem::Dependency
88
+ name: jsonpath
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.0'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.0'
73
101
  - !ruby/object:Gem::Dependency
74
102
  name: rspec
75
103
  requirement: !ruby/object:Gem::Requirement
@@ -230,6 +258,20 @@ dependencies:
230
258
  - - "~>"
231
259
  - !ruby/object:Gem::Version
232
260
  version: '0.2'
261
+ - !ruby/object:Gem::Dependency
262
+ name: ostruct
263
+ requirement: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ version: '0'
268
+ type: :development
269
+ prerelease: false
270
+ version_requirements: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
233
275
  description:
234
276
  email:
235
277
  - james.fraser@alumni.swinburne.edu
@@ -267,6 +309,18 @@ files:
267
309
  - lib/pact/consumer_contract/service_provider.rb
268
310
  - lib/pact/consumer_contract/string_with_matching_rules.rb
269
311
  - lib/pact/errors.rb
312
+ - lib/pact/generator/date.rb
313
+ - lib/pact/generator/datetime.rb
314
+ - lib/pact/generator/provider_state.rb
315
+ - lib/pact/generator/random_boolean.rb
316
+ - lib/pact/generator/random_decimal.rb
317
+ - lib/pact/generator/random_hexadecimal.rb
318
+ - lib/pact/generator/random_int.rb
319
+ - lib/pact/generator/random_string.rb
320
+ - lib/pact/generator/regex.rb
321
+ - lib/pact/generator/time.rb
322
+ - lib/pact/generator/uuid.rb
323
+ - lib/pact/generators.rb
270
324
  - lib/pact/helpers.rb
271
325
  - lib/pact/http/authorization_header_redactor.rb
272
326
  - lib/pact/logging.rb
@@ -333,7 +387,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
333
387
  - !ruby/object:Gem::Version
334
388
  version: '0'
335
389
  requirements: []
336
- rubygems_version: 3.5.17
390
+ rubygems_version: 3.5.23
337
391
  signing_key:
338
392
  specification_version: 4
339
393
  summary: Shared code for Pact gems