apipie-rails 0.1.1 → 0.1.2
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.
- data/CHANGELOG.md +9 -0
- data/README.rst +4 -0
- data/lib/apipie/application.rb +5 -10
- data/lib/apipie/configuration.rb +9 -0
- data/lib/apipie/extractor.rb +39 -22
- data/lib/apipie/extractor/collector.rb +1 -1
- data/lib/apipie/extractor/writer.rb +2 -2
- data/lib/apipie/version.rb +1 -1
- data/spec/dummy/config/initializers/apipie.rb +3 -0
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
Changelog
|
3
3
|
===========
|
4
4
|
|
5
|
+
v0.1.2
|
6
|
+
------
|
7
|
+
|
8
|
+
* reloading works correctly with to_prepare blocks in the app
|
9
|
+
[#228](https://github.com/Apipie/apipie-rails/pull/228) [@iNecas][]
|
10
|
+
* documentation bootstrapping now respects api_controllers_matcher
|
11
|
+
[#227](https://github.com/Apipie/apipie-rails/pull/227) [@clamoris][]
|
12
|
+
|
5
13
|
v0.1.1
|
6
14
|
------
|
7
15
|
|
@@ -104,3 +112,4 @@ v0.0.15
|
|
104
112
|
[@yonpols]: https://github.com/yonpols
|
105
113
|
[@mkrajewski]: https://github.com/mkrajewski
|
106
114
|
[@iNecas]: https://github.com/iNecas
|
115
|
+
[@clamoris]: https://github.com/clamoris
|
data/README.rst
CHANGED
@@ -519,6 +519,9 @@ reload_controllers
|
|
519
519
|
api_controllers_matcher
|
520
520
|
For reloading to work properly you need to specify where your API controllers are. Can be an array if multiple paths are needed
|
521
521
|
|
522
|
+
api_routes
|
523
|
+
Set if your application uses custom API router, different from Rails default
|
524
|
+
|
522
525
|
markup
|
523
526
|
You can choose markup language for descriptions of your application,
|
524
527
|
resources and methods. RDoc is the default but you can choose from
|
@@ -566,6 +569,7 @@ Example:
|
|
566
569
|
config.markup = Apipie::Markup::Markdown.new
|
567
570
|
config.reload_controllers = Rails.env.development?
|
568
571
|
config.api_controllers_matcher = File.join(Rails.root, "app", "controllers", "**","*.rb")
|
572
|
+
config.api_routes = Rails.application.routes
|
569
573
|
config.app_info = "
|
570
574
|
This is where you can inform user about your application and API
|
571
575
|
in general.
|
data/lib/apipie/application.rb
CHANGED
@@ -259,13 +259,7 @@ module Apipie
|
|
259
259
|
end
|
260
260
|
|
261
261
|
def reload_documentation
|
262
|
-
|
263
|
-
# if we are not able to mark classes for reload, we
|
264
|
-
# can't reinit the env, as we would loose the data that were
|
265
|
-
# already loaded
|
266
|
-
init_env
|
267
|
-
reload_examples
|
268
|
-
end
|
262
|
+
rails_mark_classes_for_reload
|
269
263
|
|
270
264
|
api_controllers_paths.each do |f|
|
271
265
|
load_controller_from_file f
|
@@ -359,9 +353,10 @@ module Apipie
|
|
359
353
|
# as this would break loading of the controllers.
|
360
354
|
def rails_mark_classes_for_reload
|
361
355
|
unless Rails.application.config.cache_classes
|
362
|
-
|
363
|
-
|
364
|
-
|
356
|
+
ActionDispatch::Reloader.cleanup!
|
357
|
+
init_env
|
358
|
+
reload_examples
|
359
|
+
ActionDispatch::Reloader.prepare!
|
365
360
|
end
|
366
361
|
end
|
367
362
|
|
data/lib/apipie/configuration.rb
CHANGED
@@ -22,6 +22,11 @@ module Apipie
|
|
22
22
|
# properly.
|
23
23
|
attr_writer :reload_controllers
|
24
24
|
|
25
|
+
# specify routes if used router differ from default e.g.
|
26
|
+
#
|
27
|
+
# Api::Engine.routes
|
28
|
+
attr_accessor :api_routes
|
29
|
+
|
25
30
|
def reload_controllers?
|
26
31
|
@reload_controllers = Rails.env.development? unless defined? @reload_controllers
|
27
32
|
return @reload_controllers && @api_controllers_matcher
|
@@ -110,6 +115,10 @@ module Apipie
|
|
110
115
|
@api_base_url[version] = url
|
111
116
|
end
|
112
117
|
|
118
|
+
def api_routes
|
119
|
+
@api_routes || Rails.application.routes
|
120
|
+
end
|
121
|
+
|
113
122
|
def initialize
|
114
123
|
@markup = Apipie::Markup::RDoc.new
|
115
124
|
@app_name = "Another API"
|
data/lib/apipie/extractor.rb
CHANGED
@@ -55,41 +55,54 @@ module Apipie
|
|
55
55
|
Writer.new(@collector).write_examples if @collector
|
56
56
|
end
|
57
57
|
|
58
|
-
# TODO: this is a loooooooooong method :)
|
59
58
|
def apis_from_routes
|
60
59
|
return @apis_from_routes if @apis_from_routes
|
61
60
|
|
62
|
-
api_prefix = Apipie.api_base_url.sub(/\/$/,"")
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end,
|
73
|
-
:controller => r.requirements[:controller],
|
74
|
-
:action => r.requirements[:action]
|
75
|
-
}
|
61
|
+
@api_prefix = Apipie.api_base_url.sub(/\/$/,"")
|
62
|
+
populate_api_routes
|
63
|
+
update_api_descriptions
|
64
|
+
|
65
|
+
@apis_from_routes
|
66
|
+
end
|
67
|
+
|
68
|
+
def controller_path(name)
|
69
|
+
Apipie.api_controllers_paths.detect { |p| p.include?("#{name}_controller.rb") }
|
70
|
+
end
|
76
71
|
|
72
|
+
private
|
77
73
|
|
74
|
+
def all_api_routes
|
75
|
+
all_routes = Apipie.configuration.api_routes.routes.map do |r|
|
76
|
+
{
|
77
|
+
:verb => case r.verb
|
78
|
+
when Regexp then r.verb.source[/\w+/]
|
79
|
+
else r.verb.to_s
|
80
|
+
end,
|
81
|
+
:path => case
|
82
|
+
when r.path.respond_to?(:spec) then r.path.spec.to_s
|
83
|
+
else r.path.to_s
|
84
|
+
end,
|
85
|
+
:controller => r.requirements[:controller],
|
86
|
+
:action => r.requirements[:action]
|
87
|
+
}
|
78
88
|
end
|
79
|
-
|
89
|
+
|
90
|
+
return all_routes.find_all do |r|
|
80
91
|
r[:path].starts_with?(Apipie.api_base_url)
|
81
92
|
end
|
93
|
+
end
|
82
94
|
|
95
|
+
def populate_api_routes
|
83
96
|
@apis_from_routes = Hash.new { |h, k| h[k] = [] }
|
84
97
|
|
85
|
-
|
98
|
+
all_api_routes.each do |route|
|
86
99
|
controller_path, action = route[:controller], route[:action]
|
87
100
|
next unless controller_path && action
|
88
101
|
|
89
102
|
controller_path = controller_path.split('::').map(&:camelize).join('::')
|
90
103
|
controller = "#{controller_path}Controller"
|
91
104
|
|
92
|
-
path = if /^#{Regexp.escape(api_prefix)}(.*)$/ =~ route[:path]
|
105
|
+
path = if /^#{Regexp.escape(@api_prefix)}(.*)$/ =~ route[:path]
|
93
106
|
$1.sub!(/\(\.:format\)$/,"")
|
94
107
|
else
|
95
108
|
nil
|
@@ -99,11 +112,13 @@ module Apipie
|
|
99
112
|
@apis_from_routes[[controller, action]] << {:method => route[:verb], :path => path}
|
100
113
|
end
|
101
114
|
end
|
102
|
-
|
115
|
+
end
|
103
116
|
|
117
|
+
def all_apis_from_docs
|
104
118
|
resource_descriptions = Apipie.resource_descriptions.values.map(&:values).flatten
|
105
119
|
method_descriptions = resource_descriptions.map(&:method_descriptions).flatten
|
106
|
-
|
120
|
+
|
121
|
+
return method_descriptions.reduce({}) do |h, desc|
|
107
122
|
apis = desc.method_apis_to_json.map do |api|
|
108
123
|
{ :method => api[:http_method],
|
109
124
|
:path => api[:api_url],
|
@@ -111,21 +126,23 @@ module Apipie
|
|
111
126
|
end
|
112
127
|
h.update(desc.id => apis)
|
113
128
|
end
|
129
|
+
end
|
114
130
|
|
131
|
+
def update_api_descriptions
|
132
|
+
apis_from_docs = all_apis_from_docs
|
115
133
|
@apis_from_routes.each do |(controller, action), new_apis|
|
116
134
|
method_key = "#{Apipie.get_resource_name(controller.constantize)}##{action}"
|
117
135
|
old_apis = apis_from_docs[method_key] || []
|
118
136
|
new_apis.each do |new_api|
|
119
137
|
new_api[:path].sub!(/\(\.:format\)$/,"")
|
120
138
|
old_api = old_apis.find do |api|
|
121
|
-
api[:path] == "#{api_prefix}#{new_api[:path]}"
|
139
|
+
api[:path] == "#{@api_prefix}#{new_api[:path]}"
|
122
140
|
end
|
123
141
|
if old_api
|
124
142
|
new_api[:desc] = old_api[:desc]
|
125
143
|
end
|
126
144
|
end
|
127
145
|
end
|
128
|
-
@apis_from_routes
|
129
146
|
end
|
130
147
|
|
131
148
|
end
|
@@ -205,11 +205,11 @@ module Apipie
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def controller_path
|
208
|
-
@controller_path ||=
|
208
|
+
@controller_path ||= Apipie::Extractor.controller_path(@controller.controller_path)
|
209
209
|
end
|
210
210
|
|
211
211
|
def controller_content
|
212
|
-
raise ControllerNotFound.new unless File.exists?
|
212
|
+
raise ControllerNotFound.new unless controller_path && File.exists?(controller_path)
|
213
213
|
@controller_content ||= File.read(controller_path)
|
214
214
|
end
|
215
215
|
|
data/lib/apipie/version.rb
CHANGED
@@ -30,6 +30,9 @@ Apipie.configure do |config|
|
|
30
30
|
# for reloading to work properly you need to specify where your api controllers are (like in Dir.glob):
|
31
31
|
config.api_controllers_matcher = File.join(Rails.root, "app", "controllers", "**","*.rb")
|
32
32
|
|
33
|
+
# specify routes if your application uses router differ from Rails default one
|
34
|
+
config.api_routes = Rails.application.routes
|
35
|
+
|
33
36
|
# config.markup = choose one of:
|
34
37
|
# Apipie::Markup::RDoc.new [default]
|
35
38
|
# Apipie::Markup::Markdown.new
|
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.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-03-
|
13
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|