cymometer 1.2.0 → 1.2.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 +1 -1
- data/lib/cymometer/counter.rb +19 -22
- data/lib/cymometer/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 20fd5ba47d84bc46e3a7addbea10c7a7703d72203b29b7a72a98298412f926f9
|
|
4
|
+
data.tar.gz: 84c7c887ddd5db7d15fb4eef9572a021d1184fb53eb2fa516e8ca529a8a05414
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: be285678db56e5ef239b75c1f375a82c080ab79a65080c3147945187c61a469a967aafe270149bf1bfd8bd8095e1b94b36015d475564b7948448ae55bb404cbf
|
|
7
|
+
data.tar.gz: 10caff6237da7ddd93cba8db278e96d339598b4a1276d2092321b682299c29b7e73974fecb10b4738578fba1015beedec29c5efbd78e1f3b2b0526458ea6c955
|
data/README.md
CHANGED
|
@@ -306,7 +306,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
|
306
306
|
|
|
307
307
|
## Contributing
|
|
308
308
|
|
|
309
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
309
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/chtzvt/cymometer.
|
|
310
310
|
|
|
311
311
|
## License
|
|
312
312
|
|
data/lib/cymometer/counter.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require "securerandom"
|
|
2
|
+
require "digest/sha1"
|
|
2
3
|
|
|
3
4
|
module Cymometer
|
|
4
5
|
class Counter
|
|
@@ -8,7 +9,7 @@ module Cymometer
|
|
|
8
9
|
|
|
9
10
|
attr_reader :window, :limit, :key
|
|
10
11
|
|
|
11
|
-
INCREMENT_LUA_SCRIPT = <<-LUA
|
|
12
|
+
INCREMENT_LUA_SCRIPT = <<-LUA.freeze
|
|
12
13
|
local key = KEYS[1]
|
|
13
14
|
local current_time = tonumber(ARGV[1])
|
|
14
15
|
local window = tonumber(ARGV[2])
|
|
@@ -31,7 +32,7 @@ module Cymometer
|
|
|
31
32
|
end
|
|
32
33
|
LUA
|
|
33
34
|
|
|
34
|
-
DECREMENT_LUA_SCRIPT = <<-LUA
|
|
35
|
+
DECREMENT_LUA_SCRIPT = <<-LUA.freeze
|
|
35
36
|
local key = KEYS[1]
|
|
36
37
|
local current_time = tonumber(ARGV[1])
|
|
37
38
|
local window = tonumber(ARGV[2])
|
|
@@ -54,13 +55,18 @@ module Cymometer
|
|
|
54
55
|
end
|
|
55
56
|
LUA
|
|
56
57
|
|
|
58
|
+
@increment_sha = Digest::SHA1.hexdigest(INCREMENT_LUA_SCRIPT).freeze
|
|
59
|
+
@decrement_sha = Digest::SHA1.hexdigest(DECREMENT_LUA_SCRIPT).freeze
|
|
60
|
+
|
|
61
|
+
class << self
|
|
62
|
+
attr_reader :increment_sha, :decrement_sha
|
|
63
|
+
end
|
|
64
|
+
|
|
57
65
|
def initialize(key_namespace: nil, key: nil, limit: nil, window: nil, redis: nil)
|
|
58
66
|
@redis = redis || Cymometer.redis
|
|
59
67
|
@key = "#{key_namespace || "cymometer"}:#{key || generate_key}"
|
|
60
68
|
@window = window || DEFAULT_WINDOW
|
|
61
69
|
@limit = limit || 1
|
|
62
|
-
@increment_sha = nil
|
|
63
|
-
@decrement_sha = nil
|
|
64
70
|
end
|
|
65
71
|
|
|
66
72
|
# Atomically increments the counter and checks the limit
|
|
@@ -70,7 +76,6 @@ module Cymometer
|
|
|
70
76
|
|
|
71
77
|
result = evalsha_with_fallback(
|
|
72
78
|
:increment,
|
|
73
|
-
INCREMENT_LUA_SCRIPT,
|
|
74
79
|
keys: [@key],
|
|
75
80
|
argv: [current_time, window, @limit]
|
|
76
81
|
)
|
|
@@ -90,7 +95,6 @@ module Cymometer
|
|
|
90
95
|
|
|
91
96
|
result = evalsha_with_fallback(
|
|
92
97
|
:decrement,
|
|
93
|
-
DECREMENT_LUA_SCRIPT,
|
|
94
98
|
keys: [@key],
|
|
95
99
|
argv: [current_time, window]
|
|
96
100
|
)
|
|
@@ -126,23 +130,16 @@ module Cymometer
|
|
|
126
130
|
SecureRandom.uuid
|
|
127
131
|
end
|
|
128
132
|
|
|
129
|
-
def evalsha_with_fallback(type,
|
|
130
|
-
|
|
133
|
+
def evalsha_with_fallback(type, keys:, argv:)
|
|
134
|
+
script = (type == :increment) ? INCREMENT_LUA_SCRIPT : DECREMENT_LUA_SCRIPT
|
|
135
|
+
sha = (type == :increment) ? self.class.increment_sha : self.class.decrement_sha
|
|
131
136
|
|
|
132
|
-
sha
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
rescue Redis::CommandError => e
|
|
139
|
-
raise unless e.message.include?("NOSCRIPT")
|
|
140
|
-
|
|
141
|
-
# If the script wasn't loaded, reload and try again
|
|
142
|
-
sha = @redis.script(:load, script)
|
|
143
|
-
instance_variable_set(sha_var, sha)
|
|
144
|
-
@redis.evalsha(sha, keys: keys, argv: argv)
|
|
145
|
-
end
|
|
137
|
+
@redis.evalsha(sha, keys: keys, argv: argv)
|
|
138
|
+
rescue Redis::CommandError => e
|
|
139
|
+
raise unless e.message.include?("NOSCRIPT")
|
|
140
|
+
|
|
141
|
+
@redis.script(:load, script)
|
|
142
|
+
@redis.evalsha(sha, keys: keys, argv: argv)
|
|
146
143
|
end
|
|
147
144
|
end
|
|
148
145
|
end
|
data/lib/cymometer/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cymometer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Charlton Trezevant
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-06-
|
|
11
|
+
date: 2025-06-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: A simple, atomic, memory-efficient frequency counter backed by Redis
|
|
14
14
|
Sorted Sets.
|
|
@@ -28,13 +28,13 @@ files:
|
|
|
28
28
|
- lib/cymometer/helper.rb
|
|
29
29
|
- lib/cymometer/version.rb
|
|
30
30
|
- sig/cymometer.rbs
|
|
31
|
-
homepage: https://github.com/
|
|
31
|
+
homepage: https://github.com/chtzvt/cymometer
|
|
32
32
|
licenses:
|
|
33
33
|
- MIT
|
|
34
34
|
metadata:
|
|
35
|
-
homepage_uri: https://github.com/
|
|
36
|
-
source_code_uri: https://github.com/
|
|
37
|
-
changelog_uri: https://github.com/
|
|
35
|
+
homepage_uri: https://github.com/chtzvt/cymometer
|
|
36
|
+
source_code_uri: https://github.com/chtzvt/cymometer
|
|
37
|
+
changelog_uri: https://github.com/chtzvt/cymometer
|
|
38
38
|
post_install_message:
|
|
39
39
|
rdoc_options: []
|
|
40
40
|
require_paths:
|