sinatra-reloader 0.4.0.a
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.
- data/README.md +31 -0
- data/lib/sinatra/reloader.rb +121 -0
- data/spec/sinatra/reloader_spec.rb +52 -0
- data/spec/spec_helper.rb +6 -0
- metadata +113 -0
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
Sinatra::Reloader
|
2
|
+
=================
|
3
|
+
|
4
|
+
Advanced code reloader for [Sinatra](http://sinatrarb.com). Reloads only files that have
|
5
|
+
changed and automatically detects orphaned routes that have to be removed. Most other
|
6
|
+
implementations delete all routes and reload all code if one file changed, which takes way
|
7
|
+
more time than reloading only one file, especially in larger projects. Files defining
|
8
|
+
routes will be added to the reload list per default. Avoid reloading with dont_reload. Add
|
9
|
+
other files to the reload list with also_reload.
|
10
|
+
|
11
|
+
BigBand
|
12
|
+
-------
|
13
|
+
|
14
|
+
Sinatra::Reloader is part of the [BigBand](http://github.com/rkh/big_band) stack.
|
15
|
+
Check it out if you are looking for other fancy Sinatra extensions.
|
16
|
+
|
17
|
+
BigBand will setup the reloader automatically, but only in development mode.
|
18
|
+
|
19
|
+
Usage
|
20
|
+
-----
|
21
|
+
|
22
|
+
require "sinatra/base"
|
23
|
+
require "sinatra/reloader"
|
24
|
+
|
25
|
+
class Foo < Sinatra::Base
|
26
|
+
configure(:development) do
|
27
|
+
register Sinatra::Reloader
|
28
|
+
also_reload "app/models/*.rb"
|
29
|
+
dont_reload "lib/**/*.rb"
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require "monkey"
|
2
|
+
require "sinatra/base"
|
3
|
+
require "sinatra/sugar"
|
4
|
+
require "sinatra/advanced_routes"
|
5
|
+
|
6
|
+
module Sinatra
|
7
|
+
Base.ignore_caller
|
8
|
+
|
9
|
+
# Advanced reloader for sinatra. Reloads only files that have changed and automatically
|
10
|
+
# detects orphaned routes that have to be removed. Files defining routes will be added
|
11
|
+
# to the reload list per default. Avoid reloading with dont_reload. Add other files to
|
12
|
+
# the reload list with also_reload.
|
13
|
+
#
|
14
|
+
# Usage:
|
15
|
+
#
|
16
|
+
# require "big_band"
|
17
|
+
# class Foo < Sinatra::Base
|
18
|
+
# configure(:development) do
|
19
|
+
# register BigBand::Reloader
|
20
|
+
# also_reload "app/models/*.rb"
|
21
|
+
# dont_reload "lib/**/*.rb"
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# Per default this will only be acitvated in development mode.
|
26
|
+
module Reloader
|
27
|
+
|
28
|
+
class FileWatcher < Array
|
29
|
+
|
30
|
+
attr_reader :file, :mtime
|
31
|
+
|
32
|
+
extend Enumerable
|
33
|
+
@map ||= {}
|
34
|
+
|
35
|
+
def self.register(route)
|
36
|
+
new(route.file) << route if route.file?
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.new(file)
|
40
|
+
@map[file.expand_path] ||= super
|
41
|
+
end
|
42
|
+
|
43
|
+
class << self
|
44
|
+
alias [] new
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.each(&block)
|
48
|
+
@map.values.each(&block)
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize(file)
|
52
|
+
@reload = true
|
53
|
+
@file, @mtime = file, File.mtime(file)
|
54
|
+
super()
|
55
|
+
end
|
56
|
+
|
57
|
+
def changed?
|
58
|
+
!File.exist? file or @mtime != File.mtime(file)
|
59
|
+
end
|
60
|
+
|
61
|
+
def dont_reload!(dont = true)
|
62
|
+
@reload = !dont
|
63
|
+
end
|
64
|
+
|
65
|
+
def reload?
|
66
|
+
@reload and changed?
|
67
|
+
end
|
68
|
+
|
69
|
+
def reload
|
70
|
+
reload! if reload?
|
71
|
+
end
|
72
|
+
|
73
|
+
def reload!
|
74
|
+
each { |route| route.deactivate }
|
75
|
+
$LOADED_FEATURES.delete file
|
76
|
+
clear
|
77
|
+
if File.exist? file
|
78
|
+
@mtime = File.mtime(file)
|
79
|
+
require file
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
module ClassMethods
|
86
|
+
def dont_reload(*files)
|
87
|
+
if [true, false].include? files.last then dont = files.pop
|
88
|
+
else dont = true
|
89
|
+
end
|
90
|
+
files.flatten.each do |file|
|
91
|
+
Dir.glob(file) { |f| FileWatcher[f].dont_reload! dont }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def also_reload(*files)
|
96
|
+
dont_reload(files, false)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.registered(klass)
|
101
|
+
klass.register AdvancedRoutes
|
102
|
+
klass.extend ClassMethods
|
103
|
+
klass.each_route { |route| advanced_route_added(route) }
|
104
|
+
klass.before { Reloader.reload_routes }
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.advanced_route_added(route)
|
108
|
+
FileWatcher.register(route)
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.thread_safe?
|
112
|
+
Thread and Thread.list.size > 1 and Thread.respond_to? :exclusive
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.reload_routes(thread_safe = true)
|
116
|
+
return Thread.exclusive { reload_routes(false) } if thread_safe and thread_safe?
|
117
|
+
FileWatcher.each { |file| file.reload }
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe Sinatra::Reloader do
|
4
|
+
|
5
|
+
def app_file(file, content, go_sleeping = true)
|
6
|
+
sleep 1 if go_sleeping
|
7
|
+
file = File.expand_path(file, @temp_dir)
|
8
|
+
File.open(file, "w") { |f| f << "class ExampleApp < Sinatra::Base; #{content}; end" }
|
9
|
+
require file
|
10
|
+
file
|
11
|
+
end
|
12
|
+
|
13
|
+
def app
|
14
|
+
ExampleApp
|
15
|
+
end
|
16
|
+
|
17
|
+
before :all do
|
18
|
+
@temp_dir ||= File.expand_path "../../temp", __FILE__
|
19
|
+
rm_rf @temp_dir
|
20
|
+
mkdir_p @temp_dir
|
21
|
+
class ExampleApp < Sinatra::Base
|
22
|
+
register Sinatra::Reloader
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
after :all do
|
27
|
+
rm_rf @temp_dir
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should reload files" do
|
31
|
+
app_file("example_app.rb", "get('/foo') { 'foo' }")
|
32
|
+
browse_route(:get, '/foo').body.should == 'foo'
|
33
|
+
app_file("example_app.rb", "get('/foo') { 'bar' }")
|
34
|
+
browse_route(:get, '/foo').body.should == 'bar'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not affact other routes" do
|
38
|
+
app_file("example_app.rb", "get('/foo') { 'foo' }")
|
39
|
+
app_file("example_app2.rb", "get('/bar') { 'bar' }", false)
|
40
|
+
browse_route(:get, '/bar').body.should == 'bar'
|
41
|
+
app_file("example_app.rb", "get('/foo') { 'bar' }")
|
42
|
+
browse_route(:get, '/bar').body.should == 'bar'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should respect dont_reload" do
|
46
|
+
file = app_file("example_app3.rb", "get('/baz') { 'foo' }", false)
|
47
|
+
app.dont_reload file
|
48
|
+
app_file("example_app3.rb", "get('/baz') { 'bar' }")
|
49
|
+
browse_route(:get, '/baz').body.should == 'foo'
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sinatra-reloader
|
3
|
+
version: &id001 !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0.a
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Konstantin Haase
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-16 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: monkey-lib
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - "="
|
22
|
+
- *id001
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: sinatra-advanced-routes
|
26
|
+
type: :runtime
|
27
|
+
version_requirement:
|
28
|
+
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "="
|
31
|
+
- *id001
|
32
|
+
version:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: sinatra-sugar
|
35
|
+
type: :runtime
|
36
|
+
version_requirement:
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "="
|
40
|
+
- *id001
|
41
|
+
version:
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: sinatra-test-helper
|
44
|
+
type: :development
|
45
|
+
version_requirement:
|
46
|
+
version_requirements: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - "="
|
49
|
+
- *id001
|
50
|
+
version:
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: sinatra
|
53
|
+
type: :runtime
|
54
|
+
version_requirement:
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.9.4
|
60
|
+
version:
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
type: :development
|
64
|
+
version_requirement:
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.3.0
|
70
|
+
version:
|
71
|
+
description: Smart and fast code reloader for Sinatra (part of BigBand).
|
72
|
+
email: konstantin.mailinglists@googlemail.com
|
73
|
+
executables: []
|
74
|
+
|
75
|
+
extensions: []
|
76
|
+
|
77
|
+
extra_rdoc_files: []
|
78
|
+
|
79
|
+
files:
|
80
|
+
- lib/sinatra/reloader.rb
|
81
|
+
- spec/sinatra/reloader_spec.rb
|
82
|
+
- spec/spec_helper.rb
|
83
|
+
- README.md
|
84
|
+
has_rdoc: yard
|
85
|
+
homepage: http://github.com/rkh/sinatra-reloader
|
86
|
+
licenses: []
|
87
|
+
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: "0"
|
98
|
+
version:
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.3.1
|
104
|
+
version:
|
105
|
+
requirements: []
|
106
|
+
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 1.3.5
|
109
|
+
signing_key:
|
110
|
+
specification_version: 3
|
111
|
+
summary: Smart and fast code reloader for Sinatra (part of BigBand).
|
112
|
+
test_files: []
|
113
|
+
|