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 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
@@ -25,7 +25,8 @@ Gem::Specification.new do |s|
25
25
  "Kevin Olsen",
26
26
  "Vladimir Andrijevik",
27
27
  "Adam Anderson",
28
- "Keenan Brock"
28
+ "Keenan Brock",
29
+ "Desmond Bowe"
29
30
  ]
30
31
  s.date = %q{2012-01-18}
31
32
  s.email = %q{jeff@zilkey.com}
@@ -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
@@ -1,5 +1,5 @@
1
1
  module ActiveHash
2
2
  module Gem
3
- VERSION = "0.9.10"
3
+ VERSION = "0.9.11"
4
4
  end
5
5
  end
@@ -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 => 2, :name => "Mexico", :language => 'Spanish'}
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
- prerelease: false
5
- segments:
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
- date: 2012-01-18 00:00:00 -05:00
34
- default_executable:
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
- prerelease: false
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- requirement: &id003 !ruby/object:Gem::Requirement
57
+ version_requirements: !ruby/object:Gem::Requirement
70
58
  none: false
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- segments:
75
- - 0
76
- version: "0"
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- requirement: &id005 !ruby/object:Gem::Requirement
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
- segments:
103
- - 0
104
- version: "0"
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
105
103
  type: :development
106
- version_requirements: *id005
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
- segments:
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ segments:
151
151
  - 0
152
- version: "0"
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
- segments:
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.3.7
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