perpetuity-memory 0.1.1 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca9f272273107e89f3ecac8937d20ccf945707e9
4
- data.tar.gz: c74fd2ac60046eeaf97b8ffe523010da30616e86
3
+ metadata.gz: 2b6a27a63d63bec0a710cbb16bf011a2ecfb72e4
4
+ data.tar.gz: f52a34142f093b8d0dd0bc736d9c60ea5f2fd010
5
5
  SHA512:
6
- metadata.gz: e31010b928e5ba96b9f4c6e4df201c78742fb5b66f0a6926588fb0a8149cd62aa663b1ba380c23abc356763c2b0bb27d575178babc8fabf5eec7589c415ac7cc
7
- data.tar.gz: 16d030e599d7e18f149e6a818c64ed82fa356e2feb1ed0ff4b352a04f0c9d5d3a8ad781503728c5bdc2c290df666028e889fd4ad34f3d09c7a68b3add67135c0
6
+ metadata.gz: 14e35879db317de4749ef77d02943e61fd9205f597bf0e28ba4096d9bfe3aecada518dec903b7de24e928cf30fb3f19c5ccabcac61cce029c4d2003b4c90bd1d
7
+ data.tar.gz: 384fdef9534a665575810c9d94e1c6729c2efe8473695848f70dcfb4d1464e1dfeaa0e026b37693431e36c62b54b56408d8c5e02104b83206c7e45cb55d8c47a
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Perpetuity::Memory
2
2
 
3
- This is the in-memory adapter for Perpetuity.
3
+ This is the in-memory adapter for the [Perpetuity](https://github.com/jgaskins/perpetuity) ORM.
4
4
 
5
5
  ## Installation
6
6
 
@@ -27,6 +27,12 @@ Perpetuity.data_source :memory
27
27
 
28
28
  For information on using Perpetuity to persist your Ruby objects, see the [main Perpetuity repo](https://github.com/jgaskins/perpetuity).
29
29
 
30
+ ## TODO
31
+
32
+ * Make sure update works.
33
+ * Make sure save works.
34
+ * Make sure identity map works properly.
35
+
30
36
  ## Contributing
31
37
 
32
38
  1. Fork it
@@ -11,32 +11,22 @@ module Perpetuity
11
11
  @indexes = Hash.new
12
12
  end
13
13
 
14
- def insert klass, attributes, _
15
- if attributes.is_a? Array
16
- return attributes.map{|attr| insert(klass, attr, _)}
14
+ def insert klass, object, _
15
+ if object.is_a? Array
16
+ return object.map{|obj| insert(klass, obj, _)}
17
17
  end
18
18
 
19
- unless attributes.has_key? :id
20
- attributes[:id] = SecureRandom.uuid
21
- end
22
-
23
- # make keys indifferent
24
- attributes.default_proc = proc do |h, k|
25
- case k
26
- when String then sym = k.to_sym; h[sym] if h.key?(sym)
27
- when Symbol then str = k.to_s; h[str] if h.key?(str)
28
- end
29
- end
19
+ id = get_id(object) || set_id(object, SecureRandom.uuid)
30
20
 
31
- collection(klass) << attributes
32
- attributes[:id]
21
+ collection(klass)[id] = object
22
+ id
33
23
  end
34
24
 
35
25
  def count klass, criteria=nil, &block
36
26
  if block_given?
37
- collection(klass).select(&block).size
27
+ collection(klass).values.select(&block).size
38
28
  elsif criteria
39
- collection(klass).select(&criteria).size
29
+ collection(klass).values.select(&criteria).size
40
30
  else
41
31
  collection(klass).size
42
32
  end
@@ -47,19 +37,19 @@ module Perpetuity
47
37
  end
48
38
 
49
39
  def first klass
50
- collection(klass).first
40
+ all(klass).first
51
41
  end
52
42
 
53
43
  def find klass, id
54
- collection(klass).find{|o| o[:id] = id}
44
+ collection(klass)[id]
55
45
  end
56
46
 
57
47
  def retrieve klass, criteria, options = {}
58
- collection(klass).find_all(&criteria)
48
+ collection(klass).values.find_all(&criteria)
59
49
  end
60
50
 
61
51
  def all klass
62
- collection(klass)
52
+ collection(klass).values
63
53
  end
64
54
 
65
55
  def delete object, klass=nil
@@ -90,11 +80,11 @@ module Perpetuity
90
80
  end
91
81
 
92
82
  def serialize object, mapper
93
- Marshal.dump(object)
83
+ object.dup
94
84
  end
95
85
 
96
86
  def unserialize data, mapper
97
- Marshal.load(data)
87
+ data.dup
98
88
  end
99
89
 
100
90
 
@@ -124,8 +114,35 @@ module Perpetuity
124
114
  protected
125
115
 
126
116
  def collection klass
127
- @cache[klass] = Array.new unless @cache.key? klass
117
+ @cache[klass] = Hash.new unless @cache.has_key? klass
128
118
  @cache[klass]
129
119
  end
120
+
121
+ def get_id(object)
122
+ if object.respond_to?(:id)
123
+ object.id
124
+ elsif object.respond_to?(:fetch)
125
+ object.fetch(:id, nil)
126
+ elsif object.respond_to?(:[])
127
+ object[:id] || nil
128
+ else
129
+ object.instance_variable_get(:@id)
130
+ end
131
+ end
132
+
133
+ def set_id(object, id)
134
+ if object.respond_to?(:id=)
135
+ object.id = id
136
+ elsif object.respond_to?(:[]=)
137
+ object[:id] = id
138
+ else
139
+ object.instance_variable_set(:@id, id)
140
+ end
141
+ id
142
+ end
130
143
  end
131
144
  end
145
+
146
+
147
+ # Register the adapter with Perpetuity.
148
+ Perpetuity::Configuration.adapters[:memory] = 'Perpetuity::Memory'
@@ -1,5 +1,5 @@
1
1
  module Perpetuity
2
2
  module Memory
3
- VERSION = "0.1.1"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -0,0 +1,42 @@
1
+ require_relative '../../lib/perpetuity/memory'
2
+
3
+ describe 'Full Perpetuity stack using in-memory adapter' do
4
+
5
+ before do
6
+ Perpetuity.data_source :memory
7
+ class User
8
+ attr_reader :name, :age
9
+ def initialize(name, age)
10
+ @name = name
11
+ @age = age
12
+ end
13
+ end
14
+ Perpetuity.generate_mapper_for(User) do
15
+ attribute :name
16
+ attribute :age
17
+ end
18
+ end
19
+
20
+ let(:mapper) { Perpetuity[User] }
21
+ let(:user) { User.new(name, age) }
22
+ let(:name) { 'Craig' }
23
+ let(:age) { 43 }
24
+
25
+ it 'can store an object' do
26
+ mapper.insert(user)
27
+ expect(mapper.count).to eq(1)
28
+ end
29
+
30
+ it 'can retrieve a stored object by ID' do
31
+ id = mapper.insert(user)
32
+ expect(mapper.count).to eq(1)
33
+ expect(mapper.find(id).name).to eq(name)
34
+ expect(mapper.find(id).age).to eq(age)
35
+ end
36
+
37
+ it 'can retrieve a stored object by attribute' do
38
+ mapper.insert(user)
39
+ expect(mapper.count).to eq(1)
40
+ expect(mapper.find{|u| u.name == 'Craig'}.age).to eq(age)
41
+ end
42
+ end
@@ -38,7 +38,7 @@ module Perpetuity
38
38
  it 'gets the first object' do
39
39
  value = {value: 1}
40
40
  subject.insert klass, value, []
41
- subject.first(klass)[:value].should == value['value']
41
+ subject.first(klass)[:value].should == value[:value]
42
42
  end
43
43
 
44
44
  it 'gets all objects' do
@@ -47,12 +47,12 @@ module Perpetuity
47
47
  subject.all(klass).should == values
48
48
  end
49
49
 
50
- it 'retrieves by ID if the ID is a string' do
50
+ it 'retrieves by ID' do
51
51
  time = Time.now.utc
52
52
  id = subject.insert Object, {inserted: time}, []
53
53
 
54
- object = subject.retrieve(Object, subject.query{|o| o[:id] == id.to_s }).first
55
- retrieved_time = object["inserted"]
54
+ object = subject.find(Object, id)
55
+ retrieved_time = object[:inserted]
56
56
  retrieved_time.to_f.should be_within(0.001).of time.to_f
57
57
  end
58
58
 
@@ -74,9 +74,9 @@ module Perpetuity
74
74
  subject.increment klass, id, :count
75
75
  subject.increment klass, id, :count, 10
76
76
  query = subject.query { |o| o[:id] == id }
77
- subject.retrieve(klass, query).first['count'].should be == 12
77
+ subject.retrieve(klass, query).first[:count].should be == 12
78
78
  subject.increment klass, id, :count, -1
79
- subject.retrieve(klass, query).first['count'].should be == 11
79
+ subject.retrieve(klass, query).first[:count].should be == 11
80
80
  end
81
81
  end
82
82
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perpetuity-memory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Gaskins
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-01-11 00:00:00.000000000 Z
13
+ date: 2014-01-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -83,6 +83,7 @@ files:
83
83
  - lib/perpetuity/memory.rb
84
84
  - lib/perpetuity/memory/version.rb
85
85
  - perpetuity-memory.gemspec
86
+ - spec/perpetuity/integration_spec.rb
86
87
  - spec/perpetuity/memory_spec.rb
87
88
  homepage: https://github.com/boochtek/perpetuity-memory
88
89
  licenses:
@@ -109,4 +110,5 @@ signing_key:
109
110
  specification_version: 4
110
111
  summary: In-memory adapter for Perpetuity
111
112
  test_files:
113
+ - spec/perpetuity/integration_spec.rb
112
114
  - spec/perpetuity/memory_spec.rb