apipie-rails 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/Gemfile.lock +5 -3
  2. data/README.rst +688 -0
  3. data/apipie-rails.gemspec +2 -4
  4. data/app/controllers/apipie/apipies_controller.rb +73 -41
  5. data/app/views/apipie/apipies/index.html.erb +10 -3
  6. data/app/views/apipie/apipies/method.html.erb +5 -2
  7. data/app/views/apipie/apipies/resource.html.erb +10 -3
  8. data/lib/apipie-rails.rb +1 -0
  9. data/lib/apipie/apipie_module.rb +28 -79
  10. data/lib/apipie/application.rb +194 -97
  11. data/lib/apipie/client/generator.rb +5 -4
  12. data/lib/apipie/configuration.rb +112 -0
  13. data/lib/apipie/dsl_definition.rb +93 -16
  14. data/lib/apipie/extractor.rb +12 -5
  15. data/lib/apipie/extractor/collector.rb +1 -1
  16. data/lib/apipie/extractor/recorder.rb +2 -1
  17. data/lib/apipie/extractor/writer.rb +11 -4
  18. data/lib/apipie/helpers.rb +15 -4
  19. data/lib/apipie/markup.rb +3 -4
  20. data/lib/apipie/method_description.rb +28 -22
  21. data/lib/apipie/resource_description.rb +44 -42
  22. data/lib/apipie/routing.rb +3 -1
  23. data/lib/apipie/static_dispatcher.rb +0 -1
  24. data/lib/apipie/version.rb +1 -1
  25. data/lib/generators/apipie/install/README +6 -0
  26. data/lib/generators/apipie/install/install_generator.rb +25 -0
  27. data/lib/generators/apipie/install/templates/initializer.rb.erb +7 -0
  28. data/lib/tasks/apipie.rake +31 -39
  29. data/spec/controllers/api/v1/architectures_controller_spec.rb +30 -0
  30. data/spec/controllers/api/v2/architectures_controller_spec.rb +12 -0
  31. data/spec/controllers/apipies_controller_spec.rb +18 -12
  32. data/spec/controllers/users_controller_spec.rb +56 -19
  33. data/spec/dummy/app/controllers/api/base_controller.rb +4 -0
  34. data/spec/dummy/app/controllers/api/v1/architectures_controller.rb +32 -0
  35. data/spec/dummy/app/controllers/api/v1/base_controller.rb +11 -0
  36. data/spec/dummy/app/controllers/api/v2/architectures_controller.rb +32 -0
  37. data/spec/dummy/app/controllers/api/v2/base_controller.rb +11 -0
  38. data/spec/dummy/app/controllers/twitter_example_controller.rb +1 -1
  39. data/spec/dummy/app/controllers/users_controller.rb +2 -3
  40. data/spec/dummy/config/initializers/apipie.rb +29 -6
  41. data/spec/lib/method_description_spec.rb +29 -0
  42. data/spec/lib/param_description_spec.rb +41 -0
  43. data/spec/lib/resource_description_spec.rb +28 -0
  44. data/spec/spec_helper.rb +1 -1
  45. metadata +99 -164
  46. data/README.rdoc +0 -367
  47. data/lib/apipie/client/base.rb +0 -133
  48. data/lib/apipie/client/cli_command.rb +0 -130
  49. data/lib/apipie/client/main.rb +0 -101
  50. data/lib/apipie/client/rest_client_oauth.rb +0 -19
  51. data/lib/apipie/client/template/Gemfile.tt +0 -3
  52. data/lib/apipie/client/template/README.tt +0 -3
  53. data/lib/apipie/client/template/Rakefile.tt +0 -2
  54. data/lib/apipie/client/template/a_name.gemspec.tt +0 -23
  55. data/lib/apipie/client/template/bin/bin.rb.tt +0 -30
  56. data/lib/apipie/client/template/lib/a_name.rb.tt +0 -27
  57. data/lib/apipie/client/template/lib/a_name/commands/cli.rb.tt +0 -22
  58. data/lib/apipie/client/template/lib/a_name/config.yml +0 -6
  59. data/lib/apipie/client/template/lib/a_name/resources/resource.rb.tt +0 -22
  60. data/lib/apipie/client/template/lib/a_name/version.rb.tt +0 -3
  61. data/lib/apipie/client/thor.rb +0 -21
  62. data/rubygem-apipie-rails.spec +0 -122
  63. data/spec/lib/parameter_description_spec.rb +0 -41
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- apipie-rails (0.0.11)
4
+ apipie-rails (0.0.13)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -46,6 +46,8 @@ GEM
46
46
  i18n (>= 0.4.0)
47
47
  mime-types (~> 1.16)
48
48
  treetop (~> 1.4.8)
49
+ maruku (0.6.1)
50
+ syntax (>= 1.0.0)
49
51
  mime-types (1.19)
50
52
  minitest (3.2.0)
51
53
  multi_json (1.3.6)
@@ -76,7 +78,6 @@ GEM
76
78
  rake (0.9.2.2)
77
79
  rdoc (3.12)
78
80
  json (~> 1.4)
79
- redcarpet (2.1.1)
80
81
  rest-client (1.6.7)
81
82
  mime-types (>= 1.16)
82
83
  rspec (2.11.0)
@@ -97,6 +98,7 @@ GEM
97
98
  rack (~> 1.0)
98
99
  tilt (~> 1.1, != 1.3.0)
99
100
  sqlite3 (1.3.6)
101
+ syntax (1.0.0)
100
102
  thor (0.15.4)
101
103
  tilt (1.3.3)
102
104
  treetop (1.4.10)
@@ -110,11 +112,11 @@ PLATFORMS
110
112
  DEPENDENCIES
111
113
  RedCloth
112
114
  apipie-rails!
115
+ maruku
113
116
  minitest
114
117
  oauth
115
118
  rails (>= 3.0.10)
116
119
  rake
117
- redcarpet
118
120
  rest-client
119
121
  rspec-rails
120
122
  sqlite3
@@ -0,0 +1,688 @@
1
+ ========================
2
+ API Documentation Tool
3
+ ========================
4
+
5
+ .. image:: https://secure.travis-ci.org/Pajk/apipie-rails.png?branch=master
6
+
7
+ Apipie-rails is a DSL and Rails engine for documenting you RESTful
8
+ API. Instead of traditional use of ``#comments``, Apipie let's you
9
+ describe the code by code. This brings advantages like:
10
+
11
+ * no need to learn yet another syntax, you already know Ruby, right?
12
+ * possibility reuse the doc for other purposes (like validation)
13
+ * easier to extend and maintain (no string parsing involved)
14
+ * possibility to use other sources for documentation purposes (such as
15
+ routes etc.)
16
+
17
+ The documenatation is available right in your app (by default under
18
+ ``/apipie`` path. In development mode, you can see the changes as you
19
+ go. It's markup language agnostic and even provides an API for reusing
20
+ the documentation data in form of JSON.
21
+
22
+ Getting started
23
+ ---------------
24
+
25
+ The easiest way to get Apipie up and running with your app is:
26
+
27
+ .. code::
28
+
29
+ $ echo "gem 'apipie-rails'" >> Gemfile
30
+ $ bundle install
31
+ $ rails g apipie:install
32
+
33
+ Now you can start documenting your resources and actions (see
34
+ `DSL Reference`_ for more info:
35
+
36
+ .. code:: ruby
37
+
38
+ api :GET, '/users/:id'
39
+ param :id, :number
40
+ def show
41
+ # ...
42
+ end
43
+
44
+
45
+ Run your application and see the result at
46
+ ``http://localhost:3000/apipie``. For it's further processing, you can
47
+ use ``http://localhost:3000/apipie.json``.
48
+
49
+ For more comprehensive getting started guide, see
50
+ `this demo <https://github.com/iNecas/apipie-demo>`_, that includes
51
+ features like generating documenation from tests, recording examples etc.
52
+
53
+ Screenshots
54
+ -----------
55
+
56
+ .. image:: https://img.skitch.com/20120428-nruk3e87xs2cu4ydsjujdh11fq.png
57
+ .. image:: https://img.skitch.com/20120428-bni2cmq5cyhjuw1jkd78e3qjxn.png
58
+
59
+ Authors
60
+ -------
61
+
62
+ `Pajk <https://github.com/Pajk>`_ and `iNecas <https://github.com/iNecas>`_
63
+
64
+ Contributors
65
+ ------------
66
+
67
+ See `Contributors page <https://github.com/Pajk/apipie-rails/graphs/contributors>`_. Special thanks to all of them!
68
+
69
+ License
70
+ -------
71
+
72
+ Apipie-rails is released under the `MIT License <http://opensource.org/licenses/MIT>`_
73
+
74
+ ===============
75
+ Documentation
76
+ ===============
77
+
78
+ .. contents:: `Table Of Contents`
79
+ :depth: 2
80
+
81
+ ===============
82
+ DSL Reference
83
+ ===============
84
+
85
+ Resource Description
86
+ --------------------
87
+
88
+ You can describe a resource on controller level. The description is introcudes by calling
89
+ ``resource description do ... end``.
90
+
91
+ Inheritance is supported, so you can specify common params for group of controlelrs in their parent
92
+ class.
93
+
94
+ The following keywords are available (all are optional):
95
+
96
+ resource_id
97
+ How will be the resource referenced in Apipie (paths, ``see`` command etc.), by default `controller_name.downcase` is used.
98
+
99
+ name
100
+ Human readable name of resource. By default ``class.name.humanize`` is used.
101
+
102
+ short (also short_description)
103
+ Short description of the resource (it's shown on both list of resources and resource details)
104
+
105
+ desc (also description and full_description)
106
+ Full description of the resource (shown only on resource details)
107
+
108
+ param
109
+ Common params for all method defined in controller/child controllers.
110
+
111
+ api_base_url
112
+ What url is the resource available under.
113
+
114
+ api_versions (also api_version)
115
+ What versions does the controller define the resource. (See `Versioning`_ for details.)
116
+
117
+ formats
118
+ request / response formats.
119
+
120
+ error
121
+ Describe each possible error that can happen what calling all
122
+ methods define in controller. HTTP response code and description can be provided.
123
+
124
+ app_info
125
+ In case of versioning, this set's app info description on per_version basis.
126
+
127
+ Example:
128
+ ~~~~~~~~
129
+
130
+ .. code:: ruby
131
+
132
+ resource_description do
133
+ short 'Site members'
134
+ path '/users'
135
+ formats ['json']
136
+ param :id, Fixnum, :desc => "User ID", :required => false
137
+ param :resource_param, Hash, :desc => 'Param description for all methods' do
138
+ param :ausername, String, :desc => "Username for login", :required => true
139
+ param :apassword, String, :desc => "Password for login", :required => true
140
+ end
141
+ api_version "development"
142
+ error 404, "Missing"
143
+ error 500, "Server crashed for some <%= reason %>"
144
+ description <<-EOS
145
+ == Long description
146
+ Example resource for rest api documentation
147
+ These can now be accessed in <tt>shared/header</tt> with:
148
+ Headline: <%= headline %>
149
+ First name: <%= person.first_name %>
150
+
151
+ If you need to find out whether a certain local variable has been
152
+ assigned a value in a particular render call, you need to use the
153
+ following pattern:
154
+
155
+ <% if local_assigns.has_key? :headline %>
156
+ Headline: <%= headline %>
157
+ <% end %>
158
+
159
+ Testing using <tt>defined? headline</tt> will not work. This is an
160
+ implementation restriction.
161
+
162
+ === Template caching
163
+
164
+ By default, Rails will compile each template to a method in order
165
+ to render it. When you alter a template, Rails will check the
166
+ file's modification time and recompile it in development mode.
167
+ EOS
168
+ end
169
+
170
+
171
+ Method Description
172
+ ------------------
173
+
174
+ Then describe methods available to your API.
175
+
176
+ api
177
+ Say how is this method exposed and provide short description.
178
+ The first parameter is HTTP method (one of :GET/:POST/:PUT/:DELETE).
179
+ The second parameter is relative URL path which is mapped to this
180
+ method. The last parameter is methods short description.
181
+ You can use this +api+ method more than once for one method. It could
182
+ be useful when there are more routes mapped to it.
183
+
184
+ api_versions (also api_version)
185
+ What version(s) does the action belong to. (See `Versioning`_ for details.)
186
+
187
+ param
188
+ Look at Parameter description section for details.
189
+
190
+ formats
191
+ Method level request / response formats.
192
+
193
+ error
194
+ Describe each possible error that can happen what calling this
195
+ method. HTTP response code and description can be provided.
196
+
197
+ description
198
+ Full method description which will be converted to HTML by
199
+ chosen markup language processor.
200
+
201
+ example
202
+ Provide example of server response, whole communication or response type.
203
+ It will be formatted as code.
204
+
205
+ see
206
+ Provide reference to another method, this has to be string with
207
+ controller_name#method_name.
208
+
209
+ Example:
210
+ ~~~~~~~~
211
+
212
+ .. code:: ruby
213
+
214
+ api :GET, "/users/:id", "Show user profile"
215
+ error :code => 401, :desc => "Unauthorized"
216
+ error :code => 404, :desc => "Not Found"
217
+ param :session, String, :desc => "user is logged in", :required => true
218
+ param :regexp_param, /^[0-9]* years/, :desc => "regexp param"
219
+ param :array_param, [100, "one", "two", 1, 2], :desc => "array validator"
220
+ param :boolean_param, [true, false], :desc => "array validator with boolean"
221
+ param :proc_param, lambda { |val|
222
+ val == "param value" ? true : "The only good value is 'param value'."
223
+ }, :desc => "proc validator"
224
+ description "method description"
225
+ formats ['json', 'jsonp', 'xml']
226
+ example " 'user': {...} "
227
+ see "users#showme"
228
+ def show
229
+ #...
230
+ end
231
+
232
+
233
+ Parameter Description
234
+ ---------------------
235
+
236
+ Use ``param`` to describe every possible parameter. You can use Hash validator
237
+ in cooperation with block given to param method to describe nested parameters.
238
+
239
+ name
240
+ The first argument is parameter name as a symbol.
241
+
242
+ validator
243
+ Second parameter is parameter validator, choose one from section `Validators`_
244
+
245
+ desc
246
+ Parameter description.
247
+
248
+ required
249
+ Set this true/false to make it required/optional. Default is optional
250
+
251
+ allow_nil
252
+ Set true is ``nil`` can be passed for this param.
253
+
254
+ Example:
255
+ ~~~~~~~~
256
+
257
+ .. code:: ruby
258
+
259
+ param :user, Hash, :desc => "User info" do
260
+ param :username, String, :desc => "Username for login", :required => true
261
+ param :password, String, :desc => "Password for login", :required => true
262
+ param :membership, ["standard","premium"], :desc => "User membership"
263
+ end
264
+ def create
265
+ #...
266
+ end
267
+
268
+
269
+ =========================
270
+ Configuration Reference
271
+ =========================
272
+
273
+ Create configuration file in e.g. ``/config/initializers/apipie.rb``.
274
+ You can set application name, footer text, API and documentation base URL
275
+ and turn off validations. You can also choose your favorite markup language
276
+ of full descriptions.
277
+
278
+ app_name
279
+ Name of your application used in breadcrumbs navigation.
280
+
281
+ copyright
282
+ Copyright information (shown in page footer).
283
+
284
+ doc_base_url
285
+ Documentation frontend base url.
286
+
287
+ api_base_url
288
+ Base url of your API, most probably /api.
289
+
290
+ default_version
291
+ Default API version to be used (1.0 by default)
292
+
293
+ validate
294
+ Parameters validation is turned off when set to false.
295
+
296
+ app_info
297
+ Application long description.
298
+
299
+ reload_controllers
300
+ Set to enable/disable reloading controllers (and the documentation with it), by default enabled in development.
301
+
302
+ api_controllers_matcher
303
+ For reloading to work properly you need to specify where your API controllers are.
304
+
305
+ markup
306
+ You can choose markup language for descriptions of your application,
307
+ resources and methods. RDoc is the default but you can choose from
308
+ Apipie::Markup::Markdown.new or Apipie::Markup::Textile.new.
309
+ In order to use Markdown you need Redcarpet gem and for Textile you
310
+ need RedCloth. Add those to your gemfile and run bundle if you
311
+ want to use them. You can also add any other markup language
312
+ processor.
313
+
314
+ layout
315
+ 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.
316
+
317
+ ignored
318
+ An array of controller names (strings) (might include actions as well)
319
+ to be ignored when generationg the documentation
320
+ e.g. ``%w[Api::CommentsController Api::PostsController#post]``
321
+
322
+
323
+ Example:
324
+
325
+ .. code:: ruby
326
+
327
+ Apipie.configure do |config|
328
+ config.app_name = "Test app"
329
+ config.copyright = "&copy; 2012 Pavel Pokorny"
330
+ config.doc_base_url = "/apidoc"
331
+ config.api_base_url = "/api"
332
+ config.validate = false
333
+ config.markup = Apipie::Markup::Markdown.new
334
+ config.reload_controllers = true
335
+ config.api_controllers_matcher = File.join(Rails.root, "app", "controllers", "**","*.rb")
336
+ config.app_info = <<-"
337
+ This is where you can inform user about your application and API
338
+ in general.
339
+ ", '1.0'
340
+ end
341
+
342
+
343
+ ============
344
+ Validators
345
+ ============
346
+
347
+ Every parameter needs to have associated validator. For now there are some
348
+ basic validators. You can always provide your own to reach complex
349
+ results.
350
+
351
+ If validations are enabled (default state) the parameters of every
352
+ request are validated. If the value is wrong a +ArgumentError+ exception
353
+ is raised and can be rescued and processed. It contains some description
354
+ of parameter value expectations. Validations can be turned off
355
+ in configuration file.
356
+
357
+
358
+ TypeValidator
359
+ -------------
360
+ Check the parameter type. Only String, Hash and Array are supported
361
+ for the sake of simplicity. Read more to to find out how to add
362
+ your own validator.
363
+
364
+ .. code:: ruby
365
+
366
+ param :session, String, :desc => "user is logged in", :required => true
367
+ param :facts, Hash, :desc => "Additional optional facts about the user"
368
+
369
+
370
+ RegexpValidator
371
+ ---------------
372
+ Check parameter value against given regular expression.
373
+
374
+ .. code:: ruby
375
+
376
+ param :regexp_param, /^[0-9]* years/, :desc => "regexp param"
377
+
378
+
379
+ ArrayValidator
380
+ --------------
381
+
382
+ Check if parameter value is included given array.
383
+
384
+ .. code:: ruby
385
+
386
+ param :array_param, [100, "one", "two", 1, 2], :desc => "array validator"
387
+
388
+
389
+ ProcValidator
390
+ -------------
391
+
392
+ If you need more complex validation and you know you won't reuse it you
393
+ can use Proc/lambda validator. Provide your own Proc taking value
394
+ of parameter as the only argument. Return true if value pass validation
395
+ or return some text about what is wrong. _Don't use the keyword *return*
396
+ if you provide instance of Proc (with lambda it is ok), just use the last
397
+ statement return property of ruby.
398
+
399
+ .. code:: ruby
400
+
401
+ param :proc_param, lambda { |val|
402
+ val == "param value" ? true : "The only good value is 'param value'."
403
+ }, :desc => "proc validator"
404
+
405
+
406
+ HashValidator
407
+ -------------
408
+
409
+ You can describe hash parameters in depth if you provide a block with
410
+ description of nested values.
411
+
412
+ .. code:: ruby
413
+
414
+ param :user, Hash, :desc => "User info" do
415
+ param :username, String, :desc => "Username for login", :required => true
416
+ param :password, String, :desc => "Password for login", :required => true
417
+ param :membership, ["standard","premium"], :desc => "User membership"
418
+ end
419
+
420
+
421
+ NilValidator
422
+ ------------
423
+
424
+ In fact there is any NilValidator but setting it to nil can be used to
425
+ override parameters described on resource level.
426
+
427
+ .. code:: ruby
428
+
429
+ param :user, nil
430
+ def destroy
431
+ #...
432
+ end
433
+
434
+
435
+ Adding custom validator
436
+ -----------------------
437
+
438
+ Only basic validators are included but it is really easy to add your own.
439
+ Create new initializer with subclass of Apipie::Validator::BaseValidator.
440
+ Two methods are required to implement - instance method
441
+ <tt>validate(value)</tt> and class method
442
+ <tt>build(param_description, argument, options, block)</tt>.
443
+
444
+ When searching for validator +build+ method of every subclass of
445
+ Apipie::Validator::BaseValidator is called. The first one whitch return
446
+ constructed validator object is used.
447
+
448
+ Example: Adding IntegerValidator
449
+
450
+ We want to check if parameter value is an integer like this:
451
+
452
+ .. code:: ruby
453
+
454
+ param :id, Integer, :desc => "Company ID"
455
+
456
+ So we create apipie_validators.rb initializer with this content:
457
+
458
+ .. code:: ruby
459
+
460
+ class IntegerValidator < Apipie::Validator::BaseValidator
461
+
462
+ def initialize(param_description, argument)
463
+ super(param_description)
464
+ @type = argument
465
+ end
466
+
467
+ def validate(value)
468
+ return false if value.nil?
469
+ !!(value.to_s =~ /^[-+]?[0-9]+$/)
470
+ end
471
+
472
+ def self.build(param_description, argument, options, block)
473
+ if argument == Integer || argument == Fixnum
474
+ self.new(param_description, argument)
475
+ end
476
+ end
477
+
478
+ def description
479
+ "Must be #{@type}."
480
+ end
481
+ end
482
+
483
+ Parameters of the build method:
484
+
485
+ param_description
486
+ Instance of Apipie::ParamDescription contains all
487
+ given informations about validated parameter.
488
+
489
+ argument
490
+ Specified validator, in our example it is +Integer+
491
+
492
+ options
493
+ Hash with specified options, for us just ``{:desc => "Company ID"}``
494
+
495
+ block
496
+ Block converted into Proc, use it as you desire. In this example nil.
497
+
498
+
499
+ ============
500
+ Versioning
501
+ ============
502
+
503
+ Every resource/method can belong to one or more versions. The version is
504
+ specified with the `api_version` DSL keyword. When not specified,
505
+ the resource belong to `config.default_version` ("1.0" by default)
506
+
507
+ .. code:: ruby
508
+
509
+ resource_description do
510
+ api_versions "1", "2"
511
+ end
512
+
513
+ api :GET, "/api/users/"
514
+ api_version "1"
515
+ def index
516
+ # ...
517
+ end
518
+
519
+ In the example above we say the whole controller/resource is defined
520
+ for versions "1" and "2", but we override this with explicitly saying
521
+ `index` belongs only to version "1". Also inheritance works (therefore
522
+ we can specify the api_version for the parent controller and all
523
+ children will know about that).
524
+
525
+ From the Apipie API perspective, the resources belong to version.
526
+ With versioning, there are paths like this provided by apipie:
527
+
528
+ .. code::
529
+
530
+ /apipie/1/users/index
531
+ /apipie/2/users/index
532
+
533
+ When not specifying the version explicitly in the path (or in dsl),
534
+ default version (`Apipie.configuration.default_version`) is used
535
+ instead ("1.0" by default). Therefore, the application that doesn't
536
+ need versioning should work as before.
537
+
538
+ The static page generator takes version parameter (or uses default).
539
+
540
+ You can specify the versions for the examples, with `versions`
541
+ keyword. It specifies the versions the example is used for. When not
542
+ specified, it's shown in all versions with given method.
543
+
544
+ When referencing or quering the resource/method descripion, this
545
+ format should be used: "verson#resource#method". When not specified,
546
+ the default version is used instead.
547
+
548
+
549
+ ========
550
+ Markup
551
+ ========
552
+
553
+ The default markup language is `RDoc
554
+ <http://rdoc.rubyforge.org/RDoc/Markup.html>`_. It can be changed in
555
+ config file (``config.markup=``) to one of these:
556
+
557
+ Markdown
558
+ Use Apipie::Markup::Markdown.new. You need Maruku gem.
559
+
560
+ Textile
561
+ Use Apipie::Markup::Textile.new. You need RedCloth gem.
562
+
563
+ Or provide you own object with ``to_html(text)`` method.
564
+ For inspiration this is how Textile look like:
565
+
566
+ .. code:: ruby
567
+
568
+ class Textile
569
+ def initialize
570
+ require 'RedCloth'
571
+ end
572
+ def to_html(text)
573
+ RedCloth.new(text).to_html
574
+ end
575
+ end
576
+
577
+
578
+ ==============
579
+ Static files
580
+ ==============
581
+
582
+ To generate static version of documentation (perhaps to put it on
583
+ project site or something) run ``rake apipie:static`` task. It will
584
+ create set of html files (multi-pages, single-page, plain) in your doc
585
+ directory. By default the documentation for default API version is
586
+ used, you can specify the version with ``rake apipie:static[2.0]``
587
+
588
+ When you want to avoid any unnecessary computation in production mode,
589
+ you can generate a cache with ``rake apipie:cache`` and configure the
590
+ app to use it in production with ``config.use_cache = Rails.env.production?``
591
+
592
+ ===================
593
+ Tests Integration
594
+ ===================
595
+
596
+ Apipie integrates with automated testing in two ways. *Documentation
597
+ bootstrapping* and *examples recording*.
598
+
599
+ Documentation Bootstrapping
600
+ ---------------------------
601
+
602
+ Let's say you have an application without REST API documentation.
603
+ However you have a set of tests that are run against this API. A lot
604
+ of information is already included in this tests, it just needs to be
605
+ extracted somehow. Luckily, Apipie provides such a feature.
606
+
607
+ When running the tests, set the ``APIPIE_RECORD=params`` environment
608
+ variable. You can either use it with functional tests
609
+
610
+ .. code::
611
+
612
+ APIPIE_RECORD=params rake test:functionals
613
+
614
+ or you can run your server with this param, in case you run the tests
615
+ against running server
616
+
617
+ .. code::
618
+
619
+ APIPIE_RECORD=params rails server
620
+
621
+ When the process quits, the data from requests/responses are used to
622
+ determine the documentation. It's quite raw, but it makes the initial
623
+ phase much easier.
624
+
625
+ Examples Recording
626
+ ------------------
627
+
628
+ You can also use the tests to generate up-to-date examples for your
629
+ code. Similarly to the bootstrapping, you can use it with functional
630
+ tests or a running server, setting ``APIPIE_RECORD=examples``
631
+
632
+ .. code::
633
+
634
+ APIPIE_RECORD=examples rake test:functionals
635
+ APIPIE_RECORD=examples rails server
636
+
637
+ The data are written into ``doc/apipie_examples.yml``. By default,
638
+ only the first example is shown for each action. You can customize
639
+ this by setting ``show_in_doc`` attribute at each example.
640
+
641
+
642
+ ====================
643
+ Bindings Generator
644
+ ====================
645
+
646
+ In earlier versions (<= 0.0.13), there was a simple client generator
647
+ as a part of Apipie gem. As more features and users came to Apipie,
648
+ more and more there was a need for changes on per project basis. It's
649
+ hard (or even impossible) to provide a generic solution for the client
650
+ code. We also don't want to tell you what's the rigth way to do it
651
+ (what gems to use, how the API should look like etc.).
652
+
653
+ Therefore you can't generate a client code directly by a rake task in
654
+ further versions.
655
+
656
+ There is, however, even better and more flexible way to reuse your API
657
+ documentation for this purpose: using the API the Apipie
658
+ provides in the generator code. You can inspire by
659
+ `Foreman API bindings <https://github.com/mbacovsky/foreman_api>`_ that
660
+ use exactly this approach. You also don't need to run the service,
661
+ provided it uses Apipie as a backend.
662
+
663
+ And if you write one on your own, don't hesitate to share it with us!
664
+
665
+ ====================
666
+ Disqus Integration
667
+ ====================
668
+
669
+ You can get a `Disqus <http://www.disqus.com>`_ discussion for the
670
+ right into your documentation. Just set the credentials in Apipie
671
+ configuration:
672
+
673
+ .. code:: ruby
674
+
675
+ config.disqus_shortname = "MyProjectDoc"
676
+
677
+ =====================
678
+ External References
679
+ =====================
680
+
681
+ * `Getting started tutorial <https://github.com/iNecas/apipie-demo>`_ -
682
+ including examples of using the tests integration and versioning.
683
+
684
+ * `Real-world application usage <https://github.com/Katello/katello>`_
685
+
686
+ * `Read-world application usage with versioning <https://github.com/theforeman/foreman>`_
687
+
688
+ * `Using Apipie API to generate bindings <https://github.com/mbacovsky/foreman_api>`_