osheet 0.1.0 → 0.2.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.
Files changed (71) hide show
  1. data/.bundle/config +2 -0
  2. data/.gitignore +6 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.rdoc +103 -61
  6. data/Rakefile +5 -56
  7. data/examples/basic.rb +73 -0
  8. data/examples/formats.rb +366 -0
  9. data/examples/trivial.rb +21 -0
  10. data/lib/osheet/associations.rb +62 -0
  11. data/lib/osheet/cell.rb +44 -10
  12. data/lib/osheet/column.rb +34 -7
  13. data/lib/osheet/format/accounting.rb +21 -0
  14. data/lib/osheet/format/currency.rb +23 -0
  15. data/lib/osheet/format/custom.rb +13 -0
  16. data/lib/osheet/format/datetime.rb +13 -0
  17. data/lib/osheet/format/fraction.rb +33 -0
  18. data/lib/osheet/format/general.rb +9 -0
  19. data/lib/osheet/format/number.rb +13 -0
  20. data/lib/osheet/format/numeric.rb +113 -0
  21. data/lib/osheet/format/percentage.rb +25 -0
  22. data/lib/osheet/format/scientific.rb +25 -0
  23. data/lib/osheet/format/special.rb +28 -0
  24. data/lib/osheet/format/text.rb +11 -0
  25. data/lib/osheet/format.rb +30 -0
  26. data/lib/osheet/row.rb +32 -7
  27. data/lib/osheet/style.rb +65 -0
  28. data/lib/osheet/style_set.rb +39 -0
  29. data/lib/osheet/styled_element.rb +18 -0
  30. data/lib/osheet/template.rb +32 -0
  31. data/lib/osheet/template_set.rb +57 -0
  32. data/lib/osheet/version.rb +1 -11
  33. data/lib/osheet/workbook.rb +32 -16
  34. data/lib/osheet/workbook_element.rb +21 -0
  35. data/lib/osheet/worksheet.rb +18 -20
  36. data/lib/osheet/worksheet_element.rb +15 -0
  37. data/lib/osheet/xmlss_writer/base.rb +42 -0
  38. data/lib/osheet/xmlss_writer/elements.rb +68 -0
  39. data/lib/osheet/xmlss_writer/styles.rb +176 -0
  40. data/lib/osheet/xmlss_writer.rb +1 -0
  41. data/lib/osheet.rb +7 -27
  42. data/osheet.gemspec +26 -0
  43. data/test/cell_test.rb +83 -0
  44. data/test/column_test.rb +81 -0
  45. data/test/env.rb +9 -0
  46. data/test/format/accounting_test.rb +158 -0
  47. data/test/format/currency_test.rb +158 -0
  48. data/test/format/custom_test.rb +22 -0
  49. data/test/format/datetime_test.rb +22 -0
  50. data/test/format/fraction_test.rb +84 -0
  51. data/test/format/general_test.rb +21 -0
  52. data/test/format/number_test.rb +93 -0
  53. data/test/format/percentage_test.rb +116 -0
  54. data/test/format/scientific_test.rb +116 -0
  55. data/test/format/special_test.rb +51 -0
  56. data/test/format/text_test.rb +18 -0
  57. data/test/format_test.rb +35 -0
  58. data/test/helper.rb +101 -0
  59. data/test/osheet_test.rb +14 -0
  60. data/test/row_test.rb +78 -0
  61. data/test/style_set_test.rb +50 -0
  62. data/test/style_test.rb +92 -0
  63. data/test/template_set_test.rb +76 -0
  64. data/test/template_test.rb +63 -0
  65. data/test/workbook_test.rb +142 -0
  66. data/test/worksheet_test.rb +77 -0
  67. data/test/xmlss_writer/base_test.rb +92 -0
  68. data/test/xmlss_writer/elements_test.rb +168 -0
  69. data/test/xmlss_writer/styles_test.rb +253 -0
  70. metadata +141 -30
  71. data/lib/osheet/base.rb +0 -95
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_DISABLE_SHARED_GEMS: "1"
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ /pkg/
2
+ /doc/
3
+ /coverage/
4
+ *.log
5
+ /tmp
6
+ /examples/*.xls
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in osheet.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,33 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ osheet (0.1.0)
5
+ enumeration (~> 1.1.0)
6
+ xmlss (~> 0.0.2)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ enumeration (1.1.0)
12
+ json (1.5.1)
13
+ kelredd-useful (0.4.1)
14
+ json
15
+ leftright (0.9.0)
16
+ nokogiri (1.4.4)
17
+ shoulda (2.11.3)
18
+ test-belt (0.2.1)
19
+ kelredd-useful (~> 0.4.0)
20
+ leftright (~> 0.9.0)
21
+ shoulda (~> 2.11)
22
+ xmlss (0.0.2)
23
+ nokogiri (~> 1.4.0)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ bundler (~> 1.0)
30
+ enumeration (~> 1.1.0)
31
+ osheet!
32
+ test-belt (= 0.2.1)
33
+ xmlss (~> 0.0.2)
data/README.rdoc CHANGED
@@ -9,72 +9,114 @@ Pronounced 'oh-sheeeeeet!' - this gem is a DSL wrapper to the spreadsheet gem th
9
9
 
10
10
  $ gem install osheet
11
11
 
12
- == Basic Usage
12
+ == Basic Example
13
+ fields = ['Sex', 'Age', 'Height', 'Weight']
14
+ data = {
15
+ 'Tom' => ['M', 52, "6'2\"", '220 lbs.'],
16
+ 'Dick' => ['M', 33, "6'5\"", '243 lbs.'],
17
+ 'Sally' => ['F', 29, "5'3\"", '132 lbs.']
18
+ }
19
+
20
+ # this will dump the above data to a single-sheet workbook w/ no styles
13
21
 
14
22
  require 'osheet'
15
-
16
- Osheet::Workbook do |wb|
17
- wb.worksheet "Users" do |sheet|
18
- sheet.column
19
- sheet.column
20
- sheet.column
21
-
22
- sheet.row do |r|
23
- r.cell "Characters on \"Friends\"", :colspan => 3
24
- end
25
- sheet.row do |r|
26
- r.cell "man, that show was awesome...", :colspan => 3
27
- end
28
23
 
29
- sheet.row do |r|
30
- r.cell "", :colspan => 1
31
- r.cell 'only concern yourself with these columns', :colspan => 2
32
- end
33
-
34
- sheet.row do |r|
35
- r.cell "id"
36
- r.cell "name"
37
- r.cell "description"
38
- end
39
-
40
- sheet.row do |r|
41
- r.cell 1
42
- r.cell "Ross"
43
- r.cell "the nerdy one, brother of Monica, dated Rachel, likes impregnating women, loves Rachel"
44
- end
45
-
46
- sheet.row do |r|
47
- r.cell 2
48
- r.cell "Rachel"
49
- r.cell "the hot one, dated and impregnated by Ross, generally spoiled"
50
- end
51
-
52
- sheet.row do |r|
53
- r.cell 3
54
- r.cell "Chandler"
55
- r.cell "the responsible one, husband of Monica, insecure about everything"
56
- end
57
-
58
- sheet.row do |r|
59
- r.cell 4
60
- r.cell "Monica"
61
- r.cell "the smart one, wife of Chandler, sister of Ross, OCD about cleaning and controlling"
62
- end
63
-
64
- sheet.row do |r|
65
- r.cell 5
66
- r.cell "Joey"
67
- r.cell "the man-whore one, best-friend of Chandler, generally dumb, can't sustain sitcom on own"
24
+ wb = Osheet::Workbook.new {
25
+ worksheet {
26
+ name "Stats: #{fields.join(', ')}"
27
+
28
+ column {
29
+ width 200
30
+ meta(
31
+ :label => "Name"
32
+ )
33
+ }
34
+ fields.each_with_index do |f, i|
35
+ column {
36
+ width 80
37
+ meta(
38
+ :label => f.to_s,
39
+ :index => i
40
+ )
41
+ }
68
42
  end
69
-
70
- sheet.row do |r|
71
- r.cell 6
72
- r.cell "Phoebe"
73
- r.cell "the crazy one, ex-roomate of Rachel, blond, free, weird, yet awesome"
43
+
44
+ row { # title row
45
+ cell {
46
+ colspan columns.count
47
+ data worksheet.name
48
+ }
49
+ }
50
+ row { # empty row
51
+ cell {
52
+ colspan columns.count
53
+ data ''
54
+ }
55
+ }
56
+ row { # header row
57
+ columns.each do |column|
58
+ cell {
59
+ data column.meta[:label]
60
+ }
61
+ end
62
+ }
63
+
64
+ data.each do |name, stats|
65
+ row { # data row
66
+ cell {
67
+ data name
68
+ }
69
+ stats.each do |stat|
70
+ cell {
71
+ data stat
72
+ }
73
+ end
74
+ }
74
75
  end
75
-
76
- end
77
- end
76
+ } # worksheet
77
+ } # workbook
78
+
79
+ file = wb.to_file('stats') # => <spreadsheet written to ./stats.xls>
80
+
81
+ == API
82
+
83
+ These classes define how a spreadsheet is constructed.
84
+ === Osheet::Workbook
85
+ * *style(selector, &block)*: define a style for the workbook
86
+ * *template(for, named, &block)*: define a named template for the workbook
87
+ * *worksheet(&block)*: define a worksheet for the workbook
88
+ # TODO: *use(module)*
89
+ # TODO: *use(file)*
90
+
91
+ === Osheet::Worksheet
92
+ * *name(value)*: set the name for this worksheet
93
+ * *column(&block)*: define a column for the worksheet
94
+ * *column(:template, *args): define a templated column for the worksheet
95
+ * *row(&block)*: define a row for the worksheet
96
+ * *row(:template, *args): define a templated row for the worksheet
97
+
98
+ === Xmlss::Column
99
+ * *style_class(value)*: (string) the styles selectors should match against
100
+ * *width(value)*: (numeric) set the explicit width for the column
101
+ * *auto_fit_width(value)*: (bool) set whether the column should auto fit it's width, default: false
102
+ * *hidden(value)*: (bool) set whether the column is hidden, default: false
103
+ * *meta(data)*: (anything) a generic way to associate meta-data with the column
104
+
105
+ === Xmlss::Row
106
+ * *style_class(value)*: (string) the styles selectors should match against
107
+ * *height(value)*: (numeric) set the explicit width for the column
108
+ * *auto_fit_height(value)*: (bool) set whether the row should auto fit it's height, default: false
109
+ * *hidden(value)*: (bool) set whether the row is hidden, default: false
110
+ * *cell(&block)*: define a cell for the row
111
+ * *cell(:template, *args): define a templated cell for the row
112
+
113
+ === Xmlss::Cell
114
+ * *style_class(value)*: (string) the styles selectors should match against
115
+ * *data(value)*: (anything), data the cell should contain. if not a string, numeric, or date, will cast data to sting using 'inspect'.
116
+ * format(value)*: (anything), optional, custom formatting string for the data (see driver documentation for options)
117
+ * *colspan(value)*: (int) the number of columns (l to r) the cell should occupy, default: 1
118
+ * *rowspan(value)*: (int) the number of rows (t to b) the cell should occupy, default: 1
119
+ * *href(value)*: (string) set the href the data should link to
78
120
 
79
121
  == Links
80
122
 
data/Rakefile CHANGED
@@ -1,58 +1,7 @@
1
- require 'rubygems'
2
- require 'rake/gempackagetask'
3
- require 'rake/testtask'
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
4
3
 
5
- require 'lib/osheet/version'
4
+ require 'test_belt/rake_tasks'
5
+ TestBelt::RakeTasks.for :test
6
6
 
7
- spec = Gem::Specification.new do |s|
8
- s.name = 'osheet'
9
- s.version = Osheet::Version.to_s
10
- s.has_rdoc = true
11
- s.extra_rdoc_files = %w(README.rdoc)
12
- s.rdoc_options = %w(--main README.rdoc)
13
- s.summary = "A DSL for generating spreadsheets that doesn't totally suck - pronounced 'Oh sheeeeeet!'"
14
- s.author = 'Kelly Redding'
15
- s.email = 'kelly@kelredd.com'
16
- s.homepage = 'http://github.com/kelredd/osheet'
17
- s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib}/**/*")
18
- # s.executables = ['osheet']
19
-
20
- s.add_development_dependency("shoulda", [">= 2.10.0"])
21
- s.add_development_dependency("kelredd-useful", [">= 0.3.0"])
22
-
23
- s.add_dependency("spreadsheet", [">= 0.6.4"])
24
- end
25
-
26
- Rake::GemPackageTask.new(spec) do |pkg|
27
- pkg.gem_spec = spec
28
- end
29
-
30
- Rake::TestTask.new do |t|
31
- t.libs << 'test'
32
- t.test_files = FileList["test/**/*_test.rb"]
33
- t.verbose = true
34
- end
35
-
36
- begin
37
- require 'rcov/rcovtask'
38
-
39
- Rcov::RcovTask.new(:coverage) do |t|
40
- t.libs = ['test']
41
- t.test_files = FileList["test/**/*_test.rb"]
42
- t.verbose = true
43
- t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby']
44
- end
45
-
46
- task :default => :coverage
47
-
48
- rescue LoadError
49
- warn "\n**** Install rcov (sudo gem install relevance-rcov) to get coverage stats ****\n"
50
- task :default => :test
51
- end
52
-
53
- desc 'Generate the gemspec to serve this gem'
54
- task :gemspec do
55
- file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
56
- File.open(file, 'w') {|f| f << spec.to_ruby }
57
- puts "Created gemspec: #{file}"
58
- end
7
+ task :default => :build
data/examples/basic.rb ADDED
@@ -0,0 +1,73 @@
1
+ # To run:
2
+ # $ bundle install
3
+ # $ bundle exec ruby examples/basic.rb
4
+ # $ open examples/basic.xls
5
+
6
+ require 'rubygems'
7
+ require 'osheet'
8
+
9
+ fields = ['Sex', 'Age', 'Height', 'Weight']
10
+ data = {
11
+ 'Tom' => ['M', 52, "6'2\"", '220 lbs.'],
12
+ 'Dick' => ['M', 33, "6'5\"", '243 lbs.'],
13
+ 'Sally' => ['F', 29, "5'3\"", '132 lbs.']
14
+ }
15
+
16
+ # this will dump the above data to a single-sheet workbook w/ no styles
17
+
18
+
19
+ Osheet::Workbook.new {
20
+ title "basic"
21
+ worksheet {
22
+ name "Stats: #{fields.join(', ')}"
23
+
24
+ column {
25
+ width 200
26
+ meta(
27
+ :label => "Name"
28
+ )
29
+ }
30
+ fields.each_with_index do |f, i|
31
+ column {
32
+ width 80
33
+ meta(
34
+ :label => f.to_s,
35
+ :index => i
36
+ )
37
+ }
38
+ end
39
+
40
+ row { # title row
41
+ cell {
42
+ colspan columns.count
43
+ data worksheet.name
44
+ }
45
+ }
46
+ row { # empty row
47
+ cell {
48
+ colspan columns.count
49
+ data ''
50
+ }
51
+ }
52
+ row { # header row
53
+ columns.each do |column|
54
+ cell {
55
+ data column.meta[:label]
56
+ }
57
+ end
58
+ }
59
+
60
+ data.each do |name, stats|
61
+ row { # data row
62
+ cell {
63
+ data name
64
+ }
65
+ stats.each do |stat|
66
+ cell {
67
+ data stat
68
+ }
69
+ end
70
+ }
71
+ end
72
+ }
73
+ }.to_file('examples/basic.xls')