merb-admin 0.8.1 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/.gitignore +29 -27
  2. data/Gemfile +24 -22
  3. data/Gemfile.lock +86 -0
  4. data/LICENSE +20 -20
  5. data/README.rdoc +54 -58
  6. data/Rakefile +11 -44
  7. data/app/controllers/application.rb +6 -6
  8. data/app/controllers/main.rb +191 -191
  9. data/app/helpers/application_helper.rb +64 -64
  10. data/app/helpers/main_helper.rb +167 -167
  11. data/app/models/.gitkeep +0 -0
  12. data/app/views/layout/_message.html.erb +10 -10
  13. data/app/views/layout/dashboard.html.erb +34 -34
  14. data/app/views/layout/form.html.erb +48 -48
  15. data/app/views/layout/list.html.erb +42 -42
  16. data/app/views/main/_belongs_to.html.erb +29 -29
  17. data/app/views/main/_big_decimal.html.erb +12 -12
  18. data/app/views/main/_boolean.html.erb +7 -7
  19. data/app/views/main/_date.html.erb +12 -12
  20. data/app/views/main/_datetime.html.erb +12 -12
  21. data/app/views/main/_float.html.erb +12 -12
  22. data/app/views/main/_has_many.html.erb +16 -16
  23. data/app/views/main/_has_one.html.erb +30 -30
  24. data/app/views/main/_integer.html.erb +12 -12
  25. data/app/views/main/_properties.html.erb +18 -18
  26. data/app/views/main/_string.html.erb +15 -15
  27. data/app/views/main/_text.html.erb +11 -11
  28. data/app/views/main/_time.html.erb +12 -12
  29. data/app/views/main/_timestamp.html.erb +12 -12
  30. data/app/views/main/delete.html.erb +28 -28
  31. data/app/views/main/edit.html.erb +19 -19
  32. data/app/views/main/index.html.erb +22 -22
  33. data/app/views/main/list.html.erb +93 -93
  34. data/app/views/main/new.html.erb +16 -16
  35. data/config/init.rb +30 -0
  36. data/config/router.rb +4 -0
  37. data/lib/abstract_model.rb +84 -86
  38. data/lib/active_record_support.rb +147 -147
  39. data/lib/datamapper_support.rb +139 -140
  40. data/lib/generic_support.rb +13 -13
  41. data/lib/merb-admin.rb +99 -99
  42. data/lib/merb-admin/merbtasks.rb +103 -103
  43. data/lib/merb-admin/slicetasks.rb +174 -174
  44. data/lib/merb-admin/spectasks.rb +55 -55
  45. data/lib/merb-admin/version.rb +3 -0
  46. data/lib/sequel_support.rb +275 -275
  47. data/merb-admin.gemspec +42 -232
  48. data/public/javascripts/CollapsedFieldsets.js +85 -85
  49. data/public/javascripts/DateTimeShortcuts.js +255 -255
  50. data/public/javascripts/RelatedObjectLookups.js +96 -96
  51. data/public/javascripts/SelectBox.js +111 -111
  52. data/public/javascripts/SelectFilter2.js +113 -113
  53. data/public/javascripts/actions.js +39 -39
  54. data/public/javascripts/calendar.js +143 -143
  55. data/public/javascripts/core.js +176 -176
  56. data/public/javascripts/dateparse.js +233 -233
  57. data/public/javascripts/getElementsBySelector.js +167 -167
  58. data/public/javascripts/i18n.js +33 -33
  59. data/public/javascripts/ordering.js +137 -137
  60. data/public/javascripts/timeparse.js +94 -94
  61. data/public/javascripts/urlify.js +140 -140
  62. data/public/stylesheets/base.css +746 -746
  63. data/public/stylesheets/changelists.css +269 -269
  64. data/public/stylesheets/dashboard.css +24 -24
  65. data/public/stylesheets/forms.css +327 -327
  66. data/public/stylesheets/global.css +142 -142
  67. data/public/stylesheets/ie.css +50 -50
  68. data/public/stylesheets/layout.css +29 -29
  69. data/public/stylesheets/login.css +54 -54
  70. data/public/stylesheets/master.css +1 -1
  71. data/public/stylesheets/patch-iewin.css +7 -7
  72. data/public/stylesheets/rtl.css +206 -206
  73. data/public/stylesheets/widgets.css +506 -506
  74. data/screenshots/create.png +0 -0
  75. data/screenshots/delete.png +0 -0
  76. data/screenshots/edit.png +0 -0
  77. data/screenshots/index.png +0 -0
  78. data/screenshots/list.png +0 -0
  79. data/screenshots/new.png +0 -0
  80. data/spec/controllers/main_spec.rb +25 -25
  81. data/spec/migrations/activerecord/001_create_divisions_migration.rb +13 -13
  82. data/spec/migrations/activerecord/002_create_drafts_migration.rb +19 -19
  83. data/spec/migrations/activerecord/003_create_leagues_migration.rb +12 -12
  84. data/spec/migrations/activerecord/004_create_players_migration.rb +19 -20
  85. data/spec/migrations/activerecord/005_create_teams_migration.rb +22 -22
  86. data/spec/migrations/sequel/001_create_divisions_migration.rb +15 -15
  87. data/spec/migrations/sequel/002_create_drafts_migration.rb +21 -21
  88. data/spec/migrations/sequel/003_create_leagues_migration.rb +14 -14
  89. data/spec/migrations/sequel/004_create_players_migration.rb +21 -22
  90. data/spec/migrations/sequel/005_create_teams_migration.rb +24 -24
  91. data/spec/models/activerecord/division.rb +7 -7
  92. data/spec/models/activerecord/draft.rb +11 -11
  93. data/spec/models/activerecord/league.rb +6 -6
  94. data/spec/models/activerecord/player.rb +8 -8
  95. data/spec/models/activerecord/team.rb +13 -13
  96. data/spec/models/datamapper/division.rb +12 -12
  97. data/spec/models/datamapper/draft.rb +18 -18
  98. data/spec/models/datamapper/league.rb +11 -11
  99. data/spec/models/datamapper/player.rb +20 -21
  100. data/spec/models/datamapper/team.rb +22 -22
  101. data/spec/models/sequel/division.rb +15 -15
  102. data/spec/models/sequel/draft.rb +19 -19
  103. data/spec/models/sequel/league.rb +14 -14
  104. data/spec/models/sequel/player.rb +18 -18
  105. data/spec/models/sequel/team.rb +21 -21
  106. data/spec/requests/main_spec.rb +763 -763
  107. data/spec/spec_helper.rb +113 -112
  108. metadata +247 -41
  109. data/VERSION +0 -1
@@ -1,55 +1,55 @@
1
- require 'spec/rake/spectask'
2
-
3
- namespace :slices do
4
- namespace :"merb-admin" do
5
-
6
- desc "Run slice specs within the host application context"
7
- task :spec => [ "spec:explain", "spec:default" ]
8
-
9
- namespace :spec do
10
-
11
- slice_root = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
12
-
13
- task :explain do
14
- puts "\nNote: By running MerbAdmin specs inside the application context any\n" +
15
- "overrides could break existing specs. This isn't always a problem,\n" +
16
- "especially in the case of views. Use these spec tasks to check how\n" +
17
- "well your application conforms to the original slice implementation."
18
- end
19
-
20
- Spec::Rake::SpecTask.new('default') do |t|
21
- t.spec_opts = ["--format", "specdoc", "--colour"]
22
- t.spec_files = Dir["#{slice_root}/spec/**/*_spec.rb"].sort
23
- end
24
-
25
- desc "Run all model specs, run a spec for a specific Model with MODEL=MyModel"
26
- Spec::Rake::SpecTask.new('model') do |t|
27
- t.spec_opts = ["--format", "specdoc", "--colour"]
28
- if(ENV['MODEL'])
29
- t.spec_files = Dir["#{slice_root}/spec/models/**/#{ENV['MODEL']}_spec.rb"].sort
30
- else
31
- t.spec_files = Dir["#{slice_root}/spec/models/**/*_spec.rb"].sort
32
- end
33
- end
34
-
35
- desc "Run all request specs, run a spec for a specific request with REQUEST=MyRequest"
36
- Spec::Rake::SpecTask.new('request') do |t|
37
- t.spec_opts = ["--format", "specdoc", "--colour"]
38
- if(ENV['REQUEST'])
39
- t.spec_files = Dir["#{slice_root}/spec/requests/**/#{ENV['REQUEST']}_spec.rb"].sort
40
- else
41
- t.spec_files = Dir["#{slice_root}/spec/requests/**/*_spec.rb"].sort
42
- end
43
- end
44
-
45
- desc "Run all specs and output the result in html"
46
- Spec::Rake::SpecTask.new('html') do |t|
47
- t.spec_opts = ["--format", "html"]
48
- t.libs = ['lib', 'server/lib' ]
49
- t.spec_files = Dir["#{slice_root}/spec/**/*_spec.rb"].sort
50
- end
51
-
52
- end
53
-
54
- end
55
- end
1
+ require 'spec/rake/spectask'
2
+
3
+ namespace :slices do
4
+ namespace :"merb-admin" do
5
+
6
+ desc "Run slice specs within the host application context"
7
+ task :spec => [ "spec:explain", "spec:default" ]
8
+
9
+ namespace :spec do
10
+
11
+ slice_root = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
12
+
13
+ task :explain do
14
+ puts "\nNote: By running MerbAdmin specs inside the application context any\n" +
15
+ "overrides could break existing specs. This isn't always a problem,\n" +
16
+ "especially in the case of views. Use these spec tasks to check how\n" +
17
+ "well your application conforms to the original slice implementation."
18
+ end
19
+
20
+ Spec::Rake::SpecTask.new('default') do |t|
21
+ t.spec_opts = ["--format", "specdoc", "--colour"]
22
+ t.spec_files = Dir["#{slice_root}/spec/**/*_spec.rb"].sort
23
+ end
24
+
25
+ desc "Run all model specs, run a spec for a specific Model with MODEL=MyModel"
26
+ Spec::Rake::SpecTask.new('model') do |t|
27
+ t.spec_opts = ["--format", "specdoc", "--colour"]
28
+ if(ENV['MODEL'])
29
+ t.spec_files = Dir["#{slice_root}/spec/models/**/#{ENV['MODEL']}_spec.rb"].sort
30
+ else
31
+ t.spec_files = Dir["#{slice_root}/spec/models/**/*_spec.rb"].sort
32
+ end
33
+ end
34
+
35
+ desc "Run all request specs, run a spec for a specific request with REQUEST=MyRequest"
36
+ Spec::Rake::SpecTask.new('request') do |t|
37
+ t.spec_opts = ["--format", "specdoc", "--colour"]
38
+ if(ENV['REQUEST'])
39
+ t.spec_files = Dir["#{slice_root}/spec/requests/**/#{ENV['REQUEST']}_spec.rb"].sort
40
+ else
41
+ t.spec_files = Dir["#{slice_root}/spec/requests/**/*_spec.rb"].sort
42
+ end
43
+ end
44
+
45
+ desc "Run all specs and output the result in html"
46
+ Spec::Rake::SpecTask.new('html') do |t|
47
+ t.spec_opts = ["--format", "html"]
48
+ t.libs = ['lib', 'server/lib' ]
49
+ t.spec_files = Dir["#{slice_root}/spec/**/*_spec.rb"].sort
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ module MerbAdmin
2
+ VERSION = "0.8.3"
3
+ end
@@ -1,275 +1,275 @@
1
- require 'sequel'
2
- require 'sequel/extensions/pagination'
3
-
4
- class Sequel::Model
5
- =begin
6
- # Intialize each column to the default value for new model objects
7
- def after_initialize
8
- super
9
- model.columns.each do |x|
10
- if !@values.include?(x) && db_schema[x][:allow_null]
11
- send("#{x}=", db_schema[x][:ruby_default])
12
- end
13
- end
14
- end
15
- =end
16
-
17
- # Return an empty array for *_to_many association methods for new model objects
18
- def _load_associated_objects(opts)
19
- opts.returns_array? && new? ? [] : super
20
- end
21
- end
22
-
23
- module MerbAdmin
24
- class AbstractModel
25
- module SequelSupport
26
- def get(id)
27
- model.first(:id => id).extend(InstanceMethods)
28
- end
29
-
30
- def count(options = {})
31
- if options[:conditions] && !options[:conditions].empty?
32
- model.where(options[:conditions]).count
33
- else
34
- model.count
35
- end
36
- end
37
-
38
- def first(options = {})
39
- sort = options.delete(:sort) || :id
40
- sort_order = options.delete(:sort_reverse) ? :desc : :asc
41
-
42
- if options[:conditions] && !options[:conditions].empty?
43
- model.order(sort.to_sym.send(sort_order)).first(options[:conditions]).extend(InstanceMethods)
44
- else
45
- model.order(sort.to_sym.send(sort_order)).first.extend(InstanceMethods)
46
- end
47
- end
48
-
49
- def all(options = {})
50
- offset = options.delete(:offset)
51
- limit = options.delete(:limit)
52
-
53
- sort = options.delete(:sort) || :id
54
- sort_order = options.delete(:sort_reverse) ? :desc : :asc
55
-
56
- if options[:conditions] && !options[:conditions].empty?
57
- model.where(options[:conditions]).order(sort.to_sym.send(sort_order))
58
- else
59
- model.order(sort.to_sym.send(sort_order))
60
- end
61
- end
62
-
63
- def paginated(options = {})
64
- page = options.delete(:page) || 1
65
- per_page = options.delete(:per_page) || MerbAdmin[:per_page]
66
- page_count = (count(options).to_f / per_page).ceil
67
-
68
- sort = options.delete(:sort) || :id
69
- sort_order = options.delete(:sort_reverse) ? :desc : :asc
70
-
71
- if options[:conditions] && !options[:conditions].empty?
72
- [page_count, model.paginate(page.to_i, per_page).where(options[:conditions]).order(sort.to_sym.send(sort_order))]
73
- else
74
- [page_count, model.paginate(page.to_i, per_page).order(sort.to_sym.send(sort_order))]
75
- end
76
- end
77
-
78
- def create(params = {})
79
- model.create(params).extend(InstanceMethods)
80
- end
81
-
82
- def new(params = {})
83
- model.new(params).extend(InstanceMethods)
84
- end
85
-
86
- def destroy_all!
87
- model.destroy
88
- end
89
-
90
- def has_many_associations
91
- associations.select do |association|
92
- association[:type] == :has_many
93
- end
94
- end
95
-
96
- def has_one_associations
97
- associations.select do |association|
98
- association[:type] == :has_one
99
- end
100
- end
101
-
102
- def belongs_to_associations
103
- associations.select do |association|
104
- association[:type] == :belongs_to
105
- end
106
- end
107
-
108
- def associations
109
- model.all_association_reflections.map do |association|
110
- {
111
- :name => association_name_lookup(association),
112
- :pretty_name => association_pretty_name_lookup(association),
113
- :type => association_type_lookup(association),
114
- :parent_model => association_parent_model_lookup(association),
115
- :parent_key => association_parent_key_lookup(association),
116
- :child_model => association_child_model_lookup(association),
117
- :child_key => association_child_key_lookup(association),
118
- }
119
- end
120
- end
121
-
122
- def properties
123
- model.columns.map do |property|
124
- {
125
- :name => property,
126
- :pretty_name => property.to_s.gsub(/_id$/, "").gsub("_", " ").capitalize,
127
- :type => property_type_lookup(property),
128
- :length => property_length_lookup(property),
129
- :nullable? => model.db_schema[property][:allow_null],
130
- :serial? => model.db_schema[property][:primary_key],
131
- }
132
- end
133
- end
134
-
135
- private
136
-
137
- def property_type_lookup(property)
138
- case model.db_schema[property][:db_type]
139
- when /\A(?:medium|small)?int(?:eger)?(?:\((?:\d+)\))?\z/io
140
- :integer
141
- when /\Atinyint(?:\((\d+)\))?\z/io
142
- :boolean
143
- when /\Abigint(?:\((?:\d+)\))?\z/io
144
- :integer
145
- when /\A(?:real|float|double(?: precision)?)\z/io
146
- :float
147
- when 'boolean'
148
- :boolean
149
- when /\A(?:(?:tiny|medium|long|n)?text|clob)\z/io
150
- :text
151
- when 'date'
152
- :date
153
- when /\A(?:small)?datetime\z/io
154
- :datetime
155
- when /\Atimestamp(?: with(?:out)? time zone)?\z/io
156
- :datetime
157
- when /\Atime(?: with(?:out)? time zone)?\z/io
158
- :time
159
- when /\An?char(?:acter)?(?:\((\d+)\))?\z/io
160
- :string
161
- when /\A(?:n?varchar|character varying|bpchar|string)(?:\((\d+)\))?\z/io
162
- :string
163
- when /\A(?:small)?money\z/io
164
- :big_decimal
165
- when /\A(?:decimal|numeric|number)(?:\((\d+)(?:,\s*(\d+))?\))?\z/io
166
- :big_decimal
167
- when 'year'
168
- :integer
169
- else
170
- :string
171
- end
172
- end
173
-
174
- def property_length_lookup(property)
175
- case model.db_schema[property][:db_type]
176
- when /\An?char(?:acter)?(?:\((\d+)\))?\z/io
177
- $1 ? $1.to_i : 255
178
- when /\A(?:n?varchar|character varying|bpchar|string)(?:\((\d+)\))?\z/io
179
- $1 ? $1.to_i : 255
180
- else
181
- nil
182
- end
183
- end
184
-
185
- def association_name_lookup(association)
186
- case association[:type]
187
- when :one_to_many
188
- if association[:one_to_one]
189
- association[:name].to_s.singularize.to_sym
190
- else
191
- association[:name]
192
- end
193
- when :many_to_one
194
- association[:name]
195
- else
196
- raise "Unknown association type"
197
- end
198
- end
199
-
200
- def association_pretty_name_lookup(association)
201
- case association[:type]
202
- when :one_to_many
203
- if association[:one_to_one]
204
- association[:name].to_s.singularize.gsub('_', ' ').capitalize
205
- else
206
- association[:name].to_s.gsub('_', ' ').capitalize
207
- end
208
- when :many_to_one
209
- association[:name].to_s.gsub('_', ' ').capitalize
210
- else
211
- raise "Unknown association type"
212
- end
213
- end
214
-
215
- def association_type_lookup(association)
216
- case association[:type]
217
- when :one_to_many
218
- if association[:one_to_one]
219
- :has_one
220
- else
221
- :has_many
222
- end
223
- when :many_to_one
224
- :belongs_to
225
- else
226
- raise "Unknown association type"
227
- end
228
- end
229
-
230
- def association_parent_model_lookup(association)
231
- case association[:type]
232
- when :one_to_many
233
- association[:model]
234
- when :many_to_one
235
- Object.const_get(association[:class_name])
236
- else
237
- raise "Unknown association type"
238
- end
239
- end
240
-
241
- def association_parent_key_lookup(association)
242
- [:id]
243
- end
244
-
245
- def association_child_model_lookup(association)
246
- case association[:type]
247
- when :one_to_many
248
- Object.const_get(association[:class_name])
249
- when :many_to_one
250
- association[:model]
251
- else
252
- raise "Unknown association type"
253
- end
254
- end
255
-
256
- def association_child_key_lookup(association)
257
- case association[:type]
258
- when :one_to_many
259
- association[:keys]
260
- when :many_to_one
261
- ["#{association[:class_name].snake_case}_id".to_sym]
262
- else
263
- raise "Unknown association type"
264
- end
265
- end
266
-
267
- module InstanceMethods
268
- def update_attributes(attributes)
269
- update(attributes)
270
- end
271
- end
272
-
273
- end
274
- end
275
- end
1
+ require 'sequel'
2
+ require 'sequel/extensions/pagination'
3
+
4
+ class Sequel::Model
5
+ =begin
6
+ # Intialize each column to the default value for new model objects
7
+ def after_initialize
8
+ super
9
+ model.columns.each do |x|
10
+ if !@values.include?(x) && db_schema[x][:allow_null]
11
+ send("#{x}=", db_schema[x][:ruby_default])
12
+ end
13
+ end
14
+ end
15
+ =end
16
+
17
+ # Return an empty array for *_to_many association methods for new model objects
18
+ def _load_associated_objects(opts)
19
+ opts.returns_array? && new? ? [] : super
20
+ end
21
+ end
22
+
23
+ module MerbAdmin
24
+ class AbstractModel
25
+ module SequelSupport
26
+ def get(id)
27
+ model.first(:id => id).extend(InstanceMethods)
28
+ end
29
+
30
+ def count(options = {})
31
+ if options[:conditions] && !options[:conditions].empty?
32
+ model.where(options[:conditions]).count
33
+ else
34
+ model.count
35
+ end
36
+ end
37
+
38
+ def first(options = {})
39
+ sort = options.delete(:sort) || :id
40
+ sort_order = options.delete(:sort_reverse) ? :desc : :asc
41
+
42
+ if options[:conditions] && !options[:conditions].empty?
43
+ model.order(sort.to_sym.send(sort_order)).first(options[:conditions]).extend(InstanceMethods)
44
+ else
45
+ model.order(sort.to_sym.send(sort_order)).first.extend(InstanceMethods)
46
+ end
47
+ end
48
+
49
+ def all(options = {})
50
+ offset = options.delete(:offset)
51
+ limit = options.delete(:limit)
52
+
53
+ sort = options.delete(:sort) || :id
54
+ sort_order = options.delete(:sort_reverse) ? :desc : :asc
55
+
56
+ if options[:conditions] && !options[:conditions].empty?
57
+ model.where(options[:conditions]).order(sort.to_sym.send(sort_order))
58
+ else
59
+ model.order(sort.to_sym.send(sort_order))
60
+ end
61
+ end
62
+
63
+ def paginated(options = {})
64
+ page = options.delete(:page) || 1
65
+ per_page = options.delete(:per_page) || MerbAdmin[:per_page]
66
+ page_count = (count(options).to_f / per_page).ceil
67
+
68
+ sort = options.delete(:sort) || :id
69
+ sort_order = options.delete(:sort_reverse) ? :desc : :asc
70
+
71
+ if options[:conditions] && !options[:conditions].empty?
72
+ [page_count, model.paginate(page.to_i, per_page).where(options[:conditions]).order(sort.to_sym.send(sort_order))]
73
+ else
74
+ [page_count, model.paginate(page.to_i, per_page).order(sort.to_sym.send(sort_order))]
75
+ end
76
+ end
77
+
78
+ def create(params = {})
79
+ model.create(params).extend(InstanceMethods)
80
+ end
81
+
82
+ def new(params = {})
83
+ model.new(params).extend(InstanceMethods)
84
+ end
85
+
86
+ def destroy_all!
87
+ model.destroy
88
+ end
89
+
90
+ def has_many_associations
91
+ associations.select do |association|
92
+ association[:type] == :has_many
93
+ end
94
+ end
95
+
96
+ def has_one_associations
97
+ associations.select do |association|
98
+ association[:type] == :has_one
99
+ end
100
+ end
101
+
102
+ def belongs_to_associations
103
+ associations.select do |association|
104
+ association[:type] == :belongs_to
105
+ end
106
+ end
107
+
108
+ def associations
109
+ model.all_association_reflections.map do |association|
110
+ {
111
+ :name => association_name_lookup(association),
112
+ :pretty_name => association_pretty_name_lookup(association),
113
+ :type => association_type_lookup(association),
114
+ :parent_model => association_parent_model_lookup(association),
115
+ :parent_key => association_parent_key_lookup(association),
116
+ :child_model => association_child_model_lookup(association),
117
+ :child_key => association_child_key_lookup(association),
118
+ }
119
+ end
120
+ end
121
+
122
+ def properties
123
+ model.columns.map do |property|
124
+ {
125
+ :name => property,
126
+ :pretty_name => property.to_s.gsub(/_id$/, "").gsub("_", " ").capitalize,
127
+ :type => property_type_lookup(property),
128
+ :length => property_length_lookup(property),
129
+ :nullable? => model.db_schema[property][:allow_null],
130
+ :serial? => model.db_schema[property][:primary_key],
131
+ }
132
+ end
133
+ end
134
+
135
+ private
136
+
137
+ def property_type_lookup(property)
138
+ case model.db_schema[property][:db_type]
139
+ when /\A(?:medium|small)?int(?:eger)?(?:\((?:\d+)\))?\z/io
140
+ :integer
141
+ when /\Atinyint(?:\((\d+)\))?\z/io
142
+ :boolean
143
+ when /\Abigint(?:\((?:\d+)\))?\z/io
144
+ :integer
145
+ when /\A(?:real|float|double(?: precision)?)\z/io
146
+ :float
147
+ when 'boolean'
148
+ :boolean
149
+ when /\A(?:(?:tiny|medium|long|n)?text|clob)\z/io
150
+ :text
151
+ when 'date'
152
+ :date
153
+ when /\A(?:small)?datetime\z/io
154
+ :datetime
155
+ when /\Atimestamp(?: with(?:out)? time zone)?\z/io
156
+ :datetime
157
+ when /\Atime(?: with(?:out)? time zone)?\z/io
158
+ :time
159
+ when /\An?char(?:acter)?(?:\((\d+)\))?\z/io
160
+ :string
161
+ when /\A(?:n?varchar|character varying|bpchar|string)(?:\((\d+)\))?\z/io
162
+ :string
163
+ when /\A(?:small)?money\z/io
164
+ :big_decimal
165
+ when /\A(?:decimal|numeric|number)(?:\((\d+)(?:,\s*(\d+))?\))?\z/io
166
+ :big_decimal
167
+ when 'year'
168
+ :integer
169
+ else
170
+ :string
171
+ end
172
+ end
173
+
174
+ def property_length_lookup(property)
175
+ case model.db_schema[property][:db_type]
176
+ when /\An?char(?:acter)?(?:\((\d+)\))?\z/io
177
+ $1 ? $1.to_i : 255
178
+ when /\A(?:n?varchar|character varying|bpchar|string)(?:\((\d+)\))?\z/io
179
+ $1 ? $1.to_i : 255
180
+ else
181
+ nil
182
+ end
183
+ end
184
+
185
+ def association_name_lookup(association)
186
+ case association[:type]
187
+ when :one_to_many
188
+ if association[:one_to_one]
189
+ association[:name].to_s.singularize.to_sym
190
+ else
191
+ association[:name]
192
+ end
193
+ when :many_to_one
194
+ association[:name]
195
+ else
196
+ raise "Unknown association type"
197
+ end
198
+ end
199
+
200
+ def association_pretty_name_lookup(association)
201
+ case association[:type]
202
+ when :one_to_many
203
+ if association[:one_to_one]
204
+ association[:name].to_s.singularize.gsub('_', ' ').capitalize
205
+ else
206
+ association[:name].to_s.gsub('_', ' ').capitalize
207
+ end
208
+ when :many_to_one
209
+ association[:name].to_s.gsub('_', ' ').capitalize
210
+ else
211
+ raise "Unknown association type"
212
+ end
213
+ end
214
+
215
+ def association_type_lookup(association)
216
+ case association[:type]
217
+ when :one_to_many
218
+ if association[:one_to_one]
219
+ :has_one
220
+ else
221
+ :has_many
222
+ end
223
+ when :many_to_one
224
+ :belongs_to
225
+ else
226
+ raise "Unknown association type"
227
+ end
228
+ end
229
+
230
+ def association_parent_model_lookup(association)
231
+ case association[:type]
232
+ when :one_to_many
233
+ association[:model]
234
+ when :many_to_one
235
+ Object.const_get(association[:class_name])
236
+ else
237
+ raise "Unknown association type"
238
+ end
239
+ end
240
+
241
+ def association_parent_key_lookup(association)
242
+ [:id]
243
+ end
244
+
245
+ def association_child_model_lookup(association)
246
+ case association[:type]
247
+ when :one_to_many
248
+ Object.const_get(association[:class_name])
249
+ when :many_to_one
250
+ association[:model]
251
+ else
252
+ raise "Unknown association type"
253
+ end
254
+ end
255
+
256
+ def association_child_key_lookup(association)
257
+ case association[:type]
258
+ when :one_to_many
259
+ association[:keys]
260
+ when :many_to_one
261
+ ["#{association[:class_name].snake_case}_id".to_sym]
262
+ else
263
+ raise "Unknown association type"
264
+ end
265
+ end
266
+
267
+ module InstanceMethods
268
+ def update_attributes(attributes)
269
+ update(attributes)
270
+ end
271
+ end
272
+
273
+ end
274
+ end
275
+ end