lookbook 1.0.0.beta.6 → 1.0.0.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +38 -30
- data/app/assets/lookbook/css/themes/blue.css +2 -1
- data/app/assets/lookbook/css/themes/indigo.css +2 -1
- data/app/assets/lookbook/css/themes/zinc.css +2 -1
- data/app/components/lookbook/base_component.rb +0 -1
- data/app/components/lookbook/inspector_panel/component.css +5 -0
- data/app/components/lookbook/inspector_panel/component.html.erb +6 -4
- data/app/components/lookbook/inspector_panel/component.rb +3 -3
- data/app/components/lookbook/nav/component.rb +1 -2
- data/app/components/lookbook/nav/item/component.html.erb +1 -1
- data/app/components/lookbook/params_editor/field/component.rb +2 -1
- data/app/components/lookbook/tab_panels/component.rb +1 -1
- data/app/components/lookbook/tab_panels/panel/component.rb +2 -2
- data/app/components/lookbook/tag_component.rb +3 -3
- data/app/controllers/lookbook/application_controller.rb +1 -1
- data/app/controllers/lookbook/page_controller.rb +6 -1
- data/app/controllers/lookbook/previews_controller.rb +8 -16
- data/app/helpers/lookbook/application_helper.rb +9 -0
- data/app/helpers/lookbook/preview_helper.rb +7 -2
- data/app/views/layouts/lookbook/skeleton.html.erb +15 -8
- data/app/views/lookbook/index.html.erb +11 -24
- data/app/views/lookbook/previews/panels/_notes.html.erb +1 -1
- data/app/views/lookbook/previews/show.html.erb +2 -2
- data/lib/lookbook/code_formatter.rb +1 -1
- data/lib/lookbook/collection.rb +8 -3
- data/lib/lookbook/component.rb +2 -3
- data/lib/lookbook/config.rb +15 -10
- data/lib/lookbook/data.rb +11 -0
- data/lib/lookbook/engine.rb +70 -77
- data/lib/lookbook/entity.rb +1 -1
- data/lib/lookbook/hooks.rb +21 -0
- data/lib/lookbook/markdown.rb +1 -1
- data/lib/lookbook/page.rb +4 -5
- data/lib/lookbook/page_section.rb +2 -4
- data/lib/lookbook/panels.rb +15 -0
- data/lib/lookbook/parser.rb +4 -1
- data/lib/lookbook/preview.rb +10 -12
- data/lib/lookbook/preview_example.rb +2 -2
- data/lib/lookbook/preview_group.rb +8 -0
- data/lib/lookbook/source_inspector.rb +23 -11
- data/lib/lookbook/store.rb +7 -3
- data/lib/lookbook/tag.rb +112 -0
- data/lib/lookbook/tags.rb +22 -0
- data/lib/lookbook/theme.rb +38 -9
- data/lib/lookbook/version.rb +1 -1
- data/lib/lookbook.rb +1 -0
- data/lib/tasks/lookbook_tasks.rake +1 -2
- data/public/lookbook-assets/css/lookbook.css +19 -10
- data/public/lookbook-assets/css/lookbook.css.map +1 -1
- data/public/lookbook-assets/css/themes/blue.css +1 -0
- data/public/lookbook-assets/css/themes/blue.css.map +1 -1
- data/public/lookbook-assets/css/themes/indigo.css +1 -0
- data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
- data/public/lookbook-assets/css/themes/zinc.css +1 -0
- data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
- data/public/lookbook-assets/js/lookbook.js +48 -48
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +8 -2
data/lib/lookbook/config.rb
CHANGED
@@ -6,14 +6,14 @@ module Lookbook
|
|
6
6
|
class Config
|
7
7
|
def initialize
|
8
8
|
@options = Store.new
|
9
|
-
|
9
|
+
|
10
10
|
@options.set({
|
11
11
|
project_name: "Lookbook",
|
12
12
|
log_level: 2,
|
13
13
|
auto_refresh: true,
|
14
14
|
|
15
15
|
components_path: "app/components",
|
16
|
-
|
16
|
+
|
17
17
|
page_controller: "Lookbook::PageController",
|
18
18
|
page_route: "pages",
|
19
19
|
page_paths: ["test/components/docs"],
|
@@ -23,6 +23,7 @@ module Lookbook
|
|
23
23
|
preview_paths: [],
|
24
24
|
preview_display_params: {},
|
25
25
|
preview_srcdoc: nil,
|
26
|
+
preview_tags: {},
|
26
27
|
sort_examples: false,
|
27
28
|
|
28
29
|
listen: Rails.env.development?,
|
@@ -38,11 +39,12 @@ module Lookbook
|
|
38
39
|
|
39
40
|
ui_theme: "indigo",
|
40
41
|
ui_theme_overrides: {},
|
42
|
+
ui_favicon: true,
|
41
43
|
|
42
44
|
hooks: {
|
43
45
|
after_initialize: [],
|
44
46
|
before_exit: [],
|
45
|
-
after_change: []
|
47
|
+
after_change: []
|
46
48
|
},
|
47
49
|
|
48
50
|
debug_menu: Rails.env.development?,
|
@@ -98,7 +100,7 @@ module Lookbook
|
|
98
100
|
padded: false,
|
99
101
|
system: true
|
100
102
|
}
|
101
|
-
}
|
103
|
+
}
|
102
104
|
})
|
103
105
|
end
|
104
106
|
|
@@ -145,7 +147,7 @@ module Lookbook
|
|
145
147
|
|
146
148
|
def inspector_panels(&block)
|
147
149
|
panels = Store.new(@options.inspector_panels.select { |key, panel| panel != false })
|
148
|
-
if
|
150
|
+
if block
|
149
151
|
yield panels
|
150
152
|
else
|
151
153
|
panels
|
@@ -156,7 +158,7 @@ module Lookbook
|
|
156
158
|
pane = opts[:pane].presence || :drawer
|
157
159
|
siblings = inspector_panels.select { |key, panel| panel.pane == pane }
|
158
160
|
opts[:position] ||= siblings.size + 1
|
159
|
-
@options.inspector_panels[name] = opts
|
161
|
+
@options.inspector_panels[name] = opts
|
160
162
|
siblings.each do |key, panel|
|
161
163
|
if panel.position >= opts[:position]
|
162
164
|
panel.position += 1
|
@@ -190,7 +192,6 @@ module Lookbook
|
|
190
192
|
copy: nil,
|
191
193
|
panel_classes: nil,
|
192
194
|
locals: {},
|
193
|
-
padded: true,
|
194
195
|
system: false
|
195
196
|
}
|
196
197
|
end
|
@@ -205,7 +206,7 @@ module Lookbook
|
|
205
206
|
end
|
206
207
|
|
207
208
|
def ui_theme_overrides(&block)
|
208
|
-
if
|
209
|
+
if block
|
209
210
|
yield @options.ui_theme_overrides
|
210
211
|
else
|
211
212
|
@options.ui_theme_overrides
|
@@ -236,7 +237,7 @@ module Lookbook
|
|
236
237
|
def to_json(*a)
|
237
238
|
to_h.to_json(*a)
|
238
239
|
end
|
239
|
-
|
240
|
+
|
240
241
|
protected
|
241
242
|
|
242
243
|
def normalize_paths(paths)
|
@@ -254,5 +255,9 @@ module Lookbook
|
|
254
255
|
def method_missing(name, *args)
|
255
256
|
@options.send(name, *args)
|
256
257
|
end
|
258
|
+
|
259
|
+
def respond_to_missing?(name, *)
|
260
|
+
to_h.key? name
|
261
|
+
end
|
257
262
|
end
|
258
|
-
end
|
263
|
+
end
|
data/lib/lookbook/engine.rb
CHANGED
@@ -2,12 +2,21 @@ require "rails"
|
|
2
2
|
require "view_component"
|
3
3
|
require "action_cable/engine"
|
4
4
|
require "listen"
|
5
|
+
require "rake"
|
5
6
|
|
6
7
|
module Lookbook
|
7
|
-
|
8
8
|
autoload :Config, "lookbook/config"
|
9
|
-
|
9
|
+
autoload :Data, "lookbook/data"
|
10
|
+
autoload :Hooks, "lookbook/hooks"
|
11
|
+
autoload :Panels, "lookbook/panels"
|
12
|
+
autoload :Tags, "lookbook/tags"
|
13
|
+
|
10
14
|
class << self
|
15
|
+
include Lookbook::Data
|
16
|
+
include Lookbook::Hooks
|
17
|
+
include Lookbook::Panels
|
18
|
+
include Lookbook::Tags
|
19
|
+
|
11
20
|
def version
|
12
21
|
Lookbook::VERSION
|
13
22
|
end
|
@@ -48,46 +57,12 @@ module Lookbook
|
|
48
57
|
Page.any?
|
49
58
|
end
|
50
59
|
|
51
|
-
def data
|
52
|
-
@data ||= Store.new
|
53
|
-
end
|
54
|
-
|
55
|
-
def data=(props)
|
56
|
-
@data = Store.new(props)
|
57
|
-
end
|
58
|
-
|
59
|
-
def after_initialize(&block)
|
60
|
-
add_hook(:after_initialize, block)
|
61
|
-
end
|
62
|
-
|
63
|
-
def before_exit(&block)
|
64
|
-
add_hook(:before_exit, block)
|
65
|
-
end
|
66
|
-
|
67
|
-
def after_change(&block)
|
68
|
-
add_hook(:after_change, block)
|
69
|
-
end
|
70
|
-
|
71
|
-
def define_panel(name, opts = {})
|
72
|
-
config.define_inspector_panel(name, opts)
|
73
|
-
end
|
74
|
-
|
75
|
-
def amend_panel(name, opts = {})
|
76
|
-
config.amend_inspector_panel(name, opts)
|
77
|
-
end
|
78
|
-
|
79
|
-
def remove_panel(name)
|
80
|
-
config.remove_inspector_panel(name)
|
81
|
-
end
|
82
|
-
|
83
60
|
def broadcast(event_name, data = {})
|
84
61
|
Engine.websocket&.broadcast(event_name.to_s, data)
|
85
62
|
end
|
86
63
|
|
87
|
-
|
88
|
-
|
89
|
-
def add_hook(event_name, block)
|
90
|
-
config.hooks[event_name] << block
|
64
|
+
def theme
|
65
|
+
@theme ||= Lookbook::Theme.new(config.ui_theme, config.ui_theme_overrides)
|
91
66
|
end
|
92
67
|
end
|
93
68
|
|
@@ -97,14 +72,14 @@ module Lookbook
|
|
97
72
|
config.lookbook = Lookbook.config
|
98
73
|
config.autoload_paths << File.expand_path(Lookbook::Engine.root.join("app/components"))
|
99
74
|
|
100
|
-
initializer "lookbook.viewcomponent.config" do
|
75
|
+
initializer "lookbook.viewcomponent.config" do
|
101
76
|
config.lookbook.preview_paths += config.view_component.preview_paths
|
102
77
|
config.lookbook.preview_controller ||= config.view_component.preview_controller
|
103
78
|
|
104
79
|
config.lookbook.components_path = config.view_component.view_component_path if config.view_component.view_component_path.present?
|
105
80
|
|
106
81
|
config.lookbook.listen_paths += config.lookbook.preview_paths
|
107
|
-
config.lookbook.listen_paths << config.lookbook.components_path
|
82
|
+
config.lookbook.listen_paths << config.lookbook.components_path
|
108
83
|
end
|
109
84
|
|
110
85
|
initializer "lookbook.logging.development" do
|
@@ -112,7 +87,7 @@ module Lookbook
|
|
112
87
|
end
|
113
88
|
|
114
89
|
initializer "lookbook.parser.tags" do
|
115
|
-
Lookbook::Parser.define_tags
|
90
|
+
Lookbook::Parser.define_tags(Lookbook.config.preview_tags)
|
116
91
|
end
|
117
92
|
|
118
93
|
initializer "lookbook.assets.serve" do
|
@@ -126,39 +101,20 @@ module Lookbook
|
|
126
101
|
@preview_controller = Lookbook.config.preview_controller.constantize
|
127
102
|
@preview_controller.include(Lookbook::PreviewController)
|
128
103
|
|
129
|
-
if
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
*config.lookbook.listen_paths,
|
134
|
-
only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
|
135
|
-
force_polling: config.lookbook.listen_use_polling
|
136
|
-
) do |modified, added, removed|
|
137
|
-
changes = { modified: modified, added: added, removed: removed }
|
138
|
-
begin
|
139
|
-
parser.parse
|
140
|
-
rescue
|
141
|
-
end
|
142
|
-
Lookbook::Preview.clear_cache
|
143
|
-
Lookbook::Engine.reload_ui(changes)
|
144
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
104
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1.3.1")
|
105
|
+
# Rails.application.server is only available for newer Rails versions
|
106
|
+
Rails.application.server do
|
107
|
+
init_listeners
|
145
108
|
end
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
only: /\.(html.*|md.*)$/,
|
151
|
-
force_polling: config.lookbook.listen_use_polling
|
152
|
-
) do |modified, added, removed|
|
153
|
-
changes = { modified: modified, added: added, removed: removed }
|
154
|
-
Lookbook::Engine.reload_ui(changes)
|
155
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
109
|
+
else
|
110
|
+
# Fallback for older Rails versions - don't start listeners if running in a rake task.
|
111
|
+
unless File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
|
112
|
+
init_listeners
|
156
113
|
end
|
157
|
-
Lookbook::Engine.register_listener(page_listener)
|
158
114
|
end
|
159
115
|
|
160
116
|
if config.lookbook.runtime_parsing
|
161
|
-
parser.parse
|
117
|
+
Lookbook::Engine.parser.parse
|
162
118
|
else
|
163
119
|
unless File.exist?(config.lookbook.parser_registry_path)
|
164
120
|
Lookbook.logger.warn "
|
@@ -172,16 +128,48 @@ module Lookbook
|
|
172
128
|
Lookbook::Engine.run_hooks(:after_initialize)
|
173
129
|
end
|
174
130
|
|
131
|
+
def init_listeners
|
132
|
+
return unless config.lookbook.listen == true
|
133
|
+
Listen.logger = Lookbook.logger
|
134
|
+
Lookbook.logger.info "Initializing listeners"
|
135
|
+
|
136
|
+
preview_listener = Listen.to(
|
137
|
+
*config.lookbook.listen_paths,
|
138
|
+
only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
|
139
|
+
force_polling: config.lookbook.listen_use_polling
|
140
|
+
) do |modified, added, removed|
|
141
|
+
changes = {modified: modified, added: added, removed: removed}
|
142
|
+
begin
|
143
|
+
Lookbook::Engine.parser.parse
|
144
|
+
rescue
|
145
|
+
end
|
146
|
+
Lookbook::Preview.clear_cache
|
147
|
+
Lookbook::Engine.reload_ui(changes)
|
148
|
+
Lookbook::Engine.run_hooks(:after_change, changes)
|
149
|
+
end
|
150
|
+
Lookbook::Engine.register_listener(preview_listener)
|
151
|
+
|
152
|
+
page_listener = Listen.to(
|
153
|
+
*config.lookbook.page_paths,
|
154
|
+
only: /\.(html.*|md.*)$/,
|
155
|
+
force_polling: config.lookbook.listen_use_polling
|
156
|
+
) do |modified, added, removed|
|
157
|
+
changes = {modified: modified, added: added, removed: removed}
|
158
|
+
Lookbook::Engine.reload_ui(changes)
|
159
|
+
Lookbook::Engine.run_hooks(:after_change, changes)
|
160
|
+
end
|
161
|
+
Lookbook::Engine.register_listener(page_listener)
|
162
|
+
end
|
163
|
+
|
175
164
|
at_exit do
|
176
|
-
if
|
165
|
+
if Lookbook::Engine.listeners.any?
|
177
166
|
Lookbook.logger.debug "Stopping listeners"
|
178
|
-
Lookbook::Engine.listeners.each { |listener| listener.stop }
|
167
|
+
Lookbook::Engine.listeners.each { |listener| listener.stop }
|
179
168
|
end
|
180
169
|
Lookbook::Engine.run_hooks(:before_exit)
|
181
170
|
end
|
182
171
|
|
183
172
|
class << self
|
184
|
-
|
185
173
|
def websocket
|
186
174
|
return @websocket unless @websocket.nil?
|
187
175
|
if config.lookbook.auto_refresh
|
@@ -194,9 +182,9 @@ module Lookbook
|
|
194
182
|
@websocket ||= if Rails.version.to_f >= 6.0
|
195
183
|
ActionCable::Server::Base.new(config: cable)
|
196
184
|
else
|
197
|
-
|
198
|
-
|
199
|
-
|
185
|
+
ws = ActionCable::Server::Base.new
|
186
|
+
ws.config = cable
|
187
|
+
ws
|
200
188
|
end
|
201
189
|
end
|
202
190
|
end
|
@@ -218,7 +206,12 @@ module Lookbook
|
|
218
206
|
end
|
219
207
|
|
220
208
|
def app_name
|
221
|
-
Rails.
|
209
|
+
name = if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1")
|
210
|
+
Rails.application.class.module_parent_name
|
211
|
+
else
|
212
|
+
Rails.application.class.parent_name
|
213
|
+
end
|
214
|
+
name.underscore
|
222
215
|
end
|
223
216
|
|
224
217
|
def register_listener(listener)
|
@@ -231,7 +224,7 @@ module Lookbook
|
|
231
224
|
end
|
232
225
|
|
233
226
|
def run_hooks(event_name, *args)
|
234
|
-
|
227
|
+
config.lookbook.hooks[event_name].each do |hook|
|
235
228
|
hook.call(Lookbook, *args)
|
236
229
|
end
|
237
230
|
end
|
data/lib/lookbook/entity.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Lookbook
|
2
|
+
module Hooks
|
3
|
+
def after_initialize(&block)
|
4
|
+
add_hook(:after_initialize, block)
|
5
|
+
end
|
6
|
+
|
7
|
+
def before_exit(&block)
|
8
|
+
add_hook(:before_exit, block)
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_change(&block)
|
12
|
+
add_hook(:after_change, block)
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def add_hook(event_name, block)
|
18
|
+
Lookbook.config.hooks[event_name] << block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/lookbook/markdown.rb
CHANGED
@@ -13,7 +13,7 @@ module Lookbook
|
|
13
13
|
}
|
14
14
|
|
15
15
|
def self.render(text)
|
16
|
-
text&.gsub!(
|
16
|
+
text&.gsub!(/<!-- (BEGIN|END) (.*) -->/, "")
|
17
17
|
markdown = Redcarpet::Markdown.new(Renderer, Lookbook.config.markdown_options)
|
18
18
|
markdown.render(text).html_safe
|
19
19
|
end
|
data/lib/lookbook/page.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class Page < Entity
|
3
|
-
|
4
3
|
FRONTMATTER_FIELDS = [
|
5
4
|
:id,
|
6
5
|
:label,
|
@@ -76,7 +75,7 @@ module Lookbook
|
|
76
75
|
def type
|
77
76
|
:page
|
78
77
|
end
|
79
|
-
|
78
|
+
|
80
79
|
def id
|
81
80
|
options[:id]
|
82
81
|
end
|
@@ -125,7 +124,7 @@ module Lookbook
|
|
125
124
|
}))
|
126
125
|
end
|
127
126
|
@options = Lookbook.config.page_options.deep_merge(frontmatter).with_indifferent_access
|
128
|
-
@options[:id] =
|
127
|
+
@options[:id] = generate_id(@options[:id] || lookup_path)
|
129
128
|
@options[:label] ||= name.titleize
|
130
129
|
@options[:title] ||= @options[:label]
|
131
130
|
@options[:hidden] ||= false
|
@@ -159,7 +158,7 @@ module Lookbook
|
|
159
158
|
end
|
160
159
|
|
161
160
|
def all
|
162
|
-
|
161
|
+
pages, sections =
|
163
162
|
Array(page_paths).flat_map do |dir|
|
164
163
|
Dir["#{dir}/**/*.html.*", "#{dir}/**/*.md.*"].sort.map do |path|
|
165
164
|
create(path, dir)
|
@@ -172,7 +171,7 @@ module Lookbook
|
|
172
171
|
|
173
172
|
page_dict = sorted_pages.index_by(&:path)
|
174
173
|
sorted_sections = sections.sort_by { |section| [section.position, section.label] }
|
175
|
-
|
174
|
+
|
176
175
|
sorted_sections.each do |section|
|
177
176
|
page_dict[section.path].sections << section
|
178
177
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class PageSection < Page
|
3
|
-
|
4
3
|
def name
|
5
4
|
return @name if @name.present?
|
6
5
|
matches = full_path.to_s.match(%r{\[(?<name>\w+)\]})
|
@@ -24,8 +23,7 @@ module Lookbook
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def lookup_path
|
27
|
-
|
26
|
+
"#{super}/#{name}"
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
|
-
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Lookbook
|
2
|
+
module Panels
|
3
|
+
def define_panel(name, opts = {})
|
4
|
+
Lookbook.config.define_inspector_panel(name, opts)
|
5
|
+
end
|
6
|
+
|
7
|
+
def amend_panel(name, opts = {})
|
8
|
+
Lookbook.amend_inspector_panel(name, opts)
|
9
|
+
end
|
10
|
+
|
11
|
+
def remove_panel(name)
|
12
|
+
Lookbook.remove_inspector_panel(name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/lookbook/parser.rb
CHANGED
@@ -24,13 +24,16 @@ module Lookbook
|
|
24
24
|
end
|
25
25
|
|
26
26
|
class << self
|
27
|
-
def define_tags
|
27
|
+
def define_tags(custom = {})
|
28
28
|
YARD::Tags::Library.define_tag("Hidden status", :hidden)
|
29
29
|
YARD::Tags::Library.define_tag("Label", :label)
|
30
30
|
YARD::Tags::Library.define_tag("Display", :display)
|
31
31
|
YARD::Tags::Library.define_tag("Position", :position)
|
32
32
|
YARD::Tags::Library.define_tag("ID", :id)
|
33
33
|
YARD::Tags::Library.define_tag("Component", :component)
|
34
|
+
custom.each do |name, opts|
|
35
|
+
YARD::Tags::Library.define_tag(name.to_s.titleize, name)
|
36
|
+
end
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
data/lib/lookbook/preview.rb
CHANGED
@@ -3,7 +3,7 @@ module Lookbook
|
|
3
3
|
include Utils
|
4
4
|
|
5
5
|
delegate :name, :render_args, to: :@preview
|
6
|
-
delegate :position, :group, :notes, :hidden?, to: :@preview_inspector
|
6
|
+
delegate :position, :group, :notes, :hidden?, :tags, :tag, to: :@preview_inspector
|
7
7
|
|
8
8
|
def initialize(preview)
|
9
9
|
@preview = preview
|
@@ -97,7 +97,7 @@ module Lookbook
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def components
|
100
|
-
component_classes = @preview_inspector&.components
|
100
|
+
component_classes = @preview_inspector&.components&.any? ? @preview_inspector&.components : [guess_component]
|
101
101
|
component_classes.map do |class_name|
|
102
102
|
Component.new(class_name.to_s)
|
103
103
|
end
|
@@ -106,11 +106,9 @@ module Lookbook
|
|
106
106
|
protected
|
107
107
|
|
108
108
|
def guess_component
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
nil
|
113
|
-
end
|
109
|
+
name.chomp("Preview").constantize
|
110
|
+
rescue
|
111
|
+
nil
|
114
112
|
end
|
115
113
|
|
116
114
|
class << self
|
@@ -156,7 +154,7 @@ module Lookbook
|
|
156
154
|
|
157
155
|
def clear_cache
|
158
156
|
cache_dir = File.dirname(cache_marker_path)
|
159
|
-
FileUtils.mkdir_p(cache_dir) unless File.
|
157
|
+
FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir)
|
160
158
|
File.write(cache_marker_path, Time.now.to_i)
|
161
159
|
end
|
162
160
|
|
@@ -167,7 +165,7 @@ module Lookbook
|
|
167
165
|
end
|
168
166
|
|
169
167
|
def cache_stale?
|
170
|
-
return false if !File.
|
168
|
+
return false if !File.exist?(cache_marker_path)
|
171
169
|
cache_timestamp = File.read(cache_marker_path).to_i
|
172
170
|
if @last_cache_timestamp.nil? || cache_timestamp > @last_cache_timestamp
|
173
171
|
@last_cache_timestamp = cache_timestamp
|
@@ -179,7 +177,7 @@ module Lookbook
|
|
179
177
|
|
180
178
|
def mark_as_cached
|
181
179
|
cache_dir = File.dirname(cache_marker_path)
|
182
|
-
FileUtils.mkdir_p(cache_dir) unless File.
|
180
|
+
FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir)
|
183
181
|
File.write(cache_marker_path, Time.now)
|
184
182
|
end
|
185
183
|
|
@@ -196,14 +194,14 @@ module Lookbook
|
|
196
194
|
)
|
197
195
|
end
|
198
196
|
end
|
199
|
-
|
197
|
+
|
200
198
|
def preview_files
|
201
199
|
files = Array(Lookbook.config.preview_paths).map do |preview_path|
|
202
200
|
Dir["#{preview_path}/**/*preview.rb"].map do |path|
|
203
201
|
{
|
204
202
|
path: path,
|
205
203
|
base_path: preview_path,
|
206
|
-
rel_path: Pathname(path).relative_path_from(preview_path).to_s
|
204
|
+
rel_path: Pathname(path).relative_path_from(Pathname.new(preview_path)).to_s
|
207
205
|
}
|
208
206
|
end
|
209
207
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class PreviewExample < Entity
|
3
3
|
attr_reader :name, :preview
|
4
|
-
delegate :params, :position, :group, :notes, :hidden?, :source, to: :@example_inspector
|
4
|
+
delegate :params, :position, :group, :notes, :hidden?, :source, :tags, :tag, to: :@example_inspector
|
5
5
|
|
6
6
|
def initialize(name, preview)
|
7
7
|
@name = name
|
@@ -11,7 +11,7 @@ module Lookbook
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def id
|
14
|
-
generate_id(@preview.id, name)
|
14
|
+
@example_inspector&.id || generate_id(@preview.id, name)
|
15
15
|
end
|
16
16
|
|
17
17
|
def url_path
|
@@ -49,6 +49,14 @@ module Lookbook
|
|
49
49
|
@preview.hierarchy_depth + 1
|
50
50
|
end
|
51
51
|
|
52
|
+
def tags(name = nil)
|
53
|
+
examples.map { |example| example.tags(name) }.flatten
|
54
|
+
end
|
55
|
+
|
56
|
+
def tag(name = nil)
|
57
|
+
tags(name).first
|
58
|
+
end
|
59
|
+
|
52
60
|
alias_method :lookup_path, :path
|
53
61
|
end
|
54
62
|
end
|
@@ -10,37 +10,39 @@ module Lookbook
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def hidden?
|
13
|
-
if code_object&.tag(:hidden)
|
13
|
+
@hidden ||= if code_object&.tag(:hidden)
|
14
14
|
code_object.tag(:hidden).text.strip != "false"
|
15
|
+
else
|
16
|
+
false
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def id
|
19
|
-
if code_object&.tag(:id)&.text&.present?
|
21
|
+
@id ||= if code_object&.tag(:id)&.text&.present?
|
20
22
|
generate_id(code_object&.tag(:id)&.text)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
def label
|
25
|
-
code_object&.tag(:label)&.text
|
27
|
+
@label ||= code_object&.tag(:label)&.text
|
26
28
|
end
|
27
29
|
|
28
30
|
def notes
|
29
|
-
if code_object&.docstring
|
31
|
+
@notes ||= if code_object&.docstring
|
30
32
|
code_object.docstring.to_s.strip
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
36
|
def group
|
35
|
-
code_object&.group
|
37
|
+
@group ||= code_object&.group
|
36
38
|
end
|
37
39
|
|
38
40
|
def position
|
39
|
-
code_object&.tag(:position)&.text&.to_i || 10000
|
41
|
+
@position ||= code_object&.tag(:position)&.text&.to_i || 10000
|
40
42
|
end
|
41
43
|
|
42
44
|
def components
|
43
|
-
if code_object&.tags(:component).present?
|
45
|
+
@components ||= if code_object&.tags(:component).present?
|
44
46
|
code_object.tags(:component).map do |component|
|
45
47
|
component.text.constantize
|
46
48
|
end
|
@@ -50,7 +52,8 @@ module Lookbook
|
|
50
52
|
end
|
51
53
|
|
52
54
|
def display_params
|
53
|
-
display_params
|
55
|
+
return @display_params unless @display_params.nil?
|
56
|
+
@display_params = {}.with_indifferent_access
|
54
57
|
if code_object&.tags(:display).present?
|
55
58
|
code_object.tags(:display).each do |tag|
|
56
59
|
parts = tag.text.strip.match(/^([^\s]*)\s?(.*)$/)
|
@@ -63,11 +66,11 @@ module Lookbook
|
|
63
66
|
end
|
64
67
|
end
|
65
68
|
end
|
66
|
-
display_params
|
69
|
+
@display_params
|
67
70
|
end
|
68
71
|
|
69
72
|
def parameter_defaults
|
70
|
-
code_object&.parameters&.map { |str| Params.parse_method_param_str(str) }&.compact&.to_h
|
73
|
+
@param_defaults ||= code_object&.parameters&.map { |str| Params.parse_method_param_str(str) }&.compact&.to_h
|
71
74
|
end
|
72
75
|
|
73
76
|
def params
|
@@ -77,7 +80,16 @@ module Lookbook
|
|
77
80
|
end
|
78
81
|
|
79
82
|
def methods
|
80
|
-
code_object&.meths
|
83
|
+
@methods ||= code_object&.meths
|
84
|
+
end
|
85
|
+
|
86
|
+
def tags(name = nil)
|
87
|
+
tag_objects = code_object&.tags(name).presence || []
|
88
|
+
Lookbook::Tags.process_tags(tag_objects)
|
89
|
+
end
|
90
|
+
|
91
|
+
def tag(name = nil)
|
92
|
+
tags(name).first
|
81
93
|
end
|
82
94
|
end
|
83
95
|
end
|