u-attributes 2.0.0 → 2.0.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 +119 -97
 - data/lib/micro/attributes.rb +1 -1
 - data/lib/micro/attributes/version.rb +1 -1
 - data/u-attributes.gemspec +5 -2
 - metadata +7 -5
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: bc53b00949ac8d0d8d8572443936ba537a637569be77e0b105a0b98f2d1ae9d0
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 94f42f6da3c2cba68f6565e1bb413b5692bd700baa077555cd421e4aeb82e2ff
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: e5617a5fd34458de945dae2874bed24013e682871f19b70063e734156f2528e8b249e615632f90c978c203abf876560de9717940f9b81e48271f84a956456199
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 50b19483c9e8f88169101306be67a34e4e8c6a26358b187fd119b41ca26e83d461619d6a149bfc898ab7b1208c6af6791b58acf039a3d92d0e8f912e007232b9
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,16 +1,16 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            
         
     | 
| 
       2 
2 
     | 
    
         
             
            [](https://rubygems.org/gems/u-attributes)
         
     | 
| 
       3 
     | 
    
         
            -
            [](https://travis-ci.com/serradura/u-attributes)
         
     | 
| 
       4 
4 
     | 
    
         
             
            [](https://codeclimate.com/github/serradura/u-attributes/maintainability)
         
     | 
| 
       5 
5 
     | 
    
         
             
            [](https://codeclimate.com/github/serradura/u-attributes/test_coverage)
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            μ-attributes (Micro::Attributes) <!-- omit in toc -->
         
     | 
| 
       8 
8 
     | 
    
         
             
            ================================
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            This gem allows  
     | 
| 
      
 10 
     | 
    
         
            +
            This gem allows you to define "immutable" objects, and your objects will have only getters and no setters.
         
     | 
| 
      
 11 
     | 
    
         
            +
            So, if you change [[1](#with_attribute)] [[2](#with_attributes)] some object attribute, you will have a new object instance. That is, you transform the object instead of modifying it.
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
13 
     | 
    
         
             
            ## Table of contents <!-- omit in toc -->
         
     | 
| 
       13 
     | 
    
         
            -
            - [Required Ruby version](#required-ruby-version)
         
     | 
| 
       14 
14 
     | 
    
         
             
            - [Installation](#installation)
         
     | 
| 
       15 
15 
     | 
    
         
             
            - [Compatibility](#compatibility)
         
     | 
| 
       16 
16 
     | 
    
         
             
            - [Usage](#usage)
         
     | 
| 
         @@ -23,26 +23,27 @@ This gem allows defining read-only attributes, that is, your objects will have o 
     | 
|
| 
       23 
23 
     | 
    
         
             
                - [`#with_attribute()`](#with_attribute)
         
     | 
| 
       24 
24 
     | 
    
         
             
                - [`#with_attributes()`](#with_attributes)
         
     | 
| 
       25 
25 
     | 
    
         
             
              - [Defining default values to the attributes](#defining-default-values-to-the-attributes)
         
     | 
| 
       26 
     | 
    
         
            -
              - [ 
     | 
| 
      
 26 
     | 
    
         
            +
              - [The strict initializer](#the-strict-initializer)
         
     | 
| 
       27 
27 
     | 
    
         
             
              - [Is it possible to inherit the attributes?](#is-it-possible-to-inherit-the-attributes)
         
     | 
| 
       28 
     | 
    
         
            -
                - [ 
     | 
| 
      
 28 
     | 
    
         
            +
                - [`.attribute!()`](#attribute)
         
     | 
| 
       29 
29 
     | 
    
         
             
              - [How to query the attributes?](#how-to-query-the-attributes)
         
     | 
| 
       30 
30 
     | 
    
         
             
            - [Built-in extensions](#built-in-extensions)
         
     | 
| 
       31 
     | 
    
         
            -
              - [ 
     | 
| 
       32 
     | 
    
         
            -
                - [ 
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
              - [ 
     | 
| 
       35 
     | 
    
         
            -
              - [ 
     | 
| 
      
 31 
     | 
    
         
            +
              - [Picking specific features](#picking-specific-features)
         
     | 
| 
      
 32 
     | 
    
         
            +
                - [`Micro::Attributes.with`](#microattributeswith)
         
     | 
| 
      
 33 
     | 
    
         
            +
                - [`Micro::Attributes.without`](#microattributeswithout)
         
     | 
| 
      
 34 
     | 
    
         
            +
              - [Picking all the features](#picking-all-the-features)
         
     | 
| 
      
 35 
     | 
    
         
            +
              - [Extensions](#extensions)
         
     | 
| 
      
 36 
     | 
    
         
            +
                - [`ActiveModel::Validation` extension](#activemodelvalidation-extension)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  - [`.attribute()` options](#attribute-options)
         
     | 
| 
      
 38 
     | 
    
         
            +
                - [Diff extension](#diff-extension)
         
     | 
| 
      
 39 
     | 
    
         
            +
                - [Initialize extension](#initialize-extension)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  - [Strict mode](#strict-mode)
         
     | 
| 
       36 
41 
     | 
    
         
             
            - [Development](#development)
         
     | 
| 
       37 
42 
     | 
    
         
             
            - [Contributing](#contributing)
         
     | 
| 
       38 
43 
     | 
    
         
             
            - [License](#license)
         
     | 
| 
       39 
44 
     | 
    
         
             
            - [Code of Conduct](#code-of-conduct)
         
     | 
| 
       40 
45 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
            > \>= 2.2.0
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
            ## Installation
         
     | 
| 
      
 46 
     | 
    
         
            +
            # Installation
         
     | 
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
            Add this line to your application's Gemfile and `bundle install`:
         
     | 
| 
       48 
49 
     | 
    
         | 
| 
         @@ -50,16 +51,20 @@ Add this line to your application's Gemfile and `bundle install`: 
     | 
|
| 
       50 
51 
     | 
    
         
             
            gem 'u-attributes'
         
     | 
| 
       51 
52 
     | 
    
         
             
            ```
         
     | 
| 
       52 
53 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
      
 54 
     | 
    
         
            +
            # Compatibility
         
     | 
| 
       54 
55 
     | 
    
         | 
| 
       55 
56 
     | 
    
         
             
            | u-attributes   | branch  | ruby     |  activemodel  |
         
     | 
| 
       56 
57 
     | 
    
         
             
            | -------------- | ------- | -------- | ------------- |
         
     | 
| 
       57 
     | 
    
         
            -
            | 2.0.0          |  
     | 
| 
      
 58 
     | 
    
         
            +
            | 2.0.0          | main    | >= 2.2.0 | >= 3.2, < 6.1 |
         
     | 
| 
       58 
59 
     | 
    
         
             
            | 1.2.0          | v1.x    | >= 2.2.0 | >= 3.2, < 6.1 |
         
     | 
| 
       59 
60 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
            > **Note**: The activemodel is an optional dependency, this module [can be enabled](#activemodelvalidation-extension) to validate the attributes.
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
       61 
64 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
            # Usage
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            ## How to define attributes?
         
     | 
| 
       63 
68 
     | 
    
         | 
| 
       64 
69 
     | 
    
         
             
            ```ruby
         
     | 
| 
       65 
70 
     | 
    
         
             
            # By default you must to define the class constructor.
         
     | 
| 
         @@ -67,8 +72,8 @@ gem 'u-attributes' 
     | 
|
| 
       67 
72 
     | 
    
         
             
            class Person
         
     | 
| 
       68 
73 
     | 
    
         
             
              include Micro::Attributes
         
     | 
| 
       69 
74 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
              attribute :name
         
     | 
| 
       71 
75 
     | 
    
         
             
              attribute :age
         
     | 
| 
      
 76 
     | 
    
         
            +
              attribute :name
         
     | 
| 
       72 
77 
     | 
    
         | 
| 
       73 
78 
     | 
    
         
             
              def initialize(name: 'John Doe', age:)
         
     | 
| 
       74 
79 
     | 
    
         
             
                @name, @age = name, age
         
     | 
| 
         @@ -77,8 +82,8 @@ end 
     | 
|
| 
       77 
82 
     | 
    
         | 
| 
       78 
83 
     | 
    
         
             
            person = Person.new(age: 21)
         
     | 
| 
       79 
84 
     | 
    
         | 
| 
       80 
     | 
    
         
            -
            person.name # John Doe
         
     | 
| 
       81 
85 
     | 
    
         
             
            person.age  # 21
         
     | 
| 
      
 86 
     | 
    
         
            +
            person.name # John Doe
         
     | 
| 
       82 
87 
     | 
    
         | 
| 
       83 
88 
     | 
    
         
             
            # By design the attributes are always exposed as reader methods (getters).
         
     | 
| 
       84 
89 
     | 
    
         
             
            # If you try to call a setter you will see a NoMethodError.
         
     | 
| 
         @@ -87,7 +92,9 @@ person.age  # 21 
     | 
|
| 
       87 
92 
     | 
    
         
             
            # NoMethodError (undefined method `name=' for #<Person:0x0000... @name='John Doe', @age=21>)
         
     | 
| 
       88 
93 
     | 
    
         
             
            ```
         
     | 
| 
       89 
94 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
      
 95 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
            ### `Micro::Attributes#attributes=`
         
     | 
| 
       91 
98 
     | 
    
         | 
| 
       92 
99 
     | 
    
         
             
            This is a protected method to make easier the assignment in a constructor. e.g.
         
     | 
| 
       93 
100 
     | 
    
         | 
| 
         @@ -95,8 +102,8 @@ This is a protected method to make easier the assignment in a constructor. e.g. 
     | 
|
| 
       95 
102 
     | 
    
         
             
            class Person
         
     | 
| 
       96 
103 
     | 
    
         
             
              include Micro::Attributes
         
     | 
| 
       97 
104 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
              attribute :name, default: 'John Doe'
         
     | 
| 
       99 
105 
     | 
    
         
             
              attribute :age
         
     | 
| 
      
 106 
     | 
    
         
            +
              attribute :name, default: 'John Doe'
         
     | 
| 
       100 
107 
     | 
    
         | 
| 
       101 
108 
     | 
    
         
             
              def initialize(options)
         
     | 
| 
       102 
109 
     | 
    
         
             
                self.attributes = options
         
     | 
| 
         @@ -105,19 +112,21 @@ end 
     | 
|
| 
       105 
112 
     | 
    
         | 
| 
       106 
113 
     | 
    
         
             
            person = Person.new(age: 20)
         
     | 
| 
       107 
114 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
            person.name # John Doe
         
     | 
| 
       109 
115 
     | 
    
         
             
            person.age  # 20
         
     | 
| 
      
 116 
     | 
    
         
            +
            person.name # John Doe
         
     | 
| 
       110 
117 
     | 
    
         
             
            ```
         
     | 
| 
       111 
118 
     | 
    
         | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
      
 119 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
            ### `Micro::Attributes#attribute`
         
     | 
| 
       113 
122 
     | 
    
         | 
| 
       114 
123 
     | 
    
         
             
            Use this method with a valid attribute name to get its value.
         
     | 
| 
       115 
124 
     | 
    
         | 
| 
       116 
125 
     | 
    
         
             
            ```ruby
         
     | 
| 
       117 
126 
     | 
    
         
             
            person = Person.new(age: 20)
         
     | 
| 
       118 
127 
     | 
    
         | 
| 
       119 
     | 
    
         
            -
            person.attribute(:name) # John Doe
         
     | 
| 
       120 
128 
     | 
    
         
             
            person.attribute('age') # 20
         
     | 
| 
      
 129 
     | 
    
         
            +
            person.attribute(:name) # John Doe
         
     | 
| 
       121 
130 
     | 
    
         
             
            person.attribute('foo') # nil
         
     | 
| 
       122 
131 
     | 
    
         
             
            ```
         
     | 
| 
       123 
132 
     | 
    
         | 
| 
         @@ -129,17 +138,21 @@ person.attribute('age') { |value| puts value } # 20 
     | 
|
| 
       129 
138 
     | 
    
         
             
            person.attribute('foo') { |value| puts value } # !! Nothing happened, because of the attribute doesn't exist.
         
     | 
| 
       130 
139 
     | 
    
         
             
            ```
         
     | 
| 
       131 
140 
     | 
    
         | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
      
 141 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
            ### `Micro::Attributes#attribute!`
         
     | 
| 
       133 
144 
     | 
    
         | 
| 
       134 
145 
     | 
    
         
             
            Works like the `#attribute` method, but it will raise an exception when the attribute doesn't exist.
         
     | 
| 
       135 
146 
     | 
    
         | 
| 
       136 
147 
     | 
    
         
             
            ```ruby
         
     | 
| 
       137 
     | 
    
         
            -
            person.attribute!('foo') 
     | 
| 
      
 148 
     | 
    
         
            +
            person.attribute!('foo')                   # NameError (undefined attribute `foo)
         
     | 
| 
       138 
149 
     | 
    
         | 
| 
       139 
150 
     | 
    
         
             
            person.attribute!('foo') { |value| value } # NameError (undefined attribute `foo)
         
     | 
| 
       140 
151 
     | 
    
         
             
            ```
         
     | 
| 
       141 
152 
     | 
    
         | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
      
 153 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
            ## How to define multiple attributes?
         
     | 
| 
       143 
156 
     | 
    
         | 
| 
       144 
157 
     | 
    
         
             
            Use `.attributes` with a list of attribute names.
         
     | 
| 
       145 
158 
     | 
    
         | 
| 
         @@ -162,7 +175,9 @@ person.age  # 32 
     | 
|
| 
       162 
175 
     | 
    
         | 
| 
       163 
176 
     | 
    
         
             
            > **Note:** This method can't define default values. To do this, use the `#attribute()` method.
         
     | 
| 
       164 
177 
     | 
    
         | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
      
 178 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
            ## `Micro::Attributes.with(:initialize)`
         
     | 
| 
       166 
181 
     | 
    
         | 
| 
       167 
182 
     | 
    
         
             
            Use `Micro::Attributes.with(:initialize)` to define a constructor to assign the attributes. e.g.
         
     | 
| 
       168 
183 
     | 
    
         | 
| 
         @@ -176,41 +191,43 @@ end 
     | 
|
| 
       176 
191 
     | 
    
         | 
| 
       177 
192 
     | 
    
         
             
            person = Person.new(age: 18)
         
     | 
| 
       178 
193 
     | 
    
         | 
| 
       179 
     | 
    
         
            -
            person.name # John Doe
         
     | 
| 
       180 
194 
     | 
    
         
             
            person.age  # 18
         
     | 
| 
      
 195 
     | 
    
         
            +
            person.name # John Doe
         
     | 
| 
       181 
196 
     | 
    
         
             
            ```
         
     | 
| 
       182 
197 
     | 
    
         | 
| 
       183 
198 
     | 
    
         
             
            This extension enables two methods for your objects.
         
     | 
| 
       184 
199 
     | 
    
         
             
            The `#with_attribute()` and `#with_attributes()`.
         
     | 
| 
       185 
200 
     | 
    
         | 
| 
       186 
     | 
    
         
            -
             
     | 
| 
      
 201 
     | 
    
         
            +
            ### `#with_attribute()`
         
     | 
| 
       187 
202 
     | 
    
         | 
| 
       188 
203 
     | 
    
         
             
            ```ruby
         
     | 
| 
       189 
204 
     | 
    
         
             
            another_person = person.with_attribute(:age, 21)
         
     | 
| 
       190 
205 
     | 
    
         | 
| 
       191 
     | 
    
         
            -
            another_person.name           # John Doe
         
     | 
| 
       192 
206 
     | 
    
         
             
            another_person.age            # 21
         
     | 
| 
      
 207 
     | 
    
         
            +
            another_person.name           # John Doe
         
     | 
| 
       193 
208 
     | 
    
         
             
            another_person.equal?(person) # false
         
     | 
| 
       194 
209 
     | 
    
         
             
            ```
         
     | 
| 
       195 
210 
     | 
    
         | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
      
 211 
     | 
    
         
            +
            ### `#with_attributes()`
         
     | 
| 
       197 
212 
     | 
    
         | 
| 
       198 
213 
     | 
    
         
             
            Use it to assign multiple attributes
         
     | 
| 
       199 
214 
     | 
    
         
             
            ```ruby
         
     | 
| 
       200 
215 
     | 
    
         
             
            other_person = person.with_attributes(name: 'Serradura', age: 32)
         
     | 
| 
       201 
216 
     | 
    
         | 
| 
       202 
     | 
    
         
            -
            other_person.name           # Serradura
         
     | 
| 
       203 
217 
     | 
    
         
             
            other_person.age            # 32
         
     | 
| 
      
 218 
     | 
    
         
            +
            other_person.name           # Serradura
         
     | 
| 
       204 
219 
     | 
    
         
             
            other_person.equal?(person) # false
         
     | 
| 
       205 
220 
     | 
    
         
             
            ```
         
     | 
| 
       206 
221 
     | 
    
         | 
| 
       207 
222 
     | 
    
         
             
            If you pass a value different of a Hash, a Kind::Error will be raised.
         
     | 
| 
       208 
223 
     | 
    
         | 
| 
       209 
224 
     | 
    
         
             
            ```ruby
         
     | 
| 
       210 
     | 
    
         
            -
            Person.new(1) # Kind::Error (1  
     | 
| 
      
 225 
     | 
    
         
            +
            Person.new(1) # Kind::Error (1 expected to be a kind of Hash)
         
     | 
| 
       211 
226 
     | 
    
         
             
            ```
         
     | 
| 
       212 
227 
     | 
    
         | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
      
 228 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 229 
     | 
    
         
            +
             
     | 
| 
      
 230 
     | 
    
         
            +
            ## Defining default values to the attributes
         
     | 
| 
       214 
231 
     | 
    
         | 
| 
       215 
232 
     | 
    
         
             
            To do this, you only need make use of the `default:` keyword. e.g.
         
     | 
| 
       216 
233 
     | 
    
         | 
| 
         @@ -237,7 +254,9 @@ class Person 
     | 
|
| 
       237 
254 
     | 
    
         
             
            end
         
     | 
| 
       238 
255 
     | 
    
         
             
            ```
         
     | 
| 
       239 
256 
     | 
    
         | 
| 
       240 
     | 
    
         
            -
             
     | 
| 
      
 257 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 258 
     | 
    
         
            +
             
     | 
| 
      
 259 
     | 
    
         
            +
            ## The strict initializer
         
     | 
| 
       241 
260 
     | 
    
         | 
| 
       242 
261 
     | 
    
         
             
            Use `.with(initialize: :strict)` to forbids an instantiation without all the attribute keywords. e.g.
         
     | 
| 
       243 
262 
     | 
    
         | 
| 
         @@ -257,13 +276,15 @@ An attribute with a default value can be omitted. 
     | 
|
| 
       257 
276 
     | 
    
         
             
            ``` ruby
         
     | 
| 
       258 
277 
     | 
    
         
             
            person_without_age = StrictPerson.new(age: nil)
         
     | 
| 
       259 
278 
     | 
    
         | 
| 
       260 
     | 
    
         
            -
            person_without_age.name # 'John Doe'
         
     | 
| 
       261 
279 
     | 
    
         
             
            person_without_age.age  # nil
         
     | 
| 
      
 280 
     | 
    
         
            +
            person_without_age.name # 'John Doe'
         
     | 
| 
       262 
281 
     | 
    
         
             
            ```
         
     | 
| 
       263 
282 
     | 
    
         | 
| 
       264 
283 
     | 
    
         
             
            > **Note:** Except for this validation the `.with(initialize: :strict)` method will works in the same ways of `.with(:initialize)`.
         
     | 
| 
       265 
284 
     | 
    
         | 
| 
       266 
     | 
    
         
            -
             
     | 
| 
      
 285 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 286 
     | 
    
         
            +
             
     | 
| 
      
 287 
     | 
    
         
            +
            ## Is it possible to inherit the attributes?
         
     | 
| 
       267 
288 
     | 
    
         | 
| 
       268 
289 
     | 
    
         
             
            Yes. e.g.
         
     | 
| 
       269 
290 
     | 
    
         | 
| 
         @@ -286,7 +307,9 @@ instance.respond_to?(:age) # true 
     | 
|
| 
       286 
307 
     | 
    
         
             
            instance.respond_to?(:foo) # true
         
     | 
| 
       287 
308 
     | 
    
         
             
            ```
         
     | 
| 
       288 
309 
     | 
    
         | 
| 
       289 
     | 
    
         
            -
             
     | 
| 
      
 310 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 311 
     | 
    
         
            +
             
     | 
| 
      
 312 
     | 
    
         
            +
            ### `.attribute!()`
         
     | 
| 
       290 
313 
     | 
    
         | 
| 
       291 
314 
     | 
    
         
             
            This method allows us to redefine the attributes default data that was defined in the parent class. e.g.
         
     | 
| 
       292 
315 
     | 
    
         | 
| 
         @@ -311,7 +334,9 @@ beta_person.name # 'Beta' 
     | 
|
| 
       311 
334 
     | 
    
         
             
            beta_person.age  # 0
         
     | 
| 
       312 
335 
     | 
    
         
             
            ```
         
     | 
| 
       313 
336 
     | 
    
         | 
| 
       314 
     | 
    
         
            -
             
     | 
| 
      
 337 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 338 
     | 
    
         
            +
             
     | 
| 
      
 339 
     | 
    
         
            +
            ## How to query the attributes?
         
     | 
| 
       315 
340 
     | 
    
         | 
| 
       316 
341 
     | 
    
         
             
            ```ruby
         
     | 
| 
       317 
342 
     | 
    
         
             
            class Person
         
     | 
| 
         @@ -372,76 +397,65 @@ person.attributes(:age, :name)      # {age: 20, name: 'John Doe'} 
     | 
|
| 
       372 
397 
     | 
    
         
             
            person.attributes('age', 'name')    # {'age'=>20, 'name'=>'John Doe'}
         
     | 
| 
       373 
398 
     | 
    
         
             
            ```
         
     | 
| 
       374 
399 
     | 
    
         | 
| 
       375 
     | 
    
         
            -
             
     | 
| 
      
 400 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 401 
     | 
    
         
            +
             
     | 
| 
      
 402 
     | 
    
         
            +
            # Built-in extensions
         
     | 
| 
       376 
403 
     | 
    
         | 
| 
       377 
404 
     | 
    
         
             
            You can use the method `Micro::Attributes.with()` to combine and require only the features that better fit your needs.
         
     | 
| 
       378 
405 
     | 
    
         | 
| 
       379 
406 
     | 
    
         
             
            But, if you desire except one or more features, use the `Micro::Attributes.without()` method.
         
     | 
| 
       380 
407 
     | 
    
         | 
| 
      
 408 
     | 
    
         
            +
            ## Picking specific features
         
     | 
| 
      
 409 
     | 
    
         
            +
             
     | 
| 
      
 410 
     | 
    
         
            +
            ### `Micro::Attributes.with`
         
     | 
| 
      
 411 
     | 
    
         
            +
             
     | 
| 
       381 
412 
     | 
    
         
             
            ```ruby
         
     | 
| 
       382 
     | 
    
         
            -
             
     | 
| 
       383 
     | 
    
         
            -
            # Loading specific features #
         
     | 
| 
       384 
     | 
    
         
            -
            #===========================#
         
     | 
| 
      
 413 
     | 
    
         
            +
            Micro::Attributes.with(:initialize)
         
     | 
| 
       385 
414 
     | 
    
         | 
| 
       386 
     | 
    
         
            -
             
     | 
| 
       387 
     | 
    
         
            -
              include Micro::Attributes.with(:diff)
         
     | 
| 
      
 415 
     | 
    
         
            +
            Micro::Attributes.with(initialize: :strict)
         
     | 
| 
       388 
416 
     | 
    
         | 
| 
       389 
     | 
    
         
            -
             
     | 
| 
       390 
     | 
    
         
            -
              attribute :state, default: 'sleeping'
         
     | 
| 
      
 417 
     | 
    
         
            +
            Micro::Attributes.with(:diff, :initialize)
         
     | 
| 
       391 
418 
     | 
    
         | 
| 
       392 
     | 
    
         
            -
             
     | 
| 
       393 
     | 
    
         
            -
                self.attributes = options
         
     | 
| 
       394 
     | 
    
         
            -
              end
         
     | 
| 
       395 
     | 
    
         
            -
            end
         
     | 
| 
      
 419 
     | 
    
         
            +
            Micro::Attributes.with(:diff, initialize: :strict)
         
     | 
| 
       396 
420 
     | 
    
         | 
| 
       397 
     | 
    
         
            -
             
     | 
| 
       398 
     | 
    
         
            -
            # Loading all features #
         
     | 
| 
       399 
     | 
    
         
            -
            #         ---          #
         
     | 
| 
       400 
     | 
    
         
            -
            #======================#
         
     | 
| 
      
 421 
     | 
    
         
            +
            Micro::Attributes.with(:activemodel_validations)
         
     | 
| 
       401 
422 
     | 
    
         | 
| 
       402 
     | 
    
         
            -
             
     | 
| 
       403 
     | 
    
         
            -
              include Micro::Attributes.with_all_features
         
     | 
| 
      
 423 
     | 
    
         
            +
            Micro::Attributes.with(:activemodel_validations, :diff)
         
     | 
| 
       404 
424 
     | 
    
         | 
| 
       405 
     | 
    
         
            -
             
     | 
| 
       406 
     | 
    
         
            -
             
     | 
| 
       407 
     | 
    
         
            -
            end
         
     | 
| 
      
 425 
     | 
    
         
            +
            Micro::Attributes.with(:activemodel_validations, :diff, initialize: :strict)
         
     | 
| 
      
 426 
     | 
    
         
            +
            ```
         
     | 
| 
       408 
427 
     | 
    
         | 
| 
       409 
     | 
    
         
            -
             
     | 
| 
       410 
     | 
    
         
            -
            # Using the .with() method alias and adding the strict initialize extension. #
         
     | 
| 
       411 
     | 
    
         
            -
            #----------------------------------------------------------------------------#
         
     | 
| 
       412 
     | 
    
         
            -
            class Job
         
     | 
| 
       413 
     | 
    
         
            -
              include Micro::Attributes.with(:diff, initialize: :strict)
         
     | 
| 
      
 428 
     | 
    
         
            +
            The method `Micro::Attributes.with()` will raise an exception if no arguments/features were declared.
         
     | 
| 
       414 
429 
     | 
    
         | 
| 
       415 
     | 
    
         
            -
             
     | 
| 
       416 
     | 
    
         
            -
             
     | 
| 
      
 430 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 431 
     | 
    
         
            +
            class Job
         
     | 
| 
      
 432 
     | 
    
         
            +
              include Micro::Attributes.with() # ArgumentError (Invalid feature name! Available options: :activemodel_validations, :diff, :initialize)
         
     | 
| 
       417 
433 
     | 
    
         
             
            end
         
     | 
| 
      
 434 
     | 
    
         
            +
            ```
         
     | 
| 
       418 
435 
     | 
    
         | 
| 
       419 
     | 
    
         
            -
             
     | 
| 
       420 
     | 
    
         
            -
            # The method `Micro::Attributes.with()` will raise an exception if no arguments/features were declared.
         
     | 
| 
       421 
     | 
    
         
            -
            #
         
     | 
| 
       422 
     | 
    
         
            -
            # class Job
         
     | 
| 
       423 
     | 
    
         
            -
            #   include Micro::Attributes.with() # ArgumentError (Invalid feature name! Available options: diff, initialize, activemodel_validations)
         
     | 
| 
       424 
     | 
    
         
            -
            # end
         
     | 
| 
      
 436 
     | 
    
         
            +
            ### `Micro::Attributes.without`
         
     | 
| 
       425 
437 
     | 
    
         | 
| 
       426 
     | 
    
         
            -
             
     | 
| 
       427 
     | 
    
         
            -
            # Loading except one or more features #
         
     | 
| 
       428 
     | 
    
         
            -
            #         -----                       #
         
     | 
| 
       429 
     | 
    
         
            -
            #=====================================#
         
     | 
| 
      
 438 
     | 
    
         
            +
            Picking *except* one or more features
         
     | 
| 
       430 
439 
     | 
    
         | 
| 
       431 
     | 
    
         
            -
             
     | 
| 
       432 
     | 
    
         
            -
             
     | 
| 
      
 440 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 441 
     | 
    
         
            +
            Micro::Attributes.without(:diff) # will load :activemodel_validations and initialize: :strict
         
     | 
| 
       433 
442 
     | 
    
         | 
| 
       434 
     | 
    
         
            -
             
     | 
| 
       435 
     | 
    
         
            -
             
     | 
| 
       436 
     | 
    
         
            -
            end
         
     | 
| 
      
 443 
     | 
    
         
            +
            Micro::Attributes.without(initialize: :strict) # will load :activemodel_validations and :diff
         
     | 
| 
      
 444 
     | 
    
         
            +
            ```
         
     | 
| 
       437 
445 
     | 
    
         | 
| 
       438 
     | 
    
         
            -
             
     | 
| 
       439 
     | 
    
         
            -
             
     | 
| 
      
 446 
     | 
    
         
            +
            ## Picking all the features
         
     | 
| 
      
 447 
     | 
    
         
            +
             
     | 
| 
      
 448 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 449 
     | 
    
         
            +
            Micro::Attributes.with_all_features
         
     | 
| 
       440 
450 
     | 
    
         
             
            ```
         
     | 
| 
       441 
451 
     | 
    
         | 
| 
       442 
     | 
    
         
            -
             
     | 
| 
      
 452 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 453 
     | 
    
         
            +
             
     | 
| 
      
 454 
     | 
    
         
            +
            ## Extensions
         
     | 
| 
      
 455 
     | 
    
         
            +
             
     | 
| 
      
 456 
     | 
    
         
            +
            ### `ActiveModel::Validation` extension
         
     | 
| 
       443 
457 
     | 
    
         | 
| 
       444 
     | 
    
         
            -
            If your application uses ActiveModel as a dependency (like a regular Rails app). You will be enabled to use the ` 
     | 
| 
      
 458 
     | 
    
         
            +
            If your application uses ActiveModel as a dependency (like a regular Rails app). You will be enabled to use the `activemodel_validations` extension.
         
     | 
| 
       445 
459 
     | 
    
         | 
| 
       446 
460 
     | 
    
         
             
            ```ruby
         
     | 
| 
       447 
461 
     | 
    
         
             
            class Job
         
     | 
| 
         @@ -461,7 +475,7 @@ job.id    # 1 
     | 
|
| 
       461 
475 
     | 
    
         
             
            job.state # 'sleeping'
         
     | 
| 
       462 
476 
     | 
    
         
             
            ```
         
     | 
| 
       463 
477 
     | 
    
         | 
| 
       464 
     | 
    
         
            -
            ####  
     | 
| 
      
 478 
     | 
    
         
            +
            #### `.attribute()` options
         
     | 
| 
       465 
479 
     | 
    
         | 
| 
       466 
480 
     | 
    
         
             
            You can use the `validate` or `validates` options to define your attributes. e.g.
         
     | 
| 
       467 
481 
     | 
    
         | 
| 
         @@ -472,7 +486,7 @@ class Job 
     | 
|
| 
       472 
486 
     | 
    
         
             
              attribute :id, validates: { presence: true }
         
     | 
| 
       473 
487 
     | 
    
         
             
              attribute :state, validate: :must_be_a_filled_string
         
     | 
| 
       474 
488 
     | 
    
         | 
| 
       475 
     | 
    
         
            -
              def  
     | 
| 
      
 489 
     | 
    
         
            +
              def must_be_a_filled_string
         
     | 
| 
       476 
490 
     | 
    
         
             
                return if state.is_a?(String) && state.present?
         
     | 
| 
       477 
491 
     | 
    
         | 
| 
       478 
492 
     | 
    
         
             
                errors.add(:state, 'must be a filled string')
         
     | 
| 
         @@ -480,6 +494,8 @@ class Job 
     | 
|
| 
       480 
494 
     | 
    
         
             
            end
         
     | 
| 
       481 
495 
     | 
    
         
             
            ```
         
     | 
| 
       482 
496 
     | 
    
         | 
| 
      
 497 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 498 
     | 
    
         
            +
             
     | 
| 
       483 
499 
     | 
    
         
             
            ### Diff extension
         
     | 
| 
       484 
500 
     | 
    
         | 
| 
       485 
501 
     | 
    
         
             
            Provides a way to track changes in your object attributes.
         
     | 
| 
         @@ -529,6 +545,8 @@ job_changes.changed?(:state, from: 'sleeping', to: 'running') # true 
     | 
|
| 
       529 
545 
     | 
    
         
             
            job_changes.differences # {'state'=> {'from' => 'sleeping', 'to' => 'running'}}
         
     | 
| 
       530 
546 
     | 
    
         
             
            ```
         
     | 
| 
       531 
547 
     | 
    
         | 
| 
      
 548 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 549 
     | 
    
         
            +
             
     | 
| 
       532 
550 
     | 
    
         
             
            ### Initialize extension
         
     | 
| 
       533 
551 
     | 
    
         | 
| 
       534 
552 
     | 
    
         
             
            1. Creates a constructor to assign the attributes.
         
     | 
| 
         @@ -578,7 +596,9 @@ other_job.state       # killed 
     | 
|
| 
       578 
596 
     | 
    
         
             
            other_job.equal?(job) # false
         
     | 
| 
       579 
597 
     | 
    
         
             
            ```
         
     | 
| 
       580 
598 
     | 
    
         | 
| 
       581 
     | 
    
         
            -
             
     | 
| 
      
 599 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 600 
     | 
    
         
            +
             
     | 
| 
      
 601 
     | 
    
         
            +
            #### Strict mode
         
     | 
| 
       582 
602 
     | 
    
         | 
| 
       583 
603 
     | 
    
         
             
            1. Creates a constructor to assign the attributes.
         
     | 
| 
       584 
604 
     | 
    
         
             
            2. Adds methods to build new instances when some data was assigned.
         
     | 
| 
         @@ -616,20 +636,22 @@ job.state # 'sleeping' 
     | 
|
| 
       616 
636 
     | 
    
         | 
| 
       617 
637 
     | 
    
         
             
            > **Note**: This extension works like the `initialize` extension. So, look at its section to understand all of the other features.
         
     | 
| 
       618 
638 
     | 
    
         | 
| 
       619 
     | 
    
         
            -
             
     | 
| 
      
 639 
     | 
    
         
            +
            [⬆️ Back to Top](#table-of-contents-)
         
     | 
| 
      
 640 
     | 
    
         
            +
             
     | 
| 
      
 641 
     | 
    
         
            +
            # Development
         
     | 
| 
       620 
642 
     | 
    
         | 
| 
       621 
643 
     | 
    
         
             
            After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         
     | 
| 
       622 
644 
     | 
    
         | 
| 
       623 
645 
     | 
    
         
             
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         
     | 
| 
       624 
646 
     | 
    
         | 
| 
       625 
     | 
    
         
            -
             
     | 
| 
      
 647 
     | 
    
         
            +
            # Contributing
         
     | 
| 
       626 
648 
     | 
    
         | 
| 
       627 
649 
     | 
    
         
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/serradura/u-attributes. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
         
     | 
| 
       628 
650 
     | 
    
         | 
| 
       629 
     | 
    
         
            -
             
     | 
| 
      
 651 
     | 
    
         
            +
            # License
         
     | 
| 
       630 
652 
     | 
    
         | 
| 
       631 
653 
     | 
    
         
             
            The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
         
     | 
| 
       632 
654 
     | 
    
         | 
| 
       633 
     | 
    
         
            -
             
     | 
| 
      
 655 
     | 
    
         
            +
            # Code of Conduct
         
     | 
| 
       634 
656 
     | 
    
         | 
| 
       635 
     | 
    
         
            -
            Everyone interacting in the Micro::Attributes project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/serradura/u-attributes/blob/ 
     | 
| 
      
 657 
     | 
    
         
            +
            Everyone interacting in the Micro::Attributes project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/serradura/u-attributes/blob/main/CODE_OF_CONDUCT.md).
         
     | 
    
        data/lib/micro/attributes.rb
    CHANGED
    
    
    
        data/u-attributes.gemspec
    CHANGED
    
    | 
         @@ -9,8 +9,11 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       9 
9 
     | 
    
         
             
              spec.authors       = ['Rodrigo Serradura']
         
     | 
| 
       10 
10 
     | 
    
         
             
              spec.email         = ['rodrigo.serradura@gmail.com']
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
              spec.summary       = %q{ 
     | 
| 
       13 
     | 
    
         
            -
              spec.description   = 
     | 
| 
      
 12 
     | 
    
         
            +
              spec.summary       = %q{Create "immutable" objects. No setters, just getters!}
         
     | 
| 
      
 13 
     | 
    
         
            +
              spec.description   =
         
     | 
| 
      
 14 
     | 
    
         
            +
                "This gem allows you to define \"immutable\" objects, and your objects will have only getters and no setters. "\
         
     | 
| 
      
 15 
     | 
    
         
            +
                "So, if you change some object attribute, you will have a new object instance. " \
         
     | 
| 
      
 16 
     | 
    
         
            +
                "That is, you transform the object instead of modifying it."
         
     | 
| 
       14 
17 
     | 
    
         
             
              spec.homepage      = 'https://github.com/serradura/u-attributes'
         
     | 
| 
       15 
18 
     | 
    
         
             
              spec.license       = 'MIT'
         
     | 
| 
       16 
19 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: u-attributes
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 2.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 2.0.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Rodrigo Serradura
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020-08- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-08-21 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: kind
         
     | 
| 
         @@ -58,8 +58,10 @@ dependencies: 
     | 
|
| 
       58 
58 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       59 
59 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       60 
60 
     | 
    
         
             
                    version: '13.0'
         
     | 
| 
       61 
     | 
    
         
            -
            description: This gem allows  
     | 
| 
       62 
     | 
    
         
            -
               
     | 
| 
      
 61 
     | 
    
         
            +
            description: This gem allows you to define "immutable" objects, and your objects will
         
     | 
| 
      
 62 
     | 
    
         
            +
              have only getters and no setters. So, if you change some object attribute, you will
         
     | 
| 
      
 63 
     | 
    
         
            +
              have a new object instance. That is, you transform the object instead of modifying
         
     | 
| 
      
 64 
     | 
    
         
            +
              it.
         
     | 
| 
       63 
65 
     | 
    
         
             
            email:
         
     | 
| 
       64 
66 
     | 
    
         
             
            - rodrigo.serradura@gmail.com
         
     | 
| 
       65 
67 
     | 
    
         
             
            executables: []
         
     | 
| 
         @@ -112,5 +114,5 @@ requirements: [] 
     | 
|
| 
       112 
114 
     | 
    
         
             
            rubygems_version: 3.0.6
         
     | 
| 
       113 
115 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       114 
116 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       115 
     | 
    
         
            -
            summary:  
     | 
| 
      
 117 
     | 
    
         
            +
            summary: Create "immutable" objects. No setters, just getters!
         
     | 
| 
       116 
118 
     | 
    
         
             
            test_files: []
         
     |