marty 2.5.2 → 2.5.4

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.
Files changed (181) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +4 -0
  3. data/.rubocop.yml +7 -0
  4. data/.rubocop_todo.yml +11 -589
  5. data/Gemfile +9 -9
  6. data/Gemfile.lock +1 -1
  7. data/Rakefile +1 -3
  8. data/app/components/marty/api_auth_view.rb +3 -3
  9. data/app/components/marty/api_config_view.rb +8 -8
  10. data/app/components/marty/api_log_view.rb +16 -20
  11. data/app/components/marty/auth_app.rb +6 -6
  12. data/app/components/marty/base_rule_view.rb +27 -19
  13. data/app/components/marty/config_view.rb +12 -9
  14. data/app/components/marty/data_grid_view.rb +26 -26
  15. data/app/components/marty/delorean_rule_view.rb +0 -1
  16. data/app/components/marty/event_view.rb +27 -27
  17. data/app/components/marty/extras/layout.rb +26 -26
  18. data/app/components/marty/extras/misc.rb +2 -2
  19. data/app/components/marty/grid.rb +13 -13
  20. data/app/components/marty/grid_append_only.rb +0 -1
  21. data/app/components/marty/import_type_view.rb +13 -13
  22. data/app/components/marty/import_view.rb +17 -16
  23. data/app/components/marty/log_view.rb +16 -14
  24. data/app/components/marty/main_auth_app.rb +59 -59
  25. data/app/components/marty/main_auth_app/client/main_auth_app.js +3 -3
  26. data/app/components/marty/mcfly_grid_panel.rb +10 -10
  27. data/app/components/marty/new_posting_form.rb +11 -11
  28. data/app/components/marty/new_posting_window.rb +0 -1
  29. data/app/components/marty/posting_grid.rb +12 -13
  30. data/app/components/marty/promise_view.rb +6 -6
  31. data/app/components/marty/report_form.rb +50 -53
  32. data/app/components/marty/report_select.rb +27 -27
  33. data/app/components/marty/reporting.rb +4 -4
  34. data/app/components/marty/script_form.rb +40 -42
  35. data/app/components/marty/script_grid.rb +24 -24
  36. data/app/components/marty/script_tester.rb +40 -42
  37. data/app/components/marty/scripting.rb +25 -27
  38. data/app/components/marty/simple_app.rb +24 -9
  39. data/app/components/marty/tag_grid.rb +12 -13
  40. data/app/components/marty/user_view.rb +35 -35
  41. data/app/controllers/marty/application_controller.rb +3 -4
  42. data/app/controllers/marty/components_controller.rb +1 -1
  43. data/app/controllers/marty/delayed_job_controller.rb +1 -0
  44. data/app/controllers/marty/diagnostic/controller.rb +4 -6
  45. data/app/controllers/marty/job_controller.rb +6 -6
  46. data/app/controllers/marty/report_controller.rb +11 -11
  47. data/app/controllers/marty/rpc_controller.rb +15 -16
  48. data/app/helpers/marty/script_set.rb +4 -4
  49. data/app/models/marty/api_auth.rb +4 -5
  50. data/app/models/marty/api_config.rb +1 -1
  51. data/app/models/marty/base.rb +9 -8
  52. data/app/models/marty/base_rule.rb +18 -13
  53. data/app/models/marty/config.rb +4 -5
  54. data/app/models/marty/data_grid.rb +157 -181
  55. data/app/models/marty/delorean_rule.rb +63 -62
  56. data/app/models/marty/enum.rb +1 -1
  57. data/app/models/marty/event.rb +56 -59
  58. data/app/models/marty/helper.rb +38 -6
  59. data/app/models/marty/import_type.rb +6 -6
  60. data/app/models/marty/log.rb +3 -2
  61. data/app/models/marty/name_validator.rb +3 -2
  62. data/app/models/marty/pg_enum.rb +3 -4
  63. data/app/models/marty/posting.rb +20 -24
  64. data/app/models/marty/promise.rb +28 -30
  65. data/app/models/marty/script.rb +30 -28
  66. data/app/models/marty/tag.rb +8 -8
  67. data/app/models/marty/token.rb +2 -2
  68. data/app/models/marty/user.rb +24 -23
  69. data/app/models/marty/vw_promise.rb +10 -11
  70. data/config/routes.rb +2 -2
  71. data/delorean/blame_report.dl +268 -0
  72. data/{spec/dummy/delorean/fields.dl → delorean/marty_fields.dl} +8 -0
  73. data/delorean/table_report.dl +34 -0
  74. data/docker-compose.dummy.yml +2 -3
  75. data/lib/marty/aws/base.rb +8 -8
  76. data/lib/marty/aws/request.rb +4 -4
  77. data/lib/marty/cache_adapters/mcfly_ruby_cache.rb +1 -0
  78. data/lib/marty/content_handler.rb +25 -25
  79. data/lib/marty/data_change.rb +49 -71
  80. data/lib/marty/data_conversion.rb +20 -28
  81. data/lib/marty/data_exporter.rb +25 -28
  82. data/lib/marty/data_importer.rb +25 -27
  83. data/lib/marty/engine.rb +1 -2
  84. data/lib/marty/json_schema.rb +22 -24
  85. data/lib/marty/logger.rb +6 -9
  86. data/lib/marty/mcfly_model.rb +20 -24
  87. data/lib/marty/migrations.rb +37 -35
  88. data/lib/marty/monkey.rb +33 -33
  89. data/lib/marty/permissions.rb +18 -18
  90. data/lib/marty/promise_job.rb +17 -17
  91. data/lib/marty/promise_proxy.rb +6 -6
  92. data/lib/marty/relation.rb +6 -7
  93. data/lib/marty/rpc_call.rb +13 -12
  94. data/lib/marty/rule_script_set.rb +32 -28
  95. data/lib/marty/schema_helper.rb +37 -51
  96. data/lib/marty/util.rb +25 -24
  97. data/lib/marty/version.rb +1 -1
  98. data/lib/marty/xl.rb +121 -115
  99. data/make-dummy.mk +3 -0
  100. data/marty.gemspec +21 -21
  101. data/other/marty/api/base.rb +34 -35
  102. data/other/marty/diagnostic/aws/ec2_instance.rb +8 -8
  103. data/other/marty/diagnostic/base.rb +13 -14
  104. data/other/marty/diagnostic/collection.rb +2 -1
  105. data/other/marty/diagnostic/connections.rb +8 -6
  106. data/other/marty/diagnostic/database.rb +1 -0
  107. data/other/marty/diagnostic/delayed_job_version.rb +7 -9
  108. data/other/marty/diagnostic/delayed_job_worker_total_count.rb +1 -1
  109. data/other/marty/diagnostic/delayed_job_workers.rb +1 -1
  110. data/other/marty/diagnostic/environment_variables.rb +17 -15
  111. data/other/marty/diagnostic/fatal.rb +1 -1
  112. data/other/marty/diagnostic/node.rb +5 -9
  113. data/other/marty/diagnostic/nodes.rb +7 -5
  114. data/other/marty/diagnostic/packer.rb +7 -7
  115. data/other/marty/diagnostic/reporter.rb +24 -27
  116. data/other/marty/diagnostic/version.rb +3 -5
  117. data/script/rails +2 -1
  118. data/spec/controllers/application_controller_spec.rb +6 -6
  119. data/spec/controllers/delayed_job_controller_spec.rb +4 -4
  120. data/spec/controllers/diagnostic/controller_spec.rb +59 -60
  121. data/spec/controllers/job_controller_spec.rb +68 -69
  122. data/spec/controllers/rpc_controller_spec.rb +353 -359
  123. data/spec/controllers/rpc_import_spec.rb +15 -16
  124. data/spec/dummy/delorean/blame_report.dl +110 -15
  125. data/spec/dummy/delorean/data_report.dl +4 -4
  126. data/spec/dummy/delorean/marty_fields.dl +63 -0
  127. data/spec/dummy/delorean/table_report.dl +34 -0
  128. data/spec/features/auth_app_spec.rb +1 -2
  129. data/spec/features/data_import_spec.rb +2 -3
  130. data/spec/features/enum_spec.rb +42 -46
  131. data/spec/features/jobs_dashboard_spec.rb +14 -8
  132. data/spec/features/log_view_spec.rb +40 -43
  133. data/spec/features/reporting_spec.rb +15 -15
  134. data/spec/features/rule_spec.rb +195 -190
  135. data/spec/features/scripting_spec.rb +17 -20
  136. data/spec/features/scripting_test_spec.rb +32 -33
  137. data/spec/features/user_view_spec.rb +15 -17
  138. data/spec/job_helper.rb +11 -11
  139. data/spec/lib/data_blame_spec.rb +82 -0
  140. data/spec/lib/data_exporter_spec.rb +31 -32
  141. data/spec/lib/data_importer_spec.rb +382 -395
  142. data/spec/lib/delorean_query_spec.rb +117 -119
  143. data/spec/lib/json_schema_spec.rb +382 -392
  144. data/spec/lib/logger_spec.rb +23 -24
  145. data/spec/lib/mcfly_model_spec.rb +112 -109
  146. data/spec/lib/migrations_spec.rb +10 -10
  147. data/spec/lib/struct_compare_spec.rb +6 -6
  148. data/spec/lib/table_report_spec.rb +90 -0
  149. data/spec/lib/xl_spec.rb +63 -65
  150. data/spec/lib/xl_styles_spec.rb +16 -19
  151. data/spec/models/api_auth_spec.rb +30 -30
  152. data/spec/models/config_spec.rb +32 -32
  153. data/spec/models/data_grid_spec.rb +642 -655
  154. data/spec/models/event_spec.rb +96 -88
  155. data/spec/models/import_type_spec.rb +20 -20
  156. data/spec/models/posting_spec.rb +35 -35
  157. data/spec/models/promise_spec.rb +5 -5
  158. data/spec/models/rule_spec.rb +280 -269
  159. data/spec/models/script_spec.rb +27 -18
  160. data/spec/models/user_spec.rb +9 -9
  161. data/spec/other/diagnostic/base_spec.rb +20 -19
  162. data/spec/other/diagnostic/collection_spec.rb +6 -5
  163. data/spec/other/diagnostic/delayed_job_version_spec.rb +1 -1
  164. data/spec/other/diagnostic/delayed_job_workers_spec.rb +8 -8
  165. data/spec/other/diagnostic/reporter_spec.rb +31 -33
  166. data/spec/spec_helper.rb +5 -5
  167. data/spec/support/chromedriver.rb +3 -5
  168. data/spec/support/components/netzke_combobox.rb +1 -1
  169. data/spec/support/components/netzke_grid.rb +17 -17
  170. data/spec/support/custom_matchers.rb +2 -2
  171. data/spec/support/download_helper.rb +1 -1
  172. data/spec/support/helper.rb +1 -2
  173. data/spec/support/netzke.rb +31 -31
  174. data/spec/support/performance_helper.rb +8 -8
  175. data/spec/support/post_run_logger.rb +1 -2
  176. data/spec/support/setup.rb +1 -4
  177. data/spec/support/shared_connection.rb +2 -2
  178. data/spec/support/structure_compare.rb +21 -22
  179. data/spec/support/suite.rb +1 -2
  180. data/spec/support/users.rb +5 -6
  181. metadata +32 -26
@@ -34,34 +34,35 @@ describe Marty::JobController, slow: true do
34
34
  def wait_for_jobs
35
35
  60.times do
36
36
  break unless Marty::Promise.where(result: {}).exists?
37
+
37
38
  sleep 1
38
39
  end
39
40
  end
40
41
 
41
- it "should be able to evaluate in the foreground " do
42
+ it 'should be able to evaluate in the foreground ' do
42
43
  engine = Marty::ScriptSet.new.get_engine(NAME_A)
43
44
 
44
- res = engine.evaluate("Y", "d")
45
+ res = engine.evaluate('Y', 'd')
45
46
  expect(res).to eq([
46
- {"z"=>0.875, "a"=>{"b"=>{"e"=>0.125}}},
47
- {"z"=>0.875, "a"=>{"b"=>{"e"=>1.125}}},
48
- {"z"=>0.875, "a"=>{"b"=>{"e"=>2.125}}},
47
+ { 'z' => 0.875, 'a' => { 'b' => { 'e' => 0.125 } } },
48
+ { 'z' => 0.875, 'a' => { 'b' => { 'e' => 1.125 } } },
49
+ { 'z' => 0.875, 'a' => { 'b' => { 'e' => 2.125 } } },
49
50
  ])
50
51
 
51
52
  expect(Marty::Promise.where(start_dt: nil).count).to eq 0
52
53
 
53
- expect {
54
- res = engine.evaluate("Y", "d", {"s" => 1})
54
+ expect do
55
+ res = engine.evaluate('Y', 'd', 's' => 1)
55
56
  # force res to be evaluated
56
57
  res.to_s
57
- }.to raise_error(RuntimeError)
58
+ end.to raise_error(RuntimeError)
58
59
 
59
60
  wait_for_jobs
60
61
 
61
62
  expect(Marty::Promise.where(start_dt: nil).count).to eq 0
62
63
  end
63
64
 
64
- it "should be able to run long-running tasks in separate jobs" do
65
+ it 'should be able to run long-running tasks in separate jobs' do
65
66
  engine = Marty::ScriptSet.new.get_engine(NAME_A)
66
67
 
67
68
  # NOTE: can't make this too small since the default
@@ -69,45 +70,45 @@ describe Marty::JobController, slow: true do
69
70
  # However - delayed_job initializer config sets this to 1 for test
70
71
  slp = 5
71
72
 
72
- exp_res = {"d"=>[
73
- {"z"=>slp,"a"=>{"b"=>{"e"=>1-slp}}},
74
- {"z"=>slp,"a"=>{"b"=>{"e"=>2-slp}}},
75
- {"z"=>slp,"a"=>{"b"=>{"e"=>3-slp}}},
76
- ]}
73
+ exp_res = { 'd' => [
74
+ { 'z' => slp, 'a' => { 'b' => { 'e' => 1 - slp } } },
75
+ { 'z' => slp, 'a' => { 'b' => { 'e' => 2 - slp } } },
76
+ { 'z' => slp, 'a' => { 'b' => { 'e' => 3 - slp } } },
77
+ ] }
77
78
 
78
- bench = Benchmark.measure {
79
- res = engine.evaluate("Y", "f", {"s" => slp})
79
+ bench = Benchmark.measure do
80
+ res = engine.evaluate('Y', 'f', 's' => slp)
80
81
  expect(res).to eq exp_res
81
- }
82
+ end
82
83
 
83
84
  # If "f" is evaluated in serial fashion, then the process would
84
85
  # take slp*3+ seconds. Make sure that we had some parallel
85
86
  # behavior.
86
- expect(bench.real).to be_between(slp, slp*2)
87
+ expect(bench.real).to be_between(slp, slp * 2)
87
88
  end
88
89
 
89
- it "should be able to run long-running tasks in separate jobs (2)" do
90
+ it 'should be able to run long-running tasks in separate jobs (2)' do
90
91
  engine = Marty::ScriptSet.new.get_engine(NAME_H)
91
92
 
92
93
  slp = 5 # hard-coded in script
93
- exp_res = {"d"=>[{"a"=>1}, {"a"=>4}]}
94
+ exp_res = { 'd' => [{ 'a' => 1 }, { 'a' => 4 }] }
94
95
 
95
- bench = Benchmark.measure {
96
- res = engine.background_eval("Y", {}, ["d"])
96
+ bench = Benchmark.measure do
97
+ res = engine.background_eval('Y', {}, ['d'])
97
98
 
98
99
  expect(res).to eq exp_res
99
- }
100
+ end
100
101
 
101
- expect(bench.real).to be_between(slp, slp*2)
102
+ expect(bench.real).to be_between(slp, slp * 2)
102
103
  end
103
104
 
104
- xit "should be to handle non-serializable errors" do
105
+ xit 'should be to handle non-serializable errors' do
105
106
  # FIXME: this test is failing now. Object not-serializable isn't
106
107
  # the issue. This is caused by the 2nd promise not having been
107
108
  # started when it's forced. Not sure this is really an issue.
108
109
 
109
110
  engine = Marty::ScriptSet.new.get_engine(NAME_C)
110
- res = engine.background_eval("Z", {"p_title" => NAME_C}, ["result"])
111
+ res = engine.background_eval('Z', { 'p_title' => NAME_C }, ['result'])
111
112
  wait_for_jobs
112
113
 
113
114
  promise = Marty::Promise.find_by_title(NAME_C)
@@ -117,17 +118,17 @@ describe Marty::JobController, slow: true do
117
118
  }
118
119
 
119
120
  expect(response.content_type).to eq 'application/json'
120
- expect(JSON.parse(response.body).keys.member?("error")).to be true
121
+ expect(JSON.parse(response.body).keys.member?('error')).to be true
121
122
  end
122
123
 
123
- it "promise proxies should be stored lazily (not expanded)" do
124
+ it 'promise proxies should be stored lazily (not expanded)' do
124
125
  engine = Marty::ScriptSet.new.get_engine(NAME_E)
125
- engine.background_eval("Z", {"p_title" => NAME_E}, ["result"])
126
+ engine.background_eval('Z', { 'p_title' => NAME_E }, ['result'])
126
127
  wait_for_jobs
127
128
 
128
129
  promise = Marty::Promise.find_by_title(NAME_E)
129
130
 
130
- res = promise.result["result"]
131
+ res = promise.result['result']
131
132
 
132
133
  expect(res.length).to eq 6
133
134
 
@@ -136,43 +137,43 @@ describe Marty::JobController, slow: true do
136
137
  res.each { |r| expect(r.respond_to?(:__force__)).to be true }
137
138
  end
138
139
 
139
- it "should not leave zombie promises when we have exceptions" do
140
+ it 'should not leave zombie promises when we have exceptions' do
140
141
  engine = Marty::ScriptSet.new.get_engine(NAME_D)
141
- engine.background_eval("Z", {"p_title" => NAME_D}, ["result"])
142
+ engine.background_eval('Z', { 'p_title' => NAME_D }, ['result'])
142
143
  wait_for_jobs
143
144
 
144
145
  pl = Marty::Promise.all
145
146
 
146
147
  expect(pl.count).to eq 2
147
148
 
148
- pl.each { |p|
149
- expect(p.result["error"]).not_to eq nil
149
+ pl.each do |p|
150
+ expect(p.result['error']).not_to eq nil
150
151
  expect(p.end_dt).not_to eq nil
151
- }
152
+ end
152
153
  end
153
154
 
154
- it "should pass p_title to promise create()" do
155
+ it 'should pass p_title to promise create()' do
155
156
  engine = Marty::ScriptSet.new.get_engine(NAME_A)
156
- res = engine.evaluate("Y", "a", {"q" => 1})
157
+ res = engine.evaluate('Y', 'a', 'q' => 1)
157
158
  wait_for_jobs
158
159
 
159
- expect(res).to eq({"b"=>{"e"=>0.125}})
160
- expect(Marty::Promise.all.map(&:title).sort).to eq(["aaa", "bbb"])
160
+ expect(res).to eq('b' => { 'e' => 0.125 })
161
+ expect(Marty::Promise.all.map(&:title).sort).to eq(['aaa', 'bbb'])
161
162
  end
162
163
 
163
- it "should be able to ask controller for job result" do
164
- title = "BG RPC"
164
+ it 'should be able to ask controller for job result' do
165
+ title = 'BG RPC'
165
166
  engine = Marty::ScriptSet.new.get_engine(NAME_A)
166
- engine.background_eval("Y", {"p_title" => title}, ["d"])
167
+ engine.background_eval('Y', { 'p_title' => title }, ['d'])
167
168
  sleep 5
168
169
 
169
170
  promise = Marty::Promise.find_by_title(title)
170
171
 
171
- res = {"d"=>[
172
- {"z"=>0.875, "a"=>{"b"=>{"e"=>0.125}}},
173
- {"z"=>0.875, "a"=>{"b"=>{"e"=>1.125}}},
174
- {"z"=>0.875, "a"=>{"b"=>{"e"=>2.125}}},
175
- ]}
172
+ res = { 'd' => [
173
+ { 'z' => 0.875, 'a' => { 'b' => { 'e' => 0.125 } } },
174
+ { 'z' => 0.875, 'a' => { 'b' => { 'e' => 1.125 } } },
175
+ { 'z' => 0.875, 'a' => { 'b' => { 'e' => 2.125 } } },
176
+ ] }
176
177
 
177
178
  expect(promise.latest.result).to eq res
178
179
 
@@ -184,22 +185,22 @@ describe Marty::JobController, slow: true do
184
185
  expect(JSON.parse response.body).to eq res
185
186
  end
186
187
 
187
- it "should be able to get zip results" do
188
- title = "BG ZIP"
188
+ it 'should be able to get zip results' do
189
+ title = 'BG ZIP'
189
190
  engine = Marty::ScriptSet.new.get_engine(NAME_B)
190
- engine.background_eval("Z",
191
+ engine.background_eval('Z',
191
192
  {},
192
- ["result", "format", "title"],
193
- )
193
+ ['result', 'format', 'title'],
194
+ )
194
195
  sleep 5
195
196
 
196
197
  promise = Marty::Promise.find_by_title(NAME_B)
197
198
 
198
- expect(promise.result).to eq({
199
- "result"=>[{"a"=>1, "b"=>1},{"a"=>2, "b"=>4},{"a"=>3, "b"=>9}],
200
- "format"=>"csv",
201
- "title"=>"PromiseB",
202
- })
199
+ expect(promise.result).to eq(
200
+ 'result' => [{ 'a' => 1, 'b' => 1 }, { 'a' => 2, 'b' => 4 }, { 'a' => 3, 'b' => 9 }],
201
+ 'format' => 'csv',
202
+ 'title' => 'PromiseB',
203
+ )
203
204
 
204
205
  get 'download', params: {
205
206
  job_id: promise.id,
@@ -207,17 +208,15 @@ describe Marty::JobController, slow: true do
207
208
 
208
209
  expect_csv = "a,b\r\n1,1\r\n2,4\r\n3,9\r\n"
209
210
  expect(response.body).to eq expect_csv
210
- expect(response.content_type).to eq "text/csv"
211
+ expect(response.content_type).to eq 'text/csv'
211
212
 
212
213
  get 'download', params: {
213
214
  job_id: promise.parent_id,
214
215
  }
215
216
 
216
- expect(response.content_type).to eq "application/zip"
217
-
218
- Zip::InputStream.open(StringIO.new(response.body)) {
219
- |io|
217
+ expect(response.content_type).to eq 'application/zip'
220
218
 
219
+ Zip::InputStream.open(StringIO.new(response.body)) do |io|
221
220
  count = 0
222
221
  while (entry = io.get_next_entry)
223
222
  expect(entry.name).to match /PromiseB.*\.csv/
@@ -225,20 +224,20 @@ describe Marty::JobController, slow: true do
225
224
  count += 1
226
225
  end
227
226
  expect(count).to eq 3
228
- }
227
+ end
229
228
  end
230
229
 
231
- it "should be able to start promises on imported nodes" do
230
+ it 'should be able to start promises on imported nodes' do
232
231
  engine = Marty::ScriptSet.new.get_engine(NAME_F)
233
- res = engine.evaluate("Z", "result", {})
234
- expect(res).to eq "x"*10
232
+ res = engine.evaluate('Z', 'result', {})
233
+ expect(res).to eq 'x' * 10
235
234
  end
236
235
 
237
- it "promises called from regular node calls should pass parent promise id" do
236
+ it 'promises called from regular node calls should pass parent promise id' do
238
237
  engine = Marty::ScriptSet.new.get_engine(NAME_G)
239
- res = engine.evaluate("V", "result", {})
238
+ res = engine.evaluate('V', 'result', {})
240
239
  expect(res).to eq [123]
241
- p1 = Marty::Promise.find_by_title("#{NAME_G}")
240
+ p1 = Marty::Promise.find_by_title(NAME_G.to_s)
242
241
  p2 = Marty::Promise.find_by_title("#{NAME_G}2")
243
242
  expect(p2.parent_id).to eq p1.id
244
243
  end
@@ -430,55 +430,55 @@ A:
430
430
  v0 = { "properties": properties}
431
431
  eof
432
432
  describe Marty::RpcController do
433
- before(:each) {
433
+ before(:each) do
434
434
  @routes = Marty::Engine.routes
435
435
 
436
436
  # HACKY: 'params' param is special to the Rails controller test helper (at
437
437
  # least as of 4.2). Setting this avoids test framework code that relies on
438
438
  # params being a hash.
439
- @request.env['PATH_INFO'] = "/marty/rpc/evaluate.json"
440
- }
439
+ @request.env['PATH_INFO'] = '/marty/rpc/evaluate.json'
440
+ end
441
441
 
442
- before(:each) {
443
- @p0 = Marty::Posting.do_create("BASE", Date.today, 'a comment')
442
+ before(:each) do
443
+ @p0 = Marty::Posting.do_create('BASE', Date.today, 'a comment')
444
444
 
445
445
  @t1 = Marty::Script.load_script_bodies({
446
- "M1" => sample_script,
447
- "M2" => sample_script.gsub(/a/, "aa").gsub(/b/, "bb"),
448
- "M3" => sample_script3,
449
- "M3err" => sample_script3err,
450
- "M4" => sample_script4,
451
- "M5" => sample_script5,
452
- "M6" => sample_script6,
453
- "M7" => sample_script7,
454
- "M8" => sample_script8,
455
- "M9" => sample_script9,
456
- "M10" => sample_script10,
457
- "M11" => sample_script11,
458
- "M3Schemas" => script3_schema,
459
- "M3errSchemas" => script3err_schema,
460
- "M4Schemas" => script4_schema,
461
- "M5Schemas" => script5_schema,
462
- "M6Schemas" => script6_schema,
463
- "M7Schemas" => script7_schema,
464
- "M8Schemas" => script8_schema,
465
- "M9Schemas" => script9_schema,
466
- "M10Schemas" => script10_schema,
467
- "M11Schemas" => script11_schema,
446
+ 'M1' => sample_script,
447
+ 'M2' => sample_script.gsub(/a/, 'aa').gsub(/b/, 'bb'),
448
+ 'M3' => sample_script3,
449
+ 'M3err' => sample_script3err,
450
+ 'M4' => sample_script4,
451
+ 'M5' => sample_script5,
452
+ 'M6' => sample_script6,
453
+ 'M7' => sample_script7,
454
+ 'M8' => sample_script8,
455
+ 'M9' => sample_script9,
456
+ 'M10' => sample_script10,
457
+ 'M11' => sample_script11,
458
+ 'M3Schemas' => script3_schema,
459
+ 'M3errSchemas' => script3err_schema,
460
+ 'M4Schemas' => script4_schema,
461
+ 'M5Schemas' => script5_schema,
462
+ 'M6Schemas' => script6_schema,
463
+ 'M7Schemas' => script7_schema,
464
+ 'M8Schemas' => script8_schema,
465
+ 'M9Schemas' => script9_schema,
466
+ 'M10Schemas' => script10_schema,
467
+ 'M11Schemas' => script11_schema,
468
468
  }, Date.today + 1.minute)
469
469
 
470
- @p1 = Marty::Posting.do_create("BASE", Date.today + 2.minute, 'a comment')
470
+ @p1 = Marty::Posting.do_create('BASE', Date.today + 2.minute, 'a comment')
471
471
 
472
472
  @t2 = Marty::Script.load_script_bodies({
473
- "M1" =>
474
- sample_script.gsub(/A/, "AA")+' e =? "hello"',
473
+ 'M1' =>
474
+ sample_script.gsub(/A/, 'AA') + ' e =? "hello"',
475
475
  }, Date.today + 3.minute)
476
476
 
477
- @p2 = Marty::Posting.do_create("BASE", Date.today + 4.minute, 'a comment')
478
- @data = [["some data",7,[1,2,3],{foo: "bar", baz: "quz"},5,"string"],
479
- ["some more data",[1,2,3],5,{foo: "bar", baz: "quz"},5,"string"]]
477
+ @p2 = Marty::Posting.do_create('BASE', Date.today + 4.minute, 'a comment')
478
+ @data = [['some data', 7, [1, 2, 3], { foo: 'bar', baz: 'quz' }, 5, 'string'],
479
+ ['some more data', [1, 2, 3], 5, { foo: 'bar', baz: 'quz' }, 5, 'string']]
480
480
  @data_json = @data.to_json
481
- }
481
+ end
482
482
 
483
483
  after(:each) do
484
484
  Marty::Log.delete_all
@@ -490,27 +490,27 @@ describe Marty::RpcController do
490
490
  let(:p1) { @p1 }
491
491
  let(:p2) { @p2 }
492
492
 
493
- it "should be able to post" do
493
+ it 'should be able to post' do
494
494
  post 'evaluate', params: {
495
495
  format: :json,
496
- script: "M1",
497
- node: "B",
498
- attrs: "e",
496
+ script: 'M1',
497
+ node: 'B',
498
+ attrs: 'e',
499
499
  tag: t1.name,
500
- params: { a: 333, d: 5}.to_json,
500
+ params: { a: 333, d: 5 }.to_json,
501
501
  }
502
502
  expect(response.body).to eq(4.to_json)
503
503
  end
504
504
 
505
- it "should be able to post background job" do
505
+ it 'should be able to post background job' do
506
506
  Delayed::Worker.delay_jobs = false
507
507
  post 'evaluate', params: {
508
508
  format: :json,
509
- script: "M1",
510
- node: "B",
511
- attrs: "e",
509
+ script: 'M1',
510
+ node: 'B',
511
+ attrs: 'e',
512
512
  tag: t1.name,
513
- params: { a: 333, d: 5}.to_json,
513
+ params: { a: 333, d: 5 }.to_json,
514
514
  background: true,
515
515
  }
516
516
  res = ActiveSupport::JSON.decode response.body
@@ -519,20 +519,20 @@ describe Marty::RpcController do
519
519
 
520
520
  promise = Marty::Promise.find_by_id(job_id)
521
521
 
522
- expect(promise.result).to eq({"e"=>4})
522
+ expect(promise.result).to eq('e' => 4)
523
523
 
524
524
  Delayed::Worker.delay_jobs = true
525
525
  end
526
526
 
527
- it "should be able to post background job with non-array attr" do
527
+ it 'should be able to post background job with non-array attr' do
528
528
  Delayed::Worker.delay_jobs = false
529
529
  post 'evaluate', params: {
530
530
  format: :json,
531
- script: "M1",
532
- node: "B",
533
- attrs: "e",
531
+ script: 'M1',
532
+ node: 'B',
533
+ attrs: 'e',
534
534
  tag: t1.name,
535
- params: { a: 333, d: 5}.to_json,
535
+ params: { a: 333, d: 5 }.to_json,
536
536
  background: true,
537
537
  }
538
538
  res = ActiveSupport::JSON.decode response.body
@@ -541,45 +541,45 @@ describe Marty::RpcController do
541
541
 
542
542
  promise = Marty::Promise.find_by_id(job_id)
543
543
 
544
- expect(promise.result).to eq({"e"=>4})
544
+ expect(promise.result).to eq('e' => 4)
545
545
 
546
546
  Delayed::Worker.delay_jobs = true
547
547
  end
548
548
 
549
- it "should be able to post with complex data" do
549
+ it 'should be able to post with complex data' do
550
550
  post 'evaluate', params: {
551
551
  format: :json,
552
- script: "M1",
553
- node: "D",
554
- attrs: "out",
552
+ script: 'M1',
553
+ node: 'D',
554
+ attrs: 'out',
555
555
  tag: t1.name,
556
- params: {in: @data}.to_json
556
+ params: { in: @data }.to_json
557
557
  }
558
558
  expect(response.body).to eq(@data_json)
559
559
  end
560
560
 
561
561
  # content-type: application/json structures the request a little differently
562
562
  # so we also test that
563
- it "should be able to post (JSON) with complex data" do
563
+ it 'should be able to post (JSON) with complex data' do
564
564
  @request.env['CONTENT_TYPE'] = 'application/json'
565
565
  @request.env['ACCEPT'] = 'application/json'
566
566
  post 'evaluate', params: {
567
567
  format: :json,
568
- script: "M1",
569
- node: "D",
570
- attrs:"out",
568
+ script: 'M1',
569
+ node: 'D',
570
+ attrs: 'out',
571
571
  tag: t1.name,
572
- params: {in: @data}.to_json
572
+ params: { in: @data }.to_json
573
573
  }
574
574
  expect(response.body).to eq(@data_json)
575
575
  end
576
576
 
577
- it "should be able to run scripts" do
577
+ it 'should be able to run scripts' do
578
578
  get 'evaluate', params: {
579
579
  format: :json,
580
- script: "M1",
581
- node: "A",
582
- attrs: "a",
580
+ script: 'M1',
581
+ node: 'A',
582
+ attrs: 'a',
583
583
  tag: t1.name,
584
584
  }
585
585
  # puts 'Z'*40, request.inspect
@@ -587,150 +587,150 @@ describe Marty::RpcController do
587
587
 
588
588
  get 'evaluate', params: {
589
589
  format: :json,
590
- script: "M1",
591
- node: "A",
592
- attrs: "a",
593
- params: {"a" => 4.5}.to_json,
590
+ script: 'M1',
591
+ node: 'A',
592
+ attrs: 'a',
593
+ params: { 'a' => 4.5 }.to_json,
594
594
  tag: t1.name,
595
595
  }
596
596
  expect(response.body).to eq(4.5.to_json)
597
597
 
598
598
  get 'evaluate', params: {
599
599
  format: :json,
600
- script: "M1",
601
- node: "B",
602
- attrs: "a",
603
- params: {"a" => 4.5}.to_json,
600
+ script: 'M1',
601
+ node: 'B',
602
+ attrs: 'a',
603
+ params: { 'a' => 4.5 }.to_json,
604
604
  tag: t1.name,
605
605
  }
606
606
  expect(response.body).to eq(4.5.to_json)
607
607
 
608
608
  get 'evaluate', params: {
609
609
  format: :json,
610
- script: "M1",
611
- tag: "DEV",
612
- node: "AA",
613
- attrs: "a",
614
- params: {"a" => 3.3}.to_json,
610
+ script: 'M1',
611
+ tag: 'DEV',
612
+ node: 'AA',
613
+ attrs: 'a',
614
+ params: { 'a' => 3.3 }.to_json,
615
615
  }
616
616
  expect(response.body).to eq(3.3.to_json)
617
617
  end
618
618
 
619
- it "should be able to use posting name for tags" do
619
+ it 'should be able to use posting name for tags' do
620
620
  get 'evaluate', params: {
621
621
  format: :json,
622
- script: "M1",
623
- node: "A",
624
- attrs: "a",
622
+ script: 'M1',
623
+ node: 'A',
624
+ attrs: 'a',
625
625
  tag: p0.name,
626
626
  }
627
- expect(response.body["error"]).to_not be_nil
627
+ expect(response.body['error']).to_not be_nil
628
628
 
629
629
  get 'evaluate', params: {
630
630
  format: :json,
631
- script: "M1",
632
- node: "A",
633
- attrs: "a",
634
- params: {"a" => 4.5}.to_json,
631
+ script: 'M1',
632
+ node: 'A',
633
+ attrs: 'a',
634
+ params: { 'a' => 4.5 }.to_json,
635
635
  tag: p1.name,
636
636
  }
637
637
  expect(response.body).to eq(4.5.to_json)
638
638
 
639
639
  get 'evaluate', params: {
640
640
  format: :json,
641
- script: "M1",
642
- node: "B",
643
- attrs: "a",
644
- params: {"a" => 4.5}.to_json,
641
+ script: 'M1',
642
+ node: 'B',
643
+ attrs: 'a',
644
+ params: { 'a' => 4.5 }.to_json,
645
645
  tag: p2.name,
646
646
  }
647
647
  expect(response.body).to eq(4.5.to_json)
648
648
 
649
649
  get 'evaluate', params: {
650
650
  format: :json,
651
- script: "M1",
652
- tag: "NOW",
653
- node: "AA",
654
- attrs: "a",
655
- params: {"a" => 3.3}.to_json,
651
+ script: 'M1',
652
+ tag: 'NOW',
653
+ node: 'AA',
654
+ attrs: 'a',
655
+ params: { 'a' => 3.3 }.to_json,
656
656
  }
657
657
  expect(response.body).to eq(3.3.to_json)
658
658
  end
659
659
 
660
- it "should be able to run scripts 2" do
660
+ it 'should be able to run scripts 2' do
661
661
  get 'evaluate', params: {
662
662
  format: :json,
663
- script: "M3",
664
- node: "C",
665
- attrs: "pc",
663
+ script: 'M3',
664
+ node: 'C',
665
+ attrs: 'pc',
666
666
  }
667
667
  # puts 'Z'*40, request.inspect
668
668
  expect(response.body).to eq(7.to_json)
669
669
 
670
670
  get 'evaluate', params: {
671
671
  format: :json,
672
- script: "M3",
673
- node: "B",
674
- attrs: "pc",
672
+ script: 'M3',
673
+ node: 'B',
674
+ attrs: 'pc',
675
675
  }
676
676
  # puts 'Z'*40, request.inspect
677
677
  expect(response.body).to eq(9.to_json)
678
678
 
679
679
  get 'evaluate', params: {
680
680
  format: :json,
681
- script: "M3",
682
- node: "A",
683
- attrs: "pc",
681
+ script: 'M3',
682
+ node: 'A',
683
+ attrs: 'pc',
684
684
  }
685
685
  # puts 'Z'*40, request.inspect
686
686
  expect(response.body).to match(/"error":"undefined parameter p"/)
687
687
  end
688
688
 
689
- it "should be able to handle imports" do
689
+ it 'should be able to handle imports' do
690
690
  get 'evaluate', params: {
691
691
  format: :json,
692
- script: "M4",
693
- node: "A",
694
- attrs: "a",
692
+ script: 'M4',
693
+ node: 'A',
694
+ attrs: 'a',
695
695
  }
696
696
  # puts 'Z'*40, request.inspect
697
697
  expect(response.body).to eq(2.to_json)
698
698
  end
699
699
 
700
- it "should support CSV" do
700
+ it 'should support CSV' do
701
701
  get 'evaluate', params: {
702
702
  format: :csv,
703
- script: "M4",
704
- node: "A",
705
- attrs: "a",
703
+ script: 'M4',
704
+ node: 'A',
705
+ attrs: 'a',
706
706
  }
707
707
  # puts 'Z'*40, request.inspect
708
708
  expect(response.body).to eq("2\r\n")
709
709
  end
710
710
 
711
- it "should support CSV (2)" do
711
+ it 'should support CSV (2)' do
712
712
  get 'evaluate', params: {
713
713
  format: :csv,
714
- script: "M4",
715
- node: "A",
716
- attrs: "result",
714
+ script: 'M4',
715
+ node: 'A',
716
+ attrs: 'result',
717
717
  }
718
718
  # puts 'Z'*40, request.inspect
719
719
  expect(response.body).to eq("a,b\r\n10,456\r\n789,10\r\n")
720
720
  end
721
721
 
722
- it "returns an error message on missing schema script (csv)" do
723
- Marty::ApiConfig.create!(script: "M1",
724
- node: "A",
722
+ it 'returns an error message on missing schema script (csv)' do
723
+ Marty::ApiConfig.create!(script: 'M1',
724
+ node: 'A',
725
725
  attr: nil,
726
726
  logged: false,
727
727
  input_validated: true)
728
- attr = "b"
729
- params = {"a" => 5}.to_json
728
+ attr = 'b'
729
+ params = { 'a' => 5 }.to_json
730
730
  get 'evaluate', params: {
731
731
  format: :csv,
732
- script: "M1",
733
- node: "A",
732
+ script: 'M1',
733
+ node: 'A',
734
734
  attrs: attr,
735
735
  params: params
736
736
  }
@@ -738,79 +738,79 @@ describe Marty::RpcController do
738
738
  expect(response.body).to eq("error,#{expect}")
739
739
  end
740
740
 
741
- it "returns an error message on missing schema script (json)" do
742
- Marty::ApiConfig.create!(script: "M1",
743
- node: "A",
741
+ it 'returns an error message on missing schema script (json)' do
742
+ Marty::ApiConfig.create!(script: 'M1',
743
+ node: 'A',
744
744
  attr: nil,
745
745
  logged: false,
746
746
  input_validated: true)
747
- attr = "b"
748
- params = {"a" => 5}.to_json
747
+ attr = 'b'
748
+ params = { 'a' => 5 }.to_json
749
749
  get 'evaluate', params: {
750
750
  format: :json,
751
- script: "M1",
752
- node: "A",
751
+ script: 'M1',
752
+ node: 'A',
753
753
  attrs: attr,
754
754
  params: params
755
755
  }
756
- expect = "Schema error for M1/A attrs=b: Schema not defined"
756
+ expect = 'Schema error for M1/A attrs=b: Schema not defined'
757
757
  res = JSON.parse(response.body)
758
758
  expect(res.keys.size).to eq(1)
759
- expect(res.keys[0]).to eq("error")
759
+ expect(res.keys[0]).to eq('error')
760
760
  expect(res.values[0]).to eq(expect)
761
761
  end
762
762
 
763
- it "returns an error message on missing attributes in schema script" do
764
- Marty::ApiConfig.create!(script: "M4",
765
- node: "A",
763
+ it 'returns an error message on missing attributes in schema script' do
764
+ Marty::ApiConfig.create!(script: 'M4',
765
+ node: 'A',
766
766
  attr: nil,
767
767
  logged: false,
768
768
  input_validated: true)
769
- attr = "h"
770
- params = {"f" => 5}.to_json
769
+ attr = 'h'
770
+ params = { 'f' => 5 }.to_json
771
771
  get 'evaluate', params: {
772
772
  format: :csv,
773
- script: "M4",
774
- node: "A",
773
+ script: 'M4',
774
+ node: 'A',
775
775
  attrs: attr,
776
776
  params: params
777
777
  }
778
- expect = "error,Schema error for M4/A attrs=h: Schema not defined"
778
+ expect = 'error,Schema error for M4/A attrs=h: Schema not defined'
779
779
  expect(response.body).to include(expect)
780
780
  end
781
781
 
782
- it "returns an error message on invalid schema" do
783
- Marty::ApiConfig.create!(script: "M3err",
784
- node: "A",
782
+ it 'returns an error message on invalid schema' do
783
+ Marty::ApiConfig.create!(script: 'M3err',
784
+ node: 'A',
785
785
  attr: nil,
786
786
  logged: false,
787
787
  input_validated: true)
788
- attr = "pc"
789
- params = {"p" => 5}.to_json
788
+ attr = 'pc'
789
+ params = { 'p' => 5 }.to_json
790
790
  get 'evaluate', params: {
791
791
  format: :csv,
792
- script: "M3err",
793
- node: "A",
792
+ script: 'M3err',
793
+ node: 'A',
794
794
  attrs: attr,
795
795
  params: params
796
796
  }
797
- expect = "Schema error for M3err/A attrs=pc: Problem with schema: "\
797
+ expect = 'Schema error for M3err/A attrs=pc: Problem with schema: '\
798
798
  "syntax error M3errSchemas:2\r\n"
799
799
  expect(response.body).to eq("error,#{expect}")
800
800
  end
801
801
 
802
- it "returns a validation error when validating a single attribute" do
803
- Marty::ApiConfig.create!(script: "M4",
804
- node: "A",
802
+ it 'returns a validation error when validating a single attribute' do
803
+ Marty::ApiConfig.create!(script: 'M4',
804
+ node: 'A',
805
805
  attr: nil,
806
806
  logged: false,
807
807
  input_validated: true)
808
- attr = "d"
809
- params = {"p" => "132"}.to_json
808
+ attr = 'd'
809
+ params = { 'p' => '132' }.to_json
810
810
  get 'evaluate', params: {
811
811
  format: :csv,
812
- script: "M4",
813
- node: "A",
812
+ script: 'M4',
813
+ node: 'A',
814
814
  attrs: attr,
815
815
  params: params
816
816
  }
@@ -819,163 +819,163 @@ describe Marty::RpcController do
819
819
  expect(response.body).to include(expect)
820
820
  end
821
821
 
822
- context "output_validation" do
823
- it "validates output" do
824
- Marty::ApiConfig.create!(script: "M4",
825
- node: "A",
822
+ context 'output_validation' do
823
+ it 'validates output' do
824
+ Marty::ApiConfig.create!(script: 'M4',
825
+ node: 'A',
826
826
  attr: nil,
827
827
  logged: false,
828
828
  input_validated: true,
829
829
  output_validated: true,
830
830
  strict_validate: true)
831
- attr = "ii"
832
- params = {"p" => 132, "e" => 55, "f"=>16, "i"=>"string"}.to_json
831
+ attr = 'ii'
832
+ params = { 'p' => 132, 'e' => 55, 'f' => 16, 'i' => 'string' }.to_json
833
833
  get 'evaluate', params: {
834
834
  format: :json,
835
- script: "M4",
836
- node: "A",
835
+ script: 'M4',
836
+ node: 'A',
837
837
  attrs: attr,
838
838
  params: params
839
839
  }
840
840
  res = JSON.parse(response.body)
841
- errpart = "of type string did not match the following type: integer"
841
+ errpart = 'of type string did not match the following type: integer'
842
842
  expect(res['error']).to include(errpart)
843
843
  logs = Marty::Log.all
844
844
  expect(logs.count).to eq(1)
845
- expect(logs[0].details["error"][0]).to include(errpart)
845
+ expect(logs[0].details['error'][0]).to include(errpart)
846
846
  end
847
847
 
848
- it "validates output (bad type, with strict errors)" do
849
- Marty::ApiConfig.create!(script: "M5",
850
- node: "A",
848
+ it 'validates output (bad type, with strict errors)' do
849
+ Marty::ApiConfig.create!(script: 'M5',
850
+ node: 'A',
851
851
  attr: nil,
852
852
  logged: false,
853
853
  input_validated: true,
854
854
  output_validated: true,
855
855
  strict_validate: true)
856
856
 
857
- attr = "result"
858
- params = {"f" => "Banana"}.to_json
857
+ attr = 'result'
858
+ params = { 'f' => 'Banana' }.to_json
859
859
  get 'evaluate', params: {
860
860
  format: :json,
861
- script: "M5",
862
- node: "A",
861
+ script: 'M5',
862
+ node: 'A',
863
863
  attrs: attr,
864
864
  params: params
865
865
  }
866
866
  res = JSON.parse(response.body)
867
- expect(res).to include("error")
867
+ expect(res).to include('error')
868
868
  expect1 = "The property '#/0/b' of type integer did not match the "\
869
- "following type: string"
869
+ 'following type: string'
870
870
  expect2 = "The property '#/0/a' of type string did not match the "\
871
- "following type: integer"
872
- expect(res["error"]).to include(expect1)
873
- expect(res["error"]).to include(expect2)
871
+ 'following type: integer'
872
+ expect(res['error']).to include(expect1)
873
+ expect(res['error']).to include(expect2)
874
874
 
875
875
  logs = Marty::Log.all
876
876
  expect(logs.count).to eq(1)
877
- expect(logs[0].message).to eq("API M5:A.result")
878
- expect(logs[0].details["error"].join).to include(expect1)
879
- expect(logs[0].details["error"].join).to include(expect2)
880
- expect(logs[0].details["data"]).to eq([{"a"=>"str", "b"=>456},
881
- {"a"=>789, "b"=>"str"}])
877
+ expect(logs[0].message).to eq('API M5:A.result')
878
+ expect(logs[0].details['error'].join).to include(expect1)
879
+ expect(logs[0].details['error'].join).to include(expect2)
880
+ expect(logs[0].details['data']).to eq([{ 'a' => 'str', 'b' => 456 },
881
+ { 'a' => 789, 'b' => 'str' }])
882
882
  end
883
883
 
884
- it "validates output (bad type, with non strict errors)" do
885
- Marty::ApiConfig.create!(script: "M5",
886
- node: "A",
887
- attr: "result2",
884
+ it 'validates output (bad type, with non strict errors)' do
885
+ Marty::ApiConfig.create!(script: 'M5',
886
+ node: 'A',
887
+ attr: 'result2',
888
888
  logged: false,
889
889
  input_validated: true,
890
890
  output_validated: true,
891
891
  strict_validate: false)
892
- attr = "result2"
893
- params = {"f" => "Banana"}.to_json
892
+ attr = 'result2'
893
+ params = { 'f' => 'Banana' }.to_json
894
894
  get 'evaluate', params: {
895
895
  format: :json,
896
- script: "M5",
897
- node: "A",
896
+ script: 'M5',
897
+ node: 'A',
898
898
  attrs: attr,
899
899
  params: params
900
900
  }
901
901
  expect1 = "The property '#/0/b' of type integer did not match the "\
902
- "following type: string"
902
+ 'following type: string'
903
903
  expect2 = "The property '#/0/a' of type string did not match the "\
904
- "following type: integer"
904
+ 'following type: integer'
905
905
  logs = Marty::Log.all
906
906
  expect(logs.count).to eq(1)
907
- expect(logs[0].message).to eq("API M5:A.result2")
908
- expect(logs[0].details["error"].join).to include(expect1)
909
- expect(logs[0].details["error"].join).to include(expect2)
910
- expect(logs[0].details["data"]).to eq([{"a"=>"str", "b"=>456},
911
- {"a"=>789, "b"=>"str"}])
907
+ expect(logs[0].message).to eq('API M5:A.result2')
908
+ expect(logs[0].details['error'].join).to include(expect1)
909
+ expect(logs[0].details['error'].join).to include(expect2)
910
+ expect(logs[0].details['data']).to eq([{ 'a' => 'str', 'b' => 456 },
911
+ { 'a' => 789, 'b' => 'str' }])
912
912
  end
913
913
 
914
- it "validates output (missing item)" do
915
- Marty::ApiConfig.create!(script: "M9",
916
- node: "A",
914
+ it 'validates output (missing item)' do
915
+ Marty::ApiConfig.create!(script: 'M9',
916
+ node: 'A',
917
917
  attr: nil,
918
918
  logged: false,
919
919
  input_validated: true,
920
920
  output_validated: true,
921
921
  strict_validate: true)
922
- attr = "result"
923
- params = {"b" => 122}.to_json
922
+ attr = 'result'
923
+ params = { 'b' => 122 }.to_json
924
924
  get 'evaluate', params: {
925
925
  format: :json,
926
- script: "M9",
927
- node: "A",
926
+ script: 'M9',
927
+ node: 'A',
928
928
  attrs: attr,
929
929
  params: params
930
930
  }
931
931
 
932
932
  res = JSON.parse(response.body)
933
- expect(res).to include("error")
933
+ expect(res).to include('error')
934
934
  expect1 = "The property '#/0' did not contain a required property of 'c'"
935
935
  expect2 = "The property '#/1' did not contain a required property of 'c'"
936
- expect(res["error"]).to include(expect1)
937
- expect(res["error"]).to include(expect2)
936
+ expect(res['error']).to include(expect1)
937
+ expect(res['error']).to include(expect2)
938
938
 
939
939
  logs = Marty::Log.all
940
940
  expect(logs.count).to eq(1)
941
- expect(logs[0].message).to eq("API M9:A.result")
942
- expect(logs[0].details["error"].join).to include(expect1)
943
- expect(logs[0].details["error"].join).to include(expect2)
944
- expect(logs[0].details["data"]).to eq([{"a"=>1, "b"=>123},
945
- {"a"=>789, "b"=>123}])
941
+ expect(logs[0].message).to eq('API M9:A.result')
942
+ expect(logs[0].details['error'].join).to include(expect1)
943
+ expect(logs[0].details['error'].join).to include(expect2)
944
+ expect(logs[0].details['data']).to eq([{ 'a' => 1, 'b' => 123 },
945
+ { 'a' => 789, 'b' => 123 }])
946
946
  end
947
947
  end
948
948
 
949
- it "validates schema" do
950
- Marty::ApiConfig.create!(script: "M4",
951
- node: "A",
949
+ it 'validates schema' do
950
+ Marty::ApiConfig.create!(script: 'M4',
951
+ node: 'A',
952
952
  attr: nil,
953
953
  logged: false,
954
954
  input_validated: true)
955
- attr = "lc"
956
- params = {"p" => 5}.to_json
955
+ attr = 'lc'
956
+ params = { 'p' => 5 }.to_json
957
957
  get 'evaluate', params: {
958
958
  format: :csv,
959
- script: "M4",
960
- node: "A",
959
+ script: 'M4',
960
+ node: 'A',
961
961
  attrs: attr,
962
962
  params: params
963
963
  }
964
964
  expect(response.body).to eq("9\r\n9\r\n")
965
965
  end
966
966
 
967
- it "catches JSON::Validator exceptions" do
968
- Marty::ApiConfig.create!(script: "M6",
969
- node: "A",
967
+ it 'catches JSON::Validator exceptions' do
968
+ Marty::ApiConfig.create!(script: 'M6',
969
+ node: 'A',
970
970
  attr: nil,
971
971
  logged: false,
972
972
  input_validated: true)
973
- attr = "res"
974
- params = {"b" => 5.22}.to_json
973
+ attr = 'res'
974
+ params = { 'b' => 5.22 }.to_json
975
975
  get 'evaluate', params: {
976
976
  format: :json,
977
- script: "M6",
978
- node: "A",
977
+ script: 'M6',
978
+ node: 'A',
979
979
  attrs: attr,
980
980
  params: params
981
981
  }
@@ -983,48 +983,47 @@ describe Marty::RpcController do
983
983
  'did not match one or more of the required schemas'
984
984
  res = JSON.parse(response.body)
985
985
  expect(res.keys.size).to eq(1)
986
- expect(res.keys[0]).to eq("error")
986
+ expect(res.keys[0]).to eq('error')
987
987
  expect(res.values[0]).to eq(expect)
988
988
  end
989
989
 
990
-
991
990
  class FruitsEnum
992
- VALUES=Set['Apple', 'Banana', 'Orange']
991
+ VALUES = Set['Apple', 'Banana', 'Orange']
993
992
  end
994
993
  class CondEnum
995
- VALUES=Set['no opts','opt1','opt2','opttf']
994
+ VALUES = Set['no opts', 'opt1', 'opt2', 'opttf']
996
995
  end
997
996
 
998
- it "validates schema with a pg_enum (Positive)" do
999
- Marty::ApiConfig.create!(script: "M5",
1000
- node: "A",
997
+ it 'validates schema with a pg_enum (Positive)' do
998
+ Marty::ApiConfig.create!(script: 'M5',
999
+ node: 'A',
1001
1000
  attr: nil,
1002
1001
  logged: false,
1003
1002
  input_validated: true)
1004
- attr = "res"
1005
- params = {"f" => "Banana"}.to_json
1003
+ attr = 'res'
1004
+ params = { 'f' => 'Banana' }.to_json
1006
1005
  get 'evaluate', params: {
1007
1006
  format: :csv,
1008
- script: "M5",
1009
- node: "A",
1007
+ script: 'M5',
1008
+ node: 'A',
1010
1009
  attrs: attr,
1011
1010
  params: params
1012
1011
  }
1013
1012
  expect(response.body).to eq("1\r\n")
1014
1013
  end
1015
1014
 
1016
- it "validates schema with a pg_enum (Negative)" do
1017
- Marty::ApiConfig.create!(script: "M5",
1018
- node: "A",
1015
+ it 'validates schema with a pg_enum (Negative)' do
1016
+ Marty::ApiConfig.create!(script: 'M5',
1017
+ node: 'A',
1019
1018
  attr: nil,
1020
1019
  logged: false,
1021
1020
  input_validated: true)
1022
- attr = "res"
1023
- params = {"f" => "Beans"}.to_json
1021
+ attr = 'res'
1022
+ params = { 'f' => 'Beans' }.to_json
1024
1023
  get 'evaluate', params: {
1025
1024
  format: :csv,
1026
- script: "M5",
1027
- node: "A",
1025
+ script: 'M5',
1026
+ node: 'A',
1028
1027
  attrs: attr,
1029
1028
  params: params
1030
1029
  }
@@ -1032,132 +1031,129 @@ describe Marty::RpcController do
1032
1031
  expect(response.body).to include(expect)
1033
1032
  end
1034
1033
 
1035
- it "validates schema with a non-existant enum" do
1036
- Marty::ApiConfig.create!(script: "M7",
1037
- node: "A",
1034
+ it 'validates schema with a non-existant enum' do
1035
+ Marty::ApiConfig.create!(script: 'M7',
1036
+ node: 'A',
1038
1037
  attr: nil,
1039
1038
  logged: false,
1040
1039
  input_validated: true)
1041
- attr = "res"
1042
- params = {"b" => "MemberOfANonExistantEnum"}.to_json
1040
+ attr = 'res'
1041
+ params = { 'b' => 'MemberOfANonExistantEnum' }.to_json
1043
1042
  get 'evaluate', params: {
1044
1043
  format: :json,
1045
- script: "M7",
1046
- node: "A",
1044
+ script: 'M7',
1045
+ node: 'A',
1047
1046
  attrs: attr,
1048
1047
  params: params
1049
1048
  }
1050
1049
  expect = "property '#/b': 'NonExistantEnum' is not a pg_enum"
1051
1050
  res = JSON.parse(response.body)
1052
1051
  expect(res.keys.size).to eq(1)
1053
- expect(res.keys[0]).to eq("error")
1052
+ expect(res.keys[0]).to eq('error')
1054
1053
  expect(res.values[0]).to include(expect)
1055
1054
  end
1056
1055
 
1057
- it "validates pgenum with capitalization issues" do
1058
- Marty::ApiConfig.create!(script: "M8",
1059
- node: "A",
1056
+ it 'validates pgenum with capitalization issues' do
1057
+ Marty::ApiConfig.create!(script: 'M8',
1058
+ node: 'A',
1060
1059
  attr: nil,
1061
1060
  logged: false,
1062
1061
  input_validated: true)
1063
- skip "pending until a solution is found that handles "\
1064
- "autoload issues involving constantize"
1065
- attr = "res"
1066
- params = {"b" => "Annual"}.to_json
1062
+ skip 'pending until a solution is found that handles '\
1063
+ 'autoload issues involving constantize'
1064
+ attr = 'res'
1065
+ params = { 'b' => 'Annual' }.to_json
1067
1066
  get 'evaluate', params: {
1068
1067
  format: :json,
1069
- script: "M8",
1070
- node: "A",
1068
+ script: 'M8',
1069
+ node: 'A',
1071
1070
  attrs: attr,
1072
1071
  params: params
1073
1072
  }
1074
1073
  end
1075
1074
 
1076
- it "should log good req" do
1077
- Marty::ApiConfig.create!(script: "M3",
1078
- node: "A",
1075
+ it 'should log good req' do
1076
+ Marty::ApiConfig.create!(script: 'M3',
1077
+ node: 'A',
1079
1078
  attr: nil,
1080
1079
  logged: true)
1081
- attr = "lc"
1082
- params = {"p" => 5}
1080
+ attr = 'lc'
1081
+ params = { 'p' => 5 }
1083
1082
  get 'evaluate', params: {
1084
1083
  format: :csv,
1085
- script: "M3",
1086
- node: "A",
1084
+ script: 'M3',
1085
+ node: 'A',
1087
1086
  attrs: attr,
1088
1087
  params: params.to_json
1089
1088
  }
1090
1089
  expect(response.body).to eq("9\r\n9\r\n")
1091
1090
  log = Marty::Log.order(id: :desc).first
1092
1091
 
1093
- expect(log.details['script']).to eq("M3")
1094
- expect(log.details['node']).to eq("A")
1092
+ expect(log.details['script']).to eq('M3')
1093
+ expect(log.details['node']).to eq('A')
1095
1094
  expect(log.details['attrs']).to eq(attr)
1096
1095
  expect(log.details['input']).to eq(params)
1097
1096
  expect(log.details['output']).to eq([9, 9])
1098
- expect(log.details['remote_ip']).to eq("0.0.0.0")
1097
+ expect(log.details['remote_ip']).to eq('0.0.0.0')
1099
1098
  expect(log.details['error']).to eq(nil)
1100
-
1101
1099
  end
1102
1100
 
1103
- it "should log good req [background]" do
1104
- Marty::ApiConfig.create!(script: "M3",
1105
- node: "A",
1101
+ it 'should log good req [background]' do
1102
+ Marty::ApiConfig.create!(script: 'M3',
1103
+ node: 'A',
1106
1104
  attr: nil,
1107
1105
  logged: true)
1108
- attr = "lc"
1109
- params = {"p" => 5}
1106
+ attr = 'lc'
1107
+ params = { 'p' => 5 }
1110
1108
  get 'evaluate', params: {
1111
1109
  format: :csv,
1112
- script: "M3",
1113
- node: "A",
1110
+ script: 'M3',
1111
+ node: 'A',
1114
1112
  attrs: attr,
1115
1113
  params: params.to_json,
1116
1114
  background: true
1117
1115
  }
1118
1116
  expect(response.body).to match(/job_id,/)
1119
1117
  log = Marty::Log.order(id: :desc).first
1120
-
1121
1118
  end
1122
1119
 
1123
- it "should not log if it should not log" do
1120
+ it 'should not log if it should not log' do
1124
1121
  get 'evaluate', params: {
1125
1122
  format: :json,
1126
- script: "M1",
1127
- node: "A",
1128
- attrs: "a",
1123
+ script: 'M1',
1124
+ node: 'A',
1125
+ attrs: 'a',
1129
1126
  tag: t1.name,
1130
1127
  }
1131
1128
  expect(Marty::Log.count).to eq(0)
1132
1129
  end
1133
1130
 
1134
- it "should handle atom attribute" do
1135
- Marty::ApiConfig.create!(script: "M3",
1136
- node: "A",
1131
+ it 'should handle atom attribute' do
1132
+ Marty::ApiConfig.create!(script: 'M3',
1133
+ node: 'A',
1137
1134
  attr: nil,
1138
1135
  logged: true)
1139
- params = {"p" => 5}
1136
+ params = { 'p' => 5 }
1140
1137
  get 'evaluate', params: {
1141
1138
  format: :csv,
1142
- script: "M3",
1143
- node: "A",
1144
- attrs: "lc",
1139
+ script: 'M3',
1140
+ node: 'A',
1141
+ attrs: 'lc',
1145
1142
  params: params.to_json
1146
1143
  }
1147
1144
  expect(response.body).to eq("9\r\n9\r\n")
1148
1145
  log = Marty::Log.order(id: :desc).first
1149
1146
 
1150
- expect(log.details['script']).to eq("M3")
1151
- expect(log.details['node']).to eq("A")
1152
- expect(log.details['attrs']).to eq("lc")
1147
+ expect(log.details['script']).to eq('M3')
1148
+ expect(log.details['node']).to eq('A')
1149
+ expect(log.details['attrs']).to eq('lc')
1153
1150
  expect(log.details['input']).to eq(params)
1154
1151
  expect(log.details['output']).to eq([9, 9])
1155
- expect(log.details['remote_ip']).to eq("0.0.0.0")
1152
+ expect(log.details['remote_ip']).to eq('0.0.0.0')
1156
1153
  expect(log.details['error']).to eq(nil)
1157
-
1158
1154
  end
1159
1155
 
1160
- it "should support api authorization - api_key not required" do
1156
+ it 'should support api authorization - api_key not required' do
1161
1157
  api = Marty::ApiAuth.new
1162
1158
  api.app_name = 'TestApp'
1163
1159
  api.script_name = 'M2'
@@ -1165,14 +1161,14 @@ describe Marty::RpcController do
1165
1161
 
1166
1162
  get 'evaluate', params: {
1167
1163
  format: :json,
1168
- script: "M3",
1169
- node: "C",
1170
- attrs: "pc",
1164
+ script: 'M3',
1165
+ node: 'C',
1166
+ attrs: 'pc',
1171
1167
  }
1172
1168
  expect(response.body).to eq(7.to_json)
1173
1169
  end
1174
1170
 
1175
- it "should support api authorization - api_key required but missing" do
1171
+ it 'should support api authorization - api_key required but missing' do
1176
1172
  api = Marty::ApiAuth.new
1177
1173
  api.app_name = 'TestApp'
1178
1174
  api.script_name = 'M3'
@@ -1180,14 +1176,14 @@ describe Marty::RpcController do
1180
1176
 
1181
1177
  get 'evaluate', params: {
1182
1178
  format: :json,
1183
- script: "M3",
1184
- node: "C",
1185
- attrs: "pc",
1179
+ script: 'M3',
1180
+ node: 'C',
1181
+ attrs: 'pc',
1186
1182
  }
1187
1183
  expect(response.body).to match(/"error":"Permission denied"/)
1188
1184
  end
1189
1185
 
1190
- it "should support api authorization - api_key required and supplied" do
1186
+ it 'should support api authorization - api_key required and supplied' do
1191
1187
  api = Marty::ApiAuth.new
1192
1188
  api.app_name = 'TestApp'
1193
1189
  api.script_name = 'M3'
@@ -1196,26 +1192,26 @@ describe Marty::RpcController do
1196
1192
  apic = Marty::ApiConfig.create!(script: 'M3',
1197
1193
  logged: true)
1198
1194
 
1199
- attr = "pc"
1195
+ attr = 'pc'
1200
1196
  get 'evaluate', params: {
1201
1197
  format: :json,
1202
- script: "M3",
1203
- node: "C",
1198
+ script: 'M3',
1199
+ node: 'C',
1204
1200
  attrs: attr,
1205
1201
  api_key: api.api_key,
1206
1202
  }
1207
1203
  expect(response.body).to eq(7.to_json)
1208
1204
  log = Marty::Log.order(id: :desc).first
1209
1205
 
1210
- expect(log.details['script']).to eq("M3")
1211
- expect(log.details['node']).to eq("C")
1206
+ expect(log.details['script']).to eq('M3')
1207
+ expect(log.details['node']).to eq('C')
1212
1208
  expect(log.details['attrs']).to eq(attr)
1213
1209
  expect(log.details['output']).to eq(7)
1214
- expect(log.details['remote_ip']).to eq("0.0.0.0")
1215
- expect(log.details['auth_name']).to eq("TestApp")
1210
+ expect(log.details['remote_ip']).to eq('0.0.0.0')
1211
+ expect(log.details['auth_name']).to eq('TestApp')
1216
1212
  end
1217
1213
 
1218
- it "should support api authorization - api_key required but incorrect" do
1214
+ it 'should support api authorization - api_key required but incorrect' do
1219
1215
  api = Marty::ApiAuth.new
1220
1216
  api.app_name = 'TestApp'
1221
1217
  api.script_name = 'M3'
@@ -1223,39 +1219,39 @@ describe Marty::RpcController do
1223
1219
 
1224
1220
  get 'evaluate', params: {
1225
1221
  format: :json,
1226
- script: "M3",
1227
- node: "C",
1228
- attrs: "pc",
1222
+ script: 'M3',
1223
+ node: 'C',
1224
+ attrs: 'pc',
1229
1225
  api_key: api.api_key + 'x',
1230
1226
  }
1231
1227
  expect(response.body).to match(/"error":"Permission denied"/)
1232
1228
  end
1233
1229
 
1234
- it "should convert incoming ints in number fields to float" do
1230
+ it 'should convert incoming ints in number fields to float' do
1235
1231
  api = Marty::ApiAuth.new
1236
1232
  api.app_name = 'TestApp'
1237
1233
  api.script_name = 'M11'
1238
1234
  api.save!
1239
1235
  p = File.expand_path('../../fixtures/json', __FILE__)
1240
- f = "%s/%s" % [p, "rpc_controller.json"]
1236
+ f = '%s/%s' % [p, 'rpc_controller.json']
1241
1237
  begin
1242
1238
  tests = JSON.parse(File.read(f))
1243
- rescue => e
1239
+ rescue StandardError => e
1244
1240
  puts "Error parsing #{f}: #{e.message}"
1245
1241
  raise
1246
1242
  end
1247
- aggregate_failures "input coercing" do
1243
+ aggregate_failures 'input coercing' do
1248
1244
  tests.each_with_index do |t, idx|
1249
1245
  get 'evaluate', params: {
1250
1246
  format: :json,
1251
- script: "M11",
1252
- node: "A",
1247
+ script: 'M11',
1248
+ node: 'A',
1253
1249
  attrs: t['attr'],
1254
1250
  api_key: api.api_key,
1255
1251
  params: t['request'].to_json
1256
1252
  }
1257
1253
  resp = JSON.parse(response.body)
1258
- comp = struct_compare(resp, t['result'], {"float_int_nomatch"=>true})
1254
+ comp = struct_compare(resp, t['result'], 'float_int_nomatch' => true)
1259
1255
  (puts "TEST=#{idx}\n#{comp}"; binding.pry) if comp &&
1260
1256
  ENV['PRY'] == 'true'
1261
1257
 
@@ -1264,21 +1260,21 @@ describe Marty::RpcController do
1264
1260
  end
1265
1261
  end
1266
1262
 
1267
- context "conditional validation" do
1263
+ context 'conditional validation' do
1268
1264
  before(:all) do
1269
- Marty::ApiConfig.create!(script: "M10",
1270
- node: "A",
1265
+ Marty::ApiConfig.create!(script: 'M10',
1266
+ node: 'A',
1271
1267
  attr: nil,
1272
1268
  logged: false,
1273
1269
  input_validated: true,
1274
1270
  output_validated: false,
1275
1271
  strict_validate: false)
1276
1272
  end
1277
- def do_call(req1, req2, req3, optionals={})
1278
- attr = "v1"
1279
- params = optionals.merge({"req1" => req1,
1280
- "req2"=> req2,
1281
- "req3"=> req3}).to_json
1273
+ def do_call(req1, req2, req3, optionals = {})
1274
+ attr = 'v1'
1275
+ params = optionals.merge('req1' => req1,
1276
+ 'req2' => req2,
1277
+ 'req3' => req3).to_json
1282
1278
 
1283
1279
  # to see what the schema helpers generated:
1284
1280
  # engine = Marty::ScriptSet.new(nil).get_engine("M10Schemas")
@@ -1287,20 +1283,19 @@ describe Marty::RpcController do
1287
1283
 
1288
1284
  get 'evaluate', params: {
1289
1285
  format: :json,
1290
- script: "M10",
1291
- node: "A",
1286
+ script: 'M10',
1287
+ node: 'A',
1292
1288
  attrs: attr,
1293
1289
  params: params
1294
1290
  }
1295
-
1296
1291
  end
1297
1292
 
1298
- it "does conditional" do
1299
- aggregate_failures "conditionals" do
1293
+ it 'does conditional' do
1294
+ aggregate_failures 'conditionals' do
1300
1295
  [
1301
1296
  # first group has all required fields
1302
- [['opt1', 'no opts', 'no opts', opt1: 'hi mom'], "hi mom"],
1303
- [['no opts', 'no opts', 'no opts', opt1: 'hi mom'], "no opts"],
1297
+ [['opt1', 'no opts', 'no opts', opt1: 'hi mom'], 'hi mom'],
1298
+ [['no opts', 'no opts', 'no opts', opt1: 'hi mom'], 'no opts'],
1304
1299
  [['opt2', 'opt2', 'no opts', optn: 'foo'], 'foo'],
1305
1300
  [['opt2', 'no opts', 'opt2'], 'req3'],
1306
1301
  [['opt2', 'no opts', 'opttf', opttf: true, opttrue: 'bar'], 'bar'],
@@ -1317,19 +1312,18 @@ describe Marty::RpcController do
1317
1312
  "did not contain a required property of 'opttrue'"],
1318
1313
  [['opt2', 'no opts', 'opttf', opttf: false],
1319
1314
  "did not contain a required property of 'optfalse'"],
1320
- [['opt2', 'no opts', 'opttf', opttf: false, optfalse: "val",
1321
- optdisallow: "hi mom"],
1315
+ [['opt2', 'no opts', 'opttf', opttf: false, optfalse: 'val',
1316
+ optdisallow: 'hi mom'],
1322
1317
  "disallowed parameter 'optdisallow' of type string was received"],
1323
- [['opt2', 'no opts', 'opttf', opttf: false, optfalse: "val",
1324
- opt3: "hi"],
1318
+ [['opt2', 'no opts', 'opttf', opttf: false, optfalse: 'val',
1319
+ opt3: 'hi'],
1325
1320
  "disallowed parameter 'opt3' of type string was received"],
1326
- [['opt2', 'no opts', 'opttf', opttf: true, opttrue: "val",
1327
- opt4: "mom"],
1321
+ [['opt2', 'no opts', 'opttf', opttf: true, opttrue: 'val',
1322
+ opt4: 'mom'],
1328
1323
  "disallowed parameter 'opt4' of type string was received"],
1329
- [['opt2', 'no opts', 'xyz', opt5: "hi"],
1324
+ [['opt2', 'no opts', 'xyz', opt5: 'hi'],
1330
1325
  "disallowed parameter 'opt5' of type string was received"],
1331
- ].each do
1332
- |a, exp|
1326
+ ].each do |a, exp|
1333
1327
  do_call(*a)
1334
1328
  res = JSON.parse(response.body) rescue response.body
1335
1329
  expect(res.is_a?(Hash) ? res['error'] : res).to include(exp)
@@ -1338,44 +1332,44 @@ describe Marty::RpcController do
1338
1332
  end
1339
1333
  end
1340
1334
 
1341
- context "error handling" do
1335
+ context 'error handling' do
1342
1336
  it 'returns bad attrs if attr is not a string' do
1343
- get :evaluate, params: {format: :json, attrs: 0}
1337
+ get :evaluate, params: { format: :json, attrs: 0 }
1344
1338
  expect(response.body).to match(/"error":"Malformed attrs"/)
1345
1339
  end
1346
1340
 
1347
1341
  it 'returns malformed attrs for improperly formatted json' do
1348
- get :evaluate, params: { format: :json, attrs: "{" }
1342
+ get :evaluate, params: { format: :json, attrs: '{' }
1349
1343
  expect(response.body).to match(/"error":"Malformed attrs"/)
1350
1344
  end
1351
1345
 
1352
1346
  it 'returns malformed attrs if attr is not an array of strings' do
1353
- get :evaluate, params: {format: :json, attrs: "{}"}
1347
+ get :evaluate, params: { format: :json, attrs: '{}' }
1354
1348
  expect(response.body).to match(/"error":"Malformed attrs"/)
1355
1349
 
1356
- get :evaluate, params: { format: :json, attrs: "[0]" }
1350
+ get :evaluate, params: { format: :json, attrs: '[0]' }
1357
1351
  expect(response.body).to match(/"error":"Malformed attrs"/)
1358
1352
  end
1359
1353
 
1360
1354
  it 'returns malformed params for improperly formatted json' do
1361
- get :evaluate, params: {format: :json, attrs: "e", params: "{"}
1355
+ get :evaluate, params: { format: :json, attrs: 'e', params: '{' }
1362
1356
  expect(response.body).to match(/"error":"Malformed params"/)
1363
1357
  end
1364
1358
 
1365
1359
  it 'returns malformed params if params is not a hash' do
1366
- get :evaluate, params: {format: :json, attrs: "e", params: "[0]"}
1360
+ get :evaluate, params: { format: :json, attrs: 'e', params: '[0]' }
1367
1361
  expect(response.body).to match(/"error":"Malformed params"/)
1368
1362
  end
1369
1363
 
1370
1364
  it 'returns engine/tag lookup error if script not found' do
1371
- get :evaluate, params: {format: :json, script: 'M1', attrs: "e", tag: 'invalid'}
1365
+ get :evaluate, params: { format: :json, script: 'M1', attrs: 'e', tag: 'invalid' }
1372
1366
  expect(response.body).to match(/bad tag identifier.*invalid/)
1373
- get :evaluate, params: {format: :json, script: 'Invalid', attrs: "e", tag: t1.name}
1367
+ get :evaluate, params: { format: :json, script: 'Invalid', attrs: 'e', tag: t1.name }
1374
1368
  expect(response.body).to match(/"error":"Can't get engine:/)
1375
1369
  end
1376
1370
 
1377
1371
  it 'returns the script runtime error (no node specified)' do
1378
- get :evaluate, params: {format: :json, script: 'M1', attrs: "e", tag: t1.name}
1372
+ get :evaluate, params: { format: :json, script: 'M1', attrs: 'e', tag: t1.name }
1379
1373
  expect(response.body).to match(/"error":"bad node/)
1380
1374
  end
1381
1375
  end