rack-rscript 0.1.0

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.
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
+