dynamoid 2.2.0 → 3.0.0
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/.rubocop.yml +53 -0
- data/.rubocop_todo.yml +55 -0
- data/.travis.yml +5 -27
- data/Appraisals +17 -15
- data/CHANGELOG.md +26 -3
- data/Gemfile +4 -2
- data/README.md +95 -77
- data/Rakefile +17 -17
- data/Vagrantfile +5 -3
- data/dynamoid.gemspec +39 -45
- data/gemfiles/rails_4_2.gemfile +7 -5
- data/gemfiles/rails_5_0.gemfile +6 -4
- data/gemfiles/rails_5_1.gemfile +6 -4
- data/gemfiles/rails_5_2.gemfile +6 -4
- data/lib/dynamoid.rb +11 -4
- data/lib/dynamoid/adapter.rb +21 -27
- data/lib/dynamoid/adapter_plugin/{aws_sdk_v2.rb → aws_sdk_v3.rb} +118 -113
- data/lib/dynamoid/application_time_zone.rb +27 -0
- data/lib/dynamoid/associations.rb +3 -6
- data/lib/dynamoid/associations/association.rb +3 -6
- data/lib/dynamoid/associations/belongs_to.rb +4 -5
- data/lib/dynamoid/associations/has_and_belongs_to_many.rb +2 -3
- data/lib/dynamoid/associations/has_many.rb +2 -3
- data/lib/dynamoid/associations/has_one.rb +2 -3
- data/lib/dynamoid/associations/many_association.rb +8 -9
- data/lib/dynamoid/associations/single_association.rb +3 -3
- data/lib/dynamoid/components.rb +2 -2
- data/lib/dynamoid/config.rb +9 -5
- data/lib/dynamoid/config/backoff_strategies/constant_backoff.rb +4 -2
- data/lib/dynamoid/config/backoff_strategies/exponential_backoff.rb +3 -1
- data/lib/dynamoid/config/options.rb +4 -4
- data/lib/dynamoid/criteria.rb +3 -5
- data/lib/dynamoid/criteria/chain.rb +42 -49
- data/lib/dynamoid/dirty.rb +5 -4
- data/lib/dynamoid/document.rb +142 -36
- data/lib/dynamoid/dumping.rb +167 -0
- data/lib/dynamoid/dynamodb_time_zone.rb +16 -0
- data/lib/dynamoid/errors.rb +7 -6
- data/lib/dynamoid/fields.rb +24 -23
- data/lib/dynamoid/finders.rb +101 -59
- data/lib/dynamoid/identity_map.rb +5 -11
- data/lib/dynamoid/indexes.rb +45 -46
- data/lib/dynamoid/middleware/identity_map.rb +2 -0
- data/lib/dynamoid/persistence.rb +67 -307
- data/lib/dynamoid/primary_key_type_mapping.rb +34 -0
- data/lib/dynamoid/railtie.rb +3 -1
- data/lib/dynamoid/tasks/database.rake +11 -11
- data/lib/dynamoid/tasks/database.rb +4 -3
- data/lib/dynamoid/type_casting.rb +193 -0
- data/lib/dynamoid/undumping.rb +188 -0
- data/lib/dynamoid/validations.rb +4 -7
- data/lib/dynamoid/version.rb +3 -1
- metadata +59 -53
- data/gemfiles/rails_4_0.gemfile +0 -9
- data/gemfiles/rails_4_1.gemfile +0 -9
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Dynamoid
         | 
| 4 | 
            +
              module ApplicationTimeZone
         | 
| 5 | 
            +
                def self.at(value)
         | 
| 6 | 
            +
                  case Dynamoid::Config.application_timezone
         | 
| 7 | 
            +
                  when :utc
         | 
| 8 | 
            +
                    ActiveSupport::TimeZone['UTC'].at(value).to_datetime
         | 
| 9 | 
            +
                  when :local
         | 
| 10 | 
            +
                    Time.at(value).to_datetime
         | 
| 11 | 
            +
                  when String
         | 
| 12 | 
            +
                    ActiveSupport::TimeZone[Dynamoid::Config.application_timezone].at(value).to_datetime
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def self.utc_offset
         | 
| 17 | 
            +
                  case Dynamoid::Config.application_timezone
         | 
| 18 | 
            +
                  when :utc
         | 
| 19 | 
            +
                    0
         | 
| 20 | 
            +
                  when :local
         | 
| 21 | 
            +
                    Time.now.utc_offset
         | 
| 22 | 
            +
                  when String
         | 
| 23 | 
            +
                    ActiveSupport::TimeZone[Dynamoid::Config.application_timezone].now.utc_offset
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -1,4 +1,5 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 2 3 | 
             
            require 'dynamoid/associations/association'
         | 
| 3 4 | 
             
            require 'dynamoid/associations/single_association'
         | 
| 4 5 | 
             
            require 'dynamoid/associations/many_association'
         | 
| @@ -8,7 +9,6 @@ require 'dynamoid/associations/has_one' | |
| 8 9 | 
             
            require 'dynamoid/associations/has_and_belongs_to_many'
         | 
| 9 10 |  | 
| 10 11 | 
             
            module Dynamoid
         | 
| 11 | 
            -
             | 
| 12 12 | 
             
              # Connects models together through the magic of associations. We enjoy four different kinds of associations presently:
         | 
| 13 13 | 
             
              #   * belongs_to
         | 
| 14 14 | 
             
              #   * has_and_belongs_to_many
         | 
| @@ -25,7 +25,6 @@ module Dynamoid | |
| 25 25 | 
             
                end
         | 
| 26 26 |  | 
| 27 27 | 
             
                module ClassMethods
         | 
| 28 | 
            -
             | 
| 29 28 | 
             
                  # create a has_many association for this document.
         | 
| 30 29 | 
             
                  #
         | 
| 31 30 | 
             
                  # @param [Symbol] name the name of the association
         | 
| @@ -97,7 +96,7 @@ module Dynamoid | |
| 97 96 |  | 
| 98 97 | 
             
                    field field_name.to_sym, field_type
         | 
| 99 98 |  | 
| 100 | 
            -
                     | 
| 99 | 
            +
                    associations[name] = options.merge(type: type)
         | 
| 101 100 |  | 
| 102 101 | 
             
                    define_method(name) do
         | 
| 103 102 | 
             
                      @associations[:"#{name}_ids"] ||= Dynamoid::Associations.const_get(type.to_s.camelcase).new(self, name, options)
         | 
| @@ -109,7 +108,5 @@ module Dynamoid | |
| 109 108 | 
             
                    end
         | 
| 110 109 | 
             
                  end
         | 
| 111 110 | 
             
                end
         | 
| 112 | 
            -
             | 
| 113 111 | 
             
              end
         | 
| 114 | 
            -
             | 
| 115 112 | 
             
            end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            #  | 
| 2 | 
            -
            module Dynamoid #:nodoc:
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 3 2 |  | 
| 3 | 
            +
            module Dynamoid #:nodoc:
         | 
| 4 4 | 
             
              # The base association module which all associations include. Every association has two very important components: the source and
         | 
| 5 5 | 
             
              # the target. The source is the object which is calling the association information. It always has the target_ids inside of an attribute on itself.
         | 
| 6 6 | 
             
              # The target is the object which is referencing by this association.
         | 
| @@ -32,8 +32,7 @@ module Dynamoid #:nodoc: | |
| 32 32 | 
             
                    @loaded
         | 
| 33 33 | 
             
                  end
         | 
| 34 34 |  | 
| 35 | 
            -
                  def find_target
         | 
| 36 | 
            -
                  end
         | 
| 35 | 
            +
                  def find_target; end
         | 
| 37 36 |  | 
| 38 37 | 
             
                  def target
         | 
| 39 38 | 
             
                    unless loaded?
         | 
| @@ -125,8 +124,6 @@ module Dynamoid #:nodoc: | |
| 125 124 | 
             
                  def build(attributes = {})
         | 
| 126 125 | 
             
                    target_class.build(attributes)
         | 
| 127 126 | 
             
                  end
         | 
| 128 | 
            -
             | 
| 129 127 | 
             
                end
         | 
| 130 128 | 
             
              end
         | 
| 131 | 
            -
             | 
| 132 129 | 
             
            end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            #  | 
| 2 | 
            -
            module Dynamoid #:nodoc:
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 3 2 |  | 
| 3 | 
            +
            module Dynamoid #:nodoc:
         | 
| 4 4 | 
             
              # The belongs_to association. For belongs_to, we reference only a single target instead of multiple records; that target is the
         | 
| 5 5 | 
             
              # object to which the association object is associated.
         | 
| 6 6 | 
             
              module Associations
         | 
| @@ -40,15 +40,14 @@ module Dynamoid #:nodoc: | |
| 40 40 | 
             
                  def target_association
         | 
| 41 41 | 
             
                    has_many_key_name = options[:inverse_of] || source.class.to_s.underscore.pluralize.to_sym
         | 
| 42 42 | 
             
                    has_one_key_name = options[:inverse_of] || source.class.to_s.underscore.to_sym
         | 
| 43 | 
            -
                     | 
| 43 | 
            +
                    unless target_class.associations[has_many_key_name].nil?
         | 
| 44 44 | 
             
                      return has_many_key_name if target_class.associations[has_many_key_name][:type] == :has_many
         | 
| 45 45 | 
             
                    end
         | 
| 46 46 |  | 
| 47 | 
            -
                     | 
| 47 | 
            +
                    unless target_class.associations[has_one_key_name].nil?
         | 
| 48 48 | 
             
                      return has_one_key_name if target_class.associations[has_one_key_name][:type] == :has_one
         | 
| 49 49 | 
             
                    end
         | 
| 50 50 | 
             
                  end
         | 
| 51 51 | 
             
                end
         | 
| 52 52 | 
             
              end
         | 
| 53 | 
            -
             | 
| 54 53 | 
             
            end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            #  | 
| 2 | 
            -
            module Dynamoid #:nodoc:
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 3 2 |  | 
| 3 | 
            +
            module Dynamoid #:nodoc:
         | 
| 4 4 | 
             
              # The has and belongs to many association.
         | 
| 5 5 | 
             
              module Associations
         | 
| 6 6 | 
             
                class HasAndBelongsToMany
         | 
| @@ -20,5 +20,4 @@ module Dynamoid #:nodoc: | |
| 20 20 | 
             
                  end
         | 
| 21 21 | 
             
                end
         | 
| 22 22 | 
             
              end
         | 
| 23 | 
            -
             | 
| 24 23 | 
             
            end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            #  | 
| 2 | 
            -
            module Dynamoid #:nodoc:
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 3 2 |  | 
| 3 | 
            +
            module Dynamoid #:nodoc:
         | 
| 4 4 | 
             
              module Associations
         | 
| 5 5 | 
             
                module ManyAssociation
         | 
| 6 6 | 
             
                  include Association
         | 
| @@ -34,9 +34,9 @@ module Dynamoid #:nodoc: | |
| 34 34 | 
             
                  end
         | 
| 35 35 |  | 
| 36 36 | 
             
                  # Alias convenience methods for the associations.
         | 
| 37 | 
            -
                  alias  | 
| 38 | 
            -
                  alias  | 
| 39 | 
            -
                  alias  | 
| 37 | 
            +
                  alias all records
         | 
| 38 | 
            +
                  alias count size
         | 
| 39 | 
            +
                  alias nil? empty?
         | 
| 40 40 |  | 
| 41 41 | 
             
                  # Delegate include? to the records.
         | 
| 42 42 | 
             
                  def include?(object)
         | 
| @@ -86,8 +86,8 @@ module Dynamoid #:nodoc: | |
| 86 86 | 
             
                  #
         | 
| 87 87 | 
             
                  # @since 0.2.0
         | 
| 88 88 | 
             
                  def setter(object)
         | 
| 89 | 
            -
                    target.each {|o| delete(o)}
         | 
| 90 | 
            -
                    self <<  | 
| 89 | 
            +
                    target.each { |o| delete(o) }
         | 
| 90 | 
            +
                    self << object
         | 
| 91 91 | 
             
                    object
         | 
| 92 92 | 
             
                  end
         | 
| 93 93 |  | 
| @@ -152,7 +152,7 @@ module Dynamoid #:nodoc: | |
| 152 152 | 
             
                  def where(args)
         | 
| 153 153 | 
             
                    filtered = clone
         | 
| 154 154 | 
             
                    filtered.query = query.clone
         | 
| 155 | 
            -
                    args.each {|k, v| filtered.query[k] = v}
         | 
| 155 | 
            +
                    args.each { |k, v| filtered.query[k] = v }
         | 
| 156 156 | 
             
                    filtered
         | 
| 157 157 | 
             
                  end
         | 
| 158 158 |  | 
| @@ -200,7 +200,6 @@ module Dynamoid #:nodoc: | |
| 200 200 | 
             
                      end
         | 
| 201 201 | 
             
                    end
         | 
| 202 202 | 
             
                  end
         | 
| 203 | 
            -
             | 
| 204 203 | 
             
                end
         | 
| 205 204 | 
             
              end
         | 
| 206 205 | 
             
            end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 | 
            -
            #  | 
| 2 | 
            -
            module Dynamoid #:nodoc:
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 3 2 |  | 
| 3 | 
            +
            module Dynamoid #:nodoc:
         | 
| 4 4 | 
             
              module Associations
         | 
| 5 5 | 
             
                module SingleAssociation
         | 
| 6 6 | 
             
                  include Association
         | 
| @@ -68,7 +68,7 @@ module Dynamoid #:nodoc: | |
| 68 68 | 
             
                    source.update_attribute(source_attribute, Set[hash_key])
         | 
| 69 69 | 
             
                  end
         | 
| 70 70 |  | 
| 71 | 
            -
                  def disassociate( | 
| 71 | 
            +
                  def disassociate(_hash_key = nil)
         | 
| 72 72 | 
             
                    source.update_attribute(source_attribute, nil)
         | 
| 73 73 | 
             
                  end
         | 
| 74 74 |  | 
    
        data/lib/dynamoid/components.rb
    CHANGED
    
    
    
        data/lib/dynamoid/config.rb
    CHANGED
    
    | @@ -1,19 +1,21 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 2 3 | 
             
            require 'uri'
         | 
| 4 | 
            +
            require 'logger'
         | 
| 3 5 | 
             
            require 'dynamoid/config/options'
         | 
| 4 6 | 
             
            require 'dynamoid/config/backoff_strategies/constant_backoff'
         | 
| 5 7 | 
             
            require 'dynamoid/config/backoff_strategies/exponential_backoff'
         | 
| 6 8 |  | 
| 7 9 | 
             
            module Dynamoid
         | 
| 8 | 
            -
             | 
| 9 10 | 
             
              # Contains all the basic configuration information required for Dynamoid: both sensible defaults and required fields.
         | 
| 10 11 | 
             
              module Config
         | 
| 11 12 | 
             
                extend self
         | 
| 13 | 
            +
             | 
| 12 14 | 
             
                extend Options
         | 
| 13 15 | 
             
                include ActiveModel::Observing if defined?(ActiveModel::Observing)
         | 
| 14 16 |  | 
| 15 17 | 
             
                # All the default options.
         | 
| 16 | 
            -
                option :adapter, default: ' | 
| 18 | 
            +
                option :adapter, default: 'aws_sdk_v3'
         | 
| 17 19 | 
             
                option :namespace, default: defined?(Rails) ? "dynamoid_#{Rails.application.class.parent_name}_#{Rails.env}" : 'dynamoid'
         | 
| 18 20 | 
             
                option :access_key, default: nil
         | 
| 19 21 | 
             
                option :secret_key, default: nil
         | 
| @@ -29,9 +31,11 @@ module Dynamoid | |
| 29 31 | 
             
                option :sync_retry_wait_seconds, default: 2
         | 
| 30 32 | 
             
                option :convert_big_decimal, default: false
         | 
| 31 33 | 
             
                option :models_dir, default: './app/models' # perhaps you keep your dynamoid models in a different directory?
         | 
| 32 | 
            -
                option :application_timezone, default: : | 
| 34 | 
            +
                option :application_timezone, default: :utc # available values - :utc, :local, time zone name like "Hawaii"
         | 
| 35 | 
            +
                option :dynamodb_timezone, default: :utc # available values - :utc, :local, time zone name like "Hawaii"
         | 
| 33 36 | 
             
                option :store_datetime_as_string, default: false # store Time fields in ISO 8601 string format
         | 
| 34 37 | 
             
                option :store_date_as_string, default: false # store Date fields in ISO 8601 string format
         | 
| 38 | 
            +
                option :store_boolean_as_native, default: true
         | 
| 35 39 | 
             
                option :backoff, default: nil # callable object to handle exceeding of table throughput limit
         | 
| 36 40 | 
             
                option :backoff_strategies, default: {
         | 
| 37 41 | 
             
                  constant: BackoffStrategies::ConstantBackoff,
         | 
| @@ -57,7 +61,7 @@ module Dynamoid | |
| 57 61 | 
             
                # @since 0.2.0
         | 
| 58 62 | 
             
                def logger=(logger)
         | 
| 59 63 | 
             
                  case logger
         | 
| 60 | 
            -
                  when false, nil then @logger =  | 
| 64 | 
            +
                  when false, nil then @logger = Logger.new('/dev/null')
         | 
| 61 65 | 
             
                  when true then @logger = default_logger
         | 
| 62 66 | 
             
                  else
         | 
| 63 67 | 
             
                    @logger = logger if logger.respond_to?(:info)
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Dynamoid
         | 
| 2 4 | 
             
              module Config
         | 
| 3 5 | 
             
                module BackoffStrategies
         | 
| @@ -13,7 +15,7 @@ module Dynamoid | |
| 13 15 |  | 
| 14 16 | 
             
                      lambda do
         | 
| 15 17 | 
             
                        power = [times - 1, ceiling - 1].min
         | 
| 16 | 
            -
                        backoff = base_backoff * (2 | 
| 18 | 
            +
                        backoff = base_backoff * (2**power)
         | 
| 17 19 | 
             
                        sleep backoff
         | 
| 18 20 |  | 
| 19 21 | 
             
                        times += 1
         | 
| @@ -1,10 +1,10 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            # Shamelessly stolen from Mongoid!
         | 
| 2 | 
            -
            module Dynamoid | 
| 4 | 
            +
            module Dynamoid
         | 
| 3 5 | 
             
              module Config
         | 
| 4 | 
            -
             | 
| 5 6 | 
             
                # Encapsulates logic for setting options.
         | 
| 6 7 | 
             
                module Options
         | 
| 7 | 
            -
             | 
| 8 8 | 
             
                  # Get the defaults or initialize a new empty hash.
         | 
| 9 9 | 
             
                  #
         | 
| 10 10 | 
             
                  # @example Get the defaults.
         | 
| @@ -31,7 +31,7 @@ module Dynamoid #:nodoc | |
| 31 31 | 
             
                  def option(name, options = {})
         | 
| 32 32 | 
             
                    defaults[name] = settings[name] = options[:default]
         | 
| 33 33 |  | 
| 34 | 
            -
                    class_eval <<-RUBY
         | 
| 34 | 
            +
                    class_eval <<-RUBY, __FILE__, __LINE__ + 1
         | 
| 35 35 | 
             
                      def #{name}
         | 
| 36 36 | 
             
                        settings[#{name.inspect}]
         | 
| 37 37 | 
             
                      end
         | 
    
        data/lib/dynamoid/criteria.rb
    CHANGED
    
    | @@ -1,15 +1,14 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 2 3 | 
             
            require 'dynamoid/criteria/chain'
         | 
| 3 4 |  | 
| 4 5 | 
             
            module Dynamoid
         | 
| 5 | 
            -
             | 
| 6 6 | 
             
              # Allows classes to be queried by where, all, first, and each and return criteria chains.
         | 
| 7 7 | 
             
              module Criteria
         | 
| 8 8 | 
             
                extend ActiveSupport::Concern
         | 
| 9 9 |  | 
| 10 10 | 
             
                module ClassMethods
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                  [:where, :all, :first, :last, :each, :record_limit, :scan_limit, :batch, :start, :scan_index_forward].each do |meth|
         | 
| 11 | 
            +
                  %i[where all first last each record_limit scan_limit batch start scan_index_forward].each do |meth|
         | 
| 13 12 | 
             
                    # Return a criteria chain in response to a method that will begin or end a chain. For more information,
         | 
| 14 13 | 
             
                    # see Dynamoid::Criteria::Chain.
         | 
| 15 14 | 
             
                    #
         | 
| @@ -25,5 +24,4 @@ module Dynamoid | |
| 25 24 | 
             
                  end
         | 
| 26 25 | 
             
                end
         | 
| 27 26 | 
             
              end
         | 
| 28 | 
            -
             | 
| 29 27 | 
             
            end
         | 
| @@ -1,12 +1,10 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 2 3 | 
             
            module Dynamoid #:nodoc:
         | 
| 3 4 | 
             
              module Criteria
         | 
| 4 | 
            -
             | 
| 5 5 | 
             
                # The criteria chain is equivalent to an ActiveRecord relation (and realistically I should change the name from
         | 
| 6 6 | 
             
                # chain to relation). It is a chainable object that builds up a query and eventually executes it by a Query or Scan.
         | 
| 7 7 | 
             
                class Chain
         | 
| 8 | 
            -
                  # TODO: Should we transform any other types of query values?
         | 
| 9 | 
            -
                  TYPES_TO_DUMP_FOR_QUERY = [:string, :integer, :boolean, :serialized]
         | 
| 10 8 | 
             
                  attr_accessor :query, :source, :values, :consistent_read
         | 
| 11 9 | 
             
                  attr_reader :hash_key, :range_key, :index_name
         | 
| 12 10 | 
             
                  include Enumerable
         | 
| @@ -37,14 +35,7 @@ module Dynamoid #:nodoc: | |
| 37 35 | 
             
                  #
         | 
| 38 36 | 
             
                  # @since 0.2.0
         | 
| 39 37 | 
             
                  def where(args)
         | 
| 40 | 
            -
                    args. | 
| 41 | 
            -
                      sym = k.to_sym
         | 
| 42 | 
            -
                      query[sym] = if (field_options = source.attributes[sym]) && (type = field_options[:type]) && TYPES_TO_DUMP_FOR_QUERY.include?(type)
         | 
| 43 | 
            -
                                     source.dump_field(v, field_options)
         | 
| 44 | 
            -
                                   else
         | 
| 45 | 
            -
                                     v
         | 
| 46 | 
            -
                                   end
         | 
| 47 | 
            -
                    end
         | 
| 38 | 
            +
                    query.update(args.dup.symbolize_keys)
         | 
| 48 39 | 
             
                    self
         | 
| 49 40 | 
             
                  end
         | 
| 50 41 |  | 
| @@ -79,18 +70,16 @@ module Dynamoid #:nodoc: | |
| 79 70 | 
             
                        ids << hash[source.hash_key.to_sym]
         | 
| 80 71 | 
             
                        ranges << hash[source.range_key.to_sym] if source.range_key
         | 
| 81 72 | 
             
                      end
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                      Dynamoid.adapter.delete(source.table_name, ids, range_key: ranges.presence)
         | 
| 84 73 | 
             
                    else
         | 
| 85 74 | 
             
                      Dynamoid.adapter.scan(source.table_name, scan_query, scan_opts).collect do |hash|
         | 
| 86 75 | 
             
                        ids << hash[source.hash_key.to_sym]
         | 
| 87 76 | 
             
                        ranges << hash[source.range_key.to_sym] if source.range_key
         | 
| 88 77 | 
             
                      end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                      Dynamoid.adapter.delete(source.table_name, ids, range_key: ranges.presence)
         | 
| 91 78 | 
             
                    end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    Dynamoid.adapter.delete(source.table_name, ids, range_key: ranges.presence)
         | 
| 92 81 | 
             
                  end
         | 
| 93 | 
            -
                   | 
| 82 | 
            +
                  alias destroy_all delete_all
         | 
| 94 83 |  | 
| 95 84 | 
             
                  # The record limit is the limit of evaluated records returned by the
         | 
| 96 85 | 
             
                  # query or scan.
         | 
| @@ -159,12 +148,12 @@ module Dynamoid #:nodoc: | |
| 159 148 | 
             
                  #
         | 
| 160 149 | 
             
                  # @since 0.2.0
         | 
| 161 150 | 
             
                  def records_via_scan
         | 
| 162 | 
            -
                    if Dynamoid::Config.warn_on_scan
         | 
| 151 | 
            +
                    if Dynamoid::Config.warn_on_scan && query.present?
         | 
| 163 152 | 
             
                      Dynamoid.logger.warn 'Queries without an index are forced to use scan and are generally much slower than indexed queries!'
         | 
| 164 153 | 
             
                      Dynamoid.logger.warn "You can index this query by adding index declaration to #{source.to_s.downcase}.rb:"
         | 
| 165 154 | 
             
                      Dynamoid.logger.warn "* global_secondary_index hash_key: 'some-name', range_key: 'some-another-name'"
         | 
| 166 155 | 
             
                      Dynamoid.logger.warn "* local_secondary_indexe range_key: 'some-name'"
         | 
| 167 | 
            -
                      Dynamoid.logger.warn "Not indexed attributes: #{query.keys.sort.collect{|name| ":#{name}"}.join(', ')}"
         | 
| 156 | 
            +
                      Dynamoid.logger.warn "Not indexed attributes: #{query.keys.sort.collect { |name| ":#{name}" }.join(', ')}"
         | 
| 168 157 | 
             
                    end
         | 
| 169 158 |  | 
| 170 159 | 
             
                    Enumerator.new do |yielder|
         | 
| @@ -199,29 +188,29 @@ module Dynamoid #:nodoc: | |
| 199 188 | 
             
                    val = type_cast_condition_parameter(name, query[key])
         | 
| 200 189 |  | 
| 201 190 | 
             
                    hash = case operation
         | 
| 202 | 
            -
             | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
             | 
| 208 | 
            -
             | 
| 209 | 
            -
             | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 216 | 
            -
             | 
| 217 | 
            -
             | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
                     | 
| 191 | 
            +
                           when 'ne'
         | 
| 192 | 
            +
                             { ne: val }
         | 
| 193 | 
            +
                           when 'gt'
         | 
| 194 | 
            +
                             { gt: val }
         | 
| 195 | 
            +
                           when 'lt'
         | 
| 196 | 
            +
                             { lt: val }
         | 
| 197 | 
            +
                           when 'gte'
         | 
| 198 | 
            +
                             { gte: val }
         | 
| 199 | 
            +
                           when 'lte'
         | 
| 200 | 
            +
                             { lte: val }
         | 
| 201 | 
            +
                           when 'between'
         | 
| 202 | 
            +
                             { between: val }
         | 
| 203 | 
            +
                           when 'begins_with'
         | 
| 204 | 
            +
                             { begins_with: val }
         | 
| 205 | 
            +
                           when 'in'
         | 
| 206 | 
            +
                             { in: val }
         | 
| 207 | 
            +
                           when 'contains'
         | 
| 208 | 
            +
                             { contains: val }
         | 
| 209 | 
            +
                           when 'not_contains'
         | 
| 210 | 
            +
                             { not_contains: val }
         | 
| 211 | 
            +
                           end
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                    { name.to_sym => hash }
         | 
| 225 214 | 
             
                  end
         | 
| 226 215 |  | 
| 227 216 | 
             
                  def consistent_opts
         | 
| @@ -255,7 +244,7 @@ module Dynamoid #:nodoc: | |
| 255 244 | 
             
                        opts.update(field_hash(key))
         | 
| 256 245 | 
             
                      else
         | 
| 257 246 | 
             
                        value = type_cast_condition_parameter(key, query[key])
         | 
| 258 | 
            -
                        opts[key] = {eq: value}
         | 
| 247 | 
            +
                        opts[key] = { eq: value }
         | 
| 259 248 | 
             
                      end
         | 
| 260 249 | 
             
                    end
         | 
| 261 250 |  | 
| @@ -263,12 +252,18 @@ module Dynamoid #:nodoc: | |
| 263 252 | 
             
                  end
         | 
| 264 253 |  | 
| 265 254 | 
             
                  def type_cast_condition_parameter(key, value)
         | 
| 266 | 
            -
                    return value if [ | 
| 255 | 
            +
                    return value if %i[array set].include?(source.attributes[key.to_sym][:type])
         | 
| 267 256 |  | 
| 268 257 | 
             
                    if !value.respond_to?(:to_ary)
         | 
| 269 | 
            -
                       | 
| 258 | 
            +
                      options = source.attributes[key.to_sym]
         | 
| 259 | 
            +
                      value_casted = TypeCasting.cast_field(value, options)
         | 
| 260 | 
            +
                      Dumping.dump_field(value_casted, options)
         | 
| 270 261 | 
             
                    else
         | 
| 271 | 
            -
                      value.to_ary.map  | 
| 262 | 
            +
                      value.to_ary.map do |el|
         | 
| 263 | 
            +
                        options = source.attributes[key.to_sym]
         | 
| 264 | 
            +
                        value_casted = TypeCasting.cast_field(el, options)
         | 
| 265 | 
            +
                        Dumping.dump_field(value_casted, options)
         | 
| 266 | 
            +
                      end
         | 
| 272 267 | 
             
                    end
         | 
| 273 268 | 
             
                  end
         | 
| 274 269 |  | 
| @@ -354,7 +349,7 @@ module Dynamoid #:nodoc: | |
| 354 349 | 
             
                          opts.update(field_hash(key))
         | 
| 355 350 | 
             
                        else
         | 
| 356 351 | 
             
                          value = type_cast_condition_parameter(key, query[key])
         | 
| 357 | 
            -
                          opts[key] = {eq: value}
         | 
| 352 | 
            +
                          opts[key] = { eq: value }
         | 
| 358 353 | 
             
                        end
         | 
| 359 354 | 
             
                      end
         | 
| 360 355 | 
             
                    end
         | 
| @@ -370,7 +365,5 @@ module Dynamoid #:nodoc: | |
| 370 365 | 
             
                    opts
         | 
| 371 366 | 
             
                  end
         | 
| 372 367 | 
             
                end
         | 
| 373 | 
            -
             | 
| 374 368 | 
             
              end
         | 
| 375 | 
            -
             | 
| 376 369 | 
             
            end
         |