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 = {})