Sha256: 767f73c0c2fb9fec03d9ce6f3db5097ab25a5b2762b3c9b892a4629bc0de3242

Contents?: true

Size: 1.8 KB

Versions: 17

Compression:

Stored size: 1.8 KB

Contents

module CanvasSync::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.to_s)
            r.expire(redis_key, Batch::BID_EXPIRE_TTL)
          end
        end
      else
        @pending_attrs ||= {}
        @pending_attrs[attribute] = value.to_s
      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

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
canvas_sync-0.22.9 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.8 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.6 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.5 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.4 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.3 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.2 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.1 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta8 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta7 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta6 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta5 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta4 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta3 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta2 lib/canvas_sync/job_batches/redis_model.rb
canvas_sync-0.22.0.beta1 lib/canvas_sync/job_batches/redis_model.rb