sidekiq 7.2.4 → 7.3.2
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.
- checksums.yaml +4 -4
 - data/Changes.md +51 -0
 - data/README.md +1 -1
 - data/lib/generators/sidekiq/job_generator.rb +2 -0
 - data/lib/sidekiq/api.rb +10 -4
 - data/lib/sidekiq/capsule.rb +5 -0
 - data/lib/sidekiq/cli.rb +1 -0
 - data/lib/sidekiq/client.rb +4 -1
 - data/lib/sidekiq/config.rb +7 -1
 - data/lib/sidekiq/deploy.rb +2 -0
 - data/lib/sidekiq/embedded.rb +2 -0
 - data/lib/sidekiq/fetch.rb +1 -1
 - data/lib/sidekiq/iterable_job.rb +55 -0
 - data/lib/sidekiq/job/interrupt_handler.rb +24 -0
 - data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
 - data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
 - data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
 - data/lib/sidekiq/job/iterable.rb +231 -0
 - data/lib/sidekiq/job.rb +13 -2
 - data/lib/sidekiq/job_logger.rb +22 -11
 - data/lib/sidekiq/job_retry.rb +6 -1
 - data/lib/sidekiq/job_util.rb +2 -0
 - data/lib/sidekiq/metrics/query.rb +2 -0
 - data/lib/sidekiq/metrics/shared.rb +2 -0
 - data/lib/sidekiq/metrics/tracking.rb +13 -5
 - data/lib/sidekiq/middleware/current_attributes.rb +29 -11
 - data/lib/sidekiq/middleware/modules.rb +2 -0
 - data/lib/sidekiq/monitor.rb +2 -1
 - data/lib/sidekiq/processor.rb +11 -1
 - data/lib/sidekiq/redis_client_adapter.rb +8 -5
 - data/lib/sidekiq/redis_connection.rb +33 -2
 - data/lib/sidekiq/ring_buffer.rb +2 -0
 - data/lib/sidekiq/systemd.rb +2 -0
 - data/lib/sidekiq/version.rb +1 -1
 - data/lib/sidekiq/web/action.rb +2 -1
 - data/lib/sidekiq/web/application.rb +9 -4
 - data/lib/sidekiq/web/helpers.rb +53 -7
 - data/lib/sidekiq/web.rb +48 -1
 - data/lib/sidekiq.rb +2 -1
 - data/sidekiq.gemspec +2 -1
 - data/web/assets/javascripts/application.js +6 -1
 - data/web/assets/javascripts/dashboard-charts.js +22 -12
 - data/web/assets/javascripts/dashboard.js +1 -1
 - data/web/assets/stylesheets/application.css +11 -3
 - data/web/locales/tr.yml +101 -0
 - data/web/views/dashboard.erb +6 -6
 - data/web/views/layout.erb +6 -6
 - data/web/views/metrics.erb +4 -4
 - data/web/views/metrics_for_job.erb +4 -4
 - metadata +26 -5
 
    
        data/lib/sidekiq/web/helpers.rb
    CHANGED
    
    | 
         @@ -6,8 +6,51 @@ require "yaml" 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require "cgi"
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            module Sidekiq
         
     | 
| 
       9 
     | 
    
         
            -
              #  
     | 
| 
      
 9 
     | 
    
         
            +
              # These methods are available to pages within the Web UI and UI extensions.
         
     | 
| 
      
 10 
     | 
    
         
            +
              # They are not public APIs for applications to use.
         
     | 
| 
       10 
11 
     | 
    
         
             
              module WebHelpers
         
     | 
| 
      
 12 
     | 
    
         
            +
                def style_tag(location, **kwargs)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  global = location.match?(/:\/\//)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  location = root_path + location if !global && !location.start_with?(root_path)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  attrs = {
         
     | 
| 
      
 16 
     | 
    
         
            +
                    type: "text/css",
         
     | 
| 
      
 17 
     | 
    
         
            +
                    media: "screen",
         
     | 
| 
      
 18 
     | 
    
         
            +
                    rel: "stylesheet",
         
     | 
| 
      
 19 
     | 
    
         
            +
                    nonce: csp_nonce,
         
     | 
| 
      
 20 
     | 
    
         
            +
                    href: location
         
     | 
| 
      
 21 
     | 
    
         
            +
                  }
         
     | 
| 
      
 22 
     | 
    
         
            +
                  html_tag(:link, attrs.merge(kwargs))
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                def script_tag(location, **kwargs)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  global = location.match?(/:\/\//)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  location = root_path + location if !global && !location.start_with?(root_path)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  attrs = {
         
     | 
| 
      
 29 
     | 
    
         
            +
                    type: "text/javascript",
         
     | 
| 
      
 30 
     | 
    
         
            +
                    nonce: csp_nonce,
         
     | 
| 
      
 31 
     | 
    
         
            +
                    src: location
         
     | 
| 
      
 32 
     | 
    
         
            +
                  }
         
     | 
| 
      
 33 
     | 
    
         
            +
                  html_tag(:script, attrs.merge(kwargs)) {}
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                # NB: keys and values are not escaped; do not allow user input
         
     | 
| 
      
 37 
     | 
    
         
            +
                # in the attributes
         
     | 
| 
      
 38 
     | 
    
         
            +
                private def html_tag(tagname, attrs)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  s = +"<#{tagname}"
         
     | 
| 
      
 40 
     | 
    
         
            +
                  attrs.each_pair do |k, v|
         
     | 
| 
      
 41 
     | 
    
         
            +
                    next unless v
         
     | 
| 
      
 42 
     | 
    
         
            +
                    s << " #{k}=\"#{v}\""
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                  if block_given?
         
     | 
| 
      
 45 
     | 
    
         
            +
                    s << ">"
         
     | 
| 
      
 46 
     | 
    
         
            +
                    yield s
         
     | 
| 
      
 47 
     | 
    
         
            +
                    s << "</#{tagname}>"
         
     | 
| 
      
 48 
     | 
    
         
            +
                  else
         
     | 
| 
      
 49 
     | 
    
         
            +
                    s << " />"
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  s
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
       11 
54 
     | 
    
         
             
                def strings(lang)
         
     | 
| 
       12 
55 
     | 
    
         
             
                  @strings ||= {}
         
     | 
| 
       13 
56 
     | 
    
         | 
| 
         @@ -46,7 +89,7 @@ module Sidekiq 
     | 
|
| 
       46 
89 
     | 
    
         
             
                end
         
     | 
| 
       47 
90 
     | 
    
         | 
| 
       48 
91 
     | 
    
         
             
                def available_locales
         
     | 
| 
       49 
     | 
    
         
            -
                  @available_locales ||= locale_files.map { |path| File.basename(path, ".yml") } 
     | 
| 
      
 92 
     | 
    
         
            +
                  @available_locales ||= Set.new(locale_files.map { |path| File.basename(path, ".yml") })
         
     | 
| 
       50 
93 
     | 
    
         
             
                end
         
     | 
| 
       51 
94 
     | 
    
         | 
| 
       52 
95 
     | 
    
         
             
                def find_locale_files(lang)
         
     | 
| 
         @@ -122,10 +165,9 @@ module Sidekiq 
     | 
|
| 
       122 
165 
     | 
    
         
             
                # Inspiration taken from https://github.com/iain/http_accept_language/blob/master/lib/http_accept_language/parser.rb
         
     | 
| 
       123 
166 
     | 
    
         
             
                def locale
         
     | 
| 
       124 
167 
     | 
    
         
             
                  # session[:locale] is set via the locale selector from the footer
         
     | 
| 
       125 
     | 
    
         
            -
                   
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
                  @locale ||= begin
         
     | 
| 
      
 168 
     | 
    
         
            +
                  @locale ||= if (l = session&.fetch(:locale, nil)) && available_locales.include?(l)
         
     | 
| 
      
 169 
     | 
    
         
            +
                    l
         
     | 
| 
      
 170 
     | 
    
         
            +
                  else
         
     | 
| 
       129 
171 
     | 
    
         
             
                    matched_locale = user_preferred_languages.map { |preferred|
         
     | 
| 
       130 
172 
     | 
    
         
             
                      preferred_language = preferred.split("-", 2).first
         
     | 
| 
       131 
173 
     | 
    
         | 
| 
         @@ -267,6 +309,10 @@ module Sidekiq 
     | 
|
| 
       267 
309 
     | 
    
         
             
                  "<input type='hidden' name='authenticity_token' value='#{env[:csrf_token]}'/>"
         
     | 
| 
       268 
310 
     | 
    
         
             
                end
         
     | 
| 
       269 
311 
     | 
    
         | 
| 
      
 312 
     | 
    
         
            +
                def csp_nonce
         
     | 
| 
      
 313 
     | 
    
         
            +
                  env[:csp_nonce]
         
     | 
| 
      
 314 
     | 
    
         
            +
                end
         
     | 
| 
      
 315 
     | 
    
         
            +
             
     | 
| 
       270 
316 
     | 
    
         
             
                def to_display(arg)
         
     | 
| 
       271 
317 
     | 
    
         
             
                  arg.inspect
         
     | 
| 
       272 
318 
     | 
    
         
             
                rescue
         
     | 
| 
         @@ -310,7 +356,7 @@ module Sidekiq 
     | 
|
| 
       310 
356 
     | 
    
         
             
                end
         
     | 
| 
       311 
357 
     | 
    
         | 
| 
       312 
358 
     | 
    
         
             
                def h(text)
         
     | 
| 
       313 
     | 
    
         
            -
                  ::Rack::Utils.escape_html(text)
         
     | 
| 
      
 359 
     | 
    
         
            +
                  ::Rack::Utils.escape_html(text.to_s)
         
     | 
| 
       314 
360 
     | 
    
         
             
                rescue ArgumentError => e
         
     | 
| 
       315 
361 
     | 
    
         
             
                  raise unless e.message.eql?("invalid byte sequence in UTF-8")
         
     | 
| 
       316 
362 
     | 
    
         
             
                  text.encode!("UTF-16", "UTF-8", invalid: :replace, replace: "").encode!("UTF-8", "UTF-16")
         
     | 
    
        data/lib/sidekiq/web.rb
    CHANGED
    
    | 
         @@ -1,6 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require "erb"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "securerandom"
         
     | 
| 
       4 
5 
     | 
    
         | 
| 
       5 
6 
     | 
    
         
             
            require "sidekiq"
         
     | 
| 
       6 
7 
     | 
    
         
             
            require "sidekiq/api"
         
     | 
| 
         @@ -39,11 +40,13 @@ module Sidekiq 
     | 
|
| 
       39 
40 
     | 
    
         
             
                  CONTENT_SECURITY_POLICY = "Content-Security-Policy"
         
     | 
| 
       40 
41 
     | 
    
         
             
                  LOCATION = "Location"
         
     | 
| 
       41 
42 
     | 
    
         
             
                  X_CASCADE = "X-Cascade"
         
     | 
| 
      
 43 
     | 
    
         
            +
                  X_CONTENT_TYPE_OPTIONS = "X-Content-Type-Options"
         
     | 
| 
       42 
44 
     | 
    
         
             
                else
         
     | 
| 
       43 
45 
     | 
    
         
             
                  CONTENT_LANGUAGE = "content-language"
         
     | 
| 
       44 
46 
     | 
    
         
             
                  CONTENT_SECURITY_POLICY = "content-security-policy"
         
     | 
| 
       45 
47 
     | 
    
         
             
                  LOCATION = "location"
         
     | 
| 
       46 
48 
     | 
    
         
             
                  X_CASCADE = "x-cascade"
         
     | 
| 
      
 49 
     | 
    
         
            +
                  X_CONTENT_TYPE_OPTIONS = "x-content-type-options"
         
     | 
| 
       47 
50 
     | 
    
         
             
                end
         
     | 
| 
       48 
51 
     | 
    
         | 
| 
       49 
52 
     | 
    
         
             
                class << self
         
     | 
| 
         @@ -114,6 +117,7 @@ module Sidekiq 
     | 
|
| 
       114 
117 
     | 
    
         
             
                end
         
     | 
| 
       115 
118 
     | 
    
         | 
| 
       116 
119 
     | 
    
         
             
                def call(env)
         
     | 
| 
      
 120 
     | 
    
         
            +
                  env[:csp_nonce] = SecureRandom.base64(16)
         
     | 
| 
       117 
121 
     | 
    
         
             
                  app.call(env)
         
     | 
| 
       118 
122 
     | 
    
         
             
                end
         
     | 
| 
       119 
123 
     | 
    
         | 
| 
         @@ -138,7 +142,50 @@ module Sidekiq 
     | 
|
| 
       138 
142 
     | 
    
         
             
                  send(:"#{attribute}=", value)
         
     | 
| 
       139 
143 
     | 
    
         
             
                end
         
     | 
| 
       140 
144 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
                 
     | 
| 
      
 145 
     | 
    
         
            +
                # Register a class as a Sidekiq Web UI extension. The class should
         
     | 
| 
      
 146 
     | 
    
         
            +
                # provide one or more tabs which map to an index route. Options:
         
     | 
| 
      
 147 
     | 
    
         
            +
                #
         
     | 
| 
      
 148 
     | 
    
         
            +
                # @param extension [Class] Class which contains the HTTP actions, required
         
     | 
| 
      
 149 
     | 
    
         
            +
                # @param name [String] the name of the extension, used to namespace assets
         
     | 
| 
      
 150 
     | 
    
         
            +
                # @param tab [String | Array] labels(s) of the UI tabs
         
     | 
| 
      
 151 
     | 
    
         
            +
                # @param index [String | Array] index route(s) for each tab
         
     | 
| 
      
 152 
     | 
    
         
            +
                # @param root_dir [String] directory location to find assets, locales and views, typically `web/` within the gemfile
         
     | 
| 
      
 153 
     | 
    
         
            +
                # @param asset_paths [Array] one or more directories under {root}/assets/{name} to be publicly served, e.g. ["js", "css", "img"]
         
     | 
| 
      
 154 
     | 
    
         
            +
                # @param cache_for [Integer] amount of time to cache assets, default one day
         
     | 
| 
      
 155 
     | 
    
         
            +
                #
         
     | 
| 
      
 156 
     | 
    
         
            +
                # TODO name, tab and index will be mandatory in 8.0
         
     | 
| 
      
 157 
     | 
    
         
            +
                #
         
     | 
| 
      
 158 
     | 
    
         
            +
                # Web extensions will have a root `web/` directory with `locales/`, `assets/`
         
     | 
| 
      
 159 
     | 
    
         
            +
                # and `views/` subdirectories.
         
     | 
| 
      
 160 
     | 
    
         
            +
                def self.register(extension, name: nil, tab: nil, index: nil, root_dir: nil, cache_for: 86400, asset_paths: nil)
         
     | 
| 
      
 161 
     | 
    
         
            +
                  tab = Array(tab)
         
     | 
| 
      
 162 
     | 
    
         
            +
                  index = Array(index)
         
     | 
| 
      
 163 
     | 
    
         
            +
                  tab.zip(index).each do |tab, index|
         
     | 
| 
      
 164 
     | 
    
         
            +
                    tabs[tab] = index
         
     | 
| 
      
 165 
     | 
    
         
            +
                  end
         
     | 
| 
      
 166 
     | 
    
         
            +
                  if root_dir
         
     | 
| 
      
 167 
     | 
    
         
            +
                    locdir = File.join(root_dir, "locales")
         
     | 
| 
      
 168 
     | 
    
         
            +
                    locales << locdir if File.directory?(locdir)
         
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
      
 170 
     | 
    
         
            +
                    if asset_paths && name
         
     | 
| 
      
 171 
     | 
    
         
            +
                      # if you have {root}/assets/{name}/js/scripts.js
         
     | 
| 
      
 172 
     | 
    
         
            +
                      # and {root}/assets/{name}/css/styles.css
         
     | 
| 
      
 173 
     | 
    
         
            +
                      # you would pass in:
         
     | 
| 
      
 174 
     | 
    
         
            +
                      #   asset_paths: ["js", "css"]
         
     | 
| 
      
 175 
     | 
    
         
            +
                      # See script_tag and style_tag in web/helpers.rb
         
     | 
| 
      
 176 
     | 
    
         
            +
                      assdir = File.join(root_dir, "assets")
         
     | 
| 
      
 177 
     | 
    
         
            +
                      assurls = Array(asset_paths).map { |x| "/#{name}/#{x}" }
         
     | 
| 
      
 178 
     | 
    
         
            +
                      assetprops = {
         
     | 
| 
      
 179 
     | 
    
         
            +
                        urls: assurls,
         
     | 
| 
      
 180 
     | 
    
         
            +
                        root: assdir,
         
     | 
| 
      
 181 
     | 
    
         
            +
                        cascade: true
         
     | 
| 
      
 182 
     | 
    
         
            +
                      }
         
     | 
| 
      
 183 
     | 
    
         
            +
                      assetprops[:header_rules] = [[:all, {Rack::CACHE_CONTROL => "private, max-age=#{cache_for.to_i}"}]] if cache_for
         
     | 
| 
      
 184 
     | 
    
         
            +
                      middlewares << [[Rack::Static, assetprops], nil]
         
     | 
| 
      
 185 
     | 
    
         
            +
                    end
         
     | 
| 
      
 186 
     | 
    
         
            +
                  end
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
                  yield self if block_given?
         
     | 
| 
       142 
189 
     | 
    
         
             
                  extension.registered(WebApplication)
         
     | 
| 
       143 
190 
     | 
    
         
             
                end
         
     | 
| 
       144 
191 
     | 
    
         | 
    
        data/lib/sidekiq.rb
    CHANGED
    
    | 
         @@ -32,6 +32,7 @@ require "sidekiq/logger" 
     | 
|
| 
       32 
32 
     | 
    
         
             
            require "sidekiq/client"
         
     | 
| 
       33 
33 
     | 
    
         
             
            require "sidekiq/transaction_aware_client"
         
     | 
| 
       34 
34 
     | 
    
         
             
            require "sidekiq/job"
         
     | 
| 
      
 35 
     | 
    
         
            +
            require "sidekiq/iterable_job"
         
     | 
| 
       35 
36 
     | 
    
         
             
            require "sidekiq/worker_compatibility_alias"
         
     | 
| 
       36 
37 
     | 
    
         
             
            require "sidekiq/redis_client_adapter"
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
         @@ -112,7 +113,7 @@ module Sidekiq 
     | 
|
| 
       112 
113 
     | 
    
         
             
              #   end
         
     | 
| 
       113 
114 
     | 
    
         
             
              #   inst.run
         
     | 
| 
       114 
115 
     | 
    
         
             
              #   sleep 10
         
     | 
| 
       115 
     | 
    
         
            -
              #   inst. 
     | 
| 
      
 116 
     | 
    
         
            +
              #   inst.stop
         
     | 
| 
       116 
117 
     | 
    
         
             
              #
         
     | 
| 
       117 
118 
     | 
    
         
             
              # NB: it is really easy to overload a Ruby process with threads due to the GIL.
         
     | 
| 
       118 
119 
     | 
    
         
             
              # I do not recommend setting concurrency higher than 2-3.
         
     | 
    
        data/sidekiq.gemspec
    CHANGED
    
    | 
         @@ -23,8 +23,9 @@ Gem::Specification.new do |gem| 
     | 
|
| 
       23 
23 
     | 
    
         
             
                "rubygems_mfa_required" => "true"
         
     | 
| 
       24 
24 
     | 
    
         
             
              }
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
              gem.add_dependency "redis-client", ">= 0. 
     | 
| 
      
 26 
     | 
    
         
            +
              gem.add_dependency "redis-client", ">= 0.22.2"
         
     | 
| 
       27 
27 
     | 
    
         
             
              gem.add_dependency "connection_pool", ">= 2.3.0"
         
     | 
| 
       28 
28 
     | 
    
         
             
              gem.add_dependency "rack", ">= 2.2.4"
         
     | 
| 
       29 
29 
     | 
    
         
             
              gem.add_dependency "concurrent-ruby", "< 2"
         
     | 
| 
      
 30 
     | 
    
         
            +
              gem.add_dependency "logger"
         
     | 
| 
       30 
31 
     | 
    
         
             
            end
         
     | 
| 
         @@ -34,6 +34,7 @@ function addListeners() { 
     | 
|
| 
       34 
34 
     | 
    
         
             
              addShiftClickListeners()
         
     | 
| 
       35 
35 
     | 
    
         
             
              updateFuzzyTimes();
         
     | 
| 
       36 
36 
     | 
    
         
             
              updateNumbers();
         
     | 
| 
      
 37 
     | 
    
         
            +
              updateProgressBars();
         
     | 
| 
       37 
38 
     | 
    
         
             
              setLivePollFromUrl();
         
     | 
| 
       38 
39 
     | 
    
         | 
| 
       39 
40 
     | 
    
         
             
              var buttons = document.querySelectorAll(".live-poll");
         
     | 
| 
         @@ -180,4 +181,8 @@ function showError(error) { 
     | 
|
| 
       180 
181 
     | 
    
         | 
| 
       181 
182 
     | 
    
         
             
            function updateLocale(event) {
         
     | 
| 
       182 
183 
     | 
    
         
             
              event.target.form.submit();
         
     | 
| 
       183 
     | 
    
         
            -
            } 
     | 
| 
      
 184 
     | 
    
         
            +
            }
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
            function updateProgressBars() {
         
     | 
| 
      
 187 
     | 
    
         
            +
              document.querySelectorAll('.progress-bar').forEach(bar => { bar.style.width = bar.dataset.width + "%"})
         
     | 
| 
      
 188 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -108,17 +108,27 @@ class RealtimeChart extends DashboardChart { 
     | 
|
| 
       108 
108 
     | 
    
         
             
              }
         
     | 
| 
       109 
109 
     | 
    
         | 
| 
       110 
110 
     | 
    
         
             
              renderLegend(dp) {
         
     | 
| 
       111 
     | 
    
         
            -
                 
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
                 
     | 
| 
      
 111 
     | 
    
         
            +
                const entry1 = this.legendEntry(dp[0]);
         
     | 
| 
      
 112 
     | 
    
         
            +
                const entry2 = this.legendEntry(dp[1]);
         
     | 
| 
      
 113 
     | 
    
         
            +
                const time = document.createElement("span");
         
     | 
| 
      
 114 
     | 
    
         
            +
                time.classList.add("time");
         
     | 
| 
      
 115 
     | 
    
         
            +
                time.innerText = dp[0].label;
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                this.legend.replaceChildren(entry1, entry2, time)
         
     | 
| 
      
 118 
     | 
    
         
            +
              }
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
              legendEntry(dp) {
         
     | 
| 
      
 121 
     | 
    
         
            +
                const wrapper = document.createElement("span");
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                const swatch = document.createElement("span");
         
     | 
| 
      
 124 
     | 
    
         
            +
                swatch.classList.add("swatch");
         
     | 
| 
      
 125 
     | 
    
         
            +
                swatch.style.backgroundColor = dp.dataset.borderColor;
         
     | 
| 
      
 126 
     | 
    
         
            +
                wrapper.appendChild(swatch)
         
     | 
| 
      
 127 
     | 
    
         
            +
                
         
     | 
| 
      
 128 
     | 
    
         
            +
                const label = document.createElement("span");
         
     | 
| 
      
 129 
     | 
    
         
            +
                label.innerText = `${dp.dataset.label}: ${dp.formattedValue}`;
         
     | 
| 
      
 130 
     | 
    
         
            +
                wrapper.appendChild(label)
         
     | 
| 
      
 131 
     | 
    
         
            +
                return wrapper;
         
     | 
| 
       122 
132 
     | 
    
         
             
              }
         
     | 
| 
       123 
133 
     | 
    
         | 
| 
       124 
134 
     | 
    
         
             
              renderCursor(dp) {
         
     | 
| 
         @@ -179,4 +189,4 @@ class RealtimeChart extends DashboardChart { 
     | 
|
| 
       179 
189 
     | 
    
         
             
              if (hc != null) {
         
     | 
| 
       180 
190 
     | 
    
         
             
                var htc = new DashboardChart(hc, JSON.parse(hc.textContent))
         
     | 
| 
       181 
191 
     | 
    
         
             
                window.historyChart = htc
         
     | 
| 
       182 
     | 
    
         
            -
              }
         
     | 
| 
      
 192 
     | 
    
         
            +
              }
         
     | 
| 
         @@ -28,7 +28,7 @@ var pulseBeacon = function() { 
     | 
|
| 
       28 
28 
     | 
    
         
             
            }
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
            var setSliderLabel = function(val) {
         
     | 
| 
       31 
     | 
    
         
            -
              document.getElementById('sldr-text').innerText = Math.round(parseFloat(val) / 1000) + '  
     | 
| 
      
 31 
     | 
    
         
            +
              document.getElementById('sldr-text').innerText = Math.round(parseFloat(val) / 1000) + ' s';
         
     | 
| 
       32 
32 
     | 
    
         
             
            }
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
            var ready = (callback) => {
         
     | 
| 
         @@ -72,6 +72,14 @@ h1, h2, h3 { 
     | 
|
| 
       72 
72 
     | 
    
         
             
              line-height: 45px;
         
     | 
| 
       73 
73 
     | 
    
         
             
            }
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
      
 75 
     | 
    
         
            +
            .progress {
         
     | 
| 
      
 76 
     | 
    
         
            +
              margin-bottom: 0;
         
     | 
| 
      
 77 
     | 
    
         
            +
            }
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            .w-50 {
         
     | 
| 
      
 80 
     | 
    
         
            +
              width: 50%;
         
     | 
| 
      
 81 
     | 
    
         
            +
            }
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
       75 
83 
     | 
    
         
             
            .header-container, .header-container .page-title-container {
         
     | 
| 
       76 
84 
     | 
    
         
             
              display: flex;
         
     | 
| 
       77 
85 
     | 
    
         
             
              justify-content: space-between;
         
     | 
| 
         @@ -640,18 +648,18 @@ div.interval-slider input { 
     | 
|
| 
       640 
648 
     | 
    
         | 
| 
       641 
649 
     | 
    
         
             
            @media (min-width: 768px) {
         
     | 
| 
       642 
650 
     | 
    
         
             
              .redis-url {
         
     | 
| 
       643 
     | 
    
         
            -
                max-width:  
     | 
| 
      
 651 
     | 
    
         
            +
                max-width: 160px;
         
     | 
| 
       644 
652 
     | 
    
         
             
              }
         
     | 
| 
       645 
653 
     | 
    
         
             
            }
         
     | 
| 
       646 
654 
     | 
    
         | 
| 
       647 
655 
     | 
    
         
             
            @media (min-width: 992px) {
         
     | 
| 
       648 
656 
     | 
    
         
             
              .redis-url {
         
     | 
| 
       649 
     | 
    
         
            -
                max-width:  
     | 
| 
      
 657 
     | 
    
         
            +
                max-width: 380px;
         
     | 
| 
       650 
658 
     | 
    
         
             
              }
         
     | 
| 
       651 
659 
     | 
    
         
             
            }
         
     | 
| 
       652 
660 
     | 
    
         
             
            @media (min-width: 1200px) {
         
     | 
| 
       653 
661 
     | 
    
         
             
              .redis-url {
         
     | 
| 
       654 
     | 
    
         
            -
                max-width:  
     | 
| 
      
 662 
     | 
    
         
            +
                max-width: 580px;
         
     | 
| 
       655 
663 
     | 
    
         
             
              }
         
     | 
| 
       656 
664 
     | 
    
         
             
            }
         
     | 
| 
       657 
665 
     | 
    
         | 
    
        data/web/locales/tr.yml
    ADDED
    
    | 
         @@ -0,0 +1,101 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # elements like %{queue} are variables and should not be translated
         
     | 
| 
      
 2 
     | 
    
         
            +
            tr:
         
     | 
| 
      
 3 
     | 
    
         
            +
              Actions: Eylemler
         
     | 
| 
      
 4 
     | 
    
         
            +
              AddToQueue: Kuyruğa ekle
         
     | 
| 
      
 5 
     | 
    
         
            +
              AreYouSure: Emin misiniz?
         
     | 
| 
      
 6 
     | 
    
         
            +
              AreYouSureDeleteJob: Bu işi silmek istediğinizden emin misiniz?
         
     | 
| 
      
 7 
     | 
    
         
            +
              AreYouSureDeleteQueue: "%{queue} kuyruğunu silmek istediğinizden emin misiniz?"
         
     | 
| 
      
 8 
     | 
    
         
            +
              Arguments: Argümanlar
         
     | 
| 
      
 9 
     | 
    
         
            +
              BackToApp: Uygulamaya geri dön
         
     | 
| 
      
 10 
     | 
    
         
            +
              Busy: Meşgul
         
     | 
| 
      
 11 
     | 
    
         
            +
              Class: Sınıf
         
     | 
| 
      
 12 
     | 
    
         
            +
              Connections: Bağlantılar
         
     | 
| 
      
 13 
     | 
    
         
            +
              CreatedAt: Oluşturulma Tarihi
         
     | 
| 
      
 14 
     | 
    
         
            +
              CurrentMessagesInQueue: Şu anki işler <span class='title'>%{queue}</span>
         
     | 
| 
      
 15 
     | 
    
         
            +
              Dashboard: Gösterge Paneli
         
     | 
| 
      
 16 
     | 
    
         
            +
              Dead: Ölü
         
     | 
| 
      
 17 
     | 
    
         
            +
              DeadJobs: Ölü İşler
         
     | 
| 
      
 18 
     | 
    
         
            +
              Delete: Sil
         
     | 
| 
      
 19 
     | 
    
         
            +
              DeleteAll: Hepsini Sil
         
     | 
| 
      
 20 
     | 
    
         
            +
              Deploy: Dağıt
         
     | 
| 
      
 21 
     | 
    
         
            +
              Enqueued: Kuyruğa Alındı
         
     | 
| 
      
 22 
     | 
    
         
            +
              Error: Hata
         
     | 
| 
      
 23 
     | 
    
         
            +
              ErrorBacktrace: Hata Geri İzleme
         
     | 
| 
      
 24 
     | 
    
         
            +
              ErrorClass: Hata Sınıfı
         
     | 
| 
      
 25 
     | 
    
         
            +
              ErrorMessage: Hata Mesajı
         
     | 
| 
      
 26 
     | 
    
         
            +
              ExecutionTime: Yürütme Süresi
         
     | 
| 
      
 27 
     | 
    
         
            +
              Extras: Ekstralar
         
     | 
| 
      
 28 
     | 
    
         
            +
              Failed: Başarısız
         
     | 
| 
      
 29 
     | 
    
         
            +
              Failures: Başarısızlıklar
         
     | 
| 
      
 30 
     | 
    
         
            +
              Failure: Başarısızlık
         
     | 
| 
      
 31 
     | 
    
         
            +
              GoBack: ← Geri Dön
         
     | 
| 
      
 32 
     | 
    
         
            +
              History: Geçmiş
         
     | 
| 
      
 33 
     | 
    
         
            +
              Job: İş
         
     | 
| 
      
 34 
     | 
    
         
            +
              Jobs: İşler
         
     | 
| 
      
 35 
     | 
    
         
            +
              Kill: Sonlandır
         
     | 
| 
      
 36 
     | 
    
         
            +
              KillAll: Hepsini Sonlandır
         
     | 
| 
      
 37 
     | 
    
         
            +
              LastRetry: Son Yeniden Deneme
         
     | 
| 
      
 38 
     | 
    
         
            +
              Latency: Gecikme
         
     | 
| 
      
 39 
     | 
    
         
            +
              LivePoll: Canlı Anket
         
     | 
| 
      
 40 
     | 
    
         
            +
              MemoryUsage: Bellek Kullanımı
         
     | 
| 
      
 41 
     | 
    
         
            +
              Name: İsim
         
     | 
| 
      
 42 
     | 
    
         
            +
              Namespace: Ad Alanı
         
     | 
| 
      
 43 
     | 
    
         
            +
              NextRetry: Bir Sonraki Yeniden Deneme
         
     | 
| 
      
 44 
     | 
    
         
            +
              NoDeadJobsFound: Ölü iş bulunamadı
         
     | 
| 
      
 45 
     | 
    
         
            +
              NoRetriesFound: Yeniden deneme bulunamadı
         
     | 
| 
      
 46 
     | 
    
         
            +
              NoScheduledFound: Zamanlanmış iş bulunamadı
         
     | 
| 
      
 47 
     | 
    
         
            +
              NotYetEnqueued: Henüz kuyruğa alınmadı
         
     | 
| 
      
 48 
     | 
    
         
            +
              OneMonth: 1 ay
         
     | 
| 
      
 49 
     | 
    
         
            +
              OneWeek: 1 hafta
         
     | 
| 
      
 50 
     | 
    
         
            +
              OriginallyFailed: İlk Başarısızlık
         
     | 
| 
      
 51 
     | 
    
         
            +
              Pause: Duraklat
         
     | 
| 
      
 52 
     | 
    
         
            +
              Paused: Duraklatıldı
         
     | 
| 
      
 53 
     | 
    
         
            +
              PeakMemoryUsage: Maksimum Bellek Kullanımı
         
     | 
| 
      
 54 
     | 
    
         
            +
              Plugins: Eklentiler
         
     | 
| 
      
 55 
     | 
    
         
            +
              PollingInterval: Anket Aralığı
         
     | 
| 
      
 56 
     | 
    
         
            +
              Process: Süreç
         
     | 
| 
      
 57 
     | 
    
         
            +
              Processed: İşlendi
         
     | 
| 
      
 58 
     | 
    
         
            +
              Processes: Süreçler
         
     | 
| 
      
 59 
     | 
    
         
            +
              Queue: Kuyruk
         
     | 
| 
      
 60 
     | 
    
         
            +
              Queues: Kuyruklar
         
     | 
| 
      
 61 
     | 
    
         
            +
              Quiet: Sessiz
         
     | 
| 
      
 62 
     | 
    
         
            +
              QuietAll: Hepsini Sessiz Yap
         
     | 
| 
      
 63 
     | 
    
         
            +
              Realtime: Gerçek Zamanlı
         
     | 
| 
      
 64 
     | 
    
         
            +
              Retries: Yeniden Denemeler
         
     | 
| 
      
 65 
     | 
    
         
            +
              RetryAll: Hepsini Yeniden Dene
         
     | 
| 
      
 66 
     | 
    
         
            +
              RetryCount: Yeniden Deneme Sayısı
         
     | 
| 
      
 67 
     | 
    
         
            +
              RetryNow: Şimdi Yeniden Dene
         
     | 
| 
      
 68 
     | 
    
         
            +
              Scheduled: Zamanlanmış
         
     | 
| 
      
 69 
     | 
    
         
            +
              ScheduledJobs: Zamanlanmış İşler
         
     | 
| 
      
 70 
     | 
    
         
            +
              Seconds: Saniye
         
     | 
| 
      
 71 
     | 
    
         
            +
              ShowAll: Hepsini Göster
         
     | 
| 
      
 72 
     | 
    
         
            +
              SixMonths: 6 ay
         
     | 
| 
      
 73 
     | 
    
         
            +
              Size: Boyut
         
     | 
| 
      
 74 
     | 
    
         
            +
              Started: Başlatıldı
         
     | 
| 
      
 75 
     | 
    
         
            +
              Status: Durum
         
     | 
| 
      
 76 
     | 
    
         
            +
              Stop: Durdur
         
     | 
| 
      
 77 
     | 
    
         
            +
              StopAll: Hepsini Durdur
         
     | 
| 
      
 78 
     | 
    
         
            +
              StopPolling: Anketi Durdur
         
     | 
| 
      
 79 
     | 
    
         
            +
              Success: Başarı
         
     | 
| 
      
 80 
     | 
    
         
            +
              Summary: Özet
         
     | 
| 
      
 81 
     | 
    
         
            +
              Thread: İplik
         
     | 
| 
      
 82 
     | 
    
         
            +
              Threads: İplikler
         
     | 
| 
      
 83 
     | 
    
         
            +
              ThreeMonths: 3 ay
         
     | 
| 
      
 84 
     | 
    
         
            +
              Time: Zaman
         
     | 
| 
      
 85 
     | 
    
         
            +
              Unpause: Duraklatmayı Kaldır
         
     | 
| 
      
 86 
     | 
    
         
            +
              Uptime: Çalışma Süresi (gün)
         
     | 
| 
      
 87 
     | 
    
         
            +
              Utilization: Kullanım
         
     | 
| 
      
 88 
     | 
    
         
            +
              Version: Sürüm
         
     | 
| 
      
 89 
     | 
    
         
            +
              When: Ne Zaman
         
     | 
| 
      
 90 
     | 
    
         
            +
              Worker: İşçi
         
     | 
| 
      
 91 
     | 
    
         
            +
              active: aktif
         
     | 
| 
      
 92 
     | 
    
         
            +
              idle: boşta
         
     | 
| 
      
 93 
     | 
    
         
            +
              Metrics: Metrikler
         
     | 
| 
      
 94 
     | 
    
         
            +
              NoDataFound: Veri bulunamadı
         
     | 
| 
      
 95 
     | 
    
         
            +
              TotalExecutionTime: Toplam Yürütme Süresi
         
     | 
| 
      
 96 
     | 
    
         
            +
              AvgExecutionTime: Ortalama Yürütme Süresi
         
     | 
| 
      
 97 
     | 
    
         
            +
              Context: Bağlam
         
     | 
| 
      
 98 
     | 
    
         
            +
              Bucket: Kova
         
     | 
| 
      
 99 
     | 
    
         
            +
              NoJobMetricsFound: Son iş metrikleri bulunamadı
         
     | 
| 
      
 100 
     | 
    
         
            +
              Filter: Filtre
         
     | 
| 
      
 101 
     | 
    
         
            +
              AnyJobContent: Herhangi bir iş içeriği
         
     | 
    
        data/web/views/dashboard.erb
    CHANGED
    
    | 
         @@ -1,4 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js"></script>
         
     | 
| 
      
 1 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
       2 
2 
     | 
    
         
             
            <div class= "dashboard clearfix">
         
     | 
| 
       3 
3 
     | 
    
         
             
              <h3 >
         
     | 
| 
       4 
4 
     | 
    
         
             
                <%= t('Dashboard') %>
         
     | 
| 
         @@ -9,7 +9,7 @@ 
     | 
|
| 
       9 
9 
     | 
    
         
             
              </h3>
         
     | 
| 
       10 
10 
     | 
    
         
             
              <div class="interval-slider ltr">
         
     | 
| 
       11 
11 
     | 
    
         
             
                <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
         
     | 
| 
       12 
     | 
    
         
            -
                <span id="sldr-text" class="current-interval">5  
     | 
| 
      
 12 
     | 
    
         
            +
                <span id="sldr-text" class="current-interval">5 s</span>
         
     | 
| 
       13 
13 
     | 
    
         
             
                <br/>
         
     | 
| 
       14 
14 
     | 
    
         
             
                <input id="sldr" type="range" min="2000" max="20000" step="1000" value="5000"/>
         
     | 
| 
       15 
15 
     | 
    
         
             
              </div>
         
     | 
| 
         @@ -99,7 +99,7 @@ 
     | 
|
| 
       99 
99 
     | 
    
         
             
              </div>
         
     | 
| 
       100 
100 
     | 
    
         
             
            </div>
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
         
     | 
| 
       103 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
         
     | 
| 
       104 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
         
     | 
| 
       105 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js"></script>
         
     | 
| 
      
 102 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 103 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 104 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 105 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js" nonce="<%= csp_nonce %>"></script>
         
     | 
    
        data/web/views/layout.erb
    CHANGED
    
    | 
         @@ -5,20 +5,20 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
                <meta charset="utf-8" />
         
     | 
| 
       6 
6 
     | 
    
         
             
                <meta name="viewport" content="width=device-width,initial-scale=1.0" />
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
                <link href="<%= root_path %>stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" />
         
     | 
| 
      
 8 
     | 
    
         
            +
                <link href="<%= root_path %>stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
         
     | 
| 
       9 
9 
     | 
    
         
             
                <% if rtl? %>
         
     | 
| 
       10 
     | 
    
         
            -
                <link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css"/>
         
     | 
| 
      
 10 
     | 
    
         
            +
                <link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>"/>
         
     | 
| 
       11 
11 
     | 
    
         
             
                <% end %>
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                <link href="<%= root_path %>stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />
         
     | 
| 
       14 
     | 
    
         
            -
                <link href="<%= root_path %>stylesheets/application-dark.css" media="screen and (prefers-color-scheme: dark)" rel="stylesheet" type="text/css" />
         
     | 
| 
      
 13 
     | 
    
         
            +
                <link href="<%= root_path %>stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
         
     | 
| 
      
 14 
     | 
    
         
            +
                <link href="<%= root_path %>stylesheets/application-dark.css" media="screen and (prefers-color-scheme: dark)" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
         
     | 
| 
       15 
15 
     | 
    
         
             
                <% if rtl? %>
         
     | 
| 
       16 
     | 
    
         
            -
                <link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" />
         
     | 
| 
      
 16 
     | 
    
         
            +
                <link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
         
     | 
| 
       17 
17 
     | 
    
         
             
                <% end %>
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                <link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png">
         
     | 
| 
       20 
20 
     | 
    
         
             
                <link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico" />
         
     | 
| 
       21 
     | 
    
         
            -
                <script type="text/javascript" src="<%= root_path %>javascripts/application.js"></script>
         
     | 
| 
      
 21 
     | 
    
         
            +
                <script type="text/javascript" src="<%= root_path %>javascripts/application.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
       22 
22 
     | 
    
         
             
                <meta name="google" content="notranslate" />
         
     | 
| 
       23 
23 
     | 
    
         
             
                <%= display_custom_head %>
         
     | 
| 
       24 
24 
     | 
    
         
             
              </head>
         
     | 
    
        data/web/views/metrics.erb
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
         
     | 
| 
       2 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
         
     | 
| 
       3 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
         
     | 
| 
      
 1 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 2 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 3 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            <div class="header-container">
         
     | 
| 
       6 
6 
     | 
    
         
             
              <div class="page-title-container">
         
     | 
| 
         @@ -88,4 +88,4 @@ 
     | 
|
| 
       88 
88 
     | 
    
         | 
| 
       89 
89 
     | 
    
         
             
            <!--p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p-->
         
     | 
| 
       90 
90 
     | 
    
         | 
| 
       91 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js"></script>
         
     | 
| 
      
 91 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
         
     | 
| 
       2 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
         
     | 
| 
       3 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
         
     | 
| 
      
 1 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 2 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
      
 3 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            <%
         
     | 
| 
       6 
6 
     | 
    
         
             
              job_result = @query_result.job_results[@name]
         
     | 
| 
         @@ -56,4 +56,4 @@ 
     | 
|
| 
       56 
56 
     | 
    
         
             
              <div class="alert alert-success"><%= t('NoJobMetricsFound') %></div>
         
     | 
| 
       57 
57 
     | 
    
         
             
            <% end %>
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
            <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js"></script>
         
     | 
| 
      
 59 
     | 
    
         
            +
            <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js" nonce="<%= csp_nonce %>"></script>
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: sidekiq
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 7.2 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 7.3.2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Mike Perham
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2024-04 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2024-09-04 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: redis-client
         
     | 
| 
         @@ -16,14 +16,14 @@ dependencies: 
     | 
|
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
17 
     | 
    
         
             
                - - ">="
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 19 
     | 
    
         
            +
                    version: 0.22.2
         
     | 
| 
       20 
20 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       21 
21 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
22 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
23 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
24 
     | 
    
         
             
                - - ">="
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version: 0. 
     | 
| 
      
 26 
     | 
    
         
            +
                    version: 0.22.2
         
     | 
| 
       27 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
28 
     | 
    
         
             
              name: connection_pool
         
     | 
| 
       29 
29 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -66,6 +66,20 @@ dependencies: 
     | 
|
| 
       66 
66 
     | 
    
         
             
                - - "<"
         
     | 
| 
       67 
67 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       68 
68 
     | 
    
         
             
                    version: '2'
         
     | 
| 
      
 69 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 70 
     | 
    
         
            +
              name: logger
         
     | 
| 
      
 71 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 72 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 73 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 74 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 75 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 76 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 77 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 78 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 79 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 80 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 81 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 82 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       69 
83 
     | 
    
         
             
            description: Simple, efficient background processing for Ruby.
         
     | 
| 
       70 
84 
     | 
    
         
             
            email:
         
     | 
| 
       71 
85 
     | 
    
         
             
            - info@contribsys.com
         
     | 
| 
         @@ -96,7 +110,13 @@ files: 
     | 
|
| 
       96 
110 
     | 
    
         
             
            - lib/sidekiq/deploy.rb
         
     | 
| 
       97 
111 
     | 
    
         
             
            - lib/sidekiq/embedded.rb
         
     | 
| 
       98 
112 
     | 
    
         
             
            - lib/sidekiq/fetch.rb
         
     | 
| 
      
 113 
     | 
    
         
            +
            - lib/sidekiq/iterable_job.rb
         
     | 
| 
       99 
114 
     | 
    
         
             
            - lib/sidekiq/job.rb
         
     | 
| 
      
 115 
     | 
    
         
            +
            - lib/sidekiq/job/interrupt_handler.rb
         
     | 
| 
      
 116 
     | 
    
         
            +
            - lib/sidekiq/job/iterable.rb
         
     | 
| 
      
 117 
     | 
    
         
            +
            - lib/sidekiq/job/iterable/active_record_enumerator.rb
         
     | 
| 
      
 118 
     | 
    
         
            +
            - lib/sidekiq/job/iterable/csv_enumerator.rb
         
     | 
| 
      
 119 
     | 
    
         
            +
            - lib/sidekiq/job/iterable/enumerators.rb
         
     | 
| 
       100 
120 
     | 
    
         
             
            - lib/sidekiq/job_logger.rb
         
     | 
| 
       101 
121 
     | 
    
         
             
            - lib/sidekiq/job_retry.rb
         
     | 
| 
       102 
122 
     | 
    
         
             
            - lib/sidekiq/job_util.rb
         
     | 
| 
         @@ -172,6 +192,7 @@ files: 
     | 
|
| 
       172 
192 
     | 
    
         
             
            - web/locales/ru.yml
         
     | 
| 
       173 
193 
     | 
    
         
             
            - web/locales/sv.yml
         
     | 
| 
       174 
194 
     | 
    
         
             
            - web/locales/ta.yml
         
     | 
| 
      
 195 
     | 
    
         
            +
            - web/locales/tr.yml
         
     | 
| 
       175 
196 
     | 
    
         
             
            - web/locales/uk.yml
         
     | 
| 
       176 
197 
     | 
    
         
             
            - web/locales/ur.yml
         
     | 
| 
       177 
198 
     | 
    
         
             
            - web/locales/vi.yml
         
     | 
| 
         @@ -224,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       224 
245 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       225 
246 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       226 
247 
     | 
    
         
             
            requirements: []
         
     | 
| 
       227 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 248 
     | 
    
         
            +
            rubygems_version: 3.5.11
         
     | 
| 
       228 
249 
     | 
    
         
             
            signing_key:
         
     | 
| 
       229 
250 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       230 
251 
     | 
    
         
             
            summary: Simple, efficient background processing for Ruby
         
     |