active_hash 0.9.10 → 0.9.11
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/CHANGELOG +6 -0
- data/active_hash.gemspec +2 -1
- data/lib/active_hash/base.rb +29 -0
- data/lib/active_hash/version.rb +1 -1
- data/spec/active_hash/base_spec.rb +11 -1
- metadata +89 -92
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
2012-07-16
|
|
2
|
+
- Validate IDs are unique by caching them in a set (desmondmonster)
|
|
3
|
+
|
|
4
|
+
2012-04-14
|
|
5
|
+
- Support for has_one associations (kbrock)
|
|
6
|
+
|
|
1
7
|
2012-04-05
|
|
2
8
|
- Allow gems like simple_form to read metadata about belongs_to associations that point to active hash objects (kbrock)
|
|
3
9
|
|
data/active_hash.gemspec
CHANGED
data/lib/active_hash/base.rb
CHANGED
|
@@ -6,8 +6,13 @@ module ActiveHash
|
|
|
6
6
|
class ReservedFieldError < StandardError
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
class IdError < StandardError
|
|
10
|
+
end
|
|
11
|
+
|
|
9
12
|
class Base
|
|
10
13
|
|
|
14
|
+
require 'set'
|
|
15
|
+
|
|
11
16
|
if respond_to?(:class_attribute)
|
|
12
17
|
class_attribute :_data, :dirty
|
|
13
18
|
else
|
|
@@ -54,6 +59,7 @@ module ActiveHash
|
|
|
54
59
|
def data=(array_of_hashes)
|
|
55
60
|
mark_dirty
|
|
56
61
|
@records = nil
|
|
62
|
+
reset_ids
|
|
57
63
|
self._data = array_of_hashes
|
|
58
64
|
if array_of_hashes
|
|
59
65
|
auto_assign_fields(array_of_hashes)
|
|
@@ -66,7 +72,10 @@ module ActiveHash
|
|
|
66
72
|
def insert(record)
|
|
67
73
|
@records ||= []
|
|
68
74
|
record.attributes[:id] ||= next_id
|
|
75
|
+
validate_unique_id(record) if dirty
|
|
69
76
|
mark_dirty
|
|
77
|
+
|
|
78
|
+
ids << record.id
|
|
70
79
|
@records << record
|
|
71
80
|
end
|
|
72
81
|
|
|
@@ -79,6 +88,24 @@ module ActiveHash
|
|
|
79
88
|
end
|
|
80
89
|
end
|
|
81
90
|
|
|
91
|
+
def ids
|
|
92
|
+
@ids ||= Set.new
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private :ids
|
|
96
|
+
|
|
97
|
+
def reset_ids
|
|
98
|
+
ids.clear
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
private :reset_ids
|
|
102
|
+
|
|
103
|
+
def validate_unique_id(record)
|
|
104
|
+
raise IdError.new("Duplicate Id found for record #{record.attributes}") if ids.include?(record.id)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
private :validate_unique_id
|
|
108
|
+
|
|
82
109
|
def create(attributes = {})
|
|
83
110
|
record = new(attributes)
|
|
84
111
|
record.save
|
|
@@ -121,6 +148,7 @@ module ActiveHash
|
|
|
121
148
|
|
|
122
149
|
def delete_all
|
|
123
150
|
mark_dirty
|
|
151
|
+
reset_ids
|
|
124
152
|
@records = []
|
|
125
153
|
end
|
|
126
154
|
|
|
@@ -298,6 +326,7 @@ module ActiveHash
|
|
|
298
326
|
end
|
|
299
327
|
|
|
300
328
|
def reload
|
|
329
|
+
reset_ids
|
|
301
330
|
self.data = _data
|
|
302
331
|
mark_clean
|
|
303
332
|
end
|
data/lib/active_hash/version.rb
CHANGED
|
@@ -198,7 +198,7 @@ describe ActiveHash, "Base" do
|
|
|
198
198
|
Country.data = [
|
|
199
199
|
{:id => 1, :name => "US", :language => 'English'},
|
|
200
200
|
{:id => 2, :name => "Canada", :language => 'English'},
|
|
201
|
-
{:id =>
|
|
201
|
+
{:id => 3, :name => "Mexico", :language => 'Spanish'}
|
|
202
202
|
]
|
|
203
203
|
end
|
|
204
204
|
|
|
@@ -236,6 +236,16 @@ describe ActiveHash, "Base" do
|
|
|
236
236
|
record.first.id.should == 1
|
|
237
237
|
record.first.name.should == 'US'
|
|
238
238
|
end
|
|
239
|
+
|
|
240
|
+
it "raises an error if ids aren't unique" do
|
|
241
|
+
proc do
|
|
242
|
+
Country.data = [
|
|
243
|
+
{:id => 1, :name => "US", :language => 'English'},
|
|
244
|
+
{:id => 2, :name => "Canada", :language => 'English'},
|
|
245
|
+
{:id => 2, :name => "Mexico", :language => 'Spanish'}
|
|
246
|
+
]
|
|
247
|
+
end.should raise_error(ActiveHash::IdError)
|
|
248
|
+
end
|
|
239
249
|
end
|
|
240
250
|
|
|
241
251
|
describe ".count" do
|
metadata
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: active_hash
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
- 0
|
|
7
|
-
- 9
|
|
8
|
-
- 10
|
|
9
|
-
version: 0.9.10
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.9.11
|
|
5
|
+
prerelease:
|
|
10
6
|
platform: ruby
|
|
11
|
-
authors:
|
|
7
|
+
authors:
|
|
12
8
|
- Jeff Dean
|
|
13
9
|
- Mike Dalessio
|
|
14
10
|
- Corey Innis
|
|
@@ -26,105 +22,111 @@ authors:
|
|
|
26
22
|
- Vladimir Andrijevik
|
|
27
23
|
- Adam Anderson
|
|
28
24
|
- Keenan Brock
|
|
25
|
+
- Desmond Bowe
|
|
29
26
|
autorequire:
|
|
30
27
|
bindir: bin
|
|
31
28
|
cert_chain: []
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
dependencies:
|
|
36
|
-
- !ruby/object:Gem::Dependency
|
|
29
|
+
date: 2012-01-18 00:00:00.000000000 Z
|
|
30
|
+
dependencies:
|
|
31
|
+
- !ruby/object:Gem::Dependency
|
|
37
32
|
name: activesupport
|
|
38
|
-
|
|
39
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
|
40
34
|
none: false
|
|
41
|
-
requirements:
|
|
42
|
-
- -
|
|
43
|
-
- !ruby/object:Gem::Version
|
|
44
|
-
segments:
|
|
45
|
-
- 2
|
|
46
|
-
- 2
|
|
47
|
-
- 2
|
|
35
|
+
requirements:
|
|
36
|
+
- - ! '>='
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
48
38
|
version: 2.2.2
|
|
49
39
|
type: :runtime
|
|
50
|
-
version_requirements: *id001
|
|
51
|
-
- !ruby/object:Gem::Dependency
|
|
52
|
-
name: rspec
|
|
53
40
|
prerelease: false
|
|
54
|
-
|
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
55
42
|
none: false
|
|
56
|
-
requirements:
|
|
43
|
+
requirements:
|
|
44
|
+
- - ! '>='
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 2.2.2
|
|
47
|
+
- !ruby/object:Gem::Dependency
|
|
48
|
+
name: rspec
|
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
|
50
|
+
none: false
|
|
51
|
+
requirements:
|
|
57
52
|
- - ~>
|
|
58
|
-
- !ruby/object:Gem::Version
|
|
59
|
-
segments:
|
|
60
|
-
- 2
|
|
61
|
-
- 2
|
|
62
|
-
- 0
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
63
54
|
version: 2.2.0
|
|
64
55
|
type: :development
|
|
65
|
-
version_requirements: *id002
|
|
66
|
-
- !ruby/object:Gem::Dependency
|
|
67
|
-
name: sqlite3
|
|
68
56
|
prerelease: false
|
|
69
|
-
|
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
70
58
|
none: false
|
|
71
|
-
requirements:
|
|
72
|
-
- -
|
|
73
|
-
- !ruby/object:Gem::Version
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
59
|
+
requirements:
|
|
60
|
+
- - ~>
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: 2.2.0
|
|
63
|
+
- !ruby/object:Gem::Dependency
|
|
64
|
+
name: sqlite3
|
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
|
66
|
+
none: false
|
|
67
|
+
requirements:
|
|
68
|
+
- - ! '>='
|
|
69
|
+
- !ruby/object:Gem::Version
|
|
70
|
+
version: '0'
|
|
77
71
|
type: :development
|
|
78
|
-
version_requirements: *id003
|
|
79
|
-
- !ruby/object:Gem::Dependency
|
|
80
|
-
name: activerecord
|
|
81
72
|
prerelease: false
|
|
82
|
-
|
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
74
|
+
none: false
|
|
75
|
+
requirements:
|
|
76
|
+
- - ! '>='
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: '0'
|
|
79
|
+
- !ruby/object:Gem::Dependency
|
|
80
|
+
name: activerecord
|
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
|
83
82
|
none: false
|
|
84
|
-
requirements:
|
|
85
|
-
- -
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
segments:
|
|
88
|
-
- 2
|
|
89
|
-
- 2
|
|
90
|
-
- 2
|
|
83
|
+
requirements:
|
|
84
|
+
- - ! '>='
|
|
85
|
+
- !ruby/object:Gem::Version
|
|
91
86
|
version: 2.2.2
|
|
92
87
|
type: :development
|
|
93
|
-
version_requirements: *id004
|
|
94
|
-
- !ruby/object:Gem::Dependency
|
|
95
|
-
name: appraisal
|
|
96
88
|
prerelease: false
|
|
97
|
-
|
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
+
none: false
|
|
91
|
+
requirements:
|
|
92
|
+
- - ! '>='
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: 2.2.2
|
|
95
|
+
- !ruby/object:Gem::Dependency
|
|
96
|
+
name: appraisal
|
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
|
98
98
|
none: false
|
|
99
|
-
requirements:
|
|
100
|
-
- -
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
|
|
103
|
-
- 0
|
|
104
|
-
version: "0"
|
|
99
|
+
requirements:
|
|
100
|
+
- - ! '>='
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '0'
|
|
105
103
|
type: :development
|
|
106
|
-
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
none: false
|
|
107
|
+
requirements:
|
|
108
|
+
- - ! '>='
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
107
111
|
description:
|
|
108
112
|
email: jeff@zilkey.com
|
|
109
113
|
executables: []
|
|
110
|
-
|
|
111
114
|
extensions: []
|
|
112
|
-
|
|
113
|
-
extra_rdoc_files:
|
|
115
|
+
extra_rdoc_files:
|
|
114
116
|
- LICENSE
|
|
115
117
|
- README.md
|
|
116
|
-
files:
|
|
118
|
+
files:
|
|
117
119
|
- CHANGELOG
|
|
118
120
|
- LICENSE
|
|
119
121
|
- README.md
|
|
120
122
|
- active_hash.gemspec
|
|
121
123
|
- lib/active_file/base.rb
|
|
124
|
+
- lib/active_hash/base.rb
|
|
125
|
+
- lib/active_hash/version.rb
|
|
126
|
+
- lib/active_hash.rb
|
|
122
127
|
- lib/active_yaml/base.rb
|
|
123
128
|
- lib/associations/associations.rb
|
|
124
|
-
- lib/active_hash.rb
|
|
125
129
|
- lib/enum/enum.rb
|
|
126
|
-
- lib/active_hash/version.rb
|
|
127
|
-
- lib/active_hash/base.rb
|
|
128
130
|
- Gemfile
|
|
129
131
|
- spec/active_file/base_spec.rb
|
|
130
132
|
- spec/active_hash/base_spec.rb
|
|
@@ -133,39 +135,34 @@ files:
|
|
|
133
135
|
- spec/enum/enum_spec.rb
|
|
134
136
|
- spec/lint_spec.rb
|
|
135
137
|
- spec/spec_helper.rb
|
|
136
|
-
has_rdoc: true
|
|
137
138
|
homepage: http://github.com/zilkey/active_hash
|
|
138
139
|
licenses: []
|
|
139
|
-
|
|
140
140
|
post_install_message:
|
|
141
141
|
rdoc_options: []
|
|
142
|
-
|
|
143
|
-
require_paths:
|
|
142
|
+
require_paths:
|
|
144
143
|
- lib
|
|
145
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
146
145
|
none: false
|
|
147
|
-
requirements:
|
|
148
|
-
- -
|
|
149
|
-
- !ruby/object:Gem::Version
|
|
150
|
-
|
|
146
|
+
requirements:
|
|
147
|
+
- - ! '>='
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: '0'
|
|
150
|
+
segments:
|
|
151
151
|
- 0
|
|
152
|
-
|
|
153
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
|
+
hash: 4063226138811375373
|
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
154
|
none: false
|
|
155
|
-
requirements:
|
|
156
|
-
- -
|
|
157
|
-
- !ruby/object:Gem::Version
|
|
158
|
-
|
|
159
|
-
- 0
|
|
160
|
-
version: "0"
|
|
155
|
+
requirements:
|
|
156
|
+
- - ! '>='
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: '0'
|
|
161
159
|
requirements: []
|
|
162
|
-
|
|
163
160
|
rubyforge_project:
|
|
164
|
-
rubygems_version: 1.
|
|
161
|
+
rubygems_version: 1.8.24
|
|
165
162
|
signing_key:
|
|
166
163
|
specification_version: 3
|
|
167
164
|
summary: An ActiveRecord-like model that uses a hash or file as a datasource
|
|
168
|
-
test_files:
|
|
165
|
+
test_files:
|
|
169
166
|
- Gemfile
|
|
170
167
|
- spec/active_file/base_spec.rb
|
|
171
168
|
- spec/active_hash/base_spec.rb
|