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.
Files changed (41) hide show
  1. data/Gemfile.lock +3 -3
  2. data/README.rdoc +4 -4
  3. data/bench/profiler_runner.rb +1 -1
  4. data/examples/example_workbook.rb +1 -1
  5. data/examples/simple.rb +18 -1
  6. data/examples/simple.xml +22 -0
  7. data/lib/xmlss/element/cell.rb +52 -1
  8. data/lib/xmlss/element/column.rb +2 -0
  9. data/lib/xmlss/element/row.rb +2 -0
  10. data/lib/xmlss/element/worksheet.rb +14 -6
  11. data/lib/xmlss/element_stack.rb +69 -0
  12. data/lib/xmlss/style/alignment.rb +2 -0
  13. data/lib/xmlss/style/base.rb +2 -0
  14. data/lib/xmlss/style/border.rb +10 -0
  15. data/lib/xmlss/style/font.rb +2 -0
  16. data/lib/xmlss/style/interior.rb +2 -0
  17. data/lib/xmlss/style/number_format.rb +2 -0
  18. data/lib/xmlss/style/protection.rb +2 -0
  19. data/lib/xmlss/version.rb +1 -1
  20. data/lib/xmlss/workbook.rb +75 -58
  21. data/lib/xmlss/writer.rb +244 -0
  22. data/test/element/cell_test.rb +60 -1
  23. data/test/element/column_test.rb +5 -0
  24. data/test/element/row_test.rb +5 -0
  25. data/test/element/worksheet_test.rb +9 -4
  26. data/test/element_stack_test.rb +117 -0
  27. data/test/style/alignment_test.rb +5 -0
  28. data/test/style/base_test.rb +5 -0
  29. data/test/style/border_test.rb +26 -2
  30. data/test/style/font_test.rb +5 -0
  31. data/test/style/interior_test.rb +5 -0
  32. data/test/style/number_format_test.rb +5 -0
  33. data/test/style/protection_test.rb +6 -1
  34. data/test/workbook_test.rb +29 -13
  35. data/test/writer_test.rb +413 -0
  36. data/xmlss.gemspec +1 -1
  37. metadata +30 -25
  38. data/lib/xmlss/element/data.rb +0 -58
  39. data/lib/xmlss/undies_writer.rb +0 -175
  40. data/test/element/data_test.rb +0 -67
  41. 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: 13
5
- prerelease:
4
+ hash: 15424055
5
+ prerelease: 6
6
6
  segments:
7
+ - 1
8
+ - 0
7
9
  - 0
8
- - 4
10
+ - rc
9
11
  - 1
10
- version: 0.4.1
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-02-02 00:00:00 Z
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: 7
59
+ hash: 5
59
60
  segments:
60
61
  - 2
61
62
  - 2
62
- version: "2.2"
63
- version_requirements: *id003
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: 3
165
+ hash: 25
163
166
  segments:
164
- - 0
165
- version: "0"
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
@@ -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
@@ -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
@@ -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