hot_reloader 0.1.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec0e3c1431bef973f80a63c492edc79bae5eb435fd280d8b0594323d10ff0396
4
- data.tar.gz: 5496d56ab76af81abbe464317f02c56758a72d297702e47068ebe5375351b35a
3
+ metadata.gz: 461d4f4d7e55f277ac68ad3757ff3a5de4e854d8f994bf497643cc405ac12da3
4
+ data.tar.gz: '0399e4aba6fe95c3fb25c4fcd414552859fa1cc8bf530a43a1df465125f8893c'
5
5
  SHA512:
6
- metadata.gz: a3bd2875289eaf879180477d43b1d924febdcef2dc1caf3aaedda22a43718343cfa2411e425fecd8ac3de4b35d5596d250c55a6b23902f53c6a050b8ee730e30
7
- data.tar.gz: 7fff7f4d9b5e4e86a9e72dafc73e795215e661785e13e52577aaa69d089d2454a92abb99bcf18f4a04f9fd975a8284fc65aeebf8b69d114d93922f0d45d1a2ae
6
+ metadata.gz: 5ad70767d0a9e17bfedb28823ee60bf4dad0fb306a553207008b59a52a37a9136fc9f6143e771f10d0bf246cba5308a4c5c8b600d62aa5fab98d20e484936de5
7
+ data.tar.gz: 1e0b7f132a276c4b43bc2aa62b81796109c967900226fd579d52cf4b7731aaf3b475073df7d437bcedd3fa7d0db0500fda26b541bf2d44472b7f5d4a36721286
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # HotReloader [![Build Status](https://travis-ci.org/zw963/hot_reloader.svg?branch=master)](https://travis-ci.org/zw963/hot_reloader) [![Gem Version](https://badge.fury.io/rb/hot_reloader.svg)](http://badge.fury.io/rb/hot_reloader)
1
+ # HotReloader [![Build Status](https://travis-ci.com/zw963/hot_reloader.svg?branch=master)](https://travis-ci.com/zw963/hot_reloader) [![Gem Version](https://badge.fury.io/rb/hot_reloader.svg)](http://badge.fury.io/rb/hot_reloader)
2
2
 
3
3
  A dead simple ruby code hot reloader wrap around [zeitwerk](https://github.com/fxn/zeitwerk) and [listen](https://github.com/guard/listen).
4
4
 
@@ -20,34 +20,84 @@ Add to your Gemfile
20
20
 
21
21
  Following is a example for use hot_reloader with [Roda](https://github.com/jeremyevans/roda):
22
22
 
23
+ `config.ru` which used to start rack based web server with `command rackup -o 0.0.0.0 -p 9393`
24
+
23
25
  ```rb
24
26
  # config.ru
25
27
 
26
- require 'roda'
27
- require 'hot_reloader'
28
+ require_relative './config/environment'
28
29
 
29
30
  if ENV['RACK_ENV'] == 'production'
30
- HotReloader.will_listen(__dir__)
31
- run ->(env) {
32
- App.call(env)
33
- }
31
+ run App.freeze.app
34
32
  else
35
- run App
33
+ run ->(env) { App.call(env) }
36
34
  end
37
35
  ```
38
36
 
39
- Then create app.rb in ROOT directory.
37
+ Add loader initialize code into `config/environment.rb`
38
+
40
39
 
41
40
  ```rb
42
- # app.rb
41
+ # config/environment.rb
43
42
 
44
- class App < Roda
45
- articles = []
43
+ require 'bundler'
44
+ Bundler.require(:default, ENV.fetch('RACK_ENV', "development"))
45
+ require_relative 'application'
46
+
47
+ loader = Zeitwerk::Loader.new
48
+ loader.push_dir("#{__dir__}/../app")
49
+ loader.push_dir("#{__dir__}/../app/models")
50
+ loader.inflector.inflect "ar" => "AR"
51
+
52
+ if ENV['RACK_ENV'] == 'production'
53
+ HotReloader.eager_load(loader)
54
+ else
55
+ HotReloader.will_listen(loader)
56
+ end
57
+ ```
58
+
59
+ Or use more simple form (if you don't need setup Zeitwerk loader youself)
60
+
61
+
62
+ ```rb
63
+ # config/environment.rb
64
+
65
+ require 'bundler'
66
+ Bundler.require(:default, ENV.fetch('RACK_ENV', "development"))
67
+ require_relative 'application'
68
+
69
+ paths = ["#{__dir__}/../app", "#{__dir__}/../app/models"]
46
70
 
71
+ if ENV['RACK_ENV'] == 'production'
72
+ HotReloader.eager_load(*paths)
73
+ else
74
+ HotReloader.will_listen(*paths)
75
+ end
76
+ ```
77
+
78
+ Write whatever application initialize code which need add into application.rb
79
+
80
+ ```rb
81
+ # config/application.rb
82
+
83
+ DB = Sequel.connect(ENV.fetch("DATABASE_URL"), timeout: 10000)
84
+ ```
85
+
86
+ Add roda code into app/app.rb
87
+
88
+ ```rb
89
+ # app/app.rb
90
+
91
+ class App < Roda
92
+ articles = ['programming ruby', 'programming rust']
47
93
  route do |r|
48
94
  r.post "articles" do
49
- articles << r.params["content"]
50
- "Count: #{articles.count}"
95
+ articles << r.params["content"]
96
+ "Count: #{articles.count}"
97
+ end
98
+
99
+ r.get "articles" do
100
+ articles.join(', ')
51
101
  end
52
102
  end
53
103
  end
@@ -56,7 +106,9 @@ end
56
106
  Directory structure is like this:
57
107
 
58
108
  ```
59
- ├── app.rb
109
+ ├── app/app.rb
110
+ ├── config/environment.rb
111
+ ├── config/application.rb
60
112
  ├── config.ru
61
113
  ├── Gemfile
62
114
  └── Gemfile.lock
data/lib/hot_reloader.rb CHANGED
@@ -1,14 +1,66 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'zeitwerk'
2
4
  require 'listen'
3
5
 
4
- module HotReloader
5
- module_function
6
+ class HotReloader
7
+ class << self
8
+ # Listen on folders for file change, and reload changed rb file if necessary.
9
+ # Should be used for development mode only.
10
+ #
11
+ # @param [*String, Array<String>] folders Folders which should be monitor, can be multi-args or array.
12
+ # or only one Zeitwerk::Loader object can be provided.
13
+ # @param [#call] logger logger or any object should response call, e.g. method(:puts)
14
+ # @param [Array<String>] ignore Glob patterns or Pathname object which should be excluded.
15
+ # @return nil
16
+ def will_listen(*folders, logger: Logger.new(IO::NULL), ignore: [])
17
+ folders = folders.flatten
18
+
19
+ if folders.first.is_a? Zeitwerk::Loader
20
+ loader = folders.first
21
+ folders = loader.root_dirs.keys
22
+ else
23
+ loader = Zeitwerk::Loader.new
24
+
25
+ raise 'you must set the root folders from which you want to load watched files.' if folders&.empty?
26
+ raise 'ignore: only accept an array of glob patterns string or Pathname objects.' unless ignore.is_a? Array
27
+
28
+ folders.each {|folder| loader.push_dir(folder) }
29
+ end
30
+
31
+ loader.enable_reloading if loader.respond_to? :enable_reloading
32
+ loader.logger = logger
33
+
34
+ loader.ignore(ignore) unless ignore.empty?
35
+
36
+ loader.setup
37
+ Listen.to(*folders, wait_for_delay: 1) { loader.reload }.start
38
+ end
39
+
40
+ # Enable autoload ruby file based on default Zeitwerk rule.
41
+ # More rule see https://github.com/fxn/zeitwerk
42
+ #
43
+ # @param [*String, Array<String>] folders folders which should be autoload, can be multi-args or array.
44
+ # or only one Zeitwerk::Loader object can be provided.
45
+ # @param [#call] logger logger or any object should response call, e.g. method(:puts)
46
+ # @return nil
47
+ def eager_load(*folders, logger: Logger.new(IO::NULL))
48
+ folders = folders.flatten
49
+
50
+ if folders.first.is_a? Zeitwerk::Loader
51
+ loader = folders.first
52
+ folders = loader.root_dirs.keys
53
+ else
54
+ loader = Zeitwerk::Loader.new
55
+ raise 'you must set the root folders from which you want to load watched files.' if folders&.empty?
56
+
57
+ folders.each {|folder| loader.push_dir(folder) }
58
+ end
59
+
60
+ loader.logger = logger
6
61
 
7
- def will_listen(*directories, logger: method(:puts))
8
- loader = Zeitwerk::Loader.new
9
- loader.logger = logger
10
- directories.each {|directory| loader.push_dir(directory) }
11
- loader.setup
12
- Listen.to(*directories) { loader.reload }.start
62
+ loader.setup
63
+ loader.eager_load
64
+ end
13
65
  end
14
66
  end
@@ -1,9 +1,5 @@
1
- module HotReloader
2
- VERSION = [0, 1, 0]
1
+ # frozen_string_literal: true
3
2
 
4
- class << VERSION
5
- def to_s
6
- join('.')
7
- end
8
- end
3
+ class HotReloader
4
+ VERSION = '0.6.0'
9
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hot_reloader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Billy.Zheng(zw963)
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-21 00:00:00.000000000 Z
11
+ date: 2021-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.4'
19
+ version: '2.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.4'
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: listen
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ homepage: http://github.com/zw963/hot_reloader
53
53
  licenses:
54
54
  - MIT
55
55
  metadata: {}
56
- post_install_message:
56
+ post_install_message:
57
57
  rdoc_options: []
58
58
  require_paths:
59
59
  - lib
@@ -68,8 +68,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  requirements: []
71
- rubygems_version: 3.0.1
72
- signing_key:
71
+ rubygems_version: 3.0.3
72
+ signing_key:
73
73
  specification_version: 4
74
74
  summary: A dead simple ruby code hot reloader wrap around zeitwerk and listen.
75
75
  test_files: []