dao 4.2.1 → 4.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +103 -63
- data/Rakefile +3 -3
- data/dao.gemspec +27 -16
- data/lib/dao.rb +17 -17
- data/lib/dao/active_record.rb +1 -0
- data/lib/dao/api.rb +2 -1
- data/lib/dao/api/{endpoints.rb → call.rb} +1 -0
- data/lib/dao/api/context.rb +2 -0
- data/lib/dao/api/dsl.rb +1 -0
- data/lib/dao/api/initializers.rb +1 -0
- data/lib/dao/api/modes.rb +1 -0
- data/lib/dao/api/routes.rb +1 -0
- data/lib/dao/blankslate.rb +1 -0
- data/lib/dao/conducer.rb +315 -274
- data/lib/dao/conducer/active_model.rb +98 -0
- data/lib/dao/conducer/attributes.rb +1 -0
- data/lib/dao/conducer/autocrud.rb +58 -0
- data/lib/dao/conducer/callback_support.rb +20 -0
- data/lib/dao/conducer/collection.rb +45 -0
- data/lib/dao/conducer/controller_support.rb +104 -0
- data/lib/dao/conducer/nav_support.rb +9 -0
- data/lib/dao/conducer/view_support.rb +16 -0
- data/lib/dao/data.rb +2 -1
- data/lib/dao/db.rb +2 -0
- data/lib/dao/endpoint.rb +1 -0
- data/lib/dao/engine.rb +1 -0
- data/lib/dao/errors.rb +109 -99
- data/lib/dao/exceptions.rb +1 -0
- data/lib/dao/extractor.rb +1 -0
- data/lib/dao/form.rb +175 -20
- data/lib/dao/instance_exec.rb +1 -0
- data/lib/dao/mode.rb +1 -0
- data/lib/dao/mongo_mapper.rb +1 -0
- data/lib/dao/name.rb +1 -0
- data/lib/dao/params.rb +2 -1
- data/lib/dao/path.rb +1 -0
- data/lib/dao/path_map.rb +24 -0
- data/lib/dao/rack.rb +1 -0
- data/lib/dao/rack/middleware.rb +1 -0
- data/lib/dao/rack/middleware/params_parser.rb +1 -0
- data/lib/dao/rails.rb +12 -32
- data/lib/dao/rails/lib/generators/dao/USAGE +2 -2
- data/lib/dao/rails/lib/generators/dao/dao_generator.rb +8 -27
- data/lib/dao/rails/lib/generators/dao/templates/api.rb +2 -1
- data/lib/dao/rails/lib/generators/dao/templates/api_controller.rb +22 -20
- data/lib/dao/rails/lib/generators/dao/templates/conducer.rb +49 -43
- data/lib/dao/rails/lib/generators/dao/templates/dao.css +26 -25
- data/lib/dao/rails/lib/generators/dao/templates/dao.js +3 -0
- data/lib/dao/rails/lib/generators/dao/templates/dao_helper.rb +58 -45
- data/lib/dao/result.rb +50 -1
- data/lib/dao/route.rb +1 -0
- data/lib/dao/slug.rb +12 -36
- data/lib/dao/status.rb +91 -7
- data/lib/dao/stdext.rb +1 -0
- data/lib/dao/support.rb +90 -80
- data/lib/dao/upload.rb +396 -0
- data/lib/dao/validations.rb +23 -5
- data/lib/dao/validations/callback.rb +5 -0
- data/lib/dao/validations/common.rb +100 -3
- data/lib/dao/validations/instance.rb +17 -0
- data/lib/dao/validations/validator.rb +192 -91
- data/test/active_model_conducer_lint_test.rb +1 -0
- data/test/api_test.rb +15 -0
- data/test/conducer_test.rb +608 -90
- data/test/data/han-solo.jpg +0 -0
- data/test/form_test.rb +1 -0
- data/test/helper.rb +1 -0
- data/test/leak.rb +1 -0
- data/test/support_test.rb +4 -1
- data/test/testing.rb +1 -0
- data/test/validations_test.rb +176 -30
- metadata +120 -131
- data/b.rb +0 -38
- data/lib/dao/conducer/crud.rb +0 -70
- data/lib/dao/current.rb +0 -66
- data/lib/dao/image_cache.rb +0 -193
- data/lib/dao/rails/lib/generators/dao/templates/conducer_controller.rb +0 -79
- data/test/db.yml +0 -9
data/b.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'dao'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class C < ::Map
|
7
|
-
include Dao::Validations
|
8
|
-
validates_presence_of :foo
|
9
|
-
end
|
10
|
-
|
11
|
-
c = C.new
|
12
|
-
|
13
|
-
p c.valid?
|
14
|
-
p c.errors
|
15
|
-
|
16
|
-
c.update(:foo => 42)
|
17
|
-
|
18
|
-
p c.valid?
|
19
|
-
p c.errors
|
20
|
-
|
21
|
-
#p 'c.validator.attributes' => c.validator.attributes
|
22
|
-
#p 'c' => c
|
23
|
-
|
24
|
-
__END__
|
25
|
-
|
26
|
-
p c.valid?
|
27
|
-
|
28
|
-
|
29
|
-
p c
|
30
|
-
|
31
|
-
p c.valid?
|
32
|
-
|
33
|
-
#c.validator
|
34
|
-
#p c.validator.object
|
35
|
-
#p c.valid?
|
36
|
-
#p c.errors
|
37
|
-
#p c.status
|
38
|
-
|
data/lib/dao/conducer/crud.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
module Dao
|
2
|
-
## CRUD support
|
3
|
-
#
|
4
|
-
class Conducer
|
5
|
-
module CRUD
|
6
|
-
Code = proc do
|
7
|
-
class << self
|
8
|
-
def db
|
9
|
-
Db.instance
|
10
|
-
end
|
11
|
-
|
12
|
-
def collection
|
13
|
-
db[collection_name]
|
14
|
-
end
|
15
|
-
|
16
|
-
def all(*args)
|
17
|
-
hashes = collection.all()
|
18
|
-
hashes.map{|hash| new(hash)}
|
19
|
-
end
|
20
|
-
|
21
|
-
def find(id)
|
22
|
-
hash = collection.find(id)
|
23
|
-
new(hash) if hash
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def save
|
28
|
-
run_callbacks :save do
|
29
|
-
return(false) unless valid?
|
30
|
-
id = self.class.collection.save(@attributes)
|
31
|
-
@attributes.set(:id => id)
|
32
|
-
true
|
33
|
-
end
|
34
|
-
ensure
|
35
|
-
@new_record = false
|
36
|
-
end
|
37
|
-
|
38
|
-
def destroy
|
39
|
-
id = self.id
|
40
|
-
if id
|
41
|
-
self.class.collection.destroy(id)
|
42
|
-
@attributes.rm(:id)
|
43
|
-
end
|
44
|
-
id
|
45
|
-
ensure
|
46
|
-
@destroyed = true
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def CRUD.included(other)
|
51
|
-
super
|
52
|
-
ensure
|
53
|
-
other.module_eval(&Code)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
## dsl for auto-crud
|
59
|
-
#
|
60
|
-
class Conducer
|
61
|
-
class << self
|
62
|
-
def crud
|
63
|
-
include(Conducer::CRUD)
|
64
|
-
end
|
65
|
-
alias_method('crud!', 'crud')
|
66
|
-
alias_method('autocrud!', 'crud')
|
67
|
-
end
|
68
|
-
end
|
69
|
-
#Conducer::send(:include, Conducer::CRUD)
|
70
|
-
end
|
data/lib/dao/current.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
# FIXME - the redundancy in this file fucking kilz me... fix it.
|
2
|
-
#
|
3
|
-
module Dao::Current
|
4
|
-
Methods = proc do
|
5
|
-
end
|
6
|
-
|
7
|
-
ClassMethods = proc do
|
8
|
-
def current_controller
|
9
|
-
@current_controller ||= (
|
10
|
-
if defined?(@controller)
|
11
|
-
@controller
|
12
|
-
else
|
13
|
-
Dao.current_controller || Dao.mock_controller
|
14
|
-
end
|
15
|
-
)
|
16
|
-
end
|
17
|
-
|
18
|
-
%w( request response session ).each do |attr|
|
19
|
-
instance_eval <<-__, __FILE__, __LINE__
|
20
|
-
def current_#{ attr }
|
21
|
-
@current_#{ attr } ||= current_controller.instance_eval{ #{ attr } }
|
22
|
-
end
|
23
|
-
__
|
24
|
-
end
|
25
|
-
|
26
|
-
%w( current_user effective_user real_user ).each do |attr|
|
27
|
-
instance_eval <<-__, __FILE__, __LINE__
|
28
|
-
def #{ attr }
|
29
|
-
@#{ attr } ||= current_controller.instance_eval{ #{ attr } }
|
30
|
-
end
|
31
|
-
def #{ attr }=(value)
|
32
|
-
@#{ attr } = value
|
33
|
-
end
|
34
|
-
__
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
InstanceMethods = proc do
|
39
|
-
def current_controller
|
40
|
-
@current_controller ||= (
|
41
|
-
if defined?(@controller)
|
42
|
-
@controller
|
43
|
-
else
|
44
|
-
self.class.current_controller
|
45
|
-
end
|
46
|
-
)
|
47
|
-
end
|
48
|
-
|
49
|
-
%w( current_request current_response current_session current_user effective_user real_user ).each do |attr|
|
50
|
-
module_eval <<-__, __FILE__, __LINE__
|
51
|
-
def #{ attr }
|
52
|
-
@#{ attr } ||= self.class.send('#{ attr }')
|
53
|
-
end
|
54
|
-
def #{ attr }=(value)
|
55
|
-
@#{ attr } = value
|
56
|
-
end
|
57
|
-
__
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.included(other)
|
62
|
-
other.send(:instance_eval, &ClassMethods)
|
63
|
-
other.send(:class_eval, &InstanceMethods)
|
64
|
-
super
|
65
|
-
end
|
66
|
-
end
|
data/lib/dao/image_cache.rb
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
module Dao
|
2
|
-
require 'uuidtools'
|
3
|
-
require 'fileutils'
|
4
|
-
require 'cgi'
|
5
|
-
|
6
|
-
class ImageCache
|
7
|
-
Version = '1.0.0'
|
8
|
-
|
9
|
-
class << ImageCache
|
10
|
-
def version
|
11
|
-
ImageCache::Version
|
12
|
-
end
|
13
|
-
|
14
|
-
def base
|
15
|
-
@base ||= 'images/cache'
|
16
|
-
end
|
17
|
-
|
18
|
-
def base=(base)
|
19
|
-
@base = base.to_s.sub(%r|^/+|, '')
|
20
|
-
end
|
21
|
-
|
22
|
-
def url
|
23
|
-
'/' + base
|
24
|
-
end
|
25
|
-
|
26
|
-
def root
|
27
|
-
@root ||= File.join(Rails.root, 'public', base)
|
28
|
-
end
|
29
|
-
|
30
|
-
def uuid(*args)
|
31
|
-
UUIDTools::UUID.timestamp_create.to_s
|
32
|
-
end
|
33
|
-
|
34
|
-
def tmpdir(&block)
|
35
|
-
tmpdir = File.join(root, uuid)
|
36
|
-
|
37
|
-
if block
|
38
|
-
FileUtils.mkdir_p(tmpdir)
|
39
|
-
block.call(tmpdir)
|
40
|
-
else
|
41
|
-
tmpdir
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def cleanname(path)
|
46
|
-
basename = File.basename(path.to_s)
|
47
|
-
CGI.unescape(basename).gsub(%r/[^0-9a-zA-Z_@)(~.-]/, '_').gsub(%r/_+/,'_')
|
48
|
-
end
|
49
|
-
|
50
|
-
def cache_key_for(key)
|
51
|
-
"#{ key }__cache"
|
52
|
-
end
|
53
|
-
|
54
|
-
def for(params, key = :image)
|
55
|
-
image = params[key]
|
56
|
-
if image.respond_to?(:read)
|
57
|
-
tmpdir do |tmp|
|
58
|
-
basename = cleanname(image.original_path)
|
59
|
-
|
60
|
-
path = File.join(tmp, basename)
|
61
|
-
open(path, 'w'){|fd| fd.write(image.read)}
|
62
|
-
image_cache = new(key, path)
|
63
|
-
params[key] = image_cache.io
|
64
|
-
return image_cache
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
cache_key = cache_key_for(key)
|
69
|
-
image_cache = params[cache_key]
|
70
|
-
if image_cache
|
71
|
-
dirname, basename = File.split(image_cache)
|
72
|
-
path = root + '/' + File.join(File.basename(dirname), basename)
|
73
|
-
image_cache = new(key, path)
|
74
|
-
params[key] = image_cache.io
|
75
|
-
return image_cache
|
76
|
-
end
|
77
|
-
|
78
|
-
return new(key, path=nil)
|
79
|
-
end
|
80
|
-
|
81
|
-
def finalizer(object_id)
|
82
|
-
if fd = IOs[object_id]
|
83
|
-
IO.for_fd(fd).close
|
84
|
-
IOs.delete(object_id)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
UUIDPattern = %r/^[a-zA-Z0-9-]+$/io
|
89
|
-
Age = 60 * 60 * 24
|
90
|
-
|
91
|
-
def clear!(options = {})
|
92
|
-
glob = File.join(root, '*')
|
93
|
-
age = Integer(options[:age] || options['age'] || Age)
|
94
|
-
since = options[:since] || options['since'] || Time.now
|
95
|
-
|
96
|
-
Dir.glob(glob) do |entry|
|
97
|
-
begin
|
98
|
-
next unless test(?d, entry)
|
99
|
-
next unless File.basename(entry) =~ UUIDPattern
|
100
|
-
|
101
|
-
files = Dir.glob(File.join(entry, '**/**'))
|
102
|
-
|
103
|
-
all_files_are_old =
|
104
|
-
files.all? do |file|
|
105
|
-
begin
|
106
|
-
stat = File.stat(file)
|
107
|
-
age = since - stat.atime
|
108
|
-
age >= Age
|
109
|
-
rescue
|
110
|
-
false
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
FileUtils.rm_rf(entry) if all_files_are_old
|
115
|
-
rescue
|
116
|
-
next
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
attr_accessor :key
|
123
|
-
attr_accessor :cache_key
|
124
|
-
attr_accessor :path
|
125
|
-
attr_accessor :dirname
|
126
|
-
attr_accessor :basename
|
127
|
-
attr_accessor :value
|
128
|
-
attr_accessor :io
|
129
|
-
|
130
|
-
IOs = {}
|
131
|
-
|
132
|
-
def initialize(key, path)
|
133
|
-
@key = key.to_s
|
134
|
-
@cache_key = ImageCache.cache_key_for(key)
|
135
|
-
|
136
|
-
if path
|
137
|
-
@path = path
|
138
|
-
@dirname, @basename = File.split(@path)
|
139
|
-
@value = File.join(File.basename(@dirname), @basename).strip
|
140
|
-
@io = open(@path)
|
141
|
-
IOs[object_id] = @io.fileno
|
142
|
-
ObjectSpace.define_finalizer(self, ImageCache.method(:finalizer).to_proc)
|
143
|
-
else
|
144
|
-
@path = nil
|
145
|
-
@value = nil
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def hidden
|
150
|
-
raw("<input type='hidden' name='#{ @cache_key }' value='#{ @value }' />") if @value
|
151
|
-
end
|
152
|
-
|
153
|
-
def to_s
|
154
|
-
hidden.to_s
|
155
|
-
end
|
156
|
-
|
157
|
-
def url
|
158
|
-
File.join(ImageCache.url, @value) if @value
|
159
|
-
end
|
160
|
-
|
161
|
-
def raw(*args)
|
162
|
-
string = args.join
|
163
|
-
if string.respond_to?(:html_safe)
|
164
|
-
string.html_safe
|
165
|
-
else
|
166
|
-
string
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def clear!
|
171
|
-
FileUtils.rm_rf(@dirname) if test(?d, @dirname)
|
172
|
-
rescue
|
173
|
-
nil
|
174
|
-
ensure
|
175
|
-
if @io
|
176
|
-
@io.close
|
177
|
-
IOs.delete(object_id)
|
178
|
-
end
|
179
|
-
Thread.new{ ImageCache.clear! }
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
Image_cache = ImageCache unless defined?(Image_cache)
|
184
|
-
|
185
|
-
if defined?(Rails.env)
|
186
|
-
unless Rails.env.production?
|
187
|
-
if defined?(unloadable)
|
188
|
-
unloadable(ImageCache)
|
189
|
-
unloadable(Image_cache)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
conducer_class_name = @conducer_name.camelize
|
4
|
-
controller_class_name = @controller_name.camelize
|
5
|
-
|
6
|
-
-%>
|
7
|
-
class PostsController < ApplicationController
|
8
|
-
Post = PostConducer
|
9
|
-
|
10
|
-
def index
|
11
|
-
@posts = Post.for_index(params)
|
12
|
-
|
13
|
-
respond_to do |format|
|
14
|
-
format.html # index.html.erb
|
15
|
-
format.json { render :json => @posts }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def show
|
20
|
-
@post = Post.for_show(params[:id])
|
21
|
-
|
22
|
-
respond_to do |format|
|
23
|
-
format.html # show.html.erb
|
24
|
-
format.json { render :json => @post }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def new
|
29
|
-
@post = Post.for_new(params)
|
30
|
-
|
31
|
-
respond_to do |format|
|
32
|
-
format.html # new.html.erb
|
33
|
-
format.json { render :json => @post }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def edit
|
38
|
-
@post = Post.find(params[:id])
|
39
|
-
end
|
40
|
-
|
41
|
-
def create
|
42
|
-
@post = Post.new(params[:post])
|
43
|
-
|
44
|
-
respond_to do |format|
|
45
|
-
if @post.save
|
46
|
-
format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
|
47
|
-
format.json { render :json => @post, :status => :created, :location => @post }
|
48
|
-
else
|
49
|
-
format.html { render :action => "new" }
|
50
|
-
format.json { render :json => @post.errors, :status => :unprocessable_entity }
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def update
|
56
|
-
@post = Post.find(params[:id])
|
57
|
-
|
58
|
-
respond_to do |format|
|
59
|
-
if @post.update_attributes(params[:post])
|
60
|
-
format.html { redirect_to(@post, :notice => 'Post was successfully updated.') }
|
61
|
-
format.json { head :ok }
|
62
|
-
else
|
63
|
-
format.html { render :action => "edit" }
|
64
|
-
format.json { render :json => @post.errors, :status => :unprocessable_entity }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def destroy
|
70
|
-
@post = Post.find(params[:id])
|
71
|
-
@post.destroy
|
72
|
-
|
73
|
-
respond_to do |format|
|
74
|
-
format.html { redirect_to(posts_url) }
|
75
|
-
format.json { head :ok }
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|