merb-admin 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -11,7 +11,7 @@ http://github.com/sferik/merb-admin/raw/master/screenshots/edit.png
11
11
  == Installation
12
12
  $ gem install merb-admin -s http://gemcutter.org
13
13
  In your app, add the following dependency to <tt>config/dependencies.rb</tt>:
14
- dependency "merb-admin", "0.6.4"
14
+ dependency "merb-admin", "0.6.5"
15
15
  Add the following route to <tt>config/router.rb</tt>:
16
16
  add_slice(:merb_admin, :path_prefix => "admin")
17
17
  Then, run the following rake task:
@@ -21,6 +21,7 @@ If you're feeling crafty, you can set a couple configuration options in <tt>conf
21
21
  Merb::BootLoader.before_app_loads do
22
22
  Merb::Slices::config[:merb_admin][:app_name] = "My App"
23
23
  Merb::Slices::config[:merb_admin][:per_page] = 100
24
+ Merb::Slices::config[:merb_admin][:excluded_models] = [:Top, :Secret]
24
25
  end
25
26
  == Usage
26
27
  Start the server:
@@ -50,5 +51,6 @@ Many thanks to:
50
51
  * {Aaron Wheeler}[http://fightinjoe.com/] for contributing libraries from {Merb AutoScaffold}[http://github.com/fightinjoe/merb-autoscaffold]
51
52
  * {Lori Holden}[http://loriholden.com/] for contributing the merb-pagination[http://github.com/lholden/merb-pagination] helper
52
53
  * {Jacques Crocker}[http://merbjedi.com] for adding support for {namespaced models}[http://github.com/merbjedi/merb-admin/commit/8139e2241038baf9b72452056fcdc7c340d79275]
53
- * {Jeremy Evans}[http://code.jeremyevans.net] and {Pavel Kunc}[http://www.merboutpost.com] reviewing the {patch}[http://github.com/sferik/merb-admin/commit/061fa28f652fc9214e9cf480d66870140181edef] to add Sequel[http://sequel.rubyforge.org/] support
54
+ * {Jeremy Evans}[http://code.jeremyevans.net] and {Pavel Kunc}[http://www.merboutpost.com] for reviewing the {patch}[http://github.com/sferik/merb-admin/commit/061fa28f652fc9214e9cf480d66870140181edef] to add Sequel[http://sequel.rubyforge.org/] support
55
+ * {Jonah Honeyman}[http://twitter.com/jonuts] for fixing a bug[http://github.com/sferik/merb-admin/commit/9064d10382eadd1ed7a882ef40e2c6a65edfef2c] and adding the {:excluded_models option}[http://github.com/sferik/merb-admin/commit/f6157d1c471dd85162481d6926578164be1b9673]
54
56
  Also, thanks to beer[http://www.21st-amendment.com].
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.6.4"
12
+ GEM_VERSION = "0.6.5"
13
13
  MERB_GEM_VERSION = "1.0.15"
14
14
 
15
15
  spec = Gem::Specification.new do |s|
@@ -2,12 +2,12 @@ require 'builder'
2
2
  module Merb
3
3
  module MerbAdmin
4
4
  module MainHelper
5
- def object_name(object)
5
+ def object_label(object)
6
6
  if object.nil?
7
7
  nil
8
- elsif object.respond_to?(:name)
8
+ elsif object.respond_to?(:name) && object.name
9
9
  object.name
10
- elsif object.respond_to?(:title)
10
+ elsif object.respond_to?(:title) && object.title
11
11
  object.title
12
12
  else
13
13
  "#{object.class.to_s} ##{object.id}"
@@ -44,7 +44,7 @@ module Merb
44
44
  when :integer
45
45
  association = @abstract_model.belongs_to_associations.select{|a| a[:child_key].first == property_name}.first
46
46
  if association
47
- object_name(object.send(association[:name]))
47
+ object_label(object.send(association[:name]))
48
48
  else
49
49
  object.send(property_name)
50
50
  end
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  child_key = association[:child_key].first
3
- collection = MerbAdmin::AbstractModel.new(association[:parent_model]).all.map{|o| [o.id, object_name(o)]}.sort_by{|o| o[1]}
3
+ collection = MerbAdmin::AbstractModel.new(association[:parent_model]).all.map{|object| [object.id, object_label(object)]}.sort_by{|object| object[1]}
4
4
  selected = @object.send(child_key)
5
5
  label = association[:pretty_name]
6
6
  required = false
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  association_name = association[:name]
3
- collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_name(o)]}.sort_by{|o| o[1]}
3
+ collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|object| [object.id, object_label(object)]}.sort_by{|object| object[1]}
4
4
  selected = @object.send(association_name)
5
5
  label = association[:pretty_name]
6
6
  %>
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  child_key = association[:child_key].first
3
3
  association_name = association[:name]
4
- collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_name(o)]}.sort_by{|o| o[1]}
4
+ collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|object| [object.id, object_label(object)]}.sort_by{|object| object[1]}
5
5
  selected = @object.send(association_name)
6
6
  label = association[:pretty_name]
7
7
  required = false
@@ -1,12 +1,12 @@
1
- <p>Are you sure you want to delete the <%= @abstract_model.pretty_name.downcase %> &ldquo;<%= object_name(@object) %>&rdquo;? All of the following related items will be deleted:</p>
1
+ <p>Are you sure you want to delete the <%= @abstract_model.pretty_name.downcase %> &ldquo;<%= object_label(@object) %>&rdquo;? All of the following related items will be deleted:</p>
2
2
  <ul>
3
3
  <li>
4
- <%= @abstract_model.pretty_name %>: <%= link_to(object_name(@object), url(:merb_admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id)) %>
4
+ <%= @abstract_model.pretty_name %>: <%= link_to(object_label(@object), url(:merb_admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id)) %>
5
5
  <ul>
6
6
  <% @abstract_model.has_many_associations.each do |association| %>
7
7
  <% @object.send(association[:name]).reject{|child| child.nil?}.each do |child| %>
8
8
  <li>
9
- One or more <%= @abstract_model.pretty_name.pluralize.downcase %> in <%= association[:pretty_name].downcase %>: <%= link_to(object_name(child), url(:merb_admin_edit, :model_name => association[:name].to_s.singularize.to_sym, :id => child.id)) %>
9
+ One or more <%= @abstract_model.pretty_name.pluralize.downcase %> in <%= association[:pretty_name].downcase %>: <%= link_to(object_label(child), url(:merb_admin_edit, :model_name => association[:name].to_s.singularize.to_sym, :id => child.id)) %>
10
10
  </li>
11
11
  <% end %>
12
12
  <% end %>
@@ -14,7 +14,7 @@
14
14
  <% child = @object.send(association[:name]) %>
15
15
  <% next if child.nil? %>
16
16
  <li>
17
- A <%= @abstract_model.pretty_name.downcase %> in <%= association[:pretty_name].downcase %>: <%= link_to(object_name(child), url(:merb_admin_edit, :model_name => association[:name], :id => child.id)) %>
17
+ A <%= @abstract_model.pretty_name.downcase %> in <%= association[:pretty_name].downcase %>: <%= link_to(object_label(child), url(:merb_admin_edit, :model_name => association[:name], :id => child.id)) %>
18
18
  </li>
19
19
  <% end %>
20
20
  </ul>
@@ -4,29 +4,31 @@ module MerbAdmin
4
4
  class AbstractModel
5
5
  # Returns all models for a given Merb app
6
6
  def self.all
7
- return @models if @models
8
7
  @models = []
9
8
  orm = Merb.orm
10
9
  case orm
11
10
  when :activerecord, :sequel
12
11
  Dir.glob(Merb.dir_for(:model) / Merb.glob_for(:model)).each do |filename|
13
12
  File.read(filename).scan(/class ([\w\d_\-:]+)/).flatten.each do |model_name|
14
- model = lookup(model_name.to_sym)
15
- @models << new(model) if model
13
+ add_model(model_name.to_sym)
16
14
  end
17
15
  end
18
16
  when :datamapper
19
17
  DataMapper::Model.descendants.each do |model_name|
20
- # Remove DataMapperSessionStore because it's included by default
21
- next if m == Merb::DataMapperSessionStore if Merb.const_defined?(:DataMapperSessionStore)
22
- model = lookup(model_name.to_s.to_sym)
23
- @models << new(model) if model
18
+ add_model(model_name.to_s.to_sym)
24
19
  end
25
20
  else
26
21
  raise "MerbAdmin does not support the #{orm} ORM"
27
22
  end
28
23
  @models.sort!{|x, y| x.model.to_s <=> y.model.to_s}
29
24
  end
25
+
26
+ def self.add_model(name)
27
+ puts MerbAdmin[:excluded_models].inspect
28
+ return if MerbAdmin[:excluded_models].include?(name)
29
+ model = lookup(name)
30
+ @models << new(model) if model
31
+ end
30
32
 
31
33
  # Given a symbol +model_name+, finds the corresponding model class
32
34
  def self.lookup(model_name)
data/lib/merb-admin.rb CHANGED
@@ -17,13 +17,14 @@ if defined?(Merb::Plugins)
17
17
  # :mirror - which path component types to use on copy operations; defaults to all
18
18
  Merb::Slices::config[:merb_admin][:layout] ||= :merb_admin
19
19
  Merb::Slices::config[:merb_admin][:per_page] ||= 100
20
+ Merb::Slices::config[:merb_admin][:excluded_models] ||= []
20
21
 
21
22
  # All Slice code is expected to be namespaced inside a module
22
23
  module MerbAdmin
23
24
 
24
25
  # Slice metadata
25
26
  self.description = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
26
- self.version = "0.6.4"
27
+ self.version = "0.6.5"
27
28
  self.author = "Erik Michaels-Ober"
28
29
 
29
30
  # Stub classes loaded hook - runs before LoadClasses BootLoader
@@ -4,7 +4,7 @@ class CreateTeamsMigration < ActiveRecord::Migration
4
4
  t.timestamps
5
5
  t.integer(:league_id)
6
6
  t.integer(:division_id)
7
- t.string(:name, :limit => 50, :null => false)
7
+ t.string(:name, :limit => 50)
8
8
  t.string(:logo_url, :limit => 255)
9
9
  t.string(:manager, :limit => 100, :null => false)
10
10
  t.string(:ballpark, :limit => 100)
@@ -6,7 +6,7 @@ class CreateTeams < Sequel::Migration
6
6
  DateTime(:updated_at)
7
7
  foreign_key(:league_id, :table => :leagues)
8
8
  foreign_key(:division_id, :table => :divisions)
9
- String(:name, :limit => 50, :null => false)
9
+ String(:name, :limit => 50)
10
10
  String(:logo_url, :limit => 255)
11
11
  String(:manager, :limit => 100, :null => false)
12
12
  String(:ballpark, :limit => 100)
@@ -1,7 +1,6 @@
1
1
  class Team < ActiveRecord::Base
2
2
  validates_numericality_of(:league_id, :only_integer => true)
3
3
  validates_numericality_of(:division_id, :only_integer => true)
4
- validates_presence_of(:name)
5
4
  validates_presence_of(:manager)
6
5
  validates_numericality_of(:founded, :only_integer => true)
7
6
  validates_numericality_of(:wins, :only_integer => true)
@@ -6,7 +6,7 @@ class Team
6
6
  property(:updated_at, DateTime)
7
7
  property(:league_id, Integer, :nullable => false, :index => true)
8
8
  property(:division_id, Integer, :nullable => false, :index => true)
9
- property(:name, String, :nullable => false, :index => true)
9
+ property(:name, String, :index => true)
10
10
  property(:logo_url, String, :length => 255)
11
11
  property(:manager, String, :length => 100, :nullable => false, :index => true)
12
12
  property(:ballpark, String, :length => 100, :index => true)
@@ -12,7 +12,6 @@ class Team < Sequel::Model
12
12
  def validate
13
13
  validates_numeric(:league_id, :only_integer => true)
14
14
  validates_numeric(:division_id, :only_integer => true)
15
- validates_presence(:name)
16
15
  validates_presence(:manager)
17
16
  validates_numeric(:founded, :only_integer => true)
18
17
  validates_numeric(:wins, :only_integer => true)
@@ -10,15 +10,15 @@ end
10
10
 
11
11
  given "two players exist" do
12
12
  @players = []
13
- 2.times do |i|
14
- @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => i + 1, :name => "Player #{i + 1}")
13
+ (1..2).each do |number|
14
+ @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => number, :name => "Player #{number}")
15
15
  end
16
16
  end
17
17
 
18
18
  given "three teams exist" do
19
19
  @teams = []
20
- 3.times do |i|
21
- @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{i + 1}", :manager => "Manager #{i + 1}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
20
+ (1..3).each do |number|
21
+ @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{number}", :manager => "Manager #{number}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
22
22
  end
23
23
  end
24
24
 
@@ -30,23 +30,31 @@ end
30
30
  given "a player exists and three teams exist" do
31
31
  @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 1, :name => "Player 1")
32
32
  @teams = []
33
- 3.times do |i|
34
- @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{i + 1}", :manager => "Manager #{i + 1}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
33
+ (1..3).each do |number|
34
+ @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{number}", :manager => "Manager #{number}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
35
+ end
36
+ end
37
+
38
+ given "a player exists and three teams with no name exist" do
39
+ @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 1, :name => "Player 1")
40
+ @teams = []
41
+ (1..3).each do |number|
42
+ @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :manager => "Manager #{number}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
35
43
  end
36
44
  end
37
45
 
38
46
  given "a league exists and three teams exist" do
39
- @league = League.create(:name => "League 1")
47
+ @league = MerbAdmin::AbstractModel.new("League").create(:name => "League 1")
40
48
  @teams = []
41
- 3.times do |i|
42
- @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{i + 1}", :manager => "Manager #{i + 1}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
49
+ (1..3).each do |number|
50
+ @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{number}", :manager => "Manager #{number}", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
43
51
  end
44
52
  end
45
53
 
46
54
  given "twenty players exist" do
47
55
  @players = []
48
- 20.times do |i|
49
- @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => i + 1, :name => "Player #{i + 1}")
56
+ (1..20).each do |number|
57
+ @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => number, :name => "Player #{number}")
50
58
  end
51
59
  end
52
60
 
@@ -72,6 +80,25 @@ describe "MerbAdmin" do
72
80
  it "should show \"Site administration\"" do
73
81
  @response.body.should contain("Site administration")
74
82
  end
83
+
84
+ it "should be sorted correctly" do
85
+ @response.body.should contain(/Division.*Draft.*League.*Player.*Team/m)
86
+ end
87
+ end
88
+
89
+ describe "dashboard with excluded models" do
90
+ before(:each) do
91
+ MerbAdmin[:excluded_models] = [:Player]
92
+ @response = request(url(:merb_admin_dashboard))
93
+ end
94
+
95
+ it "should respond sucessfully" do
96
+ @response.should be_successful
97
+ end
98
+
99
+ it "should not contain excluded models" do
100
+ @response.body.should_not contain(/Player/)
101
+ end
75
102
  end
76
103
 
77
104
  describe "list" do
@@ -347,6 +374,16 @@ describe "MerbAdmin" do
347
374
  end
348
375
  end
349
376
 
377
+ describe "new with missing label", :given => "a player exists and three teams with no name exist" do
378
+ before(:each) do
379
+ @response = request(url(:merb_admin_new, :model_name => "player"))
380
+ end
381
+
382
+ it "should respond sucessfully" do
383
+ @response.should be_successful
384
+ end
385
+ end
386
+
350
387
  describe "edit", :given => "a player exists" do
351
388
  before(:each) do
352
389
  @response = request(url(:merb_admin_edit, :model_name => "player", :id => @player.id))
@@ -402,7 +439,6 @@ describe "MerbAdmin" do
402
439
  end
403
440
  end
404
441
 
405
-
406
442
  describe "edit with missing object" do
407
443
  before(:each) do
408
444
  @response = request(url(:merb_admin_edit, :model_name => "player", :id => 1))
@@ -413,6 +449,16 @@ describe "MerbAdmin" do
413
449
  end
414
450
  end
415
451
 
452
+ describe "edit with missing label", :given => "a player exists and three teams with no name exist" do
453
+ before(:each) do
454
+ @response = request(url(:merb_admin_edit, :model_name => "player", :id => @player.id))
455
+ end
456
+
457
+ it "should respond sucessfully" do
458
+ @response.should be_successful
459
+ end
460
+ end
461
+
416
462
  describe "create" do
417
463
  before(:each) do
418
464
  @response = request(url(:merb_admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => "Second baseman"}})
@@ -633,6 +679,18 @@ describe "MerbAdmin" do
633
679
  end
634
680
  end
635
681
 
682
+ describe "delete with missing label" do
683
+ before(:each) do
684
+ @league = MerbAdmin::AbstractModel.new("League").create(:name => "League 1")
685
+ @team = MerbAdmin::AbstractModel.new("Team").create(:league_id => @league.id, :division_id => rand(99999), :manager => "Manager 1", :founded => 1869 + rand(130), :wins => (wins = rand(163)), :losses => 162 - wins, :win_percentage => ("%.3f" % (wins.to_f / 162)).to_f)
686
+ @response = request(url(:merb_admin_delete, :model_name => "league", :id => @league.id))
687
+ end
688
+
689
+ it "should respond sucessfully" do
690
+ @response.should be_successful
691
+ end
692
+ end
693
+
636
694
  describe "destroy", :given => "a player exists" do
637
695
  before(:each) do
638
696
  @response = request(url(:merb_admin_destroy, :model_name => "player", :id => @player.id), :method => "delete")
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.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Michaels-Ober
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-06 00:00:00 -08:00
12
+ date: 2009-11-12 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency