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/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
|