Module: SideBro::WebHelpers
- Included in:
- SideBro::Web::Action
- Defined in:
- lib/side_bro/web/helpers.rb
Constant Summary collapse
- QUEUE_NAME_RE =
/\A[a-z_:.\-0-9]+\z/i- ACTIVEJOB_WRAPPER =
"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"
Instance Method Summary collapse
- #clean_aj_args(obj) ⇒ Object
- #csrf_token ⇒ Object
- #current_page ⇒ Object
- #current_path?(path) ⇒ Boolean
- #display_args(job_hash) ⇒ Object
- #format_args_short(job_hash, per_row: 2) ⇒ Object
- #format_memory(kb) ⇒ Object
- #h(text) ⇒ Object
- #handle_job_action(set) ⇒ Object
- #job_display_class(job_hash) ⇒ Object
- #locale ⇒ Object
- #metrics_enabled? ⇒ Boolean
- #number_with_delimiter(n) ⇒ Object
- #page_slice ⇒ Object
- #paginate(set, page, per_page = 25) ⇒ Object
-
#query_string(overrides = {}) ⇒ Object
Builds a query string from current request params merged with overrides.
- #raw_args(job_hash) ⇒ Object
- #relative_time(time) ⇒ Object
- #root_path ⇒ Object
- #rtl? ⇒ Boolean
- #t(key, **opts) ⇒ Object
- #truncate(str, len = 200) ⇒ Object
- #validate_queue_name!(name) ⇒ Object
Instance Method Details
#clean_aj_args(obj) ⇒ Object
108 109 110 111 112 113 114 115 116 117 |
# File 'lib/side_bro/web/helpers.rb', line 108 def clean_aj_args(obj) case obj when Array then obj.map { |v| clean_aj_args(v) } when Hash cleaned = obj.reject { |k, _| k.to_s.start_with?("_aj_") } .transform_values { |v| clean_aj_args(v) } cleaned.size == 1 ? cleaned.values.first : cleaned else obj end end |
#csrf_token ⇒ Object
149 150 151 |
# File 'lib/side_bro/web/helpers.rb', line 149 def csrf_token session[:csrf] ||= SecureRandom.hex(16) end |
#current_page ⇒ Object
125 126 127 128 129 |
# File 'lib/side_bro/web/helpers.rb', line 125 def current_page page = [(params["page"] || 1).to_i - 1, 0].max per_page = (params["per_page"] || 25).to_i.clamp(1, 250) [page, per_page] end |
#current_path?(path) ⇒ Boolean
23 24 25 |
# File 'lib/side_bro/web/helpers.rb', line 23 def current_path?(path) request.path == "#{root_path}#{path}".chomp("/") end |
#display_args(job_hash) ⇒ Object
87 88 89 90 91 |
# File 'lib/side_bro/web/helpers.rb', line 87 def display_args(job_hash) truncate(JSON.generate(raw_args(job_hash))) rescue "–" end |
#format_args_short(job_hash, per_row: 2) ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/side_bro/web/helpers.rb', line 93 def format_args_short(job_hash, per_row: 2) raw = raw_args(job_hash) if raw.length == 1 && raw.first.is_a?(Hash) pairs = raw.first.map { |k, v| val = v.is_a?(String) ? v : JSON.generate(v) "#{k}: #{truncate(val, 20)}" } pairs.each_slice(per_row).map { |s| s.join(" ") }.join("\n") else truncate(JSON.generate(raw), 60) end rescue "–" end |
#format_memory(kb) ⇒ Object
59 60 61 62 63 |
# File 'lib/side_bro/web/helpers.rb', line 59 def format_memory(kb) return "–" unless kb mb = kb / 1024.0 mb >= 1024 ? "%.1f GB" % (mb / 1024.0) : "%.0f MB" % mb end |
#h(text) ⇒ Object
140 141 142 143 144 145 146 147 |
# File 'lib/side_bro/web/helpers.rb', line 140 def h(text) text.to_s .gsub("&", "&") .gsub("<", "<") .gsub(">", ">") .gsub('"', """) .gsub("'", "'") end |
#handle_job_action(set) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/side_bro/web/helpers.rb', line 161 def handle_job_action(set) action_name = params["action"] keys = Array(params["key"]) keys.each do |jid| job = set.find { |j| j.jid == jid } next unless job case action_name when "retry" then job.retry when "delete" then job.delete when "kill" then job.kill if job.respond_to?(:kill) when "add_to_queue" then job.add_to_queue if job.respond_to?(:add_to_queue) end end end |
#job_display_class(job_hash) ⇒ Object
72 73 74 75 76 |
# File 'lib/side_bro/web/helpers.rb', line 72 def job_display_class(job_hash) return job_hash["class"] unless job_hash["class"] == ACTIVEJOB_WRAPPER inner = (job_hash["args"] || []).first inner.is_a?(Hash) ? (inner["job_class"] || ACTIVEJOB_WRAPPER) : ACTIVEJOB_WRAPPER end |
#locale ⇒ Object
33 34 35 |
# File 'lib/side_bro/web/helpers.rb', line 33 def locale session[:locale] || "en" end |
#metrics_enabled? ⇒ Boolean
157 158 159 |
# File 'lib/side_bro/web/helpers.rb', line 157 def metrics_enabled? Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("7.0") end |
#number_with_delimiter(n) ⇒ Object
153 154 155 |
# File 'lib/side_bro/web/helpers.rb', line 153 def number_with_delimiter(n) n.to_s.reverse.gsub(/(\d{3})(?=\d)/, "\\1,").reverse end |
#page_slice ⇒ Object
131 132 133 134 |
# File 'lib/side_bro/web/helpers.rb', line 131 def page_slice page, per_page = current_page [page * per_page, per_page] end |
#paginate(set, page, per_page = 25) ⇒ Object
119 120 121 122 123 |
# File 'lib/side_bro/web/helpers.rb', line 119 def paginate(set, page, per_page = 25) total = set.size items = set.map { |j| j }.slice(page * per_page, per_page) || [] [items, total] end |
#query_string(overrides = {}) ⇒ Object
Builds a query string from current request params merged with overrides. Pass nil as a value to remove that key from the result.
12 13 14 15 16 17 |
# File 'lib/side_bro/web/helpers.rb', line 12 def query_string(overrides = {}) overrides = overrides.transform_keys(&:to_s) base = request.params.reject { |k, _| overrides.key?(k.to_s) } merged = base.merge(overrides.compact) merged.map { |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join("&") end |
#raw_args(job_hash) ⇒ Object
78 79 80 81 82 83 84 85 |
# File 'lib/side_bro/web/helpers.rb', line 78 def raw_args(job_hash) if job_hash["class"] == ACTIVEJOB_WRAPPER inner = (job_hash["args"] || []).first inner.is_a?(Hash) ? clean_aj_args(inner["arguments"] || []) : [] else job_hash["args"] || [] end end |
#relative_time(time) ⇒ Object
49 50 51 52 53 54 55 56 57 |
# File 'lib/side_bro/web/helpers.rb', line 49 def relative_time(time) return "" unless time secs = (Time.now - time).to_i.abs if secs < 60 then "#{secs}s" elsif secs < 3600 then "#{secs / 60}m" elsif secs < 86400 then "#{secs / 3600}h" else "#{secs / 86400}d" end end |
#root_path ⇒ Object
27 28 29 30 31 |
# File 'lib/side_bro/web/helpers.rb', line 27 def root_path # Strips trailing slash from SCRIPT_NAME so prefix is always clean script = request.env["SCRIPT_NAME"] || "" script.end_with?("/") ? script : "#{script}/" end |
#rtl? ⇒ Boolean
136 137 138 |
# File 'lib/side_bro/web/helpers.rb', line 136 def rtl? %w[ar fa he ur].include?(locale) end |
#t(key, **opts) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/side_bro/web/helpers.rb', line 37 def t(key, **opts) str = SideBro::Web.translations.dig(locale.to_s, key.to_s) || SideBro::Web.translations.dig("en", key.to_s) || key.to_s return str if opts.empty? begin str % opts rescue str end end |
#truncate(str, len = 200) ⇒ Object
65 66 67 68 |
# File 'lib/side_bro/web/helpers.rb', line 65 def truncate(str, len = 200) return str if str.nil? || str.length <= len "#{str[0, len]}…" end |
#validate_queue_name!(name) ⇒ Object
19 20 21 |
# File 'lib/side_bro/web/helpers.rb', line 19 def validate_queue_name!(name) halt(404) unless name&.match?(QUEUE_NAME_RE) end |