apipie-rails 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -0
- data/Gemfile.rails50 +1 -0
- data/README.rst +28 -2
- data/app/controllers/apipie/apipies_controller.rb +1 -1
- data/lib/apipie/dsl_definition.rb +51 -6
- data/lib/apipie/method_description.rb +4 -0
- data/lib/apipie/param_description.rb +14 -1
- data/lib/apipie/validator.rb +20 -1
- data/lib/apipie/version.rb +1 -1
- data/lib/tasks/apipie.rake +8 -11
- data/spec/controllers/extended_controller_spec.rb +10 -0
- data/spec/dummy/app/controllers/concerns/extending_concern.rb +11 -0
- data/spec/dummy/app/controllers/extended_controller.rb +12 -0
- metadata +9 -3
- data/Gemfile +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff402148f82601329555c80c61abcf03b5aad5f8
|
4
|
+
data.tar.gz: 3e813a085a3f97ac4a22c0bb4868d2794aa92d66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ec2b8a330539a058e6c9a1b454635016ffcdc53374a661fb58eed1de6adb404ab0085f18d2e99f4ed7c99a091cb7ddf649bcc74fa5676dad4ed24f2a02e05ac
|
7
|
+
data.tar.gz: cd298cfd7e25d2ad6abcc1cc78c1d63d406f2a41a7f12505b0f2261302a319df3229878c1db0af2cd389b0e1c72b57b02cb2a1c980defff283ab8d324e992277
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Changelog
|
2
2
|
===========
|
3
3
|
|
4
|
+
v0.5.2
|
5
|
+
------
|
6
|
+
|
7
|
+
- A way to extend an exiting API via concern [\#554](https://github.com/Apipie/apipie-rails/pull/554) ([iNecas](https://github.com/iNecas))
|
8
|
+
- Fallback to apipie views when application override isn't present [\#552](https://github.com/Apipie/apipie-rails/pull/552) ([tstrachota](https://github.com/tstrachota))
|
9
|
+
- Updated setting default locale for api documentation [\#543](https://github.com/Apipie/apipie-rails/pull/543) ([DmitryKK](https://github.com/DmitryKK))
|
10
|
+
|
4
11
|
v0.5.1
|
5
12
|
------
|
6
13
|
|
data/Gemfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.rails50
|
data/Gemfile.rails50
CHANGED
data/README.rst
CHANGED
@@ -504,6 +504,32 @@ Example
|
|
504
504
|
end
|
505
505
|
|
506
506
|
|
507
|
+
Sometimes, it's needed to extend an existing controller method with additional
|
508
|
+
parameters (usually when extending exiting API from plugins/rails engines).
|
509
|
+
The concern can be also used for this purposed, using `update_api` method.
|
510
|
+
The params defined in this block are merged with the params of the original method
|
511
|
+
in the controller this concern is included to.
|
512
|
+
|
513
|
+
Example
|
514
|
+
~~~~~~~
|
515
|
+
|
516
|
+
.. code:: ruby
|
517
|
+
|
518
|
+
module Concerns
|
519
|
+
module OauthConcern
|
520
|
+
extend Apipie::DSL::Concern
|
521
|
+
|
522
|
+
update_api(:create, :update) do
|
523
|
+
param :user, Hash do
|
524
|
+
param :oauth, String, :desc => 'oauth param'
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
The concern needs to be included to the controller after the methods are defined
|
531
|
+
(either at the end of the class, or by using
|
532
|
+
``Controller.send(:include, Concerns::OauthConcern)``.
|
507
533
|
|
508
534
|
=========================
|
509
535
|
Configuration Reference
|
@@ -999,7 +1025,7 @@ the default version is used instead.
|
|
999
1025
|
========
|
1000
1026
|
|
1001
1027
|
The default markup language is `RDoc
|
1002
|
-
<
|
1028
|
+
<https://rdoc.github.io/rdoc/RDoc/Markup.html>`_. It can be changed in
|
1003
1029
|
the config file (``config.markup=``) to one of these:
|
1004
1030
|
|
1005
1031
|
Markdown
|
@@ -1231,7 +1257,7 @@ one example per method) by adding a 'title' attribute.
|
|
1231
1257
|
- recorded: true
|
1232
1258
|
|
1233
1259
|
In RSpec you can add metadata to examples. We can use that feature
|
1234
|
-
to mark selected examples
|
1260
|
+
to mark selected examples - the ones that perform the requests that we want to
|
1235
1261
|
show as examples in the documentation.
|
1236
1262
|
|
1237
1263
|
For example, we can add ``show_in_doc`` to examples, like this:
|
@@ -8,6 +8,14 @@ module Apipie
|
|
8
8
|
module Base
|
9
9
|
attr_reader :apipie_resource_descriptions, :api_params
|
10
10
|
|
11
|
+
def _apipie_eval_dsl(*args, &block)
|
12
|
+
raise 'The Apipie DLS data need to be cleared before evaluating new block' if @_apipie_dsl_data
|
13
|
+
instance_exec(*args, &block)
|
14
|
+
return _apipie_dsl_data
|
15
|
+
ensure
|
16
|
+
_apipie_dsl_data_clear
|
17
|
+
end
|
18
|
+
|
11
19
|
private
|
12
20
|
|
13
21
|
def _apipie_dsl_data
|
@@ -381,6 +389,37 @@ module Apipie
|
|
381
389
|
_apipie_concern_subst.merge!(subst_hash)
|
382
390
|
end
|
383
391
|
|
392
|
+
# Allows to update existing params after definition was made (usually needed
|
393
|
+
# when extending the API form plugins).
|
394
|
+
#
|
395
|
+
# UsersController.apipie_update_params([:create, :update]) do
|
396
|
+
# param :user, Hash do
|
397
|
+
# param :oauth, String
|
398
|
+
# end
|
399
|
+
# end
|
400
|
+
#
|
401
|
+
# The block is evaluated in scope of the controller. Ohe can pass some additional
|
402
|
+
# objects via additional arguments like this:
|
403
|
+
#
|
404
|
+
# UsersController.apipie_update_params([:create, :update], [:name, :secret]) do |param_names|
|
405
|
+
# param :user, Hash do
|
406
|
+
# param_names.each { |p| param p, String }
|
407
|
+
# end
|
408
|
+
# end
|
409
|
+
def apipie_update_params(methods, *args, &block)
|
410
|
+
methods.each do |method|
|
411
|
+
method_description = Apipie.get_method_description(self, method)
|
412
|
+
unless method_description
|
413
|
+
raise "Could not find method description for #{self}##{method}. Was the method defined?"
|
414
|
+
end
|
415
|
+
dsl_data = _apipie_eval_dsl(*args, &block)
|
416
|
+
params_ordered = dsl_data[:params].map do |args|
|
417
|
+
Apipie::ParamDescription.from_dsl_data(method_description, args)
|
418
|
+
end
|
419
|
+
ParamDescription.unify(method_description.params_ordered_self + params_ordered)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
384
423
|
def _apipie_concern_subst
|
385
424
|
@_apipie_concern_subst ||= {:controller_path => self.controller_path,
|
386
425
|
:resource_id => Apipie.get_resource_name(self)}
|
@@ -428,12 +467,19 @@ module Apipie
|
|
428
467
|
description = Apipie.define_method_description(controller, method_name, _apipie_dsl_data)
|
429
468
|
controller._apipie_define_validators(description)
|
430
469
|
end
|
470
|
+
_apipie_concern_update_api_blocks.each do |(methods, block)|
|
471
|
+
controller.apipie_update_params(methods, &block)
|
472
|
+
end
|
431
473
|
end
|
432
474
|
|
433
475
|
def _apipie_concern_data
|
434
476
|
@_apipie_concern_data ||= []
|
435
477
|
end
|
436
478
|
|
479
|
+
def _apipie_concern_update_api_blocks
|
480
|
+
@_apipie_concern_update_api_blocks ||= []
|
481
|
+
end
|
482
|
+
|
437
483
|
def apipie_concern?
|
438
484
|
true
|
439
485
|
end
|
@@ -449,6 +495,10 @@ module Apipie
|
|
449
495
|
_apipie_dsl_data_clear
|
450
496
|
end
|
451
497
|
|
498
|
+
def update_api(*methods, &block)
|
499
|
+
_apipie_concern_update_api_blocks << [methods, block]
|
500
|
+
end
|
501
|
+
|
452
502
|
end
|
453
503
|
|
454
504
|
class ResourceDescriptionDsl
|
@@ -461,14 +511,9 @@ module Apipie
|
|
461
511
|
@controller = controller
|
462
512
|
end
|
463
513
|
|
464
|
-
def _eval_dsl(&block)
|
465
|
-
instance_eval(&block)
|
466
|
-
return _apipie_dsl_data
|
467
|
-
end
|
468
|
-
|
469
514
|
# evaluates resource description DSL and returns results
|
470
515
|
def self.eval_dsl(controller, &block)
|
471
|
-
dsl_data = self.new(controller).
|
516
|
+
dsl_data = self.new(controller)._apipie_eval_dsl(&block)
|
472
517
|
if dsl_data[:api_versions].empty?
|
473
518
|
dsl_data[:api_versions] = Apipie.controller_versions(controller)
|
474
519
|
end
|
@@ -65,6 +65,10 @@ module Apipie
|
|
65
65
|
params_ordered.reduce(ActiveSupport::OrderedHash.new) { |h,p| h[p.name] = p; h }
|
66
66
|
end
|
67
67
|
|
68
|
+
def params_ordered_self
|
69
|
+
@params_ordered
|
70
|
+
end
|
71
|
+
|
68
72
|
def params_ordered
|
69
73
|
all_params = []
|
70
74
|
parent = Apipie.get_resource_description(@resource.controller.superclass)
|
@@ -21,6 +21,19 @@ module Apipie
|
|
21
21
|
&block)
|
22
22
|
end
|
23
23
|
|
24
|
+
def to_s
|
25
|
+
"ParamDescription: #{method_description.id}##{name}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def ==(other)
|
29
|
+
return false unless self.class == other.class
|
30
|
+
if method_description == other.method_description && @options == other.options
|
31
|
+
true
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
24
37
|
def initialize(method_description, name, validator, desc_or_options = nil, options = {}, &block)
|
25
38
|
|
26
39
|
if desc_or_options.is_a?(Hash)
|
@@ -146,7 +159,7 @@ module Apipie
|
|
146
159
|
self
|
147
160
|
end
|
148
161
|
|
149
|
-
# merge param
|
162
|
+
# merge param descriptions. Allows defining hash params on more places
|
150
163
|
# (e.g. in param_groups). For example:
|
151
164
|
#
|
152
165
|
# def_param_group :user do
|
data/lib/apipie/validator.rb
CHANGED
@@ -13,6 +13,16 @@ module Apipie
|
|
13
13
|
@param_description = param_description
|
14
14
|
end
|
15
15
|
|
16
|
+
def inspected_fields
|
17
|
+
[:param_description]
|
18
|
+
end
|
19
|
+
|
20
|
+
def inspect
|
21
|
+
string = "#<#{self.class.name}:#{self.object_id} "
|
22
|
+
fields = inspected_fields.map {|field| "#{field}: #{self.send(field)}"}
|
23
|
+
string << fields.join(", ") << ">"
|
24
|
+
end
|
25
|
+
|
16
26
|
def self.inherited(subclass)
|
17
27
|
@validators ||= []
|
18
28
|
@validators.insert 0, subclass
|
@@ -67,13 +77,22 @@ module Apipie
|
|
67
77
|
end
|
68
78
|
|
69
79
|
def merge_with(other_validator)
|
70
|
-
|
80
|
+
return self if self == other_validator
|
81
|
+
raise NotImplementedError, "Don't know how to merge #{self.inspect} with #{other_validator.inspect}"
|
71
82
|
end
|
72
83
|
|
73
84
|
def params_ordered
|
74
85
|
nil
|
75
86
|
end
|
76
87
|
|
88
|
+
def ==(other)
|
89
|
+
return false unless self.class == other.class
|
90
|
+
if param_description == other.param_description
|
91
|
+
true
|
92
|
+
else
|
93
|
+
false
|
94
|
+
end
|
95
|
+
end
|
77
96
|
end
|
78
97
|
|
79
98
|
# validate arguments type
|
data/lib/apipie/version.rb
CHANGED
data/lib/tasks/apipie.rake
CHANGED
@@ -100,17 +100,14 @@ namespace :apipie do
|
|
100
100
|
# Attempt to use the Rails application views, otherwise default to built in views
|
101
101
|
def renderer
|
102
102
|
return @apipie_renderer if @apipie_renderer
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
File.expand_path("../../../app/views/layouts", __FILE__)
|
112
|
-
end
|
113
|
-
@apipie_renderer = ActionView::Base.new([base_path, layouts_path])
|
103
|
+
|
104
|
+
base_paths = [File.expand_path("../../../app/views/apipie/apipies", __FILE__)]
|
105
|
+
base_paths.unshift("#{Rails.root}/app/views/apipie/apipies") if File.directory?("#{Rails.root}/app/views/apipie/apipies")
|
106
|
+
|
107
|
+
layouts_paths = [File.expand_path("../../../app/views/layouts", __FILE__)]
|
108
|
+
layouts_paths.unshift("#{Rails.root}/app/views/layouts") if File.directory?("#{Rails.root}/app/views/layouts/apipie")
|
109
|
+
|
110
|
+
@apipie_renderer = ActionView::Base.new(base_paths + layouts_paths)
|
114
111
|
@apipie_renderer.singleton_class.send(:include, ApipieHelper)
|
115
112
|
return @apipie_renderer
|
116
113
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ExtendedController do
|
4
|
+
|
5
|
+
it 'should include params from both original controller and extending concern' do
|
6
|
+
user_param = Apipie["extended#create"].params[:user]
|
7
|
+
expect(user_param.validator.params_ordered.map(&:name)).to eq [:name, :password, :from_concern]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apipie-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Pokorny
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -225,6 +225,7 @@ files:
|
|
225
225
|
- spec/controllers/api/v2/nested/resources_controller_spec.rb
|
226
226
|
- spec/controllers/apipies_controller_spec.rb
|
227
227
|
- spec/controllers/concerns_controller_spec.rb
|
228
|
+
- spec/controllers/extended_controller_spec.rb
|
228
229
|
- spec/controllers/users_controller_spec.rb
|
229
230
|
- spec/dummy/Rakefile
|
230
231
|
- spec/dummy/app/controllers/api/base_controller.rb
|
@@ -235,8 +236,10 @@ files:
|
|
235
236
|
- spec/dummy/app/controllers/api/v2/nested/architectures_controller.rb
|
236
237
|
- spec/dummy/app/controllers/api/v2/nested/resources_controller.rb
|
237
238
|
- spec/dummy/app/controllers/application_controller.rb
|
239
|
+
- spec/dummy/app/controllers/concerns/extending_concern.rb
|
238
240
|
- spec/dummy/app/controllers/concerns/sample_controller.rb
|
239
241
|
- spec/dummy/app/controllers/concerns_controller.rb
|
242
|
+
- spec/dummy/app/controllers/extended_controller.rb
|
240
243
|
- spec/dummy/app/controllers/files_controller.rb
|
241
244
|
- spec/dummy/app/controllers/overridden_concerns_controller.rb
|
242
245
|
- spec/dummy/app/controllers/twitter_example_controller.rb
|
@@ -299,7 +302,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
299
302
|
version: '0'
|
300
303
|
requirements: []
|
301
304
|
rubyforge_project:
|
302
|
-
rubygems_version: 2.
|
305
|
+
rubygems_version: 2.5.1
|
303
306
|
signing_key:
|
304
307
|
specification_version: 4
|
305
308
|
summary: Rails REST API documentation tool
|
@@ -309,6 +312,7 @@ test_files:
|
|
309
312
|
- spec/controllers/api/v2/nested/resources_controller_spec.rb
|
310
313
|
- spec/controllers/apipies_controller_spec.rb
|
311
314
|
- spec/controllers/concerns_controller_spec.rb
|
315
|
+
- spec/controllers/extended_controller_spec.rb
|
312
316
|
- spec/controllers/users_controller_spec.rb
|
313
317
|
- spec/dummy/Rakefile
|
314
318
|
- spec/dummy/app/controllers/api/base_controller.rb
|
@@ -319,8 +323,10 @@ test_files:
|
|
319
323
|
- spec/dummy/app/controllers/api/v2/nested/architectures_controller.rb
|
320
324
|
- spec/dummy/app/controllers/api/v2/nested/resources_controller.rb
|
321
325
|
- spec/dummy/app/controllers/application_controller.rb
|
326
|
+
- spec/dummy/app/controllers/concerns/extending_concern.rb
|
322
327
|
- spec/dummy/app/controllers/concerns/sample_controller.rb
|
323
328
|
- spec/dummy/app/controllers/concerns_controller.rb
|
329
|
+
- spec/dummy/app/controllers/extended_controller.rb
|
324
330
|
- spec/dummy/app/controllers/files_controller.rb
|
325
331
|
- spec/dummy/app/controllers/overridden_concerns_controller.rb
|
326
332
|
- spec/dummy/app/controllers/twitter_example_controller.rb
|