apipie-rails 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/README.rdoc +8 -10
  2. data/app/controllers/apipie/apipies_controller.rb +12 -4
  3. data/app/views/apipie/apipies/_disqus.html.erb +11 -0
  4. data/app/views/apipie/apipies/apipie_404.html.erb +12 -0
  5. data/app/views/apipie/apipies/method.html.erb +1 -1
  6. data/app/views/apipie/apipies/resource.html.erb +1 -1
  7. data/app/views/layouts/apipie/apipie.html.erb +4 -15
  8. data/lib/apipie-rails.rb +1 -0
  9. data/lib/apipie/apipie_module.rb +10 -2
  10. data/lib/apipie/client/base.rb +131 -0
  11. data/lib/apipie/client/{template/cli_command.rb.tt → cli_command.rb} +21 -22
  12. data/lib/apipie/client/generator.rb +33 -30
  13. data/lib/apipie/client/{template/bin.rb.tt → main.rb} +13 -30
  14. data/lib/apipie/client/{template/rest_client_oauth.rb.tt → rest_client_oauth.rb} +1 -11
  15. data/lib/apipie/client/template/{client.gemspec.tt → a_name.gemspec.tt} +1 -0
  16. data/lib/apipie/client/template/bin/bin.rb.tt +30 -0
  17. data/lib/apipie/client/template/lib/a_name.rb.tt +27 -0
  18. data/lib/apipie/client/template/{cli.rb.tt → lib/a_name/commands/cli.rb.tt} +5 -8
  19. data/lib/apipie/client/template/lib/a_name/config.yml +6 -0
  20. data/lib/apipie/client/template/lib/a_name/resources/resource.rb.tt +22 -0
  21. data/lib/apipie/client/template/{version.rb.tt → lib/a_name/version.rb.tt} +0 -0
  22. data/lib/apipie/client/thor.rb +19 -0
  23. data/lib/apipie/dsl_definition.rb +3 -3
  24. data/lib/apipie/errors.rb +38 -0
  25. data/lib/apipie/helpers.rb +17 -0
  26. data/lib/apipie/param_description.rb +19 -10
  27. data/lib/apipie/resource_description.rb +2 -2
  28. data/lib/apipie/validator.rb +13 -33
  29. data/lib/apipie/version.rb +1 -1
  30. data/lib/tasks/apipie.rake +5 -0
  31. data/rubygem-apipie-rails.spec +80 -41
  32. data/spec/controllers/users_controller_spec.rb +20 -17
  33. data/spec/dummy/app/controllers/users_controller.rb +1 -0
  34. data/spec/dummy/app/views/layouts/application.html.erb +14 -7
  35. data/spec/dummy/config/initializers/apipie.rb +15 -0
  36. data/spec/lib/param_description_spec.rb +0 -0
  37. data/spec/lib/parameter_description_spec.rb +41 -0
  38. metadata +50 -40
  39. data/lib/apipie/client/template/base.rb.tt +0 -55
  40. data/lib/apipie/client/template/client.rb.tt +0 -13
  41. data/lib/apipie/client/template/resource.rb.tt +0 -19
@@ -73,6 +73,7 @@ of full descriptions.
73
73
  need RedCloth. Add those to your gemfile and run bundle if you
74
74
  want to use them. You can also add any other markup language
75
75
  processor.
76
+ [layout] Name of a layout template to use instead of Apipie's layout. You can use Apipie.include_stylesheets and Apipie.include_javascripts helpers to include Apipie's stylesheets and javascripts.
76
77
 
77
78
  Example:
78
79
 
@@ -313,13 +314,8 @@ So we create apipie_validators.rb initializer with this content:
313
314
  end
314
315
  end
315
316
 
316
- def error
317
- "Parameter \#{@param_name} expecting to be \#{@type.name},
318
- got: \#{@error_value.class.name}"
319
- end
320
-
321
317
  def description
322
- "Parameter has to be #{@type}."
318
+ "Must be #{@type}."
323
319
  end
324
320
  end
325
321
 
@@ -362,8 +358,10 @@ or delete it if you want to use 'normal' dynamic version again.
362
358
 
363
359
  == {Extractor}[https://github.com/Pajk/apipie-rails/wiki/Extractor]
364
360
 
365
- == Future features
361
+ == Authors
362
+
363
+ {Pajk}[https://github.com/Pajk] and {iNecas}[https://github.com/iNecas]
364
+
365
+ == Contributors
366
366
 
367
- * Dynamic CLI client (read info from documentation API)
368
- * Add documentation json API description to readme
369
- * Possibility to create requests from web documentation and check responses
367
+ See {Contributors page}[https://github.com/Pajk/apipie-rails/graphs/contributors]. Special thanks to all of them!
@@ -1,6 +1,6 @@
1
1
  module Apipie
2
2
  class ApipiesController < ActionController::Base
3
- layout 'apipie/apipie'
3
+ layout Apipie.configuration.layout
4
4
 
5
5
  def index
6
6
  respond_to do |format|
@@ -44,11 +44,19 @@ module Apipie
44
44
  @doc = @doc[:docs]
45
45
  if params[:resource].present? && params[:method].present?
46
46
  @resource = @doc[:resources].first
47
- @method = @resource[:methods].first
48
- render 'method'
47
+ @method = @resource[:methods].first unless @resource == 'null'
48
+ if @resource == 'null' || @method == 'null'
49
+ render 'apipie_404', :status => 404
50
+ else
51
+ render 'method'
52
+ end
49
53
  elsif params[:resource].present?
50
54
  @resource = @doc[:resources].first
51
- render 'resource'
55
+ if @resource == 'null'
56
+ render 'apipie_404', :status => 404
57
+ else
58
+ render 'resource'
59
+ end
52
60
  else
53
61
  render 'index'
54
62
  end
@@ -0,0 +1,11 @@
1
+ <div id="disqus_thread"></div>
2
+ <script type="text/javascript">
3
+ var disqus_shortname = "<%= Apipie.configuration.disqus_shortname %>";
4
+ (function() {
5
+ var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
6
+ dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
7
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
8
+ })();
9
+ </script>
10
+ <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
11
+ <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
@@ -0,0 +1,12 @@
1
+ <h1 class='page-header'>
2
+ Oops!
3
+ <small>
4
+ <% if @resource == 'null' %>
5
+ Resource <code><%= params[:resource] %></code> not found.
6
+ <% else %>
7
+ Method <code><%= params[:method] %></code> not found for resource <code><%= params[:resource] %></code>.
8
+ <% end %>
9
+ </small>
10
+ </h1>
11
+
12
+ Try going to <a href='<%= @doc[:doc_url] %>.html'><%= @doc[:name] %> API documentation homepage</a>
@@ -29,7 +29,7 @@
29
29
  <% unless @method[:examples].blank? %>
30
30
  <h2>Examples</h2>
31
31
  <% @method[:examples].each do |example| %>
32
- <pre><%= example %></pre>
32
+ <pre class="prettyprint"><%= example %></pre>
33
33
  <% end %>
34
34
  <% end %>
35
35
 
@@ -64,7 +64,7 @@
64
64
  <% unless m[:examples].blank? %>
65
65
  <h3>Examples</h3>
66
66
  <% m[:examples].each do |example| %>
67
- <pre><%= example %></pre>
67
+ <pre class="prettyprint"><%= example %></pre>
68
68
  <% end %>
69
69
  <% end %>
70
70
 
@@ -3,13 +3,8 @@
3
3
  <head>
4
4
  <title>API documentation</title>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
6
- <% %w[bundled/bootstrap.min.css
7
- application.css
8
- bundled/prettify.css
9
- bundled/bootstrap-responsive.min.css ].each do |file| %>
10
- <link type="text/css" rel="stylesheet"
11
- href="<%= Apipie.full_url("stylesheets/#{file}") %>"/>
12
- <% end %>
6
+ <%= Apipie.include_stylesheets %>
7
+ <link type='text/css' rel='stylesheet' href='<%= Apipie.full_url("stylesheets/application.css")%>'/>
13
8
  <!-- IE6-8 support of HTML5 elements -->
14
9
  <!--[if lt IE 9]>
15
10
  <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
@@ -20,18 +15,12 @@
20
15
  <div class="row">
21
16
  <div id='container'>
22
17
  <%= yield %>
18
+ <%= render 'disqus' if Apipie.configuration.use_disqus? %>
23
19
  </div>
24
20
  </div>
25
21
  <hr>
26
22
  <footer><%= yield :apipie_footer %></footer>
27
23
  </div>
28
- <% %w[
29
- bundled/jquery-1.7.2.js
30
- bundled/bootstrap-collapse.js
31
- bundled/prettify.js
32
- apipie.js ].each do |file| %>
33
- <script type="text/javascript"
34
- src="<%= Apipie.full_url("javascripts/#{file}") %>"></script>
35
- <% end %>
24
+ <%= Apipie.include_javascripts %>
36
25
  </body>
37
26
  </html>
@@ -4,6 +4,7 @@ require "apipie/apipie_module"
4
4
  require "apipie/method_description"
5
5
  require "apipie/resource_description"
6
6
  require "apipie/param_description"
7
+ require "apipie/errors"
7
8
  require "apipie/error_description"
8
9
  require "apipie/validator"
9
10
  require "apipie/dsl_definition"
@@ -26,10 +26,11 @@ module Apipie
26
26
  end
27
27
 
28
28
  class Configuration
29
- attr_accessor :app_name, :app_info, :copyright, :markup,
30
- :validate, :api_base_url, :doc_base_url
29
+ attr_accessor :app_name, :app_info, :copyright, :markup, :disqus_shortname,
30
+ :validate, :api_base_url, :doc_base_url, :required_by_default, :layout
31
31
 
32
32
  alias_method :validate?, :validate
33
+ alias_method :required_by_default?, :required_by_default
33
34
 
34
35
  # matcher to be used in Dir.glob to find controllers to be reloaded e.g.
35
36
  #
@@ -87,6 +88,10 @@ module Apipie
87
88
  @generated_doc_disclaimer ||= "# DOC GENERATED AUTOMATICALLY: REMOVE THIS LINE TO PREVENT REGENARATING NEXT TIME"
88
89
  end
89
90
 
91
+ def use_disqus?
92
+ !@disqus_shortname.blank?
93
+ end
94
+
90
95
  def app_info
91
96
  Apipie.markup_to_html(@app_info)
92
97
  end
@@ -97,8 +102,11 @@ module Apipie
97
102
  @app_info = "Another API description"
98
103
  @copyright = nil
99
104
  @validate = true
105
+ @required_by_default = false
100
106
  @api_base_url = ""
101
107
  @doc_base_url = "/apipie"
108
+ @layout = "apipie/apipie"
109
+ @disqus_shortname = nil
102
110
  end
103
111
  end
104
112
 
@@ -0,0 +1,131 @@
1
+ require 'rest_client'
2
+ require 'oauth'
3
+ require 'json'
4
+ require 'apipie/client/rest_client_oauth'
5
+
6
+ module Apipie::Client
7
+
8
+ class Base
9
+ attr_reader :client, :config
10
+
11
+ def initialize(config, options = { })
12
+ @client = RestClient::Resource.new config[:base_url],
13
+ :user => config[:username],
14
+ :password => config[:password],
15
+ :oauth => config[:oauth],
16
+ :headers => { :content_type => 'application/json',
17
+ :accept => 'application/json' }
18
+ @config = config
19
+ end
20
+
21
+ def call(method, path, params = { }, headers = { })
22
+ headers ||= { }
23
+
24
+ args = [method]
25
+ if [:post, :put].include?(method)
26
+ args << params.to_json
27
+ else
28
+ headers[:params] = params if params
29
+ end
30
+
31
+ args << headers if headers
32
+ process_data client[path].send(*args)
33
+ end
34
+
35
+ def self.doc
36
+ raise NotImplementedError
37
+ end
38
+
39
+ def self.validation_hash(method)
40
+ validation_hashes[method.to_s]
41
+ end
42
+
43
+ def self.method_doc(method)
44
+ method_docs[method.to_s]
45
+ end
46
+
47
+ def validate_params!(params, rules)
48
+ return unless params.is_a?(Hash)
49
+
50
+ invalid_keys = params.keys.map(&:to_s) - (rules.is_a?(Hash) ? rules.keys : rules)
51
+ raise ArgumentError, "Invalid keys: #{invalid_keys.join(", ")}" unless invalid_keys.empty?
52
+
53
+ if rules.is_a? Hash
54
+ rules.each do |key, sub_keys|
55
+ validate_params!(params[key], sub_keys) if params[key]
56
+ end
57
+ end
58
+ end
59
+
60
+ protected
61
+
62
+ def process_data(response)
63
+ data = begin
64
+ JSON.parse(response.body)
65
+ rescue JSON::ParserError
66
+ response.body
67
+ end
68
+ return data, response
69
+ end
70
+
71
+ def check_params(params, options = { })
72
+ raise ArgumentError unless (method = options[:method])
73
+ return unless config[:enable_validations]
74
+
75
+ case options[:allowed]
76
+ when true
77
+ validate_params!(params, self.class.validation_hash(method))
78
+ when false
79
+ raise ArgumentError, "this method '#{method}' does not support params" if params && !params.empty?
80
+ else
81
+ raise ArgumentError, "options :allowed should be true or false, it was #{options[:allowed]}"
82
+ end
83
+ end
84
+
85
+ # @return url and rest of the params
86
+ def fill_params_in_url(url, params)
87
+ params ||= { }
88
+ # insert param values
89
+ url_param_names = params_in_path(url)
90
+ url = params_in_path(url).inject(url) do |url, param_name|
91
+ param_value = params[param_name] or
92
+ raise ArgumentError, "missing param '#{param_name}' in parameters"
93
+ url.sub(":#{param_name}", param_value.to_s)
94
+ end
95
+
96
+ return url, params.reject { |param_name, _| url_param_names.include? param_name }
97
+ end
98
+
99
+ private
100
+
101
+ def self.method_docs
102
+ @method_docs ||= doc['methods'].inject({ }) do |hash, method|
103
+ hash[method['name']] = method
104
+ hash
105
+ end
106
+ end
107
+
108
+ def self.validation_hashes
109
+ @validation_hashes ||= method_docs.inject({ }) do |hash, pair|
110
+ name, method_doc = pair
111
+ hash[name] = construct_validation_hash method_doc
112
+ hash
113
+ end
114
+ end
115
+
116
+ def self.construct_validation_hash(method)
117
+ if method['params'].any? { |p| p['params'] }
118
+ method['params'].reduce({ }) do |h, p|
119
+ h.update(p['name'] => (p['params'] ? p['params'].map { |pp| pp['name'] } : nil))
120
+ end
121
+ else
122
+ method['params'].map { |p| p['name'] }
123
+ end
124
+ end
125
+
126
+ def params_in_path(url)
127
+ url.scan(/:([^\/]*)/).map { |m| m.first }
128
+ end
129
+
130
+ end
131
+ end
@@ -1,34 +1,33 @@
1
- module <%= class_base %><%= class_suffix %>
1
+ module Apipie::Client
2
2
  class CliCommand < Thor
3
3
  no_tasks do
4
4
  def client
5
- resource_class = <%= class_base %><%= class_suffix %>::Resources.const_get(self.class.name[/[^:]*$/])
6
- @client ||= resource_class.new(<%= class_base %><%= class_suffix %>.client_config)
5
+ resource_class = apipie_options[:client_module]::Resources.const_get(self.class.name[/[^:]*$/])
6
+ @client ||= resource_class.new(apipie_options[:config])
7
7
  end
8
8
 
9
- def transform_options(inline_params, transform_hash = {})
10
- ret = inline_params.map { |p| options[p] }
11
-
9
+ def transform_options(inline_params, transform_hash = { })
12
10
  # we use not mentioned params without change
13
- transformed_options = (options.keys - transform_hash.values.flatten - inline_params).reduce({}) { |h, k| h.update(k => options[k]) }
11
+ transformed_options = (options.keys - transform_hash.values.flatten - inline_params).reduce({ }) { |h, k| h.update(k => options[k]) }
12
+
13
+ inline_params.each { |p| transformed_options[p] = options[p] }
14
14
 
15
15
  transform_hash.each do |sub_key, params|
16
- transformed_options[sub_key] = {}
16
+ transformed_options[sub_key] = { }
17
17
  params.each { |p| transformed_options[sub_key][p] = options[p] if options.has_key?(p) }
18
18
  end
19
19
 
20
- ret << transformed_options
21
- return *ret
20
+ return transformed_options
22
21
  end
23
22
 
24
23
  def print_data(data)
25
24
  case data
26
- when Array
27
- print_big_table(table_from_array(data))
28
- when Hash
29
- print_table(table_from_hash(data))
30
- else
31
- print_unknown(data)
25
+ when Array
26
+ print_big_table(table_from_array(data))
27
+ when Hash
28
+ print_table(table_from_hash(data))
29
+ else
30
+ print_unknown(data)
32
31
  end
33
32
  end
34
33
 
@@ -49,8 +48,8 @@ module <%= class_base %><%= class_suffix %>
49
48
 
50
49
  def table_from_array(data)
51
50
  return [] if data.empty?
52
- table = []
53
- items = data.map { |item| normalize_item_data(item) }
51
+ table = []
52
+ items = data.map { |item| normalize_item_data(item) }
54
53
  columns = items.first.keys
55
54
  table << columns
56
55
  items.each do |item|
@@ -64,7 +63,7 @@ module <%= class_base %><%= class_suffix %>
64
63
  return [] if data.empty?
65
64
  table = []
66
65
  normalize_item_data(data).each do |k, v|
67
- table << ["#{k}:",v].map(&:to_s)
66
+ table << ["#{k}:", v].map(&:to_s)
68
67
  end
69
68
  table
70
69
  end
@@ -73,7 +72,7 @@ module <%= class_base %><%= class_suffix %>
73
72
  say data
74
73
  end
75
74
 
76
- def print_big_table(table, options={})
75
+ def print_big_table(table, options={ })
77
76
  return if table.empty?
78
77
 
79
78
  formats, ident, colwidth = [], options[:ident].to_i, options[:colwidth]
@@ -83,7 +82,7 @@ module <%= class_base %><%= class_suffix %>
83
82
  start = colwidth ? 1 : 0
84
83
 
85
84
  start.upto(table.first.length - 2) do |i|
86
- maxima ||= table.max{|a,b| a[i].size <=> b[i].size }[i].size
85
+ maxima ||= table.max { |a, b| a[i].size <=> b[i].size }[i].size
87
86
  formats << "%-#{maxima + 2}s"
88
87
  end
89
88
 
@@ -113,7 +112,7 @@ module <%= class_base %><%= class_suffix %>
113
112
  Thor::Util.thor_classes_in(self).each do |klass|
114
113
  list += printable_tasks(false)
115
114
  end
116
- list.sort!{ |a,b| a[0] <=> b[0] }
115
+ list.sort! { |a, b| a[0] <=> b[0] }
117
116
 
118
117
  shell.say
119
118
  shell.print_table(list, :indent => 2, :truncate => true)
@@ -5,6 +5,7 @@ require 'thor'
5
5
  require 'thor/group'
6
6
  require 'fileutils'
7
7
  require 'active_support/inflector'
8
+ require 'apipie/client/base'
8
9
 
9
10
  module Apipie
10
11
  module Client
@@ -17,7 +18,7 @@ module Apipie
17
18
  argument :subject
18
19
  argument :suffix
19
20
 
20
- attr_reader :doc, :resource
21
+ attr_reader :doc, :resource, :resource_key
21
22
 
22
23
  def initialize(*args)
23
24
  super
@@ -33,7 +34,7 @@ module Apipie
33
34
  end
34
35
 
35
36
  def self.start(client_name, subject = :all, suffix = '_client')
36
- name = client_name.parameterize.underscore
37
+ name = client_name.parameterize.underscore
37
38
  suffix = suffix.parameterize.underscore
38
39
  super([name, subject, suffix], :destination_root => destination_root(name, suffix))
39
40
  end
@@ -47,22 +48,21 @@ module Apipie
47
48
  template("README.tt", "README")
48
49
  template("Gemfile.tt", "Gemfile")
49
50
  template("Rakefile.tt", "Rakefile")
50
- template("client.gemspec.tt", "#{full_name}.gemspec")
51
- template("client.rb.tt", "lib/#{full_name}.rb")
52
- template("base.rb.tt", "lib/#{full_name}/base.rb")
53
- template("rest_client_oauth.rb.tt", "lib/#{full_name}/rest_client_oauth.rb")
54
- template("version.rb.tt", "lib/#{full_name}/version.rb")
51
+ template("a_name.gemspec.tt", "#{full_name}.gemspec")
52
+ template("lib/a_name.rb.tt", "lib/#{full_name}.rb")
53
+ template("lib/a_name/version.rb.tt", "lib/#{full_name}/version.rb")
54
+ create_file "lib/#{full_name}/documentation.json", JSON.dump(Apipie.to_json)
55
+ copy_file "lib/a_name/config.yml", "lib/#{full_name}/config.yml"
55
56
  if all?
56
- template("bin.rb.tt", "bin/#{full_name}")
57
+ template("bin/bin.rb.tt", "bin/#{full_name}")
57
58
  chmod("bin/#{full_name}", 0755)
58
- template("cli_command.rb.tt", "lib/#{full_name}/cli_command.rb")
59
59
  end
60
60
  doc[:resources].each do |key, resource|
61
- @resource = resource
61
+ @resource_key, @resource = key, resource
62
62
  if all?
63
- template("cli.rb.tt", "lib/#{full_name}/commands/#{resource_name}.thor")
63
+ template("lib/a_name/commands/cli.rb.tt", "lib/#{full_name}/commands/#{resource_name}.thor")
64
64
  end
65
- template("resource.rb.tt", "lib/#{full_name}/resources/#{resource_name}.rb")
65
+ template("lib/a_name/resources/resource.rb.tt", "lib/#{full_name}/resources/#{resource_name}.rb")
66
66
  end
67
67
  end
68
68
 
@@ -82,13 +82,13 @@ module Apipie
82
82
  end
83
83
 
84
84
  def plaintext(text)
85
- text.gsub(/<.*?>/, '').gsub("\n",' ').strip
85
+ text.gsub(/<.*?>/, '').gsub("\n", ' ').strip
86
86
  end
87
87
 
88
88
  # Resource related helper methods:
89
89
 
90
90
  def resource_name
91
- resource[:name].gsub(/\s/,"_").downcase.singularize
91
+ resource[:name].gsub(/\s/, "_").downcase.singularize
92
92
  end
93
93
 
94
94
  def api(method)
@@ -100,31 +100,34 @@ module Apipie
100
100
  end
101
101
 
102
102
  def client_args(method)
103
- client_args = params_in_path(method).dup
104
- client_args << "params = {}"
105
- client_args << 'headers = {}'
106
- client_args
107
- end
108
-
109
- def validation_hash(method)
110
- if method[:params].any? { |p| p[:params] }
111
- method[:params].reduce({}) do |h, p|
112
- h.update(p[:name] => (p[:params] ? p[:params].map { |pp| pp[:name] } : nil))
113
- end
114
- else
115
- method[:params].map { |p| p[:name] }
116
- end
103
+ params_in_path(method).dup
117
104
  end
118
105
 
119
106
  def substituted_url(method)
120
- params_in_path(method).reduce(api(method)[:api_url]) { |u, p| u.sub(":#{p}","\#{#{p}}")}
107
+ params_in_path(method).reduce(api(method)[:api_url]) { |u, p| u.sub(":#{p}", "\#{#{p}}") }
121
108
  end
122
109
 
123
110
  def transformation_hash(method)
124
- method[:params].find_all { |p| p[:expected_type] == "hash" && !p[:params].nil? }.reduce({}) do |h, p|
111
+ method[:params].find_all { |p| p[:expected_type] == "hash" && !p[:params].nil? }.reduce({ }) do |h, p|
125
112
  h.update(p[:name] => p[:params].map { |pp| pp[:name] })
126
113
  end
127
114
  end
115
+
116
+ def validation(method)
117
+ stringify = lambda do |object|
118
+ case object
119
+ when Hash
120
+ clone = object.dup
121
+ object.keys.each { |key| clone[key.to_s] = stringify[clone.delete(key)] }
122
+ clone
123
+ when Array
124
+ object.map { |value| stringify[value] }
125
+ else
126
+ object
127
+ end
128
+ end
129
+ Apipie::Client::Base.construct_validation_hash(stringify[method])
130
+ end
128
131
  end
129
132
 
130
133
  end