Skip to content

Commit

Permalink
chore: refactor and remove runtime dependency on pact gem
Browse files Browse the repository at this point in the history
  • Loading branch information
bethesque committed Sep 28, 2017
1 parent 69d3e5d commit b614fa8
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 31 deletions.
10 changes: 8 additions & 2 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ require 'conventional_changelog'

Dir.glob('lib/tasks/**/*.rake').each { |task| load "#{Dir.pwd}/#{task}" }
Dir.glob('tasks/**/*.rake').each { |task| load "#{Dir.pwd}/#{task}" }
RSpec::Core::RakeTask.new(:spec)
RSpec::Core::RakeTask.new(:spec) do | task |
task.rspec_opts = "--pattern spec/lib/**/*_spec.rb"
end

RSpec::Core::RakeTask.new('spec:providers') do | task |
task.rspec_opts = "--pattern spec/service_providers/**/*_spec.rb"
end

task :default => [:spec]
task :default => [:spec, 'spec:providers']

task :generate_changelog do
require 'pact_broker/client/version'
Expand Down
31 changes: 31 additions & 0 deletions lib/pact_broker/client/pact_file.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
require 'json'

module PactBroker
module Client
class PactFile
def initialize path
@path = path
end

def pact_name
"#{consumer_name}/#{provider_name} pact"
end

def consumer_name
pact_contents[:consumer][:name]
end

def provider_name
pact_contents[:provider][:name]
end

def pact_contents
@contents ||= JSON.parse(read, symbolize_names: true)
end

def read
@read ||= File.read(@path)
end
end
end
end
2 changes: 0 additions & 2 deletions lib/pact_broker/client/pacts.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
require 'pact/consumer_contract'
require_relative 'base_client'


module PactBroker
module Client
class Pacts < BaseClient
Expand Down
45 changes: 24 additions & 21 deletions lib/pact_broker/client/publish_pacts.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
require 'term/ansicolor'
require 'pact_broker/client'
require 'pact_broker/client/retry'
require 'pact_broker/client/pact_file'

module PactBroker
module Client
class PublishPacts

def self.call(pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options={})
new(pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options).call
def self.call(pact_broker_base_url, pact_file_paths, consumer_version, tags, pact_broker_client_options={})
new(pact_broker_base_url, pact_file_paths, consumer_version, tags, pact_broker_client_options).call
end

def initialize pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options={}
def initialize pact_broker_base_url, pact_file_paths, consumer_version, tags, pact_broker_client_options={}
@pact_broker_base_url = pact_broker_base_url
@pact_files = pact_files
@pact_file_paths = pact_file_paths
@consumer_version = consumer_version
@tags = tags
@pact_broker_client_options = pact_broker_client_options
Expand All @@ -28,22 +29,30 @@ def call

private

attr_reader :pact_broker_base_url, :pact_files, :consumer_version, :tags, :pact_broker_client_options
attr_reader :pact_broker_base_url, :pact_file_paths, :consumer_version, :tags, :pact_broker_client_options

def pact_broker_client
@pact_broker_client ||= PactBroker::Client::PactBrokerClient.new(base_url: pact_broker_base_url, client_options: pact_broker_client_options)
end

def publish_pacts
pact_files.collect{ | pact_file | publish_pact pact_file }.all?
pact_files.group_by(&:pact_name).collect do | pact_name, pact_files |
pact_files.collect do | pact_file |
publish_pact(pact_file)
end
end.flatten.all?
end

def pact_files
@pact_files ||= pact_file_paths.collect{ |pact_file_path| PactFile.new(pact_file_path) }
end

def publish_pact pact_file
begin
$stdout.puts ">> Publishing #{pact_file} to pact broker at #{pact_broker_base_url}"
publish_pact_contents File.read(pact_file)
$stdout.puts ">> Publishing #{pact_file.pact_name} to pact broker at #{pact_broker_base_url}"
publish_pact_contents pact_file
rescue => e
$stderr.puts "Failed to publish pact: #{pact_file} due to error: #{e.to_s}\n#{e.backtrace.join("\n")}"
$stderr.puts "Failed to publish #{pact_file.pact_name} due to error: #{e.class} - #{e}"
false
end
end
Expand All @@ -63,38 +72,32 @@ def tag_consumer_version tag
true
end
rescue => e
$stderr.puts "Failed to tag version #{consumer_version} of #{consumer_name} due to error: #{e.to_s}\n#{e.backtrace.join("\n")}"
$stderr.puts "Failed to tag version #{consumer_version} of #{consumer_name} due to error: #{e.class} - #{e}}"
false
end

def publish_pact_contents(pact_file_contents)
def publish_pact_contents(pact_file)
Retry.until_true do
contract = contract_from_file(pact_file_contents)
pacts = pact_broker_client.pacticipants.versions.pacts
if pacts.version_published?(consumer: contract.consumer.name, provider: contract.provider.name, consumer_version: consumer_version)
if pacts.version_published?(consumer: pact_file.consumer_name, provider: pact_file.provider_name, consumer_version: consumer_version)
$stdout.puts ::Term::ANSIColor.yellow("The given version of pact is already published. Will Overwrite...")
end

latest_pact_url = pacts.publish(pact_json: pact_file_contents, consumer_version: consumer_version)
latest_pact_url = pacts.publish(pact_json: pact_file.read, consumer_version: consumer_version)
$stdout.puts "The latest version of this pact can be accessed at the following URL (use this to configure the provider verification):\n#{latest_pact_url}"
true
end
end

def consumer_name
contract_from_file(File.read(pact_files.first)).consumer.name
end

def contract_from_file pact_file_contents
::Pact::ConsumerContract.from_json(pact_file_contents)
pact_files.first.consumer_name
end

def validate
raise "Please specify the consumer_version" unless (consumer_version && consumer_version.to_s.strip.size > 0)
raise "Please specify the pact_broker_base_url" unless (pact_broker_base_url && pact_broker_base_url.to_s.strip.size > 0)
raise "No pact files found" unless (pact_files && pact_files.any?)
raise "No pact files found" unless (pact_file_paths && pact_file_paths.any?)
end

end
end
end
2 changes: 1 addition & 1 deletion pact-broker-client.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ Gem::Specification.new do |gem|
gem.require_paths = ["lib"]
gem.license = 'MIT'

gem.add_runtime_dependency 'pact'
gem.add_runtime_dependency 'httparty'
gem.add_runtime_dependency 'json'
gem.add_runtime_dependency 'term-ansicolor'
Expand All @@ -32,4 +31,5 @@ Gem::Specification.new do |gem|
gem.add_development_dependency 'appraisal'
gem.add_development_dependency 'webmock', '~> 3.0'
gem.add_development_dependency 'conventional-changelog'
gem.add_development_dependency 'pact', '~> 1.16'
end
17 changes: 12 additions & 5 deletions spec/lib/pact_broker/client/publish_pacts_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module Client
allow(pacts_client).to receive(:publish).and_return(latest_pact_url)
allow(PactBroker::Client::PactBrokerClient).to receive(:new).with(base_url: pact_broker_base_url, client_options: pact_broker_client_options).and_return(pact_broker_client)
allow($stdout).to receive(:puts)
allow(Retry).to receive(:sleep)
end

after do
Expand All @@ -20,7 +21,7 @@ module Client

let(:latest_pact_url) { 'http://example.org/latest/pact' }
let(:pact_broker_client) { double("PactBroker::Client")}
let(:pact_files) { ['spec/pacts/consumer-provider.json']}
let(:pact_file_paths) { ['spec/pacts/consumer-provider.json']}
let(:consumer_version) { "1.2.3" }
let(:tags) { nil }
let(:pact_hash) { {consumer: {name: 'Consumer'}, provider: {name: 'Provider'}, interactions: [] } }
Expand All @@ -36,7 +37,7 @@ module Client
}
end

subject { PublishPacts.new(pact_broker_base_url, pact_files, consumer_version, tags, pact_broker_client_options) }
subject { PublishPacts.new(pact_broker_base_url, pact_file_paths, consumer_version, tags, pact_broker_client_options) }

before do
FileUtils.mkdir_p "spec/pacts"
Expand Down Expand Up @@ -66,14 +67,20 @@ module Client
end

context "when publishing one or more pacts fails" do
let(:pact_files) { ['spec/pacts/doesnotexist.json','spec/pacts/consumer-provider.json']}
let(:pact_file_paths) { ['spec/pacts/consumer-provider.json','spec/pacts/consumer-provider.json']}

before do
count = 0
allow(pacts_client).to receive(:publish) do | args |
count += 1
raise "test error" if count <= 3
latest_pact_url
end
allow($stderr).to receive(:puts)
end

it "logs an message to stderr" do
expect($stderr).to receive(:puts).with(/Failed to publish pact/)
expect($stderr).to receive(:puts).with(/Failed to publish Consumer\/Provider pact/)
subject.call
end

Expand All @@ -88,7 +95,7 @@ module Client
end

context "when no pact files are specified" do
let(:pact_files) { [] }
let(:pact_file_paths) { [] }
it "raises a validation error" do
expect { subject.call }.to raise_error(/No pact files found/)
end
Expand Down

0 comments on commit b614fa8

Please sign in to comment.