tap-server 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/History +4 -0
  2. data/MIT-LICENSE +17 -15
  3. data/README +2 -11
  4. data/cmd/server.rb +27 -41
  5. data/lib/tap/controller.rb +22 -31
  6. data/lib/tap/controllers/app.rb +20 -116
  7. data/lib/tap/controllers/data.rb +16 -1
  8. data/lib/tap/controllers/server.rb +58 -15
  9. data/lib/tap/generator/generators/controller.rb +23 -0
  10. data/lib/tap/server.rb +75 -53
  11. data/lib/tap/tasks/echo.rb +1 -1
  12. data/templates/tap/generator/generators/controller/resource.erb +14 -0
  13. data/templates/tap/generator/generators/controller/test.erb +0 -0
  14. data/templates/tap/generator/generators/controller/view.erb +1 -0
  15. data/views/configurable/configurations.erb +57 -0
  16. data/views/configurable/default.erb +1 -0
  17. data/views/layout.erb +5 -2
  18. data/views/tap/{task → app/api}/help.erb +6 -4
  19. data/views/tap/controller/help.erb +4 -2
  20. data/views/tap/controllers/app/index.erb +47 -0
  21. data/views/tap/controllers/data/_upload.erb +1 -1
  22. data/views/tap/controllers/data/index.erb +16 -5
  23. data/views/tap/controllers/server/index.erb +10 -33
  24. data/views/tap/signals/signal/get.erb +1 -0
  25. data/views/tap/signals/signal/index.erb +4 -0
  26. data/views/tap/signals/signal/post.erb +1 -0
  27. metadata +18 -26
  28. data/lib/tap/controllers/schema.rb +0 -202
  29. data/lib/tap/server/runner.rb +0 -71
  30. data/public/javascripts/prototype.js +0 -4221
  31. data/public/javascripts/tap.js +0 -112
  32. data/views/configurable/_configs.erb +0 -33
  33. data/views/configurable/_flag.erb +0 -2
  34. data/views/configurable/_list_select.erb +0 -6
  35. data/views/configurable/_select.erb +0 -5
  36. data/views/configurable/_switch.erb +0 -2
  37. data/views/tap/controllers/app/_action.erb +0 -3
  38. data/views/tap/controllers/app/build.erb +0 -18
  39. data/views/tap/controllers/app/enque.erb +0 -13
  40. data/views/tap/controllers/app/info.erb +0 -21
  41. data/views/tap/controllers/app/tail.erb +0 -8
  42. data/views/tap/controllers/data/_index_entry.erb +0 -1
  43. data/views/tap/controllers/schema/_build.erb +0 -6
  44. data/views/tap/controllers/schema/_index_entry.erb +0 -6
  45. data/views/tap/controllers/schema/entry.erb +0 -144
  46. data/views/tap/task/input.erb +0 -17
  47. data/views/tap/tasks/load/input.erb +0 -11
data/History CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.6.0 / 2009-12-3
2
+
3
+ Updated for use with Tap-0.19.0
4
+
1
5
  == 0.5.0 / 2009-06-17
2
6
 
3
7
  * added Extname routes
@@ -1,19 +1,21 @@
1
1
  Copyright (c) 2009, Regents of the University of Colorado.
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of this
4
- software and associated documentation files (the "Software"), to deal in the Software
5
- without restriction, including without limitation the rights to use, copy, modify, merge,
6
- publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7
- to whom the Software is furnished to do so, subject to the following conditions:
3
+ Copyright (c) 2009, Simon Chiang.
8
4
 
9
- The above copyright notice and this permission notice shall be included in all copies or
10
- substantial portions of the Software.
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
11
 
12
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
16
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
17
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19
- OTHER DEALINGS IN THE SOFTWARE.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README CHANGED
@@ -30,20 +30,11 @@ should not be considered stable.
30
30
 
31
31
  == Installation
32
32
 
33
- Tap Server is available as a gem on RubyForge[http://rubyforge.org/projects/tap]. Use:
33
+ Tap Server is available as a gem on Gemcutter[http://gemcutter.org/gems/tap-server].
34
34
 
35
35
  % gem install tap-server
36
-
37
- Tap requires an updated version of RubyGems[http://docs.rubygems.org/]
38
- (>= 1.2.0). To check the version and update RubyGems:
39
-
40
- % gem --version
41
- % gem --update system
42
36
 
43
37
  == Info
44
38
 
45
- Copyright (c) 2009, Regents of the University of Colorado.
46
- Developer:: {Simon Chiang}[http://bahuvrihi.wordpress.com], {Biomolecular Structure Program}[http://biomol.uchsc.edu/], {Hansen Lab}[http://hsc-proteomics.uchsc.edu/hansenlab/]
47
- Support:: CU Denver School of Medicine Deans Academic Enrichment Fund
39
+ Developer:: {Simon Chiang}[http://bahuvrihi.wordpress.com]
48
40
  License:: {MIT-Style}[link:files/MIT-LICENSE.html]
49
-
@@ -3,52 +3,38 @@
3
3
  # Initializes a tap server.
4
4
  #
5
5
 
6
- require 'tap'
7
6
  require 'tap/server'
8
7
 
9
- env = Tap::Env.instance
10
8
  app = Tap::App.instance
9
+ opts = ConfigParser.new(app.config)
10
+ opts.separator ""
11
+ opts.separator "configurations:"
12
+ opts.add(Tap::Server.configurations)
13
+ opts.add(Tap::App.configurations)
11
14
 
12
- begin
13
- opts = ConfigParser.new('env' => env, 'app' => app)
14
- opts.separator ""
15
- opts.separator "configurations:"
16
- opts.add(Tap::Server.configurations)
17
-
18
- opts.separator ""
19
- opts.separator "options:"
20
-
21
- opts.on('--config FILE', 'Specifies a config file') do |config_file|
22
- opts.config.merge! Configurable::Utils.load_file(config_file)
23
- end
24
-
25
- opts.on("-h", "--help", "Show this message") do
26
- puts Lazydoc.usage(__FILE__)
27
- puts opts
28
- exit
29
- end
30
-
31
- # (note defaults are not added so they will not
32
- # conflict with string keys from a config file)
33
- args = opts.parse!(ARGV, :clear_config => false, :add_defaults => false)
34
-
35
- if args.empty?
36
- args << 'server'
37
- end
38
-
39
- controller = env[:controller][args.shift]
40
-
41
- unless args.empty?
42
- warn "ignoring args: #{args.inspect}"
43
- end
44
-
45
- Tap::Server.new(controller, opts.nested_config).run!
46
- rescue
47
- raise if $DEBUG
48
- puts $!.message
49
- exit(1)
15
+ opts.separator ""
16
+ opts.separator "options:"
17
+
18
+ opts.on('--config FILE', 'Specifies a config file') do |config_file|
19
+ opts.config.merge! Configurable::Utils.load_file(config_file)
50
20
  end
51
21
 
52
- exit(0)
22
+ opts.on("-h", "--help", "Show this message") do
23
+ puts Lazydoc.usage(__FILE__)
24
+ puts opts
25
+ exit
26
+ end
27
+
28
+ # (note defaults are not added so they will not
29
+ # conflict with string keys from a config file)
30
+ args = opts.parse!(ARGV, :clear_config => false, :add_defaults => false)
53
31
 
32
+ server = Tap::Server.new(opts.nested_config)
33
+ server.bind(args.shift || 'tap-server:server')
54
34
 
35
+ unless args.empty?
36
+ warn "ignoring args: #{args.inspect}"
37
+ end
38
+
39
+ server.run!
40
+ exit(0)
@@ -26,14 +26,9 @@ module Tap
26
26
  def inherited(child) # :nodoc:
27
27
  super
28
28
 
29
- unless child.instance_variable_defined?(:@source_file)
30
- caller[0] =~ Lazydoc::CALLER_REGEXP
31
- child.instance_variable_set(:@source_file, File.expand_path($1))
32
- end
33
-
34
29
  set_variables.each do |variable|
35
30
  value = get(variable)
36
- value = value.dup if Configurable::Delegate.duplicable_value?(value)
31
+ value = value.dup if Configurable::Config.duplicable_value?(value)
37
32
  child.set(variable, value)
38
33
  end
39
34
 
@@ -146,10 +141,9 @@ module Tap
146
141
  # not be actions in subclasses.
147
142
  set :define_action, false
148
143
 
144
+ # References the Tap::Server running this controller.
149
145
  attr_accessor :server
150
146
 
151
- attr_accessor :controller_path
152
-
153
147
  # A Rack::Request wrapping env, set during call.
154
148
  attr_accessor :request
155
149
 
@@ -160,7 +154,7 @@ module Tap
160
154
 
161
155
  # Initializes a new instance of self.
162
156
  def initialize
163
- @request = @response = @server = @controller_path = nil
157
+ @request = @response = @server = nil
164
158
  end
165
159
 
166
160
  # Returns true if action is registered as an action for self.
@@ -174,7 +168,7 @@ module Tap
174
168
  # these to the uri.
175
169
  def uri(action=nil, params=nil, options=nil)
176
170
  if action.kind_of?(Hash)
177
- unless params == nil && options == nil
171
+ unless params.nil? && options.nil?
178
172
  raise "extra arguments specified for uri hash syntax"
179
173
  end
180
174
 
@@ -185,9 +179,8 @@ module Tap
185
179
 
186
180
  uri = []
187
181
 
188
- if controller_path
189
- uri << '/'
190
- uri << controller_path
182
+ if request
183
+ uri << request.env['SCRIPT_NAME']
191
184
  end
192
185
 
193
186
  if action
@@ -195,7 +188,7 @@ module Tap
195
188
  uri << action
196
189
  end
197
190
 
198
- unless params == nil || params.empty?
191
+ unless params.nil? || params.empty?
199
192
  uri << '?'
200
193
  uri << build_query(params)
201
194
  end
@@ -217,14 +210,6 @@ module Tap
217
210
  uri.join
218
211
  end
219
212
 
220
- def template_path(path)
221
- server.env.path(:views, path) {|file| File.file?(file) }
222
- end
223
-
224
- def module_path(path, klass=self.class)
225
- server.env.module_path(:views, klass.ancestors, path) {|file| File.file?(file) }
226
- end
227
-
228
213
  # Routes the request to an action and returns the response. Routing is
229
214
  # simple and fixed (see route):
230
215
  #
@@ -253,8 +238,6 @@ module Tap
253
238
  #
254
239
  def call(env)
255
240
  @server = env['tap.server']
256
- @controller_path = env['tap.controller_path']
257
-
258
241
  @request = Rack::Request.new(env)
259
242
  @response = Rack::Response.new
260
243
 
@@ -269,8 +252,8 @@ module Tap
269
252
  end
270
253
  end
271
254
 
272
- # Returns the action, args, and extname for the request.path_info. Routing
273
- # is simple and fixed:
255
+ # Returns the action, args, and extname for the request.path_info.
256
+ # Routing is simple and fixed:
274
257
  #
275
258
  # route returns
276
259
  # / [:index, []]
@@ -284,6 +267,7 @@ module Tap
284
267
  route
285
268
  end
286
269
 
270
+ # Inputs a route like [action, *args] and dispatches it to the action.
287
271
  def dispatch(route)
288
272
  action, *args = route
289
273
 
@@ -292,7 +276,7 @@ module Tap
292
276
  end
293
277
 
294
278
  unless action?(action)
295
- raise ServerError.new("404 Error: page not found", 404)
279
+ not_found
296
280
  end
297
281
 
298
282
  send(action, *args)
@@ -314,9 +298,9 @@ module Tap
314
298
  when options[:file]
315
299
  options[:file]
316
300
  when options[:template]
317
- self.template_path(options[:template])
301
+ server.template_path(options[:template])
318
302
  else
319
- self.module_path(path)
303
+ server.module_path(path, self.class)
320
304
  end
321
305
 
322
306
  unless template_path
@@ -379,8 +363,7 @@ module Tap
379
363
  end
380
364
 
381
365
  def module_render(path, obj, options={})
382
- obj = obj.class unless obj.kind_of?(Module)
383
- options[:file] = module_path(path, obj) || module_path(path)
366
+ options[:file] = server.module_path(path, obj.class)
384
367
 
385
368
  locals = options[:locals] ||= {}
386
369
  locals[:obj] ||= obj
@@ -398,6 +381,14 @@ module Tap
398
381
  response.finish
399
382
  end
400
383
 
384
+ def not_found
385
+ error("404 Error: page not found", 404)
386
+ end
387
+
388
+ def error(msg, status=500)
389
+ raise ServerError.new(msg, status)
390
+ end
391
+
401
392
  private
402
393
 
403
394
  # Generates an empty binding to self without any locals assigned.
@@ -1,135 +1,39 @@
1
1
  require 'tap/controller'
2
- require 'tap/controllers/schema'
3
2
 
4
3
  module Tap
5
4
  module Controllers
6
5
 
7
- # :startdoc::controller builds and runs workflows
6
+ # :startdoc::controller dispatches signals to an app
8
7
  class App < Tap::Controller
9
- set :default_action, :info
8
+ include RestRoutes
10
9
 
11
- nest :schema, Schema do
12
- def dispatch(route)
13
- route.unshift rest_action(route)
14
- super(route)
15
- end
16
- end
17
-
18
- # Returns the state of app.
19
- def state
20
- app.state.to_s
21
- end
22
-
23
- # Returns the controls and current application info.
24
- def info
25
- render 'info.erb', :locals => {
26
- :actions => [:run, :stop, :terminate, :reset],
27
- }, :layout => true
28
- end
29
-
30
- # Runs app on a separate thread (on post).
31
- def run
32
- if request.post?
33
- server.thread ||= Thread.new { app.run; server.thread = nil; }
34
- end
35
-
36
- redirect uri(:info)
37
- end
38
-
39
- def reset
40
- app.reset if request.post?
41
- redirect uri(:info)
42
- end
43
-
44
- # Stops app (on post).
45
- def stop
46
- app.stop if request.post?
47
- redirect uri(:info)
48
- end
49
-
50
- # Teminates app (on post).
51
- def terminate
52
- app.terminate if request.post?
53
- redirect uri(:info)
10
+ def route
11
+ unescape(request.path_info)
54
12
  end
55
13
 
56
- def build
57
- schema = request[:schema] || server.data.read(:schema, request[:id])
58
-
59
- unless request.post?
60
- return render('build.erb', :schema => schema, :layout => true)
14
+ def dispatch(route)
15
+ if route == "/"
16
+ return render('index.erb', :layout => true)
61
17
  end
62
18
 
63
- schema = Tap::Schema.load(schema).resolve! do |type, key, data|
64
- server.env.manifest(type)[key]
65
- end.validate!
66
-
67
- if request[:reset] == "on"
68
- app.reset
69
- end
19
+ route =~ Tap::Parser::SIGNAL
20
+ signal = app.route($1, $2)
70
21
 
71
- tasks.merge!(server.env.build(schema, app))
72
-
73
- if request[:run] == "on"
74
- run
22
+ request_method = request.request_method
23
+ case request_method
24
+ when /GET/i
25
+ module_render('get.erb', signal)
26
+ when /POST/i
27
+ result = signal.call(request.params)
28
+ module_render('post.erb', signal, :locals => {:result => result})
75
29
  else
76
- redirect uri(:enque)
30
+ error("cannot signal via: #{request_method}")
77
31
  end
78
32
  end
79
33
 
80
- def enque
81
- unless request.post?
82
- return render('enque.erb', :layout => true)
83
- end
84
-
85
- queue = if request[:load]
86
- YAML.load(request[:queue] || "{}")
87
- else
88
- request[:queue] || {}
89
- end
90
-
91
- queue.each do |(key, inputs)|
92
- unless task = tasks[key]
93
- raise "no task for: #{key}"
94
- end
95
- app.enq(task, *inputs)
96
- end
97
-
98
- redirect uri(:info)
99
- end
100
-
101
- def tail(id)
102
- unless data.has?("#{id}.log")
103
- raise Tap::ServerError.new("invalid id: #{id}", 404)
104
- end
105
-
106
- path = data.path("#{id}.log")
107
- pos = request['pos'].to_i
108
- if pos > File.size(path)
109
- raise Tap::ServerError.new("tail position out of range (try update)", 500)
110
- end
111
-
112
- content = File.open(path) do |file|
113
- file.pos = pos
114
- file.read
115
- end
116
-
117
- if request.post?
118
- content
119
- else
120
- render('tail.erb', :locals => {
121
- :id => id,
122
- :path => File.basename(path),
123
- :update => true,
124
- :content => content
125
- }, :layout => true)
126
- end
127
- end
128
-
129
- protected
130
-
131
- def tasks
132
- app.cache[:tasks] ||= {}
34
+ def uri(obj, sig=nil)
35
+ obj, sig = nil, obj unless sig
36
+ super(obj ? "#{obj}/#{sig}" : sig)
133
37
  end
134
38
 
135
39
  def app