active_hash 1.2.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG +6 -0
- data/README.md +75 -14
- data/active_hash.gemspec +9 -64
- data/lib/active_file/base.rb +6 -1
- data/lib/active_file/hash_and_array_files.rb +24 -0
- data/lib/active_file/multiple_files.rb +33 -0
- data/lib/active_hash.rb +3 -0
- data/lib/active_hash/base.rb +19 -5
- data/lib/active_hash/version.rb +1 -1
- data/lib/active_json/base.rb +25 -0
- data/lib/active_yaml/base.rb +5 -5
- data/lib/associations/associations.rb +3 -3
- metadata +15 -99
- data/Gemfile +0 -3
- data/lib/util/ruby_engine.rb +0 -68
- data/lib/util/ruby_version.rb +0 -139
- data/spec/active_file/base_spec.rb +0 -131
- data/spec/active_hash/base_spec.rb +0 -1051
- data/spec/active_yaml/base_spec.rb +0 -119
- data/spec/associations/associations_spec.rb +0 -427
- data/spec/enum/enum_spec.rb +0 -101
- data/spec/lint_spec.rb +0 -36
- data/spec/spec_helper.rb +0 -8
@@ -1,119 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ActiveYaml::Base do
|
4
|
-
|
5
|
-
before do
|
6
|
-
ActiveYaml::Base.set_root_path File.expand_path(File.dirname(__FILE__) + "/../fixtures")
|
7
|
-
|
8
|
-
class ArrayRow < ActiveYaml::Base ; end
|
9
|
-
class City < ActiveYaml::Base ; end
|
10
|
-
class State < ActiveYaml::Base ; end
|
11
|
-
class ArrayProduct < ActiveYaml::Base ; end # Contain YAML aliases
|
12
|
-
class KeyProduct < ActiveYaml::Base ; end # Contain YAML aliases
|
13
|
-
end
|
14
|
-
|
15
|
-
after do
|
16
|
-
Object.send :remove_const, :ArrayRow
|
17
|
-
Object.send :remove_const, :City
|
18
|
-
Object.send :remove_const, :State
|
19
|
-
end
|
20
|
-
|
21
|
-
describe ".all" do
|
22
|
-
context "before the file is loaded" do
|
23
|
-
it "reads from the file" do
|
24
|
-
State.all.should_not be_empty
|
25
|
-
State.count.should > 0
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe ".where" do
|
31
|
-
context "before the file is loaded" do
|
32
|
-
it "reads from the file and filters by where statement" do
|
33
|
-
State.where(:name => 'Oregon').should_not be_empty
|
34
|
-
State.count.should > 0
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe ".delete_all" do
|
40
|
-
context "when called before .all" do
|
41
|
-
it "causes all to not load data" do
|
42
|
-
State.delete_all
|
43
|
-
State.all.should be_empty
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context "when called after .all" do
|
48
|
-
it "clears out the data" do
|
49
|
-
State.all.should_not be_empty
|
50
|
-
State.delete_all
|
51
|
-
State.all.should be_empty
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe ".raw_data" do
|
57
|
-
|
58
|
-
it "returns the raw hash data loaded from yaml hash-formatted files" do
|
59
|
-
City.raw_data.should be_kind_of(Hash)
|
60
|
-
City.raw_data.keys.should include("albany", "portland")
|
61
|
-
end
|
62
|
-
|
63
|
-
it "returns the raw array data loaded from yaml array-formatted files" do
|
64
|
-
ArrayRow.raw_data.should be_kind_of(Array)
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
describe ".load_file" do
|
70
|
-
|
71
|
-
describe "with array data" do
|
72
|
-
it "returns an array of hashes" do
|
73
|
-
ArrayRow.load_file.should be_kind_of(Array)
|
74
|
-
ArrayRow.load_file.should include({"name" => "Row 1", "id" => 1})
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "with hash data" do
|
79
|
-
it "returns an array of hashes" do
|
80
|
-
City.load_file.should be_kind_of(Array)
|
81
|
-
City.load_file.should include({"state" => :new_york, "name" => "Albany", "id" => 1})
|
82
|
-
City.reload
|
83
|
-
City.all.should include(City.new(:id => 1))
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
describe 'ID finders without reliance on a call to all, even with fields specified' do
|
90
|
-
|
91
|
-
before do
|
92
|
-
class City < ActiveYaml::Base
|
93
|
-
fields :id, :state, :name
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'returns a single city based on #find' do
|
98
|
-
City.find(1).name.should == 'Albany'
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'returns a single city based on find_by_id' do
|
102
|
-
City.find_by_id(1).name.should == 'Albany'
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
describe 'meta programmed finders and properties for fields that exist in the YAML' do
|
108
|
-
|
109
|
-
it 'should have a finder method for each property' do
|
110
|
-
City.find_by_state('Oregon').should_not be_nil
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'should have a find all method for each property' do
|
114
|
-
City.find_all_by_state('Oregon').should_not be_nil
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
@@ -1,427 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'active_record'
|
3
|
-
|
4
|
-
describe ActiveHash::Base, "associations" do
|
5
|
-
|
6
|
-
before do
|
7
|
-
class Country < ActiveRecord::Base
|
8
|
-
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
9
|
-
connection.create_table(:countries, :force => true) do |t|
|
10
|
-
t.string :name
|
11
|
-
end
|
12
|
-
extend ActiveHash::Associations::ActiveRecordExtensions
|
13
|
-
end
|
14
|
-
|
15
|
-
class School < ActiveRecord::Base
|
16
|
-
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
17
|
-
connection.create_table(:schools, :force => true) do |t|
|
18
|
-
t.integer :country_id
|
19
|
-
t.integer :city_id
|
20
|
-
end
|
21
|
-
extend ActiveHash::Associations::ActiveRecordExtensions
|
22
|
-
end
|
23
|
-
|
24
|
-
class City < ActiveHash::Base
|
25
|
-
include ActiveHash::Associations
|
26
|
-
end
|
27
|
-
|
28
|
-
class Author < ActiveHash::Base
|
29
|
-
include ActiveHash::Associations
|
30
|
-
end
|
31
|
-
|
32
|
-
class SchoolStatus < ActiveHash::Base
|
33
|
-
end
|
34
|
-
|
35
|
-
class Book < ActiveRecord::Base
|
36
|
-
establish_connection :adapter => "sqlite3", :database => ":memory:"
|
37
|
-
connection.create_table(:books, :force => true) do |t|
|
38
|
-
t.integer :author_id
|
39
|
-
t.integer :author_code
|
40
|
-
t.boolean :published
|
41
|
-
end
|
42
|
-
|
43
|
-
if Object.const_defined?(:ActiveModel)
|
44
|
-
scope( :published, proc { where(:published => true) })
|
45
|
-
else
|
46
|
-
named_scope :published, {:conditions => {:published => true}}
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
after do
|
52
|
-
Object.send :remove_const, :City
|
53
|
-
Object.send :remove_const, :Author
|
54
|
-
Object.send :remove_const, :Country
|
55
|
-
Object.send :remove_const, :School
|
56
|
-
Object.send :remove_const, :Book
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "#has_many" do
|
60
|
-
|
61
|
-
context "with ActiveRecord children" do
|
62
|
-
context "with default options" do
|
63
|
-
before do
|
64
|
-
@book_1 = Book.create! :author_id => 1, :published => true
|
65
|
-
@book_2 = Book.create! :author_id => 1, :published => false
|
66
|
-
@book_3 = Book.create! :author_id => 2, :published => true
|
67
|
-
Author.has_many :books
|
68
|
-
end
|
69
|
-
|
70
|
-
it "find the correct records" do
|
71
|
-
author = Author.create :id => 1
|
72
|
-
author.books.should == [@book_1, @book_2]
|
73
|
-
end
|
74
|
-
|
75
|
-
it "return a scope so that we can apply further scopes" do
|
76
|
-
author = Author.create :id => 1
|
77
|
-
author.books.published.should == [@book_1]
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context "with a primary_key option" do
|
82
|
-
before do
|
83
|
-
@book_1 = Book.create! :author_id => 1, :published => true
|
84
|
-
@book_2 = Book.create! :author_id => 2, :published => false
|
85
|
-
@book_3 = Book.create! :author_id => 2, :published => true
|
86
|
-
Author.field :book_identifier
|
87
|
-
Author.has_many :books, :primary_key => :book_identifier
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should find the correct records" do
|
91
|
-
author = Author.create :id => 1, :book_identifier => 2
|
92
|
-
author.books.should == [@book_2, @book_3]
|
93
|
-
end
|
94
|
-
|
95
|
-
it "return a scope so that we can apply further scopes" do
|
96
|
-
author = Author.create :id => 1, :book_identifier => 2
|
97
|
-
author.books.published.should == [@book_3]
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "with a foreign_key option" do
|
102
|
-
before do
|
103
|
-
@book_1 = Book.create! :author_code => 1, :published => true
|
104
|
-
@book_2 = Book.create! :author_code => 1, :published => false
|
105
|
-
@book_3 = Book.create! :author_code => 2, :published => true
|
106
|
-
Author.has_many :books, :foreign_key => :author_code
|
107
|
-
end
|
108
|
-
|
109
|
-
it "should find the correct records" do
|
110
|
-
author = Author.create :id => 1
|
111
|
-
author.books.should == [@book_1, @book_2]
|
112
|
-
end
|
113
|
-
|
114
|
-
it "return a scope so that we can apply further scopes" do
|
115
|
-
author = Author.create :id => 1
|
116
|
-
author.books.published.should == [@book_1]
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
it "only uses 1 query" do
|
121
|
-
Author.has_many :books
|
122
|
-
author = Author.create :id => 1
|
123
|
-
Book.should_receive(:find_by_sql)
|
124
|
-
author.books.to_a
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
context "with ActiveHash children" do
|
129
|
-
context "with default options" do
|
130
|
-
before do
|
131
|
-
Author.field :city_id
|
132
|
-
@included_author_1 = Author.create :city_id => 1
|
133
|
-
@included_author_2 = Author.create :city_id => 1
|
134
|
-
@excluded_author = Author.create :city_id => 2
|
135
|
-
end
|
136
|
-
|
137
|
-
it "find the correct records" do
|
138
|
-
City.has_many :authors
|
139
|
-
city = City.create :id => 1
|
140
|
-
city.authors.should == [@included_author_1, @included_author_2]
|
141
|
-
end
|
142
|
-
|
143
|
-
it "uses the correct class name when passed" do
|
144
|
-
City.has_many :writers, :class_name => "Author"
|
145
|
-
city = City.create :id => 1
|
146
|
-
city.writers.should == [@included_author_1, @included_author_2]
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
context "with a primary_key option" do
|
151
|
-
before do
|
152
|
-
Author.field :city_id
|
153
|
-
City.field :author_identifier
|
154
|
-
@author_1 = Author.create :city_id => 1
|
155
|
-
@author_2 = Author.create :city_id => 10
|
156
|
-
@author_3 = Author.create :city_id => 10
|
157
|
-
City.has_many :authors, :primary_key => :author_identifier
|
158
|
-
end
|
159
|
-
|
160
|
-
it "finds the correct records" do
|
161
|
-
city = City.create :id => 1, :author_identifier => 10
|
162
|
-
city.authors.should == [@author_2, @author_3]
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
context "with a foreign_key option" do
|
167
|
-
before do
|
168
|
-
Author.field :city_id
|
169
|
-
Author.field :city_identifier
|
170
|
-
@author_1 = Author.create :city_id => 1, :city_identifier => 10
|
171
|
-
@author_2 = Author.create :city_id => 10, :city_identifier => 10
|
172
|
-
@author_3 = Author.create :city_id => 10, :city_identifier => 5
|
173
|
-
City.has_many :authors, :foreign_key => :city_identifier
|
174
|
-
end
|
175
|
-
|
176
|
-
it "finds the correct records" do
|
177
|
-
city = City.create :id => 10
|
178
|
-
city.authors.should == [@author_1, @author_2]
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
end
|
184
|
-
|
185
|
-
describe ActiveHash::Associations::ActiveRecordExtensions do
|
186
|
-
|
187
|
-
describe "#belongs_to" do
|
188
|
-
|
189
|
-
if ActiveRecord::VERSION::MAJOR > 3
|
190
|
-
it "doesn't interfere with AR's procs in belongs_to methods" do
|
191
|
-
School.belongs_to :country, lambda{ where( ) }
|
192
|
-
school = School.new
|
193
|
-
country = Country.create!
|
194
|
-
school.country = country
|
195
|
-
school.country.should == country
|
196
|
-
school.country_id.should == country.id
|
197
|
-
school.save!
|
198
|
-
school.reload
|
199
|
-
school.reload.country_id.should == country.id
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
it "sets up an ActiveRecord association for non-ActiveHash objects" do
|
204
|
-
School.belongs_to :country
|
205
|
-
school = School.new
|
206
|
-
country = Country.create!
|
207
|
-
school.country = country
|
208
|
-
school.country.should == country
|
209
|
-
school.country_id.should == country.id
|
210
|
-
school.save!
|
211
|
-
school.reload
|
212
|
-
school.reload.country_id.should == country.id
|
213
|
-
end
|
214
|
-
|
215
|
-
it "calls through to belongs_to_active_hash if it's an ActiveHash object" do
|
216
|
-
School.belongs_to :city
|
217
|
-
city = City.create
|
218
|
-
school = School.create :city_id => city.id
|
219
|
-
school.city.should == city
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
describe "#belongs_to_active_hash" do
|
224
|
-
context "setting by id" do
|
225
|
-
it "finds the correct records" do
|
226
|
-
School.belongs_to_active_hash :city
|
227
|
-
city = City.create
|
228
|
-
school = School.create :city_id => city.id
|
229
|
-
school.city.should == city
|
230
|
-
end
|
231
|
-
|
232
|
-
it "returns nil when the record does not exist" do
|
233
|
-
School.belongs_to_active_hash :city
|
234
|
-
school = School.create! :city_id => nil
|
235
|
-
school.city.should be_nil
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
context "setting by association" do
|
240
|
-
it "finds the correct records" do
|
241
|
-
School.belongs_to_active_hash :city
|
242
|
-
city = City.create
|
243
|
-
school = School.create :city => city
|
244
|
-
school.city.should == city
|
245
|
-
end
|
246
|
-
|
247
|
-
it "is assignable by name attribute" do
|
248
|
-
School.belongs_to_active_hash :city, :shortcuts => [:name]
|
249
|
-
City.data = [ {:id => 1, :name => 'gothan'} ]
|
250
|
-
city = City.find_by_name 'gothan'
|
251
|
-
school = School.create :city_name => 'gothan'
|
252
|
-
school.city.should == city
|
253
|
-
school.city_name.should == 'gothan'
|
254
|
-
end
|
255
|
-
|
256
|
-
it "have custom shortcut" do
|
257
|
-
School.belongs_to_active_hash :city, :shortcuts => :friendly_name
|
258
|
-
City.data = [ {:id => 1, :friendly_name => 'Gothan City'} ]
|
259
|
-
city = City.find_by_friendly_name 'Gothan City'
|
260
|
-
school = School.create :city_friendly_name => 'Gothan City'
|
261
|
-
school.city.should == city
|
262
|
-
school.city_friendly_name.should == 'Gothan City'
|
263
|
-
end
|
264
|
-
|
265
|
-
it "returns nil when the record does not exist" do
|
266
|
-
School.belongs_to_active_hash :city
|
267
|
-
school = School.create! :city => nil
|
268
|
-
school.city.should be_nil
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
it "finds active record metadata for this association" do
|
273
|
-
School.belongs_to_active_hash :city
|
274
|
-
association = School.reflect_on_association(:city)
|
275
|
-
association.should_not be_nil
|
276
|
-
association.klass.name.should == City.name
|
277
|
-
end
|
278
|
-
|
279
|
-
it "handles classes ending with an 's'" do
|
280
|
-
School.belongs_to_active_hash :school_status
|
281
|
-
association = School.reflect_on_association(:school_status)
|
282
|
-
association.should_not be_nil
|
283
|
-
association.klass.name.should == SchoolStatus.name
|
284
|
-
end
|
285
|
-
|
286
|
-
it "handles custom association names" do
|
287
|
-
School.belongs_to_active_hash :status, :class_name => 'SchoolStatus'
|
288
|
-
association = School.reflect_on_association(:status)
|
289
|
-
association.should_not be_nil
|
290
|
-
association.klass.name.should == SchoolStatus.name
|
291
|
-
end
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
describe "#belongs_to" do
|
296
|
-
|
297
|
-
context "with an ActiveRecord parent" do
|
298
|
-
it "find the correct records" do
|
299
|
-
City.belongs_to :country
|
300
|
-
country = Country.create
|
301
|
-
city = City.create :country_id => country.id
|
302
|
-
city.country.should == country
|
303
|
-
end
|
304
|
-
|
305
|
-
it "returns nil when the record does not exist" do
|
306
|
-
City.belongs_to :country
|
307
|
-
city = City.create :country_id => 123
|
308
|
-
city.country.should be_nil
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
312
|
-
context "with an ActiveHash parent" do
|
313
|
-
it "find the correct records" do
|
314
|
-
Author.belongs_to :city
|
315
|
-
city = City.create
|
316
|
-
author = Author.create :city_id => city.id
|
317
|
-
author.city.should == city
|
318
|
-
end
|
319
|
-
|
320
|
-
it "returns nil when the record does not exist" do
|
321
|
-
Author.belongs_to :city
|
322
|
-
author = Author.create :city_id => 123
|
323
|
-
author.city.should be_nil
|
324
|
-
end
|
325
|
-
end
|
326
|
-
|
327
|
-
describe "#parent=" do
|
328
|
-
before do
|
329
|
-
Author.belongs_to :city
|
330
|
-
@city = City.create :id => 1
|
331
|
-
end
|
332
|
-
|
333
|
-
it "sets the underlying id of the parent" do
|
334
|
-
author = Author.new
|
335
|
-
author.city = @city
|
336
|
-
author.city_id.should == @city.id
|
337
|
-
end
|
338
|
-
|
339
|
-
it "works from hash assignment" do
|
340
|
-
author = Author.new :city => @city
|
341
|
-
author.city_id.should == @city.id
|
342
|
-
author.city.should == @city
|
343
|
-
end
|
344
|
-
|
345
|
-
it "works with nil" do
|
346
|
-
author = Author.new :city => @city
|
347
|
-
author.city_id.should == @city.id
|
348
|
-
author.city.should == @city
|
349
|
-
|
350
|
-
author.city = nil
|
351
|
-
author.city_id.should be_nil
|
352
|
-
author.city.should be_nil
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
describe "with a different foreign key" do
|
357
|
-
before do
|
358
|
-
Author.belongs_to :residence, :class_name => "City", :foreign_key => "city_id"
|
359
|
-
@city = City.create :id => 1
|
360
|
-
end
|
361
|
-
|
362
|
-
it "works" do
|
363
|
-
author = Author.new
|
364
|
-
author.residence = @city
|
365
|
-
author.city_id.should == @city.id
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
describe "with a different primary key" do
|
370
|
-
before do
|
371
|
-
City.field :long_identifier
|
372
|
-
Author.belongs_to :city, :primary_key => "long_identifier"
|
373
|
-
@city = City.create :id => 1, :long_identifier => "123"
|
374
|
-
end
|
375
|
-
|
376
|
-
it "works" do
|
377
|
-
author = Author.new
|
378
|
-
author.city = @city
|
379
|
-
author.city_id.should == @city.long_identifier
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
describe "#has_one" do
|
385
|
-
context "with ActiveRecord children" do
|
386
|
-
before do
|
387
|
-
Author.has_one :book
|
388
|
-
end
|
389
|
-
|
390
|
-
it "find the correct records" do
|
391
|
-
book = Book.create! :author_id => 1, :published => true
|
392
|
-
author = Author.create :id => 1
|
393
|
-
author.book.should == book
|
394
|
-
end
|
395
|
-
|
396
|
-
it "returns nil when there is no record" do
|
397
|
-
author = Author.create :id => 1
|
398
|
-
author.book.should be_nil
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
context "with ActiveHash children" do
|
403
|
-
before do
|
404
|
-
City.has_one :author
|
405
|
-
Author.field :city_id
|
406
|
-
end
|
407
|
-
|
408
|
-
it "find the correct records" do
|
409
|
-
city = City.create :id => 1
|
410
|
-
author = Author.create :city_id => 1
|
411
|
-
city.author.should == author
|
412
|
-
end
|
413
|
-
|
414
|
-
it "returns nil when there are no records" do
|
415
|
-
city = City.create :id => 1
|
416
|
-
city.author.should be_nil
|
417
|
-
end
|
418
|
-
end
|
419
|
-
end
|
420
|
-
|
421
|
-
describe "#marked_for_destruction?" do
|
422
|
-
it "should return false" do
|
423
|
-
City.new.marked_for_destruction?.should == false
|
424
|
-
end
|
425
|
-
end
|
426
|
-
|
427
|
-
end
|