cymometer 1.2.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b6b049e6e1eb9a3e85d76744dbe9b01644b5458d8ab4f865bb8e8eb9e63090f
4
- data.tar.gz: 9e4aa50e9cd945d3f59b67dda14dd5b74f7efdd07236d251fde2279a07957770
3
+ metadata.gz: 20fd5ba47d84bc46e3a7addbea10c7a7703d72203b29b7a72a98298412f926f9
4
+ data.tar.gz: 84c7c887ddd5db7d15fb4eef9572a021d1184fb53eb2fa516e8ca529a8a05414
5
5
  SHA512:
6
- metadata.gz: 01df592e5d19b1c9190b36c53934f00dde718e651cd8fa9abcfe9bef164f39aa4ee79b69b4e94bf293714bce0d94d05a7e27e23e901dc3fd541b500e2185aa45
7
- data.tar.gz: 675e54015097691ea021beffe114a81ca72bdc3d5d9282d0e78852edd4af7eee3270349bc558c621f58773f2edfd152dceb6ede2ffac96bfbc68ba6226435b7e
6
+ metadata.gz: be285678db56e5ef239b75c1f375a82c080ab79a65080c3147945187c61a469a967aafe270149bf1bfd8bd8095e1b94b36015d475564b7948448ae55bb404cbf
7
+ data.tar.gz: 10caff6237da7ddd93cba8db278e96d339598b4a1276d2092321b682299c29b7e73974fecb10b4738578fba1015beedec29c5efbd78e1f3b2b0526458ea6c955
@@ -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, script, keys:, argv:)
130
- sha_var = (type == :increment) ? :@increment_sha : :@decrement_sha
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 = instance_variable_get(sha_var)
133
- begin
134
- # Try EVALSHA first
135
- sha ||= @redis.script(:load, script)
136
- instance_variable_set(sha_var, sha)
137
- @redis.evalsha(sha, keys: keys, argv: argv)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cymometer
4
- VERSION = "1.2.1"
4
+ VERSION = "1.2.2"
5
5
  end
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.1
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 00:00:00.000000000 Z
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.