tabula_rasa 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 77d9e0c24755a3555875efcb476b45574faff791
4
- data.tar.gz: ab243bfe91d4bd59df5fc0e9ab9245b59f3d6b93
3
+ metadata.gz: 85b6138d31f80d0ef643af81a02b77bcea0fc4b2
4
+ data.tar.gz: 787437faf4bd0631fd23cc2ec3e64e8e48c2079a
5
5
  SHA512:
6
- metadata.gz: e27ca7c5d3570874a0c6ccf8262941d43814f3bca5e7bba1823f0551d8e129b9d424af58c58fcaa8df71ec5e45a48198ff76bf8099a315d7314c2bbbf473cee7
7
- data.tar.gz: 68a9fa9df16526c3b8d3440721815163c2a6ac95acbbb6421b9ed848396ccd0f9690ffd67670011957d3853212bacff644cf380d36c4d5dc2fca93a163e71dd5
6
+ metadata.gz: 0647a914557c4b474c43013f1693e3454826feed995410445d39165f3dc270f07aba2805b9addf321aacfe634f57bc4a81dce0ac421d38348b6352ed12940c20
7
+ data.tar.gz: 86b608afad417372b5eb3610823e6625e7cc8c6c42ae2a087e02ce6caa1ac72df3c4bd88397f4baf3b56c7130cc2251390337bf26f0461e2b8815aac9bc84bc3
@@ -1,10 +1,11 @@
1
+ require 'tabula_rasa/row'
1
2
  require 'tabula_rasa/column'
2
3
 
3
4
  module TabulaRasa
4
5
  class Base
5
- attr_reader :collection, :view, :klass, :columns, :options
6
+ attr_reader :collection, :options
6
7
 
7
- delegate :capture, :content_tag, :safe_join, :truncate, to: :view
8
+ delegate :content_tag, :cycle, :dom_id, :dom_class, :safe_join, to: :view
8
9
 
9
10
  def initialize(collection, view, options = {}, &block)
10
11
  raise ArgumentError, 'TabulaRasa only works on ActiveRecord Relation instances' unless collection.is_a?(ActiveRecord::Relation)
@@ -14,6 +15,7 @@ module TabulaRasa
14
15
  @klass = collection.klass
15
16
  @columns = []
16
17
  yield self if block_given?
18
+ ensure_row
17
19
  end
18
20
 
19
21
  def render
@@ -25,8 +27,15 @@ module TabulaRasa
25
27
  @columns << Column.new(self, *args, &block)
26
28
  end
27
29
 
30
+ def row(options = {}, &block)
31
+ raise ArgumentError, 'Row definition cannot be called more than once' if @row.present?
32
+ @row = Row.new(self, options, &block)
33
+ end
34
+
28
35
  private
29
36
 
37
+ attr_reader :view, :klass, :columns
38
+
30
39
  def content
31
40
  safe_join [thead, tbody]
32
41
  end
@@ -47,7 +56,7 @@ module TabulaRasa
47
56
 
48
57
  def collection_body
49
58
  rows = collection.map do |member|
50
- content_tag :tr do
59
+ content_tag :tr, @row.options_for(member) do
51
60
  cells = columns.map do |column|
52
61
  column.body_content_for member
53
62
  end
@@ -57,8 +66,20 @@ module TabulaRasa
57
66
  safe_join rows
58
67
  end
59
68
 
69
+ def empty_body
70
+ content_tag :tr, class: 'empty' do
71
+ content_tag :td, colspan: columns.size do
72
+ "No #{klass.table_name.downcase} present"
73
+ end
74
+ end
75
+ end
76
+
60
77
  def table_options
61
78
  options.except :head, :body
62
79
  end
80
+
81
+ def ensure_row
82
+ @row ||= Row.new(self)
83
+ end
63
84
  end
64
85
  end
@@ -1,6 +1,6 @@
1
1
  module TabulaRasa
2
2
  class Column
3
- delegate :capture, :content_tag, :truncate, to: :base
3
+ delegate :content_tag, to: :base
4
4
 
5
5
  def initialize(base, *args, &block)
6
6
  @base = base
@@ -23,7 +23,7 @@ module TabulaRasa
23
23
  content_tag :td, body_value_for(instance), options[:body]
24
24
  end
25
25
 
26
- def body(&block)
26
+ def value(&block)
27
27
  @body_value_option = block if block_given?
28
28
  end
29
29
 
@@ -61,9 +61,9 @@ module TabulaRasa
61
61
  def body_value_for(instance)
62
62
  value = body_value_option || instance.send(attribute)
63
63
  if value.respond_to?(:call)
64
- value.call(instance)
64
+ value.call instance
65
65
  else
66
- truncate value.to_s
66
+ value.to_s
67
67
  end
68
68
  end
69
69
  end
@@ -0,0 +1,78 @@
1
+ module TabulaRasa
2
+ class Row
3
+ # NOTE: Need to handle ALL valid HTML5 attributes
4
+ ATTRIBUTES = [:id, :class]
5
+
6
+ delegate :cycle, :dom_id, :dom_class, to: :base
7
+
8
+ def initialize(base, options = {}, &block)
9
+ @base = base
10
+ @options = options
11
+ yield self if block_given?
12
+ end
13
+
14
+ def options_for(instance)
15
+ {
16
+ id: [id_value_for(instance), dom_id_for(instance)].compact.join(' ').squish,
17
+ class: [class_value_for(instance), zebrastripe, dom_class_for(instance)].compact.join(' ').squish
18
+ }.merge data_values_for(instance)
19
+ end
20
+
21
+ def data(key, &block)
22
+ options[:data] ||= {}
23
+ options[:data][key] = block
24
+ end
25
+
26
+ ATTRIBUTES.each do |attribute|
27
+ define_method attribute do |&block|
28
+ options[attribute] = block
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :base, :options
35
+
36
+ def zebrastripe
37
+ case base.options[:zebra]
38
+ when false
39
+ # Nothing
40
+ when nil
41
+ cycle *%w{even odd}
42
+ when Array
43
+ cycle *base.options[:zebra]
44
+ else
45
+ raise ArgumentError, "Invalid value for options[:zebra]: #{base.options[:zebra]}. Should be array."
46
+ end
47
+ end
48
+
49
+ def dom_id_for(instance)
50
+ return unless base.options[:dom_id] == true
51
+ dom_id(instance) unless id_value_for(instance).present?
52
+ end
53
+
54
+ def dom_class_for(instance)
55
+ dom_class(instance) if base.options[:dom_class] == true
56
+ end
57
+
58
+ def data_values_for(instance)
59
+ return {} if options[:data].blank?
60
+ options[:data].inject({}) do |m, x|
61
+ key, value = x
62
+ m["data-#{key}"] = value.call(instance)
63
+ m
64
+ end
65
+ end
66
+
67
+ ATTRIBUTES.each do |attribute|
68
+ define_method "#{attribute}_value_for" do |instance|
69
+ value = options[attribute]
70
+ if value.respond_to?(:call)
71
+ value.call instance
72
+ else
73
+ value.to_s
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,3 +1,3 @@
1
1
  module TabulaRasa
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/spec/config/spec.rb CHANGED
@@ -3,6 +3,7 @@ class TabulaRasa::Spec < MiniTest::Spec
3
3
  include ActionView::Helpers::TagHelper
4
4
  include ActionView::Helpers::TextHelper
5
5
  include ActionView::Helpers::OutputSafetyHelper
6
+ include ActionView::RecordIdentifier
6
7
  include TabulaRasa::Helpers
7
8
 
8
9
  attr_accessor :output_buffer
@@ -35,8 +35,156 @@ describe TabulaRasa::Helpers, 'Head Specs' do
35
35
  end
36
36
  end
37
37
 
38
- # NOTE: For now, I don't see the point of adding attributes on TR element.
39
- # I've had varying success styling on that and tend to style on the TH elements instead.
38
+ describe 'TR attributes' do
39
+ it 'zebrastripes by default' do
40
+ captured = capture do
41
+ tabula_rasa @survivors do |t|
42
+ t.column :first_name
43
+ end
44
+ end
45
+ rows = extract_all('table tbody tr', captured)
46
+
47
+ rows[0].attribute('class').value.must_equal 'even'
48
+ rows[1].attribute('class').value.must_equal 'odd'
49
+ rows[2].attribute('class').value.must_equal 'even'
50
+ end
51
+
52
+ it 'can disable zebrastripes' do
53
+ captured = capture do
54
+ tabula_rasa @survivors, zebra: false do |t|
55
+ t.column :first_name
56
+ end
57
+ end
58
+ rows = extract_all('table tbody tr', captured)
59
+
60
+ rows.each do |row|
61
+ row.attribute('class').value.must_be_empty
62
+ end
63
+ end
64
+
65
+ it 'can customize zebrastripes' do
66
+ captured = capture do
67
+ tabula_rasa @survivors, zebra: %w{foo bar} do |t|
68
+ t.column :first_name
69
+ end
70
+ end
71
+ rows = extract_all('table tbody tr', captured)
72
+
73
+ rows[0].attribute('class').value.must_match /foo/
74
+ rows[1].attribute('class').value.must_match /bar/
75
+ rows[2].attribute('class').value.must_match /foo/
76
+ end
77
+
78
+ it 'raises ArgumentError when invalid zebra option given' do
79
+ proc {
80
+ tabula_rasa @survivors, zebra: 'string' do |t|
81
+ t.column :first_name
82
+ end
83
+ }.must_raise ArgumentError
84
+ end
85
+
86
+ it 'can set dom_id via option on the main method' do
87
+ captured = capture do
88
+ tabula_rasa @survivors, dom_id: true do |t|
89
+ t.column :first_name
90
+ end
91
+ end
92
+ rows = extract_all('table tbody tr', captured)
93
+
94
+ rows.each_with_index do |row, n|
95
+ row.attribute('id').value.must_equal "survivor_#{@survivors[n].id}"
96
+ end
97
+ end
98
+
99
+ it 'overrides dom_id option when id is explicitly set on row' do
100
+ captured = capture do
101
+ tabula_rasa @survivors, dom_id: true do |t|
102
+ t.column :first_name
103
+ t.row do |r|
104
+ r.id do |instance|
105
+ "manual_#{instance.id}"
106
+ end
107
+ end
108
+ end
109
+ end
110
+ rows = extract_all('table tbody tr', captured)
111
+
112
+ rows.each_with_index do |row, n|
113
+ row.attribute('id').value.must_equal "manual_#{@survivors[n].id}"
114
+ end
115
+ end
116
+
117
+ it 'can set dom_class via option on the main method' do
118
+ captured = capture do
119
+ tabula_rasa @survivors, dom_class: true do |t|
120
+ t.column :first_name
121
+ end
122
+ end
123
+ rows = extract_all('table tbody tr', captured)
124
+
125
+ rows.each_with_index do |row, n|
126
+ row.attribute('class').value.must_match dom_class(@survivors[n])
127
+ end
128
+ end
129
+
130
+ it 'can set attributes via options on internal row method' do
131
+ captured = capture do
132
+ tabula_rasa @survivors do |t|
133
+ t.column :first_name
134
+ t.row class: 'useless_row_class_for_testing'
135
+ end
136
+ end
137
+ rows = extract_all('table tbody tr', captured)
138
+ rows.each do |row|
139
+ row.attribute('class').value.must_match /useless_row_class_for_testing/
140
+ end
141
+
142
+ # Zebrastripes should still work as well
143
+ rows[0].attribute('class').value.must_match /even/
144
+ rows[1].attribute('class').value.must_match /odd/
145
+ rows[2].attribute('class').value.must_match /even/
146
+ end
147
+
148
+ it 'can set attributes via block on internal row method' do
149
+ captured = capture do
150
+ tabula_rasa @survivors do |t|
151
+ t.column :first_name
152
+ t.row do |r|
153
+ r.id do |instance|
154
+ "survivor_id_#{instance.id}"
155
+ end
156
+ r.class do |instance|
157
+ "survivor_class_#{instance.id}"
158
+ end
159
+ r.data :foo do |instance|
160
+ "foo_#{instance.id}"
161
+ end
162
+ end
163
+ end
164
+ end
165
+ rows = extract_all('table tbody tr', captured)
166
+
167
+ rows.each_with_index do |row, n|
168
+ row.attribute('id').value.must_match "survivor_id_#{@survivors[n].id}"
169
+ row.attribute('class').value.must_match "survivor_class_#{@survivors[n].id}"
170
+ row.attribute('data-foo').value.must_match "foo_#{@survivors[n].id}"
171
+ end
172
+
173
+ # Zebrastripes should still work as well
174
+ rows[0].attribute('class').value.must_match /even/
175
+ rows[1].attribute('class').value.must_match /odd/
176
+ rows[2].attribute('class').value.must_match /even/
177
+ end
178
+
179
+ it 'raises ArgumentError if row is defined more than once' do
180
+ proc {
181
+ tabula_rasa @survivors do |t|
182
+ t.row class: 'foo'
183
+ t.row class: 'bar'
184
+ end
185
+ }.must_raise(ArgumentError)
186
+ end
187
+ end
40
188
 
41
189
  describe 'TD attributes' do
42
190
  it 'sets no attributes by default' do
@@ -124,11 +272,11 @@ describe TabulaRasa::Helpers, 'Head Specs' do
124
272
  body.attributes.must_be_empty
125
273
  end
126
274
 
127
- it 'can override first argument via a Proc argument for internal column method' do
275
+ it 'can override first argument via a block for internal column method' do
128
276
  captured = capture do
129
277
  tabula_rasa @survivors do |t|
130
278
  t.column :whole_name do |c|
131
- c.body do |instance|
279
+ c.value do |instance|
132
280
  "#{instance.first_name} #{instance.last_name}"
133
281
  end
134
282
  end
@@ -142,11 +290,11 @@ describe TabulaRasa::Helpers, 'Head Specs' do
142
290
  end
143
291
  end
144
292
 
145
- it 'can override first argument via a Proc argument for internal column method while setting attributes via options[:body]' do
293
+ it 'can override first argument via a block for internal column method while setting attributes via options[:body]' do
146
294
  captured = capture do
147
295
  tabula_rasa @survivors do |t|
148
296
  t.column :whole_name, body: {id: 'id_value', class: 'class_value', arbitrary: 'arbitrary_value', value: 'Overridden Value'} do |c|
149
- c.body do |instance|
297
+ c.value do |instance|
150
298
  "#{instance.first_name} #{instance.last_name}"
151
299
  end
152
300
  end
@@ -169,5 +317,23 @@ describe TabulaRasa::Helpers, 'Head Specs' do
169
317
  table.attributes.must_be_empty
170
318
  body.attributes.must_be_empty
171
319
  end
320
+
321
+ it 'indicates the table is empty when collection is empty' do
322
+ @survivors = Survivor.none
323
+ captured = capture do
324
+ tabula_rasa @survivors do |t|
325
+ t.column :first_name
326
+ end
327
+ end
328
+ table = extract_first('table', captured)
329
+ body = extract_first('table tbody', captured)
330
+ cells = extract_all('table tbody td', captured)
331
+
332
+ cells.size.must_equal 1
333
+ cell = cells.first
334
+ cell.children.size.must_equal 1
335
+ cell.children.first.must_be :text?
336
+ cell.text.must_equal 'No survivors present'
337
+ end
172
338
  end
173
339
  end
@@ -35,8 +35,9 @@ describe TabulaRasa::Helpers, 'Head Specs' do
35
35
  end
36
36
  end
37
37
 
38
- # NOTE: For now, I don't see the point of adding attributes on TR element.
38
+ # NOTE: For now, I don't see the point of adding attributes on TR element on THEAD.
39
39
  # I've had varying success styling on that and tend to style on the TH elements instead.
40
+ # Also, unlike TBODY, there's only one row so... it's THEAD TR. Done!
40
41
 
41
42
  describe 'TH attributes' do
42
43
  it 'sets no attributes by default' do
@@ -115,7 +116,7 @@ describe TabulaRasa::Helpers, 'Head Specs' do
115
116
  head.attributes.must_be_empty
116
117
  end
117
118
 
118
- it 'raises ArgumentError if attempting to override content via a proc [as body can]' do
119
+ it 'raises ArgumentError if attempting to override content via a block [as body can]' do
119
120
  proc {
120
121
  tabula_rasa @survivors do |t|
121
122
  t.column :first_name do |c|
@@ -26,11 +26,11 @@ describe TabulaRasa::Helpers, 'Integrated [Head and Body] Specs' do
26
26
  end
27
27
  end
28
28
 
29
- it 'can override body values via proc while using attribute argument for head value' do
29
+ it 'can override body values via a block while using attribute argument for head value' do
30
30
  captured = capture do
31
31
  tabula_rasa @survivors do |t|
32
32
  t.column :whole_name do |c|
33
- c.body do |instance|
33
+ c.value do |instance|
34
34
  "#{instance.first_name} #{instance.last_name}"
35
35
  end
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tabula_rasa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - RSL
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-30 00:00:00.000000000 Z
11
+ date: 2013-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -125,6 +125,7 @@ files:
125
125
  - lib/tabula_rasa/base.rb
126
126
  - lib/tabula_rasa/column.rb
127
127
  - lib/tabula_rasa/helpers.rb
128
+ - lib/tabula_rasa/row.rb
128
129
  - lib/tabula_rasa/version.rb
129
130
  - spec/config/active_record.rb
130
131
  - spec/config/spec.rb