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'