argos-ruby 1.1.0 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NWZlNzc5MzczNTY4MTkyMDljZmMzYTQwYTBlODIwYThkMjg5MDZhZQ==
4
+ Mjc1YTlhYTAwYTA4ZGE4MmYyZGFkYmUwNGNhNDE3MDNkYTA4MDdjNQ==
5
5
  data.tar.gz: !binary |-
6
- MzQ0MzQ0NjVhM2Y0NDMxMmZjYjEzODRlNDg4ZDQxNTc4MDM1YTgxMQ==
6
+ YjQzNDA1MDlkZjkyMWZlYTAwZWQ3NTVjODNhNjk5ZDI3MDZhOThiOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- N2U3OWFmOWU4NWEwNWEwZGI1YmE2OTNjODMyYjMyMTIwZDdmMTkwZGQyZGZl
10
- ZWQ1MjNiN2VlMDQ3ZWRhZjU0YTE1ZmFjYzQyYTY2ZjViNDkyODNhMzMxMzEy
11
- MWZkY2VjNDUxZjVhMzU0OWU5MTFhYTk1Nzc2MmIzZGIxZGIxZWM=
9
+ ZTcxM2NmZTdmYmU4MGZiOTRiYmM2MjM3NmE5NmJjMmFlOGNlYzVlNTgwYmEy
10
+ NDQ3OTBkZTViZDk2MTJlMDc4NjA4NWE3OTMzYmIzN2ZhZDYwMjIyN2QyZWIy
11
+ MjE2NThhY2RlZTM3Njg1MjkyMThlNDliYmVkYzgzZmMzZjU0MTQ=
12
12
  data.tar.gz: !binary |-
13
- N2Q0ZTg0NWUwOWRkNWYwY2VlZDBjNzc3NWQ3ZmIxMGVhYzg2YjYyZDVlZjQ4
14
- YmYzMGEwZjRjNTM2Y2ZiMmJiMjRmMmIwNThjYmNiYjZjZTlmNGVjNDA0MjBh
15
- OTNmZTRjMTZhM2U2ZDk0Y2M5OTEzOWEzZmI2N2RlMGMxZjdmYmM=
13
+ NmMyNzcwMDE0MjA3NTFhZjNkYzcyNjQyMDJhYjcxZmY4OTI3ZWQ3NGJmZWRj
14
+ MTczZDQwODE0Njg2OTE2ZjIxOTlkODFjMjdkZGIwM2VhYzRmNzg0MDIyODNk
15
+ YzE1NDkzZDUzMDc5N2EzOTUwYjQzNWZmMjY4M2VmNmZmODA4NzE=
@@ -3,6 +3,8 @@ module Argos
3
3
  end
4
4
  class SoapException < Exception
5
5
  end
6
+ class NodataException < SoapException
7
+ end
6
8
  class SoapFault < SoapException
7
9
  end
8
10
  end
data/lib/argos/soap.rb CHANGED
@@ -26,9 +26,16 @@ module Argos
26
26
  # response [Savon::Response]
27
27
  # operation [Savon::Operation]
28
28
  # xml [String] (Extracted, inner) XML
29
+ # filter FIXME
30
+ # platformId [String] Comma-separated list of platforms
31
+ # programNumber [String] Comma-separated list of programs
32
+ # nbDaysFromNow
33
+ # period
29
34
  attr_accessor :client, :request, :response, :operation, :xml, :filter,
30
35
  :platformId, :programNumber, :nbDaysFromNow, :period
31
-
36
+
37
+ # username [String]
38
+ # password [String]
32
39
  attr_writer :username, :password
33
40
 
34
41
  URI = "http://ws-argos.cls.fr/argosDws/services/DixService"
@@ -37,6 +44,7 @@ module Argos
37
44
  WSDL = "#{URI}?wsdl"
38
45
 
39
46
  ARGOS_NS = "http://service.dataxmldistribution.argos.cls.fr/types"
47
+
40
48
  SOAP_NS = "http://www.w3.org/2003/05/soap-envelope"
41
49
 
42
50
  NAMESPACES = {
@@ -147,6 +155,12 @@ module Argos
147
155
  }
148
156
  @response = o.call
149
157
  @request = o.build
158
+
159
+ # Handle faults (before extracting data)
160
+ _envelope.xpath("soap:Body/soap:Fault", namespaces).each do | fault |
161
+ raise fault.to_s
162
+ end
163
+
150
164
  @text = _extract_escaped_xml("csvResponse").call(response)
151
165
  end
152
166
 
@@ -159,10 +173,20 @@ module Argos
159
173
  # {"data":{"program":[{"programNumber":"9660","platform":[{ .. },{ .. }]}],"@version":"1.0"}}
160
174
  # Each platform Hash (.. above): {"platformId":"129990","lastLocationClass":"3","lastCollectDate":"2013-10-03T08:32:24.000Z","lastLocationDate":"2013-05-22T04:55:15.000Z","lastLatitude":"47.67801","lastLongitude":"-122.13419"}
161
175
  def getPlatformList
162
- _call_xml_operation(:getPlatformList, { platformListRequest:
176
+ platformList = _call_xml_operation(:getPlatformList, { platformListRequest:
163
177
  # Cannot use #baseRequest here because that methods calls #programs which also calls #getPlatformList...
164
178
  { username: _username, password: _password },
165
179
  }, _extract_escaped_xml("platformListResponse"))
180
+
181
+ # Raise error if no programs
182
+ if platformList["data"]["program"].nil?
183
+ raise platformList.to_json
184
+ end
185
+ # Force Array
186
+ if not platformList["data"]["program"].is_a? Array
187
+ platformList["data"]["program"] = [platformList["data"]["program"]]
188
+ end
189
+ platformList
166
190
  end
167
191
 
168
192
  # @return [Hash]
@@ -205,26 +229,36 @@ module Argos
205
229
  @text = _extract_escaped_xml("observationResponse").call(response)
206
230
  end
207
231
 
208
- # @return [Array]
232
+ # Platforms: array of platformId integers
233
+ # @return [Array] of [Integer]
209
234
  def platforms(programNumber=nil)
210
235
  platforms = []
211
- programs = getPlatformList["data"]["program"]
236
+
237
+ platformListPrograms = getPlatformList["data"]["program"]
238
+
212
239
  if programNumber.to_s =~ /\d+/
213
- programs.select! {|p| p["programNumber"].to_i == programNumber.to_i }
240
+ platformListPrograms.select! {|p| p["programNumber"].to_i == programNumber.to_i }
214
241
  end
215
- programs.each do |program|
242
+ platformListPrograms.each do |program|
216
243
  platforms += program["platform"].map {|p| p["platformId"].to_i}
217
244
  end
218
245
  platforms
219
246
  end
220
247
 
248
+ # Period request
221
249
  def period(startDate, endDate)
222
250
  { startDate: startDate, endDate: endDate }
223
251
  end
224
252
 
253
+ # Programs: Array of programNumber integers
225
254
  # @return [Array]
226
255
  def programs
227
- getPlatformList["data"]["program"].map {|p| p["programNumber"].to_i }
256
+ platformList = getPlatformList
257
+ if platformList.key?("data") and platformList["data"].key?("program")
258
+ platformList["data"]["program"].map {|p| p["programNumber"].to_i }
259
+ else
260
+ raise platformList
261
+ end
228
262
  end
229
263
 
230
264
  # @return [String]
@@ -284,7 +318,7 @@ module Argos
284
318
 
285
319
  # Handle faults (before extracting data)
286
320
  _envelope.xpath("soap:Body/soap:Fault", namespaces).each do | fault |
287
- raise fault.to_s
321
+ raise Exception, fault.to_s
288
322
  end
289
323
 
290
324
  # Extract data
@@ -297,8 +331,17 @@ module Argos
297
331
  # Handle errors
298
332
  ng = Nokogiri.XML(xml)
299
333
  ng.xpath("/data/errors/error").each do | error |
300
- raise error.to_s
301
- # FIXME Custom exception so that it mighht be trapped on raw responses...
334
+ if error.key?("code")
335
+ case error["code"]
336
+ when "4"
337
+ raise NodataException
338
+ end
339
+ #<error code="2">max response reached</error>
340
+ #<errors><error code="9">start date upper than end date</error></errors>
341
+
342
+ else
343
+ raise error
344
+ end
302
345
  end
303
346
 
304
347
  # Validation
@@ -3,7 +3,14 @@ require "net/http"
3
3
  require "csv"
4
4
 
5
5
  module Argos
6
-
6
+
7
+ # argos-soap command
8
+ #
9
+ # On success, data is pumped to STDOUT, on faults/errors to STDERR
10
+ # Examples:
11
+ # $ argos-soap --operation getXml
12
+ # $ argos-soap -o getXml --startDate="2014-03-10T00:00:00Z" --endDate="2014-03-10T23:59:59.999Z" --log-level=1
13
+ # $ argos-soap -o getXml --startDate="`date --date=yesterday -I`T00:00:00Z" --endDate="`date --date=yesterday -I`T23:59:59.999Z" --username=**** --password=***** > /my/argos/xml/archive/`date -I --date=yesterday`.xml
7
14
  class SoapCommand
8
15
 
9
16
  CMD = "argos-soap"
@@ -16,8 +23,8 @@ module Argos
16
23
  cmd.run
17
24
  exit(true)
18
25
  rescue => e
19
- puts e
20
- puts e.backtrace.join("\n")
26
+ STDERR.write e
27
+ STDERR.write e.backtrace.join("\n")
21
28
  exit(false)
22
29
  end
23
30
  end
@@ -36,6 +43,8 @@ module Argos
36
43
  opts.on("--debug", "Debug (alias for --log-level=0") do
37
44
  @param[:level] = Logger::DEBUG
38
45
  end
46
+
47
+ # --date shorthand for 1 day startDate endDate
39
48
 
40
49
  opts.on("--format=format", "-f=format", "{ json | xml | text | raw }") do |format|
41
50
  @param[:format] = format.to_sym
@@ -64,7 +73,7 @@ module Argos
64
73
  end
65
74
 
66
75
  opts.on("--endDate=dateTime", "Set period end") do |endDate|
67
- @param[:period].merge({ endDate: endDate })
76
+ @param[:period] = (@param[:period]||{}).merge({ endDate: endDate })
68
77
  end
69
78
 
70
79
  opts.on("--operations", "List operations") do
@@ -107,7 +116,7 @@ module Argos
107
116
  option_parser.parse!
108
117
 
109
118
  if operation.nil?
110
- puts option_parser.help
119
+ STDOUT.write option_parser.help
111
120
  exit(false)
112
121
  end
113
122
 
@@ -120,6 +129,7 @@ module Argos
120
129
  end
121
130
 
122
131
  def run
132
+ begin
123
133
  @soap = Argos::Soap.new(param)
124
134
 
125
135
  @result = nil
@@ -152,33 +162,42 @@ module Argos
152
162
  else
153
163
  raise ArgumentError, "Unspported operation: #{param[:operation]}"
154
164
  end
155
- output
165
+ STDOUT.write output
166
+
167
+ rescue NodataException
168
+ log.debug output
169
+ rescue => e
170
+ STDERR.write output
171
+ end
156
172
 
157
173
  end
158
174
 
159
175
  protected
160
176
 
161
177
  def output
178
+
162
179
  if debug?
163
180
  log.debug "#{CMD} param: #{param.to_json}"
164
181
  log.debug "$ curl -XPOST #{Argos::Soap::URI} -d'#{soap.request}' -H \"Content-Type: application/soap+xml\""
165
182
  end
183
+
166
184
  if result.is_a? Savon::Response
167
185
  @result = result.raw
168
186
  end
169
187
 
170
- case format.to_sym
188
+ output = case format.to_sym
171
189
 
172
190
  when :ruby
173
- puts result
191
+ result
174
192
  when :json
175
- puts result.to_json
193
+ result.to_json
176
194
  when :text
177
- puts soap.text
195
+ soap.text
178
196
  when :raw
179
- puts soap.raw
197
+ soap.raw
180
198
  when :xml
181
- puts soap.xml
199
+ # Return XML with parameter and time in trailing comment
200
+ soap.xml+xml_trailer
182
201
  else
183
202
  raise ArgumentError, "Unknown format: #{format}"
184
203
  end
@@ -197,5 +216,9 @@ module Argos
197
216
  [:getCsv, :getStreamXml, :getKml, :getXml, :getXsd, :getPlatformList, :getObsCsv, :getObsXml]
198
217
  end
199
218
 
219
+ def xml_trailer
220
+ "<!-- #{Argos.library_version} #{param.reject {|k,v| k =~ /^password$/}.to_json} now: #{Time.now.utc.xmlschema} -->"
221
+ end
222
+
200
223
  end
201
224
  end
data/lib/argos.rb CHANGED
@@ -12,7 +12,7 @@ require_relative "argos/ascii"
12
12
  require_relative "argos/ds"
13
13
  require_relative "argos/diag"
14
14
  require_relative "argos/soap"
15
- require_relative "argos/download"
15
+ #require_relative "argos/download"
16
16
 
17
17
  # Argos library containg
18
18
  # * Parsers for Argos legacy ASCII files (DS/DAT and DIAG files)
@@ -25,7 +25,7 @@ require_relative "argos/download"
25
25
  #
26
26
  # For information about Argos, see: http://www.argos-system.org
27
27
  module Argos
28
- VERSION = "1.1.0"
28
+ VERSION = "1.1.2"
29
29
 
30
30
  def self.library_version
31
31
  "argos-ruby-#{VERSION}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: argos-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Espen Egeland
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-10 00:00:00.000000000 Z
12
+ date: 2014-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec