diff --git a/apipie-rails.gemspec b/apipie-rails.gemspec index e9713e1e9..c6264498d 100644 --- a/apipie-rails.gemspec +++ b/apipie-rails.gemspec @@ -16,7 +16,7 @@ Gem::Specification.new do |s| s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.require_paths = ["lib"] - s.add_dependency "rails", ">= 4.1" + s.add_dependency "rails", ">= 3.2" s.add_development_dependency "rspec-rails", "~> 3.0" s.add_development_dependency "sqlite3" s.add_development_dependency "minitest" diff --git a/app/controllers/apipie/apipies_controller.rb b/app/controllers/apipie/apipies_controller.rb index 1a5464746..287656648 100644 --- a/app/controllers/apipie/apipies_controller.rb +++ b/app/controllers/apipie/apipies_controller.rb @@ -74,6 +74,11 @@ def index @resource = @doc[:resources].first if params[:resource].present? @method = @resource[:methods].first if params[:method].present? @languages = Apipie.configuration.languages + + if Apipie.configuration.prerender_processor + @doc = Apipie.configuration.prerender_processor.call(@doc, params) + end + if @resource && @method render 'method' diff --git a/app/helpers/apipie_helper.rb b/app/helpers/apipie_helper.rb index 386b85bde..6d158776f 100644 --- a/app/helpers/apipie_helper.rb +++ b/app/helpers/apipie_helper.rb @@ -7,4 +7,13 @@ def heading(title, level=1) end end + def format_example_data(data) + case data + when Array, Hash + JSON.pretty_generate(data).gsub(/: \[\s*\]/,": []").gsub(/\{\s*\}/,"{}") + else + data + end + end + end diff --git a/app/views/apipie/apipies/_example.html.erb b/app/views/apipie/apipies/_example.html.erb new file mode 100644 index 000000000..f7aa4d43a --- /dev/null +++ b/app/views/apipie/apipies/_example.html.erb @@ -0,0 +1,12 @@ +<% if example["title"] && example["title"].present? %> +<%= example["title"] %> +<% end %> +<%= example["verb"] -%> <%= example["path"] -%> +<% if example["request_data"] -%> +<%= format_example_data(example["request_data"]).to_s %> +<% end %> +<%= example["code"] %> +<% if example["response_data"] -%> +<%= format_example_data(example["response_data"]).to_s %> +<% end %> + diff --git a/app/views/apipie/apipies/_method_detail.erb b/app/views/apipie/apipies/_method_detail.erb index 15767ecc4..cb0eaae29 100644 --- a/app/views/apipie/apipies/_method_detail.erb +++ b/app/views/apipie/apipies/_method_detail.erb @@ -22,6 +22,13 @@ <% end %> <% end %> +<% unless method[:examples_data].blank? %> + <%= heading(t('apipie.examples'), h_level) %> + <% method[:examples].each do |example| %> + <%= render(:partial => "example", :locals => {:example => example}) %> + <% end %> +<% end %> + <% unless method[:params].blank? %> <%= heading(t('apipie.params'), h_level) %> diff --git a/lib/apipie/configuration.rb b/lib/apipie/configuration.rb index 83048cf0a..bcf0b6f62 100644 --- a/lib/apipie/configuration.rb +++ b/lib/apipie/configuration.rb @@ -11,7 +11,7 @@ class Configuration :persist_show_in_doc, :authorize, :swagger_include_warning_tags, :swagger_content_type_input, :swagger_json_input_uses_refs, :swagger_suppress_warnings, :swagger_api_host, :swagger_generate_x_computed_id_field, - :swagger_allow_additional_properties_in_response, :swagger_responses_use_refs + :swagger_allow_additional_properties_in_response, :swagger_responses_use_refs, :render_examples_with_template, :prerender_processor alias_method :validate?, :validate alias_method :required_by_default?, :required_by_default @@ -143,6 +143,10 @@ def api_routes @api_routes || Rails.application.routes end + def prerender_processor=(lambda_processor) + @prerender_processor = lambda_processor + end + def initialize @markup = Apipie::Markup::RDoc.new @app_name = "Another API" @@ -181,6 +185,8 @@ def initialize @swagger_generate_x_computed_id_field = false @swagger_allow_additional_properties_in_response = false @swagger_responses_use_refs = true + @render_examples_with_template = false + @prerender_processor = nil end end end diff --git a/lib/apipie/method_description.rb b/lib/apipie/method_description.rb index 5bbd3315e..fcdb73bad 100644 --- a/lib/apipie/method_description.rb +++ b/lib/apipie/method_description.rb @@ -17,7 +17,7 @@ def initialize(method, path, desc, options) end - attr_reader :full_description, :method, :resource, :apis, :examples, :see, :formats, :metadata, :headers, :show + attr_reader :full_description, :method, :resource, :apis, :examples, :see, :formats, :metadata, :headers, :show, :examples_data def initialize(method, resource, dsl_data) @method = method.to_s @@ -47,6 +47,8 @@ def initialize(method, resource, dsl_data) @formats = dsl_data[:formats] @examples = dsl_data[:examples] @examples += load_recorded_examples + @examples_data = [] + @examples_data = load_recorded_examples_data if Apipie::configuration.render_examples_with_template @metadata = dsl_data[:meta] @@ -188,6 +190,7 @@ def to_json(lang=nil) :params => params_ordered.map{ |param| param.to_json(lang) }.flatten, :returns => @returns.map{ |return_item| return_item.to_json(lang) }.flatten, :examples => @examples, + :examples_data => @examples_data, :metadata => @metadata, :see => see.map(&:to_json), :headers => headers, @@ -232,6 +235,7 @@ def merge_returns(returns, new_returns) end def load_recorded_examples + return [] if Apipie::configuration.render_examples_with_template (Apipie.recorded_examples[id] || []). find_all { |ex| ex["show_in_doc"].to_i > 0 }. find_all { |ex| ex["versions"].nil? || ex["versions"].include?(self.version) }. @@ -239,6 +243,13 @@ def load_recorded_examples map { |ex| format_example(ex.symbolize_keys) } end + def load_recorded_examples_data + (Apipie.recorded_examples[id] || []). + find_all { |ex| ex["show_in_doc"].to_i > 0 }. + find_all { |ex| ex["versions"].nil? || ex["versions"].include?(self.version) }. + sort_by { |ex| ex["show_in_doc"] } + end + def format_example_data(data) case data when Array, Hash @@ -249,6 +260,7 @@ def format_example_data(data) end def format_example(ex) + example = "" example << "// #{ex[:title]}\n" if ex[:title].present? example << "#{ex[:verb]} #{ex[:path]}" @@ -257,6 +269,7 @@ def format_example(ex) example << "\n" << ex[:code].to_s example << "\n" << format_example_data(ex[:response_data]).to_s if ex[:response_data] example + end def concern_subst(string) diff --git a/lib/apipie/validator.rb b/lib/apipie/validator.rb index dc8c9d98d..2d7e5add7 100644 --- a/lib/apipie/validator.rb +++ b/lib/apipie/validator.rb @@ -336,7 +336,7 @@ def params_ordered end def validate(value) - return false if !value.is_a? Hash + return false if !value.respond_to? :keys if @hash_params @hash_params.each do |k, p| if Apipie.configuration.validate_presence? diff --git a/lib/apipie/version.rb b/lib/apipie/version.rb index 2ca3a7bff..b337965a5 100644 --- a/lib/apipie/version.rb +++ b/lib/apipie/version.rb @@ -1,3 +1,3 @@ module Apipie - VERSION = '0.5.15' + VERSION = '0.5.16' end diff --git a/lib/tasks/apipie.rake b/lib/tasks/apipie.rake index db0099075..15d5d8dc3 100644 --- a/lib/tasks/apipie.rake +++ b/lib/tasks/apipie.rake @@ -28,12 +28,18 @@ namespace :apipie do Apipie.url_prefix = "./#{subdir}" doc = Apipie.to_json(args[:version], nil, nil, lang) doc[:docs][:link_extension] = "#{lang_ext(lang)}.html" + + if Apipie.configuration.prerender_processor + doc[:docs] = Apipie.configuration.prerender_processor.call(doc[:docs], ENV) + end + generate_one_page(out, doc, lang) generate_plain_page(out, doc, lang) generate_index_page(out, doc, false, false, lang) Apipie.url_prefix = "../#{subdir}" generate_resource_pages(args[:version], out, doc, false, lang) Apipie.url_prefix = "../../#{subdir}" + generate_method_pages(args[:version], out, doc, false, lang) end end @@ -254,6 +260,9 @@ namespace :apipie do FileUtils.mkdir_p(File.dirname(resource_file_base)) unless File.exists?(File.dirname(resource_file_base)) doc = Apipie.to_json(version, resource_name, nil, lang) + if Apipie.configuration.prerender_processor + doc[:docs] = Apipie.configuration.prerender_processor.call(doc[:docs], ENV) + end doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html") render_page("#{resource_file_base}#{lang_ext(lang)}.html", "resource", {:doc => doc[:docs], :resource => doc[:docs][:resources].first, :language => lang, :languages => Apipie.configuration.languages}) @@ -268,6 +277,9 @@ namespace :apipie do FileUtils.mkdir_p(File.dirname(method_file_base)) unless File.exists?(File.dirname(method_file_base)) doc = Apipie.to_json(version, resource_name, method[:name], lang) + if Apipie.configuration.prerender_processor + doc[:docs] = Apipie.configuration.prerender_processor.call(doc[:docs], ENV) + end doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html") render_page("#{method_file_base}#{lang_ext(lang)}.html", "method", {:doc => doc[:docs], :resource => doc[:docs][:resources].first,