dao 2.2.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/api/modes.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Dao
|
3
2
|
class Api
|
4
3
|
class << Api
|
@@ -13,34 +12,37 @@ module Dao
|
|
13
12
|
end
|
14
13
|
|
15
14
|
def add_mode(mode)
|
16
|
-
|
17
|
-
|
18
|
-
module_eval(<<-__, __FILE__, __LINE__ - 1)
|
15
|
+
mode = Mode.for(mode)
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
unless modes.include?(mode)
|
18
|
+
module_eval(<<-__, __FILE__, __LINE__ - 1)
|
19
|
+
def #{ mode }(*args, &block)
|
20
|
+
if args.empty?
|
21
|
+
if catching_results?
|
22
|
+
if self.mode.case_of?(Mode.for(#{ mode.inspect }))
|
23
|
+
mode(#{ mode.inspect }, &block)
|
24
|
+
return!
|
25
|
+
end
|
26
|
+
else
|
24
27
|
mode(#{ mode.inspect }, &block)
|
25
|
-
return!
|
26
28
|
end
|
27
29
|
else
|
28
|
-
mode(#{ mode.inspect }
|
29
|
-
|
30
|
-
|
31
|
-
mode(#{ mode.inspect }) do
|
32
|
-
call(*args, &block)
|
30
|
+
mode(#{ mode.inspect }) do
|
31
|
+
call(*args, &block)
|
32
|
+
end
|
33
33
|
end
|
34
34
|
end
|
35
|
-
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
__
|
36
|
+
def #{ mode }?(&block)
|
37
|
+
mode?(#{ mode.inspect }, &block)
|
38
|
+
end
|
39
|
+
__
|
42
40
|
|
43
|
-
|
41
|
+
modes.push(mode)
|
42
|
+
mode
|
43
|
+
else
|
44
|
+
false
|
45
|
+
end
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
@@ -70,8 +72,7 @@ module Dao
|
|
70
72
|
end
|
71
73
|
|
72
74
|
def mode?(mode, &block)
|
73
|
-
condition = self.mode
|
74
|
-
|
75
|
+
condition = mode.case_of?(self.mode)
|
75
76
|
if block.nil?
|
76
77
|
condition
|
77
78
|
else
|
data/lib/dao/data.rb
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
module Dao
|
2
2
|
class Data < ::Map
|
3
|
+
# look good for inspect
|
4
|
+
#
|
5
|
+
def inspect
|
6
|
+
::JSON.pretty_generate(self, :max_nesting => 0)
|
7
|
+
end
|
8
|
+
|
9
|
+
# support updates with dao-ish objects
|
10
|
+
#
|
3
11
|
add_conversion_method!(:to_dao)
|
4
12
|
add_conversion_method!(:as_dao)
|
5
13
|
|
6
14
|
def update(*args, &block)
|
7
15
|
if args.size==1 and args.first.respond_to?(:to_dao)
|
8
16
|
to_dao = args.first.to_dao
|
9
|
-
|
10
|
-
return(to_dao)
|
17
|
+
return super(to_dao)
|
11
18
|
end
|
12
19
|
super
|
13
20
|
end
|
data/lib/dao/errors.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
1
|
module Dao
|
2
2
|
class Errors < ::Map
|
3
|
+
# for html generation
|
4
|
+
#
|
3
5
|
include Tagz.globally
|
4
6
|
|
5
7
|
class << Errors
|
6
8
|
include Tagz.globally
|
7
9
|
end
|
8
10
|
|
11
|
+
# you can tweak these if you want
|
12
|
+
#
|
9
13
|
Global = '*' unless defined?(Global)
|
10
|
-
Separator = '⇒' unless defined?(Separator)
|
14
|
+
#Separator = '⇒' unless defined?(Separator)
|
15
|
+
Separator = "\342\207\222" unless defined?(Separator) ### this is an "Open-outlined rightward arrow" - http://en.wikipedia.org/wiki/List_of_Unicode_characters#Supplemental_arrows-A
|
11
16
|
|
17
|
+
|
18
|
+
# string message support class - knows when it's sticky...
|
19
|
+
#
|
12
20
|
class Message < ::String
|
13
21
|
attr_accessor :sticky
|
14
22
|
|
@@ -28,6 +36,8 @@ module Dao
|
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
39
|
+
# class methods
|
40
|
+
#
|
31
41
|
class << Errors
|
32
42
|
def global_key
|
33
43
|
[Global]
|
@@ -36,17 +46,10 @@ module Dao
|
|
36
46
|
def for(*args, &block)
|
37
47
|
new(*args, &block)
|
38
48
|
end
|
39
|
-
|
40
|
-
def cast(*args)
|
41
|
-
if args.size == 1
|
42
|
-
value = args.first
|
43
|
-
value.is_a?(self) ? value : self.for(value)
|
44
|
-
else
|
45
|
-
self.for(*args)
|
46
|
-
end
|
47
|
-
end
|
48
49
|
end
|
49
50
|
|
51
|
+
# instance methods
|
52
|
+
#
|
50
53
|
def add(*args)
|
51
54
|
options = Dao.map_for(args.last.is_a?(Hash) ? args.pop : {})
|
52
55
|
sticky = options[:sticky]
|
@@ -113,7 +116,6 @@ module Dao
|
|
113
116
|
clone
|
114
117
|
end
|
115
118
|
|
116
|
-
|
117
119
|
def update(other, options = {})
|
118
120
|
options = Dao.map_for(options)
|
119
121
|
prefix = Array(options[:prefix]).flatten.compact
|
@@ -197,6 +199,8 @@ module Dao
|
|
197
199
|
select{|message| not message.strip.empty?}
|
198
200
|
end
|
199
201
|
|
202
|
+
# html generation methods
|
203
|
+
#
|
200
204
|
def to_html(*args)
|
201
205
|
Errors.to_html(errors=self, *args)
|
202
206
|
end
|
data/lib/dao/form.rb
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
module Dao
|
2
2
|
class Form
|
3
|
+
# for html generation
|
4
|
+
#
|
3
5
|
include Tagz.globally
|
4
6
|
|
7
|
+
class << Form
|
8
|
+
include Tagz.globally
|
9
|
+
end
|
10
|
+
|
11
|
+
# class methods
|
12
|
+
#
|
5
13
|
class << Form
|
6
14
|
def for(*args, &block)
|
7
15
|
new(*args, &block)
|
8
16
|
end
|
9
|
-
|
10
|
-
def cast(*args)
|
11
|
-
if args.size == 1
|
12
|
-
value = args.first
|
13
|
-
value.is_a?(self) ? value : self.for(value)
|
14
|
-
else
|
15
|
-
self.for(*args)
|
16
|
-
end
|
17
|
-
end
|
18
17
|
end
|
19
18
|
|
20
|
-
|
19
|
+
# instance methods
|
20
|
+
#
|
21
|
+
attr_accessor :map
|
21
22
|
|
22
23
|
def initialize(*args, &block)
|
23
|
-
@
|
24
|
-
super
|
25
|
-
end
|
26
|
-
|
27
|
-
def data
|
28
|
-
result.data
|
24
|
+
@map = args.first.is_a?(Map) ? args.shift : Map.new
|
29
25
|
end
|
30
26
|
|
31
27
|
def errors
|
32
|
-
|
28
|
+
@map.errors
|
33
29
|
end
|
34
30
|
|
35
|
-
def
|
36
|
-
|
31
|
+
def path
|
32
|
+
@map.path
|
37
33
|
end
|
38
34
|
|
35
|
+
|
36
|
+
|
37
|
+
# html generation methods
|
38
|
+
#
|
39
39
|
def form(*args, &block)
|
40
40
|
options = Dao.map_for(args.last.is_a?(Hash) ? args.pop : {})
|
41
41
|
keys = args.flatten
|
@@ -87,9 +87,9 @@ module Dao
|
|
87
87
|
|
88
88
|
value =
|
89
89
|
if block.nil? and !options.has_key?(:value)
|
90
|
-
value_for(
|
90
|
+
value_for(@map, keys)
|
91
91
|
else
|
92
|
-
block ? block.call(
|
92
|
+
block ? block.call(@map.get(keys)) : options.delete(:value)
|
93
93
|
end
|
94
94
|
|
95
95
|
input_(options_for(options, :type => type, :name => name, :value => value, :class => klass, :id => id, :data_error => error)){}
|
@@ -119,9 +119,9 @@ module Dao
|
|
119
119
|
|
120
120
|
value =
|
121
121
|
if block.nil? and !options.has_key?(:value)
|
122
|
-
value_for(
|
122
|
+
value_for(@map, keys)
|
123
123
|
else
|
124
|
-
block ? block.call(
|
124
|
+
block ? block.call(@map.get(keys)) : options.delete(:value)
|
125
125
|
end
|
126
126
|
|
127
127
|
button_(options_for(options, :type => type, :name => name, :value => value, :class => klass, :id => id, :data_error => error)){}
|
@@ -145,9 +145,9 @@ module Dao
|
|
145
145
|
|
146
146
|
value =
|
147
147
|
if block.nil? and !options.has_key?(:value)
|
148
|
-
value_for(
|
148
|
+
value_for(@map, keys)
|
149
149
|
else
|
150
|
-
block ? block.call(
|
150
|
+
block ? block.call(@map.get(keys)) : options.delete(:value)
|
151
151
|
end
|
152
152
|
|
153
153
|
textarea_(options_for(options, :name => name, :class => klass, :id => id, :data_error => error)){ value.to_s }
|
@@ -159,12 +159,13 @@ module Dao
|
|
159
159
|
|
160
160
|
name = options.delete(:name) || name_for(keys)
|
161
161
|
from = options.delete(:from) || options.delete(:options)
|
162
|
+
blank = options.delete(:blank)
|
162
163
|
|
163
164
|
selected =
|
164
165
|
if options.has_key?(:selected)
|
165
166
|
options.delete(:selected)
|
166
167
|
else
|
167
|
-
value_for(
|
168
|
+
value_for(@map, keys)
|
168
169
|
end
|
169
170
|
|
170
171
|
id = options.delete(:id) || id_for(keys)
|
@@ -176,7 +177,7 @@ module Dao
|
|
176
177
|
if from.nil?
|
177
178
|
key = keys.map{|key| "#{ key }"}
|
178
179
|
key.last << "_options"
|
179
|
-
from =
|
180
|
+
from = @map.get(*key) if @map.has?(*key)
|
180
181
|
end
|
181
182
|
|
182
183
|
list = Array(from)
|
@@ -190,6 +191,15 @@ module Dao
|
|
190
191
|
list.map!{|element| [element, element]}
|
191
192
|
end
|
192
193
|
|
194
|
+
case blank
|
195
|
+
when nil, false
|
196
|
+
nil
|
197
|
+
when true
|
198
|
+
list.push(nil)
|
199
|
+
else
|
200
|
+
list.unshift(blank)
|
201
|
+
end
|
202
|
+
|
193
203
|
selected_value =
|
194
204
|
case selected
|
195
205
|
when Array
|
@@ -229,14 +239,16 @@ module Dao
|
|
229
239
|
}
|
230
240
|
end
|
231
241
|
|
242
|
+
# html generation support methods
|
243
|
+
#
|
232
244
|
def id_for(keys)
|
233
|
-
id = [
|
245
|
+
id = [path, keys.join('-')].compact.join('_')
|
234
246
|
slug_for(id)
|
235
247
|
end
|
236
248
|
|
237
249
|
def class_for(keys, klass = nil)
|
238
250
|
klass =
|
239
|
-
if
|
251
|
+
if errors.on?(keys)
|
240
252
|
[klass, 'dao', 'errors'].compact.join(' ')
|
241
253
|
else
|
242
254
|
[klass, 'dao'].compact.join(' ')
|
@@ -245,14 +257,12 @@ module Dao
|
|
245
257
|
end
|
246
258
|
|
247
259
|
def error_for(keys, klass = nil)
|
248
|
-
if
|
249
|
-
result.errors.get(keys)
|
250
|
-
end
|
260
|
+
errors.get(keys) if errors.on?(keys)
|
251
261
|
end
|
252
262
|
|
253
|
-
def value_for(
|
254
|
-
return nil unless
|
255
|
-
value = Tagz.escapeHTML(
|
263
|
+
def value_for(map, keys)
|
264
|
+
return nil unless map.has?(keys)
|
265
|
+
value = Tagz.escapeHTML(map.get(keys))
|
256
266
|
end
|
257
267
|
|
258
268
|
def Form.name_for(path, *keys)
|
@@ -270,9 +280,8 @@ module Dao
|
|
270
280
|
params.keys.any?{|key| name_re =~ key.to_s}
|
271
281
|
end
|
272
282
|
|
273
|
-
|
274
283
|
def name_for(keys)
|
275
|
-
Form.name_for(
|
284
|
+
Form.name_for(path, keys)
|
276
285
|
end
|
277
286
|
|
278
287
|
def options_for(*hashes)
|
data/lib/dao/interface.rb
CHANGED
data/lib/dao/mode.rb
CHANGED
@@ -1,41 +1,66 @@
|
|
1
1
|
module Dao
|
2
2
|
class Mode < ::String
|
3
|
+
# class methods
|
4
|
+
#
|
3
5
|
class << Mode
|
4
6
|
def for(mode)
|
5
|
-
mode.is_a?(Mode)
|
7
|
+
return mode if mode.is_a?(Mode)
|
8
|
+
mode = mode.to_s
|
9
|
+
return Mode.send(mode) if Mode.respond_to?(mode)
|
10
|
+
Mode.new(mode)
|
6
11
|
end
|
7
12
|
|
8
13
|
def list
|
9
|
-
|
14
|
+
@list ||= []
|
10
15
|
end
|
11
16
|
|
12
|
-
def
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
17
|
+
def add(mode)
|
18
|
+
mode = new(mode.to_s)
|
16
19
|
|
17
|
-
|
20
|
+
unless list.include?(mode)
|
21
|
+
list.push(mode)
|
22
|
+
singleton_class =
|
23
|
+
class << Mode
|
24
|
+
self
|
25
|
+
end
|
26
|
+
singleton_class.module_eval do
|
27
|
+
attr_accessor mode
|
28
|
+
end
|
29
|
+
Mode.send("#{ mode }=", mode)
|
30
|
+
mode
|
31
|
+
end
|
32
|
+
end
|
18
33
|
|
19
|
-
|
20
|
-
|
21
|
-
unless const_defined?(const)
|
22
|
-
mode = Mode.for(verb.downcase)
|
23
|
-
const_set(const, mode)
|
34
|
+
def default
|
35
|
+
@default ||= Mode.for(:read)
|
24
36
|
end
|
25
37
|
end
|
26
38
|
|
27
|
-
|
28
|
-
|
39
|
+
# instance methods
|
40
|
+
#
|
41
|
+
def cases
|
42
|
+
@cases ||= []
|
43
|
+
end
|
29
44
|
|
30
|
-
|
45
|
+
def case_of?(other)
|
46
|
+
self == other or other.cases.include?(self)
|
47
|
+
end
|
31
48
|
|
32
|
-
|
33
|
-
|
34
|
-
define_method(method){ const_get(const) }
|
49
|
+
def ===(other)
|
50
|
+
case_of?(other)
|
35
51
|
end
|
36
52
|
|
37
|
-
|
38
|
-
|
53
|
+
Read = %w( options get head )
|
54
|
+
Write = %w( post put delete trace connect )
|
55
|
+
Http = Read + Write
|
56
|
+
Http.each do |verb|
|
57
|
+
Mode.add(verb)
|
39
58
|
end
|
59
|
+
|
60
|
+
Mode.add(:read)
|
61
|
+
Read.each{|m| Mode.read.cases.push(Mode.send(m))}
|
62
|
+
|
63
|
+
Mode.add(:write)
|
64
|
+
Write.each{|m| Mode.write.cases.push(Mode.send(m))}
|
40
65
|
end
|
41
66
|
end
|