lib/shapewear/dsl.rb in shapewear-0.0.1 vs lib/shapewear/dsl.rb in shapewear-0.0.2

- old
+ new

@@ -1,107 +1,29 @@ require 'builder' module Shapewear module DSL - def self.included(receiver) - receiver.extend(ClassMethods) + private + + def options + @options ||= {} end - #noinspection RubyArgCount,RubyResolve - module ClassMethods + protected - # reference: http://www.w3.org/TR/wsdl - def to_wsdl - tns = "http://shapewear.elementarsistemas.com.br/auto/#{self.name}.wsdl" - xsd = "http://shapewear.elementarsistemas.com.br/auto/#{self.name}.xsd" + def wsdl_namespace(ns) + options[:wsdl_namespace] = ns + end - xm = Builder::XmlMarkup.new + def schema_namespace(ns) + options[:schema_namespace] = ns + end - xm.instruct! - xm.definitions :name => self.name, 'targetNamespace' => tns, - 'xmlns' => 'http://schemas.xmlsoap.org/wsdl/', - 'xmlns:soap' => 'http://schemas.xmlsoap.org/wsdl/soap/', - 'xmlns:xsd1' => xsd, 'tns' => tns do |xdef| + def endpoint_url(url) + options[:endpoint_url] = url + end - xdef.types do |xtypes| - xtypes.schema 'xmlns' => 'http://www.w3.org/2000/10/XMLSchema', 'targetNamespace' => xsd do |xschema| - - # define elements for each defined method - instance_methods(false).each do |m| - build_type_elements_for_method(m, xschema) - end - end - end - - instance_methods(false).each do |m| - xdef.message :name => "#{m.camelize}Input" do |xmsg| - xmsg.part :name => :body, :element => "xsd1:#{m.camelize}Request" - end unless instance_method(m).arity == 0 - xdef.message :name => "#{m.camelize}Output" do |xmsg| - xmsg.part :name => :body, :element => "xsd1:#{m.camelize}" - end - end - - xdef.portType :name => "#{self.name}PortType" do |xpt| - instance_methods(false).each do |m| - xpt.operation :name => m.camelize do |xop| - xop.input :message => "tns:#{m.camelize}Input" unless instance_method(m).arity == 0 - xop.output :message => "tns:#{m.camelize}Output" - end - end - end - - xdef.binding :name => "#{self.name}Binding", :type => "tns:#{self.name}PortType" do |xbind| - xbind.tag! 'soap:binding', :style => 'document', :transport => 'http://schemas.xmlsoap.org/soap/http' - instance_methods(false).each do |m| - xbind.operation :name => m.camelize do |xop| - xbind.tag! 'soap:operation', :soapAction => "http://shapewear.elementarsistemas.com.br/auto/op/#{m.camelize}" - xbind.input { |xin| xin.tag! 'soap:body', :use => 'literal' } unless instance_method(m).arity == 0 - xbind.output { |xin| xin.tag! 'soap:body', :use => 'literal' } - end - end - end - - xdef.service :name => self.name do |xsrv| - xsrv.documentation "WSDL auto-generated by shapewear." - xsrv.port :name => "#{self.name}Port", :binding => "#{self.name}Binding" do |xport| - xport.tag! 'soap:address', :location => "..." # TODO: let the developer configure - end - end - end - end - - def build_type_elements_for_method(m, xschema) - # element for method arguments - um = instance_method(m) - - if um.arity > 0 - xschema.element :name => "#{m.camelize}Request" do |xreq| - xreq.complexType do |xct| - xct.all do |xall| - if um.respond_to?(:parameters) - # with Ruby 1.9, we can create the parameters with the correct names - params = um.parameters.select { |p| p.first == :in }.map &:first - else - params = (0..um.arity).map { |i| "arg#{i}" } - end - - params.each do |p| - xall.element :name => p, :type => 'xsd:string' # TODO: there must be a better way - end - end - end - end - end - - # element for method result - xschema.element :name => "#{m.camelize}" do |xreq| - xreq.complexType do |xct| - xct.all do |xall| - xall.element :name => 'result', :type => 'xsd:string' - end - end - end - end + def operation(name, ops = {}) + (options[:operations] ||= {})[name] = ops end end end