lib/lookbook/preview.rb in lookbook-1.0.4 vs lib/lookbook/preview.rb in lookbook-1.0.5

- old
+ new

@@ -3,13 +3,13 @@ include Utils delegate :name, :render_args, to: :@preview delegate :position, :group, :notes, :hidden?, :tags, :tag, to: :@preview_inspector - def initialize(preview) + def initialize(preview, code_object) @preview = preview - @preview_inspector = SourceInspector.new(@preview.name) + @preview_inspector = SourceInspector.new(code_object) super(preview_class_path(@preview.name)) end def id @preview_inspector&.id || generate_id(lookup_path) @@ -33,11 +33,11 @@ def examples return @examples if @examples.present? public_methods = @preview.public_instance_methods(false) public_method_objects = @preview_inspector&.methods&.select { |m| public_methods.include?(m.name) } - examples = (public_method_objects || []).map { |m| PreviewExample.new(m.name.to_s, self) } + examples = (public_method_objects || []).map { |m| PreviewExample.new(m.name.to_s, self, m) } sorted = Lookbook.config.sort_examples ? examples.sort_by(&:label) : examples @examples = [] if @preview_inspector&.groups&.any? sorted.group_by { |m| m.group }.each do |name, examples| if name.nil? @@ -107,10 +107,13 @@ end end protected + @preview_objects = nil + @previews = nil + def guess_component name.chomp("Preview").constantize rescue nil end @@ -127,90 +130,33 @@ def any? all.any? end def all - load_previews if preview_files.size > ViewComponent::Preview.descendants.size + if @previews.nil? && @preview_objects.present? + previews = @preview_objects.map do |code_object| + klass = code_object.path.constantize + new(klass, code_object) if klass.ancestors.include?(ViewComponent::Preview) + rescue => exception + Lookbook.logger.error Lookbook::Error.new(exception) + nil + end.compact - @previews = nil if cache_stale? - return @previews unless @previews.nil? - - previews = ViewComponent::Preview.descendants.map do |p| - new(p) - rescue - Rails.logger.error "[lookbook] error instantiating preview\n#{exception.full_message}" + sorted_previews = previews.compact.sort_by { |preview| [preview.position, preview.label] } + @previews = PreviewCollection.new(sorted_previews) + else + PreviewCollection.new([]) end - - if errors.any? - errors.each do |error| - Rails.logger.error "[lookbook] preview error\n#{error.full_message}\n" - end - end - - sorted_previews = previews.compact.sort_by { |preview| [preview.position, preview.label] } - @previews = PreviewCollection.new(sorted_previews) - mark_as_cached if Lookbook.config.listen == true @previews end def errors @errors ||= [] end - def clear_cache - cache_dir = File.dirname(cache_marker_path) - FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir) - File.write(cache_marker_path, Time.now.to_i) - end - - protected - - def cache_marker_path - Rails.root.join("tmp/cache/lookbook-previews") - end - - def cache_stale? - return false if !File.exist?(cache_marker_path) - cache_timestamp = File.read(cache_marker_path).to_i - if @last_cache_timestamp.nil? || cache_timestamp > @last_cache_timestamp - @last_cache_timestamp = cache_timestamp - true - else - false - end - end - - def mark_as_cached - cache_dir = File.dirname(cache_marker_path) - FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir) - File.write(cache_marker_path, Time.now) - end - - def load_previews - @errors = [] - preview_files.each do |file| - require_dependency file[:path] - rescue SyntaxError, StandardError => exception - @errors.push( - Lookbook::Error.new(exception, - title: "Preview #{exception.class}", - file_name: file[:rel_path], - file_path: file[:path]) - ) - end - end - - def preview_files - files = Array(Lookbook.config.preview_paths).map do |preview_path| - Dir["#{preview_path}/**/*preview.rb"].map do |path| - { - path: path, - base_path: preview_path, - rel_path: Pathname(path).relative_path_from(Pathname.new(preview_path)).to_s - } - end - end - files.flatten + def load!(preview_objects) + @preview_objects = preview_objects + @previews = nil end end alias_method :lookup_path, :path end