sferik-merb-admin 0.3.0 → 0.3.1
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/views/main/list.html.erb +2 -2
- data/lib/abstract_model.rb +3 -127
- data/lib/datamapper_support.rb +114 -0
- data/lib/generic_support.rb +17 -0
- data/lib/merb-admin.rb +1 -1
- metadata +3 -1
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.1", :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.1"
|
16
16
|
|
17
17
|
spec = Gem::Specification.new do |s|
|
18
18
|
s.rubyforge_project = "merb"
|
@@ -59,8 +59,8 @@
|
|
59
59
|
<thead>
|
60
60
|
<tr>
|
61
61
|
<% @properties.each do |property| %>
|
62
|
-
<th class="<%= params[:sort] == property[:
|
63
|
-
<a href="?<%= Merb::Parse.params_to_query_string(params.merge(:sort => property[:
|
62
|
+
<th class="<%= params[:sort] == property[:name].to_s ? params[:sort_reverse] ? 'sorted descending' : 'sorted ascending' : nil %>">
|
63
|
+
<a href="?<%= Merb::Parse.params_to_query_string(params.merge(:sort => property[:name]).reject{|key, value| key.to_sym == :sort_reverse}.merge(params[:sort] == property[:name].to_s && params[:sort_reverse] != "true" ? {:sort_reverse => "true"} : {})) %>"><%= property[:pretty_name].capitalize %></a>
|
64
64
|
</th>
|
65
65
|
<% end %>
|
66
66
|
</tr>
|
data/lib/abstract_model.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'generic_support'
|
2
|
+
require 'datamapper_support'
|
3
|
+
|
1
4
|
module MerbAdmin
|
2
5
|
class AbstractModel
|
3
|
-
|
4
6
|
# Returns all models for a given Merb app
|
5
7
|
def self.all
|
6
8
|
return @models if @models
|
@@ -40,131 +42,5 @@ module MerbAdmin
|
|
40
42
|
raise "MerbAdmin does not currently support the #{Merb.orm} ORM"
|
41
43
|
end
|
42
44
|
end
|
43
|
-
|
44
|
-
module GenericSupport
|
45
|
-
def singular_name
|
46
|
-
model.to_s.snake_case.to_sym
|
47
|
-
end
|
48
|
-
|
49
|
-
def plural_name
|
50
|
-
model.to_s.snake_case.pluralize.to_sym
|
51
|
-
end
|
52
|
-
|
53
|
-
def pretty_name
|
54
|
-
model.to_s.snake_case.gsub('_', ' ')
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
module DatamapperSupport
|
59
|
-
def count(options = {})
|
60
|
-
model.count(options)
|
61
|
-
end
|
62
|
-
|
63
|
-
def find_all(options = {})
|
64
|
-
model.all(options)
|
65
|
-
end
|
66
|
-
|
67
|
-
def find(id)
|
68
|
-
model.get(id).extend(InstanceMethods)
|
69
|
-
end
|
70
|
-
|
71
|
-
def new(params = {})
|
72
|
-
model.new(params).extend(InstanceMethods)
|
73
|
-
end
|
74
|
-
|
75
|
-
def has_many_associations
|
76
|
-
associations.select do |association|
|
77
|
-
association[:type] == :has_many
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def has_one_associations
|
82
|
-
associations.select do |association|
|
83
|
-
association[:type] == :has_one
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def belongs_to_associations
|
88
|
-
associations.select do |association|
|
89
|
-
association[:type] == :belongs_to
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def associations
|
94
|
-
model.relationships.to_a.map do |name, relationship|
|
95
|
-
{
|
96
|
-
:name => name,
|
97
|
-
:pretty_name => name.to_s.gsub('_', ' '),
|
98
|
-
:type => association_type_lookup(relationship),
|
99
|
-
:parent_model => relationship.parent_model,
|
100
|
-
:parent_key => relationship.parent_key.map{|r| r.name},
|
101
|
-
:child_model => relationship.child_model,
|
102
|
-
:child_key => relationship.child_key.map{|r| r.name},
|
103
|
-
:remote_relationship => relationship.options[:remote_relationship_name],
|
104
|
-
:near_relationship => relationship.options[:near_relationship_name],
|
105
|
-
}
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def association_names
|
110
|
-
associations.map do |association|
|
111
|
-
association[:type] == :belongs_to ? association[:parent_name] : association[:child_name]
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def properties
|
116
|
-
model.properties.map do |property|
|
117
|
-
{
|
118
|
-
:name => property.name,
|
119
|
-
:pretty_name => property.field.gsub('_', ' '),
|
120
|
-
:type => type_lookup(property),
|
121
|
-
:length => property.length,
|
122
|
-
:nullable? => property.nullable?,
|
123
|
-
:serial? => property.serial?,
|
124
|
-
:key? => property.key?,
|
125
|
-
:flag_map => property.type.respond_to?(:flag_map) ? property.type.flag_map : nil,
|
126
|
-
}
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
private
|
131
|
-
|
132
|
-
def association_type_lookup(relationship)
|
133
|
-
if self.model == relationship.parent_model
|
134
|
-
relationship.options[:max] > 1 ? :has_many : :has_one
|
135
|
-
elsif self.model == relationship.child_model
|
136
|
-
:belongs_to
|
137
|
-
else
|
138
|
-
raise "Unknown association type"
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def type_lookup(property)
|
143
|
-
type = {
|
144
|
-
DataMapper::Types::Serial => :integer,
|
145
|
-
DataMapper::Types::Boolean => :boolean,
|
146
|
-
DataMapper::Types::Text => :text,
|
147
|
-
DataMapper::Types::ParanoidDateTime => :date_time,
|
148
|
-
Integer => :integer,
|
149
|
-
Fixnum => :integer,
|
150
|
-
Float => :float,
|
151
|
-
BigDecimal => :big_decimal,
|
152
|
-
TrueClass => :boolean,
|
153
|
-
String => :string,
|
154
|
-
DateTime => :date_time,
|
155
|
-
Date => :date,
|
156
|
-
Time => :time,
|
157
|
-
}
|
158
|
-
type[property.type] || type[property.primitive]
|
159
|
-
end
|
160
|
-
|
161
|
-
module InstanceMethods
|
162
|
-
def clear_association(association)
|
163
|
-
association.clear
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|
168
|
-
|
169
45
|
end
|
170
46
|
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module MerbAdmin
|
2
|
+
class AbstractModel
|
3
|
+
module DatamapperSupport
|
4
|
+
def count(options = {})
|
5
|
+
model.count(options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def find_all(options = {})
|
9
|
+
model.all(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def find(id)
|
13
|
+
model.get(id).extend(InstanceMethods)
|
14
|
+
end
|
15
|
+
|
16
|
+
def new(params = {})
|
17
|
+
model.new(params).extend(InstanceMethods)
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_many_associations
|
21
|
+
associations.select do |association|
|
22
|
+
association[:type] == :has_many
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def has_one_associations
|
27
|
+
associations.select do |association|
|
28
|
+
association[:type] == :has_one
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def belongs_to_associations
|
33
|
+
associations.select do |association|
|
34
|
+
association[:type] == :belongs_to
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def associations
|
39
|
+
model.relationships.to_a.map do |name, relationship|
|
40
|
+
{
|
41
|
+
:name => name,
|
42
|
+
:pretty_name => name.to_s.gsub('_', ' '),
|
43
|
+
:type => association_type_lookup(relationship),
|
44
|
+
:parent_model => relationship.parent_model,
|
45
|
+
:parent_key => relationship.parent_key.map{|r| r.name},
|
46
|
+
:child_model => relationship.child_model,
|
47
|
+
:child_key => relationship.child_key.map{|r| r.name},
|
48
|
+
:remote_relationship => relationship.options[:remote_relationship_name],
|
49
|
+
:near_relationship => relationship.options[:near_relationship_name],
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def association_names
|
55
|
+
associations.map do |association|
|
56
|
+
association[:type] == :belongs_to ? association[:parent_name] : association[:child_name]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def properties
|
61
|
+
model.properties.map do |property|
|
62
|
+
{
|
63
|
+
:name => property.name,
|
64
|
+
:pretty_name => property.field.gsub('_', ' '),
|
65
|
+
:type => type_lookup(property),
|
66
|
+
:length => property.length,
|
67
|
+
:nullable? => property.nullable?,
|
68
|
+
:serial? => property.serial?,
|
69
|
+
:key? => property.key?,
|
70
|
+
:flag_map => property.type.respond_to?(:flag_map) ? property.type.flag_map : nil,
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def association_type_lookup(relationship)
|
78
|
+
if self.model == relationship.parent_model
|
79
|
+
relationship.options[:max] > 1 ? :has_many : :has_one
|
80
|
+
elsif self.model == relationship.child_model
|
81
|
+
:belongs_to
|
82
|
+
else
|
83
|
+
raise "Unknown association type"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def type_lookup(property)
|
88
|
+
type = {
|
89
|
+
DataMapper::Types::Serial => :integer,
|
90
|
+
DataMapper::Types::Boolean => :boolean,
|
91
|
+
DataMapper::Types::Text => :text,
|
92
|
+
DataMapper::Types::ParanoidDateTime => :date_time,
|
93
|
+
Integer => :integer,
|
94
|
+
Fixnum => :integer,
|
95
|
+
Float => :float,
|
96
|
+
BigDecimal => :big_decimal,
|
97
|
+
TrueClass => :boolean,
|
98
|
+
String => :string,
|
99
|
+
DateTime => :date_time,
|
100
|
+
Date => :date,
|
101
|
+
Time => :time,
|
102
|
+
}
|
103
|
+
type[property.type] || type[property.primitive]
|
104
|
+
end
|
105
|
+
|
106
|
+
module InstanceMethods
|
107
|
+
def clear_association(association)
|
108
|
+
association.clear
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MerbAdmin
|
2
|
+
class AbstractModel
|
3
|
+
module GenericSupport
|
4
|
+
def singular_name
|
5
|
+
model.to_s.snake_case.to_sym
|
6
|
+
end
|
7
|
+
|
8
|
+
def plural_name
|
9
|
+
model.to_s.snake_case.pluralize.to_sym
|
10
|
+
end
|
11
|
+
|
12
|
+
def pretty_name
|
13
|
+
model.to_s.snake_case.gsub('_', ' ')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
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.1"
|
27
27
|
self.author = "Erik Michaels-Ober"
|
28
28
|
|
29
29
|
# Stub classes loaded hook - runs before LoadClasses BootLoader
|
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.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Michaels-Ober
|
@@ -56,6 +56,8 @@ files:
|
|
56
56
|
- README.markdown
|
57
57
|
- Rakefile
|
58
58
|
- lib/abstract_model.rb
|
59
|
+
- lib/datamapper_support.rb
|
60
|
+
- lib/generic_support.rb
|
59
61
|
- lib/merb-admin
|
60
62
|
- lib/merb-admin/merbtasks.rb
|
61
63
|
- lib/merb-admin/slicetasks.rb
|