dao 3.3.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/README +7 -0
  2. data/Rakefile +36 -17
  3. data/b.rb +38 -0
  4. data/dao.gemspec +41 -13
  5. data/lib/dao.rb +44 -13
  6. data/lib/dao/api.rb +1 -1
  7. data/lib/dao/api/context.rb +35 -45
  8. data/lib/dao/api/endpoints.rb +225 -91
  9. data/lib/dao/conducer.rb +437 -0
  10. data/lib/dao/conducer/attributes.rb +21 -0
  11. data/lib/dao/conducer/crud.rb +70 -0
  12. data/lib/dao/current.rb +66 -0
  13. data/lib/dao/db.rb +44 -5
  14. data/lib/dao/endpoint.rb +13 -1
  15. data/lib/dao/errors.rb +74 -59
  16. data/lib/dao/exceptions.rb +1 -2
  17. data/lib/dao/extractor.rb +68 -0
  18. data/lib/dao/form.rb +139 -46
  19. data/lib/dao/image_cache.rb +193 -0
  20. data/lib/dao/instance_exec.rb +1 -1
  21. data/lib/dao/name.rb +7 -0
  22. data/lib/dao/params.rb +16 -66
  23. data/lib/dao/rack.rb +3 -0
  24. data/lib/dao/rack/middleware.rb +5 -0
  25. data/lib/dao/rack/middleware/params_parser.rb +24 -0
  26. data/lib/dao/rails.rb +22 -5
  27. data/lib/dao/rails/lib/generators/dao/USAGE +2 -6
  28. data/lib/dao/rails/lib/generators/dao/dao_generator.rb +52 -7
  29. data/lib/dao/rails/lib/generators/dao/templates/api.rb +23 -7
  30. data/lib/dao/rails/lib/generators/dao/templates/api_controller.rb +24 -7
  31. data/lib/dao/rails/lib/generators/dao/templates/conducer.rb +64 -0
  32. data/lib/dao/rails/lib/generators/dao/templates/conducer_controller.rb +79 -0
  33. data/lib/dao/rails/lib/generators/dao/templates/dao.js +13 -6
  34. data/lib/dao/rails/lib/generators/dao/templates/dao_helper.rb +75 -11
  35. data/lib/dao/result.rb +1 -26
  36. data/lib/dao/slug.rb +37 -8
  37. data/lib/dao/status.rb +4 -0
  38. data/lib/dao/support.rb +155 -0
  39. data/lib/dao/validations.rb +48 -157
  40. data/lib/dao/validations/callback.rb +30 -0
  41. data/lib/dao/validations/common.rb +322 -320
  42. data/lib/dao/validations/validator.rb +219 -0
  43. data/test/active_model_conducer_lint_test.rb +19 -0
  44. data/test/api_test.rb +261 -0
  45. data/test/conducer_test.rb +205 -0
  46. data/test/db.yml +9 -0
  47. data/test/form_test.rb +42 -0
  48. data/test/support_test.rb +52 -0
  49. data/test/testing.rb +145 -24
  50. data/test/validations_test.rb +156 -0
  51. metadata +138 -21
  52. data/TODO +0 -33
  53. data/a.rb +0 -80
  54. data/db/dao.yml +0 -5
  55. data/lib/dao/api/interfaces.rb +0 -306
  56. data/lib/dao/interface.rb +0 -28
  57. data/lib/dao/presenter.rb +0 -129
  58. data/lib/dao/rails/lib/generators/dao/api_generator.rb +0 -3
  59. data/lib/dao/validations/base.rb +0 -68
  60. data/test/dao_test.rb +0 -506
data/README CHANGED
@@ -114,3 +114,10 @@ INSTALL
114
114
  vim -o app/api.rb app/controllers/api_controller.rb
115
115
  curl --silent http://0.0.0.0:3000/api
116
116
  curl --silent http://0.0.0.0:3000/api/ping
117
+
118
+ HISTORY
119
+ 4.0.0
120
+ - dao depends has tied itself to rails, for better or worse...
121
+ - drop custom form encoding. just use a rack-like approach.
122
+ - dao form parameter encoding has changed slightly to 'dao[/api/path][x,y,z]=42'
123
+ - dao form paramters are now preparsed in a before filter
data/Rakefile CHANGED
@@ -60,7 +60,7 @@ end
60
60
  task :gemspec do
61
61
  ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
62
62
  ignore_directories = ['pkg']
63
- ignore_files = ['test/log']
63
+ ignore_files = ['test/log', 'a.rb'] + Dir['db/*'] + %w'db'
64
64
 
65
65
  shiteless =
66
66
  lambda do |list|
@@ -87,7 +87,7 @@ task :gemspec do
87
87
  files = shiteless[Dir::glob("**/**")]
88
88
  executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
89
89
  #has_rdoc = true #File.exist?('doc')
90
- test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
90
+ test_files = test(?e, "test/#{ lib }.rb") ? "test/#{ lib }.rb" : nil
91
91
  summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
92
92
  description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
93
93
 
@@ -100,38 +100,51 @@ task :gemspec do
100
100
  end
101
101
  extensions = [extensions].flatten.compact
102
102
 
103
+ # TODO
104
+ if This.dependencies.nil?
105
+ dependencies = []
106
+ else
107
+ case This.dependencies
108
+ when Hash
109
+ dependencies = This.dependencies.values
110
+ when Array
111
+ dependencies = This.dependencies
112
+ end
113
+ end
114
+
103
115
  template =
104
116
  if test(?e, 'gemspec.erb')
105
117
  Template{ IO.read('gemspec.erb') }
106
118
  else
107
119
  Template {
108
120
  <<-__
109
- ## #{ lib }.gemspec
121
+ ## <%= lib %>.gemspec
110
122
  #
111
123
 
112
124
  Gem::Specification::new do |spec|
113
- spec.name = #{ lib.inspect }
114
- spec.version = #{ version.inspect }
125
+ spec.name = <%= lib.inspect %>
126
+ spec.version = <%= version.inspect %>
115
127
  spec.platform = Gem::Platform::RUBY
116
- spec.summary = #{ lib.inspect }
117
- spec.description = #{ description.inspect }
128
+ spec.summary = <%= lib.inspect %>
129
+ spec.description = <%= description.inspect %>
118
130
 
119
- spec.files =\n#{ files.sort.pretty_inspect }
120
- spec.executables = #{ executables.inspect }
131
+ spec.files =\n<%= files.sort.pretty_inspect %>
132
+ spec.executables = <%= executables.inspect %>
121
133
 
122
134
  spec.require_path = "lib"
123
135
 
124
- spec.test_files = #{ test_files.inspect }
136
+ spec.test_files = <%= test_files.inspect %>
125
137
 
126
- ### spec.add_dependency 'lib', '>= version'
127
- #### spec.add_dependency 'map'
138
+ <% dependencies.each do |lib_version| %>
139
+ spec.add_dependency(*<%= Array(lib_version).flatten.inspect %>)
140
+ <% end %>
128
141
 
129
- spec.extensions.push(*#{ extensions.inspect })
142
+ spec.extensions.push(*<%= extensions.inspect %>)
130
143
 
131
- spec.rubyforge_project = #{ This.rubyforge_project.inspect }
132
- spec.author = #{ This.author.inspect }
133
- spec.email = #{ This.email.inspect }
134
- spec.homepage = #{ This.homepage.inspect }
144
+ spec.rubyforge_project = <%= This.rubyforge_project.inspect %>
145
+ spec.author = <%= This.author.inspect %>
146
+ spec.email = <%= This.email.inspect %>
147
+ spec.homepage = <%= This.homepage.inspect %>
135
148
  end
136
149
  __
137
150
  }
@@ -267,6 +280,12 @@ BEGIN {
267
280
  end
268
281
  This.version = version
269
282
 
283
+ # see if dependencies are export by the module
284
+ #
285
+ if This.object.respond_to?(:dependencies)
286
+ This.dependencies = This.object.dependencies
287
+ end
288
+
270
289
  # we need to know the name of the lib an it's version
271
290
  #
272
291
  abort('no lib') unless This.lib
data/b.rb ADDED
@@ -0,0 +1,38 @@
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/dao.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "dao"
6
- spec.version = "3.3.0"
6
+ spec.version = "4.2.1"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "dao"
9
9
  spec.description = "description: dao kicks the ass"
@@ -11,11 +11,9 @@ Gem::Specification::new do |spec|
11
11
  spec.files =
12
12
  ["README",
13
13
  "Rakefile",
14
- "TODO",
15
- "a.rb",
14
+ "b.rb",
16
15
  "dao.gemspec",
17
16
  "db",
18
- "db/dao.yml",
19
17
  "lib",
20
18
  "lib/dao",
21
19
  "lib/dao.rb",
@@ -26,35 +24,46 @@ Gem::Specification::new do |spec|
26
24
  "lib/dao/api/dsl.rb",
27
25
  "lib/dao/api/endpoints.rb",
28
26
  "lib/dao/api/initializers.rb",
29
- "lib/dao/api/interfaces.rb",
30
27
  "lib/dao/api/modes.rb",
31
28
  "lib/dao/api/routes.rb",
32
29
  "lib/dao/blankslate.rb",
30
+ "lib/dao/conducer",
31
+ "lib/dao/conducer.rb",
32
+ "lib/dao/conducer/attributes.rb",
33
+ "lib/dao/conducer/crud.rb",
34
+ "lib/dao/current.rb",
33
35
  "lib/dao/data.rb",
34
36
  "lib/dao/db.rb",
35
37
  "lib/dao/endpoint.rb",
36
38
  "lib/dao/engine.rb",
37
39
  "lib/dao/errors.rb",
38
40
  "lib/dao/exceptions.rb",
41
+ "lib/dao/extractor.rb",
39
42
  "lib/dao/form.rb",
43
+ "lib/dao/image_cache.rb",
40
44
  "lib/dao/instance_exec.rb",
41
- "lib/dao/interface.rb",
42
45
  "lib/dao/mode.rb",
43
46
  "lib/dao/mongo_mapper.rb",
47
+ "lib/dao/name.rb",
44
48
  "lib/dao/params.rb",
45
49
  "lib/dao/path.rb",
46
- "lib/dao/presenter.rb",
50
+ "lib/dao/rack",
51
+ "lib/dao/rack.rb",
52
+ "lib/dao/rack/middleware",
53
+ "lib/dao/rack/middleware.rb",
54
+ "lib/dao/rack/middleware/params_parser.rb",
47
55
  "lib/dao/rails",
48
56
  "lib/dao/rails.rb",
49
57
  "lib/dao/rails/lib",
50
58
  "lib/dao/rails/lib/generators",
51
59
  "lib/dao/rails/lib/generators/dao",
52
60
  "lib/dao/rails/lib/generators/dao/USAGE",
53
- "lib/dao/rails/lib/generators/dao/api_generator.rb",
54
61
  "lib/dao/rails/lib/generators/dao/dao_generator.rb",
55
62
  "lib/dao/rails/lib/generators/dao/templates",
56
63
  "lib/dao/rails/lib/generators/dao/templates/api.rb",
57
64
  "lib/dao/rails/lib/generators/dao/templates/api_controller.rb",
65
+ "lib/dao/rails/lib/generators/dao/templates/conducer.rb",
66
+ "lib/dao/rails/lib/generators/dao/templates/conducer_controller.rb",
58
67
  "lib/dao/rails/lib/generators/dao/templates/dao.css",
59
68
  "lib/dao/rails/lib/generators/dao/templates/dao.js",
60
69
  "lib/dao/rails/lib/generators/dao/templates/dao_helper.rb",
@@ -66,14 +75,20 @@ Gem::Specification::new do |spec|
66
75
  "lib/dao/support.rb",
67
76
  "lib/dao/validations",
68
77
  "lib/dao/validations.rb",
69
- "lib/dao/validations/base.rb",
78
+ "lib/dao/validations/callback.rb",
70
79
  "lib/dao/validations/common.rb",
80
+ "lib/dao/validations/validator.rb",
71
81
  "test",
72
- "test/dao_test.rb",
82
+ "test/active_model_conducer_lint_test.rb",
83
+ "test/api_test.rb",
84
+ "test/conducer_test.rb",
85
+ "test/db.yml",
86
+ "test/form_test.rb",
73
87
  "test/helper.rb",
74
88
  "test/leak.rb",
89
+ "test/support_test.rb",
75
90
  "test/testing.rb",
76
- "test/units"]
91
+ "test/validations_test.rb"]
77
92
 
78
93
  spec.executables = []
79
94
 
@@ -81,8 +96,21 @@ Gem::Specification::new do |spec|
81
96
 
82
97
  spec.test_files = nil
83
98
 
84
- ### spec.add_dependency 'lib', '>= version'
85
- #### spec.add_dependency 'map'
99
+
100
+ spec.add_dependency(*["rails", "~> 3.0"])
101
+
102
+ spec.add_dependency(*["uuidtools", "~> 2.1"])
103
+
104
+ spec.add_dependency(*["tagz", "~> 9.0"])
105
+
106
+ spec.add_dependency(*["fattr", "~> 2.2"])
107
+
108
+ spec.add_dependency(*["map", "~> 4.4"])
109
+
110
+ spec.add_dependency(*["unidecode", "~> 1.0"])
111
+
112
+ spec.add_dependency(*["yajl-ruby", "~> 0.8"])
113
+
86
114
 
87
115
  spec.extensions.push(*[])
88
116
 
data/lib/dao.rb CHANGED
@@ -2,15 +2,11 @@
2
2
  #
3
3
  require 'enumerator'
4
4
  require 'set'
5
- #require 'fileutils'
6
- #require 'pathname'
7
- #require 'yaml'
8
- #require 'yaml/store'
9
5
 
10
6
  # dao libs
11
7
  #
12
8
  module Dao
13
- Version = '3.3.0' unless defined?(Version)
9
+ Version = '4.2.1' unless defined?(Version)
14
10
 
15
11
  def version
16
12
  Dao::Version
@@ -18,9 +14,13 @@
18
14
 
19
15
  def dependencies
20
16
  {
21
- 'map' => ['map' , '~> 4.2.0'],
22
- 'tagz' => ['tagz' , '~> 9.0.0'],
23
- 'yajl' => ['yajl-ruby' , '~> 0.8.1']
17
+ 'rails' => [ 'rails' , '~> 3.0' ],
18
+ 'map' => [ 'map' , '~> 4.4' ],
19
+ 'fattr' => [ 'fattr' , '~> 2.2' ],
20
+ 'tagz' => [ 'tagz' , '~> 9.0' ],
21
+ 'yajl' => [ 'yajl-ruby' , '~> 0.8' ],
22
+ 'unidecode' => [ 'unidecode' , '~> 1.0' ],
23
+ 'uuidtools' => [ 'uuidtools' , '~> 2.1' ]
24
24
  }
25
25
  end
26
26
 
@@ -61,16 +61,34 @@
61
61
  end
62
62
  end
63
63
 
64
+ #active_record
65
+ #action_mailer
66
+ #rails/test_unit
67
+ %w[
68
+ action_controller
69
+ active_resource
70
+ active_support
71
+ ].each do |framework|
72
+ begin
73
+ require "#{ framework }/railtie"
74
+ rescue LoadError
75
+ end
76
+ end
77
+ #require 'rails/all'
78
+
79
+
64
80
  require 'yajl/json_gem'
65
81
 
66
82
  Dao.load %w[
67
83
  blankslate.rb
68
84
  instance_exec.rb
85
+ extractor.rb
69
86
  exceptions.rb
70
87
  support.rb
71
88
  slug.rb
72
89
  stdext.rb
73
90
 
91
+ name.rb
74
92
  status.rb
75
93
  errors.rb
76
94
  form.rb
@@ -79,20 +97,33 @@
79
97
  result.rb
80
98
  params.rb
81
99
 
100
+ current.rb
101
+
82
102
  mode.rb
83
103
  route.rb
84
104
  path.rb
85
- interface.rb
105
+ endpoint.rb
86
106
  api.rb
87
107
 
108
+ db.rb
88
109
 
89
110
  rails.rb
90
111
  active_record.rb
91
112
  mongo_mapper.rb
92
- ]
93
113
 
94
- Dao.autoload(:Db, Dao.libdir('db.rb'))
114
+ conducer.rb
115
+ image_cache.rb
116
+ ]
95
117
 
96
- unless defined?(D)
97
- D = Dao
118
+ # protect against rails' too clever reloading
119
+ #
120
+ =begin
121
+ if defined?(Rails)
122
+ unless defined?(unloadable)
123
+ require 'active_support'
124
+ require 'active_support/dependencies'
125
+ end
126
+ unloadable(Dao)
98
127
  end
128
+ BEGIN{ Object.send(:remove_const, :Dao) if defined?(Dao) }
129
+ =end
data/lib/dao/api.rb CHANGED
@@ -4,7 +4,7 @@ module Dao
4
4
  Dao.load 'api/modes.rb'
5
5
  Dao.load 'api/routes.rb'
6
6
  Dao.load 'api/context.rb'
7
- Dao.load 'api/interfaces.rb'
7
+ Dao.load 'api/endpoints.rb'
8
8
  Dao.load 'api/dsl.rb'
9
9
  end
10
10
  end
@@ -1,6 +1,12 @@
1
1
  module Dao
2
2
  class Context
3
- Attrs = %w( api route path interface args status errors params result data form validations )
3
+ Attrs = %w(
4
+ api path route endpoint
5
+ params validator errors status form
6
+ result
7
+ data
8
+ args
9
+ )
4
10
 
5
11
  Attrs.each{|a| attr_accessor(a)}
6
12
 
@@ -8,61 +14,45 @@ module Dao
8
14
  Attrs
9
15
  end
10
16
 
11
- def Context.for(api, route, path, interface, params, *args)
12
- # setup
13
- #
14
- options = Dao.options_for!(args)
15
-
16
- parsed_params = Dao.parse(path, params, options)
17
+ def Context.for(*args, &block)
18
+ new(*args, &block)
19
+ end
17
20
 
18
- result = Result.new(:mode => api.mode)
19
- params = result.params
20
- params.update(parsed_params)
21
+ def initialize(api, path, route, endpoint, params, *args)
22
+ @api = api
23
+ @path = path
24
+ @route = route
25
+ @endpoint = endpoint
21
26
 
22
- args =
23
- if interface.arity < 1
24
- [params, result]
25
- else
26
- [params, result].slice(0, interface.arity)
27
- end
27
+ @params = Params.new
28
+ @params.update(params)
29
+ @params.path = @path
30
+ @params.route = @route
31
+ @form = @params.form
28
32
 
29
- # build the context
30
- #
31
- context = new
32
- context.api = api
33
- context.interface = interface
34
- context.route = route
35
- context.path = path
36
- context.args = args
37
- context.status = Status.default
38
- context.errors = Errors.new
33
+ @validator = Validator.new(@params)
34
+ @validator.validations_search_path.unshift(@api.class)
39
35
 
40
- context.result = result
41
- context.data = result.data
36
+ @validations = @validator.validations
42
37
 
43
- context.params = params
44
- context.form = params.form
45
- context.validations = params.validations
38
+ @params.validator = @validator
39
+ @errors = @validator.errors
40
+ @status = @validator.status
46
41
 
47
- # wire up shared state
48
- #
49
- result.route = context.route
50
- result.path = context.path
51
- result.status = context.status
52
- result.errors = context.errors
42
+ @result = Result.new
43
+ @result.path = @path
44
+ @result.route = @route
45
+ @result.mode = @api.mode
46
+ @result.params = @params
47
+ @result.errors = @params.errors
53
48
 
54
- params.route = context.route
55
- params.path = context.path
56
- params.status = context.status
57
- params.errors = context.errors
49
+ @data = @result.data
58
50
 
59
- context
51
+ @args = @endpoint.arity < 1 ? [@params, @result] : [@params, @result].slice(0, @endpoint.arity)
60
52
  end
61
53
 
62
- include InstanceExec
63
-
64
54
  def call
65
- api.instance_exec(*args, &interface)
55
+ @api.instance_exec(*@args, &@endpoint)
66
56
  end
67
57
  end
68
58
  end