dao 5.5.0 → 8.0.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.
Files changed (52) hide show
  1. checksums.yaml +6 -14
  2. data/README.md +258 -0
  3. data/Rakefile +4 -5
  4. data/coerce-0.0.8/README +28 -0
  5. data/coerce-0.0.8/Rakefile +392 -0
  6. data/coerce-0.0.8/coerce.gemspec +31 -0
  7. data/coerce-0.0.8/lib/coerce.rb +210 -0
  8. data/dao.gemspec +38 -25
  9. data/lib/dao.rb +18 -81
  10. data/lib/dao/_lib.rb +42 -0
  11. data/lib/dao/active_record.rb +8 -8
  12. data/lib/dao/api/call.rb +19 -4
  13. data/lib/dao/api/dsl.rb +1 -1
  14. data/lib/dao/coerce.rb +211 -0
  15. data/lib/dao/conducer.rb +10 -14
  16. data/lib/dao/conducer/controller_support.rb +5 -0
  17. data/lib/dao/conducer/view_support.rb +0 -2
  18. data/lib/dao/db.rb +0 -1
  19. data/lib/dao/errors.rb +17 -11
  20. data/lib/dao/errors2html.rb +128 -0
  21. data/lib/dao/form.rb +13 -16
  22. data/lib/dao/messages.rb +0 -4
  23. data/lib/dao/path.rb +1 -1
  24. data/lib/dao/route.rb +2 -2
  25. data/lib/dao/status.rb +3 -4
  26. data/lib/dao/support.rb +26 -19
  27. data/lib/dao/upload.rb +0 -1
  28. data/lib/dao/validations/common.rb +6 -6
  29. data/lib/dao/validations/validator.rb +3 -3
  30. data/lib/dao/wrap.rb +259 -0
  31. data/tasks/default.rake +207 -0
  32. data/tasks/this.rb +207 -0
  33. data/test/active_model_conducer_lint_test.rb +3 -11
  34. data/test/api_test.rb +24 -35
  35. data/test/conducer_test.rb +37 -47
  36. data/test/errors_test.rb +29 -13
  37. data/test/form_test.rb +24 -34
  38. data/test/rake_rerun_reporter.rb +74 -0
  39. data/test/support_test.rb +9 -14
  40. data/test/test_helper.rb +220 -0
  41. data/test/{helper.rb → util.rb} +0 -0
  42. data/test/validations_test.rb +14 -28
  43. data/wrap-1.5.2/README +57 -0
  44. data/wrap-1.5.2/Rakefile +394 -0
  45. data/wrap-1.5.2/lib/wrap.rb +295 -0
  46. data/{test → wrap-1.5.2/test}/testing.rb +0 -1
  47. data/wrap-1.5.2/test/wrap_test.rb +397 -0
  48. data/wrap-1.5.2/wrap.gemspec +38 -0
  49. metadata +47 -103
  50. data/Gemfile +0 -16
  51. data/Gemfile.lock +0 -118
  52. data/README +0 -256
@@ -173,7 +173,6 @@ class Upload < ::Map
173
173
  attr_accessor :basename
174
174
  attr_accessor :io
175
175
  attr_accessor :tmpdir
176
- attr_accessor :placeholder
177
176
 
178
177
  IOs = {}
179
178
 
@@ -364,9 +364,9 @@ module Dao
364
364
  options = Map.options_for!(args)
365
365
  list = args + Array(options.delete(:keys)) + Array(options.delete(:or))
366
366
 
367
- list.each do |args|
367
+ list.each do |_args|
368
368
  candidates = list.dup
369
- candidates.delete(args)
369
+ candidates.delete(_args)
370
370
 
371
371
  message = options[:message] || "(or #{ candidates.map{|candidate| Array(candidate).join('.')}.join(', ') } ) is blank or missing"
372
372
  allow_nil = options[:allow_nil]
@@ -424,7 +424,7 @@ module Dao
424
424
 
425
425
  m
426
426
  end
427
- validates(*args, &block)
427
+ validates(*_args, &block)
428
428
  end
429
429
  end
430
430
 
@@ -432,9 +432,9 @@ module Dao
432
432
  options = Map.options_for!(args)
433
433
  list = args + Array(options.delete(:keys)) + Array(options.delete(:or))
434
434
 
435
- list.each do |args|
435
+ list.each do |_args|
436
436
  candidates = list.dup
437
- candidates.delete(args)
437
+ candidates.delete(_args)
438
438
 
439
439
  message = options[:message] || "(and #{ candidates.map{|candidate| Array(candidate).join('.')}.join(', ') } ) is blank or missing"
440
440
  allow_nil = options[:allow_nil]
@@ -492,7 +492,7 @@ module Dao
492
492
 
493
493
  m
494
494
  end
495
- validates(*args, &block)
495
+ validates(*_args, &block)
496
496
  end
497
497
  end
498
498
 
@@ -101,7 +101,7 @@ module Dao
101
101
  block = args.pop if args.last.respond_to?(:call)
102
102
  block ||= NotBlank
103
103
  callback = Callback.new(options, &block)
104
- options = Map.options_for!(args)
104
+ Map.options_for!(args)
105
105
  key = key_for(args)
106
106
  validations = stack.validations.last || self.validations
107
107
  validations[key] ||= Callback::Chain.new
@@ -112,7 +112,7 @@ module Dao
112
112
 
113
113
  def validates_each(*args, &block)
114
114
  options = Map.options_for!(args)
115
- key = key_for(args)
115
+ key_for(args)
116
116
 
117
117
  args.push(options)
118
118
 
@@ -299,7 +299,7 @@ module Dao
299
299
  if forcing_validity?
300
300
  true
301
301
  else
302
- options = Map.options_for!(args)
302
+ Map.options_for!(args)
303
303
  run_validations
304
304
  errors.empty? and status.ok?
305
305
  end
@@ -0,0 +1,259 @@
1
+ module Dao
2
+ module Wrap
3
+ def Wrap.included(other)
4
+ super
5
+ ensure
6
+ other.send(:instance_eval, &ClassMethods)
7
+ other.send(:class_eval, &InstanceMethods)
8
+ end
9
+
10
+ def Wrap.code_for(method)
11
+ name = method.name.to_s
12
+ arity = method.arity
13
+
14
+ case
15
+ when arity == 0
16
+ signature = <<-__.strip
17
+ def #{ name }(&block)
18
+ args = []
19
+ __
20
+
21
+ when arity < 0
22
+ argv = Array.new(arity.abs - 1){|i| "arg#{ i }"}
23
+ argv.push('*args')
24
+ argv = argv.join(', ')
25
+
26
+ signature = <<-__.strip
27
+ def #{ name }(#{ argv }, &block)
28
+ args = [#{ argv }]
29
+ __
30
+
31
+ when arity > 0
32
+ argv = Array.new(arity){|i| "arg#{ i }"}
33
+ argv = argv.join(', ')
34
+
35
+ signature = <<-__.strip
36
+ def #{ name }(#{ argv }, &block)
37
+ args = [#{ argv }]
38
+ __
39
+ end
40
+
41
+ code =
42
+ <<-__
43
+ #{ signature.strip }
44
+
45
+ if running_callbacks?(#{ name.inspect })
46
+ return wrapped_#{ name }(*args, &block)
47
+ end
48
+
49
+ running_callbacks(#{ name.inspect }) do
50
+ catch(:halt) do
51
+ return false if run_callbacks(:before, #{ name.inspect }, args)==false
52
+
53
+ begin
54
+ result = wrapped_#{ name }(*args, &block)
55
+ ensure
56
+ run_callbacks(:after, #{ name.inspect }, [result]) unless $!
57
+ end
58
+ end
59
+ end
60
+ end
61
+ __
62
+
63
+ return code
64
+ end
65
+
66
+ ClassMethods = proc do
67
+ def method_added(name)
68
+ return super if wrapping?
69
+ begin
70
+ super
71
+ ensure
72
+ wrap!(name) if wrapped?(name)
73
+ end
74
+ end
75
+
76
+ def include(other)
77
+ super
78
+ ensure
79
+ other.instance_methods.each do |name|
80
+ if wrapped?(name)
81
+ begin
82
+ remove_method(name)
83
+ rescue NameError
84
+ nil
85
+ end
86
+ wrap!(name)
87
+ end
88
+ end
89
+ end
90
+
91
+ def wrap(name, *args, &block)
92
+ wrapped!(name)
93
+
94
+ wrap!(name) if
95
+ begin
96
+ instance_method(name)
97
+ true
98
+ rescue NameError
99
+ false
100
+ end
101
+ end
102
+
103
+ def wrapped!(name)
104
+ name = name.to_s
105
+ wrapped.push(name) unless wrapped.include?(name)
106
+ name
107
+ end
108
+
109
+ def wrapped
110
+ @wrapped ||= []
111
+ end
112
+
113
+ def wrapped?(name)
114
+ ancestors.any?{|ancestor| ancestor.respond_to?(:wrapped) and ancestor.wrapped.include?(name.to_s)}
115
+ end
116
+
117
+ def wrap!(name)
118
+ name = name.to_s
119
+ method = instance_method(name)
120
+
121
+ wrapping! name do
122
+ name = name.to_s
123
+ wrapped_name = "wrapped_#{ name }"
124
+
125
+ begin
126
+ remove_method(wrapped_name)
127
+ rescue NameError
128
+ nil
129
+ end
130
+
131
+ alias_method(wrapped_name, name)
132
+
133
+ module_eval(Wrap.code_for(method))
134
+ end
135
+ end
136
+
137
+ def wrapping!(name, &block)
138
+ name = name.to_s
139
+ @wrapping ||= []
140
+
141
+ return if @wrapping.last == name
142
+
143
+ @wrapping.push(name)
144
+
145
+ begin
146
+ block.call
147
+ ensure
148
+ @wrapping.pop
149
+ end
150
+ end
151
+
152
+ def wrapping?(*name)
153
+ @wrapping ||= []
154
+
155
+ if name.empty?
156
+ !@wrapping.empty?
157
+ else
158
+ @wrapping.last == name.last.to_s
159
+ end
160
+ end
161
+
162
+ def callbacks
163
+ @callbacks ||= Map.new
164
+ end
165
+
166
+ def initialize_callbacks!(name)
167
+ callbacks[name] ||= Map[ :before, [], :after, [] ]
168
+ callbacks[name]
169
+ end
170
+
171
+ def before(name, *args, &block)
172
+ wrap(name) unless wrapped?(name)
173
+ name = wrap_expand_aliases(name)
174
+ cb = initialize_callbacks!(name)
175
+ cb.before.push(args.shift || block)
176
+ end
177
+
178
+ def after(name, *args, &block)
179
+ wrap(name) unless wrapped?(name)
180
+ name = wrap_expand_aliases(name)
181
+ cb = initialize_callbacks!(name)
182
+ cb.after.push(args.shift || block)
183
+ end
184
+
185
+ def wrap_aliases
186
+ @@wrap_aliases ||= Hash.new
187
+ end
188
+
189
+ def wrap_alias(dst, src)
190
+ wrap_aliases[dst.to_s] = src.to_s
191
+ end
192
+
193
+ def wrap_expand_aliases(name)
194
+ name = name.to_s
195
+ loop do
196
+ break unless wrap_aliases.has_key?(name)
197
+ name = wrap_aliases[name]
198
+ end
199
+ name
200
+ end
201
+ end
202
+
203
+ InstanceMethods = proc do
204
+ def running_callbacks(name, &block)
205
+ name = name.to_s
206
+ @running_callbacks ||= []
207
+ return block.call() if @running_callbacks.last == name
208
+
209
+ @running_callbacks.push(name)
210
+
211
+ begin
212
+ block.call()
213
+ ensure
214
+ @running_callbacks.pop
215
+ end
216
+ end
217
+
218
+ def running_callbacks?(*name)
219
+ @running_callbacks ||= []
220
+
221
+ if name.empty?
222
+ @running_callbacks.last
223
+ else
224
+ @running_callbacks.last == name.last.to_s
225
+ end
226
+ end
227
+
228
+ def run_callbacks(which, name, argv)
229
+ which = which.to_s.to_sym
230
+ name = name.to_s
231
+ list = []
232
+
233
+ self.class.ancestors.each do |ancestor|
234
+ next unless ancestor.respond_to?(:callbacks)
235
+
236
+ if ancestor.callbacks.is_a?(Map) and ancestor.callbacks[name].is_a?(Map)
237
+ callbacks = ancestor.callbacks[name][which]
238
+ accumulate = (which == :before ? :unshift : :push)
239
+ list.send(accumulate, *callbacks) if callbacks.is_a?(Array)
240
+ end
241
+ end
242
+
243
+ list.each do |callback|
244
+ block = callback.respond_to?(:call) ? callback : proc{ send(callback.to_s.to_sym) }
245
+ args = argv.slice(0 .. (block.arity > 0 ? block.arity : -1))
246
+ result = instance_exec(*args, &block)
247
+ return false if result == false
248
+ end
249
+
250
+ true
251
+ end
252
+
253
+ def halt!(*args)
254
+ value = args.size == 0 ? false : args.shift
255
+ throw(:halt, value)
256
+ end
257
+ end
258
+ end
259
+ end
@@ -0,0 +1,207 @@
1
+ # vim: syntax=ruby
2
+ require 'rake/clean'
3
+ require 'digest'
4
+ #------------------------------------------------------------------------------
5
+ # If you want to Develop on this project just run 'rake develop' and you'll
6
+ # have all you need to get going. If you want to use bundler for development,
7
+ # then run 'rake develop:using_bundler'
8
+ #------------------------------------------------------------------------------
9
+ namespace :develop do
10
+
11
+ # Install all the development and runtime dependencies of this gem using the
12
+ # gemspec.
13
+ task :default => 'Gemfile' do
14
+ require 'rubygems/dependency_installer'
15
+ installer = ::Gem::DependencyInstaller.new
16
+ puts "Installing bundler..."
17
+ installer.install 'bundler'
18
+ sh 'bundle install'
19
+ puts "\n\nNow run 'rake test'"
20
+ end
21
+
22
+ # Create a Gemfile that just references the gemspec
23
+ file 'Gemfile' => :gemspec do
24
+ File.open( "Gemfile", "w+" ) do |f|
25
+ f.puts "# DO NOT EDIT - This file is automatically generated"
26
+ f.puts "# Make changes to Manifest.txt and/or Rakefile and regenerate"
27
+ f.puts 'source "https://rubygems.org/"'
28
+ f.puts 'gemspec'
29
+ end
30
+ end
31
+ end
32
+ desc "Boostrap development"
33
+ task :develop => "develop:default"
34
+
35
+ #------------------------------------------------------------------------------
36
+ # Minitest - standard TestTask
37
+ #------------------------------------------------------------------------------
38
+ begin
39
+ require 'rake/testtask'
40
+ Rake::TestTask.new( :test ) do |t|
41
+ t.libs = %w[ lib spec test ]
42
+ t.pattern = "{test,spec}/**/{test_*,*_spec,*_test}.rb"
43
+ end
44
+
45
+ task :test_requirements
46
+ task :test => :test_requirements
47
+ task :default => :test
48
+ rescue LoadError
49
+ This.task_warning( 'test' )
50
+ end
51
+
52
+ #------------------------------------------------------------------------------
53
+ # Manifest - We want an explicit list of thos files that are to be packaged in
54
+ # the gem. Most of this is from Hoe.
55
+ #------------------------------------------------------------------------------
56
+ namespace 'manifest' do
57
+ desc "Check the manifest"
58
+ task :check => :clean do
59
+ files = FileList["**/*", ".*"].exclude( This.exclude_from_manifest ).to_a.sort
60
+ files = files.select{ |f| File.file?( f ) }
61
+
62
+ tmp = "Manifest.tmp"
63
+ File.open( tmp, 'w' ) do |f|
64
+ f.puts files.join("\n")
65
+ end
66
+
67
+ begin
68
+ sh "diff -du Manifest.txt #{tmp}"
69
+ ensure
70
+ rm tmp
71
+ end
72
+ puts "Manifest looks good"
73
+ end
74
+
75
+ desc "Generate the manifest"
76
+ task :generate => :clean do
77
+ files = %x[ git ls-files ].split("\n").sort
78
+ files.reject! { |f| f =~ This.exclude_from_manifest }
79
+ File.open( "Manifest.txt", "w" ) do |f|
80
+ f.puts files.join("\n")
81
+ end
82
+ end
83
+ end
84
+
85
+ #------------------------------------------------------------------------------
86
+ # Fixme - look for fixmes and report them
87
+ #------------------------------------------------------------------------------
88
+ namespace :fixme do
89
+ task :default => 'manifest:check' do
90
+ This.manifest.each do |file|
91
+ next if file == __FILE__
92
+ next unless file =~ %r/(txt|rb|md|rdoc|css|html|xml|css)\Z/
93
+ puts "FIXME: Rename #{file}" if file =~ /fixme/i
94
+ IO.readlines( file ).each_with_index do |line, idx|
95
+ prefix = "FIXME: #{file}:#{idx+1}".ljust(42)
96
+ puts "#{prefix} => #{line.strip}" if line =~ /fixme/i
97
+ end
98
+ end
99
+ end
100
+
101
+ def fixme_project_root
102
+ This.project_path( '../fixme' )
103
+ end
104
+
105
+ def fixme_project_path( subtree )
106
+ fixme_project_root.join( subtree )
107
+ end
108
+
109
+ def local_fixme_files
110
+ This.manifest.select { |p| p =~ %r|^tasks/| }
111
+ end
112
+
113
+ def outdated_fixme_files
114
+ local_fixme_files.select do |local|
115
+ upstream = fixme_project_path( local )
116
+ upstream.exist? &&
117
+ ( Digest::SHA256.file( local ) != Digest::SHA256.file( upstream ) )
118
+ end
119
+ end
120
+
121
+ def fixme_up_to_date?
122
+ outdated_fixme_files.empty?
123
+ end
124
+
125
+ desc "See if the fixme tools are outdated"
126
+ task :outdated => :release_check do
127
+ if fixme_up_to_date? then
128
+ puts "Fixme files are up to date."
129
+ else
130
+ outdated_fixme_files.each do |f|
131
+ puts "#{f} is outdated"
132
+ end
133
+ end
134
+ end
135
+
136
+ desc "Update outdated fixme files"
137
+ task :update => :release_check do
138
+ if fixme_up_to_date? then
139
+ puts "Fixme files are already up to date."
140
+ else
141
+ puts "Updating fixme files:"
142
+ outdated_fixme_files.each do |local|
143
+ upstream = fixme_project_path( local )
144
+ puts " * #{local}"
145
+ FileUtils.cp( upstream, local )
146
+ end
147
+ puts "Use your git commands as appropriate."
148
+ end
149
+ end
150
+ end
151
+ desc "Look for fixmes and report them"
152
+ task :fixme => "fixme:default"
153
+
154
+ #------------------------------------------------------------------------------
155
+ # Gem Specification
156
+ #------------------------------------------------------------------------------
157
+ # Really this is only here to support those who use bundler
158
+ desc "Build the #{This.name}.gemspec file"
159
+ task :gemspec do
160
+ File.open( This.gemspec_file, "wb+" ) do |f|
161
+ f.puts "# DO NOT EDIT - This file is automatically generated"
162
+ f.puts "# Make changes to Manifest.txt and/or Rakefile and regenerate"
163
+ f.write This.platform_gemspec.to_ruby
164
+ end
165
+ end
166
+
167
+ # .rbc files from ruby 2.0
168
+ CLOBBER << FileList["**/*.rbc"]
169
+
170
+ # The standard gem packaging task, everyone has it.
171
+ require 'rubygems/package_task'
172
+ ::Gem::PackageTask.new( This.platform_gemspec ) do
173
+ # nothing
174
+ end
175
+
176
+ #------------------------------------------------------------------------------
177
+ # Release - the steps we go through to do a final release, this is pulled from
178
+ # a compbination of mojombo's rakegem, hoe and hoe-git
179
+ #
180
+ # 1) make sure we are on the master branch
181
+ # 2) make sure there are no uncommitted items
182
+ # 3) check the manifest and make sure all looks good
183
+ # 4) build the gem
184
+ # 5) do an empty commit to have the commit message of the version
185
+ # 6) tag that commit as the version
186
+ # 7) push master
187
+ # 8) push the tag
188
+ # 7) pus the gem
189
+ #------------------------------------------------------------------------------
190
+ task :release_check do
191
+ unless `git branch` =~ /^\* master$/
192
+ abort "You must be on the master branch to release!"
193
+ end
194
+ unless `git status` =~ /^nothing to commit/m
195
+ abort "Nope, sorry, you have unfinished business"
196
+ end
197
+ end
198
+
199
+ desc "Create tag v#{This.version}, build and push #{This.platform_gemspec.full_name} to rubygems.org"
200
+ task :release => [ :release_check, 'manifest:check', :gem ] do
201
+ sh "git commit --allow-empty -a -m 'Release #{This.version}'"
202
+ sh "git tag -a -m 'v#{This.version}' v#{This.version}"
203
+ sh "git push origin master"
204
+ sh "git push origin v#{This.version}"
205
+ sh "gem push pkg/#{This.platform_gemspec.full_name}.gem"
206
+ end
207
+