dao 2.1.0 → 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -105,6 +105,7 @@ READING
105
105
  http://www.codefutures.com/data-access-object/
106
106
  http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
107
107
  http://www.paperplanes.de/2010/5/7/activerecord_callbacks_ruined_my_life.html
108
+ http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml
108
109
 
109
110
  INSTALL
110
111
  gem 'dao', :path => File.expand_path('..') ### Gemfile
data/TODO ADDED
@@ -0,0 +1,39 @@
1
+ todo:
2
+
3
+ - auto apply?
4
+
5
+ - pre-condition and parameter code
6
+
7
+
8
+ - class level nested AR conversions
9
+ to_dao(:a, :b => [:foo, :bar])
10
+
11
+
12
+
13
+ done:
14
+ - engine-ify the rails stuff? or what
15
+ - generator api
16
+ - controller
17
+ - helper
18
+ - json/pretty fix baked in? (yajl might simply this...)
19
+ - description/doc logic
20
+ - api.index
21
+ - to_alpo -> to_dao
22
+ - tests!
23
+ - #call auto parses data iff appropriate
24
+ @result = api.read.call('/posts/new(', params) ### check keys for '/posts/new'
25
+ - re-visit how parameters are parsed, perhaps we just use rack?
26
+ - next 'data' => {}
27
+ - check the db layer
28
+ - make sure one can call route based method (/foo/:bar) methods with params...
29
+ - Path==Route ??
30
+ - add result.rb, params.rb
31
+ - name -> path
32
+ - tagz for html methods?
33
+ - data aquires the name/path of the method?
34
+ - interfaces are objects that respond to call. namespaces respond to call.
35
+ api responds to call
36
+ - nested namespaces
37
+ - routing for path_info + mode
38
+ route(path_info, :mode => mode, :params => params)
39
+ - call() on namespaces AND interfaces... why?
data/dao.gemspec CHANGED
@@ -3,12 +3,12 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "dao"
6
- spec.version = "2.1.0"
6
+ spec.version = "2.2.3"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "dao"
9
9
  spec.description = "description: dao kicks the ass"
10
10
 
11
- spec.files = ["dao.gemspec", "lib", "lib/dao", "lib/dao/active_record.rb", "lib/dao/api", "lib/dao/api/context.rb", "lib/dao/api/dsl.rb", "lib/dao/api/endpoints.rb", "lib/dao/api/initializers.rb", "lib/dao/api/interfaces.rb", "lib/dao/api/modes.rb", "lib/dao/api.rb", "lib/dao/blankslate.rb", "lib/dao/data.rb", "lib/dao/db.rb", "lib/dao/endpoint.rb", "lib/dao/engine.rb", "lib/dao/errors.rb", "lib/dao/exceptions.rb", "lib/dao/form.rb", "lib/dao/instance_exec.rb", "lib/dao/interface.rb", "lib/dao/mode.rb", "lib/dao/mongo_mapper.rb", "lib/dao/params.rb", "lib/dao/path.rb", "lib/dao/rails", "lib/dao/rails/app", "lib/dao/rails/app/api.rb", "lib/dao/rails/app/controllers", "lib/dao/rails/app/controllers/api_controller.rb", "lib/dao/rails/engine", "lib/dao/rails/lib", "lib/dao/rails/lib/generators", "lib/dao/rails/lib/generators/dao", "lib/dao/rails/lib/generators/dao/api_generator.rb", "lib/dao/rails/lib/generators/dao/dao_generator.rb", "lib/dao/rails/lib/generators/dao/templates", "lib/dao/rails/lib/generators/dao/templates/api.rb", "lib/dao/rails/lib/generators/dao/templates/api_controller.rb", "lib/dao/rails/lib/generators/dao/templates/dao.css", "lib/dao/rails/lib/generators/dao/templates/dao.js", "lib/dao/rails/lib/generators/dao/templates/dao_helper.rb", "lib/dao/rails/lib/generators/dao/USAGE", "lib/dao/rails.rb", "lib/dao/result.rb", "lib/dao/slug.rb", "lib/dao/status.rb", "lib/dao/stdext.rb", "lib/dao/support.rb", "lib/dao/validations.rb", "lib/dao.rb", "Rakefile", "README", "sample", "sample/rails_app", "sample/rails_app/app", "sample/rails_app/app/api.rb", "sample/rails_app/app/controllers", "sample/rails_app/app/controllers/api_controller.rb", "sample/rails_app/app/controllers/application_controller.rb", "sample/rails_app/app/helpers", "sample/rails_app/app/helpers/application_helper.rb", "sample/rails_app/app/mailers", "sample/rails_app/app/models", "sample/rails_app/app/views", "sample/rails_app/app/views/layouts", "sample/rails_app/app/views/layouts/application.html.erb", "sample/rails_app/config", "sample/rails_app/config/application.rb", "sample/rails_app/config/boot.rb", "sample/rails_app/config/database.yml", "sample/rails_app/config/environment.rb", "sample/rails_app/config/environments", "sample/rails_app/config/environments/development.rb", "sample/rails_app/config/environments/production.rb", "sample/rails_app/config/environments/test.rb", "sample/rails_app/config/initializers", "sample/rails_app/config/initializers/backtrace_silencers.rb", "sample/rails_app/config/initializers/inflections.rb", "sample/rails_app/config/initializers/mime_types.rb", "sample/rails_app/config/initializers/secret_token.rb", "sample/rails_app/config/initializers/session_store.rb", "sample/rails_app/config/locales", "sample/rails_app/config/locales/en.yml", "sample/rails_app/config/routes.rb", "sample/rails_app/config.ru", "sample/rails_app/db", "sample/rails_app/db/development.sqlite3", "sample/rails_app/db/seeds.rb", "sample/rails_app/doc", "sample/rails_app/doc/README_FOR_APP", "sample/rails_app/Gemfile", "sample/rails_app/Gemfile.lock", "sample/rails_app/lib", "sample/rails_app/lib/tasks", "sample/rails_app/log", "sample/rails_app/log/development.log", "sample/rails_app/log/production.log", "sample/rails_app/log/server.log", "sample/rails_app/log/test.log", "sample/rails_app/pubic", "sample/rails_app/pubic/javascripts", "sample/rails_app/pubic/javascripts/dao.js", "sample/rails_app/public", "sample/rails_app/public/404.html", "sample/rails_app/public/422.html", "sample/rails_app/public/500.html", "sample/rails_app/public/favicon.ico", "sample/rails_app/public/images", "sample/rails_app/public/images/rails.png", "sample/rails_app/public/index.html", "sample/rails_app/public/javascripts", "sample/rails_app/public/javascripts/application.js", "sample/rails_app/public/javascripts/controls.js", "sample/rails_app/public/javascripts/dragdrop.js", "sample/rails_app/public/javascripts/effects.js", "sample/rails_app/public/javascripts/prototype.js", "sample/rails_app/public/javascripts/rails.js", "sample/rails_app/public/robots.txt", "sample/rails_app/public/stylesheets", "sample/rails_app/Rakefile", "sample/rails_app/README", "sample/rails_app/script", "sample/rails_app/script/rails", "sample/rails_app/test", "sample/rails_app/test/fixtures", "sample/rails_app/test/functional", "sample/rails_app/test/integration", "sample/rails_app/test/performance", "sample/rails_app/test/performance/browsing_test.rb", "sample/rails_app/test/test_helper.rb", "sample/rails_app/test/unit", "sample/rails_app/tmp/cache", "sample/rails_app/tmp/pids", "sample/rails_app/tmp/sessions", "sample/rails_app/tmp/sockets", "sample/rails_app/vendor", "sample/rails_app/vendor/plugins", "test", "test/dao_test.rb", "test/helper.rb", "test/testing.rb", "test/units"]
11
+ spec.files = ["dao.gemspec", "lib", "lib/dao", "lib/dao/active_record.rb", "lib/dao/api", "lib/dao/api/context.rb", "lib/dao/api/dsl.rb", "lib/dao/api/endpoints.rb", "lib/dao/api/initializers.rb", "lib/dao/api/interfaces.rb", "lib/dao/api/modes.rb", "lib/dao/api.rb", "lib/dao/blankslate.rb", "lib/dao/data.rb", "lib/dao/db.rb", "lib/dao/endpoint.rb", "lib/dao/engine.rb", "lib/dao/errors.rb", "lib/dao/exceptions.rb", "lib/dao/form.rb", "lib/dao/instance_exec.rb", "lib/dao/interface.rb", "lib/dao/mode.rb", "lib/dao/mongo_mapper.rb", "lib/dao/params.rb", "lib/dao/path.rb", "lib/dao/presenter.rb", "lib/dao/rails", "lib/dao/rails/app", "lib/dao/rails/app/api.rb", "lib/dao/rails/app/controllers", "lib/dao/rails/app/controllers/api_controller.rb", "lib/dao/rails/lib", "lib/dao/rails/lib/generators", "lib/dao/rails/lib/generators/dao", "lib/dao/rails/lib/generators/dao/api_generator.rb", "lib/dao/rails/lib/generators/dao/dao_generator.rb", "lib/dao/rails/lib/generators/dao/templates", "lib/dao/rails/lib/generators/dao/templates/api.rb", "lib/dao/rails/lib/generators/dao/templates/api_controller.rb", "lib/dao/rails/lib/generators/dao/templates/dao.css", "lib/dao/rails/lib/generators/dao/templates/dao.js", "lib/dao/rails/lib/generators/dao/templates/dao_helper.rb", "lib/dao/rails/lib/generators/dao/USAGE", "lib/dao/rails.rb", "lib/dao/result.rb", "lib/dao/slug.rb", "lib/dao/status.rb", "lib/dao/stdext.rb", "lib/dao/support.rb", "lib/dao/validations.rb", "lib/dao.rb", "Rakefile", "README", "sample", "sample/rails_app", "sample/rails_app/app", "sample/rails_app/app/api.rb", "sample/rails_app/app/controllers", "sample/rails_app/app/controllers/api_controller.rb", "sample/rails_app/app/controllers/application_controller.rb", "sample/rails_app/app/helpers", "sample/rails_app/app/helpers/application_helper.rb", "sample/rails_app/app/mailers", "sample/rails_app/app/models", "sample/rails_app/app/views", "sample/rails_app/app/views/layouts", "sample/rails_app/app/views/layouts/application.html.erb", "sample/rails_app/config", "sample/rails_app/config/application.rb", "sample/rails_app/config/boot.rb", "sample/rails_app/config/database.yml", "sample/rails_app/config/environment.rb", "sample/rails_app/config/environments", "sample/rails_app/config/environments/development.rb", "sample/rails_app/config/environments/production.rb", "sample/rails_app/config/environments/test.rb", "sample/rails_app/config/initializers", "sample/rails_app/config/initializers/backtrace_silencers.rb", "sample/rails_app/config/initializers/inflections.rb", "sample/rails_app/config/initializers/mime_types.rb", "sample/rails_app/config/initializers/secret_token.rb", "sample/rails_app/config/initializers/session_store.rb", "sample/rails_app/config/locales", "sample/rails_app/config/locales/en.yml", "sample/rails_app/config/routes.rb", "sample/rails_app/config.ru", "sample/rails_app/db", "sample/rails_app/db/development.sqlite3", "sample/rails_app/db/seeds.rb", "sample/rails_app/doc", "sample/rails_app/doc/README_FOR_APP", "sample/rails_app/Gemfile", "sample/rails_app/Gemfile.lock", "sample/rails_app/lib", "sample/rails_app/lib/tasks", "sample/rails_app/log", "sample/rails_app/log/development.log", "sample/rails_app/log/production.log", "sample/rails_app/log/server.log", "sample/rails_app/log/test.log", "sample/rails_app/pubic", "sample/rails_app/pubic/javascripts", "sample/rails_app/pubic/javascripts/dao.js", "sample/rails_app/public", "sample/rails_app/public/404.html", "sample/rails_app/public/422.html", "sample/rails_app/public/500.html", "sample/rails_app/public/favicon.ico", "sample/rails_app/public/images", "sample/rails_app/public/images/rails.png", "sample/rails_app/public/index.html", "sample/rails_app/public/javascripts", "sample/rails_app/public/javascripts/application.js", "sample/rails_app/public/javascripts/controls.js", "sample/rails_app/public/javascripts/dragdrop.js", "sample/rails_app/public/javascripts/effects.js", "sample/rails_app/public/javascripts/prototype.js", "sample/rails_app/public/javascripts/rails.js", "sample/rails_app/public/robots.txt", "sample/rails_app/public/stylesheets", "sample/rails_app/Rakefile", "sample/rails_app/README", "sample/rails_app/script", "sample/rails_app/script/rails", "sample/rails_app/test", "sample/rails_app/test/fixtures", "sample/rails_app/test/functional", "sample/rails_app/test/integration", "sample/rails_app/test/performance", "sample/rails_app/test/performance/browsing_test.rb", "sample/rails_app/test/test_helper.rb", "sample/rails_app/test/unit", "sample/rails_app/tmp/cache", "sample/rails_app/tmp/pids", "sample/rails_app/tmp/sessions", "sample/rails_app/tmp/sockets", "sample/rails_app/vendor", "sample/rails_app/vendor/plugins", "test", "test/dao_test.rb", "test/helper.rb", "test/testing.rb", "test/units", "TODO"]
12
12
  spec.executables = []
13
13
 
14
14
  spec.require_path = "lib"
@@ -20,9 +20,9 @@ Gem::Specification::new do |spec|
20
20
 
21
21
  spec.add_dependency(*["tagz", "~> 8.2.0"])
22
22
 
23
- spec.add_dependency(*["map", "~> 2.6.1"])
23
+ spec.add_dependency(*["map", "~> 2.7.0"])
24
24
 
25
- spec.add_dependency(*["yajl-ruby", "~> 0.7.9"])
25
+ spec.add_dependency(*["yajl-ruby", "~> 0.8.1"])
26
26
 
27
27
 
28
28
  spec.extensions.push(*[])
data/lib/dao.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # built-ins
2
2
  #
3
3
  require 'enumerator'
4
+ require 'set'
4
5
  #require 'fileutils'
5
6
  #require 'pathname'
6
7
  #require 'yaml'
@@ -9,7 +10,7 @@
9
10
  # dao libs
10
11
  #
11
12
  module Dao
12
- Version = '2.1.0' unless defined?(Version)
13
+ Version = '2.2.3' unless defined?(Version)
13
14
 
14
15
  def version
15
16
  Dao::Version
@@ -17,9 +18,9 @@
17
18
 
18
19
  def dependencies
19
20
  {
20
- 'map' => ['map', '~> 2.6.1'],
21
- 'tagz' => ['tagz', '~> 8.2.0'],
22
- 'yajl' => ['yajl-ruby', '~> 0.7.9']
21
+ 'map' => ['map' , '~> 2.7.0'],
22
+ 'tagz' => ['tagz' , '~> 8.2.0'],
23
+ 'yajl' => ['yajl-ruby' , '~> 0.8.1']
23
24
  }
24
25
  end
25
26
 
@@ -60,6 +61,8 @@
60
61
  end
61
62
  end
62
63
 
64
+ require 'yajl/json_gem'
65
+
63
66
  Dao.load %w[
64
67
  blankslate.rb
65
68
  instance_exec.rb
@@ -75,6 +78,7 @@
75
78
  form.rb
76
79
  errors.rb
77
80
  validations.rb
81
+ presenter.rb
78
82
 
79
83
  mode.rb
80
84
  path.rb
@@ -26,24 +26,66 @@ if defined?(ActiveRecord)
26
26
  end
27
27
 
28
28
  def Base.record_to_dao(record, *args)
29
+ # setup for eff'ing madness
30
+ #
29
31
  model = record.class
30
32
  map = Dao.map
31
33
  map[:model] = model.name.underscore
32
34
  map[:id] = record.id
33
35
 
36
+ # yank out options if they are patently obvious...
37
+ #
38
+ if args.size == 2 and args.first.is_a?(Array) and args.last.is_a?(Hash)
39
+ options = Dao.map(args.last)
40
+ args = args.first
41
+ else
42
+ options = nil
43
+ end
44
+
45
+ # search for options inside args...
46
+ #
47
+ if options.nil?
48
+ last = args.last
49
+ options = Dao.map
50
+
51
+ if last.is_a?(Hash)
52
+ last = Dao.map(last)
53
+ keys = %w( include includes with )
54
+ if keys.any?{|key| last.has_key?(key)}
55
+ options.update(last)
56
+ args.pop
57
+ end
58
+ end
59
+ end
60
+
61
+ # refine the list with includes iff passed as options
62
+ #
63
+ if options.has_key?(:include) or options.has_key?(:includes) or options.has_key?(:with)
64
+ args.replace(model.to_dao) if args.empty?
65
+ args.push(options[:include]) if options[:include]
66
+ args.push(options[:includes]) if options[:includes]
67
+ args.push(options[:with]) if options[:with]
68
+ end
69
+
70
+ # take passed in args or model defaults
71
+ #
34
72
  list = args.empty? ? model.to_dao : args
35
73
 
74
+ # okay - go!
75
+ #
36
76
  list.each do |attr|
37
77
  if attr.is_a?(Array)
38
78
  related, *argv = attr
39
- value = record.send(related).to_dao(*argv)
79
+ v = record.send(related)
80
+ value = v.respond_to?(:to_dao) ? v.to_dao(*argv) : v
40
81
  map[related] = value
41
82
  next
42
83
  end
43
84
 
44
85
  if attr.is_a?(Hash)
45
86
  attr.each do |related, argv|
46
- value = record.send(related).to_dao(*argv)
87
+ v = record.send(related)
88
+ value = v.respond_to?(:to_dao) ? v.to_dao(*argv) : v
47
89
  map[related] = value
48
90
  end
49
91
  next
@@ -76,8 +118,8 @@ if defined?(ActiveRecord)
76
118
  model = record.class
77
119
  model.record_to_dao(record, *args)
78
120
  end
79
- alias_method('to_h', 'to_dao')
80
- alias_method('to_map', 'to_dao') ### HACK
121
+ ### alias_method('to_h', 'to_dao')
122
+ ### alias_method('to_map', 'to_dao') ### HACK
81
123
  end
82
124
  end
83
125
 
@@ -26,6 +26,8 @@ module Dao
26
26
  interfaces[path] = interface
27
27
  end
28
28
 
29
+ alias_method('call', 'interface')
30
+
29
31
  def description(string)
30
32
  doc(:description => Dao.unindent(string))
31
33
  end
@@ -55,13 +57,19 @@ module Dao
55
57
  end
56
58
  end
57
59
 
58
- def call(path = '/index', params = {})
60
+ def call(path = '/index', params = {}, options = {})
59
61
  api = self
60
62
  path = Path.new(path)
61
63
  interface = interfaces[path]
62
- raise(NameError, "NO SUCH INTERFACE: #{ path }") unless interface
63
64
 
64
- params = Dao.parse(path, params)
65
+ unless interface
66
+ return index if path == '/index'
67
+ raise(NameError, "NO SUCH INTERFACE: #{ path }")
68
+ end
69
+
70
+ options = Map.options(options || {})
71
+
72
+ params = Dao.parse(path, params, options)
65
73
 
66
74
  context = Context.new(
67
75
  :api => api,
@@ -77,7 +85,9 @@ module Dao
77
85
  end
78
86
 
79
87
  def index
80
- self.class.index
88
+ result = Result.new('/index')
89
+ result.data.update(self.class.index)
90
+ result
81
91
  end
82
92
 
83
93
  def interfaces
@@ -122,6 +132,11 @@ module Dao
122
132
  result.status(*args, &block)
123
133
  end
124
134
 
135
+ def status!(*args, &block)
136
+ status(*args, &block)
137
+ return!
138
+ end
139
+
125
140
  def data(*args)
126
141
  if args.empty?
127
142
  result.data
data/lib/dao/data.rb CHANGED
@@ -5,61 +5,11 @@ module Dao
5
5
 
6
6
  def update(*args, &block)
7
7
  if args.size==1 and args.first.respond_to?(:to_dao)
8
- update(args.first.to_dao)
8
+ to_dao = args.first.to_dao
9
+ update(to_dao)
10
+ return(to_dao)
9
11
  end
10
12
  super
11
13
  end
12
14
  end
13
15
  end
14
-
15
-
16
- =begin
17
- %w( to_dao as_dao ).each do |method|
18
- module_eval <<-__, __FILE__, __LINE__
19
- def #{ method }(object, *args, &block)
20
- case object
21
- when Array
22
- object.map{|element| Data.#{ method }(element)}
23
-
24
- else
25
- if object.respond_to?(:#{ method })
26
- object.send(:#{ method }, *args, &block)
27
- else
28
- object
29
- end
30
- end
31
- end
32
- __
33
- end
34
- =end
35
-
36
- =begin
37
- IdKeys =
38
- %w( id uuid guid ).map{|key| [key, key.to_sym, "_#{ key }", "_#{ key }".to_sym]}.flatten
39
-
40
- def id
41
- IdKeys.each{|key| return self[key] if has_key?(key)}
42
- return nil
43
- end
44
-
45
- def has_id?
46
- IdKeys.each{|key| return true if has_key?(key)}
47
- return false
48
- end
49
-
50
- def new?
51
- !has_id?
52
- end
53
-
54
- def new_record?
55
- !has_id?
56
- end
57
-
58
- def model_name
59
- path.to_s
60
- end
61
-
62
- def slug
63
- Slug.for(path)
64
- end
65
- =end
data/lib/dao/errors.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Dao
2
2
  class Errors < ::Map
3
3
  include Tagz.globally
4
+
4
5
  class << Errors
5
6
  include Tagz.globally
6
7
  end
@@ -21,6 +22,10 @@ module Dao
21
22
  @sticky ||= nil
22
23
  !!@sticky
23
24
  end
25
+
26
+ def to_s
27
+ self
28
+ end
24
29
  end
25
30
 
26
31
  class << Errors
@@ -67,8 +72,12 @@ module Dao
67
72
  else
68
73
  errors[keys] = Message.new(message, :sticky => sticky)
69
74
  end
75
+ else
76
+ raise(ArgumentError, 'no message!')
70
77
  end
71
78
 
79
+ message = Message.new(message) unless message.is_a?(Message)
80
+
72
81
  result = []
73
82
 
74
83
  errors.each do |keys, message|
@@ -84,7 +93,15 @@ module Dao
84
93
 
85
94
  result
86
95
  end
87
- alias_method 'add_to_base', 'add'
96
+ alias_method('add_to_base', 'add')
97
+
98
+ def add!(*args)
99
+ options = Dao.map_for(args.last.is_a?(Hash) ? args.pop : {})
100
+ options[:sticky] = true
101
+ args.push(options)
102
+ add(*args)
103
+ end
104
+ alias_method('add_to_base!', 'add!')
88
105
 
89
106
  def clone
90
107
  clone = Errors.new
@@ -96,15 +113,6 @@ module Dao
96
113
  clone
97
114
  end
98
115
 
99
- def add!(*args)
100
- options = Dao.map_for(args.last.is_a?(Hash) ? args.pop : {})
101
- options[:sticky] = true
102
- args.push(options)
103
- add(*args)
104
- end
105
- alias_method 'add_to_base!', 'add!'
106
-
107
- alias_method 'clear!', 'clear' unless instance_methods.include?('clear!')
108
116
 
109
117
  def update(other, options = {})
110
118
  options = Dao.map_for(options)
@@ -121,6 +129,7 @@ module Dao
121
129
  end
122
130
  end
123
131
 
132
+ alias_method('clear!', 'clear') unless instance_methods.include?('clear!')
124
133
  def clear
125
134
  keep = []
126
135
  depth_first_each do |keys, message|
@@ -136,19 +145,19 @@ module Dao
136
145
  def invalid?(*keys)
137
146
  has?(keys) and !get(keys).nil?
138
147
  end
148
+ alias_method('on?', 'invalid?')
139
149
 
140
- alias_method 'on?', 'invalid?'
141
-
142
- alias_method 'on', 'get'
150
+ def on(*args, &block)
151
+ get(*args, &block)
152
+ end
143
153
 
144
154
  def size
145
155
  size = 0
146
156
  depth_first_each{ size += 1 }
147
157
  size
148
158
  end
149
-
150
- alias_method 'count', 'size'
151
- alias_method 'length', 'size'
159
+ alias_method('count', 'size')
160
+ alias_method('length', 'size')
152
161
 
153
162
  def full_messages
154
163
  global_messages = []
@@ -173,7 +182,6 @@ module Dao
173
182
  depth_first_each do |keys, message|
174
183
  index = keys.pop
175
184
  message = message.to_s.strip
176
- next if message.empty?
177
185
  yield(keys, message)
178
186
  end
179
187
  end
@@ -181,8 +189,7 @@ module Dao
181
189
  def each_full_message
182
190
  full_messages.each{|msg| yield msg}
183
191
  end
184
-
185
- alias_method 'each_full', 'each_full_message'
192
+ alias_method('each_full', 'each_full_message')
186
193
 
187
194
  def messages
188
195
  messages =
@@ -1,2 +1,24 @@
1
- class Error < ::StandardError
1
+ module Dao
2
+ class Dao::Error < ::StandardError
3
+ end
4
+
5
+ class Dao::Error::Result < Error
6
+ attr_accessor :result
7
+
8
+ def self.for(result, *args, &block)
9
+ error = new(*args, &block)
10
+ error.result = result
11
+ error
12
+ end
13
+ end
14
+
15
+ class Dao::Error::Status < Error
16
+ attr_accessor :status
17
+
18
+ def self.for(status, *args, &block)
19
+ error = new(*args, &block)
20
+ error.status = status
21
+ error
22
+ end
23
+ end
2
24
  end