rails_live_reload 0.3.6 → 0.5.0
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 +5 -4
- data/lib/generators/templates/rails_live_reload.rb +3 -0
- data/lib/rails_live_reload/config.rb +11 -1
- data/lib/rails_live_reload/engine.rb +20 -8
- data/lib/rails_live_reload/middleware/base.rb +11 -10
- data/lib/rails_live_reload/version.rb +1 -1
- data/lib/rails_live_reload/watcher.rb +8 -1
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f3623d0079c16a21e2b52a6c54e554c7acc9fa24abc25b503bd155ef1370b06
|
4
|
+
data.tar.gz: e2319b7fc9e036246a7f93c5cfba1d08447975c9d0f848fb7336b19050c1898d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d17d66422af418d7cdfc506de8c92276df44e3ba5361b25522d5ade8324cf2fddf041f06026ef939f3ef3801f2b943c58a85e8f2d686ebc5bec0c9f23eac53d
|
7
|
+
data.tar.gz: 5fdb4bfc1a17a817a2606654501b7389dd044f83624d8f923efc2794e5aa12115661efa4aa35f4851bb2a6f7f3b123a5c983a045be53e66e4684651f9fc6a3c6
|
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Rails Live Reload
|
2
2
|
|
3
3
|
[](https://www.railsjazz.com)
|
4
|
-
|
4
|
+
|
5
|
+
[](https://buymeacoffee.com/igorkasyanchuk)
|
5
6
|
|
6
7
|

|
7
8
|
|
@@ -66,9 +67,6 @@ The default configuration assumes that you either use asset pipeline, or that yo
|
|
66
67
|
|
67
68
|
You are welcome to contribute. See list of `TODO's` below.
|
68
69
|
|
69
|
-
[<img src="https://opensource-heroes.com/svg/embed/railsjazz/rails_live_reload"
|
70
|
-
/>](https://opensource-heroes.com/svg/embed/railsjazz/rails_live_reload)
|
71
|
-
|
72
70
|
## TODO
|
73
71
|
|
74
72
|
- reload CSS without reloading the whole page?
|
@@ -90,3 +88,6 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
90
88
|
|
91
89
|
[<img src="https://github.com/igorkasyanchuk/rails_time_travel/blob/main/docs/more_gems.png?raw=true"
|
92
90
|
/>](https://www.railsjazz.com/?utm_source=github&utm_medium=bottom&utm_campaign=rails_live_reload)
|
91
|
+
|
92
|
+
|
93
|
+
[](https://buymeacoffee.com/igorkasyanchuk)
|
@@ -11,5 +11,8 @@ RailsLiveReload.configure do |config|
|
|
11
11
|
# config.watch %r{app/helpers/.+\.rb}, reload: :always
|
12
12
|
# config.watch %r{config/locales/.+\.yml}, reload: :always
|
13
13
|
|
14
|
+
# Ignored folders & files
|
15
|
+
# config.ignore %r{node_modules/}
|
16
|
+
|
14
17
|
# config.enabled = Rails.env.development?
|
15
18
|
end if defined?(RailsLiveReload)
|
@@ -12,13 +12,17 @@ module RailsLiveReload
|
|
12
12
|
config.patterns
|
13
13
|
end
|
14
14
|
|
15
|
+
def ignore_patterns
|
16
|
+
config.ignore_patterns
|
17
|
+
end
|
18
|
+
|
15
19
|
def enabled?
|
16
20
|
config.enabled
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
20
24
|
class Config
|
21
|
-
attr_reader :patterns
|
25
|
+
attr_reader :patterns, :ignore_patterns
|
22
26
|
attr_accessor :url, :watcher, :files, :enabled
|
23
27
|
|
24
28
|
def initialize
|
@@ -33,6 +37,8 @@ module RailsLiveReload
|
|
33
37
|
%r{(app|vendor)/(assets|javascript)/\w+/(.+\.(css|js|html|png|jpg|ts|jsx)).*} => :always
|
34
38
|
}
|
35
39
|
@default_patterns_changed = false
|
40
|
+
|
41
|
+
@ignore_patterns = []
|
36
42
|
end
|
37
43
|
|
38
44
|
def root_path
|
@@ -48,6 +54,10 @@ module RailsLiveReload
|
|
48
54
|
patterns[pattern] = reload
|
49
55
|
end
|
50
56
|
|
57
|
+
def ignore(pattern)
|
58
|
+
@ignore_patterns << pattern
|
59
|
+
end
|
60
|
+
|
51
61
|
def socket_path
|
52
62
|
root_path.join('tmp/sockets/rails_live_reload.sock').then do |path|
|
53
63
|
break path if path.to_s.size <= 104 # 104 is the max length of a socket path
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module RailsLiveReload
|
2
2
|
class Railtie < ::Rails::Engine
|
3
|
-
|
4
|
-
|
3
|
+
def enabled?
|
4
|
+
RailsLiveReload.enabled? && (defined?(::Rails::Server) || ENV['SERVER_PROCESS'])
|
5
|
+
end
|
6
|
+
|
7
|
+
initializer "rails_live_reload.middleware" do |app|
|
8
|
+
if enabled?
|
5
9
|
if ::Rails::VERSION::MAJOR.to_i >= 5
|
6
10
|
app.middleware.insert_after ActionDispatch::Executor, RailsLiveReload::Middleware::Base
|
7
11
|
else
|
@@ -12,25 +16,33 @@ module RailsLiveReload
|
|
12
16
|
end
|
13
17
|
end
|
14
18
|
end
|
19
|
+
end
|
15
20
|
|
16
|
-
|
21
|
+
initializer "rails_live_reload.watcher" do
|
22
|
+
if enabled?
|
17
23
|
RailsLiveReload::Watcher.init
|
18
24
|
end
|
25
|
+
end
|
19
26
|
|
20
|
-
|
27
|
+
initializer "rails_live_reload.configure_metrics", after: :initialize_logger do
|
28
|
+
if enabled?
|
21
29
|
ActiveSupport::Notifications.subscribe(
|
22
30
|
/\.action_view/,
|
23
31
|
RailsLiveReload::Instrument::MetricsCollector.new
|
24
32
|
)
|
25
33
|
end
|
34
|
+
end
|
26
35
|
|
27
|
-
|
36
|
+
initializer "rails_live_reload.reset_current_request", after: :initialize_logger do |app|
|
37
|
+
if enabled?
|
28
38
|
app.executor.to_run { CurrentRequest.cleanup }
|
29
39
|
app.executor.to_complete { CurrentRequest.cleanup }
|
30
40
|
end
|
41
|
+
end
|
31
42
|
|
32
|
-
|
33
|
-
|
43
|
+
initializer "rails_live_reload.routes" do
|
44
|
+
config.after_initialize do |app|
|
45
|
+
if enabled?
|
34
46
|
app.routes.prepend do
|
35
47
|
mount RailsLiveReload.server => RailsLiveReload.config.url, internal: true
|
36
48
|
end
|
@@ -38,4 +50,4 @@ module RailsLiveReload
|
|
38
50
|
end
|
39
51
|
end
|
40
52
|
end
|
41
|
-
end
|
53
|
+
end
|
@@ -15,11 +15,11 @@ module RailsLiveReload
|
|
15
15
|
@app.call(env)
|
16
16
|
end
|
17
17
|
else
|
18
|
-
request =
|
18
|
+
request = ActionDispatch::Request.new(env)
|
19
19
|
status, headers, body = @app.call(env)
|
20
20
|
|
21
|
-
if html?(headers) && (status == 500 || (status.to_s =~ /20./ && request.get?))
|
22
|
-
return inject_rails_live_reload(status, headers, body)
|
21
|
+
if html?(headers) && (status == 500 || status == 422 || (status.to_s =~ /20./ && request.get?))
|
22
|
+
return inject_rails_live_reload(request, status, headers, body)
|
23
23
|
end
|
24
24
|
|
25
25
|
[status, headers, body]
|
@@ -28,25 +28,26 @@ module RailsLiveReload
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
def inject_rails_live_reload(status, headers, body)
|
31
|
+
def inject_rails_live_reload(request, status, headers, body)
|
32
32
|
response = Rack::Response.new([], status, headers)
|
33
|
-
|
33
|
+
|
34
|
+
nonce = request&.content_security_policy_nonce
|
34
35
|
if String === body
|
35
|
-
response.write make_new_response(body)
|
36
|
+
response.write make_new_response(body, nonce)
|
36
37
|
else
|
37
|
-
body.each { |fragment| response.write make_new_response(fragment) }
|
38
|
+
body.each { |fragment| response.write make_new_response(fragment, nonce) }
|
38
39
|
end
|
39
40
|
body.close if body.respond_to?(:close)
|
40
41
|
response.finish
|
41
42
|
end
|
42
43
|
|
43
|
-
def make_new_response(body)
|
44
|
+
def make_new_response(body, nonce)
|
44
45
|
index = body.rindex(/<\/body>/i) || body.rindex(/<\/html>/i)
|
45
46
|
return body if index.nil?
|
46
47
|
|
47
48
|
body.insert(index, <<~HTML.html_safe)
|
48
49
|
<script defer type="text/javascript" src="#{RailsLiveReload.config.url}/script"></script>
|
49
|
-
<script id="rails-live-reload-options" type="application/json">
|
50
|
+
<script id="rails-live-reload-options" type="application/json" nonce="#{nonce}">
|
50
51
|
#{{
|
51
52
|
files: CurrentRequest.current.data.to_a,
|
52
53
|
time: Time.now.to_i,
|
@@ -57,7 +58,7 @@ module RailsLiveReload
|
|
57
58
|
end
|
58
59
|
|
59
60
|
def html?(headers)
|
60
|
-
headers["
|
61
|
+
headers["content-type"].to_s.include?("text/html")
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
1
3
|
module RailsLiveReload
|
2
4
|
class Watcher
|
3
5
|
attr_reader :files, :sockets
|
@@ -21,13 +23,14 @@ module RailsLiveReload
|
|
21
23
|
end
|
22
24
|
|
23
25
|
build_tree
|
26
|
+
create_socket_directory
|
24
27
|
start_socket
|
25
28
|
start_listener
|
26
29
|
end
|
27
30
|
|
28
31
|
def start_listener
|
29
32
|
Thread.new do
|
30
|
-
listener = Listen.to(root) do |modified, added, removed|
|
33
|
+
listener = Listen.to(root, ignore: RailsLiveReload.ignore_patterns) do |modified, added, removed|
|
31
34
|
all = modified + added + removed
|
32
35
|
all.each do |file|
|
33
36
|
files[file] = File.mtime(file).to_i rescue nil
|
@@ -55,6 +58,10 @@ module RailsLiveReload
|
|
55
58
|
end
|
56
59
|
end
|
57
60
|
|
61
|
+
def create_socket_directory
|
62
|
+
FileUtils.mkdir_p File.dirname(RailsLiveReload.config.socket_path)
|
63
|
+
end
|
64
|
+
|
58
65
|
def start_socket
|
59
66
|
Thread.new do
|
60
67
|
Socket.unix_server_socket(RailsLiveReload.config.socket_path.to_s) do |sock|
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_live_reload
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Kasyanchuk
|
8
8
|
- Liubomyr Manastyretskyi
|
9
|
-
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2025-05-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: railties
|
@@ -118,7 +117,6 @@ homepage: https://github.com/railsjazz/rails_live_reload
|
|
118
117
|
licenses:
|
119
118
|
- MIT
|
120
119
|
metadata: {}
|
121
|
-
post_install_message:
|
122
120
|
rdoc_options: []
|
123
121
|
require_paths:
|
124
122
|
- lib
|
@@ -133,8 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
131
|
- !ruby/object:Gem::Version
|
134
132
|
version: '0'
|
135
133
|
requirements: []
|
136
|
-
rubygems_version: 3.
|
137
|
-
signing_key:
|
134
|
+
rubygems_version: 3.6.3
|
138
135
|
specification_version: 4
|
139
136
|
summary: Ruby on Rails Live Reload
|
140
137
|
test_files: []
|