osheet 0.9.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,48 +3,79 @@ module Osheet::XmlssWriter::Styles
3
3
 
4
4
  protected
5
5
 
6
- def style_id(style_class, oformat=nil)
7
- oformat ||= Osheet::Format.new(:general)
8
- (xmlss_style = style(style_class, oformat)).nil? ? '' : xmlss_style.id
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
- xmlss_style = @styles.find{|style| style.id == key}
15
- if !key.empty? && xmlss_style.nil?
16
- settings = style_settings(key)
17
- @styles << (xmlss_style = ::Xmlss::Style::Base.new(key) {
18
- if settings.has_key?(:align) && !settings[:align].empty?
19
- alignment(settings[:align])
20
- end
21
- if settings.has_key?(:font) && !settings[:font].empty?
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
- xmlss_style
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
- @ostyles.for(key).inject({}) do |style_settings, ostyle|
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@kelredd.com"]
11
- s.homepage = "http://github.com/kelredd/osheet"
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.2"])
23
- s.add_dependency("xmlss", ["~> 0.2"])
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 :workbook, :styles
12
- should have_writer :workbook
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::WorkbookTest < XmlssWriter::BaseTest
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.workbook = @workbook
27
+ subject.oworkbook = @workbook
28
28
  end
29
29
  assert_raises ArgumentError do
30
- subject.workbook = "poo"
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
- assert_nothing_raised do
46
- subject.workbook = @workbook
47
- end
48
- assert_kind_of ::Xmlss::Workbook, subject.workbook
49
- assert_equal @workbook.worksheets.size, subject.workbook.worksheets.size
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::ToDataTest < Assert::Context
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::WorksheetTest < XmlssWriter::ElementsTest
15
- desc "when writing a worksheet"
16
+ class XmlssWriter::CellTests < XmlssWriter::ElementsTest
17
+ desc "when writing a cell"
16
18
  before do
17
- @worksheet = Worksheet.new {
18
- name "testsheet2"
19
- column { width 100 }
20
- row { height 50 }
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 worksheet" do
25
- xmlss_worksheet = subject.send(:worksheet, @worksheet)
26
- assert_kind_of ::Xmlss::Worksheet, xmlss_worksheet
27
- assert_equal @worksheet.attributes[:name], xmlss_worksheet.name
28
- assert_kind_of ::Xmlss::Table, xmlss_worksheet.table
29
- assert_equal @worksheet.columns.size, xmlss_worksheet.table.columns.size
30
- assert_equal @worksheet.rows.size, xmlss_worksheet.table.rows.size
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 "filter invalid worksheet names" do
34
- { 'valid name' => 'valid name',
35
- 'valid 2' => 'valid 2',
36
- 'invalid :' => 'invalid ',
37
- 'invalid ;' => 'invalid ',
38
- 'invalid *' => 'invalid ',
39
- 'invalid /' => 'invalid ',
40
- 'invalid \\' => 'invalid ',
41
- '[invalid]' => "invalid]"
42
- }.each do |k,v|
43
- assert_equal v, subject.send(:worksheet, Worksheet.new { name k}).name
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::ColumnTest < XmlssWriter::ElementsTest
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.styles.size
74
- assert_kind_of ::Xmlss::Style::Base, subject.styles.first
75
- assert_equal @xmlss_column.style_id, subject.styles.first.id
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 "create an Xmlss row" do
106
- assert_kind_of ::Xmlss::Row, @xmlss_row
107
- assert_equal @row.attributes[:height], @xmlss_row.height
108
- assert_equal @row.attributes[:autofit], @xmlss_row.auto_fit_height
109
- assert_equal @row.attributes[:hidden], @xmlss_row.hidden
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::CellTest < XmlssWriter::ElementsTest
125
- desc "when writing a cell"
133
+ class XmlssWriter::WorksheetTests < XmlssWriter::ElementsTest
134
+ desc "when writing a worksheet"
126
135
  before do
127
- @cell = Osheet::Cell.new do
128
- style_class "awesome thing"
129
- data 100
130
- format :number
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 cell with appropriate data" do
152
- assert_kind_of ::Xmlss::Cell, @xmlss_cell
153
- assert_kind_of ::Xmlss::Data, @xmlss_cell.data
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 "handle rowspan and colspan" do
162
- assert_equal 1, @xmlss_cell.merge_down
163
- assert_equal 4, @xmlss_cell.merge_across
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 "style an Xmlss cell" do
167
- assert_equal ".awesome.thing..number_none_0_nocomma_black", @xmlss_cell.style_id
168
- assert_equal ".awesome.thing..number_none_0_nocomma_black", subject.styles.first.id
169
- assert_equal '0', subject.styles.first.number_format.format
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