• R/O
  • SSH
  • HTTPS

tenarai: 提交


Commit MetaInfo

修訂18 (tree)
時間2007-07-29 01:56:20
作者junkikuchi

Log Message

* trunk/lib/tenarai/db/container.rb
* trunk/lib/tenarai/classloader.rb

added DB::Container and ClassLoader.

* trunk/lib/tenarai/service.rb

changed Service staffs to Module.

* trunk/lib/tenarai/server.rb

changed cgi' method implementation.

Change Summary

差異

--- trunk/lib/tenarai/db/container.rb (nonexistent)
+++ trunk/lib/tenarai/db/container.rb (revision 18)
@@ -0,0 +1,44 @@
1+#
2+# Copyright (C) 2007 Jun Kikuchi <kikuchi@bonnou.com>
3+#
4+
5+require 'tenarai/container'
6+require 'tenarai/db/table'
7+
8+module Tenarai
9+ class DB
10+ class Container < Container
11+ def initialize(db, config)
12+ super()
13+
14+ @relations = []
15+
16+ config[:tables].each do |key, val|
17+ self << if name = val[:class]
18+ Tenarai::ClassLoader[name]
19+ else
20+ Tenarai::DB::Table
21+ end.new(db, Tenarai::ClassLoader[val[:row]], key)
22+ end
23+
24+ config[:relations].each do |val|
25+ a = val.shift.split('.')
26+ b = val.shift.split('.')
27+ @relations << Tenarai::DB::Relation.new(
28+ db, fetch(a.shift), a.shift, fetch(b.shift), b.shift
29+ )
30+ end
31+ end
32+
33+ def create
34+ each do |val| val.create end
35+ @relations.each do |val| val.create end
36+ end
37+
38+ def drop
39+ @relations.each do |val| val.drop end
40+ each do |val| val.drop end
41+ end
42+ end
43+ end
44+end
--- trunk/lib/tenarai/classloader.rb (nonexistent)
+++ trunk/lib/tenarai/classloader.rb (revision 18)
@@ -0,0 +1,56 @@
1+#
2+# Copyright (C) 2007 Jun Kikuchi <kikuchi@bonnou.com>
3+#
4+
5+module Tenarai
6+ module ClassLoader
7+ class << self
8+ def dir=(dir)
9+ @dir = dir
10+ end
11+
12+ def dir
13+ @dir ||= './'
14+ end
15+
16+ def repository
17+ @repository ||= {}
18+ end
19+
20+ def extended(mod)
21+ super
22+ self.repository[mod.name] = mod
23+ end
24+
25+ def load_class(class_name)
26+ require self.dir + '/' + class_name.gsub(%r!::!, '/')
27+ end
28+
29+ def [](class_name)
30+ self.load_class(class_name) unless self.repository.key?(class_name)
31+ self.repository[class_name]
32+ end
33+
34+ def load_all(base_dir=nil)
35+ base_dir ||= self.dir
36+
37+ dirs = []
38+ Dir.foreach(base_dir) do |n|
39+ next if %r!^\.!.match(n)
40+
41+ name = base_dir + '/' + n
42+ require name if FileTest.file?(name)
43+ dirs.push(name) if FileTest.directory?(name)
44+ end
45+ dirs.each do |name|
46+ self.load_all(name)
47+ end
48+ end
49+
50+ def each(&block)
51+ self.load_all
52+ self.repository.sort.each(&block)
53+ end
54+ end
55+ end
56+end
--- trunk/lib/tenarai/service.rb (revision 17)
+++ trunk/lib/tenarai/service.rb (revision 18)
@@ -5,64 +5,52 @@
55 require 'tenarai/container'
66
77 module Tenarai
8- class Service
9- class MethodNotFoundError < StandardError; end
8+ module Service
9+ attr_accessor :container
10+ attr_accessor :request
11+ attr_accessor :response
1012
11- attr_reader :name
12-
13- def initialize(name)
14- @name = name
13+ def dispatch(method, params)
14+ __send__(method, *params)
1515 end
1616
17- def dispatch(params)
18- @request = params[:request]
19- @response = params[:response]
20- @method = params[:method]
21- @params = params[:params] || []
22-
23- method = @request.method + '_' + @method
24-
25- raise(
26- MethodNotFoundError,
27- "method '%s' does not found on '%s'(%s) service" % [
28- @method, @name, self.class.name
29- ]
30- ) unless respond_to?(method)
31-
32- __send__(method, *@params)
33- end
34-
35- class Container < Container
17+ module Dispatcher
3618 class ServiceNotFoundError < StandardError; end
19+ class MethodNotFoundError < StandardError; end
3720
3821 attr_accessor :default
39- attr_accessor :error
4022
41- def initialize
42- super
23+ def fetch_service(name)
24+ end
4325
44- @default = nil
45- @error = 'core.dump'
26+ def parse_request(request)
27+ _nil, action, *params = (request['path_info'] || '/').split('/')
28+ name, method = (action || @default).split('.')
4629
47- self << Dump.new('core')
30+ [name, request.method + '_' + method, params]
4831 end
4932
5033 def dispatch(request, response)
51- begin
52- _nil, action, *params = (request['path_info'] || '/').split('/')
53- service, method = (action || @default).split('.')
34+ name, method, params = parse_request(request)
5435
55- unless key?(service)
56- raise ServiceNotFoundError, "service '%s' does not found" % service
57- end
36+ service = fetch_service(name)
5837
59- fetch(service).dispatch(
60- :request => request,
61- :response => response,
62- :method => method,
63- :params => params
64- )
65- end
38+ raise(
39+ ServiceNotFoundError,
40+ "Could not found '%s' service." % name
41+ ) unless service
42+
43+ raise(
44+ MethodNotFoundError,
45+ "Could not found '%s' method on '%s' class." % [
46+ method, service.class.name
47+ ]
48+ ) unless service.respond_to?(method)
49+
50+ service.container = self
51+ service.request = request
52+ service.response = response
53+ service.dispatch(method, params)
6654 end
6755
6856 def to_proc
@@ -70,13 +58,6 @@
7058 begin
7159 dispatch(request, response)
7260 rescue
73- service, method = @error.split('.')
74- fetch(service).dispatch(
75- :request => request,
76- :response => response,
77- :method => method
78- )
79-
8061 $stderr.puts Time.now
8162 $stderr.puts '%s - %s' % [$!.class.name, $!.to_s]
8263 $!.backtrace.each do |val|
@@ -87,7 +68,9 @@
8768 end
8869 end
8970
90- class Dump < Service
71+ module Dump
72+ include Service
73+
9174 def get_dump
9275 require 'tenarai/xml'
9376
--- trunk/lib/tenarai/server.rb (revision 17)
+++ trunk/lib/tenarai/server.rb (revision 18)
@@ -16,7 +16,7 @@
1616
1717 def cgi
1818 require 'tenarai/cgi'
19- Tenarai::CGI.new do |req, res| @handler.call(req, res) end
19+ Tenarai::CGI.new(&@handler)
2020 end
2121
2222 def webrick
Show on old repository browser