sortablecolumns 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ === 0.1.5 / 2009-02-19
2
+ * Fixed bug 23868 - now works with Rails 2.2 - http://rubyforge.org/tracker/?atid=23868&group_id=6158&func=browse
3
+ * Added default_sorter as an option instead of creating a yaml file. Also able to generate default yaml output using
4
+ ModelName.default_col_defs
5
+
1
6
  === 0.1.4 / 2008-06-04
2
7
  * Table heading (TH) urls now remove any parameter named "page". This is to support paginated tables
3
8
  since, if a user is on a page other than 1, clicking on a column heading should sort all data and
File without changes
data/README.txt CHANGED
@@ -6,8 +6,7 @@
6
6
 
7
7
  SortableColumns is a Rails plugin that allows easy creation of sortable HTML tables as plain HTML or as a YUI DataTable (requires YUI4Rails plugin - http://rubyforge.org/projects/yui4rails/). Table column characteristics (e.g., default sort direction, data type, CSS attributes, and methods to wrap the output in) are defined in YAML files (more options to be added later, such auto-detecting the column types, using a hash, etc.). Multiple table column definitions can be created for a single model.
8
8
 
9
- An example live application can be found here: http://sortablecolumns.heroku.com/
10
- Download the example app here: http://www.bryandonovan.com/sortable_columns_example.tar.gz
9
+ Download an example app here: http://www.bryandonovan.com/sortable_columns_example.tar.gz
11
10
 
12
11
  Also see: ActiveRecord::Acts::SortableColumns::ClassMethods#sortable_columns
13
12
 
@@ -26,12 +25,10 @@ Also see: ActiveRecord::Acts::SortableColumns::ClassMethods#sortable_columns
26
25
  created in the SQL query.
27
26
  * Test coverage for all current features.
28
27
 
29
- === Problems
30
- * Doesn't yet support date formats (should be easy to implement though and will hopefully happen soon)
31
-
32
28
  == SYNOPSIS:
33
29
  * First, create a directory to store your column definitions YAML files. The default location SortableColumns will look is app/models/col_defs.
34
30
  * Create a YAML file for the configuration of your table columns.
31
+ * NEW: You can now set a :sorter_name of :default_sorter which will guess the configuration of the model's table. You can also use ModelName.default_col_defs(:yaml) to generate YAML output with these same defaults.
35
32
  * Call sortable_tables in your model
36
33
  * Run query (get an ActiveRecord result set)
37
34
  * Render table in your view
@@ -51,6 +48,8 @@ We're going to call this sorter "mysorter". This will be the name of the YAML f
51
48
 
52
49
  class Person < ActiveRecord::Base
53
50
  sortable_columns :mysorter
51
+ # or if you want to use the defaults:
52
+ # sortable_columns :default_sorter
54
53
 
55
54
  # method to run query with sort options
56
55
  def self.find_for_mysorter(options = {})
data/Rakefile CHANGED
File without changes
@@ -1,5 +1,5 @@
1
1
  module Sortablecolumns #:nodoc:
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
4
4
  Dir[File.join(File.dirname(__FILE__), "sortablecolumns/**/*.rb")].sort.each { |lib| require lib }
5
5
  ActiveRecord::Base.send(:include, ActiveRecord::Acts::Sortablecolumns)
File without changes
@@ -37,233 +37,273 @@ module ActiveRecord #:nodoc:
37
37
  class_inheritable_reader :sorter_options
38
38
 
39
39
  self.class_eval <<-END
40
- def self.#{sorter_name}_cols=(val)
41
- @@#{sorter_name}_cols = val
42
- end
43
-
44
- def self.#{sorter_name}_cols
45
- @@#{sorter_name}_cols
46
- end
47
- cattr_accessor :#{sorter_name}_cols
48
-
49
- def self.#{sorter_name}_col_defs
50
- @@#{sorter_name}_cols ||= #{sorter_name}_initialize_col_defs
51
- end
52
-
53
- def self.#{sorter_name}_col_text(obj, col)
54
- if self.#{sorter_name}_in_resultset?(col)
55
- ret = obj.send(col)
56
- if ret == '' or ret.nil?
57
- ret = "&nbsp;" #so empty TD cells still get displayed
58
- end
59
- return ret
60
- end
61
- return self.#{sorter_name}_print_text(col)
62
- end
63
-
64
- def self.#{sorter_name}_yaml_path
65
- raise "RAILS_ROOT is not defined" unless defined?(RAILS_ROOT)
66
- klass_name = Inflector.underscore(self.class_name)
67
- file_name = "#{sorter_name}.yml"
68
- if sorter_options[:subclass_name]
69
- sub_path = File.join(klass_name, Inflector.underscore(sorter_options[:subclass_name]), file_name)
70
- else
71
- sub_path = File.join(klass_name, file_name)
72
- end
73
- if sorter_options[:path_prefix]
74
- return File.join(RAILS_ROOT, sorter_options[:path_prefix], sub_path)
75
- else
76
- #defaults to col_defs subdirectory in app/models
77
- return File.join(RAILS_ROOT, "app/models/col_defs", sub_path)
40
+ def self.#{sorter_name}_cols=(val)
41
+ @@#{sorter_name}_cols = val
42
+ end
43
+
44
+ def self.#{sorter_name}_cols
45
+ @@#{sorter_name}_cols
46
+ end
47
+ cattr_accessor :#{sorter_name}_cols
48
+
49
+ def self.#{sorter_name}_col_defs
50
+ @@#{sorter_name}_cols ||= #{sorter_name}_initialize_col_defs
51
+ end
52
+
53
+ def self.#{sorter_name}_col_text(obj, col)
54
+ if self.#{sorter_name}_in_resultset?(col)
55
+ ret = obj.send(col)
56
+ if ret == '' or ret.nil?
57
+ ret = "&nbsp;" #so empty TD cells still get displayed
78
58
  end
79
- end
80
-
81
- def self.#{sorter_name}_initialize_col_defs
59
+ return ret
60
+ end
61
+ return self.#{sorter_name}_print_text(col)
62
+ end
63
+
64
+ def self.#{sorter_name}_yaml_path
65
+ raise "RAILS_ROOT is not defined" unless defined?(RAILS_ROOT)
66
+ klass_name = ActiveSupport::Inflector.underscore(self.class_name)
67
+ file_name = "#{sorter_name}.yml"
68
+ if sorter_options[:subclass_name]
69
+ sub_path = File.join(klass_name, ActiveSupport::Inflector.underscore(sorter_options[:subclass_name]), file_name)
70
+ else
71
+ sub_path = File.join(klass_name, file_name)
72
+ end
73
+ if sorter_options[:path_prefix]
74
+ return File.join(RAILS_ROOT, sorter_options[:path_prefix], sub_path)
75
+ else
76
+ #defaults to col_defs subdirectory in app/models
77
+ return File.join(RAILS_ROOT, "app/models/col_defs", sub_path)
78
+ end
79
+ end
80
+
81
+ def self.#{sorter_name}_initialize_col_defs
82
+ if "#{sorter_name}" == 'default_sorter'
83
+ self.default_col_defs
84
+ else
82
85
  YAML.load_file(#{sorter_name}_yaml_path)
83
86
  end
87
+ end
84
88
 
85
- def self.#{sorter_name}_col_def_hash
86
- @@#{sorter_name}_col_def_hash ||= #{sorter_name}_initialize_col_def_hash
87
- end
89
+ def self.#{sorter_name}_col_def_hash
90
+ @@#{sorter_name}_col_def_hash ||= #{sorter_name}_initialize_col_def_hash
91
+ end
88
92
 
89
- def self.#{sorter_name}_initialize_col_def_hash
90
- col_def_hash = {}
91
- #{sorter_name}_col_defs.each do |c|
92
- c.keys.each do |key|
93
- col_def_hash[key] = c[key]
94
- end
93
+ def self.#{sorter_name}_initialize_col_def_hash
94
+ col_def_hash = {}
95
+ #{sorter_name}_col_defs.each do |c|
96
+ c.keys.each do |key|
97
+ col_def_hash[key] = c[key]
95
98
  end
96
- col_def_hash
97
99
  end
100
+ col_def_hash
101
+ end
98
102
 
99
- def self.#{sorter_name}_col_keys_in_order
100
- @@#{sorter_name}_col_keys_in_order ||= #{sorter_name}_initialize_col_keys_in_order
101
- end
103
+ def self.#{sorter_name}_col_keys_in_order
104
+ @@#{sorter_name}_col_keys_in_order ||= #{sorter_name}_initialize_col_keys_in_order
105
+ end
102
106
 
103
- def self.#{sorter_name}_initialize_col_keys_in_order
104
- cols = []
105
- #{sorter_name}_col_defs.each do |hsh|
106
- hsh.each do |key, sub_hash|
107
- cols << key
108
- end
107
+ def self.#{sorter_name}_initialize_col_keys_in_order
108
+ cols = []
109
+ #{sorter_name}_col_defs.each do |hsh|
110
+ hsh.each do |key, sub_hash|
111
+ cols << key
109
112
  end
110
- cols
111
113
  end
114
+ cols
115
+ end
112
116
 
113
- def self.#{sorter_name}_heading(col)
114
- return false if #{sorter_name}_col_def_hash[col]['heading'] == false
115
- #{sorter_name}_col_def_hash[col]['heading'] || col.humanize
116
- end
117
+ def self.#{sorter_name}_heading(col)
118
+ return false if #{sorter_name}_col_def_hash[col]['heading'] == false
119
+ #{sorter_name}_col_def_hash[col]['heading'] || col.humanize
120
+ end
117
121
 
118
- def self.#{sorter_name}_headings_in_order
119
- @@#{sorter_name}_headings_in_order ||= #{sorter_name}_initialize_headings_in_order
120
- end
122
+ def self.#{sorter_name}_headings_in_order
123
+ @@#{sorter_name}_headings_in_order ||= #{sorter_name}_initialize_headings_in_order
124
+ end
121
125
 
122
- def self.#{sorter_name}_initialize_headings_in_order
123
- headings = []
124
- #{sorter_name}_col_keys_in_order.each do |key|
125
- headings << #{sorter_name}_heading(key) if #{sorter_name}_heading(key)
126
- end
127
- headings
126
+ def self.#{sorter_name}_initialize_headings_in_order
127
+ headings = []
128
+ #{sorter_name}_col_keys_in_order.each do |key|
129
+ headings << #{sorter_name}_heading(key) if #{sorter_name}_heading(key)
128
130
  end
131
+ headings
132
+ end
129
133
 
130
- def self.#{sorter_name}_col_def(col)
131
- #{sorter_name}_col_def_hash[col]
132
- end
134
+ def self.#{sorter_name}_col_def(col)
135
+ #{sorter_name}_col_def_hash[col]
136
+ end
133
137
 
134
- def self.#{sorter_name}_datatype(col)
135
- #{sorter_name}_col_def_hash[col]['datatype']
136
- end
138
+ def self.#{sorter_name}_datatype(col)
139
+ #{sorter_name}_col_def_hash[col]['datatype']
140
+ end
137
141
 
138
- def self.#{sorter_name}_sort_options(col)
139
- #{sorter_name}_col_def_hash[col]['sort_options']
140
- end
142
+ def self.#{sorter_name}_sort_options(col)
143
+ #{sorter_name}_col_def_hash[col]['sort_options']
144
+ end
141
145
 
142
- def self.#{sorter_name}_default_sort_dir(col)
143
- if sort_ops = #{sorter_name}_col_def_hash[col]['sort_options']
144
- sort_ops['default_dir'] ? sort_ops['default_dir'] : 'asc'
145
- else
146
- 'asc'
147
- end
148
- end
149
-
150
- def self.#{sorter_name}_print_options(col)
151
- if #{sorter_name}_col_def_hash[col]
152
- #{sorter_name}_col_def_hash[col]['print_options']
153
- end
154
- end
155
-
156
- def self.#{sorter_name}_td_class(col)
157
- #{sorter_name}_col_def_hash[col]['td_class']
146
+ def self.#{sorter_name}_default_sort_dir(col)
147
+ if sort_ops = #{sorter_name}_col_def_hash[col]['sort_options']
148
+ sort_ops['default_dir'] ? sort_ops['default_dir'] : 'asc'
149
+ else
150
+ 'asc'
158
151
  end
152
+ end
159
153
 
160
- def self.#{sorter_name}_th_class(col)
161
- #{sorter_name}_col_def_hash[col]['th_class']
154
+ def self.#{sorter_name}_print_options(col)
155
+ if #{sorter_name}_col_def_hash[col]
156
+ #{sorter_name}_col_def_hash[col]['print_options']
162
157
  end
158
+ end
163
159
 
164
- def self.#{sorter_name}_precision(col)
165
- #{sorter_name}_col_def_hash[col]['precision']
166
- end
167
-
168
- def self.#{sorter_name}_delimiter(col)
169
- #{sorter_name}_col_def_hash[col]['delimiter'] || ","
170
- end
171
-
172
- def self.#{sorter_name}_separator(col)
173
- #{sorter_name}_col_def_hash[col]['separator'] || "."
174
- end
175
-
176
- def self.#{sorter_name}_unit(col)
177
- #{sorter_name}_col_def_hash[col]['unit'] || "$"
178
- end
179
-
180
- def self.#{sorter_name}_date_format(col)
181
- format = #{sorter_name}_col_def_hash[col]['date_format']
182
- unless format
183
- datatype = #{sorter_name}_datatype(col)
184
- if datatype.downcase == 'datetime'
185
- format = "%Y-%m-%d %I:%M:%S"
186
- else
187
- format = "%Y-%m-%d"
188
- end
189
- end
190
- format
191
- end
160
+ def self.#{sorter_name}_td_class(col)
161
+ #{sorter_name}_col_def_hash[col]['td_class']
162
+ end
192
163
 
193
- def self.#{sorter_name}_print_text(col)
194
- #{sorter_name}_col_def_hash[col]['print_text'] || ''
195
- end
164
+ def self.#{sorter_name}_th_class(col)
165
+ #{sorter_name}_col_def_hash[col]['th_class']
166
+ end
196
167
 
197
- def self.#{sorter_name}_sortable?(col)
198
- hsh = #{sorter_name}_col_def_hash[col]
199
- return false if hsh.has_key?('sortable') && hsh['sortable'] == false
200
- return false if hsh.has_key?('heading') && hsh['heading'] == false
201
- return true
202
- end
168
+ def self.#{sorter_name}_precision(col)
169
+ #{sorter_name}_col_def_hash[col]['precision']
170
+ end
203
171
 
204
- def self.#{sorter_name}_link_options(col)
205
- link_ops = #{sorter_name}_col_def_hash[col]['link_options']
206
- return link_ops.symbolize_keys! if link_ops
207
- end
172
+ def self.#{sorter_name}_delimiter(col)
173
+ #{sorter_name}_col_def_hash[col]['delimiter'] || ","
174
+ end
208
175
 
209
- def self.#{sorter_name}_link?(col)
210
- return true if #{sorter_name}_link_options(col)
211
- return false
212
- end
176
+ def self.#{sorter_name}_separator(col)
177
+ #{sorter_name}_col_def_hash[col]['separator'] || "."
178
+ end
213
179
 
214
- def self.#{sorter_name}_in_resultset?(col)
215
- hsh = #{sorter_name}_col_def_hash[col]
216
- return false if hsh.has_key?('in_resultset') && hsh['in_resultset'] == false
217
- return true
218
- end
180
+ def self.#{sorter_name}_unit(col)
181
+ #{sorter_name}_col_def_hash[col]['unit'] || "$"
182
+ end
219
183
 
220
- def self.#{sorter_name}_col_def_for_yui(col)
221
- label = #{sorter_name}_heading(col) ? #{sorter_name}_heading(col) : ''
222
- sortable = #{sorter_name}_sortable?(col)
184
+ def self.#{sorter_name}_date_format(col)
185
+ format = #{sorter_name}_col_def_hash[col]['date_format']
186
+ unless format
223
187
  datatype = #{sorter_name}_datatype(col)
224
- if datatype == 'number' or datatype == 'currency'
225
- formatter = datatype
226
- end
227
- sort_dir = #{sorter_name}_default_sort_dir(col)
228
- if sort_dir == 'desc'
229
- sort_ops = {:defaultDir => "YAHOO.widget.DataTable.CLASS_DESC"}
188
+ if datatype.downcase == 'datetime'
189
+ format = "%Y-%m-%d %I:%M:%S"
190
+ else
191
+ format = "%Y-%m-%d"
230
192
  end
231
- yui = {:key => col, :label => label, :sortable => sortable}
232
- yui[:sortOptions] = sort_ops if sort_ops
233
- yui[:formatter] = formatter if formatter
234
- yui
235
193
  end
236
-
237
- def self.#{sorter_name}_col_defs_for_yui
238
- yui_col_defs = []
239
- #{sorter_name}_col_keys_in_order.each do |col|
240
- yui_col_defs << #{sorter_name}_col_def_for_yui(col)
194
+ format
195
+ end
196
+
197
+ def self.#{sorter_name}_print_text(col)
198
+ #{sorter_name}_col_def_hash[col]['print_text'] || ''
199
+ end
200
+
201
+ def self.#{sorter_name}_sortable?(col)
202
+ hsh = #{sorter_name}_col_def_hash[col]
203
+ return false if hsh.has_key?('sortable') && hsh['sortable'] == false
204
+ return false if hsh.has_key?('heading') && hsh['heading'] == false
205
+ return true
206
+ end
207
+
208
+ def self.#{sorter_name}_link_options(col)
209
+ link_ops = #{sorter_name}_col_def_hash[col]['link_options']
210
+ return link_ops.symbolize_keys! if link_ops
211
+ end
212
+
213
+ def self.#{sorter_name}_link?(col)
214
+ return true if #{sorter_name}_link_options(col)
215
+ return false
216
+ end
217
+
218
+ def self.#{sorter_name}_in_resultset?(col)
219
+ hsh = #{sorter_name}_col_def_hash[col]
220
+ return false if hsh.has_key?('in_resultset') && hsh['in_resultset'] == false
221
+ return true
222
+ end
223
+
224
+ def self.#{sorter_name}_col_def_for_yui(col)
225
+ label = #{sorter_name}_heading(col) ? #{sorter_name}_heading(col) : ''
226
+ sortable = #{sorter_name}_sortable?(col)
227
+ datatype = #{sorter_name}_datatype(col)
228
+ if datatype == 'number' or datatype == 'currency'
229
+ formatter = datatype
230
+ end
231
+ sort_dir = #{sorter_name}_default_sort_dir(col)
232
+ if sort_dir == 'desc'
233
+ sort_ops = {:defaultDir => "YAHOO.widget.DataTable.CLASS_DESC"}
234
+ end
235
+ yui = {:key => col, :label => label, :sortable => sortable}
236
+ yui[:sortOptions] = sort_ops if sort_ops
237
+ yui[:formatter] = formatter if formatter
238
+ yui
239
+ end
240
+
241
+ def self.#{sorter_name}_col_defs_for_yui
242
+ yui_col_defs = []
243
+ #{sorter_name}_col_keys_in_order.each do |col|
244
+ yui_col_defs << #{sorter_name}_col_def_for_yui(col)
245
+ end
246
+ yui_col_defs
247
+ end
248
+
249
+ def self.#{sorter_name}_field_def_for_yui(col)
250
+ datatype = #{sorter_name}_datatype(col)
251
+ yui_field_def = {:key => col}
252
+ if datatype == 'number'
253
+ yui_field_def[:parser] = "YAHOO.util.DataSource.parseNumber"
254
+ end
255
+ if datatype == 'currency'
256
+ yui_field_def[:parser] = "this.parseNumberFromCurrency"
257
+ end
258
+ yui_field_def
259
+ end
260
+
261
+ def self.#{sorter_name}_fields_for_yui
262
+ yui_fields = []
263
+ #{sorter_name}_col_keys_in_order.each do |col|
264
+ yui_fields << #{sorter_name}_field_def_for_yui(col)
265
+ end
266
+ yui_fields
267
+ end
268
+
269
+
270
+ def self.default_col_defs(output=:hsh)
271
+ col_arr = []
272
+ col_hsh = self.columns_hash
273
+ self.column_names.each do |col_name|
274
+ hsh = {}
275
+ col = col_hsh[col_name]
276
+ hsh[col.name] = {}
277
+ h = hsh[col.name]
278
+ h['heading'] = col.name.titleize
279
+ if col.limit && col.limit > 50
280
+ h['sortable'] = 'false'
241
281
  end
242
- yui_col_defs
243
- end
244
-
245
- def self.#{sorter_name}_field_def_for_yui(col)
246
- datatype = #{sorter_name}_datatype(col)
247
- yui_field_def = {:key => col}
248
- if datatype == 'number'
249
- yui_field_def[:parser] = "YAHOO.util.DataSource.parseNumber"
282
+ if col.type == :date
283
+ h['datatype'] = 'date'
250
284
  end
251
- if datatype == 'currency'
252
- yui_field_def[:parser] = "this.parseNumberFromCurrency"
285
+ if col.type == :datetime
286
+ h['datatype'] = 'datetime'
253
287
  end
254
- yui_field_def
255
- end
256
-
257
- def self.#{sorter_name}_fields_for_yui
258
- yui_fields = []
259
- #{sorter_name}_col_keys_in_order.each do |col|
260
- yui_fields << #{sorter_name}_field_def_for_yui(col)
288
+ if col.type == :integer
289
+ h['datatype'] = 'number'
290
+ h['sort_options'] = {'default_dir' => 'asc'}
291
+ end
292
+ if col.name.match(/amt|cost|price|balance/)
293
+ h['datatype'] = 'currency'
294
+ h['sort_options'] = {'default_dir' => 'desc'}
295
+ elsif col.type == :decimal
296
+ h['datatype'] = 'number'
297
+ h['precision'] = 2
298
+ h['sort_options'] = {'default_dir' => 'asc'}
261
299
  end
262
- yui_fields
300
+ col_arr << hsh
263
301
  end
302
+ return col_arr if output == :hsh
303
+ return col_arr.to_yaml
304
+ end
264
305
 
265
-
266
- END
306
+ END
267
307
 
268
308
  end #sortable_columns
269
309
  end #ClassMethods
@@ -45,6 +45,8 @@ class Person < ActiveRecord::Base
45
45
  :path_prefix => "/test/col_def_test_yaml_files"
46
46
  sortable_columns :tacosorter,
47
47
  :path_prefix => "/test/col_def_test_yaml_files"
48
+ sortable_columns :default_sorter,
49
+ :path_prefix => "/test/col_def_test_yaml_files"
48
50
 
49
51
  #Some mock methods. Normally we would have an AR object which could have been
50
52
  #created by a find_by_sql query, which could include methods such as these.
@@ -300,6 +302,48 @@ class SortableColumnsTest< Test::Unit::TestCase
300
302
  assert_equal expected, Person.mysorter_fields_for_yui
301
303
  end
302
304
 
305
+ def test_default_yaml_col_defs_for_person
306
+ expected='---
307
+ - id:
308
+ sort_options:
309
+ default_dir: asc
310
+ datatype: number
311
+ heading: Id
312
+ - firstname:
313
+ heading: Firstname
314
+ sortable: "false"
315
+ - lastname:
316
+ heading: Lastname
317
+ sortable: "false"
318
+ - age:
319
+ sort_options:
320
+ default_dir: asc
321
+ datatype: number
322
+ heading: Age
323
+ - description:
324
+ heading: Description
325
+ sortable: "false"
326
+ - balance:
327
+ sort_options:
328
+ default_dir: desc
329
+ datatype: currency
330
+ heading: Balance
331
+ - created_at:
332
+ datatype: datetime
333
+ heading: Created At
334
+ - registered_at:
335
+ datatype: datetime
336
+ heading: Registered At'
337
+
338
+ default_col_defs = Person.default_col_defs(:yaml)
339
+ assert_equal YAML.load(expected), YAML.load(default_col_defs)
340
+ end
341
+
342
+ def test_default_sorter_for_person
343
+ assert_equal 'number', Person.default_sorter_datatype('age')
344
+ assert_equal 'Balance', Person.default_sorter_heading('balance')
345
+ end
346
+
303
347
  end
304
348
 
305
349
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sortablecolumns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Donovan - http://www.bryandonovan.com
@@ -9,17 +9,18 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-04 00:00:00 -07:00
12
+ date: 2009-02-19 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hoe
17
+ type: :development
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
20
21
  - - ">="
21
22
  - !ruby/object:Gem::Version
22
- version: 1.5.3
23
+ version: 1.8.3
23
24
  version:
24
25
  description: Sortable HTML tables for Rails
25
26
  email: b.dondo+rubyforge@gmail.com
@@ -66,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
66
67
  requirements: []
67
68
 
68
69
  rubyforge_project: sortablecolumns
69
- rubygems_version: 1.1.1
70
+ rubygems_version: 1.3.1
70
71
  signing_key:
71
72
  specification_version: 2
72
73
  summary: Sortable HTML tables for Rails