rockstart 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails_helper"
|
4
|
+
|
5
|
+
RSpec.describe "ContentSecurity", type: :request do
|
6
|
+
describe "HTTP Headers" do
|
7
|
+
context "after sign in" do
|
8
|
+
before do
|
9
|
+
user = create(:user)
|
10
|
+
post user_session_path params: { user: { email: user.email, password: user.password } }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "includes all expected secure headers", :aggregate_failures do
|
14
|
+
# Cookies
|
15
|
+
session_cookie = cookies.get_cookie("<%= session_name %>")
|
16
|
+
expect(session_cookie).to be_http_only
|
17
|
+
expect(session_cookie.to_h["SameSite"]).to eq("Lax")
|
18
|
+
|
19
|
+
follow_redirect!
|
20
|
+
|
21
|
+
# Security Headers
|
22
|
+
expect(response.headers["X-Frame-Options"]).to eq "SAMEORIGIN"
|
23
|
+
expect(response.headers["X-XSS-Protection"]).to eq "1; mode=block"
|
24
|
+
expect(response.headers["X-Content-Type-Options"]).to eq "nosniff"
|
25
|
+
expect(response.headers["X-Download-Options"]).to eq "noopen"
|
26
|
+
expect(response.headers["X-Permitted-Cross-Domain-Policies"]).to eq "none"
|
27
|
+
expect(response.headers["Referrer-Policy"]).to eq "strict-origin-when-cross-origin"
|
28
|
+
|
29
|
+
# Content Security Policy
|
30
|
+
content_security_policy = response.headers["Content-Security-Policy"]
|
31
|
+
expect(content_security_policy).to have_content("default-src 'none'")
|
32
|
+
expect(content_security_policy).to have_content("connect-src 'self'")
|
33
|
+
expect(content_security_policy).to have_content("font-src 'self'<% if font_hosts.any? %> <%= font_hosts.join(' ') %><% end %>")
|
34
|
+
expect(content_security_policy).to have_content("img-src 'self' data:<% if image_hosts.any? %> <%= image_hosts.join(' ') %><% end %>")
|
35
|
+
expect(content_security_policy).to have_content("object-src 'none'")
|
36
|
+
expect(content_security_policy).to have_content("script-src 'self'<% if script_hosts.any? %> <%= script_hosts.join(' ') %><% end %>")
|
37
|
+
expect(content_security_policy).to have_content("style-src 'self'<% if style_hosts.any? %> <%= style_hosts.join(' ') %><% end %>")
|
38
|
+
expect(content_security_policy).to have_content("block-all-mixed-content")
|
39
|
+
expect(content_security_policy).to have_content("upgrade-insecure-requests")
|
40
|
+
expect(content_security_policy).to have_content("report-uri /csp_violations")
|
41
|
+
|
42
|
+
# Content Security Policy should not require any unsafe exceptions
|
43
|
+
expect(content_security_policy).not_to have_content("unsafe")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "POST /csp_violations" do
|
49
|
+
context "with a csp violations" do
|
50
|
+
let(:csp_violation) do
|
51
|
+
{
|
52
|
+
"csp-report": {
|
53
|
+
"document-uri": "http://example.com/signup.html",
|
54
|
+
"referrer": "",
|
55
|
+
"blocked-uri": "http://example.com/css/style.css",
|
56
|
+
"violated-directive": "style-src cdn.example.com",
|
57
|
+
"original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /csp_violations"
|
58
|
+
}
|
59
|
+
}.to_json
|
60
|
+
end
|
61
|
+
|
62
|
+
it "responds with ok" do
|
63
|
+
post "/csp_violations", params: csp_violation, headers: { "CONTENT_TYPE" => "application/json" }
|
64
|
+
|
65
|
+
expect(response).to have_http_status(:ok)
|
66
|
+
expect(response.body).to be_blank
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "with an invalid payload" do
|
71
|
+
let(:invalid_csp_violation) do
|
72
|
+
{}.to_json
|
73
|
+
end
|
74
|
+
|
75
|
+
it "responds with ok" do
|
76
|
+
post "/csp_violations", params: invalid_csp_violation, headers: { "CONTENT_TYPE" => "application/json" }
|
77
|
+
|
78
|
+
expect(response).to have_http_status(:ok)
|
79
|
+
expect(response.body).to be_blank
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Handle violations from the Content Security Policy
|
4
|
+
class CspViolationsController < ApplicationController
|
5
|
+
skip_before_action :verify_authenticity_token
|
6
|
+
|
7
|
+
def create
|
8
|
+
report_base = JSON.parse(request.body.read)
|
9
|
+
if report_base.key? "csp-report"
|
10
|
+
report = report_base["csp-report"]
|
11
|
+
message = build_content_security_message(report)
|
12
|
+
|
13
|
+
# Post message using Lograge formatter
|
14
|
+
Rails.logger.error(message.to_json)
|
15
|
+
end
|
16
|
+
head :ok
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
22
|
+
def build_content_security_message(report)
|
23
|
+
{
|
24
|
+
"@timestamp" => ::Time.now.utc,
|
25
|
+
type: "csp-report",
|
26
|
+
blocked_uri: report["blocked-uri"].try(:downcase),
|
27
|
+
disposition: report["disposition"].try(:downcase),
|
28
|
+
document_uri: report["document-uri"],
|
29
|
+
effective_directive: report["effective-directive"].try(:downcase),
|
30
|
+
violated_directive: report["violated-directive"].try(:downcase),
|
31
|
+
referrer: report["referrer"].try(:downcase),
|
32
|
+
status_code: (report["status-code"].presence || 0).to_i,
|
33
|
+
request_id: request.request_id,
|
34
|
+
user_agent: request.headers["User-Agent"],
|
35
|
+
raw_report: report
|
36
|
+
}
|
37
|
+
end
|
38
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
39
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "digest/md5"
|
4
|
+
|
5
|
+
# Configuration for rack_attack
|
6
|
+
class Rack::Attack
|
7
|
+
LOGIN_PATH = "/users/sign_in"
|
8
|
+
REGISTRATION_PATH = "/users"
|
9
|
+
|
10
|
+
### Configure Cache ###
|
11
|
+
|
12
|
+
# If you don't want to use Rails.cache (Rack::Attack's default), then
|
13
|
+
# configure it here.
|
14
|
+
#
|
15
|
+
# Note: The store is only used for throttling (not blocklisting and
|
16
|
+
# safelisting). It must implement .increment and .write like
|
17
|
+
# ActiveSupport::Cache::Store
|
18
|
+
|
19
|
+
# Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new
|
20
|
+
|
21
|
+
### Throttle Spammy Clients ###
|
22
|
+
|
23
|
+
# If any single client IP is making tons of requests, then they're
|
24
|
+
# probably malicious or a poorly-configured scraper. Either way, they
|
25
|
+
# don't deserve to hog all of the app server's CPU. Cut them off!
|
26
|
+
#
|
27
|
+
# Note: If you're serving assets through rack, those requests may be
|
28
|
+
# counted by rack-attack and this throttle may be activated too
|
29
|
+
# quickly. If so, enable the condition to exclude them from tracking.
|
30
|
+
|
31
|
+
# Throttle all requests by IP (60rpm)
|
32
|
+
#
|
33
|
+
# Key: "rack::attack:#{Time.now.to_i/:period}:req/ip:#{req.ip}"
|
34
|
+
throttle("req/ip", limit: 300, period: 5.minutes, &:ip)
|
35
|
+
|
36
|
+
### Prevent Brute-Force Login Attacks ###
|
37
|
+
|
38
|
+
# The most common brute-force login attack is a brute-force password
|
39
|
+
# attack where an attacker simply tries a large number of emails and
|
40
|
+
# passwords to see if any credentials match.
|
41
|
+
#
|
42
|
+
# Another common method of attack is to use a swarm of computers with
|
43
|
+
# different IPs to try brute-forcing a password for a specific account.
|
44
|
+
|
45
|
+
# Throttle POST requests to /users/sign_in by IP address
|
46
|
+
#
|
47
|
+
# Key: "rack::attack:#{Time.now.to_i/:period}:logins/ip:#{req.ip}"
|
48
|
+
throttle("logins/ip", limit: 5, period: 20.seconds) do |req|
|
49
|
+
req.ip if req.path == LOGIN_PATH && req.post?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Throttle POST requests to /users/sign_in by email param
|
53
|
+
#
|
54
|
+
# Key: "rack::attack:#{Time.now.to_i/:period}:logins/email:#{req.email}"
|
55
|
+
#
|
56
|
+
# Note: This creates a problem where a malicious user could intentionally
|
57
|
+
# throttle logins for another user and force their login requests to be
|
58
|
+
# denied, but that's not very common and shouldn't happen to you. (Knock
|
59
|
+
# on wood!)
|
60
|
+
throttle("logins/email", limit: 5, period: 20.seconds) do |req|
|
61
|
+
if req.path == LOGIN_PATH && req.post?
|
62
|
+
# return a filtered email if present, nil otherwise
|
63
|
+
email_address = req.params.dig("user", "email").presence
|
64
|
+
email_address && Digest::MD5.hexdigest(email_address)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
### Prevent Brute-Force Email Harvesting ###
|
69
|
+
|
70
|
+
# For most authentication endpoints, we attempt to hide the presence of an
|
71
|
+
# email address from any outside users.
|
72
|
+
#
|
73
|
+
# However our registration form will not allow known email addresses to be used.
|
74
|
+
# Which can be used as a potential method of verifying email addresses.
|
75
|
+
#
|
76
|
+
# Throttling this endpoint is an attempt to limit the effectiveness of this farming.
|
77
|
+
|
78
|
+
# Throttle POST requests to /users by IP address
|
79
|
+
#
|
80
|
+
# Key: "rack::attack:#{Time.now.to_i/:period}:registrations/ip:#{req.ip}"
|
81
|
+
throttle("registrations/ip", limit: 5, period: 20.seconds) do |req|
|
82
|
+
req.ip if req.path == REGISTRATION_PATH && (req.post? || req.put? || req.patch?)
|
83
|
+
end
|
84
|
+
|
85
|
+
### Custom Throttle Response ###
|
86
|
+
|
87
|
+
# By default, Rack::Attack returns an HTTP 429 for throttled responses,
|
88
|
+
# which is just fine.
|
89
|
+
#
|
90
|
+
# If you want to return 503 so that the attacker might be fooled into
|
91
|
+
# believing that they've successfully broken your app (or you just want to
|
92
|
+
# customize the response), then uncomment these lines.
|
93
|
+
# self.throttled_response = lambda do |env|
|
94
|
+
# [ 503, # status
|
95
|
+
# {}, # headers
|
96
|
+
# ['']] # body
|
97
|
+
# end
|
98
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Use Cookies as the session store, and lock them down to the current domain
|
4
|
+
Rails.application.config.session_store :cookie_store, key: "<%= session_name %>",
|
5
|
+
http_only: true,
|
6
|
+
same_site: :lax,
|
7
|
+
secure: Rails.application.config.force_ssl
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Rockstart::SmtpMailerGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path("templates", __dir__)
|
5
|
+
|
6
|
+
def configure_test_environment
|
7
|
+
application(nil, env: :test) do
|
8
|
+
'config.action_mailer.default_url_options = { host: "www.example.com" }'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def configure_development_environment
|
13
|
+
application(nil, env: :development) do
|
14
|
+
'config.action_mailer.default_url_options = { host: "localhost", port: 3000 }'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def configure_production_environment
|
19
|
+
application(nil, env: :production) do
|
20
|
+
<<~MAILER
|
21
|
+
config.action_mailer.default_url_options = { host: ENV["APP_HOST"] }
|
22
|
+
config.action_mailer.delivery_method = :smtp
|
23
|
+
MAILER
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_initializers
|
28
|
+
directory "config/initializers"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ActionMailer::Base.smtp_settings = {
|
4
|
+
port: ENV["SMTP_PORT"],
|
5
|
+
address: ENV["SMTP_SERVER"],
|
6
|
+
user_name: ENV["SMTP_LOGIN"].presence,
|
7
|
+
password: ENV["SMTP_PASSWORD"].presence,
|
8
|
+
domain: ENV["APP_HOST"],
|
9
|
+
authentication: :plain
|
10
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Rockstart::TailwindcssGenerator < Rails::Generators::Base
|
4
|
+
include Rails::Generators::AppName
|
5
|
+
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
7
|
+
|
8
|
+
def install_tailwindcss
|
9
|
+
run "yarn add tailwindcss"
|
10
|
+
run "yarn tailwind init tailwind.config.js"
|
11
|
+
end
|
12
|
+
|
13
|
+
def install_purge_css
|
14
|
+
run "yarn add @fullhuman/postcss-purgecss"
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_postcss_config
|
18
|
+
template "postcss.config.js"
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_application_layout
|
22
|
+
gsub_file "app/views/layouts/application.html.erb", /stylesheet_link_tag/, "stylesheet_pack_tag"
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_stylesheet_to_application_js
|
26
|
+
template "application.css", "app/javascript/#{app_name}/application.css"
|
27
|
+
append_file "app/javascript/packs/application.js",
|
28
|
+
"\nimport '../#{app_name}/application.css';\n"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
let environment = {
|
2
|
+
plugins: [
|
3
|
+
require('tailwindcss')('tailwind.config.js'),
|
4
|
+
require('autoprefixer'),
|
5
|
+
require('postcss-import'),
|
6
|
+
require('postcss-flexbugs-fixes'),
|
7
|
+
require('postcss-preset-env')({
|
8
|
+
autoprefixer: {
|
9
|
+
flexbox: 'no-2009'
|
10
|
+
},
|
11
|
+
stage: 3
|
12
|
+
})
|
13
|
+
]
|
14
|
+
}
|
15
|
+
|
16
|
+
// Only run PurgeCSS in production
|
17
|
+
if (process.env.RAILS_ENV === "production") {
|
18
|
+
environment.plugins.push(
|
19
|
+
require('@fullhuman/postcss-purgecss')({
|
20
|
+
content: [
|
21
|
+
'./app/**/*.html.erb',
|
22
|
+
'./app/helpers/**/*.rb',
|
23
|
+
'./app/javascript/**/*.js',
|
24
|
+
'./app/javascript/**/*.vue',
|
25
|
+
'./app/javascript/**/*.jsx',
|
26
|
+
],
|
27
|
+
defaultExtractor: content => content.match(/[A-Za-z0-9-_:/]+/g) || []
|
28
|
+
})
|
29
|
+
)
|
30
|
+
}
|
31
|
+
|
32
|
+
module.exports = environment
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rockstart
|
4
|
+
# Base class for defining rockstart generators
|
5
|
+
class BaseGenerator < Rails::Generators::Base
|
6
|
+
protected
|
7
|
+
|
8
|
+
def bundle_install(&block)
|
9
|
+
Bundler.clean_system("bundle install --quiet")
|
10
|
+
Bundler.with_clean_env(&block) if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
def gsub_method(file, method_name, replacement_code = null)
|
14
|
+
existing_method_regex = / def #{method_name}...+?end$/m.freeze
|
15
|
+
replacement_code = yield if block_given?
|
16
|
+
replacement = replacement_code.split("\n").map { |line| " #{line}".rstrip }.join("\n")
|
17
|
+
gsub_file file, existing_method_regex, replacement
|
18
|
+
end
|
19
|
+
|
20
|
+
def change_application_url(name, target_url)
|
21
|
+
method_definition = url_method_template(name, target_url)
|
22
|
+
gsub_method "app/controllers/concerns/application_urls.rb", name, method_definition
|
23
|
+
gsub_method "spec/support/application_urls_helper.rb", name, method_definition
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def url_method_template(method_name, target_url)
|
29
|
+
["def #{method_name}", " #{target_url}", "end"].join("\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rockstart
|
4
|
+
# Helpers for analysing the current environment
|
5
|
+
module Env
|
6
|
+
# Default session name used in a Rails App
|
7
|
+
def self.default_session_name
|
8
|
+
"_#{Rails.application.class.module_parent.name.underscore}_session"
|
9
|
+
end
|
10
|
+
|
11
|
+
# Indicates Postgres is currently in use
|
12
|
+
def self.postgres_db?
|
13
|
+
(Rails.configuration.database_configuration[Rails.env]["adapter"] =~ /postgres/) && true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/rockstart.rb
ADDED
metadata
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rockstart
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Morrall
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-04-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.0.2
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.0.2.2
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 6.0.2
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.0.2.2
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rubocop
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: sqlite3
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
description: A collection of generators to rapidly start and update ready-to-run Rails
|
62
|
+
Applications.
|
63
|
+
email:
|
64
|
+
- bemo56@hotmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- MIT-LICENSE
|
70
|
+
- README.md
|
71
|
+
- Rakefile
|
72
|
+
- lib/generators/rockstart/USAGE
|
73
|
+
- lib/generators/rockstart/devise/USAGE
|
74
|
+
- lib/generators/rockstart/devise/devise_generator.rb
|
75
|
+
- lib/generators/rockstart/devise/templates/controllers/passwords_controller.rb
|
76
|
+
- lib/generators/rockstart/devise/templates/controllers/registrations_controller.rb
|
77
|
+
- lib/generators/rockstart/devise/templates/controllers/sessions_controller.rb
|
78
|
+
- lib/generators/rockstart/devise/templates/create_user_migration.rb.tt
|
79
|
+
- lib/generators/rockstart/devise/templates/models/user.rb
|
80
|
+
- lib/generators/rockstart/devise/templates/spec/factories/users.rb
|
81
|
+
- lib/generators/rockstart/devise/templates/spec/models/user_spec.rb
|
82
|
+
- lib/generators/rockstart/devise/templates/spec/requests/users/passwords_spec.rb
|
83
|
+
- lib/generators/rockstart/devise/templates/spec/requests/users/registrations_spec.rb
|
84
|
+
- lib/generators/rockstart/devise/templates/spec/requests/users/sessions_spec.rb
|
85
|
+
- lib/generators/rockstart/devise/templates/spec/support/devise_request_spec_helper.rb
|
86
|
+
- lib/generators/rockstart/devise/templates/translations.en.yml
|
87
|
+
- lib/generators/rockstart/docker/USAGE
|
88
|
+
- lib/generators/rockstart/docker/docker_generator.rb
|
89
|
+
- lib/generators/rockstart/docker/templates/app/Dockerfile-app
|
90
|
+
- lib/generators/rockstart/docker/templates/docker-compose.test.yml
|
91
|
+
- lib/generators/rockstart/docker/templates/docker-compose.yml
|
92
|
+
- lib/generators/rockstart/docker/templates/dockerignore
|
93
|
+
- lib/generators/rockstart/docker/templates/dotenv.docker.tt
|
94
|
+
- lib/generators/rockstart/docker/templates/localhost_domains.ext.tt
|
95
|
+
- lib/generators/rockstart/docker/templates/setup-localhost.tt
|
96
|
+
- lib/generators/rockstart/docker/templates/web/Dockerfile-web
|
97
|
+
- lib/generators/rockstart/docker/templates/web/nginx.conf
|
98
|
+
- lib/generators/rockstart/frontend_helpers/USAGE
|
99
|
+
- lib/generators/rockstart/frontend_helpers/frontend_helpers_generator.rb
|
100
|
+
- lib/generators/rockstart/frontend_helpers/templates/application_urls.rb
|
101
|
+
- lib/generators/rockstart/frontend_helpers/templates/application_urls_helper.rb
|
102
|
+
- lib/generators/rockstart/frontend_helpers/templates/titles.en.yml.tt
|
103
|
+
- lib/generators/rockstart/logging/USAGE
|
104
|
+
- lib/generators/rockstart/logging/logging_generator.rb
|
105
|
+
- lib/generators/rockstart/logging/templates/rockstart/lograge_initializer.rb
|
106
|
+
- lib/generators/rockstart/postgres/USAGE
|
107
|
+
- lib/generators/rockstart/postgres/postgres_generator.rb
|
108
|
+
- lib/generators/rockstart/postgres/templates/config/database.yml.tt
|
109
|
+
- lib/generators/rockstart/postgres/templates/migration.rb.tt
|
110
|
+
- lib/generators/rockstart/pundit/USAGE
|
111
|
+
- lib/generators/rockstart/pundit/pundit_generator.rb
|
112
|
+
- lib/generators/rockstart/pundit/templates/app/controllers/concerns/pundit_error_handling.rb
|
113
|
+
- lib/generators/rockstart/pundit/templates/app/policies/application_policy.rb
|
114
|
+
- lib/generators/rockstart/pundit/templates/app/policies/user_policy.rb
|
115
|
+
- lib/generators/rockstart/pundit/templates/config/locales/pundit.en.yml
|
116
|
+
- lib/generators/rockstart/pundit/templates/lib/templates/pundit/policy/policy.rb
|
117
|
+
- lib/generators/rockstart/pundit/templates/lib/templates/rspec/policy/policy_spec.rb
|
118
|
+
- lib/generators/rockstart/pundit/templates/spec/policies/user_policy_spec.rb
|
119
|
+
- lib/generators/rockstart/pundit/templates/spec/support/pundit_matchers.rb
|
120
|
+
- lib/generators/rockstart/quality/USAGE
|
121
|
+
- lib/generators/rockstart/quality/quality_generator.rb
|
122
|
+
- lib/generators/rockstart/quality/templates/quality.rake
|
123
|
+
- lib/generators/rockstart/quality/templates/rubocop.rake
|
124
|
+
- lib/generators/rockstart/quality/templates/rubocop.yml
|
125
|
+
- lib/generators/rockstart/rockstart_generator.rb
|
126
|
+
- lib/generators/rockstart/rspec/USAGE
|
127
|
+
- lib/generators/rockstart/rspec/rspec_generator.rb
|
128
|
+
- lib/generators/rockstart/rspec/templates/dotenv.development
|
129
|
+
- lib/generators/rockstart/rspec/templates/dotenv.test
|
130
|
+
- lib/generators/rockstart/rspec/templates/rspec_templates/model/model_spec.rb
|
131
|
+
- lib/generators/rockstart/rspec/templates/support/factory_bot.rb
|
132
|
+
- lib/generators/rockstart/rspec/templates/support/shoulda_matchers.rb
|
133
|
+
- lib/generators/rockstart/rspec/templates/support/test_helpers.rb
|
134
|
+
- lib/generators/rockstart/scaffold_templates/USAGE
|
135
|
+
- lib/generators/rockstart/scaffold_templates/scaffold_templates_generator.rb
|
136
|
+
- lib/generators/rockstart/scaffold_templates/templates/api_controller.rb.tt
|
137
|
+
- lib/generators/rockstart/scaffold_templates/templates/controller.rb.tt
|
138
|
+
- lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/api_request_spec.rb
|
139
|
+
- lib/generators/rockstart/scaffold_templates/templates/rspec/scaffold/request_spec.rb
|
140
|
+
- lib/generators/rockstart/security/USAGE
|
141
|
+
- lib/generators/rockstart/security/security_generator.rb
|
142
|
+
- lib/generators/rockstart/security/templates/brakeman.rake
|
143
|
+
- lib/generators/rockstart/security/templates/bundler_audit.rake
|
144
|
+
- lib/generators/rockstart/security/templates/cache_support.rb
|
145
|
+
- lib/generators/rockstart/security/templates/content_security_policy_initializer.rb.tt
|
146
|
+
- lib/generators/rockstart/security/templates/content_security_spec.rb.tt
|
147
|
+
- lib/generators/rockstart/security/templates/csp_violations_controller.rb
|
148
|
+
- lib/generators/rockstart/security/templates/rack_attack.rb
|
149
|
+
- lib/generators/rockstart/security/templates/security.rake
|
150
|
+
- lib/generators/rockstart/security/templates/session_store_initializer.rb.tt
|
151
|
+
- lib/generators/rockstart/smtp_mailer/USAGE
|
152
|
+
- lib/generators/rockstart/smtp_mailer/smtp_mailer_generator.rb
|
153
|
+
- lib/generators/rockstart/smtp_mailer/templates/config/initializers/action_mailer.rb
|
154
|
+
- lib/generators/rockstart/tailwindcss/USAGE
|
155
|
+
- lib/generators/rockstart/tailwindcss/tailwindcss_generator.rb
|
156
|
+
- lib/generators/rockstart/tailwindcss/templates/application.css
|
157
|
+
- lib/generators/rockstart/tailwindcss/templates/postcss.config.js
|
158
|
+
- lib/rockstart.rb
|
159
|
+
- lib/rockstart/base_generator.rb
|
160
|
+
- lib/rockstart/env.rb
|
161
|
+
- lib/rockstart/railtie.rb
|
162
|
+
- lib/rockstart/version.rb
|
163
|
+
- lib/tasks/rockstart_tasks.rake
|
164
|
+
homepage: https://github.com/bmorrall/rockstart
|
165
|
+
licenses:
|
166
|
+
- MIT
|
167
|
+
metadata: {}
|
168
|
+
post_install_message:
|
169
|
+
rdoc_options: []
|
170
|
+
require_paths:
|
171
|
+
- lib
|
172
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ">="
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
requirements: []
|
183
|
+
rubygems_version: 3.1.2
|
184
|
+
signing_key:
|
185
|
+
specification_version: 4
|
186
|
+
summary: Generators for getting Rails Ready to Rock!
|
187
|
+
test_files: []
|