Module: Pactflow::Client::CLI::ProviderContractCommands

Included in:
Pactflow
Defined in:
lib/pactflow/client/cli/provider_contract_commands.rb

Class Method Summary collapse

Class Method Details

.included(thor) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/pactflow/client/cli/provider_contract_commands.rb', line 11

def self.included(thor)
  thor.class_eval do
    desc 'publish-provider-contract CONTRACT_FILE ...', "Publish provider contract to PactFlow"
    method_option :provider, required: true, desc: "The provider name"
    method_option :provider_app_version, required: true, aliases: "-a", desc: "The provider application version"
    method_option :branch, aliases: "-h", desc: "Repository branch of the provider version"
    #method_option :auto_detect_version_properties, hidden: true, type: :boolean, default: false, desc: "Automatically detect the repository branch from known CI environment variables or git CLI."
    method_option :tag, aliases: "-t", type: :array, banner: "TAG", desc: "Tag name for provider version. Can be specified multiple times."
    #method_option :tag_with_git_branch, aliases: "-g", type: :boolean, default: false, required: false, desc: "Tag consumer version with the name of the current git branch."
    method_option :specification, default: "oas", desc: "The contract specification"
    method_option :content_type, desc: "The content type. eg. application/yml"
    method_option :verification_success, type: :boolean, desc: "Whether or not the self verification passed successfully."
    method_option :verification_exit_code, type: :numeric, desc: "The exit code of the verification process. Can be used instead of --verification-success|--no-verification-success for a simpler build script."
    method_option :verification_results, desc: "The path to the file containing the output from the verification process"
    method_option :verification_results_content_type, desc: "The content type of the verification output eg. text/plain, application/yaml"
    method_option :verification_results_format, desc: "The format of the verification output eg. junit, text"
    method_option :verifier, desc: "The tool used to verify the provider contract"
    method_option :verifier_version, desc: "The version of the tool used to verify the provider contract"
    method_option :build_url, desc: "The build URL that created the provider contract"

    output_option_json_or_text
    shared_authentication_options

    def publish_provider_contract(provider_contract_path)
      require "pactflow/client/provider_contracts/publish"

      validate_pact_broker_url
      validate_publish_provider_contract_options(provider_contract_path)
      result = ::Pactflow::Client::ProviderContracts::Publish.call(
                  publish_provider_contract_command_params(provider_contract_path),
                  command_options,
                  pact_broker_client_options
                )
      $stdout.puts result.message
      exit(1) unless result.success
    end

    no_commands do
      def command_options
        { verbose: options.verbose, output: options.output }
      end

      def validate_pact_broker_url
        if pact_broker_client_options[:pact_broker_base_url].blank?
          raise Thor::Error, "No value provided for required option --broker-base-url or environment variable PACT_BROKER_BASE_URL"
        end
      end

      def validate_publish_provider_contract_options(provider_contract_path)
        if !options.verification_success.nil? && options.verification_exit_code
          raise Thor::Error, "Cannot use both --verification-success|--no-verification-success and --verification-exit-code"
        end
      end

      def publish_provider_contract_command_params(provider_contract_path)
        success = !options.verification_success.nil? ? options.verification_success : ( options.verification_exit_code && options.verification_exit_code == 0 )

        {
          provider_name: options.provider.strip,
          provider_version_number: options.provider_app_version.strip,
          branch_name: options.branch && options.branch.strip,
          tags: (options.tag && options.tag.collect(&:strip)) || [],
          build_url: options.build_url,
          contract: {
            content: File.read(provider_contract_path),
            content_type: options.content_type,
            specification: options.specification
          },
          verification_results: {
            success: success,
            content: options.verification_results ? File.read(options.verification_results) : nil,
            content_type: options.verification_results_content_type,
            format: options.verification_results_format,
            verifier: options.verifier,
            verifier_version: options.verifier_version
          }
        }
      end
    end
  end
end