osheet 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +16 -15
- data/README.rdoc +1 -1
- data/Rakefile +25 -0
- data/bench/profiler.rb +6 -0
- data/bench/profiler_1000.xls +17015 -0
- data/bench/profiler_runner.rb +39 -0
- data/examples/basic.rb +5 -1
- data/examples/basic.xls +1 -0
- data/examples/basic_with_templates.rb +4 -1
- data/examples/basic_with_templates.xls +93 -0
- data/examples/formats.rb +5 -1
- data/examples/formats.xls +768 -0
- data/examples/formula.rb +7 -3
- data/examples/formula.xls +36 -0
- data/examples/styles.rb +5 -1
- data/examples/styles.xls +343 -0
- data/examples/trivial.rb +5 -1
- data/examples/trivial.xls +18 -0
- data/lib/osheet/version.rb +1 -1
- data/lib/osheet/xmlss_writer/base.rb +27 -30
- data/lib/osheet/xmlss_writer/elements.rb +28 -42
- data/lib/osheet/xmlss_writer/styles.rb +59 -28
- data/osheet.gemspec +4 -4
- data/test/helper.rb +9 -0
- data/test/xmlss_writer/base_test.rb +14 -12
- data/test/xmlss_writer/elements_test.rb +110 -111
- data/test/xmlss_writer/styles_test.rb +202 -98
- metadata +23 -14
@@ -3,48 +3,79 @@ module Osheet::XmlssWriter::Styles
|
|
3
3
|
|
4
4
|
protected
|
5
5
|
|
6
|
-
def style_id(style_class, oformat=nil)
|
7
|
-
|
8
|
-
|
6
|
+
def style_id(xworkbook, style_class, oformat=nil)
|
7
|
+
xstyle = style(xworkbook, style_class, oformat)
|
8
|
+
xstyle.nil? ? '' : xstyle.id
|
9
9
|
end
|
10
10
|
|
11
|
-
def style(style_class, oformat=nil)
|
11
|
+
def style(xworkbook, style_class, oformat=nil)
|
12
12
|
oformat ||= Osheet::Format.new(:general)
|
13
|
+
|
14
|
+
# generate the style key for the given class/format
|
13
15
|
key = style_key(style_class, oformat.key)
|
14
|
-
|
15
|
-
if
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
font(settings[:font])
|
23
|
-
end
|
24
|
-
if settings.has_key?(:bg) && !settings[:bg].empty?
|
25
|
-
interior(settings[:bg])
|
26
|
-
end
|
27
|
-
::Osheet::Style::BORDERS.each do |bp|
|
28
|
-
if settings.has_key?(bp) && !settings[bp].empty?
|
29
|
-
border(settings[bp])
|
30
|
-
end
|
31
|
-
end
|
32
|
-
if oformat
|
33
|
-
number_format(:format => oformat.style)
|
34
|
-
end
|
35
|
-
})
|
16
|
+
|
17
|
+
# see if we have already created/used an xmlss style for the given key
|
18
|
+
xstyle = @used_xstyles.find{ |xs| xs.id == key }
|
19
|
+
|
20
|
+
# if not, create an xmlss style for the key and add it to the used cache
|
21
|
+
if !key.empty? && xstyle.nil?
|
22
|
+
xstyle = xmlss_style(xworkbook, key, oformat)
|
23
|
+
@used_xstyles << xstyle
|
36
24
|
end
|
37
|
-
|
25
|
+
|
26
|
+
xstyle
|
38
27
|
end
|
39
28
|
|
29
|
+
private
|
30
|
+
|
40
31
|
def style_key(style_class, format_key)
|
41
32
|
(style_class || '').strip.split(/\s+/).collect do |c|
|
42
33
|
".#{c}"
|
43
34
|
end.join('') + (format_key.nil? || format_key.empty? ? '' : "..#{format_key}")
|
44
35
|
end
|
45
36
|
|
37
|
+
def xmlss_style(xworkbook, key, oformat)
|
38
|
+
# take all the matching osheet styles for the given key,
|
39
|
+
# and build up xmlss style settings for them
|
40
|
+
settings = style_settings(key)
|
41
|
+
|
42
|
+
xworkbook.style(key) do
|
43
|
+
|
44
|
+
if settings.has_key?(:align) && !settings[:align].empty?
|
45
|
+
xworkbook.alignment(settings[:align])
|
46
|
+
end
|
47
|
+
|
48
|
+
if settings.has_key?(:font) && !settings[:font].empty?
|
49
|
+
xworkbook.font(settings[:font])
|
50
|
+
end
|
51
|
+
|
52
|
+
if settings.has_key?(:bg) && !settings[:bg].empty?
|
53
|
+
xworkbook.interior(settings[:bg])
|
54
|
+
end
|
55
|
+
|
56
|
+
border_set = ::Osheet::Style::BORDERS.inject([]) do |set, bp|
|
57
|
+
if settings.has_key?(bp) && !settings[bp].empty?
|
58
|
+
set << settings[bp]
|
59
|
+
end
|
60
|
+
set
|
61
|
+
end
|
62
|
+
if !border_set.empty?
|
63
|
+
xworkbook.borders {
|
64
|
+
border_set.each { |border_setting| xworkbook.border(border_setting) }
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
if oformat
|
69
|
+
xworkbook.number_format(oformat.style)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# TODO: would be nice to have a class handle all of the osheet-xmlss style translations...
|
76
|
+
|
46
77
|
def style_settings(key)
|
47
|
-
@
|
78
|
+
@oworkbook.styles.for(key).inject({}) do |style_settings, ostyle|
|
48
79
|
merged_settings(style_settings, ostyle_settings(ostyle))
|
49
80
|
end
|
50
81
|
end
|
data/osheet.gemspec
CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Osheet::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Kelly Redding"]
|
10
|
-
s.email = ["kelly@
|
11
|
-
s.homepage = "http://github.com/
|
10
|
+
s.email = ["kelly@kellyredding.com"]
|
11
|
+
s.homepage = "http://github.com/kellyredding/osheet"
|
12
12
|
s.summary = %q{A DSL for specifying and generating spreadsheets using Ruby}
|
13
13
|
s.description = %q{A DSL for specifying and generating spreadsheets using Ruby}
|
14
14
|
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
|
20
20
|
s.add_development_dependency("bundler", ["~> 1.0"])
|
21
21
|
s.add_development_dependency("assert", ["~> 0.3"])
|
22
|
-
s.add_dependency("enumeration", ["~> 1.
|
23
|
-
s.add_dependency("xmlss", ["~> 0.
|
22
|
+
s.add_dependency("enumeration", ["~> 1.3"])
|
23
|
+
s.add_dependency("xmlss", ["~> 0.4"])
|
24
24
|
|
25
25
|
end
|
data/test/helper.rb
CHANGED
@@ -6,6 +6,15 @@ $LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
|
|
6
6
|
require 'osheet'
|
7
7
|
|
8
8
|
class Assert::Context
|
9
|
+
|
10
|
+
def xstyle_markup(xworkbook)
|
11
|
+
xworkbook.instance_variable_get("@__xmlss_undies_writer").flush.style_markup
|
12
|
+
end
|
13
|
+
|
14
|
+
def xelement_markup(xworkbook)
|
15
|
+
xworkbook.instance_variable_get("@__xmlss_undies_writer").flush.element_markup
|
16
|
+
end
|
17
|
+
|
9
18
|
class << self
|
10
19
|
|
11
20
|
|
@@ -8,13 +8,13 @@ module Osheet
|
|
8
8
|
before { @writer = XmlssWriter::Base.new }
|
9
9
|
subject { @writer }
|
10
10
|
|
11
|
-
should have_readers :
|
12
|
-
should have_writer :
|
11
|
+
should have_readers :used_xstyles
|
12
|
+
should have_writer :oworkbook
|
13
|
+
should have_instance_methods :xworkbook
|
13
14
|
|
14
15
|
end
|
15
16
|
|
16
|
-
class XmlssWriter::
|
17
|
-
desc "workbook"
|
17
|
+
class XmlssWriter::WorkbookTests < XmlssWriter::BaseTest
|
18
18
|
before do
|
19
19
|
@workbook = Workbook.new {
|
20
20
|
title "xmlss"
|
@@ -24,10 +24,10 @@ module Osheet
|
|
24
24
|
|
25
25
|
should "only allow writing an Osheet::Workbook" do
|
26
26
|
assert_nothing_raised do
|
27
|
-
subject.
|
27
|
+
subject.oworkbook = @workbook
|
28
28
|
end
|
29
29
|
assert_raises ArgumentError do
|
30
|
-
subject.
|
30
|
+
subject.oworkbook = "poo"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -42,16 +42,18 @@ module Osheet
|
|
42
42
|
end
|
43
43
|
|
44
44
|
should "create an Xmlss workbook" do
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
subject.oworkbook = @workbook
|
46
|
+
assert_kind_of ::Xmlss::Workbook, subject.xworkbook
|
47
|
+
|
48
|
+
assert_equal(
|
49
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"><Styles></Styles><Worksheet ss:Name=\"testsheet1\"><Table></Table></Worksheet></Workbook>",
|
50
|
+
subject.xworkbook.to_s
|
51
|
+
)
|
50
52
|
end
|
51
53
|
|
52
54
|
end
|
53
55
|
|
54
|
-
class XmlssWriter::
|
56
|
+
class XmlssWriter::ToFileTests < Assert::Context
|
55
57
|
desc "XmlssWriter::Base"
|
56
58
|
before do
|
57
59
|
@writer = XmlssWriter::Base.new({
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "assert"
|
2
|
+
|
2
3
|
require 'osheet/xmlss_writer'
|
3
4
|
|
4
5
|
module Osheet
|
@@ -6,47 +7,92 @@ module Osheet
|
|
6
7
|
class XmlssWriter::ElementsTest < Assert::Context
|
7
8
|
before do
|
8
9
|
@writer = XmlssWriter::Base.new
|
10
|
+
@xworkbook = ::Xmlss::Workbook.new
|
9
11
|
end
|
10
12
|
subject { @writer }
|
11
13
|
|
12
14
|
end
|
13
15
|
|
14
|
-
class XmlssWriter::
|
15
|
-
desc "when writing a
|
16
|
+
class XmlssWriter::CellTests < XmlssWriter::ElementsTest
|
17
|
+
desc "when writing a cell"
|
16
18
|
before do
|
17
|
-
@
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
@cell = Osheet::Cell.new do
|
20
|
+
style_class "awesome thing"
|
21
|
+
data 100
|
22
|
+
format :number
|
23
|
+
href 'http://example.com'
|
24
|
+
rowspan 2
|
25
|
+
colspan 5
|
26
|
+
index 3
|
27
|
+
formula "=R1C1"
|
28
|
+
end
|
29
|
+
@xmlss_cell = subject.send(:cell, @xworkbook, @cell)
|
22
30
|
end
|
23
31
|
|
24
|
-
should "create an Xmlss
|
25
|
-
|
26
|
-
|
27
|
-
assert_equal
|
28
|
-
|
29
|
-
assert_equal
|
30
|
-
assert_equal
|
32
|
+
should "create an Xmlss cell with appropriate attributes" do
|
33
|
+
assert_kind_of ::Xmlss::Element::Cell, @xmlss_cell
|
34
|
+
assert_equal 'http://example.com', @xmlss_cell.href
|
35
|
+
assert_equal 3, @xmlss_cell.index
|
36
|
+
assert_equal "=R1C1", @xmlss_cell.formula
|
37
|
+
assert_equal 1, @xmlss_cell.merge_down
|
38
|
+
assert_equal 4, @xmlss_cell.merge_across
|
31
39
|
end
|
32
40
|
|
33
|
-
should "
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
should "style an Xmlss cell" do
|
42
|
+
assert_equal ".awesome.thing..number_none_0_nocomma_black", @xmlss_cell.style_id
|
43
|
+
assert_equal 1, subject.used_xstyles.size
|
44
|
+
assert_kind_of ::Xmlss::Style::Base, subject.used_xstyles.first
|
45
|
+
assert_equal @xmlss_cell.style_id, subject.used_xstyles.first.id
|
46
|
+
end
|
47
|
+
|
48
|
+
should "write row element markup" do
|
49
|
+
assert_equal(
|
50
|
+
"<Cell ss:Formula=\"=R1C1\" ss:HRef=\"http://example.com\" ss:Index=\"3\" ss:MergeAcross=\"4\" ss:MergeDown=\"1\" ss:StyleID=\".awesome.thing..number_none_0_nocomma_black\"><Data ss:Type=\"Number\">100</Data></Cell>",
|
51
|
+
xelement_markup(@xworkbook)
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class XmlssWriter::RowTests < XmlssWriter::ElementsTest
|
58
|
+
desc "when writing a row"
|
59
|
+
before do
|
60
|
+
@row = Osheet::Row.new do
|
61
|
+
style_class "awesome thing"
|
62
|
+
height 100
|
63
|
+
autofit true
|
64
|
+
hidden true
|
65
|
+
cell {
|
66
|
+
data 'one hundred'
|
67
|
+
}
|
44
68
|
end
|
69
|
+
@xmlss_row = subject.send(:row, @xworkbook, @row)
|
70
|
+
end
|
71
|
+
|
72
|
+
should "create an Xmlss row" do
|
73
|
+
assert_kind_of ::Xmlss::Element::Row, @xmlss_row
|
74
|
+
assert_equal @row.attributes[:height], @xmlss_row.height
|
75
|
+
assert_equal @row.attributes[:autofit], @xmlss_row.auto_fit_height
|
76
|
+
assert_equal @row.attributes[:hidden], @xmlss_row.hidden
|
77
|
+
end
|
78
|
+
|
79
|
+
should "style an Xmlss row" do
|
80
|
+
assert_equal ".awesome.thing", @xmlss_row.style_id
|
81
|
+
assert_equal 1, subject.used_xstyles.size
|
82
|
+
assert_kind_of ::Xmlss::Style::Base, subject.used_xstyles.first
|
83
|
+
assert_equal @xmlss_row.style_id, subject.used_xstyles.first.id
|
84
|
+
end
|
85
|
+
|
86
|
+
should "write row element markup" do
|
87
|
+
assert_equal(
|
88
|
+
"<Row ss:AutoFitHeight=\"1\" ss:Height=\"100\" ss:Hidden=\"1\" ss:StyleID=\".awesome.thing\"><Cell><Data ss:Type=\"String\">one hundred</Data></Cell></Row>",
|
89
|
+
xelement_markup(@xworkbook)
|
90
|
+
)
|
45
91
|
end
|
46
92
|
|
47
93
|
end
|
48
94
|
|
49
|
-
class XmlssWriter::
|
95
|
+
class XmlssWriter::ColumnTests < XmlssWriter::ElementsTest
|
50
96
|
desc "when writing a column"
|
51
97
|
before do
|
52
98
|
@column = Osheet::Column.new {
|
@@ -58,11 +104,11 @@ module Osheet
|
|
58
104
|
:color => 'blue'
|
59
105
|
})
|
60
106
|
}
|
61
|
-
@xmlss_column = subject.send(:column, @column)
|
107
|
+
@xmlss_column = subject.send(:column, @xworkbook, @column)
|
62
108
|
end
|
63
109
|
|
64
110
|
should "create an Xmlss column" do
|
65
|
-
assert_kind_of ::Xmlss::Column, @xmlss_column
|
111
|
+
assert_kind_of ::Xmlss::Element::Column, @xmlss_column
|
66
112
|
assert_equal @column.attributes[:width], @xmlss_column.width
|
67
113
|
assert_equal @column.attributes[:autofit], @xmlss_column.auto_fit_width
|
68
114
|
assert_equal @column.attributes[:hidden], @xmlss_column.hidden
|
@@ -70,104 +116,57 @@ module Osheet
|
|
70
116
|
|
71
117
|
should "style an Xmlss column" do
|
72
118
|
assert_equal ".awesome", @xmlss_column.style_id
|
73
|
-
assert_equal 1, subject.
|
74
|
-
assert_kind_of ::Xmlss::Style::Base, subject.
|
75
|
-
assert_equal @xmlss_column.style_id, subject.
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
class XmlssWriter::RowTest < XmlssWriter::ElementsTest
|
80
|
-
desc "when writing a row"
|
81
|
-
before do
|
82
|
-
@row = Osheet::Row.new do
|
83
|
-
style_class "awesome thing"
|
84
|
-
height 100
|
85
|
-
autofit true
|
86
|
-
hidden true
|
87
|
-
cell {
|
88
|
-
data 'one hundred'
|
89
|
-
}
|
90
|
-
end
|
91
|
-
subject.workbook = Workbook.new {
|
92
|
-
style('.awesome') {
|
93
|
-
font 14
|
94
|
-
}
|
95
|
-
style('.thing') {
|
96
|
-
font :italic
|
97
|
-
}
|
98
|
-
style('.awesome.thing') {
|
99
|
-
font :bold
|
100
|
-
}
|
101
|
-
}
|
102
|
-
@xmlss_row = subject.send(:row, @row)
|
119
|
+
assert_equal 1, subject.used_xstyles.size
|
120
|
+
assert_kind_of ::Xmlss::Style::Base, subject.used_xstyles.first
|
121
|
+
assert_equal @xmlss_column.style_id, subject.used_xstyles.first.id
|
103
122
|
end
|
104
123
|
|
105
|
-
should "
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
assert_equal 1, @xmlss_row.cells.size
|
124
|
+
should "write column element markup" do
|
125
|
+
assert_equal(
|
126
|
+
"<Column ss:AutoFitWidth=\"1\" ss:Hidden=\"1\" ss:StyleID=\".awesome\" ss:Width=\"100\" />",
|
127
|
+
xelement_markup(@xworkbook)
|
128
|
+
)
|
111
129
|
end
|
112
130
|
|
113
|
-
should "style an Xmlss row" do
|
114
|
-
assert_equal ".awesome.thing", @xmlss_row.style_id
|
115
|
-
assert_equal 1, subject.styles.size
|
116
|
-
assert_kind_of ::Xmlss::Style::Base, subject.styles.first
|
117
|
-
assert_equal @xmlss_row.style_id, subject.styles.first.id
|
118
|
-
assert_equal 14, subject.styles.first.font.size
|
119
|
-
assert_equal true, subject.styles.first.font.bold?
|
120
|
-
assert_equal true, subject.styles.first.font.italic?
|
121
|
-
end
|
122
131
|
end
|
123
132
|
|
124
|
-
class XmlssWriter::
|
125
|
-
desc "when writing a
|
133
|
+
class XmlssWriter::WorksheetTests < XmlssWriter::ElementsTest
|
134
|
+
desc "when writing a worksheet"
|
126
135
|
before do
|
127
|
-
@
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
href 'http://example.com'
|
132
|
-
rowspan 2
|
133
|
-
colspan 5
|
134
|
-
index 3
|
135
|
-
formula "=R1C1"
|
136
|
+
@worksheet = Worksheet.new do
|
137
|
+
name "testsheet2"
|
138
|
+
column { width 100 }
|
139
|
+
row { height 50 }
|
136
140
|
end
|
137
|
-
subject.workbook = Workbook.new {
|
138
|
-
style('.awesome') {
|
139
|
-
font 14
|
140
|
-
}
|
141
|
-
style('.thing') {
|
142
|
-
font :italic
|
143
|
-
}
|
144
|
-
style('.awesome.thing') {
|
145
|
-
font :bold
|
146
|
-
}
|
147
|
-
}
|
148
|
-
@xmlss_cell = subject.send(:cell, @cell)
|
149
141
|
end
|
150
142
|
|
151
|
-
should "create an Xmlss
|
152
|
-
|
153
|
-
assert_kind_of ::Xmlss::
|
154
|
-
assert_equal @cell.attributes[:data], @xmlss_cell.data.value
|
155
|
-
assert_equal ::Xmlss::Data.type(:number), @xmlss_cell.data.type
|
156
|
-
assert_equal 'http://example.com', @xmlss_cell.href
|
157
|
-
assert_equal 3, @xmlss_cell.index
|
158
|
-
assert_equal "=R1C1", @xmlss_cell.formula
|
143
|
+
should "create an Xmlss worksheet" do
|
144
|
+
xmlss_worksheet = subject.send(:worksheet, @xworkbook, @worksheet)
|
145
|
+
assert_kind_of ::Xmlss::Element::Worksheet, xmlss_worksheet
|
159
146
|
end
|
160
147
|
|
161
|
-
should "
|
162
|
-
|
163
|
-
|
148
|
+
should "filter invalid worksheet names" do
|
149
|
+
{ 'valid name' => 'valid name',
|
150
|
+
'valid 2' => 'valid 2',
|
151
|
+
'invalid :' => 'invalid ',
|
152
|
+
'invalid ;' => 'invalid ',
|
153
|
+
'invalid *' => 'invalid ',
|
154
|
+
'invalid /' => 'invalid ',
|
155
|
+
'invalid \\' => 'invalid ',
|
156
|
+
'[invalid]' => "invalid]"
|
157
|
+
}.each do |k,v|
|
158
|
+
assert_equal v, subject.send(:worksheet, @xworkbook, Worksheet.new { name k }).name
|
159
|
+
end
|
164
160
|
end
|
165
161
|
|
166
|
-
should "
|
167
|
-
|
168
|
-
assert_equal
|
169
|
-
|
162
|
+
should "write worksheet element markup" do
|
163
|
+
subject.send(:worksheet, @xworkbook, @worksheet)
|
164
|
+
assert_equal(
|
165
|
+
"<Worksheet ss:Name=\"testsheet2\"><Table><Column ss:Width=\"100\" /><Row ss:Height=\"50\"></Row></Table></Worksheet>",
|
166
|
+
xelement_markup(@xworkbook)
|
167
|
+
)
|
170
168
|
end
|
169
|
+
|
171
170
|
end
|
172
171
|
|
173
172
|
end
|