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.
- checksums.yaml +4 -4
- data/README.md +218 -51
- data/lib/active_matrix/agent_manager.rb +275 -0
- data/lib/active_matrix/agent_registry.rb +154 -0
- data/lib/{matrix_sdk → active_matrix}/api.rb +18 -22
- data/lib/{matrix_sdk → active_matrix}/bot/base.rb +42 -39
- data/lib/{matrix_sdk → active_matrix}/bot/main.rb +4 -5
- data/lib/active_matrix/bot/multi_instance_base.rb +189 -0
- data/lib/active_matrix/bot.rb +7 -0
- data/lib/{matrix_sdk → active_matrix}/client.rb +21 -34
- data/lib/active_matrix/client_pool.rb +194 -0
- data/lib/{matrix_sdk → active_matrix}/errors.rb +4 -4
- data/lib/active_matrix/event_router.rb +215 -0
- data/lib/active_matrix/logging.rb +56 -0
- data/lib/active_matrix/memory/agent_memory.rb +128 -0
- data/lib/active_matrix/memory/base.rb +101 -0
- data/lib/active_matrix/memory/conversation_memory.rb +161 -0
- data/lib/active_matrix/memory/global_memory.rb +153 -0
- data/lib/active_matrix/memory.rb +28 -0
- data/lib/{matrix_sdk → active_matrix}/mxid.rb +2 -2
- data/lib/{matrix_sdk → active_matrix}/protocols/as.rb +1 -1
- data/lib/{matrix_sdk → active_matrix}/protocols/cs.rb +6 -8
- data/lib/{matrix_sdk → active_matrix}/protocols/is.rb +1 -1
- data/lib/{matrix_sdk → active_matrix}/protocols/msc.rb +6 -8
- data/lib/{matrix_sdk → active_matrix}/protocols/ss.rb +2 -2
- data/lib/active_matrix/railtie.rb +18 -0
- data/lib/{matrix_sdk → active_matrix}/response.rb +2 -2
- data/lib/{matrix_sdk → active_matrix}/room.rb +148 -72
- data/lib/{matrix_sdk → active_matrix}/rooms/space.rb +3 -7
- data/lib/{matrix_sdk → active_matrix}/user.rb +23 -15
- data/lib/active_matrix/util/account_data_cache.rb +129 -0
- data/lib/active_matrix/util/cacheable.rb +73 -0
- data/lib/{matrix_sdk → active_matrix}/util/events.rb +8 -8
- data/lib/{matrix_sdk → active_matrix}/util/extensions.rb +6 -15
- data/lib/active_matrix/util/state_event_cache.rb +167 -0
- data/lib/{matrix_sdk → active_matrix}/util/uri.rb +4 -4
- data/lib/active_matrix/version.rb +5 -0
- data/lib/active_matrix.rb +81 -0
- data/lib/generators/active_matrix/bot/bot_generator.rb +38 -0
- data/lib/generators/active_matrix/bot/templates/bot.rb.erb +111 -0
- data/lib/generators/active_matrix/bot/templates/bot_spec.rb.erb +68 -0
- data/lib/generators/active_matrix/install/install_generator.rb +44 -0
- data/lib/generators/active_matrix/install/templates/README +30 -0
- data/lib/generators/active_matrix/install/templates/active_matrix.rb +33 -0
- data/lib/generators/active_matrix/install/templates/agent_memory.rb +47 -0
- data/lib/generators/active_matrix/install/templates/conversation_context.rb +72 -0
- data/lib/generators/active_matrix/install/templates/create_agent_memories.rb +17 -0
- data/lib/generators/active_matrix/install/templates/create_conversation_contexts.rb +21 -0
- data/lib/generators/active_matrix/install/templates/create_global_memories.rb +20 -0
- data/lib/generators/active_matrix/install/templates/create_matrix_agents.rb +26 -0
- data/lib/generators/active_matrix/install/templates/global_memory.rb +70 -0
- data/lib/generators/active_matrix/install/templates/matrix_agent.rb +127 -0
- metadata +168 -30
- data/lib/matrix_sdk/bot.rb +0 -4
- data/lib/matrix_sdk/util/account_data_cache.rb +0 -91
- data/lib/matrix_sdk/util/state_event_cache.rb +0 -92
- data/lib/matrix_sdk/util/tinycache.rb +0 -140
- data/lib/matrix_sdk/util/tinycache_adapter.rb +0 -87
- data/lib/matrix_sdk/version.rb +0 -5
- 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.
|
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:
|
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/
|
127
|
-
- lib/
|
128
|
-
- lib/
|
129
|
-
- lib/
|
130
|
-
- lib/
|
131
|
-
- lib/
|
132
|
-
- lib/
|
133
|
-
- lib/
|
134
|
-
- lib/
|
135
|
-
- lib/
|
136
|
-
- lib/
|
137
|
-
- lib/
|
138
|
-
- lib/
|
139
|
-
- lib/
|
140
|
-
- lib/
|
141
|
-
- lib/
|
142
|
-
- lib/
|
143
|
-
- lib/
|
144
|
-
- lib/
|
145
|
-
- lib/
|
146
|
-
- lib/
|
147
|
-
- lib/
|
148
|
-
- lib/
|
149
|
-
- lib/
|
150
|
-
- lib/
|
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
|
data/lib/matrix_sdk/bot.rb
DELETED
@@ -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
|