datts_right 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
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