table_cloth 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Table Cloth
2
2
 
3
3
  Table Cloth gives you an easy to use DSL for creating and rendering tables in rails.
4
+ It's new, so if you want a feature or have an improvement? Make an issue!
5
+
6
+ Follow me! [@robertoross](http://twitter.com/robertoross)
4
7
 
5
8
  [![Build Status](https://travis-ci.org/bobbytables/table_cloth.png)](https://travis-ci.org/bobbytables/table_cloth)
6
9
 
@@ -142,4 +145,4 @@ config.td.valign = 'top'
142
145
  3. CREATE A SPEC.
143
146
  4. Commit your changes (`git commit -am 'Add some feature'`)
144
147
  5. Push to the branch (`git push origin my-new-feature`)
145
- 6. Create new Pull Request
148
+ 6. Create new Pull Request
@@ -8,17 +8,14 @@ module TableCloth
8
8
  end
9
9
 
10
10
  def column_names
11
- columns.inject([]) do |names, (column_name, column)|
12
- names << column.human_name; names
11
+ @column_names ||= columns.each_with_object([]) do |(column_name, column), names|
12
+ names << column.human_name
13
13
  end
14
14
  end
15
15
 
16
16
  def columns
17
- self.class.columns.inject({}) do |columns, (column_name, column)|
18
- if column.available?(self)
19
- columns[column_name] = column
20
- end
21
- columns
17
+ @columns ||=self.class.columns.each_with_object({}) do |(column_name, column), columns|
18
+ columns[column_name] = column if column.available?(self)
22
19
  end
23
20
  end
24
21
 
@@ -27,6 +24,10 @@ module TableCloth
27
24
  end
28
25
 
29
26
  class << self
27
+ def config
28
+ @config ||= Class.new { include ConfigurableElements }
29
+ end
30
+
30
31
  def presenter(klass=nil)
31
32
  if klass
32
33
  @presenter = klass
@@ -9,7 +9,7 @@ module TableCloth
9
9
 
10
10
  def value(object, view, table=nil)
11
11
  if options[:proc] && options[:proc].respond_to?(:call)
12
- view.capture(object, options, view, &options[:proc])
12
+ view.capture(object, view, &options[:proc])
13
13
  else
14
14
  object.send(name)
15
15
  end
@@ -0,0 +1,21 @@
1
+ module TableCloth
2
+ module ConfigurableElements
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ cattr_accessor :table
7
+ cattr_accessor :thead
8
+ cattr_accessor :th
9
+ cattr_accessor :tbody
10
+ cattr_accessor :tr
11
+ cattr_accessor :td
12
+
13
+ self.table = ActiveSupport::OrderedOptions.new
14
+ self.thead = ActiveSupport::OrderedOptions.new
15
+ self.th = ActiveSupport::OrderedOptions.new
16
+ self.tbody = ActiveSupport::OrderedOptions.new
17
+ self.tr = ActiveSupport::OrderedOptions.new
18
+ self.td = ActiveSupport::OrderedOptions.new
19
+ end
20
+ end
21
+ end
@@ -1,18 +1,6 @@
1
1
  module TableCloth
2
2
  class Configuration
3
- cattr_accessor :table
4
- cattr_accessor :thead
5
- cattr_accessor :th
6
- cattr_accessor :tbody
7
- cattr_accessor :tr
8
- cattr_accessor :td
9
-
10
- self.table = ActiveSupport::OrderedOptions.new
11
- self.thead = ActiveSupport::OrderedOptions.new
12
- self.th = ActiveSupport::OrderedOptions.new
13
- self.tbody = ActiveSupport::OrderedOptions.new
14
- self.tr = ActiveSupport::OrderedOptions.new
15
- self.td = ActiveSupport::OrderedOptions.new
3
+ include ConfigurableElements
16
4
 
17
5
  class << self
18
6
  def configure(&block)
@@ -32,22 +32,27 @@ module TableCloth
32
32
  end
33
33
 
34
34
  def row_values(object)
35
- column_values = table.columns.inject([]) do |values, (key, column)|
36
- values << column.value(object, view_context, table); values
35
+ table.columns.each_with_object([]) do |(key, column), values|
36
+ values << column.value(object, view_context, table)
37
37
  end
38
38
  end
39
39
 
40
40
  def rows
41
- objects.inject([]) do |row, object|
42
- row << row_values(object); row
41
+ objects.each_with_object([]) do |object, row|
42
+ row << row_values(object)
43
43
  end
44
44
  end
45
45
 
46
- def wrapper_tag(type, value=nil, &block)
46
+ def wrapper_tag(type, value=nil, options={}, &block)
47
+ table_config = table.class.config.send(type).to_hash
48
+ tag_options = TableCloth.config_for(type)
49
+ tag_options.merge!(table_config)
50
+ tag_options.merge!(options)
51
+
47
52
  content = if block_given?
48
- v.content_tag(type, TableCloth.config_for(type), &block)
53
+ v.content_tag(type, tag_options, &block)
49
54
  else
50
- v.content_tag(type, value, TableCloth.config_for(type))
55
+ v.content_tag(type, value, tag_options)
51
56
  end
52
57
  end
53
58
  end
@@ -9,32 +9,25 @@ module TableCloth
9
9
 
10
10
  def render_rows
11
11
  wrapper_tag :tbody do
12
- body = rows.inject('') do |r, values|
13
- r + render_row(values)
14
- end
15
-
16
- v.raw(body)
12
+ v.raw objects.inject('') {|r, object| r + render_row(object) }
17
13
  end
18
14
  end
19
15
 
20
- def render_row(values)
16
+ def render_row(object)
21
17
  wrapper_tag :tr do
22
- row = values.inject('') do |tds, value|
23
- tds + wrapper_tag(:td, value)
24
- end
25
-
26
- v.raw(row)
18
+ v.raw table.columns.inject('') {|tds, (key, column)| tds + render_td(column, object) }
27
19
  end
28
20
  end
29
21
 
22
+ def render_td(column, object)
23
+ td_options = column.options.delete(:td_options) || {}
24
+ wrapper_tag(:td, column.value(object, view_context, table), td_options)
25
+ end
26
+
30
27
  def render_header
31
28
  wrapper_tag :thead do
32
- wrapper_tag(:tr) do
33
- names = column_names.inject('') do |tags, name|
34
- tags + wrapper_tag(:th, name)
35
- end
36
-
37
- v.raw(names)
29
+ wrapper_tag :tr do
30
+ v.raw column_names.inject('') {|tags, name| tags + wrapper_tag(:th, name) }
38
31
  end
39
32
  end
40
33
  end
@@ -1,3 +1,3 @@
1
1
  module TableCloth
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/table_cloth.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'action_view'
2
2
  require 'table_cloth/version'
3
+ require 'table_cloth/configurable_elements'
3
4
  require 'table_cloth/base'
4
5
 
5
6
  module TableCloth
@@ -17,7 +17,7 @@ describe TableCloth::Column do
17
17
  end
18
18
 
19
19
  let(:email_column) do
20
- proc = lambda {|object, options, view|
20
+ proc = lambda {|object, view|
21
21
  object.email
22
22
  }
23
23
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe TableCloth::Presenters::Default do
4
- let(:dummy_table) { DummyTable }
4
+ let(:dummy_table) { Class.new(DummyTable) }
5
5
  let(:dummy_model) do
6
6
  DummyModel.new.tap do |d|
7
7
  d.id = 1
@@ -113,5 +113,59 @@ describe TableCloth::Presenters::Default do
113
113
  it 'td has a class attached' do
114
114
  doc.at_xpath('//td')[:class].should include 'td'
115
115
  end
116
+
117
+ end
118
+
119
+ context 'specific configuration' do
120
+ let(:doc) { Nokogiri::HTML(subject.render_table) }
121
+ let(:dummy_table) do
122
+ Class.new(TableCloth::Base) do
123
+ column :email, td_options: { class: 'email_column' }
124
+ end
125
+ end
126
+
127
+ it 'td has a class set' do
128
+ doc.at_xpath('//td')[:class].should include 'email_column'
129
+ end
130
+ end
131
+
132
+ context 'table configuration' do
133
+ let(:doc) { Nokogiri::HTML(subject.render_table) }
134
+ let(:dummy_table) do
135
+ Class.new(TableCloth::Base) do
136
+ column :email
137
+
138
+ config.table.class = 'table2'
139
+ config.thead.class = 'thead2'
140
+ config.th.class = 'th2'
141
+ config.tbody.class = 'tbody2'
142
+ config.tr.class = 'tr2'
143
+ config.td.class = 'td2'
144
+ end
145
+ end
146
+
147
+ it 'tables have a class attached' do
148
+ doc.at_xpath('//table')[:class].should include 'table2'
149
+ end
150
+
151
+ it 'thead has a class attached' do
152
+ doc.at_xpath('//thead')[:class].should include 'thead2'
153
+ end
154
+
155
+ it 'th has a class attached' do
156
+ doc.at_xpath('//th')[:class].should include 'th2'
157
+ end
158
+
159
+ it 'tbody has a class attached' do
160
+ doc.at_xpath('//tbody')[:class].should include 'tbody2'
161
+ end
162
+
163
+ it 'tr has a class attached' do
164
+ doc.at_xpath('//tr')[:class].should include 'tr2'
165
+ end
166
+
167
+ it 'td has a class attached' do
168
+ doc.at_xpath('//td')[:class].should include 'td2'
169
+ end
116
170
  end
117
171
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: table_cloth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-04 00:00:00.000000000 Z
12
+ date: 2012-10-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -147,6 +147,7 @@ files:
147
147
  - lib/table_cloth/builder.rb
148
148
  - lib/table_cloth/column.rb
149
149
  - lib/table_cloth/columns/action.rb
150
+ - lib/table_cloth/configurable_elements.rb
150
151
  - lib/table_cloth/configuration.rb
151
152
  - lib/table_cloth/presenter.rb
152
153
  - lib/table_cloth/presenters/default.rb