activematrix 0.0.0 → 0.0.2

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +218 -51
  3. data/lib/active_matrix/agent_manager.rb +275 -0
  4. data/lib/active_matrix/agent_registry.rb +154 -0
  5. data/lib/{matrix_sdk → active_matrix}/api.rb +18 -22
  6. data/lib/{matrix_sdk → active_matrix}/bot/base.rb +42 -39
  7. data/lib/{matrix_sdk → active_matrix}/bot/main.rb +4 -5
  8. data/lib/active_matrix/bot/multi_instance_base.rb +189 -0
  9. data/lib/active_matrix/bot.rb +7 -0
  10. data/lib/{matrix_sdk → active_matrix}/client.rb +21 -34
  11. data/lib/active_matrix/client_pool.rb +194 -0
  12. data/lib/{matrix_sdk → active_matrix}/errors.rb +4 -4
  13. data/lib/active_matrix/event_router.rb +215 -0
  14. data/lib/active_matrix/logging.rb +56 -0
  15. data/lib/active_matrix/memory/agent_memory.rb +128 -0
  16. data/lib/active_matrix/memory/base.rb +101 -0
  17. data/lib/active_matrix/memory/conversation_memory.rb +161 -0
  18. data/lib/active_matrix/memory/global_memory.rb +153 -0
  19. data/lib/active_matrix/memory.rb +28 -0
  20. data/lib/{matrix_sdk → active_matrix}/mxid.rb +2 -2
  21. data/lib/{matrix_sdk → active_matrix}/protocols/as.rb +1 -1
  22. data/lib/{matrix_sdk → active_matrix}/protocols/cs.rb +6 -8
  23. data/lib/{matrix_sdk → active_matrix}/protocols/is.rb +1 -1
  24. data/lib/{matrix_sdk → active_matrix}/protocols/msc.rb +6 -8
  25. data/lib/{matrix_sdk → active_matrix}/protocols/ss.rb +2 -2
  26. data/lib/active_matrix/railtie.rb +18 -0
  27. data/lib/{matrix_sdk → active_matrix}/response.rb +2 -2
  28. data/lib/{matrix_sdk → active_matrix}/room.rb +148 -72
  29. data/lib/{matrix_sdk → active_matrix}/rooms/space.rb +3 -7
  30. data/lib/{matrix_sdk → active_matrix}/user.rb +23 -15
  31. data/lib/active_matrix/util/account_data_cache.rb +129 -0
  32. data/lib/active_matrix/util/cacheable.rb +73 -0
  33. data/lib/{matrix_sdk → active_matrix}/util/events.rb +8 -8
  34. data/lib/{matrix_sdk → active_matrix}/util/extensions.rb +6 -15
  35. data/lib/active_matrix/util/state_event_cache.rb +167 -0
  36. data/lib/{matrix_sdk → active_matrix}/util/uri.rb +4 -4
  37. data/lib/active_matrix/version.rb +5 -0
  38. data/lib/active_matrix.rb +81 -0
  39. data/lib/generators/active_matrix/bot/bot_generator.rb +38 -0
  40. data/lib/generators/active_matrix/bot/templates/bot.rb.erb +111 -0
  41. data/lib/generators/active_matrix/bot/templates/bot_spec.rb.erb +68 -0
  42. data/lib/generators/active_matrix/install/install_generator.rb +44 -0
  43. data/lib/generators/active_matrix/install/templates/README +30 -0
  44. data/lib/generators/active_matrix/install/templates/active_matrix.rb +33 -0
  45. data/lib/generators/active_matrix/install/templates/agent_memory.rb +47 -0
  46. data/lib/generators/active_matrix/install/templates/conversation_context.rb +72 -0
  47. data/lib/generators/active_matrix/install/templates/create_agent_memories.rb +17 -0
  48. data/lib/generators/active_matrix/install/templates/create_conversation_contexts.rb +21 -0
  49. data/lib/generators/active_matrix/install/templates/create_global_memories.rb +20 -0
  50. data/lib/generators/active_matrix/install/templates/create_matrix_agents.rb +26 -0
  51. data/lib/generators/active_matrix/install/templates/global_memory.rb +70 -0
  52. data/lib/generators/active_matrix/install/templates/matrix_agent.rb +127 -0
  53. metadata +168 -30
  54. data/lib/matrix_sdk/bot.rb +0 -4
  55. data/lib/matrix_sdk/util/account_data_cache.rb +0 -91
  56. data/lib/matrix_sdk/util/state_event_cache.rb +0 -92
  57. data/lib/matrix_sdk/util/tinycache.rb +0 -140
  58. data/lib/matrix_sdk/util/tinycache_adapter.rb +0 -87
  59. data/lib/matrix_sdk/version.rb +0 -5
  60. data/lib/matrix_sdk.rb +0 -75
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activematrix
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ostruct
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
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: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: simplecov
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,20 @@ dependencies:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: syslog
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: test-unit
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +108,34 @@ dependencies:
66
108
  - - ">="
67
109
  - !ruby/object:Gem::Version
68
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: vcr
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '6.2'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '6.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.19'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.19'
69
139
  - !ruby/object:Gem::Dependency
70
140
  name: activerecord
71
141
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +150,34 @@ dependencies:
80
150
  - - "~>"
81
151
  - !ruby/object:Gem::Version
82
152
  version: '8.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: bcrypt
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.1'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.1'
167
+ - !ruby/object:Gem::Dependency
168
+ name: concurrent-ruby
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.2'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.2'
83
181
  - !ruby/object:Gem::Dependency
84
182
  name: railties
85
183
  requirement: !ruby/object:Gem::Requirement
@@ -95,19 +193,33 @@ dependencies:
95
193
  - !ruby/object:Gem::Version
96
194
  version: '8.0'
97
195
  - !ruby/object:Gem::Dependency
98
- name: logging
196
+ name: state_machines-activerecord
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: 0.40.0
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: 0.40.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: zeitwerk
99
211
  requirement: !ruby/object:Gem::Requirement
100
212
  requirements:
101
213
  - - "~>"
102
214
  - !ruby/object:Gem::Version
103
- version: '2'
215
+ version: '2.6'
104
216
  type: :runtime
105
217
  prerelease: false
106
218
  version_requirements: !ruby/object:Gem::Requirement
107
219
  requirements:
108
220
  - - "~>"
109
221
  - !ruby/object:Gem::Version
110
- version: '2'
222
+ version: '2.6'
111
223
  description: A Ruby on Rails gem that provides seamless integration with the Matrix
112
224
  protocol, enabling Rails applications to connect and communicate with Matrix servers.
113
225
  email:
@@ -123,35 +235,61 @@ files:
123
235
  - CHANGELOG.md
124
236
  - LICENSE.txt
125
237
  - README.md
126
- - lib/matrix_sdk.rb
127
- - lib/matrix_sdk/api.rb
128
- - lib/matrix_sdk/bot.rb
129
- - lib/matrix_sdk/bot/base.rb
130
- - lib/matrix_sdk/bot/main.rb
131
- - lib/matrix_sdk/client.rb
132
- - lib/matrix_sdk/errors.rb
133
- - lib/matrix_sdk/mxid.rb
134
- - lib/matrix_sdk/protocols/as.rb
135
- - lib/matrix_sdk/protocols/cs.rb
136
- - lib/matrix_sdk/protocols/is.rb
137
- - lib/matrix_sdk/protocols/msc.rb
138
- - lib/matrix_sdk/protocols/ss.rb
139
- - lib/matrix_sdk/response.rb
140
- - lib/matrix_sdk/room.rb
141
- - lib/matrix_sdk/rooms/space.rb
142
- - lib/matrix_sdk/user.rb
143
- - lib/matrix_sdk/util/account_data_cache.rb
144
- - lib/matrix_sdk/util/events.rb
145
- - lib/matrix_sdk/util/extensions.rb
146
- - lib/matrix_sdk/util/state_event_cache.rb
147
- - lib/matrix_sdk/util/tinycache.rb
148
- - lib/matrix_sdk/util/tinycache_adapter.rb
149
- - lib/matrix_sdk/util/uri.rb
150
- - lib/matrix_sdk/version.rb
238
+ - lib/active_matrix.rb
239
+ - lib/active_matrix/agent_manager.rb
240
+ - lib/active_matrix/agent_registry.rb
241
+ - lib/active_matrix/api.rb
242
+ - lib/active_matrix/bot.rb
243
+ - lib/active_matrix/bot/base.rb
244
+ - lib/active_matrix/bot/main.rb
245
+ - lib/active_matrix/bot/multi_instance_base.rb
246
+ - lib/active_matrix/client.rb
247
+ - lib/active_matrix/client_pool.rb
248
+ - lib/active_matrix/errors.rb
249
+ - lib/active_matrix/event_router.rb
250
+ - lib/active_matrix/logging.rb
251
+ - lib/active_matrix/memory.rb
252
+ - lib/active_matrix/memory/agent_memory.rb
253
+ - lib/active_matrix/memory/base.rb
254
+ - lib/active_matrix/memory/conversation_memory.rb
255
+ - lib/active_matrix/memory/global_memory.rb
256
+ - lib/active_matrix/mxid.rb
257
+ - lib/active_matrix/protocols/as.rb
258
+ - lib/active_matrix/protocols/cs.rb
259
+ - lib/active_matrix/protocols/is.rb
260
+ - lib/active_matrix/protocols/msc.rb
261
+ - lib/active_matrix/protocols/ss.rb
262
+ - lib/active_matrix/railtie.rb
263
+ - lib/active_matrix/response.rb
264
+ - lib/active_matrix/room.rb
265
+ - lib/active_matrix/rooms/space.rb
266
+ - lib/active_matrix/user.rb
267
+ - lib/active_matrix/util/account_data_cache.rb
268
+ - lib/active_matrix/util/cacheable.rb
269
+ - lib/active_matrix/util/events.rb
270
+ - lib/active_matrix/util/extensions.rb
271
+ - lib/active_matrix/util/state_event_cache.rb
272
+ - lib/active_matrix/util/uri.rb
273
+ - lib/active_matrix/version.rb
274
+ - lib/generators/active_matrix/bot/bot_generator.rb
275
+ - lib/generators/active_matrix/bot/templates/bot.rb.erb
276
+ - lib/generators/active_matrix/bot/templates/bot_spec.rb.erb
277
+ - lib/generators/active_matrix/install/install_generator.rb
278
+ - lib/generators/active_matrix/install/templates/README
279
+ - lib/generators/active_matrix/install/templates/active_matrix.rb
280
+ - lib/generators/active_matrix/install/templates/agent_memory.rb
281
+ - lib/generators/active_matrix/install/templates/conversation_context.rb
282
+ - lib/generators/active_matrix/install/templates/create_agent_memories.rb
283
+ - lib/generators/active_matrix/install/templates/create_conversation_contexts.rb
284
+ - lib/generators/active_matrix/install/templates/create_global_memories.rb
285
+ - lib/generators/active_matrix/install/templates/create_matrix_agents.rb
286
+ - lib/generators/active_matrix/install/templates/global_memory.rb
287
+ - lib/generators/active_matrix/install/templates/matrix_agent.rb
151
288
  homepage: https://github.com/seuros/activematrix
152
289
  licenses:
153
290
  - MIT
154
- metadata: {}
291
+ metadata:
292
+ rubygems_mfa_required: 'true'
155
293
  rdoc_options: []
156
294
  require_paths:
157
295
  - lib
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'matrix_sdk'
4
- require 'matrix_sdk/bot/main'
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MatrixSdk::Util
4
- class AccountDataCache
5
- extend MatrixSdk::Extensions
6
- extend MatrixSdk::Util::Tinycache
7
- include Enumerable
8
-
9
- attr_reader :client, :room
10
-
11
- attr_accessor :cache_time
12
-
13
- ignore_inspect :client, :room, :tinycache_adapter
14
-
15
- def initialize(client, room: nil, cache_time: 1 * 60 * 60, **_params)
16
- raise ArgumentError, 'Must be given a Client instance' unless client.is_a? MatrixSdk::Client
17
-
18
- @client = client
19
- @cache_time = cache_time
20
-
21
- return unless room
22
-
23
- @room = room
24
- @room = client.ensure_room room unless @room.is_a? MatrixSdk::Room
25
- end
26
-
27
- def reload!
28
- tinycache_adapter.clear
29
- end
30
-
31
- def keys
32
- tinycache_adapter.send(:cache).keys
33
- end
34
-
35
- def values
36
- keys.map { |key| tinycache_adapter.read(key) }
37
- end
38
-
39
- def size
40
- keys.count
41
- end
42
-
43
- def key?(key)
44
- keys.key?(key.to_s)
45
- end
46
-
47
- def each(live: false)
48
- return to_enum(__method__, live: live) { keys.count } unless block_given?
49
-
50
- keys.each do |key|
51
- v = live ? self[key] : tinycache_adapter.read(key)
52
- # hash = v.hash
53
- yield key, v
54
- # self[key] = v if hash != v.hash
55
- end
56
- end
57
-
58
- def delete(key)
59
- key = key.to_s unless key.is_a? String
60
- if room
61
- client.api.set_room_account_data(client.mxid, room.id, key, {})
62
- else
63
- client.api.set_account_data(client.mxid, key, {})
64
- end
65
- tinycache_adapter.delete(key)
66
- end
67
-
68
- def [](key)
69
- key = key.to_s unless key.is_a? String
70
- tinycache_adapter.fetch(key, expires_in: @cache_time) do
71
- if room
72
- client.api.get_room_account_data(client.mxid, room.id, key)
73
- else
74
- client.api.get_account_data(client.mxid, key)
75
- end
76
- rescue MatrixSdk::MatrixNotFoundError
77
- {}
78
- end
79
- end
80
-
81
- def []=(key, value)
82
- key = key.to_s unless key.is_a? String
83
- if room
84
- client.api.set_room_account_data(client.mxid, room.id, key, value)
85
- else
86
- client.api.set_account_data(client.mxid, key, value)
87
- end
88
- tinycache_adapter.write(key, value)
89
- end
90
- end
91
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MatrixSdk::Util
4
- class StateEventCache
5
- extend MatrixSdk::Extensions
6
- extend MatrixSdk::Util::Tinycache
7
- include Enumerable
8
-
9
- attr_reader :room
10
-
11
- attr_accessor :cache_time
12
-
13
- ignore_inspect :client, :room, :tinycache_adapter
14
-
15
- def initialize(room, cache_time: 30 * 60, **_params)
16
- raise ArgumentError, 'Must be given a Room instance' unless room.is_a? MatrixSdk::Room
17
-
18
- @room = room
19
- @cache_time = cache_time
20
- end
21
-
22
- def client
23
- @room.client
24
- end
25
-
26
- def reload!
27
- tinycache_adapter.clear
28
- end
29
-
30
- def keys
31
- tinycache_adapter.send(:cache).keys.map do |type|
32
- real_type = type.split('|').first
33
- state_key = type.split('|').last
34
- state_key = nil if state_key == real_type
35
-
36
- [real_type, state_key]
37
- end
38
- end
39
-
40
- def values
41
- keys.map { |key| tinycache_adapter.read(key) }
42
- end
43
-
44
- def size
45
- keys.count
46
- end
47
-
48
- def key?(type, key = nil)
49
- keys.key?("#{type}#{key ? "|#{key}" : ''}")
50
- end
51
-
52
- def expire(type, key = nil)
53
- tinycache_adapter.expire("#{type}#{key ? "|#{key}" : ''}")
54
- end
55
-
56
- def each(live: false)
57
- return to_enum(__method__, live: live) { keys.count } unless block_given?
58
-
59
- keys.each do |type|
60
- real_type = type.split('|').first
61
- state_key = type.split('|').last
62
- state_key = nil if state_key == real_type
63
-
64
- v = live ? self[real_type, key: state_key] : tinycache_adapter.read(type)
65
- # hash = v.hash
66
- yield [real_type, state_key], v
67
- # self[key] = v if hash != v.hash
68
- end
69
- end
70
-
71
- def delete(type, key = nil)
72
- type = type.to_s unless type.is_a? String
73
- client.api.set_room_state(room.id, type, {}, **{ state_key: key }.compact)
74
- tinycache_adapter.delete("#{type}#{key ? "|#{key}" : ''}")
75
- end
76
-
77
- def [](type, key = nil)
78
- type = type.to_s unless type.is_a? String
79
- tinycache_adapter.fetch("#{type}#{key ? "|#{key}" : ''}", expires_in: @cache_time) do
80
- client.api.get_room_state(room.id, type, **{ key: key }.compact)
81
- rescue MatrixSdk::MatrixNotFoundError
82
- {}
83
- end
84
- end
85
-
86
- def []=(type, key = nil, value) # rubocop:disable Style/OptionalArguments Not possible to put optional last
87
- type = type.to_s unless type.is_a? String
88
- client.api.set_room_state(room.id, type, value, **{ state_key: key }.compact)
89
- tinycache_adapter.write("#{type}#{key ? "|#{key}" : ''}", value)
90
- end
91
- end
92
- end
@@ -1,140 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'matrix_sdk/util/tinycache_adapter'
4
-
5
- module MatrixSdk::Util
6
- module Tinycache
7
- CACHE_LEVELS = {
8
- none: 0,
9
- some: 1,
10
- all: 2
11
- }.freeze
12
-
13
- def self.adapter
14
- @adapter ||= TinycacheAdapter
15
- end
16
-
17
- def self.adapter=(adapter)
18
- @adapter = adapter
19
- end
20
-
21
- def self.extended(base)
22
- helper_name = base.send(:cache_helper_module_name)
23
- base.send :remove_const, helper_name if base.const_defined?(helper_name)
24
- base.prepend base.const_set(helper_name, Module.new)
25
-
26
- base.include InstanceMethods
27
- end
28
-
29
- def cached(*methods, **opts)
30
- methods.each { |method| build_cache_methods(method, **opts) }
31
- end
32
-
33
- module InstanceMethods
34
- def tinycache_adapter
35
- @tinycache_adapter ||= Tinycache.adapter.new.tap do |adapter|
36
- adapter.config = self.class.tinycache_adapter_config if adapter.respond_to? :config=
37
- adapter.client = client if respond_to?(:client) && adapter.respond_to?(:client=)
38
- end
39
- end
40
- end
41
-
42
- def tinycache_adapter_config
43
- @tinycache_adapter_config ||= {}
44
- end
45
-
46
- private
47
-
48
- def default_cache_key
49
- proc do |method_name, _method_args|
50
- method_name.to_sym
51
- end
52
- end
53
-
54
- def cache_helper_module_name
55
- class_name = name&.gsub(/:/, '') || to_s.gsub(/[^a-zA-Z_0-9]/, '')
56
- "#{class_name}Tinycache"
57
- end
58
-
59
- def build_cache_methods(method_name, cache_key: default_cache_key, cache_level: :none, expires_in: nil, **opts)
60
- raise ArgumentError, 'Cache key must be a three-arg proc' unless cache_key.is_a? Proc
61
-
62
- method_names = build_method_names(method_name)
63
- tinycache_adapter_config[method_name] = {
64
- level: cache_level,
65
- expires: expires_in || (1 * 365 * 24 * 60 * 60) # 1 year
66
- }
67
-
68
- helper = const_get(cache_helper_module_name)
69
- return if method_names.any? { |k, _| helper.respond_to? k }
70
-
71
- helper.class_eval do
72
- define_method(method_names[:cache_key]) do |*args|
73
- cache_key.call(method_name, args)
74
- end
75
-
76
- define_method(method_names[:with_cache]) do |*args|
77
- tinycache_adapter.fetch(__send__(method_names[:cache_key], *args), expires_in: expires_in) do
78
- named = args.delete_at(-1) if args.last.is_a? Hash
79
- named ||= {}
80
-
81
- __send__(method_names[:without_cache], *args, **named)
82
- end
83
- end
84
-
85
- define_method(method_names[:without_cache]) do |*args|
86
- orig = method(method_name).super_method
87
- named = args.delete_at(-1) if args.last.is_a? Hash
88
- named ||= {}
89
-
90
- orig.call(*args, **named)
91
- end
92
-
93
- define_method(method_names[:clear_cache]) do |*args|
94
- tinycache_adapter.delete(__send__(method_names[:cache_key], *args))
95
- end
96
-
97
- define_method(method_names[:cached]) do
98
- true
99
- end
100
-
101
- define_method(method_names[:has_value]) do |*args|
102
- tinycache_adapter.valid?(__send__(method_names[:cache_key], *args))
103
- end
104
-
105
- define_method(method_name) do |*args|
106
- unless_proc = opts[:unless].is_a?(Symbol) ? opts[:unless].to_proc : opts[:unless]
107
-
108
- raise ArgumentError, 'Invalid proc provided (must have arity between 1..3)' if unless_proc && !(1..3).include?(unless_proc.arity)
109
-
110
- skip_cache = false
111
- skip_cache ||= unless_proc.call(self, method_name, args) if unless_proc&.arity == 3
112
- skip_cache ||= unless_proc.call(method_name, args) if unless_proc&.arity == 2
113
- skip_cache ||= unless_proc.call(args) if unless_proc&.arity == 1
114
- skip_cache ||= CACHE_LEVELS[client&.cache || :all] < CACHE_LEVELS[cache_level]
115
-
116
- if skip_cache
117
- __send__(method_names[:without_cache], *args)
118
- else
119
- __send__(method_names[:with_cache], *args)
120
- end
121
- end
122
- end
123
- end
124
-
125
- def build_method_names(method)
126
- # Clean up method name (split any suffix)
127
- method_name = method.to_s.sub(/([?!=])$/, '')
128
- punctuation = Regexp.last_match(-1)
129
-
130
- {
131
- cache_key: "#{method_name}_cache_key#{punctuation}",
132
- with_cache: "#{method_name}_with_cache#{punctuation}",
133
- without_cache: "#{method_name}_without_cache#{punctuation}",
134
- clear_cache: "clear_#{method_name}_cache#{punctuation}",
135
- cached: "#{method}_cached?",
136
- has_value: "#{method}_has_value?"
137
- }
138
- end
139
- end
140
- end
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MatrixSdk::Util
4
- class TinycacheAdapter
5
- extend MatrixSdk::Extensions
6
-
7
- attr_accessor :config, :client
8
-
9
- ignore_inspect :client
10
-
11
- def initialize
12
- @config = {}
13
-
14
- clear
15
- end
16
-
17
- def read(key)
18
- cache[key]&.value
19
- end
20
-
21
- def write(key, value, expires_in: nil, cache_level: nil)
22
- expires_in ||= config.dig(key, :expires)
23
- expires_in ||= 24 * 60 * 60
24
- cache_level ||= client&.cache
25
- cache_level ||= :all
26
- cache_level = Tinycache::CACHE_LEVELS[cache_level] unless cache_level.is_a? Integer
27
-
28
- return value if cache_level < Tinycache::CACHE_LEVELS[config.dig(key, :level) || :none]
29
-
30
- cache[key] = Value.new(value, Time.now, Time.now + expires_in)
31
- value
32
- end
33
-
34
- def exist?(key)
35
- cache.key?(key)
36
- end
37
-
38
- def valid?(key)
39
- exist?(key) && !cache[key].expired?
40
- end
41
-
42
- def fetch(key, expires_in: nil, cache_level: nil, **_opts)
43
- expires_in ||= config.dig(key, :expires)
44
- cache_level ||= client&.cache
45
- cache_level ||= :all
46
- cache_level = Tinycache::CACHE_LEVELS[cache_level]
47
-
48
- return read(key) if exist?(key) && !cache[key].expired?
49
-
50
- value = yield
51
- write(key, value, expires_in: expires_in, cache_level: cache_level)
52
- end
53
-
54
- def delete(key)
55
- return false unless exist?(key)
56
-
57
- cache.delete key
58
- true
59
- end
60
-
61
- def expire(key)
62
- return unless exist? key
63
-
64
- cache[key].expires_at = Time.at(0)
65
- end
66
-
67
- def clear
68
- @cache = {}
69
- end
70
-
71
- def cleanup
72
- @cache.select { |_, v| v.expired? }.each { |_, v| v.value = nil }
73
- end
74
-
75
- private
76
-
77
- Value = Struct.new(:value, :timestamp, :expires_at) do
78
- def expired?
79
- return false if expires_at.nil?
80
-
81
- Time.now > expires_at
82
- end
83
- end
84
-
85
- attr_reader :cache
86
- end
87
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MatrixSdk
4
- VERSION = '0.0.0'
5
- end