module PactBroker::Pacts::Service
Public Instance Methods
contract_published_event_comment(pact)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 265 def contract_published_event_comment pact if pact.consumer_version_tag_names.count == 1 message("messages.events.pact_published_unchanged_with_single_tag", tag_name: pact.consumer_version_tag_names.first) else message("messages.events.pact_published_unchanged_with_multiple_tags", tag_names: pact.consumer_version_tag_names.join(", ")) end end
create_or_update_pact(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 56 def create_or_update_pact params provider = pacticipant_repository.find_by_name_or_create params[:provider_name] consumer = pacticipant_repository.find_by_name_or_create params[:consumer_name] consumer_version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:consumer_version_number] existing_pact = pact_repository.find_by_version_and_provider(consumer_version.id, provider.id) if existing_pact create_pact_revision params, existing_pact else create_pact params, consumer_version, provider end end
delete(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 49 def delete params logger.info("Deleting pact version", params) pacts = pact_repository.find_all_revisions(params[:consumer_name], params[:consumer_version_number], params[:provider_name]) webhook_service.delete_all_webhook_related_objects_by_pact_publication_ids(pacts.collect(&:id)) pact_repository.delete(params) end
delete_all_pact_publications_between(consumer, options)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 86 def delete_all_pact_publications_between consumer, options pact_repository.delete_all_pact_publications_between consumer, options end
delete_all_pact_versions_between(consumer, options)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 90 def delete_all_pact_versions_between consumer, options pact_repository.delete_all_pact_versions_between consumer, options end
disallowed_modification?(existing_pact, new_pact_version_sha)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 187 def disallowed_modification?(existing_pact, new_pact_version_sha) !PactBroker.configuration.allow_dangerous_contract_modification && existing_pact && existing_pact.pact_version_sha != new_pact_version_sha end
find_all_pact_versions_between(consumer, options)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 82 def find_all_pact_versions_between consumer, options pact_repository.find_all_pact_versions_between consumer, options end
find_by_consumer_version(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 45 def find_by_consumer_version params pact_repository.find_by_consumer_version(params[:consumer_name], params[:consumer_version_number]) end
find_distinct_pacts_between(consumer, options)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 108 def find_distinct_pacts_between consumer, options # Assumes pacts are sorted from newest to oldest all = pact_repository.find_all_pact_versions_between consumer, options distinct = [] (0...all.size).each do | i | if i == all.size - 1 distinct << all[i] else if all[i].json_content != all[i+1].json_content distinct << all[i] end end end distinct end
find_for_verification(provider_name, provider_version_branch, provider_version_tags, consumer_version_selectors, options)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 124 def find_for_verification(provider_name, provider_version_branch, provider_version_tags, consumer_version_selectors, options) explicitly_specified_verifiable_pacts = pact_repository .find_for_verification(provider_name, consumer_version_selectors) .collect do | selected_pact | # Todo move this into the repository squash_pacts_for_verification(provider_version_tags, provider_version_branch, selected_pact, options[:include_pending_status]) end verifiable_wip_pacts = if options[:include_wip_pacts_since] pact_repository.find_wip_pact_versions_for_provider(provider_name, provider_version_branch, provider_version_tags, explicitly_specified_verifiable_pacts, options) else [] end explicitly_specified_verifiable_pacts + verifiable_wip_pacts end
find_for_verification_publication(pact_params, consumer_version_selector_hashes)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 141 def find_for_verification_publication(pact_params, consumer_version_selector_hashes) if consumer_version_selector_hashes&.any? selected_pacts = consumer_version_selector_hashes.collect do | consumer_version_selector_hash | find_pact_params = { consumer_name: pact_params.consumer_name, provider_name: pact_params.provider_name, pact_version_sha: pact_params.pact_version_sha, consumer_version_number: consumer_version_selector_hash[:consumer_version_number] } pact = find_pact(find_pact_params) resolved_selector = Selector.new(consumer_version_selector_hash.without(:consumer_version_number)).resolve(pact.consumer_version) SelectedPact.new(pact, Selectors.new(resolved_selector)) end SelectedPact.merge_by_consumer_version_number(selected_pacts) else [SelectedPact.new(find_pact(pact_params), Selectors.new)] end end
find_latest_pact(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 29 def find_latest_pact params pact_repository.find_latest_pact(params[:consumer_name], params[:provider_name], params[:tag], params[:branch_name]) end
find_latest_pacts()
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 37 def find_latest_pacts pact_repository.find_latest_pacts end
find_latest_pacts_for_provider(provider_name, options = {})
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 94 def find_latest_pacts_for_provider provider_name, options = {} pact_repository.find_latest_pacts_for_provider provider_name, options[:tag] end
find_pact(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 41 def find_pact params pact_repository.find_pact(params[:consumer_name], params[:consumer_version_number], params[:provider_name], params[:pact_version_sha]) end
find_pact_versions_for_provider(provider_name, options = {})
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 98 def find_pact_versions_for_provider provider_name, options = {} pact_repository.find_pact_versions_for_provider provider_name, options[:tag] end
find_previous_distinct_pact_version(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 102 def find_previous_distinct_pact_version params pact = find_pact params return nil if pact.nil? pact_repository.find_previous_distinct_pact pact end
generate_sha(json_content)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 25 def generate_sha(json_content) PactBroker.configuration.sha_generator.call(json_content) end
merge_pact(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 69 def merge_pact params provider = pacticipant_repository.find_by_name_or_create params[:provider_name] consumer = pacticipant_repository.find_by_name_or_create params[:consumer_name] consumer_version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:consumer_version_number] existing_pact = pact_repository.find_by_version_and_provider(consumer_version.id, provider.id) params[:json_content] = Merger.merge_pacts( existing_pact.json_content, params[:json_content] ) create_pact_revision params, existing_pact end
search_for_latest_pact(params)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 33 def search_for_latest_pact params pact_repository.search_for_latest_pact(params[:consumer_name], params[:provider_name], params[:tag]) end
Private Instance Methods
add_interaction_ids(json_content)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 220 def add_interaction_ids(json_content) Content.from_json(json_content).with_ids.to_json end
create_pact(params, version, provider)
click to toggle source
When no publication for the given consumer/provider/consumer version number exists
# File lib/pact_broker/pacts/service.rb, line 192 def create_pact(params, version, provider) logger.info("Creating new pact publication", params.without(:json_content)) logger.debug("Content #{params[:json_content]}") json_content = add_interaction_ids(params[:json_content]) pact = pact_repository.create( version_id: version.id, provider_id: provider.id, consumer_id: version.pacticipant_id, pact_version_sha: params.fetch(:pact_version_sha), json_content: json_content, version: version ) event_params = { event_context: { consumer_version_tags: pact.consumer_version_tag_names }, pact: pact } content_changed, explanation = pact_is_new_or_newly_tagged_or_pact_has_changed_since_previous_version?(pact) if content_changed broadcast(:contract_published, event_params) broadcast(:contract_content_changed, event_params.merge(event_comment: explanation)) else broadcast(:contract_published, event_params.merge(event_comment: contract_published_event_comment(pact))) end pact end
create_pact_revision(params, existing_pact)
click to toggle source
Overwriting an existing pact with the same consumer/provider/consumer version number by creating a new revision (that is, a new PactPublication
with an incremented revision number) Modifing pacts is strongly discouraged now, and support for it will be dropped in the next major version of the Pact
Broker
# File lib/pact_broker/pacts/service.rb, line 163 def create_pact_revision params, existing_pact logger.info("Updating existing pact publication", params.without(:json_content)) logger.debug("Content #{params[:json_content]}") pact_version_sha = params.fetch(:pact_version_sha) json_content = add_interaction_ids(params[:json_content]) update_params = { pact_version_sha: pact_version_sha, json_content: json_content } updated_pact = pact_repository.update(existing_pact.id, update_params) event_context = { consumer_version_tags: updated_pact.consumer_version_tag_names } event_params = { event_context: event_context, pact: updated_pact } broadcast(:contract_published, event_params) if existing_pact.pact_version_sha != updated_pact.pact_version_sha broadcast(:contract_content_changed, event_params.merge(event_comment: "pact content modified since previous publication for #{updated_pact.consumer_name} version #{updated_pact.consumer_version_number}")) else broadcast(:contract_content_unchanged, event_params.merge(event_comment: "pact content was unchanged")) end updated_pact end
explanation_for_content_changed(changed_pacts)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 242 def explanation_for_content_changed(changed_pacts) if changed_pacts.any? messages = changed_pacts.collect do |tag, previous_pact| if tag == :untagged if previous_pact "pact content has changed since previous untagged version" else "first time untagged pact published" end else if previous_pact "pact content has changed since the last consumer version tagged with #{tag}" else "first time any pact published for this consumer with consumer version tagged #{tag}" end end end messages.join(", ") end end
pact_is_new_or_newly_tagged_or_pact_has_changed_since_previous_version?(pact)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 226 def pact_is_new_or_newly_tagged_or_pact_has_changed_since_previous_version? pact changed_pacts = pact_repository .find_previous_pacts(pact) .reject { |_, previous_pact| !sha_changed_or_no_previous_version?(previous_pact, pact) } explanation = explanation_for_content_changed(changed_pacts) return changed_pacts.any?, explanation end
sha_changed_or_no_previous_version?(previous_pact, new_pact)
click to toggle source
# File lib/pact_broker/pacts/service.rb, line 236 def sha_changed_or_no_previous_version?(previous_pact, new_pact) previous_pact.nil? || new_pact.pact_version_sha != previous_pact.pact_version_sha end