frozen_record 0.19.1 → 0.20.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d75dfc07a86429e4dcc6a17c076aa87081a19e812b3d9b8d9722281d8a14aba9
4
- data.tar.gz: a445c878d8cddaa87cb59db1213cf4099e3cbf10fa854d92fbd28669867dad4a
3
+ metadata.gz: 8f755e0e4bce41d9687a8b29eedad265593319156b8d086e81c355d6cdbf15dd
4
+ data.tar.gz: bb63057b31078536220168e6430ee0099cad053bdfd35a1a2567c054fe26e780
5
5
  SHA512:
6
- metadata.gz: 54b3c787e7c0f028c8c58a2a1fb214a5b3ac0c4b8b06ac4a42d4a35526baa0c50573967a7aa7faad0921c028d19d985dda831257f2244b1ba5af56960187ced1
7
- data.tar.gz: 8159f7e45d32256ab9565bbf5ff81c6685e912c57603f97b335f8c5dbb2529b4153bb0e2937e4c709da9a78d0f303f485e33daf4933aa129be9599313964ec8d
6
+ metadata.gz: 22929e50f2c0eec95d863222171cf81ab52531396118259ff4107240d5ce7d9828f70198b133a126bedb0f11cea7858814ab1fdabbcf31e9840aaad23cb9c614
7
+ data.tar.gz: 43c61d4238b44945bcd94bea89864ba0c4a06d0b53669e9a27d00ae2ba27673817ef5104c710e341c0ed286d544195f3a7615bac306c6cc8424c5afd0453a921
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
20
20
  spec.required_ruby_version = '>= 2.5'
21
21
 
22
22
  spec.add_runtime_dependency 'activemodel'
23
+ spec.add_runtime_dependency 'dedup'
24
+
23
25
  spec.add_development_dependency 'bundler'
24
26
  spec.add_development_dependency 'rake'
25
27
  spec.add_development_dependency 'rspec'
@@ -5,12 +5,13 @@ require 'set'
5
5
  require 'active_support/all'
6
6
  require 'active_model'
7
7
 
8
+ require 'dedup'
9
+
8
10
  require 'frozen_record/version'
9
11
  require 'frozen_record/scope'
10
12
  require 'frozen_record/index'
11
13
  require 'frozen_record/base'
12
14
  require 'frozen_record/compact'
13
- require 'frozen_record/deduplication'
14
15
 
15
16
  module FrozenRecord
16
17
  RecordNotFound = Class.new(StandardError)
@@ -21,7 +21,8 @@ module FrozenRecord
21
21
  FALSY_VALUES = [false, nil, 0, -''].to_set
22
22
 
23
23
  class_attribute :base_path, :primary_key, :backend, :auto_reloading, :default_attributes, instance_accessor: false
24
- class_attribute :index_definitions, instance_accessor: false, default: {}.freeze
24
+ class_attribute :index_definitions, instance_accessor: false
25
+ self.index_definitions = {}.freeze
25
26
 
26
27
  self.primary_key = 'id'
27
28
 
@@ -51,7 +52,7 @@ module FrozenRecord
51
52
  alias_method :set_default_attributes, :default_attributes=
52
53
  private :set_default_attributes
53
54
  def default_attributes=(default_attributes)
54
- set_default_attributes(Deduplication.deep_deduplicate!(default_attributes.stringify_keys))
55
+ set_default_attributes(Dedup.deep_intern!(default_attributes.stringify_keys))
55
56
  end
56
57
 
57
58
  alias_method :set_primary_key, :primary_key=
@@ -146,7 +147,7 @@ module FrozenRecord
146
147
  @records ||= begin
147
148
  records = backend.load(file_path)
148
149
  records.each { |r| assign_defaults!(r) }
149
- records = Deduplication.deep_deduplicate!(records)
150
+ records = Dedup.deep_intern!(records)
150
151
  @attributes = list_attributes(records).freeze
151
152
  define_attribute_methods(@attributes.to_a)
152
153
  records = records.map { |r| load(r) }.freeze
@@ -14,11 +14,13 @@ module FrozenRecord
14
14
  @records ||= begin
15
15
  records = backend.load(file_path)
16
16
  records.each { |r| assign_defaults!(r) }
17
- records = Deduplication.deep_deduplicate!(records)
17
+ records = Dedup.deep_intern!(records)
18
18
  @attributes = list_attributes(records).freeze
19
19
  build_attributes_cache
20
20
  define_attribute_methods(@attributes.to_a)
21
- records.map { |r| load(r) }.freeze
21
+ records = records.map { |r| load(r) }.freeze
22
+ index_definitions.values.each { |index| index.build(records) }
23
+ records
22
24
  end
23
25
  end
24
26
 
@@ -65,7 +67,7 @@ module FrozenRecord
65
67
 
66
68
  def attributes=(attributes)
67
69
  self.class.attributes.each do |attr|
68
- instance_variable_set(self.class._attributes_cache[attr], Deduplication.deep_deduplicate!(attributes[attr]))
70
+ instance_variable_set(self.class._attributes_cache[attr], Dedup.deep_intern!(attributes[attr]))
69
71
  end
70
72
  end
71
73
 
@@ -67,7 +67,7 @@ module FrozenRecord
67
67
  end
68
68
 
69
69
  def build(records)
70
- @index = records.to_h { |r| [r[attribute], r] }
70
+ @index = records.each_with_object({}) { |r, index| index[r[attribute]] = r }
71
71
  if @index.size != records.size
72
72
  raise AttributeNonUnique, "#{model}##{attribute.inspect} is not unique."
73
73
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module FrozenRecord
4
4
  class Scope
5
- BLACKLISTED_ARRAY_METHODS = [
5
+ DISALLOWED_ARRAY_METHODS = [
6
6
  :compact!, :flatten!, :reject!, :reverse!, :rotate!, :map!,
7
7
  :shuffle!, :slice!, :sort!, :sort_by!, :delete_if,
8
8
  :keep_if, :pop, :shift, :delete_at, :compact
@@ -233,7 +233,7 @@ module FrozenRecord
233
233
  end
234
234
 
235
235
  def array_delegable?(method)
236
- Array.method_defined?(method) && BLACKLISTED_ARRAY_METHODS.exclude?(method)
236
+ Array.method_defined?(method) && DISALLOWED_ARRAY_METHODS.exclude?(method)
237
237
  end
238
238
 
239
239
  def where!(criterias)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FrozenRecord
4
- VERSION = '0.19.1'
4
+ VERSION = '0.20.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frozen_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.1
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-16 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dedup
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -118,13 +132,11 @@ files:
118
132
  - lib/frozen_record/backends/yaml.rb
119
133
  - lib/frozen_record/base.rb
120
134
  - lib/frozen_record/compact.rb
121
- - lib/frozen_record/deduplication.rb
122
135
  - lib/frozen_record/index.rb
123
136
  - lib/frozen_record/railtie.rb
124
137
  - lib/frozen_record/scope.rb
125
138
  - lib/frozen_record/test_helper.rb
126
139
  - lib/frozen_record/version.rb
127
- - spec/deduplication_spec.rb
128
140
  - spec/fixtures/animals.json
129
141
  - spec/fixtures/cars.yml
130
142
  - spec/fixtures/countries.yml.erb
@@ -156,12 +168,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
168
  - !ruby/object:Gem::Version
157
169
  version: '0'
158
170
  requirements: []
159
- rubygems_version: 3.1.2
171
+ rubygems_version: 3.0.2
160
172
  signing_key:
161
173
  specification_version: 4
162
174
  summary: ActiveRecord like interface to read only access and query static YAML files
163
175
  test_files:
164
- - spec/deduplication_spec.rb
165
176
  - spec/fixtures/animals.json
166
177
  - spec/fixtures/cars.yml
167
178
  - spec/fixtures/countries.yml.erb
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/object/duplicable'
4
-
5
- module FrozenRecord
6
- module Deduplication
7
- extend self
8
-
9
- # We deduplicate data in place because it is assumed it directly
10
- # comes from the parser, and won't be held by anyone.
11
- #
12
- # Frozen Hashes and Arrays are ignored because they are likely
13
- # the result of the use of YAML anchor. Meaning we already deduplicated
14
- # them.
15
- if RUBY_VERSION >= '2.7'
16
- def deep_deduplicate!(data)
17
- case data
18
- when Hash
19
- return data if data.frozen?
20
- data.transform_keys! { |k| deep_deduplicate!(k) }
21
- data.transform_values! { |v| deep_deduplicate!(v) }
22
- data.freeze
23
- when Array
24
- return data if data.frozen?
25
- data.map! { |d| deep_deduplicate!(d) }.freeze
26
- when String
27
- -data
28
- else
29
- data.duplicable? ? data.freeze : data
30
- end
31
- end
32
- else
33
- def deep_deduplicate!(data)
34
- case data
35
- when Hash
36
- return data if data.frozen?
37
- data.transform_keys! { |k| deep_deduplicate!(k) }
38
- data.transform_values! { |v| deep_deduplicate!(v) }
39
- data.freeze
40
- when Array
41
- return data if data.frozen?
42
- data.map! { |d| deep_deduplicate!(d) }.freeze
43
- when String
44
- # String#-@ doesn't deduplicate the string if it's tainted.
45
- # So in such case we need to untaint it first.
46
- if data.tainted?
47
- -(+data).untaint
48
- else
49
- -data
50
- end
51
- else
52
- data.duplicable? ? data.freeze : data
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'deduplication' do
4
-
5
- it 'deduplicate string values' do
6
- pending("Strings can't be deduplicated before Ruby 2.5") if RUBY_VERSION < '2.5'
7
-
8
- records = [
9
- { 'name' => 'George'.dup },
10
- ]
11
-
12
- expect(records[0]['name']).to_not equal 'George'.freeze
13
- FrozenRecord::Deduplication.deep_deduplicate!(records)
14
- expect(records[0]['name']).to equal 'George'.freeze
15
- end
16
-
17
- it 'handles duplicated references' do
18
- # This simulates the YAML anchor behavior
19
- tags = { 'foo' => 'bar' }
20
- records = [
21
- { 'name' => 'George', 'tags' => tags },
22
- { 'name' => 'Peter', 'tags' => tags },
23
- ]
24
-
25
- expect(records[0]['tags']).to_not be_frozen
26
- FrozenRecord::Deduplication.deep_deduplicate!(records)
27
- expect(records[0]['tags']).to be_frozen
28
- expect(records[0]['tags']).to equal records[1]['tags']
29
- end
30
-
31
- end