rack-rscript 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/rack-rscript.rb +86 -0
  2. metadata +56 -0
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: rack-rscript.rb
4
+
5
+
6
+ require 'rscript'
7
+ require 'app-routes'
8
+
9
+ class RackRscript
10
+ include AppRoutes
11
+
12
+ def initialize(raw_opts={})
13
+
14
+ opts = {logfile: '', logrotate: 'daily', pkg_src: ''}.merge(raw_opts)
15
+ @url_base = opts[:pkg_src] # web server serving the RSF files
16
+ @url_base += '/' unless @url_base[-1] == '/'
17
+ @log = false
18
+
19
+ if opts[:logfile].length > 0 then
20
+ @log = true
21
+ @logger = Logger.new(opts[:logfile], opts[:logrotate])
22
+ end
23
+
24
+ super() # required for app-routes initialize method to exectue
25
+ default_routes(@params)
26
+ end
27
+
28
+ def call(env)
29
+ request = env['REQUEST_URI'][/https?:\/\/[^\/]+(.*)/,1]
30
+
31
+ log Time.now.to_s + ": " + request
32
+ content, content_type, status_code = run_route(request)
33
+ content, status_code = "404: page not found", 404 if content.nil?
34
+
35
+ content_type ||= 'text/html'
36
+ status_code ||= 200
37
+ [status_code, {"Content-Type" => content_type}, [content]]
38
+ end
39
+
40
+ private
41
+
42
+ def default_routes(params)
43
+
44
+ get '/do/:package/:job' do |package,job|
45
+ run_job("%s%s.rsf" % [@url_base, package], "//job:" + job, params)
46
+ end
47
+
48
+ get '/do/:package/:job/*' do |package, job|
49
+ raw_args = params[:splat]
50
+ args = raw_args.join.split('/')[1..-1]
51
+ run_job("%s%s.rsf" % [@url_base, package], "//job:" + job, params, args)
52
+ end
53
+ end
54
+
55
+ def run_job(url, jobs, params={}, *qargs)
56
+ if params[:splat] and params[:splat].length > 0 then
57
+ h = params[:splat].first[1..-1].split('&').inject({}) do |r,x|
58
+ k, v = x.split('=')
59
+ r.merge(k.to_sym => v)
60
+ end
61
+ params.merge! h
62
+ end
63
+
64
+ result, args = RScript.new.read([url, jobs.split(/\s/), \
65
+ qargs].flatten)
66
+ rws = self
67
+
68
+ begin
69
+ r = eval result
70
+ @params = {}
71
+ return r
72
+
73
+ rescue Exception => e
74
+
75
+ err_label = e.message.to_s + " :: \n" + e.backtrace.join("\n")
76
+ log(err_label)
77
+ ($!).to_s
78
+ end
79
+ end
80
+
81
+ def log(msg)
82
+ if @log == true then
83
+ @logger.debug msg
84
+ end
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-rscript
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - James Robertson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-02-26 00:00:00 +00:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description:
18
+ email:
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - lib/rack-rscript.rb
27
+ has_rdoc: true
28
+ homepage:
29
+ licenses: []
30
+
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ requirements: []
49
+
50
+ rubyforge_project:
51
+ rubygems_version: 1.5.2
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: Rack-Rscript is a light-weight alternative to Sinatra-Rscript.
55
+ test_files: []
56
+