roo 1.3.9 → 1.3.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +1 -1
- data/examples/roo_soap_client.rb +53 -0
- data/examples/roo_soap_server.rb +29 -0
- data/examples/write_me.rb +33 -0
- data/lib/roo/google.rb +32 -16
- data/test/bad_excel_date.xls +0 -0
- data/test/test_roo.rb +40 -2
- metadata +17 -13
data/README.markdown
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# README for Roo
|
2
2
|
|
3
|
-
|
3
|
+
Roo is available here and on Rubyforge. You can install the official release with 'gem install roo' or refer to the installation instructions below for the latest development gem.
|
4
4
|
|
5
5
|
|
6
6
|
## Installation
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'soap/rpc/driver'
|
2
|
+
|
3
|
+
def ferien_fuer_region(proxy, region, year=nil)
|
4
|
+
proxy.first_row.upto(proxy.last_row) { |row|
|
5
|
+
if proxy.cell(row, 2) == region
|
6
|
+
jahr = proxy.cell(row,1).to_i
|
7
|
+
if year == nil || jahr == year
|
8
|
+
bis_datum = proxy.cell(row,5)
|
9
|
+
if DateTime.now > bis_datum
|
10
|
+
print '('
|
11
|
+
end
|
12
|
+
print jahr.to_s+" "
|
13
|
+
print proxy.cell(row,2)+" "
|
14
|
+
print proxy.cell(row,3)+" "
|
15
|
+
print proxy.cell(row,4).to_s+" "
|
16
|
+
print bis_datum.to_s+" "
|
17
|
+
print (proxy.cell(row,6) || '')+" "
|
18
|
+
if DateTime.now > bis_datum
|
19
|
+
print ')'
|
20
|
+
end
|
21
|
+
puts
|
22
|
+
end
|
23
|
+
end
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
proxy = SOAP::RPC::Driver.new("http://localhost:12321","spreadsheetserver")
|
28
|
+
proxy.add_method('cell','row','col')
|
29
|
+
proxy.add_method('officeversion')
|
30
|
+
proxy.add_method('last_row')
|
31
|
+
proxy.add_method('last_column')
|
32
|
+
proxy.add_method('first_row')
|
33
|
+
proxy.add_method('first_column')
|
34
|
+
proxy.add_method('sheets')
|
35
|
+
proxy.add_method('set_default_sheet','s')
|
36
|
+
proxy.add_method('ferien_fuer_region', 'region')
|
37
|
+
|
38
|
+
sheets = proxy.sheets
|
39
|
+
proxy.set_default_sheet(sheets.first)
|
40
|
+
|
41
|
+
puts "first row: #{proxy.first_row}"
|
42
|
+
puts "first column: #{proxy.first_column}"
|
43
|
+
puts "last row: #{proxy.last_row}"
|
44
|
+
puts "last column: #{proxy.last_column}"
|
45
|
+
puts "cell: #{proxy.cell('C',8)}"
|
46
|
+
puts "cell: #{proxy.cell('F',12)}"
|
47
|
+
puts "officeversion: #{proxy.officeversion}"
|
48
|
+
puts "Berlin:"
|
49
|
+
|
50
|
+
ferien_fuer_region(proxy, "Berlin")
|
51
|
+
|
52
|
+
|
53
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'roo'
|
3
|
+
require 'soap/rpc/standaloneServer'
|
4
|
+
|
5
|
+
NS = "spreadsheetserver" # name of your service = namespace
|
6
|
+
class Server2 < SOAP::RPC::StandaloneServer
|
7
|
+
|
8
|
+
def on_init
|
9
|
+
spreadsheet = Openoffice.new("./Ferien-de.ods")
|
10
|
+
add_method(spreadsheet, 'cell', 'row', 'col')
|
11
|
+
add_method(spreadsheet, 'officeversion')
|
12
|
+
add_method(spreadsheet, 'first_row')
|
13
|
+
add_method(spreadsheet, 'last_row')
|
14
|
+
add_method(spreadsheet, 'first_column')
|
15
|
+
add_method(spreadsheet, 'last_column')
|
16
|
+
add_method(spreadsheet, 'sheets')
|
17
|
+
#add_method(spreadsheet, 'default_sheet=', 's')
|
18
|
+
# method with '...=' did not work? alias method 'set_default_sheet' created
|
19
|
+
add_method(spreadsheet, 'set_default_sheet', 's')
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
PORT = 12321
|
25
|
+
puts "serving at port #{PORT}"
|
26
|
+
svr = Server2.new('Roo', NS, '0.0.0.0', PORT)
|
27
|
+
|
28
|
+
trap('INT') { svr.shutdown }
|
29
|
+
svr.start
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'roo'
|
3
|
+
|
4
|
+
#-- create a new spreadsheet within your google-spreadsheets and paste
|
5
|
+
#-- the 'key' parameter in the spreadsheet URL
|
6
|
+
MAXTRIES = 1000
|
7
|
+
print "what's your name? "
|
8
|
+
my_name = gets.chomp
|
9
|
+
print "where do you live? "
|
10
|
+
my_location = gets.chomp
|
11
|
+
print "your message? (if left blank, only your name and location will be inserted) "
|
12
|
+
my_message = gets.chomp
|
13
|
+
spreadsheet = Google.new('ptu6bbahNZpY0N0RrxQbWdw')
|
14
|
+
spreadsheet.default_sheet = 'Sheet1'
|
15
|
+
success = false
|
16
|
+
MAXTRIES.times do
|
17
|
+
col = rand(10)+1
|
18
|
+
row = rand(10)+1
|
19
|
+
if spreadsheet.empty?(row,col)
|
20
|
+
if my_message.empty?
|
21
|
+
text = Time.now.to_s+" "+"Greetings from #{my_name} (#{my_location})"
|
22
|
+
else
|
23
|
+
text = Time.now.to_s+" "+"#{my_message} from #{my_name} (#{my_location})"
|
24
|
+
end
|
25
|
+
spreadsheet.set_value(row,col,text)
|
26
|
+
puts "message written to row #{row}, column #{col}"
|
27
|
+
success = true
|
28
|
+
break
|
29
|
+
end
|
30
|
+
puts "Row #{row}, column #{col} already occupied, trying again..."
|
31
|
+
end
|
32
|
+
puts "no empty cell found within #{MAXTRIES} tries" if !success
|
33
|
+
|
data/lib/roo/google.rb
CHANGED
@@ -1,44 +1,64 @@
|
|
1
1
|
require 'gdata/spreadsheet'
|
2
2
|
require 'xml'
|
3
3
|
|
4
|
+
class GoogleHTTPError < RuntimeError; end
|
5
|
+
class GoogleReadError < RuntimeError; end
|
6
|
+
class GoogleWriteError < RuntimeError; end
|
7
|
+
|
4
8
|
# overwrite some methods from the gdata-gem:
|
5
9
|
module GData
|
6
10
|
class Spreadsheet < GData::Base
|
11
|
+
|
12
|
+
def visibility
|
13
|
+
@headers ? "private" : "public"
|
14
|
+
end
|
15
|
+
|
16
|
+
def projection
|
17
|
+
@headers ? "full" : "values"
|
18
|
+
end
|
19
|
+
|
7
20
|
#-- modified
|
8
21
|
def evaluate_cell(cell, sheet_no=1)
|
9
22
|
raise ArgumentError, "invalid cell: #{cell}" unless cell
|
10
23
|
raise ArgumentError, "invalid sheet_no: #{sheet_no}" unless sheet_no >0 and sheet_no.class == Fixnum
|
11
|
-
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}/#{
|
12
|
-
|
24
|
+
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}/#{visibility}/#{projection}/#{cell}"
|
13
25
|
doc = Hpricot(request(path))
|
14
26
|
result = (doc/"content").inner_html
|
15
27
|
end
|
16
28
|
|
17
29
|
#-- new
|
18
30
|
def sheetlist
|
19
|
-
path = "/feeds/worksheets/#{@spreadsheet_id}
|
31
|
+
path = "/feeds/worksheets/#{@spreadsheet_id}/#{visibility}/#{projection}"
|
20
32
|
doc = Hpricot(request(path))
|
21
33
|
result = []
|
22
34
|
(doc/"content").each { |elem|
|
23
35
|
result << elem.inner_html
|
24
36
|
}
|
37
|
+
if result.size == 0
|
38
|
+
if (doc/"h2").inner_html =~ /Error/
|
39
|
+
raise GoogleHTTPError, "#{(doc/'h2').inner_html}: #{(doc/'title').inner_html} [key '#{@spreadsheet_id}']"
|
40
|
+
else
|
41
|
+
raise GoogleReadError, "#{doc} [key '#{@spreadsheet_id}']"
|
42
|
+
end
|
43
|
+
end
|
25
44
|
result
|
26
45
|
end
|
27
46
|
|
28
47
|
#-- new
|
29
48
|
#@@ added sheet_no to definition
|
30
49
|
def save_entry_roo(entry, sheet_no)
|
31
|
-
|
50
|
+
raise GoogleWriteError, "unable to write to public spreadsheets" if visibility == 'public'
|
51
|
+
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}/#{visibility}/#{projection}"
|
32
52
|
post(path, entry)
|
33
53
|
end
|
34
54
|
|
35
55
|
#-- new
|
36
56
|
def entry_roo(formula, row=1, col=1)
|
37
|
-
|
57
|
+
<<-XML
|
38
58
|
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gs='http://schemas.google.com/spreadsheets/2006'>
|
39
59
|
<gs:cell row='#{row}' col='#{col}' inputValue='#{formula}' />
|
40
60
|
</entry>
|
41
|
-
XML
|
61
|
+
XML
|
42
62
|
end
|
43
63
|
|
44
64
|
#-- new
|
@@ -49,13 +69,13 @@ XML
|
|
49
69
|
|
50
70
|
#-- new
|
51
71
|
def get_one_sheet
|
52
|
-
path = "/feeds/cells/#{@spreadsheet_id}/1
|
72
|
+
path = "/feeds/cells/#{@spreadsheet_id}/1/#{visibility}/#{projection}"
|
53
73
|
doc = Hpricot(request(path))
|
54
74
|
end
|
55
75
|
|
56
76
|
#new
|
57
77
|
def oben_unten_links_rechts(sheet_no)
|
58
|
-
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}
|
78
|
+
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}/#{visibility}/#{projection}"
|
59
79
|
doc = Hpricot(request(path))
|
60
80
|
rows = []
|
61
81
|
cols = []
|
@@ -67,7 +87,7 @@ XML
|
|
67
87
|
end
|
68
88
|
|
69
89
|
def fulldoc(sheet_no)
|
70
|
-
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}
|
90
|
+
path = "/feeds/cells/#{@spreadsheet_id}/#{sheet_no}/#{visibility}/#{projection}"
|
71
91
|
doc = Hpricot(request(path))
|
72
92
|
return doc
|
73
93
|
end
|
@@ -90,7 +110,6 @@ class Google < GenericSpreadsheet
|
|
90
110
|
unless password
|
91
111
|
password = ENV['GOOGLE_PASSWORD']
|
92
112
|
end
|
93
|
-
@default_sheet = nil
|
94
113
|
@cell = Hash.new {|h,k| h[k]=Hash.new}
|
95
114
|
@cell_type = Hash.new {|h,k| h[k]=Hash.new}
|
96
115
|
@formula = Hash.new
|
@@ -104,11 +123,8 @@ class Google < GenericSpreadsheet
|
|
104
123
|
@datetime_format = '%d/%m/%Y %H:%M:%S'
|
105
124
|
@time_format = '%H:%M:%S'
|
106
125
|
@gs = GData::Spreadsheet.new(spreadsheetkey)
|
107
|
-
@gs.authenticate(user, password)
|
126
|
+
@gs.authenticate(user, password) unless user.empty? || password.empty?
|
108
127
|
@sheetlist = @gs.sheetlist
|
109
|
-
#-- ----------------------------------------------------------------------
|
110
|
-
#-- TODO: Behandlung von Berechtigungen hier noch einbauen ???
|
111
|
-
#-- ----------------------------------------------------------------------
|
112
128
|
@default_sheet = self.sheets.first
|
113
129
|
end
|
114
130
|
|
@@ -192,7 +208,7 @@ class Google < GenericSpreadsheet
|
|
192
208
|
sheet = @default_sheet unless sheet
|
193
209
|
read_cells(sheet) unless @cells_read[sheet]
|
194
210
|
row,col = normalize(row,col)
|
195
|
-
if @formula[sheet]["#{row},#{col}"]
|
211
|
+
if @formula.size > 0 && @formula[sheet]["#{row},#{col}"]
|
196
212
|
return :formula
|
197
213
|
else
|
198
214
|
@cell_type[sheet]["#{row},#{col}"]
|
@@ -335,7 +351,7 @@ class Google < GenericSpreadsheet
|
|
335
351
|
end
|
336
352
|
|
337
353
|
def determine_datatype(val, numval=nil)
|
338
|
-
if val[0,1] == '='
|
354
|
+
if val.nil? || val[0,1] == '='
|
339
355
|
ty = :formula
|
340
356
|
if numeric?(numval)
|
341
357
|
val = numval.to_f
|
Binary file
|
data/test/test_roo.rb
CHANGED
@@ -158,6 +158,16 @@ class TestRoo < Test::Unit::TestCase
|
|
158
158
|
yield Roo::Spreadsheet.open(key_of(options[:name]) || options[:name]) if GOOGLE && options[:format].include?(:google)
|
159
159
|
end
|
160
160
|
|
161
|
+
def with_public_google_spreadsheet(&block)
|
162
|
+
user = ENV['GOOGLE_MAIL']
|
163
|
+
pass = ENV['GOOGLE_PASSWORD']
|
164
|
+
ENV['GOOGLE_MAIL'] = ''
|
165
|
+
ENV['GOOGLE_PASSWORD'] = ''
|
166
|
+
block.call
|
167
|
+
ENV['GOOGLE_MAIL'] = user
|
168
|
+
ENV['GOOGLE_PASSWORD'] = pass
|
169
|
+
end
|
170
|
+
|
161
171
|
# Using Date.strptime so check that it's using the method
|
162
172
|
# with the value set in date_format
|
163
173
|
def test_date
|
@@ -385,7 +395,7 @@ class TestRoo < Test::Unit::TestCase
|
|
385
395
|
def test_empty_eh
|
386
396
|
with_each_spreadsheet(:name=>'numbers1') do |oo|
|
387
397
|
assert oo.empty?('a',14)
|
388
|
-
assert !
|
398
|
+
assert !oo.empty?('a',15)
|
389
399
|
assert oo.empty?('a',20)
|
390
400
|
end
|
391
401
|
end
|
@@ -1199,6 +1209,7 @@ class TestRoo < Test::Unit::TestCase
|
|
1199
1209
|
|
1200
1210
|
def test_write_google
|
1201
1211
|
# write.me: http://spreadsheets.google.com/ccc?key=ptu6bbahNZpY0N0RrxQbWdw&hl=en_GB
|
1212
|
+
|
1202
1213
|
with_each_spreadsheet(:name=>'write.me', :format=>:google) do |oo|
|
1203
1214
|
oo.set_value(1,1,"hello from the tests")
|
1204
1215
|
assert_equal "hello from the tests", oo.cell(1,1)
|
@@ -1345,7 +1356,7 @@ Sheet 3:
|
|
1345
1356
|
|
1346
1357
|
def test_no_remaining_tmp_files_google
|
1347
1358
|
if GOOGLE
|
1348
|
-
|
1359
|
+
assert_raise(GoogleReadError) {
|
1349
1360
|
oo = Google.new(key_of("no_spreadsheet_file.txt"))
|
1350
1361
|
}
|
1351
1362
|
a=Dir.glob("oo_*")
|
@@ -1780,5 +1791,32 @@ Sheet 3:
|
|
1780
1791
|
assert_equal :date, oo.celltype(1,1)
|
1781
1792
|
end
|
1782
1793
|
end
|
1794
|
+
|
1795
|
+
|
1796
|
+
def test_bad_excel_date
|
1797
|
+
with_each_spreadsheet(:name=>'bad_exceL_date', :format=>:excel) do |oo|
|
1798
|
+
assert_nothing_raised(ArgumentError) {
|
1799
|
+
assert_equal DateTime.new(2006,2,2,10,0,0), oo.cell('a',1)
|
1800
|
+
}
|
1801
|
+
end
|
1802
|
+
end
|
1803
|
+
|
1804
|
+
def test_public_google_doc
|
1805
|
+
with_public_google_spreadsheet do
|
1806
|
+
assert_raise(GoogleHTTPError) { Google.new("foo") }
|
1807
|
+
assert_raise(GoogleReadError) { Google.new(key_of('numbers1'))}
|
1808
|
+
assert_nothing_raised { Google.new("0AncOJVyN5MMMcjZtN0hGbFVPd3N0MFJUVVR1aFEwT3c") } # use spreadsheet key (private)
|
1809
|
+
assert_nothing_raised { Google.new(key_of('write.me')) } # use spreadsheet key (public)
|
1810
|
+
end
|
1811
|
+
end
|
1812
|
+
|
1813
|
+
def test_public_google_doc_write
|
1814
|
+
with_public_google_spreadsheet do
|
1815
|
+
assert_raise(GoogleWriteError) {
|
1816
|
+
oo = Google.new(key_of('write.me'))
|
1817
|
+
oo.set_value(1,1,'test')
|
1818
|
+
}
|
1819
|
+
end
|
1820
|
+
end
|
1783
1821
|
|
1784
1822
|
end # class
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hugh McGowan
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-08-31 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -70,9 +70,10 @@ executables: []
|
|
70
70
|
extensions: []
|
71
71
|
|
72
72
|
extra_rdoc_files:
|
73
|
-
- README.markdown
|
74
73
|
- History.txt
|
74
|
+
- README.markdown
|
75
75
|
files:
|
76
|
+
- lib/roo.rb
|
76
77
|
- lib/roo/excel.rb
|
77
78
|
- lib/roo/excelx.rb
|
78
79
|
- lib/roo/generic_spreadsheet.rb
|
@@ -80,17 +81,17 @@ files:
|
|
80
81
|
- lib/roo/openoffice.rb
|
81
82
|
- lib/roo/roo_rails_helper.rb
|
82
83
|
- lib/roo/version.rb
|
83
|
-
- lib/roo.rb
|
84
84
|
- test/1900_base.xls
|
85
85
|
- test/1904_base.xls
|
86
|
-
- test/bbu.ods
|
87
|
-
- test/bbu.xls
|
88
|
-
- test/bbu.xlsx
|
89
86
|
- test/Bibelbund.csv
|
90
87
|
- test/Bibelbund.ods
|
91
88
|
- test/Bibelbund.xls
|
92
89
|
- test/Bibelbund.xlsx
|
93
90
|
- test/Bibelbund1.ods
|
91
|
+
- test/bad_excel_date.xls
|
92
|
+
- test/bbu.ods
|
93
|
+
- test/bbu.xls
|
94
|
+
- test/bbu.xlsx
|
94
95
|
- test/bode-v1.ods.zip
|
95
96
|
- test/bode-v1.xls.zip
|
96
97
|
- test/boolean.ods
|
@@ -142,8 +143,8 @@ files:
|
|
142
143
|
- test/whitespace.ods
|
143
144
|
- test/whitespace.xls
|
144
145
|
- test/whitespace.xlsx
|
145
|
-
- README.markdown
|
146
146
|
- History.txt
|
147
|
+
- README.markdown
|
147
148
|
has_rdoc: true
|
148
149
|
homepage: http://roo.rubyforge.org
|
149
150
|
licenses: []
|
@@ -152,8 +153,6 @@ post_install_message:
|
|
152
153
|
rdoc_options:
|
153
154
|
- --main
|
154
155
|
- README.markdown
|
155
|
-
- --inline-source
|
156
|
-
- --charset=UTF-8
|
157
156
|
require_paths:
|
158
157
|
- lib
|
159
158
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -171,9 +170,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
170
|
requirements: []
|
172
171
|
|
173
172
|
rubyforge_project: roo
|
174
|
-
rubygems_version: 1.3.
|
173
|
+
rubygems_version: 1.3.5
|
175
174
|
signing_key:
|
176
175
|
specification_version: 3
|
177
176
|
summary: roo
|
178
|
-
test_files:
|
179
|
-
|
177
|
+
test_files:
|
178
|
+
- test/skipped_tests.rb
|
179
|
+
- test/test_helper.rb
|
180
|
+
- test/test_roo.rb
|
181
|
+
- examples/roo_soap_client.rb
|
182
|
+
- examples/roo_soap_server.rb
|
183
|
+
- examples/write_me.rb
|