active_hash 0.9.11 → 0.9.12

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,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