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.
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