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,