active_hash 0.9.10 → 0.9.11

Sign up to get free protection for your applications and to get access to all the features.
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