lib/restapi/method_description.rb in restapi-0.0.4 vs lib/restapi/method_description.rb in restapi-0.0.5

- old
+ new

@@ -19,31 +19,38 @@ "#{Restapi.configuration.api_base_url}#{path}" end end - attr_reader :errors, :full_description, :method, :resource, :apis, :examples + attr_reader :errors, :full_description, :method, :resource, :apis, :examples, :see def initialize(method, resource, app) @method = method @resource = resource @apis = app.get_api_args + @see = app.get_see desc = app.get_description || '' @full_description = Restapi.markup_to_html(desc) @errors = app.get_errors @params_ordered = app.get_params @examples = app.get_examples + + @examples += load_recorded_examples parent = @resource.controller.superclass if parent != ActionController::Base @parent_resource = parent.controller_name end - @resource.add_method("#{resource._id}##{method}") + @resource.add_method(id) end + def id + "#{resource._id}##{method}" + end + def params params_ordered.reduce({}) { |h,p| h[p.name] = p; h } end def params_ordered @@ -62,15 +69,11 @@ merge_params(all_params, @params_ordered) all_params.find_all(&:validator) end def doc_url - [ - ENV["RAILS_RELATIVE_URL_ROOT"], - Restapi.configuration.doc_base_url, - "/#{@resource._id}/#{@method}" - ].join + Restapi.full_url("#{@resource._id}/#{@method}") end def method_apis_to_json @apis.each.collect do |api| { @@ -79,27 +82,68 @@ :short_description => api.short_description } end end + def see_url + if @see + method_description = Restapi[@see] + if method_description.nil? + raise ArgumentError.new("Method #{@see} referenced in 'see' does not exist.") + end + method_description.doc_url + end + end + + def see + @see + end + def to_json { :doc_url => doc_url, :name => @method, :apis => method_apis_to_json, :full_description => @full_description, :errors => @errors, :params => params_ordered.map(&:to_json).flatten, - :examples => @examples + :examples => @examples, + :see => @see, + :see_url => see_url } end private def merge_params(params, new_params) new_param_names = Set.new(new_params.map(&:name)) params.delete_if { |p| new_param_names.include?(p.name) } params.concat(new_params) + end + + def load_recorded_examples + (Restapi.recorded_examples[id] || []). + find_all { |ex| ex["show_in_doc"].to_i > 0 }. + sort_by { |ex| ex["show_in_doc"] }. + map { |ex| format_example(ex.symbolize_keys) } + end + + def format_example_data(data) + case data + when Array, Hash + JSON.pretty_generate(data).gsub(/: \[\s*\]/,": []").gsub(/\{\s*\}/,"{}") + else + data + end + end + + def format_example(ex) + example = "#{ex[:verb]} #{ex[:path]}" + example << "?#{ex[:query]}" unless ex[:query].blank? + example << "\n" << format_example_data(ex[:request_data]).to_s if ex[:request_data] + example << "\n" << ex[:code].to_s + example << "\n" << format_example_data(ex[:response_data]).to_s if ex[:response_data] + example end end end