lookbook 1.0.0 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/app/assets/lookbook/js/app.js +1 -0
- data/app/assets/lookbook/js/lib/socket.js +9 -5
- data/app/components/lookbook/base_component.rb +10 -2
- data/app/components/lookbook/copy_button/component.rb +1 -1
- data/app/components/lookbook/dimensions_display/component.rb +1 -4
- data/app/components/lookbook/embed/component.html.erb +5 -5
- data/app/components/lookbook/embed/component.rb +2 -2
- data/app/components/lookbook/header/component.html.erb +4 -4
- data/app/components/lookbook/icon/component.html.erb +1 -1
- data/app/components/lookbook/icon/component.rb +1 -5
- data/app/components/lookbook/inspector_panel/component.rb +1 -2
- data/app/components/lookbook/nav/component.html.erb +1 -1
- data/app/components/lookbook/nav/item/component.rb +2 -2
- data/app/components/lookbook/params_editor/field/component.rb +1 -1
- data/app/components/lookbook/tabs/component.js +2 -2
- data/app/controllers/lookbook/application_controller.rb +10 -1
- data/app/controllers/lookbook/pages_controller.rb +0 -1
- data/app/controllers/lookbook/previews_controller.rb +29 -24
- data/app/helpers/lookbook/component_helper.rb +5 -0
- data/app/views/layouts/lookbook/application.html.erb +6 -36
- data/app/views/lookbook/index.html.erb +3 -3
- data/app/views/lookbook/previews/show.html.erb +3 -3
- data/config/routes.rb +2 -2
- data/lib/lookbook/component.rb +4 -0
- data/lib/lookbook/config.rb +7 -3
- data/lib/lookbook/data.rb +2 -2
- data/lib/lookbook/engine.rb +80 -75
- data/lib/lookbook/page.rb +4 -4
- data/lib/lookbook/parser.rb +19 -11
- data/lib/lookbook/preview.rb +28 -78
- data/lib/lookbook/preview_controller.rb +19 -1
- data/lib/lookbook/preview_example.rb +12 -5
- data/lib/lookbook/source_inspector.rb +2 -2
- data/lib/lookbook/store.rb +2 -2
- data/lib/lookbook/version.rb +1 -1
- data/lib/tasks/lookbook_tasks.rake +1 -2
- data/public/lookbook-assets/css/lookbook.css +8 -34
- data/public/lookbook-assets/css/lookbook.css.map +1 -1
- data/public/lookbook-assets/js/lookbook.js +175 -121
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +2 -2
data/lib/lookbook/config.rb
CHANGED
@@ -5,7 +5,7 @@ require "lookbook/store"
|
|
5
5
|
module Lookbook
|
6
6
|
class Config
|
7
7
|
def initialize
|
8
|
-
@options = Store.new
|
8
|
+
@options = Store.new({}, true)
|
9
9
|
|
10
10
|
@options.set({
|
11
11
|
project_name: "Lookbook",
|
@@ -24,6 +24,7 @@ module Lookbook
|
|
24
24
|
preview_display_params: {},
|
25
25
|
preview_srcdoc: nil,
|
26
26
|
preview_tags: {},
|
27
|
+
preview_disable_action_view_annotations: true,
|
27
28
|
sort_examples: false,
|
28
29
|
|
29
30
|
listen: Rails.env.development?,
|
@@ -31,10 +32,9 @@ module Lookbook
|
|
31
32
|
listen_extensions: ["rb", "html.*"],
|
32
33
|
listen_use_polling: false,
|
33
34
|
|
34
|
-
cable_mount_path: "/
|
35
|
+
cable_mount_path: "/cable",
|
35
36
|
cable_logger: Lookbook.logger,
|
36
37
|
|
37
|
-
runtime_parsing: !Rails.env.production?,
|
38
38
|
parser_registry_path: "tmp/storage/.yardoc",
|
39
39
|
|
40
40
|
ui_theme: "indigo",
|
@@ -104,6 +104,10 @@ module Lookbook
|
|
104
104
|
})
|
105
105
|
end
|
106
106
|
|
107
|
+
def runtime_parsing=(value)
|
108
|
+
Lookbook.logger.warn "The `runtime_parsing` config option has been deprecated and will be removed in v2.0"
|
109
|
+
end
|
110
|
+
|
107
111
|
def project_name
|
108
112
|
@options.project_name == false ? nil : @options.project_name
|
109
113
|
end
|
data/lib/lookbook/data.rb
CHANGED
data/lib/lookbook/engine.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require "view_component"
|
2
2
|
require "action_cable/engine"
|
3
3
|
require "listen"
|
4
|
-
require "rake"
|
5
4
|
|
6
5
|
module Lookbook
|
7
6
|
autoload :Config, "lookbook/config"
|
@@ -36,7 +35,7 @@ module Lookbook
|
|
36
35
|
{
|
37
36
|
version: version,
|
38
37
|
env: Rails.env.to_s,
|
39
|
-
config: config
|
38
|
+
config: config.to_h
|
40
39
|
}
|
41
40
|
end
|
42
41
|
|
@@ -44,18 +43,10 @@ module Lookbook
|
|
44
43
|
Preview.all
|
45
44
|
end
|
46
45
|
|
47
|
-
def previews?
|
48
|
-
Preview.any?
|
49
|
-
end
|
50
|
-
|
51
46
|
def pages
|
52
47
|
Page.all
|
53
48
|
end
|
54
49
|
|
55
|
-
def pages?
|
56
|
-
Page.any?
|
57
|
-
end
|
58
|
-
|
59
50
|
def broadcast(event_name, data = {})
|
60
51
|
Engine.websocket&.broadcast(event_name.to_s, data)
|
61
52
|
end
|
@@ -100,6 +91,11 @@ module Lookbook
|
|
100
91
|
@preview_controller = Lookbook.config.preview_controller.constantize
|
101
92
|
@preview_controller.include(Lookbook::PreviewController)
|
102
93
|
|
94
|
+
parser.after_parse do |registry|
|
95
|
+
Preview.load!(registry.all(:class))
|
96
|
+
reload_ui
|
97
|
+
end
|
98
|
+
|
103
99
|
if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1.3.1")
|
104
100
|
# Rails.application.server is only available for newer Rails versions
|
105
101
|
Rails.application.server do
|
@@ -107,89 +103,82 @@ module Lookbook
|
|
107
103
|
end
|
108
104
|
else
|
109
105
|
# Fallback for older Rails versions - don't start listeners if running in a rake task.
|
110
|
-
unless
|
106
|
+
unless Lookbook::Engine.prevent_listening?
|
111
107
|
init_listeners
|
112
108
|
end
|
113
109
|
end
|
114
110
|
|
115
|
-
|
116
|
-
Lookbook::Engine.
|
117
|
-
else
|
118
|
-
unless File.exist?(config.lookbook.parser_registry_path)
|
119
|
-
Lookbook.logger.warn "
|
120
|
-
Runtime parsing is disabled but no registry file has been found.
|
121
|
-
Did you run `rake lookbook:preparse` before starting the app?
|
122
|
-
Expected to find registry file at #{config.lookbook.parser_registry_path}
|
123
|
-
"
|
124
|
-
end
|
111
|
+
parser.parse do
|
112
|
+
Lookbook::Engine.run_hooks(:after_initialize)
|
125
113
|
end
|
126
|
-
|
127
|
-
Lookbook::Engine.run_hooks(:after_initialize)
|
128
|
-
end
|
129
|
-
|
130
|
-
def init_listeners
|
131
|
-
return unless config.lookbook.listen == true
|
132
|
-
Listen.logger = Lookbook.logger
|
133
|
-
Lookbook.logger.info "Initializing listeners"
|
134
|
-
|
135
|
-
preview_listener = Listen.to(
|
136
|
-
*config.lookbook.listen_paths,
|
137
|
-
only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
|
138
|
-
force_polling: config.lookbook.listen_use_polling
|
139
|
-
) do |modified, added, removed|
|
140
|
-
changes = {modified: modified, added: added, removed: removed}
|
141
|
-
begin
|
142
|
-
Lookbook::Engine.parser.parse
|
143
|
-
rescue
|
144
|
-
end
|
145
|
-
Lookbook::Preview.clear_cache
|
146
|
-
Lookbook::Engine.reload_ui(changes)
|
147
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
148
|
-
end
|
149
|
-
Lookbook::Engine.register_listener(preview_listener)
|
150
|
-
|
151
|
-
page_listener = Listen.to(
|
152
|
-
*config.lookbook.page_paths,
|
153
|
-
only: /\.(html.*|md.*)$/,
|
154
|
-
force_polling: config.lookbook.listen_use_polling
|
155
|
-
) do |modified, added, removed|
|
156
|
-
changes = {modified: modified, added: added, removed: removed}
|
157
|
-
Lookbook::Engine.reload_ui(changes)
|
158
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
159
|
-
end
|
160
|
-
Lookbook::Engine.register_listener(page_listener)
|
161
114
|
end
|
162
115
|
|
163
116
|
at_exit do
|
164
117
|
if Lookbook::Engine.listeners.any?
|
165
118
|
Lookbook.logger.debug "Stopping listeners"
|
166
|
-
Lookbook::Engine.
|
119
|
+
Lookbook::Engine.stop_listeners
|
167
120
|
end
|
168
121
|
Lookbook::Engine.run_hooks(:before_exit)
|
169
122
|
end
|
170
123
|
|
171
124
|
class << self
|
125
|
+
def init_listeners
|
126
|
+
config = Lookbook.config
|
127
|
+
return unless config.listen == true
|
128
|
+
Listen.logger = Lookbook.logger
|
129
|
+
|
130
|
+
listen_paths = config.listen_paths.uniq
|
131
|
+
if listen_paths.any?
|
132
|
+
preview_listener = Listen.to(*listen_paths,
|
133
|
+
only: /\.(#{config.listen_extensions.join("|")})$/,
|
134
|
+
force_polling: config.listen_use_polling) do |modified, added, removed|
|
135
|
+
parser.parse do
|
136
|
+
run_hooks(:after_change, {modified: modified, added: added, removed: removed})
|
137
|
+
end
|
138
|
+
end
|
139
|
+
register_listener(preview_listener)
|
140
|
+
end
|
141
|
+
|
142
|
+
page_paths = config.page_paths.uniq
|
143
|
+
if page_paths.any?
|
144
|
+
page_listener = Listen.to(*page_paths,
|
145
|
+
only: /\.(html.*|md.*)$/,
|
146
|
+
force_polling: config.listen_use_polling) do |modified, added, removed|
|
147
|
+
changes = {modified: modified, added: added, removed: removed}
|
148
|
+
reload_ui
|
149
|
+
run_hooks(:after_change, changes)
|
150
|
+
end
|
151
|
+
register_listener(page_listener)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
172
155
|
def websocket
|
156
|
+
config = Lookbook.config
|
173
157
|
return @websocket unless @websocket.nil?
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
158
|
+
return unless config.auto_refresh == true && config.listen == true && !Rails.env.test?
|
159
|
+
Lookbook.logger.info "Initializing websocket"
|
160
|
+
|
161
|
+
cable = ActionCable::Server::Configuration.new
|
162
|
+
cable.cable = {adapter: "async"}.with_indifferent_access
|
163
|
+
cable.mount_path = nil
|
164
|
+
cable.connection_class = -> { Lookbook::Connection }
|
165
|
+
cable.logger = config.cable_logger
|
166
|
+
|
167
|
+
@websocket ||= if Gem::Version.new(Rails.version) >= Gem::Version.new(6.0)
|
168
|
+
ActionCable::Server::Base.new(config: cable)
|
169
|
+
else
|
170
|
+
ws = ActionCable::Server::Base.new
|
171
|
+
ws.config = cable
|
172
|
+
ws
|
188
173
|
end
|
189
174
|
end
|
190
175
|
|
191
176
|
def websocket_mount_path
|
192
|
-
"#{mounted_path}#{config.lookbook.cable_mount_path}" if websocket
|
177
|
+
"#{mounted_path}#{config.lookbook.cable_mount_path}".gsub("//", "/") if websocket?
|
178
|
+
end
|
179
|
+
|
180
|
+
def websocket?
|
181
|
+
websocket.present?
|
193
182
|
end
|
194
183
|
|
195
184
|
def mounted_path
|
@@ -197,7 +186,7 @@ module Lookbook
|
|
197
186
|
end
|
198
187
|
|
199
188
|
def parser
|
200
|
-
@parser ||= Lookbook::Parser.new(config.lookbook.preview_paths
|
189
|
+
@parser ||= Lookbook::Parser.new(config.lookbook.preview_paths)
|
201
190
|
end
|
202
191
|
|
203
192
|
def log_level
|
@@ -222,14 +211,30 @@ module Lookbook
|
|
222
211
|
@listeners ||= []
|
223
212
|
end
|
224
213
|
|
214
|
+
def stop_listeners
|
215
|
+
listeners.each { |listener| listener.stop }
|
216
|
+
end
|
217
|
+
|
225
218
|
def run_hooks(event_name, *args)
|
226
219
|
config.lookbook.hooks[event_name].each do |hook|
|
227
220
|
hook.call(Lookbook, *args)
|
228
221
|
end
|
229
222
|
end
|
230
223
|
|
231
|
-
def reload_ui
|
232
|
-
websocket&.broadcast("reload",
|
224
|
+
def reload_ui
|
225
|
+
websocket&.broadcast("reload", {})
|
226
|
+
end
|
227
|
+
|
228
|
+
def prevent_listening?
|
229
|
+
Rails.env.test? || running_in_rake_task?
|
230
|
+
end
|
231
|
+
|
232
|
+
def running_in_rake_task?
|
233
|
+
if defined?(Rake) && Rake.respond_to?(:application)
|
234
|
+
File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
|
235
|
+
else
|
236
|
+
false
|
237
|
+
end
|
233
238
|
end
|
234
239
|
|
235
240
|
attr_reader :preview_controller
|
data/lib/lookbook/page.rb
CHANGED
@@ -13,7 +13,7 @@ module Lookbook
|
|
13
13
|
:data
|
14
14
|
]
|
15
15
|
|
16
|
-
attr_reader :errors
|
16
|
+
attr_reader :errors, :rel_path
|
17
17
|
attr_accessor :sections
|
18
18
|
|
19
19
|
def initialize(path, base_path)
|
@@ -23,8 +23,8 @@ module Lookbook
|
|
23
23
|
@errors = []
|
24
24
|
@sections = []
|
25
25
|
@page_name = remove_position_prefix(path_name)
|
26
|
-
rel_path = @pathname.relative_path_from(@base_path)
|
27
|
-
page_path = rel_path.dirname.to_s == "." ? @page_name : "#{rel_path.dirname}/#{@page_name}"
|
26
|
+
@rel_path = @pathname.relative_path_from(@base_path)
|
27
|
+
page_path = @rel_path.dirname.to_s == "." ? @page_name : "#{@rel_path.dirname}/#{@page_name}"
|
28
28
|
super(page_path)
|
29
29
|
end
|
30
30
|
|
@@ -33,7 +33,7 @@ module Lookbook
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def full_path
|
36
|
-
Rails.root.join(@pathname.to_s)
|
36
|
+
Pathname.new Rails.root.join(@pathname.to_s)
|
37
37
|
end
|
38
38
|
|
39
39
|
def name
|
data/lib/lookbook/parser.rb
CHANGED
@@ -3,24 +3,32 @@ require "yard"
|
|
3
3
|
module Lookbook
|
4
4
|
class Parser
|
5
5
|
attr_reader :registry_path
|
6
|
-
def initialize(paths
|
6
|
+
def initialize(paths)
|
7
7
|
@paths = paths.map { |p| "#{p}/**/*preview.rb" }
|
8
|
-
@
|
9
|
-
|
8
|
+
@after_parse_callbacks = []
|
9
|
+
@after_parse_once_callbacks = []
|
10
|
+
@parsing = false
|
11
|
+
|
12
|
+
YARD::Parser::SourceParser.after_parse_list do
|
13
|
+
[*@after_parse_callbacks, *@after_parse_once_callbacks].each do |callback|
|
14
|
+
callback.call(YARD::Registry)
|
15
|
+
end
|
16
|
+
@after_parse_once_callbacks = []
|
17
|
+
@parsing = false
|
18
|
+
end
|
10
19
|
end
|
11
20
|
|
12
|
-
def parse
|
13
|
-
|
14
|
-
|
21
|
+
def parse(&block)
|
22
|
+
unless @parsing
|
23
|
+
@parsing = true
|
24
|
+
@after_parse_once_callbacks << block if block
|
25
|
+
YARD::Registry.clear
|
15
26
|
YARD.parse(@paths)
|
16
|
-
YARD::Registry.save(false, registry_path)
|
17
27
|
end
|
18
28
|
end
|
19
29
|
|
20
|
-
def
|
21
|
-
|
22
|
-
registry.load!(registry_path)
|
23
|
-
registry.get(path)
|
30
|
+
def after_parse(&block)
|
31
|
+
@after_parse_callbacks << block
|
24
32
|
end
|
25
33
|
|
26
34
|
class << self
|
data/lib/lookbook/preview.rb
CHANGED
@@ -5,9 +5,9 @@ module Lookbook
|
|
5
5
|
delegate :name, :render_args, to: :@preview
|
6
6
|
delegate :position, :group, :notes, :hidden?, :tags, :tag, to: :@preview_inspector
|
7
7
|
|
8
|
-
def initialize(preview)
|
8
|
+
def initialize(preview, code_object)
|
9
9
|
@preview = preview
|
10
|
-
@preview_inspector = SourceInspector.new(
|
10
|
+
@preview_inspector = SourceInspector.new(code_object)
|
11
11
|
super(preview_class_path(@preview.name))
|
12
12
|
end
|
13
13
|
|
@@ -35,7 +35,7 @@ module Lookbook
|
|
35
35
|
return @examples if @examples.present?
|
36
36
|
public_methods = @preview.public_instance_methods(false)
|
37
37
|
public_method_objects = @preview_inspector&.methods&.select { |m| public_methods.include?(m.name) }
|
38
|
-
examples = (public_method_objects || []).map { |m| PreviewExample.new(m.name.to_s, self) }
|
38
|
+
examples = (public_method_objects || []).map { |m| PreviewExample.new(m.name.to_s, self, m) }
|
39
39
|
sorted = Lookbook.config.sort_examples ? examples.sort_by(&:label) : examples
|
40
40
|
@examples = []
|
41
41
|
if @preview_inspector&.groups&.any?
|
@@ -61,11 +61,15 @@ module Lookbook
|
|
61
61
|
examples.first
|
62
62
|
end
|
63
63
|
|
64
|
+
def rel_path
|
65
|
+
"#{name.underscore}.rb"
|
66
|
+
end
|
67
|
+
|
64
68
|
def full_path
|
65
69
|
base_path = Array(Lookbook.config.preview_paths).detect do |preview_path|
|
66
|
-
Dir["#{preview_path}/#{
|
70
|
+
Dir["#{preview_path}/#{rel_path}"].first
|
67
71
|
end
|
68
|
-
Pathname.new(Dir["#{base_path}/#{
|
72
|
+
Pathname.new(Dir["#{base_path}/#{rel_path}"].first)
|
69
73
|
end
|
70
74
|
|
71
75
|
def url_path
|
@@ -105,6 +109,9 @@ module Lookbook
|
|
105
109
|
|
106
110
|
protected
|
107
111
|
|
112
|
+
@preview_objects = nil
|
113
|
+
@previews = nil
|
114
|
+
|
108
115
|
def guess_component
|
109
116
|
name.chomp("Preview").constantize
|
110
117
|
rescue
|
@@ -125,26 +132,20 @@ module Lookbook
|
|
125
132
|
end
|
126
133
|
|
127
134
|
def all
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
Rails.logger.error "[lookbook] preview error\n#{error.full_message}\n"
|
142
|
-
end
|
135
|
+
if @previews.nil? && @preview_objects.present?
|
136
|
+
previews = @preview_objects.map do |code_object|
|
137
|
+
klass = code_object.path.constantize
|
138
|
+
new(klass, code_object) if klass.ancestors.include?(ViewComponent::Preview)
|
139
|
+
rescue => exception
|
140
|
+
Lookbook.logger.error Lookbook::Error.new(exception)
|
141
|
+
nil
|
142
|
+
end.compact
|
143
|
+
|
144
|
+
sorted_previews = previews.compact.sort_by { |preview| [preview.position, preview.label] }
|
145
|
+
@previews = PreviewCollection.new(sorted_previews)
|
146
|
+
else
|
147
|
+
PreviewCollection.new([])
|
143
148
|
end
|
144
|
-
|
145
|
-
sorted_previews = previews.compact.sort_by { |preview| [preview.position, preview.label] }
|
146
|
-
@previews = PreviewCollection.new(sorted_previews)
|
147
|
-
mark_as_cached if Lookbook.config.listen == true
|
148
149
|
@previews
|
149
150
|
end
|
150
151
|
|
@@ -152,60 +153,9 @@ module Lookbook
|
|
152
153
|
@errors ||= []
|
153
154
|
end
|
154
155
|
|
155
|
-
def
|
156
|
-
|
157
|
-
|
158
|
-
File.write(cache_marker_path, Time.now.to_i)
|
159
|
-
end
|
160
|
-
|
161
|
-
protected
|
162
|
-
|
163
|
-
def cache_marker_path
|
164
|
-
Rails.root.join("tmp/cache/lookbook-previews")
|
165
|
-
end
|
166
|
-
|
167
|
-
def cache_stale?
|
168
|
-
return false if !File.exist?(cache_marker_path)
|
169
|
-
cache_timestamp = File.read(cache_marker_path).to_i
|
170
|
-
if @last_cache_timestamp.nil? || cache_timestamp > @last_cache_timestamp
|
171
|
-
@last_cache_timestamp = cache_timestamp
|
172
|
-
true
|
173
|
-
else
|
174
|
-
false
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
def mark_as_cached
|
179
|
-
cache_dir = File.dirname(cache_marker_path)
|
180
|
-
FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir)
|
181
|
-
File.write(cache_marker_path, Time.now)
|
182
|
-
end
|
183
|
-
|
184
|
-
def load_previews
|
185
|
-
@errors = []
|
186
|
-
preview_files.each do |file|
|
187
|
-
require_dependency file[:path]
|
188
|
-
rescue SyntaxError, StandardError => exception
|
189
|
-
@errors.push(
|
190
|
-
Lookbook::Error.new(exception,
|
191
|
-
title: "Preview #{exception.class}",
|
192
|
-
file_name: file[:rel_path],
|
193
|
-
file_path: file[:path])
|
194
|
-
)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def preview_files
|
199
|
-
files = Array(Lookbook.config.preview_paths).map do |preview_path|
|
200
|
-
Dir["#{preview_path}/**/*preview.rb"].map do |path|
|
201
|
-
{
|
202
|
-
path: path,
|
203
|
-
base_path: preview_path,
|
204
|
-
rel_path: Pathname(path).relative_path_from(Pathname.new(preview_path)).to_s
|
205
|
-
}
|
206
|
-
end
|
207
|
-
end
|
208
|
-
files.flatten
|
156
|
+
def load!(preview_objects)
|
157
|
+
@preview_objects = preview_objects
|
158
|
+
@previews = nil
|
209
159
|
end
|
210
160
|
end
|
211
161
|
|
@@ -11,7 +11,10 @@ module Lookbook
|
|
11
11
|
opts = {}
|
12
12
|
opts[:layout] = nil
|
13
13
|
opts[:locals] = locals if locals.present?
|
14
|
-
|
14
|
+
|
15
|
+
with_optional_annotations do
|
16
|
+
render html: render_to_string(template, **opts)
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
20
|
def render_in_layout_to_string(template, locals, opts = {})
|
@@ -22,5 +25,20 @@ module Lookbook
|
|
22
25
|
end
|
23
26
|
render html: html
|
24
27
|
end
|
28
|
+
|
29
|
+
def with_optional_annotations
|
30
|
+
if ActionView::Base.respond_to?(:annotate_rendered_view_with_filenames) && Lookbook.config.preview_disable_action_view_annotations
|
31
|
+
original_value = ActionView::Base.annotate_rendered_view_with_filenames
|
32
|
+
ActionView::Base.annotate_rendered_view_with_filenames = false
|
33
|
+
|
34
|
+
res = yield
|
35
|
+
|
36
|
+
ActionView::Base.annotate_rendered_view_with_filenames = original_value
|
37
|
+
|
38
|
+
res
|
39
|
+
else
|
40
|
+
yield
|
41
|
+
end
|
42
|
+
end
|
25
43
|
end
|
26
44
|
end
|
@@ -3,10 +3,10 @@ module Lookbook
|
|
3
3
|
attr_reader :name, :preview
|
4
4
|
delegate :params, :position, :group, :notes, :hidden?, :source, :tags, :tag, to: :@example_inspector
|
5
5
|
|
6
|
-
def initialize(name, preview)
|
6
|
+
def initialize(name, preview, code_object)
|
7
7
|
@name = name
|
8
8
|
@preview = preview
|
9
|
-
@example_inspector = SourceInspector.new(
|
9
|
+
@example_inspector = SourceInspector.new(code_object)
|
10
10
|
super("#{@preview.path}/#{name}")
|
11
11
|
end
|
12
12
|
|
@@ -27,7 +27,7 @@ module Lookbook
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def method_source
|
30
|
-
@example_inspector.source.split("\n")[
|
30
|
+
@example_inspector.source.sub(/^def \w+\s?(\([^)]+\))?/m, "").split("\n")[0..-2].join("\n").strip_heredoc.strip
|
31
31
|
end
|
32
32
|
|
33
33
|
def lang
|
@@ -35,7 +35,8 @@ module Lookbook
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def template_source(template_path)
|
38
|
-
|
38
|
+
source_path = full_template_path(template_path)
|
39
|
+
source_path ? File.read(source_path) : nil
|
39
40
|
end
|
40
41
|
|
41
42
|
def template_lang(template_path)
|
@@ -56,11 +57,17 @@ module Lookbook
|
|
56
57
|
|
57
58
|
protected
|
58
59
|
|
60
|
+
def strip_ext(path)
|
61
|
+
path.sub(/\..*$/, "")
|
62
|
+
end
|
63
|
+
|
59
64
|
def full_template_path(template_path)
|
65
|
+
template_path = strip_ext template_path
|
60
66
|
base_path = Array(Lookbook.config.preview_paths).detect do |p|
|
61
67
|
Dir["#{p}/#{template_path}.html.*"].first
|
62
68
|
end
|
63
|
-
|
69
|
+
path = Dir["#{base_path}/#{template_path}.html.*"].first
|
70
|
+
path ? Pathname.new(path) : nil
|
64
71
|
end
|
65
72
|
|
66
73
|
class << self
|
@@ -5,8 +5,8 @@ module Lookbook
|
|
5
5
|
attr_reader :code_object
|
6
6
|
delegate :groups, :source, to: :@code_object, allow_nil: true
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@code_object =
|
8
|
+
def initialize(code_object)
|
9
|
+
@code_object = code_object
|
10
10
|
end
|
11
11
|
|
12
12
|
def hidden?
|
data/lib/lookbook/store.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class Store < ActiveSupport::OrderedOptions
|
3
|
-
def initialize(data = {}, deep =
|
3
|
+
def initialize(data = {}, deep = false)
|
4
4
|
super()
|
5
5
|
@deep = deep
|
6
6
|
set(data) if data.present?
|
@@ -42,7 +42,7 @@ module Lookbook
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def normalize_value(value)
|
45
|
-
@deep && value.is_a?(Hash) ? Store.new(value) : value
|
45
|
+
@deep && !value.is_a?(Store) && value.is_a?(Hash) ? Store.new(value, @deep) : value
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/lib/lookbook/version.rb
CHANGED
@@ -4,8 +4,7 @@ namespace :lookbook do
|
|
4
4
|
namespace :previews do
|
5
5
|
desc "Preparse the previews"
|
6
6
|
task preparse: :environment do
|
7
|
-
|
8
|
-
puts "Lookbook preview parsing complete"
|
7
|
+
puts "The lookbook:preparse task is no longer required and will be removed in v2.0"
|
9
8
|
end
|
10
9
|
end
|
11
10
|
end
|