thamble 1.1.0 → 1.2.0
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 +4 -4
- data/CHANGELOG +8 -0
- data/README.rdoc +77 -48
- data/lib/thamble/rails.rb +2 -2
- data/lib/thamble.rb +16 -8
- metadata +15 -13
- data/Rakefile +0 -46
- data/spec/thamble_spec.rb +0 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 292f4d36d629c5774c43a3df0b0ef11364aea32d3accf6d31c83cb31756600a4
|
4
|
+
data.tar.gz: 535958ace8a281764f54030d367579d5b551e7d7e915a04e60f3dc51481857ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fe7aa6a608b50a2cdef03610b5a061a58901b2cd8795b28e99803c7a7a2bc86b2d60a5817052e79499658615ca973b44200561c90fe733ebd7c63e594709aea
|
7
|
+
data.tar.gz: 72414ab56d9483e93c53b3861eccbeef44a6f5b7e5b97905f4a1c4b4a43fc9d634026486b44bd95f01144fdb4663c562370995b484b4dc1a85d65687e1004cb1
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 1.2.0 (2022-07-07)
|
2
|
+
|
3
|
+
* Make thamble/rails work with modern versions of Rails (jeremyevans)
|
4
|
+
|
5
|
+
* Make fallback HTML escaping code use cgi instead of rack (jeremyevans)
|
6
|
+
|
7
|
+
* Add Thamble.raw for simpler creation of raw strings (jeremyevans)
|
8
|
+
|
1
9
|
=== 1.1.0 (2019-11-20)
|
2
10
|
|
3
11
|
* Support :column_th option for using th instead of td for first cell in each row (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -1,72 +1,77 @@
|
|
1
1
|
= Thamble
|
2
2
|
|
3
|
-
Thamble
|
4
|
-
tables from enumerable objects.
|
3
|
+
Thamble creates HTML tables from enumerable objects.
|
5
4
|
|
6
|
-
|
5
|
+
== Installation
|
7
6
|
|
8
7
|
gem install thamble
|
9
8
|
|
10
|
-
|
9
|
+
== Source Code
|
11
10
|
|
12
11
|
Source code is available on GitHub at https://github.com/jeremyevans/thamble
|
13
12
|
|
14
|
-
|
13
|
+
== Examples
|
15
14
|
|
16
|
-
The
|
17
|
-
arrays), and returns a string containing the HTML
|
15
|
+
The Thamble.table method expects an enumerable of arrays (such as an array of
|
16
|
+
arrays), and returns a string containing the HTML table output:
|
18
17
|
|
19
18
|
puts Thamble.table([[1, 2]])
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
output:
|
21
|
+
|
22
|
+
<table>
|
23
|
+
<tbody>
|
24
|
+
<tr>
|
25
|
+
<td>1</td>
|
26
|
+
<td>2</td>
|
27
|
+
</tr>
|
28
|
+
</tbody>
|
29
|
+
</table>
|
29
30
|
|
30
31
|
If a block is passed to the method, all items in the enumerable are yielded to
|
31
32
|
the block, and the block should return an array with the data to use in the table:
|
32
33
|
|
33
34
|
puts Thamble.table([{:a=>1, :b=>2}, {:a=>3, :b=>4}]){|l| [l[:b], l[:a] + 10]}
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
36
|
+
output:
|
37
|
+
|
38
|
+
<table>
|
39
|
+
<tbody>
|
40
|
+
<tr>
|
41
|
+
<td>2</td>
|
42
|
+
<td>11</td>
|
43
|
+
</tr>
|
44
|
+
<tr>
|
45
|
+
<td>4</td>
|
46
|
+
<td>13</td>
|
47
|
+
</tr>
|
48
|
+
</tbody>
|
49
|
+
</table>
|
47
50
|
|
48
51
|
You can use the :headers option to set custom headers:
|
49
52
|
|
50
53
|
puts Thamble.table([[1, 2], [3, 4]], :headers=>['A', 'B'])
|
51
54
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
55
|
+
output:
|
56
|
+
|
57
|
+
<table>
|
58
|
+
<thead>
|
59
|
+
<tr>
|
60
|
+
<th>A</th>
|
61
|
+
<th>B</th>
|
62
|
+
</tr>
|
63
|
+
</thead>
|
64
|
+
<tbody>
|
65
|
+
<tr>
|
66
|
+
<td>1</td>
|
67
|
+
<td>2</td>
|
68
|
+
</tr>
|
69
|
+
<tr>
|
70
|
+
<td>3</td>
|
71
|
+
<td>4</td>
|
72
|
+
</tr>
|
73
|
+
</tbody>
|
74
|
+
</table>
|
70
75
|
|
71
76
|
Other options supported are:
|
72
77
|
|
@@ -81,7 +86,31 @@ Other options supported are:
|
|
81
86
|
the row that returns a hash
|
82
87
|
:widths :: Array of widths for each column
|
83
88
|
|
84
|
-
|
89
|
+
== Escaping
|
90
|
+
|
91
|
+
By default, Thamble escapes all output. You can use the Thamble.raw method
|
92
|
+
to return a string marked as already being escaped.
|
93
|
+
|
94
|
+
puts Thamble.table([['&1234;', Thamble.raw('&1234;')]])
|
95
|
+
|
96
|
+
output:
|
97
|
+
|
98
|
+
<table>
|
99
|
+
<tbody>
|
100
|
+
<tr>
|
101
|
+
<td>&1234;</td>
|
102
|
+
<td>&1234;</td>
|
103
|
+
</tr>
|
104
|
+
</tbody>
|
105
|
+
</table>
|
106
|
+
|
107
|
+
The raw method is also exposed on the second object yielded to Thamble.table:
|
108
|
+
|
109
|
+
puts Thamble.table([['1', '&1234;']]) do |row, table|
|
110
|
+
row.map{|value| table.raw(value )}
|
111
|
+
end
|
112
|
+
|
113
|
+
== Rails Support
|
85
114
|
|
86
115
|
Thamble comes with basic rails support via:
|
87
116
|
|
@@ -92,10 +121,10 @@ This allows you to use the following style in your templates:
|
|
92
121
|
|
93
122
|
<%= thamble([[1, 2], [3, 4]], :headers=>['A', 'B']) %>
|
94
123
|
|
95
|
-
|
124
|
+
== License
|
96
125
|
|
97
126
|
MIT
|
98
127
|
|
99
|
-
|
128
|
+
== Author
|
100
129
|
|
101
130
|
Jeremy Evans <code@jeremyevans.net>
|
data/lib/thamble/rails.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../thamble'
|
4
4
|
require 'active_support/core_ext/string/output_safety'
|
5
5
|
ActiveSupport::SafeBuffer.send(:include, Thamble::Raw)
|
6
6
|
|
7
7
|
module Thamble
|
8
8
|
module RailsHelper
|
9
9
|
def thamble(*a, &block)
|
10
|
-
|
10
|
+
Thamble.table(*a, &block).html_safe
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
data/lib/thamble.rb
CHANGED
@@ -36,6 +36,12 @@ module Thamble
|
|
36
36
|
end
|
37
37
|
module_function :table
|
38
38
|
|
39
|
+
# Return a raw string, which will not be HTML escaped in Thamble's output.
|
40
|
+
def raw(s)
|
41
|
+
RawString.new(s)
|
42
|
+
end
|
43
|
+
module_function :raw
|
44
|
+
|
39
45
|
# The Table class stores the rows and attributes to use for the HTML tags,
|
40
46
|
# and contains helper methods for common formatting.
|
41
47
|
class Table
|
@@ -197,18 +203,20 @@ module Thamble
|
|
197
203
|
|
198
204
|
begin
|
199
205
|
require 'cgi/escape'
|
206
|
+
rescue LoadError
|
207
|
+
# :nocov:
|
208
|
+
# Handle old Ruby versions not supporting cgi/escape
|
209
|
+
require 'cgi'
|
210
|
+
else
|
200
211
|
unless CGI.respond_to?(:escapeHTML) # work around for JRuby 9.1
|
201
212
|
CGI = Object.new
|
202
213
|
CGI.extend(defined?(::CGI::Escape) ? ::CGI::Escape : ::CGI::Util)
|
203
214
|
end
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
def escape_html(value)
|
210
|
-
Rack::Utils.escape_html(value.to_s)
|
211
|
-
end
|
215
|
+
# :nocov:
|
216
|
+
end
|
217
|
+
|
218
|
+
def escape_html(value)
|
219
|
+
CGI.escapeHTML(value.to_s)
|
212
220
|
end
|
213
221
|
|
214
222
|
# A HTML-escaped version of the given argument.
|
metadata
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thamble
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
-
type: :
|
20
|
+
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: minitest
|
28
|
+
name: minitest-global_expectations
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '4'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '4'
|
55
55
|
description: |
|
56
56
|
Thamble exposes a single method, table, for easily creating HTML
|
57
57
|
tables from enumerable objects.
|
@@ -66,14 +66,16 @@ files:
|
|
66
66
|
- CHANGELOG
|
67
67
|
- MIT-LICENSE
|
68
68
|
- README.rdoc
|
69
|
-
- Rakefile
|
70
69
|
- lib/thamble.rb
|
71
70
|
- lib/thamble/rails.rb
|
72
|
-
- spec/thamble_spec.rb
|
73
71
|
homepage: http://github.com/jeremyevans/thamble
|
74
72
|
licenses:
|
75
73
|
- MIT
|
76
|
-
metadata:
|
74
|
+
metadata:
|
75
|
+
bug_tracker_uri: https://github.com/jeremyevans/thamble/issues
|
76
|
+
changelog_uri: https://github.com/jeremyevans/thamble/blob/master/CHANGELOG
|
77
|
+
mailing_list_uri: https://github.com/jeremyevans/thamble/discussions
|
78
|
+
source_code_uri: https://github.com/jeremyevans/thamble
|
77
79
|
post_install_message:
|
78
80
|
rdoc_options:
|
79
81
|
- "--quiet"
|
@@ -89,14 +91,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
91
|
requirements:
|
90
92
|
- - ">="
|
91
93
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
94
|
+
version: 1.9.2
|
93
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
96
|
requirements:
|
95
97
|
- - ">="
|
96
98
|
- !ruby/object:Gem::Version
|
97
99
|
version: '0'
|
98
100
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
101
|
+
rubygems_version: 3.3.7
|
100
102
|
signing_key:
|
101
103
|
specification_version: 4
|
102
104
|
summary: Create HTML Tables from Enumerables
|
data/Rakefile
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require "rake"
|
2
|
-
require "rake/clean"
|
3
|
-
|
4
|
-
CLEAN.include ["thamble-*.gem", "rdoc", "coverage"]
|
5
|
-
|
6
|
-
desc "Build thamble gem"
|
7
|
-
task :package=>[:clean] do |p|
|
8
|
-
sh %{#{FileUtils::RUBY} -S gem build thamble.gemspec}
|
9
|
-
end
|
10
|
-
|
11
|
-
### Specs
|
12
|
-
|
13
|
-
desc "Run specs"
|
14
|
-
task :spec do
|
15
|
-
sh "#{FileUtils::RUBY} -I lib spec/thamble_spec.rb"
|
16
|
-
end
|
17
|
-
|
18
|
-
task :default => :spec
|
19
|
-
|
20
|
-
### RDoc
|
21
|
-
|
22
|
-
RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'Thamble: Create HTML Tables from Enumerables']
|
23
|
-
|
24
|
-
begin
|
25
|
-
gem 'rdoc', '= 3.12.2'
|
26
|
-
gem 'hanna-nouveau'
|
27
|
-
RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
|
28
|
-
rescue Gem::LoadError
|
29
|
-
end
|
30
|
-
|
31
|
-
rdoc_task_class = begin
|
32
|
-
require "rdoc/task"
|
33
|
-
RDoc::Task
|
34
|
-
rescue LoadError
|
35
|
-
require "rake/rdoctask"
|
36
|
-
Rake::RDocTask
|
37
|
-
end
|
38
|
-
|
39
|
-
RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
|
40
|
-
|
41
|
-
rdoc_task_class.new do |rdoc|
|
42
|
-
rdoc.rdoc_dir = "rdoc"
|
43
|
-
rdoc.options += RDOC_OPTS
|
44
|
-
rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
|
45
|
-
end
|
46
|
-
|
data/spec/thamble_spec.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require File.join(File.dirname(File.expand_path(__FILE__)), '../lib/thamble')
|
3
|
-
ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
|
4
|
-
require 'minitest/global_expectations/autorun'
|
5
|
-
|
6
|
-
describe "Thamble.table" do
|
7
|
-
def table(*a, &block)
|
8
|
-
Thamble.table(*a, &block).gsub(/\s+\n/m, '').gsub("\n", '')
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should return string with HTML table for enumerable' do
|
12
|
-
table([[1, 2]]).must_equal '<table><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should :support :column_th option for first column being th' do
|
16
|
-
table([[1, 2]], :column_th=>true).must_equal '<table><tbody><tr><th>1</th><td>2</td></tr></tbody></table>'
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should support :headers option for the headers' do
|
20
|
-
table([[1, 2]], :headers=>%w'a b').must_equal '<table><thead><tr><th>a</th><th>b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should support :headers option as a string with comma separators' do
|
24
|
-
table([[1, 2]], :headers=>'a,b').must_equal '<table><thead><tr><th>a</th><th>b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should support :widths option for setting width for each column' do
|
28
|
-
table([[1, 2]], :widths=>[3,4]).must_equal '<table><colgroup><col width="3" /><col width="4" /></colgroup><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should yield each object in enumerable to block to return data row to use' do
|
32
|
-
table([[1, 2]]){|l, t| l.map{|i| i*2}}.must_equal '<table><tbody><tr><td>2</td><td>4</td></tr></tbody></table>'
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should be able to create tags using the table.tag method' do
|
36
|
-
table([[1, 2]]){|l, t| l.map{|i| t.tag(:b, i*2)}}.must_equal '<table><tbody><tr><td><b>2</b></td><td><b>4</b></td></tr></tbody></table>'
|
37
|
-
table([[1, 2]]){|l, t| l.map{|i| t.tag(:b, i*2, i=>i)}}.must_equal '<table><tbody><tr><td><b 1="1">2</b></td><td><b 2="2">4</b></td></tr></tbody></table>'
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should be able to create links using the table.a method' do
|
41
|
-
table([[1, 2]]){|l, t| l.map{|i| t.a(i*2, 'foo')}}.must_equal '<table><tbody><tr><td><a href="foo">2</a></td><td><a href="foo">4</a></td></tr></tbody></table>'
|
42
|
-
table([[1, 2]]){|l, t| l.map{|i| t.a(i*2, 'foo', i=>i)}}.must_equal '<table><tbody><tr><td><a 1="1" href="foo">2</a></td><td><a 2="2" href="foo">4</a></td></tr></tbody></table>'
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should support :table option for the table attribtues' do
|
46
|
-
table([[1, 2]], :table=>{:class=>'foo'}).must_equal '<table class="foo"><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'should support :tr option for the tr attributes' do
|
50
|
-
table([[1, 2]], :tr=>{:class=>'foo'}).must_equal '<table><tbody><tr class="foo"><td>1</td><td>2</td></tr></tbody></table>'
|
51
|
-
table([[1, 2]], :headers=>%w'a b', :tr=>{:class=>'foo'}).must_equal '<table><thead><tr class="foo"><th>a</th><th>b</th></tr></thead><tbody><tr class="foo"><td>1</td><td>2</td></tr></tbody></table>'
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should support :td option for the td attributes' do
|
55
|
-
table([[1, 2]], :td=>{:class=>'foo'}).must_equal '<table><tbody><tr><td class="foo">1</td><td class="foo">2</td></tr></tbody></table>'
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should support :th option for the th attributes' do
|
59
|
-
table([[1, 2]], :headers=>%w'a b', :th=>{:class=>'foo'}).must_equal '<table><thead><tr><th class="foo">a</th><th class="foo">b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should support a proc for the :tr option' do
|
63
|
-
table([[1, 2]], :tr=>proc{|row| {:class=>"foo#{row.join}"}}).must_equal '<table><tbody><tr class="foo12"><td>1</td><td>2</td></tr></tbody></table>'
|
64
|
-
table([[1, 2]], :headers=>%w'a b', :tr=>proc{|row| {:class=>"foo#{row.join}"}}).must_equal '<table><thead><tr class="fooab"><th>a</th><th>b</th></tr></thead><tbody><tr class="foo12"><td>1</td><td>2</td></tr></tbody></table>'
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should support a proc for the :td option' do
|
68
|
-
table([[1, 2]], :td=>proc{|v, i, row| {:class=>"foo#{row.join}-#{v}-#{i}"}}).must_equal '<table><tbody><tr><td class="foo12-1-0">1</td><td class="foo12-2-1">2</td></tr></tbody></table>'
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'should support a proc for the :th option' do
|
72
|
-
table([[1, 2]], :headers=>%w'a b', :th=>proc{|v| {:class=>"foo#{v}"}}).must_equal '<table><thead><tr><th class="fooa">a</th><th class="foob">b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'should support :caption option for the table caption' do
|
76
|
-
table([[1, 2]], :headers=>%w'a b', :caption=>'Foo').must_equal '<table><caption>Foo</caption><thead><tr><th>a</th><th>b</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'should be callable as a method if including the module' do
|
80
|
-
Class.new{include Thamble}.new.send(:table, [[1, 2]]).gsub(/\s+\n/m, '').gsub("\n", '').must_equal '<table><tbody><tr><td>1</td><td>2</td></tr></tbody></table>'
|
81
|
-
end
|
82
|
-
end
|