Class: Sbmeet::Generators::InstallGenerator
- Inherits:
-
Rails::Generators::Base
- Object
- Rails::Generators::Base
- Sbmeet::Generators::InstallGenerator
- Includes:
- Rails::Generators::Migration
- Defined in:
- lib/generators/sbmeet/install_generator.rb
Class Method Summary collapse
Instance Method Summary collapse
- #check_host_authentication_capabilities ⇒ Object
- #check_if_pg ⇒ Object
- #copy_application_logic ⇒ Object
- #copy_frontend_assets ⇒ Object
- #inject_bootstrap_if_missing ⇒ Object
- #inject_routes ⇒ Object
- #setup_action_cable ⇒ Object
- #setup_database ⇒ Object
- #setup_javascript_dependencies ⇒ Object
- #verify_and_update_application_js ⇒ Object
- #verify_devise ⇒ Object
Class Method Details
.next_migration_number(dirname) ⇒ Object
70 71 72 |
# File 'lib/generators/sbmeet/install_generator.rb', line 70 def self.next_migration_number(dirname) ActiveRecord::Generators::Base.next_migration_number(dirname) end |
Instance Method Details
#check_host_authentication_capabilities ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/generators/sbmeet/install_generator.rb', line 10 def check_host_authentication_capabilities say "Analyzing host application environment...", :yellow Rails.application.eager_load! user_model_path = "app/models/user.rb" if ApplicationController.new.respond_to?(:current_user, true) say_status :success, "Found 'current_user' definition.", :green if ::File.exist?(user_model_path) user_methods = defined?(User) ? User.instance_methods : [] if user_methods.include?(:admin?) say_status :success, "Found 'admin?' method on the User model.", :green else say_status :warning, "User model found, but 'admin?' is missing.", :yellow method_injection = <<~RUBY # Added by SBMeet Installer def admin? Rails.env.development? || Rails.env.test? end RUBY inject_into_file user_model_path, method_injection, after: /class User < ApplicationRecord.*\n/ say_status :insert, "Added fallback admin? method to #{user_model_path}", :green end else say_status :error, "Could not find a standard 'User' model file at #{user_model_path}.", :red exit 1 end else say_status :error, "No 'current_user' method detected in ApplicationController.", :red say "Make sure you install and configure an authentication library (like Devise) before using SBMeet.", :white exit 1 end end |
#check_if_pg ⇒ Object
47 48 49 50 51 52 |
# File 'lib/generators/sbmeet/install_generator.rb', line 47 def check_if_pg unless File.read("config/database.yml").include?("postgresql") say_status :error, "SBMeet requires PostgreSQL for ActionCable signaling.", :red exit 1 end end |
#copy_application_logic ⇒ Object
90 91 92 93 |
# File 'lib/generators/sbmeet/install_generator.rb', line 90 def copy_application_logic copy_file "models/room.rb", "app/models/room.rb", force: true copy_file "controllers/rooms_controller.rb", "app/controllers/rooms_controller.rb", force: true end |
#copy_frontend_assets ⇒ Object
95 96 97 98 99 100 101 |
# File 'lib/generators/sbmeet/install_generator.rb', line 95 def copy_frontend_assets copy_file "javascript/room_controller.js", "app/javascript/controllers/room_controller.js", force: true copy_file "javascript/index.js", "app/javascript/controllers/index.js", force: true directory "javascript/channels", "app/javascript/channels", force: true directory "views/rooms", "app/views/rooms", force: true end |
#inject_bootstrap_if_missing ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/generators/sbmeet/install_generator.rb', line 103 def inject_bootstrap_if_missing has_bootstrap = ((File.exist?("config/importmap.rb") && File.read("config/importmap.rb").include?("bootstrap")) || (File.exist?("package.json") && File.read("package.json").include?("bootstrap")) || (File.exist?("app/assets/stylesheets/application.bootstrap.scss"))) unless has_bootstrap say_status :info, "Injecting Bootstrap 5 CDN into room views.", :yellow prepend_file "app/views/rooms/show.html.erb", "<link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n" prepend_file "app/views/rooms/index.html.erb", "<link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n" end end |
#inject_routes ⇒ Object
142 143 144 |
# File 'lib/generators/sbmeet/install_generator.rb', line 142 def inject_routes route "resources :rooms, only: [:index, :show, :new, :create, :destroy]" end |
#setup_action_cable ⇒ Object
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/generators/sbmeet/install_generator.rb', line 115 def setup_action_cable # Overwrite cable configuration with your PG/Redis required layout template "config/cable.yml", "config/cable.yml", force: true copy_file "channels/signaling_channel.rb", "app/channels/signaling_channel.rb", force: true # FIXED: Use force: true to overwrite default empty Rails framework files copy_file "channels/connection.rb", "app/channels/application_cable/connection.rb", force: true copy_file "channels/channel.rb", "app/channels/application_cable/channel.rb", force: true end |
#setup_database ⇒ Object
74 75 76 77 |
# File 'lib/generators/sbmeet/install_generator.rb', line 74 def setup_database migration_template "migrations/create_rooms.rb.erb", "db/migrate/create_rooms.rb" say_status :success, "Created Room model migration.", :green end |
#setup_javascript_dependencies ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/generators/sbmeet/install_generator.rb', line 126 def setup_javascript_dependencies if File.exist?("config/importmap.rb") importmap_content = File.read("config/importmap.rb") unless importmap_content.include?('"@rails/actioncable"') append_to_file "config/importmap.rb", "\npin \"@rails/actioncable\", to: \"actioncable.esm.js\"" end unless importmap_content.include?('pin_all_from "app/javascript/channels"') append_to_file "config/importmap.rb", "\npin_all_from \"app/javascript/channels\", under: \"channels\"" end unless importmap_content.include?('pin_all_from "app/javascript/controllers"') append_to_file "config/importmap.rb", "\npin_all_from \"app/javascript/controllers\", under: \"controllers\"" end end end |
#verify_and_update_application_js ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/generators/sbmeet/install_generator.rb', line 54 def verify_and_update_application_js target_file = "app/javascript/application.js" unless File.exist?(target_file) say_status :error, "SBMeet requires a configured JavaScript asset pipeline.", :red exit 1 end js_content = File.read(target_file) unless js_content.include?('import "channels"') || js_content.include?("import './channels'") say_status :insert, "Appending channels import to application.js", :green append_to_file target_file, "\nimport \"channels\"" end end |
#verify_devise ⇒ Object
79 80 81 82 83 84 85 86 87 88 |
# File 'lib/generators/sbmeet/install_generator.rb', line 79 def verify_devise has_devise_gem = File.read("Gemfile").include?("gem 'devise'") has_devise_model = File.exist?("app/models/user.rb") && File.read("app/models/user.rb").include?("devise :") if has_devise_gem && has_devise_model say_status :success, "Devise authentication validated.", :green else say_status :warning, "Devise setup not fully detected. Check your configuration if connection errors occur.", :yellow end end |