ar_to_html_table 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -109,15 +109,14 @@ bc. class Product < ActiveRecord::Base
109
109
  column_format :name, :order => 1
110
110
  column_format :orders, :total => :sum
111
111
  column_format :revenue, :total => :sum, :order => 5, :class => 'right'
112
- column_format :age, :total => :avg, :order => 20, :class => 'right', :formatter => :number_with_delimiter
112
+ column_format :age, :total => :avg, :order => 20, :class => 'right', :formatter => :number_with_delimiter
113
113
  end
114
114
 
115
- # p = Product.first
115
+ bc. p = Product.first
116
116
  => #<Product id: 55986, age: 4346, .........
117
- # p.age
117
+ p.age
118
118
  => 4346
119
-
120
- # p.format_column(:age)
119
+ p.format_column(:age)
121
120
  => "4,346"
122
121
 
123
122
  h1. License
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
23
  s.require_paths = ["lib"]
24
24
 
25
- s.add_dependency 'builder'
26
- s.add_dependency 'activerecord', '~> 2.3.5'
27
- s.add_dependency 'actionpack', '~> 2.3.5'
25
+ #s.add_dependency 'builder'
26
+ #s.add_dependency 'activerecord', '~> 2.3.5'
27
+ #s.add_dependency 'actionpack', '~> 2.3.5'
28
28
  end
@@ -38,6 +38,8 @@ module ArToHtmlTable
38
38
  end
39
39
 
40
40
  module ClassMethods
41
+ include ArToHtmlTable::ColumnFormatter
42
+ include ::ActionView::Helpers::NumberHelper
41
43
  # Define a column format.
42
44
  #
43
45
  # ====Options
@@ -60,10 +62,11 @@ module ArToHtmlTable
60
62
  # column_format :age, :total => :avg, :order => 20, :class => 'right', :formatter => :number_with_delimiter
61
63
  # end
62
64
  def column_format(method, options)
65
+ options[:formatter] = procify(options[:formatter]) if options[:formatter] && options[:formatter].is_a?(Symbol)
63
66
  @attr_formats = (@attr_formats || default_formats).deep_merge({method.to_s => options})
64
67
  end
65
68
  alias :table_format :column_format
66
-
69
+
67
70
  # Retrieve a column format.
68
71
  #
69
72
  # ====Examples
@@ -111,7 +114,11 @@ module ArToHtmlTable
111
114
  end
112
115
  alias :format_attribute :format_column
113
116
 
114
- private
117
+ private
118
+ def procify(symbol)
119
+ proc { |*args| send(symbol, *args) }
120
+ end
121
+
115
122
  # Default column formats used in to_table for active_record
116
123
  # result arrays
117
124
  #
@@ -130,7 +137,7 @@ module ArToHtmlTable
130
137
  when :text, :string
131
138
  { :formatter => lambda {|*args| args[0]} }
132
139
  when :date, :datetime
133
- { :formatter => lambda {|*args| args[0].to_s(:db)} }
140
+ { :formatter => lambda {|*args| (args[0].is_a?(Date) || args[0].is_a?(DateTime)) ? args[0].to_s(:db) : args[0].to_s} }
134
141
  else
135
142
  { :formatter => lambda {|*args| args[0].to_s} }
136
143
  end
@@ -39,7 +39,7 @@ module ArToHtmlTable
39
39
  if options[:cell_type] == :th
40
40
  val
41
41
  else
42
- val.blank? ? I18n.t(options[:not_set_key]) : val
42
+ val.blank? ? I18n.t(options[:not_set_key] || 'tables.not_set') : val
43
43
  end
44
44
  end
45
45
 
@@ -63,7 +63,7 @@ module ArToHtmlTable
63
63
  if options[:cell_type] == :th
64
64
  val
65
65
  else
66
- val.blank? ? I18n.t(options[:unknown_key]) : val
66
+ val.blank? ? I18n.t(options[:unknown_key] || 'tables.unknown') : val
67
67
  end
68
68
  end
69
69
 
@@ -73,7 +73,7 @@ module ArToHtmlTable
73
73
  # ====Examples
74
74
  #
75
75
  # # Given a value of 3600, the formatter will output
76
- # 00:05:00
76
+ # => 00:05:00
77
77
  #
78
78
  # val: the value to be formatted
79
79
  # options: formatter options
@@ -92,21 +92,113 @@ module ArToHtmlTable
92
92
  # ====Examples
93
93
  #
94
94
  # # Given a value of 11, the formatter will output
95
- # 11:00
95
+ # => 11:00
96
96
  #
97
97
  # val: the value to be formatted
98
98
  # options: formatter options
99
99
  def hours_to_time(val, options)
100
100
  "#{"%02d" % val}:00"
101
101
  end
102
+
103
+ # Ordinalize a number (ie 1st, 2nd, 3rd, ....). Localization is
104
+ # handled externally to this method
105
+ #
106
+ # ====Examples
107
+ #
108
+ # # Given a value of 14, the formatter will output
109
+ # => 14th
110
+ #
111
+ # val: the value to be formatted
112
+ # options: formatter options
113
+ def ordinalize(val, options)
114
+ val ? val.to_i.ordinalize : val
115
+ end
116
+
117
+ # Display as a short date (localized)
118
+ #
119
+ # ====Examples
120
+ #
121
+ # # Given a value of 2010/10/1, the formatter will output
122
+ # => 1 Oct
123
+ #
124
+ # val: the value to be formatted
125
+ # options: formatter options
126
+ def short_date(val, options)
127
+ val ? val.to_date.to_s(:short) : val
128
+ end
102
129
 
130
+ # Display as a long date (localized)
131
+ #
132
+ # ====Examples
133
+ #
134
+ # # Given a value of 2010/10/1, the formatter will output
135
+ # => October 1, 2010
136
+ #
137
+ # val: the value to be formatted
138
+ # options: formatter options
139
+ def long_date(val, options)
140
+ val ? val.to_date.to_s(:long) : val
141
+ end
142
+
143
+ # Display as a long month name (localized)
144
+ #
145
+ # ====Examples
146
+ #
147
+ # # Given a value of 9, the formatter will output
148
+ # => 'September'
149
+ #
150
+ # val: the value to be formatted
151
+ # options: formatter options
152
+ def long_month_name(val, options)
153
+ val ? I18n.t('date.month_names')[val.to_i] : val
154
+ end
155
+
156
+ # Display as a short month name (localized)
157
+ #
158
+ # ====Examples
159
+ #
160
+ # # Given a value of 9, the formatter will output
161
+ # => 'Sep'
162
+ #
163
+ # val: the value to be formatted
164
+ # options: formatter options
165
+ def short_month_name(val, options)
166
+ val ? I18n.t('date.abbr_month_names')[val.to_i] : val
167
+ end
168
+
169
+ # Display as a long day name (localized)
170
+ #
171
+ # ====Examples
172
+ #
173
+ # # Given a value of 1, the formatter will output
174
+ # => 'Monday'
175
+ #
176
+ # val: the value to be formatted
177
+ # options: formatter options
178
+ def long_day_name(val, options)
179
+ val ? I18n.t('date.day_names')[val.to_i] : val
180
+ end
181
+
182
+ # Display as a short day name (localized)
183
+ #
184
+ # ====Examples
185
+ #
186
+ # # Given a value of 1, the formatter will output
187
+ # => 'Mon'
188
+ #
189
+ # val: the value to be formatted
190
+ # options: formatter options
191
+ def short_day_name(val, options)
192
+ val ? I18n.t('date.abbr_day_names')[val.to_i] : val
193
+ end
194
+
103
195
  # Interprets an integer as a percentage with a single
104
196
  # digit of precision. Shim for <tt>#number_to_percentage</tt>
105
197
  #
106
198
  # ====Examples
107
199
  #
108
200
  # # Given a value of 48, the formatter will output
109
- # 48.00%
201
+ # => 48.00%
110
202
  #
111
203
  # val: the value to be formatted
112
204
  # options: formatter options
@@ -1,8 +1,5 @@
1
1
  module ArToHtmlTable
2
2
  class TableFormatter
3
- include ArToHtmlTable::ColumnFormatter
4
- include ::ActionView::Helpers::NumberHelper
5
-
6
3
  attr_accessor :html, :table_columns, :klass, :merged_options, :rows, :totals
7
4
  attr_accessor :column_cache
8
5
 
@@ -142,24 +139,23 @@ module ArToHtmlTable
142
139
 
143
140
  # Outputs one cells value after invoking its formatter
144
141
  def output_cell_value(cell_type, value, column, options = {})
142
+ # raise ArgumentError, "Column has no formatter: #{column[:name]}." unless column[:formatter]
145
143
  column_name = column[:name].to_sym
146
144
  column_cache[column_name] = {} unless column_cache.has_key?(column_name)
147
145
 
148
146
  if column_cache[column_name].has_key?(value)
149
147
  result = column_cache[column_name][value]
148
+ elsif column[:formatter]
149
+ result = column[:formatter].call(value, options.reverse_merge({:cell_type => cell_type, :column => column})) || ''
150
+ column_cache[column_name][value] = result
150
151
  else
151
- result = column[:formatter].call(value, options.reverse_merge({:cell_type => cell_type, :column => column}))
152
- result ||= ''
152
+ result = value.to_s || ''
153
153
  column_cache[column_name][value] = result
154
154
  end
155
155
  html.__send__(cell_type, (column[:class] ? {:class => column[:class]} : {})) do
156
156
  html << result
157
157
  end
158
158
  end
159
-
160
- def self.procify(symbol)
161
- proc { |*args| send(symbol, *args) }
162
- end
163
159
 
164
160
  private
165
161
  # Craft a CSS id
@@ -167,15 +163,6 @@ module ArToHtmlTable
167
163
  "#{klass.name.underscore}_#{row[klass.primary_key]}"
168
164
  end
169
165
 
170
- def default_formatter(data, options)
171
- case data
172
- when Fixnum
173
- integer_with_delimiter(data, options)
174
- else
175
- data.to_s
176
- end
177
- end
178
-
179
166
  def table_has_totals?
180
167
  !totals.empty?
181
168
  end
@@ -218,47 +205,20 @@ module ArToHtmlTable
218
205
 
219
206
  def column_definition(column)
220
207
  @column_order += 1
221
- @default_formatter ||= procify(:default_formatter)
222
-
223
- css_class, formatter = get_column_formatter(column.to_s)
224
- column_order = klass.format_of(column)[:order] || @column_order
225
- totals = klass.format_of(column)[:total]
208
+ format_options = klass.format_of(column)
226
209
  return {
227
210
  :name => column,
228
211
  :label => klass.human_attribute_name(column),
229
- :formatter => formatter || @default_formatter,
230
- :class => css_class,
231
- :order => column_order,
232
- :total => totals
212
+ :formatter => format_options[:formatter],
213
+ :class => format_options[:class],
214
+ :order => format_options[:order] || @column_order,
215
+ :total => format_options[:total]
233
216
  }
234
217
  end
235
218
 
236
219
  def columns_from_row(row)
237
220
  row.attributes.inject([]) {|columns, (k, v)| columns << k.to_s }
238
221
  end
239
-
240
- def get_column_formatter(column)
241
- format = klass.format_of(column)
242
- case format
243
- when Symbol
244
- formatter = procify(format)
245
- when Proc
246
- formatter = format
247
- when Hash
248
- css_class = format[:class] if format[:class]
249
- formatter = format[:formatter] if format[:formatter]
250
- formatter = procify(formatter) if formatter && formatter.is_a?(Symbol)
251
- end
252
- return css_class, formatter
253
- end
254
-
255
- # A data formatter can be a symbol or a proc
256
- # If its a symbol then we 'procify' it so that
257
- # we have on calling interface in the output_cell method
258
- # - partially for clarity and partially for performance
259
- def procify(sym)
260
- self.procify(sym)
261
- end
262
222
 
263
223
  # Decide if the given column is to be displayed in the table
264
224
  def include_column?(column, options)
@@ -1,3 +1,3 @@
1
1
  module ArToHtmlTable
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_to_html_table
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kip Cole
@@ -15,55 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-20 00:00:00 +08:00
18
+ date: 2010-10-21 00:00:00 +08:00
19
19
  default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: builder
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
33
- type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: activerecord
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 9
44
- segments:
45
- - 2
46
- - 3
47
- - 5
48
- version: 2.3.5
49
- type: :runtime
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: actionpack
53
- prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 9
60
- segments:
61
- - 2
62
- - 3
63
- - 5
64
- version: 2.3.5
65
- type: :runtime
66
- version_requirements: *id003
20
+ dependencies: []
21
+
67
22
  description: " Defines Array#to_table that will render an ActiveRecord result set\n as an HTML table.\n"
68
23
  email:
69
24
  - kipcole9@gmail.com