rails-api 0.0.2 → 0.0.3
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/README.md +8 -1
- data/lib/rails-api/action_controller/api.rb +0 -1
- data/lib/rails-api/application.rb +113 -52
- data/lib/rails-api/public_exceptions.rb +49 -0
- data/lib/rails-api/templates/rails/app/config/initializers/wrap_parameters.rb.tt +15 -0
- data/lib/rails-api/version.rb +1 -1
- data/test/api_application/api_application_test.rb +56 -2
- data/test/api_controller/renderers_test.rb +32 -0
- data/test/generators/app_generator_test.rb +4 -4
- data/test/generators/generators_test_helper.rb +24 -9
- data/test/generators/resource_generator_test.rb +2 -6
- data/test/generators/scaffold_generator_test.rb +17 -15
- data/test/test_helper.rb +10 -1
- metadata +79 -97
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Rails::API
|
2
2
|
|
3
|
-
[](http://travis-ci.org/rails-api/rails-api)
|
4
4
|
|
5
5
|
**Rails::API** is a subset of a normal Rails application, created for applications that don't require all functionality that a complete Rails application provides. It is a bit more lightweight, and consequently a bit faster than a normal Rails application. The main example for its usage is in API applications only, where you usually don't need the entire Rails middleware stack nor template generation.
|
6
6
|
|
@@ -107,6 +107,8 @@ end
|
|
107
107
|
|
108
108
|
And comment out the `protect_from_forgery` call if you are using it.
|
109
109
|
|
110
|
+
If you want to use the Rails default middleware stack (avoid the reduction that rails-api does), you can just add config.api_only = false to config/application.rb file.
|
111
|
+
|
110
112
|
### Choosing Middlewares
|
111
113
|
|
112
114
|
An API application comes with the following middlewares by default.
|
@@ -206,7 +208,12 @@ The best place to add a module is in your *ApplicationController*. You can also
|
|
206
208
|
|
207
209
|
* Santiago Pastorino (https://github.com/spastorino)
|
208
210
|
* Carlos Antonio da Silva (https://github.com/carlosantoniodasilva)
|
211
|
+
* Steve Klabnik (https://github.com/steveklabnik)
|
209
212
|
|
210
213
|
## License
|
211
214
|
|
212
215
|
MIT License.
|
216
|
+
|
217
|
+
## Mailing List
|
218
|
+
|
219
|
+
https://groups.google.com/forum/?fromgroups#!forum/rails-api-core
|
@@ -1,17 +1,65 @@
|
|
1
1
|
require 'rails/version'
|
2
2
|
require 'rails/application'
|
3
|
+
require 'rails-api/public_exceptions'
|
3
4
|
|
4
5
|
module Rails
|
5
6
|
class Application < Engine
|
6
7
|
def default_middleware_stack
|
8
|
+
if Rails.version =~ /4\..\../
|
9
|
+
rails_four_stack
|
10
|
+
else
|
11
|
+
rails_three_stack
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def setup_generators!
|
18
|
+
generators = config.generators
|
19
|
+
|
20
|
+
generators.templates.unshift File::expand_path('../templates', __FILE__)
|
21
|
+
generators.resource_route = :api_resource_route
|
22
|
+
|
23
|
+
generators.hide_namespace "css"
|
24
|
+
|
25
|
+
generators.rails({
|
26
|
+
:helper => false,
|
27
|
+
:stylesheets => false,
|
28
|
+
:stylesheet_engine => nil,
|
29
|
+
:template_engine => nil
|
30
|
+
})
|
31
|
+
end
|
32
|
+
|
33
|
+
ActiveSupport.on_load(:before_configuration) do
|
34
|
+
config.api_only = true
|
35
|
+
setup_generators!
|
36
|
+
end
|
37
|
+
|
38
|
+
def rails_four_stack
|
7
39
|
ActionDispatch::MiddlewareStack.new.tap do |middleware|
|
8
|
-
|
40
|
+
app = self
|
41
|
+
if rack_cache = config.action_dispatch.rack_cache
|
42
|
+
begin
|
43
|
+
require 'rack/cache'
|
44
|
+
rescue LoadError => error
|
45
|
+
error.message << ' Be sure to add rack-cache to your Gemfile'
|
46
|
+
raise
|
47
|
+
end
|
48
|
+
|
49
|
+
if rack_cache == true
|
50
|
+
rack_cache = {
|
51
|
+
metastore: "rails:/",
|
52
|
+
entitystore: "rails:/",
|
53
|
+
verbose: false
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
9
57
|
require "action_dispatch/http/rack_cache"
|
10
58
|
middleware.use ::Rack::Cache, rack_cache
|
11
59
|
end
|
12
60
|
|
13
61
|
if config.force_ssl
|
14
|
-
middleware.use
|
62
|
+
middleware.use ::ActionDispatch::SSL, config.ssl_options
|
15
63
|
end
|
16
64
|
|
17
65
|
if config.action_dispatch.x_sendfile_header.present?
|
@@ -22,82 +70,95 @@ module Rails
|
|
22
70
|
middleware.use ::ActionDispatch::Static, paths["public"].first, config.static_cache_control
|
23
71
|
end
|
24
72
|
|
25
|
-
middleware.use ::Rack::Lock unless config.
|
73
|
+
middleware.use ::Rack::Lock unless config.cache_classes
|
26
74
|
middleware.use ::Rack::Runtime
|
75
|
+
middleware.use ::Rack::MethodOverride
|
27
76
|
middleware.use ::ActionDispatch::RequestId
|
28
77
|
middleware.use ::Rails::Rack::Logger, config.log_tags # must come after Rack::MethodOverride to properly log overridden methods
|
29
78
|
middleware.use ::ActionDispatch::ShowExceptions, config.exceptions_app || ActionDispatch::PublicExceptions.new(Rails.public_path)
|
30
|
-
middleware.use ::ActionDispatch::DebugExceptions
|
79
|
+
middleware.use ::ActionDispatch::DebugExceptions, app
|
31
80
|
middleware.use ::ActionDispatch::RemoteIp, config.action_dispatch.ip_spoofing_check, config.action_dispatch.trusted_proxies
|
32
81
|
|
33
82
|
unless config.cache_classes
|
34
|
-
app = self
|
35
83
|
middleware.use ::ActionDispatch::Reloader, lambda { app.reload_dependencies? }
|
36
84
|
end
|
37
85
|
|
38
86
|
middleware.use ::ActionDispatch::Callbacks
|
87
|
+
middleware.use ::ActionDispatch::Cookies
|
88
|
+
|
89
|
+
if config.session_store
|
90
|
+
if config.force_ssl && !config.session_options.key?(:secure)
|
91
|
+
config.session_options[:secure] = true
|
92
|
+
end
|
93
|
+
middleware.use config.session_store, config.session_options
|
94
|
+
middleware.use ::ActionDispatch::Flash
|
95
|
+
end
|
39
96
|
|
40
97
|
middleware.use ::ActionDispatch::ParamsParser
|
41
|
-
middleware.use ::
|
98
|
+
middleware.use ::Rack::Head
|
42
99
|
middleware.use ::Rack::ConditionalGet
|
43
100
|
middleware.use ::Rack::ETag, "no-cache"
|
44
|
-
end
|
45
|
-
end
|
46
101
|
|
47
|
-
|
48
|
-
|
49
|
-
super
|
50
|
-
require 'rails/generators/rails/resource/resource_generator'
|
51
|
-
Rails::Generators::ResourceGenerator.class_eval do
|
52
|
-
def add_resource_route
|
53
|
-
return if options[:actions].present?
|
54
|
-
route_config = regular_class_path.collect{|namespace| "namespace :#{namespace} do " }.join(" ")
|
55
|
-
route_config << "resources :#{file_name.pluralize}"
|
56
|
-
route_config << ", except: :edit"
|
57
|
-
route_config << " end" * regular_class_path.size
|
58
|
-
route route_config
|
59
|
-
end
|
102
|
+
if config.action_dispatch.best_standards_support
|
103
|
+
middleware.use ::ActionDispatch::BestStandardsSupport, config.action_dispatch.best_standards_support
|
60
104
|
end
|
61
|
-
self
|
62
105
|
end
|
63
106
|
end
|
64
107
|
|
65
|
-
|
108
|
+
def rails_three_stack
|
109
|
+
ActionDispatch::MiddlewareStack.new.tap do |middleware|
|
110
|
+
if rack_cache = config.action_controller.perform_caching && config.action_dispatch.rack_cache
|
111
|
+
require "action_dispatch/http/rack_cache"
|
112
|
+
middleware.use ::Rack::Cache, rack_cache
|
113
|
+
end
|
66
114
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
require 'rack/ssl'
|
72
|
-
::Rack::SSL
|
73
|
-
end
|
74
|
-
end
|
115
|
+
if config.force_ssl
|
116
|
+
require "rack/ssl"
|
117
|
+
middleware.use ::Rack::SSL, config.ssl_options
|
118
|
+
end
|
75
119
|
|
76
|
-
|
77
|
-
|
120
|
+
if config.action_dispatch.x_sendfile_header.present?
|
121
|
+
middleware.use ::Rack::Sendfile, config.action_dispatch.x_sendfile_header
|
122
|
+
end
|
78
123
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
124
|
+
if config.serve_static_assets
|
125
|
+
middleware.use ::ActionDispatch::Static, paths["public"].first, config.static_cache_control
|
126
|
+
end
|
83
127
|
|
84
|
-
|
85
|
-
|
86
|
-
|
128
|
+
middleware.use ::Rack::Lock unless config.allow_concurrency
|
129
|
+
middleware.use ::Rack::Runtime
|
130
|
+
middleware.use ::Rack::MethodOverride unless config.api_only
|
131
|
+
middleware.use ::ActionDispatch::RequestId
|
132
|
+
middleware.use ::Rails::Rack::Logger, config.log_tags # must come after Rack::MethodOverride to properly log overridden methods
|
133
|
+
middleware.use ::ActionDispatch::ShowExceptions, config.exceptions_app || Rails::API::PublicExceptions.new(Rails.public_path)
|
134
|
+
middleware.use ::ActionDispatch::DebugExceptions
|
135
|
+
middleware.use ::ActionDispatch::RemoteIp, config.action_dispatch.ip_spoofing_check, config.action_dispatch.trusted_proxies
|
87
136
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
:javascript_engine => nil,
|
93
|
-
:stylesheets => false,
|
94
|
-
:stylesheet_engine => nil,
|
95
|
-
:template_engine => nil
|
96
|
-
})
|
97
|
-
end
|
137
|
+
unless config.cache_classes
|
138
|
+
app = self
|
139
|
+
middleware.use ::ActionDispatch::Reloader, lambda { app.reload_dependencies? }
|
140
|
+
end
|
98
141
|
|
99
|
-
|
100
|
-
|
142
|
+
middleware.use ::ActionDispatch::Callbacks
|
143
|
+
middleware.use ::ActionDispatch::Cookies unless config.api_only
|
144
|
+
|
145
|
+
if !config.api_only && config.session_store
|
146
|
+
if config.force_ssl && !config.session_options.key?(:secure)
|
147
|
+
config.session_options[:secure] = true
|
148
|
+
end
|
149
|
+
middleware.use config.session_store, config.session_options
|
150
|
+
middleware.use ::ActionDispatch::Flash
|
151
|
+
end
|
152
|
+
|
153
|
+
middleware.use ::ActionDispatch::ParamsParser
|
154
|
+
middleware.use ::ActionDispatch::Head
|
155
|
+
middleware.use ::Rack::ConditionalGet
|
156
|
+
middleware.use ::Rack::ETag, "no-cache"
|
157
|
+
|
158
|
+
if !config.api_only && config.action_dispatch.best_standards_support
|
159
|
+
middleware.use ::ActionDispatch::BestStandardsSupport, config.action_dispatch.best_standards_support
|
160
|
+
end
|
161
|
+
end
|
101
162
|
end
|
102
163
|
end
|
103
164
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Rails
|
2
|
+
module API
|
3
|
+
class PublicExceptions
|
4
|
+
attr_accessor :public_path
|
5
|
+
|
6
|
+
def initialize(public_path)
|
7
|
+
@public_path = public_path
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
exception = env["action_dispatch.exception"]
|
12
|
+
status = env["PATH_INFO"][1..-1]
|
13
|
+
request = ActionDispatch::Request.new(env)
|
14
|
+
content_type = request.formats.first
|
15
|
+
body = { :status => status, :error => exception.message }
|
16
|
+
|
17
|
+
render(status, content_type, body)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def render(status, content_type, body)
|
23
|
+
format = content_type && "to_#{content_type.to_sym}"
|
24
|
+
if format && body.respond_to?(format)
|
25
|
+
render_format(status, content_type, body.public_send(format))
|
26
|
+
else
|
27
|
+
render_html(status)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def render_format(status, content_type, body)
|
32
|
+
[status, {'Content-Type' => "#{content_type}; charset=#{ActionDispatch::Response.default_charset}",
|
33
|
+
'Content-Length' => body.bytesize.to_s}, [body]]
|
34
|
+
end
|
35
|
+
|
36
|
+
def render_html(status)
|
37
|
+
found = false
|
38
|
+
path = "#{public_path}/#{status}.#{I18n.locale}.html" if I18n.locale
|
39
|
+
path = "#{public_path}/#{status}.html" unless path && (found = File.exist?(path))
|
40
|
+
|
41
|
+
if found || File.exist?(path)
|
42
|
+
render_format(status, 'text/html', File.read(path))
|
43
|
+
else
|
44
|
+
[404, { "X-Cascade" => "pass" }, []]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
#
|
3
|
+
# This file contains settings for ActionController::ParamsWrapper
|
4
|
+
|
5
|
+
# Enable parameter wrapping for JSON.
|
6
|
+
# ActiveSupport.on_load(:action_controller) do
|
7
|
+
# wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
|
8
|
+
# end
|
9
|
+
|
10
|
+
<%- unless options.skip_active_record? -%>
|
11
|
+
# To enable root element in JSON for ActiveRecord objects.
|
12
|
+
# ActiveSupport.on_load(:active_record) do
|
13
|
+
# self.include_root_in_json = true
|
14
|
+
# end
|
15
|
+
<%- end -%>
|
data/lib/rails-api/version.rb
CHANGED
@@ -2,6 +2,8 @@ require 'test_helper'
|
|
2
2
|
require 'action_controller/railtie'
|
3
3
|
require 'rack/test'
|
4
4
|
|
5
|
+
app.initialize!
|
6
|
+
|
5
7
|
class OmgController < ActionController::API
|
6
8
|
def index
|
7
9
|
render :text => "OMG"
|
@@ -12,10 +14,62 @@ class ApiApplicationTest < ActiveSupport::TestCase
|
|
12
14
|
include ::Rack::Test::Methods
|
13
15
|
|
14
16
|
def test_boot_api_app
|
15
|
-
app.initialize!
|
16
|
-
|
17
17
|
get "/omg"
|
18
18
|
assert_equal 200, last_response.status
|
19
19
|
assert_equal "OMG", last_response.body
|
20
20
|
end
|
21
|
+
|
22
|
+
def test_api_middleware_stack
|
23
|
+
expected_middleware_stack =
|
24
|
+
rails4? ? expected_middleware_stack_rails4 : expected_middleware_stack_rails3
|
25
|
+
|
26
|
+
assert_equal expected_middleware_stack, app.middleware.map(&:klass).map(&:name)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def expected_middleware_stack_rails3
|
32
|
+
[
|
33
|
+
"ActionDispatch::Static",
|
34
|
+
"Rack::Lock",
|
35
|
+
"ActiveSupport::Cache::Strategy::LocalCache",
|
36
|
+
"Rack::Runtime",
|
37
|
+
"ActionDispatch::RequestId",
|
38
|
+
"Rails::Rack::Logger",
|
39
|
+
"ActionDispatch::ShowExceptions",
|
40
|
+
"ActionDispatch::DebugExceptions",
|
41
|
+
"ActionDispatch::RemoteIp",
|
42
|
+
"ActionDispatch::Reloader",
|
43
|
+
"ActionDispatch::Callbacks",
|
44
|
+
"ActionDispatch::ParamsParser",
|
45
|
+
"ActionDispatch::Head",
|
46
|
+
"Rack::ConditionalGet",
|
47
|
+
"Rack::ETag"
|
48
|
+
]
|
49
|
+
end
|
50
|
+
|
51
|
+
def expected_middleware_stack_rails4
|
52
|
+
[
|
53
|
+
"ActionDispatch::Static",
|
54
|
+
"Rack::Lock",
|
55
|
+
"ActiveSupport::Cache::Strategy::LocalCache",
|
56
|
+
"Rack::Runtime",
|
57
|
+
"Rack::MethodOverride",
|
58
|
+
"ActionDispatch::RequestId",
|
59
|
+
"Rails::Rack::Logger",
|
60
|
+
"ActionDispatch::ShowExceptions",
|
61
|
+
"ActionDispatch::DebugExceptions",
|
62
|
+
"ActionDispatch::RemoteIp",
|
63
|
+
"ActionDispatch::Reloader",
|
64
|
+
"ActionDispatch::Callbacks",
|
65
|
+
"ActionDispatch::Cookies",
|
66
|
+
"ActionDispatch::Session::CookieStore",
|
67
|
+
"ActionDispatch::Flash",
|
68
|
+
"ActionDispatch::ParamsParser",
|
69
|
+
"Rack::Head",
|
70
|
+
"Rack::ConditionalGet",
|
71
|
+
"Rack::ETag",
|
72
|
+
"ActionDispatch::BestStandardsSupport"
|
73
|
+
]
|
74
|
+
end
|
21
75
|
end
|
@@ -12,6 +12,8 @@ class Model
|
|
12
12
|
end
|
13
13
|
|
14
14
|
class RenderersApiController < ActionController::API
|
15
|
+
use ActionDispatch::ShowExceptions, Rails::API::PublicExceptions.new(Rails.public_path)
|
16
|
+
|
15
17
|
def one
|
16
18
|
render :json => Model.new
|
17
19
|
end
|
@@ -19,6 +21,10 @@ class RenderersApiController < ActionController::API
|
|
19
21
|
def two
|
20
22
|
render :xml => Model.new
|
21
23
|
end
|
24
|
+
|
25
|
+
def boom
|
26
|
+
raise "boom"
|
27
|
+
end
|
22
28
|
end
|
23
29
|
|
24
30
|
class RenderersApiTest < ActionController::TestCase
|
@@ -36,3 +42,29 @@ class RenderersApiTest < ActionController::TestCase
|
|
36
42
|
assert_equal({ :a => 'b' }.to_xml, @response.body)
|
37
43
|
end
|
38
44
|
end
|
45
|
+
|
46
|
+
class RenderExceptionsTest < ActionDispatch::IntegrationTest
|
47
|
+
def setup
|
48
|
+
@app = RenderersApiController.action(:boom)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_render_json_exception
|
52
|
+
get "/fake", {}, 'HTTP_ACCEPT' => 'application/json'
|
53
|
+
assert_response :internal_server_error
|
54
|
+
assert_equal 'application/json', response.content_type.to_s
|
55
|
+
assert_equal({ :status => '500', :error => 'boom' }.to_json, response.body)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_render_xml_exception
|
59
|
+
get "/fake", {}, 'HTTP_ACCEPT' => 'application/xml'
|
60
|
+
assert_response :internal_server_error
|
61
|
+
assert_equal 'application/xml', response.content_type.to_s
|
62
|
+
assert_equal({ :status => '500', :error => 'boom' }.to_xml, response.body)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_render_fallback_exception
|
66
|
+
get "/fake", {}, 'HTTP_ACCEPT' => 'text/csv'
|
67
|
+
assert_response :internal_server_error
|
68
|
+
assert_equal 'text/html', response.content_type.to_s
|
69
|
+
end
|
70
|
+
end
|
@@ -2,7 +2,7 @@ require 'generators/generators_test_helper'
|
|
2
2
|
require 'rails-api/generators/rails/app/app_generator'
|
3
3
|
|
4
4
|
class AppGeneratorTest < Rails::Generators::TestCase
|
5
|
-
|
5
|
+
include GeneratorsTestHelper
|
6
6
|
|
7
7
|
arguments [destination_root]
|
8
8
|
|
@@ -28,7 +28,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
|
|
28
28
|
private
|
29
29
|
|
30
30
|
def default_files
|
31
|
-
%
|
31
|
+
%W(.gitignore
|
32
32
|
Gemfile
|
33
33
|
Rakefile
|
34
34
|
config.ru
|
@@ -46,10 +46,10 @@ class AppGeneratorTest < Rails::Generators::TestCase
|
|
46
46
|
log
|
47
47
|
script/rails
|
48
48
|
test/fixtures
|
49
|
-
test
|
49
|
+
test/#{generated_test_funcional_dir}
|
50
50
|
test/integration
|
51
51
|
test/performance
|
52
|
-
test
|
52
|
+
test/#{generated_test_unit_dir})
|
53
53
|
end
|
54
54
|
|
55
55
|
def skipped_files
|
@@ -1,15 +1,18 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require 'rails/generators
|
2
|
+
require 'rails/generators'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
module GeneratorsTestHelper
|
5
|
+
def self.included(base)
|
6
|
+
base.class_eval do
|
7
|
+
destination File.expand_path("../../tmp", __FILE__)
|
8
|
+
setup :prepare_destination
|
9
|
+
teardown :remove_destination
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
rm_rf destination_root
|
11
|
+
begin
|
12
|
+
base.tests Rails::Generators.const_get(base.name.sub(/Test$/, ''))
|
13
|
+
rescue
|
14
|
+
end
|
15
|
+
end
|
13
16
|
end
|
14
17
|
|
15
18
|
private
|
@@ -20,4 +23,16 @@ class Rails::Generators::TestCase
|
|
20
23
|
FileUtils.mkdir_p(destination)
|
21
24
|
FileUtils.cp routes, destination
|
22
25
|
end
|
26
|
+
|
27
|
+
def generated_test_unit_dir
|
28
|
+
rails4? ? 'models' : 'unit'
|
29
|
+
end
|
30
|
+
|
31
|
+
def generated_test_funcional_dir
|
32
|
+
rails4? ? 'controllers' : 'functional'
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_destination
|
36
|
+
rm_rf destination_root
|
37
|
+
end
|
23
38
|
end
|
@@ -2,14 +2,10 @@ require 'generators/generators_test_helper'
|
|
2
2
|
require 'rails/generators/rails/resource/resource_generator'
|
3
3
|
|
4
4
|
class ResourceGeneratorTest < Rails::Generators::TestCase
|
5
|
-
|
5
|
+
include GeneratorsTestHelper
|
6
6
|
|
7
7
|
arguments %w(account)
|
8
|
-
|
9
|
-
def setup
|
10
|
-
super
|
11
|
-
copy_routes
|
12
|
-
end
|
8
|
+
setup :copy_routes
|
13
9
|
|
14
10
|
def test_resource_routes_are_added
|
15
11
|
run_generator
|
@@ -2,27 +2,30 @@ require 'generators/generators_test_helper'
|
|
2
2
|
require 'rails/generators/rails/scaffold/scaffold_generator'
|
3
3
|
|
4
4
|
class ScaffoldGeneratorTest < Rails::Generators::TestCase
|
5
|
-
|
5
|
+
include GeneratorsTestHelper
|
6
6
|
|
7
7
|
arguments %w(product_line title:string product:belongs_to user:references)
|
8
|
-
|
9
|
-
def setup
|
10
|
-
super
|
11
|
-
copy_routes
|
12
|
-
end
|
8
|
+
setup :copy_routes
|
13
9
|
|
14
10
|
def test_scaffold_on_invoke
|
15
11
|
run_generator
|
16
12
|
|
17
13
|
# Model
|
18
14
|
assert_file "app/models/product_line.rb", /class ProductLine < ActiveRecord::Base/
|
19
|
-
assert_file "test/
|
15
|
+
assert_file "test/#{generated_test_unit_dir}/product_line_test.rb", /class ProductLineTest < ActiveSupport::TestCase/
|
20
16
|
assert_file "test/fixtures/product_lines.yml"
|
21
|
-
|
22
|
-
|
23
|
-
/
|
24
|
-
|
25
|
-
|
17
|
+
|
18
|
+
if rails4?
|
19
|
+
assert_migration "db/migrate/create_product_lines.rb",
|
20
|
+
/belongs_to :product, index: true/,
|
21
|
+
/references :user, index: true/
|
22
|
+
else
|
23
|
+
assert_migration "db/migrate/create_product_lines.rb",
|
24
|
+
/belongs_to :product/,
|
25
|
+
/add_index :product_lines, :product_id/,
|
26
|
+
/references :user/,
|
27
|
+
/add_index :product_lines, :user_id/
|
28
|
+
end
|
26
29
|
|
27
30
|
# Route
|
28
31
|
assert_file "config/routes.rb" do |content|
|
@@ -65,7 +68,7 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
|
|
65
68
|
end
|
66
69
|
end
|
67
70
|
|
68
|
-
assert_file "test/
|
71
|
+
assert_file "test/#{generated_test_funcional_dir}/product_lines_controller_test.rb" do |test|
|
69
72
|
assert_match(/class ProductLinesControllerTest < ActionController::TestCase/, test)
|
70
73
|
assert_match(/post :create, product_line: \{ title: @product_line.title \}/, test)
|
71
74
|
assert_match(/put :update, id: @product_line, product_line: \{ title: @product_line.title \}/, test)
|
@@ -80,11 +83,10 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
|
|
80
83
|
|
81
84
|
# Helpers
|
82
85
|
assert_no_file "app/helpers/product_lines_helper.rb"
|
83
|
-
assert_no_file "test/
|
86
|
+
assert_no_file "test/#{generated_test_unit_dir}/helpers/product_lines_helper_test.rb"
|
84
87
|
|
85
88
|
# Assets
|
86
89
|
assert_no_file "app/assets/stylesheets/scaffold.css"
|
87
|
-
assert_no_file "app/assets/javascripts/product_lines.js"
|
88
90
|
assert_no_file "app/assets/stylesheets/product_lines.css"
|
89
91
|
end
|
90
92
|
end
|
data/test/test_helper.rb
CHANGED
@@ -5,6 +5,10 @@ require 'rails'
|
|
5
5
|
require 'rails/test_help'
|
6
6
|
require 'rails-api'
|
7
7
|
|
8
|
+
def rails4?
|
9
|
+
Rails.version.start_with? '4'
|
10
|
+
end
|
11
|
+
|
8
12
|
def app
|
9
13
|
@@app ||= Class.new(Rails::Application) do
|
10
14
|
config.active_support.deprecation = :stderr
|
@@ -19,6 +23,11 @@ def app
|
|
19
23
|
c.performance_tool :test_unit
|
20
24
|
end
|
21
25
|
|
26
|
+
if rails4?
|
27
|
+
config.eager_load = false
|
28
|
+
config.secret_key_base = 'abc123'
|
29
|
+
end
|
30
|
+
|
22
31
|
def self.name
|
23
32
|
'TestApp'
|
24
33
|
end
|
@@ -26,7 +35,7 @@ def app
|
|
26
35
|
end
|
27
36
|
|
28
37
|
app.routes.append do
|
29
|
-
|
38
|
+
get ':controller(/:action)'
|
30
39
|
end
|
31
40
|
app.routes.finalize!
|
32
41
|
|
metadata
CHANGED
@@ -1,108 +1,100 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-api
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Santiago Pastorino and Carlos Antonio da Silva
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: actionpack
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 2
|
33
|
-
- 0
|
34
|
-
version: 3.2.0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.2.6
|
35
22
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: railties
|
39
23
|
prerelease: false
|
40
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.2.6
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: railties
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
41
33
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 3
|
48
|
-
- 2
|
49
|
-
- 0
|
50
|
-
version: 3.2.0
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.2.6
|
51
38
|
type: :runtime
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: tzinfo
|
55
39
|
prerelease: false
|
56
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.2.6
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: tzinfo
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
57
49
|
none: false
|
58
|
-
requirements:
|
50
|
+
requirements:
|
59
51
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 45
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
- 3
|
65
|
-
- 31
|
52
|
+
- !ruby/object:Gem::Version
|
66
53
|
version: 0.3.31
|
67
54
|
type: :runtime
|
68
|
-
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rails
|
71
55
|
prerelease: false
|
72
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
57
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.3.31
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rails
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 3.2.6
|
83
70
|
type: :development
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 3.2.6
|
78
|
+
description: ! "Rails::API is a subset of a normal Rails application,\n created
|
79
|
+
for applications that don't require all\n functionality
|
80
|
+
that a complete Rails application provides"
|
81
|
+
email:
|
90
82
|
- <santiago@wyeworks.com>
|
91
83
|
- <carlosantoniodasilva@gmail.com>
|
92
|
-
executables:
|
84
|
+
executables:
|
93
85
|
- rails-api
|
94
86
|
extensions: []
|
95
|
-
|
96
87
|
extra_rdoc_files: []
|
97
|
-
|
98
|
-
files:
|
88
|
+
files:
|
99
89
|
- README.md
|
100
90
|
- bin/rails-api
|
101
91
|
- lib/generators/rails/api_resource_route/api_resource_route_generator.rb
|
102
92
|
- lib/rails-api/action_controller/api.rb
|
103
93
|
- lib/rails-api/application.rb
|
104
94
|
- lib/rails-api/generators/rails/app/app_generator.rb
|
95
|
+
- lib/rails-api/public_exceptions.rb
|
105
96
|
- lib/rails-api/templates/rails/app/app/controllers/application_controller.rb.tt
|
97
|
+
- lib/rails-api/templates/rails/app/config/initializers/wrap_parameters.rb.tt
|
106
98
|
- lib/rails-api/templates/rails/app/Gemfile
|
107
99
|
- lib/rails-api/templates/rails/scaffold_controller/controller.rb
|
108
100
|
- lib/rails-api/templates/test_unit/scaffold/functional_test.rb
|
@@ -122,43 +114,32 @@ files:
|
|
122
114
|
- test/generators/resource_generator_test.rb
|
123
115
|
- test/generators/scaffold_generator_test.rb
|
124
116
|
- test/test_helper.rb
|
125
|
-
has_rdoc: true
|
126
117
|
homepage: https://github.com/spastorino/rails-api
|
127
|
-
licenses:
|
118
|
+
licenses:
|
128
119
|
- MIT
|
129
120
|
post_install_message:
|
130
121
|
rdoc_options: []
|
131
|
-
|
132
|
-
require_paths:
|
122
|
+
require_paths:
|
133
123
|
- lib
|
134
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
125
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
|
140
|
-
|
141
|
-
- 0
|
142
|
-
version: "0"
|
143
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ! '>='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
131
|
none: false
|
145
|
-
requirements:
|
146
|
-
- -
|
147
|
-
- !ruby/object:Gem::Version
|
148
|
-
hash: 23
|
149
|
-
segments:
|
150
|
-
- 1
|
151
|
-
- 3
|
152
|
-
- 6
|
132
|
+
requirements:
|
133
|
+
- - ! '>='
|
134
|
+
- !ruby/object:Gem::Version
|
153
135
|
version: 1.3.6
|
154
136
|
requirements: []
|
155
|
-
|
156
137
|
rubyforge_project:
|
157
|
-
rubygems_version: 1.
|
138
|
+
rubygems_version: 1.8.23
|
158
139
|
signing_key:
|
159
140
|
specification_version: 3
|
160
141
|
summary: Rails for API only Applications
|
161
|
-
test_files:
|
142
|
+
test_files:
|
162
143
|
- test/api_application/api_application_test.rb
|
163
144
|
- test/api_controller/action_methods_test.rb
|
164
145
|
- test/api_controller/conditional_get_test.rb
|
@@ -173,3 +154,4 @@ test_files:
|
|
173
154
|
- test/generators/resource_generator_test.rb
|
174
155
|
- test/generators/scaffold_generator_test.rb
|
175
156
|
- test/test_helper.rb
|
157
|
+
has_rdoc:
|