argos-ruby 1.1.0 → 1.1.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 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