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
|