Module: Marty::Util

Extended by:
Delorean::Functions
Defined in:
lib/marty/util.rb

Class Method Summary collapse

Class Method Details

.background_report(script_name, node_name, params, force) ⇒ Object

Run a report as a promise and return its promise ID.



139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/marty/util.rb', line 139

def self.background_report(script_name, node_name, params, force)
  engine = Marty::ScriptSet.new.get_engine(script_name)
  res = engine.background_eval(node_name,
                               params,
                               ['result', 'title', 'format'],
                              )

  promise_id = res.__promise__.id
  res.force if force

  promise_id
end

.db_in_recovery?Boolean

Returns:

  • (Boolean)


113
114
115
116
117
118
119
120
121
122
123
# File 'lib/marty/util.rb', line 113

def self.db_in_recovery?
  status = false
  begin
    sql = 'select pg_is_in_recovery();'
    result = ActiveRecord::Base.connection.execute(sql)
    status = result[0]['pg_is_in_recovery'] == 't' if result && result[0]
  rescue StandardError => e
    Marty::Util.logger.error 'unable to determine recovery status'
  end
  status
end

.deep_round(obj, digits) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/marty/util.rb', line 125

def self.deep_round(obj, digits)
  case obj
  when Array
    obj.map { |o| deep_round(o, digits) }
  when Hash
    obj.each_with_object({}) do |(key, value), result|
      result[key] = deep_round(value, digits)
    end
  else
    obj.is_a?(Float) ? obj.round(digits) : obj
  end
end

.gen_report_path(script, node, params = {}) ⇒ Object

generates the report path to report described by script, node, and params



153
154
155
156
157
158
159
160
161
# File 'lib/marty/util.rb', line 153

def self.gen_report_path(script, node, params = {})
  engine = Marty::ScriptSet.new.get_engine(script)
  format = engine.evaluate(node, 'format')
  title  = params.delete(:title) || engine.evaluate(node, 'title')
  data   = ({ selected_script_name: script,
             selected_node: node } + params).to_json
  URI.encode("#{Marty::Util.marty_path}/report?data=#{data}"\
             "&reptitle=#{title}&format=#{format}")
end

.get_postingObject



10
11
12
13
14
15
# File 'lib/marty/util.rb', line 10

def self.get_posting
  sid = Netzke::Base.session && Netzke::Base.session[:posting]
  return unless sid.is_a? Integer

  sid && Marty::Posting.find_by(id: sid)
end

.get_posting_timeObject



17
18
19
20
# File 'lib/marty/util.rb', line 17

def self.get_posting_time
  snap = get_posting
  snap ? snap.created_dt : Float::INFINITY
end

.human_to_pg_range(r) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/marty/util.rb', line 86

def self.human_to_pg_range(r)
  return r if r == 'empty'

  m = /\A
  ((?<op0>\>|\>=)(?<start>[^\<\>\=]*?))?
  ((?<op1>\<|\<=)(?<end>[^\<\>\=]*?))?
  \z/x.match(r)

  raise "bad range #{r}" unless m

  if m[:op0]
    open = m[:op0] == '>' ? '(' : '['
    start = "#{open}#{m[:start]}"
  else
    start = '['
  end

  if m[:op1]
    close = m[:op1] == '<' ? ')' : ']'
    ends = "#{m[:end]}#{close}"
  else
    ends = ']'
  end

  "#{start},#{ends}"
end

.loggerObject



26
27
28
# File 'lib/marty/util.rb', line 26

def self.logger
  @@s_logger ||= Rails.logger || Logger.new($stderr)
end

.marty_pathObject

route path to where Marty is mounted



31
32
33
# File 'lib/marty/util.rb', line 31

def self.marty_path
  Rails.application.routes.named_routes[:marty].path.spec
end

.pg_range_match(r) ⇒ Object



35
36
37
# File 'lib/marty/util.rb', line 35

def self.pg_range_match(r)
  /\A(?<open>\[|\()(?<start>.*?),(?<end>.*?)(?<close>\]|\))\z/.match(r)
end

.pg_range_to_human(r) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/marty/util.rb', line 39

def self.pg_range_to_human(r)
  return r if r == 'empty' || r.nil?

  m = pg_range_match(r)

  raise "bad PG range #{r}" unless m

  if m[:start] == ''
    res = ''
  else
    op = m[:open] == '(' ? '>' : '>='
    res = "#{op}#{m[:start]}"
  end

  if m[:end] != ''
    op = m[:close] == ')' ? '<' : '<='
    res += "#{op}#{m[:end]}"
  end

  res
end

.scrub_obj(obj) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/marty/util.rb', line 163

def self.scrub_obj(obj)
  trav = lambda { |o|
         if o.is_a?(Hash)
           return o.each_with_object({}) { |(k, v), h| h[k] = trav.call(v) }
         elsif o.is_a?(Array)
           return o.map { |v| trav.call(v) }
         elsif o.to_s.length > 10000
           o.class.to_s
         else
           o
         end
  }
  trav.call(obj)
end

.set_posting_id(sid) ⇒ Object



4
5
6
7
8
# File 'lib/marty/util.rb', line 4

def self.set_posting_id(sid)
  snap = Marty::Posting.find_by(id: sid)
  sid = nil if snap && (snap.created_dt == Float::INFINITY)
  Netzke::Base.session[:posting] = sid
end

.warped?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/marty/util.rb', line 22

def self.warped?
  get_posting_time != Float::INFINITY
end