poro_repository 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/poro_repository.rb +25 -10
- data/poro_repository.gemspec +1 -1
- data/spec/poro_repository_spec.rb +46 -0
- metadata +2 -2
data/lib/poro_repository.rb
CHANGED
@@ -34,18 +34,15 @@ class PoroRepository
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def load_record type, id
|
37
|
+
def load_record type, id, options={}
|
38
|
+
should_remember_record = options.has_key?(:remember) ? options[:remember] : @remember
|
39
|
+
should_load_boundary_records = options.has_key?(:load_boundary_records) ? options[:load_boundary_records] : true
|
38
40
|
record = previous_instantiated type, id
|
39
41
|
return record unless record.nil?
|
40
42
|
data = read_if_exists(record_path(type, id))
|
41
43
|
data && deserialise(data).tap do |record|
|
42
|
-
record
|
43
|
-
|
44
|
-
object = load_record token.original_type, token.original_id
|
45
|
-
record.instance_variable_set inst_var, object
|
46
|
-
end
|
47
|
-
end
|
48
|
-
remember_record record if @remember
|
44
|
+
load_boundary_records record, options if should_load_boundary_records
|
45
|
+
remember_record record if should_remember_record
|
49
46
|
end
|
50
47
|
end
|
51
48
|
|
@@ -72,14 +69,32 @@ class PoroRepository
|
|
72
69
|
forget_record record if @remember
|
73
70
|
end
|
74
71
|
|
75
|
-
def load_all type
|
72
|
+
def load_all type, load_record_options={}
|
76
73
|
all_ids_for_type(type).collect do |id|
|
77
|
-
load_record type, id
|
74
|
+
load_record type, id, load_record_options
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# @param type [String]
|
79
|
+
# @param field [Symbol]
|
80
|
+
# @return [Array]
|
81
|
+
def pluck type, field
|
82
|
+
load_all(type, :remember => false, :load_boundary_records => false).collect do |record|
|
83
|
+
record.send(field)
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
81
87
|
private
|
82
88
|
|
89
|
+
def load_boundary_records record, load_record_options
|
90
|
+
record.instance_variables.each do |inst_var|
|
91
|
+
if (token = record.instance_variable_get(inst_var)).is_a? BoundaryToken
|
92
|
+
object = load_record token.original_type, token.original_id, load_record_options
|
93
|
+
record.instance_variable_set inst_var, object
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
83
98
|
def open_for_write path, &block
|
84
99
|
FileUtils.mkdir_p File.dirname(path)
|
85
100
|
File.open path, 'w', &block
|
data/poro_repository.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "poro_repository"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.2.0"
|
7
7
|
s.authors = ["Joel Plane"]
|
8
8
|
s.email = ["joel.plane@gmail.com"]
|
9
9
|
s.homepage = "https://github.com/joelplane/poro_repository"
|
@@ -225,4 +225,50 @@ describe PoroRepository do
|
|
225
225
|
|
226
226
|
end
|
227
227
|
|
228
|
+
describe "#pluck" do
|
229
|
+
|
230
|
+
def new_repo_instance
|
231
|
+
PoroRepository.new("/tmp/test-poro-repository").tap do |repo|
|
232
|
+
repo.boundary :Invoice, :@contact
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
subject do
|
237
|
+
new_repo_instance
|
238
|
+
end
|
239
|
+
|
240
|
+
let(:contact) do
|
241
|
+
TestObject.new.tap do |o|
|
242
|
+
o.id = '234'
|
243
|
+
o.type = 'Contact'
|
244
|
+
o.name = 'John Smith'
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
let(:invoice) do
|
249
|
+
TestObject.new.tap do |o|
|
250
|
+
o.id = '345'
|
251
|
+
o.type = 'Invoice'
|
252
|
+
o.contact = contact
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# note: will not work if the specified field is a boundary.
|
257
|
+
it "extracts just the specified field" do
|
258
|
+
record_id = subject.save_record invoice
|
259
|
+
# Using a new instance of repo so we can call #previous_instantiated()
|
260
|
+
# to confirm that the contact record wasn't loaded along with the invoice.
|
261
|
+
# We must use a new repo instance to do this, since the contact record
|
262
|
+
# is already in memory in the first repo instance since that instance was
|
263
|
+
# used to save the Contact in the first place.
|
264
|
+
repo = new_repo_instance
|
265
|
+
repo.pluck('Invoice', :id).should == ['345']
|
266
|
+
# it shouldn't instantiate boundary objects
|
267
|
+
repo.send(:previous_instantiated, 'Contact', '234').should be_nil
|
268
|
+
# it shouldn't remember the records it instantiated, since they will be
|
269
|
+
# imcomplete without having loaded boundary objects.
|
270
|
+
repo.send(:previous_instantiated, 'Invoice', '345').should be_nil
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
228
274
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poro_repository
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|