datts_right 0.0.20 → 0.0.21

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- datts_right (0.0.19)
4
+ datts_right (0.0.20)
5
5
  datts_right
6
6
  rails (>= 3.0.0)
7
7
 
data/README.textile CHANGED
@@ -15,238 +15,6 @@ h2. Why make this?
15
15
  ** Could not find by dynamic attribute straight with SQL, like so: @MyModel.find_by_dynamic_attribute_phone_which_is_dynamic("2398291308")@
16
16
  ** Had to add migrations to each model that you wanted to have dynamic attributes
17
17
 
18
- h2. Installation
19
-
20
- Create a migration:
21
-
22
- <pre>
23
- class CreateDynamicAttributes < ActiveRecord::Migration
24
- def self.up
25
- create_table(:dynamic_attributes) do |t|
26
- t.string :name, :null => false
27
- t.string :attr_key, :null => false
28
- t.string :object_type, :null => false
29
- t.string :attributable_type, :null => false
30
- t.integer :attributable_id, :null => false
31
- %w(integer string boolean text float).each do |type|
32
- t.send(type, "#{type}_value".to_sym)
33
- end
34
- end
35
-
36
- add_index "dynamic_attributes", ["attributable_id"], :name => "index_dynamic_attributes_on_attributable_id"
37
- add_index "dynamic_attributes", ["attributable_type"], :name => "index_dynamic_attributes_on_attributable_type"
38
- add_index "dynamic_attributes", ["attr_key"], :name => "index_dynamic_attributes_on_attr_key"
39
-
40
- create_table(:dynamic_attribute_definitions) do |t|
41
- t.text :definition
42
- t.string :attribute_defineable_type, :null => false
43
- t.integer :attribute_defineable_id, :null => false
44
- end
45
-
46
- add_index "dynamic_attribute_definitions", ["attribute_defineable_id"], :name => "index_dynamic_attribute_definitions_on_attribute_defineable_id"
47
- add_index "dynamic_attribute_definitions", ["attribute_defineable_type"], :name => "index_dynamic_attribute_definitions_on_attribute_defineable_type"
48
- end
49
-
50
- def self.down
51
- remove_index "dynamic_attribute_definitions", :name => "index_dynamic_attribute_definitions_on_attribute_defineable_id"
52
- remove_index "dynamic_attribute_definitions", :name => "index_dynamic_attribute_definitions_on_attribute_defineable_type"
53
-
54
- drop_table(:dynamic_attribute_definitions)
55
-
56
- remove_index "dynamic_attributes", :name => "index_dynamic_attributes_on_attr_key"
57
- remove_index "dynamic_attributes", :name => "index_dynamic_attributes_on_attributable_type"
58
- remove_index "dynamic_attributes", :name => "index_dynamic_attributes_on_attributable_id"
59
-
60
- drop_table(:dynamic_attributes)
61
- end
62
- end
63
- </pre>
64
-
65
- * *attr_key* the name of the dynamic attribute
66
- * *object_type* what type of value is saved. See "object_type":#object_type.
67
- * *attributable_id* and *attributable_type* are for the polymorphic association
68
- * *integer_value*, *string_value*, *boolean_value*, *text_value*, *float_value* are used to store the data. See "object_type":#object_type.
69
-
70
- Add this to your Gemfile:
71
-
72
- @gem 'datts_right'@
73
-
74
- Add this to the model that you want to have dynamic attributes:
75
-
76
- @has_dynamic_attributes@
77
-
78
- h2. Usage
79
-
80
- First, you should know _when_ to use it.
81
-
82
- * Definitely more expensive than normal attributes
83
- * Can easily complicate your app if overused
84
-
85
- Knowing that, read on...
86
-
87
- h3. Adding a dynamic attribute to a record
88
-
89
- pre. @user = User.create :name => "Roland Deschain"
90
- @user.add_dynamic_attribute(:age, "integer")
91
- @user.write_dynamic_attribute :age, 820
92
- @user.save
93
-
94
- h3. @instance.dynamic_attribute_details
95
-
96
- pre. @user.dynamic_attribute_details(:age) # Returns a dynamic attribute record, where you can access the following:
97
- @user.dynamic_attribute_details(:age).object_type # "integer"
98
- @user.dynamic_attribute_details(:age).value # 820
99
-
100
- h3. dynamic_attribute?(:some_attribute)
101
-
102
- Returns true or false
103
-
104
- h3. Dynamic find
105
-
106
- pre. User.find_by_dynamic_attribute_age(240) # returns the first user with that age
107
-
108
- You can also use:
109
-
110
- pre. find_all_by_dynamic_attribute
111
- find_last_by_dynamic_attribute
112
-
113
- h3. Mimicking ActiveRecord
114
-
115
- You can read and write the attributes directly:
116
-
117
- @page.age = 200 # here, age is a dynamic attribute
118
- @page.age # returns 200
119
-
120
- h3. Defining attributes
121
-
122
- If you want to define what attributes will exist, you can set an associated record to define what will attributes will automatically exist. Best explained by example:
123
-
124
- <pre>
125
- class Category < AR::Base
126
- has_dynamic_attributes :definition => true
127
- has_many :pages
128
- end
129
-
130
- class Page < AR::Base
131
- has_dynamic_attributes :of => :category
132
- belongs_to :category
133
- end
134
- </pre>
135
-
136
- pre. @category = Category.create
137
- @category.definition = {:price => {:object_type => "integer"}, :description => {:object_type => "text"}}
138
- @category.save
139
- @page = Page.create :category => category
140
- @page.price = 200
141
- @page.description = "hi there"
142
-
143
- What happened here was that for every definition in category, a dynamic attribute was created on every page that belongs to that category. These dynamic attributes are added to page after_create. That means if you change the definition of the category afterwards, then it won't affect the pages that already exist.
144
-
145
- The only thing that is *required* is @:price => {:object_type => "integer"}@ - you may add more information like: @:price => {:object_type => "integer", :name => "Price", :description => "How much this will cost."}@
146
-
147
- You can access all that other information this way:
148
-
149
- pre. @page.dynamic_attribute_details(:price).definer[:name] # "Price"
150
- @page.dynamic_attribute_details(:price).definer[:description] # "How much this will cost."
151
-
152
- h3. create_defitions!
153
-
154
- You can call @create_definitions!@ on a model if you later on add the ability for that model to be a definer. For example, if you first start your Category without @has_dynamic_attributes :definition => true@, then later on you install datts_right, and you want Category to have a definition, you first add @has_dynamic_attributes :definition => true@ to Category, then you call @Category.create_definitions!@
155
-
156
- h2. Stuff that make things faster
157
-
158
- The dynamic attributes are only actually saved when save is called on the record that has them.
159
-
160
- pre. @user.add_dynamic_attribute(:gunslinger, "boolean") # a column is already written on the "dynamic_attributes" table, with a null value.
161
- @user.add_dynamic_attribute(:middle_name, "string") # a column is already written on the "dynamic_attributes" table, with a null value.
162
- @user.write_dynamic_attribute :gunslinger, true # saves into memory
163
- @user.middle_name = "Unknown" # saves into memory
164
- @user.save # the respective dynamic attribute columns are written in the dynamic_attributes table
165
-
166
- h2. Structure of the dynamic_attributes table
167
-
168
- Although you probably shouldn't work with it directly, the dynamic_attributes table looks like this:
169
-
170
- pre. ActiveRecord::Base.connection.create_table(:dynamic_attributes) do |t|
171
- t.string :name, :null => false
172
- t.string :attr_key, :null => false
173
- t.string :object_type, :null => false
174
- t.string :attributable_type, :null => false
175
- t.integer :attributable_id, :null => false
176
- %w(integer string boolean text float).each do |type|
177
- t.send(type, "#{type}_value".to_sym)
178
- end
179
- end
180
-
181
- This means that depending on the type of dynamic attribute you're creating, things will get saved in the respective column in the dynamic_attributes table.
182
-
183
- pre. @user.add_dynamic_attribute(:gunslinger, "boolean")
184
- adds this to the dynamic_attributes table:
185
-
186
- pre. {
187
- :attr_key => "gunslinger",
188
- :attributable_id => [the user's id],
189
- :attributable_type => "User",
190
- :object_type => "boolean",
191
- :boolean_value => true
192
- }
193
-
194
- *Why have different value columns?* Because I couldn't find any other way to perform SQL operations/calculations on a generic "value" column. Besides, what kind of column would that be? A text blob?
195
-
196
- h2(#object_type). Dynamic attribute "type"
197
-
198
- Here are the different types of dynamic attributes you can save:
199
-
200
- * string
201
- * text
202
- * integer
203
- * float
204
- * boolean
205
-
206
- If you assign a value to a dynamic attribute that isn't the original type, it is ignored.
207
-
208
- pre. @user.write_dynamic_attribute :gunslinger, true
209
- @user.save
210
- @user.read_dynamic_attribute(:gunslinger) # true
211
- @user.write_dynamic_attribute :gunslinger, "hey there"
212
- @user.save
213
- @user.read_dynamic_attribute(:gunslinger) # true
214
-
215
- h2. Removing a dynamic attribute
216
-
217
- pre. @user.remove_dynamic_attribute(:gunslinger)
218
- @user.read_dynamic_attribute(:gunslinger) # NoMethodError
219
- @user.dynamic_columns # will not include :gunslinger => {...}
220
-
221
- h2. Ordering
222
-
223
- You can call
224
-
225
- pre. Product.order_by_dynamic_attribute("price", "float") # returns all users with their dynamic attribute "name" in ascending order
226
-
227
- Why pass the "float" in the order method? Because what if 2 different user records both have the dynamic attribute "price", but for one it's a float, and for the other it's an integer? How would you know which to order things by?
228
-
229
- h2. Where
230
-
231
- You can do:
232
-
233
- pre. Product.where_dynamic_attribute(:price => 200.0, :rating => 5)
234
-
235
- As of now it accepts a hash only. If you want to scope to normal attributes, use the normal @where@ method.
236
-
237
- h2. Shortcuts
238
-
239
- Pretty much all methods that have dynamic_attribute can be shorter:
240
-
241
- |_. Long name |_. Short name |
242
- | write_dynamic_attribute | write_datt |
243
- | read_dynamic_attribute | read_datt |
244
- | update_dynamic_attribute | update_datt |
245
- | update_dynamic_attributes | update_datts |
246
- | find_by_dynamic_attribute_ | find_by_datt_ |
247
- | order_by_dynamic_attribute | order_by_datt |
248
- | where_dynamic_attribute | where_datt |
249
-
250
18
  h2. Contributing to dynamic_attributes_right
251
19
 
252
20
  There are definitely things that don't work, and could be done better. For example, it would be nice to:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.20
1
+ 0.0.21
data/datts_right.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{datts_right}
8
- s.version = "0.0.20"
8
+ s.version = "0.0.21"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ramon Tayag"]
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
40
40
  "lib/datts_right/query_methods.rb",
41
41
  "spec/datt_spec.rb",
42
42
  "spec/datts_right/add_definition_spec.rb",
43
+ "spec/datts_right/add_definitions_spec.rb",
43
44
  "spec/datts_right/add_dynamic_attribute_spec.rb",
44
45
  "spec/datts_right/add_dynamic_attributes_spec.rb",
45
46
  "spec/datts_right/attributes_spec.rb",
@@ -50,6 +51,7 @@ Gem::Specification.new do |s|
50
51
  "spec/datts_right/inheritance_spec.rb",
51
52
  "spec/datts_right/read_dynamic_attribute_spec.rb",
52
53
  "spec/datts_right/remove_definition_spec.rb",
54
+ "spec/datts_right/remove_definitions_spec.rb",
53
55
  "spec/datts_right/remove_dynamic_attribute_spec.rb",
54
56
  "spec/datts_right/where_dynamic_attribute_spec.rb",
55
57
  "spec/datts_right_spec.rb",
@@ -63,6 +65,7 @@ Gem::Specification.new do |s|
63
65
  s.test_files = [
64
66
  "spec/datt_spec.rb",
65
67
  "spec/datts_right/add_definition_spec.rb",
68
+ "spec/datts_right/add_definitions_spec.rb",
66
69
  "spec/datts_right/add_dynamic_attribute_spec.rb",
67
70
  "spec/datts_right/add_dynamic_attributes_spec.rb",
68
71
  "spec/datts_right/attributes_spec.rb",
@@ -73,6 +76,7 @@ Gem::Specification.new do |s|
73
76
  "spec/datts_right/inheritance_spec.rb",
74
77
  "spec/datts_right/read_dynamic_attribute_spec.rb",
75
78
  "spec/datts_right/remove_definition_spec.rb",
79
+ "spec/datts_right/remove_definitions_spec.rb",
76
80
  "spec/datts_right/remove_dynamic_attribute_spec.rb",
77
81
  "spec/datts_right/where_dynamic_attribute_spec.rb",
78
82
  "spec/datts_right_spec.rb",
@@ -296,6 +300,12 @@ Gem::Specification.new do |s|
296
300
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
297
301
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
298
302
  s.add_development_dependency(%q<rcov>, [">= 0"])
303
+ s.add_development_dependency(%q<autotest>, [">= 0"])
304
+ s.add_development_dependency(%q<sqlite3>, [">= 0"])
305
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
306
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
307
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
308
+ s.add_development_dependency(%q<rcov>, [">= 0"])
299
309
  else
300
310
  s.add_dependency(%q<datts_right>, [">= 0"])
301
311
  s.add_dependency(%q<rails>, [">= 3.0.0"])
@@ -510,6 +520,12 @@ Gem::Specification.new do |s|
510
520
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
511
521
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
512
522
  s.add_dependency(%q<rcov>, [">= 0"])
523
+ s.add_dependency(%q<autotest>, [">= 0"])
524
+ s.add_dependency(%q<sqlite3>, [">= 0"])
525
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
526
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
527
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
528
+ s.add_dependency(%q<rcov>, [">= 0"])
513
529
  end
514
530
  else
515
531
  s.add_dependency(%q<datts_right>, [">= 0"])
@@ -725,6 +741,12 @@ Gem::Specification.new do |s|
725
741
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
726
742
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
727
743
  s.add_dependency(%q<rcov>, [">= 0"])
744
+ s.add_dependency(%q<autotest>, [">= 0"])
745
+ s.add_dependency(%q<sqlite3>, [">= 0"])
746
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
747
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
748
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
749
+ s.add_dependency(%q<rcov>, [">= 0"])
728
750
  end
729
751
  end
730
752
 
@@ -43,6 +43,8 @@ module DattsRight
43
43
  }
44
44
 
45
45
  scope :where_datt, lambda { |opts| where_dynamic_attribute(opts) }
46
+ scope :where_datts, lambda { |opts| where_dynamic_attribute(opts) }
47
+ scope :where_dynamic_attributes, lambda { |opts| where_dynamic_attribute(opts) }
46
48
  scope :where_dynamic_attribute, lambda { |opts|
47
49
  # TODO accept stuff other than the normal hash
48
50
  # Lifted from AR::Relation#build_where
@@ -132,6 +132,12 @@ module DattsRight
132
132
  end
133
133
  end
134
134
 
135
+ def add_definitions(hash)
136
+ hash.each do |k, v|
137
+ add_definition k, v
138
+ end
139
+ end
140
+
135
141
  def remove_definition(key)
136
142
  key = key.to_sym
137
143
  if dynamic_attributes_options[:definition]
@@ -145,6 +151,12 @@ module DattsRight
145
151
  end
146
152
  end
147
153
 
154
+ def remove_definitions(*array)
155
+ array.each do |a|
156
+ remove_definition a
157
+ end
158
+ end
159
+
148
160
  private
149
161
 
150
162
  # Called after validation on update so that dynamic attributes behave
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe DattsRight, ".add_definitions(hash)" do
4
+ before do
5
+ reset_database
6
+ end
7
+
8
+ it "should add a definition to the existing definition" do
9
+ c = Category.create
10
+ c.should_receive(:add_definition).with(:robot, :object_type => "text")
11
+ c.should_receive(:add_definition).with(:another, :object_type => "string")
12
+ c.add_definitions(:robot => {:object_type => "text"}, :another => {:object_type => "string"})
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe DattsRight, ".remove_definitions(array)" do
4
+ before do
5
+ reset_database
6
+ end
7
+
8
+ it "should add a definition to the existing definition" do
9
+ c = Category.create
10
+ c.should_receive(:remove_definition).with(:robot)
11
+ c.should_receive(:remove_definition).with(:another)
12
+ c.remove_definitions(:robot, :another)
13
+ end
14
+ end
@@ -12,6 +12,18 @@ describe DattsRight, ".where_dynamic_attribute" do
12
12
  Page.where_dynamic_attribute(:price => 200.0).should == Page.where_datt(:price => 200.0)
13
13
  end
14
14
 
15
+ it "should be aliased by where_datts" do
16
+ @page.add_dynamic_attribute(:price, "float")
17
+ @page.write_dynamic_attribute :price, 200.0
18
+ Page.where_dynamic_attribute(:price => 200.0).should == Page.where_datts(:price => 200.0)
19
+ end
20
+
21
+ it "should be aliased by where_dynamic_attributes" do
22
+ @page.add_dynamic_attribute(:price, "float")
23
+ @page.write_dynamic_attribute :price, 200.0
24
+ Page.where_dynamic_attribute(:price => 200.0).should == Page.where_dynamic_attributes(:price => 200.0)
25
+ end
26
+
15
27
  it "should automatically join in the dynamic_attributes table" do
16
28
  @page.add_dynamic_attribute(:price, "float")
17
29
  @page.write_dynamic_attribute :price, 200.0
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datts_right
3
3
  version: !ruby/object:Gem::Version
4
- hash: 55
4
+ hash: 53
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 20
10
- version: 0.0.20
9
+ - 21
10
+ version: 0.0.21
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ramon Tayag
@@ -3214,6 +3214,96 @@ dependencies:
3214
3214
  name: rcov
3215
3215
  version_requirements: *id213
3216
3216
  prerelease: false
3217
+ - !ruby/object:Gem::Dependency
3218
+ type: :development
3219
+ requirement: &id214 !ruby/object:Gem::Requirement
3220
+ none: false
3221
+ requirements:
3222
+ - - ">="
3223
+ - !ruby/object:Gem::Version
3224
+ hash: 3
3225
+ segments:
3226
+ - 0
3227
+ version: "0"
3228
+ name: autotest
3229
+ version_requirements: *id214
3230
+ prerelease: false
3231
+ - !ruby/object:Gem::Dependency
3232
+ type: :development
3233
+ requirement: &id215 !ruby/object:Gem::Requirement
3234
+ none: false
3235
+ requirements:
3236
+ - - ">="
3237
+ - !ruby/object:Gem::Version
3238
+ hash: 3
3239
+ segments:
3240
+ - 0
3241
+ version: "0"
3242
+ name: sqlite3
3243
+ version_requirements: *id215
3244
+ prerelease: false
3245
+ - !ruby/object:Gem::Dependency
3246
+ type: :development
3247
+ requirement: &id216 !ruby/object:Gem::Requirement
3248
+ none: false
3249
+ requirements:
3250
+ - - ~>
3251
+ - !ruby/object:Gem::Version
3252
+ hash: 3
3253
+ segments:
3254
+ - 2
3255
+ - 3
3256
+ - 0
3257
+ version: 2.3.0
3258
+ name: rspec
3259
+ version_requirements: *id216
3260
+ prerelease: false
3261
+ - !ruby/object:Gem::Dependency
3262
+ type: :development
3263
+ requirement: &id217 !ruby/object:Gem::Requirement
3264
+ none: false
3265
+ requirements:
3266
+ - - ~>
3267
+ - !ruby/object:Gem::Version
3268
+ hash: 23
3269
+ segments:
3270
+ - 1
3271
+ - 0
3272
+ - 0
3273
+ version: 1.0.0
3274
+ name: bundler
3275
+ version_requirements: *id217
3276
+ prerelease: false
3277
+ - !ruby/object:Gem::Dependency
3278
+ type: :development
3279
+ requirement: &id218 !ruby/object:Gem::Requirement
3280
+ none: false
3281
+ requirements:
3282
+ - - ~>
3283
+ - !ruby/object:Gem::Version
3284
+ hash: 7
3285
+ segments:
3286
+ - 1
3287
+ - 5
3288
+ - 2
3289
+ version: 1.5.2
3290
+ name: jeweler
3291
+ version_requirements: *id218
3292
+ prerelease: false
3293
+ - !ruby/object:Gem::Dependency
3294
+ type: :development
3295
+ requirement: &id219 !ruby/object:Gem::Requirement
3296
+ none: false
3297
+ requirements:
3298
+ - - ">="
3299
+ - !ruby/object:Gem::Version
3300
+ hash: 3
3301
+ segments:
3302
+ - 0
3303
+ version: "0"
3304
+ name: rcov
3305
+ version_requirements: *id219
3306
+ prerelease: false
3217
3307
  description: Creates a separate table that saves all your dynamic attributes.
3218
3308
  email: ramon@tayag.net
3219
3309
  executables: []
@@ -3247,6 +3337,7 @@ files:
3247
3337
  - lib/datts_right/query_methods.rb
3248
3338
  - spec/datt_spec.rb
3249
3339
  - spec/datts_right/add_definition_spec.rb
3340
+ - spec/datts_right/add_definitions_spec.rb
3250
3341
  - spec/datts_right/add_dynamic_attribute_spec.rb
3251
3342
  - spec/datts_right/add_dynamic_attributes_spec.rb
3252
3343
  - spec/datts_right/attributes_spec.rb
@@ -3257,6 +3348,7 @@ files:
3257
3348
  - spec/datts_right/inheritance_spec.rb
3258
3349
  - spec/datts_right/read_dynamic_attribute_spec.rb
3259
3350
  - spec/datts_right/remove_definition_spec.rb
3351
+ - spec/datts_right/remove_definitions_spec.rb
3260
3352
  - spec/datts_right/remove_dynamic_attribute_spec.rb
3261
3353
  - spec/datts_right/where_dynamic_attribute_spec.rb
3262
3354
  - spec/datts_right_spec.rb
@@ -3298,6 +3390,7 @@ summary: Allows saving of dynamic attributes in your ActiveRecord model
3298
3390
  test_files:
3299
3391
  - spec/datt_spec.rb
3300
3392
  - spec/datts_right/add_definition_spec.rb
3393
+ - spec/datts_right/add_definitions_spec.rb
3301
3394
  - spec/datts_right/add_dynamic_attribute_spec.rb
3302
3395
  - spec/datts_right/add_dynamic_attributes_spec.rb
3303
3396
  - spec/datts_right/attributes_spec.rb
@@ -3308,6 +3401,7 @@ test_files:
3308
3401
  - spec/datts_right/inheritance_spec.rb
3309
3402
  - spec/datts_right/read_dynamic_attribute_spec.rb
3310
3403
  - spec/datts_right/remove_definition_spec.rb
3404
+ - spec/datts_right/remove_definitions_spec.rb
3311
3405
  - spec/datts_right/remove_dynamic_attribute_spec.rb
3312
3406
  - spec/datts_right/where_dynamic_attribute_spec.rb
3313
3407
  - spec/datts_right_spec.rb