marty 1.0.48 → 1.0.50

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 376e0b397909c27475e6b4cdae94dee42567e903
4
- data.tar.gz: b93e6460252eb76a0391732a33ed14304d422b90
3
+ metadata.gz: 73b7b86b7b401ad7cd06091b271c56ba22b5cc1d
4
+ data.tar.gz: c047c73fe41f5c5336813a6be4867e9613d98679
5
5
  SHA512:
6
- metadata.gz: 5d573ea332aea15f9eb89406a0158c00c359ab2761ddbc53f07804e7bb2044862ca02a31ab1308588c6a2a5d1901797e18367ec80a81738dce87dd2278585fdc
7
- data.tar.gz: 6d1523146cc9ed32261d66676c54d673c4221b23cc915b9005a244da666a1c864a9ec451750138773b0a342715f05a8b90fc242fb7a99f7896fddf606ca82705
6
+ metadata.gz: 7aea286471dee9a5ae2212b04a5da813aaf647c760a91ce60c05c94c0921ff5390f63a9e32e0aeb0344acf845ef3afb4e89852984974a76c1d4b2b853bc84af7
7
+ data.tar.gz: fe45b8a98c849b94e2a5d70fad092be0f96c2d3f16589673a7fb68ea124f2759b1fe742b759a58795e492e9fdeade1997dd7bd856add88feb27346f184120d0e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (1.0.48)
4
+ marty (1.0.50)
5
5
  axlsx (= 2.1.0pre)
6
6
  coderay
7
7
  delorean_lang (~> 0.1)
@@ -58,6 +58,11 @@ module Marty
58
58
  end.sum
59
59
  end
60
60
 
61
+ def self.find_failures data
62
+ data.each_with_object({}){
63
+ |(k,v), h| h[k] = v.include?('Failure') ? 'F' : 'P'}
64
+ end
65
+
61
66
  def self.errors data
62
67
  data.keys.count{|n| is_failure?(data[n])}
63
68
  end
@@ -89,9 +94,12 @@ module Marty
89
94
  <% data.each do |node, result| %>
90
95
  <table>
91
96
  <% issues = ('error' if inconsistent) %>
92
- <th class="<%=issues%>"><%=inconsistent ? node :
93
- '<small>consistent</small>'%></th>
94
- <th class="<%=issues%>"></th>
97
+ <th colspan="2" class="<%=issues%>">
98
+ <small>
99
+ <%=inconsistent ? node :
100
+ (type == 'local' ? 'local' : 'consistent') %>
101
+ </small>
102
+ </th>
95
103
  <% result.each do |name, value| %>
96
104
  <tr class="<%=is_failure?(value) ? 'failed' :
97
105
  'passed' %>">
@@ -145,15 +153,15 @@ module Marty
145
153
  class Version < Base
146
154
  def self.generate
147
155
  begin
148
- message = `cd #{Rails.root.to_s}; git describe;`.strip
156
+ message = `cd #{Rails.root.to_s}; git describe --tags --always;`.strip
149
157
  rescue
150
158
  message = error("Failed accessing git")
151
159
  end
152
160
  {
153
- 'Git' => message,
154
161
  'Marty' => Marty::VERSION,
155
162
  'Delorean' => Delorean::VERSION,
156
- 'Mcfly' => Mcfly::VERSION
163
+ 'Mcfly' => Mcfly::VERSION,
164
+ 'Git' => message,
157
165
  }
158
166
  end
159
167
  end
@@ -216,9 +224,31 @@ module Marty
216
224
  " - AWS: [#{a_nodes.join(', ')}]")
217
225
  {"PG/AWS" => message}
218
226
  end
227
+ end
228
+
229
+ class Env < Base
230
+ def self.filter_env filter=''
231
+ env = ENV.clone
232
+
233
+ # obfuscate SECRET_KEY_BASE for comparison
234
+ env['SECRET_KEY_BASE'] = env['SECRET_KEY_BASE'][0,4] if
235
+ env['SECRET_KEY_BASE']
236
+
237
+ # remove SCRIPT_URI, SCRIPT_URL as calling node differs
238
+ ['SCRIPT_URI', 'SCRIPT_URL'].each{|k| env.delete(k)}
239
+
240
+ to_block = ['PASSWORD', 'DEBUG']
241
+ env.sort.each_with_object({}){|(k,v),h|
242
+ h[k] = v if to_block.all?{|b| !k.include?(b)} && k.include?(filter)}
243
+ end
244
+
245
+ def self.generate
246
+ filter_env
247
+ end
219
248
 
220
249
  def self.aggregate
221
- {'local' => generate}
250
+ envs = get_nodal_diags(name.demodulize)
251
+ diff(envs) ? envs : package({})
222
252
  end
223
253
  end
224
254
 
@@ -19,18 +19,15 @@ class Marty::RpcController < ActionController::Base
19
19
  end
20
20
 
21
21
  private
22
-
23
22
  # FIXME: move to (probably) agrim's schema code in lib
24
- def get_schemas(tag, sname, node, attrs)
23
+ def get_schema(tag, sname, node, attr)
25
24
  begin
26
- engine = Marty::ScriptSet.new(tag).get_engine(sname+'Schemas')
27
- result = engine.evaluate(node, attrs, {})
28
- attrs.zip(result)
25
+ Marty::ScriptSet.new(tag).get_engine(sname+'Schemas').
26
+ evaluate(node, attr, {})
29
27
  rescue => e
30
28
  use_message = e.message == 'No such script' ?
31
- 'Schema not defined' : 'Problem with schema: ' + e.message
32
- raise "Schema error for #{sname}/#{node} "\
33
- "attrs=#{attrs.join(',')}: #{use_message}"
29
+ 'Schema not defined' : 'Problem with schema: ' + e.message
30
+ raise "Schema error for #{sname}/#{node} attrs=#{attr}: #{use_message}"
34
31
  end
35
32
  end
36
33
 
@@ -39,6 +36,7 @@ class Marty::RpcController < ActionController::Base
39
36
  return msg unless m
40
37
  "disallowed parameter '#{m[1]}' of type #{m[2]} was received"
41
38
  end
39
+
42
40
  def _get_errors(errs)
43
41
  if errs.is_a?(Array)
44
42
  errs.map { |err| _get_errors(err) }
@@ -54,29 +52,26 @@ class Marty::RpcController < ActionController::Base
54
52
  end
55
53
  end
56
54
  end
55
+
57
56
  def get_errors(errs)
58
57
  _get_errors(errs).flatten
59
58
  end
60
59
 
61
- def do_eval(sname, tag, node, attrs, params, api_key, background)
62
- return {error: "Malformed attrs"} unless attrs.is_a?(String)
60
+ def do_eval(sname, tag, node, attr, params, api_key, background)
61
+ # FIXME: small patch to allow for single attr array
62
+ attr = ActiveSupport::JSON.decode(attr) rescue attr
63
63
 
64
- attrs_atom = !attrs.start_with?('[')
65
- start_time = Time.zone.now
64
+ return {error: "Malformed attrs"} unless
65
+ attr.is_a?(String) || (attr.is_a?(Array) && attr.count == 1)
66
66
 
67
- if attrs_atom
68
- attrs = [attrs]
69
- else
70
- begin
71
- attrs = ActiveSupport::JSON.decode(attrs)
72
- rescue JSON::ParserError => e
73
- return {error: "Malformed attrs"}
74
- end
67
+ # if attr is a single attr array, remember to return as an array
68
+ if attr.is_a? Array
69
+ attr = attr[0]
70
+ ret_arr = true
75
71
  end
76
72
 
77
- return {error: "Malformed attrs"} unless
78
- attrs.is_a?(Array) && attrs.all? {|x| x =~ /\A[a-z][a-zA-Z0-9_]*\z/}
79
-
73
+ start_time = Time.zone.now
74
+ return {error: "Malformed attrs"} unless attr =~ /\A[a-z][a-zA-Z0-9_]*\z/
80
75
  return {error: "Bad params"} unless params.is_a?(String)
81
76
 
82
77
  begin
@@ -87,44 +82,34 @@ class Marty::RpcController < ActionController::Base
87
82
  end
88
83
 
89
84
  return {error: "Malformed params"} unless params.is_a?(Hash)
90
-
91
- need_input_validate, need_output_validate, strict_validate, need_log =
92
- [], [], [], []
93
- Marty::ApiConfig.multi_lookup(sname, node, attrs).each do
94
- |attr, log, input_validate, output_validate, strict, id|
95
- need_input_validate << attr if input_validate
96
- need_output_validate << attr + "_" if output_validate
97
- strict_validate << attr if strict
98
- need_log << id if log
99
- end
100
-
101
- opt = { :validate_schema => true,
102
- :errors_as_objects => true,
103
- :version => Marty::JsonSchema::RAW_URI }
104
- to_append = {"\$schema" => Marty::JsonSchema::RAW_URI}
105
-
106
- validation_error = {}
107
- err_count = 0
108
- if need_input_validate.present?
85
+ need_log,
86
+ need_input_validate,
87
+ need_output_validate,
88
+ need_strict_validate = Marty::ApiConfig.lookup(sname, node, attr)
89
+ opt = {validate_schema: true,
90
+ errors_as_objects: true,
91
+ version: Marty::JsonSchema::RAW_URI }
92
+ to_append = {"\$schema" => Marty::JsonSchema::RAW_URI}
93
+ validation_error = nil
94
+
95
+ if need_input_validate
109
96
  begin
110
- schemas = get_schemas(tag, sname, node, need_input_validate)
97
+ schema = get_schema(tag, sname, node, attr)
111
98
  rescue => e
112
99
  return {error: e.message}
113
100
  end
114
- schemas.each do |attr, sch|
115
- begin
116
- er = JSON::Validator.fully_validate(sch.merge(to_append), params, opt)
117
- rescue NameError
118
- return {error: "Unrecognized PgEnum for attribute #{attr}"}
119
- rescue => ex
120
- return {error: "#{attr}: #{ex.message}"}
121
- end
122
-
123
- validation_error[attr] = get_errors(er) if er.size > 0
124
- err_count += er.size
101
+ begin
102
+ er = JSON::Validator.
103
+ fully_validate(schema.merge(to_append), params, opt)
104
+ rescue NameError
105
+ return {error: "Unrecognized PgEnum for attribute #{attr}"}
106
+ rescue => ex
107
+ return {error: "#{attr}: #{ex.message}"}
125
108
  end
109
+ validation_error = get_errors(er) if er.size > 0
126
110
  end
127
- return {error: "Error(s) validating: #{validation_error}"} if err_count > 0
111
+ return {error: "Error(s) validating: #{validation_error}"} if
112
+ validation_error
128
113
 
129
114
  auth = Marty::ApiAuth.authorized?(sname, api_key)
130
115
  return {error: "Permission denied" } unless auth
@@ -142,49 +127,36 @@ class Marty::RpcController < ActionController::Base
142
127
 
143
128
  begin
144
129
  if background
145
- result = engine.background_eval(node, params, attrs)
130
+ result = engine.background_eval(node, params, attr)
146
131
  return retval = {"job_id" => result.__promise__.id}
147
132
  end
148
- res = engine.evaluate(node, attrs, params)
149
133
 
150
- validation_error = {}
151
- err_count = 0
152
- if need_output_validate.present?
134
+ res = engine.evaluate(node, attr, params)
135
+
136
+ if need_output_validate && !(res.is_a?(Hash) && res['error'])
153
137
  begin
154
- schemas = get_schemas(tag, sname, node, need_output_validate)
138
+ schema = get_schema(tag, sname, node, attr + '_')
155
139
  rescue => e
156
140
  return {error: e.message}
157
141
  end
158
- shash = Hash[schemas]
159
- pairs = attrs.zip(res)
160
- pairs.each do |attr, result|
161
- next unless sch = shash[attr+"_"]
162
- next if result.is_a?(Hash) && result["error"]
163
- begin
164
- er = JSON::Validator.fully_validate(sch.merge(to_append), result, opt)
165
- rescue NameError
166
- return {error: "Unrecognized PgEnum for attribute #{attr}"}
167
- rescue => ex
168
- return {error: "#{attr}: #{ex.message}"}
169
- end
170
- validation_error[attr] = er.map{ |e| e[:message] } if er.size > 0
171
- err_count += er.size
142
+
143
+ begin
144
+ er = JSON::Validator.fully_validate(schema.merge(to_append), res, opt)
145
+ rescue NameError
146
+ return {error: "Unrecognized PgEnum for attribute #{attr}"}
147
+ rescue => ex
148
+ return {error: "#{attr}: #{ex.message}"}
172
149
  end
173
- if err_count > 0
174
- res = pairs.map do |attr, result|
175
- next result unless shash[attr+"_"]
176
- next result unless the_error = validation_error[attr]
177
-
178
- Marty::Logger.error("API #{sname}:#{node}.#{attr}",
179
- {error: the_error,
180
- data: result})
181
- strict_validate.include?(attr) ?
182
- {error: "Error(s) validating: #{the_error}",
183
- data: result} : result
184
- end
150
+
151
+ if er.size > 0
152
+ errors = er.map{|e| e[:message]}
153
+ Marty::Logger.error("API #{sname}:#{node}.#{attr}",
154
+ {error: errors, data: res})
155
+ res = need_strict_validate ? {error: "Error(s) validating: #{errors}",
156
+ data: res} : res
185
157
  end
186
158
  end
187
- return retval = (attrs_atom ? res.first : res)
159
+ return retval = ret_arr ? [res] : res
188
160
  rescue => exc
189
161
  err_msg = Delorean::Engine.grok_runtime_exception(exc).symbolize_keys
190
162
  logger.info "Evaluation error: #{err_msg}"
@@ -195,7 +167,7 @@ class Marty::RpcController < ActionController::Base
195
167
  "#{sname} - #{node}",
196
168
  {script: sname,
197
169
  node: node,
198
- attrs: (attrs_atom ? attrs.first : attrs),
170
+ attrs: (ret_arr ? [attr] : attr),
199
171
  input: orig_params,
200
172
  output: error ? nil : retval,
201
173
  start_time: start_time,
@@ -20,12 +20,13 @@
20
20
  th { padding: 9px;
21
21
  border: none;
22
22
  background-color: #d6d6d6 }
23
- td { padding: 9px;
24
- border: none;
25
- }
23
+ td { text-align: left;
24
+ padding: 9px;
25
+ }
26
26
  th.error { background-color: #ff5555;
27
27
  color: #ffffff;
28
28
  }
29
+ tr { text-align: center;}
29
30
  tr.passed { background-color: #d0e9c6 }
30
31
  tr.failed { background-color: #ff5555;
31
32
  color: #ffffff
@@ -50,8 +51,9 @@
50
51
  </style>
51
52
  </head>
52
53
  <body>
53
- <div style="text-align:center">
54
- <h1><%=Rails.application.class.parent_name%> Diagnostic</h1>
54
+ <div style="text-align:center">
55
+ <h1><%=Rails.application.class.parent_name%> Diagnostic</h1>
56
+ <h3><i><%= DateTime.now %></i></h3>
55
57
  <%== @result %>
56
58
  </div>
57
59
  </body>
data/lib/marty/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "1.0.48"
2
+ VERSION = "1.0.50"
3
3
  end
@@ -4,11 +4,21 @@ module Marty
4
4
  before(:each) { @routes = Marty::Engine.routes }
5
5
  let(:json_response) { JSON.parse(response.body) }
6
6
 
7
+ def git
8
+ begin
9
+ message = `cd #{Rails.root.to_s}; git describe --tags --always;`.strip
10
+ rescue
11
+ message = error("Failed accessing git")
12
+ end
13
+ end
14
+
7
15
  def version
8
- {"Git" => "",
9
- "Marty" => Marty::VERSION,
10
- "Delorean" => Delorean::VERSION,
11
- "Mcfly" => Mcfly::VERSION}
16
+ {
17
+ "Marty" => Marty::VERSION,
18
+ "Delorean" => Delorean::VERSION,
19
+ "Mcfly" => Mcfly::VERSION,
20
+ "Git" => git,
21
+ }
12
22
  end
13
23
 
14
24
  def environment
@@ -30,12 +40,7 @@ module Marty
30
40
  <h3>Version</h3>
31
41
  <div class="wrapper">
32
42
  <table>
33
- <th class=""><small>consistent</small></th>
34
- <th class=""></th>
35
- <tr class="passed">
36
- <td>Git</td>
37
- <td class="overflow"></td>
38
- </tr>
43
+ <th colspan="2" class=""><small>consistent</small></th>
39
44
  <tr class="passed">
40
45
  <td>Marty</td>
41
46
  <td class="overflow">#{Marty::VERSION}</td>
@@ -48,6 +53,10 @@ module Marty
48
53
  <td>Mcfly</td>
49
54
  <td class="overflow">#{Mcfly::VERSION}</td>
50
55
  </tr>
56
+ <tr class="passed">
57
+ <td>Git</td>
58
+ <td class="overflow">#{git}</td>
59
+ </tr>
51
60
  </table>
52
61
  </div>
53
62
  ERB
@@ -59,12 +68,7 @@ module Marty
59
68
  <h3 class="error">Issues Detected </h3>
60
69
  <div class="wrapper">
61
70
  <table>
62
- <th class="error">node1</th>
63
- <th class="error"></th>
64
- <tr class="passed">
65
- <td>Git</td>
66
- <td class="overflow"></td>
67
- </tr>
71
+ <th colspan="2" class="error"><small>node1</small></th>
68
72
  <tr class="passed">
69
73
  <td>Marty</td>
70
74
  <td class="overflow">#{Marty::VERSION}</td>
@@ -77,14 +81,13 @@ module Marty
77
81
  <td>Mcfly</td>
78
82
  <td class="overflow">#{Mcfly::VERSION}</td>
79
83
  </tr>
80
- </table>
81
- <table>
82
- <th class="error">node2</th>
83
- <th class="error"></th>
84
84
  <tr class="passed">
85
85
  <td>Git</td>
86
- <td class="overflow"></td>
86
+ <td class="overflow">#{git}</td>
87
87
  </tr>
88
+ </table>
89
+ <table>
90
+ <th colspan="2" class="error"><small>node2</small></th>
88
91
  <tr class="passed">
89
92
  <td>Marty</td>
90
93
  <td class="overflow">#{val}</td>
@@ -97,6 +100,10 @@ module Marty
97
100
  <td>Mcfly</td>
98
101
  <td class="overflow">#{Mcfly::VERSION}</td>
99
102
  </tr>
103
+ <tr class="passed">
104
+ <td>Git</td>
105
+ <td class="overflow">#{git}</td>
106
+ </tr>
100
107
  </table>
101
108
  </div>
102
109
  ERB
@@ -370,7 +370,7 @@ describe Marty::RpcController do
370
370
  @p2 = Marty::Posting.do_create("BASE", Date.today + 4.minute, 'a comment')
371
371
  @data = [["some data",7,[1,2,3],{foo: "bar", baz: "quz"},5,"string"],
372
372
  ["some more data",[1,2,3],5,{foo: "bar", baz: "quz"},5,"string"]]
373
- @data_json = [@data].to_json
373
+ @data_json = @data.to_json
374
374
  }
375
375
 
376
376
  after(:each) do
@@ -388,11 +388,11 @@ describe Marty::RpcController do
388
388
  format: :json,
389
389
  script: "M1",
390
390
  node: "B",
391
- attrs: ["e","f"].to_json,
391
+ attrs: "e",
392
392
  tag: t1.name,
393
393
  params: { a: 333, d: 5}.to_json,
394
394
  }
395
- expect(response.body).to eq([4,20].to_json)
395
+ expect(response.body).to eq(4.to_json)
396
396
  end
397
397
 
398
398
  it "should be able to post background job" do
@@ -401,7 +401,7 @@ describe Marty::RpcController do
401
401
  format: :json,
402
402
  script: "M1",
403
403
  node: "B",
404
- attrs: ["e","f"].to_json,
404
+ attrs: "e",
405
405
  tag: t1.name,
406
406
  params: { a: 333, d: 5}.to_json,
407
407
  background: true,
@@ -412,12 +412,12 @@ describe Marty::RpcController do
412
412
 
413
413
  promise = Marty::Promise.find_by_id(job_id)
414
414
 
415
- expect(promise.result).to eq({"e"=>4, "f"=>20})
415
+ expect(promise.result).to eq({"e"=>4})
416
416
 
417
417
  Delayed::Worker.delay_jobs = true
418
418
  end
419
419
 
420
- it "should be able to post background job with non-array attrs" do
420
+ it "should be able to post background job with non-array attr" do
421
421
  Delayed::Worker.delay_jobs = false
422
422
  post 'evaluate', {
423
423
  format: :json,
@@ -444,12 +444,13 @@ describe Marty::RpcController do
444
444
  format: :json,
445
445
  script: "M1",
446
446
  node: "D",
447
- attrs: ["out"].to_json,
447
+ attrs: "out",
448
448
  tag: t1.name,
449
449
  params: {in: @data}.to_json
450
450
  }
451
451
  expect(response.body).to eq(@data_json)
452
452
  end
453
+
453
454
  # content-type: application/json structures the request a little differently
454
455
  # so we also test that
455
456
  it "should be able to post (JSON) with complex data" do
@@ -459,155 +460,154 @@ describe Marty::RpcController do
459
460
  format: :json,
460
461
  script: "M1",
461
462
  node: "D",
462
- attrs: ["out"].to_json,
463
+ attrs:"out",
463
464
  tag: t1.name,
464
465
  params: {in: @data}.to_json
465
466
  }
466
467
  expect(response.body).to eq(@data_json)
467
468
  end
469
+
468
470
  it "should be able to run scripts" do
469
471
  get 'evaluate', {
470
- format: :json,
471
- script: "M1",
472
- node: "A",
473
- attrs: ["a", "b"].to_json,
474
- tag: t1.name,
475
- }
472
+ format: :json,
473
+ script: "M1",
474
+ node: "A",
475
+ attrs: "a",
476
+ tag: t1.name,
477
+ }
476
478
  # puts 'Z'*40, request.inspect
477
- expect(response.body).to eq([123.0, 369.0].to_json)
479
+ expect(response.body).to eq(123.0.to_json)
478
480
 
479
481
  get 'evaluate', {
480
- format: :json,
481
- script: "M1",
482
- node: "A",
483
- attrs: ["a", "b"].to_json,
484
- params: {"a" => 4.5}.to_json,
485
- tag: t1.name,
486
- }
487
- expect(response.body).to eq([4.5,13.5].to_json)
482
+ format: :json,
483
+ script: "M1",
484
+ node: "A",
485
+ attrs: "a",
486
+ params: {"a" => 4.5}.to_json,
487
+ tag: t1.name,
488
+ }
489
+ expect(response.body).to eq(4.5.to_json)
488
490
 
489
491
  get 'evaluate', {
490
- format: :json,
491
- script: "M1",
492
- node: "B",
493
- attrs: ["a", "b", "c"].to_json,
494
- params: {"a" => 4.5}.to_json,
495
- tag: t1.name,
496
- }
497
- expect(response.body).to eq([4.5, 13.5, 18.0].to_json)
492
+ format: :json,
493
+ script: "M1",
494
+ node: "B",
495
+ attrs: "a",
496
+ params: {"a" => 4.5}.to_json,
497
+ tag: t1.name,
498
+ }
499
+ expect(response.body).to eq(4.5.to_json)
498
500
 
499
501
  get 'evaluate', {
500
- format: :json,
501
- script: "M1",
502
- tag: "DEV",
503
- node: "AA",
504
- attrs: ["a", "b"].to_json,
505
- params: {"a" => 3.3}.to_json,
506
- }
507
- res = ActiveSupport::JSON.decode(response.body).flatten.map{|x| x.round(8)}
508
- expect(res).to eq([3.3, 9.9])
502
+ format: :json,
503
+ script: "M1",
504
+ tag: "DEV",
505
+ node: "AA",
506
+ attrs: "a",
507
+ params: {"a" => 3.3}.to_json,
508
+ }
509
+ expect(response.body).to eq(3.3.to_json)
509
510
  end
510
511
 
511
512
  it "should be able to use posting name for tags" do
512
513
  get 'evaluate', {
513
- format: :json,
514
- script: "M1",
515
- node: "A",
516
- attrs: ["a", "b"].to_json,
517
- tag: p0.name,
518
- }
514
+ format: :json,
515
+ script: "M1",
516
+ node: "A",
517
+ attrs: "a",
518
+ tag: p0.name,
519
+ }
519
520
  expect(response.body["error"]).to_not be_nil
520
521
 
521
522
  get 'evaluate', {
522
- format: :json,
523
- script: "M1",
524
- node: "A",
525
- attrs: ["a", "b"].to_json,
526
- params: {"a" => 4.5}.to_json,
527
- tag: p1.name,
528
- }
529
- expect(response.body).to eq([4.5,13.5].to_json)
523
+ format: :json,
524
+ script: "M1",
525
+ node: "A",
526
+ attrs: "a",
527
+ params: {"a" => 4.5}.to_json,
528
+ tag: p1.name,
529
+ }
530
+ expect(response.body).to eq(4.5.to_json)
530
531
 
531
532
  get 'evaluate', {
532
- format: :json,
533
- script: "M1",
534
- node: "B",
535
- attrs: ["a", "b", "c"].to_json,
536
- params: {"a" => 4.5}.to_json,
537
- tag: p2.name,
538
- }
539
- expect(response.body).to eq([4.5, 13.5, 18.0].to_json)
533
+ format: :json,
534
+ script: "M1",
535
+ node: "B",
536
+ attrs: "a",
537
+ params: {"a" => 4.5}.to_json,
538
+ tag: p2.name,
539
+ }
540
+ expect(response.body).to eq(4.5.to_json)
540
541
 
541
542
  get 'evaluate', {
542
- format: :json,
543
- script: "M1",
544
- tag: "NOW",
545
- node: "AA",
546
- attrs: ["a", "b"].to_json,
547
- params: {"a" => 3.3}.to_json,
548
- }
549
- res = ActiveSupport::JSON.decode(response.body).flatten.map{|x| x.round(8)}
550
- expect(res).to eq([3.3, 9.9])
543
+ format: :json,
544
+ script: "M1",
545
+ tag: "NOW",
546
+ node: "AA",
547
+ attrs: "a",
548
+ params: {"a" => 3.3}.to_json,
549
+ }
550
+ expect(response.body).to eq(3.3.to_json)
551
551
  end
552
552
 
553
553
  it "should be able to run scripts 2" do
554
554
  get 'evaluate', {
555
- format: :json,
556
- script: "M3",
557
- node: "C",
558
- attrs: ["pc"].to_json,
559
- }
555
+ format: :json,
556
+ script: "M3",
557
+ node: "C",
558
+ attrs: "pc",
559
+ }
560
560
  # puts 'Z'*40, request.inspect
561
- expect(response.body).to eq([7].to_json)
561
+ expect(response.body).to eq(7.to_json)
562
562
 
563
563
  get 'evaluate', {
564
- format: :json,
565
- script: "M3",
566
- node: "B",
567
- attrs: ["pc"].to_json,
568
- }
564
+ format: :json,
565
+ script: "M3",
566
+ node: "B",
567
+ attrs: "pc",
568
+ }
569
569
  # puts 'Z'*40, request.inspect
570
- expect(response.body).to eq([9].to_json)
570
+ expect(response.body).to eq(9.to_json)
571
571
 
572
572
  get 'evaluate', {
573
- format: :json,
574
- script: "M3",
575
- node: "A",
576
- attrs: ["pc"].to_json,
577
- }
573
+ format: :json,
574
+ script: "M3",
575
+ node: "A",
576
+ attrs: "pc",
577
+ }
578
578
  # puts 'Z'*40, request.inspect
579
579
  expect(response.body).to match(/"error":"undefined parameter p"/)
580
580
  end
581
581
 
582
582
  it "should be able to handle imports" do
583
583
  get 'evaluate', {
584
- format: :json,
585
- script: "M4",
586
- node: "A",
587
- attrs: ["a", "c", "d", "pc"].to_json,
588
- }
584
+ format: :json,
585
+ script: "M4",
586
+ node: "A",
587
+ attrs: "a",
588
+ }
589
589
  # puts 'Z'*40, request.inspect
590
- expect(response.body).to eq([2,4,13,14].to_json)
590
+ expect(response.body).to eq(2.to_json)
591
591
  end
592
592
 
593
593
  it "should support CSV" do
594
594
  get 'evaluate', {
595
- format: :csv,
596
- script: "M4",
597
- node: "A",
598
- attrs: ["a", "c", "d", "pc", "lc"].to_json,
599
- }
595
+ format: :csv,
596
+ script: "M4",
597
+ node: "A",
598
+ attrs: "a",
599
+ }
600
600
  # puts 'Z'*40, request.inspect
601
- expect(response.body).to eq("2\r\n4\r\n13\r\n14\r\n14,14\r\n")
601
+ expect(response.body).to eq("2\r\n")
602
602
  end
603
603
 
604
604
  it "should support CSV (2)" do
605
605
  get 'evaluate', {
606
- format: :csv,
607
- script: "M4",
608
- node: "A",
609
- attrs: ["result"].to_json,
610
- }
606
+ format: :csv,
607
+ script: "M4",
608
+ node: "A",
609
+ attrs: "result",
610
+ }
611
611
  # puts 'Z'*40, request.inspect
612
612
  expect(response.body).to eq("a,b\r\n10,456\r\n789,10\r\n")
613
613
  end
@@ -618,15 +618,15 @@ describe Marty::RpcController do
618
618
  attr: nil,
619
619
  logged: false,
620
620
  input_validated: true)
621
- attrs = ["b"].to_json
621
+ attr = "b"
622
622
  params = {"a" => 5}.to_json
623
623
  get 'evaluate', {
624
- format: :csv,
625
- script: "M1",
626
- node: "A",
627
- attrs: attrs,
628
- params: params
629
- }
624
+ format: :csv,
625
+ script: "M1",
626
+ node: "A",
627
+ attrs: attr,
628
+ params: params
629
+ }
630
630
  expect = "Schema error for M1/A attrs=b: Schema not defined\r\n"
631
631
  expect(response.body).to eq("error,#{expect}")
632
632
  end
@@ -637,20 +637,20 @@ describe Marty::RpcController do
637
637
  attr: nil,
638
638
  logged: false,
639
639
  input_validated: true)
640
- attrs = ["b"].to_json
640
+ attr = "b"
641
641
  params = {"a" => 5}.to_json
642
642
  get 'evaluate', {
643
- format: :json,
644
- script: "M1",
645
- node: "A",
646
- attrs: attrs,
647
- params: params
648
- }
643
+ format: :json,
644
+ script: "M1",
645
+ node: "A",
646
+ attrs: attr,
647
+ params: params
648
+ }
649
649
  expect = "Schema error for M1/A attrs=b: Schema not defined"
650
- res_hsh = JSON.parse(response.body)
651
- expect(res_hsh.keys.size).to eq(1)
652
- expect(res_hsh.keys[0]).to eq("error")
653
- expect(res_hsh.values[0]).to eq(expect)
650
+ res = JSON.parse(response.body)
651
+ expect(res.keys.size).to eq(1)
652
+ expect(res.keys[0]).to eq("error")
653
+ expect(res.values[0]).to eq(expect)
654
654
  end
655
655
 
656
656
  it "returns an error message on missing attributes in schema script" do
@@ -659,15 +659,15 @@ describe Marty::RpcController do
659
659
  attr: nil,
660
660
  logged: false,
661
661
  input_validated: true)
662
- attrs = ["h"].to_json
662
+ attr = "h"
663
663
  params = {"f" => 5}.to_json
664
664
  get 'evaluate', {
665
- format: :csv,
666
- script: "M4",
667
- node: "A",
668
- attrs: attrs,
669
- params: params
670
- }
665
+ format: :csv,
666
+ script: "M4",
667
+ node: "A",
668
+ attrs: attr,
669
+ params: params
670
+ }
671
671
  expect = "Schema error for M4/A attrs=h: Problem with schema"
672
672
  expect(response.body).to include("error,#{expect}")
673
673
  end
@@ -678,15 +678,15 @@ describe Marty::RpcController do
678
678
  attr: nil,
679
679
  logged: false,
680
680
  input_validated: true)
681
- attrs = ["pc"].to_json
681
+ attr = "pc"
682
682
  params = {"p" => 5}.to_json
683
683
  get 'evaluate', {
684
- format: :csv,
685
- script: "M3",
686
- node: "A",
687
- attrs: attrs,
688
- params: params
689
- }
684
+ format: :csv,
685
+ script: "M3",
686
+ node: "A",
687
+ attrs: attr,
688
+ params: params
689
+ }
690
690
  expect = "Schema error for M3/A attrs=pc: Problem with schema: "\
691
691
  "syntax error M3Schemas:2\r\n"
692
692
  expect(response.body).to eq("error,#{expect}")
@@ -698,43 +698,16 @@ describe Marty::RpcController do
698
698
  attr: nil,
699
699
  logged: false,
700
700
  input_validated: true)
701
- attrs = ["d"].to_json
701
+ attr = "d"
702
702
  params = {"p" => "132"}.to_json
703
703
  get 'evaluate', {
704
- format: :csv,
705
- script: "M4",
706
- node: "A",
707
- attrs: attrs,
708
- params: params
709
- }
710
- expect = '""d""=>[""The property \'#/p\' of type string did not '\
711
- 'match the following type: integer'
712
- expect(response.body).to include(expect)
713
- end
714
-
715
- it "returns a validation error when validating multiple attributes" do
716
- Marty::ApiConfig.create!(script: "M4",
717
- node: "A",
718
- attr: nil,
719
- logged: false,
720
- input_validated: true,
721
- output_validated: true)
722
- attrs = ["d", "g"].to_json
723
- params = {"p" => "132", "e" => "55", "f"=>"16"}.to_json
724
- get 'evaluate', {
725
- format: :csv,
726
- script: "M4",
727
- node: "A",
728
- attrs: attrs,
729
- params: params
704
+ format: :csv,
705
+ script: "M4",
706
+ node: "A",
707
+ attrs: attr,
708
+ params: params
730
709
  }
731
- expect = '""d""=>[""The property \'#/p\' of type string did not '\
732
- 'match the following type: integer'
733
- expect(response.body).to include(expect)
734
- expect = '""g""=>[""The property \'#/e\' of type string did not '\
735
- 'match the following type: integer'
736
- expect(response.body).to include(expect)
737
- expect = 'The property \'#/f\' of type string did not '\
710
+ expect = '[""The property \'#/p\' of type string did not '\
738
711
  'match the following type: integer'
739
712
  expect(response.body).to include(expect)
740
713
  end
@@ -748,58 +721,60 @@ describe Marty::RpcController do
748
721
  input_validated: true,
749
722
  output_validated: true,
750
723
  strict_validate: true)
751
- attrs = ["d", "g", "ii", "result"].to_json
724
+ attr = "ii"
752
725
  params = {"p" => 132, "e" => 55, "f"=>16, "i"=>"string"}.to_json
753
726
  get 'evaluate', {
754
727
  format: :json,
755
728
  script: "M4",
756
729
  node: "A",
757
- attrs: attrs,
730
+ attrs: attr,
758
731
  params: params
759
732
  }
760
- res_hash = JSON.parse(response.body)
733
+ res = JSON.parse(response.body)
761
734
  errpart = "of type string did not match the following type: integer"
762
- expect(res_hash[0]).to eq(135)
763
- expect(res_hash[1]).to eq(291)
764
- expect(res_hash[2]["error"]).to include(errpart)
765
- expect(res_hash[3]).to eq([{"a"=>132,"b"=>456},
766
- {"a"=>789,"b"=>132}])
735
+ expect(res['error']).to include(errpart)
767
736
  logs = Marty::Log.all
768
737
  expect(logs.count).to eq(1)
769
738
  expect(logs[0].details["error"][0]).to include(errpart)
770
739
  end
771
- it "validates output 2" do
772
- # not all attrs being validated
773
- Marty::ApiConfig.create!(script: "M4",
740
+
741
+ it "validates output (bad type, with strict errors)" do
742
+ Marty::ApiConfig.create!(script: "M5",
774
743
  node: "A",
775
- attr: "result",
744
+ attr: nil,
776
745
  logged: false,
777
746
  input_validated: true,
778
- output_validated: true)
779
- attrs = ["d", "g", "result"].to_json
780
- params = {"p" => 132, "e" => 55, "f"=>16}.to_json
747
+ output_validated: true,
748
+ strict_validate: true)
749
+
750
+ attr = "result"
751
+ params = {"f" => "Banana"}.to_json
781
752
  get 'evaluate', {
782
753
  format: :json,
783
- script: "M4",
754
+ script: "M5",
784
755
  node: "A",
785
- attrs: attrs,
756
+ attrs: attr,
786
757
  params: params
787
758
  }
788
- res_hash = JSON.parse(response.body)
789
- expect(res_hash).to eq([135,291,[{"a"=>132,"b"=>456},
790
- {"a"=>789,"b"=>132}]])
759
+ res = JSON.parse(response.body)
760
+ expect(res).to include("error")
761
+ expect1 = "The property '#/0/b' of type integer did not match the "\
762
+ "following type: string"
763
+ expect2 = "The property '#/0/a' of type string did not match the "\
764
+ "following type: integer"
765
+ expect(res["error"]).to include(expect1)
766
+ expect(res["error"]).to include(expect2)
767
+
791
768
  logs = Marty::Log.all
792
- expect(logs.count).to eq(0)
769
+ expect(logs.count).to eq(1)
770
+ expect(logs[0].message).to eq("API M5:A.result")
771
+ expect(logs[0].details["error"].join).to include(expect1)
772
+ expect(logs[0].details["error"].join).to include(expect2)
773
+ expect(logs[0].details["data"]).to eq([{"a"=>"str", "b"=>456},
774
+ {"a"=>789, "b"=>"str"}])
793
775
  end
794
776
 
795
- it "validates output (bad type, with strict/non strict errors)" do
796
- Marty::ApiConfig.create!(script: "M5",
797
- node: "A",
798
- attr: nil,
799
- logged: false,
800
- input_validated: true,
801
- output_validated: true,
802
- strict_validate: true)
777
+ it "validates output (bad type, with non strict errors)" do
803
778
  Marty::ApiConfig.create!(script: "M5",
804
779
  node: "A",
805
780
  attr: "result2",
@@ -807,34 +782,26 @@ describe Marty::RpcController do
807
782
  input_validated: true,
808
783
  output_validated: true,
809
784
  strict_validate: false)
810
- attrs = ["result", "result2"].to_json
785
+ attr = "result2"
811
786
  params = {"f" => "Banana"}.to_json
812
787
  get 'evaluate', {
813
788
  format: :json,
814
789
  script: "M5",
815
790
  node: "A",
816
- attrs: attrs,
791
+ attrs: attr,
817
792
  params: params
818
793
  }
819
- res_hash = JSON.parse(response.body)
820
- expect(res_hash[0]).to include("error")
821
794
  expect1 = "The property '#/0/b' of type integer did not match the "\
822
- "following type: string"
795
+ "following type: string"
823
796
  expect2 = "The property '#/0/a' of type string did not match the "\
824
797
  "following type: integer"
825
- expect(res_hash[0]["error"]).to include(expect1)
826
- expect(res_hash[0]["error"]).to include(expect2)
827
-
828
798
  logs = Marty::Log.all
829
- expect(logs.count).to eq(2)
830
- expect(logs[0].message).to eq("API M5:A.result")
831
- expect(logs[1].message).to eq("API M5:A.result2")
832
- logs.each do |ml|
833
- expect(ml.details["error"].join).to include(expect1)
834
- expect(ml.details["error"].join).to include(expect2)
835
- expect(ml.details["data"]).to eq([{"a"=>"str", "b"=>456},
836
- {"a"=>789, "b"=>"str"}])
837
- end
799
+ expect(logs.count).to eq(1)
800
+ expect(logs[0].message).to eq("API M5:A.result2")
801
+ expect(logs[0].details["error"].join).to include(expect1)
802
+ expect(logs[0].details["error"].join).to include(expect2)
803
+ expect(logs[0].details["data"]).to eq([{"a"=>"str", "b"=>456},
804
+ {"a"=>789, "b"=>"str"}])
838
805
  end
839
806
 
840
807
  it "validates output (missing item)" do
@@ -845,21 +812,22 @@ describe Marty::RpcController do
845
812
  input_validated: true,
846
813
  output_validated: true,
847
814
  strict_validate: true)
848
- attrs = ["result"].to_json
815
+ attr = "result"
849
816
  params = {"b" => 122}.to_json
850
817
  get 'evaluate', {
851
818
  format: :json,
852
819
  script: "M9",
853
820
  node: "A",
854
- attrs: attrs,
821
+ attrs: attr,
855
822
  params: params
856
823
  }
857
- res_hash = JSON.parse(response.body)
858
- expect(res_hash[0]).to include("error")
824
+
825
+ res = JSON.parse(response.body)
826
+ expect(res).to include("error")
859
827
  expect1 = "The property '#/0' did not contain a required property of 'c'"
860
828
  expect2 = "The property '#/1' did not contain a required property of 'c'"
861
- expect(res_hash[0]["error"]).to include(expect1)
862
- expect(res_hash[0]["error"]).to include(expect2)
829
+ expect(res["error"]).to include(expect1)
830
+ expect(res["error"]).to include(expect2)
863
831
 
864
832
  logs = Marty::Log.all
865
833
  expect(logs.count).to eq(1)
@@ -877,15 +845,15 @@ describe Marty::RpcController do
877
845
  attr: nil,
878
846
  logged: false,
879
847
  input_validated: true)
880
- attrs = ["lc"].to_json
848
+ attr = "lc"
881
849
  params = {"p" => 5}.to_json
882
850
  get 'evaluate', {
883
- format: :csv,
884
- script: "M4",
885
- node: "A",
886
- attrs: attrs,
887
- params: params
888
- }
851
+ format: :csv,
852
+ script: "M4",
853
+ node: "A",
854
+ attrs: attr,
855
+ params: params
856
+ }
889
857
  expect(response.body).to eq("9\r\n9\r\n")
890
858
  end
891
859
 
@@ -895,21 +863,21 @@ describe Marty::RpcController do
895
863
  attr: nil,
896
864
  logged: false,
897
865
  input_validated: true)
898
- attrs = ["res"].to_json
866
+ attr = "res"
899
867
  params = {"b" => 5.22}.to_json
900
868
  get 'evaluate', {
901
- format: :json,
902
- script: "M6",
903
- node: "A",
904
- attrs: attrs,
905
- params: params
906
- }
869
+ format: :json,
870
+ script: "M6",
871
+ node: "A",
872
+ attrs: attr,
873
+ params: params
874
+ }
907
875
  expect = 'res: The property \'#/properties/b/type\' of type string '\
908
876
  'did not match one or more of the required schemas'
909
- res_hsh = JSON.parse(response.body)
910
- expect(res_hsh.keys.size).to eq(1)
911
- expect(res_hsh.keys[0]).to eq("error")
912
- expect(res_hsh.values[0]).to eq(expect)
877
+ res = JSON.parse(response.body)
878
+ expect(res.keys.size).to eq(1)
879
+ expect(res.keys[0]).to eq("error")
880
+ expect(res.values[0]).to eq(expect)
913
881
  end
914
882
 
915
883
 
@@ -926,15 +894,15 @@ describe Marty::RpcController do
926
894
  attr: nil,
927
895
  logged: false,
928
896
  input_validated: true)
929
- attrs = ["res"].to_json
897
+ attr = "res"
930
898
  params = {"f" => "Banana"}.to_json
931
899
  get 'evaluate', {
932
- format: :csv,
933
- script: "M5",
934
- node: "A",
935
- attrs: attrs,
936
- params: params
937
- }
900
+ format: :csv,
901
+ script: "M5",
902
+ node: "A",
903
+ attrs: attr,
904
+ params: params
905
+ }
938
906
  expect(response.body).to eq("1\r\n")
939
907
  end
940
908
 
@@ -944,15 +912,15 @@ describe Marty::RpcController do
944
912
  attr: nil,
945
913
  logged: false,
946
914
  input_validated: true)
947
- attrs = ["res"].to_json
915
+ attr = "res"
948
916
  params = {"f" => "Beans"}.to_json
949
917
  get 'evaluate', {
950
- format: :csv,
951
- script: "M5",
952
- node: "A",
953
- attrs: attrs,
954
- params: params
955
- }
918
+ format: :csv,
919
+ script: "M5",
920
+ node: "A",
921
+ attrs: attr,
922
+ params: params
923
+ }
956
924
  expect = "property '#/f' value 'Beans' not contained in FruitsEnum"
957
925
  expect(response.body).to include(expect)
958
926
  end
@@ -963,20 +931,20 @@ describe Marty::RpcController do
963
931
  attr: nil,
964
932
  logged: false,
965
933
  input_validated: true)
966
- attrs = ["res"].to_json
934
+ attr = "res"
967
935
  params = {"b" => "MemberOfANonExistantEnum"}.to_json
968
936
  get 'evaluate', {
969
- format: :json,
970
- script: "M7",
971
- node: "A",
972
- attrs: attrs,
973
- params: params
974
- }
937
+ format: :json,
938
+ script: "M7",
939
+ node: "A",
940
+ attrs: attr,
941
+ params: params
942
+ }
975
943
  expect = "property '#/b': 'NonExistantEnum' is not a pg_enum"
976
- res_hsh = JSON.parse(response.body)
977
- expect(res_hsh.keys.size).to eq(1)
978
- expect(res_hsh.keys[0]).to eq("error")
979
- expect(res_hsh.values[0]).to include(expect)
944
+ res = JSON.parse(response.body)
945
+ expect(res.keys.size).to eq(1)
946
+ expect(res.keys[0]).to eq("error")
947
+ expect(res.values[0]).to include(expect)
980
948
  end
981
949
 
982
950
  it "validates pgenum with capitalization issues" do
@@ -987,15 +955,15 @@ describe Marty::RpcController do
987
955
  input_validated: true)
988
956
  skip "pending until a solution is found that handles "\
989
957
  "autoload issues involving constantize"
990
- attrs = ["res"].to_json
958
+ attr = "res"
991
959
  params = {"b" => "Annual"}.to_json
992
960
  get 'evaluate', {
993
- format: :json,
994
- script: "M8",
995
- node: "A",
996
- attrs: attrs,
997
- params: params
998
- }
961
+ format: :json,
962
+ script: "M8",
963
+ node: "A",
964
+ attrs: attr,
965
+ params: params
966
+ }
999
967
  end
1000
968
 
1001
969
  it "should log good req" do
@@ -1003,23 +971,23 @@ describe Marty::RpcController do
1003
971
  node: "A",
1004
972
  attr: nil,
1005
973
  logged: true)
1006
- attrs = ["lc"]
974
+ attr = "lc"
1007
975
  params = {"p" => 5}
1008
976
  get 'evaluate', {
1009
- format: :csv,
1010
- script: "M3",
1011
- node: "A",
1012
- attrs: attrs.to_json,
1013
- params: params.to_json
1014
- }
977
+ format: :csv,
978
+ script: "M3",
979
+ node: "A",
980
+ attrs: attr,
981
+ params: params.to_json
982
+ }
1015
983
  expect(response.body).to eq("9\r\n9\r\n")
1016
984
  log = Marty::Log.order(id: :desc).first
1017
985
 
1018
986
  expect(log.details['script']).to eq("M3")
1019
987
  expect(log.details['node']).to eq("A")
1020
- expect(log.details['attrs']).to eq(attrs)
988
+ expect(log.details['attrs']).to eq(attr)
1021
989
  expect(log.details['input']).to eq(params)
1022
- expect(log.details['output']).to eq([[9,9]])
990
+ expect(log.details['output']).to eq([9, 9])
1023
991
  expect(log.details['remote_ip']).to eq("0.0.0.0")
1024
992
  expect(log.details['error']).to eq(nil)
1025
993
 
@@ -1030,16 +998,16 @@ describe Marty::RpcController do
1030
998
  node: "A",
1031
999
  attr: nil,
1032
1000
  logged: true)
1033
- attrs = ["lc"]
1001
+ attr = "lc"
1034
1002
  params = {"p" => 5}
1035
1003
  get 'evaluate', {
1036
- format: :csv,
1037
- script: "M3",
1038
- node: "A",
1039
- attrs: attrs.to_json,
1040
- params: params.to_json,
1041
- background: true
1042
- }
1004
+ format: :csv,
1005
+ script: "M3",
1006
+ node: "A",
1007
+ attrs: attr,
1008
+ params: params.to_json,
1009
+ background: true
1010
+ }
1043
1011
  expect(response.body).to match(/job_id,/)
1044
1012
  log = Marty::Log.order(id: :desc).first
1045
1013
 
@@ -1047,12 +1015,12 @@ describe Marty::RpcController do
1047
1015
 
1048
1016
  it "should not log if it should not log" do
1049
1017
  get 'evaluate', {
1050
- format: :json,
1051
- script: "M1",
1052
- node: "A",
1053
- attrs: ["a", "b"].to_json,
1054
- tag: t1.name,
1055
- }
1018
+ format: :json,
1019
+ script: "M1",
1020
+ node: "A",
1021
+ attrs: "a",
1022
+ tag: t1.name,
1023
+ }
1056
1024
  expect(Marty::Log.count).to eq(0)
1057
1025
  end
1058
1026
 
@@ -1063,12 +1031,12 @@ describe Marty::RpcController do
1063
1031
  logged: true)
1064
1032
  params = {"p" => 5}
1065
1033
  get 'evaluate', {
1066
- format: :csv,
1067
- script: "M3",
1068
- node: "A",
1069
- attrs: "lc",
1070
- params: params.to_json
1071
- }
1034
+ format: :csv,
1035
+ script: "M3",
1036
+ node: "A",
1037
+ attrs: "lc",
1038
+ params: params.to_json
1039
+ }
1072
1040
  expect(response.body).to eq("9\r\n9\r\n")
1073
1041
  log = Marty::Log.order(id: :desc).first
1074
1042
 
@@ -1089,12 +1057,12 @@ describe Marty::RpcController do
1089
1057
  api.save!
1090
1058
 
1091
1059
  get 'evaluate', {
1092
- format: :json,
1093
- script: "M3",
1094
- node: "C",
1095
- attrs: ["pc"].to_json,
1096
- }
1097
- expect(response.body).to eq([7].to_json)
1060
+ format: :json,
1061
+ script: "M3",
1062
+ node: "C",
1063
+ attrs: "pc",
1064
+ }
1065
+ expect(response.body).to eq(7.to_json)
1098
1066
  end
1099
1067
 
1100
1068
  it "should support api authorization - api_key required but missing" do
@@ -1104,11 +1072,11 @@ describe Marty::RpcController do
1104
1072
  api.save!
1105
1073
 
1106
1074
  get 'evaluate', {
1107
- format: :json,
1108
- script: "M3",
1109
- node: "C",
1110
- attrs: ["pc"].to_json,
1111
- }
1075
+ format: :json,
1076
+ script: "M3",
1077
+ node: "C",
1078
+ attrs: "pc",
1079
+ }
1112
1080
  expect(response.body).to match(/"error":"Permission denied"/)
1113
1081
  end
1114
1082
 
@@ -1121,21 +1089,21 @@ describe Marty::RpcController do
1121
1089
  apic = Marty::ApiConfig.create!(script: 'M3',
1122
1090
  logged: true)
1123
1091
 
1124
- attrs = ["pc"]
1092
+ attr = "pc"
1125
1093
  get 'evaluate', {
1126
- format: :json,
1127
- script: "M3",
1128
- node: "C",
1129
- attrs: attrs.to_json,
1130
- api_key: api.api_key,
1131
- }
1132
- expect(response.body).to eq([7].to_json)
1094
+ format: :json,
1095
+ script: "M3",
1096
+ node: "C",
1097
+ attrs: attr,
1098
+ api_key: api.api_key,
1099
+ }
1100
+ expect(response.body).to eq(7.to_json)
1133
1101
  log = Marty::Log.order(id: :desc).first
1134
1102
 
1135
1103
  expect(log.details['script']).to eq("M3")
1136
1104
  expect(log.details['node']).to eq("C")
1137
- expect(log.details['attrs']).to eq(attrs)
1138
- expect(log.details['output']).to eq([7])
1105
+ expect(log.details['attrs']).to eq(attr)
1106
+ expect(log.details['output']).to eq(7)
1139
1107
  expect(log.details['remote_ip']).to eq("0.0.0.0")
1140
1108
  expect(log.details['auth_name']).to eq("TestApp")
1141
1109
  end
@@ -1147,12 +1115,12 @@ describe Marty::RpcController do
1147
1115
  api.save!
1148
1116
 
1149
1117
  get 'evaluate', {
1150
- format: :json,
1151
- script: "M3",
1152
- node: "C",
1153
- attrs: ["pc"].to_json,
1154
- api_key: api.api_key + 'x',
1155
- }
1118
+ format: :json,
1119
+ script: "M3",
1120
+ node: "C",
1121
+ attrs: "pc",
1122
+ api_key: api.api_key + 'x',
1123
+ }
1156
1124
  expect(response.body).to match(/"error":"Permission denied"/)
1157
1125
  end
1158
1126
 
@@ -1167,21 +1135,21 @@ describe Marty::RpcController do
1167
1135
  strict_validate: false)
1168
1136
  end
1169
1137
  def do_call(req1, req2, req3, optionals={})
1170
- attrs = ["v1"].to_json
1138
+ attr = "v1"
1171
1139
  params = optionals.merge({"req1" => req1,
1172
1140
  "req2"=> req2,
1173
1141
  "req3"=> req3}).to_json
1174
1142
 
1175
1143
  # to see what the schema helpers generated:
1176
1144
  # engine = Marty::ScriptSet.new(nil).get_engine("M10Schemas")
1177
- # x=engine.evaluate("A", ["v1"], {})
1145
+ # x=engine.evaluate("A", "v1", {})
1178
1146
  # binding.pry
1179
1147
 
1180
1148
  get 'evaluate', {
1181
1149
  format: :json,
1182
1150
  script: "M10",
1183
1151
  node: "A",
1184
- attrs: attrs,
1152
+ attrs: attr,
1185
1153
  params: params
1186
1154
  }
1187
1155
 
@@ -1223,17 +1191,15 @@ describe Marty::RpcController do
1223
1191
  ].each do
1224
1192
  |a, exp|
1225
1193
  do_call(*a)
1226
- res_hash = JSON.parse(response.body)
1227
- got = res_hash.is_a?(Array) ? res_hash[0] : res_hash["error"]
1228
-
1229
- expect(got).to include(exp)
1194
+ res = JSON.parse(response.body)
1195
+ expect(res.is_a?(Hash) ? res['error'] : res).to include(exp)
1230
1196
  end
1231
1197
  end
1232
1198
  end
1233
1199
  end
1234
1200
 
1235
1201
  context "error handling" do
1236
- it 'returns bad attrs if attrs is not a string' do
1202
+ it 'returns bad attrs if attr is not a string' do
1237
1203
  get :evaluate, format: :json, attrs: 0
1238
1204
  expect(response.body).to match(/"error":"Malformed attrs"/)
1239
1205
  end
@@ -1243,7 +1209,7 @@ describe Marty::RpcController do
1243
1209
  expect(response.body).to match(/"error":"Malformed attrs"/)
1244
1210
  end
1245
1211
 
1246
- it 'returns malformed attrs if attrs is not an array of strings' do
1212
+ it 'returns malformed attrs if attr is not an array of strings' do
1247
1213
  get :evaluate, format: :json, attrs: "{}"
1248
1214
  expect(response.body).to match(/"error":"Malformed attrs"/)
1249
1215
 
@@ -1252,29 +1218,29 @@ describe Marty::RpcController do
1252
1218
  end
1253
1219
 
1254
1220
  it 'returns bad params if params is not a string' do
1255
- get(:evaluate, format: :json, params: 0)
1221
+ get :evaluate, format: :json, attrs: "e", params: 0
1256
1222
  expect(response.body).to match(/"error":"Bad params"/)
1257
1223
  end
1258
1224
 
1259
1225
  it 'returns malformed params for improperly formatted json' do
1260
- get :evaluate, format: :json, params: "{"
1226
+ get :evaluate, format: :json, attrs: "e", params: "{"
1261
1227
  expect(response.body).to match(/"error":"Malformed params"/)
1262
1228
  end
1263
1229
 
1264
1230
  it 'returns malformed params if params is not a hash' do
1265
- get :evaluate, format: :json, params: "[0]"
1231
+ get :evaluate, format: :json, attrs: "e", params: "[0]"
1266
1232
  expect(response.body).to match(/"error":"Malformed params"/)
1267
1233
  end
1268
1234
 
1269
1235
  it 'returns engine/tag lookup error if script not found' do
1270
- get :evaluate, format: :json, script: 'M1', tag: 'invalid'
1236
+ get :evaluate, format: :json, script: 'M1', attrs: "e", tag: 'invalid'
1271
1237
  expect(response.body).to match(/"error":"Can't get engine:/)
1272
- get :evaluate, format: :json, script: 'Invalid', tag: t1.name
1238
+ get :evaluate, format: :json, script: 'Invalid', attrs: "e", tag: t1.name
1273
1239
  expect(response.body).to match(/"error":"Can't get engine:/)
1274
1240
  end
1275
1241
 
1276
1242
  it 'returns the script runtime error (no node specified)' do
1277
- get :evaluate, format: :json, script: 'M1', tag: t1.name
1243
+ get :evaluate, format: :json, script: 'M1', attrs: "e", tag: t1.name
1278
1244
  expect(response.body).to match(/"error":"bad node/)
1279
1245
  end
1280
1246
  end