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.
@@ -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