table_helper 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,11 @@
1
1
  *SVN*
2
2
 
3
+ *0.0.4* (June 15th, 2008)
4
+
5
+ * Support cell/column names that conflict with existing method names on the Row/Header classes
6
+
7
+ * Avoid string evaluation for dynamic methods
8
+
3
9
  *0.0.3* (June 1st, 2008)
4
10
 
5
11
  * Remove dependency on set_or_append
data/README CHANGED
@@ -158,4 +158,3 @@ To run against a specific version of Rails:
158
158
  == Dependencies
159
159
 
160
160
  * Rails 2.0 or later
161
- * set_or_append[http://wiki.pluginaweek.org/Set_or_append]
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require 'rake/gempackagetask'
4
4
  require 'rake/contrib/sshpublisher'
5
5
 
6
6
  PKG_NAME = 'table_helper'
7
- PKG_VERSION = '0.0.3'
7
+ PKG_VERSION = '0.0.4'
8
8
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
9
9
  RUBY_FORGE_PROJECT = 'pluginaweek'
10
10
 
@@ -94,7 +94,7 @@ module PluginAWeek #:nodoc:
94
94
  row = BodyRow.new(object, @header)
95
95
  row.alternate = alternate_rows ? index.send("#{@alternate_rows}?") : false
96
96
 
97
- yield row, object, index if block_given?
97
+ yield row.builder, object, index if block_given?
98
98
 
99
99
  row.html
100
100
  end
@@ -44,7 +44,7 @@ module PluginAWeek #:nodoc:
44
44
  if object.respond_to?(column)
45
45
  cell(column, object.send(column))
46
46
  else
47
- define_cell_accessor(column)
47
+ builder.define_cell(column)
48
48
  end
49
49
  end
50
50
  end
@@ -34,7 +34,7 @@ module PluginAWeek #:nodoc:
34
34
  # Indicates what type of content will be stored in this cell. This can
35
35
  # either be set to either :data or :header.
36
36
  def content_type=(value)
37
- raise ArgumentError, "content_type must be set to :data or :header, was: #{value.inspect}" if ![:data, :header].include?(value)
37
+ raise ArgumentError, "content_type must be set to :data or :header, was: #{value.inspect}" unless [:data, :header].include?(value)
38
38
  @content_type = value
39
39
  end
40
40
 
@@ -36,7 +36,7 @@ module PluginAWeek #:nodoc:
36
36
  @body.build # Build with the defaults
37
37
 
38
38
  elements = []
39
- elements << @header if @options[:header]
39
+ elements << @header.builder if @options[:header]
40
40
  elements << @body
41
41
  elements << @footer if @options[:footer]
42
42
 
@@ -2,11 +2,56 @@ require 'table_helper/row'
2
2
 
3
3
  module PluginAWeek #:nodoc:
4
4
  module TableHelper
5
+ # Provides a blank class that can be used to build the columns for a header
6
+ class HeaderBuilder < BlankSlate
7
+ reveal :respond_to?
8
+
9
+ attr_reader :header
10
+
11
+ # Creates a builder for the given header
12
+ def initialize(header)
13
+ @header = header
14
+ end
15
+
16
+ # Proxies all missed methods to the header
17
+ def method_missing(*args)
18
+ header.send(*args)
19
+ end
20
+
21
+ # Defines the accessor method for the given column name. For example, if
22
+ # a column with the name :title was defined, then the column would be able
23
+ # to be read and written like so:
24
+ #
25
+ # header.title #=> Accesses the title
26
+ # header.title "Page Title" #=> Creates a new column with "Page Title" as the content
27
+ def define_column(name)
28
+ method_name = name.to_s.gsub('-', '_')
29
+
30
+ klass = class << self; self; end
31
+ klass.class_eval do
32
+ define_method(method_name) do |*args|
33
+ header.row.builder.__send__(method_name, *args)
34
+ end
35
+ end unless klass.method_defined?(method_name)
36
+ end
37
+
38
+ # Removes the definition for the given cp;i,m
39
+ def undef_column(name)
40
+ klass = class << self; self; end
41
+ klass.class_eval do
42
+ remove_method(name.gsub('-', '_'))
43
+ end
44
+ end
45
+ end
46
+
5
47
  # Represents the header of the table. In HTML, you can think of this as
6
48
  # the <thead> tag of the table.
7
49
  class Header < HtmlElement
8
50
  # The actual header row
9
- attr_reader :row
51
+ attr_reader :row
52
+
53
+ # The proxy class used externally to build the actual columns
54
+ attr_reader :builder
10
55
 
11
56
  # Whether or not the header should be hidden when the collection is
12
57
  # empty. Default is true.
@@ -23,6 +68,7 @@ module PluginAWeek #:nodoc:
23
68
 
24
69
  @collection = collection
25
70
  @row = Row.new
71
+ @builder = HeaderBuilder.new(self)
26
72
 
27
73
  @hide_when_empty = true
28
74
  @customized = true
@@ -38,11 +84,23 @@ module PluginAWeek #:nodoc:
38
84
  end
39
85
  end
40
86
 
87
+ # The current columns in this header, in the order in which they will be built
88
+ def columns
89
+ row.cells
90
+ end
91
+
41
92
  # Gets the names of all of the columns being displayed in the table
42
93
  def column_names
43
94
  row.cell_names
44
95
  end
45
96
 
97
+ # Clears all of the current columns from the header
98
+ def clear
99
+ # Remove all of the shortcut methods
100
+ column_names.each {|name| builder.undef_column(name)}
101
+ row.clear
102
+ end
103
+
46
104
  # Creates a new column with the specified caption. Columns must be
47
105
  # defined in the order in which they will be rendered.
48
106
  #
@@ -61,37 +119,16 @@ module PluginAWeek #:nodoc:
61
119
  # header.column :title, 'The Title', :class => 'pretty'
62
120
  def column(name, *args)
63
121
  # Clear the header row if this is being customized by the user
64
- if !@customized
122
+ unless @customized
65
123
  @customized = true
66
-
67
- # Remove all of the shortcut methods
68
- column_names.each do |column|
69
- klass = class << self; self; end
70
- klass.class_eval do
71
- remove_method(column)
72
- end
73
- end
74
-
75
- @row.clear
124
+ clear
76
125
  end
77
126
 
78
- column = @row.cell(name, *args)
127
+ column = row.cell(name, *args)
79
128
  column.content_type = :header
80
129
  column[:scope] ||= 'col'
81
130
 
82
- # Define a shortcut method to the cell
83
- name = name.to_s.gsub('-', '_')
84
- unless respond_to?(name)
85
- instance_eval <<-end_eval
86
- def #{name}(*args)
87
- if args.empty?
88
- @row.#{name}
89
- else
90
- @row.#{name}(*args)
91
- end
92
- end
93
- end_eval
94
- end
131
+ builder.define_column(name)
95
132
 
96
133
  column
97
134
  end
@@ -105,14 +142,7 @@ module PluginAWeek #:nodoc:
105
142
  end
106
143
 
107
144
  private
108
- def tag_name
109
- 'thead'
110
- end
111
-
112
- def content
113
- @row.html
114
- end
115
-
145
+ # Finds the class representing the objects within the collection
116
146
  def class_for_collection(collection)
117
147
  if collection.respond_to?(:proxy_reflection)
118
148
  collection.proxy_reflection.klass
@@ -120,6 +150,14 @@ module PluginAWeek #:nodoc:
120
150
  collection.first.class
121
151
  end
122
152
  end
153
+
154
+ def tag_name
155
+ 'thead'
156
+ end
157
+
158
+ def content
159
+ @row.html
160
+ end
123
161
  end
124
162
  end
125
163
  end
@@ -2,13 +2,68 @@ require 'table_helper/cell'
2
2
 
3
3
  module PluginAWeek #:nodoc:
4
4
  module TableHelper
5
+ # Provides a blank class that can be used to build the cells for a row
6
+ class RowBuilder < BlankSlate
7
+ reveal :respond_to?
8
+
9
+ attr_reader :row
10
+
11
+ # Creates a builder for the given row
12
+ def initialize(row)
13
+ @row = row
14
+ end
15
+
16
+ # Proxies all missed methods to the row
17
+ def method_missing(*args)
18
+ row.send(*args)
19
+ end
20
+
21
+ # Defines the builder method for the given cell name. For example, if
22
+ # a cell with the name :title was defined, then the cell would be able
23
+ # to be read and written like so:
24
+ #
25
+ # row.title #=> Accesses the title
26
+ # row.title "Page Title" #=> Creates a new cell with "Page Title" as the content
27
+ def define_cell(name)
28
+ method_name = name.gsub('-', '_')
29
+
30
+ klass = class << self; self; end
31
+ klass.class_eval do
32
+ define_method(method_name) do |*args|
33
+ if args.empty?
34
+ row.cells[name]
35
+ else
36
+ row.cell(name, *args)
37
+ end
38
+ end
39
+ end unless klass.method_defined?(method_name)
40
+ end
41
+
42
+ # Removes the definition for the given cell
43
+ def undef_cell(name)
44
+ method_name = name.gsub('-', '_')
45
+
46
+ klass = class << self; self; end
47
+ klass.class_eval do
48
+ remove_method(method_name)
49
+ end
50
+ end
51
+ end
52
+
5
53
  # Represents a single row within a table. A row can consist of either
6
54
  # data cells or header cells.
7
55
  class Row < HtmlElement
56
+ # The proxy class used externally to build the actual cells
57
+ attr_reader :builder
58
+
59
+ # The current cells in this row, in the order in which they will be built
60
+ attr_reader :cells
61
+
8
62
  def initialize #:nodoc:
9
63
  super
10
64
 
11
65
  @cells = ActiveSupport::OrderedHash.new
66
+ @builder = RowBuilder.new(self)
12
67
  end
13
68
 
14
69
  # Creates a new cell with the given name and generates shortcut
@@ -17,55 +72,31 @@ module PluginAWeek #:nodoc:
17
72
  name = name.to_s if name
18
73
 
19
74
  cell = Cell.new(name, *args)
20
- @cells[name] = cell
21
-
22
- define_cell_accessor(name) if name && !respond_to?(name)
75
+ cells[name] = cell
76
+ builder.define_cell(name) if name
23
77
 
24
78
  cell
25
79
  end
26
80
 
27
81
  # The names of all cells in this row
28
82
  def cell_names
29
- @cells.keys
83
+ cells.keys
30
84
  end
31
85
 
32
86
  # Clears all of the current cells from the row
33
87
  def clear
34
- cell_names.each do |name|
35
- klass = class << self; self; end
36
- klass.class_eval do
37
- remove_method(name)
38
- end
39
- end
40
-
41
- @cells.clear
88
+ # Remove all of the shortcut methods
89
+ cell_names.each {|name| builder.undef_cell(name)}
90
+ cells.clear
42
91
  end
43
92
 
44
93
  private
45
- # Defines the accessor method for the given cell name. For example, if
46
- # a cell with the name :title was defined, then the cell would be able
47
- # to be read and written like so:
48
- #
49
- # row.title #=> Accesses the title
50
- # row.title "Page Title" #=> Creates a new cell with "Page Title" as the content
51
- def define_cell_accessor(name)
52
- instance_eval <<-end_eval
53
- def #{name.gsub('-', '_')}(*args)
54
- if args.empty?
55
- @cells[#{name.inspect}]
56
- else
57
- cell(#{name.inspect}, *args)
58
- end
59
- end
60
- end_eval
61
- end
62
-
63
94
  def tag_name
64
95
  'tr'
65
96
  end
66
97
 
67
98
  def content
68
- @cells.values.map(&:html).join
99
+ cells.values.map(&:html).join
69
100
  end
70
101
  end
71
102
  end
@@ -29,11 +29,11 @@ class BodyRowTest < Test::Unit::TestCase
29
29
  end
30
30
 
31
31
  def test_should_generate_cell_accessors
32
- assert @row.respond_to?(:title)
32
+ assert_nothing_raised {@row.builder.title}
33
33
  end
34
34
 
35
35
  def test_should_override_default_cell_content_if_cell_specified
36
- @row.title 'Hello World'
36
+ @row.builder.title 'Hello World'
37
37
  assert_equal '<tr class="row"><td class="title">Hello World</td></tr>', @row.html
38
38
  end
39
39
  end
@@ -64,7 +64,7 @@ class BodyRowWithCustomAttributeTest < Test::Unit::TestCase
64
64
  end
65
65
 
66
66
  def test_should_use_attribute_values_as_cell_content
67
- @row.author_name 'John Doe'
67
+ @row.builder.author_name 'John Doe'
68
68
  assert_equal '<tr class="row"><td class="title">Default Value</td><td class="author_name">John Doe</td></tr>', @row.html
69
69
  end
70
70
  end
@@ -82,12 +82,12 @@ class BodyRowWithMissingCellsTest < Test::Unit::TestCase
82
82
  end
83
83
 
84
84
  def test_should_skip_missing_cells_if_colspan_replaces_missing_cells
85
- @row.title 'Hello World', :colspan => 2
85
+ @row.builder.title 'Hello World', :colspan => 2
86
86
  assert_equal '<tr class="row"><td class="title" colspan="2">Hello World</td></tr>', @row.html
87
87
  end
88
88
 
89
89
  def test_should_not_skip_missing_cells_if_colspan_doesnt_replace_missing_cells
90
- @row.title 'Hello World'
90
+ @row.builder.title 'Hello World'
91
91
  assert_equal '<tr class="row"><td class="title">Hello World</td><td class="author_name empty"></td></tr>', @row.html
92
92
  end
93
93
  end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class HeaderBuilderByDefaultTest < Test::Unit::TestCase
4
+ def setup
5
+ @header = PluginAWeek::TableHelper::Header.new([])
6
+ @builder = PluginAWeek::TableHelper::HeaderBuilder.new(@header)
7
+ end
8
+
9
+ def test_should_forward_missing_calls_to_row
10
+ assert_equal '<thead style="display: none;"><tr></tr></thead>', @builder.html
11
+ end
12
+ end
13
+
14
+ class HeaderBuilderWithColumnsTest < Test::Unit::TestCase
15
+ def setup
16
+ @header = PluginAWeek::TableHelper::Header.new([])
17
+ @header.row.cell 'first-name'
18
+
19
+ @builder = PluginAWeek::TableHelper::HeaderBuilder.new(@header)
20
+ @builder.define_column('first-name')
21
+ end
22
+
23
+ def test_should_create_column_reader
24
+ assert_nothing_raised {@builder.first_name}
25
+ end
26
+
27
+ def test_should_read_column_without_arguments
28
+ assert_instance_of PluginAWeek::TableHelper::Cell, @builder.first_name
29
+ end
30
+
31
+ def test_should_write_cell_with_arguments
32
+ @builder.first_name 'Your Name'
33
+ assert_equal '<td class="first-name">Your Name</td>', @header.row.cells['first-name'].html
34
+ end
35
+ end
36
+
37
+ class RowBuilderAfterUndefiningAColumnTest < Test::Unit::TestCase
38
+ def setup
39
+ @header = PluginAWeek::TableHelper::Header.new([])
40
+ @builder = PluginAWeek::TableHelper::HeaderBuilder.new(@header)
41
+ @builder.define_column('first-name')
42
+ @builder.undef_column('first-name')
43
+ end
44
+
45
+ def test_should_not_have_cell_reader
46
+ assert_raise(NoMethodError) {@builder.first_name}
47
+ end
48
+ end
data/test/header_test.rb CHANGED
@@ -56,11 +56,11 @@ class HeaderTest < Test::Unit::TestCase
56
56
  def test_should_create_column_readers_if_column_names_found
57
57
  header = PluginAWeek::TableHelper::Header.new([], Post)
58
58
 
59
- assert header.respond_to?(:title)
60
- assert_instance_of PluginAWeek::TableHelper::Cell, header.title
59
+ assert_nothing_raised {header.builder.title}
60
+ assert_instance_of PluginAWeek::TableHelper::Cell, header.builder.title
61
61
 
62
- assert header.respond_to?(:author_name)
63
- assert_instance_of PluginAWeek::TableHelper::Cell, header.author_name
62
+ assert_nothing_raised {header.builder.title}
63
+ assert_instance_of PluginAWeek::TableHelper::Cell, header.builder.author_name
64
64
  end
65
65
 
66
66
  def test_should_create_column_reader_when_column_is_created
@@ -68,33 +68,33 @@ class HeaderTest < Test::Unit::TestCase
68
68
  header.column :title
69
69
 
70
70
  assert_equal ['title'], header.column_names
71
- assert_instance_of PluginAWeek::TableHelper::Cell, header.title
71
+ assert_instance_of PluginAWeek::TableHelper::Cell, header.builder.title
72
72
  end
73
73
 
74
74
  def test_should_set_column_scope
75
75
  header = PluginAWeek::TableHelper::Header.new([])
76
76
  header.column :title
77
- assert_equal 'col', header.title[:scope]
77
+ assert_equal 'col', header.columns['title'][:scope]
78
78
  end
79
79
 
80
80
  def test_should_allow_html_options_to_be_specified_for_new_columns
81
81
  header = PluginAWeek::TableHelper::Header.new([])
82
82
  header.column :title, 'Title', :class => 'pretty'
83
- assert_equal 'title pretty', header.title[:class]
83
+ assert_equal 'title pretty', header.columns['title'][:class]
84
84
  end
85
85
 
86
86
  def test_should_use_column_name_for_default_content
87
87
  header = PluginAWeek::TableHelper::Header.new([])
88
88
  header.column :title
89
- assert_equal '<th class="title" scope="col">Title</th>', header.title.html
89
+ assert_equal '<th class="title" scope="col">Title</th>', header.columns['title'].html
90
90
  end
91
91
 
92
92
  def test_should_sanitize_column_names
93
93
  header = PluginAWeek::TableHelper::Header.new([])
94
94
  header.column 'the-title'
95
95
 
96
- assert header.respond_to?(:the_title)
97
- assert_instance_of PluginAWeek::TableHelper::Cell, header.the_title
96
+ assert_nothing_raised {header.builder.the_title}
97
+ assert_instance_of PluginAWeek::TableHelper::Cell, header.builder.the_title
98
98
  end
99
99
 
100
100
  def test_should_clear_existing_columns_when_first_column_is_created
@@ -103,8 +103,8 @@ class HeaderTest < Test::Unit::TestCase
103
103
 
104
104
  header.column :created_on
105
105
 
106
- assert !header.respond_to?(:title)
107
- assert !header.respond_to?(:author_name)
106
+ assert_raise(NoMethodError) {header.builder.title}
107
+ assert_raise(NoMethodError) {header.builder.author_name}
108
108
  assert_equal ['created_on'], header.column_names
109
109
  end
110
110
 
@@ -139,6 +139,26 @@ class HeaderTest < Test::Unit::TestCase
139
139
  end
140
140
  end
141
141
 
142
+ class HeaderWithConflictingColumnNamesTest < Test::Unit::TestCase
143
+ def setup
144
+ @header = PluginAWeek::TableHelper::Header.new([])
145
+ @header.column 'id'
146
+ end
147
+
148
+ def test_should_be_able_to_read_cell
149
+ assert_instance_of PluginAWeek::TableHelper::Cell, @header.builder.id
150
+ end
151
+
152
+ def test_should_be_able_to_write_to_cell
153
+ @header.builder.id '1'
154
+ assert_instance_of PluginAWeek::TableHelper::Cell, @header.builder.id
155
+ end
156
+
157
+ def test_should_be_able_to_clear
158
+ assert_nothing_raised {@header.clear}
159
+ end
160
+ end
161
+
142
162
  class HeaderWithEmptyCollectionTest < Test::Unit::TestCase
143
163
  def setup
144
164
  @header = PluginAWeek::TableHelper::Header.new([])
@@ -0,0 +1,47 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class RowBuilderByDefaultTest < Test::Unit::TestCase
4
+ def setup
5
+ @row = PluginAWeek::TableHelper::Row.new
6
+ @builder = PluginAWeek::TableHelper::RowBuilder.new(@row)
7
+ end
8
+
9
+ def test_should_forward_missing_calls_to_row
10
+ assert_equal '<tr></tr>', @builder.html
11
+ end
12
+ end
13
+
14
+ class RowBuilderWithCellsTest < Test::Unit::TestCase
15
+ def setup
16
+ @row = PluginAWeek::TableHelper::Row.new
17
+ @builder = PluginAWeek::TableHelper::RowBuilder.new(@row)
18
+ @builder.define_cell('first-name')
19
+ end
20
+
21
+ def test_should_create_cell_reader
22
+ assert_nothing_raised {@builder.first_name}
23
+ end
24
+
25
+ def test_should_read_cell_without_arguments
26
+ @row.cells['first-name'] = PluginAWeek::TableHelper::Cell.new('first-name')
27
+ assert_instance_of PluginAWeek::TableHelper::Cell, @builder.first_name
28
+ end
29
+
30
+ def test_should_write_cell_with_arguments
31
+ @builder.first_name 'Your Name'
32
+ assert_equal '<td class="first-name">Your Name</td>', @row.cells['first-name'].html
33
+ end
34
+ end
35
+
36
+ class RowBuilderAfterUndefiningACellTest < Test::Unit::TestCase
37
+ def setup
38
+ @row = PluginAWeek::TableHelper::Row.new
39
+ @builder = PluginAWeek::TableHelper::RowBuilder.new(@row)
40
+ @builder.define_cell('first-name')
41
+ @builder.undef_cell('first-name')
42
+ end
43
+
44
+ def test_should_not_have_cell_reader
45
+ assert_raise(NoMethodError) {@builder.first_name}
46
+ end
47
+ end
data/test/row_test.rb CHANGED
@@ -10,44 +10,52 @@ class RowByDefaultTest < Test::Unit::TestCase
10
10
  end
11
11
 
12
12
  def test_should_not_have_any_cells
13
+ assert @row.cells.empty?
14
+ end
15
+
16
+ def test_should_not_have_any_cell_names
13
17
  assert_equal [], @row.cell_names
14
18
  end
19
+
20
+ def test_should_have_a_builder
21
+ assert_not_nil @row.builder
22
+ end
15
23
  end
16
24
 
17
-
18
25
  class RowTest < Test::Unit::TestCase
19
26
  def setup
20
27
  @row = PluginAWeek::TableHelper::Row.new
21
28
  end
22
29
 
23
- def test_should_create_reader_after_building_cell
30
+ def test_should_create_cell_reader_after_building_cell
24
31
  @row.cell :name
25
- assert @row.respond_to?(:name)
26
- assert_instance_of PluginAWeek::TableHelper::Cell, @row.name
32
+ assert_nothing_raised {@row.builder.name}
33
+ assert_instance_of PluginAWeek::TableHelper::Cell, @row.builder.name
27
34
  end
28
35
 
29
36
  def test_should_use_cell_name_for_class_name
30
37
  @row.cell :name
31
- assert_equal 'name', @row.name[:class]
38
+ assert_equal 'name', @row.cells['name'][:class]
32
39
  end
33
40
 
34
41
  def test_should_sanitize_cell_name_for_reader_method
35
42
  @row.cell 'the-name'
36
43
 
37
- assert @row.respond_to?(:the_name)
38
- assert_instance_of PluginAWeek::TableHelper::Cell, @row.the_name
44
+ @row.builder.the_name
45
+ assert_nothing_raised {@row.builder.the_name}
46
+ assert_instance_of PluginAWeek::TableHelper::Cell, @row.builder.the_name
39
47
  end
40
48
 
41
49
  def test_should_use_unsanitized_cell_name_for_cell_class
42
50
  @row.cell 'the-name'
43
51
  assert_equal ['the-name'], @row.cell_names
44
- assert_equal 'the-name', @row.the_name[:class]
52
+ assert_equal 'the-name', @row.cells['the-name'][:class]
45
53
  end
46
54
 
47
55
  def test_should_allow_html_options_when_building_cell
48
56
  @row.cell :name, 'Name', :class => 'pretty'
49
57
 
50
- assert_equal 'name pretty', @row.name[:class]
58
+ assert_equal 'name pretty', @row.cells['name'][:class]
51
59
  end
52
60
  end
53
61
 
@@ -87,10 +95,10 @@ class RowWithCellsTest < Test::Unit::TestCase
87
95
  end
88
96
 
89
97
  def test_should_create_new_cell_if_cell_already_exists
90
- old_cell = @row.name
98
+ old_cell = @row.cells['name']
91
99
 
92
100
  @row.cell :name
93
- assert_not_same old_cell, @row.name
101
+ assert_not_same old_cell, @row.cells['name']
94
102
  end
95
103
 
96
104
  def test_should_be_able_to_read_cell_after_clearing
@@ -98,7 +106,7 @@ class RowWithCellsTest < Test::Unit::TestCase
98
106
  @row.cell :name
99
107
 
100
108
  assert_equal ['name'], @row.cell_names
101
- assert @row.respond_to?(:name)
109
+ assert_nothing_raised {@row.builder.name}
102
110
  end
103
111
  end
104
112
 
@@ -113,3 +121,23 @@ class RowWithMultipleCellsTest < Test::Unit::TestCase
113
121
  assert_equal '<tr><td class="name">Name</td><td class="location">Location</td></tr>', @row.html
114
122
  end
115
123
  end
124
+
125
+ class RowWithConflictingCellNamesTest < Test::Unit::TestCase
126
+ def setup
127
+ @row = PluginAWeek::TableHelper::Row.new
128
+ @row.cell :id
129
+ end
130
+
131
+ def test_should_be_able_to_read_cell
132
+ assert_instance_of PluginAWeek::TableHelper::Cell, @row.cells['id']
133
+ end
134
+
135
+ def test_should_be_able_to_write_to_cell
136
+ @row.builder.id '1'
137
+ assert_instance_of PluginAWeek::TableHelper::Cell, @row.cells['id']
138
+ end
139
+
140
+ def test_should_be_able_to_clear
141
+ assert_nothing_raised {@row.clear}
142
+ end
143
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: table_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Pfeifer
@@ -9,7 +9,7 @@ autorequire: table_helper
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-01 00:00:00 -04:00
12
+ date: 2008-06-15 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -33,10 +33,12 @@ files:
33
33
  - lib/table_helper/cell.rb
34
34
  - lib/table_helper/body_row.rb
35
35
  - test/header_test.rb
36
+ - test/header_builder_test.rb
36
37
  - test/collection_table_test.rb
37
38
  - test/test_helper.rb
38
39
  - test/row_test.rb
39
40
  - test/footer_test.rb
41
+ - test/row_builder_test.rb
40
42
  - test/body_row_test.rb
41
43
  - test/cell_test.rb
42
44
  - test/html_element_test.rb
@@ -75,9 +77,11 @@ specification_version: 2
75
77
  summary: Adds a helper method for generating HTML tables from collections
76
78
  test_files:
77
79
  - test/header_test.rb
80
+ - test/header_builder_test.rb
78
81
  - test/collection_table_test.rb
79
82
  - test/row_test.rb
80
83
  - test/footer_test.rb
84
+ - test/row_builder_test.rb
81
85
  - test/body_row_test.rb
82
86
  - test/cell_test.rb
83
87
  - test/html_element_test.rb