pact-message 0.7.0 → 0.11.1

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: d44fac4a872e57e964a935d228261c50773a4f90249bcdd979420b390b057b73
4
- data.tar.gz: ea1c430bf254ae94970eaedb568d578cab98d1e68d6ad9e0dcd16322e0775eb1
3
+ metadata.gz: 8ce8daa35756cfc3bf55b364cc91d123ab92be909f37d56fa237bcdb2a4051b2
4
+ data.tar.gz: d404290cbd697430bc277ef2298e37f17ab8c2770b999d0824cde92f8eafd306
5
5
  SHA512:
6
- metadata.gz: 4c9e77894059e089b6f3239727abe57425b2256d203b2ed6d66a6ee3b94f6ba063b9871198c18ace55dfb74a7d8c1d509f9ee17076df4d89c87657999a26b2fd
7
- data.tar.gz: 0230fe4dde29531395c5a8153ecf6e718669c412e0088e4eb957131d5c55a64ea4d7eaffc441816b7a8d9c1fa838ee798ee4148a7857e53736534616bc3ef8d5
6
+ metadata.gz: 6b5a5052f06c36a369453082962d74c893ca7a235efbfae622c7fa64b3f156267db773708e3ae0d783cbe39d7d620e97f7ad70f7a728aa7d4322ab11cd148f35
7
+ data.tar.gz: 551b8239e8bc1374405acfcee1f4dee500df58bd4a6f63bccee2f85fe5231ba680a4df4113685e1e8c30ff4b52cca8ba210d9032399d9ad0dc2c8553e5e7eed8
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: "Release gem"
3
+
4
+ on:
5
+ repository_dispatch:
6
+ types:
7
+ - release-triggered
8
+
9
+ jobs:
10
+ release:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ with:
15
+ fetch-depth: 0
16
+ - id: release-gem
17
+ uses: pact-foundation/release-gem@v0.0.11
18
+ env:
19
+ GEM_HOST_API_KEY: "${{ secrets.RUBYGEMS_API_KEY }}"
20
+ GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
21
+ INCREMENT: "${{ github.event.client_payload.increment }}"
22
+ outputs:
23
+ gem_name: "${{ steps.release-gem.outputs.gem_name }}"
24
+ version: "${{ steps.release-gem.outputs.version }}"
25
+ increment: "${{ steps.release-gem.outputs.increment }}"
26
+
27
+ notify-gem-released:
28
+ needs: release
29
+ strategy:
30
+ matrix:
31
+ repository: [pact-foundation/pact-ruby-cli, pact-foundation/pact-ruby-standalone]
32
+ runs-on: ubuntu-latest
33
+ steps:
34
+ - name: Notify ${{ matrix.repository }} of gem release
35
+ uses: peter-evans/repository-dispatch@v1
36
+ with:
37
+ token: ${{ secrets.GHTOKENFORPACTCLIRELEASE }}
38
+ repository: ${{ matrix.repository }}
39
+ event-type: gem-released
40
+ client-payload: |
41
+ {
42
+ "name": "${{ needs.release.outputs.gem_name }}",
43
+ "version": "${{ needs.release.outputs.version }}",
44
+ "increment": "${{ needs.release.outputs.increment }}"
45
+ }
@@ -0,0 +1,23 @@
1
+ name: Test
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: "ubuntu-latest"
8
+ continue-on-error: ${{ matrix.experimental }}
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby_version: ["2.2", "2.7"]
13
+ experimental: [false]
14
+ include:
15
+ - ruby_version: "3.0"
16
+ experimental: true
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby_version }}
22
+ - run: "bundle install"
23
+ - run: "bundle exec rake"
data/.gitignore CHANGED
@@ -12,3 +12,4 @@ spec/pacts/zoo_consumer-zoo_provider.json
12
12
 
13
13
  # rspec failure tracking
14
14
  .rspec_status
15
+ spec/pacts/
data/CHANGELOG.md CHANGED
@@ -1,3 +1,46 @@
1
+ <a name="v0.11.1"></a>
2
+ ### v0.11.1 (2021-04-20)
3
+
4
+ #### Bug Fixes
5
+
6
+ * JSON load message document so that the Ruby objects are created properly ([2bab66c](/../../commit/2bab66c))
7
+
8
+ <a name="v0.11.0"></a>
9
+ ### v0.11.0 (2021-03-22)
10
+
11
+ #### Features
12
+
13
+ * update thor dependancy ([87a5f64](/../../commit/87a5f64))
14
+
15
+ <a name="v0.10.0"></a>
16
+ ### v0.10.0 (2021-01-22)
17
+
18
+ #### Features
19
+
20
+ * allow pact-message update to receive JSON via the standard input ([5cbb664](/../../commit/5cbb664))
21
+
22
+ <a name="v0.9.0"></a>
23
+ ### v0.9.0 (2020-11-04)
24
+
25
+ #### Features
26
+
27
+ * allow pact dir to be configured ([f2f9626](/../../commit/f2f9626))
28
+ * verify that each message has been yielded ([1d4d92c](/../../commit/1d4d92c))
29
+
30
+ * **consumer**
31
+ * only update pact if test suite passes ([e99276d](/../../commit/e99276d))
32
+
33
+ <a name="v0.8.0"></a>
34
+ ### v0.8.0 (2020-09-28)
35
+
36
+ #### Features
37
+
38
+ * reify message when yielding ([d7c0a4a](/../../commit/d7c0a4a))
39
+
40
+ #### Bug Fixes
41
+
42
+ * fix bug in Message.to_hash ([e354cd2](/../../commit/e354cd2))
43
+
1
44
  <a name="v0.7.0"></a>
2
45
  ### v0.7.0 (2020-02-10)
3
46
 
data/README.md CHANGED
@@ -31,6 +31,7 @@ The key to using Message Pact is to completely separate the business logic that
31
31
  ### Consumer
32
32
 
33
33
  Not finished yet as nobody has asked for it. Ping @Beth Skurrie on slack.pact.io if you'd like use this.
34
+ Update: Done but not documented yet. See https://github.com/pact-foundation/pact-message-ruby/blob/master/spec/features/create_message_pact_spec.rb#L78 for an example.
34
35
 
35
36
  ### Provider
36
37
 
@@ -94,7 +95,56 @@ Provider states work the same way for Message Pact as they do for HTTP Pact. Ple
94
95
 
95
96
  ## Development
96
97
 
97
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
98
+ ### Setup
99
+
100
+ After checking out the repo, run the following to install dependencies.
101
+
102
+ ```bash
103
+ $ bundle exec bin/setup
104
+
105
+ bundle install
106
+ \+ bundle install
107
+ ...
108
+ Bundle complete! 6 Gemfile dependencies, 29 gems now installed.
109
+ Use `bundle info [gemname]` to see where a bundled gem is installed.
110
+
111
+ Do any other automated setup that you need to do here
112
+ ```
113
+
114
+ ### Tests
115
+
116
+ Run the following command to run the tests.
117
+
118
+ ```bash
119
+ $ bundle exec rake spec
120
+
121
+ the CLI
122
+ creates a pact file with the given message
123
+ creates a pact file with a message from the standard input
124
+ ...
125
+ Finished in 0.50883 seconds (files took 0.15053 seconds to load)
126
+ 26 examples, 0 failures, 2 pending
127
+ ```
128
+
129
+ ### Interactive Prompt
130
+
131
+ You can run the following command for an for an interactive prompt that will allow you to experiment.
132
+
133
+ ```bash
134
+ $ bundle exec bin/console
135
+ 2.6.6 :001 >
136
+ ```
137
+
138
+ To execute commands on the CLI run the following command followed by command line arguments as you would with the published version.
139
+
140
+ ```bash
141
+ $ bundle exec bin/pact-message
142
+ Commands:
143
+ pact-message help [COMMAND] # Describe available commands or one specific command
144
+ pact-message reify # Take a JSON document with embedded pact matchers and return...
145
+ pact-message update MESSAGE_JSON --consumer=CONSUMER --pact-dir=PACT_DIR --provider=PROVIDER # Update/create a pact. If MESSAGE_JSON is omitted or '-', it...
146
+ pact-message version # Show the pact-message gem version
147
+ ```
98
148
 
99
149
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
100
150
 
@@ -48,7 +48,7 @@ module Pact
48
48
  {
49
49
  description: description,
50
50
  provider_states: [{ name: provider_state }],
51
- contents: contents.to_hash,
51
+ contents: contents.contents,
52
52
  metadata: metadata
53
53
  }
54
54
  end
@@ -1,3 +1,4 @@
1
+ require 'pact/reification'
1
2
  module Pact
2
3
  class ConsumerContract
3
4
  class Message
@@ -15,13 +16,25 @@ module Pact
15
16
  end
16
17
 
17
18
  def to_s
18
- if @contents.is_a?(Hash) || @contents.is_a?(Array)
19
- @contents.to_json
19
+ if contents.is_a?(Hash) || contents.is_a?(Array)
20
+ contents.to_json
20
21
  else
21
- @contents.to_s
22
+ contents.to_s
22
23
  end
23
24
  end
24
25
 
26
+ def reified_contents_string
27
+ if contents.is_a?(Hash) || contents.is_a?(Array)
28
+ Pact::Reification.from_term(contents).to_json
29
+ else
30
+ Pact::Reification.from_term(contents).to_s
31
+ end
32
+ end
33
+
34
+ def reified_contents_hash
35
+ Pact::Reification.from_term(contents)
36
+ end
37
+
25
38
  def contents
26
39
  @contents
27
40
  end
@@ -9,13 +9,23 @@ module Pact
9
9
  method_option :pact_dir, required: true, desc: "The Pact directory"
10
10
  method_option :pact_specification_version, required: false, default: "2.0.0", desc: "The Pact Specification version"
11
11
 
12
- desc 'update MESSAGE_JSON', 'Update a pact with the given message, or create the pact if it does not exist. The MESSAGE_JSON may be in the legacy Ruby JSON format or the v2+ format.'
13
- def update(message)
12
+ # Update a pact with the given message, or create the pact if it does not exist
13
+ desc 'update MESSAGE_JSON', "Update/create a pact. If MESSAGE_JSON is omitted or '-', it is read from stdin"
14
+ long_desc <<-MSG, wrapping: false
15
+ Update a pact with the given message, or create the pact if it does not exist.
16
+ The MESSAGE_JSON may be in the legacy Ruby JSON format or the v2+ format.
17
+ If MESSAGE_JSON is not provided or is '-', the content will be read from
18
+ standard input.
19
+ MSG
20
+ def update(maybe_json = '-')
14
21
  require 'pact/message'
15
- require 'pact/message/consumer/update_pact'
22
+ require 'pact/message/consumer/write_pact'
23
+
24
+ message_object = JSON.load(maybe_json == '-' ? $stdin.read : maybe_json)
25
+
16
26
  pact_specification_version = Pact::SpecificationVersion.new(options.pact_specification_version)
17
- message = Pact::Message.from_hash(JSON.load(message), { pact_specification_version: pact_specification_version })
18
- Pact::Message::Consumer::UpdatePact.call(message, options.pact_dir, options.consumer, options.provider, options.pact_specification_version)
27
+ message_hash = Pact::Message.from_hash(message_object, { pact_specification_version: pact_specification_version })
28
+ Pact::Message::Consumer::WritePact.call(message_hash, options.pact_dir, options.consumer, options.provider, options.pact_specification_version, :update)
19
29
  end
20
30
 
21
31
  desc 'reify', "Take a JSON document with embedded pact matchers and return a concrete example"
@@ -29,6 +39,12 @@ module Pact
29
39
  require 'pact/message/version.rb'
30
40
  puts Pact::Message::VERSION
31
41
  end
42
+
43
+ no_commands do
44
+ def self.exit_on_failure?
45
+ true
46
+ end
47
+ end
32
48
  end
33
49
  end
34
50
  end
@@ -1,6 +1,6 @@
1
1
  require 'pact/message/consumer/consumer_contract_builder'
2
2
  require 'pact/message/consumer/consumer_contract_builders'
3
- # require 'pact/consumer/world'
3
+ require 'pact/message/consumer/world'
4
4
 
5
5
  module Pact
6
6
  module Message
@@ -40,11 +40,11 @@ module Pact
40
40
 
41
41
  def create_consumer_contract_builder
42
42
  consumer_contract_builder_fields = {
43
- :consumer_name => consumer_name,
44
- :provider_name => provider_name,
43
+ consumer_name: consumer_name,
44
+ provider_name: provider_name,
45
+ pact_specification_version: pact_specification_version,
46
+ pact_dir: Pact.configuration.pact_dir
45
47
  }
46
- # :pactfile_write_mode => Pact.configuration.pactfile_write_mode,
47
- # :pact_dir => Pact.configuration.pact_dir
48
48
  Pact::Message::Consumer::ConsumerContractBuilder.new consumer_contract_builder_fields
49
49
  end
50
50
 
@@ -58,7 +58,8 @@ module Pact
58
58
  Pact::Message::Consumer::ConsumerContractBuilders.send(:define_method, @name.to_sym) do
59
59
  consumer_contract_builder
60
60
  end
61
- # Pact.consumer_world.add_consumer_contract_builder consumer_contract_builder
61
+
62
+ Pact::Message.consumer_world.add_consumer_contract_builder consumer_contract_builder
62
63
  end
63
64
  end
64
65
  end
@@ -18,9 +18,13 @@ module Pact
18
18
  end
19
19
 
20
20
  dsl do
21
- def builder builder_name, &block
21
+ def mock_provider(builder_name, &block)
22
22
  self.builder = MessageBuilder.build(builder_name, consumer_name, name, &block)
23
23
  end
24
+
25
+ def builder(builder_name, &block)
26
+ expectation_builder(builder_name, &block)
27
+ end
24
28
  end
25
29
 
26
30
  def finalize
@@ -1,5 +1,6 @@
1
1
  require 'pact/message/consumer/interaction_builder'
2
- require 'pact/message/consumer/update_pact'
2
+ require 'pact/message/consumer/write_pact'
3
+ require 'pact/errors'
3
4
 
4
5
  module Pact
5
6
  module Message
@@ -10,39 +11,79 @@ module Pact
10
11
  @interaction_builder = nil
11
12
  @consumer_name = attributes[:consumer_name]
12
13
  @provider_name = attributes[:provider_name]
14
+ @pact_specification_version = attributes[:pact_specification_version]
15
+ @pact_dir = attributes[:pact_dir]
13
16
  @interactions = []
17
+ @yielded_interaction = false
14
18
  end
15
19
 
16
- def given(provider_state)
17
- interaction_builder.given(provider_state)
20
+ def reset
21
+ @interaction_builder = nil
22
+ @yielded_interaction = false
23
+ end
24
+
25
+ def given(provider_state, params = {})
26
+ interaction_builder.given(provider_state, params)
18
27
  end
19
28
 
20
29
  def is_expected_to_send(description)
21
30
  interaction_builder.is_expected_to_send(provider_state)
22
31
  end
23
32
 
24
- def send_message
25
- # TODO handle matchers
26
- yield @contents_string if block_given?
33
+ def send_message_string
34
+ if interaction_builder?
35
+ if block_given?
36
+ @yielded_interaction = true
37
+ yield interaction_builder.interaction.contents.reified_contents_string
38
+ end
39
+ else
40
+ raise Pact::Error.new("No message expectation has been defined")
41
+ end
42
+ end
43
+
44
+ def send_message_hash
45
+ if interaction_builder?
46
+ if block_given?
47
+ @yielded_interaction = true
48
+ yield interaction_builder.interaction.contents.reified_contents_hash
49
+ end
50
+ else
51
+ raise Pact::Error.new("No message expectation has been defined")
52
+ end
27
53
  end
28
54
 
29
55
  def handle_interaction_fully_defined(interaction)
56
+ @contents = interaction.contents
30
57
  @contents_string = interaction.contents.to_s
31
- @interactions << interaction
32
- @interaction_builder = nil
33
- # TODO pull these from pact config
34
- Pact::Message::Consumer::UpdatePact.call(interaction, "./spec/pacts", consumer_name, provider_name, "2.0.0")
35
58
  end
36
59
 
37
60
  def verify example_description
38
- #
39
- # TODO check that message was actually yielded
61
+ # There may be multiple message providers defined, and not every one of them
62
+ # has to define a message for every test.
63
+ if interaction_builder?
64
+ if yielded_interaction?
65
+ interactions << interaction_builder.interaction
66
+ else
67
+ raise Pact::Error.new("`send_message_string` was not called for message \"#{interaction_builder.interaction.description}\"")
68
+ end
69
+ end
70
+ end
71
+
72
+ def write_pact
73
+ Pact::Message::Consumer::WritePact.call(interactions, pact_dir, consumer_name, provider_name, pact_specification_version, :overwrite)
40
74
  end
41
75
 
42
76
  private
43
77
 
44
- attr_writer :interaction_builder
45
- attr_accessor :consumer_name, :provider_name, :consumer_contract_details
78
+ attr_accessor :consumer_name, :provider_name, :consumer_contract_details, :contents, :interactions, :pact_specification_version, :pact_dir
79
+
80
+ def interaction_builder?
81
+ !!@interaction_builder
82
+ end
83
+
84
+ def yielded_interaction?
85
+ @yielded_interaction
86
+ end
46
87
 
47
88
  def interaction_builder
48
89
  @interaction_builder ||=
@@ -17,13 +17,17 @@ module Pact
17
17
  self
18
18
  end
19
19
 
20
- def given provider_state
21
- @interaction.provider_state = provider_state.nil? ? nil : provider_state.to_s
20
+ def given name, params = {}
21
+ if name
22
+ @interaction.provider_states << Pact::ProviderState.new(name, params)
23
+ end
22
24
  self
23
25
  end
24
26
 
27
+ alias_method :and, :given
28
+
25
29
  def with_metadata(object)
26
- # TODO implement this
30
+ interaction.metadata = object
27
31
  self
28
32
  end
29
33
 
@@ -17,7 +17,9 @@ module Pact
17
17
  hash[:providerStates] = provider_states
18
18
  hash[:contents] = extract_contents
19
19
  hash[:matchingRules] = extract_matching_rules
20
- hash[:metaData] = message.metadata || {}
20
+ if message.metadata
21
+ hash[:metaData] = message.metadata
22
+ end
21
23
  fix_all_the_things hash
22
24
  end
23
25
 
@@ -42,9 +44,14 @@ module Pact
42
44
  end
43
45
 
44
46
  def extract_matching_rules
45
- {
46
- body: Pact::MatchingRules.extract(message.contents.contents, pact_specification_version: pact_specification_version)
47
- }
47
+ body_matching_rules = Pact::MatchingRules.extract(message.contents.contents, pact_specification_version: pact_specification_version)
48
+ if body_matching_rules.any?
49
+ {
50
+ body: body_matching_rules
51
+ }
52
+ else
53
+ {}
54
+ end
48
55
  end
49
56
 
50
57
  def pact_specification_version
@@ -20,7 +20,15 @@ hooks = Pact::Message::Consumer::SpecHooks.new
20
20
  RSpec.configure do |config|
21
21
  config.include Pact::Message::Consumer::RSpec, :pact => :message
22
22
 
23
- config.after :each, :pact => true do | example |
23
+ config.before :each, :pact => :message do | example |
24
+ hooks.before_each Pact::RSpec.full_description(example)
25
+ end
26
+
27
+ config.after :each, :pact => :message do | example |
24
28
  hooks.after_each Pact::RSpec.full_description(example)
25
29
  end
30
+
31
+ config.after :all do
32
+ hooks.after_suite
33
+ end
26
34
  end
@@ -1,12 +1,25 @@
1
+ require 'pact/message/consumer/world'
2
+
1
3
  module Pact
2
4
  module Message
3
5
  module Consumer
4
6
  class SpecHooks
7
+ def before_each example_description
8
+ Pact::Message.consumer_world.register_pact_example_ran
9
+ Pact::Message.consumer_world.consumer_contract_builders.each(&:reset)
10
+ end
11
+
5
12
  def after_each example_description
6
13
  Pact.configuration.message_provider_verifications.each do | message_provider_verification |
7
14
  message_provider_verification.call example_description
8
15
  end
9
16
  end
17
+
18
+ def after_suite
19
+ if Pact::Message.consumer_world.any_pact_examples_ran?
20
+ Pact::Message.consumer_world.consumer_contract_builders.each(&:write_pact)
21
+ end
22
+ end
10
23
  end
11
24
  end
12
25
  end
@@ -0,0 +1,36 @@
1
+ module Pact
2
+ module Message
3
+ def self.consumer_world
4
+ @consumer_world ||= Consumer::World.new
5
+ end
6
+
7
+ # internal api, for testing only
8
+ def self.clear_consumer_world
9
+ @consumer_world = nil
10
+ end
11
+
12
+ module Consumer
13
+ class World
14
+ def initialize
15
+ @any_pact_examples_ran = false
16
+ end
17
+
18
+ def consumer_contract_builders
19
+ @consumer_contract_builders ||= []
20
+ end
21
+
22
+ def add_consumer_contract_builder consumer_contract_builder
23
+ consumer_contract_builders << consumer_contract_builder
24
+ end
25
+
26
+ def register_pact_example_ran
27
+ @any_pact_examples_ran = true
28
+ end
29
+
30
+ def any_pact_examples_ran?
31
+ @any_pact_examples_ran
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -4,26 +4,27 @@ require 'pact/message/consumer/consumer_contract_decorator'
4
4
  module Pact
5
5
  module Message
6
6
  module Consumer
7
- class UpdatePact
7
+ class WritePact
8
8
 
9
- def initialize message, pact_dir, consumer_name, provider_name, pact_specification_version
9
+ def initialize messages, pact_dir, consumer_name, provider_name, pact_specification_version, pactfile_write_mode
10
10
  @pact_dir = pact_dir
11
- @message = message
11
+ @messages = messages
12
12
  @consumer_name = consumer_name
13
13
  @provider_name = provider_name
14
14
  @pact_specification_version = pact_specification_version
15
+ @pactfile_write_mode = pactfile_write_mode
15
16
  end
16
17
 
17
- def self.call(message, pact_dir, consumer_name, provider_name, pact_specification_version)
18
- new(message, pact_dir, consumer_name, provider_name, pact_specification_version).call
18
+ def self.call(messages, pact_dir, consumer_name, provider_name, pact_specification_version, pactfile_write_mode)
19
+ new(messages, pact_dir, consumer_name, provider_name, pact_specification_version, pactfile_write_mode).call
19
20
  end
20
21
 
21
22
  def call
22
23
  details = {
23
- consumer: {name: consumer_name},
24
- provider: {name: provider_name},
25
- interactions: [message],
26
- pactfile_write_mode: :update,
24
+ consumer: { name: consumer_name },
25
+ provider: { name: provider_name },
26
+ interactions: [*messages],
27
+ pactfile_write_mode: pactfile_write_mode,
27
28
  pact_dir: pact_dir,
28
29
  pact_specification_version: pact_specification_version,
29
30
  error_stream: StringIO.new,
@@ -36,7 +37,7 @@ module Pact
36
37
 
37
38
  private
38
39
 
39
- attr_reader :message, :pact_dir, :consumer_name, :provider_name, :pact_specification_version
40
+ attr_reader :messages, :pact_dir, :consumer_name, :provider_name, :pact_specification_version, :pactfile_write_mode
40
41
  end
41
42
  end
42
43
  end
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module Message
3
- VERSION = "0.7.0"
3
+ VERSION = "0.11.1"
4
4
  end
5
5
  end
@@ -0,0 +1 @@
1
+ require 'pact/message'
data/pact-message.gemspec CHANGED
@@ -34,10 +34,9 @@ Gem::Specification.new do |spec|
34
34
  # and Pact::ConsumerContractWriter. Potentially we should extract
35
35
  # or duplicate these classes to remove the pact-mock_service dependency.
36
36
  spec.add_runtime_dependency "pact-mock_service", "~> 3.1"
37
- spec.add_runtime_dependency "thor", "~> 0.20"
37
+ spec.add_runtime_dependency "thor", '>= 0.20', '< 2.0'
38
38
 
39
- spec.add_development_dependency "bundler", "~> 1.17.3"
40
- spec.add_development_dependency "rake", "~> 10.0"
39
+ spec.add_development_dependency "rake", "~> 12.3", ">= 12.3.3"
41
40
  spec.add_development_dependency "rspec", "~> 3.0"
42
41
  spec.add_development_dependency "pry-byebug"
43
42
  spec.add_development_dependency 'conventional-changelog', '~>1.2'
@@ -0,0 +1,30 @@
1
+ #!/bin/sh
2
+
3
+ # Script to trigger release of gem via the pact-foundation/release-gem action
4
+ # Requires a Github API token with repo scope stored in the
5
+ # environment variable GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES
6
+
7
+ : "${GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES:?Please set environment variable GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES}"
8
+
9
+ if [ -n "$1" ]; then
10
+ increment="\"${1}\""
11
+ else
12
+ increment="null"
13
+ fi
14
+
15
+ repository_slug=$(git remote get-url origin | cut -d':' -f2 | sed 's/\.git//')
16
+
17
+ output=$(curl -v https://api.github.com/repos/${repository_slug}/dispatches \
18
+ -H 'Accept: application/vnd.github.everest-preview+json' \
19
+ -H "Authorization: Bearer $GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES" \
20
+ -d "{\"event_type\": \"release-triggered\", \"client_payload\": {\"increment\": ${increment}}}" 2>&1)
21
+
22
+ if ! echo "${output}" | grep "HTTP\/.* 204" > /dev/null; then
23
+ echo "$output" | sed "s/${GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES}/********/g"
24
+ echo "Failed to trigger release"
25
+ exit 1
26
+ else
27
+ echo "Release workflow triggered"
28
+ fi
29
+
30
+ echo "See https://github.com/${repository_slug}/actions?query=workflow%3A%22Release+gem%22"
data/tasks/test.rake ADDED
@@ -0,0 +1,60 @@
1
+ require "rspec/core/rake_task"
2
+
3
+ ZOO_PACT_FILE_PATH = "spec/pacts/zoo_consumer-zoo_provider.json"
4
+
5
+ RSpec::Core::RakeTask.new(:pass) do | task |
6
+ task.pattern = "spec/features/create_message_pact_spec.rb"
7
+ end
8
+
9
+ RSpec::Core::RakeTask.new(:fail) do | task |
10
+ task.pattern = "spec/features/create_message_pact_with_failure_test.rb"
11
+ end
12
+
13
+ task :pass_writes_pact_file do
14
+ require 'json'
15
+ puts "Ensuring that pact file is written for successful test suites"
16
+ FileUtils.rm_rf(ZOO_PACT_FILE_PATH)
17
+ Rake::Task['pass'].execute
18
+ if !File.exist?(ZOO_PACT_FILE_PATH)
19
+ raise "Expected pact file to be written at #{ZOO_PACT_FILE_PATH}"
20
+ end
21
+
22
+ pact_hash = JSON.parse(File.read(ZOO_PACT_FILE_PATH))
23
+ if pact_hash['messages'].size < 2
24
+ raise "Expected pact file to contain more than 1 message"
25
+ end
26
+ end
27
+
28
+ task :fail_does_not_write_pact_file do
29
+ puts "Ensuring that pact file is NOT written for failed test suites"
30
+ FileUtils.rm_rf(ZOO_PACT_FILE_PATH)
31
+ expect_to_fail('bundle exec rake fail')
32
+ if File.exist?(ZOO_PACT_FILE_PATH)
33
+ raise "Expected pact file NOT to be written at #{ZOO_PACT_FILE_PATH}"
34
+ end
35
+ end
36
+
37
+ task :default => [:pass_writes_pact_file, :fail_does_not_write_pact_file]
38
+
39
+ def expect_to_fail command, options = {}
40
+ success = execute_command command, options
41
+ fail "Expected '#{command}' to fail" if success
42
+ end
43
+
44
+ def execute_command command, options
45
+ require 'open3'
46
+ result = nil
47
+ Open3.popen3(command) {|stdin, stdout, stderr, wait_thr|
48
+ result = wait_thr.value
49
+ ensure_patterns_present(command, options, stdout, stderr) if options[:with]
50
+ }
51
+ result.success?
52
+ end
53
+
54
+ def ensure_patterns_present command, options, stdout, stderr
55
+ require 'term/ansicolor'
56
+ output = stdout.read + stderr.read
57
+ options[:with].each do | pattern |
58
+ raise (::Term::ANSIColor.red("Could not find #{pattern.inspect} in output of #{command}") + "\n\n#{output}") unless output =~ pattern
59
+ end
60
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact-message
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Beth Skurrie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-13 00:00:00.000000000 Z
11
+ date: 2021-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pact-support
@@ -42,44 +42,42 @@ dependencies:
42
42
  name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.20'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '2.0'
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">="
53
56
  - !ruby/object:Gem::Version
54
57
  version: '0.20'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
58
+ - - "<"
60
59
  - !ruby/object:Gem::Version
61
- version: 1.17.3
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 1.17.3
60
+ version: '2.0'
69
61
  - !ruby/object:Gem::Dependency
70
62
  name: rake
71
63
  requirement: !ruby/object:Gem::Requirement
72
64
  requirements:
73
65
  - - "~>"
74
66
  - !ruby/object:Gem::Version
75
- version: '10.0'
67
+ version: '12.3'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 12.3.3
76
71
  type: :development
77
72
  prerelease: false
78
73
  version_requirements: !ruby/object:Gem::Requirement
79
74
  requirements:
80
75
  - - "~>"
81
76
  - !ruby/object:Gem::Version
82
- version: '10.0'
77
+ version: '12.3'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 12.3.3
83
81
  - !ruby/object:Gem::Dependency
84
82
  name: rspec
85
83
  requirement: !ruby/object:Gem::Requirement
@@ -146,9 +144,10 @@ executables:
146
144
  extensions: []
147
145
  extra_rdoc_files: []
148
146
  files:
147
+ - ".github/workflows/release_gem.yml"
148
+ - ".github/workflows/test.yml"
149
149
  - ".gitignore"
150
150
  - ".rspec"
151
- - ".travis.yml"
152
151
  - CHANGELOG.md
153
152
  - CONTRIBUTING.md
154
153
  - DEVELOPER_DOCUMENTATION.md
@@ -178,17 +177,21 @@ files:
178
177
  - lib/pact/message/consumer/interaction_decorator.rb
179
178
  - lib/pact/message/consumer/rspec.rb
180
179
  - lib/pact/message/consumer/spec_hooks.rb
181
- - lib/pact/message/consumer/update_pact.rb
180
+ - lib/pact/message/consumer/world.rb
181
+ - lib/pact/message/consumer/write_pact.rb
182
182
  - lib/pact/message/consumer_contract_parser.rb
183
183
  - lib/pact/message/version.rb
184
+ - lib/pact/pact-message.rb
184
185
  - pact-message.gemspec
185
186
  - script/docker-functions
186
187
  - script/functions
187
188
  - script/release.sh
188
189
  - script/release/bump-version.sh
189
190
  - script/release/generate-changelog.sh
191
+ - script/trigger-release.sh
190
192
  - script/update-pact.sh
191
193
  - tasks/release.rake
194
+ - tasks/test.rake
192
195
  homepage: http://pact.io
193
196
  licenses:
194
197
  - MIT
@@ -209,8 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
212
  - !ruby/object:Gem::Version
210
213
  version: '0'
211
214
  requirements: []
212
- rubyforge_project:
213
- rubygems_version: 2.7.7
215
+ rubygems_version: 3.2.16
214
216
  signing_key:
215
217
  specification_version: 4
216
218
  summary: Consumer contract library for messages
data/.travis.yml DELETED
@@ -1,33 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.2.4
5
- before_install:
6
- - rvm use @global
7
- - gem uninstall bundler -x || gem uninstall bundler -a || true
8
- - gem install bundler -v 1.17.3
9
- - bundler --version
10
- script:
11
- - rvm use @global
12
- - bundle exec rake
13
- jobs:
14
- include:
15
- - stage: gem release
16
- rvm: 2.2.4
17
- script: echo "Deploying to rubygems.org ..."
18
- deploy:
19
- provider: rubygems
20
- api_key:
21
- secure: NEA7BYENheSN8qF/6BP52uQjTS5U43MXsyxBeqxbp1JOkJxVSNzQw14xy41aXX0gphT7wEVHinnWS+1slLKXvu4OzGKKzcUsnekYFZoGW7eTyKUx7lh/XtFejQ/Mm4P5t75GBgMoaIi+Pa1rD4fcE7zYGrgCvTwIrOGb/SPIKILj0yT8UXMFod8yDDmxzivSSKYe4rgWYlq8aiidDZr2M5ypBR4WcOptCrkBCF8XxXzhFMY4QtrXLsLFRyCzCrDHmosCfC/bLJQltlJjLXfB5ksgaImWAD7wZ6Q4uC5QqmPShonQiPlLEh53Q5nkEWPIcsV7FVZqzXUjPN3LYHlRv+7D3AvbHmJggSt7fXr8YxbzVUkviBlKqNmc9cqM6CSO++QT3UShNgH5b03YKI8rRjFMWYKn1DrN5F5rFNDoGFcZtQSjFN5g/fEiSYsdkNsIeTp4YFxMkTztAYT8TxgcBvCnfXox6xDaLaPWh13UrUL2VL7O7uDK06xWUCp9Hm3/AXz0wRzya1tK9dCWamE5BOzk2ScOiLOgmpgwNHFVA1U93rkHq7Ixr11wazP3Dcinv0kWcW7hdMcI7VA0DUesxLKw6mkcQpd3NLgSU4mWtpoVFcmdERQUGsNM1d5NjGjBeyVMpC0I9NXM1Wv6cLENSX9b4GR7lkwGG/IHRFNciHk=
22
- gem: pact-message
23
- on:
24
- tags: true
25
- repo: pact-foundation/pact-message-ruby
26
- notifications:
27
- webhooks:
28
- urls:
29
- - https://webhooks.gitter.im/e/6523128341fad111ed79
30
- on_success: change
31
- on_failure: always
32
- on_start: never
33
-