Module: Innate::SingletonMethods
- Included in:
- Innate
- Defined in:
- lib/innate.rb,
lib/innate/node.rb,
lib/innate/route.rb,
lib/innate/state.rb,
lib/innate/dynamap.rb
Overview
Constant Summary collapse
- PROXY_OPTIONS =
{ :port => 'adapter.port', :host => 'adapter.host', :adapter => 'adapter.handler' }
Instance Method Summary collapse
-
#at(location) ⇒ Object
Answer with object at
location
. -
#call(env, mode = ) ⇒ Array
Treat Innate like a rack application, pass the rack
env
and optionally themode
the application runs in. - #defer ⇒ Object
-
#go_figure_root(backtrace, options) ⇒ Object
Either setting will surpress the warning that might show up on startup and tells you it couldn’t find an explicit root.
-
#map(location, object = nil, &block) ⇒ Object
Maps the given
object
orblock
tolocation
,object
must respond to #call in order to be of any use. - #middleware(mode = , &block) ⇒ Object
- #middleware!(mode = , &block) ⇒ Object
- #middleware_recompile(mode = ) ⇒ Object
-
#node(location, node = nil) ⇒ Class, Module
Convenience method to include the Node module into
node
and map to alocation
. -
#node_from_backtrace(backtrace) ⇒ Class, Module
Cheap hack that works reasonably well to avoid passing self all the time to Innate::node We simply search the file that Innate::node was called in for the first class definition above the line that Innate::node was called and look up the constant.
- #Rewrite(key, value = nil, &block) ⇒ Object
- #Route(key, value = nil, &block) ⇒ Object
- #setup_dependencies ⇒ Object
-
#start(options = {}, &block) {|MiddlewareCompiler| ... } ⇒ nil
The method that starts the whole business.
- #start!(mode = ) ⇒ Object
- #stop(wait = 3) ⇒ Object
-
#sync(&block) ⇒ Object
Use this method to achieve thread-safety for sensitive operations.
- #teardown_dependencies ⇒ Object
-
#to(object) ⇒ Object
Returns one of the paths the given
object
is mapped to.
Instance Method Details
#at(location) ⇒ Object
Answer with object at location
.
78 79 80 |
# File 'lib/innate/dynamap.rb', line 78 def at(location) DynaMap.at(location) end |
#call(env, mode = ) ⇒ Array
Treat Innate like a rack application, pass the rack env
and optionally the mode
the application runs in.
160 161 162 |
# File 'lib/innate.rb', line 160 def call(env, mode = [:mode]) middleware(mode).call(env) end |
#defer ⇒ Object
18 19 20 21 22 23 24 25 |
# File 'lib/innate/state.rb', line 18 def defer outer = ::Thread.current ::Thread.new{ inner = ::Thread.current outer.keys.each{|k| inner[k] = outer[k] } yield } end |
#go_figure_root(backtrace, options) ⇒ Object
Either setting will surpress the warning that might show up on startup and tells you it couldn’t find an explicit root.
In case these options are not passed we will try to figure out a file named ‘start.rb` in the process’ working directory and assume it’s a valid point.
186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/innate.rb', line 186 def go_figure_root(backtrace, ) if root = [:root] root elsif file = [:file] File.dirname(file) elsif File.file?('start.rb') Dir.pwd else root = File.dirname(backtrace[0][/^(.*?):\d+/, 1]) Log.warn "No explicit root folder found, assuming it is #{root}" root end end |
#map(location, object = nil, &block) ⇒ Object
Maps the given object
or block
to location
, object
must respond to #call in order to be of any use.
64 65 66 |
# File 'lib/innate/dynamap.rb', line 64 def map(location, object = nil, &block) DynaMap.map(location, object || block) end |
#middleware(mode = , &block) ⇒ Object
164 165 166 |
# File 'lib/innate.rb', line 164 def middleware(mode = [:mode], &block) [:middleware_compiler].build(mode, &block) end |
#middleware!(mode = , &block) ⇒ Object
168 169 170 |
# File 'lib/innate.rb', line 168 def middleware!(mode = [:mode], &block) [:middleware_compiler].build!(mode, &block) end |
#middleware_recompile(mode = ) ⇒ Object
172 173 174 |
# File 'lib/innate.rb', line 172 def middleware_recompile(mode = [:mode]) [:middleware_compiler]::COMPILED[mode].compile! end |
#node(location, node = nil) ⇒ Class, Module
Convenience method to include the Node module into node
and map to a location
.
1028 1029 1030 1031 1032 1033 |
# File 'lib/innate/node.rb', line 1028 def node(location, node = nil) node ||= node_from_backtrace(caller) node.__send__(:include, Node) node.map(location) node end |
#node_from_backtrace(backtrace) ⇒ Class, Module
Cheap hack that works reasonably well to avoid passing self all the time to Innate::node We simply search the file that Innate::node was called in for the first class definition above the line that Innate::node was called and look up the constant. If there are any problems with this (filenames containing ‘:’ or metaprogramming) just pass the node parameter explicitly to Innate::node
1050 1051 1052 1053 1054 1055 |
# File 'lib/innate/node.rb', line 1050 def node_from_backtrace(backtrace) filename, lineno = backtrace[0].split(':', 2) regexp = /^\s*class\s+(\S+)/ File.readlines(filename)[0..lineno.to_i].reverse.find{|ln| ln =~ regexp } const_get($1) end |
#Rewrite(key, value = nil, &block) ⇒ Object
110 111 112 |
# File 'lib/innate/route.rb', line 110 def Rewrite(key, value = nil, &block) Rewrite[key] = value || block end |
#Route(key, value = nil, &block) ⇒ Object
106 107 108 |
# File 'lib/innate/route.rb', line 106 def Route(key, value = nil, &block) Route[key] = value || block end |
#setup_dependencies ⇒ Object
144 145 146 |
# File 'lib/innate.rb', line 144 def setup_dependencies [:setup].each{|obj| obj.setup if obj.respond_to?(:setup) } end |
#start(options = {}, &block) {|MiddlewareCompiler| ... } ⇒ nil
The method that starts the whole business.
Call Innate.start after you defined your application.
Usually, this is a blocking call and will not return until the adapter has finished, which usually happens when you kill the application or hit ^C.
We do return if options.started is true, which indicates that all you wanted to do is setup the environment and update options.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/innate.rb', line 106 def start( = {}, &block) root, file = .delete(:root), .delete(:file) = Innate. found_root = go_figure_root(caller, :root => root, :file => file) .roots = [*found_root] if found_root # Convert some top-level option keys to the internal ones that we use. PROXY_OPTIONS.each{|given, proxy| [proxy] = [given] } .delete_if{|key, value| PROXY_OPTIONS[key] || value.nil? } # Merge the user's given options into our existing set, which contains defaults. .merge!() setup_dependencies middleware!(.mode, &block) if block_given? return if .started .started = true signal = .trap trap(signal){ stop(10) } if signal start! end |
#start!(mode = ) ⇒ Object
132 133 134 |
# File 'lib/innate.rb', line 132 def start!(mode = [:mode]) Adapter.start(middleware(mode)) end |
#stop(wait = 3) ⇒ Object
136 137 138 139 140 141 142 |
# File 'lib/innate.rb', line 136 def stop(wait = 3) Log.info("Shutdown within #{wait} seconds") Timeout.timeout(wait){ teardown_dependencies } Timeout.timeout(wait){ exit } ensure exit! end |
#sync(&block) ⇒ Object
Use this method to achieve thread-safety for sensitive operations.
This should be of most use when manipulating files to prevent other threads from doing the same, no other code will be scheduled during execution of this method.
14 15 16 |
# File 'lib/innate/state.rb', line 14 def sync(&block) SEMAPHORE.synchronize(&block) end |
#teardown_dependencies ⇒ Object
148 149 150 |
# File 'lib/innate.rb', line 148 def teardown_dependencies [:setup].each{|obj| obj.teardown if obj.respond_to?(:teardown) } end |
#to(object) ⇒ Object
Returns one of the paths the given object
is mapped to.
92 93 94 |
# File 'lib/innate/dynamap.rb', line 92 def to(object) DynaMap.to(object) end |