sinarey 1.0.1 → 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
  SHA1:
3
- metadata.gz: 52320fa050cf68249ee686d1d8a0e08ac28f1905
4
- data.tar.gz: 66a2858bbde53da9b3b81137cf026575d7d073fe
3
+ metadata.gz: 1bee69a3761ccb406bdee2cedbd1cb81d851ceaa
4
+ data.tar.gz: f373640196f44cda768dad4b88d29ae9a02a5a81
5
5
  SHA512:
6
- metadata.gz: b29e990f9e64c1fce9b008ab756f8f6cca957e338e3c78e8b9017f1ec7a6ff171e01ddf15a0c7443ff8eae100e32df4474ad4f6c481f6b52fc04e7045ba40b59
7
- data.tar.gz: b16ba1a755d2b37232017eb21b5cf3425605e4798a81bf602acc4061b0980b83f6764179ce5f46043a84dc68e97444e02ade5e2a4671d5e3c8e3806fc0c47b90
6
+ metadata.gz: 17f7ab80712fa2253221f0e5c864ec9ca3fcb75105497db34d75ee21fece68adb8105d15c834e22e17b12b99a3d1717e165bc2dfba509a15cddfb6f2d1d4ab8f
7
+ data.tar.gz: e8547832624b5abcc05935cf6a8b9ba32588b5397ab063f16a6fe01cfeff1fe008ceb87440f088a99e66b5a13eae8fce76c0de2c0f34215db31278f391b3f044
@@ -58,23 +58,62 @@ module Sinarey
58
58
  end
59
59
  end
60
60
 
61
- def apps_route(verb, path, env)
62
- if turbo_route = (turbo_routes = @turbo_routes[verb]) && turbo_routes[path]
63
- turbo_route.tap do |block_id,app_id|
64
- env['sinarey.router'] = {type: :turbo, block_id: block_id}
65
- status, headers, response = @apps[app_id].call(env)
66
- return status, headers, response
61
+ case ENV["RACK_ENV"]
62
+ when 'development'
63
+
64
+ #development need support sinarey reloader.so here use dev logic.
65
+ def apps_route(verb, path, env)
66
+
67
+ #auto reload modified code
68
+ @apps.each do |index,app|
69
+ app.auto_reload if app.respond_to?(:auto_reload)
70
+ end
71
+
72
+ #rebuild route table
73
+ @turbo_routes = {}
74
+ @routes = {}
75
+ build_routing_table
76
+
77
+ if turbo_route = (turbo_routes = @turbo_routes[verb]) && turbo_routes[path]
78
+ turbo_route.tap do |block_id,app_id|
79
+ env['sinarey.router'] = {type: :turbo, block_id: block_id}
80
+ status, headers, response = @apps[app_id].call(env)
81
+ return status, headers, response
82
+ end
83
+ elsif routes = @routes[verb]
84
+ routes.each do |pattern, keys, conditions, block_id, app_id|
85
+ if match = pattern.match(path)
86
+ env['sinarey.router'] = {type: :normal, match: match, keys: keys, conditions: conditions, block_id: block_id}
87
+ status, headers, response = @apps[app_id].call(env)
88
+ return status, headers, response
89
+ end
90
+ end
67
91
  end
68
- elsif routes = @routes[verb]
69
- routes.each do |pattern, keys, conditions, block_id, app_id|
70
- if match = pattern.match(path)
71
- env['sinarey.router'] = {type: :normal, match: match, keys: keys, conditions: conditions, block_id: block_id}
92
+ nil
93
+ end
94
+
95
+ else
96
+
97
+ def apps_route(verb, path, env)
98
+ if turbo_route = (turbo_routes = @turbo_routes[verb]) && turbo_routes[path]
99
+ turbo_route.tap do |block_id,app_id|
100
+ env['sinarey.router'] = {type: :turbo, block_id: block_id}
72
101
  status, headers, response = @apps[app_id].call(env)
73
102
  return status, headers, response
74
103
  end
104
+ elsif routes = @routes[verb]
105
+ routes.each do |pattern, keys, conditions, block_id, app_id|
106
+ if match = pattern.match(path)
107
+ env['sinarey.router'] = {type: :normal, match: match, keys: keys, conditions: conditions, block_id: block_id}
108
+ status, headers, response = @apps[app_id].call(env)
109
+ return status, headers, response
110
+ end
111
+ end
75
112
  end
113
+ nil
76
114
  end
77
- nil
115
+
78
116
  end
117
+
79
118
  end
80
119
  end
@@ -1,3 +1,3 @@
1
1
  module Sinarey
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
@@ -0,0 +1,254 @@
1
+ require 'sinatra/base'
2
+
3
+ module Sinatra
4
+
5
+ module SinareyReloader
6
+
7
+ class Watcher
8
+
9
+ class Element < Struct.new(:type, :representation)
10
+ end
11
+
12
+ class List
13
+ @app_list_map = Hash.new { |hash, key| hash[key] = new }
14
+
15
+ def self.for(app)
16
+ @app_list_map[app]
17
+ end
18
+
19
+ def initialize
20
+ @path_watcher_map = Hash.new do |hash, key|
21
+ hash[key] = Watcher.new(key)
22
+ end
23
+ end
24
+
25
+ def watch(path, element)
26
+ watcher_for(path).elements << element
27
+ end
28
+
29
+ def ignore(path)
30
+ watcher_for(path).ignore
31
+ end
32
+
33
+ def watcher_for(path)
34
+ @path_watcher_map[File.expand_path(path)]
35
+ end
36
+ alias watch_file watcher_for
37
+
38
+ def watchers
39
+ @path_watcher_map.values
40
+ end
41
+
42
+ def updated
43
+ watchers.find_all(&:updated?)
44
+ end
45
+ end
46
+
47
+ attr_reader :path, :elements, :mtime
48
+
49
+ def initialize(path)
50
+ @path, @elements = path, []
51
+ update
52
+ end
53
+
54
+ def updated?
55
+ !ignore? && !removed? && mtime != File.mtime(path)
56
+ end
57
+
58
+ def update
59
+ @mtime = File.mtime(path)
60
+ end
61
+
62
+ def inline_templates?
63
+ elements.any? { |element| element.type == :inline_templates }
64
+ end
65
+
66
+ def ignore
67
+ @ignore = true
68
+ end
69
+
70
+ def ignore?
71
+ !!@ignore
72
+ end
73
+
74
+ def removed?
75
+ !File.exist?(path)
76
+ end
77
+ end
78
+
79
+ def self.registered(klass)
80
+ @reloader_loaded_in ||= {}
81
+ return if @reloader_loaded_in[klass]
82
+
83
+ @reloader_loaded_in[klass] = true
84
+
85
+ klass.extend BaseMethods
86
+ klass.extend ExtensionMethods
87
+ klass.set(:reload_templates) { true }
88
+
89
+ def klass.auto_reload
90
+ SinareyReloader.perform(settings)
91
+ end
92
+
93
+ klass.before do
94
+ SinareyReloader.perform(klass)
95
+ end
96
+ klass.set(:inline_templates, klass.app_file) if klass == Sinatra::Application
97
+ end
98
+
99
+ def self.perform(klass)
100
+ updated_sum = 0
101
+ Watcher::List.for(klass).updated.each do |watcher|
102
+ updated_sum += 1
103
+ klass.set(:inline_templates, watcher.path) if watcher.inline_templates?
104
+ watcher.elements.each { |element|
105
+ klass.deactivate(element)
106
+ }
107
+ $LOADED_FEATURES.delete(watcher.path)
108
+ require watcher.path
109
+ watcher.update
110
+ end
111
+ return updated_sum
112
+ end
113
+
114
+ def self.thread_safe?
115
+ Thread and Thread.list.size > 1 and Thread.respond_to?(:exclusive)
116
+ end
117
+
118
+ module BaseMethods
119
+ def run!(*args)
120
+ if settings.reloader?
121
+ super unless running?
122
+ else
123
+ super
124
+ end
125
+ end
126
+
127
+ def compile!(verb, path, block, options = {})
128
+ source_location = block.respond_to?(:source_location) ?
129
+ block.source_location.first : caller_files[1]
130
+ signature = super
131
+ watch_element(
132
+ source_location, :route, { :verb => verb, :signature => signature }
133
+ )
134
+ signature
135
+ end
136
+
137
+ def turbo_compile!(verb, path, block, options = {})
138
+ source_location = block.respond_to?(:source_location) ?
139
+ block.source_location.first : caller_files[1]
140
+ signature = super
141
+ watch_element(
142
+ source_location, :turbo_route, { :verb => verb, :path => path, :block_id => signature }
143
+ )
144
+ signature
145
+ end
146
+
147
+ def inline_templates=(file=nil)
148
+ file = (file.nil? || file == true) ?
149
+ (caller_files[1] || File.expand_path($0)) : file
150
+ watch_element(file, :inline_templates)
151
+ super
152
+ end
153
+
154
+ def use(middleware, *args, &block)
155
+ path = caller_files[1] || File.expand_path($0)
156
+ watch_element(path, :middleware, [middleware, args, block])
157
+ super
158
+ end
159
+
160
+ def add_filter(type, path = nil, options = {}, &block)
161
+ source_location = block.respond_to?(:source_location) ?
162
+ block.source_location.first : caller_files[1]
163
+ result = super
164
+ watch_element(source_location, :"#{type}_filter", filters[type].last)
165
+ result
166
+ end
167
+
168
+ def error(*codes, &block)
169
+ path = caller_files[1] || File.expand_path($0)
170
+ result = super
171
+ codes.each do |c|
172
+ watch_element(path, :error, :code => c, :handler => @errors[c])
173
+ end
174
+ result
175
+ end
176
+
177
+ def register(*extensions, &block)
178
+ start_registering_extension
179
+ result = super
180
+ stop_registering_extension
181
+ result
182
+ end
183
+
184
+ def inherited(subclass)
185
+ result = super
186
+ subclass.register Sinatra::SinareyReloader
187
+ result
188
+ end
189
+ end
190
+
191
+ module ExtensionMethods
192
+ def deactivate(element)
193
+ case element.type
194
+ when :route then
195
+ verb = element.representation[:verb]
196
+ signature = element.representation[:signature]
197
+ block_id = signature.last
198
+ (blocks ||= {}).delete(block_id)
199
+ (routes[verb] ||= []).delete(signature)
200
+ when :turbo_route then
201
+ verb = element.representation[:verb]
202
+ path = element.representation[:path]
203
+ block_id = element.representation[:block_id]
204
+ (blocks ||= {}).delete(block_id)
205
+ (turbo_routes[verb] ||= {}).delete(path)
206
+ when :middleware then
207
+ @middleware.delete(element.representation)
208
+ when :before_filter then
209
+ filters[:before].delete(element.representation)
210
+ when :after_filter then
211
+ filters[:after].delete(element.representation)
212
+ when :error then
213
+ code = element.representation[:code]
214
+ handler = element.representation[:handler]
215
+ @errors.delete(code) if @errors[code] == handler
216
+ end
217
+ end
218
+
219
+ def also_reload(*glob)
220
+ Dir[*glob].each { |path| Watcher::List.for(self).watch_file(path) }
221
+ end
222
+
223
+ def dont_reload(*glob)
224
+ Dir[*glob].each { |path| Watcher::List.for(self).ignore(path) }
225
+ end
226
+
227
+ private
228
+
229
+ attr_reader :register_path
230
+
231
+ def start_registering_extension
232
+ @register_path = caller_files[2]
233
+ end
234
+
235
+ def stop_registering_extension
236
+ @register_path = nil
237
+ end
238
+
239
+ def registering_extension?
240
+ !register_path.nil?
241
+ end
242
+
243
+ def watch_element(path, type, representation=nil)
244
+ list = Watcher::List.for(self)
245
+ element = Watcher::Element.new(type, representation)
246
+ list.watch(path, element)
247
+ list.watch(register_path, element) if registering_extension?
248
+ end
249
+ end
250
+ end
251
+
252
+ register SinareyReloader
253
+ Delegator.delegate :also_reload, :dont_reload
254
+ end
data/sinarey.gemspec CHANGED
@@ -10,7 +10,8 @@ Gem::Specification.new 'sinarey',Sinarey::VERSION do |spec|
10
10
  spec.homepage = "https://github.com/maymay25/sinarey"
11
11
  spec.license = "MIT"
12
12
 
13
- spec.files = ['lib/sinarey/version.rb',
13
+ spec.files = ['lib/sinatra/sinarey_reloader.rb',
14
+ 'lib/sinarey/version.rb',
14
15
  'lib/sinarey/base.rb',
15
16
  'lib/sinarey/router.rb',
16
17
  'lib/sinarey.rb',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinarey
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeffrey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-21 00:00:00.000000000 Z
11
+ date: 2014-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -31,6 +31,7 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - lib/sinatra/sinarey_reloader.rb
34
35
  - lib/sinarey/version.rb
35
36
  - lib/sinarey/base.rb
36
37
  - lib/sinarey/router.rb