sferik-merb-admin 0.3.2 → 0.3.3
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.markdown +1 -1
- data/Rakefile +1 -1
- data/app/controllers/main.rb +24 -15
- data/lib/merb-admin.rb +1 -1
- data/spec/controllers/main_spec.rb +0 -4
- data/spec/requests/main_spec.rb +73 -3
- data/spec/spec_helper.rb +11 -1
- metadata +2 -4
- data/spec/fixtures.rb +0 -11
data/README.markdown
CHANGED
@@ -14,7 +14,7 @@ At the command prompt, type:
|
|
14
14
|
|
15
15
|
In your app, add the following dependency to `config/dependencies.rb`:
|
16
16
|
|
17
|
-
dependency "sferik-merb-admin", "0.3.
|
17
|
+
dependency "sferik-merb-admin", "0.3.3", :require_as => "merb-admin"
|
18
18
|
dependency "dm-is-paginated", "0.0.1" # if you want pagination support
|
19
19
|
|
20
20
|
Add the following route to `config/router.rb`:
|
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ AUTHOR = "Erik Michaels-Ober"
|
|
12
12
|
EMAIL = "sferik@gmail.com"
|
13
13
|
HOMEPAGE = "http://twitter.com/sferik"
|
14
14
|
SUMMARY = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
|
15
|
-
GEM_VERSION = "0.3.
|
15
|
+
GEM_VERSION = "0.3.3"
|
16
16
|
|
17
17
|
spec = Gem::Specification.new do |s|
|
18
18
|
s.rubyforge_project = "merb"
|
data/app/controllers/main.rb
CHANGED
@@ -9,7 +9,7 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
9
9
|
before :find_object, :only => ['edit', 'update', 'delete', 'destroy']
|
10
10
|
|
11
11
|
def index
|
12
|
-
render(:layout =>
|
12
|
+
render(:layout => 'dashboard')
|
13
13
|
end
|
14
14
|
|
15
15
|
def list
|
@@ -25,7 +25,7 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
25
25
|
@objects = @abstract_model.find_all(options).reverse
|
26
26
|
else
|
27
27
|
# monkey patch pagination
|
28
|
-
@abstract_model.model.class_eval(
|
28
|
+
@abstract_model.model.class_eval('is_paginated') unless @abstract_model.model.respond_to?(:paginated)
|
29
29
|
@current_page = (params[:page] || 1).to_i
|
30
30
|
options = {
|
31
31
|
:page => @current_page,
|
@@ -39,16 +39,16 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
39
39
|
end
|
40
40
|
|
41
41
|
@record_count = @abstract_model.count(options)
|
42
|
-
render(:layout =>
|
42
|
+
render(:layout => 'list')
|
43
43
|
end
|
44
44
|
|
45
45
|
def new
|
46
46
|
@object = @abstract_model.new
|
47
|
-
render(:layout =>
|
47
|
+
render(:layout => 'form')
|
48
48
|
end
|
49
49
|
|
50
50
|
def edit
|
51
|
-
render(:layout =>
|
51
|
+
render(:layout => 'form')
|
52
52
|
end
|
53
53
|
|
54
54
|
def create
|
@@ -57,9 +57,10 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
57
57
|
object.each do |key, value|
|
58
58
|
object[key] = nil if value.blank?
|
59
59
|
end
|
60
|
-
|
60
|
+
has_one_associations = @abstract_model.has_one_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
|
61
|
+
has_many_associations = @abstract_model.has_many_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
|
61
62
|
@object = @abstract_model.new(object)
|
62
|
-
if @object.save &&
|
63
|
+
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)}
|
63
64
|
if params[:_continue]
|
64
65
|
redirect(slice_url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully created"})
|
65
66
|
elsif params[:_add_another]
|
@@ -69,7 +70,7 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
69
70
|
end
|
70
71
|
else
|
71
72
|
message[:error] = "#{@abstract_model.pretty_name.capitalize} failed to be created"
|
72
|
-
render(:new, :layout =>
|
73
|
+
render(:new, :layout => 'form')
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
@@ -79,8 +80,9 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
79
80
|
object.each do |key, value|
|
80
81
|
object[key] = nil if value.blank?
|
81
82
|
end
|
82
|
-
|
83
|
-
|
83
|
+
has_one_associations = @abstract_model.has_one_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
|
84
|
+
has_many_associations = @abstract_model.has_many_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
|
85
|
+
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)}
|
84
86
|
if params[:_continue]
|
85
87
|
redirect(slice_url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully updated"})
|
86
88
|
elsif params[:_add_another]
|
@@ -90,12 +92,12 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
90
92
|
end
|
91
93
|
else
|
92
94
|
message[:error] = "#{@abstract_model.pretty_name.capitalize} failed to be updated"
|
93
|
-
render(:edit, :layout =>
|
95
|
+
render(:edit, :layout => 'form')
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
97
99
|
def delete
|
98
|
-
render(:layout =>
|
100
|
+
render(:layout => 'form')
|
99
101
|
end
|
100
102
|
|
101
103
|
def destroy
|
@@ -133,7 +135,7 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
133
135
|
@properties.each do |property|
|
134
136
|
next unless property[:name] == key.to_sym
|
135
137
|
if property[:type] == :boolean
|
136
|
-
options.merge!(key.to_sym => (value ==
|
138
|
+
options.merge!(key.to_sym => (value == 'true'))
|
137
139
|
elsif property[:type] == :integer && property[:flag_map]
|
138
140
|
options.merge!(key.to_sym => value.to_sym)
|
139
141
|
end
|
@@ -150,8 +152,8 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
150
152
|
condition_statement << "#{property[:name]} LIKE ?"
|
151
153
|
conditions << "%#{params[:query]}%"
|
152
154
|
end
|
153
|
-
conditions.unshift(condition_statement.join(
|
154
|
-
options.merge!(:conditions => conditions) unless conditions == [
|
155
|
+
conditions.unshift(condition_statement.join(' OR '))
|
156
|
+
options.merge!(:conditions => conditions) unless conditions == ['']
|
155
157
|
end
|
156
158
|
|
157
159
|
def merge_sort(options)
|
@@ -159,6 +161,13 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
159
161
|
options.merge!(:order => [params[:sort].to_sym.send(params[:sort_reverse] ? :desc : :asc)])
|
160
162
|
end
|
161
163
|
|
164
|
+
def update_has_one_association(association, id)
|
165
|
+
model = MerbAdmin::AbstractModel.new(association[:child_model])
|
166
|
+
if object = model.find(id)
|
167
|
+
object.update_attributes(association[:child_key] => @object.id)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
162
171
|
def update_has_many_association(association, ids)
|
163
172
|
# Remove all of the associated items
|
164
173
|
relationship = @object.send(association[:name])
|
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.3.
|
26
|
+
self.version = "0.3.3"
|
27
27
|
self.author = "Erik Michaels-Ober"
|
28
28
|
|
29
29
|
# Stub classes loaded hook - runs before LoadClasses BootLoader
|
@@ -20,10 +20,6 @@ describe MerbAdmin::Main do
|
|
20
20
|
@controller.app_path_for(:image).should == "#{Merb.root}/public/slices/merb-admin/images"
|
21
21
|
@controller.app_path_for(:javascript).should == "#{Merb.root}/public/slices/merb-admin/javascripts"
|
22
22
|
@controller.app_path_for(:stylesheet).should == "#{Merb.root}/public/slices/merb-admin/stylesheets"
|
23
|
-
|
24
|
-
@controller.slice_path_for(:image).should == "#{Merb.root}/public/images"
|
25
|
-
@controller.slice_path_for(:javascript).should == "#{Merb.root}/public/javascripts"
|
26
|
-
@controller.slice_path_for(:stylesheet).should == "#{Merb.root}/public/stylesheets"
|
27
23
|
end
|
28
24
|
|
29
25
|
end
|
data/spec/requests/main_spec.rb
CHANGED
@@ -4,6 +4,13 @@ given "a player exists" do
|
|
4
4
|
@player = Player.gen
|
5
5
|
end
|
6
6
|
|
7
|
+
given "two drafts exist" do
|
8
|
+
@drafts = []
|
9
|
+
2.times do
|
10
|
+
@drafts << Draft.gen
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
given "two players exist" do
|
8
15
|
@players = []
|
9
16
|
2.times do
|
@@ -11,13 +18,21 @@ given "two players exist" do
|
|
11
18
|
end
|
12
19
|
end
|
13
20
|
|
14
|
-
given "three teams
|
21
|
+
given "three teams exist" do
|
15
22
|
@teams = []
|
16
23
|
3.times do
|
17
24
|
@teams << Team.gen
|
18
25
|
end
|
19
26
|
end
|
20
27
|
|
28
|
+
given "a player exists and two drafts exist" do
|
29
|
+
@player = Player.gen
|
30
|
+
@drafts = []
|
31
|
+
2.times do
|
32
|
+
@drafts << Draft.gen
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
21
36
|
given "a player exists and three teams exist" do
|
22
37
|
@player = Player.gen
|
23
38
|
@teams = []
|
@@ -265,7 +280,7 @@ describe "MerbAdmin" do
|
|
265
280
|
end
|
266
281
|
end
|
267
282
|
|
268
|
-
describe "new with has-
|
283
|
+
describe "new with has-one association", :given => "two drafts exist" do
|
269
284
|
before(:each) do
|
270
285
|
@response = request(url(:admin_new, :model_name => "player"))
|
271
286
|
end
|
@@ -275,6 +290,15 @@ describe "MerbAdmin" do
|
|
275
290
|
end
|
276
291
|
end
|
277
292
|
|
293
|
+
describe "new with has-many association", :given => "three teams exist" do
|
294
|
+
before(:each) do
|
295
|
+
@response = request(url(:admin_new, :model_name => "player"))
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should respond sucessfully" do
|
299
|
+
@response.should be_successful
|
300
|
+
end
|
301
|
+
end
|
278
302
|
|
279
303
|
describe "edit", :given => "a player exists" do
|
280
304
|
before(:each) do
|
@@ -290,6 +314,16 @@ describe "MerbAdmin" do
|
|
290
314
|
end
|
291
315
|
end
|
292
316
|
|
317
|
+
describe "edit with has-one association", :given => "a player exists and two drafts exist" do
|
318
|
+
before(:each) do
|
319
|
+
@response = request(url(:admin_edit, :model_name => "player", :id => @player.id))
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should respond sucessfully" do
|
323
|
+
@response.should be_successful
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
293
327
|
describe "edit with has-many association", :given => "a player exists and three teams exist" do
|
294
328
|
before(:each) do
|
295
329
|
@response = request(url(:admin_edit, :model_name => "player", :id => @player.id))
|
@@ -353,7 +387,25 @@ describe "MerbAdmin" do
|
|
353
387
|
end
|
354
388
|
end
|
355
389
|
|
356
|
-
describe "create with has-
|
390
|
+
describe "create with has-one association", :given => "two drafts exist" do
|
391
|
+
before(:each) do
|
392
|
+
@response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}, :associations => {:draft => @drafts[0].id}})
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should create a new object" do
|
396
|
+
Player.first.should_not be_nil
|
397
|
+
end
|
398
|
+
|
399
|
+
it "should include correct associations" do
|
400
|
+
Player.first.draft.should == @drafts[0]
|
401
|
+
end
|
402
|
+
|
403
|
+
it "should not include incorrect associations" do
|
404
|
+
Player.first.draft.should_not == @drafts[1]
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
describe "create with has-many association", :given => "three teams exist" do
|
357
409
|
before(:each) do
|
358
410
|
@response = request(url(:admin_create, :model_name => "league"), :method => "post", :params => {:league => {:name => "National League"}, :associations => {:teams => [@teams[0].id, @teams[1].id]}})
|
359
411
|
end
|
@@ -424,6 +476,24 @@ describe "MerbAdmin" do
|
|
424
476
|
end
|
425
477
|
end
|
426
478
|
|
479
|
+
describe "update with has-one association", :given => "a player exists and two drafts exist" do
|
480
|
+
before(:each) do
|
481
|
+
@response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}, :associations => {:draft => @drafts[0].id}})
|
482
|
+
end
|
483
|
+
|
484
|
+
it "should update an object that already exists" do
|
485
|
+
Player.first(:id => @player.id).name.should eql("Jackie Robinson")
|
486
|
+
end
|
487
|
+
|
488
|
+
it "should include correct associations" do
|
489
|
+
Player.first.draft.should == @drafts[0]
|
490
|
+
end
|
491
|
+
|
492
|
+
it "should not include incorrect associations" do
|
493
|
+
Player.first.draft.should_not == @drafts[1]
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
427
497
|
describe "update with has-many association", :given => "a league exists and three teams exist" do
|
428
498
|
before(:each) do
|
429
499
|
@response = request(url(:admin_update, :model_name => "league", :id => @league.id), :method => "put", :params => {:league => {:name => "National League"}, :associations => {:teams => [@teams[0].id, @teams[1].id]}})
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,17 @@ require 'merb-slices'
|
|
4
4
|
require 'merb-helpers'
|
5
5
|
require 'merb-assets'
|
6
6
|
require 'spec'
|
7
|
-
|
7
|
+
|
8
|
+
# Required for fixtures
|
9
|
+
require 'dm-sweatshop'
|
10
|
+
require 'dm-types'
|
11
|
+
require 'dm-aggregates'
|
12
|
+
require 'dm-validations'
|
13
|
+
require 'dm-is-paginated'
|
14
|
+
|
15
|
+
Dir[File.join(File.dirname(__FILE__), 'fixtures', '**', '*_fixture.rb').to_s].each do |fixture_file|
|
16
|
+
require fixture_file
|
17
|
+
end
|
8
18
|
|
9
19
|
# Add merb-admin.rb to the search path
|
10
20
|
Merb::Plugins.config[:merb_slices][:auto_register] = true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sferik-merb-admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Michaels-Ober
|
@@ -72,7 +72,6 @@ files:
|
|
72
72
|
- spec/fixtures/league_fixture.rb
|
73
73
|
- spec/fixtures/player_fixture.rb
|
74
74
|
- spec/fixtures/team_fixture.rb
|
75
|
-
- spec/fixtures.rb
|
76
75
|
- spec/requests
|
77
76
|
- spec/requests/main_spec.rb
|
78
77
|
- spec/spec_helper.rb
|
@@ -184,7 +183,6 @@ files:
|
|
184
183
|
- public/stylesheets/widgets.css
|
185
184
|
has_rdoc: false
|
186
185
|
homepage: http://twitter.com/sferik
|
187
|
-
licenses:
|
188
186
|
post_install_message: |
|
189
187
|
********************************************************************************
|
190
188
|
|
@@ -212,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
210
|
requirements: []
|
213
211
|
|
214
212
|
rubyforge_project: merb
|
215
|
-
rubygems_version: 1.
|
213
|
+
rubygems_version: 1.2.0
|
216
214
|
signing_key:
|
217
215
|
specification_version: 3
|
218
216
|
summary: MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data.
|
data/spec/fixtures.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# Learn more at http://github.com/datamapper/dm-more/tree/master/dm-sweatshop
|
2
|
-
require 'dm-sweatshop'
|
3
|
-
# Learn more at http://github.com/datamapper/dm-more/tree/master/dm-types
|
4
|
-
require 'dm-types'
|
5
|
-
require 'dm-aggregates'
|
6
|
-
require 'dm-validations'
|
7
|
-
require 'dm-is-paginated'
|
8
|
-
|
9
|
-
Dir['spec/fixtures/**/*_fixture.rb'].sort.each do |fixture_file|
|
10
|
-
require fixture_file
|
11
|
-
end
|