You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by lu...@apache.org on 2010/07/09 01:38:10 UTC
svn commit: r962229 - in /incubator/deltacloud/trunk/server/libexec: ./
lib/deltacloud/ lib/sinatra/ views/ views/docs/
Author: lutter
Date: Thu Jul 8 23:38:10 2010
New Revision: 962229
URL: http://svn.apache.org/viewvc?rev=962229&view=rev
Log:
Factor validation and parameters into a separate module
Also fixes a bug where parameters with a fixed set of values were never
validated against those values. The issue was a naming problem in
Operation.control in rabbit.rb
Added:
incubator/deltacloud/trunk/server/libexec/lib/deltacloud/validation.rb
incubator/deltacloud/trunk/server/libexec/views/error.xml.haml
- copied, changed from r962228, incubator/deltacloud/trunk/server/libexec/views/error.html.haml
Removed:
incubator/deltacloud/trunk/server/libexec/lib/sinatra/validation.rb
incubator/deltacloud/trunk/server/libexec/views/error.html.haml
Modified:
incubator/deltacloud/trunk/server/libexec/lib/sinatra/rabbit.rb
incubator/deltacloud/trunk/server/libexec/server.rb
incubator/deltacloud/trunk/server/libexec/views/docs/collection.xml.haml
incubator/deltacloud/trunk/server/libexec/views/docs/operation.html.haml
incubator/deltacloud/trunk/server/libexec/views/docs/operation.xml.haml
Added: incubator/deltacloud/trunk/server/libexec/lib/deltacloud/validation.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/lib/deltacloud/validation.rb?rev=962229&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/lib/deltacloud/validation.rb (added)
+++ incubator/deltacloud/trunk/server/libexec/lib/deltacloud/validation.rb Thu Jul 8 23:38:10 2010
@@ -0,0 +1,61 @@
+module Deltacloud::Validation
+
+ class Failure < StandardError
+ attr_reader :param
+ def initialize(param, msg='')
+ super(msg)
+ @param = param
+ end
+
+ def name
+ param.name
+ end
+ end
+
+ class Param
+ attr_reader :name, :klass, :type, :options, :description
+
+ def initialize(args)
+ @name = args[0]
+ @klass = args[1] || :string
+ @type = args[2] || :optional
+ @options = args[3] || []
+ @description = args[4] || ''
+ end
+
+ def required?
+ type.eql?(:required)
+ end
+
+ def optional?
+ type.eql?(:optional)
+ end
+ end
+
+ def param(*args)
+ raise DuplicateParamException if params[args[0]]
+ p = Param.new(args)
+ params[p.name] = p
+ end
+
+ def params
+ @params ||= {}
+ @params
+ end
+
+ def each_param(&block)
+ params.each_value { |p| yield p }
+ end
+
+ def validate(values)
+ each_param do |p|
+ if p.required? and not values[p.name]
+ raise Failure.new(p, "Required parameter #{p.name} not found")
+ end
+ if values[p.name] and not p.options.empty? and
+ not p.options.include?(values[p.name])
+ raise Failure.new(p, "Parameter #{p.name} has value #{values[p.name]} which is not in #{p.options.join(", ")}")
+ end
+ end
+ end
+end
Modified: incubator/deltacloud/trunk/server/libexec/lib/sinatra/rabbit.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/lib/sinatra/rabbit.rb?rev=962229&r1=962228&r2=962229&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/lib/sinatra/rabbit.rb (original)
+++ incubator/deltacloud/trunk/server/libexec/lib/sinatra/rabbit.rb Thu Jul 8 23:38:10 2010
@@ -1,5 +1,6 @@
require 'sinatra/base'
require 'sinatra/url_for'
+require 'deltacloud/validation'
module Sinatra
@@ -8,11 +9,12 @@ module Sinatra
class DuplicateParamException < Exception; end
class DuplicateOperationException < Exception; end
class DuplicateCollectionException < Exception; end
- class ValidationFailure < Exception; end
class Operation
attr_reader :name, :method
+ include ::Deltacloud::Validation
+
STANDARD = {
:index => { :method => :get, :member => false },
:show => { :method => :get, :member => true },
@@ -29,7 +31,6 @@ module Sinatra
@method = opts[:method].to_sym
@member = opts[:member]
@description = ""
- @params = {}
instance_eval(&block) if block_given?
generate_documentation
end
@@ -54,23 +55,10 @@ module Sinatra
end
end
- def param(*args)
- raise DuplicateParamException if @params[args[0]]
- spec = {
- :class => args[1] || :string,
- :type => args[2] || :optional,
- :options => args[3] || [],
- :description => args[4] || '' }
- @params[args[0]] = spec
- end
-
- def params
- @params
- end
-
def control(&block)
+ op = self
@control = Proc.new do
- validate_parameters(params, @params)
+ op.validate(params)
instance_eval(&block)
end
end
Modified: incubator/deltacloud/trunk/server/libexec/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/server.rb?rev=962229&r1=962228&r2=962229&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/server.rb (original)
+++ incubator/deltacloud/trunk/server/libexec/server.rb Thu Jul 8 23:38:10 2010
@@ -9,8 +9,8 @@ require 'builder'
require 'drivers'
require 'sinatra/static_assets'
require 'sinatra/rabbit'
-require 'sinatra/validation'
require 'sinatra/lazy_auth'
+require 'deltacloud/validation'
configure do
set :raise_errors => false
@@ -64,6 +64,19 @@ def show(model)
end
end
+
+#
+# Error handlers
+#
+error Deltacloud::Validation::Failure do
+ @error = request.env['sinatra.error']
+ $stdout.flush
+ response.status = 400
+ respond_to do |format|
+ format.xml { haml :error, :layout => false }
+ end
+end
+
# Redirect to /api
get '/' do redirect '/api'; end
Modified: incubator/deltacloud/trunk/server/libexec/views/docs/collection.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/views/docs/collection.xml.haml?rev=962229&r1=962228&r2=962229&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/views/docs/collection.xml.haml (original)
+++ incubator/deltacloud/trunk/server/libexec/views/docs/collection.xml.haml Thu Jul 8 23:38:10 2010
@@ -5,10 +5,10 @@
- @operations.keys.sort_by { |k| k.to_s }.each do |operation|
%operation{:url => "/api/#{@collection.name.to_s}", :name => "#{operation}", :href => "#{@operations[operation].path}", :method => "#{@operations[operation].method}"}
%description #{@operations[operation].description}
- - @operations[operation].params.each_key do |p|
- %parameter{:name => "#{p}", :type => "#{@operations[operation].params[p][:type]}"}
- %class #{@operations[operation].params[p][:class]}
- - unless @operations[operation].params[p][:options].empty?
+ - @operations[operation].each_param do |param|
+ %parameter{:name => "#{param.name}", :type => "#{param.type}"}
+ %class #{param.klass}
+ - unless param.options.empty?
%values
- - @operations[operation].params[p][:options].each do |v|
+ - param.options.each do |v|
%value #{v}
Modified: incubator/deltacloud/trunk/server/libexec/views/docs/operation.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/views/docs/operation.html.haml?rev=962229&r1=962228&r2=962229&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/views/docs/operation.html.haml (original)
+++ incubator/deltacloud/trunk/server/libexec/views/docs/operation.html.haml Thu Jul 8 23:38:10 2010
@@ -22,10 +22,10 @@
%th Class
%th Valid values
%tbody
- - @operation.params.each_key do |p|
+ - @operation.each_param do |p|
%tr
%td{:style => "width:15em"}
- %em #{p}
- %td{:style => "width:10em"} #{@operation.params[p][:type]}
- %td #{@operation.params[p][:class]}
- %td{:style => "width:10em"} #{@operation.params[p][:options].join(',')}
+ %em #{p.name}
+ %td{:style => "width:10em"} #{p.type}
+ %td #{p.klass}
+ %td{:style => "width:10em"} #{p.options.join(',')}
Modified: incubator/deltacloud/trunk/server/libexec/views/docs/operation.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/views/docs/operation.xml.haml?rev=962229&r1=962228&r2=962229&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/views/docs/operation.xml.haml (original)
+++ incubator/deltacloud/trunk/server/libexec/views/docs/operation.xml.haml Thu Jul 8 23:38:10 2010
@@ -1,10 +1,10 @@
%docs{:status => "unsupported"}
%operation{:url => "/api/docs/#{@collection.name.to_s}", :name => "#{@operation.name.to_s}", :href => "#{@operation.path}", :method => "#{@operation.method}"}
%description #{@operation.description}
- - @operation.params.each_key do |p|
- %parameter{:name => "#{p}", :type => "#{@operation.params[p][:type]}"}
- %class #{@operation.params[p][:class]}
- - unless @operation.params[p][:options].empty?
+ - @operation.each_param do |param|
+ %parameter{:name => "#{param.name}", :type => "#{param.type}"}
+ %class #{param.klass}
+ - unless param.options.empty?
%values
- - @operation.params[p][:options].each do |v|
+ - param.options.each do |v|
%value #{v}
Copied: incubator/deltacloud/trunk/server/libexec/views/error.xml.haml (from r962228, incubator/deltacloud/trunk/server/libexec/views/error.html.haml)
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/libexec/views/error.xml.haml?p2=incubator/deltacloud/trunk/server/libexec/views/error.xml.haml&p1=incubator/deltacloud/trunk/server/libexec/views/error.html.haml&r1=962228&r2=962229&rev=962229&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/libexec/views/error.html.haml (original)
+++ incubator/deltacloud/trunk/server/libexec/views/error.xml.haml Thu Jul 8 23:38:10 2010
@@ -1,7 +1,7 @@
%error{:url => "#{request.env['REQUEST_URI']}"}
%parameter #{@error.name}
- %msg #{@error.msg}
- - unless @error.spec[:options].empty?
+ %message #{@error.message}
+ - unless @error.param.options.empty?
%valid_options
- - @error.spec[:options].each do |v|
+ - @error.param.options.each do |v|
%value #{v}