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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/hyper_kitten_meow/admin/admin_controller.rb +7 -0
  3. data/app/controllers/hyper_kitten_meow/admin/posts_controller.rb +7 -0
  4. data/app/controllers/hyper_kitten_meow/admin/sessions_controller.rb +34 -0
  5. data/app/controllers/hyper_kitten_meow/admin/tags_controller.rb +7 -0
  6. data/app/controllers/hyper_kitten_meow/application_controller.rb +9 -0
  7. data/app/controllers/hyper_kitten_meow/posts_controller.rb +5 -0
  8. data/app/controllers/hyper_kitten_meow/tags_controller.rb +5 -0
  9. data/app/helpers/hyper_kitten_meow/admin/admin_helper.rb +21 -0
  10. data/app/helpers/hyper_kitten_meow/application_helper.rb +5 -0
  11. data/app/models/hyper_kitten_meow/application_record.rb +5 -0
  12. data/app/models/hyper_kitten_meow/encryptor.rb +10 -0
  13. data/app/models/hyper_kitten_meow/post.rb +5 -0
  14. data/app/models/hyper_kitten_meow/user.rb +5 -0
  15. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/images/index.html.haml +0 -0
  16. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/images/new.html.haml +0 -0
  17. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/_form_fields.html.haml +0 -0
  18. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/edit.html.haml +1 -1
  19. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/index.html.haml +0 -0
  20. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/new.html.haml +1 -1
  21. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/posts/update.html.haml +0 -0
  22. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/sessions/new.html.haml +0 -0
  23. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/shared/_error_handler.html.haml +0 -0
  24. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/tags/edit.html.haml +0 -0
  25. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/tags/index.html.haml +0 -0
  26. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/admin/tags/new.html.haml +1 -1
  27. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/_post.html.haml +1 -1
  28. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/_tags.html.haml +0 -0
  29. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/index.html.haml +0 -0
  30. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/posts/show.html.haml +0 -0
  31. data/app/views/{hyper_kitten/meow → hyper_kitten_meow}/tags/show.html.haml +0 -0
  32. data/app/views/layouts/{hyper_kitten/meow → hyper_kitten_meow}/admin.html.haml +0 -0
  33. data/app/views/layouts/{hyper_kitten/meow → hyper_kitten_meow}/application.html.haml +0 -0
  34. data/config/routes.rb +1 -1
  35. data/lib/commands/hyper_kitten_meow_command.rb +38 -0
  36. data/lib/hyper-kitten-meow.rb +19 -0
  37. data/lib/hyper_kitten_meow/concerns/controllers/admin/admin_controller.rb +43 -0
  38. data/lib/hyper_kitten_meow/concerns/controllers/admin/posts_controller.rb +68 -0
  39. data/lib/hyper_kitten_meow/concerns/controllers/admin/tags_controller.rb +63 -0
  40. data/lib/hyper_kitten_meow/concerns/controllers/posts_controller.rb +17 -0
  41. data/lib/hyper_kitten_meow/concerns/controllers/tags_controller.rb +28 -0
  42. data/lib/hyper_kitten_meow/concerns/models/post.rb +50 -0
  43. data/lib/hyper_kitten_meow/concerns/models/user.rb +43 -0
  44. data/lib/hyper_kitten_meow/engine.rb +13 -0
  45. data/lib/hyper_kitten_meow/version.rb +3 -0
  46. data/spec/commands/{hyper_kitten/meow/meow_command_spec.rb → hyper_kitten_meow/hyper_kitten_meow_command_spec.rb} +4 -4
  47. data/spec/dummy/config/application.rb +0 -1
  48. data/spec/dummy/config/routes.rb +1 -1
  49. data/spec/dummy/db/seeds.rb +2 -2
  50. data/spec/dummy/log/development.log +553 -0
  51. data/spec/dummy/log/test.log +6715 -0
  52. data/spec/factories/posts.rb +1 -1
  53. data/spec/factories/users.rb +1 -1
  54. data/spec/models/hyper_kitten_meow/post_spec.rb +107 -0
  55. data/spec/models/{hyper_kitten/meow → hyper_kitten_meow}/user_spec.rb +1 -1
  56. data/spec/rails_helper.rb +1 -1
  57. metadata +51 -59
  58. data/app/assets/config/hyper_kitten_meow_manifest.js +0 -1
  59. data/app/assets/stylesheets/actiontext.css +0 -31
  60. data/app/assets/stylesheets/hyper/kitten/meow/application.css +0 -15
  61. data/app/controllers/hyper_kitten/meow/admin/admin_controller.rb +0 -9
  62. data/app/controllers/hyper_kitten/meow/admin/posts_controller.rb +0 -9
  63. data/app/controllers/hyper_kitten/meow/admin/sessions_controller.rb +0 -36
  64. data/app/controllers/hyper_kitten/meow/admin/tags_controller.rb +0 -9
  65. data/app/controllers/hyper_kitten/meow/application_controller.rb +0 -11
  66. data/app/controllers/hyper_kitten/meow/posts_controller.rb +0 -7
  67. data/app/controllers/hyper_kitten/meow/tags_controller.rb +0 -7
  68. data/app/helpers/hyper_kitten/meow/admin/admin_helper.rb +0 -23
  69. data/app/helpers/hyper_kitten/meow/application_helper.rb +0 -7
  70. data/app/jobs/hyper/kitten/meow/application_job.rb +0 -8
  71. data/app/mailers/hyper/kitten/meow/application_mailer.rb +0 -10
  72. data/app/models/hyper_kitten/meow/application_record.rb +0 -7
  73. data/app/models/hyper_kitten/meow/encryptor.rb +0 -12
  74. data/app/models/hyper_kitten/meow/post.rb +0 -7
  75. data/app/models/hyper_kitten/meow/user.rb +0 -7
  76. data/app/views/active_storage/blobs/_blob.html.erb +0 -14
  77. data/app/views/layouts/action_text/contents/_content.html.erb +0 -3
  78. data/lib/commands/hyper_kitten/meow_command.rb +0 -42
  79. data/lib/hyper_kitten/meow/concerns/controllers/admin/admin_controller.rb +0 -45
  80. data/lib/hyper_kitten/meow/concerns/controllers/admin/posts_controller.rb +0 -70
  81. data/lib/hyper_kitten/meow/concerns/controllers/admin/tags_controller.rb +0 -65
  82. data/lib/hyper_kitten/meow/concerns/controllers/posts_controller.rb +0 -19
  83. data/lib/hyper_kitten/meow/concerns/controllers/tags_controller.rb +0 -30
  84. data/lib/hyper_kitten/meow/concerns/models/post.rb +0 -52
  85. data/lib/hyper_kitten/meow/concerns/models/user.rb +0 -45
  86. data/lib/hyper_kitten/meow/engine.rb +0 -15
  87. data/lib/hyper_kitten/meow/version.rb +0 -5
  88. data/lib/hyper_kitten/meow.rb +0 -21
  89. data/lib/tasks/hyper/kitten/meow_tasks.rake +0 -4
  90. 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: 73168c66fd7704a035f6a9703f850665e5c1e666ba89a3c5737ae59c785fac26
4
- data.tar.gz: 3719de8cdad10de4f69f52d79511f018c59184d4298df6cbac451d6c0df31fe9
3
+ metadata.gz: 6f8596e27cb97d97db6dbd2d5bb8749d54bcbba5dd3447bdb130b959da9acfb7
4
+ data.tar.gz: 17830b34e1dd16f919d73e54fa55a648fe0082702357873c8e89ba5d4433a25f
5
5
  SHA512:
6
- metadata.gz: d606b1a9b9eeb0b62228ee3c08b9c093e0d7371164494f5286c704a2aff7a3ed4dabf0bd1e921021be4b44558f3a4354f1b042f54f8ca7730734db4669bd18a2
7
- data.tar.gz: 2d7c2197853d0a8a1ecc0a47318bd07986e03250a43b3d229eda0b70d2cfb6f822f898de349045640382dc282acec4829dd9e0004cc6a9dd7d5b76f08ebbb3d6
6
+ metadata.gz: 8491e65a24775cf9f754e933e3f9cf3c563b302c3e35821e69c6f48148b874ba74708996d83741f4ecaaa66ff4539c63d0be209c867466538300815d8742f15d
7
+ data.tar.gz: '01697a402010b50e0609518d66f3e66e5054791ba5f372af6e0e2bda5197062892131ccdefac8f9d3e51bfca24f58ad4fc57a8156fb189ec1d9bf408e1f57d04'
@@ -0,0 +1,7 @@
1
+ module HyperKittenMeow
2
+ module Admin
3
+ class AdminController < ActionController::Base
4
+ include ::HyperKittenMeow::Concerns::Controllers::Admin::AdminController
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module HyperKittenMeow
2
+ module Admin
3
+ class PostsController < AdminController
4
+ include ::HyperKittenMeow::Concerns::Controllers::Admin::PostsController
5
+ end
6
+ end
7
+ end
@@ -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,7 @@
1
+ module HyperKittenMeow
2
+ module Admin
3
+ class TagsController < AdminController
4
+ include ::HyperKittenMeow::Concerns::Controllers::Admin::TagsController
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module HyperKittenMeow
2
+ class ApplicationController < ActionController::Base
3
+ # Prevent CSRF attacks by raising an exception.
4
+ # For APIs, you may want to use :null_session instead.
5
+ protect_from_forgery with: :exception
6
+
7
+ include Pagy::Backend
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module HyperKittenMeow
2
+ class PostsController < ApplicationController
3
+ include ::HyperKittenMeow::Concerns::Controllers::PostsController
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module HyperKittenMeow
2
+ class TagsController < ApplicationController
3
+ include ::HyperKittenMeow::Concerns::Controllers::TagsController
4
+ end
5
+ 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,5 @@
1
+ module HyperKittenMeow
2
+ module ApplicationHelper
3
+ include Pagy::Frontend
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module HyperKittenMeow
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ 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
@@ -0,0 +1,5 @@
1
+ module HyperKittenMeow
2
+ class Post < ApplicationRecord
3
+ include ::HyperKittenMeow::Concerns::Models::Post
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module HyperKittenMeow
2
+ class User < ActiveRecord::Base
3
+ include ::HyperKittenMeow::Concerns::Models::User
4
+ end
5
+ end
@@ -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: 'hyper_kitten/meow/admin/shared/error_handler', locals: { model: @post }
4
+ = render partial: 'hyper_kitten_meow/admin/shared/error_handler', locals: { model: @post }
5
5
  = render partial: 'form_fields', locals: { form: f }
@@ -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: 'hyper_kitten/meow/admin/shared/error_handler', locals: { model: @post }
6
+ = render partial: 'hyper_kitten_meow/admin/shared/error_handler', locals: { model: @post }
7
7
  = render partial: 'form_fields', locals: { form: f }
@@ -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: 'hyper_kitten/meow/admin/shared/error_handler', locals: { model: @tag }
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"
@@ -4,4 +4,4 @@
4
4
  %h2= link_to(post.title, post)
5
5
  = post.summary
6
6
  %section.info
7
- = render 'hyper_kitten/meow/posts/tags', tags: post.tags
7
+ = render 'hyper_kitten_meow/posts/tags', tags: post.tags
data/config/routes.rb CHANGED
@@ -1,4 +1,4 @@
1
- HyperKitten::Meow::Engine.routes.draw do
1
+ HyperKittenMeow::Engine.routes.draw do
2
2
  namespace :admin do
3
3
  resources :posts
4
4
  resources :tags
@@ -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
@@ -0,0 +1,3 @@
1
+ module HyperKittenMeow
2
+ VERSION = "0.1.2"
3
+ end
@@ -1,7 +1,7 @@
1
1
  require 'rails_helper'
2
- require "commands/hyper_kitten/meow_command"
2
+ require "commands/hyper_kitten_meow_command"
3
3
 
4
- RSpec.describe HyperKitten::Command::MeowCommand do
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 = HyperKitten::Meow::User.last
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(HyperKitten::Meow::User.all).to be_empty
65
+ expect(HyperKittenMeow::User.all).to be_empty
66
66
  expect($stdout).to have_received(:print).with(/Johnny/)
67
67
  end
68
68
  end