xmlss 0.3.1 → 0.4.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 -2
- data/Gemfile +1 -0
- data/Gemfile.lock +12 -11
- data/README.rdoc +141 -107
- data/Rakefile +24 -1
- data/bench/profiler.rb +6 -0
- data/bench/profiler_runner.rb +43 -0
- data/examples/example_workbook.rb +8 -12
- data/examples/layout.rb +34 -60
- data/examples/layout.xml +66 -0
- data/examples/simple.rb +16 -21
- data/examples/simple.xml +32 -0
- data/examples/styles.rb +52 -56
- data/examples/styles.xml +50 -0
- data/examples/text.rb +18 -28
- data/examples/text.xml +20 -0
- data/lib/xmlss/{cell.rb → element/cell.rb} +4 -14
- data/lib/xmlss/{column.rb → element/column.rb} +2 -7
- data/lib/xmlss/{data.rb → element/data.rb} +7 -12
- data/lib/xmlss/{row.rb → element/row.rb} +2 -13
- data/lib/xmlss/{worksheet.rb → element/worksheet.rb} +7 -18
- data/lib/xmlss/style/alignment.rb +3 -10
- data/lib/xmlss/style/base.rb +6 -45
- data/lib/xmlss/style/border.rb +5 -5
- data/lib/xmlss/style/font.rb +2 -9
- data/lib/xmlss/style/interior.rb +2 -5
- data/lib/xmlss/style/number_format.rb +4 -7
- data/lib/xmlss/style/protection.rb +4 -7
- data/lib/xmlss/undies_writer.rb +172 -0
- data/lib/xmlss/version.rb +1 -1
- data/lib/xmlss/workbook.rb +97 -31
- data/lib/xmlss.rb +1 -28
- data/test/{cell_test.rb → element/cell_test.rb} +11 -35
- data/test/{column_test.rb → element/column_test.rb} +6 -12
- data/test/{data_test.rb → element/data_test.rb} +15 -10
- data/test/{row_test.rb → element/row_test.rb} +5 -35
- data/test/{worksheet_test.rb → element/worksheet_test.rb} +4 -30
- data/test/helper.rb +13 -30
- data/test/style/alignment_test.rb +13 -45
- data/test/style/base_test.rb +1 -106
- data/test/style/border_test.rb +12 -32
- data/test/style/font_test.rb +11 -43
- data/test/style/interior_test.rb +7 -27
- data/test/style/number_format_test.rb +5 -21
- data/test/style/protection_test.rb +2 -12
- data/test/undies_writer_test.rb +333 -0
- data/test/workbook_test.rb +89 -44
- data/xmlss.gemspec +2 -2
- metadata +37 -39
- data/lib/xmlss/item_set.rb +0 -17
- data/lib/xmlss/table.rb +0 -22
- data/lib/xmlss/xml.rb +0 -60
- data/test/item_set_test.rb +0 -27
- data/test/table_test.rb +0 -56
- data/test/xml_test.rb +0 -81
- data/test/xmlss_test.rb +0 -31
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'undies'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
module Xmlss
|
5
|
+
class UndiesWriter
|
6
|
+
|
7
|
+
XML_NS = "xmlns"
|
8
|
+
SHEET_NS = "ss"
|
9
|
+
NS_URI = "urn:schemas-microsoft-com:office:spreadsheet"
|
10
|
+
|
11
|
+
# The Undies writer is responsible for driving the Undies API to generate
|
12
|
+
# the xmlss xml markup for the workbook.
|
13
|
+
# Because order doesn't matter when defining style and worksheet elements,
|
14
|
+
# the writer has to buffer the style and worksheet markup separately,
|
15
|
+
# then put them together according to Xmlss spec to build the final
|
16
|
+
# workbook markup.
|
17
|
+
|
18
|
+
def self.attributes(thing, *attrs)
|
19
|
+
[*attrs].flatten.inject({}) do |xattrs, a|
|
20
|
+
xattrs.merge(if !(xv = self.coerce(thing.send(a))).nil?
|
21
|
+
{"#{SHEET_NS}:#{self.classify(a)}" => xv.to_s}
|
22
|
+
else
|
23
|
+
{}
|
24
|
+
end)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.classify(underscored_string)
|
29
|
+
underscored_string.
|
30
|
+
to_s.downcase.
|
31
|
+
split("_").
|
32
|
+
collect{|part| part.capitalize}.
|
33
|
+
join('')
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.coerce(value)
|
37
|
+
if value == true
|
38
|
+
1
|
39
|
+
elsif ["",false].include?(value)
|
40
|
+
# don't include false or empty string values
|
41
|
+
nil
|
42
|
+
else
|
43
|
+
value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_reader :style_markup, :element_markup
|
48
|
+
|
49
|
+
def initialize(output_opts={})
|
50
|
+
@opts = output_opts || {}
|
51
|
+
|
52
|
+
# buffer style markup and create a template to write to it
|
53
|
+
@style_markup = ""
|
54
|
+
styles_out = Undies::Output.new(StringIO.new(@style_markup), @opts.merge({
|
55
|
+
:pp_level => 2
|
56
|
+
}))
|
57
|
+
@styles_t = Undies::Template.new(styles_out)
|
58
|
+
|
59
|
+
# buffer worksheet markup and create a template to write to it
|
60
|
+
@element_markup = ""
|
61
|
+
worksheets_out = Undies::Output.new(StringIO.new(@element_markup), @opts.merge({
|
62
|
+
:pp_level => 1
|
63
|
+
}))
|
64
|
+
@worksheets_t = Undies::Template.new(worksheets_out)
|
65
|
+
end
|
66
|
+
|
67
|
+
def flush
|
68
|
+
Undies::Template.flush(@worksheets_t)
|
69
|
+
Undies::Template.flush(@styles_t)
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
# return the full workbook markup, combining the buffers to xmlss spec
|
74
|
+
def workbook
|
75
|
+
self.flush
|
76
|
+
"".tap do |markup|
|
77
|
+
Undies::Template.new(Undies::Source.new(Proc.new do
|
78
|
+
__ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
79
|
+
_Workbook(XML_NS => NS_URI, "#{XML_NS}:#{SHEET_NS}" => NS_URI) {
|
80
|
+
_Styles {
|
81
|
+
___ style_markup.to_s.strip
|
82
|
+
}
|
83
|
+
__ element_markup.to_s.strip
|
84
|
+
}
|
85
|
+
end), {
|
86
|
+
:style_markup => @style_markup,
|
87
|
+
:element_markup => @element_markup
|
88
|
+
}, Undies::Output.new(StringIO.new(markup), @opts))
|
89
|
+
end.strip
|
90
|
+
end
|
91
|
+
|
92
|
+
# workbook style markup directives
|
93
|
+
|
94
|
+
def alignment(alignment, &block)
|
95
|
+
@styles_t._Alignment(self.class.attributes(alignment, [
|
96
|
+
:horizontal, :vertical, :wrap_text, :rotate
|
97
|
+
]))
|
98
|
+
end
|
99
|
+
|
100
|
+
def border(border, &block)
|
101
|
+
@styles_t._Border(self.class.attributes(border, [
|
102
|
+
:color, :position, :weight, :line_style
|
103
|
+
]))
|
104
|
+
end
|
105
|
+
|
106
|
+
def borders(&block)
|
107
|
+
@styles_t._Borders(&block)
|
108
|
+
end
|
109
|
+
|
110
|
+
def font(font, &block)
|
111
|
+
@styles_t._Font(self.class.attributes(font, [
|
112
|
+
:bold, :color, :italic, :size, :shadow, :font_name,
|
113
|
+
:strike_through, :underline, :vertical_align
|
114
|
+
]))
|
115
|
+
end
|
116
|
+
|
117
|
+
def interior(interior, &block)
|
118
|
+
@styles_t._Interior(self.class.attributes(interior, [
|
119
|
+
:color, :pattern, :pattern_color
|
120
|
+
]))
|
121
|
+
end
|
122
|
+
|
123
|
+
def number_format(number_format, &block)
|
124
|
+
@styles_t._NumberFormat(self.class.attributes(number_format, [
|
125
|
+
:format
|
126
|
+
]))
|
127
|
+
end
|
128
|
+
|
129
|
+
def protection(protection, &block)
|
130
|
+
@styles_t._Protection(self.class.attributes(protection, [
|
131
|
+
:protect
|
132
|
+
]))
|
133
|
+
end
|
134
|
+
|
135
|
+
def style(style, &block)
|
136
|
+
@styles_t._Style(self.class.attributes(style, :i_d), &block)
|
137
|
+
end
|
138
|
+
|
139
|
+
# workbook element markup directives
|
140
|
+
|
141
|
+
def data(data, &block)
|
142
|
+
@worksheets_t._Data(self.class.attributes(data, :type)) {
|
143
|
+
@worksheets_t.__ data.xml_value
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
def cell(cell, &block)
|
148
|
+
@worksheets_t._Cell(self.class.attributes(cell, [
|
149
|
+
:index, :style_i_d, :formula, :h_ref, :merge_across, :merge_down
|
150
|
+
]), &block)
|
151
|
+
end
|
152
|
+
|
153
|
+
def row(row, &block)
|
154
|
+
@worksheets_t._Row(self.class.attributes(row, [
|
155
|
+
:style_i_d, :height, :auto_fit_height, :hidden
|
156
|
+
]), &block)
|
157
|
+
end
|
158
|
+
|
159
|
+
def column(column, &block)
|
160
|
+
@worksheets_t._Column(self.class.attributes(column, [
|
161
|
+
:style_i_d, :width, :auto_fit_width, :hidden
|
162
|
+
]))
|
163
|
+
end
|
164
|
+
|
165
|
+
def worksheet(worksheet, &block)
|
166
|
+
@worksheets_t._Worksheet(self.class.attributes(worksheet, :name)) {
|
167
|
+
@worksheets_t._Table(&block)
|
168
|
+
}
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
data/lib/xmlss/version.rb
CHANGED
data/lib/xmlss/workbook.rb
CHANGED
@@ -1,50 +1,116 @@
|
|
1
|
-
require 'xmlss/
|
2
|
-
require 'xmlss/xml'
|
3
|
-
|
1
|
+
require 'xmlss/undies_writer'
|
4
2
|
require 'xmlss/style/base'
|
5
|
-
require 'xmlss/worksheet'
|
3
|
+
require 'xmlss/element/worksheet'
|
6
4
|
|
7
5
|
module Xmlss
|
8
6
|
class Workbook
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def initialize(opts={}, &build)
|
9
|
+
# (don't pollute workbook scope that the build may run in)
|
10
|
+
|
11
|
+
# apply :data options to workbook scope
|
12
|
+
data = (opts || {})[:data] || {}
|
13
|
+
if (data.keys.map(&:to_s) & self.public_methods.map(&:to_s)).size > 0
|
14
|
+
raise ArgumentError, "data conflicts with template public methods."
|
15
|
+
end
|
16
|
+
metaclass = class << self; self; end
|
17
|
+
data.each {|key, value| metaclass.class_eval { define_method(key){value} }}
|
18
|
+
|
19
|
+
# setup the Undies xml writer with any :output options
|
20
|
+
@__xmlss_undies_writer = UndiesWriter.new((opts || {})[:output] || {})
|
21
|
+
|
22
|
+
# run any instance workbook build given
|
23
|
+
instance_eval(&build) if build
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
@__xmlss_undies_writer.workbook
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_file(path)
|
31
|
+
FileUtils.mkdir_p(File.dirname(path))
|
32
|
+
File.open(path, 'w') { |f| f.write self.to_s }
|
33
|
+
File.exists?(path) ? path : false
|
34
|
+
end
|
35
|
+
|
36
|
+
# Workbook elements API
|
37
|
+
|
38
|
+
def worksheet(*args, &block)
|
39
|
+
Element::Worksheet.new(*args).tap do |elem|
|
40
|
+
@__xmlss_undies_writer.worksheet(elem, &block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def column(*args, &block)
|
45
|
+
Element::Column.new(*args).tap do |elem|
|
46
|
+
@__xmlss_undies_writer.column(elem, &block)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def row(*args, &block)
|
51
|
+
Element::Row.new(*args).tap do |elem|
|
52
|
+
@__xmlss_undies_writer.row(elem, &block)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def cell(*args, &block)
|
57
|
+
Element::Cell.new(*args).tap do |elem|
|
58
|
+
@__xmlss_undies_writer.cell(elem, &block)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def data(*args, &block)
|
63
|
+
Element::Data.new(*args).tap do |elem|
|
64
|
+
@__xmlss_undies_writer.data(elem, &block)
|
65
|
+
end
|
14
66
|
end
|
15
67
|
|
16
|
-
|
68
|
+
# Workbook styles API
|
17
69
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
70
|
+
def style(*args, &block)
|
71
|
+
Style::Base.new(*args).tap do |style|
|
72
|
+
@__xmlss_undies_writer.style(style, &block)
|
73
|
+
end
|
21
74
|
end
|
22
75
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
else
|
27
|
-
ItemSet.new(:styles, set)
|
76
|
+
def alignment(*args, &block)
|
77
|
+
Style::Alignment.new(*args).tap do |style|
|
78
|
+
@__xmlss_undies_writer.alignment(style, &block)
|
28
79
|
end
|
29
80
|
end
|
30
81
|
|
31
|
-
def
|
32
|
-
@
|
33
|
-
|
34
|
-
|
35
|
-
|
82
|
+
def borders(*args, &block)
|
83
|
+
@__xmlss_undies_writer.borders(&block)
|
84
|
+
end
|
85
|
+
|
86
|
+
def border(*args, &block)
|
87
|
+
Style::Border.new(*args).tap do |style|
|
88
|
+
@__xmlss_undies_writer.border(style, &block)
|
36
89
|
end
|
37
90
|
end
|
38
91
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
92
|
+
def font(*args, &block)
|
93
|
+
Style::Font.new(*args).tap do |style|
|
94
|
+
@__xmlss_undies_writer.font(style, &block)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def interior(*args, &block)
|
99
|
+
Style::Interior.new(*args).tap do |style|
|
100
|
+
@__xmlss_undies_writer.interior(style, &block)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def number_format(*args, &block)
|
105
|
+
Style::NumberFormat.new(*args).tap do |style|
|
106
|
+
@__xmlss_undies_writer.number_format(style, &block)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def protection(*args, &block)
|
111
|
+
Style::Protection.new(*args).tap do |style|
|
112
|
+
@__xmlss_undies_writer.protection(style, &block)
|
113
|
+
end
|
48
114
|
end
|
49
115
|
|
50
116
|
end
|
data/lib/xmlss.rb
CHANGED
@@ -1,31 +1,4 @@
|
|
1
|
-
module Xmlss
|
2
|
-
# some helpers
|
3
|
-
class << self
|
1
|
+
module Xmlss; end
|
4
2
|
|
5
|
-
def classify(underscored_string)
|
6
|
-
underscored_string.
|
7
|
-
to_s.downcase.
|
8
|
-
split("_").
|
9
|
-
collect{|part| part.capitalize}.
|
10
|
-
join('')
|
11
|
-
end
|
12
|
-
|
13
|
-
def xmlify(value)
|
14
|
-
if value == true
|
15
|
-
1
|
16
|
-
elsif ["",false].include?(value)
|
17
|
-
# don't include false or empty string values
|
18
|
-
nil
|
19
|
-
else
|
20
|
-
value
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
require 'enumeration'
|
28
|
-
require 'xmlss/xml'
|
29
|
-
require 'xmlss/style/base'
|
30
3
|
require 'xmlss/workbook'
|
31
4
|
|
@@ -1,23 +1,22 @@
|
|
1
1
|
require "assert"
|
2
|
-
require 'xmlss/cell'
|
3
2
|
|
4
|
-
|
3
|
+
require 'xmlss/element/cell'
|
4
|
+
|
5
|
+
module Xmlss::Element
|
5
6
|
class CellTest < Assert::Context
|
6
7
|
desc "Xmlss::Cell"
|
7
|
-
|
8
|
+
before { @c = Cell.new }
|
9
|
+
subject { @c }
|
8
10
|
|
9
|
-
should
|
10
|
-
should have_accessor :formula, :href, :merge_across, :merge_down
|
11
|
+
should be_styled
|
12
|
+
should have_accessor :index, :formula, :href, :merge_across, :merge_down
|
11
13
|
should have_reader :h_ref
|
12
14
|
|
13
|
-
should_have_style(Cell)
|
14
|
-
|
15
15
|
should "set it's defaults" do
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
assert_equal nil, subject.merge_down
|
16
|
+
assert_nil subject.formula
|
17
|
+
assert_nil subject.href
|
18
|
+
assert_nil subject.merge_across
|
19
|
+
assert_nil subject.merge_down
|
21
20
|
end
|
22
21
|
|
23
22
|
should "provide alias for :href" do
|
@@ -63,27 +62,4 @@ module Xmlss
|
|
63
62
|
|
64
63
|
end
|
65
64
|
|
66
|
-
class CellDataTest < Assert::Context
|
67
|
-
desc "when using cell data"
|
68
|
-
subject do
|
69
|
-
Cell.new({
|
70
|
-
:data => Data.new(12, {:type => :number})
|
71
|
-
})
|
72
|
-
end
|
73
|
-
|
74
|
-
should "should build a data object" do
|
75
|
-
assert_kind_of Data, subject.data
|
76
|
-
assert_equal 12, subject.data.value
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
class CellDataXmlTest < CellDataTest
|
82
|
-
desc "for generating XML"
|
83
|
-
|
84
|
-
should have_reader :xml
|
85
|
-
should_build_node
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
65
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
require "assert"
|
2
|
-
require 'xmlss/column'
|
3
2
|
|
4
|
-
|
3
|
+
require 'xmlss/element/column'
|
4
|
+
|
5
|
+
module Xmlss::Element
|
5
6
|
class ColumnTest < Assert::Context
|
6
7
|
desc "Xmlss::Column"
|
7
|
-
|
8
|
+
before { @c = Column.new }
|
9
|
+
subject { @c }
|
8
10
|
|
9
|
-
|
11
|
+
should be_styled
|
10
12
|
should have_accessor :width, :auto_fit_width, :hidden
|
11
13
|
|
12
14
|
should "set it's defaults" do
|
@@ -36,12 +38,4 @@ module Xmlss
|
|
36
38
|
|
37
39
|
end
|
38
40
|
|
39
|
-
class ColumnXmlTest < ColumnTest
|
40
|
-
desc "for generating XML"
|
41
|
-
|
42
|
-
should have_reader :xml
|
43
|
-
should_build_node
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
41
|
end
|
@@ -1,12 +1,24 @@
|
|
1
1
|
require "assert"
|
2
|
-
require '
|
2
|
+
require 'enumeration/assert_macros'
|
3
3
|
|
4
|
-
|
4
|
+
require 'xmlss/element/data'
|
5
|
+
|
6
|
+
module Xmlss::Element
|
5
7
|
class DataTest < Assert::Context
|
8
|
+
include Enumeration::AssertMacros
|
9
|
+
|
6
10
|
desc "Xmlss::Data"
|
7
11
|
subject { Data.new }
|
8
12
|
|
9
|
-
should
|
13
|
+
should have_enum :type, {
|
14
|
+
:number => "Number",
|
15
|
+
:date_time => "DateTime",
|
16
|
+
:boolean => "Boolean",
|
17
|
+
:string => "String",
|
18
|
+
:error => "Error"
|
19
|
+
}
|
20
|
+
|
21
|
+
should have_accessor :value
|
10
22
|
should have_instance_method :xml_value
|
11
23
|
|
12
24
|
should "set it's defaults" do
|
@@ -72,11 +84,4 @@ Should
|
|
72
84
|
|
73
85
|
end
|
74
86
|
|
75
|
-
class XmlDataTest < DataTest
|
76
|
-
desc "for generating XML"
|
77
|
-
|
78
|
-
should have_reader :xml
|
79
|
-
should_build_node
|
80
|
-
end
|
81
|
-
|
82
87
|
end
|
@@ -1,31 +1,20 @@
|
|
1
1
|
require "assert"
|
2
|
-
require 'xmlss/cell'
|
3
|
-
require 'xmlss/row'
|
4
2
|
|
5
|
-
|
3
|
+
require 'xmlss/element/row'
|
4
|
+
|
5
|
+
module Xmlss::Element
|
6
6
|
class RowTest < Assert::Context
|
7
7
|
desc "Xmlss::Row"
|
8
8
|
before { @row = Row.new }
|
9
9
|
subject { @row }
|
10
10
|
|
11
|
-
|
11
|
+
should be_styled
|
12
12
|
should have_accessors :height, :auto_fit_height, :hidden
|
13
|
-
should have_accessor :cells
|
14
13
|
|
15
14
|
should "set it's defaults" do
|
16
|
-
|
15
|
+
assert_nil subject.height
|
17
16
|
assert_equal false, subject.auto_fit_height
|
18
17
|
assert_equal false, subject.hidden
|
19
|
-
assert_equal [], subject.cells
|
20
|
-
end
|
21
|
-
|
22
|
-
should "allow defining a cells at init" do
|
23
|
-
row = Row.new({
|
24
|
-
:cells => [Cell.new]
|
25
|
-
})
|
26
|
-
|
27
|
-
assert_equal 1, row.cells.size
|
28
|
-
assert_kind_of Cell, row.cells.first
|
29
18
|
end
|
30
19
|
|
31
20
|
should "bark when setting non Numeric height" do
|
@@ -48,23 +37,4 @@ module Xmlss
|
|
48
37
|
end
|
49
38
|
end
|
50
39
|
|
51
|
-
class RowCellsTest < RowTest
|
52
|
-
desc "when using cells"
|
53
|
-
before do
|
54
|
-
r = subject.cells << Cell.new
|
55
|
-
end
|
56
|
-
|
57
|
-
should "should build a data object" do
|
58
|
-
assert_equal 1, subject.cells.size
|
59
|
-
assert_kind_of Cell, subject.cells.first
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
class RowXmlTest < RowTest
|
64
|
-
desc "for generating XML"
|
65
|
-
|
66
|
-
should have_reader :xml
|
67
|
-
should_build_node
|
68
|
-
end
|
69
|
-
|
70
40
|
end
|
@@ -1,19 +1,17 @@
|
|
1
1
|
require "assert"
|
2
|
-
require 'xmlss/worksheet'
|
3
2
|
|
4
|
-
|
3
|
+
require 'xmlss/element/worksheet'
|
4
|
+
|
5
|
+
module Xmlss::Element
|
5
6
|
class WorksheetTest < Assert::Context
|
6
7
|
desc "Xmlss::Worksheet"
|
7
8
|
before { @wksht = Worksheet.new('sheet') }
|
8
9
|
subject { @wksht }
|
9
10
|
|
10
|
-
should have_accessor :name
|
11
|
+
should have_accessor :name
|
11
12
|
|
12
13
|
should "set it's defaults" do
|
13
14
|
assert_equal 'sheet', subject.name
|
14
|
-
assert_kind_of Table, subject.table
|
15
|
-
assert_equal [], subject.table.columns
|
16
|
-
assert_equal [], subject.table.rows
|
17
15
|
end
|
18
16
|
|
19
17
|
should "filter name chars" do
|
@@ -31,17 +29,6 @@ module Xmlss
|
|
31
29
|
assert_equal "t[e]st test", ws.name
|
32
30
|
end
|
33
31
|
|
34
|
-
should "allow defining a table at init" do
|
35
|
-
wksht = Worksheet.new('table', {
|
36
|
-
:table => Table.new({
|
37
|
-
:columns => [Column.new]
|
38
|
-
})
|
39
|
-
})
|
40
|
-
|
41
|
-
assert_equal 1, wksht.table.columns.size
|
42
|
-
assert_kind_of Column, wksht.table.columns.first
|
43
|
-
end
|
44
|
-
|
45
32
|
should "bark when no name is given" do
|
46
33
|
assert_raises ArgumentError do
|
47
34
|
Worksheet.new(nil)
|
@@ -51,19 +38,6 @@ module Xmlss
|
|
51
38
|
end
|
52
39
|
end
|
53
40
|
|
54
|
-
should "bark when setting a table to something other" do
|
55
|
-
assert_raises ArgumentError do
|
56
|
-
subject.table = "not a table"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
class WorksheetXmlTest < WorksheetTest
|
63
|
-
desc "for generating XML"
|
64
|
-
|
65
|
-
should have_reader :xml
|
66
|
-
should_build_node
|
67
41
|
end
|
68
42
|
|
69
43
|
end
|
data/test/helper.rb
CHANGED
@@ -4,42 +4,25 @@
|
|
4
4
|
# add root dir to the load path
|
5
5
|
$LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
|
6
6
|
|
7
|
-
require 'xmlss'
|
8
|
-
|
9
7
|
class Assert::Context
|
10
8
|
|
11
9
|
class << self
|
12
10
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
subject.build_node(builder)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
11
|
+
def be_styled
|
12
|
+
called_from = caller.first
|
13
|
+
Assert::Macro.new("have style attributes") do
|
14
|
+
should have_accessor :style_id
|
15
|
+
should have_reader :style_i_d
|
23
16
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
assert_equal({}, xmlthing.send(:build_attributes))
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def should_have_style(klass)
|
32
|
-
should have_accessor :style_id
|
33
|
-
should have_reader :style_i_d
|
34
|
-
|
35
|
-
should "set the style default" do
|
36
|
-
assert_equal nil, subject.style_id
|
37
|
-
end
|
17
|
+
should "set the style default" do
|
18
|
+
assert_equal nil, subject.class.new.style_id
|
19
|
+
end
|
38
20
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
21
|
+
should "provide aliases for style_id" do
|
22
|
+
c = subject.class.new({:style_id => :poo})
|
23
|
+
assert_equal :poo, c.style_id
|
24
|
+
assert_equal :poo, c.style_i_d
|
25
|
+
end
|
43
26
|
end
|
44
27
|
end
|
45
28
|
|