safer_redis 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0c31676a608f111b89e5de3b5ec1ba3cc46b276afb362eee6aebd1a43120cfb
4
- data.tar.gz: 0bc66dde14999d62732ade01b0cf36f645cff45911eff4c818ab0f696bbe9bee
3
+ metadata.gz: 2b398837bfdbe584e367b80c02a881ebd6a9b2c975efc3aa4e36184530306cad
4
+ data.tar.gz: d3adf217f7f8df1a0bda2b1e33335cab5d5733609820f5ae1ac6b60634d94cd2
5
5
  SHA512:
6
- metadata.gz: a854dda2a09c6dd52330afc9de66895eba48447767da9e0cf53bc7a9a7c3dd7e64ca2c1ea4c590f15be29d4bfc53bf7751b9335a09150b85e34d932586f42de6
7
- data.tar.gz: 11d94efde9334fd9e242ebd2ec7dcd6ff1a320731cda4f1ec537ca333f642d933b9e87b2cbf0cc16171ecb1c34294570897fa191a60bda823de0c107d3622e5f
6
+ metadata.gz: ba297615b774f407a5999a2454c0941a8dc492a9c8a9a2f221eabf8f60cdf4e4f6804cb1009fa04fd9131a1ea332eb9872fc7b5222adb89e1b4c61d2aec71575
7
+ data.tar.gz: e0337bdb4775911ad7bc13b2d559516e1a1a52492c9ad37c6401479ad9ade20abf64b81b09e4ffec7493decb9104e95eb8ce49f20d5b953c5af763287c55259f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.1.0] - 2023-01-07
4
+
5
+ - Allow `@slow` if it's only `O(1)` complexity, e.g. the `SET` (string) command.
6
+
3
7
  ## [1.0.0] - 2022-12-02
4
8
 
5
9
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- safer_redis (0.1.0)
4
+ safer_redis (1.0.0)
5
5
  redis (>= 4.6.0)
6
6
  zeitwerk
7
7
 
@@ -11,9 +11,9 @@ GEM
11
11
  connection_pool (2.3.0)
12
12
  diff-lcs (1.5.0)
13
13
  rake (13.0.6)
14
- redis (5.0.5)
14
+ redis (5.0.6)
15
15
  redis-client (>= 0.9.0)
16
- redis-client (0.11.2)
16
+ redis-client (0.12.1)
17
17
  connection_pool
18
18
  rspec (3.12.0)
19
19
  rspec-core (~> 3.12.0)
@@ -32,6 +32,7 @@ GEM
32
32
 
33
33
  PLATFORMS
34
34
  x86_64-darwin-21
35
+ x86_64-darwin-22
35
36
 
36
37
  DEPENDENCIES
37
38
  rake (~> 13.0)
@@ -52,6 +52,10 @@ module SaferRedis
52
52
  command.fetch("complexity", nil)
53
53
  end
54
54
 
55
+ def suggestion
56
+ Suggestion.for_command(name)
57
+ end
58
+
55
59
  private
56
60
 
57
61
  def command
@@ -15,6 +15,13 @@ module SaferRedis
15
15
  If you're sure this is okay, you can try again within `SaferRedis.really { ... }`
16
16
  MESSAGE
17
17
 
18
+ if doc.suggestion
19
+ message = <<~MESSAGE
20
+ #{message}
21
+ Suggestion: #{doc.suggestion.description}
22
+ MESSAGE
23
+ end
24
+
18
25
  super(message)
19
26
  end
20
27
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SaferRedis
4
+ class Suggestion
5
+ attr_reader :command, :description
6
+
7
+ def initialize(command, description)
8
+ @command = command
9
+ @description = description
10
+ end
11
+
12
+ def self.for_command(command)
13
+ case command
14
+ when "DEL"
15
+ new(command, "Consider using the non-blocking UNLINK command instead to delete the key on a background thread")
16
+ else
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SaferRedis
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
data/lib/safer_redis.rb CHANGED
@@ -28,7 +28,13 @@ module SaferRedis
28
28
  end
29
29
 
30
30
  def self.assess!(doc)
31
- if doc.dangerous? || doc.slow?
31
+ if doc.dangerous?
32
+ # Anything tagged @dangerous is… dangerous
33
+ raise SaferRedis::Danger.new(doc)
34
+
35
+ elsif doc.slow? && doc.complexity != "O(1)"
36
+ # Anything tagged @slow might be dangerous, but we'll let through O(1)
37
+ # complexity commands e.g. SET
32
38
  raise SaferRedis::Danger.new(doc)
33
39
  end
34
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safer_redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Annesley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-02 00:00:00.000000000 Z
11
+ date: 2023-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -59,8 +59,8 @@ files:
59
59
  - lib/safer_redis/command_doc.rb
60
60
  - lib/safer_redis/danger.rb
61
61
  - lib/safer_redis/interceptor.rb
62
+ - lib/safer_redis/suggestion.rb
62
63
  - lib/safer_redis/version.rb
63
- - safer_redis.gemspec
64
64
  - sig/safer_redis.rbs
65
65
  homepage: https://github.com/buildkite/safer_redis
66
66
  licenses:
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
86
  requirements: []
87
- rubygems_version: 3.1.6
87
+ rubygems_version: 3.4.1
88
88
  signing_key:
89
89
  specification_version: 4
90
90
  summary: Catch unsafe Redis commands in production
data/safer_redis.gemspec DELETED
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/safer_redis/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "safer_redis"
7
- spec.version = SaferRedis::VERSION
8
- spec.authors = ["Paul Annesley"]
9
- spec.email = ["paul@annesley.cc"]
10
-
11
- spec.summary = "Catch unsafe Redis commands in production"
12
- spec.description = "SaferRedis warns you before letting through commands that could impact production availability by being marked `@slow` or `@dangerous` in the Redis documentation"
13
- spec.homepage = "https://github.com/buildkite/safer_redis"
14
- spec.license = "MIT"
15
- spec.required_ruby_version = ">= 2.6.0"
16
-
17
- spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = "https://github.com/buildkite/safer_redis"
19
- spec.metadata["changelog_uri"] = "https://github.com/buildkite/safer_redis/blob/main/CHANGELOG.md"
20
-
21
- # Specify which files should be added to the gem when it is released.
22
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(__dir__) do
24
- `git ls-files -z`.split("\x0").reject do |f|
25
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
26
- end
27
- end
28
- spec.require_paths = ["lib"]
29
-
30
- # The only strategy implemented so far is intercepting the private Redis#send_command method,
31
- # which was introduced in v4.6.0 via https://github.com/redis/redis-rb/pull/1058 and remains
32
- # in the latest release (v5.0.5) at time of writing.
33
- spec.add_dependency "redis", ">= 4.6.0"
34
- spec.add_dependency "zeitwerk"
35
- end