dao 5.6.1 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +258 -0
- data/Rakefile +6 -6
- data/dao.gemspec +25 -18
- data/lib/dao.rb +18 -74
- data/lib/dao/_lib.rb +46 -0
- data/lib/dao/active_record.rb +6 -6
- data/lib/dao/api/call.rb +14 -3
- data/lib/dao/api/dsl.rb +1 -1
- data/lib/dao/conducer.rb +4 -4
- data/lib/dao/conducer/view_support.rb +0 -2
- data/lib/dao/db.rb +0 -1
- data/lib/dao/errors.rb +9 -11
- data/lib/dao/errors2html.rb +128 -0
- data/lib/dao/form.rb +12 -15
- data/lib/dao/messages.rb +0 -4
- data/lib/dao/path.rb +1 -1
- data/lib/dao/route.rb +2 -2
- data/lib/dao/status.rb +3 -4
- data/lib/dao/support.rb +2 -2
- data/lib/dao/upload.rb +0 -1
- data/lib/dao/validations/common.rb +6 -6
- data/lib/dao/validations/validator.rb +3 -3
- data/notes/ara.txt +15 -0
- data/tasks/default.rake +207 -0
- data/tasks/this.rb +207 -0
- data/test/active_model_conducer_lint_test.rb +3 -11
- data/test/api_test.rb +24 -35
- data/test/conducer_test.rb +33 -43
- data/test/errors_test.rb +20 -14
- data/test/form_test.rb +22 -32
- data/test/rake_rerun_reporter.rb +74 -0
- data/test/support_test.rb +7 -14
- data/test/{testing.rb → test_helper.rb} +73 -49
- data/test/{helper.rb → util.rb} +0 -0
- data/test/validations_test.rb +12 -26
- metadata +51 -84
- data/Gemfile +0 -16
- data/Gemfile.lock +0 -118
- data/README +0 -256
@@ -1,20 +1,12 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
-
|
2
|
+
require './test/test_helper'
|
3
|
+
class LintTest < Dao::TestCase
|
3
4
|
include ActiveModel::Lint::Tests
|
4
5
|
|
5
6
|
class LintConducer < Dao::Conducer; end
|
6
|
-
|
7
|
+
|
7
8
|
def setup
|
8
9
|
@model = LintConducer.new
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
BEGIN {
|
14
|
-
testdir = File.dirname(File.expand_path(__FILE__))
|
15
|
-
rootdir = File.dirname(testdir)
|
16
|
-
libdir = File.join(rootdir, 'lib')
|
17
|
-
|
18
|
-
require File.join(libdir, 'dao')
|
19
|
-
require File.join(testdir, 'testing')
|
20
|
-
}
|
data/test/api_test.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
require_relative 'test_helper'
|
2
3
|
|
3
|
-
|
4
|
-
Testing Dao do
|
4
|
+
class DaoTest < ::Dao::TestCase
|
5
5
|
## api
|
6
6
|
#
|
7
|
-
|
7
|
+
test 'that an api class for your application can be built using a simple dsl' do
|
8
8
|
assert{
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
9
|
+
Dao.api do
|
10
|
+
### dsl
|
11
|
+
end
|
13
12
|
}
|
14
13
|
end
|
15
14
|
|
16
|
-
|
15
|
+
test 'that apis can have callable endpoints added to them which accept params and return results' do
|
17
16
|
captured = []
|
18
17
|
|
19
18
|
api_class =
|
@@ -29,7 +28,7 @@ Testing Dao do
|
|
29
28
|
assert{ result.is_a?(Hash) }
|
30
29
|
end
|
31
30
|
|
32
|
-
|
31
|
+
test 'that endpoints are automatically called according to arity' do
|
33
32
|
api = assert{ Class.new(Dao.api) }
|
34
33
|
assert{ api.class_eval{ endpoint(:zero){|| result.update :args => [] } } }
|
35
34
|
assert{ api.class_eval{ endpoint(:one){|a| result.update :args => [a]} } }
|
@@ -40,14 +39,14 @@ Testing Dao do
|
|
40
39
|
assert{ api.new.call(:two).args.size == 2 }
|
41
40
|
end
|
42
41
|
|
43
|
-
|
42
|
+
test 'that endpoints have an auto-vivifying params/result' do
|
44
43
|
api = assert{ Class.new(Dao.api) }
|
45
44
|
assert{ api.class_eval{ endpoint(:foo){ params; result; } } }
|
46
45
|
result = assert{ api.new.call(:foo) }
|
47
46
|
assert{ result.path.to_s =~ /foo/ }
|
48
47
|
end
|
49
48
|
|
50
|
-
|
49
|
+
test 'that an api can be called with different modes' do
|
51
50
|
Dao::Mode.list.each do |mode|
|
52
51
|
api_class =
|
53
52
|
assert{
|
@@ -63,7 +62,7 @@ Testing Dao do
|
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
|
-
|
65
|
+
test 'that read==get' do
|
67
66
|
api_class =
|
68
67
|
assert{
|
69
68
|
Dao.api do
|
@@ -85,7 +84,7 @@ Testing Dao do
|
|
85
84
|
assert{ api.get.call(:bar).data.answer == 42.0 }
|
86
85
|
end
|
87
86
|
|
88
|
-
|
87
|
+
test 'that write==post' do
|
89
88
|
api_class =
|
90
89
|
assert{
|
91
90
|
Dao.api do
|
@@ -107,7 +106,7 @@ Testing Dao do
|
|
107
106
|
assert{ api.post.call(:bar).data.answer == 42.0 }
|
108
107
|
end
|
109
108
|
|
110
|
-
|
109
|
+
test 'that aliases are re-defined in scope' do
|
111
110
|
api_class =
|
112
111
|
assert{
|
113
112
|
Dao.api do
|
@@ -149,7 +148,7 @@ Testing Dao do
|
|
149
148
|
|
150
149
|
## context
|
151
150
|
#
|
152
|
-
|
151
|
+
test 'that calls have a shortcut to status' do
|
153
152
|
api_class =
|
154
153
|
assert{
|
155
154
|
Dao.api do
|
@@ -163,7 +162,7 @@ Testing Dao do
|
|
163
162
|
|
164
163
|
## results
|
165
164
|
#
|
166
|
-
|
165
|
+
test 'that results can be created' do
|
167
166
|
result = assert{ Dao::Result.new }
|
168
167
|
assert{ result.path }
|
169
168
|
assert{ result.status }
|
@@ -172,14 +171,14 @@ Testing Dao do
|
|
172
171
|
assert{ result.data }
|
173
172
|
end
|
174
173
|
|
175
|
-
|
174
|
+
test 'that results can be created with a path' do
|
176
175
|
result = assert{ Dao::Result.new('/api/foo/bar') }
|
177
176
|
assert{ result.path == '/api/foo/bar' }
|
178
177
|
end
|
179
178
|
|
180
179
|
## paths
|
181
180
|
#
|
182
|
-
|
181
|
+
test 'that simple paths can be contstructed/compiled' do
|
183
182
|
path = assert{ Dao::Path.for('./api/../foo/bar') }
|
184
183
|
assert{ path =~ %r|^/| }
|
185
184
|
assert{ path !~ %r|[.]| }
|
@@ -190,7 +189,7 @@ Testing Dao do
|
|
190
189
|
|
191
190
|
## routes
|
192
191
|
#
|
193
|
-
|
192
|
+
test 'that an api has a list of routes' do
|
194
193
|
api_class =
|
195
194
|
assert{
|
196
195
|
Dao.api do
|
@@ -199,7 +198,7 @@ Testing Dao do
|
|
199
198
|
assert{ api_class.routes.is_a?(Array) }
|
200
199
|
end
|
201
200
|
|
202
|
-
|
201
|
+
test 'that routed endpoints call be declared' do
|
203
202
|
api_class =
|
204
203
|
assert{
|
205
204
|
Dao.api do
|
@@ -208,10 +207,10 @@ Testing Dao do
|
|
208
207
|
end
|
209
208
|
end
|
210
209
|
}
|
211
|
-
|
210
|
+
api_class.new
|
212
211
|
end
|
213
212
|
|
214
|
-
|
213
|
+
test 'that routed methods can be called with embedded params' do
|
215
214
|
api_class =
|
216
215
|
assert{
|
217
216
|
Dao.api do
|
@@ -236,7 +235,7 @@ Testing Dao do
|
|
236
235
|
|
237
236
|
## doc
|
238
237
|
#
|
239
|
-
|
238
|
+
test 'that apis can be documented via the api' do
|
240
239
|
api_class =
|
241
240
|
assert {
|
242
241
|
Dao.api {
|
@@ -253,7 +252,7 @@ Testing Dao do
|
|
253
252
|
|
254
253
|
# aliases
|
255
254
|
#
|
256
|
-
|
255
|
+
test 'that apis can alias methods' do
|
257
256
|
api_class =
|
258
257
|
assert {
|
259
258
|
Dao.api {
|
@@ -274,17 +273,7 @@ protected
|
|
274
273
|
|
275
274
|
def api(&block)
|
276
275
|
api_class = assert{ Dao.api(&block) }
|
277
|
-
|
276
|
+
assert{ api_class.new }
|
278
277
|
end
|
279
278
|
end
|
280
279
|
|
281
|
-
|
282
|
-
BEGIN {
|
283
|
-
testdir = File.dirname(File.expand_path(__FILE__))
|
284
|
-
rootdir = File.dirname(testdir)
|
285
|
-
libdir = File.join(rootdir, 'lib')
|
286
|
-
|
287
|
-
require File.join(libdir, 'dao')
|
288
|
-
require File.join(testdir, 'testing')
|
289
|
-
require File.join(testdir, 'helper')
|
290
|
-
}
|
data/test/conducer_test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
require_relative 'test_helper'
|
2
3
|
|
3
|
-
|
4
|
-
Testing Dao::Conducer do
|
4
|
+
class Dao::ConducerTest < Dao::TestCase
|
5
5
|
##
|
6
6
|
#
|
7
7
|
context :teh_ctor do
|
8
8
|
#
|
9
|
-
|
9
|
+
test 'conducers have a POLS .new method' do
|
10
10
|
[
|
11
11
|
{:key => :val, :array => [0,1,2]},
|
12
12
|
{}
|
@@ -17,7 +17,7 @@ Testing Dao::Conducer do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
#
|
20
|
-
|
20
|
+
test 'models passed to .new are automatically tracked' do
|
21
21
|
user = User.new
|
22
22
|
post = Post.new
|
23
23
|
comment = Comment.new
|
@@ -33,7 +33,7 @@ Testing Dao::Conducer do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
#
|
36
|
-
|
36
|
+
test 'that the conduced model can be declared at the class level' do
|
37
37
|
user = User.new
|
38
38
|
post = Post.new
|
39
39
|
comment = Comment.new
|
@@ -49,7 +49,7 @@ Testing Dao::Conducer do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
#
|
52
|
-
|
52
|
+
test 'that the conduced model can be declared at the instance level' do
|
53
53
|
user = User.new
|
54
54
|
post = Post.new
|
55
55
|
comment = Comment.new
|
@@ -71,7 +71,7 @@ Testing Dao::Conducer do
|
|
71
71
|
#
|
72
72
|
context :teh_default_initialize do
|
73
73
|
#
|
74
|
-
|
74
|
+
test 'that the last mode determines the lifecycle state when a models are passed in' do
|
75
75
|
user = User.new
|
76
76
|
post = Post.new
|
77
77
|
comment = Comment.new
|
@@ -92,7 +92,7 @@ Testing Dao::Conducer do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
#
|
95
|
-
|
95
|
+
test 'that passed in models/params are sanely ker-sploded onto the attributes' do
|
96
96
|
user = User.new :k => 1
|
97
97
|
post = Post.new :k => 2
|
98
98
|
comment = Comment.new :k => 3, :x => 4
|
@@ -119,7 +119,7 @@ Testing Dao::Conducer do
|
|
119
119
|
end
|
120
120
|
|
121
121
|
#
|
122
|
-
|
122
|
+
test 'that .new specialises based on current action' do
|
123
123
|
conducer_class =
|
124
124
|
new_conducer_class do
|
125
125
|
def initialize_for_new
|
@@ -145,7 +145,7 @@ Testing Dao::Conducer do
|
|
145
145
|
end
|
146
146
|
|
147
147
|
#
|
148
|
-
|
148
|
+
test 'that conducers can build a highly specialized .new method based on action' do
|
149
149
|
c =
|
150
150
|
new_conducer_class do
|
151
151
|
def initialize(a, b, c, params)
|
@@ -181,7 +181,7 @@ Testing Dao::Conducer do
|
|
181
181
|
end
|
182
182
|
|
183
183
|
#
|
184
|
-
|
184
|
+
test 'that conducers *fold* in attributes' do
|
185
185
|
c = new_conducer
|
186
186
|
|
187
187
|
assert{ c.update_attributes :key => {:a => :b} }
|
@@ -193,7 +193,7 @@ Testing Dao::Conducer do
|
|
193
193
|
#
|
194
194
|
context :teh_default_save do
|
195
195
|
#
|
196
|
-
|
196
|
+
test 'is sane and based solely on the last model' do
|
197
197
|
user = User.new
|
198
198
|
post = Post.new
|
199
199
|
comment = Comment.new
|
@@ -211,7 +211,7 @@ Testing Dao::Conducer do
|
|
211
211
|
end
|
212
212
|
|
213
213
|
#
|
214
|
-
|
214
|
+
test 'halts when the conducer is invalid with errors' do
|
215
215
|
conducer_class =
|
216
216
|
new_conducer_class do
|
217
217
|
validates_presence_of(:foo)
|
@@ -225,7 +225,7 @@ Testing Dao::Conducer do
|
|
225
225
|
end
|
226
226
|
|
227
227
|
#
|
228
|
-
|
228
|
+
test 'halts when the model is invalid and relays errors' do
|
229
229
|
post = Post.new
|
230
230
|
post.errors[:foo] = 'is fucked'
|
231
231
|
c = new_conducer(post)
|
@@ -234,7 +234,7 @@ Testing Dao::Conducer do
|
|
234
234
|
end
|
235
235
|
|
236
236
|
#
|
237
|
-
|
237
|
+
test 'raises a validation error on #save!' do
|
238
238
|
post = Post.new
|
239
239
|
post.errors[:foo] = 'is fucked'
|
240
240
|
c = new_conducer(post)
|
@@ -251,7 +251,7 @@ Testing Dao::Conducer do
|
|
251
251
|
#
|
252
252
|
context :validations do
|
253
253
|
#
|
254
|
-
|
254
|
+
test 'that simple validations/errors work' do
|
255
255
|
c =
|
256
256
|
assert{
|
257
257
|
new_foo_conducer_class do
|
@@ -276,7 +276,7 @@ Testing Dao::Conducer do
|
|
276
276
|
end
|
277
277
|
|
278
278
|
#
|
279
|
-
|
279
|
+
test 'that validations are evaluated in the context of the object' do
|
280
280
|
c =
|
281
281
|
assert{
|
282
282
|
new_foo_conducer_class do
|
@@ -296,7 +296,7 @@ Testing Dao::Conducer do
|
|
296
296
|
end
|
297
297
|
|
298
298
|
#
|
299
|
-
|
299
|
+
test 'that validates_each werks at the class and instance level' do
|
300
300
|
conducer_class =
|
301
301
|
new_conducer_class do
|
302
302
|
validates_each :a do |item|
|
@@ -335,7 +335,7 @@ Testing Dao::Conducer do
|
|
335
335
|
#
|
336
336
|
context :forms do
|
337
337
|
#
|
338
|
-
|
338
|
+
test 'that basic form helpers work' do
|
339
339
|
c =
|
340
340
|
assert{
|
341
341
|
new_foo_conducer_class do
|
@@ -357,12 +357,12 @@ Testing Dao::Conducer do
|
|
357
357
|
#
|
358
358
|
context :class_methods do
|
359
359
|
#
|
360
|
-
|
360
|
+
test 'that base classes can be constructed and named' do
|
361
361
|
new_foo_conducer_class()
|
362
362
|
end
|
363
363
|
|
364
364
|
#
|
365
|
-
|
365
|
+
test '.new' do
|
366
366
|
c = assert{ new_foo_conducer_class }
|
367
367
|
controller = assert{ Dao.mock_controller }
|
368
368
|
|
@@ -386,7 +386,7 @@ Testing Dao::Conducer do
|
|
386
386
|
end
|
387
387
|
|
388
388
|
#
|
389
|
-
|
389
|
+
test '.model_name' do
|
390
390
|
c = assert{ new_foo_conducer_class }
|
391
391
|
assert{ c.model_name }
|
392
392
|
o = assert{ c.new }
|
@@ -397,7 +397,7 @@ Testing Dao::Conducer do
|
|
397
397
|
##
|
398
398
|
#
|
399
399
|
context :instance_methods do
|
400
|
-
|
400
|
+
test '#id' do
|
401
401
|
[:_id, :id].each do |id_key|
|
402
402
|
o = assert{ new_foo_conducer() }
|
403
403
|
assert{ o.id.nil? }
|
@@ -410,20 +410,20 @@ Testing Dao::Conducer do
|
|
410
410
|
end
|
411
411
|
end
|
412
412
|
|
413
|
-
|
413
|
+
test '#to_param' do
|
414
414
|
o = assert{ new_foo_conducer() }
|
415
415
|
assert{ o.to_param.nil? }
|
416
416
|
o.id = 42
|
417
417
|
assert{ o.to_param }
|
418
418
|
end
|
419
419
|
|
420
|
-
|
420
|
+
test '#errors' do
|
421
421
|
o = assert{ new_foo_conducer() }
|
422
422
|
assert{ o.errors.respond_to?(:[]) }
|
423
423
|
end
|
424
424
|
|
425
425
|
=begin
|
426
|
-
|
426
|
+
test 'that conducers can register handlers for setting deeply nested attributes' do
|
427
427
|
c =
|
428
428
|
new_conducer_class do
|
429
429
|
def _update_attributes(attributes = {})
|
@@ -454,7 +454,7 @@ Testing Dao::Conducer do
|
|
454
454
|
#
|
455
455
|
context :teh_mount do
|
456
456
|
#
|
457
|
-
|
457
|
+
test 'that mounted objects can be declared at the class level' do
|
458
458
|
conducer_class =
|
459
459
|
new_conducer_class do
|
460
460
|
mount Dao::Upload, :a, :b, :placeholder => '/images/foo.jpg'
|
@@ -470,7 +470,7 @@ Testing Dao::Conducer do
|
|
470
470
|
end
|
471
471
|
|
472
472
|
#
|
473
|
-
|
473
|
+
test 'that mounted objects replace their location in attributes' do
|
474
474
|
conducer_class =
|
475
475
|
new_conducer_class do
|
476
476
|
mount Dao::Upload, :a, :b, :placeholder => '/images/foo.jpg'
|
@@ -488,7 +488,7 @@ Testing Dao::Conducer do
|
|
488
488
|
end
|
489
489
|
|
490
490
|
#
|
491
|
-
|
491
|
+
test 'that the default save uses the mounted _value and _clears it' do
|
492
492
|
begin
|
493
493
|
$pry=true
|
494
494
|
conducer_class =
|
@@ -525,7 +525,7 @@ end
|
|
525
525
|
##
|
526
526
|
#
|
527
527
|
context :collections do
|
528
|
-
|
528
|
+
test 'can be created from page-y blessed arrays' do
|
529
529
|
paginated = Paginated[Post.new, Post.new, Post.new]
|
530
530
|
paginated.limit = 42
|
531
531
|
paginated.offset = 42.0
|
@@ -551,7 +551,7 @@ end
|
|
551
551
|
##
|
552
552
|
#
|
553
553
|
context :callbacks do
|
554
|
-
|
554
|
+
test 'can be added lazily in an ad-hoc fashion' do
|
555
555
|
callbacks = []
|
556
556
|
|
557
557
|
conducer_class =
|
@@ -602,7 +602,7 @@ protected
|
|
602
602
|
end
|
603
603
|
alias_method :new_conducer, :new_foo_conducer
|
604
604
|
|
605
|
-
|
605
|
+
def setup
|
606
606
|
$db = Dao::Db.new(:path => 'test/db.yml')
|
607
607
|
Dao::Db.instance = $db
|
608
608
|
collection = $db['foos']
|
@@ -613,7 +613,7 @@ protected
|
|
613
613
|
end
|
614
614
|
end
|
615
615
|
|
616
|
-
|
616
|
+
def teardown
|
617
617
|
$db = Dao::Db.new(:path => 'test/db.yml')
|
618
618
|
$db.rm_f
|
619
619
|
end
|
@@ -758,13 +758,3 @@ protected
|
|
758
758
|
class Comment < Model
|
759
759
|
end
|
760
760
|
end
|
761
|
-
|
762
|
-
|
763
|
-
BEGIN {
|
764
|
-
testdir = File.dirname(File.expand_path(__FILE__))
|
765
|
-
rootdir = File.dirname(testdir)
|
766
|
-
libdir = File.join(rootdir, 'lib')
|
767
|
-
require File.join(libdir, 'dao')
|
768
|
-
require File.join(testdir, 'testing')
|
769
|
-
require 'stringio'
|
770
|
-
}
|