moomerman-rambo 0.4.11 → 0.5.1

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.
@@ -0,0 +1,52 @@
1
+ module Rambo
2
+ class ApplicationContext
3
+ attr_accessor :application_name
4
+
5
+ def initialize(application_name = nil)
6
+ @application_name = application_name
7
+ puts "Initializing application: #{application_name || 'default'}"
8
+ @prefix = "#{self.application_name}/" if self.application_name
9
+ @prefix ||= ''
10
+ load_classes
11
+ end
12
+
13
+ def load_classes
14
+ Dir["#{@prefix}controller/*.rb"].each { |x| funkyload x; }
15
+ Dir["#{@prefix}model/*.rb"].each { |x| funkyload x }
16
+ Dir["#{@prefix}lib/*.rb"].each { |x| funkyload x }
17
+ Dir["#{@prefix}*.rb"].each { |x| funkyload x unless x == 'Rakefile.rb' }
18
+ end
19
+
20
+ def reload
21
+ load_classes
22
+ end
23
+
24
+ def view_path
25
+ "./#{@prefix}view"
26
+ end
27
+
28
+ private
29
+ def funkyload(file)
30
+ @@loadcache ||= {}
31
+ begin
32
+ if cache = @@loadcache[file]
33
+ return if Env.config['rambo'] and Env.config['rambo']['reload_classes'] == false
34
+ if (mtime = File.mtime(file)) > cache
35
+ puts "rambo: reloading: #{file}"
36
+ load file
37
+ @@loadcache[file] = mtime
38
+ end
39
+ else
40
+ puts " -> loading: #{file}"
41
+ load file
42
+ @@loadcache[file] = File.mtime(file)
43
+ end
44
+ rescue Exception => e
45
+ puts "Exception loading class [#{file}]: #{e.message}"
46
+ puts e.backtrace.join("\n")
47
+ raise e
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,25 @@
1
+ module Rambo
2
+ class ApplicationRequest < Rambo::Request
3
+
4
+ def initialize(env)
5
+ super
6
+ end
7
+
8
+ def application
9
+ path_components[1]
10
+ end
11
+
12
+ def controller
13
+ path_components[2] || default_controller
14
+ end
15
+
16
+ def action
17
+ path_components[3] || 'index'
18
+ end
19
+
20
+ def controller_class
21
+ self.application.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase } + '::' + super
22
+ end
23
+
24
+ end
25
+ end
@@ -12,7 +12,7 @@ module Rambo
12
12
  include Params
13
13
  include Redirect
14
14
 
15
- def rendered?
15
+ def already_rendered?
16
16
  @rendered
17
17
  end
18
18
 
@@ -7,24 +7,32 @@ module Template
7
7
  render :erb, template, options, locals
8
8
  end
9
9
 
10
+ def haml(template, options={}, locals={})
11
+ require 'haml' unless defined? ::Haml
12
+ render :haml, template, options, locals
13
+ end
14
+
10
15
  private
11
16
  def render(engine, template, options={}, locals={})
12
17
  # extract generic options
13
18
  layout = options.delete(:layout)
14
19
  layout = :layout if layout.nil? || layout == true
15
- views = options.delete(:views) || "./view"
20
+ views = options.delete(:views) || self.request.application_context.view_path
16
21
  locals = options.delete(:locals) || locals || {}
17
-
22
+
18
23
  # render template
19
- data = lookup_template(engine, template, views)
20
- output = __send__("render_#{engine}", template, data, options, locals)
21
-
24
+ data, options[:filename], options[:line] = lookup_template(engine, template, views)
25
+ output = __send__("render_#{engine}", data, options, locals)
26
+
22
27
  # render layout
23
- if layout && data = lookup_layout(engine, layout, views)
24
- __send__("render_#{engine}", layout, data, options, {}) { output }
25
- else
26
- output
28
+ if layout
29
+ data, options[:filename], options[:line] = lookup_layout(engine, layout, views)
30
+ if data
31
+ output = __send__("render_#{engine}", data, options, locals) { output }
32
+ end
27
33
  end
34
+
35
+ output
28
36
  end
29
37
 
30
38
  def lookup_template(engine, template, views_dir)
@@ -34,14 +42,14 @@ module Template
34
42
  # cached
35
43
  # else
36
44
  path = ::File.join(views_dir, "#{template}.#{engine}")
37
- res = ::File.read(path)
45
+ [ ::File.read(path), path, 1 ]
38
46
  # @@template_cache[template] = res
39
47
  # res
40
48
  #end
41
49
  when Proc
42
- template.call
50
+ [template.call, template, 1]
43
51
  when String
44
- template
52
+ [template, template, 1]
45
53
  else
46
54
  raise ArgumentError
47
55
  end
@@ -53,7 +61,7 @@ module Template
53
61
  nil
54
62
  end
55
63
 
56
- def render_erb(template, data, options, locals, &block)
64
+ def render_erb(data, options, locals, &block)
57
65
  original_out_buf = @_out_buf
58
66
  data = data.call if data.kind_of? Proc
59
67
 
@@ -65,4 +73,8 @@ module Template
65
73
  @_out_buf, result = original_out_buf, @_out_buf
66
74
  result
67
75
  end
76
+
77
+ def render_haml(data, options, locals, &block)
78
+ ::Haml::Engine.new(data, options).render(self, locals, &block)
79
+ end
68
80
  end
@@ -1,3 +1,6 @@
1
+ # Env handles all the configuration loading, database initialization and class (re)loading
2
+ # would be nice to allow the user to specify their own init though if they want
3
+ # Env.new can be called anywhere in any application and therefore acts as a global config
1
4
  module Rambo
2
5
  class Env
3
6
  def self.config
@@ -8,12 +11,16 @@ module Rambo
8
11
  def initialize
9
12
  begin
10
13
  # TODO: config reload
11
-
14
+
15
+ if dbconf = Env.config['mongodb']
16
+ require 'mongomapper'
17
+ @@database ||= MongoMapper.database = dbconf['database']
18
+ end
19
+
12
20
  if dbconf = Env.config['datamapper']
13
21
  require 'dm-core'
14
22
  require 'dm-validations'
15
23
  require 'dm-timestamps'
16
- #DataMapper.setup(:default, 'mysql://localhost/moo_development')
17
24
  @@connection ||= DataMapper.setup(
18
25
  :default,
19
26
  :adapter => :mysql,
@@ -27,38 +34,10 @@ module Rambo
27
34
  rescue Exception => e
28
35
  puts "Exception initializing environment: #{e.message}"
29
36
  puts e.backtrace.join("\n")
37
+ raise e
30
38
  end
31
39
 
32
- Dir["controller/*.rb"].each { |x| funkyload x }
33
- Dir["model/*.rb"].each { |x| funkyload x }
34
- Dir["lib/*.rb"].each { |x| funkyload x }
35
- Dir["*.rb"].each { |x| funkyload x unless x == 'Rakefile.rb' }
36
40
  end
37
41
 
38
- private
39
- # turn this into a thread that checks every x seconds
40
- # (any chance of a callback?) so it is outside of the
41
- # request/response cycle
42
- def funkyload(file)
43
- @@loadcache ||= {}
44
- begin
45
- if cache = @@loadcache[file]
46
- return if Env.config['rambo'] and Env.config['rambo']['reload_classes'] == false
47
- if (mtime = File.mtime(file)) > cache
48
- puts "rambo: reloading: #{file}"
49
- load file
50
- @@loadcache[file] = mtime
51
- end
52
- else
53
- #puts "rambo: loading: #{file}"
54
- load file
55
- @@loadcache[file] = File.mtime(file)
56
- end
57
- rescue Exception => e
58
- puts "Exception loading class [#{file}]: #{e.message}"
59
- puts e.backtrace.join("\n")
60
- end
61
- end
62
-
63
42
  end
64
43
  end
@@ -1,5 +1,5 @@
1
1
  require 'net/http'
2
- require 'right_http_connection'
2
+ #require 'right_http_connection'
3
3
 
4
4
  module Rack
5
5
  class Proxy
@@ -1,3 +1,5 @@
1
+ require 'rack'
2
+
1
3
  module Rambo
2
4
  class Request < Rack::Request
3
5
  def user_agent
@@ -10,11 +12,11 @@ module Rambo
10
12
  end
11
13
 
12
14
  def path
13
- env["REQUEST_PATH"]
15
+ @env["REQUEST_PATH"]
14
16
  end
15
17
 
16
18
  def uri
17
- env["REQUEST_URI"]
19
+ @env["REQUEST_URI"]
18
20
  end
19
21
 
20
22
  def path_components
@@ -22,13 +24,21 @@ module Rambo
22
24
  end
23
25
 
24
26
  def default_controller
25
- if Rambo::Env.config['rambo']
26
- Rambo::Env.config['rambo']['default_controller'] || 'home'
27
+ if rambo_conf = Rambo::Env.config['rambo']
28
+ rambo_conf['default_controller'] || 'home'
27
29
  else
28
30
  'home'
29
31
  end
30
32
  end
31
33
 
34
+ def application_context
35
+ @application_context
36
+ end
37
+
38
+ def application_context=(ctx)
39
+ @application_context = ctx
40
+ end
41
+
32
42
  def controller
33
43
  path_components[1] || default_controller
34
44
  end
@@ -36,7 +46,11 @@ module Rambo
36
46
  def action
37
47
  path_components[2] || 'index'
38
48
  end
39
-
49
+
50
+ def controller_class
51
+ self.controller.downcase.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase } + 'Controller'
52
+ end
53
+
40
54
  # Override Rack 0.9.x's #params implementation (see #72 in lighthouse)
41
55
  def params
42
56
  self.GET.update(self.POST)
@@ -44,4 +58,4 @@ module Rambo
44
58
  self.GET
45
59
  end
46
60
  end
47
- end
61
+ end
@@ -1,52 +1,67 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'thin'
5
-
6
3
  require 'rambo/env'
7
4
  require 'rambo/controller'
8
5
  require 'rambo/middleware'
9
6
  require 'rambo/time'
10
7
  require 'rambo/request'
8
+ require 'rambo/application_request'
11
9
  require 'rambo/response'
10
+ require 'rambo/application_context'
12
11
 
12
+ # Server simply routes the request to the correct controller/action and returns the result
13
13
  module Rambo
14
14
  class Server
15
15
 
16
16
  def initialize(options = {})
17
17
  @options = options
18
+ env = Rambo::Env.new
19
+ @contexts = {
20
+ 'default' => Rambo::ApplicationContext.new(),
21
+ #'blog' => Rambo::ApplicationContext.new('blog')
22
+ }
18
23
  end
19
-
24
+
20
25
  def call(env)
21
26
  begin
22
- Rambo::Env.new
23
-
27
+
28
+ @contexts.each { |key, context| context.reload } if Rambo::Env.config
29
+
24
30
  request = Request.new(env)
25
31
  response = Response.new
26
-
27
- ctl_string = (request.controller.downcase.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase } + 'Controller')
32
+
33
+ if @contexts.keys.include? request.controller.downcase
34
+ current_context = @contexts[request.controller.downcase]
35
+ request = Rambo::ApplicationRequest.new(env)
36
+ end
37
+ current_context ||= @contexts['default']
38
+ request.application_context = current_context
39
+
40
+ #puts "rambo: looking for #{request.controller_class}"
41
+
28
42
  begin
29
- obj = Object.module_eval("::#{ctl_string}", __FILE__, __LINE__).new
43
+ controller = Object.module_eval("::#{request.controller_class}", __FILE__, __LINE__).new
30
44
  rescue Exception => e
31
- return [404, response.header, "<h1>Controller #{ctl_string} Not Found</h1>"]
45
+ return [404, response.header, "<h2>Routing error: controller <span style='color:grey'>#{request.controller}</span> not found</h2>"]
46
+ end
47
+ controller.request = request
48
+ controller.response = response
49
+
50
+ controller.init if controller.respond_to? :init
51
+
52
+ unless controller.respond_to? request.action
53
+ return [404, response.header, "<h2>Routing error: action <span style='color:grey'>#{request.action}</span> not found in <span style='color:grey'>#{request.controller}</span></h2>"]
32
54
  end
33
- obj.request = request
34
- obj.response = response
35
55
 
36
- obj.init if obj.respond_to? :init
56
+ result = controller.send(request.action) unless controller.already_rendered?
37
57
 
38
- #begin
39
- result = obj.send(request.action) unless obj.rendered?
40
- #rescue Exception => e
41
- #return [404, response.header, "<h1>Action #{request.action} Not Found</h1>"]
42
- #end
43
58
  response.body = result if result
44
59
 
45
60
  [response.status, response.header, response.body]
46
61
  rescue Exception => e
47
62
  puts e.message
48
- return [500, response.header, "<pre><b>#{e.message.gsub("<","&lt;")}</b>\n#{e.backtrace.join("\n")}</pre>"]
63
+ return [500, {}, "<pre><b>#{e.message.gsub("<","&lt;")}</b>\n#{e.backtrace.join("\n")}</pre>"]
49
64
  end
50
65
  end
51
66
  end
52
- end
67
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moomerman-rambo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.11
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Taylor
@@ -48,10 +48,13 @@ files:
48
48
  - lib/rambo/middleware/proxy.rb
49
49
  - lib/rambo/request.rb
50
50
  - lib/rambo/response.rb
51
+ - lib/rambo/application_request.rb
52
+ - lib/rambo/application_context.rb
51
53
  - lib/rambo/time.rb
52
54
  - lib/rambo/middleware/upload.rb
53
55
  has_rdoc: false
54
56
  homepage: http://github.com/moomerman/rambo
57
+ licenses:
55
58
  post_install_message:
56
59
  rdoc_options:
57
60
  - --inline-source
@@ -73,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
76
  requirements: []
74
77
 
75
78
  rubyforge_project: rambo
76
- rubygems_version: 1.2.0
79
+ rubygems_version: 1.3.5
77
80
  signing_key:
78
81
  specification_version: 2
79
82
  summary: rambo is an experimental ruby web framework