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
data/Gemfile CHANGED
@@ -1,28 +1,28 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
3
  # Declare your gem's dependencies in marty.gemspec.
4
4
  # Bundler will treat runtime dependencies like base dependencies, and
5
5
  # development dependencies will be added by default to the :development group.
6
6
  gemspec
7
7
 
8
- gem 'delayed_job_active_record'
9
8
  gem 'daemons'
10
- gem 'rails', '~> 5.1.4'
9
+ gem 'delayed_job_active_record'
11
10
  gem 'pg'
11
+ gem 'rails', '~> 5.1.4'
12
12
  gem 'sqlite3'
13
13
 
14
14
  group :development, :test do
15
+ gem 'capybara'
16
+ gem 'chromedriver-helper'
17
+ gem 'connection_pool'
18
+ gem 'database_cleaner'
15
19
  gem 'pry-rails'
16
- gem 'rspec-rails'
20
+ gem 'rails-controller-testing'
17
21
  gem 'rspec-instafail', require: false
22
+ gem 'rspec-rails'
18
23
  gem 'rubocop', require: false
19
- gem 'capybara'
20
24
  gem 'selenium-webdriver'
21
- gem 'chromedriver-helper'
22
25
  gem 'timecop'
23
- gem 'database_cleaner'
24
- gem 'rails-controller-testing'
25
- gem 'connection_pool'
26
26
 
27
27
  # gem 'mcfly', path: File.expand_path('../../mcfly', __FILE__)
28
28
  gem 'mcfly'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (2.5.2)
4
+ marty (2.5.3)
5
5
  aws-sigv4 (~> 1.0, >= 1.0.2)
6
6
  axlsx (= 3.0.0pre)
7
7
  coderay
data/Rakefile CHANGED
@@ -20,11 +20,9 @@ RDoc::Task.new(:rdoc) do |rdoc|
20
20
  rdoc.rdoc_files.include('lib/**/*.rb')
21
21
  end
22
22
 
23
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
23
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
24
24
  load 'rails/tasks/engine.rake'
25
25
 
26
-
27
-
28
26
  Bundler::GemHelper.install_tasks
29
27
 
30
28
  task default: 'app:spec'
@@ -7,10 +7,10 @@ class Marty::ApiAuthView < Marty::McflyGridPanel
7
7
  def configure(c)
8
8
  super
9
9
 
10
- c.title = I18n.t('api_auth', default: "API Authorization")
11
- c.model = "Marty::ApiAuth"
10
+ c.title = I18n.t('api_auth', default: 'API Authorization')
11
+ c.model = 'Marty::ApiAuth'
12
12
  c.attributes = [:app_name, :api_key, :script_name]
13
- c.store_config.merge!({sorters: [{property: :app_name, direction: 'ASC'}]})
13
+ c.store_config.merge!(sorters: [{ property: :app_name, direction: 'ASC' }])
14
14
  end
15
15
 
16
16
  attribute :app_name do |c|
@@ -23,11 +23,12 @@ class Marty::ApiConfigView < Marty::Grid
23
23
  c.paging = :pagination
24
24
  c.editing = :in_form
25
25
  c.store_config.merge!(
26
- sorters: [{ property: :script, direction: :ASC},
27
- { property: :node, direction: :ASC},
28
- { property: :attr, direction: :ASC},
29
- { property: :api_class, direction: :ASC},
30
- ])
26
+ sorters: [
27
+ { property: :script, direction: :ASC },
28
+ { property: :node, direction: :ASC },
29
+ { property: :attr, direction: :ASC },
30
+ { property: :api_class, direction: :ASC },
31
+ ])
31
32
  @model = c.model
32
33
  end
33
34
 
@@ -44,7 +45,7 @@ class Marty::ApiConfigView < Marty::Grid
44
45
  type: :string,
45
46
  )
46
47
  c.width = 200
47
- c.label = "API Class"
48
+ c.label = 'API Class'
48
49
  end
49
50
 
50
51
  attribute :script do |c|
@@ -70,8 +71,7 @@ class Marty::ApiConfigView < Marty::Grid
70
71
  end
71
72
  end
72
73
 
73
- [:logged, :input_validated, :output_validated, :strict_validate].each do
74
- |a|
74
+ [:logged, :input_validated, :output_validated, :strict_validate].each do |a|
75
75
  attribute a do |c|
76
76
  c.width = 110
77
77
  end
@@ -30,8 +30,8 @@ class Marty::ApiLogView < Marty::Grid
30
30
  c.title = 'Api Log View'
31
31
  c.model = Marty::Log
32
32
  c.attributes = @@attrs
33
- c.scope = {message_type: 'api'}
34
- c.store_config.merge!(sorters: [{property: :timestamp, direction: 'DESC'}])
33
+ c.scope = { message_type: 'api' }
34
+ c.store_config.merge!(sorters: [{ property: :timestamp, direction: 'DESC' }])
35
35
  end
36
36
 
37
37
  component :edit_window do |c|
@@ -46,8 +46,8 @@ class Marty::ApiLogView < Marty::Grid
46
46
  :attrs,
47
47
  :start_time,
48
48
  :end_time,
49
- textarea_field(:input).merge!({height: 300}),
50
- textarea_field(:output).merge!({height: 300}),
49
+ textarea_field(:input).merge!(height: 300),
50
+ textarea_field(:output).merge!(height: 300),
51
51
  :error,
52
52
  :remote_ip,
53
53
  :auth_name,
@@ -58,13 +58,11 @@ class Marty::ApiLogView < Marty::Grid
58
58
  attribute a do |c|
59
59
  c.filterable = true
60
60
  c.read_only = true
61
- c.getter = lambda {|r| r.details[a.to_s] }
62
- c.sorting_scope = lambda {
63
- |r, dir|
61
+ c.getter = lambda { |r| r.details[a.to_s] }
62
+ c.sorting_scope = lambda { |r, dir|
64
63
  r.order("details->>'#{a.to_s}'" + dir.to_s)
65
64
  }
66
- c.filter_with = lambda {
67
- |r, v, op|
65
+ c.filter_with = lambda { |r, v, op|
68
66
  r.where("details->>'#{a.to_s}' #{op} '#{v}%'")
69
67
  } unless [:start_time, :endtime].include?(a)
70
68
 
@@ -72,17 +70,15 @@ class Marty::ApiLogView < Marty::Grid
72
70
  when :start_time, :end_time
73
71
  c.type = :datetime
74
72
  c.format = 'Y-m-d h:i:s'
75
- c.getter = lambda {|r| Time.zone.parse(r.details[a.to_s])}
76
- c.filter_with = lambda {
77
- |r, v, op|
73
+ c.getter = lambda { |r| Time.zone.parse(r.details[a.to_s]) }
74
+ c.filter_with = lambda { |r, v, op|
78
75
  r.where("(details->>'#{a.to_s}')::date #{DATE_OP_MAP[op]} '#{v}%'")
79
76
  }
80
77
  when :input, :output
81
78
  c.getter = lambda { |r| r.details[a.to_s].pretty_inspect }
82
79
  c.width = 900
83
80
  c.read_only = true
84
- c.filter_with = lambda {
85
- |r, v, op|
81
+ c.filter_with = lambda { |r, v, op|
86
82
  r.where("(details->>'#{a.to_s}')::text #{op} '%#{v}%'")
87
83
  }
88
84
  end
@@ -96,9 +92,9 @@ class Marty::ApiLogView < Marty::Grid
96
92
  end
97
93
  end
98
94
 
99
- #copied from log_view.rb
95
+ # copied from log_view.rb
100
96
  attribute :timestamp_custom do |c|
101
- c.text = I18n.t("log_grid.timestamp")
97
+ c.text = I18n.t('log_grid.timestamp')
102
98
  c.width = 200
103
99
  c.read_only = true
104
100
  c.filterable = true
@@ -108,14 +104,14 @@ class Marty::ApiLogView < Marty::Grid
108
104
  xtype: :displayfield,
109
105
  }
110
106
  c.getter = lambda { |r| Time.at(r.timestamp) }
111
- c.sorting_scope = lambda {|r, dir| r.order("timestamp " + dir.to_s)}
107
+ c.sorting_scope = lambda { |r, dir| r.order('timestamp ' + dir.to_s) }
112
108
 
113
109
  # FIXME?: The UI AR/PG DateTime workaround requires the timestamp to be cast
114
110
  # to text in order to compare filter input using the LIKE operator.
115
111
  # Otherwise it will fail. '<' and '>' functionality is missing.
116
- c.filter_with = lambda {|r, v, op|
117
- r.where("timestamp::text #{op} '#{v}%'")}
112
+ c.filter_with = lambda { |r, v, op|
113
+ r.where("timestamp::text #{op} '#{v}%'")
114
+ }
118
115
  end
119
-
120
116
  end
121
117
  ApiLogView = Marty::ApiLogView
@@ -12,14 +12,14 @@ class Marty::AuthApp < Marty::SimpleApp
12
12
  [].tap do |menu|
13
13
  user = Mcfly.whodunnit
14
14
  if !user.nil?
15
- menu << "->" << {
15
+ menu << '->' << {
16
16
  text: user.name,
17
17
  tooltip: 'Current user',
18
18
  menu: user_menu,
19
- name: "sign_out",
19
+ name: 'sign_out',
20
20
  }
21
21
  else
22
- menu << "->" << :sign_in
22
+ menu << '->' << :sign_in
23
23
  end
24
24
  end
25
25
  end
@@ -29,18 +29,18 @@ class Marty::AuthApp < Marty::SimpleApp
29
29
  end
30
30
 
31
31
  action :sign_in do |c|
32
- c.icon_cls = "fa fa-sign-in-alt gylph"
32
+ c.icon_cls = 'fa fa-sign-in-alt gylph'
33
33
  end
34
34
 
35
35
  action :sign_out do |c|
36
- c.icon_cls = "fa fa-sign-out-alt gylph"
36
+ c.icon_cls = 'fa fa-sign-out-alt gylph'
37
37
  c.text = "Sign out #{Mcfly.whodunnit.name}" if Mcfly.whodunnit
38
38
  end
39
39
 
40
40
  endpoint :sign_in do |params|
41
41
  user = Marty::User.try_to_login(params[:login], params[:password])
42
42
  user ? Netzke::Base.controller.set_user(user) :
43
- client.netzke_notify("Wrong credentials")
43
+ client.netzke_notify('Wrong credentials')
44
44
 
45
45
  !!user
46
46
  end
@@ -4,6 +4,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
4
4
  def self.klass
5
5
  Marty::BaseRule
6
6
  end
7
+
7
8
  def klass
8
9
  self.class.klass
9
10
  end
@@ -11,19 +12,21 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
11
12
  def self.base_fields
12
13
  [:name]
13
14
  end
15
+
14
16
  def self.computed_fields
15
17
  [:computed_guards, :grids, :results]
16
18
  end
19
+
17
20
  def configure(c)
18
21
  super
19
22
  c.model = self.class.klass
20
23
  c.title = I18n.t('rule')
21
24
  c.attributes = self.class.base_fields +
22
25
  klass.guard_info.
23
- sort_by{|_, h| h[:order] || 0}.
24
- reject{|_, h| h[:hidden]}.
26
+ sort_by { |_, h| h[:order] || 0 }.
27
+ reject { |_, h| h[:hidden] }.
25
28
  map { |name, _| name.to_sym } + self.class.computed_fields
26
- c.store_config.merge!(sorters: [{property: :name, direction: 'ASC'}])
29
+ c.store_config.merge!(sorters: [{ property: :name, direction: 'ASC' }])
27
30
  c.editing = :in_form
28
31
  c.paging = :pagination
29
32
  c.multi_select = false
@@ -42,6 +45,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
42
45
  @key = key
43
46
  @lineno = lineno
44
47
  end
48
+
45
49
  def message
46
50
  "keyword '#{@key}' specified more than once (line #{@lineno})"
47
51
  end
@@ -53,22 +57,25 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
53
57
  last_key = nil
54
58
  s.lines.each.with_index(1) do |line, idx|
55
59
  next if /\A\s*\z/.match(line)
60
+
56
61
  line.chomp!
57
62
  begin
58
63
  m = /\A\s*([a-z][a-z0-9_]*)\s*=\s*(.*)\s*\z/.match(line)
59
64
  if m
60
65
  k, v = m[1], m[2]
61
66
  raise DupKeyError.new(k, idx) if result.keys.include?(k)
67
+
62
68
  save_linenos[k] = idx
63
69
  result[k] = v
64
70
  last_key = k
65
71
  else
66
72
  raise unless last_key
73
+
67
74
  result[last_key] += "\n" + line.strip
68
75
  end
69
76
  rescue DupKeyError => e
70
77
  raise
71
- rescue => e
78
+ rescue StandardError => e
72
79
  raise "syntax error on line #{idx}"
73
80
  end
74
81
  end
@@ -77,6 +84,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
77
84
 
78
85
  def self.hash_to_simple(h)
79
86
  return unless h && h.present?
87
+
80
88
  lhs_wid = h.keys.map(&:length).max
81
89
  fmt = "%-#{lhs_wid}s = %s"
82
90
  result = []
@@ -84,7 +92,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
84
92
  vlines = vstr.lines.map(&:chomp)
85
93
  fst = vlines.shift
86
94
  result << fmt % [k, fst]
87
- vlines.each {|l| result << " "*(lhs_wid+3) + l}
95
+ vlines.each { |l| result << ' ' * (lhs_wid + 3) + l }
88
96
  end
89
97
  result.join("\n")
90
98
  end
@@ -94,7 +102,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
94
102
  end
95
103
 
96
104
  def jsonb_simple_getter(c)
97
- lambda {|r| Marty::BaseRuleView.hash_to_simple(r.send(c)) }
105
+ lambda { |r| Marty::BaseRuleView.hash_to_simple(r.send(c)) }
98
106
  end
99
107
 
100
108
  def jsonb_simple_setter(c)
@@ -104,7 +112,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
104
112
 
105
113
  begin
106
114
  final = Marty::BaseRuleView.simple_to_hash(v)
107
- rescue => e
115
+ rescue StandardError => e
108
116
  final = { "~~ERROR~~": e.message }
109
117
  end
110
118
 
@@ -115,16 +123,16 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
115
123
  }
116
124
  end
117
125
 
118
- def self.jsonb_field_getter(j, c, nullbool=nil)
126
+ def self.jsonb_field_getter(j, c, nullbool = nil)
119
127
  lambda do |r|
120
128
  rv = r.send(j)[c]
121
129
  v = nullbool ? (rv == true ? 'True' :
122
130
  rv == false ? 'False' : rv) : rv
123
- v || ""
131
+ v || ''
124
132
  end
125
133
  end
126
134
 
127
- def self.jsonb_field_setter(j, c, bool=nil)
135
+ def self.jsonb_field_setter(j, c, bool = nil)
128
136
  lambda do |r, rv|
129
137
  v = bool ? rv.to_s.downcase == 'true' : rv
130
138
  rv == '' || rv == '---' ? r.send(j).delete(c) : r.send(j)[c] = v
@@ -157,7 +165,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
157
165
  c.width = 150
158
166
  end
159
167
 
160
- def self.grid_column(c, label=nil)
168
+ def self.grid_column(c, label = nil)
161
169
  editor_config = {
162
170
  trigger_action: :all,
163
171
  xtype: :combo,
@@ -173,8 +181,8 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
173
181
  type: :string,
174
182
  getter: jsonb_field_getter(:grids, c.to_s),
175
183
  setter: jsonb_field_setter(:grids, c.to_s),
176
- # getter: lambda { |r| r.grids[c.to_s] },
177
- # setter: lambda { |r, v| r.grids[c.to_s] = v },
184
+ # getter: lambda { |r| r.grids[c.to_s] },
185
+ # setter: lambda { |r, v| r.grids[c.to_s] = v },
178
186
  }
179
187
  end
180
188
 
@@ -183,7 +191,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
183
191
  end
184
192
 
185
193
  def form_items_guards
186
- klass.guard_info.reject{|_, h| h[:hidden]}.keys.map{|x|x.to_sym}
194
+ klass.guard_info.reject { |_, h| h[:hidden] }.keys.map(&:to_sym)
187
195
  end
188
196
 
189
197
  def form_items_grids
@@ -213,11 +221,11 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
213
221
  vbox(*form_items_attrs +
214
222
  form_items_guards,
215
223
  border: false,
216
- width: "40%",
217
- ),
224
+ width: '40%',
225
+ ),
218
226
  vbox(width: '2%', border: false),
219
227
  vbox(
220
- width: '55%', border: false),
228
+ width: '55%', border: false),
221
229
  height: '40%',
222
230
  border: false,
223
231
  ),
@@ -227,7 +235,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
227
235
  form_items_results,
228
236
  width: '99%',
229
237
  border: false
230
- ),
238
+ ),
231
239
  height: '40%',
232
240
  border: false
233
241
  )
@@ -264,7 +272,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
264
272
  if h[:type] != :range
265
273
  c.getter = Marty::BaseRuleView.jsonb_field_getter(meth, namestr, nullbool)
266
274
  c.setter = Marty::BaseRuleView.jsonb_field_setter(meth, namestr,
267
- h[:type]==:boolean)
275
+ h[:type] == :boolean)
268
276
  c.filter_with = lambda do |rel, value, op|
269
277
  v = ActiveRecord::Base.connection.quote(value)[1..-2]
270
278
  rel.where("#{meth}->>'#{namestr}' like '%#{v}%'")
@@ -9,11 +9,11 @@ class Marty::ConfigView < Marty::Grid
9
9
  def configure(c)
10
10
  super
11
11
 
12
- c.title = I18n.t('config', default: "Config")
13
- c.model = "Marty::Config"
12
+ c.title = I18n.t('config', default: 'Config')
13
+ c.model = 'Marty::Config'
14
14
  c.attributes = [:key, :value, :description]
15
15
  c.editing = :both
16
- c.store_config.merge!(sorters: [{property: :key, direction: 'ASC'}])
16
+ c.store_config.merge!(sorters: [{ property: :key, direction: 'ASC' }])
17
17
  end
18
18
 
19
19
  def my_jsonb_getter
@@ -21,13 +21,16 @@ class Marty::ConfigView < Marty::Grid
21
21
  end
22
22
 
23
23
  def my_jsonb_pretty_getter
24
- lambda { |r| v = Marty::Config[r.key]
25
- !v.nil? && (JSON.pretty_generate(v) rescue v.to_json) || '' }
24
+ lambda { |r|
25
+ v = Marty::Config[r.key]
26
+ !v.nil? && (JSON.pretty_generate(v) rescue v.to_json) || ''
27
+ }
26
28
  end
27
29
 
28
30
  def my_jsonb_setter
29
31
  lambda { |r, v|
30
32
  return r.set_value(nil) if v.blank?
33
+
31
34
  decoded = ActiveSupport::JSON.decode(v) rescue nil
32
35
  r.set_value(decoded)
33
36
  }
@@ -36,10 +39,10 @@ class Marty::ConfigView < Marty::Grid
36
39
  def default_form_items
37
40
  [
38
41
  :key,
39
- jsonb_field(:value, {
40
- getter: my_jsonb_pretty_getter,
41
- setter: my_jsonb_setter,
42
- }),
42
+ jsonb_field(:value,
43
+ getter: my_jsonb_pretty_getter,
44
+ setter: my_jsonb_setter,
45
+ ),
43
46
  textarea_field(:description),
44
47
  ]
45
48
  end