html_table 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in html_table.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # html_table
2
+
3
+ Table creates horizontal html tables.
4
+ Table is very small and very DRY to use.
5
+ Their is no repetition between header definition and attribute definition.
6
+ Actually their is no thead definition.
7
+
8
+ ## Example
9
+
10
+ ```ruby
11
+ table(products) do |row|
12
+ row.column :name
13
+ row.column :description
14
+ row.column :price
15
+ end
16
+
17
+ this generates (formatted for reading purposes)
18
+
19
+ <table>
20
+ <thead>
21
+ <th>name</th>
22
+ <th>description</th>
23
+ <th>price</th>
24
+ </thead>
25
+
26
+ <tbody>
27
+ <tr>
28
+ <td>Tomato</td>
29
+ <td>Delicious red fruit.</td>
30
+ <td>€14/kg</td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+ ```
35
+
36
+ ## Installation
37
+
38
+ gem install html_table
39
+
40
+ ## Configuration
41
+
42
+ You could also specify a class attribute for the table using
43
+
44
+ table(collection, :class => "some_class")
45
+
46
+
47
+ If you're using it together with Rails you could try
48
+
49
+ table-rails -> still working on it
50
+
51
+ To use different column headers one should overwrite
52
+
53
+ ```ruby
54
+ class HtmlTable::TableBuilder
55
+ def column_translation column
56
+ I18n.t(column)
57
+ end
58
+ end
59
+ ```
60
+
61
+ Copyright (c) 2011 Tom Maeckelberghe, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the table plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "html_table/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "html_table"
7
+ s.version = HtmlTable::VERSION
8
+ s.authors = ["Tom Maeckelberghe"]
9
+ s.email = ["tom.maeckelberghe@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Table is very small and very DRY to use. Their is no repetition between header definition and attribute definition.}
12
+ s.description = %q{Creates horizontal html tables from ruby objects.}
13
+
14
+ s.rubyforge_project = "html_table"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
data/lib/html_table.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "html_table/version"
2
+ module HtmlTable
3
+ require File.join(File.dirname(__FILE__), '/html_table/table_row_builder')
4
+ require File.join(File.dirname(__FILE__), '/html_table/table_builder')
5
+ attr_reader :table_builder
6
+ def table(collection=@collection, *args, &block)
7
+ if collection && collection.any?
8
+ options = args.extract_options!
9
+ set_table_builder(collection, options, &block)
10
+ @table_builder.to_s
11
+ end
12
+ end
13
+
14
+ def set_table_builder(collection, options, &block)
15
+ @table_builder = TableBuilder.new(collection, options, &block)
16
+ end
17
+ end
@@ -0,0 +1,60 @@
1
+ class HtmlTable::TableBuilder
2
+ require File.join(File.dirname(__FILE__),"table_builder/column_headers")
3
+
4
+ attr_accessor :rows
5
+
6
+ def initialize(collection, options={}, &block)
7
+ init_instance_vars(options)
8
+ collection.each do |object|
9
+ @rows << HtmlTable::TableRowBuilder.new(object, &block)
10
+ end
11
+ end
12
+
13
+ def to_s
14
+ "<table#{attributes}>
15
+ #{thead}
16
+ #{tbody}
17
+ #{tfoot}
18
+ </table>"
19
+ end
20
+
21
+ private
22
+
23
+ def init_instance_vars options
24
+ @rows = []
25
+ @class = options[:class]
26
+ @footer = options[:footer]
27
+ end
28
+
29
+ def attributes
30
+ if @class
31
+ " class='#{@class}'"
32
+ end
33
+ end
34
+
35
+ def thead
36
+ "<thead>#{column_headers}</thead>"
37
+ end
38
+
39
+ def tbody
40
+ "<tbody>#{@rows}</tbody>"
41
+ end
42
+
43
+ def tfoot
44
+ if @footer
45
+ "<tfoot>#{column_footers}</tfoot>"
46
+ end
47
+ end
48
+
49
+ def column_footers
50
+ ColumnFooters.new(first_row, @footer).to_s
51
+ end
52
+
53
+ def column_headers
54
+ ColumnHeaders.new(first_row).to_s
55
+ end
56
+
57
+ def first_row
58
+ @rows.first
59
+ end
60
+ end
@@ -0,0 +1,20 @@
1
+ class HtmlTable::TableBuilder::ColumnFooters
2
+ attr_reader :row, :footer
3
+
4
+ def initialize(row, footer)
5
+ @columns = row.columns
6
+ @row = row
7
+ @footer = footer
8
+ end
9
+
10
+ def to_s
11
+ @columns.map do |column|
12
+ "<th>#{footer_or_empty(column)}</th>"
13
+ end
14
+ end
15
+
16
+ def footer_or_empty column
17
+ footer[column] || "&nbsp;"
18
+ end
19
+
20
+ end
@@ -0,0 +1,19 @@
1
+ class HtmlTable::TableBuilder::ColumnHeaders
2
+ attr_reader :row
3
+
4
+ def initialize(row)
5
+ @columns = row.columns
6
+ @row = row
7
+ end
8
+
9
+ def to_s
10
+ @columns.map do |column|
11
+ "<th>#{column_translation(column)}</th>"
12
+ end
13
+ end
14
+
15
+ def column_translation column
16
+ column
17
+ end
18
+
19
+ end
@@ -0,0 +1,25 @@
1
+ class HtmlTable::TableRowBuilder
2
+ attr_accessor :columns, :html_columns
3
+ attr_reader :object
4
+ def initialize(object)
5
+ @object = object
6
+ @columns = []
7
+ @html_columns = []
8
+ yield(self)
9
+ end
10
+
11
+ def to_s
12
+ "<tr>#{html_columns}</tr>"
13
+ end
14
+
15
+ def column column_name, *args
16
+ options = args.extract_options!
17
+ columns << column_name
18
+ html_columns << "<td>#{value(column_name, options)}</td>"
19
+ html_columns.last
20
+ end
21
+
22
+ def value column_name, options
23
+ options[:value] || column_name && object.send(column_name)
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module HtmlTable
2
+ VERSION = "0.0.1"
3
+ end
data/test/row_test.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+ class RowTest < Test::Unit::TestCase
3
+
4
+ OBJECT = stubs_obj(:name => "A object", :description => "A description")
5
+
6
+ ROW = TableRowBuilder.new(OBJECT) do |row|
7
+ row.column :name
8
+ row.column :description
9
+ end
10
+
11
+ def test_columns
12
+ assert_equal ([:name, :description]), ROW.columns
13
+ end
14
+
15
+ def test_to_s
16
+ assert_match "<tr><td>A object</td><td>A description</td></tr>", ROW.to_s
17
+ end
18
+
19
+ def test_object
20
+ assert_equal OBJECT, ROW.object
21
+ end
22
+
23
+ def test_column
24
+ TableRowBuilder.new(OBJECT) do |row|
25
+ assert_equal "<td>A object</td>", row.column(:name)
26
+ assert_equal "<td>alternate value</td>", row.column(:name, :value => "alternate value")
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+ class TableBuilderTest < Test::Unit::TestCase
3
+
4
+ COLLECTION = [
5
+ stubs_obj(:name => "First Object", :description => "Testing table"),
6
+ stubs_obj(:name => "Second Object", :description => "This tests if table can display two rows")
7
+ ]
8
+
9
+ TABLE = TableBuilder.new(COLLECTION) do |row|
10
+ row.column :name
11
+ row.column :description
12
+ end
13
+
14
+ def test_rows
15
+ assert_equal 2, TABLE.rows.size
16
+ end
17
+
18
+ def test_thead
19
+ assert_equal "<thead><th>name</th><th>description</th></thead>", TABLE.send(:thead)
20
+ end
21
+
22
+ def test_tbody
23
+ assert_equal "<tbody><tr><td>First Object</td><td>Testing table</td></tr><tr><td>Second Object</td><td>This tests if table can display two rows</td></tr></tbody>", TABLE.send(:tbody)
24
+ end
25
+
26
+ def test_to_s
27
+ TABLE.stubs(:thead).returns("thead")
28
+ TABLE.stubs(:tbody).returns("tbody")
29
+ TABLE.stubs(:attributes).returns("_with_attr")
30
+ assert_equal "<table_with_attr>theadtbody</table>", TABLE.to_s.gsub(/\n|\s/i, "")
31
+ end
32
+
33
+ def test_attributes
34
+ table = TableBuilder.new(COLLECTION, {:class => "test_class"}) {}
35
+ assert_equal " class='test_class'", table.send(:attributes)
36
+ end
37
+
38
+ def test_empty_collection
39
+ assert_nil table([])
40
+ end
41
+
42
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+ class TableSomethingTest < Test::Unit::TestCase
3
+ include ::TableViewHelper
4
+ def test_table
5
+ TableBuilder.any_instance.stubs(:to_s).returns("table")
6
+ assert_equal "table", table(["something"], :class => "test_extract_options") {}
7
+ assert_equal " class='test_extract_options'", @table_builder.send(:attributes)
8
+ table(["something"]) {}
9
+ assert_nil @table_builder.send(:attributes)
10
+ TableBuilder.any_instance.unstub(:to_s)
11
+ end
12
+ end
@@ -0,0 +1,29 @@
1
+
2
+
3
+ def self.rails_loaded?
4
+ !! defined?(RAILS_ENV)
5
+ end
6
+
7
+ unless rails_loaded?
8
+ require "rubygems"
9
+ require "test/unit"
10
+ require 'mocha'
11
+ require "ostruct"
12
+ require "active_support/core_ext/array/extract_options"
13
+ module TableViewHelper; end
14
+ require File.join(File.dirname(__FILE__), '/../lib/html_table')
15
+ require File.join(File.dirname(__FILE__), '/../lib/html_table/table_row_builder')
16
+ require File.join(File.dirname(__FILE__), '/../lib/html_table/table_builder')
17
+ end
18
+
19
+ class Test::Unit::TestCase
20
+ include HtmlTable
21
+ end
22
+
23
+ def rails_loaded
24
+ self.class.rails_loaded?
25
+ end
26
+
27
+ def stubs_obj(*args)
28
+ ::OpenStruct.new(*args)
29
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: html_table
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Tom Maeckelberghe
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-02-12 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: Creates horizontal html tables from ruby objects.
22
+ email:
23
+ - tom.maeckelberghe@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - README.md
34
+ - Rakefile
35
+ - html_table.gemspec
36
+ - lib/html_table.rb
37
+ - lib/html_table/table_builder.rb
38
+ - lib/html_table/table_builder/column_footers.rb
39
+ - lib/html_table/table_builder/column_headers.rb
40
+ - lib/html_table/table_row_builder.rb
41
+ - lib/html_table/version.rb
42
+ - test/row_test.rb
43
+ - test/table_builder_test.rb
44
+ - test/table_test.rb
45
+ - test/test_helper.rb
46
+ homepage: ""
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project: html_table
75
+ rubygems_version: 1.8.10
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Table is very small and very DRY to use. Their is no repetition between header definition and attribute definition.
79
+ test_files: []
80
+