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 +1 -1
- data/README.textile +0 -232
- data/VERSION +1 -1
- data/datts_right.gemspec +23 -1
- data/lib/datts_right/base.rb +2 -0
- data/lib/datts_right/instance_methods.rb +12 -0
- data/spec/datts_right/add_definitions_spec.rb +14 -0
- data/spec/datts_right/remove_definitions_spec.rb +14 -0
- data/spec/datts_right/where_dynamic_attribute_spec.rb +12 -0
- metadata +97 -3
data/Gemfile.lock
CHANGED
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.
|
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.
|
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
|
|
data/lib/datts_right/base.rb
CHANGED
@@ -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:
|
4
|
+
hash: 53
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
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
|