lookbook 1.0.0.rc.3 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f64c997d49feb8abebcde5278b87487c2e6560325e5f36c849b2f1897e8c749e
4
- data.tar.gz: d6d230272a15c2b3685da778e3b174300c5a40845f9b3819dba676c66f78904e
3
+ metadata.gz: e3f13cba228b6a66ef0c31377116296e1eb1c8b53e3fd5b54ca257780cb30498
4
+ data.tar.gz: 3c9e509969d78ea297e39649b43d4a8613f97c7be8e0845603b313524bff316b
5
5
  SHA512:
6
- metadata.gz: 5cae26841a60c692b5f762b77ad5b6ca38cba5164da39b38f8e026b720a9289300469e6f50d8b7e90e7c8135dcae93443650ae4a6861c5e29ea7b527cdd6e6ee
7
- data.tar.gz: d59f0142b41eb72a82997a61a479937cf91ac2cf3adffdfd7e28f0fa9e9af6dacc0f106ce8db5afc9431b5b7278afb00fea3498859e4411b563cd67a47342c14
6
+ metadata.gz: afeead86c2ccbb4cfd6e9afc20641474dbd5ab153916b5602f374750a41aaaec329516b36b39a964740701a536dd52683f9322e039fde3d4f9c83d7101290720
7
+ data.tar.gz: 54046d3840469aac423eef1b9c9dd88132e7282cda794b5e1ebd9ab8518a05a8184b3d037915e8c2a1dc9c61b5644a314735a05c5de8de8c0fdda6c23acebe55
data/README.md CHANGED
@@ -1,83 +1,52 @@
1
- # Lookbook v1.0
1
+ # Lookbook
2
2
 
3
3
  <div>
4
- <a href="https://rubygems.org/gems/lookbook"><img src="https://img.shields.io/gem/v/lookbook?include_prereleases" alt="Gem version"></a>
5
- <img src="https://github.com/allmarkedup/lookbook/actions/workflows/ci.yml/badge.svg?branch=v1.0-beta" alt="CI status">
4
+ <a href="https://rubygems.org/gems/lookbook"><img src="https://img.shields.io/gem/v/lookbook" alt="Gem version"></a>
5
+ <a href="https://github.com/allmarkedup/lookbook/actions/workflows/ci.yml"><img src="https://github.com/allmarkedup/lookbook/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
6
6
  </div>
7
7
  <br>
8
8
 
9
- > **This is the Lookbook v1.0 BETA development branch.**<br>
10
- >_For code and documentation for the current stable release see the [main branch](https://github.com/allmarkedup/lookbook/tree/main)._
9
+ A tool to help browse, develop, test & document [ViewComponents](https://viewcomponent.org/) in Ruby on Rails apps.
11
10
 
11
+ ## Documentation
12
12
 
13
- ## Get started
13
+ **Lookbook (v1.x)** documentation: **[https://lookbook.build](https://lookbook.build)**
14
14
 
15
- If you are already using Lookbook in your project, just update the Lookbook gem to the latest beta release and then head over to the [beta documentation site](https://beta.lookbook.build/) to read more about the new features.
15
+ > _Looking for v0.9.x docs? [Head over here](https://github.com/allmarkedup/lookbook/tree/0.9.x)._
16
16
 
17
- ```ruby
18
- gem "lookbook", ">= 1.0.0.beta.8"
19
- ```
20
17
 
21
- If you are **new to Lookbook** then check out the <a href="https://beta.lookbook.build/guide/quick-start/">v1.0 quick start guide</a> for more detailed instructions on installing Lookbook in your project
18
+ ## Demo
22
19
 
20
+ **Online Demo:** [https://lookbook-demo-app.herokuapp.com/lookbook](https://lookbook-demo-app.herokuapp.com/lookbook)
23
21
 
24
- <h4>Useful Resources</h4>
22
+ [![Lookbook UI](.github/assets/lookbook_screenshot_v1.0_beta.png)](https://lookbook-demo-app.herokuapp.com/lookbook/)
25
23
 
26
- * 👉 <a href="https://beta.lookbook.build/">v1.0 docs</a>
27
- * 👉 <a href="https://lookbook-demo-app-v1-0-beta.herokuapp.com/lookbook">v1.0 demo app</a> <em>(The repo for the demo <a href="https://github.com/allmarkedup/lookbook-demo/tree/v1.0-beta">is here</a> if you want to dig in further)</em>
28
24
 
25
+ ## Development
29
26
 
30
-
31
- ## Changes and new features in v1.0
32
-
33
- Lookbook v1.0 includes a completely re-written UI, many under-the hood improvements and a some exciting new customisation options.
34
-
35
- ### Frontend changes:
36
-
37
- * Completely re-written UI - now built with ViewComponents
38
- * New [UI themes and customisation options](https://beta.lookbook.build/guide/themes/)
39
- * Improved small-screen/mobile view
40
- * Debug menu
41
- * ...and many other small visual and usability improvements
42
-
43
- ### New options for extending Lookbook:
44
-
45
- * Define [custom tags](https://beta.lookbook.build/guide/extend/tags/) for preview file annotations
46
- * Create [your own tab panels](https://beta.lookbook.build/guide/extend/panels/) - with complete control over content/layout and access to all Lookbook data
47
- * Use [lifecycle hooks](https://beta.lookbook.build/guide/extend/hooks/) to run your own code when Lookbook starts up, when files change or at shutdown
48
-
49
- ### Other changes
50
-
51
- * 'Workbench' app for developing Lookbook's UI components in Lookbook
52
- * New Rspec-based test suite and dummy app
53
- * All new documentation site built using [Bridgetown](https://www.bridgetownrb.com/)
54
-
55
-
56
- [![Lookbook UI](.github/assets/lookbook_screenshot_v1.0_beta.png)](https://lookbook-demo-app-v1-0-beta.herokuapp.com/lookbook/)
57
-
58
- ## Workbench
59
-
60
- As of this release, Lookbook's UI is itself built using ViewComponent components. To help with development it is possible to preview these components (in a Lookbook instance!) by running the included 'Workbench" app, as follows:
27
+ Lookbook's UI is itself built using ViewComponents. To preview these components in a Lookbook instance you can run the included `workbench` app:
61
28
 
62
29
  1. Clone this repo
63
30
  2. Install dependencies: `bundle install & npm install`
64
- 3. Start the Workbench: `foreman start`
65
- 4. Open http://localhost:4545 in your browser to view the Workbench
31
+ 3. Start the app: `bin/workbench`
32
+ 4. Visit http://localhost:4545/lookbook to view the Lookbook instance
33
+
34
+ The `workbench` app will be started in development mode and any changes to Lookbook's views or assets will immediately be reflected in the UI.
66
35
 
67
- This will start the Workbench app in development mode and any changes to Lookbooks views or assets will immediately be visible in the UI.
36
+ ### Docs site
68
37
 
38
+ The [Lookbook docs site](https://lookbook.build) is built using [Bridgetown](https://www.bridgetownrb.com/) and the source files can be found in the `./docs` directory.
69
39
 
70
- ## Running tests
40
+ To see a local version of the site run `bin/docs` from the root of this repo and then visit http://localhost:4000 in your browser.
71
41
 
72
- The test suite is in the process of being completely overhauled.
42
+ ### Testing
73
43
 
74
- Tests are now written using RSpec and the system now uses [Combustion](https://github.com/pat/combustion) under the hood.
44
+ Lookbook uses RSpec for testing.
75
45
 
76
- - Tests can be run using the `rake lookbook:test` or `bundle exec rspec` commands.
77
- - The dummy app that the tests are being run against can be viewed by running the `rake lookbook:test:serve` command and then browsing to http://localhost:9292/lookbook
46
+ Tests can be run using the `rake spec` or `bundle exec rspec` commands.
78
47
 
48
+ The dummy app that the tests are being run against can be viewed by running the `bin/dummy` command and then browsing to http://localhost:9292/lookbook
79
49
 
80
- ---
81
50
 
82
51
  ## License
83
52
 
@@ -1,19 +1,19 @@
1
- <% if @example.present? %>
1
+ <% if @target.present? %>
2
2
  <%= render_component_tag class: "not-prose border-b border-lookbook-divider rounded-sm overflow-hidden", "@navigation:start.window": "cleanup" do %>
3
3
 
4
4
  <%= render_component :toolbar, class: "border border-b-0 border-lookbook-divider" do |toolbar| %>
5
5
  <% toolbar.section padded: true do %>
6
6
  <h3>
7
- <%= @example.preview.label %> (<%= @example.label %>)
7
+ <%= @target.preview.label %> (<%= @target.label %>)
8
8
  </h3>
9
9
  <% end %>
10
10
  <% toolbar.section align: :right, divide: :left do %>
11
11
  <%= render_component :button_group do |group| %>
12
12
  <% group.button icon: :eye,
13
- href: lookbook_inspect_path(@example.path, @params),
13
+ href: lookbook_inspect_path(@target.path, @params),
14
14
  tooltip: "View in Inspector" %>
15
15
  <% group.button icon: :external_link,
16
- href: lookbook_preview_path(@example.path, @params),
16
+ href: lookbook_preview_path(@target.path, @params),
17
17
  tooltip: "Open in new window",
18
18
  target: "_blank" %>
19
19
  <% end %>
@@ -28,7 +28,7 @@
28
28
  @viewport:resize-complete="resizeIframe"
29
29
  @tabs:change.window="resizeIframe">
30
30
  <%= render_component :viewport,
31
- src: lookbook_preview_path(@example.path, @params.merge(lookbook_embed: true)),
31
+ src: lookbook_preview_path(@target.path, @params.merge(lookbook_embed: true)),
32
32
  alpine_data: "store",
33
33
  resize_height: false,
34
34
  max_height: @max_height,
@@ -2,7 +2,7 @@ module Lookbook
2
2
  class Embed::Component < Lookbook::BaseComponent
3
3
  def initialize(id:, example:, params: {}, opts: {}, max_height: nil, **html_attrs)
4
4
  @id = id
5
- @example = example
5
+ @target = example
6
6
  @params = params
7
7
  @opts = opts
8
8
  @max_height = max_height
@@ -46,11 +46,11 @@
46
46
  <span class="opacity-70 mr-1">Lookbook</span>
47
47
  <span class="mr-6">v<%= Lookbook::VERSION %></span>
48
48
  <div class="flex items-center space-x-2">
49
- <!-- a href="https://github.com/allmarkedup/lookbook" target="_blank" class="ml-auto opacity-70" title="Documentation">
50
- <%= icon :book, size: 3 %>
51
- </a -->
49
+ <a href="https://lookbook.build/guide" target="_blank" class="ml-auto opacity-70" title="Documentation">
50
+ <%= icon :book, size: 3 %>
51
+ </a>
52
52
  <a href="https://github.com/allmarkedup/lookbook" target="_blank" class="ml-auto opacity-70" title="Github">
53
- <%= icon :github, size: 3 %>
53
+ <%= icon :github, size: 3 %>
54
54
  </a>
55
55
  </div>
56
56
  </div>
@@ -1,4 +1,4 @@
1
- <%= render_component_tag :i, style: "height: #{size_rems}; width: #{size_rems}" do %>
1
+ <%= render_component_tag :i, style: "height: #{size_rems}; width: #{size_rems}; #{@html_attrs[:style]}" do %>
2
2
  <svg>
3
3
  <use :href="`/lookbook-assets/feather-sprite.svg#${iconName}`" x-cloak />
4
4
  </svg>
@@ -25,9 +25,8 @@ module Lookbook
25
25
  css_parser.each_selector do |selector, declarations, specificity|
26
26
  @panel_styles += "##{id} #{selector} { #{declarations} }\n"
27
27
  end
28
- style_tag.unlink
29
28
  end
30
- @panel_html = panel_dom.to_html.html_safe
29
+ @panel_html = content.gsub(/<style(?:\s[^>]*)?>.*<\/style>/, "").html_safe
31
30
  end
32
31
  end
33
32
  @panel_html ||= content
@@ -13,7 +13,7 @@ module Lookbook
13
13
  before_action :set_params
14
14
 
15
15
  def preview
16
- if @example
16
+ if @target
17
17
  begin
18
18
  opts = {layout: @preview.layout}
19
19
  if params[:lookbook_embed] == "true"
@@ -32,7 +32,7 @@ module Lookbook
32
32
  end
33
33
 
34
34
  def show
35
- if @example
35
+ if @target
36
36
  begin
37
37
  @main_panels = main_panels
38
38
  @drawer_panels = drawer_panels
@@ -52,9 +52,9 @@ module Lookbook
52
52
  private
53
53
 
54
54
  def lookup_entities
55
- @example = Lookbook.previews.find_example(params[:path])
56
- if @example.present?
57
- @preview = @example.preview
55
+ @target = Lookbook.previews.find_example(params[:path])
56
+ if @target.present?
57
+ @preview = @target.preview
58
58
  if params[:path] == @preview&.lookup_path
59
59
  redirect_to lookbook_inspect_path "#{params[:path]}/#{@preview.default_example.name}"
60
60
  end
@@ -85,17 +85,17 @@ module Lookbook
85
85
  end
86
86
 
87
87
  def target_examples
88
- @example.type == :group ? @example.examples : [@example]
88
+ @target.type == :group ? @target.examples : [@target]
89
89
  end
90
90
 
91
91
  def set_title
92
- @title = @example.present? ? [@example&.label, @preview&.label].compact.join(" :: ") : "Not found"
92
+ @title = @target.present? ? [@target&.label, @preview&.label].compact.join(" :: ") : "Not found"
93
93
  end
94
94
 
95
95
  def set_params
96
- if @example
96
+ if @target
97
97
  # cast known params to type
98
- @example.params.each do |param|
98
+ @target.params.each do |param|
99
99
  if preview_controller.params.key?(param[:name])
100
100
  preview_controller.params[param[:name]] = Lookbook::Params.cast(preview_controller.params[param[:name]], param[:type])
101
101
  end
@@ -103,7 +103,7 @@ module Lookbook
103
103
  # set display and data params
104
104
  preview_controller.params.merge!({
105
105
  lookbook: {
106
- display: @example.display_params,
106
+ display: @target.display_params,
107
107
  data: Lookbook.data
108
108
  }
109
109
  })
@@ -113,7 +113,7 @@ module Lookbook
113
113
  def preview_params
114
114
  preview_controller.params.permit!
115
115
  preview_controller.params.to_h.select do |key, value|
116
- !!@example.params.find { |param| param[:name] == key }
116
+ !!@target.params.find { |param| param[:name] == key }
117
117
  end
118
118
  end
119
119
 
@@ -125,12 +125,7 @@ module Lookbook
125
125
  path: params[:path]
126
126
  }
127
127
 
128
- example = @example
129
128
  preview = @preview
130
- preview.define_singleton_method(:params, proc {
131
- example.params
132
- })
133
-
134
129
  examples = target_examples.map do |example|
135
130
  render_args = @preview.render_args(example.name, params: preview_controller.params)
136
131
  has_template = render_args[:template] != "view_components/preview"
@@ -144,11 +139,18 @@ module Lookbook
144
139
  example
145
140
  end
146
141
 
142
+ target = @target.type == :group ? @target : examples.find { |e| e.lookup_path == @target.lookup_path }
143
+
144
+ preview.define_singleton_method(:params, proc {
145
+ target.params
146
+ })
147
+
147
148
  @inspector_data ||= Lookbook::Store.new({
148
149
  context: context_data,
149
150
  preview: preview,
150
151
  examples: examples,
151
- example: example,
152
+ example: examples.first,
153
+ target: target,
152
154
  data: Lookbook.data,
153
155
  app: Lookbook
154
156
  })
@@ -198,7 +200,7 @@ module Lookbook
198
200
  {
199
201
  file_path: @preview&.full_path,
200
202
  line_number: 0,
201
- source_code: @example&.source
203
+ source_code: @target&.source
202
204
  }
203
205
  elsif exception.is_a?(ActionView::Template::Error) & exception.message.include?("implements a reserved method")
204
206
  message_parts = exception.message.split("\n").first.split
@@ -6,6 +6,10 @@ module Lookbook
6
6
  render Lookbook::Icon::Component.new(name: name, **attrs)
7
7
  end
8
8
 
9
+ def code(**attrs, &block)
10
+ render Lookbook::Code::Component.new(**attrs), &block
11
+ end
12
+
9
13
  def render_component(ref, **attrs, &block)
10
14
  klass = component_class(ref)
11
15
  comp = attrs.key?(:content) ? klass.new(**attrs.except(:content)).with_content(attrs[:content]) : klass.new(**attrs)
@@ -7,7 +7,7 @@
7
7
  <% if Lookbook.previews? %>
8
8
  <p>Select a preview from the nav to get started.</p>
9
9
  <% else %>
10
- <p><a class="underline" href="https://beta.lookbook.build/guide/previews" target="_blank">Create a preview</a> to get started.</p>
10
+ <p><a class="underline" href="https://lookbook.build/guide/previews" target="_blank">Create a preview</a> to get started.</p>
11
11
  <% end %>
12
12
  </div>
13
13
  </div>
@@ -29,7 +29,7 @@
29
29
  <% group.button icon: :code,
30
30
  tooltip: "Copy page embed code",
31
31
  copy: true do %>
32
- &lt;%= embed <%= @preview.preview_class %>, :<%= @example.name %>, params: <%= request.query_parameters.deep_symbolize_keys.to_s %> %&gt;
32
+ &lt;%= embed <%= @preview.preview_class %>, :<%= @target.name %>, params: <%= request.query_parameters.deep_symbolize_keys.to_s %> %&gt;
33
33
  <% end %>
34
34
  <% end %>
35
35
 
@@ -38,7 +38,7 @@
38
38
  "@click.stop": "startSpin(); $dispatch('viewport:reload'); stopSpin(500);" %>
39
39
 
40
40
  <% group.button icon: :external_link,
41
- href: lookbook_preview_path(@example.lookup_path, request.query_parameters),
41
+ href: lookbook_preview_path(@target.lookup_path, request.query_parameters),
42
42
  tooltip: "Open preview in new window",
43
43
  target: "_blank" %>
44
44
 
data/config/routes.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  Lookbook::Engine.routes.draw do
2
- if Lookbook.config.auto_refresh
2
+ if Lookbook::Engine.websocket?
3
3
  mount Lookbook::Engine.websocket => Lookbook.config.cable_mount_path
4
4
  end
5
5
 
@@ -11,6 +11,10 @@ module Lookbook
11
11
  name.underscore
12
12
  end
13
13
 
14
+ def rel_path
15
+ Pathname.new("#{path}.rb")
16
+ end
17
+
14
18
  def full_path
15
19
  Pathname.new("#{Lookbook.config.components_path}/#{path}.rb")
16
20
  end
@@ -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"
@@ -104,11 +103,13 @@ module Lookbook
104
103
  # Rails.application.server is only available for newer Rails versions
105
104
  Rails.application.server do
106
105
  init_listeners
106
+ Lookbook::Engine.init_websocket
107
107
  end
108
108
  else
109
109
  # Fallback for older Rails versions - don't start listeners if running in a rake task.
110
- unless File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
110
+ unless Lookbook::Engine.prevent_listening?
111
111
  init_listeners
112
+ Lookbook::Engine.init_websocket
112
113
  end
113
114
  end
114
115
 
@@ -127,64 +128,65 @@ module Lookbook
127
128
  Lookbook::Engine.run_hooks(:after_initialize)
128
129
  end
129
130
 
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
- end
162
-
163
131
  at_exit do
164
132
  if Lookbook::Engine.listeners.any?
165
133
  Lookbook.logger.debug "Stopping listeners"
166
- Lookbook::Engine.listeners.each { |listener| listener.stop }
134
+ Lookbook::Engine.stop_listeners
167
135
  end
168
136
  Lookbook::Engine.run_hooks(:before_exit)
169
137
  end
170
138
 
171
139
  class << self
172
- def websocket
173
- return @websocket unless @websocket.nil?
174
- if config.lookbook.auto_refresh
175
- cable = ActionCable::Server::Configuration.new
176
- cable.cable = {adapter: "async"}.with_indifferent_access
177
- cable.mount_path = config.lookbook.cable_mount_path
178
- cable.connection_class = -> { Lookbook::Connection }
179
- cable.logger = config.lookbook.cable_logger
180
-
181
- @websocket ||= if Rails.version.to_f >= 6.0
182
- ActionCable::Server::Base.new(config: cable)
183
- else
184
- ws = ActionCable::Server::Base.new
185
- ws.config = cable
186
- ws
140
+ def init_listeners
141
+ config = Lookbook.config
142
+ return unless config.listen == true
143
+ Listen.logger = Lookbook.logger
144
+
145
+ preview_listener = Listen.to(
146
+ *config.listen_paths,
147
+ only: /\.(#{config.listen_extensions.join("|")})$/,
148
+ force_polling: config.listen_use_polling
149
+ ) do |modified, added, removed|
150
+ changes = {modified: modified, added: added, removed: removed}
151
+ begin
152
+ parser.parse
153
+ rescue
187
154
  end
155
+ Lookbook::Preview.clear_cache
156
+ reload_ui(changes)
157
+ run_hooks(:after_change, changes)
158
+ end
159
+ register_listener(preview_listener)
160
+
161
+ page_listener = Listen.to(
162
+ *config.page_paths,
163
+ only: /\.(html.*|md.*)$/,
164
+ force_polling: config.listen_use_polling
165
+ ) do |modified, added, removed|
166
+ changes = {modified: modified, added: added, removed: removed}
167
+ reload_ui(changes)
168
+ run_hooks(:after_change, changes)
169
+ end
170
+ register_listener(page_listener)
171
+ end
172
+
173
+ def init_websocket
174
+ config = Lookbook.config
175
+ return unless config.auto_refresh == true
176
+ Lookbook.logger.info "Initializing websocket"
177
+
178
+ cable = ActionCable::Server::Configuration.new
179
+ cable.cable = {adapter: "async"}.with_indifferent_access
180
+ cable.mount_path = config.cable_mount_path
181
+ cable.connection_class = -> { Lookbook::Connection }
182
+ cable.logger = config.cable_logger
183
+
184
+ @websocket = if Gem::Version.new(Rails.version) >= Gem::Version.new(6.0)
185
+ ActionCable::Server::Base.new(config: cable)
186
+ else
187
+ ws = ActionCable::Server::Base.new
188
+ ws.config = cable
189
+ ws
188
190
  end
189
191
  end
190
192
 
@@ -192,6 +194,10 @@ module Lookbook
192
194
  "#{mounted_path}#{config.lookbook.cable_mount_path}" if websocket
193
195
  end
194
196
 
197
+ def websocket?
198
+ !!websocket
199
+ end
200
+
195
201
  def mounted_path
196
202
  Lookbook::Engine.routes.find_script_name({})
197
203
  end
@@ -222,6 +228,10 @@ module Lookbook
222
228
  @listeners ||= []
223
229
  end
224
230
 
231
+ def stop_listeners
232
+ listeners.each { |listener| listener.stop }
233
+ end
234
+
225
235
  def run_hooks(event_name, *args)
226
236
  config.lookbook.hooks[event_name].each do |hook|
227
237
  hook.call(Lookbook, *args)
@@ -232,7 +242,19 @@ module Lookbook
232
242
  websocket&.broadcast("reload", changed)
233
243
  end
234
244
 
235
- attr_reader :preview_controller
245
+ def prevent_listening?
246
+ Rails.env.test? || running_in_rake_task?
247
+ end
248
+
249
+ def running_in_rake_task?
250
+ if defined?(Rake) && Rake.respond_to?(:application)
251
+ File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
252
+ else
253
+ false
254
+ end
255
+ end
256
+
257
+ attr_reader :preview_controller, :websocket
236
258
  end
237
259
  end
238
260
  end
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
@@ -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}/#{name.underscore}.rb"].first
70
+ Dir["#{preview_path}/#{rel_path}"].first
67
71
  end
68
- Pathname.new(Dir["#{base_path}/#{name.underscore}.rb"].first)
72
+ Pathname.new(Dir["#{base_path}/#{rel_path}"].first)
69
73
  end
70
74
 
71
75
  def url_path
@@ -1,3 +1,3 @@
1
1
  module Lookbook
2
- VERSION = "1.0.0.rc.3"
2
+ VERSION = "1.0.2"
3
3
  end