srscript 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/srscript.rb +355 -0
  2. metadata +55 -0
data/lib/srscript.rb ADDED
@@ -0,0 +1,355 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # file: srscript.rb
4
+
5
+ #!/usr/bin/ruby
6
+
7
+ require 'sinatra/base'
8
+ require 'rscript'
9
+
10
+ class SRScript < Sinatra::Base
11
+
12
+
13
+ URL_BASE = 'http://rorbuilder.info/r/heroku/' #
14
+
15
+ @@count = 0
16
+ @@rscript = RScript.new()
17
+ @@url_base = 'http://rorbuilder.info/r/heroku/' #
18
+ @@get_routes = {}; @@post_routes = {}
19
+ @@services = {}
20
+ @@templates = {}
21
+ @@app = nil
22
+ @content_type = 'text/html'
23
+
24
+ puts 'ready'
25
+
26
+ def initialize()
27
+ super
28
+ puts 'initialized at ' + Time.now.to_s
29
+ end
30
+
31
+ get '/bootstrap' do
32
+
33
+ doc = Document.new(File.open('server.xml','r').read)
34
+ server_name, url_base = XPath.match(doc.root, 'summary/*/text()').map(&:to_s)
35
+
36
+ url = URL_BASE + 'startup-level1.rsf'
37
+ run_script(url, '//job:bootstrap', server_name, url_base)
38
+ end
39
+
40
+
41
+ get '/' do
42
+ uri, @content_type = @@app.run_projectx('registry', 'get-key', :path => 'system/homepage/uri/text()')
43
+ redirect(uri.to_s)
44
+ end
45
+
46
+
47
+ configure do
48
+ puts 'bootstrapping ... '
49
+ doc = Document.new(File.open('server.xml','r').read)
50
+ localhost = XPath.first(doc.root, 'summary/localhost/text()').to_s
51
+ Thread.new {sleep 8; open(localhost + 'bootstrap', 'UserAgent' => 'srscript')}
52
+ end
53
+
54
+ def run_rcscript(rsf_url, jobs, raw_args=[])
55
+ @@rscript.read([rsf_url, jobs.split(/\s/), raw_args].flatten)
56
+ end
57
+
58
+ def run_script(url, jobs, *qargs)
59
+ result, args = run_rcscript(url, jobs, qargs)
60
+ eval(result)
61
+ end
62
+
63
+ def display_url_run(url, jobs, opts)
64
+ h = {'.xml' => 'text/xml','.html' => 'text/html','.txt' => 'text/plain'}
65
+ @content_type = h[opts[:extension]]
66
+ out = run_script(url, jobs, opts[:args])
67
+
68
+ content_type @content_type, :charset => 'utf-8' if defined? content_type
69
+ out
70
+ end
71
+
72
+ def check_url(url)
73
+ url = URI.parse(url)
74
+ Net::HTTP.start(url.host, url.port) do |http|
75
+ return http.head(url.request_uri).code
76
+ end
77
+ end
78
+
79
+ def package_run(package_id, job, opts={})
80
+ o = {
81
+ :extension => '.html',
82
+ :args => []
83
+ }.merge(opts)
84
+ jobs = "//job:" + job
85
+
86
+ url, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/packages/*[name='#{package_id}']/url/text()").map(&:to_s)
87
+
88
+ url = @@url_base + url[1..-1] if url[/^\//]
89
+
90
+ if url then
91
+ display_url_run(url.to_s.sub(/^#{@@url_base}/,'\0s/open/'),jobs, o)
92
+ else
93
+
94
+ code = check_url(url)
95
+
96
+ if code == '200' then
97
+ url = "%s%s.rsf" % [@@url_base, package_id]
98
+ display_url_run(url,jobs, o)
99
+ else
100
+ # 404
101
+ url = url_base + 'open-uri-error.rsf'
102
+ run_script(url, '//job:with-code', code)
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ get '/' do
109
+ uri, @content_type = @@app.run_projectx('registry', 'get-key', :path => 'system/homepage/uri/text()')
110
+ redirect(uri.to_s)
111
+ end
112
+
113
+ get %r{^\/([a-zA-Z0-9\-]+)$} do
114
+ raw_url, @content_type = @@app.run_projectx('registry', 'get-key', :path => 'system/uri_aliases/url/text()')
115
+ url = raw_url.to_s.clone
116
+
117
+ #url.sub!('http://rscript.rorbuilder.info/','\0s/open/')
118
+ doc = Document.new(open(url, "UserAgent" => "Sinatra-Rscript").read)
119
+
120
+ #url = @@url_base + "alias.xml?passthru=1"
121
+ #doc = Document.new(open(url, "UserAgent" => "Sinatra-Rscript").read)
122
+ node = XPath.first(doc.root, "records/alias[name='#{params[:captures][0]}' and type='r']")
123
+
124
+ if node.nil? and not @@get_routes.has_key? params[:captures][0] then
125
+ url = "%s%s/index.xml" % [@@url_base, params[:captures][0]]
126
+ status = check_url url
127
+
128
+ redirect params[:captures][0] + '/' if status == '200'
129
+ # url = ...
130
+ # redirect url if check_url ""params[:alias] == '200'
131
+ pass
132
+ else
133
+ pass
134
+ end
135
+ uri = node.text('uri').to_s
136
+
137
+ redirect uri
138
+ end
139
+
140
+ get '/:directory/' do
141
+ open("%s%s/index.xml" % [@@url_base, params[:directory]] , 'UserAgent' => 'S-Rscript').read
142
+ end
143
+
144
+ get '/css/:css' do
145
+
146
+ css = params[:css]
147
+ key = 'css/' + css
148
+
149
+ if @@get_routes.has_key? key then
150
+ out, @content_type = @@get_routes[key].call(params)
151
+ @content_type ||= 'text/css'
152
+ content_type @content_type, :charset => 'utf-8'
153
+ out
154
+ else
155
+ rsf_job, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/css/*[name='css/#{css}']/rsf_job/text()")
156
+ if rsf_job then
157
+ redirect rsf_job.to_s
158
+ else
159
+ # 404
160
+ end
161
+ end
162
+ end
163
+
164
+ get '/:form/form' do
165
+
166
+ form = params[:form]
167
+ key = form + '/form'
168
+
169
+ if @@get_routes.has_key? key then
170
+ out, @content_type = @@get_routes[key].call(params)
171
+ @content_type ||= 'text/html'
172
+ content_type @content_type, :charset => 'utf-8'
173
+ out
174
+ else
175
+ rsf_job, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/forms/*[name='#{form}/form']/rsf_job/text()")
176
+ if rsf_job then
177
+ puts 'job found'
178
+ redirect rsf_job.to_s
179
+ else
180
+ # 404
181
+ end
182
+ end
183
+ end
184
+
185
+ get '/:form/form/*' do
186
+
187
+ form = params[:form]
188
+ key = form + '/form'
189
+ args = params[:splat]
190
+
191
+ if @@get_routes.has_key? key then
192
+ out, @content_type = @@get_routes[key].call(params, args)
193
+ @content_type ||= 'text/html'
194
+ content_type @content_type, :charset => 'utf-8'
195
+ out
196
+ else
197
+ rsf_job, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/forms/*[name='#{form}/form']/rsf_job/text()")
198
+ if rsf_job then
199
+ file_path = args.length > 0 ? '/' + args.join('/') : ''
200
+ puts 'form file_path : ' + file_path.to_s
201
+ redirect rsf_job.to_s + file_path
202
+ else
203
+ # 404
204
+ end
205
+ end
206
+ end
207
+
208
+ get '/do/:package_id/:job' do
209
+ package_id = params[:package_id] #
210
+ job, extension = params[:job][/\.\w{3}$/] ? [$`, $&] : [params[:job], '.html']
211
+ package_run(package_id, job, {:extension => extension})
212
+ end
213
+
214
+ get '/view-source/:package_id/:job' do
215
+ package_id = params[:package_id] #
216
+ *jobs = params[:job]
217
+
218
+ #url = "%s%s.rsf" % [url_base, package_id]
219
+ url, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/packages/*[name='#{package_id}']/url/text()")
220
+ if url then
221
+
222
+ #redirect rsf_job.to_s
223
+ buffer = open(url.to_s.sub(/^http:\/\/rscript.rorbuilder.info\//,'\0s/open/'), "UserAgent" => 'Sinatra-Rscript').read
224
+ content_type 'text/plain', :charset => 'utf-8'
225
+ doc = Document.new(buffer)
226
+
227
+ jobs.map!{|x| "@id='%s'" % x}
228
+ doc.root.elements.to_a("//job[#{jobs.join(' or ')}]").map do |job|
229
+ job.to_s
230
+ end
231
+ end
232
+
233
+
234
+ end
235
+
236
+ get '/do/:package_id/:job/*' do
237
+ h = {'.xml' => 'text/xml','.html' => 'text/html','.txt' => 'text/plain'}
238
+ package_id = params[:package_id] #
239
+ job, extension = params[:job][/\.\w{3}$/] ? [$`, $&] : [params[:job], '.html']
240
+ jobs = "//job:" + job
241
+ raw_args = params[:splat]
242
+ args = raw_args.join.split('/')
243
+
244
+ package_run(package_id, job, {:extension => extension, :args => args})
245
+
246
+ end
247
+
248
+ get '/view-source/:package_id' do
249
+ package_id = params[:package_id] #
250
+ #url = "%s%s.rsf" % [url_base, package_id]
251
+ url, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/packages/*[name='#{package_id}']/url/text()")
252
+ if url then
253
+ buffer = open(url.to_s.sub(/^http:\/\/rscript.rorbuilder.info\//,'\0s/open/'), "UserAgent" => 'Sinatra-Rscript').read
254
+ content_type 'text/plain', :charset => 'utf-8'
255
+ buffer
256
+ end
257
+ end
258
+
259
+ get '/do/:package_id/' do
260
+ redirect "/do/r/p/" + params[:package_id]
261
+ end
262
+
263
+
264
+ # projectx request
265
+ get '/p/:project_name/:method_name' do
266
+ project_name = params[:project_name]
267
+ method_name = params[:method_name]
268
+ r, @content_type = @@app.run_projectx(project_name, method_name, request.params)
269
+
270
+ @content_type ||= 'text/html'
271
+ content_type @content_type, :charset => 'utf-8'
272
+ # todo: implement a filter to check for rexml objects to be converted to a string
273
+ r
274
+ end
275
+
276
+
277
+ # projectx request
278
+ get '/p/projectx' do
279
+ xml_project = request.params.to_a[0][1]
280
+ projectx_handler(xml_project)
281
+ end
282
+
283
+ get '/load/:package_id/:job' do
284
+
285
+ package_id = params[:package_id] #
286
+ job, extension = params[:job][/\.\w{3}$/] ? [$`, $&] : [params[:job], '.html']
287
+ load_rsf_job2(package_id, job, route=package_id + '/' + job, extension)
288
+ end
289
+
290
+
291
+
292
+ def follow_route(routes, key)
293
+ if routes.has_key? key then
294
+ routes[key].call(params)
295
+
296
+ else
297
+ route = routes.detect {|k,v| key[/#{k}/]}
298
+
299
+ if route then
300
+ remaining = $'
301
+ if remaining then
302
+ args = remaining.split('/')
303
+ args.shift
304
+ else
305
+ args = []
306
+ end
307
+
308
+ route[1].call( params, args)
309
+
310
+ else
311
+ puts '@@app is ' + @@app.inspect
312
+ out, @content_type = @@app.run_projectx('dir', 'view', {:file_path => key, :passthru => params[:passthru]})
313
+ [out, @content_type]
314
+ #puts "no match"
315
+ end
316
+ end
317
+ end
318
+
319
+ # custom routes
320
+ get '/*' do
321
+ key = params[:splat].join
322
+
323
+ if params.has_key? 'edit' and params[:edit] = '1' then
324
+ # fetch the editor
325
+ # we first need to know the file type
326
+ # open the xml file
327
+ url = @@url_base + key
328
+ buffer = open(url.to_s.sub(/^http:\/\/rscript.rorbuilder.info\//,'\0s/open/'), "UserAgent" => 'Sinatra-Rscript').read
329
+ doc = Document.new(buffer)
330
+ recordx_type = XPath.first(doc.root, 'summary/recordx_type/text()').to_s
331
+ uri, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/recordx_editor/#{recordx_type}/uri/text()")
332
+ editor_url = @@url_base + uri.to_s + '/' + key
333
+
334
+ redirect editor_url
335
+ else
336
+
337
+ out, content_type = follow_route(@@get_routes, key)
338
+ #puts out
339
+ puts 'Content type : ' + content_type unless content_type.nil?
340
+ content_type ||= 'text/html'
341
+ content_type content_type, :charset => 'utf-8'
342
+ out
343
+ end
344
+ end
345
+
346
+ post '/*' do
347
+ key = params[:splat].join
348
+ out, content_type = follow_route(@@post_routes, key)
349
+ #puts 'sss' + out.to_s
350
+ #out = follow_route(@@post_routes, key)
351
+ content_type ||= 'text/html'
352
+ content_type content_type, :charset => 'utf-8'
353
+ out
354
+ end
355
+
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: srscript
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors: []
7
+
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2011-02-21 00:00:00 +00:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email:
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/srscript.rb
26
+ has_rdoc: true
27
+ homepage:
28
+ licenses: []
29
+
30
+ post_install_message:
31
+ rdoc_options: []
32
+
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: "0"
40
+ version:
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ requirements: []
48
+
49
+ rubyforge_project:
50
+ rubygems_version: 1.3.5
51
+ signing_key:
52
+ specification_version: 3
53
+ summary: srscript
54
+ test_files: []
55
+