dao 2.2.3 → 3.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.
- data/Rakefile +68 -113
- data/TODO +3 -9
- data/a.rb +25 -0
- data/dao.gemspec +70 -14
- data/lib/dao.rb +8 -8
- data/lib/dao/api.rb +1 -0
- data/lib/dao/api/context.rb +48 -23
- data/lib/dao/api/dsl.rb +1 -1
- data/lib/dao/api/interfaces.rb +149 -117
- data/lib/dao/api/modes.rb +24 -23
- data/lib/dao/api/routes.rb +9 -0
- data/lib/dao/data.rb +9 -2
- data/lib/dao/errors.rb +15 -11
- data/lib/dao/form.rb +46 -37
- data/lib/dao/interface.rb +1 -1
- data/lib/dao/mode.rb +45 -20
- data/lib/dao/params.rb +35 -53
- data/lib/dao/path.rb +6 -9
- data/lib/dao/rails/lib/generators/dao/templates/api.rb +1 -1
- data/lib/dao/rails/lib/generators/dao/templates/dao_helper.rb +16 -0
- data/lib/dao/result.rb +26 -133
- data/lib/dao/route.rb +87 -0
- data/lib/dao/status.rb +96 -94
- data/lib/dao/support.rb +5 -3
- data/lib/dao/validations.rb +46 -442
- data/lib/dao/validations/base.rb +68 -0
- data/lib/dao/validations/common.rb +463 -0
- data/test/dao_test.rb +214 -33
- metadata +20 -112
- data/lib/dao/rails/app/api.rb +0 -55
- data/lib/dao/rails/app/controllers/api_controller.rb +0 -99
- data/sample/rails_app/Gemfile +0 -33
- data/sample/rails_app/Gemfile.lock +0 -88
- data/sample/rails_app/README +0 -1
- data/sample/rails_app/Rakefile +0 -7
- data/sample/rails_app/app/api.rb +0 -55
- data/sample/rails_app/app/controllers/api_controller.rb +0 -99
- data/sample/rails_app/app/controllers/application_controller.rb +0 -3
- data/sample/rails_app/app/helpers/application_helper.rb +0 -2
- data/sample/rails_app/app/views/layouts/application.html.erb +0 -14
- data/sample/rails_app/config.ru +0 -4
- data/sample/rails_app/config/application.rb +0 -51
- data/sample/rails_app/config/boot.rb +0 -13
- data/sample/rails_app/config/database.yml +0 -22
- data/sample/rails_app/config/environment.rb +0 -5
- data/sample/rails_app/config/environments/development.rb +0 -26
- data/sample/rails_app/config/environments/production.rb +0 -49
- data/sample/rails_app/config/environments/test.rb +0 -35
- data/sample/rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/sample/rails_app/config/initializers/inflections.rb +0 -10
- data/sample/rails_app/config/initializers/mime_types.rb +0 -5
- data/sample/rails_app/config/initializers/secret_token.rb +0 -7
- data/sample/rails_app/config/initializers/session_store.rb +0 -8
- data/sample/rails_app/config/locales/en.yml +0 -5
- data/sample/rails_app/config/routes.rb +0 -62
- data/sample/rails_app/db/development.sqlite3 +0 -0
- data/sample/rails_app/db/seeds.rb +0 -7
- data/sample/rails_app/doc/README_FOR_APP +0 -2
- data/sample/rails_app/log/development.log +0 -27
- data/sample/rails_app/log/production.log +0 -0
- data/sample/rails_app/log/server.log +0 -0
- data/sample/rails_app/log/test.log +0 -0
- data/sample/rails_app/pubic/javascripts/dao.js +0 -148
- data/sample/rails_app/public/404.html +0 -26
- data/sample/rails_app/public/422.html +0 -26
- data/sample/rails_app/public/500.html +0 -26
- data/sample/rails_app/public/favicon.ico +0 -0
- data/sample/rails_app/public/images/rails.png +0 -0
- data/sample/rails_app/public/index.html +0 -239
- data/sample/rails_app/public/javascripts/application.js +0 -2
- data/sample/rails_app/public/javascripts/controls.js +0 -965
- data/sample/rails_app/public/javascripts/dragdrop.js +0 -974
- data/sample/rails_app/public/javascripts/effects.js +0 -1123
- data/sample/rails_app/public/javascripts/prototype.js +0 -6001
- data/sample/rails_app/public/javascripts/rails.js +0 -175
- data/sample/rails_app/public/robots.txt +0 -5
- data/sample/rails_app/script/rails +0 -6
- data/sample/rails_app/test/performance/browsing_test.rb +0 -9
- data/sample/rails_app/test/test_helper.rb +0 -13
data/lib/dao/params.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
module Dao
|
2
2
|
class Params < ::Map
|
3
|
-
|
3
|
+
# mixins
|
4
|
+
#
|
5
|
+
include Validations::Mixin
|
4
6
|
|
7
|
+
# class methods
|
8
|
+
#
|
5
9
|
class << Params
|
6
10
|
def parse(prefix, params = {}, options = {})
|
7
11
|
prefix = prefix.to_s
|
@@ -60,64 +64,42 @@ module Dao
|
|
60
64
|
end
|
61
65
|
end
|
62
66
|
|
63
|
-
|
64
|
-
|
65
|
-
attr_accessor :params
|
67
|
+
# instance methods
|
68
|
+
#
|
66
69
|
attr_accessor :result
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
params
|
82
|
-
end
|
83
|
-
|
84
|
-
def path
|
85
|
-
result.path if result
|
86
|
-
end
|
87
|
-
|
88
|
-
def status(*args)
|
89
|
-
result.status(*args) if result
|
90
|
-
end
|
91
|
-
def status=(value)
|
92
|
-
result.status=value if result
|
70
|
+
attr_accessor :route
|
71
|
+
attr_accessor :path
|
72
|
+
attr_accessor :status
|
73
|
+
attr_accessor :errors
|
74
|
+
attr_accessor :validations
|
75
|
+
attr_accessor :form
|
76
|
+
|
77
|
+
def initialize(*args, &block)
|
78
|
+
@path = Path.default
|
79
|
+
@status = Status.default
|
80
|
+
@errors = Errors.new
|
81
|
+
@validations = Validations.for(self)
|
82
|
+
@form = Form.for(self)
|
83
|
+
super
|
93
84
|
end
|
94
85
|
|
95
|
-
|
96
|
-
|
86
|
+
# look good for inspect
|
87
|
+
#
|
88
|
+
def inspect
|
89
|
+
::JSON.pretty_generate(self, :max_nesting => 0)
|
97
90
|
end
|
98
91
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
def validates(*args, &block)
|
104
|
-
result.validates(*args, &block) if result
|
105
|
-
end
|
106
|
-
|
107
|
-
def validate(*args, &block)
|
108
|
-
result.validate(*args, &block) if result
|
109
|
-
end
|
92
|
+
# support updates with dao-ish objects
|
93
|
+
#
|
94
|
+
add_conversion_method!(:to_dao)
|
95
|
+
add_conversion_method!(:as_dao)
|
110
96
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
97
|
+
def update(*args, &block)
|
98
|
+
if args.size==1 and args.first.respond_to?(:to_dao)
|
99
|
+
to_dao = args.first.to_dao
|
100
|
+
return super(to_dao)
|
101
|
+
end
|
102
|
+
super
|
117
103
|
end
|
118
104
|
end
|
119
|
-
|
120
|
-
def Dao.parse(*args, &block)
|
121
|
-
Params.process(*args, &block)
|
122
|
-
end
|
123
105
|
end
|
data/lib/dao/path.rb
CHANGED
@@ -3,7 +3,13 @@ module Dao
|
|
3
3
|
class Error < ::StandardError; end
|
4
4
|
class Error::Params < Error; end
|
5
5
|
|
6
|
+
# class methods
|
7
|
+
#
|
6
8
|
class << Path
|
9
|
+
def default
|
10
|
+
Path.for(:dao)
|
11
|
+
end
|
12
|
+
|
7
13
|
def for(*args)
|
8
14
|
new(absolute_path_for(*args))
|
9
15
|
end
|
@@ -21,15 +27,6 @@ module Dao
|
|
21
27
|
('/' + paths_for(arg, *args).join('/')).squeeze('/')
|
22
28
|
end
|
23
29
|
|
24
|
-
def cast(*args)
|
25
|
-
if args.size == 1
|
26
|
-
value = args.first
|
27
|
-
value.is_a?(self) ? value : self.for(value)
|
28
|
-
else
|
29
|
-
self.for(*args)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
30
|
def params?(string)
|
34
31
|
string.to_s =~ %r{/:[^/]+}
|
35
32
|
end
|
@@ -7,5 +7,21 @@ module DaoHelper
|
|
7
7
|
result.error!
|
8
8
|
end
|
9
9
|
end
|
10
|
+
|
11
|
+
def dao(path, params, mode = nil)
|
12
|
+
unless mode
|
13
|
+
case request.method
|
14
|
+
when "GET"
|
15
|
+
mode = :read
|
16
|
+
when "PUT", "POST", "DELETE"
|
17
|
+
mode = :write
|
18
|
+
else
|
19
|
+
# do nothing - the user must specificy the mode explicity
|
20
|
+
end
|
21
|
+
end
|
22
|
+
result = api.send(mode, path, params)
|
23
|
+
result.route = request.fullpath
|
24
|
+
result
|
25
|
+
end
|
10
26
|
end
|
11
27
|
ApplicationController.send(:include, DaoHelper)
|
data/lib/dao/result.rb
CHANGED
@@ -1,151 +1,44 @@
|
|
1
1
|
module Dao
|
2
2
|
class Result < ::Map
|
3
|
-
include Dao::InstanceExec
|
4
|
-
|
5
|
-
attr_accessor :api
|
6
|
-
attr_accessor :interface
|
7
|
-
attr_accessor :mode
|
8
|
-
attr_accessor :params
|
9
|
-
attr_accessor :validations
|
10
|
-
attr_accessor :presenter
|
11
|
-
attr_accessor :form
|
12
|
-
attr_accessor :forcing_validity
|
13
|
-
|
14
|
-
def Result.for(*args, &block)
|
15
|
-
new(*args, &block)
|
16
|
-
end
|
17
|
-
|
18
3
|
def initialize(*args, &block)
|
19
4
|
options = Dao.options_for!(args)
|
20
|
-
args.push('/dao') if args.empty?
|
21
|
-
|
22
|
-
path_args = args.select{|arg| arg.is_a?(String) or args.is_a?(Symbol)}
|
23
|
-
data_args = args.select{|arg| arg.is_a?(Hash)}
|
24
|
-
data_args += [options[:data]] if options.has_key?(:data)
|
25
|
-
|
26
|
-
path = Path.for(*path_args)
|
27
|
-
status = Status.ok
|
28
|
-
errors = Errors.new
|
29
|
-
data = Data.new
|
30
5
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
mode = options[:mode] || (api ? api.mode : Mode.default)
|
6
|
+
self.path = args.shift || options[:path] || Path.default
|
7
|
+
self.route = options[:route] || Route.default
|
8
|
+
self.mode = options[:mode] || Mode.default
|
9
|
+
self.status = options[:status] || Status.default
|
10
|
+
self.errors = options[:errors] || Errors.new
|
11
|
+
self.params = options[:params] || Params.new
|
12
|
+
self.data = options[:data] || Data.new
|
39
13
|
|
40
14
|
params.result = self
|
41
|
-
path =
|
42
|
-
|
43
|
-
|
44
|
-
validations = Validations.for(self)
|
45
|
-
presenter = Presenter.for(self)
|
46
|
-
|
47
|
-
self[:path] = path
|
48
|
-
self[:status] = status
|
49
|
-
self[:mode] = mode
|
50
|
-
self[:errors] = errors
|
51
|
-
self[:data] = data
|
52
|
-
|
53
|
-
@api = api
|
54
|
-
@interface = interface
|
55
|
-
@params = params
|
56
|
-
@form = form
|
57
|
-
@validations = validations
|
58
|
-
@presenter = presenter
|
59
|
-
@forcing_validity = false
|
60
|
-
end
|
61
|
-
|
62
|
-
def path
|
63
|
-
self[:path]
|
64
|
-
end
|
65
|
-
|
66
|
-
def status(*args)
|
67
|
-
self[:status] = Status.for(*args) unless args.empty?
|
68
|
-
self[:status]
|
69
|
-
end
|
70
|
-
def status=(value)
|
71
|
-
status(value)
|
72
|
-
end
|
73
|
-
|
74
|
-
def mode(*args)
|
75
|
-
self[:mode] = Mode.for(*args) unless args.empty?
|
76
|
-
self[:mode]
|
77
|
-
end
|
78
|
-
def mode=(value)
|
79
|
-
mode(value)
|
80
|
-
end
|
81
|
-
|
82
|
-
def errors
|
83
|
-
self[:errors]
|
84
|
-
end
|
85
|
-
|
86
|
-
def data
|
87
|
-
self[:data]
|
88
|
-
end
|
89
|
-
|
90
|
-
def is_valid=(boolean)
|
91
|
-
@is_valid = !!boolean
|
92
|
-
end
|
93
|
-
|
94
|
-
def is_valid(*bool)
|
95
|
-
@is_valid ||= nil
|
96
|
-
@is_valid = !!bool.first unless bool.empty?
|
97
|
-
@is_valid
|
98
|
-
end
|
99
|
-
|
100
|
-
def valid!
|
101
|
-
@forcing_validity = true
|
102
|
-
end
|
103
|
-
|
104
|
-
def valid?(*args)
|
105
|
-
if @forcing_validity
|
106
|
-
true
|
107
|
-
else
|
108
|
-
options = Dao.options_for!(args)
|
109
|
-
validate unless validations.ran?
|
110
|
-
validate if options[:validate]
|
111
|
-
errors.empty? and status.ok?
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def validate(*args, &block)
|
116
|
-
if !args.empty?
|
117
|
-
validations.add(*args, &block)
|
118
|
-
else
|
119
|
-
validations.run
|
120
|
-
status(420) if(status.ok? and !errors.empty?)
|
121
|
-
errors.empty? and status.ok?
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def validate!(*args, &block)
|
126
|
-
if !args.empty?
|
127
|
-
validations.add(*args, &block)
|
128
|
-
end
|
129
|
-
@forcing_validity = false
|
130
|
-
validations.run!
|
131
|
-
status(420) if(status.ok? and !errors.empty?)
|
132
|
-
throw(:result, nil) unless(errors.empty? and status.ok?)
|
133
|
-
end
|
134
|
-
|
135
|
-
def validates(*args, &block)
|
136
|
-
validations.add(*args, &block)
|
15
|
+
params.path = self.path
|
16
|
+
params.status = self.status
|
17
|
+
params.errors = self.errors
|
137
18
|
end
|
138
19
|
|
139
20
|
def error!
|
140
21
|
raise Dao::Error::Result.for(self)
|
141
22
|
end
|
142
23
|
|
143
|
-
|
144
|
-
|
145
|
-
end
|
146
|
-
|
24
|
+
# look good for inspect
|
25
|
+
#
|
147
26
|
def inspect
|
148
27
|
::JSON.pretty_generate(self, :max_nesting => 0)
|
149
28
|
end
|
29
|
+
|
30
|
+
# delegate some methods to the params
|
31
|
+
#
|
32
|
+
Validations::Mixin.list.each do |method|
|
33
|
+
module_eval <<-__, __FILE__, __LINE__
|
34
|
+
def #{ method }(*args)
|
35
|
+
params.send(#{ method.inspect }, *args)
|
36
|
+
end
|
37
|
+
__
|
38
|
+
end
|
39
|
+
|
40
|
+
def form
|
41
|
+
params.form
|
42
|
+
end
|
150
43
|
end
|
151
44
|
end
|
data/lib/dao/route.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
module Dao
|
2
|
+
class Route < ::String
|
3
|
+
Default = '/index'.freeze
|
4
|
+
|
5
|
+
class << Route
|
6
|
+
def default
|
7
|
+
Default
|
8
|
+
end
|
9
|
+
|
10
|
+
def like?(route)
|
11
|
+
route.to_s =~ %r{/:[^/]+}
|
12
|
+
end
|
13
|
+
|
14
|
+
def keys_for(route)
|
15
|
+
route = Path.absolute_path_for(route.to_s)
|
16
|
+
route.scan(%r{/:[^/]+}).map{|key| key.sub(%r{^/:}, '')}
|
17
|
+
end
|
18
|
+
|
19
|
+
def pattern_for(route)
|
20
|
+
route = Path.absolute_path_for(route.to_s)
|
21
|
+
re = route.gsub(%r{/:[^/]+}, '/([^/]+)')
|
22
|
+
/#{ re }/ioux
|
23
|
+
end
|
24
|
+
|
25
|
+
def path_for(route, params = {})
|
26
|
+
path = Path.absolute_path_for(route.to_s)
|
27
|
+
params = Map.new(params)
|
28
|
+
params.each do |key, val|
|
29
|
+
re = %r{/:#{ Regexp.escape(key.to_s) }(\Z|/)}
|
30
|
+
repl = "/#{ val.to_s }\\1"
|
31
|
+
path.gsub!(re, repl)
|
32
|
+
end
|
33
|
+
path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_accessor :keys
|
38
|
+
attr_accessor :pattern
|
39
|
+
|
40
|
+
def initialize(path)
|
41
|
+
replace(path.to_s)
|
42
|
+
@keys = Route.keys_for(self).freeze
|
43
|
+
@pattern = Route.pattern_for(self).freeze
|
44
|
+
freeze
|
45
|
+
end
|
46
|
+
|
47
|
+
def path
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def path_for(params)
|
52
|
+
Route.path_for(self, params)
|
53
|
+
end
|
54
|
+
|
55
|
+
def match(path)
|
56
|
+
match = pattern.match(path).to_a
|
57
|
+
end
|
58
|
+
|
59
|
+
def params_for(path)
|
60
|
+
match = pattern.match(path).to_a
|
61
|
+
if match
|
62
|
+
map = Map.new
|
63
|
+
ignored = match.shift
|
64
|
+
@keys.each_with_index do |key, index|
|
65
|
+
map[key] = match[index]
|
66
|
+
end
|
67
|
+
map
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class List < ::Array
|
72
|
+
def add(path)
|
73
|
+
route = Route.new(path)
|
74
|
+
push(route)
|
75
|
+
route
|
76
|
+
end
|
77
|
+
|
78
|
+
def match(name)
|
79
|
+
each do |route|
|
80
|
+
match = route.match(name)
|
81
|
+
return route if match
|
82
|
+
end
|
83
|
+
return nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/lib/dao/status.rb
CHANGED
@@ -61,13 +61,91 @@ module Dao
|
|
61
61
|
}
|
62
62
|
) unless defined?(Code2Message)
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
64
|
+
Groups = ({
|
65
|
+
100 => 'instruction',
|
66
|
+
200 => 'success',
|
67
|
+
300 => 'redirection',
|
68
|
+
400 => 'client_error',
|
69
|
+
500 => 'server_error'
|
70
|
+
}) unless defined?(Groups)
|
71
|
+
|
72
|
+
# class methods
|
73
|
+
#
|
74
|
+
class << Status
|
75
|
+
def list
|
76
|
+
@list ||= Symbol2Code.sort_by{|sym, code| code}.map{|sym, code| send(sym)}
|
77
|
+
end
|
78
|
+
|
79
|
+
def underscore(camel_cased_word)
|
80
|
+
camel_cased_word.to_s.gsub(/::/, '/').
|
81
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
82
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
83
|
+
#gsub(/\s+/, '').
|
84
|
+
tr("-", "_").
|
85
|
+
downcase
|
86
|
+
end
|
87
|
+
|
88
|
+
def default
|
89
|
+
Status.for(200)
|
90
|
+
end
|
91
|
+
|
92
|
+
def for(*args)
|
93
|
+
if args.size >= 2
|
94
|
+
code = args.shift
|
95
|
+
message = args.join(' ')
|
96
|
+
new(code, message)
|
97
|
+
else
|
98
|
+
arg = args.shift
|
99
|
+
case arg
|
100
|
+
when Result
|
101
|
+
result = arg
|
102
|
+
if arg.errors.nil? or arg.errors.empty? or arg.valid?
|
103
|
+
new(200)
|
104
|
+
else
|
105
|
+
new(500)
|
106
|
+
end
|
107
|
+
when Status
|
108
|
+
arg
|
109
|
+
when Fixnum
|
110
|
+
code = arg
|
111
|
+
message = Code2Message[code]
|
112
|
+
new(code, message)
|
113
|
+
when Symbol, String
|
114
|
+
if arg.to_s =~ %r/^\d+$/
|
115
|
+
code = arg.to_i
|
116
|
+
else
|
117
|
+
sym = Status.underscore(arg).to_sym
|
118
|
+
code = Symbol2Code[sym]
|
119
|
+
end
|
120
|
+
if code
|
121
|
+
message = Code2Message[code]
|
122
|
+
else
|
123
|
+
code = 500
|
124
|
+
message = "Unknown Status #{ arg }"
|
125
|
+
end
|
126
|
+
new(code, message)
|
127
|
+
else
|
128
|
+
if arg.respond_to?(:code) and arg.respond_to?(:message)
|
129
|
+
code, message = arg.code, arg.message
|
130
|
+
new(code, message)
|
131
|
+
else
|
132
|
+
parse(arg)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def parse(string)
|
139
|
+
first, last = string.to_s.strip.split(%r/\s+/, 2)
|
140
|
+
if first =~ %r/^\d+$/
|
141
|
+
code = Integer(first)
|
142
|
+
message = last
|
143
|
+
else
|
144
|
+
code = 500
|
145
|
+
message = "Unknown Status #{ string.inspect }"
|
146
|
+
end
|
147
|
+
new(code, message)
|
148
|
+
end
|
71
149
|
end
|
72
150
|
|
73
151
|
Symbol2Code = (
|
@@ -80,16 +158,22 @@ module Dao
|
|
80
158
|
Symbol2Code.each do |sym, code|
|
81
159
|
module_eval <<-__
|
82
160
|
def Status.#{ sym }()
|
83
|
-
@#{ sym } ||= Status.for(:#{ sym })
|
161
|
+
@#{ sym } ||= Status.for(:#{ sym }).freeze
|
84
162
|
end
|
85
163
|
__
|
86
164
|
end
|
87
165
|
|
166
|
+
# instance methods
|
167
|
+
#
|
88
168
|
attr :code
|
89
169
|
attr :message
|
90
170
|
attr :group
|
91
171
|
|
92
172
|
def initialize(*args)
|
173
|
+
update(*args)
|
174
|
+
end
|
175
|
+
|
176
|
+
def update(*args)
|
93
177
|
code, message =
|
94
178
|
if args.size == 2
|
95
179
|
[args.first, args.last]
|
@@ -101,18 +185,10 @@ module Dao
|
|
101
185
|
@group = (@code / 100) * 100
|
102
186
|
replace("#{ @code } #{ @message }".strip)
|
103
187
|
end
|
104
|
-
|
105
|
-
Groups = ({
|
106
|
-
100 => 'instruction',
|
107
|
-
200 => 'success',
|
108
|
-
300 => 'redirection',
|
109
|
-
400 => 'client_error',
|
110
|
-
500 => 'server_error'
|
111
|
-
}) unless defined?(Groups)
|
188
|
+
alias_method('set', 'update')
|
112
189
|
|
113
190
|
Groups.each do |code, group|
|
114
191
|
module_eval <<-__, __FILE__, __LINE__ -1
|
115
|
-
|
116
192
|
def Status.#{ group }
|
117
193
|
@status_group_#{ group } ||= Status.for(#{ code })
|
118
194
|
end
|
@@ -120,23 +196,18 @@ module Dao
|
|
120
196
|
def #{ group }?()
|
121
197
|
#{ code } == @group
|
122
198
|
end
|
123
|
-
|
124
199
|
__
|
125
200
|
end
|
126
201
|
|
127
|
-
def Status.list
|
128
|
-
@list ||= Symbol2Code.sort_by{|sym, code| code}.map{|sym, code| send(sym)}
|
129
|
-
end
|
130
|
-
|
131
202
|
def good?
|
132
203
|
@group < 400
|
133
204
|
end
|
134
|
-
alias_method
|
205
|
+
alias_method('ok?', 'good?')
|
135
206
|
|
136
207
|
def bad?
|
137
208
|
@group >= 400
|
138
209
|
end
|
139
|
-
alias_method
|
210
|
+
alias_method('error?', 'bad?')
|
140
211
|
|
141
212
|
def =~(other)
|
142
213
|
begin
|
@@ -163,75 +234,6 @@ module Dao
|
|
163
234
|
def to_json(*args, &block)
|
164
235
|
Map[:code, code, :message, message].to_json(*args, &block)
|
165
236
|
end
|
166
|
-
|
167
|
-
class << Status
|
168
|
-
def for(*args)
|
169
|
-
if args.size >= 2
|
170
|
-
code = args.shift
|
171
|
-
message = args.join(' ')
|
172
|
-
new(code, message)
|
173
|
-
else
|
174
|
-
arg = args.shift
|
175
|
-
case arg
|
176
|
-
when Result
|
177
|
-
result = arg
|
178
|
-
if arg.errors.nil? or arg.errors.empty? or arg.valid?
|
179
|
-
new(200)
|
180
|
-
else
|
181
|
-
new(500)
|
182
|
-
end
|
183
|
-
when Status
|
184
|
-
arg
|
185
|
-
when Fixnum
|
186
|
-
code = arg
|
187
|
-
message = Code2Message[code]
|
188
|
-
new(code, message)
|
189
|
-
when Symbol, String
|
190
|
-
if arg.to_s =~ %r/^\d+$/
|
191
|
-
code = arg.to_i
|
192
|
-
else
|
193
|
-
sym = Status.underscore(arg).to_sym
|
194
|
-
code = Symbol2Code[sym]
|
195
|
-
end
|
196
|
-
if code
|
197
|
-
message = Code2Message[code]
|
198
|
-
else
|
199
|
-
code = 500
|
200
|
-
message = "Unknown Status #{ arg }"
|
201
|
-
end
|
202
|
-
new(code, message)
|
203
|
-
else
|
204
|
-
if arg.respond_to?(:code) and arg.respond_to?(:message)
|
205
|
-
code, message = arg.code, arg.message
|
206
|
-
new(code, message)
|
207
|
-
else
|
208
|
-
parse(arg)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def parse(string)
|
215
|
-
first, last = string.to_s.strip.split(%r/\s+/, 2)
|
216
|
-
if first =~ %r/^\d+$/
|
217
|
-
code = Integer(first)
|
218
|
-
message = last
|
219
|
-
else
|
220
|
-
code = 500
|
221
|
-
message = "Unknown Status #{ string.inspect }"
|
222
|
-
end
|
223
|
-
new(code, message)
|
224
|
-
end
|
225
|
-
|
226
|
-
def cast(*args)
|
227
|
-
if args.size == 1
|
228
|
-
value = args.first
|
229
|
-
value.is_a?(self) ? value : self.for(value)
|
230
|
-
else
|
231
|
-
self.for(*args)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
235
237
|
end
|
236
238
|
|
237
239
|
def Dao.status(*args, &block)
|
@@ -243,8 +245,8 @@ module Dao
|
|
243
245
|
end
|
244
246
|
end
|
245
247
|
|
246
|
-
__END__
|
247
248
|
|
249
|
+
__END__
|
248
250
|
|
249
251
|
### ref: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
|
250
252
|
|