respect-rails 0.1.0

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 (110) hide show
  1. data/FAQ.md +98 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +291 -0
  4. data/RELATED_WORK.md +47 -0
  5. data/RELEASE_NOTES.md +20 -0
  6. data/Rakefile +32 -0
  7. data/app/assets/javascripts/respect/rails/schemas.js +32 -0
  8. data/app/assets/stylesheets/respect/rails/schemas.css +160 -0
  9. data/app/controllers/respect/rails/schemas_controller.rb +36 -0
  10. data/app/helpers/respect/rails/schemas_helper.rb +78 -0
  11. data/app/views/layouts/respect/rails/schemas.html.erb +14 -0
  12. data/app/views/respect/rails/request_validation_exception.html.erb +38 -0
  13. data/app/views/respect/rails/schemas/doc.html.erb +158 -0
  14. data/app/views/respect/rails/schemas/index.html.erb +4 -0
  15. data/config/routes.rb +4 -0
  16. data/lib/respect/rails/action_def.rb +37 -0
  17. data/lib/respect/rails/action_schema.rb +41 -0
  18. data/lib/respect/rails/application_info.rb +26 -0
  19. data/lib/respect/rails/controller_helper.rb +107 -0
  20. data/lib/respect/rails/engine.rb +63 -0
  21. data/lib/respect/rails/engine_info.rb +27 -0
  22. data/lib/respect/rails/headers_helper.rb +11 -0
  23. data/lib/respect/rails/headers_simplifier.rb +31 -0
  24. data/lib/respect/rails/info.rb +72 -0
  25. data/lib/respect/rails/request_def.rb +38 -0
  26. data/lib/respect/rails/request_helper.rb +101 -0
  27. data/lib/respect/rails/request_schema.rb +102 -0
  28. data/lib/respect/rails/response_def.rb +43 -0
  29. data/lib/respect/rails/response_helper.rb +67 -0
  30. data/lib/respect/rails/response_schema.rb +84 -0
  31. data/lib/respect/rails/response_schema_set.rb +60 -0
  32. data/lib/respect/rails/route_info.rb +101 -0
  33. data/lib/respect/rails/version.rb +5 -0
  34. data/lib/respect/rails.rb +74 -0
  35. data/lib/tasks/respect_tasks.rake +4 -0
  36. data/test/dummy/README.rdoc +261 -0
  37. data/test/dummy/Rakefile +7 -0
  38. data/test/dummy/app/assets/javascripts/application.js +15 -0
  39. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  40. data/test/dummy/app/controllers/application_controller.rb +3 -0
  41. data/test/dummy/app/controllers/automatic_validation_controller.rb +300 -0
  42. data/test/dummy/app/controllers/caught_exception_controller.rb +58 -0
  43. data/test/dummy/app/controllers/disabled_controller.rb +37 -0
  44. data/test/dummy/app/controllers/manual_validation_controller.rb +63 -0
  45. data/test/dummy/app/controllers/no_schema_controller.rb +17 -0
  46. data/test/dummy/app/controllers/skipped_automatic_validation_controller.rb +35 -0
  47. data/test/dummy/app/helpers/application_helper.rb +2 -0
  48. data/test/dummy/app/helpers/respect/application_macros.rb +10 -0
  49. data/test/dummy/app/helpers/respect/circle_schema.rb +16 -0
  50. data/test/dummy/app/helpers/respect/point_schema.rb +19 -0
  51. data/test/dummy/app/helpers/respect/rgba_schema.rb +18 -0
  52. data/test/dummy/app/views/automatic_validation/request_format.html.erb +1 -0
  53. data/test/dummy/app/views/automatic_validation/request_format.pdf.erb +1 -0
  54. data/test/dummy/app/views/caught_exception/response_validator.html.erb +1 -0
  55. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  56. data/test/dummy/config/application.rb +58 -0
  57. data/test/dummy/config/boot.rb +10 -0
  58. data/test/dummy/config/database.yml +25 -0
  59. data/test/dummy/config/environment.rb +5 -0
  60. data/test/dummy/config/environments/development.rb +37 -0
  61. data/test/dummy/config/environments/production.rb +67 -0
  62. data/test/dummy/config/environments/test.rb +37 -0
  63. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  64. data/test/dummy/config/initializers/inflections.rb +15 -0
  65. data/test/dummy/config/initializers/mime_types.rb +5 -0
  66. data/test/dummy/config/initializers/respect.rb +9 -0
  67. data/test/dummy/config/initializers/secret_token.rb +7 -0
  68. data/test/dummy/config/initializers/session_store.rb +8 -0
  69. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  70. data/test/dummy/config/locales/en.yml +5 -0
  71. data/test/dummy/config/routes.rb +38 -0
  72. data/test/dummy/config.ru +4 -0
  73. data/test/dummy/db/development.sqlite3 +0 -0
  74. data/test/dummy/db/schema.rb +16 -0
  75. data/test/dummy/db/test.sqlite3 +0 -0
  76. data/test/dummy/lib/exts/Rgba.rb +11 -0
  77. data/test/dummy/lib/exts/circle.rb +11 -0
  78. data/test/dummy/lib/exts/point.rb +11 -0
  79. data/test/dummy/log/development.log +6 -0
  80. data/test/dummy/log/test.log +851 -0
  81. data/test/dummy/public/404.html +26 -0
  82. data/test/dummy/public/422.html +26 -0
  83. data/test/dummy/public/500.html +25 -0
  84. data/test/dummy/public/favicon.ico +0 -0
  85. data/test/dummy/script/rails +6 -0
  86. data/test/functional/automatic_validation_controller_test.rb +131 -0
  87. data/test/functional/caught_exception_controller_test.rb +50 -0
  88. data/test/functional/disabled_controller_test.rb +16 -0
  89. data/test/functional/manual_validation_controller_test.rb +24 -0
  90. data/test/functional/no_schema_controller_test.rb +12 -0
  91. data/test/functional/respect/rails/schemas_controller_test.rb +18 -0
  92. data/test/functional/skipped_automatic_validation_controller_test.rb +12 -0
  93. data/test/headers_can_dumped_in_json.sh +33 -0
  94. data/test/integration/navigation_test.rb +38 -0
  95. data/test/request_headers_validation_in_dev_mode.sh +33 -0
  96. data/test/test_helper.rb +17 -0
  97. data/test/unit/action_schema_test.rb +21 -0
  98. data/test/unit/application_info_test.rb +11 -0
  99. data/test/unit/controller_helper_test.rb +4 -0
  100. data/test/unit/engine_info_test.rb +11 -0
  101. data/test/unit/engine_test.rb +7 -0
  102. data/test/unit/info_test.rb +42 -0
  103. data/test/unit/request_def_test.rb +22 -0
  104. data/test/unit/request_helper_test.rb +67 -0
  105. data/test/unit/request_schema_test.rb +164 -0
  106. data/test/unit/response_def_test.rb +9 -0
  107. data/test/unit/response_helper_test.rb +73 -0
  108. data/test/unit/response_schema_set_test.rb +18 -0
  109. data/test/unit/response_schema_test.rb +147 -0
  110. metadata +334 -0
data/FAQ.md ADDED
@@ -0,0 +1,98 @@
1
+ # Frequently Asked Question
2
+
3
+ ## Why using Respect for Rails since I do most of my parameters checking in my model?
4
+
5
+ This is true that complex parameters ckecking/conversions are often done in the model in
6
+ order to factor code when multiple endpoints use them. For instance, consider the following
7
+ case where the user must provide a circle, via a center point and a radius:
8
+
9
+ ```ruby
10
+ class Hotspot < ActiveRecord::Base
11
+ # Returns the list of hot-spots around the given circle.
12
+ #
13
+ # The following statements are equivalent:
14
+ # Hotspot.around(Circle.new(Point.new(42, 51), 16))
15
+ # Hotspot.around(center: { x: 42, y: 51 }, radius: 16)
16
+ def self.around(*args)
17
+ if args.is_a? Hash
18
+ # Build a circle from the hash parameters and call this
19
+ # method recursively.
20
+ self.around(Circle.from_h(args.first))
21
+ else
22
+ circle = args.shift
23
+ # Do the query.
24
+ end
25
+ end
26
+ end
27
+
28
+ class HotspotController < ActionController::Base
29
+ def around
30
+ Hotspot.around(params[:area])
31
+ end
32
+ end
33
+ ```
34
+
35
+ In this case all the sanitization process is handled by the `Circle::from_h` method. This code
36
+ is ok. However, it has some drawbacks:
37
+
38
+ 1. We still have to write the documentation for the REST API and it would be hard to imagine
39
+ a generator that could understand this code or complex `ActiveRecord` validator code.
40
+ 1. Although the `Circle::from_h` method may be already provided by a basic third-party library,
41
+ it may not do all the checking necessary when user data come from an HTTP request.
42
+ For instance, it may not handle properly a call like this one:
43
+ `Circle.from_h(center: { x: "foo", y: "bar" }, radius: "invalid")`
44
+ 1. In case of invalid schema the user may not get an helpful message. This is perfectly
45
+ acceptable for security reason.
46
+
47
+ We can get _Respect for Rails_ do this work for you by adding a helper method which create a
48
+ `Circle` object for you when validating the JSON document:
49
+
50
+ ```ruby
51
+ module Respect
52
+ class PointSchema < CompositeSchema
53
+ def schema_definition
54
+ HashSchema.define do |s|
55
+ s.numeric "x"
56
+ s.numeric "y"
57
+ end
58
+ end
59
+
60
+ def sanitize(doc)
61
+ Point.new(doc["x"], doc["y"])
62
+ end
63
+ end
64
+
65
+ class CircleSchema < CompositeSchema
66
+ def schema
67
+ HashSchema.define do |s|
68
+ s.point "center"
69
+ s.numeric "radius", greater_than: 0
70
+ end
71
+ end
72
+
73
+ def sanitize(doc)
74
+ Circle.new(doc[:center], doc[:radius])
75
+ end
76
+ end
77
+ end
78
+ ```
79
+
80
+ and have your schema written like this
81
+
82
+ ```ruby
83
+ class HotspotSchema < Respect::Rails::ActionSchema
84
+ def around
85
+ request do
86
+ schema do |s|
87
+ s.circle "area"
88
+ end
89
+ end
90
+ end
91
+ end
92
+ ```
93
+
94
+ _Respect for Rails_ does not aim at replacing `ActiveRecord` validator. In other word, some
95
+ parameters may be validated by _Respect_ and still generate an `ActiveRecord` error. It is here
96
+ to prepare the data for the model, to prevent security issues and to provide a place for
97
+ documenting each parameter. See it as a full featured alternative to
98
+ [Strong Parameters](https://github.com/rails/strong_parameters).
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,291 @@
1
+ # Respect plugin for Rails
2
+
3
+ _Respect for Rails_ let's you write the documentation of your REST API using Ruby code. Your app's
4
+ API is published using a Rails engine so it is always deployed along with your application and stay
5
+ synchronized. A filter is available so you can also easily validate requests and responses. Thanks
6
+ to that your incoming parameters will also be sanitized so if you expect a URI in a parameter value you will get a URI object instead of a string object containing a URI.
7
+ It follows Rails DRY principle and save you a lot of typing since it
8
+ fetches most of the information automatically by inspecting your routes, their constraints and your
9
+ model validators. You can always adjust the default by defining the schema per resource and/or
10
+ controller.
11
+
12
+ # Features
13
+
14
+ * A compact DSL from to the [Respect](https://github.com/nicolasdespres/respect) gem to specify your REST API documentation.
15
+ * Filters to automatically validates and sanitize incoming parameters.
16
+ * A Rails engine to serve your public REST API documentation.
17
+
18
+ See the RELEASE_NOTES file for detailed feature listing.
19
+
20
+ # Take a tour
21
+
22
+ This section guides for a walk around the main features available.
23
+
24
+ ## Document an action request
25
+
26
+ _Respect for Rails_ let's you easily describe the structure of incoming requests and outgoing responses
27
+ using a simple and compact Ruby DSL. Assuming you have the scaffold of a `ContactsController`, the structure
28
+ for its `create` action may look like this:
29
+
30
+ ```ruby
31
+ # in app/controllers/contacts_controller_schema.rb
32
+ # POST /contacts
33
+ # POST /contacts.json
34
+ def_action_schema :create do |a|
35
+ a.documentation "Create a new contact in the address book."
36
+ a.request do |r|
37
+ r.body_parameters do |s|
38
+ # They look like something like that:
39
+ # { contact: { name: "Albert", age: 62, homepage: "http://example.org" } }
40
+ s.hash "contact" do |s|
41
+ s.string "name", doc: "The name of the contact."
42
+ s.integer "age", doc: "How old is the contact."
43
+ s.uri "homepage", doc: "The URL of the contact's homepage"
44
+ end
45
+ end
46
+ end
47
+ end
48
+ def create
49
+ # ...
50
+ end
51
+ ```
52
+
53
+ Note that we distinguish from where the parameters comes from (path, query or body) for the sake of documentation.
54
+ To see the generated doc, you must mount the provided engine like this:
55
+
56
+ ```ruby
57
+ # in config/routes.rb
58
+ mount Respect::Rails::Engine => "/rest_spec"
59
+ ```
60
+
61
+ and point your favorite web browser to `http://localhost:3000/rest_spec`. You should see something like that
62
+
63
+ ![Alt Text](examples/screenshots/controllers_create_request.png "A request documentation")
64
+
65
+ ## Document an action response
66
+
67
+ When documenting an API it is also important to write how the response will look like. You can add this code
68
+ to specify the body of the response when the status is "created":
69
+
70
+ ```ruby
71
+ # in app/controllers/contacts_controller_schema.rb
72
+ # in def_action_schema :create block
73
+ a.response_for do |status|
74
+ status.created do |r|
75
+ r.body do |s|
76
+ s.integer name, greather_than: 0, doc: "The identifier of this contact."
77
+ s.string "name", doc: "The name of the contact."
78
+ s.integer "age", doc: "How old is the contact."
79
+ s.uri "homepage", doc: "The URL of the contact's homepage"
80
+ s.datetime "created_at", doc: "When this record has been created."
81
+ s.datetime "updated_at", doc: "When this record has been updated lastly."
82
+ end
83
+ end
84
+ end
85
+ ```
86
+
87
+ The generated documentation would look like that:
88
+
89
+ ![Alt Text](examples/screenshots/controllers_create_response.png "A response documentation")
90
+
91
+ The specification standard used to document schema is defined at [json-schema.org](http://json-schema.org/)
92
+ (we currenly follow [draft v3](http://tools.ietf.org/id/draft-zyp-json-schema-03.html)).
93
+
94
+ ## Factor specification code
95
+
96
+ As you have probably noticed there is some repetition in this code. To avoid it you can create an helper
97
+ like this:
98
+
99
+ ```ruby
100
+ # in app/helpers/respect/application_macros.rb
101
+ module Respect
102
+ module ApplicationMacros
103
+ def id(name = "id")
104
+ integer name, greather_than: 0
105
+ end
106
+
107
+ def contact_attributes
108
+ string "name", doc: "The name of the contact."
109
+ integer "age", doc: "How old is the contact."
110
+ uri "homepage", doc: "The URL of the contact's homepage"
111
+ end
112
+
113
+ def contact
114
+ id
115
+ contact_attributes
116
+ record_timestamps
117
+ end
118
+
119
+ def record_timestamps
120
+ doc "When this record has been created."
121
+ datetime "created_at"
122
+ doc "When this record has been updated lastly."
123
+ datetime "updated_at"
124
+ end
125
+ end
126
+ end
127
+ ```
128
+
129
+ Notice that we have also provided a macro for the usual +id+ attribute. This helper must be install in the
130
+ schema definition DSL like that:
131
+
132
+ ```ruby
133
+ # in config/initializers/respect.rb
134
+ Respect::Rails.setup do |config|
135
+ config.helpers Respect::ApplicationMacros
136
+ end
137
+ ```
138
+
139
+ Now the request schema can be rewritten like this:
140
+
141
+ ```ruby
142
+ r.body_parameters do |s|
143
+ s.hash "contact" do |s|
144
+ s.contact_attributes
145
+ end
146
+ end
147
+ ```
148
+
149
+ and the response schema like that:
150
+
151
+ ```ruby
152
+ r.body do |s|
153
+ s.hash "contact" do |s|
154
+ s.contact
155
+ end
156
+ end
157
+ ```
158
+
159
+ ## Validate requests and response
160
+
161
+ All the information you have included in the action specification can also be used to drive a
162
+ validation process. To enable it you just have to install an "around" filter in your
163
+ `ApplicationController` like this:
164
+
165
+ ```ruby
166
+ around_filter :validate_schemas!
167
+ ```
168
+
169
+ Responses formatted in JSON are validated only in development and test mode.
170
+ When validation failed an exception is raised. To help you debug, we provide a more specific
171
+ view than the usual exception reporting view of Rails. You can install this view by adding the
172
+ following line to your `ApplicationController`:
173
+
174
+ ```ruby
175
+ rescue_from_request_validation_error if Rails.env.development?
176
+ ```
177
+
178
+ ## Sanitize your incoming parameters
179
+
180
+ Incoming requests parameters must often be sanitized since they come from un-trusted users.
181
+ A sanitized version of the request parameters is built along the validation process and stored
182
+ in the `request` object. We can access it using `request.sane_params`. Sanitized object of a
183
+ more specific type than the original parameter value. For instance the `homepage` parameter
184
+ will be a `URI` object instead of a simple string:
185
+
186
+ ```ruby
187
+ request.sane_params[:contact][:homepage].class #=> URI::Generic
188
+ ```
189
+
190
+ You can also automatically sanitize the request parameters *in-place* by installing this before
191
+ filter:
192
+
193
+ ``` ruby
194
+ before_filter :sanitize_params!
195
+ ```
196
+
197
+ ## Headers documentation
198
+
199
+ Often REST API expect headers to be set in the request and/or set headers in their responses.
200
+ _Respect for Rails_ let's you document using the `headers` command available for both
201
+ the request and the response.
202
+
203
+ ```ruby
204
+ a.request do |r|
205
+ r.headers do |h|
206
+ h.doc "Set this header."
207
+ h['X-AB-Signature'] = "api_public_key"
208
+ end
209
+ end
210
+ ```
211
+
212
+ ## Documentation string
213
+
214
+ The DSL let you write documentation string at many places. All this string are structured with a title
215
+ on the first line followed by an empty line and a description for the rest of the string. It is much
216
+ like git commit message except that if there is only one paragraph the title will be omit. You can set
217
+ the documentation like this of most of the item using the `doc` statement or the `:doc` option when
218
+ available. See this example:
219
+
220
+ ```ruby
221
+ doc <<-EOS.strip_heredoc
222
+ The name of the contact.
223
+
224
+ First name and last name are separated by white space.
225
+ EOS
226
+ string "name"
227
+
228
+ doc "How old is the contact."
229
+ integer "age"
230
+
231
+ uri "homepage", doc: "The URL of the contact's homepage"
232
+ ```
233
+
234
+ # Getting started
235
+
236
+ The easiest way to install _Respect for Rails_ is to add it to your `Gemfile`:
237
+
238
+ ```ruby
239
+ gem "respect-rails", require: "respect/rails"
240
+ ```
241
+
242
+ Then, after running the `bundle install` command, you can mount the Rails engine provided by this library
243
+ by adding this line at the beginning of your `config/routes.rb` file.
244
+
245
+ ```ruby
246
+ mount Respect::Rails::Engine => "/rest_spec"
247
+ ```
248
+
249
+ Then, you can start your application web server as usual at point your web browser to
250
+ `http://localhost:3000/rest_spec/doc`.
251
+
252
+ # Getting help
253
+
254
+ The easiest way to get help about how to use this library is to post your question on the
255
+ [Respect for Rails discussion group](https://groups.google.com/forum/#!forum/ruby-respect-gem-talk).
256
+ I will be glade to answer. I may have already answered the
257
+ same question so before, you post your question take a bit of time to search the group.
258
+
259
+ You can also read these documents for further documentation:
260
+
261
+ * [Respect project](https://github.com/nicolasdespres/respect)
262
+ * [Repect API reference documentation](http://nicolasdespres.github.io/respect/)
263
+ * [Repect for Rails API reference documentation](http://nicolasdespres.github.io/respect-rails)
264
+ * The FAQ file.
265
+
266
+ # Compatibility
267
+
268
+ _Respect for Rails_ has been tested with:
269
+
270
+ * Ruby 1.9.3-p392 (should be compatible with all 1.9.x family)
271
+ * Rails 3.2.13
272
+ * Respect 0.1.0
273
+
274
+ Note that it uses `ActiveSupport::JSON` to encode/decode JSON objects.
275
+
276
+ # Feedback
277
+
278
+ I would love to hear what you think about this library. Feel free to post any comments/remarks on the
279
+ [Respect for Rails discussion group](https://groups.google.com/forum/#!forum/ruby-respect-gem-talk).
280
+
281
+ # Contributing patches
282
+
283
+ I spent quite a lot of time writing this gem but there is still a lot of work to do. Whether it
284
+ is a bug-fix, a new feature, some code re-factoring, or documentation clarification, I will be
285
+ glade to merge your pull request on GitHub. You just have to create a branch from `master` and
286
+ send me a pull request.
287
+
288
+ # License
289
+
290
+ _Respect for Rails_ is released under the term of the [MIT License](http://opensource.org/licenses/MIT).
291
+ Copyright (c) 2013 Nicolas Despres.
data/RELATED_WORK.md ADDED
@@ -0,0 +1,47 @@
1
+ # Related works
2
+
3
+ This section describes some projects sharing more or less the same purpose as
4
+ _Respect for Rails_. The goal is to have an overview of the eco-system around this
5
+ topic to borrow ideas and to drive implementation.
6
+
7
+ This section is not meant to be accurate even if we try to stay objective here.
8
+
9
+ ## [apipie-rails](https://github.com/Pajk/apipie-rails)
10
+
11
+ * Documentation generation using an engine.
12
+ * Ruby DSL to describe documentation.
13
+ * Support validators.
14
+ * Resource and controllers description API.
15
+ * Good looking generated doc.
16
+ * Allow to statically deployed the documentation apart of the Rails app.
17
+ * Apparently there is no sanitizer.
18
+ * Apparently you can't specify headers.
19
+ * Apparently you can't specify url and query parameters.
20
+ * Apparently there is no support for json-schema.org standard.
21
+
22
+ TODO: Study to be continued...
23
+
24
+ ## [Doctorj](https://github.com/coopernurse/doctorj)
25
+
26
+ * No Ruby DSL but uses a Markdown file as input.
27
+ * Syntax to describe schema in Markdown looks compact and close to what we have
28
+ in our Ruby DSL.
29
+ * Generate API documentation in HTML.
30
+ * Not integrated in Rails.
31
+ * Not bind to the routes.
32
+ * No HTTP headers validation possible.
33
+ * No sanitizer.
34
+
35
+ ## [Rails::API](https://github.com/rails-api/rails-api)
36
+
37
+ * Lighter Rails for JSON only application.
38
+
39
+ ## [Active Model Serializer](https://github.com/rails-api/active_model_serializers)
40
+
41
+ * Object oriented way to organize JSON view code.
42
+
43
+ ## [StrongParameters](https://github.com/rails/strong_parameters)
44
+
45
+ * No documentation generation.
46
+ * No sanitizer.
47
+ * No response validation.
data/RELEASE_NOTES.md ADDED
@@ -0,0 +1,20 @@
1
+ # Release notes
2
+
3
+ This document is a list of user visible feature changes made between
4
+ releases except for bug fixes.
5
+
6
+ Note that each entry is kept so brief that no reason behind or
7
+ reference information is supplied with. For a full list of changes
8
+ with all sufficient information, see the git(1) log.
9
+
10
+ A lot more is coming soon check out the issue tagged as `feature`
11
+ in the tracker.
12
+
13
+ ## Part of the first release
14
+
15
+ * Feature: An engine to render and deploy the REST API documentation.
16
+ * Feature: Filter to validate requests/responses.
17
+ * Feature: Sanitizer to promote validated parameter value to a more precise type.
18
+ * Feature: Schema are organize like controllers and views.
19
+ * Feature: Follow [JSON schema draft v3 standard](http://tools.ietf.org/id/draft-zyp-json-schema-03.html) to represents schema.
20
+ * Feature: A RequestValidationError exception handler.
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ require 'yard'
9
+ YARD::Rake::YardocTask.new do |t|
10
+ t.files = [
11
+ 'lib/**/*.rb',
12
+ '-',
13
+ 'README.md',
14
+ 'FAQ.md',
15
+ 'RELEASE_NOTES.md',
16
+ 'RELATED_WORK.md',
17
+ ]
18
+ end
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rake/testtask'
23
+
24
+ Rake::TestTask.new(:test) do |t|
25
+ t.libs << 'lib'
26
+ t.libs << 'test'
27
+ t.pattern = 'test/**/*_test.rb'
28
+ t.verbose = false
29
+ end
30
+
31
+
32
+ task :default => :test
@@ -0,0 +1,32 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
16
+
17
+ var toggle = function(id) {
18
+ var s = document.getElementById("toggle_" + id).style;
19
+ var t = document.getElementById("toggle_" + id + "_toggle");
20
+ if (s.display == 'none') {
21
+ s.display = 'block';
22
+ t.innerHTML = t.innerHTML.replace(/^Show/, 'Hide');
23
+ } else {
24
+ s.display = 'none';
25
+ t.innerHTML = t.innerHTML.replace(/^Hide/, 'Show');
26
+ }
27
+ return false;
28
+ }
29
+
30
+ var toggleHeadersDump = function() {
31
+ return toggle('headers_dump');
32
+ }
@@ -0,0 +1,160 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
14
+
15
+ body { background-color: #fff; color: #333; }
16
+
17
+ body, p, ol, ul, td {
18
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
19
+ font-size: 14px;
20
+ line-height: 1.4;
21
+ }
22
+
23
+ body {
24
+ padding-top: 20px;
25
+ padding-bottom: 40px;
26
+ width: 1024px;
27
+ margin-left: auto;
28
+ margin-right: auto;
29
+ }
30
+
31
+ pre {
32
+ background-color: #f8f8f8;
33
+ padding: 10px;
34
+ font-family: monospace;
35
+ font-size: 13px;
36
+ white-space: pre;
37
+ border-style: solid;
38
+ border-width: 1px;
39
+ border-color: #ccc;
40
+ }
41
+
42
+ a {
43
+ color: rgb(205, 91, 69);
44
+ text-decoration: none;
45
+ }
46
+ a:hover {
47
+ color: rgb(205, 91, 69);
48
+ text-decoration: underline;
49
+ }
50
+
51
+ h1 {
52
+ font-size: 30px;
53
+ }
54
+
55
+ h2 {
56
+ font-size: 27px;
57
+ }
58
+
59
+ h3 {
60
+ font-size: 22px;
61
+ }
62
+
63
+ hr {
64
+ border-color: rgb(205, 91, 69);
65
+ border-width: 4px;
66
+ border-style: solid;
67
+ margin-top: 50px;
68
+ margin-bottom: 50px;
69
+ }
70
+
71
+ table {
72
+ width: 100%;
73
+ border-spacing: 0px;
74
+ border-collapse: collapse;
75
+ }
76
+
77
+ tr:hover {
78
+ background-color: rgb(255, 240, 237);
79
+ }
80
+
81
+ td {
82
+ padding-top: 6px;
83
+ padding-bottom: 6px;
84
+ padding-left: 8px;
85
+ border-top-style: solid;
86
+ border-top-width: 1px;
87
+ border-top-color: #ccc;
88
+ border-bottom-style: solid;
89
+ border-bottom-width: 1px;
90
+ border-bottom-color: #ccc;
91
+ text-align: left;
92
+ }
93
+
94
+ .summary {
95
+ padding-top: 15px;
96
+ padding-left: 15px;
97
+ display: block;
98
+ }
99
+
100
+
101
+ /* Table of contents */
102
+
103
+ .toc .title {
104
+ border-bottom-width: 1px;
105
+ border-bottom-style: solid;
106
+ border-bottom-color: rgb(205, 91, 69);
107
+ line-height: 30px;
108
+ margin-bottom: 40px;
109
+ }
110
+
111
+ .toc h3 {
112
+ color: rgb(205, 91, 69);
113
+ }
114
+
115
+ /* Route section */
116
+
117
+ .route .title a:hover {
118
+ text-decoration: none;
119
+ }
120
+
121
+ .route td {
122
+ vertical-align: top;
123
+ }
124
+
125
+ .route ul {
126
+ padding-left: 20px;
127
+ margin-top: 0;
128
+ margin-bottom: 0;
129
+ }
130
+
131
+ .route li {
132
+ /* list-style-type: none; */
133
+ }
134
+
135
+ .route .constraint {
136
+ color: rgb(100, 100, 100);
137
+ font-size: smaller;
138
+ }
139
+
140
+ /* JSON highlighting */
141
+
142
+ .json_highlight .keyword {
143
+ font-weight: bold;
144
+ }
145
+
146
+ .json_highlight .numeric {
147
+ color: #099;
148
+ }
149
+
150
+ .json_highlight .key {
151
+ color: #000080;
152
+ }
153
+
154
+ .json_highlight .string {
155
+ color: #d14;
156
+ }
157
+
158
+ .json_highlight .comment {
159
+ color: rgb(236, 166, 18);
160
+ }