pineapples 0.3.34 → 0.3.345
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/pineapples +13 -13
- data/lib/pineapples.rb +3 -1
- data/lib/pineapples/actions.rb +6 -0
- data/lib/pineapples/actions/base/target.rb +41 -91
- data/lib/pineapples/actions/bundle.rb +16 -0
- data/lib/pineapples/actions/chmod.rb +3 -2
- data/lib/pineapples/actions/copy_file.rb +1 -1
- data/lib/pineapples/actions/empty_directory.rb +1 -1
- data/lib/pineapples/actions/gsub_file.rb +5 -3
- data/lib/pineapples/actions/inside.rb +5 -1
- data/lib/pineapples/actions/rails/erb_converters.rb +11 -4
- data/lib/pineapples/actions/rails/new_hash_syntax_converter.rb +36 -0
- data/lib/pineapples/actions/rails/rails.rb +1 -0
- data/lib/pineapples/actions/remove_file.rb +28 -28
- data/lib/pineapples/actions/shell.rb +43 -9
- data/lib/pineapples/app_generator.rb +154 -38
- data/lib/pineapples/helpers.rb +31 -0
- data/lib/pineapples/parser.rb +42 -37
- data/lib/pineapples/setting.rb +155 -155
- data/lib/pineapples/settings.rb +31 -31
- data/lib/pineapples/templates/.example.env.tt +15 -0
- data/lib/pineapples/templates/.gitignore +3 -0
- data/lib/pineapples/templates/.simplecov.tt +11 -0
- data/lib/pineapples/templates/Gemfile.tt +23 -5
- data/lib/pineapples/templates/Procfile +1 -1
- data/lib/pineapples/templates/Procfile.dev.tt +2 -0
- data/lib/pineapples/templates/app/assets/javascripts/libs.js +4 -2
- data/lib/pineapples/templates/app/assets/stylesheets/application.scss +4 -1
- data/lib/pineapples/templates/app/controllers/application_controller.rb.tt +0 -2
- data/lib/pineapples/templates/app/controllers/auth!=devise!/confirmations_controller.rb +11 -0
- data/lib/pineapples/templates/app/controllers/auth!=devise!/passwords_controller.rb.tt +12 -0
- data/lib/pineapples/templates/app/controllers/auth!=devise!/registrations_controller.rb.tt +25 -0
- data/lib/pineapples/templates/app/controllers/auth!=devise!/sessions_controller.rb.tt +59 -0
- data/lib/pineapples/templates/app/models/user!=needs_user_model!.rb.tt +7 -4
- data/lib/pineapples/templates/app/policies!=pundit!/application_policy.rb +49 -0
- data/lib/pineapples/templates/app/presenters/base_presenter.rb.tt +24 -0
- data/lib/pineapples/templates/app/responders/application_responder.rb +9 -0
- data/lib/pineapples/templates/app/services/service.rb +7 -0
- data/lib/pineapples/templates/app/views/common/_footer.html.erb +3 -3
- data/lib/pineapples/templates/app/views/common/_header.html.erb +5 -5
- data/lib/pineapples/templates/app/views/layouts/application.html.erb.tt +0 -1
- data/lib/pineapples/templates/app/views/pages/home.html.erb +0 -1
- data/lib/pineapples/templates/bin/nginx +4 -0
- data/lib/pineapples/templates/bin/rails +1 -0
- data/lib/pineapples/templates/bin/rspec +19 -0
- data/lib/pineapples/templates/bin/setup +111 -21
- data/lib/pineapples/templates/config.ru.tt +3 -0
- data/lib/pineapples/templates/config/application.rb.tt +3 -3
- data/lib/pineapples/templates/config/boot.rb +5 -5
- data/lib/pineapples/templates/config/database.yml.tt +1 -1
- data/lib/pineapples/templates/config/environments/{development.rb → development.rb.tt} +6 -1
- data/lib/pineapples/templates/config/environments/production.rb +1 -1
- data/lib/pineapples/templates/config/environments/test.rb +2 -2
- data/lib/pineapples/templates/config/i18n-tasks.yml +2 -0
- data/lib/pineapples/templates/config/initializers/{carrierwave.rb → carrierwave!=carrierwave!.rb} +22 -22
- data/lib/pineapples/templates/config/initializers/devise!=devise!.rb.tt +262 -0
- data/lib/pineapples/templates/config/initializers/kaminari.rb +10 -0
- data/lib/pineapples/templates/config/initializers/seed_migrations.rb +15 -0
- data/lib/pineapples/templates/config/initializers/simple_form.rb +165 -0
- data/lib/pineapples/templates/config/locales/devise.en.yml +60 -0
- data/lib/pineapples/templates/config/locales/{en.yml → en.yml.tt} +2 -0
- data/lib/pineapples/templates/config/locales/kaminari.en.yml +17 -0
- data/lib/pineapples/templates/config/locales/simple_form.en.yml +31 -0
- data/lib/pineapples/templates/config/nginx.conf.tt +147 -0
- data/lib/pineapples/templates/config/puma/development.rb.tt +27 -0
- data/lib/pineapples/templates/config/{puma.rb → puma/production.rb} +5 -5
- data/lib/pineapples/templates/config/routes.rb.tt +4 -0
- data/lib/pineapples/templates/config/spring.rb +4 -0
- data/lib/pineapples/templates/lib/devise!=devise!/{ajax_failure.rb → ajax_failure!=ajax_login!.rb} +0 -0
- data/lib/pineapples/templates/lib/logging/custom_rack_logger.rb +7 -9
- data/lib/pineapples/templates/lib/logging/custom_request_logger.rb +46 -48
- data/lib/pineapples/templates/lib/tasks/admin!=user_role_field!.rake +18 -19
- data/lib/pineapples/templates/lib/templates/{erb → erb!=erb!}/scaffold/_form.html.erb +0 -0
- data/lib/pineapples/templates/lib/templates/haml!=haml!/scaffold/_form.html.haml +9 -0
- data/lib/pineapples/templates/lib/templates/slim!=slim!/scaffold/_form.html.slim +9 -0
- data/lib/pineapples/templates/spec/i18n_spec.rb +17 -0
- data/lib/pineapples/templates/spec/rails_helper.rb +30 -0
- data/lib/pineapples/templates/spec/spec_helper.rb +44 -0
- data/lib/pineapples/templates/spec/support/capybara.rb +4 -0
- data/lib/pineapples/templates/spec/support/database_cleaner.rb +27 -0
- data/lib/pineapples/templates/spec/support/email_matchers.rb +17 -0
- data/lib/pineapples/templates/spec/support/factory_girl.rb +14 -0
- data/lib/pineapples/templates/spec/support/job_helpers.rb +8 -0
- data/lib/pineapples/templates/spec/support/matchers.rb +10 -0
- data/lib/pineapples/templates/spec/support/rake_tasks.rb +8 -0
- data/lib/pineapples/templates/spec/support/shoulda_matchers.rb +24 -0
- data/lib/pineapples/version.rb +2 -2
- data/pineapples.gemspec +1 -3
- metadata +46 -12
- data/lib/pineapples/app_builder.rb +0 -70
- data/lib/pineapples/build_tasks/root_files.rb +0 -23
- data/lib/pineapples/templates/app/controllers/auth/confirmations_controller.rb +0 -2
@@ -1 +1 @@
|
|
1
|
-
web: bundle exec puma -C config/puma.rb
|
1
|
+
web: bundle exec puma -C config/puma/production.rb
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Auth::ConfirmationsController < Devise::ConfirmationsController
|
2
|
+
|
3
|
+
# most often it's needed to customize url of location to redirect user to after confirmation
|
4
|
+
|
5
|
+
# protected
|
6
|
+
|
7
|
+
# def after_confirmation_path_for(resource_name, user)
|
8
|
+
# edit_user_registration_path
|
9
|
+
# end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Auth::RegistrationsController < Devise::RegistrationsController
|
2
|
+
<% if ajax_login? -%>
|
3
|
+
respond_to :html, :js
|
4
|
+
|
5
|
+
<% end -%>
|
6
|
+
# def create
|
7
|
+
# super do |user|
|
8
|
+
# # Custom create logic goes here
|
9
|
+
# end
|
10
|
+
# end
|
11
|
+
|
12
|
+
def sign_up_params
|
13
|
+
params.permit(:email,
|
14
|
+
:password,
|
15
|
+
:password_confirmation)
|
16
|
+
end
|
17
|
+
|
18
|
+
def account_update_params
|
19
|
+
params.permit(:email,
|
20
|
+
:password,
|
21
|
+
:password_confirmation,
|
22
|
+
:current_password)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class Auth::SessionsController < Devise::SessionsController
|
2
|
+
<% if ajax_login? -%>
|
3
|
+
after_action :set_csrf_headers, only: [:create, :destroy]
|
4
|
+
|
5
|
+
respond_to :html, :js
|
6
|
+
<% end -%>
|
7
|
+
|
8
|
+
# def create
|
9
|
+
# super do |user|
|
10
|
+
# # Custom log-in logic goes here
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
|
14
|
+
# def destroy
|
15
|
+
# # custom before log-out logic
|
16
|
+
# super
|
17
|
+
# # any extra cleaning code, like deleting flash notice
|
18
|
+
# end
|
19
|
+
|
20
|
+
def sign_in_and_redirect(resource_or_scope, *args)
|
21
|
+
options = args.extract_options!
|
22
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
23
|
+
user = args.last || resource_or_scope
|
24
|
+
|
25
|
+
respond_to do |format|
|
26
|
+
format.html { super }
|
27
|
+
format.js do
|
28
|
+
sign_in(scope, user, options) if warden.user(scope) != user
|
29
|
+
redirect_url = after_ajax_sign_in_path_for(user)
|
30
|
+
redirect_to redirect_url if redirect_url.present?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
<% if ajax_login? -%>
|
36
|
+
protected
|
37
|
+
|
38
|
+
def after_ajax_sign_in_path_for(user)
|
39
|
+
redirect_url = after_sign_in_path_for(user)
|
40
|
+
if redirect_url.present
|
41
|
+
redirect_url = "#{redirect_url}.js" if redirect_url[-3..-1] != '.js'
|
42
|
+
redirect_url += redirect_url.match(/\?/) ? '&' : '?'
|
43
|
+
redirect_url += "after_sign_in=true"
|
44
|
+
end
|
45
|
+
redirect_url
|
46
|
+
end
|
47
|
+
|
48
|
+
def after_sign_in_path_for(user)
|
49
|
+
stored_location_for(user) || signed_in_root_path(user)
|
50
|
+
end
|
51
|
+
|
52
|
+
def set_csrf_headers
|
53
|
+
if request.xhr?
|
54
|
+
response.headers['X-CSRF-Token'] = form_authenticity_token.to_s
|
55
|
+
response.headers['X-CSRF-Param'] = request_forgery_protection_token.to_s
|
56
|
+
end
|
57
|
+
end
|
58
|
+
<% end -%>
|
59
|
+
end
|
@@ -1,4 +1,11 @@
|
|
1
1
|
class User < ActiveRecord::Base
|
2
|
+
<% if devise? -%>
|
3
|
+
devise :database_authenticatable, :registerable, :recoverable,
|
4
|
+
:rememberable, :trackable, :validatable, :confirmable
|
5
|
+
# :omniauthable, omniauth_providers: [:facebook]
|
6
|
+
# :lockable, :timeoutable
|
7
|
+
|
8
|
+
<% end -%>
|
2
9
|
<% if user_role_field? -%>
|
3
10
|
as_enum :role, [:guest, :regular, :trusted, :moderator, :admin],
|
4
11
|
source: :role, map: :string, accessor: :whiny
|
@@ -14,10 +21,6 @@ class User < ActiveRecord::Base
|
|
14
21
|
def guest?
|
15
22
|
new_record?
|
16
23
|
end
|
17
|
-
|
18
|
-
def regular?
|
19
|
-
persisted? && role == :regular
|
20
|
-
end
|
21
24
|
<% end -%>
|
22
25
|
|
23
26
|
<% if devise? -%>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class ApplicationPolicy
|
2
|
+
attr_reader :user
|
3
|
+
|
4
|
+
def initialize(user, model)
|
5
|
+
@user = user
|
6
|
+
end
|
7
|
+
|
8
|
+
def index?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
# def show?
|
13
|
+
# scope.where(id: record.id).exists?
|
14
|
+
# end
|
15
|
+
|
16
|
+
def create?
|
17
|
+
false
|
18
|
+
end
|
19
|
+
|
20
|
+
def new?
|
21
|
+
create?
|
22
|
+
end
|
23
|
+
|
24
|
+
def update?
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def edit?
|
29
|
+
update?
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy?
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
class Scope
|
37
|
+
attr_reader :user, :scope
|
38
|
+
|
39
|
+
def initialize(user, scope)
|
40
|
+
@user = user
|
41
|
+
@scope = scope
|
42
|
+
end
|
43
|
+
|
44
|
+
def resolve
|
45
|
+
scope
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class BasePresenter < SimpleDelegator
|
2
|
+
|
3
|
+
def initialize(model, view)
|
4
|
+
@model = model
|
5
|
+
@view = view
|
6
|
+
super(model)
|
7
|
+
end
|
8
|
+
|
9
|
+
def class
|
10
|
+
__getobj__.class
|
11
|
+
end
|
12
|
+
|
13
|
+
def h
|
14
|
+
@view
|
15
|
+
end
|
16
|
+
<% if pundit? -%>
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def policy(record)
|
21
|
+
h.policy(record)
|
22
|
+
end
|
23
|
+
<% end -%>
|
24
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class ApplicationResponder < ActionController::Responder
|
2
|
+
include Responders::FlashResponder
|
3
|
+
include Responders::HttpCacheResponder
|
4
|
+
# Redirects resources to the collection path (index action) instead
|
5
|
+
# of the resource path (show action) for POST/PUT/DELETE requests.
|
6
|
+
# include Responders::CollectionResponder
|
7
|
+
|
8
|
+
# include ModalResponder
|
9
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<footer class="footer">
|
2
|
-
|
3
|
-
</footer>
|
1
|
+
<footer class="footer">
|
2
|
+
|
3
|
+
</footer>
|
@@ -1,5 +1,5 @@
|
|
1
|
-
<header class="header">
|
2
|
-
<nav class="header-nav">
|
3
|
-
<%= link_to t(
|
4
|
-
</nav>
|
5
|
-
</header>
|
1
|
+
<header class="header">
|
2
|
+
<nav class="header-nav">
|
3
|
+
<%= link_to t('menu.home'), root_path %>
|
4
|
+
</nav>
|
5
|
+
</header>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
begin
|
3
|
+
load File.expand_path("../spring", __FILE__)
|
4
|
+
rescue LoadError
|
5
|
+
end
|
6
|
+
#
|
7
|
+
# This file was generated by Bundler.
|
8
|
+
#
|
9
|
+
# The application 'rspec' is installed as part of a gem, and
|
10
|
+
# this file is here to facilitate running it.
|
11
|
+
#
|
12
|
+
|
13
|
+
require 'pathname'
|
14
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
|
15
|
+
|
16
|
+
require 'rubygems'
|
17
|
+
require 'bundler/setup'
|
18
|
+
|
19
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
@@ -1,33 +1,123 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'pathname'
|
3
3
|
require 'fileutils'
|
4
|
+
begin
|
5
|
+
require 'highline'
|
6
|
+
rescue LoadError
|
7
|
+
# If highline is missing, we'll gracefully omit ansi color output
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup!
|
11
|
+
inside_app_root do
|
12
|
+
test 'ruby -v' => ruby_version
|
13
|
+
|
14
|
+
say_title 'Installing dependencies'
|
15
|
+
run 'gem install bundler --no-document --conservative'
|
16
|
+
run 'rbenv rehash' if rbenv_installed?
|
17
|
+
run 'bundle check || bundle install'
|
18
|
+
run "rbenv rehash" if rbenv_installed?
|
19
|
+
|
20
|
+
say_title 'Copying sample files'
|
21
|
+
copy '.example.env'
|
22
|
+
copy '.example.rspec'
|
23
|
+
|
24
|
+
test_local_env_contains_required_keys
|
25
|
+
|
26
|
+
say_title 'Preparing database'
|
27
|
+
run 'bundle exec rake db:setup'
|
28
|
+
|
29
|
+
# run 'pre-commit install' if pre_commit_available?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def inside_app_root(&block)
|
34
|
+
app_root = Pathname.new File.expand_path('../../', __FILE__)
|
35
|
+
Dir.chdir(app_root, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def ruby_version
|
39
|
+
@ruby_version ||= begin
|
40
|
+
IO.read(".ruby-version").strip
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test(options)
|
45
|
+
command, output = options.first
|
46
|
+
|
47
|
+
say(:yellow, "test #{command}") do
|
48
|
+
unless `#{command}`.include?(output)
|
49
|
+
die("#{command} does not include #{output}")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def run(command)
|
55
|
+
say(:light_blue, "run #{command}") do
|
56
|
+
shell = "#{command} > /dev/null"
|
57
|
+
with_clean_bundler_env do
|
58
|
+
system(shell) or die("#{command} exited with non-zero status}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def with_clean_bundler_env(&block)
|
64
|
+
return block.call unless defined?(Bundler)
|
65
|
+
Bundler.with_clean_env(&block)
|
66
|
+
end
|
67
|
+
|
68
|
+
def rbenv_installed?
|
69
|
+
@rbenv_installed = `which rbenv`.length > 0 if @rbenv_installed.nil?
|
70
|
+
@rbenv_installed
|
71
|
+
end
|
4
72
|
|
5
|
-
|
6
|
-
|
73
|
+
def pre_commit_available?
|
74
|
+
@pre_commit_available = `which pre-commit`.length > 0 if @pre_commit_available.nil?
|
75
|
+
@pre_commit_available
|
76
|
+
end
|
7
77
|
|
8
|
-
|
9
|
-
|
10
|
-
|
78
|
+
def copy(example_path)
|
79
|
+
copy_path = example_path.sub(/\.?example/, '')
|
80
|
+
return if File.exist?(copy_path)
|
11
81
|
|
12
|
-
|
13
|
-
|
14
|
-
|
82
|
+
say(:magenta, "copy #{example_path} → #{copy_path}") do
|
83
|
+
FileUtils.cp(example_path, copy_path)
|
84
|
+
end
|
85
|
+
end
|
15
86
|
|
16
|
-
|
17
|
-
|
18
|
-
# system "cp config/database.yml.sample config/database.yml"
|
19
|
-
# end
|
87
|
+
def test_local_env_contains_required_keys
|
88
|
+
keys = ->(file) { IO.readlines(file).map { |line| line[/^([^#\s][^=\s]*)/, 1] }.compact }
|
20
89
|
|
21
|
-
|
22
|
-
|
90
|
+
say(:light_yellow, 'test .env contents') do
|
91
|
+
missing = keys['.example.env'] - keys['.env']
|
92
|
+
if missing.any?
|
93
|
+
die("Your .env file is missing #{missing.join(', ')}")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
23
97
|
|
24
|
-
|
25
|
-
|
98
|
+
def say(color, message, output_stream = $stdout, &block)
|
99
|
+
if defined?(HighLine::String)
|
100
|
+
message.sub!(/^(\S*)/) { HighLine::String.new($1).public_send(color) }
|
101
|
+
end
|
26
102
|
|
27
|
-
|
28
|
-
|
29
|
-
|
103
|
+
if block_given?
|
104
|
+
output_stream.print("#{message}… ")
|
105
|
+
yield
|
106
|
+
say(:light_green, "✔︎")
|
107
|
+
else
|
108
|
+
output_stream.puts(message)
|
109
|
+
end
|
110
|
+
end
|
30
111
|
|
31
|
-
|
32
|
-
|
112
|
+
def say_title(title)
|
113
|
+
puts
|
114
|
+
puts "== #{title} =="
|
33
115
|
end
|
116
|
+
|
117
|
+
def die(message)
|
118
|
+
puts
|
119
|
+
say(:light_red, "FAIL #{message}", $stderr)
|
120
|
+
exit 1
|
121
|
+
end
|
122
|
+
|
123
|
+
setup!
|