diff --git a/lib/pacto/rake_task.rb b/lib/pacto/rake_task.rb index 6e18cb0..1328ad5 100644 --- a/lib/pacto/rake_task.rb +++ b/lib/pacto/rake_task.rb @@ -3,15 +3,14 @@ require 'thor' require 'pacto/cli' require 'pacto/cli/helpers' +require 'pacto/rake_task/generate_task' -# FIXME: RakeTask is a huge class, refactor this please -# rubocop:disable ClassLength module Pacto class RakeTask extend Forwardable include Thor::Actions include Rake::DSL - include Pacto::CLI::Helpers + include def initialize @exit_with_error = false @@ -43,11 +42,12 @@ def validate_task def generate_task desc 'Generates contracts from partial contracts' task :generate, :input_dir, :output_dir, :host do |_t, args| + puts args if args.to_a.size < 3 fail Pacto::UI.colorize('USAGE: rake pacto:generate[, , ]', :yellow) end - generate_contracts(args[:input_dir], args[:output_dir], args[:host]) + Pacto::RakeTask::GenerateTask.new(args[:input_dir], args[:output_dir], args[:host]).generate_contracts end end @@ -57,40 +57,7 @@ def meta_validate run(:meta_validate, *args) end end - - # rubocop:enable MethodLength - - # FIXME: generate_contracts is a big method =(. Needs refactoring - # rubocop:disable MethodLength - def generate_contracts(input_dir, output_dir, host) - WebMock.allow_net_connect! - generator = Pacto::Generator.contract_generator - puts "Generating contracts from partial contracts in #{input_dir} and recording to #{output_dir}\n\n" - - failed_contracts = [] - each_contract(input_dir) do |contract_file| - begin - contract = generator.generate_from_partial_contract(contract_file, host) - output_file = File.expand_path(File.basename(contract_file), output_dir) - output_file = File.open(output_file, 'wb') - output_file.write contract - output_file.flush - output_file.close - rescue InvalidContract => e - failed_contracts << contract_file - puts Pacto::UI.colorize(e.message, :red) - end - end - - if failed_contracts.empty? - puts Pacto::UI.colorize('Successfully generated all contracts', :green) - else - fail Pacto::UI.colorize("The following contracts could not be generated: #{failed_contracts.join ','}", :red) - end - end - # rubocop:enable MethodLength end end -# rubocop:enable ClassLength Pacto::RakeTask.new.install diff --git a/lib/pacto/rake_task/generate_task.rb b/lib/pacto/rake_task/generate_task.rb new file mode 100644 index 0000000..61280a9 --- /dev/null +++ b/lib/pacto/rake_task/generate_task.rb @@ -0,0 +1,51 @@ +module Pacto + class RakeTask + class GenerateTask + include Pacto::CLI::Helpers + + def initialize(input_dir, output_dir, host) + @input_dir, @output_dir, @host = input_dir, output_dir, host + @generator = Pacto::Generator.contract_generator + end + + def generate_contracts + WebMock.allow_net_connect! + show_initial_message + + self.failed_contracts = [] + each_contract(input_dir, &method(:generate_contract!)) + + show_final_message + end + + private + + attr_reader :generator, :input_dir, :output_dir, :host + attr_accessor :failed_contracts + + def generate_contract!(contract_file) + contract = generator.generate_from_partial_contract(contract_file, host) + output_file = File.expand_path(File.basename(contract_file), output_dir) + output_file = File.open(output_file, 'wb') + output_file.write contract + output_file.flush + output_file.close + rescue InvalidContract => e + failed_contracts << contract_file + puts Pacto::UI.colorize(e.message, :red) + end + + def show_initial_message + puts "Generating contracts from partial contracts in #{input_dir} and recording to #{output_dir}\n\n" + end + + def show_final_message + if failed_contracts.empty? + puts Pacto::UI.colorize('Successfully generated all contracts', :green) + else + fail Pacto::UI.colorize("The following contracts could not be generated: #{failed_contracts.join ','}", :red) + end + end + end + end +end