cdo 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/gemspec +1 -2
  2. data/lib/cdo.rb +37 -18
  3. data/test/test_cdo.rb +30 -11
  4. metadata +2 -2
data/gemspec CHANGED
@@ -1,10 +1,9 @@
1
1
  require 'rubygems'
2
2
  $:.unshift File.join(File.dirname(__FILE__),"..","lib")
3
- require 'cdo'
4
3
 
5
4
  spec = Gem::Specification.new do |s|
6
5
  s.name = "cdo"
7
- s.version = '1.0.9'
6
+ s.version = '1.0.10'
8
7
  s.platform = Gem::Platform::RUBY
9
8
  s.files = ["lib/cdo.rb"] + ["gemspec","COPYING","README.rdoc","ChangeLog"]
10
9
  s.test_file = "test/test_cdo.rb"
data/lib/cdo.rb CHANGED
@@ -15,11 +15,16 @@ require 'pp'
15
15
  # ==============================================================================
16
16
  # CDO calling mechnism
17
17
  module Cdo
18
+
19
+ VERSION = "1.0.10"
20
+
18
21
  State = {
19
22
  :debug => false,
20
23
  :returnArray => false,
21
24
  :operators => []
22
25
  }
26
+ State[:debug] = true unless ENV['DEBUG'].nil?
27
+
23
28
  @@CDO = ENV['CDO'].nil? ? 'cdo' : ENV['CDO']
24
29
 
25
30
  # Since cdo-1.5.4 undocumented operators are given with the -h option. For
@@ -31,7 +36,7 @@ module Cdo
31
36
  ensrkhistspace ensrkhisttime eof3d eof3dspatial eof3dtime export_e5ml
32
37
  export_e5res fc2gp fc2sp fillmiss fisher fldcovar fldrms fourier fpressure
33
38
  gather gengrid geopotheight ggstat ggstats globavg gp2fc gradsdes
34
- gridverify harmonic hourcount hpressure ifs2icon import_e5ml import_e5res
39
+ gridverify harmonic hourcount hpressure import_e5ml import_e5res
35
40
  import_obs imtocomplex infos infov interpolate intgrid intgridbil
36
41
  intgridtraj intpoint isosurface lmavg lmean lmmean lmstd log lsmean
37
42
  meandiff2test mergegrid mod moncount monlogs mrotuv mrotuvb mulcoslat ncode
@@ -49,6 +54,26 @@ module Cdo
49
54
  @@outputOperatorsPattern = /(diff|info|output|griddes|zaxisdes|show)/
50
55
 
51
56
  private
57
+ def Cdo.getOperators(force=false)
58
+ # Do NOT compute anything, if it is not required
59
+ return State[:operators] unless (State[:operators].empty? or force)
60
+ cmd = @@CDO + ' 2>&1'
61
+ help = IO.popen(cmd).readlines.map {|l| l.chomp.lstrip}
62
+ if 5 >= help.size
63
+ warn "Operators could not get listed by running the CDO binary (#{@@CDO})"
64
+ pp help if Cdo.debug
65
+ exit
66
+ end
67
+ # in version 1.5.6 the output of '-h' has changed
68
+ State[:operators] = case
69
+ when Cdo.version < "1.5.6"
70
+ (help[help.index("Operators:")+1].split + @@undocumentedOperators).uniq
71
+ else
72
+ help[(help.index("Operators:")+1)..help.index(help.find {|v| v =~ /CDO version/}) - 2].join(' ').split
73
+ end
74
+
75
+
76
+ end
52
77
  def Cdo.call(cmd)
53
78
  if (State[:debug])
54
79
  puts '# DEBUG ====================================================================='
@@ -59,14 +84,14 @@ module Cdo
59
84
  system(cmd + ' 1>/dev/null 2>&1 ')
60
85
  end
61
86
  end
62
- def Cdo.run(cmd,ofile=nil,options='',returnArray=false)
87
+ def Cdo.run(cmd,ofile='',options='',returnArray=false)
63
88
  cmd = "#{@@CDO} -O #{options} #{cmd} "
64
89
  case ofile
65
90
  when $stdout
66
91
  cmd << " 2>/dev/null"
67
92
  return IO.popen(cmd).readlines.map {|l| l.chomp.strip}
68
93
  when nil
69
- ofile = Tempfile.new("Cdo.rb").path
94
+ ofile = MyTempfile.path
70
95
  end
71
96
  cmd << "#{ofile}"
72
97
  call(cmd)
@@ -76,26 +101,15 @@ module Cdo
76
101
  return ofile
77
102
  end
78
103
  end
79
- def Cdo.getOperators(force=false)
80
- # Do NOT compute anything, if it is not required
81
- return State[:operators] unless (State[:operators].empty? or force)
82
-
83
- cmd = @@CDO + ' 2>&1'
84
- help = IO.popen(cmd).readlines.map {|l| l.chomp.lstrip}
85
- if 5 >= help.size
86
- warn "Operators could not get listed by running the CDO binary (#{@@CDO})"
87
- pp help if Cdo.debug
88
- exit
89
- end
90
- State[:operators] = (help[help.index("Operators:")+1].split + @@undocumentedOperators).uniq
91
- end
92
104
  def Cdo.method_missing(sym, *args, &block)
93
105
  # args is expected to look like [opt1,...,optN,:in => iStream,:out => oStream] where
94
106
  # iStream could be another CDO call (timmax(selname(Temp,U,V,ifile.nc))
95
107
  puts "Operator #{sym.to_s} is called" if State[:debug]
96
108
  if getOperators.include?(sym.to_s)
97
- opts = args.empty? ? '' : ',' + args.reject {|a| a.class == Hash}.join(',')
109
+ operatorArgs = args.reject {|a| a.class == Hash}
110
+ opts = operatorArgs.empty? ? '' : ',' + operatorArgs.join(',')
98
111
  io = args.find {|a| a.class == Hash}
112
+ io = {} if io.nil?
99
113
  args.delete_if {|a| a.class == Hash}
100
114
  if @@outputOperatorsPattern.match(sym)
101
115
  run(" -#{sym.to_s}#{opts} #{io[:in]} ",$stdout)
@@ -125,7 +139,11 @@ module Cdo
125
139
  State[:debug]
126
140
  end
127
141
  def Cdo.version
128
- "1.0.9"
142
+ cmd = @@CDO + ' 2>&1'
143
+ help = IO.popen(cmd).readlines.map {|l| l.chomp.lstrip}
144
+ regexp = %r{CDO version (\d.*), Copyright}
145
+ line = help.find {|v| v =~ regexp}
146
+ version = regexp.match(line)[1]
129
147
  end
130
148
  def Cdo.setReturnArray(value=true)
131
149
  if value
@@ -167,6 +185,7 @@ module Cdo
167
185
  @@CDO
168
186
  end
169
187
  def Cdo.operators
188
+ Cdo.getOperators if State[:operators].empty?
170
189
  State[:operators]
171
190
  end
172
191
 
data/test/test_cdo.rb CHANGED
@@ -26,10 +26,14 @@ class TestCdo < Test::Unit::TestCase
26
26
  if ["thicknessOfLevels"].include?(op)
27
27
  assert(Cdo.respond_to?(op),"Operator '#{op}' not found")
28
28
  else
29
- assert(Cdo.getOperators.include?(op))
29
+ assert(Cdo.getOperators.include?(op),"Operator '#{op}' not found")
30
30
  end
31
31
  }
32
32
  end
33
+ def test_listAllOperators
34
+ print Cdo.operators.join("\n")
35
+ end
36
+
33
37
  def test_outputOperators
34
38
  levels = Cdo.showlevel(:in => "-stdatm,0")
35
39
  assert_equal([0,0].map(&:to_s),levels)
@@ -44,6 +48,9 @@ class TestCdo < Test::Unit::TestCase
44
48
  values = Cdo.outputkey("level",:in => "-stdatm,0,10000")
45
49
  assert_equal(["0", "10000","0", "10000"],values)
46
50
  end
51
+ def test_CDO_version
52
+ assert("1.4.3.1" < Cdo.version,"Version to low: #{Cdo.version}")
53
+ end
47
54
  def test_args
48
55
  #Cdo.Debug = true
49
56
  #MyTempfile.setPersist(true)
@@ -88,6 +95,11 @@ class TestCdo < Test::Unit::TestCase
88
95
  assert_equal(diff[1].split(' ')[-1],"0.53060")
89
96
  end
90
97
 
98
+ def test_operators
99
+ assert_includes(Cdo.operators,"infov")
100
+ assert_includes(Cdo.operators,"showlevel")
101
+ end
102
+
91
103
  def test_bndLevels
92
104
  ofile = MyTempfile.path
93
105
  Cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:out => ofile,:options => "-f nc")
@@ -112,6 +124,11 @@ class TestCdo < Test::Unit::TestCase
112
124
  def test_tempfile
113
125
  ofile0, ofile1 = MyTempfile.path, MyTempfile.path
114
126
  assert_not_equal(ofile0,ofile1)
127
+ # Tempfile should not disappeare even if the GC was started
128
+ puts ofile0
129
+ assert(File.exist?(ofile0))
130
+ GC.start
131
+ assert(File.exist?(ofile0))
115
132
  end
116
133
 
117
134
  def test_returnArray
@@ -143,17 +160,19 @@ class TestCdo < Test::Unit::TestCase
143
160
  assert_equal(targetThicknesses, Cdo.thicknessOfLevels(:in => "-selname,T -stdatm,#{levels.join(',')}"))
144
161
  end
145
162
 
163
+ def test_showlevels
164
+ sourceLevels = %W{25 100 250 500 875 1400 2100 3000 4000 5000}
165
+ assert_equal(sourceLevels,
166
+ Cdo.showlevel(:in => "-selname,T #{Cdo.stdatm(*sourceLevels,:options => '-f nc')}")[0].split)
167
+ end
168
+
169
+ def test_verticalLevels
170
+ targetThicknesses = [50.0, 100.0, 200.0, 300.0, 450.0, 600.0, 800.0, 1000.0, 1000.0, 1000.0]
171
+ sourceLevels = %W{25 100 250 500 875 1400 2100 3000 4000 5000}
172
+ thicknesses = Cdo.thicknessOfLevels(:in => "-selname,T #{Cdo.stdatm(*sourceLevels,:options => '-f nc')}")
173
+ assert_equal(targetThicknesses,thicknesses)
174
+ end
146
175
  if 'thingol' == `hostname`.chomp then
147
- def test_verticalLevels
148
- iconpath = "/home/ram/src/git/icon/grids"
149
- # check, if a given input files has vertival layers of a given thickness array
150
- targetThicknesses = [50.0, 100.0, 200.0, 300.0, 450.0, 600.0, 800.0, 1000.0, 1000.0, 1000.0]
151
- ifile = [iconpath,"ts_phc_annual-iconR2B04-L10_50-1000m.nc"].join('/')
152
- assert_equal(["25 100 250 500 875 1400 2100 3000 4000 5000",
153
- "25 100 250 500 875 1400 2100 3000 4000 5000"],Cdo.showlevel(:in => ifile))
154
- thicknesses = Cdo.thicknessOfLevels(:in => ifile)
155
- assert_equal(targetThicknesses,thicknesses)
156
- end
157
176
  def test_readCdf
158
177
  input = "-settunits,days -setyear,2000 -for,1,4"
159
178
  cdfFile = Cdo.copy(:options =>"-f nc",:in=>input)
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.0.9
4
+ version: 1.0.10
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-04-23 00:00:00.000000000 Z
12
+ date: 2012-08-03 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