identity_cache 0.5.1 → 1.0.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.
Files changed (91) hide show
  1. checksums.yaml +5 -5
  2. data/.github/probots.yml +2 -0
  3. data/.github/workflows/ci.yml +26 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +5 -0
  6. data/.travis.yml +24 -9
  7. data/CHANGELOG.md +21 -0
  8. data/Gemfile +5 -1
  9. data/README.md +28 -26
  10. data/Rakefile +14 -5
  11. data/dev.yml +9 -16
  12. data/gemfiles/Gemfile.latest-release +6 -0
  13. data/gemfiles/Gemfile.rails-edge +6 -0
  14. data/gemfiles/Gemfile.rails52 +6 -0
  15. data/identity_cache.gemspec +26 -10
  16. data/lib/identity_cache.rb +49 -46
  17. data/lib/identity_cache/belongs_to_caching.rb +12 -40
  18. data/lib/identity_cache/cache_fetcher.rb +6 -5
  19. data/lib/identity_cache/cache_hash.rb +2 -2
  20. data/lib/identity_cache/cache_invalidation.rb +4 -11
  21. data/lib/identity_cache/cache_key_generation.rb +17 -65
  22. data/lib/identity_cache/cache_key_loader.rb +128 -0
  23. data/lib/identity_cache/cached.rb +7 -0
  24. data/lib/identity_cache/cached/association.rb +87 -0
  25. data/lib/identity_cache/cached/attribute.rb +123 -0
  26. data/lib/identity_cache/cached/attribute_by_multi.rb +37 -0
  27. data/lib/identity_cache/cached/attribute_by_one.rb +88 -0
  28. data/lib/identity_cache/cached/belongs_to.rb +93 -0
  29. data/lib/identity_cache/cached/embedded_fetching.rb +41 -0
  30. data/lib/identity_cache/cached/prefetcher.rb +51 -0
  31. data/lib/identity_cache/cached/primary_index.rb +97 -0
  32. data/lib/identity_cache/cached/recursive/association.rb +68 -0
  33. data/lib/identity_cache/cached/recursive/has_many.rb +9 -0
  34. data/lib/identity_cache/cached/recursive/has_one.rb +9 -0
  35. data/lib/identity_cache/cached/reference/association.rb +16 -0
  36. data/lib/identity_cache/cached/reference/has_many.rb +105 -0
  37. data/lib/identity_cache/cached/reference/has_one.rb +100 -0
  38. data/lib/identity_cache/configuration_dsl.rb +53 -215
  39. data/lib/identity_cache/encoder.rb +95 -0
  40. data/lib/identity_cache/expiry_hook.rb +36 -0
  41. data/lib/identity_cache/fallback_fetcher.rb +2 -1
  42. data/lib/identity_cache/load_strategy/eager.rb +28 -0
  43. data/lib/identity_cache/load_strategy/lazy.rb +71 -0
  44. data/lib/identity_cache/load_strategy/load_request.rb +20 -0
  45. data/lib/identity_cache/load_strategy/multi_load_request.rb +27 -0
  46. data/lib/identity_cache/memoized_cache_proxy.rb +127 -58
  47. data/lib/identity_cache/parent_model_expiration.rb +45 -11
  48. data/lib/identity_cache/query_api.rb +128 -394
  49. data/lib/identity_cache/railtie.rb +8 -0
  50. data/lib/identity_cache/record_not_found.rb +6 -0
  51. data/lib/identity_cache/should_use_cache.rb +1 -0
  52. data/lib/identity_cache/version.rb +3 -2
  53. data/lib/identity_cache/with_primary_index.rb +136 -0
  54. data/lib/identity_cache/without_primary_index.rb +24 -3
  55. data/performance/cache_runner.rb +28 -34
  56. data/performance/cpu.rb +3 -2
  57. data/performance/externals.rb +4 -3
  58. data/performance/profile.rb +6 -5
  59. data/railgun.yml +16 -0
  60. metadata +44 -73
  61. data/Gemfile.rails42 +0 -6
  62. data/Gemfile.rails50 +0 -6
  63. data/test/attribute_cache_test.rb +0 -110
  64. data/test/cache_fetch_includes_test.rb +0 -46
  65. data/test/cache_hash_test.rb +0 -14
  66. data/test/cache_invalidation_test.rb +0 -139
  67. data/test/deeply_nested_associated_record_test.rb +0 -19
  68. data/test/denormalized_has_many_test.rb +0 -214
  69. data/test/denormalized_has_one_test.rb +0 -160
  70. data/test/fetch_multi_test.rb +0 -308
  71. data/test/fetch_test.rb +0 -258
  72. data/test/fixtures/serialized_record.mysql2 +0 -0
  73. data/test/fixtures/serialized_record.postgresql +0 -0
  74. data/test/helpers/active_record_objects.rb +0 -106
  75. data/test/helpers/database_connection.rb +0 -72
  76. data/test/helpers/serialization_format.rb +0 -51
  77. data/test/helpers/update_serialization_format.rb +0 -27
  78. data/test/identity_cache_test.rb +0 -29
  79. data/test/index_cache_test.rb +0 -161
  80. data/test/memoized_attributes_test.rb +0 -59
  81. data/test/memoized_cache_proxy_test.rb +0 -107
  82. data/test/normalized_belongs_to_test.rb +0 -107
  83. data/test/normalized_has_many_test.rb +0 -231
  84. data/test/normalized_has_one_test.rb +0 -9
  85. data/test/prefetch_associations_test.rb +0 -379
  86. data/test/readonly_test.rb +0 -109
  87. data/test/recursive_denormalized_has_many_test.rb +0 -131
  88. data/test/save_test.rb +0 -82
  89. data/test/schema_change_test.rb +0 -112
  90. data/test/serialization_format_change_test.rb +0 -16
  91. data/test/test_helper.rb +0 -140
@@ -1,140 +0,0 @@
1
- require 'logger'
2
- require 'minitest/autorun'
3
- require 'mocha/setup'
4
- require 'active_record'
5
- require 'helpers/database_connection'
6
- require 'helpers/active_record_objects'
7
- require 'spy/integration'
8
- require 'memcached_store'
9
- require 'active_support/cache/memcached_store'
10
-
11
- require File.dirname(__FILE__) + '/../lib/identity_cache'
12
-
13
- DatabaseConnection.setup
14
- ActiveSupport::Cache::Store.instrument = true if ActiveSupport.version < Gem::Version.new("4.2.0")
15
-
16
- # This patches AR::MemcacheStore to notify AS::Notifications upon read_multis like the rest of rails does
17
- module MemcachedStoreInstrumentation
18
- def read_multi(*args, &block)
19
- instrument('read_multi', 'MULTI', keys: args) do
20
- super(*args, &block)
21
- end
22
- end
23
- end
24
- ActiveSupport::Cache::MemcachedStore.prepend(MemcachedStoreInstrumentation)
25
-
26
-
27
- MiniTest::Test = MiniTest::Unit::TestCase unless defined?(MiniTest::Test)
28
- class IdentityCache::TestCase < Minitest::Test
29
- include ActiveRecordObjects
30
- attr_reader :backend
31
-
32
- def setup
33
- if ActiveRecord.gem_version < Gem::Version.new('5') && ActiveRecord::Base.respond_to?(:raise_in_transactional_callbacks=)
34
- ActiveRecord::Base.raise_in_transactional_callbacks = true
35
- end
36
-
37
- DatabaseConnection.drop_tables
38
- DatabaseConnection.create_tables
39
-
40
- IdentityCache.logger = Logger.new(nil)
41
-
42
- memcached_host = ENV['MEMCACHED_HOST'] || "127.0.0.1"
43
- IdentityCache.cache_backend = @backend = ActiveSupport::Cache::MemcachedStore.new("#{memcached_host}:11211", :support_cas => true)
44
-
45
- setup_models
46
- end
47
-
48
- def teardown
49
- IdentityCache.cache.clear
50
- teardown_models
51
- end
52
-
53
- private
54
-
55
- def fetcher
56
- IdentityCache.cache.cache_fetcher
57
- end
58
-
59
- def assert_nothing_raised
60
- yield
61
- end
62
-
63
- def assert_not_nil(*args)
64
- assert(*args)
65
- end
66
-
67
- def assert_queries(num = 1)
68
- counter = SQLCounter.new
69
- subscriber = ActiveSupport::Notifications.subscribe('sql.active_record', counter)
70
- exception = false
71
- yield
72
- rescue
73
- exception = true
74
- raise
75
- ensure
76
- ActiveSupport::Notifications.unsubscribe(subscriber)
77
- assert_equal num, counter.log.size, "#{counter.log.size} instead of #{num} queries were executed.#{counter.log.size == 0 ? '' : "\nQueries:\n#{counter.log.join("\n")}"}" unless exception
78
- end
79
-
80
- def assert_memcache_operations(num)
81
- counter = CacheCounter.new
82
- subscriber = ActiveSupport::Notifications.subscribe(/cache_.*\.active_support/, counter)
83
- exception = false
84
- yield
85
- rescue
86
- exception = true
87
- raise
88
- ensure
89
- ActiveSupport::Notifications.unsubscribe(subscriber)
90
- assert_equal num, counter.log.size, "#{counter.log.size} instead of #{num} memcache operations were executed. #{counter.log.size == 0 ? '' : "\nOperations:\n#{counter.log.join("\n")}"}" unless exception
91
- end
92
-
93
- def assert_no_queries
94
- assert_queries(0) do
95
- yield
96
- end
97
- end
98
-
99
- def cache_hash(key)
100
- IdentityCache.memcache_hash(key)
101
- end
102
- end
103
-
104
- class SQLCounter
105
- cattr_accessor :ignored_sql
106
- self.ignored_sql = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/, /^SHOW /]
107
-
108
- # FIXME: this needs to be refactored so specific database can add their own
109
- # ignored SQL. This ignored SQL is for Oracle.
110
- ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]
111
-
112
- attr_reader :ignore
113
- attr_accessor :log
114
-
115
- def initialize(ignore = self.class.ignored_sql)
116
- @ignore = ignore
117
- @log = []
118
- end
119
-
120
- def call(name, start, finish, message_id, values)
121
- sql = values[:sql]
122
-
123
- # FIXME: this seems bad. we should probably have a better way to indicate
124
- # the query was cached
125
- return if 'CACHE' == values[:name] || ignore.any? { |x| x =~ sql }
126
- self.log << sql
127
- end
128
- end
129
-
130
- class CacheCounter
131
- attr_accessor :log
132
-
133
- def initialize()
134
- @log = []
135
- end
136
-
137
- def call(name, start, finish, message_id, values)
138
- self.log << "#{name} #{(values[:keys].try(:join, ', ') || values[:key])}"
139
- end
140
- end