lib/pacto/contract_factory.rb in pacto-0.3.1 vs lib/pacto/contract_factory.rb in pacto-0.4.0.rc1

- old
+ new

@@ -1,22 +1,41 @@ +# -*- encoding : utf-8 -*- module Pacto class ContractFactory - attr_reader :schema + include Singleton + include Logger - def initialize(options = {}) - @schema = options[:schema] || MetaSchema.new + def initialize + @factories = {} end - def build(contract_files, host) - contract_files.map { |file| build_from_file(file, host) } + def add_factory(format, factory) + @factories[format.to_sym] = factory end - def build_from_file(contract_path, host) - contract_definition = File.read(contract_path) - definition = JSON.parse(contract_definition) - schema.validate definition - request = RequestClause.new(host, definition['request']) - response = ResponseClause.new(definition['response']) - Contract.new(request, response, contract_path, definition['name']) + def remove_factory(format) + @factories.delete format end + + def build(contract_files, host, format = :default) + factory = @factories[format.to_sym] + fail "No Contract factory registered for #{format}" if factory.nil? + + contract_files.map { |file| factory.build_from_file(file, host) }.flatten + end + + def load_contracts(contracts_path, host, format = :default) + factory = @factories[format.to_sym] + files = factory.files_for(contracts_path) + contracts = ContractFactory.build(files, host, format) + contracts + end + + class << self + extend Forwardable + def_delegators :instance, *ContractFactory.instance_methods(false) + end end end + +require 'pacto/native_contract_factory' +require 'pacto/swagger_contract_factory'