activerecord-typedstore 0.4.3 → 0.4.4
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/gemfiles/Gemfile.ar-4.0 +0 -1
- data/gemfiles/Gemfile.ar-4.1 +0 -1
- data/lib/active_record/typed_store/dsl.rb +1 -1
- data/lib/active_record/typed_store/extension.rb +9 -1
- data/lib/active_record/typed_store/version.rb +1 -1
- data/spec/active_record/typed_store_spec.rb +68 -32
- data/spec/spec_helper.rb +0 -3
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 805a07504ab5ed0b6a41983d945f5a0bdd649726
         | 
| 4 | 
            +
              data.tar.gz: c09ffc9348aa4256c439645b7d36edb0b3951705
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2c033c463261169f42b5ab7e1a4c0dade01d101c1f084695124b5e018131bbce84a389b34bfc9aedeec224383def213cd6cf4c78b609d820cffbf8fd1cdaf695
         | 
| 7 | 
            +
              data.tar.gz: 6ed412a72266d529d32401c6ef99a7bfc85fd5d38cf7716f8e44035cc1b1250099b67e3aa9e153a5eab1e97e4a2669fa1f7596fa2fb271aa1404274fabf94020
         | 
    
        data/gemfiles/Gemfile.ar-4.0
    CHANGED
    
    
    
        data/gemfiles/Gemfile.ar-4.1
    CHANGED
    
    
| @@ -14,7 +14,7 @@ module ActiveRecord::TypedStore | |
| 14 14 | 
             
                  @columns.select(&:accessor?).map(&:name)
         | 
| 15 15 | 
             
                end
         | 
| 16 16 |  | 
| 17 | 
            -
                [:string, :integer, :float, :decimal, :datetime, :date, :boolean, :any].each do |type|
         | 
| 17 | 
            +
                [:string, :text, :integer, :float, :decimal, :datetime, :date, :boolean, :any].each do |type|
         | 
| 18 18 | 
             
                  define_method(type) do |name, options={}|
         | 
| 19 19 | 
             
                    @columns << Column.new(name, type, options.reverse_merge(accessor: @accessors))
         | 
| 20 20 | 
             
                  end
         | 
| @@ -61,10 +61,17 @@ module ActiveRecord::TypedStore | |
| 61 61 | 
             
                    return if @typed_store_attribute_methods_generated
         | 
| 62 62 | 
             
                    store_accessors.each do |attribute|
         | 
| 63 63 | 
             
                      define_virtual_attribute_method(attribute)
         | 
| 64 | 
            +
                      undefine_before_type_cast_method(attribute)
         | 
| 64 65 | 
             
                    end
         | 
| 65 66 | 
             
                    @typed_store_attribute_methods_generated = true
         | 
| 66 67 | 
             
                  end
         | 
| 67 68 |  | 
| 69 | 
            +
                  def undefine_before_type_cast_method(attribute)
         | 
| 70 | 
            +
                    # because it mess with ActionView forms, see #14.
         | 
| 71 | 
            +
                    method = "#{attribute}_before_type_cast"
         | 
| 72 | 
            +
                    undef_method(method) if method_defined?(method)
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
             | 
| 68 75 | 
             
                  def store_accessors
         | 
| 69 76 | 
             
                    return [] unless typed_store_attributes
         | 
| 70 77 | 
             
                    typed_store_attributes.values.select(&:accessor?).map(&:name).map(&:to_s)
         | 
| @@ -92,7 +99,8 @@ module ActiveRecord::TypedStore | |
| 92 99 | 
             
                  end
         | 
| 93 100 |  | 
| 94 101 | 
             
                  previous_value = read_store_attribute(store_attribute, key)
         | 
| 95 | 
            -
                   | 
| 102 | 
            +
                  new_value = column ? column.type_cast(value) : value
         | 
| 103 | 
            +
                  attribute_will_change!(key.to_s) if new_value != previous_value
         | 
| 96 104 | 
             
                  super
         | 
| 97 105 | 
             
                end
         | 
| 98 106 |  | 
| @@ -27,7 +27,7 @@ shared_examples 'any model' do | |
| 27 27 |  | 
| 28 28 | 
             
                it 'assign attributes received by #initialize' do
         | 
| 29 29 | 
             
                  model = described_class.new(public: true)
         | 
| 30 | 
            -
                  expect(model.public).to  | 
| 30 | 
            +
                  expect(model.public).to be true
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| 33 33 | 
             
              end
         | 
| @@ -65,6 +65,38 @@ shared_examples 'any model' do | |
| 65 65 | 
             
                  }.to change { model.age }.from(24).to(12)
         | 
| 66 66 | 
             
                end
         | 
| 67 67 |  | 
| 68 | 
            +
                it 'does not dirty track assigning the same boolean' do
         | 
| 69 | 
            +
                  expect(model.enabled).to be true
         | 
| 70 | 
            +
                  expect {
         | 
| 71 | 
            +
                    model.enabled = true
         | 
| 72 | 
            +
                  }.to_not change { model.enabled_changed? }
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                it 'dirty tracks when the boolean changes' do
         | 
| 76 | 
            +
                  expect(model.enabled).to be true
         | 
| 77 | 
            +
                  expect {
         | 
| 78 | 
            +
                    model.enabled = false
         | 
| 79 | 
            +
                  }.to change { model.enabled_changed? }.from(false).to(true)
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                it 'does not dirty track assigning the same boolean even if it is a string' do
         | 
| 83 | 
            +
                  expect(model.enabled).to be true
         | 
| 84 | 
            +
                  expect {
         | 
| 85 | 
            +
                    model.enabled = "true"
         | 
| 86 | 
            +
                  }.to_not change { model.enabled_changed? }
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                it 'dirty tracks when the string changes' do
         | 
| 90 | 
            +
                  expect {
         | 
| 91 | 
            +
                    model.name = "Smith"
         | 
| 92 | 
            +
                  }.to change { model.name_changed? }.from(false).to(true)
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                it 'does not dirty track assigning the same string' do
         | 
| 96 | 
            +
                  expect {
         | 
| 97 | 
            +
                    model.name = ""
         | 
| 98 | 
            +
                  }.to_not change { model.name_changed? }
         | 
| 99 | 
            +
                end
         | 
| 68 100 | 
             
              end
         | 
| 69 101 |  | 
| 70 102 | 
             
              describe 'unknown attribute' do
         | 
| @@ -108,15 +140,15 @@ shared_examples 'any model' do | |
| 108 140 |  | 
| 109 141 | 
             
                it 'any string is considered present' do
         | 
| 110 142 | 
             
                  model.name = 'Peter Gibbons'
         | 
| 111 | 
            -
                  expect(model.name?).to  | 
| 143 | 
            +
                  expect(model.name?).to be true
         | 
| 112 144 | 
             
                end
         | 
| 113 145 |  | 
| 114 146 | 
             
                it 'empty string is not considered present' do
         | 
| 115 | 
            -
                  expect(model.name?).to  | 
| 147 | 
            +
                  expect(model.name?).to be false
         | 
| 116 148 | 
             
                end
         | 
| 117 149 |  | 
| 118 150 | 
             
                it 'nil is not considered present' do
         | 
| 119 | 
            -
                  expect(model.cell_phone?).to  | 
| 151 | 
            +
                  expect(model.cell_phone?).to be false
         | 
| 120 152 | 
             
                end
         | 
| 121 153 |  | 
| 122 154 | 
             
                it 'not define the attributes more than one time' do
         | 
| @@ -129,14 +161,14 @@ shared_examples 'any model' do | |
| 129 161 | 
             
              describe 'boolean attribute' do
         | 
| 130 162 |  | 
| 131 163 | 
             
                it 'has the defined :default as initial value' do
         | 
| 132 | 
            -
                  expect(model.public).to  | 
| 164 | 
            +
                  expect(model.public).to be false
         | 
| 133 165 | 
             
                end
         | 
| 134 166 |  | 
| 135 167 | 
             
                [true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].each do |value|
         | 
| 136 168 |  | 
| 137 169 | 
             
                  it "cast `#{value.inspect}` as `true`" do
         | 
| 138 170 | 
             
                    model.public = value
         | 
| 139 | 
            -
                    expect(model.public).to  | 
| 171 | 
            +
                    expect(model.public).to be true
         | 
| 140 172 | 
             
                  end
         | 
| 141 173 |  | 
| 142 174 | 
             
                end
         | 
| @@ -145,22 +177,22 @@ shared_examples 'any model' do | |
| 145 177 |  | 
| 146 178 | 
             
                  it "cast `#{value.inspect}` as `false`" do
         | 
| 147 179 | 
             
                    model.public = value
         | 
| 148 | 
            -
                    expect(model.public).to  | 
| 180 | 
            +
                    expect(model.public).to be false
         | 
| 149 181 | 
             
                  end
         | 
| 150 182 |  | 
| 151 183 | 
             
                end
         | 
| 152 184 |  | 
| 153 185 | 
             
                it 'properly persit the value' do
         | 
| 154 186 | 
             
                  model.update_attributes(public: false)
         | 
| 155 | 
            -
                  expect(model.reload.public).to  | 
| 187 | 
            +
                  expect(model.reload.public).to be false
         | 
| 156 188 | 
             
                  model.update_attributes(public: true)
         | 
| 157 | 
            -
                  expect(model.reload.public).to  | 
| 189 | 
            +
                  expect(model.reload.public).to be true
         | 
| 158 190 | 
             
                end
         | 
| 159 191 |  | 
| 160 192 | 
             
                it 'initialize with default value if the column is not nullable' do
         | 
| 161 | 
            -
                  expect(model.public).to  | 
| 193 | 
            +
                  expect(model.public).to be false
         | 
| 162 194 | 
             
                  model.save
         | 
| 163 | 
            -
                  expect(model.reload.public).to  | 
| 195 | 
            +
                  expect(model.reload.public).to be false
         | 
| 164 196 | 
             
                end
         | 
| 165 197 |  | 
| 166 198 | 
             
                it 'can store nil if the column is nullable' do
         | 
| @@ -170,20 +202,20 @@ shared_examples 'any model' do | |
| 170 202 |  | 
| 171 203 | 
             
                it 'save the default value if the column is nullable but the value not explictly set' do
         | 
| 172 204 | 
             
                  model.save
         | 
| 173 | 
            -
                  expect(model.reload.enabled).to  | 
| 205 | 
            +
                  expect(model.reload.enabled).to be true
         | 
| 174 206 | 
             
                end
         | 
| 175 207 |  | 
| 176 208 | 
             
                it 'true is considered present' do
         | 
| 177 | 
            -
                  expect(model.enabled?).to  | 
| 209 | 
            +
                  expect(model.enabled?).to be true
         | 
| 178 210 | 
             
                end
         | 
| 179 211 |  | 
| 180 212 | 
             
                it 'false is not considered present' do
         | 
| 181 | 
            -
                  expect(model.public?).to  | 
| 213 | 
            +
                  expect(model.public?).to be false
         | 
| 182 214 | 
             
                end
         | 
| 183 215 |  | 
| 184 216 | 
             
                it 'nil is not considered present' do
         | 
| 185 217 | 
             
                  model.update_attributes(enabled: nil)
         | 
| 186 | 
            -
                  expect(model.enabled?).to  | 
| 218 | 
            +
                  expect(model.enabled?).to be false
         | 
| 187 219 | 
             
                end
         | 
| 188 220 |  | 
| 189 221 | 
             
              end
         | 
| @@ -210,22 +242,22 @@ shared_examples 'any model' do | |
| 210 242 | 
             
                end
         | 
| 211 243 |  | 
| 212 244 | 
             
                it 'positive values are considered present' do
         | 
| 213 | 
            -
                  expect(model.age?).to  | 
| 245 | 
            +
                  expect(model.age?).to be true
         | 
| 214 246 | 
             
                end
         | 
| 215 247 |  | 
| 216 248 | 
             
                it 'negative values are considered present' do
         | 
| 217 249 | 
             
                  model.age = -42
         | 
| 218 | 
            -
                  expect(model.age?).to  | 
| 250 | 
            +
                  expect(model.age?).to be true
         | 
| 219 251 | 
             
                end
         | 
| 220 252 |  | 
| 221 253 | 
             
                it '0 is not considered present' do
         | 
| 222 254 | 
             
                  model.age = 0
         | 
| 223 | 
            -
                  expect(model.age?).to  | 
| 255 | 
            +
                  expect(model.age?).to be false
         | 
| 224 256 | 
             
                end
         | 
| 225 257 |  | 
| 226 258 | 
             
                it 'nil is not considered present' do
         | 
| 227 259 | 
             
                  model.max_length = nil
         | 
| 228 | 
            -
                  expect(model.max_length?).to  | 
| 260 | 
            +
                  expect(model.max_length?).to be false
         | 
| 229 261 | 
             
                end
         | 
| 230 262 |  | 
| 231 263 | 
             
              end
         | 
| @@ -253,20 +285,20 @@ shared_examples 'any model' do | |
| 253 285 |  | 
| 254 286 | 
             
                it 'positive values are considered present' do
         | 
| 255 287 | 
             
                  model.rate = 4.2
         | 
| 256 | 
            -
                  expect(model.rate?).to  | 
| 288 | 
            +
                  expect(model.rate?).to be true
         | 
| 257 289 | 
             
                end
         | 
| 258 290 |  | 
| 259 291 | 
             
                it 'negative values are considered present' do
         | 
| 260 292 | 
             
                  model.rate = -4.2
         | 
| 261 | 
            -
                  expect(model.rate?).to  | 
| 293 | 
            +
                  expect(model.rate?).to be true
         | 
| 262 294 | 
             
                end
         | 
| 263 295 |  | 
| 264 296 | 
             
                it '0 is not considered present' do
         | 
| 265 | 
            -
                  expect(model.rate?).to  | 
| 297 | 
            +
                  expect(model.rate?).to be false
         | 
| 266 298 | 
             
                end
         | 
| 267 299 |  | 
| 268 300 | 
             
                it 'nil is not considered present' do
         | 
| 269 | 
            -
                  expect(model.price?).to  | 
| 301 | 
            +
                  expect(model.price?).to be false
         | 
| 270 302 | 
             
                end
         | 
| 271 303 |  | 
| 272 304 | 
             
              end
         | 
| @@ -303,21 +335,21 @@ shared_examples 'any model' do | |
| 303 335 |  | 
| 304 336 | 
             
                it 'positive values are considered present' do
         | 
| 305 337 | 
             
                  model.shipping_cost = BigDecimal.new('4.2')
         | 
| 306 | 
            -
                  expect(model.shipping_cost?).to  | 
| 338 | 
            +
                  expect(model.shipping_cost?).to be true
         | 
| 307 339 | 
             
                end
         | 
| 308 340 |  | 
| 309 341 | 
             
                it 'negative values are considered present' do
         | 
| 310 342 | 
             
                  model.shipping_cost = BigDecimal.new('-4.2')
         | 
| 311 | 
            -
                  expect(model.shipping_cost?).to  | 
| 343 | 
            +
                  expect(model.shipping_cost?).to be true
         | 
| 312 344 | 
             
                end
         | 
| 313 345 |  | 
| 314 346 | 
             
                it '0 is not considered present' do
         | 
| 315 347 | 
             
                  model.shipping_cost = BigDecimal.new('0')
         | 
| 316 | 
            -
                  expect(model.shipping_cost?).to  | 
| 348 | 
            +
                  expect(model.shipping_cost?).to be false
         | 
| 317 349 | 
             
                end
         | 
| 318 350 |  | 
| 319 351 | 
             
                it 'nil is not considered present' do
         | 
| 320 | 
            -
                  expect(model.shipping_cost?).to  | 
| 352 | 
            +
                  expect(model.shipping_cost?).to be false
         | 
| 321 353 | 
             
                end
         | 
| 322 354 |  | 
| 323 355 | 
             
              end
         | 
| @@ -352,11 +384,11 @@ shared_examples 'any model' do | |
| 352 384 |  | 
| 353 385 | 
             
                it 'any non-nil value is considered present' do
         | 
| 354 386 | 
             
                  model.remind_on = Date.new
         | 
| 355 | 
            -
                  expect(model.remind_on?).to  | 
| 387 | 
            +
                  expect(model.remind_on?).to be true
         | 
| 356 388 | 
             
                end
         | 
| 357 389 |  | 
| 358 390 | 
             
                it 'nil is not considered present' do
         | 
| 359 | 
            -
                  expect(model.remind_on?).to  | 
| 391 | 
            +
                  expect(model.remind_on?).to be false
         | 
| 360 392 | 
             
                end
         | 
| 361 393 |  | 
| 362 394 | 
             
              end
         | 
| @@ -437,11 +469,11 @@ shared_examples 'any model' do | |
| 437 469 |  | 
| 438 470 | 
             
                it 'any non-nil value is considered present' do
         | 
| 439 471 | 
             
                  model.remind_at = DateTime.new
         | 
| 440 | 
            -
                  expect(model.remind_at?).to  | 
| 472 | 
            +
                  expect(model.remind_at?).to be true
         | 
| 441 473 | 
             
                end
         | 
| 442 474 |  | 
| 443 475 | 
             
                it 'nil is not considered present' do
         | 
| 444 | 
            -
                  expect(model.remind_at?).to  | 
| 476 | 
            +
                  expect(model.remind_at?).to be false
         | 
| 445 477 | 
             
                end
         | 
| 446 478 |  | 
| 447 479 | 
             
              end
         | 
| @@ -489,6 +521,10 @@ shared_examples 'a store' do |retain_type=true| | |
| 489 521 |  | 
| 490 522 | 
             
                end
         | 
| 491 523 |  | 
| 524 | 
            +
                it 'do not respond to <attribute>_before_type_cast' do
         | 
| 525 | 
            +
                  expect(model).to_not respond_to :nickname_before_type_cast
         | 
| 526 | 
            +
                end
         | 
| 527 | 
            +
             | 
| 492 528 | 
             
              end
         | 
| 493 529 |  | 
| 494 530 | 
             
              describe 'attributes without accessors' do
         | 
| @@ -538,7 +574,7 @@ shared_examples 'a store' do |retain_type=true| | |
| 538 574 | 
             
                  begin
         | 
| 539 575 | 
             
                    model.class::SettingsHash.columns['brand_new'] = new_column
         | 
| 540 576 | 
             
                    model.reload
         | 
| 541 | 
            -
                    expect(model.settings[:brand_new]).to  | 
| 577 | 
            +
                    expect(model.settings[:brand_new]).to be true
         | 
| 542 578 | 
             
                  ensure
         | 
| 543 579 | 
             
                    model.class::SettingsHash.columns.delete('brand_new')
         | 
| 544 580 | 
             
                  end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -16,8 +16,5 @@ require 'activerecord-typedstore' | |
| 16 16 | 
             
            Dir[File.expand_path(File.join(File.dirname(__FILE__), 'support', '**', '*.rb'))].each { |f| require f }
         | 
| 17 17 |  | 
| 18 18 | 
             
            RSpec.configure do |config|
         | 
| 19 | 
            -
              config.treat_symbols_as_metadata_keys_with_true_values = true
         | 
| 20 | 
            -
              config.run_all_when_everything_filtered = true
         | 
| 21 | 
            -
              config.filter_run :focus
         | 
| 22 19 | 
             
              config.order = 'random'
         | 
| 23 20 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: activerecord-typedstore
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.4. | 
| 4 | 
            +
              version: 0.4.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jean Boussier
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014- | 
| 11 | 
            +
            date: 2014-06-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activerecord
         | 
| @@ -189,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 189 189 | 
             
                  version: '0'
         | 
| 190 190 | 
             
            requirements: []
         | 
| 191 191 | 
             
            rubyforge_project: 
         | 
| 192 | 
            -
            rubygems_version: 2.2. | 
| 192 | 
            +
            rubygems_version: 2.2.2
         | 
| 193 193 | 
             
            signing_key: 
         | 
| 194 194 | 
             
            specification_version: 4
         | 
| 195 195 | 
             
            summary: ActiveRecord::Store but with type definition
         |