merb-admin 0.5.7 → 0.6.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.
data/README.rdoc CHANGED
@@ -6,7 +6,7 @@ The status of the latest build is available here[http://runcoderun.com/sferik/me
6
6
  == Installation
7
7
  $ gem install merb-admin -s http://gemcutter.org
8
8
  In your app, add the following dependency to <tt>config/dependencies.rb</tt>:
9
- dependency "merb-admin", "0.5.7"
9
+ dependency "merb-admin", "0.6.0"
10
10
  Add the following route to <tt>config/router.rb</tt>:
11
11
  add_slice(:merb_admin, :path_prefix => "admin")
12
12
  Then, run the following rake task:
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ AUTHOR = "Erik Michaels-Ober"
9
9
  EMAIL = "sferik@gmail.com"
10
10
  HOMEPAGE = "http://github.com/sferik/merb-admin"
11
11
  SUMMARY = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
12
- GEM_VERSION = "0.5.7"
12
+ GEM_VERSION = "0.6.0"
13
13
 
14
14
  spec = Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "merb"
@@ -58,7 +58,7 @@ class MerbAdmin::Main < MerbAdmin::Application
58
58
  has_one_associations = @abstract_model.has_one_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
59
59
  has_many_associations = @abstract_model.has_many_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
60
60
  @object = @abstract_model.new(object)
61
- if @object.save && has_one_associations.each{|association, id| update_has_one_association(association, id)} && has_many_associations.each{|association, ids| update_has_many_association(association, ids)}
61
+ if @object.save && has_one_associations.each{|association, id| update_association(association, id)} && has_many_associations.each{|association, ids| update_associations(association, ids.to_a)}
62
62
  if params[:_continue]
63
63
  redirect(url(:merb_admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name} was successfully created"})
64
64
  elsif params[:_add_another]
@@ -80,7 +80,7 @@ class MerbAdmin::Main < MerbAdmin::Application
80
80
  end
81
81
  has_one_associations = @abstract_model.has_one_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
82
82
  has_many_associations = @abstract_model.has_many_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
83
- if @object.update_attributes(object) && has_one_associations.each{|association, id| update_has_one_association(association, id)} && has_many_associations.each{|association, ids| update_has_many_association(association, ids)}
83
+ if @object.update_attributes(object) && has_one_associations.each{|association, id| update_association(association, id)} && has_many_associations.each{|association, ids| update_associations(association, ids.to_a)}
84
84
  if params[:_continue]
85
85
  redirect(url(:merb_admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name} was successfully updated"})
86
86
  elsif params[:_add_another]
@@ -174,23 +174,20 @@ class MerbAdmin::Main < MerbAdmin::Application
174
174
  options.merge!(:sort_reverse => reverse)
175
175
  end
176
176
 
177
- def update_has_one_association(association, id)
178
- model = MerbAdmin::AbstractModel.new(association[:child_model])
179
- if object = model.get(id)
177
+ def update_association(association, id = nil)
178
+ associated_model = MerbAdmin::AbstractModel.new(association[:child_model])
179
+ if object = associated_model.get(id)
180
180
  object.update_attributes(association[:child_key].first => @object.id)
181
181
  end
182
182
  end
183
183
 
184
- def update_has_many_association(association, ids)
185
- # Remove all of the associated items
186
- relationship = @object.send(association[:name])
187
- @object.clear_association(relationship)
188
- # Add all of the objects to the relationship
189
- model = MerbAdmin::AbstractModel.new(association[:child_model])
190
- for object in model.all_in(ids)
191
- relationship << object
192
- end
184
+ def update_associations(association, ids = [])
185
+ associated_object = @object.send(association[:name])
186
+ @object.clear_association(associated_object)
193
187
  @object.save
188
+ ids.each do |id|
189
+ update_association(association, id)
190
+ end
194
191
  end
195
192
 
196
193
  end
@@ -24,6 +24,15 @@ module MerbAdmin
24
24
  @models << new(model) if model
25
25
  end
26
26
  @models.sort!{|a, b| a.model.to_s <=> b.model.to_s}
27
+ when :sequel
28
+ Dir.glob(Merb.dir_for(:model) / Merb.glob_for(:model)).each do |filename|
29
+ # FIXME: This heuristic for finding Sequel models could be too strict
30
+ File.read(filename).scan(/^class ([\w\d_\-:]+) < Sequel::Model$/).flatten.each do |m|
31
+ model = lookup(m.to_s.to_sym)
32
+ @models << new(model) if model
33
+ end
34
+ end
35
+ @models.sort!{|a, b| a.model.to_s <=> b.model.to_s}
27
36
  else
28
37
  raise "MerbAdmin does not support the #{Merb.orm} ORM"
29
38
  end
@@ -42,6 +51,8 @@ module MerbAdmin
42
51
  return model if model.superclass == ActiveRecord::Base
43
52
  when :datamapper
44
53
  return model if model.include?(DataMapper::Resource)
54
+ when :sequel
55
+ return model if model.superclass == Sequel::Model
45
56
  end
46
57
  nil
47
58
  end
@@ -59,6 +70,9 @@ module MerbAdmin
59
70
  when :datamapper
60
71
  require 'datamapper_support'
61
72
  self.extend(DatamapperSupport)
73
+ when :sequel
74
+ require 'sequel_support'
75
+ self.extend(SequelSupport)
62
76
  else
63
77
  raise "MerbAdmin does not support the #{Merb.orm} ORM"
64
78
  end
@@ -1,3 +1,5 @@
1
+ require 'activerecord'
2
+
1
3
  module MerbAdmin
2
4
  class AbstractModel
3
5
  module ActiverecordSupport
@@ -22,11 +24,6 @@ module MerbAdmin
22
24
  model.all(options)
23
25
  end
24
26
 
25
- def all_in(ids, options = {})
26
- options[:conditions] = ["id IN (?)", ids]
27
- model.all(options)
28
- end
29
-
30
27
  def paginated(options = {})
31
28
  page = options.delete(:page) || 1
32
29
  per_page = options.delete(:per_page) || MerbAdmin[:per_page]
@@ -169,6 +166,10 @@ module MerbAdmin
169
166
  def clear_association(association)
170
167
  association.clear
171
168
  end
169
+
170
+ def reset
171
+ super
172
+ end
172
173
  end
173
174
 
174
175
  end
@@ -1,3 +1,7 @@
1
+ require 'dm-core'
2
+ require 'dm-validations'
3
+ require 'dm-aggregates'
4
+
1
5
  module MerbAdmin
2
6
  class AbstractModel
3
7
  module DatamapperSupport
@@ -20,11 +24,6 @@ module MerbAdmin
20
24
  model.all(options)
21
25
  end
22
26
 
23
- def all_in(ids, options = {})
24
- options[:id] = ids
25
- model.all(options)
26
- end
27
-
28
27
  def paginated(options = {})
29
28
  page = options.delete(:page) || 1
30
29
  per_page = options.delete(:per_page) || MerbAdmin[:per_page]
@@ -157,6 +156,10 @@ module MerbAdmin
157
156
  def clear_association(association)
158
157
  association.clear
159
158
  end
159
+
160
+ def reset
161
+ super
162
+ end
160
163
  end
161
164
 
162
165
  end
@@ -51,6 +51,27 @@ namespace :slices do
51
51
  end
52
52
  end
53
53
 
54
+ desc "Copies sample models, copies and runs sample migrations, and loads sample data"
55
+ task :sequel => ["sequel:copy_sample_models", "sequel:copy_sample_migrations", "sequel:migrate", "load_sample_data"]
56
+ namespace :sequel do
57
+ desc "Copies sample models into your app"
58
+ task :copy_sample_models do
59
+ copy_models(:sequel)
60
+ end
61
+
62
+ desc "Copies sample migrations into your app"
63
+ task :copy_sample_migrations do
64
+ copy_migrations(:sequel)
65
+ end
66
+
67
+ desc "Perform migration using migrations in schema/migrations"
68
+ task :migrate do
69
+ require 'sequel/extensions/migration'
70
+ Rake::Task["sequel:db:migrate"].reenable
71
+ Rake::Task["sequel:db:migrate"].invoke
72
+ end
73
+ end
74
+
54
75
  desc "Loads sample data into your app"
55
76
  task :load_sample_data do
56
77
  load_data
@@ -63,13 +84,13 @@ private
63
84
 
64
85
  def load_data
65
86
  begin
66
- require "mlb"
87
+ require "mlb"
67
88
  rescue LoadError => e
68
89
  puts "LoadError: #{e}"
69
90
  puts "gem install mlb -s http://gemcutter.org"
70
91
  return
71
92
  end
72
-
93
+
73
94
  puts "Loading current MLB leagues, divisions, teams, and players"
74
95
  MLB.teams.each do |mlb_team|
75
96
  unless league = MerbAdmin::AbstractModel.new("League").first(:conditions => ["name = ?", mlb_team.league])
data/lib/merb-admin.rb CHANGED
@@ -23,7 +23,7 @@ if defined?(Merb::Plugins)
23
23
 
24
24
  # Slice metadata
25
25
  self.description = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
26
- self.version = "0.5.7"
26
+ self.version = "0.6.0"
27
27
  self.author = "Erik Michaels-Ober"
28
28
 
29
29
  # Stub classes loaded hook - runs before LoadClasses BootLoader
@@ -0,0 +1,309 @@
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
+ # If options[:conditions] isn't cloned, Sequel eats the first condition!
33
+ model.where(options[:conditions].clone).count
34
+ else
35
+ model.count
36
+ end
37
+ end
38
+
39
+ def first(options = {})
40
+ sort = options.delete(:sort) || :id
41
+ sort_order = options.delete(:sort_reverse) ? :desc : :asc
42
+
43
+ if options[:conditions] && !options[:conditions].empty?
44
+ # If options[:conditions] isn't cloned, Sequel eats the first condition!
45
+ model.order(sort.to_sym.send(sort_order)).first(options[:conditions].clone).extend(InstanceMethods)
46
+ else
47
+ model.order(sort.to_sym.send(sort_order)).first.extend(InstanceMethods)
48
+ end
49
+ end
50
+
51
+ def all(options = {})
52
+ offset = options.delete(:offset)
53
+ limit = options.delete(:limit)
54
+
55
+ sort = options.delete(:sort) || :id
56
+ sort_order = options.delete(:sort_reverse) ? :desc : :asc
57
+
58
+ if options[:conditions] && !options[:conditions].empty?
59
+ # If options[:conditions] isn't cloned, Sequel eats the first condition!
60
+ model.where(options[:conditions].clone).order(sort.to_sym.send(sort_order))
61
+ else
62
+ model.order(sort.to_sym.send(sort_order))
63
+ end
64
+ end
65
+
66
+ def paginated(options = {})
67
+ page = options.delete(:page) || 1
68
+ per_page = options.delete(:per_page) || MerbAdmin[:per_page]
69
+ page_count = (count(options).to_f / per_page).ceil
70
+
71
+ sort = options.delete(:sort) || :id
72
+ sort_order = options.delete(:sort_reverse) ? :desc : :asc
73
+
74
+ if options[:conditions] && !options[:conditions].empty?
75
+ # If options[:conditions] isn't cloned, Sequel eats the first condition!
76
+ [page_count, model.paginate(page.to_i, per_page).where(options[:conditions].clone).order(sort.to_sym.send(sort_order))]
77
+ else
78
+ [page_count, model.paginate(page.to_i, per_page).order(sort.to_sym.send(sort_order))]
79
+ end
80
+ end
81
+
82
+ def create(params = {})
83
+ model.create(params)
84
+ end
85
+
86
+ def new(params = {})
87
+ model.new(params).extend(InstanceMethods)
88
+ end
89
+
90
+ def destroy_all!
91
+ model.all.each do |object|
92
+ object.destroy
93
+ end
94
+ end
95
+
96
+ def has_many_associations
97
+ associations.select do |association|
98
+ association[:type] == :has_many
99
+ end
100
+ end
101
+
102
+ def has_one_associations
103
+ associations.select do |association|
104
+ association[:type] == :has_one
105
+ end
106
+ end
107
+
108
+ def belongs_to_associations
109
+ associations.select do |association|
110
+ association[:type] == :belongs_to
111
+ end
112
+ end
113
+
114
+ def associations
115
+ model.all_association_reflections.map do |association|
116
+ {
117
+ :name => association_name_lookup(association),
118
+ :pretty_name => association_pretty_name_lookup(association),
119
+ :type => association_type_lookup(association),
120
+ :parent_model => association_parent_model_lookup(association),
121
+ :parent_key => association_parent_key_lookup(association),
122
+ :child_model => association_child_model_lookup(association),
123
+ :child_key => association_child_key_lookup(association),
124
+ }
125
+ end
126
+ end
127
+
128
+ def properties
129
+ model.columns.map do |property|
130
+ {
131
+ :name => property,
132
+ :pretty_name => property.to_s.gsub(/_id$/, "").gsub("_", " ").capitalize,
133
+ :type => property_type_lookup(property),
134
+ :length => property_length_lookup(property),
135
+ :nullable? => model.db_schema[property][:allow_null],
136
+ :serial? => model.db_schema[property][:primary_key],
137
+ }
138
+ end
139
+ end
140
+
141
+ private
142
+
143
+ def property_type_lookup(property)
144
+ case model.db_schema[property][:db_type]
145
+ when /\A(?:medium|small)?int(?:eger)?(?:\((?:\d+)\))?\z/io
146
+ :integer
147
+ when /\Atinyint(?:\((\d+)\))?\z/io
148
+ :boolean
149
+ when /\Abigint(?:\((?:\d+)\))?\z/io
150
+ :integer
151
+ when /\A(?:real|float|double(?: precision)?)\z/io
152
+ :float
153
+ when 'boolean'
154
+ :boolean
155
+ when /\A(?:(?:tiny|medium|long|n)?text|clob)\z/io
156
+ :text
157
+ when 'date'
158
+ :date
159
+ when /\A(?:small)?datetime\z/io
160
+ :datetime
161
+ when /\Atimestamp(?: with(?:out)? time zone)?\z/io
162
+ :datetime
163
+ when /\Atime(?: with(?:out)? time zone)?\z/io
164
+ :time
165
+ when /\An?char(?:acter)?(?:\((\d+)\))?\z/io
166
+ :string
167
+ when /\A(?:n?varchar|character varying|bpchar|string)(?:\((\d+)\))?\z/io
168
+ :string
169
+ when /\A(?:small)?money\z/io
170
+ :big_decimal
171
+ when /\A(?:decimal|numeric|number)(?:\((\d+)(?:,\s*(\d+))?\))?\z/io
172
+ :big_decimal
173
+ when 'year'
174
+ :integer
175
+ else
176
+ :string
177
+ end
178
+ end
179
+
180
+ def property_length_lookup(property)
181
+ case model.db_schema[property][:db_type]
182
+ when /\An?char(?:acter)?(?:\((\d+)\))?\z/io
183
+ $1 ? $1.to_i : 255
184
+ when /\A(?:n?varchar|character varying|bpchar|string)(?:\((\d+)\))?\z/io
185
+ $1 ? $1.to_i : 255
186
+ else
187
+ nil
188
+ end
189
+ end
190
+
191
+ def association_name_lookup(association)
192
+ case association[:type]
193
+ when :one_to_many
194
+ if association[:one_to_one]
195
+ association[:name].to_s.singularize.to_sym
196
+ else
197
+ association[:name]
198
+ end
199
+ when :many_to_one
200
+ association[:name]
201
+ else
202
+ raise "Unknown association type"
203
+ end
204
+ end
205
+
206
+ def association_pretty_name_lookup(association)
207
+ case association[:type]
208
+ when :one_to_many
209
+ if association[:one_to_one]
210
+ association[:name].to_s.singularize.gsub('_', ' ').capitalize
211
+ else
212
+ association[:name].to_s.gsub('_', ' ').capitalize
213
+ end
214
+ when :many_to_one
215
+ association[:name].to_s.gsub('_', ' ').capitalize
216
+ else
217
+ raise "Unknown association type"
218
+ end
219
+ end
220
+
221
+ def association_type_lookup(association)
222
+ case association[:type]
223
+ when :one_to_many
224
+ if association[:one_to_one]
225
+ :has_one
226
+ else
227
+ :has_many
228
+ end
229
+ when :many_to_one
230
+ :belongs_to
231
+ else
232
+ raise "Unknown association type"
233
+ end
234
+ end
235
+
236
+ def association_parent_model_lookup(association)
237
+ case association[:type]
238
+ when :one_to_many
239
+ association[:model]
240
+ when :many_to_one
241
+ Object.const_get(association[:class_name])
242
+ else
243
+ raise "Unknown association type"
244
+ end
245
+ end
246
+
247
+ def association_parent_key_lookup(association)
248
+ [:id]
249
+ end
250
+
251
+ def association_child_model_lookup(association)
252
+ case association[:type]
253
+ when :one_to_many
254
+ Object.const_get(association[:class_name])
255
+ when :many_to_one
256
+ association[:model]
257
+ else
258
+ raise "Unknown association type"
259
+ end
260
+ end
261
+
262
+ def association_child_key_lookup(association)
263
+ case association[:type]
264
+ when :one_to_many
265
+ association[:keys]
266
+ when :many_to_one
267
+ ["#{association[:class_name].snake_case}_id".to_sym]
268
+ else
269
+ raise "Unknown association type"
270
+ end
271
+ end
272
+
273
+ module InstanceMethods
274
+ def id
275
+ super
276
+ end
277
+
278
+ def save
279
+ super
280
+ end
281
+
282
+ def destroy
283
+ super
284
+ end
285
+
286
+ def update_attributes(attributes)
287
+ # NOTE: Not sure why calling update(attributes) raises
288
+ # Argument Error: wrong number of arguments (1 for 0)
289
+ # but this seems to work:
290
+ set(attributes)
291
+ save
292
+ end
293
+
294
+ def errors
295
+ super
296
+ end
297
+
298
+ def clear_association(association)
299
+ association.clear # FIXME!
300
+ end
301
+
302
+ def reset
303
+ super
304
+ end
305
+ end
306
+
307
+ end
308
+ end
309
+ end
@@ -0,0 +1,15 @@
1
+ class CreateDivisions < Sequel::Migration
2
+ def up
3
+ create_table(:divisions) do
4
+ primary_key(:id)
5
+ DateTime(:created_at)
6
+ DateTime(:updated_at)
7
+ foreign_key(:league_id, :table => :leagues)
8
+ String(:name, :limit => 50, :null => false)
9
+ end
10
+ end
11
+
12
+ def down
13
+ drop_table(:divisions)
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ class CreateDrafts < Sequel::Migration
2
+ def up
3
+ create_table(:drafts) do
4
+ primary_key(:id)
5
+ DateTime(:created_at)
6
+ DateTime(:updated_at)
7
+ foreign_key(:player_id, :table => :players)
8
+ foreign_key(:team_id, :table => :teams)
9
+ Date(:date)
10
+ Integer(:round)
11
+ Integer(:pick)
12
+ Integer(:overall)
13
+ String(:college, :limit => 100)
14
+ String(:notes, :text=>true)
15
+ end
16
+ end
17
+
18
+ def down
19
+ drop_table(:drafts)
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ class CreateLeagues < Sequel::Migration
2
+ def up
3
+ create_table(:leagues) do
4
+ primary_key(:id)
5
+ DateTime(:created_at)
6
+ DateTime(:updated_at)
7
+ String(:name, :limit => 50, :null => false)
8
+ end
9
+ end
10
+
11
+ def down
12
+ drop_table(:leagues)
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ class CreatePlayers < Sequel::Migration
2
+ def up
3
+ create_table(:players) do
4
+ primary_key(:id)
5
+ DateTime(:created_at)
6
+ DateTime(:updated_at)
7
+ DateTime(:deleted_at)
8
+ foreign_key(:team_id, :table => :teams)
9
+ String(:name, :limit => 100, :null => false)
10
+ String(:position, :limit => 50)
11
+ Integer(:number, :null => false)
12
+ TrueClass(:retired, :default => false)
13
+ TrueClass(:injured, :default => false)
14
+ Date(:born_on)
15
+ String(:notes, :text=>true)
16
+ end
17
+ end
18
+
19
+ def down
20
+ drop_table(:players)
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ class CreateTeams < Sequel::Migration
2
+ def up
3
+ create_table(:teams) do
4
+ primary_key(:id)
5
+ DateTime(:created_at)
6
+ DateTime(:updated_at)
7
+ foreign_key(:league_id, :table => :leagues)
8
+ foreign_key(:division_id, :table => :divisions)
9
+ String(:name, :limit => 50, :null => false)
10
+ String(:logo_url, :limit => 255)
11
+ String(:manager, :limit => 100, :null => false)
12
+ String(:ballpark, :limit => 100)
13
+ String(:mascot, :limit => 100)
14
+ Integer(:founded)
15
+ Integer(:wins)
16
+ Integer(:losses)
17
+ Float(:win_percentage)
18
+ end
19
+ end
20
+
21
+ def down
22
+ drop_table(:teams)
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ class Division < Sequel::Model
2
+ set_primary_key(:id)
3
+ plugin(:timestamps, :update_on_create => true)
4
+ plugin(:validation_helpers)
5
+
6
+ many_to_one(:league)
7
+ one_to_many(:teams)
8
+
9
+ self.raise_on_save_failure = false
10
+ self.raise_on_typecast_failure = false
11
+ def validate
12
+ validates_numeric(:league_id, :only_integer => true)
13
+ validates_presence(:name)
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ class Draft < Sequel::Model
2
+ set_primary_key(:id)
3
+ plugin(:timestamps, :update_on_create => true)
4
+ plugin(:validation_helpers)
5
+
6
+ many_to_one(:team)
7
+ many_to_one(:player)
8
+
9
+ self.raise_on_save_failure = false
10
+ self.raise_on_typecast_failure = false
11
+ def validate
12
+ validates_numeric(:player_id, :only_integer => true, :allow_blank => true)
13
+ validates_numeric(:team_id, :only_integer => true, :allow_blank => true)
14
+ validates_presence(:date)
15
+ validates_numeric(:round, :only_integer => true)
16
+ validates_numeric(:pick, :only_integer => true)
17
+ validates_numeric(:overall, :only_integer => true)
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ class League < Sequel::Model
2
+ set_primary_key(:id)
3
+ plugin(:timestamps, :update_on_create => true)
4
+ plugin(:validation_helpers)
5
+
6
+ one_to_many(:divisions)
7
+ one_to_many(:teams)
8
+
9
+ self.raise_on_save_failure = false
10
+ self.raise_on_typecast_failure = false
11
+ def validate
12
+ validates_presence(:name)
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ class Player < Sequel::Model
2
+ set_primary_key(:id)
3
+ plugin(:timestamps, :update_on_create => true)
4
+ plugin(:validation_helpers)
5
+
6
+ many_to_one(:team)
7
+ one_to_many(:drafts, :one_to_one => true)
8
+
9
+ self.raise_on_save_failure = false
10
+ self.raise_on_typecast_failure = false
11
+ def validate
12
+ validates_numeric(:number, :only_integer => true)
13
+ validates_unique(:number, :message => "There is already a player with that number on this team") do |dataset|
14
+ dataset.where("team_id = ?", team_id)
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,22 @@
1
+ class Team < Sequel::Model
2
+ set_primary_key(:id)
3
+ plugin(:timestamps, :update_on_create => true)
4
+ plugin(:validation_helpers)
5
+
6
+ many_to_one(:league)
7
+ many_to_one(:division)
8
+ one_to_many(:players)
9
+
10
+ self.raise_on_save_failure = false
11
+ self.raise_on_typecast_failure = false
12
+ def validate
13
+ validates_numeric(:league_id, :only_integer => true)
14
+ validates_numeric(:division_id, :only_integer => true)
15
+ validates_presence(:name)
16
+ validates_presence(:manager)
17
+ validates_numeric(:founded, :only_integer => true)
18
+ validates_numeric(:wins, :only_integer => true)
19
+ validates_numeric(:losses, :only_integer => true)
20
+ validates_numeric(:win_percentage)
21
+ end
22
+ end
@@ -449,6 +449,7 @@ describe "MerbAdmin" do
449
449
  end
450
450
 
451
451
  it "should be associated with the correct object" do
452
+ @draft.reload
452
453
  MerbAdmin::AbstractModel.new("Player").first.draft.should == @draft
453
454
  end
454
455
  end
@@ -463,7 +464,9 @@ describe "MerbAdmin" do
463
464
  end
464
465
 
465
466
  it "should be associated with the correct objects" do
467
+ @teams[0].reload
466
468
  MerbAdmin::AbstractModel.new("League").first.teams.should include(@teams[0])
469
+ @teams[1].reload
467
470
  MerbAdmin::AbstractModel.new("League").first.teams.should include(@teams[1])
468
471
  end
469
472
 
@@ -544,6 +547,7 @@ describe "MerbAdmin" do
544
547
  end
545
548
 
546
549
  it "should be associated with the correct object" do
550
+ @draft.reload
547
551
  MerbAdmin::AbstractModel.new("Player").first.draft.should == @draft
548
552
  end
549
553
  end
@@ -558,7 +562,9 @@ describe "MerbAdmin" do
558
562
  end
559
563
 
560
564
  it "should be associated with the correct objects" do
565
+ @teams[0].reload
561
566
  MerbAdmin::AbstractModel.new("League").first.teams.should include(@teams[0])
567
+ @teams[1].reload
562
568
  MerbAdmin::AbstractModel.new("League").first.teams.should include(@teams[1])
563
569
  end
564
570
 
data/spec/spec_helper.rb CHANGED
@@ -64,6 +64,10 @@ module Merb
64
64
  end
65
65
  when :sequel
66
66
  require 'sequel'
67
+ require 'sequel/extensions/blank'
68
+ require 'sequel/extensions/migration'
69
+ Sequel::Migrator.apply(Sequel.sqlite, File.join(File.dirname(__FILE__), "migrations", "sequel"))
70
+ require_models(orm)
67
71
  else
68
72
  raise "MerbAdmin does not support the #{orm} ORM"
69
73
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merb-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Michaels-Ober
@@ -80,6 +80,7 @@ files:
80
80
  - lib/merb-admin/slicetasks.rb
81
81
  - lib/merb-admin/spectasks.rb
82
82
  - lib/merb-admin.rb
83
+ - lib/sequel_support.rb
83
84
  - public/images/arrow-down.gif
84
85
  - public/images/arrow-up.gif
85
86
  - public/images/changelist-bg.gif
@@ -158,6 +159,11 @@ files:
158
159
  - spec/migrations/activerecord/003_create_leagues_migration.rb
159
160
  - spec/migrations/activerecord/004_create_players_migration.rb
160
161
  - spec/migrations/activerecord/005_create_teams_migration.rb
162
+ - spec/migrations/sequel/001_create_divisions_migration.rb
163
+ - spec/migrations/sequel/002_create_drafts_migration.rb
164
+ - spec/migrations/sequel/003_create_leagues_migration.rb
165
+ - spec/migrations/sequel/004_create_players_migration.rb
166
+ - spec/migrations/sequel/005_create_teams_migration.rb
161
167
  - spec/models/activerecord/division.rb
162
168
  - spec/models/activerecord/draft.rb
163
169
  - spec/models/activerecord/league.rb
@@ -168,6 +174,11 @@ files:
168
174
  - spec/models/datamapper/league.rb
169
175
  - spec/models/datamapper/player.rb
170
176
  - spec/models/datamapper/team.rb
177
+ - spec/models/sequel/division.rb
178
+ - spec/models/sequel/draft.rb
179
+ - spec/models/sequel/league.rb
180
+ - spec/models/sequel/player.rb
181
+ - spec/models/sequel/team.rb
171
182
  - spec/requests/main_spec.rb
172
183
  - spec/spec_helper.rb
173
184
  has_rdoc: true