Sha256: c866a07b25420a39b23896bfee65b172a0da1e930d74ec02c5f65fc836fcfe18

Contents?: true

Size: 1.92 KB

Versions: 22

Compression:

Stored size: 1.92 KB

Contents

module CanvasSync
  module JobBatches
    module RedisModel
      extend ActiveSupport::Concern

      class_methods do
        def redis_attr(key, type = :string, read_only: true)
          class_eval <<-RUBY, __FILE__, __LINE__ + 1
            def #{key}=(value)
              raise "#{key} is read-only once the batch has been started" if #{read_only.to_s} && (@initialized || @existing)
              @#{key} = value
              if :#{type} == :json
                value = JSON.unparse(value)
              end
              persist_bid_attr('#{key}', value)
            end

            def #{key}
              return @#{key} if defined?(@#{key})
              if (@initialized || @existing)
                value = read_bid_attr('#{key}')
                if :#{type} == :bool
                  value = value == 'true'
                elsif :#{type} == :int
                  value = value.to_i
                elsif :#{type} == :float
                  value = value.to_f
                elsif :#{type} == :json
                  value = JSON.parse(value)
                elsif :#{type} == :symbol
                  value = value&.to_sym
                end
                @#{key} = value
              end
            end
          RUBY
        end
      end

      def persist_bid_attr(attribute, value)
        if @initialized || @existing
          redis do |r|
            r.multi do |r|
              r.hset(redis_key, attribute, value)
              r.expire(redis_key, Batch::BID_EXPIRE_TTL)
            end
          end
        else
          @pending_attrs ||= {}
          @pending_attrs[attribute] = value
        end
      end

      def read_bid_attr(attribute)
        redis do |r|
          r.hget(redis_key, attribute)
        end
      end

      def flush_pending_attrs
        redis do |r|
          r.mapped_hmset(redis_key, @pending_attrs)
        end
        @initialized = true
        @pending_attrs = {}
      end
    end
  end
end

Version data entries

22 entries across 22 versions & 1 rubygems

Version Path
canvas_sync-0.18.7 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.6 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.5 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.3 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.2 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.1 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.0.beta2 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.18.0.beta1 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.43 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.42 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.41 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.40 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.39 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.38 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.37 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.36 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.35 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.34 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.33 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.17.32 lib/canvas_sync/job_batches/redis_model.rb