hot_reloader 0.1.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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: []