hyper-kitten-meow 0.1.1 → 0.1.2
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/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
|