pact 1.3.3 → 1.4.0.rc2

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 (110) hide show
  1. data/CHANGELOG.md +16 -1
  2. data/Gemfile +5 -0
  3. data/Gemfile.lock +34 -13
  4. data/README.md +3 -2
  5. data/example/animal-service/lib/animal_service/api.rb +1 -0
  6. data/example/zoo-app/lib/zoo_app/animal_service_client.rb +0 -9
  7. data/example/zoo-app/lib/zoo_app/models/alligator.rb +2 -0
  8. data/lib/pact.rb +6 -5
  9. data/lib/pact/cli.rb +0 -26
  10. data/lib/pact/consumer/configuration.rb +0 -1
  11. data/lib/pact/consumer/configuration/configuration_extensions.rb +51 -0
  12. data/lib/pact/consumer/consumer_contract_builder.rb +1 -2
  13. data/lib/pact/consumer/interaction_builder.rb +2 -4
  14. data/lib/pact/doc/interaction_view_model.rb +9 -6
  15. data/lib/pact/doc/sort_interactions.rb +1 -1
  16. data/lib/pact/provider/rspec.rb +11 -9
  17. data/lib/pact/version.rb +1 -1
  18. data/pact.gemspec +5 -0
  19. data/spec/lib/pact/consumer/interaction_builder_spec.rb +4 -8
  20. data/spec/support/case-insensitive-response-header-matching.json +21 -0
  21. data/spec/support/case-insensitive-response-header-matching.rb +15 -0
  22. data/tasks/pact-test.rake +5 -0
  23. metadata +42 -122
  24. data/lib/pact/configuration.rb +0 -195
  25. data/lib/pact/consumer/app_manager.rb +0 -158
  26. data/lib/pact/consumer/interactions_filter.rb +0 -48
  27. data/lib/pact/consumer/mock_service.rb +0 -2
  28. data/lib/pact/consumer/mock_service/app.rb +0 -82
  29. data/lib/pact/consumer/mock_service/interaction_delete.rb +0 -33
  30. data/lib/pact/consumer/mock_service/interaction_list.rb +0 -76
  31. data/lib/pact/consumer/mock_service/interaction_mismatch.rb +0 -73
  32. data/lib/pact/consumer/mock_service/interaction_post.rb +0 -31
  33. data/lib/pact/consumer/mock_service/interaction_replay.rb +0 -139
  34. data/lib/pact/consumer/mock_service/log_get.rb +0 -28
  35. data/lib/pact/consumer/mock_service/missing_interactions_get.rb +0 -30
  36. data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +0 -31
  37. data/lib/pact/consumer/mock_service/pact_post.rb +0 -33
  38. data/lib/pact/consumer/mock_service/rack_request_helper.rb +0 -51
  39. data/lib/pact/consumer/mock_service/verification_get.rb +0 -68
  40. data/lib/pact/consumer/mock_service_client.rb +0 -65
  41. data/lib/pact/consumer/mock_service_interaction_expectation.rb +0 -37
  42. data/lib/pact/consumer/request.rb +0 -27
  43. data/lib/pact/consumer/server.rb +0 -90
  44. data/lib/pact/consumer_contract.rb +0 -1
  45. data/lib/pact/consumer_contract/consumer_contract.rb +0 -115
  46. data/lib/pact/consumer_contract/consumer_contract_writer.rb +0 -84
  47. data/lib/pact/consumer_contract/file_name.rb +0 -19
  48. data/lib/pact/consumer_contract/headers.rb +0 -51
  49. data/lib/pact/consumer_contract/interaction.rb +0 -67
  50. data/lib/pact/consumer_contract/pact_file.rb +0 -24
  51. data/lib/pact/consumer_contract/request.rb +0 -73
  52. data/lib/pact/consumer_contract/service_consumer.rb +0 -28
  53. data/lib/pact/consumer_contract/service_provider.rb +0 -28
  54. data/lib/pact/logging.rb +0 -14
  55. data/lib/pact/matchers.rb +0 -1
  56. data/lib/pact/matchers/actual_type.rb +0 -16
  57. data/lib/pact/matchers/base_difference.rb +0 -37
  58. data/lib/pact/matchers/differ.rb +0 -153
  59. data/lib/pact/matchers/difference.rb +0 -13
  60. data/lib/pact/matchers/difference_indicator.rb +0 -26
  61. data/lib/pact/matchers/embedded_diff_formatter.rb +0 -62
  62. data/lib/pact/matchers/expected_type.rb +0 -35
  63. data/lib/pact/matchers/index_not_found.rb +0 -15
  64. data/lib/pact/matchers/list_diff_formatter.rb +0 -101
  65. data/lib/pact/matchers/matchers.rb +0 -139
  66. data/lib/pact/matchers/no_diff_indicator.rb +0 -18
  67. data/lib/pact/matchers/regexp_difference.rb +0 -13
  68. data/lib/pact/matchers/type_difference.rb +0 -16
  69. data/lib/pact/matchers/unexpected_index.rb +0 -11
  70. data/lib/pact/matchers/unexpected_key.rb +0 -11
  71. data/lib/pact/matchers/unix_diff_formatter.rb +0 -114
  72. data/lib/pact/reification.rb +0 -28
  73. data/lib/pact/rspec.rb +0 -53
  74. data/lib/pact/shared/active_support_support.rb +0 -51
  75. data/lib/pact/shared/dsl.rb +0 -76
  76. data/lib/pact/shared/jruby_support.rb +0 -18
  77. data/lib/pact/shared/json_differ.rb +0 -15
  78. data/lib/pact/shared/key_not_found.rb +0 -15
  79. data/lib/pact/shared/null_expectation.rb +0 -31
  80. data/lib/pact/shared/request.rb +0 -80
  81. data/lib/pact/shared/text_differ.rb +0 -14
  82. data/lib/pact/something_like.rb +0 -49
  83. data/lib/pact/symbolize_keys.rb +0 -12
  84. data/lib/pact/term.rb +0 -85
  85. data/spec/lib/pact/consumer/request_spec.rb +0 -24
  86. data/spec/lib/pact/consumer_contract/active_support_support_spec.rb +0 -58
  87. data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +0 -180
  88. data/spec/lib/pact/consumer_contract/headers_spec.rb +0 -107
  89. data/spec/lib/pact/consumer_contract/interaction_spec.rb +0 -107
  90. data/spec/lib/pact/consumer_contract/request_spec.rb +0 -329
  91. data/spec/lib/pact/matchers/differ_spec.rb +0 -214
  92. data/spec/lib/pact/matchers/difference_spec.rb +0 -22
  93. data/spec/lib/pact/matchers/embedded_diff_formatter_spec.rb +0 -90
  94. data/spec/lib/pact/matchers/index_not_found_spec.rb +0 -21
  95. data/spec/lib/pact/matchers/list_diff_formatter_spec.rb +0 -114
  96. data/spec/lib/pact/matchers/matchers_spec.rb +0 -500
  97. data/spec/lib/pact/matchers/regexp_difference_spec.rb +0 -20
  98. data/spec/lib/pact/matchers/type_difference_spec.rb +0 -34
  99. data/spec/lib/pact/matchers/unexpected_index_spec.rb +0 -20
  100. data/spec/lib/pact/matchers/unexpected_key_spec.rb +0 -20
  101. data/spec/lib/pact/matchers/unix_diff_formatter_spec.rb +0 -216
  102. data/spec/lib/pact/reification_spec.rb +0 -67
  103. data/spec/lib/pact/shared/dsl_spec.rb +0 -86
  104. data/spec/lib/pact/shared/json_differ_spec.rb +0 -36
  105. data/spec/lib/pact/shared/key_not_found_spec.rb +0 -20
  106. data/spec/lib/pact/shared/request_spec.rb +0 -111
  107. data/spec/lib/pact/shared/text_differ_spec.rb +0 -54
  108. data/spec/lib/pact/something_like_spec.rb +0 -21
  109. data/spec/lib/pact/term_spec.rb +0 -89
  110. data/spec/support/dsl_spec_support.rb +0 -7
@@ -1,35 +0,0 @@
1
- require 'pact/matchers/difference_indicator'
2
-
3
- module Pact
4
- class ExpectedType < Pact::DifferenceIndicator
5
-
6
- def initialize value
7
- @value = value
8
- end
9
-
10
- def type
11
- @value.class.name
12
- end
13
-
14
- def to_json options = {}
15
- type
16
- end
17
-
18
- def as_json options = {}
19
- type
20
- end
21
-
22
- def eq? other
23
- self.class == other.class && other.type == type
24
- end
25
-
26
- def == other
27
- eq? other
28
- end
29
-
30
- def to_s
31
- type
32
- end
33
-
34
- end
35
- end
@@ -1,15 +0,0 @@
1
- require 'pact/matchers/difference_indicator'
2
-
3
- module Pact
4
- class IndexNotFound < Pact::DifferenceIndicator
5
-
6
- def to_s
7
- "<index not found>"
8
- end
9
-
10
- def empty?
11
- true
12
- end
13
- end
14
-
15
- end
@@ -1,101 +0,0 @@
1
- module Pact
2
- module Matchers
3
- class ListDiffFormatter
4
-
5
- attr_reader :diff
6
-
7
- def initialize diff, options = {}
8
- @diff = diff
9
- end
10
-
11
- def self.call diff, options = {}
12
- new(diff, options).call
13
- end
14
-
15
- def to_hash
16
- diff
17
- end
18
-
19
- def call
20
- to_s
21
- end
22
-
23
- def to_s
24
- diff_descriptions(diff).join("\n")
25
- end
26
-
27
- def diff_descriptions obj, path = [], descriptions = []
28
- case obj
29
- when Hash then handle_hash obj, path, descriptions
30
- when Array then handle_array obj, path, descriptions
31
- when Difference then handle_difference obj, path, descriptions
32
- when TypeDifference then handle_mismatched_type obj, path, descriptions
33
- when RegexpDifference then handle_mismatched_regexp obj, path, descriptions
34
- when NoDiffIndicator then nil
35
- else
36
- raise "Invalid diff, expected Hash, Array, NoDiffIndicator or Difference, found #{obj.class}"
37
- end
38
- descriptions
39
- end
40
-
41
- def handle_hash hash, path, descriptions
42
- hash.each_pair do | key, value |
43
- diff_descriptions value, path + [key.inspect], descriptions
44
- end
45
- end
46
-
47
- def handle_array array, path, descriptions
48
- array.each_with_index do | obj, index |
49
- diff_descriptions obj, path + [index], descriptions
50
- end
51
- end
52
-
53
- def handle_difference difference, path, descriptions
54
- case difference.expected
55
- when Pact::UnexpectedKey then handle_unexpected_key(difference, path, descriptions)
56
- when Pact::UnexpectedIndex then handle_unexpected_index(difference, path, descriptions)
57
- else
58
- case difference.actual
59
- when Pact::KeyNotFound then handle_key_not_found(difference, path, descriptions)
60
- when Pact::IndexNotFound then handle_index_not_found(difference, path, descriptions)
61
- else
62
- handle_mismatched_value(difference, path, descriptions)
63
- end
64
- end
65
- end
66
-
67
- def handle_unexpected_index difference, path, descriptions
68
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tArray contained unexpected item:\n\t\t#{difference.actual.ai}"
69
- end
70
-
71
- def handle_mismatched_value difference, path, descriptions
72
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tExpected:\n\t\t#{difference.expected.ai}\n\tActual:\n\t\t#{difference.actual.ai}"
73
- end
74
-
75
- def handle_mismatched_regexp difference, path, descriptions
76
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tExpected to match:\n\t\t#{difference.expected.inspect}\n\tActual:\n\t\t#{difference.actual.ai}"
77
- end
78
-
79
- def handle_mismatched_type difference, path, descriptions
80
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tExpected type:\n\t\t#{difference.expected}\n\tActual type:\n\t\t#{difference.actual}"
81
- end
82
-
83
- def handle_index_not_found difference, path, descriptions
84
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tMissing index with value:\n\t\t#{difference.expected.ai}"
85
- end
86
-
87
- def handle_key_not_found difference, path, descriptions
88
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tMissing key with value:\n\t\t#{difference.expected.ai}"
89
- end
90
-
91
- def handle_unexpected_key difference, path, descriptions
92
- descriptions << "\tAt:\n\t\t#{path_to_s(path)}\n\tHash contained unexpected key with value:\n\t\t#{difference.actual.ai}"
93
- end
94
-
95
- def path_to_s path
96
- "[" + path.join("][") + "]"
97
- end
98
-
99
- end
100
- end
101
- end
@@ -1,139 +0,0 @@
1
- require 'awesome_print'
2
- require 'pact/term'
3
- require 'pact/something_like'
4
- require 'pact/shared/null_expectation'
5
- require 'pact/shared/key_not_found'
6
- require 'pact/matchers/unexpected_key'
7
- require 'pact/matchers/unexpected_index'
8
- require 'pact/matchers/index_not_found'
9
- require 'pact/matchers/difference'
10
- require 'pact/matchers/regexp_difference'
11
- require 'pact/matchers/type_difference'
12
- require 'pact/matchers/expected_type'
13
- require 'pact/matchers/actual_type'
14
- require 'pact/matchers/no_diff_indicator'
15
-
16
- module Pact
17
- module Matchers
18
-
19
- NO_DIFF_INDICATOR = NoDiffIndicator.new
20
- DEFAULT_OPTIONS = {allow_unexpected_keys: true, type: false}.freeze
21
-
22
- def diff expected, actual, opts = {}
23
- calculate_diff(Pact::Term.unpack_regexps(expected), actual, DEFAULT_OPTIONS.merge(opts))
24
- end
25
-
26
- def type_diff expected, actual, opts = {}
27
- calculate_diff Pact::Term.unpack_regexps(expected), actual, DEFAULT_OPTIONS.merge(opts).merge(type: true)
28
- end
29
-
30
- private
31
-
32
- def calculate_diff expected, actual, opts = {}
33
- options = DEFAULT_OPTIONS.merge(opts)
34
- case expected
35
- when Hash then hash_diff(expected, actual, options)
36
- when Array then array_diff(expected, actual, options)
37
- when Regexp then regexp_diff(expected, actual, options)
38
- when Pact::SomethingLike then calculate_diff(expected.contents, actual, options.merge(:type => true))
39
- else object_diff(expected, actual, options)
40
- end
41
- end
42
-
43
- alias_method :structure_diff, :type_diff # Backwards compatibility
44
-
45
- def regexp_diff regexp, actual, options
46
- if actual.is_a?(String) && regexp.match(actual)
47
- {}
48
- else
49
- RegexpDifference.new regexp, actual
50
- end
51
- end
52
-
53
- def array_diff expected, actual, options
54
- if actual.is_a? Array
55
- actual_array_diff expected, actual, options
56
- else
57
- Difference.new expected, actual
58
- end
59
- end
60
-
61
- def actual_array_diff expected, actual, options
62
- difference = []
63
- diff_found = false
64
- length = [expected.length, actual.length].max
65
- length.times do | index|
66
- expected_item = expected.fetch(index, Pact::UnexpectedIndex.new)
67
- actual_item = actual.fetch(index, Pact::IndexNotFound.new)
68
- if (item_diff = calculate_diff(expected_item, actual_item, options)).any?
69
- diff_found = true
70
- difference << item_diff
71
- else
72
- difference << NO_DIFF_INDICATOR
73
- end
74
- end
75
- diff_found ? difference : {}
76
- end
77
-
78
- def actual_hash_diff expected, actual, options
79
- difference = expected.keys.inject({}) do |calculate_diff, key|
80
- if (diff_at_key = calculate_diff(expected[key], actual.fetch(key, Pact::KeyNotFound.new), options)).any?
81
- calculate_diff[key] = diff_at_key
82
- end
83
- calculate_diff
84
- end
85
- difference.merge(check_for_unexpected_keys(expected, actual, options))
86
- end
87
-
88
- def check_for_unexpected_keys expected, actual, options
89
- if options[:allow_unexpected_keys]
90
- {}
91
- else
92
- (actual.keys - expected.keys).inject({}) do | calculate_diff, key |
93
- calculate_diff[key] = Difference.new(UnexpectedKey.new, actual[key])
94
- calculate_diff
95
- end
96
- end
97
- end
98
-
99
- def hash_diff expected, actual, options
100
- if actual.is_a? Hash
101
- actual_hash_diff expected, actual, options
102
- else
103
- Difference.new expected, actual
104
- end
105
- end
106
-
107
- def type_difference expected, actual
108
- if types_match? expected, actual
109
- {}
110
- else
111
- TypeDifference.new type_diff_expected_display(expected), type_diff_actual_display(actual)
112
- end
113
- end
114
-
115
- def type_diff_actual_display actual
116
- actual.is_a?(KeyNotFound) ? actual : ActualType.new(actual)
117
- end
118
-
119
- def type_diff_expected_display expected
120
- ExpectedType.new(expected)
121
- end
122
-
123
- def types_match? expected, actual
124
- #There must be a more elegant way to do this
125
- expected.class == actual.class ||
126
- (expected.is_a?(TrueClass) && actual.is_a?(FalseClass)) ||
127
- (expected.is_a?(FalseClass) && actual.is_a?(TrueClass))
128
- end
129
-
130
- def object_diff expected, actual, options
131
- return type_difference(expected, actual) if options[:type]
132
- if expected != actual
133
- Difference.new expected, actual
134
- else
135
- {}
136
- end
137
- end
138
- end
139
- end
@@ -1,18 +0,0 @@
1
- module Pact
2
- module Matchers
3
- class NoDiffIndicator
4
-
5
- def to_json options = {}
6
- to_s
7
- end
8
-
9
- def to_s
10
- 'no difference here!'
11
- end
12
-
13
- def == other
14
- other.is_a? NoDiffIndicator
15
- end
16
- end
17
- end
18
- end
@@ -1,13 +0,0 @@
1
- require 'pact/matchers/base_difference'
2
-
3
- module Pact
4
- module Matchers
5
- class RegexpDifference < BaseDifference
6
-
7
- def as_json options = {}
8
- {:EXPECTED_TO_MATCH => expected.inspect, :ACTUAL => actual}
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,16 +0,0 @@
1
- require 'pact/matchers/base_difference'
2
-
3
- module Pact
4
- module Matchers
5
- class TypeDifference < BaseDifference
6
-
7
- def as_json options = {}
8
- if KeyNotFound === actual
9
- {:EXPECTED_TYPE => expected.as_json, :ACTUAL => actual.as_json }
10
- else
11
- {:EXPECTED_TYPE => expected.as_json, :ACTUAL_TYPE => actual.as_json }
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,11 +0,0 @@
1
- require 'pact/matchers/difference_indicator'
2
-
3
- module Pact
4
- class UnexpectedIndex < Pact::DifferenceIndicator
5
-
6
- def to_s
7
- '<index not to exist>'
8
- end
9
-
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- require 'pact/matchers/difference_indicator'
2
-
3
- module Pact
4
- class UnexpectedKey < Pact::DifferenceIndicator
5
-
6
- def to_s
7
- '<key not to exist>'
8
- end
9
-
10
- end
11
- end
@@ -1,114 +0,0 @@
1
- require 'pact/shared/jruby_support'
2
- require 'pact/matchers/differ'
3
-
4
- module Pact
5
- module Matchers
6
-
7
- class UnixDiffFormatter
8
-
9
- include JRubySupport
10
-
11
- def initialize diff, options = {}
12
- @diff = diff
13
- @colour = options.fetch(:colour, false)
14
- @differ = Pact::Matchers::Differ.new(@colour)
15
- end
16
-
17
- def self.call diff, options = {colour: Pact.configuration.color_enabled}
18
- new(diff, options).call
19
- end
20
-
21
- def call
22
- to_s
23
- end
24
-
25
- def to_s
26
- expected = generate_string(diff, :expected)
27
- actual = generate_string(diff, :actual)
28
- @differ.diff_as_string(actual, expected).lstrip + "\n" + key
29
- end
30
-
31
- private
32
-
33
- def handle thing, target
34
- case thing
35
- when Hash then copy_hash(thing, target)
36
- when Array then copy_array(thing, target)
37
- when Difference then copy_diff(thing, target)
38
- when TypeDifference then copy_diff(thing, target)
39
- when RegexpDifference then copy_diff(thing, target)
40
- when NoDiffIndicator then copy_no_diff(thing, target)
41
- else copy_object(thing, target)
42
- end
43
- end
44
-
45
- def generate_string diff, target
46
- comparable = handle(diff, target)
47
- begin
48
- # Can't think of an elegant way to check if we can pretty generate other than to try it and maybe fail
49
- fix_blank_lines_in_empty_hashes JSON.pretty_generate(comparable)
50
- rescue JSON::GeneratorError
51
- comparable.to_s
52
- end
53
- end
54
-
55
- def copy_hash hash, target
56
- hash.keys.each_with_object({}) do | key, new_hash |
57
- value = handle hash[key], target
58
- new_hash[key] = value unless (KeyNotFound === value || UnexpectedKey === value)
59
- end
60
- end
61
-
62
- def copy_array array, target
63
- array.each_index.each_with_object([]) do | index, new_array |
64
- value = handle array[index], target
65
- new_array[index] = value unless (UnexpectedIndex === value || IndexNotFound === value)
66
- end
67
- end
68
-
69
- def copy_no_diff(thing, target)
70
- thing
71
- end
72
-
73
- def copy_diff difference, target
74
- if target == :actual
75
- handle difference.actual, target
76
- else
77
- handle difference.expected, target
78
- end
79
- end
80
-
81
- def copy_object object, target
82
- if Regexp === object
83
- RegexpDecorator.new(object)
84
- else
85
- object
86
- end
87
- end
88
-
89
- def key
90
- "Key: " + @differ.red("-") + @differ.red(" means \"expected, but was not found\". \n") +
91
- @differ.green(" +") + @differ.green(" means \"actual, should not be found\". \n") +
92
- " Values where the expected matches the actual are not shown.\n"
93
- end
94
-
95
- class RegexpDecorator
96
-
97
- def initialize regexp
98
- @regexp = regexp
99
- end
100
-
101
- def to_json options={}
102
- @regexp.inspect
103
- end
104
-
105
- def as_json
106
- @regexp.inspect
107
- end
108
- end
109
-
110
- attr_reader :diff
111
- end
112
-
113
- end
114
- end