db_memoize 0.1.5 → 0.1.6

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
  SHA1:
3
- metadata.gz: 4e6c10e2d8dffe1ff21a88e3f1349df1402a4df5
4
- data.tar.gz: ee681aef3dc8e05bd34877dc1ec9717486f8000d
3
+ metadata.gz: 2134329e831a84420b606a2f64aeae8703ebcd7a
4
+ data.tar.gz: 2abf35de9b06d53424513a0432cb884c73f1f4cd
5
5
  SHA512:
6
- metadata.gz: 27051ef728eeeeb41e3e5b7927fd1abaa464f7ac3f22e3ab5536a7788f86670f754f0c08feb3768aa4107c1d19f4ce2df38b156bbb3900651f1e29cb7ff19229
7
- data.tar.gz: e4ea6308907c9627a61fca6981d0dbc78ac5c179f7425cd2235061a7ebf5a78e692143748cc3cde5eafdfe60147ae082dfd277b726efe0550eae08703bce4f0a
6
+ metadata.gz: 208ba78d6912596d059e40e4f77f9393025a926c4c973a2599882a6980ce836c008442466d3db0c84fd8e1a9e2a625ca901f26d697f64054abdccf7976c700f9
7
+ data.tar.gz: 994bdc8506e1886f57276380da78431812d9c74b99c66ea9f02ce9bffef87b1f13e27182c556ba5dab8363f8896de9c4ae9d2442be214a1c324cf007cb416c9f
@@ -22,12 +22,8 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ['lib']
23
23
 
24
24
  spec.add_development_dependency 'railties', '~> 4.2'
25
- spec.add_development_dependency 'activemodel', '~> 4.2'
26
- spec.add_development_dependency 'actionpack', '~> 4.2'
27
- spec.add_development_dependency 'activesupport', '~> 4.2'
28
25
  spec.add_development_dependency 'activerecord', '~> 4.2'
29
- spec.add_development_dependency 'activejob', '~> 4.2'
30
- spec.add_development_dependency 'arel', '6.0.0'
26
+
31
27
  spec.add_development_dependency 'rake', '~> 10.5'
32
28
  spec.add_development_dependency 'sqlite3'
33
29
  spec.add_development_dependency 'rspec-rails', '~> 3.4'
@@ -39,7 +35,6 @@ Gem::Specification.new do |spec|
39
35
  spec.add_development_dependency 'database_cleaner', '~> 1.5.3'
40
36
  spec.add_development_dependency 'factory_girl', '~> 4.7.0'
41
37
  spec.add_development_dependency 'ruby-progressbar', '~> 1.7'
42
- spec.add_development_dependency 'ffaker'
43
38
  spec.add_development_dependency 'awesome_print'
44
39
  spec.add_development_dependency 'gem-release'
45
40
  end
@@ -4,15 +4,20 @@ require 'digest'
4
4
  require 'benchmark'
5
5
  require 'db_memoize/version'
6
6
  require 'db_memoize/value'
7
+ require 'db_memoize/helpers'
7
8
  require 'db_memoize/model'
8
9
  require 'db_memoize/railtie' if defined?(Rails)
9
10
 
10
11
  module DbMemoize
11
12
  class << self
12
- attr_writer :logger
13
+ attr_writer :logger, :log_level
13
14
 
14
15
  def logger
15
16
  @logger ||= ::Logger.new(STDOUT)
16
17
  end
18
+
19
+ def log_level
20
+ @log_level ||= :debug
21
+ end
17
22
  end
18
23
  end
@@ -0,0 +1,18 @@
1
+ module DbMemoize
2
+ # The Helpers module contains some helper methods, mostly to not pollute
3
+ # the namespace of memoized objects and classes.
4
+ module Helpers
5
+ module_function
6
+
7
+ def find_ids(records_or_ids)
8
+ records_or_ids = Array(records_or_ids)
9
+ return [] if records_or_ids.empty?
10
+
11
+ records_or_ids.first.is_a?(ActiveRecord::Base) ? records_or_ids.map(&:id) : records_or_ids
12
+ end
13
+
14
+ def log(model, method_name, msg)
15
+ DbMemoize.logger.send(DbMemoize.log_level, "DbMemoize <#{model.class.name} id: #{model.id}>##{method_name} - #{msg}")
16
+ end
17
+ end
18
+ end
@@ -12,18 +12,14 @@ module DbMemoize
12
12
  cached_value = find_memoized_value(method_name, args_hash)
13
13
 
14
14
  if cached_value
15
- log(method_name, 'cache hit')
16
15
  value = Marshal.load(cached_value.value)
16
+ Helpers.log(self, method_name, 'cache hit')
17
17
  else
18
18
  time = ::Benchmark.realtime do
19
19
  value = send("#{method_name}_without_memoize", *args)
20
+ create_memoized_value(method_name, args_hash, value)
20
21
  end
21
- # dear rubocop, we can't use `format` here, since some of our models have a
22
- # `format` method themselves.
23
- # rubocop:disable Style/FormatString
24
- log(method_name, "cache miss. took #{sprintf('%.2f', time * 1_000)}ms")
25
- # rubocop:enable Style/FormatString
26
- create_memoized_value(method_name, args_hash, value)
22
+ Helpers.log(self, method_name, "cache miss. took #{Kernel.format '%.2f msecs', time * 1_000}")
27
23
  end
28
24
 
29
25
  value
@@ -31,13 +27,22 @@ module DbMemoize
31
27
 
32
28
  def unmemoize(method_name = :all)
33
29
  if method_name != :all
34
- # FIXME: this works, but isn't immediately visible on the record
30
+ # FIXME: this works, but isn't immediately visible on the record.
31
+ # See also note in create_memoized_value.
35
32
  memoized_values.where(method_name: method_name).delete_all
36
33
  else
37
34
  memoized_values.clear
38
35
  end
39
36
  end
40
37
 
38
+ #
39
+ # Used to set multiple memoized values in one go.
40
+ #
41
+ # Example:
42
+ #
43
+ # product.memoize_values full_title: "my full title",
44
+ # autocomplete_info: "my autocomplete_info"
45
+ #
41
46
  def memoize_values(values, *args)
42
47
  args_hash = ::Digest::MD5.hexdigest(Marshal.dump(args))
43
48
 
@@ -49,6 +54,9 @@ module DbMemoize
49
54
  private
50
55
 
51
56
  def create_memoized_value(method_name, args_hash, value)
57
+ # [TODO] - It would be nice to have an optimized, pg-based inserter
58
+ # here, for up to 10 times speed. However, the memoized_values
59
+ # array must then be properly reset.
52
60
  memoized_values.create!(
53
61
  entity_table_name: self.class.table_name,
54
62
  method_name: method_name.to_s,
@@ -58,22 +66,22 @@ module DbMemoize
58
66
  end
59
67
 
60
68
  def find_memoized_value(method_name, args_hash)
69
+ method_name = method_name.to_s
70
+
61
71
  memoized_values.detect do |rec|
62
- rec.method_name == method_name.to_s &&
72
+ rec.method_name == method_name &&
63
73
  rec.arguments_hash == args_hash
64
74
  end
65
75
  end
66
76
 
67
- def log(method_name, msg)
68
- DbMemoize.logger.info "DbMemoize <#{self.class.name} id: #{id}>##{method_name} - #{msg}"
69
- end
70
-
71
77
  module ClassMethods
72
78
  def db_memoize(method_name)
73
79
  @db_memoized_methods ||= []
74
80
  @db_memoized_methods.push(method_name.to_sym)
75
81
 
76
- create_alias_method(method_name)
82
+ # [TODO] - should the create_memoized_** functions really be called
83
+ # when the method_name is in @db_memoized_methods already?
84
+ create_memoized_alias_method(method_name)
77
85
  create_memoized_values_association
78
86
  end
79
87
 
@@ -85,7 +93,7 @@ module DbMemoize
85
93
  def unmemoize(records_or_ids, method_name = :all)
86
94
  conditions = {
87
95
  entity_table_name: table_name,
88
- entity_id: find_ids(records_or_ids)
96
+ entity_id: Helpers.find_ids(records_or_ids)
89
97
  }
90
98
  conditions[:method_name] = method_name unless method_name == :all
91
99
 
@@ -94,7 +102,7 @@ module DbMemoize
94
102
 
95
103
  def memoize_values(records_or_ids, values, *args)
96
104
  transaction do
97
- ids = find_ids(records_or_ids)
105
+ ids = Helpers.find_ids(records_or_ids)
98
106
  args_hash = ::Digest::MD5.hexdigest(Marshal.dump(args))
99
107
 
100
108
  ids.each do |id|
@@ -113,14 +121,7 @@ module DbMemoize
113
121
 
114
122
  private
115
123
 
116
- def find_ids(records_or_ids)
117
- records_or_ids = Array(records_or_ids)
118
- return [] if records_or_ids.empty?
119
-
120
- records_or_ids.first.is_a?(ActiveRecord::Base) ? records_or_ids.map(&:id) : records_or_ids
121
- end
122
-
123
- def create_alias_method(method_name)
124
+ def create_memoized_alias_method(method_name)
124
125
  define_method "#{method_name}_with_memoize" do |*args|
125
126
  memoized_value(method_name, args)
126
127
  end
@@ -1,3 +1,3 @@
1
1
  module DbMemoize
2
- VERSION = '0.1.5'.freeze
2
+ VERSION = '0.1.6'.freeze
3
3
  end
@@ -1,11 +1,15 @@
1
1
  namespace :db_memoize do
2
- desc "generates memoized values (pass e.g. 'class=Product methods=to_document,to_hash')"
2
+ desc "generates memoized values (pass e.g. 'CLASS=Product [ METHODS=to_document,to_hash ]')"
3
3
  task warmup: :environment do
4
4
  require 'ruby-progressbar'
5
5
 
6
- klass_name = ENV['class']
7
- methods = ENV['methods'].split(',')
6
+ klass_name = ENV['class'] || ENV['CLASS'] || raise('Missing CLASS environment value')
8
7
  klass = klass_name.constantize
8
+
9
+ methods = ENV['methods'] || ENV['METHODS']
10
+ methods = methods.split(',') if methods
11
+ methods ||= klass.db_memoized_methods.map(&:to_s)
12
+
9
13
  count = klass.count
10
14
 
11
15
  progressbar = ProgressBar.create(
@@ -17,7 +21,8 @@ namespace :db_memoize do
17
21
  remainder_mark: '.'
18
22
  )
19
23
 
20
- klass_name.constantize.find_each do |record|
24
+ klass.find_each do |record|
25
+ # calling each method will build the cached entries for these objects.
21
26
  methods.each do |meth|
22
27
  record.send(meth)
23
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db_memoize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - johannes-kostas goetzinger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-23 00:00:00.000000000 Z
11
+ date: 2017-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -24,48 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.2'
27
- - !ruby/object:Gem::Dependency
28
- name: activemodel
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '4.2'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '4.2'
41
- - !ruby/object:Gem::Dependency
42
- name: actionpack
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '4.2'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '4.2'
55
- - !ruby/object:Gem::Dependency
56
- name: activesupport
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '4.2'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '4.2'
69
27
  - !ruby/object:Gem::Dependency
70
28
  name: activerecord
71
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,34 +38,6 @@ dependencies:
80
38
  - - "~>"
81
39
  - !ruby/object:Gem::Version
82
40
  version: '4.2'
83
- - !ruby/object:Gem::Dependency
84
- name: activejob
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '4.2'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '4.2'
97
- - !ruby/object:Gem::Dependency
98
- name: arel
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '='
102
- - !ruby/object:Gem::Version
103
- version: 6.0.0
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '='
109
- - !ruby/object:Gem::Version
110
- version: 6.0.0
111
41
  - !ruby/object:Gem::Dependency
112
42
  name: rake
113
43
  requirement: !ruby/object:Gem::Requirement
@@ -262,20 +192,6 @@ dependencies:
262
192
  - - "~>"
263
193
  - !ruby/object:Gem::Version
264
194
  version: '1.7'
265
- - !ruby/object:Gem::Dependency
266
- name: ffaker
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - ">="
270
- - !ruby/object:Gem::Version
271
- version: '0'
272
- type: :development
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - ">="
277
- - !ruby/object:Gem::Version
278
- version: '0'
279
195
  - !ruby/object:Gem::Dependency
280
196
  name: awesome_print
281
197
  requirement: !ruby/object:Gem::Requirement
@@ -323,6 +239,7 @@ files:
323
239
  - bin/setup
324
240
  - db_memoize.gemspec
325
241
  - lib/db_memoize.rb
242
+ - lib/db_memoize/helpers.rb
326
243
  - lib/db_memoize/migrations.rb
327
244
  - lib/db_memoize/model.rb
328
245
  - lib/db_memoize/railtie.rb