cdo 1.2.1 → 1.2.2
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.
- checksums.yaml +7 -0
- data/gemspec +1 -1
- data/lib/cdo.rb +60 -2
- data/test/test_cdo.rb +36 -2
- metadata +8 -9
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 06d6492570a2bb4f02b81788514e61dc4fca1abc
|
4
|
+
data.tar.gz: 210c76b7cb096c5eb4d8e65672aa491b77152cc9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9beb317468976260445422c30644062908c763b530ac883e038003af764a1cd1873460680f436263c4d47ffb48296c58c1ce6e1b2f4d57ca158069ded712337d
|
7
|
+
data.tar.gz: 883ae4494bb3304c829c3ca082b04179ea6dc9d15702eabaeb5bf0c0045b81b256f914a81ec91f4c3c9749d321e63d91e38b3a538deeae0b0ff1f22a58bfb6b1
|
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.2'
|
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,11 +17,11 @@ require 'open3'
|
|
17
17
|
# CDO calling mechnism
|
18
18
|
module Cdo
|
19
19
|
|
20
|
-
VERSION = "1.2.
|
20
|
+
VERSION = "1.2.2"
|
21
21
|
|
22
22
|
State = {
|
23
23
|
:debug => false,
|
24
|
-
:returnCdf
|
24
|
+
:returnCdf => false,
|
25
25
|
:operators => [],
|
26
26
|
:forceOutput => true
|
27
27
|
}
|
@@ -103,6 +103,7 @@ module Cdo
|
|
103
103
|
:returncode => wait_thr.value.exitstatus
|
104
104
|
}
|
105
105
|
end
|
106
|
+
|
106
107
|
def Cdo.run(cmd,ofile='',options='',returnCdf=false,force=nil,returnArray=nil,returnMaArray=nil)
|
107
108
|
cmd = "#{@@CDO} -O #{options} #{cmd} "
|
108
109
|
case ofile
|
@@ -136,6 +137,7 @@ module Cdo
|
|
136
137
|
return ofile
|
137
138
|
end
|
138
139
|
end
|
140
|
+
|
139
141
|
def Cdo.parseArgs(args)
|
140
142
|
# splitinto hash-like args and the rest
|
141
143
|
operatorArgs = args.reject {|a| a.class == Hash}
|
@@ -143,8 +145,11 @@ module Cdo
|
|
143
145
|
io = args.find {|a| a.class == Hash}
|
144
146
|
io = {} if io.nil?
|
145
147
|
args.delete_if {|a| a.class == Hash}
|
148
|
+
# join input streams together if possible
|
149
|
+
io[:input] = io[:input].join(' ') if io[:input].respond_to?(:join)
|
146
150
|
return [io,opts]
|
147
151
|
end
|
152
|
+
|
148
153
|
def Cdo.method_missing(sym, *args, &block)
|
149
154
|
## args is expected to look like [opt1,...,optN,:input => iStream,:output => oStream] where
|
150
155
|
# iStream could be another CDO call (timmax(selname(Temp,U,V,ifile.nc))
|
@@ -160,6 +165,7 @@ module Cdo
|
|
160
165
|
raise ArgumentError,"Operator #{sym.to_s} not found"
|
161
166
|
end
|
162
167
|
end
|
168
|
+
|
163
169
|
def Cdo.loadCdf
|
164
170
|
begin
|
165
171
|
require "numru/netcdf_miss"
|
@@ -170,19 +176,38 @@ module Cdo
|
|
170
176
|
end
|
171
177
|
end
|
172
178
|
|
179
|
+
def Cdo.getSupportedLibs(force=false)
|
180
|
+
return unless (State[:libs].nil? or force)
|
181
|
+
_, _, stderr, _ = Open3.popen3(@@CDO + " -V")
|
182
|
+
supported = stderr.readlines.map(&:chomp)
|
183
|
+
with = supported.grep(/with/)[0].split(':')[1].split.map(&:downcase)
|
184
|
+
libs = supported.grep(/library version/).map {|l|
|
185
|
+
l.strip.split(':').map {|l|
|
186
|
+
l.split.first.downcase
|
187
|
+
}[0,2]
|
188
|
+
}
|
189
|
+
State[:libs] = {}
|
190
|
+
with.flatten.each {|k| State[:libs][k]=true}
|
191
|
+
libs.each {|lib,version| State[:libs][lib] = version}
|
192
|
+
end
|
193
|
+
|
173
194
|
public
|
174
195
|
def Cdo.debug=(value)
|
175
196
|
State[:debug] = value
|
176
197
|
end
|
198
|
+
|
177
199
|
def Cdo.debug
|
178
200
|
State[:debug]
|
179
201
|
end
|
202
|
+
|
180
203
|
def Cdo.forceOutput=(value)
|
181
204
|
State[:forceOutput] = value
|
182
205
|
end
|
206
|
+
|
183
207
|
def Cdo.forceOutput
|
184
208
|
State[:forceOutput]
|
185
209
|
end
|
210
|
+
|
186
211
|
def Cdo.version
|
187
212
|
cmd = @@CDO + ' 2>&1'
|
188
213
|
help = IO.popen(cmd).readlines.map {|l| l.chomp.lstrip}
|
@@ -190,15 +215,18 @@ module Cdo
|
|
190
215
|
line = help.find {|v| v =~ regexp}
|
191
216
|
version = regexp.match(line)[1]
|
192
217
|
end
|
218
|
+
|
193
219
|
def Cdo.setReturnCdf(value=true)
|
194
220
|
if value
|
195
221
|
Cdo.loadCdf
|
196
222
|
end
|
197
223
|
State[:returnCdf] = value
|
198
224
|
end
|
225
|
+
|
199
226
|
def Cdo.unsetReturnCdf
|
200
227
|
setReturnCdf(false)
|
201
228
|
end
|
229
|
+
|
202
230
|
def Cdo.returnCdf
|
203
231
|
State[:returnCdf]
|
204
232
|
end
|
@@ -221,19 +249,45 @@ module Cdo
|
|
221
249
|
end
|
222
250
|
return true
|
223
251
|
end
|
252
|
+
|
224
253
|
def Cdo.setCdo(cdo)
|
225
254
|
puts "Will use #{cdo} instead of #@@CDO" if Cdo.debug
|
226
255
|
@@CDO = cdo
|
227
256
|
Cdo.getOperators(true)
|
228
257
|
end
|
258
|
+
|
229
259
|
def Cdo.getCdo
|
230
260
|
@@CDO
|
231
261
|
end
|
262
|
+
|
232
263
|
def Cdo.operators
|
233
264
|
Cdo.getOperators if State[:operators].empty?
|
234
265
|
State[:operators]
|
235
266
|
end
|
236
267
|
|
268
|
+
def Cdo.libs
|
269
|
+
getSupportedLibs
|
270
|
+
State[:libs]
|
271
|
+
end
|
272
|
+
|
273
|
+
def Cdo.hasLib?(lib)
|
274
|
+
return Cdo.libs.has_key?(lib)
|
275
|
+
return false
|
276
|
+
end
|
277
|
+
|
278
|
+
def Cdo.libsVersion(lib)
|
279
|
+
unless Cdo.hasLib?(lib)
|
280
|
+
raise ArgumentError, "Cdo does NOT have support for '#{lib}'"
|
281
|
+
else
|
282
|
+
if State[:libs][lib].kind_of? String
|
283
|
+
return State[:libs][lib]
|
284
|
+
else
|
285
|
+
warn "No version information available about '#{lib}'"
|
286
|
+
return false
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
237
291
|
#==================================================================
|
238
292
|
# Addional operotors:
|
239
293
|
#------------------------------------------------------------------
|
@@ -281,6 +335,7 @@ module Cdo
|
|
281
335
|
raise ArgumentError,"Cannot find variable '#{varname}'"
|
282
336
|
end
|
283
337
|
end
|
338
|
+
|
284
339
|
def Cdo.help(operator=nil)
|
285
340
|
if operator.nil?
|
286
341
|
puts Cdo.call([@@CDO,'-h'].join(' '))[:stderr]
|
@@ -301,9 +356,11 @@ module MyTempfile
|
|
301
356
|
@@_tempfiles = []
|
302
357
|
@@persistent_tempfiles = false
|
303
358
|
@@N = 10000000
|
359
|
+
|
304
360
|
def MyTempfile.setPersist(value)
|
305
361
|
@@persistent_tempfiles = value
|
306
362
|
end
|
363
|
+
|
307
364
|
def MyTempfile.path
|
308
365
|
unless @@persistent_tempfiles
|
309
366
|
t = Tempfile.new(self.class.to_s)
|
@@ -316,6 +373,7 @@ module MyTempfile
|
|
316
373
|
t
|
317
374
|
end
|
318
375
|
end
|
376
|
+
|
319
377
|
def MyTempfile.showFiles
|
320
378
|
@@_tempfiles.each {|f| print(f+" ") if f.kind_of? String}
|
321
379
|
end
|
data/test/test_cdo.rb
CHANGED
@@ -76,8 +76,10 @@ class TestCdo < Test::Unit::TestCase
|
|
76
76
|
names = Cdo.showname(:input => "-stdatm,0",:options => "-f nc")
|
77
77
|
assert_equal(["P T"],names)
|
78
78
|
|
79
|
-
|
80
|
-
|
79
|
+
if Cdo.hasLib?("sz")
|
80
|
+
ofile = Cdo.topo(:output => ofile,:options => "-z szip")
|
81
|
+
assert_equal(["GRIB SZIP"],Cdo.showformat(:input => ofile))
|
82
|
+
end
|
81
83
|
end
|
82
84
|
def test_chain
|
83
85
|
Cdo.debug = true
|
@@ -282,6 +284,38 @@ class TestCdo < Test::Unit::TestCase
|
|
282
284
|
end
|
283
285
|
end
|
284
286
|
|
287
|
+
def test_inputArray
|
288
|
+
# check for file input
|
289
|
+
fileA = Cdo.stdatm(0)
|
290
|
+
fileB = Cdo.stdatm(0)
|
291
|
+
files = [fileA,fileB]
|
292
|
+
assert_equal(Cdo.diffv(:input => files.join(' ')),
|
293
|
+
Cdo.diffv(:input => files))
|
294
|
+
assert_equal("0 of 2 records differ",Cdo.diffv(:input => files).last)
|
295
|
+
# check for operator input
|
296
|
+
assert_equal("0 of 2 records differ",Cdo.diffv(:input => ["-stdatm,0","-stdatm,0"]).last)
|
297
|
+
# check for operator input and files
|
298
|
+
assert_equal("0 of 2 records differ",Cdo.diffv(:input => ["-stdatm,0",fileB]).last)
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_libs
|
302
|
+
assert(Cdo.hasLib?("cdi"),"CDI support missing")
|
303
|
+
assert(Cdo.hasLib?("nc4"),"netcdf4 support missing")
|
304
|
+
assert(Cdo.hasLib?("netcdf"),"netcdf support missing")
|
305
|
+
assert_equal(false,Cdo.hasLib?("boost"))
|
306
|
+
if 'thingol' == `hostname`.chomp
|
307
|
+
assert_equal('1.10.0',Cdo.libsVersion("grib_api")) if Cdo.hasLib?("grib_api")
|
308
|
+
end
|
309
|
+
assert_raise ArgumentError do
|
310
|
+
Cdo.libsVersion("foo")
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_output_set_to_nil
|
315
|
+
assert_equal(String,Cdo.topo(:output => nil).class)
|
316
|
+
assert_equal("File format: GRIB",Cdo.sinfov(:input => "-topo", :output => nil)[0])
|
317
|
+
end
|
318
|
+
|
285
319
|
if 'thingol' == `hostname`.chomp then
|
286
320
|
def test_readCdf
|
287
321
|
input = "-settunits,days -setyear,2000 -for,1,4"
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cdo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ralf Mueller
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-09-12 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Easy access to the Climate Data operators
|
15
14
|
email: stark.dreamdetective@gmail.com
|
@@ -28,27 +27,27 @@ files:
|
|
28
27
|
homepage: https://code.zmaw.de/projects/cdo/wiki/Cdo%7Brbpy%7D
|
29
28
|
licenses:
|
30
29
|
- GPLv2
|
30
|
+
metadata: {}
|
31
31
|
post_install_message:
|
32
32
|
rdoc_options: []
|
33
33
|
require_paths:
|
34
34
|
- lib
|
35
35
|
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
36
|
requirements:
|
38
|
-
- -
|
37
|
+
- - '>='
|
39
38
|
- !ruby/object:Gem::Version
|
40
39
|
version: '1.9'
|
41
40
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
41
|
requirements:
|
44
|
-
- -
|
42
|
+
- - '>='
|
45
43
|
- !ruby/object:Gem::Version
|
46
44
|
version: '0'
|
47
45
|
requirements: []
|
48
46
|
rubyforge_project:
|
49
|
-
rubygems_version:
|
47
|
+
rubygems_version: 2.0.3
|
50
48
|
signing_key:
|
51
|
-
specification_version:
|
49
|
+
specification_version: 4
|
52
50
|
summary: Easy access to the Climate Data operators
|
53
51
|
test_files:
|
54
52
|
- test/test_cdo.rb
|
53
|
+
has_rdoc:
|