entable 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,8 +5,8 @@ module Entable
5
5
  Entable::Transformer.add_transformer name, transformer, &block
6
6
  end
7
7
 
8
- def self.add_wrapper name, &block
9
- Entable::Wrapper.add_wrapper name, &block
8
+ def self.add_wrapper name, klass=nil, &block
9
+ Entable::Wrapper.add_wrapper name, klass, &block
10
10
  end
11
11
  end
12
12
 
@@ -5,6 +5,8 @@ module Entable::Transformer
5
5
  end
6
6
 
7
7
  def self.apply_transform collection, transform_name
8
- @@transformers[transform_name.to_sym].call collection
8
+ transformer = @@transformers[transform_name.to_sym]
9
+ raise "Unknown transformer name #{transform_name.inspect}" if transformer.nil?
10
+ transformer.call collection
9
11
  end
10
12
  end
@@ -1,3 +1,3 @@
1
1
  module Entable
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -1,11 +1,17 @@
1
1
  module Entable::Wrapper
2
- def self.add_wrapper name, &block
2
+ def self.add_wrapper name, klass, &block
3
3
  @@wrappers ||= { }
4
- @@wrappers[name.to_sym] = block
4
+ @@wrappers[name.to_sym] = klass || block
5
5
  end
6
6
 
7
7
  def self.apply_wrapper name, items, *args
8
8
  wrapper = @@wrappers[name.to_sym]
9
- items.map { |item| wrapper.call(item, *args) }
9
+ if wrapper.respond_to? :call
10
+ items.map { |item| wrapper.call(item, *args) }
11
+ elsif wrapper.is_a? Class
12
+ items.map { |item| wrapper.new(*item, *args) }
13
+ else
14
+ raise "Unknown wrapper name #{name.inspect}"
15
+ end
10
16
  end
11
17
  end
@@ -143,6 +143,48 @@ describe Entable do
143
143
  </table></body></html>}
144
144
  end
145
145
 
146
+ it "should generate a simple table, reversing names, capitalizing some, applying prefix and postfix" do
147
+ config = {
148
+ "preprocess" => {
149
+ "transform" => "alernating_boolean",
150
+ "wrap" => "reversi"
151
+ },
152
+ "columns" => [
153
+ { "title" => "First", "content" => "%{firstname}" },
154
+ { "title" => "Last", "content" => "%{lastname}" },
155
+ { "title" => "Phone", "content" => "%{phone}" },
156
+ { "title" => "Postcode", "content" => "%{postcode}" },
157
+ ]
158
+ }
159
+ Exporter.new(config).to_xls(CONTACTS, "PREFIX", "POSTFIX").should == %{<html><head><meta content='application/vnd.ms-excel;charset=UTF-8' http-equiv='Content-Type'><meta content='UTF-8' http-equiv='Encoding'></head><body><table>
160
+ <tr><td>First</td> <td>Last</td> <td>Phone</td> <td>Postcode</td></tr>
161
+ <tr><td>Nanoc</td> <td>Notlad</td> <td>PREFIX01234567</td> <td>75020POSTFIX</td></tr>
162
+ <tr><td>dez</td> <td>arbmunez</td> <td>PREFIX999999</td> <td>99999POSTFIX</td></tr>
163
+ <tr><td>Maharba</td> <td>Kravdraa</td> <td>PREFIX0000000</td> <td>0POSTFIX</td></tr>
164
+ <tr><td>semaj</td> <td>ecyoj</td> <td>PREFIX3647583</td> <td>75001POSTFIX</td></tr>
165
+ </table></body></html>}
166
+ end
167
+
168
+ it "should generate an error for a nonexistent wrapper" do
169
+ config = {
170
+ "preprocess" => {
171
+ "wrap" => "not_configured"
172
+ },
173
+ "columns" => [{ "title" => "First", "content" => "%{firstname}" }]
174
+ }
175
+ Proc.new { Exporter.new(config).to_xls(CONTACTS) }.should raise_error(StandardError, "Unknown wrapper name :not_configured")
176
+ end
177
+
178
+ it "should generate an error for a nonexistent wrapper" do
179
+ config = {
180
+ "preprocess" => {
181
+ "transform" => "not_configured"
182
+ },
183
+ "columns" => [{ "title" => "First", "content" => "%{firstname}" }]
184
+ }
185
+ Proc.new { Exporter.new(config).to_xls(CONTACTS) }.should raise_error(StandardError, "Unknown transformer name :not_configured")
186
+ end
187
+
146
188
  it "should escape double-quotes when necessary" do
147
189
  self.class.send :include, Entable::XlsExport
148
190
  quote_for_xls('2, "The Hammonds"').should == '="2, ""The Hammonds"""'
@@ -39,6 +39,32 @@ class ContactUpper
39
39
  end
40
40
  end
41
41
 
42
+ class ContactReverse
43
+ attr_accessor :contact, :upcasing, :prefix, :postfix
44
+
45
+ def initialize contact, upcasing, prefix, postfix
46
+ @contact, @upcasing, @prefix, @postfix = contact, upcasing, prefix, postfix
47
+ end
48
+
49
+ def firstname
50
+ f = contact.firstname.downcase.reverse
51
+ self.upcasing ? f.capitalize : f
52
+ end
53
+
54
+ def lastname
55
+ f = contact.lastname.downcase.reverse
56
+ self.upcasing ? f.capitalize : f
57
+ end
58
+
59
+ def phone
60
+ prefix + contact.phone
61
+ end
62
+
63
+ def postcode
64
+ contact.postcode + postfix
65
+ end
66
+ end
67
+
42
68
  class TwiceEverything
43
69
  def call collection
44
70
  collection.inject([]) { |result, item|
@@ -49,16 +75,30 @@ class TwiceEverything
49
75
  end
50
76
  end
51
77
 
78
+ class AlternatingBoolean
79
+ def call collection
80
+ b = true
81
+ collection.inject([]) { |result, item|
82
+ result << [item, b]
83
+ b = !b
84
+ result
85
+ }
86
+ end
87
+ end
88
+
52
89
  Entable.add_transformer :sort_by_last_name do |collection|
53
90
  collection.sort_by &:lastname
54
91
  end
55
92
 
56
93
  Entable.add_transformer :double_each_item, TwiceEverything.new
94
+ Entable.add_transformer :alernating_boolean, AlternatingBoolean.new
57
95
 
58
96
  Entable.add_wrapper :uppercase do |item|
59
97
  ContactUpper.new item
60
98
  end
61
99
 
100
+ Entable.add_wrapper :reversi, ContactReverse
101
+
62
102
  class Exporter
63
103
  include Entable::XlsExport
64
104
  include Entable::HtmlBuilder
@@ -69,8 +109,8 @@ class Exporter
69
109
  self.config = config
70
110
  end
71
111
 
72
- def to_xls items
73
- build_interpreter(config).to_xls items
112
+ def to_xls items, *args
113
+ build_interpreter(config).to_xls items, *args
74
114
  end
75
115
  end
76
116
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: entable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
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: 2013-06-23 00:00:00.000000000 Z
12
+ date: 2013-06-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec