hydra_attribute 0.4.0.rc1 → 0.4.0.rc2
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.
- data/README.md +65 -35
- data/features/entity/create.feature +17 -0
- data/features/relation/query_methods/where.feature +46 -1
- data/features/step_definitions/model_steps.rb +13 -0
- data/gemfiles/3.1.gemfile.lock +13 -13
- data/gemfiles/3.2.gemfile.lock +13 -13
- data/lib/hydra_attribute/active_record/attribute_methods.rb +4 -5
- data/lib/hydra_attribute/active_record/relation/query_methods.rb +7 -1
- data/lib/hydra_attribute/builder.rb +3 -3
- data/lib/hydra_attribute/hydra_attribute.rb +4 -4
- data/lib/hydra_attribute/hydra_attribute_methods.rb +146 -5
- data/lib/hydra_attribute/hydra_methods.rb +420 -15
- data/lib/hydra_attribute/hydra_set_methods.rb +57 -1
- data/lib/hydra_attribute/hydra_value_methods.rb +7 -0
- data/lib/hydra_attribute/{memoize.rb → memoizable.rb} +1 -1
- data/lib/hydra_attribute/version.rb +1 -1
- data/lib/hydra_attribute.rb +1 -1
- data/spec/hydra_attribute/active_record/attribute_methods_spec.rb +17 -0
- data/spec/{hydra_attribute_methods_spec.rb → hydra_attribute/hydra_attribute_methods_spec.rb} +0 -0
- data/spec/{hydra_attribute_spec.rb → hydra_attribute/hydra_attribute_spec.rb} +0 -0
- data/spec/{hydra_methods_spec.rb → hydra_attribute/hydra_methods_spec.rb} +22 -23
- data/spec/{hydra_set_methods_spec.rb → hydra_attribute/hydra_set_methods_spec.rb} +0 -0
- data/spec/{hydra_set_spec.rb → hydra_attribute/hydra_set_spec.rb} +0 -0
- data/spec/{memoize_spec.rb → hydra_attribute/memoizable_spec.rb} +2 -2
- metadata +67 -30
    
        data/README.md
    CHANGED
    
    | @@ -1,8 +1,9 @@ | |
| 1 | 
            -
            # hydra_attribute
         | 
| 2 | 
            -
             | 
| 1 | 
            +
            # hydra_attribute [](http://travis-ci.org/kostyantyn/hydra_attribute)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            [Wiki](https://github.com/kostyantyn/hydra_attribute/wiki) | [RDoc](http://rdoc.info/github/kostyantyn/hydra_attribute)
         | 
| 3 4 |  | 
| 4 5 | 
             
            hydra_attribute is an implementation of
         | 
| 5 | 
            -
            [EAV pattern](http://en.wikipedia.org/wiki/Entity–attribute–value_model) for ActiveRecord models.
         | 
| 6 | 
            +
            [EAV (Entity-Attribute-Value) pattern](http://en.wikipedia.org/wiki/Entity–attribute–value_model) for ActiveRecord models. It allows to create or remove attributes in runtime. Also each record may have different sets of attributes, for example: Product with ID 1 can have different set of attributes than Product with ID 2.
         | 
| 6 7 |  | 
| 7 8 | 
             
            ## Requirements
         | 
| 8 9 | 
             
            * ruby >= 1.9.2
         | 
| @@ -36,7 +37,8 @@ class CreateHydraAttributeTables < ActiveRecord::Migration | |
| 36 37 | 
             
            end
         | 
| 37 38 | 
             
            ```
         | 
| 38 39 |  | 
| 39 | 
            -
             | 
| 40 | 
            +
            **or if we have already the entity table**
         | 
| 41 | 
            +
             | 
| 40 42 | 
             
            ```ruby    
         | 
| 41 43 | 
             
            class CreateHydraAttributeTables < ActiveRecord::Migration
         | 
| 42 44 | 
             
              def up
         | 
| @@ -51,7 +53,7 @@ end | |
| 51 53 |  | 
| 52 54 | 
             
            ## Usage
         | 
| 53 55 |  | 
| 54 | 
            -
             | 
| 56 | 
            +
            ### Create model
         | 
| 55 57 | 
             
            ```shell
         | 
| 56 58 | 
             
            rails generate model Product type:string name:string --migration=false
         | 
| 57 59 | 
             
            rake db:migrate
         | 
| @@ -71,7 +73,7 @@ class Product < ActiveRecord::Base | |
| 71 73 | 
             
            end
         | 
| 72 74 | 
             
            ```
         | 
| 73 75 |  | 
| 74 | 
            -
             | 
| 76 | 
            +
            ### Create hydra attributes
         | 
| 75 77 | 
             
            ```ruby
         | 
| 76 78 | 
             
            Product.hydra_attributes.create(name: 'color', backend_type: 'string', default_value: 'green')
         | 
| 77 79 | 
             
            Product.hydra_attributes.create(name: 'title', backend_type: 'string')
         | 
| @@ -88,57 +90,85 @@ Creating method accepts the following options: | |
| 88 90 | 
             
                Product.hydra_attributes.create({name: 'title', backend_type: 'string', white_list: true}, as: :admin)
         | 
| 89 91 | 
             
              ```
         | 
| 90 92 |  | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            +
            ### Create records
         | 
| 93 94 | 
             
            ```ruby
         | 
| 94 | 
            -
            Product.create | 
| 95 | 
            -
             | 
| 96 | 
            -
            Product.create(color: 'red', title: 'toy') | 
| 97 | 
            -
             | 
| 98 | 
            -
            Product.create(title: 'book', total: 2) | 
| 99 | 
            -
             | 
| 95 | 
            +
            Product.create
         | 
| 96 | 
            +
            #<Product id: 1, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: nil, total: 1>
         | 
| 97 | 
            +
            Product.create(color: 'red', title: 'toy')
         | 
| 98 | 
            +
            #<Product id: 2, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "red", title: "toy", total: 1>
         | 
| 99 | 
            +
            Product.create(title: 'book', total: 2)
         | 
| 100 | 
            +
            #<Product id: 3, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: "book", total: 2>
         | 
| 100 101 | 
             
            ```
         | 
| 101 102 |  | 
| 102 | 
            -
             | 
| 103 | 
            +
            ### Add new hydra attribute in runtime
         | 
| 103 104 | 
             
            ```ruby
         | 
| 104 105 | 
             
            Product.hydra_attributes.create(name: 'price', backend_type: 'float', default_value: 0.0)
         | 
| 105 | 
            -
            Product.create(title: 'car', price: 2.50) | 
| 106 | 
            -
             | 
| 106 | 
            +
            Product.create(title: 'car', price: 2.50)
         | 
| 107 | 
            +
            #<Product id: 4, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: "car", total: 2, price: 2.5>
         | 
| 108 | 
            +
            ```
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            ### Create hydra set
         | 
| 111 | 
            +
            **Hydra set** allows set unique attribute list for each entity.
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            ```ruby
         | 
| 114 | 
            +
            hydra_set = Product.hydra_sets.create(name: 'Default')
         | 
| 115 | 
            +
            hydra_set.hydra_attributes = Product.hydra_attributes.where(name: %w(color title price))
         | 
| 116 | 
            +
             | 
| 117 | 
            +
            Product.create(color: 'black', title: 'ipod', price: 49.95, total: 5) do |product|
         | 
| 118 | 
            +
              product.hydra_set_id = hydra_set.id
         | 
| 119 | 
            +
            end
         | 
| 120 | 
            +
            #<Product id: 5, hydra_set_id: 1, created_at: ..., updated_at: ..., color: "black", title: "ipod", price: 49.95>
         | 
| 107 121 | 
             
            ```
         | 
| 122 | 
            +
            **Notice:** the `total` attribute was skipped because it doesn't exist in hydra set.
         | 
| 108 123 |  | 
| 109 | 
            -
             | 
| 124 | 
            +
            ### Obtain data
         | 
| 110 125 | 
             
            ```ruby
         | 
| 111 | 
            -
            Product.where(color: 'red') | 
| 112 | 
            -
            # [ | 
| 113 | 
            -
            Product.where(color: 'green', price: nil) | 
| 114 | 
            -
            # [ | 
| 115 | 
            -
             | 
| 126 | 
            +
            Product.where(color: 'red')
         | 
| 127 | 
            +
            # [#<Product id: 2, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "red", title: "toy", price: 0.0, total: 1>]
         | 
| 128 | 
            +
            Product.where(color: 'green', price: nil)
         | 
| 129 | 
            +
            # [
         | 
| 130 | 
            +
                #<Product id: 1, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: nil, price: 0.0, total: 1>,
         | 
| 131 | 
            +
                #<Product id: 3, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: "book", price: 0.0, total: 2>
         | 
| 132 | 
            +
            # ]
         | 
| 116 133 | 
             
            ```
         | 
| 117 134 | 
             
            **Notice**: the attribute `price` was added in runtime and records that were created before have not this attribute
         | 
| 118 135 | 
             
            so they matched this condition `where(price: nil)`
         | 
| 119 136 |  | 
| 120 | 
            -
             | 
| 137 | 
            +
            ### Order data
         | 
| 121 138 | 
             
            ```ruby
         | 
| 122 | 
            -
            Product.order(:color).first | 
| 123 | 
            -
             | 
| 124 | 
            -
            Product.order(:color).reverse_order.first | 
| 125 | 
            -
             | 
| 139 | 
            +
            Product.order(:color, :title).first
         | 
| 140 | 
            +
            #<Product id: 5, hydra_set_id: 1, created_at: ..., updated_at: ..., color: "black", title: "ipod", price: 49.95>
         | 
| 141 | 
            +
            Product.order(:color, :title).reverse_order.first
         | 
| 142 | 
            +
            #<Product id: 2, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "red", title: "toy", price: 0.0, total: 1>
         | 
| 126 143 | 
             
            ```
         | 
| 127 144 |  | 
| 128 | 
            -
             | 
| 145 | 
            +
            ### Select concrete attributes
         | 
| 129 146 | 
             
            ```ruby
         | 
| 130 | 
            -
            Product.select([:color, :title]) | 
| 131 | 
            -
            # [ | 
| 132 | 
            -
             | 
| 147 | 
            +
            Product.select([:color, :title])
         | 
| 148 | 
            +
            # [
         | 
| 149 | 
            +
                #<Product id: 1, hydra_set_id: nil, color: "green", title: nil>,
         | 
| 150 | 
            +
                #<Product id: 2, hydra_set_id: nil, color: "red", title: "toy">,
         | 
| 151 | 
            +
                #<Product id: 3, hydra_set_id: nil, color: "green", title: "book">,
         | 
| 152 | 
            +
                #<Product id: 4, hydra_set_id: nil, color: "green", title: "car">,
         | 
| 153 | 
            +
                #<Product id: 5, hydra_set_id: 1, color: "black", title: "ipod">
         | 
| 154 | 
            +
            # ] 
         | 
| 133 155 | 
             
            ```
         | 
| 134 | 
            -
            **Notice | 
| 156 | 
            +
            **Notice:** `id` and `hydra_set_id` attributes are forced added because they are important for correct work.
         | 
| 135 157 |  | 
| 136 | 
            -
             | 
| 158 | 
            +
            ### Group by attribute
         | 
| 137 159 | 
             
            ```ruby
         | 
| 138 160 | 
             
            Product.group(:color).count
         | 
| 139 | 
            -
            # {"green"=>3, "red"=>1}
         | 
| 161 | 
            +
            # {"black"=>1, "green"=>3, "red"=>1}
         | 
| 140 162 | 
             
            ```
         | 
| 141 163 |  | 
| 164 | 
            +
            ## Wiki Docs
         | 
| 165 | 
            +
            * [Create migration](https://github.com/kostyantyn/hydra_attribute/wiki/Create-migration)
         | 
| 166 | 
            +
            * [Create attributes in runtime](https://github.com/kostyantyn/hydra_attribute/wiki/Create-attributes-in-runtime)
         | 
| 167 | 
            +
            * [Create sets of attributes](https://github.com/kostyantyn/hydra_attribute/wiki/Create-sets-of-attributes)
         | 
| 168 | 
            +
            * [Query methods](https://github.com/kostyantyn/hydra_attribute/wiki/Query-methods)
         | 
| 169 | 
            +
            * [Database schema](https://github.com/kostyantyn/hydra_attribute/wiki/Database-schema)
         | 
| 170 | 
            +
            * [Helper methods](https://github.com/kostyantyn/hydra_attribute/wiki/Helper-methods)
         | 
| 171 | 
            +
             | 
| 142 172 | 
             
            ## Notice
         | 
| 143 173 |  | 
| 144 174 | 
             
            The each new minor version doesn't guarantee back compatibility with previous one 
         | 
| @@ -53,6 +53,23 @@ Feature: create models with hydra attributes | |
| 53 53 | 
             
                  | info    | b                 |
         | 
| 54 54 | 
             
                  | started | [date:2012-05-05] |
         | 
| 55 55 |  | 
| 56 | 
            +
              Scenario: create hydra attribute in runtime
         | 
| 57 | 
            +
                # create product to cache all hydra attributes
         | 
| 58 | 
            +
                Given create "Product" model
         | 
| 59 | 
            +
                And create hydra attributes for "Product" with role "admin" as "hashes":
         | 
| 60 | 
            +
                  | name     | backend_type | default_value | white_list |
         | 
| 61 | 
            +
                  | quantity | integer      | [nil:]        | [bool:t]   |
         | 
| 62 | 
            +
                And create "Product" model with attributes as "rows_hash":
         | 
| 63 | 
            +
                  | quantity | 5 |
         | 
| 64 | 
            +
                Then last created "Product" should have the following attributes:
         | 
| 65 | 
            +
                  | code     | [nil:]            |
         | 
| 66 | 
            +
                  | info     | [str:]            |
         | 
| 67 | 
            +
                  | price    | [float:0]         |
         | 
| 68 | 
            +
                  | total    | [int:0]           |
         | 
| 69 | 
            +
                  | active   | [bool:f]          |
         | 
| 70 | 
            +
                  | started  | [date:2012-01-01] |
         | 
| 71 | 
            +
                  | quantity | [int:5]           |
         | 
| 72 | 
            +
             | 
| 56 73 | 
             
              Scenario: pass only hydra_set_id
         | 
| 57 74 | 
             
                Given create hydra sets for "Product" as "hashes":
         | 
| 58 75 | 
             
                  | name    |
         | 
| @@ -67,4 +67,49 @@ Feature: hydra attribute where conditions | |
| 67 67 | 
             
                And records should have the following attributes:
         | 
| 68 68 | 
             
                  | field | value |
         | 
| 69 69 | 
             
                  | code  | 2     |
         | 
| 70 | 
            -
                  | code  | 3     |
         | 
| 70 | 
            +
                  | code  | 3     |
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              Scenario: select entity if it has attribute in attribute set
         | 
| 73 | 
            +
                Given  create hydra set "Default" for "Product"
         | 
| 74 | 
            +
                And set hydra attributes "[array:code,title]" to hydra set "Default" for entity "Product"
         | 
| 75 | 
            +
                And create "Product" models with attributes as "hashes":
         | 
| 76 | 
            +
                  | hydra_set_id                           | code | title |
         | 
| 77 | 
            +
                  |                                        | abc1 | book  |
         | 
| 78 | 
            +
                  | [eval:Product.hydra_set('Default').id] | abc2 | book  |
         | 
| 79 | 
            +
                When filter "Product" by:
         | 
| 80 | 
            +
                  | field | value |
         | 
| 81 | 
            +
                  | title | book  |
         | 
| 82 | 
            +
                Then total records should be "2"
         | 
| 83 | 
            +
                And records should have the following attributes:
         | 
| 84 | 
            +
                  | field | value |
         | 
| 85 | 
            +
                  | code  | abc1  |
         | 
| 86 | 
            +
                  | code  | abc2  |
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              Scenario: when filter attribute by nil value then entities without this attribute in attribute set should not be selected
         | 
| 89 | 
            +
                Given create hydra set "Default" for "Product"
         | 
| 90 | 
            +
                And create "Product" model
         | 
| 91 | 
            +
                And create "Product" model with attributes as "rows_hash":
         | 
| 92 | 
            +
                  | hydra_set_id | [eval:Product.hydra_set('Default').id] |
         | 
| 93 | 
            +
                When filter "Product" by:
         | 
| 94 | 
            +
                  | field | value  |
         | 
| 95 | 
            +
                  | code  | [nil:] |
         | 
| 96 | 
            +
                Then total records should be "1"
         | 
| 97 | 
            +
                And records should have the following attributes:
         | 
| 98 | 
            +
                  | field        | value  |
         | 
| 99 | 
            +
                  | hydra_set_id | [nil:] |
         | 
| 100 | 
            +
             | 
| 101 | 
            +
              Scenario: when filter attribute by value then entities which don't have this attribute in attribute set any more should not be selected
         | 
| 102 | 
            +
                Given create hydra set "Default" for "Product"
         | 
| 103 | 
            +
                And add hydra attribute "code" to hydra set "Default" for entity "Product"
         | 
| 104 | 
            +
                And create "Product" models with attributes as "hashes":
         | 
| 105 | 
            +
                  | hydra_set_id                           | code |
         | 
| 106 | 
            +
                  |                                        | abc  |
         | 
| 107 | 
            +
                  | [eval:Product.hydra_set('Default').id] | abc  |
         | 
| 108 | 
            +
                And set hydra attributes "title" to hydra set "Default" for entity "Product"
         | 
| 109 | 
            +
                When filter "Product" by:
         | 
| 110 | 
            +
                  | field | value |
         | 
| 111 | 
            +
                  | code  | abc   |
         | 
| 112 | 
            +
                Then total records should be "1"
         | 
| 113 | 
            +
                And records should have the following attributes:
         | 
| 114 | 
            +
                  | field        | value  |
         | 
| 115 | 
            +
                  | hydra_set_id | [nil:] |
         | 
| @@ -66,6 +66,19 @@ Given /^add "([^"]+)" hydra attributes to hydra set:$/ do |klass, table| | |
| 66 66 | 
             
              end
         | 
| 67 67 | 
             
            end
         | 
| 68 68 |  | 
| 69 | 
            +
            Given /^add hydra attribute "([^"]+)" to hydra set "([^"]+)" for entity "([^"]+)"$/ do |hydra_attribute, hydra_set, entity_class|
         | 
| 70 | 
            +
              entity = entity_class.constantize
         | 
| 71 | 
            +
              entity.hydra_set(type_cast_value(hydra_set)).hydra_attributes << entity.hydra_attribute(type_cast_value(hydra_attribute))
         | 
| 72 | 
            +
            end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            Given /^set hydra attributes? "([^"]+)" to hydra set "([^"]+)" for entity "([^"]+)"$/ do |hydra_attributes, hydra_set, entity_class|
         | 
| 75 | 
            +
              entity    = entity_class.constantize
         | 
| 76 | 
            +
              hydra_set = entity.hydra_set(type_cast_value(hydra_set))
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              hydra_attributes = Array(type_cast_value(hydra_attributes)).map { |attr| entity.hydra_attribute(attr) }
         | 
| 79 | 
            +
              hydra_set.hydra_attributes = hydra_attributes
         | 
| 80 | 
            +
            end
         | 
| 81 | 
            +
             | 
| 69 82 | 
             
            Given /^(load and )?(save|create|update(?: all| attributes)?|destroy(?: all)?|delete(?: all)?)(?: for)? "([^"]+)" models? with attributes as "([^"]+)":$/ do |load, action, klass, format, table|
         | 
| 70 83 | 
             
              action = action.gsub(' ', '_')
         | 
| 71 84 | 
             
              klass  = klass.constantize
         | 
    
        data/gemfiles/3.1.gemfile.lock
    CHANGED
    
    | @@ -1,28 +1,28 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: /Users/kostyantyn/Sites/github/gems/hydra_attribute
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                hydra_attribute (0.4.0. | 
| 4 | 
            +
                hydra_attribute (0.4.0.rc1)
         | 
| 5 5 | 
             
                  activerecord (>= 3.1.0)
         | 
| 6 6 |  | 
| 7 7 | 
             
            GEM
         | 
| 8 8 | 
             
              remote: http://rubygems.org/
         | 
| 9 9 | 
             
              specs:
         | 
| 10 | 
            -
                activemodel (3.1. | 
| 11 | 
            -
                  activesupport (= 3.1. | 
| 10 | 
            +
                activemodel (3.1.8)
         | 
| 11 | 
            +
                  activesupport (= 3.1.8)
         | 
| 12 12 | 
             
                  builder (~> 3.0.0)
         | 
| 13 13 | 
             
                  i18n (~> 0.6)
         | 
| 14 | 
            -
                activerecord (3.1. | 
| 15 | 
            -
                  activemodel (= 3.1. | 
| 16 | 
            -
                  activesupport (= 3.1. | 
| 14 | 
            +
                activerecord (3.1.8)
         | 
| 15 | 
            +
                  activemodel (= 3.1.8)
         | 
| 16 | 
            +
                  activesupport (= 3.1.8)
         | 
| 17 17 | 
             
                  arel (~> 2.2.3)
         | 
| 18 18 | 
             
                  tzinfo (~> 0.3.29)
         | 
| 19 | 
            -
                activesupport (3.1. | 
| 19 | 
            +
                activesupport (3.1.8)
         | 
| 20 20 | 
             
                  multi_json (>= 1.0, < 1.3)
         | 
| 21 21 | 
             
                appraisal (0.4.1)
         | 
| 22 22 | 
             
                  bundler
         | 
| 23 23 | 
             
                  rake
         | 
| 24 24 | 
             
                arel (2.2.3)
         | 
| 25 | 
            -
                builder (3.0. | 
| 25 | 
            +
                builder (3.0.3)
         | 
| 26 26 | 
             
                cucumber (1.2.1)
         | 
| 27 27 | 
             
                  builder (>= 2.1.2)
         | 
| 28 28 | 
             
                  diff-lcs (>= 1.1.3)
         | 
| @@ -30,10 +30,10 @@ GEM | |
| 30 30 | 
             
                  json (>= 1.4.6)
         | 
| 31 31 | 
             
                database_cleaner (0.8.0)
         | 
| 32 32 | 
             
                diff-lcs (1.1.3)
         | 
| 33 | 
            -
                gherkin (2.11. | 
| 33 | 
            +
                gherkin (2.11.2)
         | 
| 34 34 | 
             
                  json (>= 1.4.6)
         | 
| 35 | 
            -
                i18n (0.6. | 
| 36 | 
            -
                json (1.7. | 
| 35 | 
            +
                i18n (0.6.1)
         | 
| 36 | 
            +
                json (1.7.5)
         | 
| 37 37 | 
             
                multi_json (1.2.0)
         | 
| 38 38 | 
             
                rake (0.9.2.2)
         | 
| 39 39 | 
             
                rspec (2.11.0)
         | 
| @@ -41,9 +41,9 @@ GEM | |
| 41 41 | 
             
                  rspec-expectations (~> 2.11.0)
         | 
| 42 42 | 
             
                  rspec-mocks (~> 2.11.0)
         | 
| 43 43 | 
             
                rspec-core (2.11.1)
         | 
| 44 | 
            -
                rspec-expectations (2.11. | 
| 44 | 
            +
                rspec-expectations (2.11.3)
         | 
| 45 45 | 
             
                  diff-lcs (~> 1.1.3)
         | 
| 46 | 
            -
                rspec-mocks (2.11. | 
| 46 | 
            +
                rspec-mocks (2.11.2)
         | 
| 47 47 | 
             
                sqlite3 (1.3.6)
         | 
| 48 48 | 
             
                tzinfo (0.3.33)
         | 
| 49 49 |  | 
    
        data/gemfiles/3.2.gemfile.lock
    CHANGED
    
    | @@ -1,28 +1,28 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: /Users/kostyantyn/Sites/github/gems/hydra_attribute
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                hydra_attribute (0.4.0. | 
| 4 | 
            +
                hydra_attribute (0.4.0.rc1)
         | 
| 5 5 | 
             
                  activerecord (>= 3.1.0)
         | 
| 6 6 |  | 
| 7 7 | 
             
            GEM
         | 
| 8 8 | 
             
              remote: http://rubygems.org/
         | 
| 9 9 | 
             
              specs:
         | 
| 10 | 
            -
                activemodel (3.2. | 
| 11 | 
            -
                  activesupport (= 3.2. | 
| 10 | 
            +
                activemodel (3.2.8)
         | 
| 11 | 
            +
                  activesupport (= 3.2.8)
         | 
| 12 12 | 
             
                  builder (~> 3.0.0)
         | 
| 13 | 
            -
                activerecord (3.2. | 
| 14 | 
            -
                  activemodel (= 3.2. | 
| 15 | 
            -
                  activesupport (= 3.2. | 
| 13 | 
            +
                activerecord (3.2.8)
         | 
| 14 | 
            +
                  activemodel (= 3.2.8)
         | 
| 15 | 
            +
                  activesupport (= 3.2.8)
         | 
| 16 16 | 
             
                  arel (~> 3.0.2)
         | 
| 17 17 | 
             
                  tzinfo (~> 0.3.29)
         | 
| 18 | 
            -
                activesupport (3.2. | 
| 18 | 
            +
                activesupport (3.2.8)
         | 
| 19 19 | 
             
                  i18n (~> 0.6)
         | 
| 20 20 | 
             
                  multi_json (~> 1.0)
         | 
| 21 21 | 
             
                appraisal (0.4.1)
         | 
| 22 22 | 
             
                  bundler
         | 
| 23 23 | 
             
                  rake
         | 
| 24 24 | 
             
                arel (3.0.2)
         | 
| 25 | 
            -
                builder (3.0. | 
| 25 | 
            +
                builder (3.0.3)
         | 
| 26 26 | 
             
                cucumber (1.2.1)
         | 
| 27 27 | 
             
                  builder (>= 2.1.2)
         | 
| 28 28 | 
             
                  diff-lcs (>= 1.1.3)
         | 
| @@ -30,10 +30,10 @@ GEM | |
| 30 30 | 
             
                  json (>= 1.4.6)
         | 
| 31 31 | 
             
                database_cleaner (0.8.0)
         | 
| 32 32 | 
             
                diff-lcs (1.1.3)
         | 
| 33 | 
            -
                gherkin (2.11. | 
| 33 | 
            +
                gherkin (2.11.2)
         | 
| 34 34 | 
             
                  json (>= 1.4.6)
         | 
| 35 | 
            -
                i18n (0.6. | 
| 36 | 
            -
                json (1.7. | 
| 35 | 
            +
                i18n (0.6.1)
         | 
| 36 | 
            +
                json (1.7.5)
         | 
| 37 37 | 
             
                multi_json (1.3.6)
         | 
| 38 38 | 
             
                rake (0.9.2.2)
         | 
| 39 39 | 
             
                rspec (2.11.0)
         | 
| @@ -41,9 +41,9 @@ GEM | |
| 41 41 | 
             
                  rspec-expectations (~> 2.11.0)
         | 
| 42 42 | 
             
                  rspec-mocks (~> 2.11.0)
         | 
| 43 43 | 
             
                rspec-core (2.11.1)
         | 
| 44 | 
            -
                rspec-expectations (2.11. | 
| 44 | 
            +
                rspec-expectations (2.11.3)
         | 
| 45 45 | 
             
                  diff-lcs (~> 1.1.3)
         | 
| 46 | 
            -
                rspec-mocks (2.11. | 
| 46 | 
            +
                rspec-mocks (2.11.2)
         | 
| 47 47 | 
             
                sqlite3 (1.3.6)
         | 
| 48 48 | 
             
                tzinfo (0.3.33)
         | 
| 49 49 |  | 
| @@ -53,7 +53,7 @@ module HydraAttribute | |
| 53 53 | 
             
                        generated_hydra_attribute_methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
         | 
| 54 54 | 
             
                          #{defn}
         | 
| 55 55 | 
             
                            if hydra_set_id? and self.class.hydra_set_attribute_ids(hydra_set_id).exclude?(#{hydra_attribute.id})
         | 
| 56 | 
            -
                              raise MissingAttributeInHydraSetError,  | 
| 56 | 
            +
                              raise MissingAttributeInHydraSetError, %(Hydra attribute "#{hydra_attribute.name}" does not exist in hydra set "\#{self.class.hydra_set(hydra_set_id).name}")
         | 
| 57 57 | 
             
                            end
         | 
| 58 58 |  | 
| 59 59 | 
             
                            if value_model = hydra_value_model(#{hydra_attribute.id})
         | 
| @@ -99,7 +99,7 @@ module HydraAttribute | |
| 99 99 | 
             
                      attr_name = self.class.send(:attribute_method_matcher, name).attr_name
         | 
| 100 100 | 
             
                    end
         | 
| 101 101 |  | 
| 102 | 
            -
                    if  | 
| 102 | 
            +
                    if self.class.hydra_attribute_names.include?(attr_name)
         | 
| 103 103 | 
             
                      self.class.hydra_set_attribute_names(hydra_set_id).include?(attr_name)
         | 
| 104 104 | 
             
                    else
         | 
| 105 105 | 
             
                      super
         | 
| @@ -136,9 +136,8 @@ module HydraAttribute | |
| 136 136 | 
             
                  end
         | 
| 137 137 |  | 
| 138 138 | 
             
                  def inspect
         | 
| 139 | 
            -
                    attrs | 
| 140 | 
            -
                     | 
| 141 | 
            -
                    "#<#{self.class} #{attrs.join(', ')}>"
         | 
| 139 | 
            +
                    attrs = hydra_value_models.map { |model| "#{model.hydra_attribute_name}: #{model.attribute_for_inspect('value')}" }
         | 
| 140 | 
            +
                    super.gsub(/>$/, ", #{attrs.join(', ')}>")
         | 
| 142 141 | 
             
                  end
         | 
| 143 142 |  | 
| 144 143 | 
             
                  private
         | 
| @@ -4,7 +4,7 @@ module HydraAttribute | |
| 4 4 | 
             
                  module QueryMethods
         | 
| 5 5 | 
             
                    extend ActiveSupport::Concern
         | 
| 6 6 |  | 
| 7 | 
            -
                    MULTI_VALUE_METHODS = [:hydra_joins_aliases, :hydra_select_values]
         | 
| 7 | 
            +
                    MULTI_VALUE_METHODS = [:hydra_joins_aliases, :hydra_select_values, :hydra_attributes]
         | 
| 8 8 |  | 
| 9 9 | 
             
                    included do
         | 
| 10 10 | 
             
                      attr_writer *MULTI_VALUE_METHODS
         | 
| @@ -25,6 +25,7 @@ module HydraAttribute | |
| 25 25 | 
             
                        opts.inject(self) do |relation, (name, value)|
         | 
| 26 26 | 
             
                          if klass.hydra_attribute_names.include?(name.to_s)
         | 
| 27 27 | 
             
                            relation, name = relation.clone, name.to_s
         | 
| 28 | 
            +
                            relation.hydra_attributes    << name
         | 
| 28 29 | 
             
                            relation.hydra_joins_aliases << hydra_helper.ref_alias(name, value)
         | 
| 29 30 | 
             
                            relation.joins_values += hydra_helper.build_joins(name, value)
         | 
| 30 31 | 
             
                            relation.where_values += build_where(hydra_helper.where_options(name, value))
         | 
| @@ -58,6 +59,11 @@ module HydraAttribute | |
| 58 59 | 
             
                        @select_values << hydra_helper.prepend_table_name('hydra_set_id')
         | 
| 59 60 | 
             
                      end
         | 
| 60 61 |  | 
| 62 | 
            +
                      if hydra_attributes.any?
         | 
| 63 | 
            +
                        hydra_sets = klass.hydra_sets.select { |hydra_set| hydra_set.hydra_attributes.any? { |attr| attr.name.in?(hydra_attributes) } }
         | 
| 64 | 
            +
                        @where_values << table[:hydra_set_id].in(hydra_sets.map(&:id)).or(table[:hydra_set_id].eq(nil))
         | 
| 65 | 
            +
                      end
         | 
| 66 | 
            +
             | 
| 61 67 | 
             
                      super
         | 
| 62 68 | 
             
                    end
         | 
| 63 69 |  | 
| @@ -20,7 +20,7 @@ module HydraAttribute | |
| 20 20 |  | 
| 21 21 | 
             
                def build
         | 
| 22 22 | 
             
                  build_associations
         | 
| 23 | 
            -
                   | 
| 23 | 
            +
                  update_mass_assignment_security
         | 
| 24 24 | 
             
                end
         | 
| 25 25 |  | 
| 26 26 | 
             
                private
         | 
| @@ -30,8 +30,8 @@ module HydraAttribute | |
| 30 30 | 
             
                    end
         | 
| 31 31 | 
             
                  end
         | 
| 32 32 |  | 
| 33 | 
            -
                  def  | 
| 34 | 
            -
                    klass.hydra_attributes.each(&: | 
| 33 | 
            +
                  def update_mass_assignment_security
         | 
| 34 | 
            +
                    klass.hydra_attributes.each(&:update_mass_assignment_security)
         | 
| 35 35 | 
             
                  end
         | 
| 36 36 | 
             
              end
         | 
| 37 37 | 
             
            end
         | 
| @@ -19,17 +19,17 @@ module HydraAttribute | |
| 19 19 |  | 
| 20 20 | 
             
                before_destroy :delete_dependent_values
         | 
| 21 21 | 
             
                after_commit   :clear_entity_cache
         | 
| 22 | 
            -
                after_commit   : | 
| 22 | 
            +
                after_commit   :update_mass_assignment_security
         | 
| 23 23 |  | 
| 24 24 | 
             
                # @COMPATIBILITY with 3.1.x association module is directly added to the class instead of including module
         | 
| 25 25 | 
             
                def hydra_sets_with_clearing_cache=(value)
         | 
| 26 26 | 
             
                  self.hydra_sets_without_clearing_cache = value
         | 
| 27 | 
            -
                   | 
| 27 | 
            +
                  entity_type.constantize.clear_hydra_method_cache!
         | 
| 28 28 | 
             
                  value
         | 
| 29 29 | 
             
                end
         | 
| 30 30 | 
             
                alias_method_chain :hydra_sets=, :clearing_cache
         | 
| 31 31 |  | 
| 32 | 
            -
                def  | 
| 32 | 
            +
                def update_mass_assignment_security
         | 
| 33 33 | 
             
                  if destroyed? or !white_list?
         | 
| 34 34 | 
             
                    remove_from_white_list
         | 
| 35 35 | 
             
                  else
         | 
| @@ -44,7 +44,7 @@ module HydraAttribute | |
| 44 44 | 
             
                  end
         | 
| 45 45 |  | 
| 46 46 | 
             
                  def clear_entity_cache
         | 
| 47 | 
            -
                    entity_type.constantize. | 
| 47 | 
            +
                    entity_type.constantize.reset_hydra_attribute_methods!
         | 
| 48 48 | 
             
                  end
         | 
| 49 49 |  | 
| 50 50 | 
             
                  def add_to_white_list
         |