hyper-kitten-meow 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/hyper_kitten_meow/admin/admin_controller.rb +7 -0
- data/app/controllers/hyper_kitten_meow/admin/posts_controller.rb +7 -0
- data/app/controllers/hyper_kitten_meow/admin/sessions_controller.rb +34 -0
- data/app/controllers/hyper_kitten_meow/admin/tags_controller.rb +7 -0
- data/app/controllers/hyper_kitten_meow/application_controller.rb +9 -0
- data/app/controllers/hyper_kitten_meow/posts_controller.rb +5 -0
- data/app/controllers/hyper_kitten_meow/tags_controller.rb +5 -0
- data/app/helpers/hyper_kitten_meow/admin/admin_helper.rb +21 -0
- data/app/helpers/hyper_kitten_meow/application_helper.rb +5 -0
- data/app/models/hyper_kitten_meow/application_record.rb +5 -0
- data/app/models/hyper_kitten_meow/encryptor.rb +10 -0
- data/app/models/hyper_kitten_meow/post.rb +5 -0
- data/app/models/hyper_kitten_meow/user.rb +5 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/images/index.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/images/new.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/_form_fields.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/edit.html.haml +1 -1
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/index.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/new.html.haml +1 -1
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/update.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/sessions/new.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/shared/_error_handler.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/tags/edit.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/tags/index.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/tags/new.html.haml +1 -1
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/_post.html.haml +1 -1
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/_tags.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/index.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/show.html.haml +0 -0
- data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/tags/show.html.haml +0 -0
- data/app/views/layouts/{hyper_kitten/meow → hyper_kitten_meow}/admin.html.haml +0 -0
- data/app/views/layouts/{hyper_kitten/meow → hyper_kitten_meow}/application.html.haml +0 -0
- data/config/routes.rb +1 -1
- data/lib/commands/hyper_kitten_meow_command.rb +38 -0
- data/lib/hyper-kitten-meow.rb +19 -0
- data/lib/hyper_kitten_meow/concerns/controllers/admin/admin_controller.rb +43 -0
- data/lib/hyper_kitten_meow/concerns/controllers/admin/posts_controller.rb +68 -0
- data/lib/hyper_kitten_meow/concerns/controllers/admin/tags_controller.rb +63 -0
- data/lib/hyper_kitten_meow/concerns/controllers/posts_controller.rb +17 -0
- data/lib/hyper_kitten_meow/concerns/controllers/tags_controller.rb +28 -0
- data/lib/hyper_kitten_meow/concerns/models/post.rb +50 -0
- data/lib/hyper_kitten_meow/concerns/models/user.rb +43 -0
- data/lib/hyper_kitten_meow/engine.rb +13 -0
- data/lib/hyper_kitten_meow/version.rb +3 -0
- data/spec/commands/{hyper_kitten/meow/meow_command_spec.rb → hyper_kitten_meow/hyper_kitten_meow_command_spec.rb} +4 -4
- data/spec/dummy/config/application.rb +0 -1
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/dummy/db/seeds.rb +2 -2
- data/spec/dummy/log/development.log +553 -0
- data/spec/dummy/log/test.log +6715 -0
- data/spec/factories/posts.rb +1 -1
- data/spec/factories/users.rb +1 -1
- data/spec/models/hyper_kitten_meow/post_spec.rb +107 -0
- data/spec/models/{hyper_kitten/meow → hyper_kitten_meow}/user_spec.rb +1 -1
- data/spec/rails_helper.rb +1 -1
- metadata +51 -59
- data/app/assets/config/hyper_kitten_meow_manifest.js +0 -1
- data/app/assets/stylesheets/actiontext.css +0 -31
- data/app/assets/stylesheets/hyper/kitten/meow/application.css +0 -15
- data/app/controllers/hyper_kitten/meow/admin/admin_controller.rb +0 -9
- data/app/controllers/hyper_kitten/meow/admin/posts_controller.rb +0 -9
- data/app/controllers/hyper_kitten/meow/admin/sessions_controller.rb +0 -36
- data/app/controllers/hyper_kitten/meow/admin/tags_controller.rb +0 -9
- data/app/controllers/hyper_kitten/meow/application_controller.rb +0 -11
- data/app/controllers/hyper_kitten/meow/posts_controller.rb +0 -7
- data/app/controllers/hyper_kitten/meow/tags_controller.rb +0 -7
- data/app/helpers/hyper_kitten/meow/admin/admin_helper.rb +0 -23
- data/app/helpers/hyper_kitten/meow/application_helper.rb +0 -7
- data/app/jobs/hyper/kitten/meow/application_job.rb +0 -8
- data/app/mailers/hyper/kitten/meow/application_mailer.rb +0 -10
- data/app/models/hyper_kitten/meow/application_record.rb +0 -7
- data/app/models/hyper_kitten/meow/encryptor.rb +0 -12
- data/app/models/hyper_kitten/meow/post.rb +0 -7
- data/app/models/hyper_kitten/meow/user.rb +0 -7
- data/app/views/active_storage/blobs/_blob.html.erb +0 -14
- data/app/views/layouts/action_text/contents/_content.html.erb +0 -3
- data/lib/commands/hyper_kitten/meow_command.rb +0 -42
- data/lib/hyper_kitten/meow/concerns/controllers/admin/admin_controller.rb +0 -45
- data/lib/hyper_kitten/meow/concerns/controllers/admin/posts_controller.rb +0 -70
- data/lib/hyper_kitten/meow/concerns/controllers/admin/tags_controller.rb +0 -65
- data/lib/hyper_kitten/meow/concerns/controllers/posts_controller.rb +0 -19
- data/lib/hyper_kitten/meow/concerns/controllers/tags_controller.rb +0 -30
- data/lib/hyper_kitten/meow/concerns/models/post.rb +0 -52
- data/lib/hyper_kitten/meow/concerns/models/user.rb +0 -45
- data/lib/hyper_kitten/meow/engine.rb +0 -15
- data/lib/hyper_kitten/meow/version.rb +0 -5
- data/lib/hyper_kitten/meow.rb +0 -21
- data/lib/tasks/hyper/kitten/meow_tasks.rake +0 -4
- data/spec/models/hyper_kitten/meow/post_spec.rb +0 -109
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f8596e27cb97d97db6dbd2d5bb8749d54bcbba5dd3447bdb130b959da9acfb7
|
4
|
+
data.tar.gz: 17830b34e1dd16f919d73e54fa55a648fe0082702357873c8e89ba5d4433a25f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8491e65a24775cf9f754e933e3f9cf3c563b302c3e35821e69c6f48148b874ba74708996d83741f4ecaaa66ff4539c63d0be209c867466538300815d8742f15d
|
7
|
+
data.tar.gz: '01697a402010b50e0609518d66f3e66e5054791ba5f372af6e0e2bda5197062892131ccdefac8f9d3e51bfca24f58ad4fc57a8156fb189ec1d9bf408e1f57d04'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Admin
|
3
|
+
class SessionsController < AdminController
|
4
|
+
skip_before_action :authorize, only: [:new, :create]
|
5
|
+
|
6
|
+
def new
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
permitted = params.require(:session).permit([:email, :password])
|
11
|
+
user = User.find_by(email: permitted[:email].downcase)
|
12
|
+
if user && user.authenticate(permitted[:password])
|
13
|
+
# Log the user in and redirect to the user's show page.
|
14
|
+
|
15
|
+
user.set_encrypted_remember_token!
|
16
|
+
session[:user_id] = user.id
|
17
|
+
cookies.permanent.signed[:user_id] = user.id
|
18
|
+
cookies.permanent[:remember_token] = user.remember_token
|
19
|
+
redirect_to admin_posts_path
|
20
|
+
else
|
21
|
+
flash.now[:error] = t("sessions.failed_login")
|
22
|
+
render 'new'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def destroy
|
27
|
+
session.delete(:user_id)
|
28
|
+
cookies.delete(:user_id)
|
29
|
+
cookies.delete(:remember_token)
|
30
|
+
redirect_to root_url
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Admin
|
3
|
+
module AdminHelper
|
4
|
+
include Pagy::Frontend
|
5
|
+
|
6
|
+
KEY_TRANSFORMATIONS = {
|
7
|
+
"alert" => "warning",
|
8
|
+
"error" => "danger",
|
9
|
+
"notice" => "info",
|
10
|
+
"success" => "success"
|
11
|
+
}
|
12
|
+
|
13
|
+
def user_facing_flashes
|
14
|
+
flashes = flash.to_hash.slice("alert", "error", "notice", "success")
|
15
|
+
flashes.transform_keys do |key|
|
16
|
+
KEY_TRANSFORMATIONS[key]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
class Encryptor
|
3
|
+
# Returns the hash digest of the given string.
|
4
|
+
def self.encrypt(string)
|
5
|
+
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
|
6
|
+
BCrypt::Engine.cost
|
7
|
+
BCrypt::Password.create(string, cost: cost)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
%section.edit-post
|
2
2
|
%h2= "Editing Post: #{@post.title}"
|
3
3
|
= form_for @post, url: admin_post_path(@post), method: :patch, class: "form" do |f|
|
4
|
-
= render partial: '
|
4
|
+
= render partial: 'hyper_kitten_meow/admin/shared/error_handler', locals: { model: @post }
|
5
5
|
= render partial: 'form_fields', locals: { form: f }
|
File without changes
|
@@ -3,5 +3,5 @@
|
|
3
3
|
%h2 New Post
|
4
4
|
= link_to "Back to Posts", admin_posts_path
|
5
5
|
= form_for @post, url: admin_posts_path, method: :post do |f|
|
6
|
-
= render partial: '
|
6
|
+
= render partial: 'hyper_kitten_meow/admin/shared/error_handler', locals: { model: @post }
|
7
7
|
= render partial: 'form_fields', locals: { form: f }
|
File without changes
|
File without changes
|
data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/shared/_error_handler.html.haml
RENAMED
File without changes
|
File without changes
|
File without changes
|
@@ -4,7 +4,7 @@
|
|
4
4
|
.action
|
5
5
|
= link_to "Back to Tags", hyper_kitten_meow.admin_tags_path, class: "btn btn-primary"
|
6
6
|
= form_for @tag, url: admin_tags_path, method: :post, class: "form" do |f|
|
7
|
-
= render partial: '
|
7
|
+
= render partial: 'hyper_kitten_meow/admin/shared/error_handler', locals: { model: @tag }
|
8
8
|
.mb-3
|
9
9
|
= f.label :label, class: "form-label"
|
10
10
|
= f.text_field :label, class: "form-control"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rails/commands'
|
2
|
+
|
3
|
+
class HyperKittenMeowCommand < Rails::Command::Base
|
4
|
+
desc 'create_user', 'Creates an admin user'
|
5
|
+
def create_user
|
6
|
+
require_application_and_environment!
|
7
|
+
name = ask("What is your name?")
|
8
|
+
email = ask("What is your email address?")
|
9
|
+
password = ask("Please choose a password.", echo: false)
|
10
|
+
say("\n")
|
11
|
+
password_confirmation = ask("Please confirm your password.", echo: false)
|
12
|
+
|
13
|
+
::HyperKittenMeow::User.create!(
|
14
|
+
name: name, email: email, password: password,
|
15
|
+
password_confirmation: password_confirmation
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "list_users", "Lists all the admin users"
|
20
|
+
def list_users
|
21
|
+
require_application_and_environment!
|
22
|
+
users = ::HyperKittenMeow::User.all
|
23
|
+
users = users.map do |user|
|
24
|
+
[user.name, user.email]
|
25
|
+
end
|
26
|
+
say("HyperKitten users")
|
27
|
+
print_table(users)
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "delete_user", "Deletes a user with a given email address."
|
31
|
+
def delete_user(email)
|
32
|
+
require_application_and_environment!
|
33
|
+
user = ::HyperKittenMeow::User.find_by_email(email)
|
34
|
+
if user.destroy!
|
35
|
+
say("Removed #{user.name}.")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "human_urls"
|
2
|
+
require "categorical"
|
3
|
+
require "pagy"
|
4
|
+
require 'pagy/extras/bootstrap'
|
5
|
+
require "haml"
|
6
|
+
require "hyper_kitten_meow/version"
|
7
|
+
require "hyper_kitten_meow/engine"
|
8
|
+
require "hyper_kitten_meow/concerns/models/user"
|
9
|
+
require "hyper_kitten_meow/concerns/models/post"
|
10
|
+
require "hyper_kitten_meow/concerns/controllers/posts_controller"
|
11
|
+
require "hyper_kitten_meow/concerns/controllers/tags_controller"
|
12
|
+
require "hyper_kitten_meow/concerns/controllers/admin/posts_controller"
|
13
|
+
require "hyper_kitten_meow/concerns/controllers/admin/tags_controller"
|
14
|
+
require "hyper_kitten_meow/concerns/controllers/admin/admin_controller"
|
15
|
+
|
16
|
+
module HyperKittenMeow
|
17
|
+
Pagy::DEFAULT[:items] = 10
|
18
|
+
# Your code goes here...
|
19
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module Admin
|
5
|
+
module AdminController
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
include Pagy::Backend
|
8
|
+
|
9
|
+
included do
|
10
|
+
# Prevent CSRF attacks by raising an exception.
|
11
|
+
# For APIs, you may want to use :null_session instead.
|
12
|
+
protect_from_forgery with: :exception
|
13
|
+
|
14
|
+
layout 'hyper_kitten_meow/admin'
|
15
|
+
|
16
|
+
before_action :authorize
|
17
|
+
helper_method :current_user, :logged_in?
|
18
|
+
end
|
19
|
+
|
20
|
+
def authorize
|
21
|
+
raise ActionController::RoutingError.new('Not Found') unless logged_in?
|
22
|
+
end
|
23
|
+
|
24
|
+
def current_user
|
25
|
+
if (user_id = session[:user_id])
|
26
|
+
@current_user ||= User.find_by(id: user_id)
|
27
|
+
elsif (user_id = cookies.signed[:user_id])
|
28
|
+
user = User.find_by(id: user_id)
|
29
|
+
if user && user.authenticated?(cookies[:remember_token])
|
30
|
+
session[:user_id] = user.id
|
31
|
+
@current_user = user
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def logged_in?
|
37
|
+
current_user.present?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module Admin
|
5
|
+
module PostsController
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
def index
|
8
|
+
@pagy, @posts = pagy(Post.sorted_by_published_date)
|
9
|
+
end
|
10
|
+
|
11
|
+
def new
|
12
|
+
@post = Post.new
|
13
|
+
find_users
|
14
|
+
find_tags
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@post = Post.new(post_params)
|
19
|
+
find_users
|
20
|
+
find_tags
|
21
|
+
if @post.save
|
22
|
+
flash[:success] = "Post successfully created."
|
23
|
+
redirect_to admin_posts_path
|
24
|
+
else
|
25
|
+
render :new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def edit
|
30
|
+
find_post
|
31
|
+
find_users
|
32
|
+
find_tags
|
33
|
+
end
|
34
|
+
|
35
|
+
def update
|
36
|
+
find_post
|
37
|
+
find_users
|
38
|
+
find_tags
|
39
|
+
if @post.update(post_params)
|
40
|
+
flash[:success] = "Post was successfully updated."
|
41
|
+
redirect_to admin_posts_path
|
42
|
+
else
|
43
|
+
render action: 'edit'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def find_users
|
50
|
+
@users = User.all
|
51
|
+
end
|
52
|
+
|
53
|
+
def find_post
|
54
|
+
@post = Post.find_by_slug!(params[:id])
|
55
|
+
end
|
56
|
+
|
57
|
+
def find_tags
|
58
|
+
@tags = Categorical::Tag.all
|
59
|
+
end
|
60
|
+
|
61
|
+
def post_params
|
62
|
+
params.require(:post).permit(:id, :title, :body, :summary, :slug, :published, :user_id, tag_ids: [])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module Admin
|
5
|
+
module TagsController
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def index
|
9
|
+
@pagy, @tags = pagy(Categorical::Tag.all)
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@tag = Categorical::Tag.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
@tag = Categorical::Tag.new(tag_params)
|
18
|
+
if @tag.save
|
19
|
+
flash[:success] = "Tag successfully created."
|
20
|
+
redirect_to admin_tags_path
|
21
|
+
else
|
22
|
+
render :new
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
find_tag
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
find_tag
|
32
|
+
if @tag.update(tag_params)
|
33
|
+
flash[:success] = "Tag was successfully updated."
|
34
|
+
redirect_to admin_tags_path
|
35
|
+
else
|
36
|
+
render action: 'edit'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
find_tag
|
42
|
+
if @tag.destroy
|
43
|
+
redirect_to admin_tags_path,
|
44
|
+
notice: 'Tag was successfully destroyed.'
|
45
|
+
else
|
46
|
+
redirect_to admin_tags_path
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def find_tag
|
53
|
+
@tag = Categorical::Tag.find_by_slug!(params[:id])
|
54
|
+
end
|
55
|
+
|
56
|
+
def tag_params
|
57
|
+
params.require(:tag).permit(:id, :label)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module PostsController
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def index
|
8
|
+
@pagy, @posts = pagy(Post.published.sorted_by_published_date)
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
@post = Post.published.find_by_slug!(params[:id])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Controllers
|
4
|
+
module TagsController
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def show
|
8
|
+
@tag = Categorical::Tag.find_by_slug!(params[:id])
|
9
|
+
@pagy, @taggables = pagy(@tag.
|
10
|
+
send(fetch_taggable_type).
|
11
|
+
published.
|
12
|
+
sorted_by_published_date)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def fetch_taggable_type
|
18
|
+
if params[:type]
|
19
|
+
taggable_type = params[:type]
|
20
|
+
return taggable_type.underscore.to_sym
|
21
|
+
else
|
22
|
+
return "HyperKittenMeow::Post"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Models
|
4
|
+
module Post
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
include HumanUrls::Sluggable
|
7
|
+
include Categorical::Taggable
|
8
|
+
|
9
|
+
included do
|
10
|
+
belongs_to :user
|
11
|
+
|
12
|
+
validates_presence_of :title, :body, :user
|
13
|
+
validates_length_of :title, maximum: 244
|
14
|
+
|
15
|
+
before_save :set_published_at_date
|
16
|
+
|
17
|
+
sluggify :slug, generated_from: :title
|
18
|
+
|
19
|
+
has_rich_text :body
|
20
|
+
end
|
21
|
+
|
22
|
+
class_methods do
|
23
|
+
def published
|
24
|
+
where(published: true)
|
25
|
+
end
|
26
|
+
|
27
|
+
def sorted_by_published_date
|
28
|
+
order(published_at: :desc)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def css_classes
|
33
|
+
if published?
|
34
|
+
return "published"
|
35
|
+
else
|
36
|
+
return "not-published"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def set_published_at_date
|
43
|
+
if published_changed?(from: false, to: true)
|
44
|
+
self.published_at = Time.current
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
module Concerns
|
3
|
+
module Models
|
4
|
+
module User
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
|
7
|
+
|
8
|
+
included do
|
9
|
+
attr_accessor :remember_token
|
10
|
+
|
11
|
+
validates_presence_of :name, :email
|
12
|
+
validates_length_of :name, maximum: 50
|
13
|
+
validates_length_of :email, maximum: 244
|
14
|
+
validates_length_of :password, minimum: 6
|
15
|
+
validates_uniqueness_of :email, case_sensitive: false
|
16
|
+
validates_format_of :email, with: VALID_EMAIL_REGEX
|
17
|
+
|
18
|
+
has_secure_password
|
19
|
+
end
|
20
|
+
|
21
|
+
class_methods do
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns true if the given token matches the digest.
|
25
|
+
def authenticated?(remember_token)
|
26
|
+
BCrypt::Password.new(remember_digest).is_password?(remember_token)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Remembers a user in the database for use in persistent sessions.
|
30
|
+
def set_encrypted_remember_token!
|
31
|
+
self.remember_token = generate_new_token
|
32
|
+
update_attribute(:remember_digest, Encryptor.encrypt(remember_token))
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def generate_new_token
|
38
|
+
SecureRandom.urlsafe_base64
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module HyperKittenMeow
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace HyperKittenMeow
|
4
|
+
|
5
|
+
config.generators do |g|
|
6
|
+
g.test_framework :rspec
|
7
|
+
g.fixture_replacement :factory_bot
|
8
|
+
g.factory_bot dir: 'spec/factories'
|
9
|
+
g.assets false
|
10
|
+
g.helper false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rails_helper'
|
2
|
-
require "commands/
|
2
|
+
require "commands/hyper_kitten_meow_command"
|
3
3
|
|
4
|
-
RSpec.describe
|
4
|
+
RSpec.describe HyperKittenMeowCommand do
|
5
5
|
before(:each) do
|
6
6
|
allow($stdout).to receive(:print)
|
7
7
|
allow($stdout).to receive(:puts)
|
@@ -22,7 +22,7 @@ RSpec.describe HyperKitten::Command::MeowCommand do
|
|
22
22
|
and_return("1234567")
|
23
23
|
|
24
24
|
subject.create_user
|
25
|
-
user =
|
25
|
+
user = HyperKittenMeow::User.last
|
26
26
|
|
27
27
|
expect(user.name). to eq('Johnny')
|
28
28
|
expect(user.email). to eq('johnny@appleseed.com')
|
@@ -62,7 +62,7 @@ RSpec.describe HyperKitten::Command::MeowCommand do
|
|
62
62
|
|
63
63
|
subject.delete_user('johnny@appleseed.com')
|
64
64
|
|
65
|
-
expect(
|
65
|
+
expect(HyperKittenMeow::User.all).to be_empty
|
66
66
|
expect($stdout).to have_received(:print).with(/Johnny/)
|
67
67
|
end
|
68
68
|
end
|