attrtastic 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +17 -19
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/doc/Attrtastic.html +31 -45
- data/doc/Attrtastic/Railtie.html +116 -0
- data/doc/Attrtastic/SemanticAttributesBuilder.html +219 -111
- data/doc/Attrtastic/SemanticAttributesHelper.html +33 -18
- data/doc/_index.html +91 -64
- data/doc/class_list.html +21 -10
- data/doc/css/style.css +20 -10
- data/doc/file.README.html +27 -14
- data/doc/file_list.html +20 -9
- data/doc/frames.html +1 -1
- data/doc/index.html +27 -14
- data/doc/js/app.js +17 -14
- data/doc/js/full_list.js +7 -6
- data/doc/js/jquery.js +5 -143
- data/doc/method_list.html +20 -9
- data/doc/top-level-namespace.html +27 -12
- data/lib/attrtastic/semantic_attributes_builder.rb +67 -7
- data/lib/attrtastic/version.rb +1 -1
- data/test/helper.rb +16 -1
- data/test/test_attribute.rb +194 -11
- data/test/test_attributes.rb +10 -8
- data/test/test_attrtastic.rb +4 -4
- metadata +13 -12
@@ -2,17 +2,27 @@
|
|
2
2
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
3
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
4
|
<head>
|
5
|
-
<meta
|
6
|
-
<title>
|
7
|
-
|
8
|
-
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.7.2
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
9
16
|
|
10
17
|
<script type="text/javascript" charset="utf-8">
|
11
18
|
relpath = '';
|
12
19
|
if (relpath != '') relpath += '/';
|
13
20
|
</script>
|
14
|
-
|
15
|
-
<script type="text/javascript" charset="utf-8" src="js/
|
21
|
+
|
22
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
23
|
+
|
24
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
25
|
+
|
16
26
|
|
17
27
|
</head>
|
18
28
|
<body>
|
@@ -33,11 +43,14 @@
|
|
33
43
|
</div>
|
34
44
|
|
35
45
|
<div id="search">
|
36
|
-
|
37
|
-
|
38
|
-
|
46
|
+
|
47
|
+
<a id="class_list_link" href="#">Class List</a>
|
48
|
+
|
49
|
+
<a id="method_list_link" href="#">Method List</a>
|
50
|
+
|
51
|
+
<a id="file_list_link" href="#">File List</a>
|
52
|
+
|
39
53
|
</div>
|
40
|
-
|
41
54
|
<div class="clear"></div>
|
42
55
|
</div>
|
43
56
|
|
@@ -76,12 +89,14 @@
|
|
76
89
|
|
77
90
|
|
78
91
|
|
92
|
+
|
93
|
+
|
79
94
|
</div>
|
80
95
|
|
81
96
|
<div id="footer">
|
82
|
-
Generated on
|
97
|
+
Generated on Sat Jun 25 13:32:39 2011 by
|
83
98
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
84
|
-
0.
|
99
|
+
0.7.2 (ruby-1.9.2).
|
85
100
|
</div>
|
86
101
|
|
87
102
|
</body>
|
@@ -6,6 +6,9 @@ module Attrtastic
|
|
6
6
|
# Only for testing purposes
|
7
7
|
attr_reader :record, :template
|
8
8
|
|
9
|
+
# For compatibility with formtastic
|
10
|
+
alias :object :record
|
11
|
+
|
9
12
|
def initialize(record, template)
|
10
13
|
@record, @template = record, template
|
11
14
|
end
|
@@ -64,6 +67,16 @@ module Attrtastic
|
|
64
67
|
# <%= post.attribute :title %>
|
65
68
|
# <% end %>
|
66
69
|
#
|
70
|
+
# @example
|
71
|
+
# <%= attr.attributes :for => @posts do |post| %>
|
72
|
+
# <%= post.attribute :birthday, :format => false %>
|
73
|
+
# <% end %>
|
74
|
+
#
|
75
|
+
# @example
|
76
|
+
# <%= attr.attributes :for => @posts do |post| %>
|
77
|
+
# <%= post.attribute :birthday, :format => :my_fancy_birthday_formatter %>
|
78
|
+
# <% end %>
|
79
|
+
#
|
67
80
|
# @overload attributes(header, options = {}, &block)
|
68
81
|
# Creates attributes list with header and yields block to include each attribute
|
69
82
|
#
|
@@ -208,8 +221,14 @@ module Attrtastic
|
|
208
221
|
# @param [Hash] options Options
|
209
222
|
# @option options [Hash] :html ({}) Hash with optional :class, :label_class and :value_class names of class for html
|
210
223
|
# @option options [String] :label Label for attribute entry, overrides default label name from symbol
|
211
|
-
# @option options [
|
224
|
+
# @option options [Symbol,Object] :value If it's Symbol, then it's used as either name of hash key to use on attribute
|
225
|
+
# (if it's hash) or method name to call on attribute. Otherwise it's used as value to use instead of
|
226
|
+
# actual attribute's.
|
212
227
|
# @option options [Boolean] :display_empty (false) Indicates if print value of given attribute even if it is blank?
|
228
|
+
# @option options [Symbol,false,nil] :format (nil) Type of formatter to use to display attribute's value. If it's false,
|
229
|
+
# then don't format at all (just call #to_s). If it's nil, then use default formatting (#l for dates,
|
230
|
+
# #number_with_precision/#number_with_delimiter for floats/integers). If it's Symbol, then use it to select
|
231
|
+
# view helper method and pass aattribute's value to it to format.
|
213
232
|
#
|
214
233
|
# @example
|
215
234
|
# <%= attr.attribute :name %>
|
@@ -220,6 +239,12 @@ module Attrtastic
|
|
220
239
|
# @example
|
221
240
|
# <%= attr.attribute :name, :value => @user.full_name %>
|
222
241
|
#
|
242
|
+
# @example
|
243
|
+
# <%= attr.attribute :address, :value => :street %>
|
244
|
+
#
|
245
|
+
# @example
|
246
|
+
# <%= attr.attribute :avatar, :value => :url, :format => :image_tag %>
|
247
|
+
#
|
223
248
|
# @overload attribute(method, options = {}, &block)
|
224
249
|
# Creates entry for attribute given with block
|
225
250
|
#
|
@@ -265,7 +290,31 @@ module Attrtastic
|
|
265
290
|
label = options.key?(:label) ? options[:label] : label_for_attribute(method)
|
266
291
|
|
267
292
|
unless block_given?
|
268
|
-
value = options.key?(:value)
|
293
|
+
value = if options.key?(:value)
|
294
|
+
case options[:value]
|
295
|
+
when Symbol
|
296
|
+
attribute_value = value_of_attribute(method)
|
297
|
+
case attribute_value
|
298
|
+
when Hash
|
299
|
+
attribute_value[options[:value]]
|
300
|
+
else
|
301
|
+
attribute_value.send(options[:value])
|
302
|
+
end
|
303
|
+
else
|
304
|
+
options[:value]
|
305
|
+
end
|
306
|
+
else
|
307
|
+
value_of_attribute(method)
|
308
|
+
end
|
309
|
+
|
310
|
+
value = case options[:format]
|
311
|
+
when false
|
312
|
+
value
|
313
|
+
when nil
|
314
|
+
format_attribute_value(value)
|
315
|
+
else
|
316
|
+
template.send(options[:format], value)
|
317
|
+
end
|
269
318
|
|
270
319
|
if value.present? or options[:display_empty]
|
271
320
|
output = template.tag(:li, {:class => html_class}, true)
|
@@ -296,7 +345,9 @@ module Attrtastic
|
|
296
345
|
header = options[:name]
|
297
346
|
|
298
347
|
if header.present?
|
299
|
-
output << template.content_tag(:div,
|
348
|
+
output << template.content_tag(:div, :class => html_header_class) do
|
349
|
+
template.content_tag(:span, header)
|
350
|
+
end
|
300
351
|
end
|
301
352
|
|
302
353
|
if block_given?
|
@@ -323,11 +374,20 @@ module Attrtastic
|
|
323
374
|
end
|
324
375
|
|
325
376
|
def value_of_attribute(method)
|
326
|
-
|
327
|
-
value_methods = [ :to_label, :display_name, :full_name, :name, :title, :username, :login, :value ]
|
328
|
-
value_method = value_methods.find { |m| value.respond_to?(m) } || :to_s
|
329
|
-
value.send(value_method)
|
377
|
+
record.send(method)
|
330
378
|
end
|
331
379
|
|
380
|
+
def format_attribute_value(value)
|
381
|
+
case value
|
382
|
+
when Date, Time, DateTime
|
383
|
+
template.send(:l, value)
|
384
|
+
when Integer
|
385
|
+
template.send(:number_with_delimiter, value)
|
386
|
+
when Float, BigDecimal
|
387
|
+
template.send(:number_with_precision, value)
|
388
|
+
else
|
389
|
+
value.to_s
|
390
|
+
end
|
391
|
+
end
|
332
392
|
end
|
333
393
|
end
|
data/lib/attrtastic/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'shoulda'
|
3
3
|
require 'action_view'
|
4
|
+
require 'bigdecimal'
|
4
5
|
|
5
6
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
6
7
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
@@ -14,12 +15,19 @@ class TestCase < Test::Unit::TestCase
|
|
14
15
|
@user = User.new.tap do |u|
|
15
16
|
u.first_name,u.last_name = "John","Doe"
|
16
17
|
u.email = "john@doe.com"
|
18
|
+
u.created_at = DateTime.parse("2011-06-02 12:06:42")
|
19
|
+
u.time = Time.at(946702800)
|
20
|
+
u.birthday = Date.parse("1953-06-03")
|
21
|
+
u.float = 54424.22
|
22
|
+
u.decimal = BigDecimal.new('4454.3435')
|
23
|
+
u.integer = 45453
|
17
24
|
end
|
18
25
|
@blog = Blog.new.tap{|b| b.name,b.url,b.author = "IT Pro Blog","http://www.it.pro.blog",@user}
|
19
26
|
@blog.posts = [
|
20
27
|
Post.new.tap{|p| p.title,p.content = "Hello World!","Hello World!\nInitial post"},
|
21
28
|
Post.new.tap{|p| p.title,p.content = "Sorry","Sorry for long delay. Had much stuff on my head..."},
|
22
29
|
]
|
30
|
+
@user.blog = @blog
|
23
31
|
|
24
32
|
ActionView::Base.send :include, Attrtastic::SemanticAttributesHelper
|
25
33
|
@template = ActionView::Base.new.tap{ |av| av.output_buffer = ActiveSupport::SafeBuffer.new }
|
@@ -29,7 +37,14 @@ class TestCase < Test::Unit::TestCase
|
|
29
37
|
end
|
30
38
|
|
31
39
|
class User
|
32
|
-
attr_accessor :first_name, :last_name, :email, :title
|
40
|
+
attr_accessor :first_name, :last_name, :email, :title, :created_at, :time, :birthday, :float, :decimal, :integer, :blog
|
41
|
+
|
42
|
+
def address
|
43
|
+
{
|
44
|
+
:street => "Hellway 13",
|
45
|
+
:city => "New York",
|
46
|
+
}
|
47
|
+
end
|
33
48
|
|
34
49
|
def full_name
|
35
50
|
[last_name,first_name].join(", ")
|
data/test/test_attribute.rb
CHANGED
@@ -37,19 +37,178 @@ class TestAttribute < TestCase
|
|
37
37
|
assert_equal expected, actual
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
<
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
context "with default formating" do
|
41
|
+
should "properly format a String" do
|
42
|
+
expected = html <<-EOHTML
|
43
|
+
<li class="attribute">
|
44
|
+
<span class="label">Author</span>
|
45
|
+
<span class="value">Doe, John</span>
|
46
|
+
</li>
|
47
|
+
EOHTML
|
48
|
+
actual = @blog_builder.attribute(:author_full_name, :label => "Author")
|
49
|
+
assert_equal expected, actual
|
50
|
+
end
|
47
51
|
|
48
|
-
|
49
|
-
|
52
|
+
should "properly format a Date" do
|
53
|
+
expected = html <<-EOHTML
|
54
|
+
<li class="attribute">
|
55
|
+
<span class="label">Birthday</span>
|
56
|
+
<span class="value">1953-06-03</span>
|
57
|
+
</li>
|
58
|
+
EOHTML
|
59
|
+
actual = @user_builder.attribute(:birthday)
|
60
|
+
assert_equal expected, actual
|
61
|
+
end
|
50
62
|
|
51
|
-
|
52
|
-
|
63
|
+
should "properly format a DateTime" do
|
64
|
+
expected = html <<-EOHTML
|
65
|
+
<li class="attribute">
|
66
|
+
<span class="label">Created at</span>
|
67
|
+
<span class="value">Thu, 02 Jun 2011 12:06:42 +0000</span>
|
68
|
+
</li>
|
69
|
+
EOHTML
|
70
|
+
actual = @user_builder.attribute(:created_at)
|
71
|
+
assert_equal expected, actual
|
72
|
+
end
|
73
|
+
|
74
|
+
should "properly format a Time" do
|
75
|
+
expected = html <<-EOHTML
|
76
|
+
<li class="attribute">
|
77
|
+
<span class="label">Time</span>
|
78
|
+
<span class="value">Sat, 01 Jan 2000 06:00:00 +0100</span>
|
79
|
+
</li>
|
80
|
+
EOHTML
|
81
|
+
actual = @user_builder.attribute(:time)
|
82
|
+
assert_equal expected, actual
|
83
|
+
end
|
84
|
+
|
85
|
+
should "properly format a Float" do
|
86
|
+
expected = html <<-EOHTML
|
87
|
+
<li class="attribute">
|
88
|
+
<span class="label">Float</span>
|
89
|
+
<span class="value">54424.220</span>
|
90
|
+
</li>
|
91
|
+
EOHTML
|
92
|
+
actual = @user_builder.attribute(:float)
|
93
|
+
assert_equal expected, actual
|
94
|
+
end
|
95
|
+
|
96
|
+
should "properly format a Decimal" do
|
97
|
+
expected = html <<-EOHTML
|
98
|
+
<li class="attribute">
|
99
|
+
<span class="label">Decimal</span>
|
100
|
+
<span class="value">4454.344</span>
|
101
|
+
</li>
|
102
|
+
EOHTML
|
103
|
+
actual = @user_builder.attribute(:decimal)
|
104
|
+
assert_equal expected, actual
|
105
|
+
end
|
106
|
+
|
107
|
+
should "properly format a Integer" do
|
108
|
+
expected = html <<-EOHTML
|
109
|
+
<li class="attribute">
|
110
|
+
<span class="label">Integer</span>
|
111
|
+
<span class="value">45,453</span>
|
112
|
+
</li>
|
113
|
+
EOHTML
|
114
|
+
actual = @user_builder.attribute(:integer)
|
115
|
+
assert_equal expected, actual
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "with default formating disabled" do
|
120
|
+
should "properly format a String" do
|
121
|
+
expected = html <<-EOHTML
|
122
|
+
<li class="attribute">
|
123
|
+
<span class="label">Author</span>
|
124
|
+
<span class="value">Doe, John</span>
|
125
|
+
</li>
|
126
|
+
EOHTML
|
127
|
+
actual = @blog_builder.attribute(:author_full_name, :label => "Author", :format => false)
|
128
|
+
assert_equal expected, actual
|
129
|
+
end
|
130
|
+
|
131
|
+
should "properly format a Date" do
|
132
|
+
expected = html <<-EOHTML
|
133
|
+
<li class="attribute">
|
134
|
+
<span class="label">Birthday</span>
|
135
|
+
<span class="value">1953-06-03</span>
|
136
|
+
</li>
|
137
|
+
EOHTML
|
138
|
+
actual = @user_builder.attribute(:birthday, :format => false)
|
139
|
+
assert_equal expected, actual
|
140
|
+
end
|
141
|
+
|
142
|
+
should "properly format a DateTime" do
|
143
|
+
expected = html <<-EOHTML
|
144
|
+
<li class="attribute">
|
145
|
+
<span class="label">Created at</span>
|
146
|
+
<span class="value">2011-06-02T12:06:42+00:00</span>
|
147
|
+
</li>
|
148
|
+
EOHTML
|
149
|
+
actual = @user_builder.attribute(:created_at, :format => false)
|
150
|
+
assert_equal expected, actual
|
151
|
+
end
|
152
|
+
|
153
|
+
should "properly format a Time" do
|
154
|
+
expected = html <<-EOHTML
|
155
|
+
<li class="attribute">
|
156
|
+
<span class="label">Time</span>
|
157
|
+
<span class="value">2000-01-01 06:00:00 +0100</span>
|
158
|
+
</li>
|
159
|
+
EOHTML
|
160
|
+
actual = @user_builder.attribute(:time, :format => false)
|
161
|
+
assert_equal expected, actual
|
162
|
+
end
|
163
|
+
|
164
|
+
should "properly format a Float" do
|
165
|
+
expected = html <<-EOHTML
|
166
|
+
<li class="attribute">
|
167
|
+
<span class="label">Float</span>
|
168
|
+
<span class="value">54424.22</span>
|
169
|
+
</li>
|
170
|
+
EOHTML
|
171
|
+
actual = @user_builder.attribute(:float, :format => false)
|
172
|
+
assert_equal expected, actual
|
173
|
+
end
|
174
|
+
|
175
|
+
should "properly format a Decimal" do
|
176
|
+
expected = html <<-EOHTML
|
177
|
+
<li class="attribute">
|
178
|
+
<span class="label">Decimal</span>
|
179
|
+
<span class="value">4454.3435</span>
|
180
|
+
</li>
|
181
|
+
EOHTML
|
182
|
+
actual = @user_builder.attribute(:decimal, :format => false)
|
183
|
+
assert_equal expected, actual
|
184
|
+
end
|
185
|
+
|
186
|
+
should "properly format a Integer" do
|
187
|
+
expected = html <<-EOHTML
|
188
|
+
<li class="attribute">
|
189
|
+
<span class="label">Integer</span>
|
190
|
+
<span class="value">45453</span>
|
191
|
+
</li>
|
192
|
+
EOHTML
|
193
|
+
actual = @user_builder.attribute(:integer, :format => false)
|
194
|
+
assert_equal expected, actual
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context "with custom formating" do
|
199
|
+
should "output the return value of called template's method" do
|
200
|
+
expected = html <<-EOHTML
|
201
|
+
<li class="attribute">
|
202
|
+
<span class="label">Author</span>
|
203
|
+
<span class="value">Hello, my name is Doe, John</span>
|
204
|
+
</li>
|
205
|
+
EOHTML
|
206
|
+
def @template.hello(name)
|
207
|
+
"Hello, my name is #{name}"
|
208
|
+
end
|
209
|
+
actual = @blog_builder.attribute(:author_full_name, :label => "Author", :format => :hello)
|
210
|
+
assert_equal expected, actual
|
211
|
+
end
|
53
212
|
end
|
54
213
|
|
55
214
|
should "show custom label" do
|
@@ -76,6 +235,30 @@ class TestAttribute < TestCase
|
|
76
235
|
assert_equal expected, actual
|
77
236
|
end
|
78
237
|
|
238
|
+
should "use th custome value as hash key if it's a symbol and the attribute is a hash" do
|
239
|
+
expected = html <<-EOHTML
|
240
|
+
<li class="attribute">
|
241
|
+
<span class="label">Address</span>
|
242
|
+
<span class="value">Hellway 13</span>
|
243
|
+
</li>
|
244
|
+
EOHTML
|
245
|
+
|
246
|
+
actual = @user_builder.attribute(:address, :value => :street)
|
247
|
+
assert_equal expected, actual
|
248
|
+
end
|
249
|
+
|
250
|
+
should "use th custome value as a method it's a symbol and the attribute is not a hash" do
|
251
|
+
expected = html <<-EOHTML
|
252
|
+
<li class="attribute">
|
253
|
+
<span class="label">Blog</span>
|
254
|
+
<span class="value">IT Pro Blog</span>
|
255
|
+
</li>
|
256
|
+
EOHTML
|
257
|
+
|
258
|
+
actual = @user_builder.attribute(:blog, :value => :name)
|
259
|
+
assert_equal expected, actual
|
260
|
+
end
|
261
|
+
|
79
262
|
should "work with custom value blank" do
|
80
263
|
assert_nil @user_builder.attribute(:full_name, :value => nil)
|
81
264
|
assert_nil @user_builder.attribute(:full_name, :value => "")
|