hstore_accessor 0.4.0 → 0.4.1
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/README.md +13 -0
- data/hstore_accessor.gemspec +1 -1
- data/lib/hstore_accessor.rb +9 -3
- data/lib/hstore_accessor/version.rb +1 -1
- data/spec/hstore_accessor_spec.rb +33 -5
- metadata +5 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 762278330d698c66a6d2926e1595c539da4fbaf7
         | 
| 4 | 
            +
              data.tar.gz: e4f38f9cb7e9b43384f2880a5b46860b63c3e0d9
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 29530074370a555d44d91a2b60a5b7621935f4f062585e9c329a6ba508e762564f7548d2d6220a247b5c83779a6684545cc39668b48a0d44d905c5575ccce786
         | 
| 7 | 
            +
              data.tar.gz: 7c9227822c95e61b23b900aebd2f93f76ba3302e095e202fd0e50376a2f229278b9bc603d5b0136211a5058b0e9a9ea9a82ed09d6d4384b5bf45713ad04404d2
         | 
    
        data/README.md
    CHANGED
    
    | @@ -63,6 +63,19 @@ p.color #=> "green" | |
| 63 63 | 
             
            p.tags #=> ["housewares", "kitchen"] 
         | 
| 64 64 | 
             
            ```
         | 
| 65 65 |  | 
| 66 | 
            +
            In order to reduce the storage overhead of hstore keys (especially when
         | 
| 67 | 
            +
            indexed) you can specify an alternate key.
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            ```ruby
         | 
| 70 | 
            +
            hstore_accessor :options,
         | 
| 71 | 
            +
              color: { data_type: :string, store_key: "c" },
         | 
| 72 | 
            +
              weight: { data_type: :integer, store_key: "w" }
         | 
| 73 | 
            +
            ```
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            In the above example you can continue to interact with the fields using
         | 
| 76 | 
            +
            their full name but when saved to the database the field will be set
         | 
| 77 | 
            +
            using the `store_key`.
         | 
| 78 | 
            +
             | 
| 66 79 | 
             
            ### Scopes
         | 
| 67 80 |  | 
| 68 81 | 
             
            The `hstore_accessor` macro also creates scopes for `string`, `integer`,
         | 
    
        data/hstore_accessor.gemspec
    CHANGED
    
    | @@ -21,7 +21,7 @@ Gem::Specification.new do |spec| | |
| 21 21 | 
             
              spec.add_dependency "pg", ">= 0.14.1"
         | 
| 22 22 | 
             
              spec.add_dependency "activesupport", ">= 3.2.0"
         | 
| 23 23 |  | 
| 24 | 
            -
              spec.add_development_dependency "activerecord", ">= 4.0.0 | 
| 24 | 
            +
              spec.add_development_dependency "activerecord", ">= 4.0.0"
         | 
| 25 25 | 
             
              spec.add_development_dependency "bundler", "~> 1.3"
         | 
| 26 26 | 
             
              spec.add_development_dependency "rake"
         | 
| 27 27 | 
             
              spec.add_development_dependency "rspec"
         | 
    
        data/lib/hstore_accessor.rb
    CHANGED
    
    | @@ -7,7 +7,7 @@ module HstoreAccessor | |
| 7 7 |  | 
| 8 8 | 
             
              InvalidDataTypeError = Class.new(StandardError)
         | 
| 9 9 |  | 
| 10 | 
            -
              VALID_TYPES = [:string, :integer, :float, :time, :boolean, :array, :hash]
         | 
| 10 | 
            +
              VALID_TYPES = [:string, :integer, :float, :time, :boolean, :array, :hash, :date]
         | 
| 11 11 |  | 
| 12 12 | 
             
              SEPARATOR = "||;||"
         | 
| 13 13 |  | 
| @@ -18,7 +18,8 @@ module HstoreAccessor | |
| 18 18 | 
             
                :array    => -> value { (value && value.join(SEPARATOR)) || nil },
         | 
| 19 19 | 
             
                :hash     => -> value { (value && value.to_json) || nil },
         | 
| 20 20 | 
             
                :time     => -> value { value.to_i },
         | 
| 21 | 
            -
                :boolean  => -> value { (value == true).to_s }
         | 
| 21 | 
            +
                :boolean  => -> value { (value == true).to_s },
         | 
| 22 | 
            +
                :date     => -> value { (value && value.to_s) || nil }
         | 
| 22 23 | 
             
              }
         | 
| 23 24 |  | 
| 24 25 | 
             
              DESERIALIZERS = {
         | 
| @@ -27,7 +28,8 @@ module HstoreAccessor | |
| 27 28 | 
             
                :integer  => -> value { value.to_i },
         | 
| 28 29 | 
             
                :float    => -> value { value.to_f },
         | 
| 29 30 | 
             
                :time     => -> value { Time.at(value.to_i) },
         | 
| 30 | 
            -
                :boolean  => -> value { value == "true" }
         | 
| 31 | 
            +
                :boolean  => -> value { value == "true" },
         | 
| 32 | 
            +
                :date     => -> value { (value && Date.parse(value)) || nil }
         | 
| 31 33 | 
             
              }
         | 
| 32 34 |  | 
| 33 35 | 
             
              def serialize(type, value, serializer=nil)
         | 
| @@ -82,6 +84,10 @@ module HstoreAccessor | |
| 82 84 | 
             
                      send(:scope, "#{key}_before", -> value { where("(#{query_field})::integer < ?", value.to_i) })
         | 
| 83 85 | 
             
                      send(:scope, "#{key}_eq",     -> value { where("(#{query_field})::integer = ?", value.to_i) })
         | 
| 84 86 | 
             
                      send(:scope, "#{key}_after",  -> value { where("(#{query_field})::integer > ?", value.to_i) })
         | 
| 87 | 
            +
                    when :date
         | 
| 88 | 
            +
                      send(:scope, "#{key}_before", -> value { where("#{query_field} < ?", value.to_s) })
         | 
| 89 | 
            +
                      send(:scope, "#{key}_eq",     -> value { where("#{query_field} = ?", value.to_s) })
         | 
| 90 | 
            +
                      send(:scope, "#{key}_after",  -> value { where("#{query_field} > ?", value.to_s) })
         | 
| 85 91 | 
             
                    when :boolean
         | 
| 86 92 | 
             
                      send(:scope, "is_#{key}", -> { where("#{query_field} = 'true'") })
         | 
| 87 93 | 
             
                      send(:scope, "not_#{key}", -> { where("#{query_field} = 'false'") })
         | 
| @@ -8,7 +8,8 @@ FIELDS = { | |
| 8 8 | 
             
              popular: :boolean,
         | 
| 9 9 | 
             
              build_timestamp: :time,
         | 
| 10 10 | 
             
              tags: :array,
         | 
| 11 | 
            -
              reviews: :hash
         | 
| 11 | 
            +
              reviews: :hash,
         | 
| 12 | 
            +
              released_at: :date
         | 
| 12 13 | 
             
            }
         | 
| 13 14 |  | 
| 14 15 | 
             
            class Product < ActiveRecord::Base
         | 
| @@ -54,8 +55,9 @@ describe HstoreAccessor do | |
| 54 55 |  | 
| 55 56 | 
             
              context "nil values" do
         | 
| 56 57 | 
             
                let!(:timestamp) { Time.now }
         | 
| 58 | 
            +
                let!(:datestamp) { Date.today }
         | 
| 57 59 | 
             
                let!(:product)   { Product.new }
         | 
| 58 | 
            -
                let!(:product_a) { Product.create(color: "green",  price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true,  build_timestamp: (timestamp - 10.days)) }
         | 
| 60 | 
            +
                let!(:product_a) { Product.create(color: "green",  price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true,  build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days)) }
         | 
| 59 61 |  | 
| 60 62 | 
             
                FIELDS.keys.each do |field|
         | 
| 61 63 | 
             
                  it "reponds with nil when #{field} is not set" do
         | 
| @@ -74,9 +76,10 @@ describe HstoreAccessor do | |
| 74 76 | 
             
              describe "scopes" do
         | 
| 75 77 |  | 
| 76 78 | 
             
                let!(:timestamp) { Time.now }
         | 
| 77 | 
            -
                let!(: | 
| 78 | 
            -
                let!(: | 
| 79 | 
            -
                let!(: | 
| 79 | 
            +
                let!(:datestamp) { Date.today }
         | 
| 80 | 
            +
                let!(:product_a) { Product.create(color: "green",  price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true,  build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days)) }
         | 
| 81 | 
            +
                let!(:product_b) { Product.create(color: "orange", price: 20, weight: 20.2, tags: ["tag2", "tag3", "tag4"], popular: false, build_timestamp: (timestamp - 5.days), released_at: (datestamp - 4.days)) }
         | 
| 82 | 
            +
                let!(:product_c) { Product.create(color: "blue",   price: 30, weight: 30.3, tags: ["tag3", "tag4", "tag5"], popular: true,  build_timestamp: timestamp, released_at: datestamp) }
         | 
| 80 83 |  | 
| 81 84 | 
             
                context "for string fields support" do
         | 
| 82 85 |  | 
| @@ -163,6 +166,22 @@ describe HstoreAccessor do | |
| 163 166 |  | 
| 164 167 | 
             
                end
         | 
| 165 168 |  | 
| 169 | 
            +
                context "for date fields support" do
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  it "before" do
         | 
| 172 | 
            +
                    expect(Product.released_at_before(datestamp)).to eq [product_a, product_b]
         | 
| 173 | 
            +
                  end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                  it "equality" do
         | 
| 176 | 
            +
                    expect(Product.released_at_eq(datestamp)).to eq [product_c]
         | 
| 177 | 
            +
                  end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                  it "after" do
         | 
| 180 | 
            +
                    expect(Product.released_at_after(datestamp - 6.days)).to eq [product_b, product_c]
         | 
| 181 | 
            +
                  end
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                end
         | 
| 184 | 
            +
             | 
| 166 185 | 
             
                context "for boolean field support" do
         | 
| 167 186 |  | 
| 168 187 | 
             
                  it "true" do
         | 
| @@ -242,6 +261,15 @@ describe HstoreAccessor do | |
| 242 261 | 
             
                  expect(product.build_timestamp.to_i).to eq timestamp.to_i
         | 
| 243 262 | 
             
                end
         | 
| 244 263 |  | 
| 264 | 
            +
                it "correctly stores date values" do
         | 
| 265 | 
            +
                  datestamp = Date.today - 9.days
         | 
| 266 | 
            +
                  product.released_at = datestamp
         | 
| 267 | 
            +
                  product.save
         | 
| 268 | 
            +
                  product.reload
         | 
| 269 | 
            +
                  expect(product.released_at.to_s).to eq datestamp.to_s
         | 
| 270 | 
            +
                  expect(product.released_at).to eq datestamp
         | 
| 271 | 
            +
                end
         | 
| 272 | 
            +
             | 
| 245 273 | 
             
                it "setters call the _will_change! method of the store attribute" do
         | 
| 246 274 | 
             
                  product.should_receive(:options_will_change!)
         | 
| 247 275 | 
             
                  product.color = "green"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hstore_accessor
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.4. | 
| 4 | 
            +
              version: 0.4.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Joe Hirn
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2013- | 
| 13 | 
            +
            date: 2013-09-30 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: pg
         | 
| @@ -46,14 +46,14 @@ dependencies: | |
| 46 46 | 
             
                requirements:
         | 
| 47 47 | 
             
                - - '>='
         | 
| 48 48 | 
             
                  - !ruby/object:Gem::Version
         | 
| 49 | 
            -
                    version: 4.0.0 | 
| 49 | 
            +
                    version: 4.0.0
         | 
| 50 50 | 
             
              type: :development
         | 
| 51 51 | 
             
              prerelease: false
         | 
| 52 52 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 53 53 | 
             
                requirements:
         | 
| 54 54 | 
             
                - - '>='
         | 
| 55 55 | 
             
                  - !ruby/object:Gem::Version
         | 
| 56 | 
            -
                    version: 4.0.0 | 
| 56 | 
            +
                    version: 4.0.0
         | 
| 57 57 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 58 58 | 
             
              name: bundler
         | 
| 59 59 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 149 149 | 
             
                  version: '0'
         | 
| 150 150 | 
             
            requirements: []
         | 
| 151 151 | 
             
            rubyforge_project: 
         | 
| 152 | 
            -
            rubygems_version: 2.0. | 
| 152 | 
            +
            rubygems_version: 2.0.3
         | 
| 153 153 | 
             
            signing_key: 
         | 
| 154 154 | 
             
            specification_version: 4
         | 
| 155 155 | 
             
            summary: Adds typed hstore backed fields to an ActiveRecord model.
         |