pact-support 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +29 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +8 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +80 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +4 -0
  10. data/Rakefile +4 -0
  11. data/lib/pact/configuration.rb +164 -0
  12. data/lib/pact/consumer/request.rb +27 -0
  13. data/lib/pact/consumer_contract.rb +1 -0
  14. data/lib/pact/consumer_contract/consumer_contract.rb +114 -0
  15. data/lib/pact/consumer_contract/file_name.rb +19 -0
  16. data/lib/pact/consumer_contract/headers.rb +51 -0
  17. data/lib/pact/consumer_contract/interaction.rb +73 -0
  18. data/lib/pact/consumer_contract/pact_file.rb +24 -0
  19. data/lib/pact/consumer_contract/request.rb +73 -0
  20. data/lib/pact/consumer_contract/response.rb +51 -0
  21. data/lib/pact/consumer_contract/service_consumer.rb +28 -0
  22. data/lib/pact/consumer_contract/service_provider.rb +28 -0
  23. data/lib/pact/logging.rb +14 -0
  24. data/lib/pact/matchers.rb +1 -0
  25. data/lib/pact/matchers/actual_type.rb +16 -0
  26. data/lib/pact/matchers/base_difference.rb +37 -0
  27. data/lib/pact/matchers/differ.rb +153 -0
  28. data/lib/pact/matchers/difference.rb +13 -0
  29. data/lib/pact/matchers/difference_indicator.rb +26 -0
  30. data/lib/pact/matchers/embedded_diff_formatter.rb +62 -0
  31. data/lib/pact/matchers/expected_type.rb +35 -0
  32. data/lib/pact/matchers/index_not_found.rb +15 -0
  33. data/lib/pact/matchers/list_diff_formatter.rb +101 -0
  34. data/lib/pact/matchers/matchers.rb +139 -0
  35. data/lib/pact/matchers/no_diff_indicator.rb +18 -0
  36. data/lib/pact/matchers/regexp_difference.rb +13 -0
  37. data/lib/pact/matchers/type_difference.rb +16 -0
  38. data/lib/pact/matchers/unexpected_index.rb +11 -0
  39. data/lib/pact/matchers/unexpected_key.rb +11 -0
  40. data/lib/pact/matchers/unix_diff_formatter.rb +114 -0
  41. data/lib/pact/reification.rb +28 -0
  42. data/lib/pact/rspec.rb +53 -0
  43. data/lib/pact/shared/active_support_support.rb +51 -0
  44. data/lib/pact/shared/dsl.rb +76 -0
  45. data/lib/pact/shared/jruby_support.rb +18 -0
  46. data/lib/pact/shared/json_differ.rb +15 -0
  47. data/lib/pact/shared/key_not_found.rb +15 -0
  48. data/lib/pact/shared/null_expectation.rb +31 -0
  49. data/lib/pact/shared/request.rb +97 -0
  50. data/lib/pact/shared/text_differ.rb +14 -0
  51. data/lib/pact/something_like.rb +49 -0
  52. data/lib/pact/support.rb +9 -0
  53. data/lib/pact/support/version.rb +5 -0
  54. data/lib/pact/symbolize_keys.rb +12 -0
  55. data/lib/pact/term.rb +85 -0
  56. data/lib/tasks/pact.rake +29 -0
  57. data/pact-support.gemspec +35 -0
  58. data/spec/lib/pact/consumer/request_spec.rb +25 -0
  59. data/spec/lib/pact/consumer_contract/active_support_support_spec.rb +58 -0
  60. data/spec/lib/pact/consumer_contract/consumer_contract_spec.rb +141 -0
  61. data/spec/lib/pact/consumer_contract/headers_spec.rb +107 -0
  62. data/spec/lib/pact/consumer_contract/interaction_spec.rb +151 -0
  63. data/spec/lib/pact/consumer_contract/request_spec.rb +329 -0
  64. data/spec/lib/pact/consumer_contract/response_spec.rb +73 -0
  65. data/spec/lib/pact/matchers/differ_spec.rb +215 -0
  66. data/spec/lib/pact/matchers/difference_spec.rb +22 -0
  67. data/spec/lib/pact/matchers/embedded_diff_formatter_spec.rb +90 -0
  68. data/spec/lib/pact/matchers/index_not_found_spec.rb +21 -0
  69. data/spec/lib/pact/matchers/list_diff_formatter_spec.rb +120 -0
  70. data/spec/lib/pact/matchers/matchers_spec.rb +500 -0
  71. data/spec/lib/pact/matchers/regexp_difference_spec.rb +20 -0
  72. data/spec/lib/pact/matchers/type_difference_spec.rb +34 -0
  73. data/spec/lib/pact/matchers/unexpected_index_spec.rb +20 -0
  74. data/spec/lib/pact/matchers/unexpected_key_spec.rb +20 -0
  75. data/spec/lib/pact/matchers/unix_diff_formatter_spec.rb +216 -0
  76. data/spec/lib/pact/reification_spec.rb +67 -0
  77. data/spec/lib/pact/shared/dsl_spec.rb +86 -0
  78. data/spec/lib/pact/shared/json_differ_spec.rb +36 -0
  79. data/spec/lib/pact/shared/key_not_found_spec.rb +20 -0
  80. data/spec/lib/pact/shared/request_spec.rb +196 -0
  81. data/spec/lib/pact/shared/text_differ_spec.rb +54 -0
  82. data/spec/lib/pact/something_like_spec.rb +21 -0
  83. data/spec/lib/pact/term_spec.rb +89 -0
  84. data/spec/spec_helper.rb +19 -0
  85. data/spec/support/a_consumer-a_producer.json +32 -0
  86. data/spec/support/a_consumer-a_provider.json +32 -0
  87. data/spec/support/active_support_if_configured.rb +6 -0
  88. data/spec/support/case-insensitive-response-header-matching.json +21 -0
  89. data/spec/support/consumer_contract_template.json +24 -0
  90. data/spec/support/dsl_spec_support.rb +7 -0
  91. data/spec/support/factories.rb +82 -0
  92. data/spec/support/generated_index.md +4 -0
  93. data/spec/support/generated_markdown.md +55 -0
  94. data/spec/support/interaction_view_model.json +63 -0
  95. data/spec/support/interaction_view_model_with_terms.json +50 -0
  96. data/spec/support/markdown_pact.json +48 -0
  97. data/spec/support/missing_provider_states_output.txt +25 -0
  98. data/spec/support/options.json +21 -0
  99. data/spec/support/shared_examples_for_request.rb +94 -0
  100. data/spec/support/spec_support.rb +20 -0
  101. data/spec/support/stubbing.json +22 -0
  102. data/spec/support/term.json +48 -0
  103. data/spec/support/test_app_fail.json +61 -0
  104. data/spec/support/test_app_pass.json +38 -0
  105. data/spec/support/test_app_with_right_content_type_differ.json +23 -0
  106. data/tasks/spec.rake +6 -0
  107. metadata +401 -0
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZmE3YmExODMzYzc4ODljOWNiMjQ5NTZmMjFlYjUwYjBkZmZjNTY1Zg==
5
+ data.tar.gz: !binary |-
6
+ MGYzMWNkOTU5M2MxOWQwMzY2Mzg2NTI4YWMyNWM2ZTVhN2QxOTBlMA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NmM1ZjFlODEwNTlmNzM3ZTU2NjM1ZmJkOWI4OGQ0YjE4NjlkNDMwNThiZjI3
10
+ MDZhZDIzMDk4NTBmZDY2Y2EzZThjYjViMWVhM2FlNDVmMTVhNmY3YjU2NGM1
11
+ M2JlY2IzNzRkZDM4OGQ3NzhjOGIwYWE4YmI1YmE3N2Y2MmI0ZmM=
12
+ data.tar.gz: !binary |-
13
+ YjJiOGEwMmJmOGNmZjczMjY4MDU3ZDE2NzY3NmQ2NDMwZTVkN2FlYzA1MzZk
14
+ MmQ5MGMyNDdlNDg5YmE0MzA2N2M2ODg2ZDI3YzQ2MjI2NTI4Y2QxYWI5ZmE5
15
+ OTY2YTJlNWEzMGVmNzliYzI4ZmUwNzQ2MDFlM2M1OWQ0YmMwNGI=
@@ -0,0 +1,29 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ InstalledFiles
7
+ _yardoc
8
+ coverage
9
+ lib/bundler/man
10
+ pkg
11
+ rdoc
12
+ spec/reports
13
+ test/tmp
14
+ test/version_tmp
15
+ tmp
16
+ *.swp
17
+ .bin
18
+ tags
19
+ .rbenv-version
20
+ spec/pacts
21
+ .rvmrc
22
+ *.iml
23
+ .rakeTasks
24
+ *~
25
+ .ruby-gemset
26
+ .ruby-version
27
+ log
28
+ .idea
29
+ reports
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.1
6
+ - jruby-19mode
7
+ - jruby-1.7.11
8
+ - jruby-1.7.12
@@ -0,0 +1,4 @@
1
+ Do this to generate your change history
2
+
3
+ git log --pretty=format:' * %h - %s (%an, %ad)'
4
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pact.gemspec
4
+ gemspec
@@ -0,0 +1,80 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pact-support (0.0.1)
5
+ awesome_print (~> 1.1)
6
+ find_a_port (~> 1.0.1)
7
+ json
8
+ rack-test (~> 0.6.2)
9
+ randexp (~> 0.1.7)
10
+ rspec (>= 2.14)
11
+ term-ansicolor (~> 1.0)
12
+ thor
13
+
14
+ GEM
15
+ remote: https://rubygems.org/
16
+ specs:
17
+ activesupport (4.1.1)
18
+ i18n (~> 0.6, >= 0.6.9)
19
+ json (~> 1.7, >= 1.7.7)
20
+ minitest (~> 5.1)
21
+ thread_safe (~> 0.1)
22
+ tzinfo (~> 1.1)
23
+ addressable (2.3.6)
24
+ awesome_print (1.2.0)
25
+ coderay (1.1.0)
26
+ crack (0.4.2)
27
+ safe_yaml (~> 1.0.0)
28
+ diff-lcs (1.2.5)
29
+ fakefs (0.5.2)
30
+ find_a_port (1.0.1)
31
+ hashie (2.1.1)
32
+ i18n (0.6.9)
33
+ json (1.8.1)
34
+ method_source (0.8.2)
35
+ minitest (5.3.4)
36
+ pry (0.10.0)
37
+ coderay (~> 1.1.0)
38
+ method_source (~> 0.8.1)
39
+ slop (~> 3.4)
40
+ rack (1.5.2)
41
+ rack-test (0.6.2)
42
+ rack (>= 1.0)
43
+ rake (10.0.4)
44
+ randexp (0.1.7)
45
+ rspec (3.1.0)
46
+ rspec-core (~> 3.1.0)
47
+ rspec-expectations (~> 3.1.0)
48
+ rspec-mocks (~> 3.1.0)
49
+ rspec-core (3.1.6)
50
+ rspec-support (~> 3.1.0)
51
+ rspec-expectations (3.1.2)
52
+ diff-lcs (>= 1.2.0, < 2.0)
53
+ rspec-support (~> 3.1.0)
54
+ rspec-mocks (3.1.3)
55
+ rspec-support (~> 3.1.0)
56
+ rspec-support (3.1.2)
57
+ safe_yaml (1.0.3)
58
+ slop (3.5.0)
59
+ term-ansicolor (1.3.0)
60
+ tins (~> 1.0)
61
+ thor (0.19.1)
62
+ thread_safe (0.3.4)
63
+ tins (1.3.3)
64
+ tzinfo (1.2.1)
65
+ thread_safe (~> 0.1)
66
+ webmock (1.18.0)
67
+ addressable (>= 2.3.6)
68
+ crack (>= 0.3.2)
69
+
70
+ PLATFORMS
71
+ ruby
72
+
73
+ DEPENDENCIES
74
+ activesupport
75
+ fakefs (~> 0.4)
76
+ hashie (~> 2.0)
77
+ pact-support!
78
+ pry
79
+ rake (~> 10.0.3)
80
+ webmock (~> 1.18.0)
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 James Fraser, Sergei Matheson, Brent Snook, Ronald Holshausen, Beth Skurrie
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,4 @@
1
+ # Pact Support
2
+
3
+ Provides shared code for the Pact gems
4
+
@@ -0,0 +1,4 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ Dir.glob('./lib/tasks/**/*.rake').each { |task| load task }
4
+ Dir.glob('./tasks/**/*.rake').each { |task| load task }
@@ -0,0 +1,164 @@
1
+ require 'pact/matchers/embedded_diff_formatter'
2
+ require 'pact/matchers/unix_diff_formatter'
3
+ require 'pact/matchers/list_diff_formatter'
4
+ require 'pact/shared/json_differ'
5
+ require 'pact/shared/text_differ'
6
+
7
+
8
+ module Pact
9
+
10
+ class Configuration
11
+
12
+ DIFF_FORMATTERS = {
13
+ :embedded => Pact::Matchers::EmbeddedDiffFormatter,
14
+ :unix => Pact::Matchers::UnixDiffFormatter,
15
+ :list => Pact::Matchers::ListDiffFormatter
16
+ }
17
+
18
+
19
+ class NilMatcher
20
+ def self.=~ other
21
+ other == nil ? 0 : nil
22
+ end
23
+ end
24
+
25
+ DIFF_FORMATTER_REGISTRATIONS = [
26
+ [/.*/, Pact::Matchers::UnixDiffFormatter],
27
+ [NilMatcher, Pact::Matchers::UnixDiffFormatter]
28
+ ]
29
+
30
+ DIFFERS = [
31
+ [/json/, Pact::JsonDiffer],
32
+ [NilMatcher, Pact::TextDiffer],
33
+ [/.*/, Pact::TextDiffer]
34
+ ]
35
+
36
+
37
+ DEFAULT_DIFFER = Pact::TextDiffer
38
+
39
+ attr_accessor :pact_dir
40
+ attr_accessor :log_dir
41
+ attr_accessor :tmp_dir
42
+
43
+ attr_writer :logger
44
+
45
+ attr_accessor :error_stream
46
+ attr_accessor :output_stream
47
+
48
+ def self.default_configuration
49
+ c = Configuration.new
50
+ c.pact_dir = File.expand_path('./spec/pacts')
51
+ c.tmp_dir = File.expand_path('./tmp/pacts')
52
+ c.log_dir = default_log_dir
53
+
54
+ c.output_stream = $stdout
55
+ c.error_stream = $stderr
56
+
57
+ c
58
+ end
59
+
60
+ def initialize
61
+ @differ_registrations = []
62
+ @diff_formatter_registrations = []
63
+ end
64
+
65
+ def logger
66
+ @logger ||= create_logger
67
+ end
68
+
69
+ # Should this be deprecated in favour of register_diff_formatter???
70
+ def diff_formatter= diff_formatter
71
+ register_diff_formatter /.*/, diff_formatter
72
+ register_diff_formatter nil, diff_formatter
73
+ end
74
+
75
+ def register_diff_formatter content_type, diff_formatter
76
+ key = content_type_regexp_for content_type
77
+ @diff_formatter_registrations << [key, diff_formatter_for(diff_formatter)]
78
+ end
79
+
80
+ def diff_formatter_for_content_type content_type
81
+ diff_formatter_registrations.find{ | registration | registration.first =~ content_type }.last
82
+ end
83
+
84
+ def register_body_differ content_type, differ
85
+ key = content_type_regexp_for content_type
86
+ validate_differ differ
87
+ @differ_registrations << [key, differ]
88
+ end
89
+
90
+ def body_differ_for_content_type content_type
91
+ differ_registrations.find{ | registration | registration.first =~ content_type }.last
92
+ end
93
+
94
+ def log_path
95
+ log_dir + "/pact.log"
96
+ end
97
+
98
+ private
99
+
100
+ def diff_formatter_for input
101
+ if DIFF_FORMATTERS[input]
102
+ DIFF_FORMATTERS[input]
103
+ elsif input.respond_to?(:call)
104
+ input
105
+ else
106
+ raise "Pact diff_formatter needs to respond to call, or be in the preconfigured list: #{DIFF_FORMATTERS.keys}"
107
+ end
108
+ end
109
+
110
+ def validate_differ differ
111
+ if !differ.respond_to?(:call)
112
+ raise "Pact.configuration.register_body_differ expects a differ that is a lamda or a class/object that responds to call."
113
+ end
114
+ end
115
+
116
+ def content_type_regexp_for content_type
117
+ case content_type
118
+ when String then Regexp.new(/^#{Regexp.escape(content_type)}$/)
119
+ when Regexp then content_type
120
+ when nil then NilMatcher
121
+ else
122
+ raise "Invalid content type used to register a differ (#{content_type.inspect}). Please use a Regexp or a String."
123
+ end
124
+ end
125
+
126
+ def differ_registrations
127
+ @differ_registrations + DIFFERS
128
+ end
129
+
130
+ def diff_formatter_registrations
131
+ @diff_formatter_registrations + DIFF_FORMATTER_REGISTRATIONS
132
+ end
133
+
134
+ def self.default_log_dir
135
+ File.expand_path("./log")
136
+ end
137
+
138
+ #Would love a better way of determining this! It sure won't work on windows.
139
+ def is_rake_running?
140
+ `ps -ef | grep rake | grep #{Process.ppid} | grep -v 'grep'`.size > 0
141
+ end
142
+
143
+ def create_logger
144
+ FileUtils::mkdir_p log_dir
145
+ logger = Logger.new(log_path)
146
+ logger.level = Logger::DEBUG
147
+ logger
148
+ end
149
+ end
150
+
151
+ def self.configuration
152
+ @configuration ||= Configuration.default_configuration
153
+ end
154
+
155
+ def self.configure
156
+ yield configuration
157
+ FileUtils::mkdir_p configuration.tmp_dir
158
+ end
159
+
160
+ def self.clear_configuration
161
+ @configuration = nil
162
+ end
163
+
164
+ end
@@ -0,0 +1,27 @@
1
+ require 'pact/shared/request'
2
+ require 'pact/shared/key_not_found'
3
+
4
+ module Pact
5
+ module Consumer
6
+ module Request
7
+ class Actual < Pact::Request::Base
8
+
9
+ def self.from_hash(hash)
10
+ sym_hash = symbolize_keys hash
11
+ method = sym_hash.fetch(:method)
12
+ path = sym_hash.fetch(:path)
13
+ query = sym_hash.fetch(:query)
14
+ headers = sym_hash.fetch(:headers)
15
+ body = sym_hash.fetch(:body, nil)
16
+ new(method, path, headers, body, query)
17
+ end
18
+
19
+ protected
20
+
21
+ def self.key_not_found
22
+ nil
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1 @@
1
+ require 'pact/consumer_contract/consumer_contract'
@@ -0,0 +1,114 @@
1
+ require 'pact/logging'
2
+ require 'pact/something_like'
3
+ require 'pact/symbolize_keys'
4
+ require 'pact/term'
5
+ require 'pact/shared/active_support_support'
6
+ require 'date'
7
+ require 'json/add/regexp'
8
+ require 'open-uri'
9
+ require_relative 'service_consumer'
10
+ require_relative 'service_provider'
11
+ require_relative 'interaction'
12
+ require_relative 'request'
13
+ require_relative 'pact_file'
14
+ require_relative 'file_name'
15
+
16
+
17
+
18
+ module Pact
19
+
20
+ class ConsumerContract
21
+
22
+ include SymbolizeKeys
23
+ include Logging
24
+ include FileName
25
+ include ActiveSupportSupport
26
+
27
+ attr_accessor :interactions
28
+ attr_accessor :consumer
29
+ attr_accessor :provider
30
+
31
+ def initialize(attributes = {})
32
+ @interactions = attributes[:interactions] || []
33
+ @consumer = attributes[:consumer]
34
+ @provider = attributes[:provider]
35
+ end
36
+
37
+ def to_hash
38
+ {
39
+ provider: @provider.as_json,
40
+ consumer: @consumer.as_json,
41
+ interactions: @interactions.collect(&:as_json),
42
+ metadata: {
43
+ pactSpecificationVersion: "1.0.0"
44
+ }
45
+ }
46
+ end
47
+
48
+ def as_json(options = {})
49
+ fix_all_the_things to_hash
50
+ end
51
+
52
+ def to_json(options = {})
53
+ as_json.to_json(options)
54
+ end
55
+
56
+ def self.from_hash(hash)
57
+ hash = symbolize_keys(hash)
58
+ new({
59
+ :interactions => hash[:interactions].collect { |hash| Interaction.from_hash(hash)},
60
+ :consumer => ServiceConsumer.from_hash(hash[:consumer]),
61
+ :provider => ServiceProvider.from_hash(hash[:provider])
62
+ })
63
+ end
64
+
65
+ def self.from_json string
66
+ deserialised_object = JSON.load(maintain_backwards_compatiblity_with_producer_keys(string))
67
+ from_hash(deserialised_object)
68
+ end
69
+
70
+ def self.from_uri uri, options = {}
71
+ from_json(Pact::PactFile.read(uri, options))
72
+ end
73
+
74
+ def self.maintain_backwards_compatiblity_with_producer_keys string
75
+ string.gsub('"producer":', '"provider":').gsub('"producer_state":', '"provider_state":')
76
+ end
77
+
78
+ def find_interaction criteria
79
+ interactions = find_interactions criteria
80
+ if interactions.size == 0
81
+ raise "Could not find interaction matching #{criteria} in pact file between #{consumer.name} and #{provider.name}."
82
+ elsif interactions.size > 1
83
+ raise "Found more than 1 interaction matching #{criteria} in pact file between #{consumer.name} and #{provider.name}."
84
+ end
85
+ interactions.first
86
+ end
87
+
88
+ def find_interactions criteria
89
+ interactions.select{ | interaction| interaction.matches_criteria?(criteria)}
90
+ end
91
+
92
+ def each
93
+ interactions.each do | interaction |
94
+ yield interaction
95
+ end
96
+ end
97
+
98
+ def pact_file_name
99
+ file_name consumer.name, provider.name
100
+ end
101
+
102
+ def pactfile_path
103
+ raise 'You must first specify a consumer and service name' unless (consumer && consumer.name && provider && provider.name)
104
+ @pactfile_path ||= file_path consumer.name, provider.name
105
+ end
106
+
107
+ def update_pactfile
108
+ logger.debug "Updating pact file for #{provider.name} at #{pactfile_path}"
109
+ File.open(pactfile_path, 'w') do |f|
110
+ f.write fix_json_formatting(JSON.pretty_generate(self))
111
+ end
112
+ end
113
+ end
114
+ end