diff --git a/lib/apipie/dsl_definition.rb b/lib/apipie/dsl_definition.rb index 59819f24..6e1a4a3e 100644 --- a/lib/apipie/dsl_definition.rb +++ b/lib/apipie/dsl_definition.rb @@ -523,6 +523,16 @@ def apipie_update_methods(methods, *args, &block) # backwards compatibility alias apipie_update_params apipie_update_methods + def apipie_lazy_update_methods(methods, &block) + methods.each do |method| + method_desc = Apipie.get_method_description(self, method) + unless method_desc + raise "Could not find method description for #{self}##{method}. Was the method defined?" + end + method_desc.lazy_update_blocks << [self, block] + end + end + def _apipie_concern_subst @_apipie_concern_subst ||= { controller_path: self.controller_path, @@ -575,6 +585,9 @@ def included(controller) _apipie_concern_update_api_blocks.each do |(methods, block)| controller.apipie_update_methods(methods, &block) end + _apipie_concern_lazy_update_api_blocks.each do |(methods, block)| + controller.apipie_lazy_update_methods(methods, &block) + end end def _apipie_concern_data @@ -585,6 +598,10 @@ def _apipie_concern_update_api_blocks @_apipie_concern_update_api_blocks ||= [] end + def _apipie_concern_lazy_update_api_blocks + @_apipie_concern_lazy_update_api_blocks ||= [] + end + def apipie_concern? true end @@ -604,6 +621,10 @@ def update_api(*methods, &block) _apipie_concern_update_api_blocks << [methods, block] end + def lazy_update_api(*methods, &block) + _apipie_concern_lazy_update_api_blocks << [methods, block] + end + end class ResourceDescriptionDsl diff --git a/lib/apipie/method_description.rb b/lib/apipie/method_description.rb index c618567b..a22902ca 100644 --- a/lib/apipie/method_description.rb +++ b/lib/apipie/method_description.rb @@ -1,7 +1,7 @@ module Apipie class MethodDescription attr_reader :full_description, :method, :resource, :apis, :examples, :see, :formats, :headers, :show - attr_accessor :metadata + attr_accessor :metadata, :lazy_update_blocks def initialize(method, resource, dsl_data) @method = method.to_s @@ -43,6 +43,7 @@ def initialize(method, resource, dsl_data) else true end + @lazy_update_blocks = [] end def id @@ -73,6 +74,14 @@ def params_ordered all_params.find_all(&:validator) end + def eval_lazy_update_blocks + lazy_update_blocks.each do |(context, block)| + dsl_data = context._apipie_eval_dsl(&block) + context._apipie_update_params(self, dsl_data) + context._apipie_update_meta(self, dsl_data) + end + end + def returns_self @returns end @@ -159,6 +168,7 @@ def formats end def to_json(lang = nil) + eval_lazy_update_blocks { :doc_url => doc_url, :name => @method,