lookbook 1.2.1 → 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +47 -14
- data/app/assets/lookbook/css/themes/blue.css +4 -2
- data/app/assets/lookbook/css/themes/green.css +66 -0
- data/app/assets/lookbook/css/themes/indigo.css +4 -2
- data/app/assets/lookbook/css/themes/rose.css +66 -0
- data/app/assets/lookbook/css/themes/zinc.css +4 -2
- data/app/components/lookbook/base_component.rb +2 -2
- data/app/components/lookbook/code/component.css +2 -2
- data/app/components/lookbook/code/component.html.erb +3 -2
- data/app/components/lookbook/code/component.rb +13 -2
- data/app/components/lookbook/code/highlight_github.css +406 -0
- data/app/components/lookbook/header/component.html.erb +1 -1
- data/app/components/lookbook/inspector_panel/component.rb +4 -6
- data/app/components/lookbook/nav/component.rb +8 -15
- data/app/components/lookbook/nav/directory/component.html.erb +28 -0
- data/app/components/lookbook/nav/directory/component.rb +4 -0
- data/app/components/lookbook/nav/{item → entity}/component.html.erb +8 -8
- data/app/components/lookbook/nav/entity/component.rb +49 -0
- data/app/components/lookbook/nav/item/component.css +15 -0
- data/app/components/lookbook/nav/item/component.js +4 -0
- data/app/components/lookbook/nav/item/component.rb +13 -56
- data/app/components/lookbook/params/editor/component.html.erb +2 -2
- data/app/components/lookbook/params/editor/component.rb +3 -10
- data/app/components/lookbook/params/field/component.css +3 -3
- data/app/components/lookbook/params/field/component.html.erb +8 -8
- data/app/components/lookbook/params/field/component.rb +21 -72
- data/app/components/lookbook/split_layout/component.html.erb +1 -1
- data/app/components/lookbook/tabs/component.html.erb +1 -1
- data/app/components/lookbook/tabs/component.js +4 -0
- data/app/components/lookbook/tag_component.rb +1 -1
- data/app/components/lookbook/viewport/component.css +1 -1
- data/app/components/lookbook/viewport/component.html.erb +1 -1
- data/app/components/lookbook/viewport/component.rb +1 -1
- data/app/controllers/concerns/lookbook/targetable_concern.rb +131 -0
- data/app/controllers/concerns/lookbook/with_preview_controller_concern.rb +13 -0
- data/app/controllers/lookbook/application_controller.rb +21 -9
- data/app/controllers/lookbook/inspector_controller.rb +45 -0
- data/app/controllers/lookbook/page_controller.rb +13 -9
- data/app/controllers/lookbook/pages_controller.rb +9 -15
- data/app/controllers/lookbook/previews_controller.rb +4 -210
- data/app/helpers/lookbook/application_helper.rb +2 -2
- data/app/helpers/lookbook/output_helper.rb +5 -5
- data/app/helpers/lookbook/page_helper.rb +7 -4
- data/app/views/layouts/lookbook/application.html.erb +40 -38
- data/app/views/layouts/lookbook/page.html.erb +2 -2
- data/app/views/layouts/lookbook/shell.html.erb +3 -2
- data/app/views/layouts/lookbook/skeleton.html.erb +7 -7
- data/app/views/lookbook/index.html.erb +13 -2
- data/app/views/lookbook/{previews → inspector}/inputs/_color.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/inputs/_range.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/inputs/_select.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/inputs/_text.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/inputs/_textarea.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/inputs/_toggle.html.erb +5 -5
- data/app/views/lookbook/{previews → inspector}/panels/_content.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/panels/_notes.html.erb +2 -2
- data/app/views/lookbook/{previews → inspector}/panels/_output.html.erb +0 -0
- data/app/views/lookbook/inspector/panels/_params.html.erb +15 -0
- data/app/views/lookbook/{previews → inspector}/panels/_preview.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/panels/_source.html.erb +0 -0
- data/app/views/lookbook/{previews → inspector}/show.html.erb +5 -2
- data/config/app.yml +11 -1
- data/config/inputs.yml +12 -12
- data/config/languages.yml +41 -0
- data/config/panels.yml +6 -6
- data/config/routes.rb +5 -5
- data/config/tags.yml +8 -1
- data/lib/lookbook/engine.rb +103 -130
- data/lib/lookbook/entities/collections/component_collection.rb +4 -0
- data/lib/lookbook/entities/collections/concerns/hierarchical_collection.rb +23 -0
- data/lib/lookbook/entities/collections/entity_collection.rb +61 -0
- data/lib/lookbook/entities/collections/page_collection.rb +30 -0
- data/lib/lookbook/entities/collections/preview_collection.rb +41 -0
- data/lib/lookbook/entities/collections/preview_example_collection.rb +4 -0
- data/lib/lookbook/entities/component.rb +31 -0
- data/lib/lookbook/entities/concerns/annotatable.rb +58 -0
- data/lib/lookbook/entities/concerns/inspectable.rb +44 -0
- data/lib/lookbook/entities/concerns/locatable.rb +73 -0
- data/lib/lookbook/entities/concerns/navigable.rb +43 -0
- data/lib/lookbook/entities/entity.rb +53 -0
- data/lib/lookbook/entities/page.rb +80 -0
- data/lib/lookbook/entities/page_section.rb +43 -0
- data/lib/lookbook/entities/preview.rb +87 -0
- data/lib/lookbook/entities/preview_example.rb +100 -0
- data/lib/lookbook/entities/preview_group.rb +48 -0
- data/lib/lookbook/file_watcher.rb +47 -0
- data/lib/lookbook/lang.rb +12 -35
- data/lib/lookbook/param.rb +99 -0
- data/lib/lookbook/{preview_controller.rb → preview_actions.rb} +14 -3
- data/lib/lookbook/preview_parser.rb +53 -0
- data/lib/lookbook/process.rb +21 -0
- data/lib/lookbook/rendered_example.rb +37 -0
- data/lib/lookbook/services/code/code_beautifier.rb +21 -0
- data/lib/lookbook/services/code/code_highlighter.rb +69 -0
- data/lib/lookbook/services/code/code_indenter.rb +14 -0
- data/lib/lookbook/services/data/parsers/data_parser.rb +22 -0
- data/lib/lookbook/services/data/parsers/json_parser.rb +7 -0
- data/lib/lookbook/services/data/parsers/yaml_parser.rb +7 -0
- data/lib/lookbook/services/data/resolvers/data_resolver.rb +70 -0
- data/lib/lookbook/services/data/resolvers/eval_resolver.rb +10 -0
- data/lib/lookbook/services/data/resolvers/file_resolver.rb +28 -0
- data/lib/lookbook/services/data/resolvers/method_resolver.rb +10 -0
- data/lib/lookbook/services/data/resolvers/yaml_resolver.rb +18 -0
- data/lib/lookbook/services/entities/entity_tree_builder.rb +45 -0
- data/lib/lookbook/services/markdown_renderer.rb +29 -0
- data/lib/lookbook/services/position_prefix_parser.rb +16 -0
- data/lib/lookbook/services/string_value_caster.rb +60 -0
- data/lib/lookbook/services/tags/tag_options_parser.rb +62 -0
- data/lib/lookbook/services/templates/action_view_annotations_handler.rb +21 -0
- data/lib/lookbook/services/templates/action_view_annotations_stripper.rb +15 -0
- data/lib/lookbook/services/templates/frontmatter_extractor.rb +28 -0
- data/lib/lookbook/services/templates/styles_extractor.rb +38 -0
- data/lib/lookbook/services/{search_param_builder.rb → urls/search_param_builder.rb} +1 -1
- data/lib/lookbook/services/{search_param_parser.rb → urls/search_param_parser.rb} +1 -1
- data/lib/lookbook/stores/config_store.rb +12 -9
- data/lib/lookbook/stores/input_store.rb +7 -3
- data/lib/lookbook/stores/panel_store.rb +2 -2
- data/lib/lookbook/stores/tag_store.rb +3 -5
- data/lib/lookbook/support/null_object.rb +10 -0
- data/lib/lookbook/support/service.rb +2 -2
- data/lib/lookbook/support/store.rb +2 -35
- data/lib/lookbook/support/tree_node.rb +87 -0
- data/lib/lookbook/support/utils/path_utils.rb +32 -5
- data/lib/lookbook/support/utils/utils.rb +24 -0
- data/lib/lookbook/tags/component_tag.rb +13 -0
- data/lib/lookbook/tags/custom_tag.rb +61 -0
- data/lib/lookbook/tags/display_tag.rb +15 -0
- data/lib/lookbook/tags/hidden_tag.rb +13 -0
- data/lib/lookbook/tags/id_tag.rb +7 -0
- data/lib/lookbook/tags/label_tag.rb +4 -0
- data/lib/lookbook/tags/logical_path_tag.rb +7 -0
- data/lib/lookbook/tags/param_tag.rb +63 -0
- data/lib/lookbook/tags/position_tag.rb +16 -0
- data/lib/lookbook/tags/source_tag.rb +7 -0
- data/lib/lookbook/tags/tag_provider.rb +18 -0
- data/lib/lookbook/tags/yard_tag.rb +90 -0
- data/lib/lookbook/theme.rb +8 -0
- data/lib/lookbook/version.rb +1 -1
- data/lib/lookbook/websocket.rb +60 -0
- data/lib/lookbook.rb +13 -8
- data/public/lookbook-assets/css/lookbook.css +487 -411
- data/public/lookbook-assets/css/lookbook.css.map +1 -1
- data/public/lookbook-assets/css/themes/blue.css +3 -1
- data/public/lookbook-assets/css/themes/blue.css.map +1 -1
- data/public/lookbook-assets/css/themes/green.css +68 -0
- data/public/lookbook-assets/css/themes/green.css.map +1 -0
- data/public/lookbook-assets/css/themes/indigo.css +3 -1
- data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
- data/public/lookbook-assets/css/themes/rose.css +68 -0
- data/public/lookbook-assets/css/themes/rose.css.map +1 -0
- data/public/lookbook-assets/css/themes/zinc.css +3 -1
- data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
- data/public/lookbook-assets/js/embed.js +10 -1
- data/public/lookbook-assets/js/embed.js.map +1 -1
- data/public/lookbook-assets/js/lookbook.js +358 -629
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +96 -44
- data/app/components/lookbook/code/highlight_github_light.css +0 -217
- data/app/views/lookbook/previews/panels/_params.html.erb +0 -15
- data/lib/lookbook/code_formatter.rb +0 -68
- data/lib/lookbook/collection.rb +0 -161
- data/lib/lookbook/component.rb +0 -34
- data/lib/lookbook/entity.rb +0 -47
- data/lib/lookbook/markdown.rb +0 -22
- data/lib/lookbook/page.rb +0 -195
- data/lib/lookbook/page_collection.rb +0 -19
- data/lib/lookbook/page_section.rb +0 -29
- data/lib/lookbook/params.rb +0 -157
- data/lib/lookbook/parser.rb +0 -42
- data/lib/lookbook/preview.rb +0 -174
- data/lib/lookbook/preview_collection.rb +0 -23
- data/lib/lookbook/preview_example.rb +0 -93
- data/lib/lookbook/preview_group.rb +0 -62
- data/lib/lookbook/source_inspector.rb +0 -95
- data/lib/lookbook/support/utils/attribute_utils.rb +0 -9
- data/lib/lookbook/tag.rb +0 -122
- data/lib/lookbook/tag_options.rb +0 -111
- data/lib/lookbook/tags.rb +0 -17
- data/lib/lookbook/template_parser.rb +0 -72
- data/lib/lookbook/utils.rb +0 -105
@@ -0,0 +1,24 @@
|
|
1
|
+
module Lookbook
|
2
|
+
module Utils
|
3
|
+
class << self
|
4
|
+
def id(*args)
|
5
|
+
parts = args.map { |arg| arg.to_s }
|
6
|
+
id_str = parts.join("-").force_encoding("UTF-8").parameterize.dasherize
|
7
|
+
PathUtils.strip_slashes(id_str).tr("/", "-").gsub("--", "-")
|
8
|
+
end
|
9
|
+
|
10
|
+
def name(str)
|
11
|
+
str.to_s.parameterize.tr("-", "_")
|
12
|
+
end
|
13
|
+
|
14
|
+
def value_or_fallback(value, fallback = nil, &block)
|
15
|
+
if value.nil?
|
16
|
+
fallback_block = block || proc { fallback }
|
17
|
+
fallback_block.call
|
18
|
+
else
|
19
|
+
value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class CustomTag < YardTag
|
3
|
+
supports_options
|
4
|
+
|
5
|
+
attr_reader :arg_names, :tag_args
|
6
|
+
|
7
|
+
def initialize(tag_name, text = nil, *args)
|
8
|
+
tag_definition = Engine.tags.get_tag(tag_name)
|
9
|
+
unless tag_definition
|
10
|
+
raise ParserError.new "Unknown custom tag type '#{tag_name}'"
|
11
|
+
end
|
12
|
+
|
13
|
+
super(tag_name, text.to_s, *args)
|
14
|
+
|
15
|
+
@custom_attributes = Store.new
|
16
|
+
@arg_names = tag_definition.options.fetch(:named_args, [])
|
17
|
+
@after_parse = tag_definition.options.fetch(:after_parse, nil)
|
18
|
+
|
19
|
+
validate_arg_names
|
20
|
+
|
21
|
+
@tag_args = parse_tag
|
22
|
+
@after_parse.call(self) if @after_parse.respond_to?(:call)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Method aliases to keep compatability with
|
26
|
+
# the original custom tag implementation
|
27
|
+
alias_method :tag_body, :text
|
28
|
+
alias_method :opts, :options
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def parse_tag
|
33
|
+
text_tokens = Shellwords.split(text)
|
34
|
+
values = text_tokens.slice(0, arg_names.size)
|
35
|
+
|
36
|
+
arg_names.map.with_index do |name, i|
|
37
|
+
[name.to_sym, values[i]]
|
38
|
+
end.to_h
|
39
|
+
end
|
40
|
+
|
41
|
+
def validate_arg_names
|
42
|
+
arg_names.each do |name|
|
43
|
+
if methods.include? name.to_sym
|
44
|
+
raise ParserError.new "'#{name}' is a reserved word and cannot be used as an argument name."
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def method_missing(name, *args)
|
50
|
+
if name.end_with? "="
|
51
|
+
@custom_attributes[name.to_s.chomp("=")] = args.first
|
52
|
+
else
|
53
|
+
@custom_attributes.public_send(name, *args) || tag_args[name]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def respond_to_missing?(name, include_private)
|
58
|
+
@custom_attributes.key?(name) || tag_args.key?(name) || super
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class ParamTag < YardTag
|
3
|
+
VALUE_TYPE_MATCHER = /^(\[\s?([A-Z]{1}\w+)\s?\])/
|
4
|
+
DESCRIPTION_MATCHER = /(?<=\s|^)"(.*[^\\])"(?:\s|$)/
|
5
|
+
|
6
|
+
supports_options
|
7
|
+
|
8
|
+
attr_reader :tag_args
|
9
|
+
|
10
|
+
def initialize(text)
|
11
|
+
@name, text_without_name = extract_name(text)
|
12
|
+
@tag_args = parse_tag_body(text_without_name)
|
13
|
+
super("param", tag_args[:rest], nil, @name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def input
|
17
|
+
tag_args[:input]&.downcase&.tr("_", "-")
|
18
|
+
end
|
19
|
+
|
20
|
+
def description
|
21
|
+
tag_args[:description]
|
22
|
+
end
|
23
|
+
|
24
|
+
def value_type
|
25
|
+
tag_args[:value_type]&.downcase
|
26
|
+
end
|
27
|
+
|
28
|
+
def value_default
|
29
|
+
default_value_parts = object.parameters.find { |parts| parts[0].chomp(":") == name }
|
30
|
+
if default_value_parts
|
31
|
+
object.instance_eval(default_value_parts[1])
|
32
|
+
else
|
33
|
+
raise ParserError.new "Unknown method parameter '#{name}'"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
def extract_name(text)
|
40
|
+
parts = text.to_s.split(" ")
|
41
|
+
[parts.shift, parts.join(" ")]
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_tag_body(text)
|
45
|
+
value_type = nil
|
46
|
+
description = nil
|
47
|
+
|
48
|
+
text.match(VALUE_TYPE_MATCHER) do |match_data|
|
49
|
+
value_type = match_data[2]
|
50
|
+
text.gsub!(VALUE_TYPE_MATCHER, "").strip!
|
51
|
+
end
|
52
|
+
|
53
|
+
text.match(DESCRIPTION_MATCHER) do |match_data|
|
54
|
+
description = match_data[1]
|
55
|
+
text.gsub!(DESCRIPTION_MATCHER, "").strip!
|
56
|
+
end
|
57
|
+
|
58
|
+
input, rest = text.split(" ", 2)
|
59
|
+
|
60
|
+
{input: input, value_type: value_type, description: description, rest: rest}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class PositionTag < YardTag
|
3
|
+
DEFAULT_POSITION = 100000
|
4
|
+
|
5
|
+
def value
|
6
|
+
if text.present?
|
7
|
+
int = text.to_i
|
8
|
+
(int == 0) ? DEFAULT_POSITION : int
|
9
|
+
else
|
10
|
+
DEFAULT_POSITION
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
alias_method :to_i, :value
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class TagProvider < ::YARD::Tags::Tag
|
3
|
+
def self.new(tag_name, text, types = nil, name = nil)
|
4
|
+
tag_name = tag_name.to_s
|
5
|
+
|
6
|
+
if tag_name == "custom"
|
7
|
+
raise NameError.new "'custom' is a reserved tag name and cannot be used"
|
8
|
+
end
|
9
|
+
|
10
|
+
begin
|
11
|
+
tag_class = "Lookbook::#{tag_name.camelize}Tag".constantize
|
12
|
+
tag_class.new(text)
|
13
|
+
rescue NameError
|
14
|
+
CustomTag.new(tag_name, text)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class YardTag < ::YARD::Tags::Tag
|
3
|
+
def initialize(*args)
|
4
|
+
if args.size < 2
|
5
|
+
tag_name = self.class.name.demodulize.underscore.chomp("_tag")
|
6
|
+
super(tag_name, args.first, nil, @name)
|
7
|
+
else
|
8
|
+
super(*args)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def text
|
13
|
+
tag_parts[:text]
|
14
|
+
end
|
15
|
+
|
16
|
+
def options
|
17
|
+
tag_parts[:options]
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
value.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
# The `value` attribute should be overriden in child classes
|
25
|
+
# to return the resolved value of the tag, where appropriate.
|
26
|
+
# i.e. for the @hidden tag this would return boolean true/false.
|
27
|
+
alias_method :value, :text
|
28
|
+
|
29
|
+
def self.supports_options(value = true)
|
30
|
+
@supports_options = !!value
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.supports_options?
|
34
|
+
@supports_options.nil? ? false : @supports_options
|
35
|
+
end
|
36
|
+
|
37
|
+
supports_options
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
def tag_parts
|
42
|
+
if @tag_parts.nil?
|
43
|
+
options, text = if self.class.supports_options?
|
44
|
+
TagOptionsParser.call(@text, {
|
45
|
+
file: host_file,
|
46
|
+
base_dir: host_file&.dirname,
|
47
|
+
eval_context: host_class_instance,
|
48
|
+
permit_eval: Lookbook.config.preview_params_options_eval
|
49
|
+
})
|
50
|
+
else
|
51
|
+
[{}, @text]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@tag_parts ||= {options: options, text: text}
|
55
|
+
end
|
56
|
+
|
57
|
+
def resolve_path(path)
|
58
|
+
return unless host_file
|
59
|
+
|
60
|
+
dir = path.start_with?(".") ? host_file.dirname : host_file_base_directory
|
61
|
+
Pathname(File.expand_path(path, dir))
|
62
|
+
end
|
63
|
+
|
64
|
+
def host_file
|
65
|
+
location = object&.files&.first # [file, line_number]
|
66
|
+
Pathname(location.first) if location
|
67
|
+
end
|
68
|
+
|
69
|
+
def host_file_base_directory
|
70
|
+
return unless host_file
|
71
|
+
|
72
|
+
directories = Engine.preview_paths.map(&:to_s).sort_by(&:length).reverse
|
73
|
+
directories.first { |dir| host_file.to_s.start_with?(dir) }
|
74
|
+
end
|
75
|
+
|
76
|
+
def host_class_instance
|
77
|
+
host_class = lookup_host_class
|
78
|
+
host_class&.new
|
79
|
+
end
|
80
|
+
|
81
|
+
def lookup_host_class
|
82
|
+
host_code_object = if object.is_a?(YARD::CodeObjects::MethodObject)
|
83
|
+
object.parent
|
84
|
+
elsif object.is_a?(YARD::CodeObjects::ClassObject)
|
85
|
+
object
|
86
|
+
end
|
87
|
+
host_code_object&.path&.constantize
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/lookbook/theme.rb
CHANGED
@@ -12,6 +12,14 @@ module Lookbook
|
|
12
12
|
blue: {
|
13
13
|
favicon_light_mode: "#2563EB",
|
14
14
|
favicon_dark_mode: "#60A5FA"
|
15
|
+
},
|
16
|
+
green: {
|
17
|
+
favicon_light_mode: "#16a34a",
|
18
|
+
favicon_dark_mode: "#66E093"
|
19
|
+
},
|
20
|
+
rose: {
|
21
|
+
favicon_light_mode: "#E11D48",
|
22
|
+
favicon_dark_mode: "#FFA0B5"
|
15
23
|
}
|
16
24
|
}
|
17
25
|
|
data/lib/lookbook/version.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class Websocket
|
3
|
+
attr_reader :engine_mount_path, :server, :logger
|
4
|
+
|
5
|
+
def initialize(engine_mount_path, logger: Lookbook.logger)
|
6
|
+
@engine_mount_path = engine_mount_path
|
7
|
+
@logger = logger
|
8
|
+
|
9
|
+
logger.info "Initializing websocket"
|
10
|
+
|
11
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new(6.0)
|
12
|
+
@server = ActionCable::Server::Base.new config: cable_config
|
13
|
+
else
|
14
|
+
@server = ActionCable::Server::Base.new
|
15
|
+
@server.config = cable_config
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def broadcast(message, payload = nil)
|
20
|
+
logger.debug message.to_s
|
21
|
+
server.broadcast(message.to_s, payload.to_h)
|
22
|
+
end
|
23
|
+
|
24
|
+
def mount_path
|
25
|
+
"/cable"
|
26
|
+
end
|
27
|
+
|
28
|
+
def full_mount_path
|
29
|
+
"#{engine_mount_path}/#{mount_path}".gsub("//", "/")
|
30
|
+
end
|
31
|
+
|
32
|
+
def mountable?
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_method :mounted?, :mountable?
|
37
|
+
|
38
|
+
def self.noop
|
39
|
+
NullWebsocket.new
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
def cable_config
|
45
|
+
cable = ActionCable::Server::Configuration.new
|
46
|
+
cable.cable = {adapter: "async"}.with_indifferent_access
|
47
|
+
cable.mount_path = nil
|
48
|
+
cable.connection_class = -> { Lookbook::Connection }
|
49
|
+
cable.logger = logger
|
50
|
+
cable
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class NullWebsocket < NullObject
|
55
|
+
def mountable?
|
56
|
+
false
|
57
|
+
end
|
58
|
+
alias_method :mounted?, :mountable?
|
59
|
+
end
|
60
|
+
end
|
data/lib/lookbook.rb
CHANGED
@@ -6,6 +6,7 @@ loader.ignore("#{__dir__}/lookbook.rb")
|
|
6
6
|
loader.push_dir("#{__dir__}/lookbook", namespace: Lookbook)
|
7
7
|
loader.collapse("#{__dir__}/lookbook/*")
|
8
8
|
loader.collapse("#{__dir__}/lookbook/*/*")
|
9
|
+
loader.collapse("#{__dir__}/lookbook/*/*/*")
|
9
10
|
loader.setup
|
10
11
|
|
11
12
|
module Lookbook
|
@@ -15,23 +16,27 @@ module Lookbook
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def config
|
18
|
-
@
|
19
|
+
@_config ||= ConfigStore.init_from_config
|
19
20
|
end
|
20
21
|
|
21
22
|
def configure
|
22
23
|
yield(config)
|
23
24
|
end
|
24
25
|
|
26
|
+
def engine
|
27
|
+
Engine
|
28
|
+
end
|
29
|
+
|
25
30
|
def data
|
26
|
-
@
|
31
|
+
@_data ||= Store.new
|
27
32
|
end
|
28
33
|
|
29
34
|
def data=(new_data)
|
30
|
-
@
|
35
|
+
@_data = Store.new(new_data)
|
31
36
|
end
|
32
37
|
|
33
38
|
def logger
|
34
|
-
@
|
39
|
+
@_logger ||= if Rails.logger.present? && config.log_use_rails_logger
|
35
40
|
Rails.logger
|
36
41
|
else
|
37
42
|
logger = Logger.new($stdout)
|
@@ -54,11 +59,11 @@ module Lookbook
|
|
54
59
|
end
|
55
60
|
|
56
61
|
def previews
|
57
|
-
|
62
|
+
Engine.previews
|
58
63
|
end
|
59
64
|
|
60
65
|
def pages
|
61
|
-
|
66
|
+
Engine.pages
|
62
67
|
end
|
63
68
|
|
64
69
|
def broadcast(event_name, data = {})
|
@@ -66,7 +71,7 @@ module Lookbook
|
|
66
71
|
end
|
67
72
|
|
68
73
|
def theme
|
69
|
-
@
|
74
|
+
@_theme ||= Lookbook::Theme.new(config.ui_theme, config.ui_theme_overrides)
|
70
75
|
end
|
71
76
|
|
72
77
|
def define_param_input(*args)
|
@@ -88,7 +93,7 @@ module Lookbook
|
|
88
93
|
def define_tag(name, args = nil, &block)
|
89
94
|
Engine.tags.add_tag(name, {
|
90
95
|
named_args: args.to_a,
|
91
|
-
|
96
|
+
after_parse: block
|
92
97
|
})
|
93
98
|
end
|
94
99
|
|