From: Michal Fojtik <[email protected]>
---
server/lib/sinatra/rabbit.rb | 50 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/server/lib/sinatra/rabbit.rb b/server/lib/sinatra/rabbit.rb
index a2b1c3d..75c0789 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -36,6 +36,11 @@ module Sinatra
@description = ""
instance_eval(&block) if block_given?
generate_documentation
+ generate_options
+ end
+
+ def http_method
+ @method
end
def standard?
@@ -58,6 +63,21 @@ module Sinatra
end
end
+ def generate_options
+ current_operation = self
+
::Sinatra::Application.options("/api/#{current_operation.collection.name}/#{current_operation.name}")
do
+ required_params = current_operation.effective_params(driver).collect
do |name, validation|
+ name.to_s if validation.type.eql?(:required)
+ end.compact.join(',')
+ optional_params = current_operation.effective_params(driver).collect
do |name, validation|
+ name.to_s if validation.type.eql?(:optional)
+ end.compact.join(',')
+ headers 'X-Required-Parameters' => required_params
+ headers 'X-Optional-Parameters' => optional_params
+ [200, '']
+ end
+ end
+
def control(&block)
op = self
@control = Proc.new do
@@ -142,6 +162,8 @@ module Sinatra
@operations = {}
instance_eval(&block) if block_given?
generate_documentation
+ generate_head
+ generate_options
end
# Set/Return description for collection
@@ -152,6 +174,24 @@ module Sinatra
@description = text
end
+ def generate_head
+ current_collection = self
+ ::Sinatra::Application.head("/api/#{name}") do
+ methods_allowed = current_collection.operations.collect { |o|
o[1].method.to_s.upcase }.uniq.join(',')
+ headers 'Allow' => "HEAD,OPTIONS,#{methods_allowed}"
+ [200, '']
+ end
+ end
+
+ def generate_options
+ current_collection = self
+ ::Sinatra::Application.options("/api/#{name}") do
+ operations_allowed = current_collection.operations.collect { |o|
o[0] }.join(',')
+ headers 'X-Operations-Allowed' => operations_allowed
+ [200, '']
+ end
+ end
+
def generate_documentation
coll = self
::Sinatra::Application.get("/api/docs/#{@name}") do
@@ -288,3 +328,13 @@ class String
downcase
end
end
+
+configure do
+ class << Sinatra::Base
+ def options(path, opts={}, &block)
+ route 'OPTIONS', path, opts, &block
+ end
+ end
+ Sinatra::Delegator.delegate :options
+end
+
--
1.7.4