cdo 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/gemspec +1 -1
- data/lib/cdo.rb +58 -20
- data/test/test_cdo.rb +58 -0
- metadata +2 -2
data/gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
|
3
3
|
|
4
4
|
spec = Gem::Specification.new do |s|
|
5
5
|
s.name = "cdo"
|
6
|
-
s.version = '1.2.
|
6
|
+
s.version = '1.2.1'
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.files = ["lib/cdo.rb"] + ["gemspec","COPYING","README.rdoc","ChangeLog"]
|
9
9
|
s.test_file = "test/test_cdo.rb"
|
data/lib/cdo.rb
CHANGED
@@ -17,7 +17,7 @@ require 'open3'
|
|
17
17
|
# CDO calling mechnism
|
18
18
|
module Cdo
|
19
19
|
|
20
|
-
VERSION = "1.2.
|
20
|
+
VERSION = "1.2.1"
|
21
21
|
|
22
22
|
State = {
|
23
23
|
:debug => false,
|
@@ -73,39 +73,63 @@ module Cdo
|
|
73
73
|
else
|
74
74
|
help[(help.index("Operators:")+1)..help.index(help.find {|v| v =~ /CDO version/}) - 2].join(' ').split
|
75
75
|
end
|
76
|
+
end
|
76
77
|
|
77
|
-
|
78
|
+
def Cdo.hasError(cmd,retvals)
|
79
|
+
if (State[:debug])
|
80
|
+
puts("RETURNCODE: #{retvals[:returncode]}")
|
81
|
+
end
|
82
|
+
if ( 0 != retvals[:returncode] )
|
83
|
+
puts("Error in calling:")
|
84
|
+
puts(">>> "+cmd+"<<<")
|
85
|
+
puts(retvals[:stderr])
|
86
|
+
return true
|
87
|
+
else
|
88
|
+
return false
|
89
|
+
end
|
78
90
|
end
|
91
|
+
|
79
92
|
def Cdo.call(cmd)
|
80
93
|
if (State[:debug])
|
81
94
|
puts '# DEBUG ====================================================================='
|
82
95
|
puts cmd
|
83
96
|
puts '# DEBUG ====================================================================='
|
84
|
-
puts IO.popen(cmd).read
|
85
|
-
else
|
86
|
-
system(cmd + ' 1>/dev/null 2>&1 ')
|
87
97
|
end
|
98
|
+
stdin, stdout, stderr, wait_thr = Open3.popen3(cmd)
|
99
|
+
|
100
|
+
{
|
101
|
+
:stdout => stdout.read,
|
102
|
+
:stderr => stderr.read,
|
103
|
+
:returncode => wait_thr.value.exitstatus
|
104
|
+
}
|
88
105
|
end
|
89
|
-
def Cdo.run(cmd,ofile='',options='',returnCdf=false,force=nil,returnArray=nil)
|
106
|
+
def Cdo.run(cmd,ofile='',options='',returnCdf=false,force=nil,returnArray=nil,returnMaArray=nil)
|
90
107
|
cmd = "#{@@CDO} -O #{options} #{cmd} "
|
91
108
|
case ofile
|
92
109
|
when $stdout
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
110
|
+
retvals = Cdo.call(cmd)
|
111
|
+
unless hasError(cmd,retvals)
|
112
|
+
return retvals[:stdout].split($/).map {|l| l.chomp.strip}
|
113
|
+
else
|
114
|
+
raise ArgumentError,"CDO did NOT run successfully!"
|
115
|
+
end
|
97
116
|
else
|
98
117
|
force = State[:forceOutput] if force.nil?
|
99
118
|
if force or not File.exists?(ofile.to_s)
|
100
119
|
ofile = MyTempfile.path if ofile.nil?
|
101
120
|
cmd << "#{ofile}"
|
102
|
-
call(cmd)
|
121
|
+
retvals = call(cmd)
|
122
|
+
if hasError(cmd,retvals)
|
123
|
+
raise ArgumentError,"CDO did NOT run successfully!"
|
124
|
+
end
|
103
125
|
else
|
104
126
|
warn "Use existing file '#{ofile}'" if Cdo.debug
|
105
127
|
end
|
106
128
|
end
|
107
129
|
if not returnArray.nil?
|
108
130
|
Cdo.readArray(ofile,returnArray)
|
131
|
+
elsif not returnMaArray.nil?
|
132
|
+
Cdo.readMaArray(ofile,returnMaArray)
|
109
133
|
elsif returnCdf or State[:returnCdf]
|
110
134
|
Cdo.readCdf(ofile)
|
111
135
|
else
|
@@ -130,15 +154,15 @@ module Cdo
|
|
130
154
|
if @@outputOperatorsPattern.match(sym)
|
131
155
|
run(" -#{sym.to_s}#{opts} #{io[:input]} ",$stdout)
|
132
156
|
else
|
133
|
-
run(" -#{sym.to_s}#{opts} #{io[:input]} ",io[:output],io[:options],io[:returnCdf],io[:force],io[:returnArray])
|
157
|
+
run(" -#{sym.to_s}#{opts} #{io[:input]} ",io[:output],io[:options],io[:returnCdf],io[:force],io[:returnArray],io[:returnMaArray])
|
134
158
|
end
|
135
159
|
else
|
136
|
-
|
160
|
+
raise ArgumentError,"Operator #{sym.to_s} not found"
|
137
161
|
end
|
138
162
|
end
|
139
163
|
def Cdo.loadCdf
|
140
164
|
begin
|
141
|
-
require "numru/
|
165
|
+
require "numru/netcdf_miss"
|
142
166
|
include NumRu
|
143
167
|
rescue LoadError
|
144
168
|
warn "Could not load ruby's netcdf bindings. Please install it."
|
@@ -244,16 +268,30 @@ module Cdo
|
|
244
268
|
# return the data array
|
245
269
|
filehandle.var(varname).get
|
246
270
|
else
|
247
|
-
|
248
|
-
raise ArgumentError
|
271
|
+
raise ArgumentError, "Cannot find variable '#{varname}'"
|
249
272
|
end
|
250
273
|
end
|
251
274
|
|
252
|
-
def Cdo.
|
253
|
-
|
275
|
+
def Cdo.readMaArray(iFile,varname)
|
276
|
+
filehandle = Cdo.readCdf(iFile)
|
277
|
+
if filehandle.var_names.include?(varname)
|
278
|
+
# return the data array
|
279
|
+
filehandle.var(varname).get_with_miss
|
280
|
+
else
|
281
|
+
raise ArgumentError,"Cannot find variable '#{varname}'"
|
282
|
+
end
|
254
283
|
end
|
255
|
-
|
256
|
-
|
284
|
+
def Cdo.help(operator=nil)
|
285
|
+
if operator.nil?
|
286
|
+
puts Cdo.call([@@CDO,'-h'].join(' '))[:stderr]
|
287
|
+
else
|
288
|
+
operator = operator.to_s unless String == operator.class
|
289
|
+
if Cdo.operators.include?(operator)
|
290
|
+
puts Cdo.call([@@CDO,'-h',operator].join(' '))[:stdout]
|
291
|
+
else
|
292
|
+
puts "Unknown operator #{operator}"
|
293
|
+
end
|
294
|
+
end
|
257
295
|
end
|
258
296
|
end
|
259
297
|
|
data/test/test_cdo.rb
CHANGED
@@ -232,7 +232,55 @@ class TestCdo < Test::Unit::TestCase
|
|
232
232
|
pressure = Cdo.stdatm(0,1000,:options => '-f nc -b F64',:returnArray => 'P')
|
233
233
|
assert_equal("1013.25 898.543456035875",pressure.flatten.to_a.join(' '))
|
234
234
|
end
|
235
|
+
def test_returnMaArray
|
236
|
+
Cdo.debug = true
|
237
|
+
topo = Cdo.topo(:options => '-f nc',:returnMaArray => 'topo')
|
238
|
+
assert_equal(-1890.0,topo.mean.round)
|
239
|
+
bathy = Cdo.setrtomiss(0,10000,
|
240
|
+
:input => Cdo.topo(:options => '-f nc'),:returnMaArray => 'topo')
|
241
|
+
assert_equal(-3386.0,bathy.mean.round)
|
242
|
+
oro = Cdo.setrtomiss(-10000,0,
|
243
|
+
:input => Cdo.topo(:options => '-f nc'),:returnMaArray => 'topo')
|
244
|
+
assert_equal(1142.0,oro.mean.round)
|
245
|
+
bathy = Cdo.remapnn('r2x2',:input => Cdo.topo(:options => '-f nc'), :returnMaArray => 'topo')
|
246
|
+
assert_equal(-4298.0,bathy[0,0])
|
247
|
+
assert_equal(-2669.0,bathy[1,0])
|
248
|
+
ta = Cdo.remapnn('r2x2',:input => Cdo.topo(:options => '-f nc'))
|
249
|
+
tb = Cdo.subc(-2669.0,:input => ta)
|
250
|
+
withMask = Cdo.div(:input => ta+" "+tb,:returnMaArray => 'topo')
|
251
|
+
assert(-8.0e+33 > withMask[1,0])
|
252
|
+
assert(0 < withMask[0,0])
|
253
|
+
assert(0 < withMask[0,1])
|
254
|
+
assert(0 < withMask[1,1])
|
255
|
+
end
|
235
256
|
|
257
|
+
def test_errorException
|
258
|
+
Cdo.debug = true
|
259
|
+
# stdout operators get get wrong input
|
260
|
+
assert_raise ArgumentError do
|
261
|
+
Cdo.showname(:input => '-for,d')
|
262
|
+
end
|
263
|
+
# non-existing operator
|
264
|
+
assert_raise ArgumentError do
|
265
|
+
Cdo.neverDefinedOperator()
|
266
|
+
end
|
267
|
+
# standard opertor get mis-spelled value
|
268
|
+
assert_raise ArgumentError do
|
269
|
+
Cdo.remapnn('r-10x10')
|
270
|
+
end
|
271
|
+
# standard operator get unexisting operator as input stream
|
272
|
+
assert_raise ArgumentError do
|
273
|
+
Cdo.remapnn('r10x10',:input => '-99topo')
|
274
|
+
end
|
275
|
+
# missing input stream
|
276
|
+
assert_raise ArgumentError do
|
277
|
+
Cdo.setname('setname')
|
278
|
+
end
|
279
|
+
# missing input stream for stdout-operator
|
280
|
+
assert_raise ArgumentError do
|
281
|
+
Cdo.showname
|
282
|
+
end
|
283
|
+
end
|
236
284
|
|
237
285
|
if 'thingol' == `hostname`.chomp then
|
238
286
|
def test_readCdf
|
@@ -248,6 +296,16 @@ class TestCdo < Test::Unit::TestCase
|
|
248
296
|
ifile = '/home/ram/data/examples/EH5_AMIP_1_TSURF_1991-1995.nc'
|
249
297
|
assert_equal([192, 96, 10],Cdo.readArray(Cdo.seltimestep('1/10',:input => ifile), 'tsurf').shape)
|
250
298
|
end
|
299
|
+
def test_doc
|
300
|
+
Cdo.debug = true
|
301
|
+
Cdo.help(:remap)
|
302
|
+
Cdo.help(:infov)
|
303
|
+
Cdo.help(:topo)
|
304
|
+
Cdo.help(:notDefinedOP)
|
305
|
+
Cdo.help
|
306
|
+
end
|
307
|
+
|
308
|
+
|
251
309
|
end
|
252
310
|
|
253
311
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cdo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-05 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Easy access to the Climate Data operators
|
15
15
|
email: stark.dreamdetective@gmail.com
|