marty 2.5.2 → 2.5.4

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -14,7 +14,7 @@ module Marty
14
14
  self.use_transactional_tests = true
15
15
  end
16
16
 
17
- it "log has its own connection" do
17
+ it 'log has its own connection' do
18
18
  log_conn = Marty::Log.connection.raw_connection
19
19
  posting_conn = Marty::Posting.connection.raw_connection
20
20
  script_conn = Marty::Script.connection.raw_connection
@@ -23,26 +23,26 @@ module Marty
23
23
  expect(posting_conn).to equal(script_conn)
24
24
  end
25
25
 
26
- it "logs" do
27
- info_s = {'info' => 'message'}
28
- error_s = [1, 2, 3, {'error' =>'message'}]
29
- fatal_s = ["string", 123, {'fatal' => "message",
30
- 'another_key' => 'value'}]
26
+ it 'logs' do
27
+ info_s = { 'info' => 'message' }
28
+ error_s = [1, 2, 3, { 'error' => 'message' }]
29
+ fatal_s = ['string', 123, { 'fatal' => 'message',
30
+ 'another_key' => 'value' }]
31
31
  Marty::Logger.info('info message', info_s)
32
32
  Marty::Logger.error('error message', error_s)
33
33
  Marty::Logger.fatal('fatal message', fatal_s)
34
34
  log = Marty::Log.all
35
- log_detail = log.map{|l| [l[:message_type], l[:message], l[:details]]}
36
- log_ts = log.map{|l| l[:timestamp]}
37
- expect(log_detail[0]).to eq(["info", "info message", info_s])
38
- expect(log_detail[1]).to eq(["error", "error message", error_s])
39
- expect(log_detail[2]).to eq(["fatal", "fatal message", fatal_s])
35
+ log_detail = log.map { |l| [l[:message_type], l[:message], l[:details]] }
36
+ log_ts = log.map { |l| l[:timestamp] }
37
+ expect(log_detail[0]).to eq(['info', 'info message', info_s])
38
+ expect(log_detail[1]).to eq(['error', 'error message', error_s])
39
+ expect(log_detail[2]).to eq(['fatal', 'fatal message', fatal_s])
40
40
  log_ts.each do |ts|
41
41
  expect(ts.to_i).to be_within(5).of(Time.zone.now.to_i)
42
42
  end
43
43
  end
44
44
 
45
- it "with_logging" do
45
+ it 'with_logging' do
46
46
  bd = 'block description'
47
47
  the_error = 'error during my block'
48
48
  data = [1, 2, 3, Marty::User.first]
@@ -50,19 +50,19 @@ module Marty
50
50
  Marty::Logger.with_logging(bd, data) do
51
51
  raise the_error
52
52
  end
53
- rescue => e
53
+ rescue StandardError => e
54
54
  raised = e.message
55
55
  end
56
56
  expect(raised).to eq("#{bd}: #{the_error}")
57
57
  log = Marty::Log.first
58
58
  expect(log.message_type).to eq('error')
59
59
  expect(log.message).to eq(bd)
60
- expect(log.details).to eq({ "message" => the_error,
61
- "data" => JSON.parse(data.to_json)})
60
+ expect(log.details).to eq('message' => the_error,
61
+ 'data' => JSON.parse(data.to_json))
62
62
  end
63
63
  end
64
64
 
65
- describe "Exercise" do
65
+ describe 'Exercise' do
66
66
  before(:all) do
67
67
  @clean_file = "/tmp/clean_#{Process.pid}.psql"
68
68
  save_clean_db(@clean_file)
@@ -81,28 +81,27 @@ module Marty
81
81
  after(:all) do
82
82
  restore_clean_db(@clean_file)
83
83
  stop_delayed_job
84
- File.unlink("/tmp/logaction.txt")
84
+ File.unlink('/tmp/logaction.txt')
85
85
  Marty::Log.cleanup(0)
86
86
  self.use_transactional_tests = true
87
87
  end
88
88
 
89
- it "handles heavy load" do
90
- File.open(Rails.root.join("log/test.log")) do |f|
89
+ it 'handles heavy load' do
90
+ File.open(Rails.root.join('log/test.log')) do |f|
91
91
  f.seek(0, IO::SEEK_END)
92
92
  engine = Marty::ScriptSet.new.get_engine(NAME_K)
93
93
 
94
94
  res = (1..1000).map do |i|
95
- engine.background_eval("LOGGER", {"msgid" => i}, ["result"])
95
+ engine.background_eval('LOGGER', { 'msgid' => i }, ['result'])
96
96
  end
97
97
 
98
98
  # wait for all the jobs to finish; collect/check their result
99
- expect(res.map {|x| x["result"]}.sort).to eq (1..1000).to_a
99
+ expect(res.map { |x| x['result'] }.sort).to eq (1..1000).to_a
100
100
 
101
- line_count = File.readlines("/tmp/logaction.txt").count
101
+ line_count = File.readlines('/tmp/logaction.txt').count
102
102
 
103
103
  log_count = Marty::Log.all.count
104
- failed_count = f.readlines.select do
105
- |l|
104
+ failed_count = f.readlines.select do |l|
106
105
  l == "Marty::Logger failure: database is locked\n"
107
106
  end.count
108
107
 
@@ -1,18 +1,17 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  module Marty
4
-
5
- entities =<<EOF
4
+ entities = <<EOF
6
5
  name
7
6
  PLS
8
7
  EOF
9
- bud_cats =<<EOF
8
+ bud_cats = <<EOF
10
9
  name
11
10
  Conv Fixed 30
12
11
  Conv Fixed 20
13
12
  EOF
14
13
 
15
- fannie_bup =<<EOF
14
+ fannie_bup = <<EOF
16
15
  entity bud_category note_rate buy_up buy_down settlement_mm settlement_yy
17
16
  Conv Fixed 30 2.250 4.42000 7.24000 12 2012
18
17
  Conv Fixed 30 2.375 4.42000 7.24000 12 2012
@@ -30,7 +29,7 @@ PLS Conv Fixed 20 2.875 5.24800 7.95900 12 2012
30
29
  PLS Conv Fixed 20 2.875 5.24800 7.95900 11 2012
31
30
  EOF
32
31
 
33
- script =<<EOF
32
+ script = <<EOF
34
33
  A:
35
34
  pt =?
36
35
  entity =?
@@ -48,21 +47,21 @@ A:
48
47
  a_func = Gemini::FannieBup.a_func('infinity', e_id, bc_id)
49
48
  b_func = Gemini::FannieBup.b_func('infinity', e_id, bc_id, 12)
50
49
  EOF
51
- errscript =<<EOF
50
+ errscript = <<EOF
52
51
  Err:
53
52
  pt =?
54
53
  entity =?
55
54
  note_rate =?
56
55
  result = Gemini::FannieBup.%s(pt, entity, note_rate, 1)
57
56
  EOF
58
- errscript2 =<<EOF
57
+ errscript2 = <<EOF
59
58
  Err:
60
59
  pt =?
61
60
  e_id =?
62
61
  bc_id =?
63
62
  result = Gemini::FannieBup.%s(pt, e_id, bc_id, nil)
64
63
  EOF
65
- errscript3 =<<EOF
64
+ errscript3 = <<EOF
66
65
  Err:
67
66
  pt =?
68
67
  e_id =?
@@ -71,128 +70,132 @@ Err:
71
70
  result = Gemini::FannieBup.%s(pt, e_id, bc_id, mm, {})
72
71
  EOF
73
72
 
74
- describe 'McflyModel' do
75
- before(:all) do
76
- @clean_file = "/tmp/clean_#{Process.pid}.psql"
77
- save_clean_db(@clean_file)
78
- marty_whodunnit
79
- dt = Date.today
80
- Marty::DataImporter.do_import_summary(Gemini::Entity, entities)
81
- Marty::DataImporter.do_import_summary(Gemini::BudCategory, bud_cats)
82
- Marty::DataImporter.do_import_summary(Gemini::FannieBup, fannie_bup)
73
+ describe 'McflyModel' do
74
+ before(:all) do
75
+ @clean_file = "/tmp/clean_#{Process.pid}.psql"
76
+ save_clean_db(@clean_file)
77
+ marty_whodunnit
78
+ dt = Date.today
79
+ Marty::DataImporter.do_import_summary(Gemini::Entity, entities)
80
+ Marty::DataImporter.do_import_summary(Gemini::BudCategory, bud_cats)
81
+ Marty::DataImporter.do_import_summary(Gemini::FannieBup, fannie_bup)
82
+ Marty::Script.load_script_bodies(
83
+ {
84
+ 'AA' => script,
85
+ }, dt)
86
+ @errs = ['E1', 'lookup_p',
87
+ 'E2', 'clookup_p',
88
+ 'E3', 'lookupn_p',
89
+ 'E4', 'clookupn_p']
90
+
91
+ @errs.in_groups_of(2) do |name, fn|
83
92
  Marty::Script.load_script_bodies(
84
- {
85
- "AA" => script,
86
- }, dt)
87
- @errs = ['E1', 'lookup_p',
88
- 'E2', 'clookup_p',
89
- 'E3', 'lookupn_p',
90
- 'E4', 'clookupn_p']
91
-
92
- @errs.in_groups_of(2) do |name, fn|
93
- Marty::Script.load_script_bodies(
94
93
  {
95
94
  name => (errscript % fn),
96
95
  }, Date.today)
97
- end
96
+ end
98
97
 
99
- Marty::Script.load_script_bodies({'E5'=>(errscript2 % 'a_func_p')}, dt)
100
- Marty::Script.load_script_bodies({'E6'=>(errscript3 % 'b_func_p')}, dt)
98
+ Marty::Script.load_script_bodies({ 'E5' => (errscript2 % 'a_func_p') }, dt)
99
+ Marty::Script.load_script_bodies({ 'E6' => (errscript3 % 'b_func_p') }, dt)
101
100
 
102
- @engine = Marty::ScriptSet.new.get_engine("AA")
103
- end
104
- after(:all) do
105
- restore_clean_db(@clean_file)
106
- Marty::ScriptSet.clear_cache
107
- end
108
- let(:params) {{"pt" =>'infinity',
109
- "entity" => Gemini::Entity.all.first,
110
- "note_rate" => 2.875}}
111
- it "lookup mode default" do
112
- a1 = @engine.evaluate("A", "lookup", params)
113
- a2 = @engine.evaluate("A", "clookup", params)
114
- expect(a1).to eq(a2) # cache/non return same
115
- expect(a1.class).to eq(OpenStruct) # mode default so return OS
116
- expect(a2.class).to eq(OpenStruct)
117
-
118
- # check that keys are non mcfly non uniqueness
119
- expect(a1.to_h.keys.to_set).to eq(Set[:buy_up, :buy_down])
120
- end
101
+ @engine = Marty::ScriptSet.new.get_engine('AA')
102
+ end
103
+ after(:all) do
104
+ restore_clean_db(@clean_file)
105
+ Marty::ScriptSet.clear_cache
106
+ end
107
+ let(:params) do
108
+ { 'pt' => 'infinity',
109
+ 'entity' => Gemini::Entity.all.first,
110
+ 'note_rate' => 2.875 }
111
+ end
112
+ it 'lookup mode default' do
113
+ a1 = @engine.evaluate('A', 'lookup', params)
114
+ a2 = @engine.evaluate('A', 'clookup', params)
115
+ expect(a1).to eq(a2) # cache/non return same
116
+ expect(a1.class).to eq(OpenStruct) # mode default so return OS
117
+ expect(a2.class).to eq(OpenStruct)
118
+
119
+ # check that keys are non mcfly non uniqueness
120
+ expect(a1.to_h.keys.to_set).to eq(Set[:buy_up, :buy_down])
121
+ end
121
122
 
122
- it "lookup non generated" do
123
- # a1 will be AR Relations
124
- # b1 will be OpenStructs because the b fns return #first
125
- e_id = Gemini::Entity.where(name: "PLS").first.id
126
- bc_id = Gemini::BudCategory.where(name: "Conv Fixed 20").first.id
127
- p = {"e_id"=>e_id, "bc_id"=>bc_id}
128
- a1 = @engine.evaluate("A", "a_func", p)
129
- b1 = @engine.evaluate("A", "b_func", p)
123
+ it 'lookup non generated' do
124
+ # a1 will be AR Relations
125
+ # b1 will be OpenStructs because the b fns return #first
126
+ e_id = Gemini::Entity.where(name: 'PLS').first.id
127
+ bc_id = Gemini::BudCategory.where(name: 'Conv Fixed 20').first.id
128
+ p = { 'e_id' => e_id, 'bc_id' => bc_id }
129
+ a1 = @engine.evaluate('A', 'a_func', p)
130
+ b1 = @engine.evaluate('A', 'b_func', p)
130
131
 
131
- # all return relations
132
- expect(ActiveRecord::Relation === a1).to be_truthy
133
- expect(ActiveRecord::Base === a1.first).to be_truthy
132
+ # all return relations
133
+ expect(ActiveRecord::Relation === a1).to be_truthy
134
+ expect(ActiveRecord::Base === a1.first).to be_truthy
134
135
 
135
- expect(a1.to_a.count).to eq(2)
136
+ expect(a1.to_a.count).to eq(2)
136
137
 
137
- # a1 lookup did not include extra attrs
138
- expect(a1.first.attributes.keys.to_set).to eq(Set["id", "buy_up", "buy_down"])
138
+ # a1 lookup did not include extra attrs
139
+ expect(a1.first.attributes.keys.to_set).to eq(Set['id', 'buy_up', 'buy_down'])
139
140
 
140
- # a1 is AR but still missing the FK entity_id so will raise
141
- expect{a1.first.entity}.to raise_error(/missing attribute: entity_id/)
141
+ # a1 is AR but still missing the FK entity_id so will raise
142
+ expect { a1.first.entity }.to raise_error(/missing attribute: entity_id/)
142
143
 
143
- expect(b1.class).to eq(OpenStruct)
144
+ expect(b1.class).to eq(OpenStruct)
144
145
 
145
- # make sure b1 has correct keys
146
- expect(b1.to_h.keys.to_set).to eq(Set[:buy_up, :buy_down])
147
- end
146
+ # make sure b1 has correct keys
147
+ expect(b1.to_h.keys.to_set).to eq(Set[:buy_up, :buy_down])
148
+ end
148
149
 
149
- it "lookup mode nil" do
150
- # make sure ARs are returned
151
- a1 = @engine.evaluate("A", "lookupn", params)
152
- a2 = @engine.evaluate("A", "clookupn", params)
153
- expect(a1).to eq(a2)
154
- expect(ActiveRecord::Relation === a1).to be_truthy
155
- expect(a1.to_a.count).to eq(4)
156
- end
150
+ it 'lookup mode nil' do
151
+ # make sure ARs are returned
152
+ a1 = @engine.evaluate('A', 'lookupn', params)
153
+ a2 = @engine.evaluate('A', 'clookupn', params)
154
+ expect(a1).to eq(a2)
155
+ expect(ActiveRecord::Relation === a1).to be_truthy
156
+ expect(a1.to_a.count).to eq(4)
157
+ end
157
158
 
158
- it "private methods can't be called by delorean" do
159
- # generated methods
160
- aggregate_failures "errors" do
161
- @errs.in_groups_of(2) do |name, fn|
162
- err = /Too many args to #{fn}/
159
+ it "private methods can't be called by delorean" do
160
+ # generated methods
161
+ aggregate_failures 'errors' do
162
+ @errs.in_groups_of(2) do |name, fn|
163
+ err = /Too many args to #{fn}/
163
164
 
164
- expect{
165
- Marty::ScriptSet.new.get_engine(name)
166
- }.to raise_error(Delorean::BadCallError, err)
167
- end
165
+ expect do
166
+ Marty::ScriptSet.new.get_engine(name)
167
+ end.to raise_error(Delorean::BadCallError, err)
168
168
  end
169
169
  end
170
+ end
170
171
 
171
- it "private methods can't be called by delorean (2)" do
172
- # non-generated
173
- aggregate_failures "errors" do
174
- ['E5', 'a_func_p', 'E6', 'b_func_p'].in_groups_of(2) do |scr, fn|
175
- err = /Too many args to #{fn}/
176
- expect{Marty::ScriptSet.new.get_engine(scr)}.to raise_error(
177
- Delorean::BadCallError, err)
178
- end
172
+ it "private methods can't be called by delorean (2)" do
173
+ # non-generated
174
+ aggregate_failures 'errors' do
175
+ ['E5', 'a_func_p', 'E6', 'b_func_p'].in_groups_of(2) do |scr, fn|
176
+ err = /Too many args to #{fn}/
177
+ expect { Marty::ScriptSet.new.get_engine(scr) }.to raise_error(
178
+ Delorean::BadCallError, err)
179
179
  end
180
180
  end
181
+ end
181
182
 
182
- it "caching times" do
183
- ts = DateTime.now
184
- x=Benchmark.measure { 10000.times {
185
- Gemini::FannieBup.a_func(ts,
186
- 1, 2)
187
- }
188
- }
189
- y=Benchmark.measure { 10000.times {
190
- Gemini::FannieBup.ca_func(ts,
191
- 1, 2)
192
- }
193
- }
194
- # x time should be 30x or more than y time
195
- expect(x.real / y.real).to be > 30
183
+ it 'caching times' do
184
+ ts = DateTime.now
185
+ x = Benchmark.measure do
186
+ 10000.times do
187
+ Gemini::FannieBup.a_func(ts,
188
+ 1, 2)
189
+ end
196
190
  end
191
+ y = Benchmark.measure do
192
+ 10000.times do
193
+ Gemini::FannieBup.ca_func(ts,
194
+ 1, 2)
195
+ end
196
+ end
197
+ # x time should be 30x or more than y time
198
+ expect(x.real / y.real).to be > 30
197
199
  end
198
200
  end
201
+ end
@@ -1,18 +1,18 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  module Marty
4
- describe "Migrations" do
5
- it "writes db views correctly" do
6
- tdir = File.dirname(__FILE__) + "/migrations/"
4
+ describe 'Migrations' do
5
+ it 'writes db views correctly' do
6
+ tdir = File.dirname(__FILE__) + '/migrations/'
7
7
  Marty::Migrations.write_view(tdir,
8
8
  'vw_marty_postings',
9
- Marty::Posting, {}, ["comment"],
10
- [["marty_posting_types", "id",
11
- "post_type_id"]])
12
- filename = "vw_marty_postings.sql"
13
- genfile = File.join(tdir,filename)
9
+ Marty::Posting, {}, ['comment'],
10
+ [['marty_posting_types', 'id',
11
+ 'post_type_id']])
12
+ filename = 'vw_marty_postings.sql'
13
+ genfile = File.join(tdir, filename)
14
14
  generated = File.read(genfile)
15
- expected = File.read(File.join(tdir,"#{filename}.expected"))
15
+ expected = File.read(File.join(tdir, "#{filename}.expected"))
16
16
  expect(generated).to eq(expected)
17
17
  File.delete(genfile)
18
18
  end
@@ -1,18 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "StructCompare" do
4
- it "compares correctly" do
3
+ describe 'StructCompare' do
4
+ it 'compares correctly' do
5
5
  p = File.expand_path('../../fixtures/misc', __FILE__)
6
- fname = "%s/%s" % [p, 'struct_compare_tests.txt']
6
+ fname = '%s/%s' % [p, 'struct_compare_tests.txt']
7
7
  aggregate_failures 'struct_compare' do
8
8
  data = JSON.parse(File.read(fname))
9
9
  data.each do |ex|
10
- args = [ex["v1"], ex["v2"], ex['cmp_opts']].compact
10
+ args = [ex['v1'], ex['v2'], ex['cmp_opts']].compact
11
11
  comp = struct_compare(*args)
12
12
  comparison = comp.nil? ? false : comp
13
- num = ex["example_number"]
13
+ num = ex['example_number']
14
14
  binding.pry if comparison != ex['res']
15
- expect(comparison).to eq(ex["res"]), "Test ##{num} failed: #{comparison}"
15
+ expect(comparison).to eq(ex['res']), "Test ##{num} failed: #{comparison}"
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Blame Report', slow: true do
4
+ RES0 = [
5
+ ['bud_category', 'note_rate', 'settlement_mm', 'settlement_yy', 'buy_up'],
6
+ ['Govt Fixed 30', '2.25', '22', '2010', '12.123'],
7
+ ['Conv Fixed 30', '2.25', '12', '2012', '1.127']
8
+ ].freeze
9
+
10
+ RES1 = [
11
+ ['entity', 'bud_category', 'note_rate', 'settlement_mm', 'settlement_yy',
12
+ 'buy_up', 'buy_down'],
13
+ [nil, 'Govt Fixed 30', '2.25', '22', '2014', '2.123', '3.345'],
14
+ [nil, 'Govt Fixed 30', '2.25', '22', '2010', '12.123', '3.345'],
15
+ [nil, 'Conv Fixed 30', '2.25', '12', '2012', '1.126', '2.345']
16
+ ].freeze
17
+
18
+ before do
19
+ marty_whodunnit
20
+
21
+ Marty::Script.load_scripts(nil, Time.zone.now)
22
+
23
+ time1 = Time.zone.parse '2019-01-23 05:14:50 -0800'
24
+ time2 = Time.zone.parse '2019-01-24 05:14:50 -0800'
25
+ time3 = Time.zone.parse '2019-01-25 05:14:50 -0800'
26
+ time4 = Time.zone.parse '2019-01-26 05:14:50 -0800'
27
+ time5 = Time.zone.parse '2019-01-27 05:14:50 -0800'
28
+
29
+ posting = Marty::Posting.do_create('BASE', time5 - 2.hours, 'base posting')
30
+ @pt_name = Marty::Posting.find_by_name(posting.name).name
31
+
32
+ bc = Gemini::BudCategory.create(name: 'Conv Fixed 30', created_dt: time1)
33
+ bc2 = Gemini::BudCategory.create(name: 'Govt Fixed 30', created_dt: time1)
34
+
35
+ fannie_bup1 = Gemini::FannieBup.create(bud_category: bc,
36
+ note_rate: 2.250,
37
+ buy_up: 1.123,
38
+ buy_down: 2.345,
39
+ settlement_mm: 12,
40
+ settlement_yy: 2012,
41
+ created_dt: time1
42
+ )
43
+
44
+ fannie_bup2 = Gemini::FannieBup.create(bud_category: bc2,
45
+ note_rate: 2.250,
46
+ buy_up: 2.123,
47
+ buy_down: 3.345,
48
+ settlement_mm: 22,
49
+ settlement_yy: 2014,
50
+ created_dt: time4
51
+ )
52
+
53
+ fannie_bup3 = Gemini::FannieBup.create(bud_category: bc2,
54
+ note_rate: 2.250,
55
+ buy_up: 12.123,
56
+ buy_down: 3.345,
57
+ settlement_mm: 22,
58
+ settlement_yy: 2010,
59
+ created_dt: time4
60
+ )
61
+
62
+ fannie_bup2.destroy!
63
+ fannie_bup1.update!(buy_up: 1.125, created_dt: time2)
64
+ fannie_bup1.update!(buy_up: 1.126, created_dt: time4)
65
+ fannie_bup1.update!(buy_up: 1.127, created_dt: time5)
66
+ end
67
+
68
+ it 'should generate Table report' do
69
+ engine = Marty::ScriptSet.new.get_engine('TableReport')
70
+ ws = engine.evaluate(
71
+ 'TableReport', 'result',
72
+ 'pt_name' => 'NOW',
73
+ 'class_name' => 'Gemini::FannieBup',
74
+ 'exclude_attrs' => ['entity_id', 'buy_down'],
75
+ 'sort_field' => 'settlement_yy'
76
+ )
77
+
78
+ parsed_csv = CSV.parse(ws)
79
+ expect(parsed_csv).to eq RES0
80
+
81
+ ws = engine.evaluate(
82
+ 'TableReport', 'result',
83
+ 'pt_name' => @pt_name,
84
+ 'class_name' => 'Gemini::FannieBup',
85
+ )
86
+
87
+ parsed_csv = CSV.parse(ws)
88
+ expect(parsed_csv).to eq RES1
89
+ end
90
+ end