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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 150360c27078f80b80d9531315d4889593e0351fcca5a6a91825ac293ea9d56a
4
- data.tar.gz: 3933828dedeed48b056b6e9e61e8c0e31ad66ea193734ee79df2aa817cd3a05d
3
+ metadata.gz: 20fd5ba47d84bc46e3a7addbea10c7a7703d72203b29b7a72a98298412f926f9
4
+ data.tar.gz: 84c7c887ddd5db7d15fb4eef9572a021d1184fb53eb2fa516e8ca529a8a05414
5
5
  SHA512:
6
- metadata.gz: a558786ac975e737ae70e32fe1c4293f6f55faad9294a1208871a1c3f06d09e2325437b9b60aa7b9a269280949696fbbda8d03b5b1ca669eedf4a40d49c528c2
7
- data.tar.gz: 47fefe6630bb6303a31e8359597e606391296257218670492342b8b7f3793ff97cf78fb10f9dfbe21a2f09c7ff3ed9c6c5be68b6140c86c9b743f22ffec7cb44
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/packfiles/cymometer.
309
+ Bug reports and pull requests are welcome on GitHub at https://github.com/chtzvt/cymometer.
310
310
 
311
311
  ## License
312
312
 
@@ -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.0"
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.0
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.
@@ -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/packfiles/cymometer
31
+ homepage: https://github.com/chtzvt/cymometer
32
32
  licenses:
33
33
  - MIT
34
34
  metadata:
35
- homepage_uri: https://github.com/packfiles/cymometer
36
- source_code_uri: https://github.com/packfiles/cymometer
37
- changelog_uri: https://github.com/packfiles/cymometer
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: