lib/lookbook/engine.rb in lookbook-1.0.0.beta.6 vs lib/lookbook/engine.rb in lookbook-1.0.0.beta.7

- old
+ new

@@ -1,15 +1,25 @@ require "rails" require "view_component" require "action_cable/engine" require "listen" +require "rake" module Lookbook autoload :Config, "lookbook/config" - + autoload :Data, "lookbook/data" + autoload :Hooks, "lookbook/hooks" + autoload :Panels, "lookbook/panels" + autoload :Tags, "lookbook/tags" + class << self + include Lookbook::Data + include Lookbook::Hooks + include Lookbook::Panels + include Lookbook::Tags + def version Lookbook::VERSION end def config @@ -46,50 +56,16 @@ def pages? Page.any? end - def data - @data ||= Store.new - end - - def data=(props) - @data = Store.new(props) - end - - def after_initialize(&block) - add_hook(:after_initialize, block) - end - - def before_exit(&block) - add_hook(:before_exit, block) - end - - def after_change(&block) - add_hook(:after_change, block) - end - - def define_panel(name, opts = {}) - config.define_inspector_panel(name, opts) - end - - def amend_panel(name, opts = {}) - config.amend_inspector_panel(name, opts) - end - - def remove_panel(name) - config.remove_inspector_panel(name) - end - def broadcast(event_name, data = {}) Engine.websocket&.broadcast(event_name.to_s, data) end - protected - - def add_hook(event_name, block) - config.hooks[event_name] << block + def theme + @theme ||= Lookbook::Theme.new(config.ui_theme, config.ui_theme_overrides) end end class Engine < Rails::Engine isolate_namespace Lookbook @@ -110,11 +86,11 @@ initializer "lookbook.logging.development" do Lookbook.logger.level = Lookbook.config.log_level if Rails.env.development? end initializer "lookbook.parser.tags" do - Lookbook::Parser.define_tags + Lookbook::Parser.define_tags(Lookbook.config.preview_tags) end initializer "lookbook.assets.serve" do config.app_middleware.use( Rack::Static, @@ -124,43 +100,24 @@ config.after_initialize do @preview_controller = Lookbook.config.preview_controller.constantize @preview_controller.include(Lookbook::PreviewController) - if config.lookbook.listen - Listen.logger = Lookbook.logger - - preview_listener = Listen.to( - *config.lookbook.listen_paths, - only: /\.(#{config.lookbook.listen_extensions.join("|")})$/, - force_polling: config.lookbook.listen_use_polling - ) do |modified, added, removed| - changes = { modified: modified, added: added, removed: removed } - begin - parser.parse - rescue - end - Lookbook::Preview.clear_cache - Lookbook::Engine.reload_ui(changes) - Lookbook::Engine.run_hooks(:after_change, changes) + if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1.3.1") + # Rails.application.server is only available for newer Rails versions + Rails.application.server do + init_listeners end - Lookbook::Engine.register_listener(preview_listener) - - page_listener = Listen.to( - *config.lookbook.page_paths, - only: /\.(html.*|md.*)$/, - force_polling: config.lookbook.listen_use_polling - ) do |modified, added, removed| - changes = { modified: modified, added: added, removed: removed } - Lookbook::Engine.reload_ui(changes) - Lookbook::Engine.run_hooks(:after_change, changes) + else + # Fallback for older Rails versions - don't start listeners if running in a rake task. + unless File.basename($0) == "rake" || Rake.application.top_level_tasks.any? + init_listeners end - Lookbook::Engine.register_listener(page_listener) end if config.lookbook.runtime_parsing - parser.parse + Lookbook::Engine.parser.parse else unless File.exist?(config.lookbook.parser_registry_path) Lookbook.logger.warn " Runtime parsing is disabled but no registry file has been found. Did you run `rake lookbook:preparse` before starting the app? @@ -170,12 +127,45 @@ end Lookbook::Engine.run_hooks(:after_initialize) end + def init_listeners + return unless config.lookbook.listen == true + Listen.logger = Lookbook.logger + Lookbook.logger.info "Initializing listeners" + + preview_listener = Listen.to( + *config.lookbook.listen_paths, + only: /\.(#{config.lookbook.listen_extensions.join("|")})$/, + force_polling: config.lookbook.listen_use_polling + ) do |modified, added, removed| + changes = { modified: modified, added: added, removed: removed } + begin + Lookbook::Engine.parser.parse + rescue + end + Lookbook::Preview.clear_cache + Lookbook::Engine.reload_ui(changes) + Lookbook::Engine.run_hooks(:after_change, changes) + end + Lookbook::Engine.register_listener(preview_listener) + + page_listener = Listen.to( + *config.lookbook.page_paths, + only: /\.(html.*|md.*)$/, + force_polling: config.lookbook.listen_use_polling + ) do |modified, added, removed| + changes = { modified: modified, added: added, removed: removed } + Lookbook::Engine.reload_ui(changes) + Lookbook::Engine.run_hooks(:after_change, changes) + end + Lookbook::Engine.register_listener(page_listener) + end + at_exit do - if config.lookbook.listen + if Lookbook::Engine.listeners.any? Lookbook.logger.debug "Stopping listeners" Lookbook::Engine.listeners.each { |listener| listener.stop } end Lookbook::Engine.run_hooks(:before_exit) end @@ -192,13 +182,13 @@ cable.logger = config.lookbook.cable_logger @websocket ||= if Rails.version.to_f >= 6.0 ActionCable::Server::Base.new(config: cable) else - @websocket ||= ActionCable::Server::Base.new - @websocket.config = cable - @websocket + ws = ActionCable::Server::Base.new + ws.config = cable + ws end end end def websocket_mount_path @@ -229,10 +219,10 @@ def listeners @listeners ||= [] end def run_hooks(event_name, *args) - Lookbook.config.hooks[event_name].each do |hook| + config.lookbook.hooks[event_name].each do |hook| hook.call(Lookbook, *args) end end def reload_ui(changed = {})