osheet 0.9.2 → 0.10.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.
- 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
|