apipierails3 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +17 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +27 -0
  5. data/APACHE-LICENSE-2.0 +202 -0
  6. data/CHANGELOG.md +469 -0
  7. data/Gemfile +1 -0
  8. data/Gemfile.rails32 +6 -0
  9. data/Gemfile.rails41 +6 -0
  10. data/Gemfile.rails42 +11 -0
  11. data/Gemfile.rails50 +6 -0
  12. data/Gemfile.rails51 +7 -0
  13. data/MIT-LICENSE +20 -0
  14. data/NOTICE +4 -0
  15. data/PROPOSAL_FOR_RESPONSE_DESCRIPTIONS.md +244 -0
  16. data/README.rst +1874 -0
  17. data/Rakefile +13 -0
  18. data/apipierails3.gemspec +27 -0
  19. data/app/controllers/apipie/apipies_controller.rb +199 -0
  20. data/app/helpers/apipie_helper.rb +10 -0
  21. data/app/public/apipie/javascripts/apipie.js +6 -0
  22. data/app/public/apipie/javascripts/bundled/bootstrap-collapse.js +138 -0
  23. data/app/public/apipie/javascripts/bundled/bootstrap.js +1726 -0
  24. data/app/public/apipie/javascripts/bundled/jquery.js +5 -0
  25. data/app/public/apipie/javascripts/bundled/prettify.js +28 -0
  26. data/app/public/apipie/stylesheets/application.css +7 -0
  27. data/app/public/apipie/stylesheets/bundled/bootstrap-responsive.min.css +12 -0
  28. data/app/public/apipie/stylesheets/bundled/bootstrap.min.css +689 -0
  29. data/app/public/apipie/stylesheets/bundled/prettify.css +30 -0
  30. data/app/views/apipie/apipies/_disqus.html.erb +13 -0
  31. data/app/views/apipie/apipies/_errors.html.erb +23 -0
  32. data/app/views/apipie/apipies/_headers.html.erb +26 -0
  33. data/app/views/apipie/apipies/_languages.erb +6 -0
  34. data/app/views/apipie/apipies/_metadata.erb +1 -0
  35. data/app/views/apipie/apipies/_method_detail.erb +61 -0
  36. data/app/views/apipie/apipies/_params.html.erb +42 -0
  37. data/app/views/apipie/apipies/_params_plain.html.erb +20 -0
  38. data/app/views/apipie/apipies/apipie_404.html.erb +17 -0
  39. data/app/views/apipie/apipies/apipie_checksum.json.erb +1 -0
  40. data/app/views/apipie/apipies/getting_started.html.erb +6 -0
  41. data/app/views/apipie/apipies/index.html.erb +56 -0
  42. data/app/views/apipie/apipies/method.html.erb +41 -0
  43. data/app/views/apipie/apipies/plain.html.erb +77 -0
  44. data/app/views/apipie/apipies/resource.html.erb +80 -0
  45. data/app/views/apipie/apipies/static.html.erb +103 -0
  46. data/app/views/layouts/apipie/apipie.html.erb +27 -0
  47. data/config/locales/de.yml +28 -0
  48. data/config/locales/en.yml +32 -0
  49. data/config/locales/es.yml +28 -0
  50. data/config/locales/fr.yml +31 -0
  51. data/config/locales/it.yml +31 -0
  52. data/config/locales/ja.yml +31 -0
  53. data/config/locales/pl.yml +28 -0
  54. data/config/locales/pt-BR.yml +28 -0
  55. data/config/locales/ru.yml +28 -0
  56. data/config/locales/tr.yml +28 -0
  57. data/config/locales/zh-CN.yml +28 -0
  58. data/config/locales/zh-TW.yml +28 -0
  59. data/images/screenshot-1.png +0 -0
  60. data/images/screenshot-2.png +0 -0
  61. data/lib/apipie/apipie_module.rb +83 -0
  62. data/lib/apipie/application.rb +462 -0
  63. data/lib/apipie/configuration.rb +186 -0
  64. data/lib/apipie/dsl_definition.rb +607 -0
  65. data/lib/apipie/error_description.rb +44 -0
  66. data/lib/apipie/errors.rb +86 -0
  67. data/lib/apipie/extractor.rb +177 -0
  68. data/lib/apipie/extractor/collector.rb +117 -0
  69. data/lib/apipie/extractor/recorder.rb +166 -0
  70. data/lib/apipie/extractor/writer.rb +454 -0
  71. data/lib/apipie/helpers.rb +73 -0
  72. data/lib/apipie/markup.rb +48 -0
  73. data/lib/apipie/method_description.rb +273 -0
  74. data/lib/apipie/middleware/checksum_in_headers.rb +35 -0
  75. data/lib/apipie/param_description.rb +280 -0
  76. data/lib/apipie/railtie.rb +9 -0
  77. data/lib/apipie/resource_description.rb +124 -0
  78. data/lib/apipie/response_description.rb +131 -0
  79. data/lib/apipie/response_description_adapter.rb +200 -0
  80. data/lib/apipie/routes_formatter.rb +33 -0
  81. data/lib/apipie/routing.rb +16 -0
  82. data/lib/apipie/rspec/response_validation_helper.rb +192 -0
  83. data/lib/apipie/see_description.rb +39 -0
  84. data/lib/apipie/static_dispatcher.rb +69 -0
  85. data/lib/apipie/swagger_generator.rb +707 -0
  86. data/lib/apipie/tag_list_description.rb +11 -0
  87. data/lib/apipie/validator.rb +526 -0
  88. data/lib/apipie/version.rb +3 -0
  89. data/lib/apipierails3.rb +25 -0
  90. data/lib/generators/apipie/install/README +6 -0
  91. data/lib/generators/apipie/install/install_generator.rb +25 -0
  92. data/lib/generators/apipie/install/templates/initializer.rb.erb +7 -0
  93. data/lib/generators/apipie/views_generator.rb +11 -0
  94. data/lib/tasks/apipie.rake +345 -0
  95. data/rel-eng/packages/.readme +3 -0
  96. data/rel-eng/packages/rubygem-apipie-rails +1 -0
  97. data/rel-eng/tito.props +5 -0
  98. data/spec/controllers/api/v1/architectures_controller_spec.rb +29 -0
  99. data/spec/controllers/api/v2/architectures_controller_spec.rb +12 -0
  100. data/spec/controllers/api/v2/nested/resources_controller_spec.rb +11 -0
  101. data/spec/controllers/apipies_controller_spec.rb +273 -0
  102. data/spec/controllers/concerns_controller_spec.rb +42 -0
  103. data/spec/controllers/extended_controller_spec.rb +11 -0
  104. data/spec/controllers/users_controller_spec.rb +740 -0
  105. data/spec/dummy/Rakefile +7 -0
  106. data/spec/dummy/app/controllers/api/base_controller.rb +4 -0
  107. data/spec/dummy/app/controllers/api/v1/architectures_controller.rb +43 -0
  108. data/spec/dummy/app/controllers/api/v1/base_controller.rb +11 -0
  109. data/spec/dummy/app/controllers/api/v2/architectures_controller.rb +30 -0
  110. data/spec/dummy/app/controllers/api/v2/base_controller.rb +11 -0
  111. data/spec/dummy/app/controllers/api/v2/nested/architectures_controller.rb +32 -0
  112. data/spec/dummy/app/controllers/api/v2/nested/resources_controller.rb +33 -0
  113. data/spec/dummy/app/controllers/application_controller.rb +18 -0
  114. data/spec/dummy/app/controllers/concerns/extending_concern.rb +11 -0
  115. data/spec/dummy/app/controllers/concerns/sample_controller.rb +41 -0
  116. data/spec/dummy/app/controllers/concerns_controller.rb +8 -0
  117. data/spec/dummy/app/controllers/extended_controller.rb +14 -0
  118. data/spec/dummy/app/controllers/files_controller.rb +5 -0
  119. data/spec/dummy/app/controllers/overridden_concerns_controller.rb +31 -0
  120. data/spec/dummy/app/controllers/pets_controller.rb +408 -0
  121. data/spec/dummy/app/controllers/pets_using_auto_views_controller.rb +73 -0
  122. data/spec/dummy/app/controllers/pets_using_self_describing_classes_controller.rb +95 -0
  123. data/spec/dummy/app/controllers/tagged_cats_controller.rb +32 -0
  124. data/spec/dummy/app/controllers/tagged_dogs_controller.rb +15 -0
  125. data/spec/dummy/app/controllers/twitter_example_controller.rb +307 -0
  126. data/spec/dummy/app/controllers/users_controller.rb +297 -0
  127. data/spec/dummy/app/views/layouts/application.html.erb +21 -0
  128. data/spec/dummy/config.ru +4 -0
  129. data/spec/dummy/config/application.rb +49 -0
  130. data/spec/dummy/config/boot.rb +10 -0
  131. data/spec/dummy/config/database.yml +21 -0
  132. data/spec/dummy/config/environment.rb +8 -0
  133. data/spec/dummy/config/environments/development.rb +28 -0
  134. data/spec/dummy/config/environments/production.rb +52 -0
  135. data/spec/dummy/config/environments/test.rb +38 -0
  136. data/spec/dummy/config/initializers/apipie.rb +110 -0
  137. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  138. data/spec/dummy/config/initializers/inflections.rb +10 -0
  139. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  140. data/spec/dummy/config/initializers/secret_token.rb +8 -0
  141. data/spec/dummy/config/initializers/session_store.rb +8 -0
  142. data/spec/dummy/config/locales/en.yml +5 -0
  143. data/spec/dummy/config/routes.rb +51 -0
  144. data/spec/dummy/db/.gitkeep +0 -0
  145. data/spec/dummy/doc/apipie_examples.json +1 -0
  146. data/spec/dummy/doc/users/desc_from_file.md +1 -0
  147. data/spec/dummy/public/404.html +26 -0
  148. data/spec/dummy/public/422.html +26 -0
  149. data/spec/dummy/public/500.html +26 -0
  150. data/spec/dummy/public/favicon.ico +0 -0
  151. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  152. data/spec/dummy/script/rails +6 -0
  153. data/spec/lib/application_spec.rb +49 -0
  154. data/spec/lib/extractor/extractor_spec.rb +9 -0
  155. data/spec/lib/extractor/middleware_spec.rb +44 -0
  156. data/spec/lib/extractor/writer_spec.rb +110 -0
  157. data/spec/lib/file_handler_spec.rb +18 -0
  158. data/spec/lib/method_description_spec.rb +98 -0
  159. data/spec/lib/param_description_spec.rb +345 -0
  160. data/spec/lib/param_group_spec.rb +60 -0
  161. data/spec/lib/rake_spec.rb +71 -0
  162. data/spec/lib/resource_description_spec.rb +48 -0
  163. data/spec/lib/swagger/openapi_2_0_schema.json +1607 -0
  164. data/spec/lib/swagger/rake_swagger_spec.rb +139 -0
  165. data/spec/lib/swagger/response_validation_spec.rb +104 -0
  166. data/spec/lib/swagger/swagger_dsl_spec.rb +658 -0
  167. data/spec/lib/validator_spec.rb +113 -0
  168. data/spec/lib/validators/array_validator_spec.rb +85 -0
  169. data/spec/spec_helper.rb +109 -0
  170. data/spec/support/rake.rb +21 -0
  171. metadata +415 -0
@@ -0,0 +1,7 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+ require 'rake'
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,4 @@
1
+ module Api
2
+ class BaseController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,43 @@
1
+ module Api
2
+ module V1
3
+ class ArchitecturesController < V1::BaseController
4
+ resource_description { name 'Architectures' }
5
+ api :GET, "/architectures/", "List all architectures."
6
+ def index
7
+ end
8
+
9
+ api :GET, "/architectures/:id/", "Show an architecture."
10
+ def show
11
+ end
12
+
13
+ def_param_group :timestamps do
14
+ param :created_at, String
15
+ param :updated_at, String
16
+ end
17
+
18
+ def_param_group :arch do
19
+ param :architecture, Hash, :required => true do
20
+ param :name, String, :required => true
21
+ param :description, String, :required => true
22
+ param_group :timestamps
23
+ end
24
+ end
25
+
26
+ api :POST, "/architectures/", "Create an architecture."
27
+ param_group :arch
28
+ def create
29
+ end
30
+
31
+ api :PUT, "/architectures/:id/", "Update an architecture."
32
+ param :architecture, Hash, :required => true do
33
+ param :name, String
34
+ end
35
+ def update
36
+ end
37
+
38
+ api :DELETE, "/architecturess/:id/", "Delete an architecture."
39
+ def destroy
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,11 @@
1
+ module Api
2
+ module V1
3
+ class BaseController < Api::BaseController
4
+ resource_description do
5
+ api_version '1.0'
6
+ app_info 'Version 1.0 description'
7
+ api_base_url '/api/v1'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ module Api
2
+ module V2
3
+ class ArchitecturesController < V2::BaseController
4
+ resource_description { name 'Architectures' }
5
+ api :GET, "/architectures/", "List all architectures."
6
+ def index
7
+ end
8
+
9
+ api :GET, "/architectures/:id/", "Show an architecture."
10
+ def show
11
+ end
12
+
13
+ api :POST, "/architectures/", "Create an architecture."
14
+ param_group :arch, Api::V1::ArchitecturesController
15
+ def create
16
+ end
17
+
18
+ api :PUT, "/architectures/:id/", "Update an architecture."
19
+ param :architecture, Hash, :required => true do
20
+ param :name, String
21
+ end
22
+ def update
23
+ end
24
+
25
+ api :DELETE, "/architecturess/:id/", "Delete an architecture."
26
+ def destroy
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ module Api
2
+ module V2
3
+ class BaseController < Api::BaseController
4
+ resource_description do
5
+ api_version '2.0'
6
+ app_info 'Version 2.0 description'
7
+ api_base_url '/api/v2'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ module Api
2
+ module V2
3
+ module Nested
4
+ class ArchitecturesController < V2::BaseController
5
+ resource_description { name 'Architectures' }
6
+ api :GET, "/nested/architectures/", "List all nested architectures."
7
+ def index
8
+ end
9
+
10
+ api :GET, "/nested/architectures/:id/", "Show a nested architecture."
11
+ def show
12
+ end
13
+
14
+ api :POST, "/nested/architectures/", "Create a nested architecture."
15
+ param_group :arch, Api::V1::ArchitecturesController
16
+ def create
17
+ end
18
+
19
+ api :PUT, "/nested/architectures/:id/", "Update a nested architecture."
20
+ param :architecture, Hash, :required => true do
21
+ param :name, String
22
+ end
23
+ def update
24
+ end
25
+
26
+ api :DELETE, "/architecturess/:id/", "Delete a nested architecture."
27
+ def destroy
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ module Api
2
+ module V2
3
+ class Nested::ResourcesController < V2::BaseController
4
+ resource_description do
5
+ name 'Resources'
6
+ resource_id "resource"
7
+ end
8
+ api :GET, "/nested/resources/", "List all nested resources."
9
+ def index
10
+ end
11
+
12
+ api :GET, "/nested/resources/:id/", "Show a nested resource."
13
+ def show
14
+ end
15
+
16
+ api :POST, "/nested/resources/", "Create a nested resource."
17
+ param_group :arch, Api::V1::ArchitecturesController
18
+ def create
19
+ end
20
+
21
+ api :PUT, "/nested/resources/:id/", "Update a nested resource."
22
+ param :architecture, Hash, :required => true do
23
+ param :name, String
24
+ end
25
+ def update
26
+ end
27
+
28
+ api :DELETE, "/resources/:id/", "Delete a nested resource."
29
+ def destroy
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ class ApplicationController < ActionController::Base
2
+ before_filter :run_validations
3
+
4
+ resource_description do
5
+ param :oauth, String, :desc => "Authorization", :required => false
6
+
7
+ returns :code => 401 do
8
+ property :reason, String, "Why authorization was denied"
9
+ end
10
+ end
11
+
12
+ def run_validations
13
+ if Apipie.configuration.validate == :explicitly
14
+ apipie_validations
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,11 @@
1
+ module Concerns
2
+ module ExtendingConcern
3
+ extend Apipie::DSL::Concern
4
+
5
+ update_api(:create) do
6
+ param :user, Hash do
7
+ param :from_concern, String, :desc => 'param from concern', :allow_nil => false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ module Concerns
2
+ module SampleController
3
+ extend Apipie::DSL::Concern
4
+
5
+ api!
6
+ def index
7
+ render :plain => "OK #{params.inspect}"
8
+ end
9
+
10
+ api :GET, '/:resource_id/:id'
11
+ param :id, String
12
+ def show
13
+ render :plain => "OK #{params.inspect}"
14
+ end
15
+
16
+ def_param_group :concern do
17
+ param :concern, Hash, :required => true, :action_aware => true do
18
+ param :name, String, "Name of a :concern"
19
+ param :concern_type, String
20
+ end
21
+ end
22
+
23
+ api :POST, '/:resource_id', "Create a :concern"
24
+ param_group :concern
25
+ def create
26
+ render :plain => "OK #{params.inspect}"
27
+ end
28
+
29
+ api :PUT, '/:resource_id/:id'
30
+ param :id, String
31
+ param_group :concern
32
+ def update
33
+ render :plain => "OK #{params.inspect}"
34
+ end
35
+
36
+ api :GET, '/:resource_id/:custom_subst'
37
+ def custom
38
+ render :plain => "OK #{params.inspect}"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,8 @@
1
+ class ConcernsController < ApplicationController
2
+
3
+ resource_description { resource_id 'concern_resources' }
4
+
5
+ apipie_concern_subst(:concern => 'user', :custom_subst => 'custom', 'string_subst' => 'string')
6
+ include ::Concerns::SampleController
7
+
8
+ end
@@ -0,0 +1,14 @@
1
+ class ExtendedController < ApplicationController
2
+
3
+ api :POST, '/extended'
4
+ param :user, Hash do
5
+ param :name, String
6
+ param :password, String
7
+ end
8
+ def create
9
+ end
10
+
11
+ apipie_update_params([:create]) do
12
+ param :admin, :boolean
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ class FilesController < ApplicationController
2
+ def download
3
+ render :text => "dummy file body for #{params[:file_path]}"
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ class OverriddenConcernsController < ApplicationController
2
+
3
+ resource_description { resource_id 'overridden_concern_resources' }
4
+
5
+ apipie_concern_subst(:concern => 'user')
6
+ include ::Concerns::SampleController
7
+
8
+ def_param_group :concern do
9
+ param :concern, String
10
+ end
11
+
12
+ api :PUT, '/:resource_id/:id'
13
+ param :custom_parameter, String, "New parameter added by the overriding method"
14
+ param_group :concern, ::Concerns::SampleController
15
+ def update
16
+ super
17
+ end
18
+
19
+ api :POST, '/:resource_id', "Create a :concern"
20
+ param_group :concern
21
+ def create
22
+ super
23
+ end
24
+
25
+ api :GET, '/:resource_id/custom'
26
+ param :concern, String
27
+ def custom
28
+ render :text => "OK #{params.inspect}"
29
+ end
30
+
31
+ end
@@ -0,0 +1,408 @@
1
+ #
2
+ # The PetsController defined here provides examples for different ways
3
+ # in which the 'returns' DSL directive can be used with the existing
4
+ # Apipie DSL elements 'param' and 'param_group'
5
+ #
6
+
7
+ class PetsController < ApplicationController
8
+ resource_description do
9
+ description 'A controller to test "returns"'
10
+ short 'Pets'
11
+ path '/pets'
12
+
13
+ param :common_param, Integer, :desc => "A param that can optionally be passed to all Pet methods", :required => false
14
+
15
+ returns :code => 404 do
16
+ property :error_message, String, "description of the error"
17
+ end
18
+
19
+ end
20
+
21
+ #-----------------------------------------------------------
22
+ # simple 'returns' example: a method that returns a pet record
23
+ #-----------------------------------------------------------
24
+ api :GET, "/pets/:id/as_properties", "Get a pet record"
25
+ returns :code => 200 do
26
+ property :pet_name, String, :desc => "Name of pet", :required => false
27
+ property :animal_type, ['dog','cat','iguana','kangaroo'], :desc => "Type of pet" # required by default, because this is a 'property'
28
+ end
29
+ returns :code => 404 do
30
+ property :another_error_message, String, :desc => "Overriding the response description from the Pets resource"
31
+ end
32
+ def show_as_properties
33
+ render :plain => "showing pet properties"
34
+ end
35
+
36
+
37
+ #-----------------------------------------------------------
38
+ # same example as above, but this time the properties are defined
39
+ # in a param group
40
+ #-----------------------------------------------------------
41
+ def_param_group :pet do
42
+ property :pet_name, String, :desc => "Name of pet", :required => false
43
+ property :animal_type, ['dog','cat','iguana','kangaroo'], :desc => "Type of pet" # required by default, because this is a 'property'
44
+ end
45
+
46
+ api :GET, "/pets/:id/as_param_group_of_properties", "Get a pet record"
47
+ returns :pet, :code => 200, :desc => "The pet"
48
+ def show_as_param_group_of_properties
49
+ render :plain => "showing pet properties defined as param groups"
50
+ end
51
+
52
+ #-----------------------------------------------------------
53
+ # Method returning an array of the :pet param_group
54
+ #-----------------------------------------------------------
55
+ api :GET, "/pets", "Get all pets"
56
+ returns :array_of => :pet, :desc => "list of pets"
57
+ def index
58
+ render :plain => "all pets"
59
+ end
60
+
61
+
62
+ #-----------------------------------------------------------
63
+ # mixing request/response and response-only parameters
64
+ #
65
+ # the param_group :pet_with_id has several parameters which are
66
+ # not expectd in the request, but would show up in the response
67
+ # and vice versa
68
+ #-----------------------------------------------------------
69
+ def_param_group :pet_with_id do
70
+ param :pet_id, Integer, :desc => "id of pet", :required => true
71
+ param :pet_name, String, :desc => "Name of pet", :required => false, :only_in => :response
72
+ param :partial_match_allowed, [true, false], :desc => "Partial match allowed?", :required => false, :only_in => :request
73
+ property :animal_type, ['dog','cat','iguana','kangaroo'], :desc => "Type of pet" # this is implicitly :only_in => :response
74
+ end
75
+
76
+ api :GET, "/pets/pet_by_id", "Get a pet record with the pet id in the body of the request"
77
+ param_group :pet_with_id # only the pet_id is expected to be in here
78
+ returns :param_group => :pet_with_id, :code => 200
79
+ def show_pet_by_id
80
+ render :plain => "returning a record with 3 fields"
81
+ end
82
+
83
+
84
+
85
+ #-----------------------------------------------------------
86
+ # example with multiple param groups
87
+ #-----------------------------------------------------------
88
+ def_param_group :owner do # a param group that can be used to describe inputs as well as outputs
89
+ param :owner_name, String
90
+ end
91
+ def_param_group :user_response do # a param group that can be used to describe outputs only
92
+ property :vote, [true,false]
93
+ end
94
+
95
+ api :GET, "/pets/by_owner_name/did_vote", "did any of the pets owned by the given user vote?"
96
+ param_group :owner, :desc => "look up the user by name"
97
+ returns :code => 200 do
98
+ param_group :owner
99
+ param_group :user_response
100
+ end
101
+ returns :code => 404 # no body
102
+ def get_vote_by_owner_name
103
+ render :plain => "no pets have voted"
104
+ end
105
+
106
+
107
+ #-----------------------------------------------------------
108
+ # a method returning multiple codes,
109
+ # some of which have a complex data structure
110
+ #-----------------------------------------------------------
111
+ def_param_group :pet_measurements do
112
+ property :pet_measurements, Hash do
113
+ property :weight, Integer, :desc => "Weight in pounds"
114
+ property :height, Integer, :desc => "Height in inches"
115
+ property :num_legs, Integer, :desc => "Number of legs", :required => false
116
+ end
117
+ end
118
+
119
+ def_param_group :pet_history do
120
+ property :did_visit_vet, [true,false], :desc => "Did the pet visit the veterinarian"
121
+ property :avg_meals_per_day, Float, :desc => "Average number of meals per day"
122
+ end
123
+
124
+ api :GET, "/pets/:id/extra_info", "Get extra information about a pet"
125
+ returns :code => 201, :desc => "Found a pet" do
126
+ param_group :pet
127
+ end
128
+ returns :code => 202 do
129
+ param_group :pet
130
+ param_group :pet_measurements
131
+ end
132
+ returns :code => 203 do
133
+ param_group :pet
134
+ param_group :pet_measurements
135
+ property 'pet_history', Hash do # the pet_history param_group does not contain a wrapping object,
136
+ # so create one manually
137
+ param_group :pet_history
138
+ end
139
+ property 'additional_histories', :array_of => Hash do
140
+ param_group :pet_history
141
+ end
142
+ end
143
+ returns :code => 204 do
144
+ property :int_array, :array_of => Integer
145
+ property :enum_array, :array_of => ['v1','v2','v3']
146
+ end
147
+ returns :code => :unprocessable_entity, :desc => "Fleas were discovered on the pet" do
148
+ param_group :pet
149
+ property :num_fleas, Integer, :desc => "Number of fleas on this pet"
150
+ end
151
+ def show_extra_info
152
+ render :plain => "please disinfect your pet"
153
+ end
154
+
155
+
156
+ #=======================================================================
157
+ # Methods for testing response validation
158
+ #=======================================================================
159
+
160
+
161
+ #-----------------------------------------------------------
162
+ # A method which returns the response as described
163
+ #-----------------------------------------------------------
164
+ api!
165
+ returns :code => 200 do
166
+ property :a_number, Integer
167
+ property :an_optional_number, Integer, :required=>false
168
+ end
169
+ def return_and_validate_expected_response
170
+ result = {
171
+ a_number: 3
172
+ }
173
+ render :json => result
174
+ end
175
+
176
+ #-----------------------------------------------------------
177
+ # A method which returns a null value in the response
178
+ #-----------------------------------------------------------
179
+ api!
180
+ returns :code => 200 do
181
+ property :a_number, Integer
182
+ property :an_optional_number, Integer, :required=>false
183
+ end
184
+ def return_and_validate_expected_response_with_null
185
+ result = {
186
+ a_number: nil
187
+ }
188
+ render :json => result
189
+ end
190
+
191
+ #-----------------------------------------------------------
192
+ # A method which returns a null value in the response instead of an object
193
+ #-----------------------------------------------------------
194
+ api!
195
+ returns :code => 200 do
196
+ property :an_object, Hash do
197
+ property :an_optional_number, Integer, :required=>false
198
+ end
199
+ end
200
+ def return_and_validate_expected_response_with_null_object
201
+ result = {
202
+ an_object: nil
203
+ }
204
+ render :json => result
205
+ end
206
+
207
+ #-----------------------------------------------------------
208
+ # A method which returns an array response as described
209
+ #-----------------------------------------------------------
210
+ def_param_group :two_numbers do
211
+ property :a_number, Integer
212
+ property :an_optional_number, Integer, :required=>false
213
+ end
214
+
215
+ api!
216
+ returns :code => 200, :array_of => :two_numbers
217
+ def return_and_validate_expected_array_response
218
+ result = [{
219
+ a_number: 3
220
+ }]
221
+ render :json => result
222
+ end
223
+
224
+ #-----------------------------------------------------------
225
+ # A method which returns an array response when it is expected to return an object
226
+ # (note that response code is set here to 201)
227
+ #-----------------------------------------------------------
228
+ api!
229
+ returns :two_numbers, :code => 201
230
+ def return_and_validate_unexpected_array_response
231
+ result = [{
232
+ a_number: 3
233
+ }]
234
+ render :status => 201, :json => result
235
+ end
236
+
237
+ #-----------------------------------------------------------
238
+ # A method which has a response that does not match the output type
239
+ #-----------------------------------------------------------
240
+ api!
241
+ returns :code => 200 do
242
+ property :a_number, String
243
+ end
244
+ def return_and_validate_type_mismatch
245
+ result = {
246
+ a_number: 3
247
+ }
248
+ render :json => result
249
+ end
250
+
251
+ #-----------------------------------------------------------
252
+ # A method with no documentation
253
+ #-----------------------------------------------------------
254
+ def undocumented_method
255
+ render :json => {:result => "ok"}
256
+ end
257
+
258
+ #-----------------------------------------------------------
259
+ # A method which has a response with a missing field
260
+ #-----------------------------------------------------------
261
+ api!
262
+ returns :code => 200 do
263
+ property :a_number, Integer
264
+ property :another_number, Integer
265
+ end
266
+ def return_and_validate_missing_field
267
+ result = {
268
+ a_number: 3
269
+ }
270
+ render :json => result
271
+ end
272
+
273
+
274
+ #-----------------------------------------------------------
275
+ # A method which has a response with an extra property
276
+ # (should raise a validation error by default)
277
+ #-----------------------------------------------------------
278
+ api!
279
+ returns :code => 200 do
280
+ property :a_number, Integer
281
+ end
282
+ def return_and_validate_extra_property
283
+ result = {
284
+ a_number: 3,
285
+ another_number: 4
286
+ }
287
+ render :json => result
288
+ end
289
+
290
+
291
+ #-----------------------------------------------------------
292
+ # A method which has a response with an extra property, but 'additional_properties' is specified
293
+ # (should not raise a validation error by default)
294
+ #-----------------------------------------------------------
295
+ api!
296
+ returns :code => 200, :additional_properties => true do
297
+ property :a_number, Integer
298
+ end
299
+ def return_and_validate_allowed_extra_property
300
+ result = {
301
+ a_number: 3,
302
+ another_number: 4
303
+ }
304
+ render :json => result
305
+ end
306
+
307
+ #-----------------------------------------------------------
308
+ # Sub-object in response has an extra property. 'additional_properties' is specified on the response, but not on the object
309
+ # (should raise a validation error by default)
310
+ #-----------------------------------------------------------
311
+ api!
312
+ returns :code => 200, :additional_properties => true do
313
+ property :an_object, Hash do
314
+ property :a_number, Integer
315
+ end
316
+ end
317
+ def sub_object_invalid_extra_property
318
+ result = {
319
+ an_object: {
320
+ a_number: 2,
321
+ an_extra_number: 3
322
+ }
323
+ }
324
+ render :json => result
325
+ end
326
+
327
+
328
+ #-----------------------------------------------------------
329
+ # Sub-object in response has an extra property. 'additional_properties' is specified on the object, but not on the response
330
+ # (should not raise a validation error by default)
331
+ #-----------------------------------------------------------
332
+ api!
333
+ returns :code => 200, :additional_properties => false do
334
+ property :an_object, Hash, :additional_properties => true do
335
+ property :a_number, Integer
336
+ end
337
+ end
338
+ def sub_object_allowed_extra_property
339
+ result = {
340
+ an_object: {
341
+ a_number: 2,
342
+ an_extra_number: 3
343
+ }
344
+ }
345
+ render :json => result
346
+ end
347
+
348
+ #=======================================================================
349
+ # Methods for testing array field responses
350
+ #=======================================================================
351
+
352
+ #-----------------------------------------------------------
353
+ # A method which returns the response as described (one field is an array of objects)
354
+ #-----------------------------------------------------------
355
+ api!
356
+ returns :code => 200 do
357
+ property :a_number, Integer
358
+ property :array_of_objects, :array_of => Hash do
359
+ property :number1, Integer, :required=>true
360
+ property :number2, Integer, :required=>true
361
+ end
362
+ end
363
+ def returns_response_with_valid_array
364
+ result = {
365
+ a_number: 3,
366
+ array_of_objects: [
367
+ {number1: 1, number2: 2},
368
+ {number1: 10, number2: 20}
369
+ ]
370
+ }
371
+ render :json => result
372
+ end
373
+
374
+
375
+ #-----------------------------------------------------------
376
+ # A method which returns an incorrect response (wrong field type inside array)
377
+ #-----------------------------------------------------------
378
+ api!
379
+ returns :code => 200 do
380
+ property :a_number, Integer
381
+ property :array_of_objects, :array_of => Hash do
382
+ property :number1, Integer, :required=>true
383
+ property :number2, Integer, :required=>true
384
+ end
385
+ end
386
+ def returns_response_with_invalid_array
387
+ result = {
388
+ a_number: 3,
389
+ array_of_objects: [
390
+ {number1: 1, number2: 2},
391
+ {number1: 10, number2: "this should have been a number"}
392
+ ]
393
+ }
394
+ render :json => result
395
+ end
396
+
397
+
398
+ #-----------------------------------------------------------
399
+ # A method with simple tags.
400
+ #-----------------------------------------------------------
401
+ api!
402
+ tags(%w[Dogs Cats LivingBeings])
403
+ def show_plain_response_with_tags
404
+ render :plain => "showing pet properties"
405
+ end
406
+
407
+ end
408
+