rockstart 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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +100 -0
- data/Rakefile +19 -0
- data/lib/generators/rockstart/USAGE +13 -0
- data/lib/generators/rockstart/devise/USAGE +9 -0
- data/lib/generators/rockstart/devise/devise_generator.rb +258 -0
- data/lib/generators/rockstart/devise/templates/controllers/passwords_controller.rb +56 -0
- data/lib/generators/rockstart/devise/templates/controllers/registrations_controller.rb +88 -0
- data/lib/generators/rockstart/devise/templates/controllers/sessions_controller.rb +32 -0
- data/lib/generators/rockstart/devise/templates/create_user_migration.rb.tt +11 -0
- data/lib/generators/rockstart/devise/templates/models/user.rb +42 -0
- data/lib/generators/rockstart/devise/templates/spec/factories/users.rb +17 -0
- data/lib/generators/rockstart/devise/templates/spec/models/user_spec.rb +64 -0
- data/lib/generators/rockstart/devise/templates/spec/requests/users/passwords_spec.rb +202 -0
- data/lib/generators/rockstart/devise/templates/spec/requests/users/registrations_spec.rb +445 -0
- data/lib/generators/rockstart/devise/templates/spec/requests/users/sessions_spec.rb +171 -0
- data/lib/generators/rockstart/devise/templates/spec/support/devise_request_spec_helper.rb +29 -0
- data/lib/generators/rockstart/devise/templates/translations.en.yml +4 -0
- data/lib/generators/rockstart/docker/USAGE +10 -0
- data/lib/generators/rockstart/docker/docker_generator.rb +86 -0
- data/lib/generators/rockstart/docker/templates/app/Dockerfile-app +47 -0
- data/lib/generators/rockstart/docker/templates/docker-compose.test.yml +29 -0
- data/lib/generators/rockstart/docker/templates/docker-compose.yml +47 -0
- data/lib/generators/rockstart/docker/templates/dockerignore +16 -0
- data/lib/generators/rockstart/docker/templates/dotenv.docker.tt +4 -0
- data/lib/generators/rockstart/docker/templates/localhost_domains.ext.tt +7 -0
- data/lib/generators/rockstart/docker/templates/setup-localhost.tt +27 -0
- data/lib/generators/rockstart/docker/templates/web/Dockerfile-web +15 -0
- data/lib/generators/rockstart/docker/templates/web/nginx.conf +62 -0
- data/lib/generators/rockstart/frontend_helpers/USAGE +8 -0
- data/lib/generators/rockstart/frontend_helpers/frontend_helpers_generator.rb +65 -0
- data/lib/generators/rockstart/frontend_helpers/templates/application_urls.rb +26 -0
- data/lib/generators/rockstart/frontend_helpers/templates/application_urls_helper.rb +20 -0
- data/lib/generators/rockstart/frontend_helpers/templates/titles.en.yml.tt +5 -0
- data/lib/generators/rockstart/logging/USAGE +8 -0
- data/lib/generators/rockstart/logging/logging_generator.rb +12 -0
- data/lib/generators/rockstart/logging/templates/rockstart/lograge_initializer.rb +50 -0
- data/lib/generators/rockstart/postgres/USAGE +8 -0
- data/lib/generators/rockstart/postgres/postgres_generator.rb +32 -0
- data/lib/generators/rockstart/postgres/templates/config/database.yml.tt +18 -0
- data/lib/generators/rockstart/postgres/templates/migration.rb.tt +7 -0
- data/lib/generators/rockstart/pundit/USAGE +8 -0
- data/lib/generators/rockstart/pundit/pundit_generator.rb +32 -0
- data/lib/generators/rockstart/pundit/templates/app/controllers/concerns/pundit_error_handling.rb +29 -0
- data/lib/generators/rockstart/pundit/templates/app/policies/application_policy.rb +71 -0
- data/lib/generators/rockstart/pundit/templates/app/policies/user_policy.rb +47 -0
- data/lib/generators/rockstart/pundit/templates/config/locales/pundit.en.yml +6 -0
- data/lib/generators/rockstart/pundit/templates/lib/templates/pundit/policy/policy.rb +36 -0
- data/lib/generators/rockstart/pundit/templates/lib/templates/rspec/policy/policy_spec.rb +58 -0
- data/lib/generators/rockstart/pundit/templates/spec/policies/user_policy_spec.rb +95 -0
- data/lib/generators/rockstart/pundit/templates/spec/support/pundit_matchers.rb +7 -0
- data/lib/generators/rockstart/quality/USAGE +10 -0
- data/lib/generators/rockstart/quality/quality_generator.rb +28 -0
- data/lib/generators/rockstart/quality/templates/quality.rake +4 -0
- data/lib/generators/rockstart/quality/templates/rubocop.rake +4 -0
- data/lib/generators/rockstart/quality/templates/rubocop.yml +45 -0
- data/lib/generators/rockstart/rockstart_generator.rb +77 -0
- data/lib/generators/rockstart/rspec/USAGE +8 -0
- data/lib/generators/rockstart/rspec/rspec_generator.rb +70 -0
- data/lib/generators/rockstart/rspec/templates/dotenv.development +1 -0
- data/lib/generators/rockstart/rspec/templates/dotenv.test +1 -0
- data/lib/generators/rockstart/rspec/templates/rspec_templates/model/model_spec.rb +13 -0
- data/lib/generators/rockstart/rspec/templates/support/factory_bot.rb +6 -0
- data/lib/generators/rockstart/rspec/templates/support/shoulda_matchers.rb +9 -0
- data/lib/generators/rockstart/rspec/templates/support/test_helpers.rb +9 -0
- data/lib/generators/rockstart/scaffold_templates/USAGE +8 -0
- data/lib/generators/rockstart/scaffold_templates/scaffold_templates_generator.rb +39 -0
- data/lib/generators/rockstart/scaffold_templates/templates/api_controller.rb.tt +96 -0
- data/lib/generators/rockstart/scaffold_templates/templates/controller.rb.tt +126 -0
- data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/api_request_spec.rb +139 -0
- data/lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/request_spec.rb +408 -0
- data/lib/generators/rockstart/security/USAGE +13 -0
- data/lib/generators/rockstart/security/security_generator.rb +108 -0
- data/lib/generators/rockstart/security/templates/brakeman.rake +6 -0
- data/lib/generators/rockstart/security/templates/bundler_audit.rake +4 -0
- data/lib/generators/rockstart/security/templates/cache_support.rb +18 -0
- data/lib/generators/rockstart/security/templates/content_security_policy_initializer.rb.tt +56 -0
- data/lib/generators/rockstart/security/templates/content_security_spec.rb.tt +83 -0
- data/lib/generators/rockstart/security/templates/csp_violations_controller.rb +39 -0
- data/lib/generators/rockstart/security/templates/rack_attack.rb +98 -0
- data/lib/generators/rockstart/security/templates/security.rake +9 -0
- data/lib/generators/rockstart/security/templates/session_store_initializer.rb.tt +7 -0
- data/lib/generators/rockstart/smtp_mailer/USAGE +8 -0
- data/lib/generators/rockstart/smtp_mailer/smtp_mailer_generator.rb +30 -0
- data/lib/generators/rockstart/smtp_mailer/templates/config/initializers/action_mailer.rb +10 -0
- data/lib/generators/rockstart/tailwindcss/USAGE +8 -0
- data/lib/generators/rockstart/tailwindcss/tailwindcss_generator.rb +30 -0
- data/lib/generators/rockstart/tailwindcss/templates/application.css +3 -0
- data/lib/generators/rockstart/tailwindcss/templates/postcss.config.js +32 -0
- data/lib/rockstart/base_generator.rb +32 -0
- data/lib/rockstart/env.rb +16 -0
- data/lib/rockstart/railtie.rb +6 -0
- data/lib/rockstart/version.rb +5 -0
- data/lib/rockstart.rb +9 -0
- data/lib/tasks/rockstart_tasks.rake +5 -0
- metadata +187 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class RockstartGenerator < Rails::Generators::Base
|
|
4
|
+
desc "The quickest way for getting Rails Ready to Rock!"
|
|
5
|
+
|
|
6
|
+
class_option :devise, type: :boolean,
|
|
7
|
+
desc: "Include Devise support",
|
|
8
|
+
default: true
|
|
9
|
+
|
|
10
|
+
class_option :postgres, type: :boolean,
|
|
11
|
+
desc: "Include Postgres support",
|
|
12
|
+
default: Rockstart::Env.postgres_db?
|
|
13
|
+
|
|
14
|
+
class_option :pundit, type: :boolean,
|
|
15
|
+
desc: "Include Pundit support",
|
|
16
|
+
default: true
|
|
17
|
+
|
|
18
|
+
def generate_logging
|
|
19
|
+
generate "rockstart:logging"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def generate_rspec
|
|
23
|
+
generate "rockstart:rspec"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def generate_postgres
|
|
27
|
+
return unless options[:postgres]
|
|
28
|
+
|
|
29
|
+
generate "rockstart:postgres"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def generate_smtp_mailer
|
|
33
|
+
generate "rockstart:smtp_mailer"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def generate_scaffold_templates
|
|
37
|
+
generate "rockstart:scaffold_templates", devise_option, pundit_option
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def generate_devise
|
|
41
|
+
return unless options[:devise]
|
|
42
|
+
|
|
43
|
+
generate "rockstart:devise", pundit_option
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def generate_pundit
|
|
47
|
+
return unless options[:pundit]
|
|
48
|
+
|
|
49
|
+
generate "rockstart:pundit"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def generate_security
|
|
53
|
+
generate "rockstart:security"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def generate_docker
|
|
57
|
+
generate "rockstart:docker", postgres_option, devise_option
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def generate_quality
|
|
61
|
+
generate "rockstart:quality"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def devise_option
|
|
67
|
+
options[:devise] ? "--devise" : "--no-devise"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def postgres_option
|
|
71
|
+
options[:postgres] ? "--postgres" : "--no-postgres"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def pundit_option
|
|
75
|
+
options[:pundit] ? "--pundit" : "--no-pundit"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Rockstart::RspecGenerator < Rails::Generators::Base
|
|
4
|
+
source_root File.expand_path("templates", __dir__)
|
|
5
|
+
|
|
6
|
+
def add_gems
|
|
7
|
+
gem "dotenv-rails", groups: %i[development test]
|
|
8
|
+
gem "factory_bot_rails", group: %i[development test]
|
|
9
|
+
gem "faker", group: %i[development test]
|
|
10
|
+
gem "rspec-rails", "~> 4.0.0", group: %i[development test]
|
|
11
|
+
gem "shoulda-matchers", group: :test
|
|
12
|
+
gem "simplecov", group: :test
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def install_rspec_rails
|
|
16
|
+
Bundler.with_clean_env do
|
|
17
|
+
run "bundle install --quiet"
|
|
18
|
+
|
|
19
|
+
Dir.mktmpdir do |dir|
|
|
20
|
+
generate_rspec_install(dir)
|
|
21
|
+
template File.join(dir, ".rspec"), ".rspec"
|
|
22
|
+
directory File.join(dir, "spec"), "spec"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def add_dotenv_files
|
|
28
|
+
copy_file "dotenv.development", ".env.development"
|
|
29
|
+
copy_file "dotenv.test", ".env.test"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def add_rspec_support
|
|
33
|
+
directory "support", "spec/support"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def add_coverage_to_gitignore
|
|
37
|
+
append_file ".gitignore", "coverage/\n"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def generate_rspec_install(dir)
|
|
43
|
+
require "generators/rspec/install/install_generator"
|
|
44
|
+
|
|
45
|
+
initializer = ::Rspec::Generators::InstallGenerator.new(
|
|
46
|
+
report_stream: StringIO.new
|
|
47
|
+
)
|
|
48
|
+
initializer.destination_root = dir
|
|
49
|
+
initializer.invoke_all
|
|
50
|
+
|
|
51
|
+
prepend_simplecov_start(dir)
|
|
52
|
+
enable_support_directory(dir)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def prepend_simplecov_start(dir)
|
|
56
|
+
prepend_file File.join(dir, "spec", "spec_helper.rb"), <<~SIMPLECOV
|
|
57
|
+
# frozen_string_literal: true
|
|
58
|
+
|
|
59
|
+
require "simplecov"
|
|
60
|
+
SimpleCov.start("rails") do
|
|
61
|
+
add_filter "/lib/templates"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
SIMPLECOV
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def enable_support_directory(dir)
|
|
68
|
+
uncomment_lines File.join(dir, "spec", "rails_helper.rb"), /Dir.+spec.+support.+\.rb/
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
APP_HOST=www.example.com
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
APP_HOST=localhost:3000
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
<% module_namespacing do -%>
|
|
4
|
+
RSpec.describe <%= class_name %>, <%= type_metatag(:model) %> do
|
|
5
|
+
<%- for attribute in attributes -%>
|
|
6
|
+
# <%= attribute.name %>:<%= attribute.type %>
|
|
7
|
+
it { is_expected.to have_db_column(:<%= attribute.name %>) }
|
|
8
|
+
<%- if %w(email name title).include?(attribute.name) -%>
|
|
9
|
+
it { is_expected.to validate_presence_of(:<%= attribute.name %>) }
|
|
10
|
+
<%- end -%>
|
|
11
|
+
<%- end -%>
|
|
12
|
+
end
|
|
13
|
+
<% end -%>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.configure do |config|
|
|
4
|
+
# Allow direct use of t() and l() in specs
|
|
5
|
+
config.include AbstractController::Translation
|
|
6
|
+
|
|
7
|
+
# Allow have_selector matcher in request specs
|
|
8
|
+
config.include Capybara::RSpecMatchers, type: :request
|
|
9
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Rockstart::ScaffoldTemplatesGenerator < Rails::Generators::Base
|
|
4
|
+
source_root File.expand_path("templates", __dir__)
|
|
5
|
+
|
|
6
|
+
class_option :devise, type: :boolean,
|
|
7
|
+
desc: "Include Devise support",
|
|
8
|
+
default: true
|
|
9
|
+
|
|
10
|
+
class_option :pundit, type: :boolean,
|
|
11
|
+
desc: "Include Pundit support",
|
|
12
|
+
default: true
|
|
13
|
+
|
|
14
|
+
def copy_scaffold_templates
|
|
15
|
+
template "api_controller.rb.tt", "lib/templates/rails/scaffold_controller/api_controller.rb.tt"
|
|
16
|
+
template "controller.rb.tt", "lib/templates/rails/scaffold_controller/controller.rb.tt"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def copy_rspec_scaffold_templates
|
|
20
|
+
copy_file "rspec/scaffold/api_request_spec.rb",
|
|
21
|
+
"#{rspec_templates_dir}/scaffold/api_request_spec.rb"
|
|
22
|
+
copy_file "rspec/scaffold/request_spec.rb",
|
|
23
|
+
"#{rspec_templates_dir}/scaffold/request_spec.rb"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def devise?
|
|
29
|
+
options[:devise]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def pundit?
|
|
33
|
+
options[:pundit]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def rspec_templates_dir
|
|
37
|
+
@rspec_templates_dir ||= "lib/templates/rspec"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<%% if namespaced? -%>
|
|
2
|
+
require_dependency "<%%= namespaced_path %>/application_controller"
|
|
3
|
+
|
|
4
|
+
<%% end -%>
|
|
5
|
+
<%% module_namespacing do -%>
|
|
6
|
+
class <%%= controller_class_name %>Controller < ApplicationController
|
|
7
|
+
<%- if devise? -%>
|
|
8
|
+
before_action :authenticate_user!
|
|
9
|
+
<%- end -%>
|
|
10
|
+
before_action :assign_<%%= singular_table_name %>, only: [:show, :update, :destroy]
|
|
11
|
+
<%- if pundit? -%>
|
|
12
|
+
after_action :verify_authorized
|
|
13
|
+
after_action :verify_policy_scoped, except: [:new, :create]
|
|
14
|
+
<%- end -%>
|
|
15
|
+
|
|
16
|
+
# GET <%%= route_url %>
|
|
17
|
+
def index
|
|
18
|
+
<%- if pundit? -%>
|
|
19
|
+
authorize <%%= class_name %>
|
|
20
|
+
@<%%= plural_table_name %> = policy_scope(<%%= class_name %>)
|
|
21
|
+
<%- else -%>
|
|
22
|
+
@<%%= plural_table_name %> = <%%= orm_class.all(class_name) %>
|
|
23
|
+
<%- end -%>
|
|
24
|
+
|
|
25
|
+
render json: <%%= "@#{plural_table_name}" %>
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# GET <%%= route_url %>/1
|
|
29
|
+
def show
|
|
30
|
+
<%- if pundit? -%>
|
|
31
|
+
authorize @<%%= singular_table_name %>
|
|
32
|
+
|
|
33
|
+
<%- end -%>
|
|
34
|
+
render json: <%%= "@#{singular_table_name}" %>
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# POST <%%= route_url %>
|
|
38
|
+
def create
|
|
39
|
+
@<%%= singular_table_name %> = <%%= orm_class.build(class_name, "#{singular_table_name}_params") %>
|
|
40
|
+
<%- if pundit? -%>
|
|
41
|
+
authorize @<%%= singular_table_name %>
|
|
42
|
+
<%- end -%>
|
|
43
|
+
|
|
44
|
+
if @<%%= orm_instance.save %>
|
|
45
|
+
render json: <%%= "@#{singular_table_name}" %>, status: :created, location: <%%= "@#{singular_table_name}" %>
|
|
46
|
+
else
|
|
47
|
+
render json: <%%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# PATCH/PUT <%%= route_url %>/1
|
|
52
|
+
def update
|
|
53
|
+
<%- if pundit? -%>
|
|
54
|
+
authorize @<%%= singular_table_name %>
|
|
55
|
+
|
|
56
|
+
<%- end -%>
|
|
57
|
+
if @<%%= orm_instance.update("#{singular_table_name}_params") %>
|
|
58
|
+
render json: <%%= "@#{singular_table_name}" %>
|
|
59
|
+
else
|
|
60
|
+
render json: <%%= "@#{orm_instance.errors}" %>, status: :unprocessable_entity
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# DELETE <%%= route_url %>/1
|
|
65
|
+
def destroy
|
|
66
|
+
<%- if pundit? -%>
|
|
67
|
+
authorize @<%%= singular_table_name %>
|
|
68
|
+
|
|
69
|
+
<%- end -%>
|
|
70
|
+
@<%%= orm_instance.destroy %>
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
# Use callbacks to share common setup or constraints between actions.
|
|
75
|
+
def assign_<%%= singular_table_name %>
|
|
76
|
+
<%- if pundit? -%>
|
|
77
|
+
@<%%= singular_table_name %> = <%%= orm_class.find("policy_scope(#{class_name})", "params[:id]") %>
|
|
78
|
+
<%- else -%>
|
|
79
|
+
@<%%= singular_table_name %> = <%%= orm_class.find(class_name, "params[:id]") %>
|
|
80
|
+
<%- end -%>
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Only allow a trusted parameter "white list" through.
|
|
84
|
+
def <%%= "#{singular_table_name}_params" %>
|
|
85
|
+
<%- if pundit? -%>
|
|
86
|
+
permitted_attributes(@<%%= singular_table_name %> || <%%= class_name %>)
|
|
87
|
+
<%- else -%>
|
|
88
|
+
<%%- if attributes_names.empty? -%>
|
|
89
|
+
params.fetch(:<%%= singular_table_name %>, {})
|
|
90
|
+
<%%- else -%>
|
|
91
|
+
params.require(:<%%= singular_table_name %>).permit(<%%= permitted_params %>)
|
|
92
|
+
<%%- end -%>
|
|
93
|
+
<%- end -%>
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
<%% end -%>
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<%% if namespaced? -%>
|
|
2
|
+
require_dependency "<%%= namespaced_path %>/application_controller"
|
|
3
|
+
|
|
4
|
+
<%% end -%>
|
|
5
|
+
<%% module_namespacing do -%>
|
|
6
|
+
class <%%= controller_class_name %>Controller < ApplicationController
|
|
7
|
+
<%- if pundit? -%>
|
|
8
|
+
include PunditErrorHandling
|
|
9
|
+
|
|
10
|
+
<%- end -%>
|
|
11
|
+
<%- if devise? -%>
|
|
12
|
+
before_action :authenticate_user!
|
|
13
|
+
<%- end -%>
|
|
14
|
+
before_action :assign_<%%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
|
|
15
|
+
<%- if pundit? -%>
|
|
16
|
+
after_action :verify_authorized
|
|
17
|
+
after_action :verify_policy_scoped, except: [:new, :create]
|
|
18
|
+
<%- end -%>
|
|
19
|
+
|
|
20
|
+
# GET <%%= route_url %>
|
|
21
|
+
def index
|
|
22
|
+
<%- if pundit? -%>
|
|
23
|
+
authorize <%%= class_name %>
|
|
24
|
+
@<%%= plural_table_name %> = policy_scope(<%%= class_name %>)
|
|
25
|
+
<%- else -%>
|
|
26
|
+
@<%%= plural_table_name %> = <%%= orm_class.all(class_name) %>
|
|
27
|
+
<%- end -%>
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# GET <%%= route_url %>/1
|
|
31
|
+
def show
|
|
32
|
+
<%- if pundit? -%>
|
|
33
|
+
authorize @<%%= singular_table_name %>
|
|
34
|
+
<%- end -%>
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# GET <%%= route_url %>/new
|
|
38
|
+
def new
|
|
39
|
+
@<%%= singular_table_name %> = <%%= orm_class.build(class_name) %>
|
|
40
|
+
<%- if pundit? -%>
|
|
41
|
+
authorize @<%%= singular_table_name %>
|
|
42
|
+
<%- end -%>
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# GET <%%= route_url %>/1/edit
|
|
46
|
+
def edit
|
|
47
|
+
<%- if pundit? -%>
|
|
48
|
+
authorize @<%%= singular_table_name %>
|
|
49
|
+
<%- end -%>
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# POST <%%= route_url %>
|
|
53
|
+
def create
|
|
54
|
+
@<%%= singular_table_name %> = <%%= orm_class.build(class_name, "#{singular_table_name}_params") %>
|
|
55
|
+
<%- if pundit? -%>
|
|
56
|
+
authorize @<%%= singular_table_name %>
|
|
57
|
+
<%- end -%>
|
|
58
|
+
|
|
59
|
+
if @<%%= orm_instance.save %>
|
|
60
|
+
redirect_to <%%= redirect_resource_name %>, notice: <%%= "'#{human_name} was successfully created.'" %>
|
|
61
|
+
else
|
|
62
|
+
render :new
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# PATCH/PUT <%%= route_url %>/1
|
|
67
|
+
def update
|
|
68
|
+
<%- if pundit? -%>
|
|
69
|
+
authorize @<%%= singular_table_name %>
|
|
70
|
+
|
|
71
|
+
<%- end -%>
|
|
72
|
+
if @<%%= orm_instance.update("#{singular_table_name}_params") %>
|
|
73
|
+
redirect_to <%%= redirect_resource_name %>, notice: <%%= "'#{human_name} was successfully updated.'" %>
|
|
74
|
+
else
|
|
75
|
+
render :edit
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# DELETE <%%= route_url %>/1
|
|
80
|
+
def destroy
|
|
81
|
+
<%- if pundit? -%>
|
|
82
|
+
authorize @<%%= singular_table_name %>
|
|
83
|
+
|
|
84
|
+
<%- end -%>
|
|
85
|
+
@<%%= orm_instance.destroy %>
|
|
86
|
+
redirect_to <%%= index_helper %>_url, notice: <%%= "'#{human_name} was successfully destroyed.'" %>
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
<%- if pundit? -%>
|
|
90
|
+
protected
|
|
91
|
+
|
|
92
|
+
def authentication_failed_redirect_path_for(_resource)
|
|
93
|
+
if @<%%= singular_table_name %> && policy(@<%%= singular_table_name %>).show?
|
|
94
|
+
@<%%= singular_table_name %>
|
|
95
|
+
elsif policy(<%%= class_name %>).index?
|
|
96
|
+
<%%= index_helper %>_url
|
|
97
|
+
else
|
|
98
|
+
super
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
<%- end -%>
|
|
103
|
+
private
|
|
104
|
+
# Use callbacks to share common setup or constraints between actions.
|
|
105
|
+
def assign_<%%= singular_table_name %>
|
|
106
|
+
<%- if pundit? -%>
|
|
107
|
+
@<%%= singular_table_name %> = <%%= orm_class.find("policy_scope(#{class_name})", "params[:id]") %>
|
|
108
|
+
<%- else -%>
|
|
109
|
+
@<%%= singular_table_name %> = <%%= orm_class.find(class_name, "params[:id]") %>
|
|
110
|
+
<%- end -%>
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Only allow a trusted parameter "white list" through.
|
|
114
|
+
def <%%= "#{singular_table_name}_params" %>
|
|
115
|
+
<%- if pundit? -%>
|
|
116
|
+
permitted_attributes(@<%%= singular_table_name %> || <%%= class_name %>)
|
|
117
|
+
<%- else -%>
|
|
118
|
+
<%%- if attributes_names.empty? -%>
|
|
119
|
+
params.fetch(:<%%= singular_table_name %>, {})
|
|
120
|
+
<%%- else -%>
|
|
121
|
+
params.require(:<%%= singular_table_name %>).permit(<%%= permitted_params %>)
|
|
122
|
+
<%%- end -%>
|
|
123
|
+
<%- end -%>
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
<%% end -%>
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
<%- resource_path = name.underscore.pluralize -%>
|
|
2
|
+
<%- permitted_params = attributes.map { |a| ":#{a.name}" }.join(", ") -%>
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
|
|
5
|
+
require "rails_helper"
|
|
6
|
+
|
|
7
|
+
<% module_namespacing do -%>
|
|
8
|
+
RSpec.describe "/<%= controller_class_name %>", <%= type_metatag(:request) %> do
|
|
9
|
+
# This should return the minimal set of values that should be in the headers
|
|
10
|
+
# in order to pass any filters (e.g. authentication) defined in
|
|
11
|
+
# <%= controller_class_name %>Controller, or in your router and rack
|
|
12
|
+
# middleware. Be sure to keep this updated too.
|
|
13
|
+
let(:valid_headers) do
|
|
14
|
+
{}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
<% unless options[:singleton] -%>
|
|
18
|
+
describe "GET /<%= resource_path %>" do
|
|
19
|
+
it "renders a successful response" do
|
|
20
|
+
create(:<%= file_name %>)
|
|
21
|
+
get <%= index_helper %>_url, headers: valid_headers, as: :json
|
|
22
|
+
expect(response).to be_successful
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
<% end -%>
|
|
26
|
+
|
|
27
|
+
describe "GET /<%= resource_path %>/:id" do
|
|
28
|
+
it "renders a successful response" do
|
|
29
|
+
<%= file_name %> = create(:<%= file_name %>)
|
|
30
|
+
get <%= show_helper.tr('@', '') %>, as: :json
|
|
31
|
+
expect(response).to be_successful
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "POST /<%= resource_path %>" do
|
|
36
|
+
context "with valid parameters" do
|
|
37
|
+
let(:valid_attributes) do
|
|
38
|
+
<%- if attributes.any? -%>
|
|
39
|
+
attributes_for(:<%= ns_file_name %>).slice(<%= permitted_params %>)
|
|
40
|
+
<%- else -%>
|
|
41
|
+
skip("Add a hash of attributes valid for your model")
|
|
42
|
+
<%- end -%>
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "creates a new <%= class_name %>" do
|
|
46
|
+
expect do
|
|
47
|
+
post <%= index_helper %>_url,
|
|
48
|
+
params: { <%= ns_file_name %>: valid_attributes }, headers: valid_headers, as: :json
|
|
49
|
+
end.to change(<%= class_name %>, :count).by(1)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "renders a JSON response with the new <%= ns_file_name %>" do
|
|
53
|
+
post <%= index_helper %>_url,
|
|
54
|
+
params: { <%= ns_file_name %>: valid_attributes }, headers: valid_headers, as: :json
|
|
55
|
+
expect(response).to have_http_status(:created)
|
|
56
|
+
expect(response.content_type).to match(a_string_including("application/json"))
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "with invalid parameters" do
|
|
61
|
+
let(:invalid_attributes) do
|
|
62
|
+
skip("Add a hash of attributes invalid for your model")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "does not create a new <%= class_name %>" do
|
|
66
|
+
expect do
|
|
67
|
+
post <%= index_helper %>_url,
|
|
68
|
+
params: { <%= ns_file_name %>: invalid_attributes }, as: :json
|
|
69
|
+
end.to change(<%= class_name %>, :count).by(0)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "renders a JSON response with errors for the new <%= ns_file_name %>" do
|
|
73
|
+
post <%= index_helper %>_url,
|
|
74
|
+
params: { <%= ns_file_name %>: invalid_attributes }, headers: valid_headers, as: :json
|
|
75
|
+
expect(response).to have_http_status(:unprocessable_entity)
|
|
76
|
+
expect(response.content_type).to eq("application/json")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "PATCH /<%= resource_path %>/:id" do
|
|
82
|
+
context "with valid parameters" do
|
|
83
|
+
let(:new_attributes) do
|
|
84
|
+
<%- if attributes.any? -%>
|
|
85
|
+
attributes_for(:<%= ns_file_name %>).slice(<%= permitted_params %>)
|
|
86
|
+
<%- else -%>
|
|
87
|
+
skip("Add a hash of attributes valid for your model")
|
|
88
|
+
<%- end -%>
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "updates the requested <%= ns_file_name %>" do
|
|
92
|
+
<%= file_name %> = create(:<%= file_name %>)
|
|
93
|
+
patch <%= show_helper.tr('@', '') %>,
|
|
94
|
+
params: { <%= singular_table_name %>: invalid_attributes }, headers: valid_headers, as: :json
|
|
95
|
+
|
|
96
|
+
<%= file_name %>.reload
|
|
97
|
+
<%- if attributes.any? -%>
|
|
98
|
+
<%- attributes.each do |attribute| -%>
|
|
99
|
+
expect(<%= file_name %>.<%= attribute.name %>).to eq(new_attributes[:<%= attribute.name %>])
|
|
100
|
+
<%- end -%>
|
|
101
|
+
<%- else -%>
|
|
102
|
+
skip("Add assertions for updated state")
|
|
103
|
+
<%- end -%>
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "renders a JSON response with the <%= ns_file_name %>" do
|
|
107
|
+
<%= file_name %> = create(:<%= file_name %>)
|
|
108
|
+
patch <%= show_helper.tr('@', '') %>,
|
|
109
|
+
params: { <%= singular_table_name %>: invalid_attributes }, headers: valid_headers, as: :json
|
|
110
|
+
expect(response).to have_http_status(:ok)
|
|
111
|
+
expect(response.content_type).to eq("application/json")
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "with invalid parameters" do
|
|
116
|
+
let(:invalid_attributes) do
|
|
117
|
+
skip("Add a hash of attributes invalid for your model")
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "renders a JSON response with errors for the <%= ns_file_name %>" do
|
|
121
|
+
<%= file_name %> = create(:<%= file_name %>)
|
|
122
|
+
patch <%= show_helper.tr('@', '') %>,
|
|
123
|
+
params: { <%= singular_table_name %>: invalid_attributes }, headers: valid_headers, as: :json
|
|
124
|
+
expect(response).to have_http_status(:unprocessable_entity)
|
|
125
|
+
expect(response.content_type).to eq("application/json")
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe "DELETE /<%= resource_path %>/:id" do
|
|
131
|
+
it "destroys the requested <%= ns_file_name %>" do
|
|
132
|
+
<%= file_name %> = create(:<%= file_name %>)
|
|
133
|
+
expect do
|
|
134
|
+
delete <%= show_helper.tr('@', '') %>, headers: valid_headers, as: :json
|
|
135
|
+
end.to change(<%= class_name %>, :count).by(-1)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
<% end -%>
|