xmlss 0.4.1 → 1.0.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +3 -3
- data/README.rdoc +4 -4
- data/bench/profiler_runner.rb +1 -1
- data/examples/example_workbook.rb +1 -1
- data/examples/simple.rb +18 -1
- data/examples/simple.xml +22 -0
- data/lib/xmlss/element/cell.rb +52 -1
- data/lib/xmlss/element/column.rb +2 -0
- data/lib/xmlss/element/row.rb +2 -0
- data/lib/xmlss/element/worksheet.rb +14 -6
- data/lib/xmlss/element_stack.rb +69 -0
- data/lib/xmlss/style/alignment.rb +2 -0
- data/lib/xmlss/style/base.rb +2 -0
- data/lib/xmlss/style/border.rb +10 -0
- data/lib/xmlss/style/font.rb +2 -0
- data/lib/xmlss/style/interior.rb +2 -0
- data/lib/xmlss/style/number_format.rb +2 -0
- data/lib/xmlss/style/protection.rb +2 -0
- data/lib/xmlss/version.rb +1 -1
- data/lib/xmlss/workbook.rb +75 -58
- data/lib/xmlss/writer.rb +244 -0
- data/test/element/cell_test.rb +60 -1
- data/test/element/column_test.rb +5 -0
- data/test/element/row_test.rb +5 -0
- data/test/element/worksheet_test.rb +9 -4
- data/test/element_stack_test.rb +117 -0
- data/test/style/alignment_test.rb +5 -0
- data/test/style/base_test.rb +5 -0
- data/test/style/border_test.rb +26 -2
- data/test/style/font_test.rb +5 -0
- data/test/style/interior_test.rb +5 -0
- data/test/style/number_format_test.rb +5 -0
- data/test/style/protection_test.rb +6 -1
- data/test/workbook_test.rb +29 -13
- data/test/writer_test.rb +413 -0
- data/xmlss.gemspec +1 -1
- metadata +30 -25
- data/lib/xmlss/element/data.rb +0 -58
- data/lib/xmlss/undies_writer.rb +0 -175
- data/test/element/data_test.rb +0 -67
- data/test/undies_writer_test.rb +0 -372
metadata
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xmlss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 15424055
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
7
9
|
- 0
|
8
|
-
-
|
10
|
+
- rc
|
9
11
|
- 1
|
10
|
-
version: 0.
|
12
|
+
version: 1.0.0.rc.1
|
11
13
|
platform: ruby
|
12
14
|
authors:
|
13
15
|
- Kelly Redding
|
@@ -15,11 +17,10 @@ autorequire:
|
|
15
17
|
bindir: bin
|
16
18
|
cert_chain: []
|
17
19
|
|
18
|
-
date: 2012-
|
20
|
+
date: 2012-03-15 00:00:00 Z
|
19
21
|
dependencies:
|
20
22
|
- !ruby/object:Gem::Dependency
|
21
23
|
type: :development
|
22
|
-
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
25
26
|
requirements:
|
@@ -30,11 +31,11 @@ dependencies:
|
|
30
31
|
- 1
|
31
32
|
- 0
|
32
33
|
version: "1.0"
|
33
|
-
version_requirements: *id001
|
34
34
|
name: bundler
|
35
|
+
version_requirements: *id001
|
36
|
+
prerelease: false
|
35
37
|
- !ruby/object:Gem::Dependency
|
36
38
|
type: :development
|
37
|
-
prerelease: false
|
38
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
@@ -45,26 +46,27 @@ dependencies:
|
|
45
46
|
- 0
|
46
47
|
- 6
|
47
48
|
version: "0.6"
|
48
|
-
version_requirements: *id002
|
49
49
|
name: assert
|
50
|
+
version_requirements: *id002
|
51
|
+
prerelease: false
|
50
52
|
- !ruby/object:Gem::Dependency
|
51
53
|
type: :runtime
|
52
|
-
prerelease: false
|
53
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
55
|
none: false
|
55
56
|
requirements:
|
56
57
|
- - ~>
|
57
58
|
- !ruby/object:Gem::Version
|
58
|
-
hash:
|
59
|
+
hash: 5
|
59
60
|
segments:
|
60
61
|
- 2
|
61
62
|
- 2
|
62
|
-
|
63
|
-
|
63
|
+
- 1
|
64
|
+
version: 2.2.1
|
64
65
|
name: undies
|
66
|
+
version_requirements: *id003
|
67
|
+
prerelease: false
|
65
68
|
- !ruby/object:Gem::Dependency
|
66
69
|
type: :runtime
|
67
|
-
prerelease: false
|
68
70
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
71
|
none: false
|
70
72
|
requirements:
|
@@ -75,8 +77,9 @@ dependencies:
|
|
75
77
|
- 1
|
76
78
|
- 3
|
77
79
|
version: "1.3"
|
78
|
-
version_requirements: *id004
|
79
80
|
name: enumeration
|
81
|
+
version_requirements: *id004
|
82
|
+
prerelease: false
|
80
83
|
description: This gem provides an api for constructing spreadsheet data and then uses that data to generate xml that can be interpreted by MS Excel. The xml conforms to the XML Spreadsheet spec (http://msdn.microsoft.com/en-us/library/aa140066(office.10).aspx).
|
81
84
|
email:
|
82
85
|
- kelly@kelredd.com
|
@@ -106,9 +109,9 @@ files:
|
|
106
109
|
- lib/xmlss.rb
|
107
110
|
- lib/xmlss/element/cell.rb
|
108
111
|
- lib/xmlss/element/column.rb
|
109
|
-
- lib/xmlss/element/data.rb
|
110
112
|
- lib/xmlss/element/row.rb
|
111
113
|
- lib/xmlss/element/worksheet.rb
|
114
|
+
- lib/xmlss/element_stack.rb
|
112
115
|
- lib/xmlss/style/alignment.rb
|
113
116
|
- lib/xmlss/style/base.rb
|
114
117
|
- lib/xmlss/style/border.rb
|
@@ -116,14 +119,14 @@ files:
|
|
116
119
|
- lib/xmlss/style/interior.rb
|
117
120
|
- lib/xmlss/style/number_format.rb
|
118
121
|
- lib/xmlss/style/protection.rb
|
119
|
-
- lib/xmlss/undies_writer.rb
|
120
122
|
- lib/xmlss/version.rb
|
121
123
|
- lib/xmlss/workbook.rb
|
124
|
+
- lib/xmlss/writer.rb
|
122
125
|
- test/element/cell_test.rb
|
123
126
|
- test/element/column_test.rb
|
124
|
-
- test/element/data_test.rb
|
125
127
|
- test/element/row_test.rb
|
126
128
|
- test/element/worksheet_test.rb
|
129
|
+
- test/element_stack_test.rb
|
127
130
|
- test/helper.rb
|
128
131
|
- test/irb.rb
|
129
132
|
- test/style/alignment_test.rb
|
@@ -134,8 +137,8 @@ files:
|
|
134
137
|
- test/style/number_format_test.rb
|
135
138
|
- test/style/protection_test.rb
|
136
139
|
- test/thing.rb
|
137
|
-
- test/undies_writer_test.rb
|
138
140
|
- test/workbook_test.rb
|
141
|
+
- test/writer_test.rb
|
139
142
|
- xmlss.gemspec
|
140
143
|
homepage: http://github.com/kelredd/xmlss
|
141
144
|
licenses: []
|
@@ -157,12 +160,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
157
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
161
|
none: false
|
159
162
|
requirements:
|
160
|
-
- - "
|
163
|
+
- - ">"
|
161
164
|
- !ruby/object:Gem::Version
|
162
|
-
hash:
|
165
|
+
hash: 25
|
163
166
|
segments:
|
164
|
-
-
|
165
|
-
|
167
|
+
- 1
|
168
|
+
- 3
|
169
|
+
- 1
|
170
|
+
version: 1.3.1
|
166
171
|
requirements: []
|
167
172
|
|
168
173
|
rubyforge_project:
|
@@ -173,9 +178,9 @@ summary: Generate spreadsheet docs for MS Excel using XML Spreedsheet
|
|
173
178
|
test_files:
|
174
179
|
- test/element/cell_test.rb
|
175
180
|
- test/element/column_test.rb
|
176
|
-
- test/element/data_test.rb
|
177
181
|
- test/element/row_test.rb
|
178
182
|
- test/element/worksheet_test.rb
|
183
|
+
- test/element_stack_test.rb
|
179
184
|
- test/helper.rb
|
180
185
|
- test/irb.rb
|
181
186
|
- test/style/alignment_test.rb
|
@@ -186,5 +191,5 @@ test_files:
|
|
186
191
|
- test/style/number_format_test.rb
|
187
192
|
- test/style/protection_test.rb
|
188
193
|
- test/thing.rb
|
189
|
-
- test/undies_writer_test.rb
|
190
194
|
- test/workbook_test.rb
|
195
|
+
- test/writer_test.rb
|
data/lib/xmlss/element/data.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'date'
|
2
|
-
require 'enumeration'
|
3
|
-
|
4
|
-
module Xmlss; end
|
5
|
-
module Xmlss::Element
|
6
|
-
class Data
|
7
|
-
|
8
|
-
include Enumeration
|
9
|
-
enum :type, {
|
10
|
-
:number => "Number",
|
11
|
-
:date_time => "DateTime",
|
12
|
-
:boolean => "Boolean",
|
13
|
-
:string => "String",
|
14
|
-
:error => "Error"
|
15
|
-
}
|
16
|
-
|
17
|
-
attr_accessor :value
|
18
|
-
|
19
|
-
def initialize(value="", attrs={})
|
20
|
-
self.value = value
|
21
|
-
self.type = attrs[:type] if attrs[:type]
|
22
|
-
end
|
23
|
-
|
24
|
-
def value=(v)
|
25
|
-
if self.type.nil?
|
26
|
-
self.type = value_type(v)
|
27
|
-
end
|
28
|
-
@value = v
|
29
|
-
end
|
30
|
-
|
31
|
-
def xml_value
|
32
|
-
case self.value
|
33
|
-
when ::Date, ::Time, ::DateTime
|
34
|
-
self.value.strftime("%Y-%m-%dT%H:%M:%S")
|
35
|
-
else
|
36
|
-
self.value.to_s
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def value_type(v)
|
43
|
-
case v
|
44
|
-
when ::Numeric
|
45
|
-
:number
|
46
|
-
when ::Date, ::Time
|
47
|
-
:date_time
|
48
|
-
when ::TrueClass, ::FalseClass
|
49
|
-
:boolean
|
50
|
-
when ::String, ::Symbol
|
51
|
-
:string
|
52
|
-
else
|
53
|
-
:string
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
data/lib/xmlss/undies_writer.rb
DELETED
@@ -1,175 +0,0 @@
|
|
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
|
-
LB = " "
|
11
|
-
|
12
|
-
# The Undies writer is responsible for driving the Undies API to generate
|
13
|
-
# the xmlss xml markup for the workbook.
|
14
|
-
# Because order doesn't matter when defining style and worksheet elements,
|
15
|
-
# the writer has to buffer the style and worksheet markup separately,
|
16
|
-
# then put them together according to Xmlss spec to build the final
|
17
|
-
# workbook markup.
|
18
|
-
|
19
|
-
def self.attributes(thing, *attrs)
|
20
|
-
[*attrs].flatten.inject({}) do |xattrs, a|
|
21
|
-
xattrs.merge(if !(xv = self.coerce(thing.send(a))).nil?
|
22
|
-
{"#{SHEET_NS}:#{self.classify(a)}" => xv.to_s}
|
23
|
-
else
|
24
|
-
{}
|
25
|
-
end)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.classify(underscored_string)
|
30
|
-
underscored_string.
|
31
|
-
to_s.downcase.
|
32
|
-
split("_").
|
33
|
-
collect{|part| part.capitalize}.
|
34
|
-
join('')
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.coerce(value)
|
38
|
-
if value == true
|
39
|
-
1
|
40
|
-
elsif ["",false].include?(value)
|
41
|
-
# don't include false or empty string values
|
42
|
-
nil
|
43
|
-
else
|
44
|
-
value
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
attr_reader :style_markup, :element_markup
|
49
|
-
|
50
|
-
def initialize(output_opts={})
|
51
|
-
@opts = output_opts || {}
|
52
|
-
|
53
|
-
# buffer style markup and create a template to write to it
|
54
|
-
@style_markup = ""
|
55
|
-
styles_out = Undies::Output.new(StringIO.new(@style_markup), @opts.merge({
|
56
|
-
:pp_level => 2
|
57
|
-
}))
|
58
|
-
@styles_t = Undies::Template.new(styles_out)
|
59
|
-
|
60
|
-
# buffer worksheet markup and create a template to write to it
|
61
|
-
@element_markup = ""
|
62
|
-
worksheets_out = Undies::Output.new(StringIO.new(@element_markup), @opts.merge({
|
63
|
-
:pp_level => 1
|
64
|
-
}))
|
65
|
-
@worksheets_t = Undies::Template.new(worksheets_out)
|
66
|
-
end
|
67
|
-
|
68
|
-
def flush
|
69
|
-
Undies::Template.flush(@worksheets_t)
|
70
|
-
Undies::Template.flush(@styles_t)
|
71
|
-
self
|
72
|
-
end
|
73
|
-
|
74
|
-
# return the full workbook markup, combining the buffers to xmlss spec
|
75
|
-
def workbook
|
76
|
-
self.flush
|
77
|
-
"".tap do |markup|
|
78
|
-
Undies::Template.new(Undies::Source.new(Proc.new do
|
79
|
-
__ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
80
|
-
_Workbook(XML_NS => NS_URI, "#{XML_NS}:#{SHEET_NS}" => NS_URI) {
|
81
|
-
_Styles {
|
82
|
-
___ style_markup.to_s.strip
|
83
|
-
}
|
84
|
-
__ element_markup.to_s.strip
|
85
|
-
}
|
86
|
-
end), {
|
87
|
-
:style_markup => @style_markup,
|
88
|
-
:element_markup => @element_markup
|
89
|
-
}, Undies::Output.new(StringIO.new(markup), @opts))
|
90
|
-
end.strip
|
91
|
-
end
|
92
|
-
|
93
|
-
# workbook style markup directives
|
94
|
-
|
95
|
-
def alignment(alignment, &block)
|
96
|
-
@styles_t._Alignment(self.class.attributes(alignment, [
|
97
|
-
:horizontal, :vertical, :wrap_text, :rotate
|
98
|
-
]))
|
99
|
-
end
|
100
|
-
|
101
|
-
def border(border, &block)
|
102
|
-
@styles_t._Border(self.class.attributes(border, [
|
103
|
-
:color, :position, :weight, :line_style
|
104
|
-
]))
|
105
|
-
end
|
106
|
-
|
107
|
-
def borders(&block)
|
108
|
-
@styles_t._Borders(&block)
|
109
|
-
end
|
110
|
-
|
111
|
-
def font(font, &block)
|
112
|
-
@styles_t._Font(self.class.attributes(font, [
|
113
|
-
:bold, :color, :italic, :size, :shadow, :font_name,
|
114
|
-
:strike_through, :underline, :vertical_align
|
115
|
-
]))
|
116
|
-
end
|
117
|
-
|
118
|
-
def interior(interior, &block)
|
119
|
-
@styles_t._Interior(self.class.attributes(interior, [
|
120
|
-
:color, :pattern, :pattern_color
|
121
|
-
]))
|
122
|
-
end
|
123
|
-
|
124
|
-
def number_format(number_format, &block)
|
125
|
-
@styles_t._NumberFormat(self.class.attributes(number_format, [
|
126
|
-
:format
|
127
|
-
]))
|
128
|
-
end
|
129
|
-
|
130
|
-
def protection(protection, &block)
|
131
|
-
@styles_t._Protection(self.class.attributes(protection, [
|
132
|
-
:protect
|
133
|
-
]))
|
134
|
-
end
|
135
|
-
|
136
|
-
def style(style, &block)
|
137
|
-
@styles_t._Style(self.class.attributes(style, :i_d), &block)
|
138
|
-
end
|
139
|
-
|
140
|
-
# workbook element markup directives
|
141
|
-
|
142
|
-
def data(data, &block)
|
143
|
-
@worksheets_t._Data(self.class.attributes(data, :type)) {
|
144
|
-
@worksheets_t.__ Undies::Template.
|
145
|
-
escape_html(data.xml_value).
|
146
|
-
gsub(/(\r|\n)+/, LB)
|
147
|
-
}
|
148
|
-
end
|
149
|
-
|
150
|
-
def cell(cell, &block)
|
151
|
-
@worksheets_t._Cell(self.class.attributes(cell, [
|
152
|
-
:index, :style_i_d, :formula, :h_ref, :merge_across, :merge_down
|
153
|
-
]), &block)
|
154
|
-
end
|
155
|
-
|
156
|
-
def row(row, &block)
|
157
|
-
@worksheets_t._Row(self.class.attributes(row, [
|
158
|
-
:style_i_d, :height, :auto_fit_height, :hidden
|
159
|
-
]), &block)
|
160
|
-
end
|
161
|
-
|
162
|
-
def column(column, &block)
|
163
|
-
@worksheets_t._Column(self.class.attributes(column, [
|
164
|
-
:style_i_d, :width, :auto_fit_width, :hidden
|
165
|
-
]))
|
166
|
-
end
|
167
|
-
|
168
|
-
def worksheet(worksheet, &block)
|
169
|
-
@worksheets_t._Worksheet(self.class.attributes(worksheet, :name)) {
|
170
|
-
@worksheets_t._Table(&block)
|
171
|
-
}
|
172
|
-
end
|
173
|
-
|
174
|
-
end
|
175
|
-
end
|
data/test/element/data_test.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require "assert"
|
2
|
-
require 'enumeration/assert_macros'
|
3
|
-
|
4
|
-
require 'xmlss/element/data'
|
5
|
-
|
6
|
-
module Xmlss::Element
|
7
|
-
class DataTest < Assert::Context
|
8
|
-
include Enumeration::AssertMacros
|
9
|
-
|
10
|
-
desc "Xmlss::Data"
|
11
|
-
subject { Data.new }
|
12
|
-
|
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
|
22
|
-
should have_instance_method :xml_value
|
23
|
-
|
24
|
-
should "set it's defaults" do
|
25
|
-
assert_equal Data.type(:string), subject.type
|
26
|
-
assert_equal "", subject.value
|
27
|
-
end
|
28
|
-
|
29
|
-
should "generate it's xml value" do
|
30
|
-
assert_equal "12", Data.new(12).xml_value
|
31
|
-
assert_equal "string", Data.new("string").xml_value
|
32
|
-
assert_equal "2011-03-01T00:00:00", Data.new(DateTime.parse('2011/03/01')).xml_value
|
33
|
-
assert_equal "2011-03-01T00:00:00", Data.new(Date.parse('2011/03/01')).xml_value
|
34
|
-
time = Time.now
|
35
|
-
assert_equal time.strftime("%Y-%m-%dT%H:%M:%S"), Data.new(time).xml_value
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
class ExplicitDataTest < DataTest
|
41
|
-
desc "when using explicit type"
|
42
|
-
subject do
|
43
|
-
Data.new(12, {:type => :string})
|
44
|
-
end
|
45
|
-
|
46
|
-
should "should ignore the value type" do
|
47
|
-
assert_equal Data.type(:string), subject.type
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
class NoTypeDataTest < DataTest
|
53
|
-
desc "when no type is specified"
|
54
|
-
|
55
|
-
should "cast types for Number, DateTime, Boolean, String" do
|
56
|
-
assert_equal Data.type(:number), Data.new(12).type
|
57
|
-
assert_equal Data.type(:number), Data.new(123.45).type
|
58
|
-
assert_equal Data.type(:date_time), Data.new(Time.now).type
|
59
|
-
assert_equal Data.type(:boolean), Data.new(true).type
|
60
|
-
assert_equal Data.type(:boolean), Data.new(false).type
|
61
|
-
assert_equal Data.type(:string), Data.new("a string").type
|
62
|
-
assert_equal Data.type(:string), Data.new(:symbol).type
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|