pineapples 0.3.34 → 0.3.345
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 +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!
|