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
@@ -106,7 +106,6 @@ module Dao
106
106
  collection = (y[collection.to_s] ||= {})
107
107
  id = next_id_for(collection, data)
108
108
  collection[id] = data
109
- record = collection[id]
110
109
  id
111
110
  end
112
111
  end
@@ -106,13 +106,13 @@ module Dao
106
106
  list.clear if clear
107
107
  list.push(message)
108
108
  list.uniq!
109
- list
110
109
  self
111
110
  end
112
111
  alias_method('add!', 'add')
113
112
  alias_method('add_to_base', 'add')
114
113
  alias_method('add_to_base!', 'add!')
115
114
 
115
+ # FIXME - this should accept an errors object
116
116
  def relay(*args)
117
117
  options = args.size > 1 ? Map.options_for!(args) : Map.new
118
118
 
@@ -123,7 +123,15 @@ module Dao
123
123
 
124
124
  errors.each do |*argv|
125
125
  msgs = Array(argv.pop)
126
+
127
+ # ref: support for key-style of https://github.com/glooko/mongoid-embedded-errors
128
+ #key = Array(argv.pop).flatten.compact.join('.')
129
+ #key = key.to_s.split('.')
130
+ #key.map!{|k| k =~ /\[(\d+)\]/ ? $1 : k}
131
+ #key = prefix + key
132
+
126
133
  key = prefix + Array(argv.pop)
134
+
127
135
  msgs.each{|msg| add(Array(options[:key] || key), msg, options)}
128
136
  end
129
137
  end
@@ -168,7 +176,7 @@ module Dao
168
176
  full_messages = []
169
177
 
170
178
  depth_first_each do |keys, value|
171
- index = keys.pop
179
+ _ = keys.pop
172
180
  key = keys
173
181
  value = value.to_s
174
182
 
@@ -186,7 +194,7 @@ module Dao
186
194
 
187
195
  def each_message
188
196
  depth_first_each do |keys, message|
189
- index = keys.pop
197
+ _ = keys.pop
190
198
  message = message.to_s.strip
191
199
  yield(keys, message)
192
200
  end
@@ -196,7 +204,7 @@ module Dao
196
204
  hash = Hash.new
197
205
 
198
206
  depth_first_each do |keys, value|
199
- index = keys.pop
207
+ _ = keys.pop
200
208
  hash[keys] ||= []
201
209
  hash[keys].push("#{ value }")
202
210
  end
@@ -211,9 +219,8 @@ module Dao
211
219
  alias_method('each_full', 'each_full_message')
212
220
 
213
221
  def messages
214
- messages =
215
- (self[Global]||[]).map{|message| message}.
216
- select{|message| not message.strip.empty?}
222
+ (self[Global] || []).map{|message| message}
223
+ .select{|message| not message.strip.empty?}
217
224
  end
218
225
 
219
226
  def global
@@ -227,7 +234,7 @@ module Dao
227
234
  # html generation methods
228
235
  #
229
236
  def to_html(*args)
230
- Errors.to_html(errors=self, *args)
237
+ Errors.to_html(self, *args)
231
238
  end
232
239
 
233
240
  def Errors.to_html(*args, &block)
@@ -239,7 +246,7 @@ module Dao
239
246
  end
240
247
 
241
248
  def Errors.errors_to_html(*args)
242
- ::Errors2Html.to_html(*args)
249
+ Errors2Html.to_html(*args)
243
250
  end
244
251
 
245
252
  def to_s(format = :html, *args, &block)
@@ -254,7 +261,6 @@ module Dao
254
261
 
255
262
  class KeyPrefixer
256
263
  attr_accessor :object
257
- attr_accessor :prefix
258
264
  attr_accessor :global
259
265
 
260
266
  def initialize(object)
@@ -299,7 +305,7 @@ module Dao
299
305
 
300
306
  def Errors.to_hash(*args)
301
307
  error = args.shift
302
- options = Map.options_for!(args)
308
+ Map.options_for!(args)
303
309
  errors = [error, *args].flatten.compact
304
310
 
305
311
  map = Map.new
@@ -0,0 +1,128 @@
1
+ module Dao
2
+ module Errors2Html
3
+ class View
4
+ def View.controller(&block)
5
+ controller = ::Current.controller ? ::Current.controller.dup : ::Current.mock_controller
6
+ block ? controller.instance_eval(&block) : controller
7
+ end
8
+
9
+ def View.render(*args)
10
+ options = args.extract_options!.to_options!
11
+ args.push(options)
12
+
13
+ unless options.has_key?(:layout)
14
+ options[:layout] = false
15
+ end
16
+
17
+ Array(View.controller{ render(*args) }).join.html_safe
18
+ end
19
+ end
20
+
21
+ def Errors2Html.to_html(*args)
22
+ if args.size == 1
23
+ case args.first
24
+ when Array, String, Symbol
25
+ messages = Array(args.first)
26
+ args = [{:base => messages}]
27
+ end
28
+ end
29
+
30
+ args.flatten!
31
+ args.compact!
32
+
33
+ at_least_one_error = false
34
+
35
+ errors = Map.new
36
+ errors[:global] = []
37
+ errors[:fields] = {}
38
+
39
+ args.each do |e|
40
+ flatten(e).each do |key, messages|
41
+ Array(messages).each do |message|
42
+ at_least_one_error = true
43
+ message = message.to_s.html_safe
44
+
45
+ if Array(key).join =~ /\A(?:[*]|base)\Z/iomx
46
+ errors.global.push(message).uniq!
47
+ else
48
+ (errors.fields[key] ||= []).push(message).uniq!
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ return "" unless at_least_one_error
55
+
56
+ locals = {
57
+ :errors => errors,
58
+ :global_errors => errors.global,
59
+ :fields_errors => errors.fields
60
+ }
61
+
62
+ if template
63
+ View.render(:template => template, :locals => locals, :layout => false)
64
+ else
65
+ View.render(:inline => inline, :locals => locals, :layout => false)
66
+ end
67
+ end
68
+
69
+ def Errors2Html.flatten(hashlike)
70
+ case hashlike
71
+ when Map
72
+ hash = Hash.new
73
+ hashlike.depth_first_each do |key, value|
74
+ _ = key.pop if key.last.is_a?(Integer)
75
+ (hash[key] ||= []).push(value)
76
+ end
77
+ hash
78
+ else
79
+ hashlike.respond_to?(:to_hash) ? hashlike.to_hash : hashlike
80
+ end
81
+ end
82
+
83
+ Fattr(:inline) do
84
+ <<-erb
85
+ <div class="errors2html errors-summary">
86
+ <h4 class="errors-caption">Sorry, we encountered some errors:</h4>
87
+
88
+ <% unless errors.global.empty? %>
89
+
90
+ <ul class="errors-global-list">
91
+ <% errors.global.each do |message| %>
92
+ <li class="errors-message">
93
+ <%= message %>
94
+ </li>
95
+ <% end %>
96
+ </ul>
97
+ <% end %>
98
+
99
+ <% unless errors.fields.empty? %>
100
+
101
+ <dl class="errors-fields-list">
102
+ <%
103
+ errors.fields.each do |key, messages|
104
+ title = Array(key).join(" ").titleize
105
+ %>
106
+ <dt class="errors-title">
107
+ <%= title %>
108
+ </dt>
109
+ <% Array(messages).each do |message| %>
110
+ <dd class="errors-message">
111
+ <%= message %>
112
+ </dd>
113
+
114
+ <% end %>
115
+ <% end %>
116
+ </dl>
117
+ <% end %>
118
+ </div>
119
+ erb
120
+ end
121
+
122
+ Fattr(:template){ nil }
123
+ end
124
+
125
+ ##
126
+ #
127
+ Errors2HTML = Errors2Html
128
+ end
@@ -12,7 +12,7 @@ module Dao
12
12
  # builder stuff for compatibity with rails' form_for()
13
13
  #
14
14
  class Builder < Form
15
- def Builder.new(object_name, object, view, options, block)
15
+ def Builder.new(object_name, object, view, options, block=:rails_3_4_5)
16
16
  if object.respond_to?(:form)
17
17
 
18
18
  html = options[:html] || {}
@@ -40,7 +40,6 @@ module Dao
40
40
  #
41
41
  attr_accessor :object
42
42
  attr_accessor :unscoped
43
- attr_accessor :scope
44
43
 
45
44
  def initialize(*args)
46
45
  @object = args.shift
@@ -173,7 +172,7 @@ module Dao
173
172
  if block.nil? and !options.has_key?(:content)
174
173
  ''
175
174
  else
176
- block ? block.call(form=self) : options.delete(:content)
175
+ block ? block.call(self) : options.delete(:content)
177
176
  end
178
177
 
179
178
  form_(options_for(options, :action => action, :method => method, :class => klass, :id => id, :data_error => error)){ content }
@@ -275,7 +274,7 @@ module Dao
275
274
  options[:checked] = checked if checked
276
275
  end
277
276
 
278
- input_(options_for(options, :type => :radio, :name => name, :class => klass, :id => id, :data_error => error)){}
277
+ input_(options_for(options, :type => type, :name => name, :class => klass, :id => id, :data_error => error)){}
279
278
  end
280
279
 
281
280
  def checkbox(*args, &block)
@@ -303,14 +302,14 @@ module Dao
303
302
  values.map{|k, v| h[ k =~ /t|1|on|yes/ ? true : false ] = v}
304
303
  h
305
304
  else
306
- t, f, *ignored = Array(values).flatten.compact
305
+ t, f, *_ = Array(values).flatten.compact
307
306
  {true => t, false => f}
308
307
  end
309
308
  value_for[true] ||= '1'
310
309
  value_for[false] ||= '0'
311
310
 
312
311
  hidden_options =
313
- options.dup.tap{|o| o.delete(:checked)}
312
+ options.dup.tap{|o| [:checked, :required, :disabled].each{|k| o.delete(k)}}
314
313
 
315
314
  tagz{
316
315
  input_(options_for(hidden_options, :type => :hidden, :name => name, :value => value_for[false])){}
@@ -320,7 +319,7 @@ module Dao
320
319
  input_(
321
320
  options_for(
322
321
  options,
323
- :type => :checkbox,
322
+ :type => type,
324
323
  :name => name,
325
324
  :value => value_for[true],
326
325
  :class => klass,
@@ -367,7 +366,7 @@ module Dao
367
366
  end
368
367
 
369
368
  def select(*args, &block)
370
- options = args.extract_options!.to_options!
369
+ options = args.extract_options!.to_options!
371
370
  keys = scope(args)
372
371
 
373
372
  name = options.delete(:name) || name_for(keys)
@@ -381,7 +380,7 @@ module Dao
381
380
  error = error_for(keys, options.delete(:error))
382
381
 
383
382
  if values.nil?
384
- key = keys.map{|key| "#{ key }"}
383
+ key = keys.map{|k| "#{k}"}
385
384
  key.last << "_options"
386
385
  values = attributes.get(*key) if attributes.has?(*key)
387
386
  end
@@ -442,7 +441,7 @@ module Dao
442
441
 
443
442
  case returned
444
443
  when Array
445
- content, value, selected, *ignored = returned
444
+ content, value, selected, *_ = returned
446
445
  if value.is_a?(Hash)
447
446
  map = Map.for(value)
448
447
  value = map.delete(:value)
@@ -506,7 +505,7 @@ module Dao
506
505
  # html generation support methods
507
506
  #
508
507
  def id_for(keys)
509
- id = [name, keys.join('-')].compact.join('_')
508
+ id = [name, keys.join('-')].compact.join('--')
510
509
  slug_for(id)
511
510
  end
512
511
 
@@ -641,7 +640,7 @@ module Dao
641
640
  end
642
641
 
643
642
  def attr_for(string)
644
- slug_for(string).gsub(/_/, '-')
643
+ slug_for(string)
645
644
  end
646
645
 
647
646
  def data_attr_for(string)
@@ -650,10 +649,8 @@ module Dao
650
649
 
651
650
  def slug_for(string)
652
651
  string = string.to_s
653
- words = string.to_s.scan(%r/\w+/)
654
- words.map!{|word| word.gsub(%r/[^0-9a-zA-Z_:-]/, '')}
655
- words.delete_if{|word| word.nil? or word.strip.empty?}
656
- words.join('-').downcase.sub(/_+$/, '')
652
+ words = string.scan(%r/[^\s]+/)
653
+ words.join('--').downcase
657
654
  end
658
655
 
659
656
  def titleize(string)
@@ -57,10 +57,6 @@ module Dao
57
57
  Messages.to_html(self)
58
58
  end
59
59
 
60
- def to_s(*args)
61
- to_html(*args)
62
- end
63
-
64
60
  def Messages.to_text(*args)
65
61
  to_text = []
66
62
  Messages.each(*args) do |message|
@@ -21,7 +21,7 @@ module Dao
21
21
  path.squeeze!('/')
22
22
  path.sub!(%r|^/|, '')
23
23
  path.sub!(%r|/$|, '')
24
- paths = path.split('/')
24
+ path.split('/')
25
25
  end
26
26
 
27
27
  def absolute_path_for(arg, *args)
@@ -54,7 +54,7 @@ module Dao
54
54
  end
55
55
 
56
56
  def match(path)
57
- match = pattern.match(path).to_a
57
+ pattern.match(path).to_a
58
58
  end
59
59
 
60
60
  def params_for(path)
@@ -62,7 +62,7 @@ module Dao
62
62
 
63
63
  unless match.empty?
64
64
  map = Map.new
65
- ignored = match.shift
65
+ _ = match.shift
66
66
  @keys.each_with_index do |key, index|
67
67
  map[key] = match[index]
68
68
  end
@@ -181,7 +181,6 @@ module Dao
181
181
  arg = args.shift
182
182
  case arg
183
183
  when Result
184
- result = arg
185
184
  if arg.errors.nil? or arg.errors.empty? or arg.valid?
186
185
  new(200)
187
186
  else
@@ -189,7 +188,7 @@ module Dao
189
188
  end
190
189
  when Status
191
190
  arg
192
- when Fixnum
191
+ when Integer
193
192
  code = arg
194
193
  message = Code2Message[code]
195
194
  new(code, message)
@@ -276,7 +275,7 @@ module Dao
276
275
  end
277
276
 
278
277
  Groups.each do |code, group|
279
- module_eval <<-__, __FILE__, __LINE__ -1
278
+ module_eval(<<-__, __FILE__, __LINE__ - 1)
280
279
  def Status.#{ group }
281
280
  @status_group_#{ group } ||= Status.for(#{ code })
282
281
  end
@@ -316,7 +315,7 @@ module Dao
316
315
  end
317
316
 
318
317
  def clone
319
- clone = Status.for(code)
318
+ Status.for(code)
320
319
  end
321
320
 
322
321
  def to_json(*args, &block)
@@ -120,6 +120,9 @@ module Dao
120
120
 
121
121
  paths_and_values.each do |path, value|
122
122
  keys = keys_for(path)
123
+ if map.has?(keys)
124
+ inc_keys!(keys)
125
+ end
123
126
  map.set(keys => value)
124
127
  end
125
128
 
@@ -141,9 +144,24 @@ module Dao
141
144
  digity ? stringy ? String(digits) : Integer(digits) : key
142
145
  end
143
146
  end
144
-
145
147
  alias_method(:key_for, :keys_for)
146
148
 
149
+ def inc_keys!(keys)
150
+ last_number_index = nil
151
+
152
+ keys.each_with_index do |k, i|
153
+ if k.is_a?(Numeric)
154
+ last_number_index = i
155
+ end
156
+ end
157
+
158
+ if last_number_index
159
+ keys[last_number_index] = keys[last_number_index] + 1
160
+ end
161
+
162
+ keys
163
+ end
164
+
147
165
  def render_json(object, options = {})
148
166
  options = options.to_options!
149
167
  controller = options[:controller] || Dao.current_controller
@@ -165,12 +183,13 @@ module Dao
165
183
  def json_for(object, options = {})
166
184
  object = object.as_json if object.respond_to?(:as_json)
167
185
 
168
- options = options.empty? ? Map.for(options) : options
169
- options[:pretty] = json_pretty? unless options.has_key?(:pretty)
186
+ pretty = (options.delete(:pretty) || json_pretty?)
187
+
188
+ generate = pretty ? :pretty_generate : :generate
170
189
 
171
190
  begin
172
- MultiJson.dump(object, options)
173
- rescue Object => e
191
+ JSON.send(generate, object, options)
192
+ rescue Object => _
174
193
  YAML.load( object.to_yaml ).to_json
175
194
  end
176
195
  end
@@ -213,21 +232,9 @@ module Dao
213
232
  end
214
233
  end
215
234
 
216
-
217
- {
218
- 'ffi-uuid' => proc{|*args| FFI::UUID.generate_time.to_s},
219
- 'uuidtools' => proc{|*args| UUIDTools::UUID.timestamp_create.to_s},
220
- 'uuid' => proc{|*args| UUID.generate.to_s},
221
- }.each do |lib, implementation|
222
- begin
223
- require(lib)
224
- define_method(:uuid, &implementation)
225
- break
226
- rescue LoadError
227
- nil
228
- end
235
+ def uuid
236
+ SecureRandom.uuid
229
237
  end
230
- abort 'no suitable uuid generation library detected' unless method_defined?(:uuid)
231
238
 
232
239
  def ensure_interface!(object, *interface)
233
240
  interface.flatten.compact.each do |method|