active_hash 0.9.11 → 0.9.12

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ 2012-07-25
2
+ - Make find_by_id lookups faster by indexing records by id (desmondmonster)
3
+
1
4
  2012-07-16
2
5
  - Validate IDs are unique by caching them in a set (desmondmonster)
3
6
 
data/README.md CHANGED
@@ -339,7 +339,7 @@ Records can be accessed by looking up the field constant:
339
339
  >> Country::CANADA
340
340
  => #<Country:0x10229fb28 @attributes={:name=>"Canada", :id=>2}
341
341
 
342
- Constants are formed by first stripping all non-word characters and then upcasing the result. This means strings like "Blazing Saddles", "ReBar", "Mike & Ike" and "Ho! Ho! Ho!" become BLAZINGSADDLES, REBAR, MIKEIKE and HOHOHO.
342
+ Constants are formed by first stripping all non-word characters and then upcasing the result. This means strings like "Blazing Saddles", "ReBar", "Mike & Ike" and "Ho! Ho! Ho!" become BLAZING_SADDLES, REBAR, MIKE_IKE and HO_HO_HO.
343
343
 
344
344
  The field specified as the _enum_accessor_ must contain unique data values.
345
345
 
@@ -11,8 +11,6 @@ module ActiveHash
11
11
 
12
12
  class Base
13
13
 
14
- require 'set'
15
-
16
14
  if respond_to?(:class_attribute)
17
15
  class_attribute :_data, :dirty
18
16
  else
@@ -59,7 +57,7 @@ module ActiveHash
59
57
  def data=(array_of_hashes)
60
58
  mark_dirty
61
59
  @records = nil
62
- reset_ids
60
+ reset_record_index
63
61
  self._data = array_of_hashes
64
62
  if array_of_hashes
65
63
  auto_assign_fields(array_of_hashes)
@@ -75,7 +73,7 @@ module ActiveHash
75
73
  validate_unique_id(record) if dirty
76
74
  mark_dirty
77
75
 
78
- ids << record.id
76
+ add_to_record_index({ record.id.to_s => @records.length })
79
77
  @records << record
80
78
  end
81
79
 
@@ -88,20 +86,26 @@ module ActiveHash
88
86
  end
89
87
  end
90
88
 
91
- def ids
92
- @ids ||= Set.new
89
+ def record_index
90
+ @record_index ||= {}
91
+ end
92
+
93
+ private :record_index
94
+
95
+ def reset_record_index
96
+ record_index.clear
93
97
  end
94
98
 
95
- private :ids
99
+ private :reset_record_index
96
100
 
97
- def reset_ids
98
- ids.clear
101
+ def add_to_record_index(entry)
102
+ record_index.merge!(entry)
99
103
  end
100
104
 
101
- private :reset_ids
105
+ private :add_to_record_index
102
106
 
103
107
  def validate_unique_id(record)
104
- raise IdError.new("Duplicate Id found for record #{record.attributes}") if ids.include?(record.id)
108
+ raise IdError.new("Duplicate Id found for record #{record.attributes}") if record_index.has_key?(record.id.to_s)
105
109
  end
106
110
 
107
111
  private :validate_unique_id
@@ -148,7 +152,7 @@ module ActiveHash
148
152
 
149
153
  def delete_all
150
154
  mark_dirty
151
- reset_ids
155
+ reset_record_index
152
156
  @records = []
153
157
  end
154
158
 
@@ -168,7 +172,8 @@ module ActiveHash
168
172
  end
169
173
 
170
174
  def find_by_id(id)
171
- all.detect { |record| record.id.to_s == id.to_s }
175
+ index = record_index[id.to_s]
176
+ index and @records[index]
172
177
  end
173
178
 
174
179
  delegate :first, :last, :to => :all
@@ -326,7 +331,7 @@ module ActiveHash
326
331
  end
327
332
 
328
333
  def reload
329
- reset_ids
334
+ reset_record_index
330
335
  self.data = _data
331
336
  mark_clean
332
337
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveHash
2
2
  module Gem
3
- VERSION = "0.9.11"
3
+ VERSION = "0.9.12"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.11
4
+ version: 0.9.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -26,11 +26,11 @@ authors:
26
26
  autorequire:
27
27
  bindir: bin
28
28
  cert_chain: []
29
- date: 2012-01-18 00:00:00.000000000 Z
29
+ date: 2012-01-18 00:00:00.000000000Z
30
30
  dependencies:
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: activesupport
33
- requirement: !ruby/object:Gem::Requirement
33
+ requirement: &70291036455660 !ruby/object:Gem::Requirement
34
34
  none: false
35
35
  requirements:
36
36
  - - ! '>='
@@ -38,15 +38,10 @@ dependencies:
38
38
  version: 2.2.2
39
39
  type: :runtime
40
40
  prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ! '>='
45
- - !ruby/object:Gem::Version
46
- version: 2.2.2
41
+ version_requirements: *70291036455660
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rspec
49
- requirement: !ruby/object:Gem::Requirement
44
+ requirement: &70291036454000 !ruby/object:Gem::Requirement
50
45
  none: false
51
46
  requirements:
52
47
  - - ~>
@@ -54,15 +49,10 @@ dependencies:
54
49
  version: 2.2.0
55
50
  type: :development
56
51
  prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ~>
61
- - !ruby/object:Gem::Version
62
- version: 2.2.0
52
+ version_requirements: *70291036454000
63
53
  - !ruby/object:Gem::Dependency
64
54
  name: sqlite3
65
- requirement: !ruby/object:Gem::Requirement
55
+ requirement: &70291036451580 !ruby/object:Gem::Requirement
66
56
  none: false
67
57
  requirements:
68
58
  - - ! '>='
@@ -70,15 +60,10 @@ dependencies:
70
60
  version: '0'
71
61
  type: :development
72
62
  prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ! '>='
77
- - !ruby/object:Gem::Version
78
- version: '0'
63
+ version_requirements: *70291036451580
79
64
  - !ruby/object:Gem::Dependency
80
65
  name: activerecord
81
- requirement: !ruby/object:Gem::Requirement
66
+ requirement: &70291036450320 !ruby/object:Gem::Requirement
82
67
  none: false
83
68
  requirements:
84
69
  - - ! '>='
@@ -86,15 +71,10 @@ dependencies:
86
71
  version: 2.2.2
87
72
  type: :development
88
73
  prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ! '>='
93
- - !ruby/object:Gem::Version
94
- version: 2.2.2
74
+ version_requirements: *70291036450320
95
75
  - !ruby/object:Gem::Dependency
96
76
  name: appraisal
97
- requirement: !ruby/object:Gem::Requirement
77
+ requirement: &70291036449280 !ruby/object:Gem::Requirement
98
78
  none: false
99
79
  requirements:
100
80
  - - ! '>='
@@ -102,12 +82,7 @@ dependencies:
102
82
  version: '0'
103
83
  type: :development
104
84
  prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
85
+ version_requirements: *70291036449280
111
86
  description:
112
87
  email: jeff@zilkey.com
113
88
  executables: []
@@ -147,9 +122,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
122
  - - ! '>='
148
123
  - !ruby/object:Gem::Version
149
124
  version: '0'
150
- segments:
151
- - 0
152
- hash: 4063226138811375373
153
125
  required_rubygems_version: !ruby/object:Gem::Requirement
154
126
  none: false
155
127
  requirements:
@@ -158,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
130
  version: '0'
159
131
  requirements: []
160
132
  rubyforge_project:
161
- rubygems_version: 1.8.24
133
+ rubygems_version: 1.8.10
162
134
  signing_key:
163
135
  specification_version: 3
164
136
  summary: An ActiveRecord-like model that uses a hash or file as a datasource