bottleneck 0.4.2 → 0.4.3

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
  SHA1:
3
- metadata.gz: 42281ac9ac20f1a15452c335a67fa510bc4cf4a1
4
- data.tar.gz: 21f2ebab21d35f82ed6a67a5406ae376e71d1ffa
3
+ metadata.gz: 22d916e42ef02a5ad281db4499e3d3e35855b34b
4
+ data.tar.gz: f61fe13668ac348fc40040df8f90f0f5eed1c2f0
5
5
  SHA512:
6
- metadata.gz: 895fc354c07a4d1f775c087ed100ff4e257a6a51d544560fe81b8522ec06242897ad9a29df5257ac4768b6b2a13a969df3007032b7f6ad5861739adaf3d993a6
7
- data.tar.gz: eae36948a25b82c5f1b3a2f5b86e39bb163a0866c10629de0c78959f7902b7a2d7b486abd04fd3b222281ea9da65130fafcf0f22e102b56b5e3701a5b20e4088
6
+ metadata.gz: 29f95a6863d82b3d7b4a34c5ed3c8683858592b517c39a42c0d85503c4027c7189d7a80d2c980f3624de4d931b01b31e82fe04d5f80dbbbf7d24c168b2ae4647
7
+ data.tar.gz: d75e87c21de2d47e6bfe429a9805d7f98cbb352bee9a1f5fee89c0cb05a4c11525524bfe08e7545240e8440afb0de46e37b84c8a7acb775c5bd7a7b54551e5e1
data/.travis.yml CHANGED
@@ -1,5 +1,9 @@
1
1
  sudo: false
2
2
  language: ruby
3
+ services:
4
+ - redis-server
3
5
  rvm:
4
6
  - 2.4.2
5
7
  before_install: gem install bundler -v 1.16.0
8
+ script:
9
+ - bundle exec rspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bottleneck (0.4.1)
4
+ bottleneck (0.4.2)
5
5
  redis (~> 4.0)
6
6
  redis-namespace (~> 1.6.0)
7
7
 
@@ -10,12 +10,15 @@ GEM
10
10
  specs:
11
11
  ast (2.4.0)
12
12
  diff-lcs (1.3)
13
+ fakeredis (0.7.0)
14
+ redis (>= 3.2, < 5.0)
13
15
  parallel (1.12.1)
14
16
  parser (2.5.0.2)
15
17
  ast (~> 2.4.0)
16
18
  powerpack (0.1.1)
17
19
  rainbow (3.0.0)
18
20
  rake (10.5.0)
21
+ rdoc (6.0.1)
19
22
  redis (4.0.1)
20
23
  redis-namespace (1.6.0)
21
24
  redis (>= 3.0.4)
@@ -48,7 +51,9 @@ PLATFORMS
48
51
  DEPENDENCIES
49
52
  bottleneck!
50
53
  bundler (~> 1.16)
54
+ fakeredis (~> 0.6)
51
55
  rake (~> 10.0)
56
+ rdoc (~> 6.0.1)
52
57
  rspec (~> 3.0)
53
58
  rubocop (~> 0.52.1)
54
59
 
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
- # Bottleneck
1
+ [![Build Status](https://travis-ci.org/maratgaliev/bottleneck.svg?branch=master)](https://travis-ci.org/maratgaliev/bottleneck)
2
2
 
3
- Bottleneck - simple Redis based requests limiter with two params:
3
+ # Bottleneck
4
4
 
5
- * time_period_seconds: 3600
6
- * max_requests_count: 100
5
+ Bottleneck - simple Redis based requests limiter.
7
6
 
8
7
  ## Installation
9
8
 
@@ -27,29 +26,35 @@ Create two yaml files in config dir:
27
26
 
28
27
  **bottleneck.yml**
29
28
 
29
+ ```ruby
30
30
  limits:
31
31
  time_period_seconds: 3600
32
32
  max_requests_count: 100
33
-
33
+ ```
34
34
  **redis.yml**
35
+
36
+ ```ruby
35
37
  host: 'localhost'
36
38
  port: 6379
39
+ ```
37
40
 
38
- Add before action:
41
+ Add before action to your controller:
42
+ ```ruby
39
43
  class ApplicationController < ActionController::API
40
44
  before_action :check_limit
41
45
 
42
46
  private
43
47
 
44
48
  def check_limit
45
- result = Bottleneck.check(request)
49
+ result = Bottleneck.check(request.remote_ip)
46
50
  render status: result[:status], json: { message: result[:message] }
47
51
  end
48
52
  end
53
+ ```
49
54
 
50
55
  ## Contributing
51
56
 
52
- Bug reports and pull requests are welcome on GitHub at https://github.com/maratgaliev/bottleneck. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
57
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/maratgaliev/bottleneck](https://github.com/maratgaliev/bottleneck).
53
58
 
54
59
  ## License
55
60
 
data/bottleneck.gemspec CHANGED
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  spec.add_development_dependency "rubocop", "~> 0.52.1"
28
+ spec.add_development_dependency "rdoc", "~> 6.0"
29
+ spec.add_development_dependency "fakeredis", "~> 0.6"
28
30
  spec.add_dependency "redis", "~> 4.0"
29
- spec.add_dependency "redis-namespace", "~> 1.6.0"
31
+ spec.add_dependency "redis-namespace", "~> 1.6"
30
32
  end
@@ -2,15 +2,22 @@ require "bottleneck/constants"
2
2
 
3
3
  module Bottleneck
4
4
  class Core
5
+ # Create a Core object.
6
+ #
7
+ # @param [String] ip A name to uniquely identify this rate limit. For example, '127.0.0.1'
8
+ #
9
+ # @return [Core] Core instance
5
10
  def initialize(ip)
6
11
  @ip = ip.to_s
7
12
  @storage = Bottleneck.storage
8
13
  @limits = Bottleneck.config["limits"]
9
14
  end
10
15
 
16
+ # Run main logic initialization, set and read Redis keys and validation requests count and time limit.
17
+ #
18
+ # @return [Hash] Hash with :status and :message keys
11
19
  def run
12
20
  client_ip = @ip
13
- # create key in redis, based on client's IP
14
21
  key = "request_count:#{client_ip}"
15
22
  result = { status: Constants::SUCCESS_STATUS, message: Constants::OK_MESSAGE }
16
23
  requests_count = @storage.get(key)
@@ -29,11 +36,20 @@ module Bottleneck
29
36
 
30
37
  private
31
38
 
39
+ # Get remaining time in seconds for key.
40
+ #
41
+ # @param [String] key A unique key in Redis store
42
+ #
43
+ # @return [Integer] Countdown in seconds
32
44
  def period(key)
33
- # get remaining seconds with TTL from redis
34
45
  @storage.ttl(key)
35
46
  end
36
47
 
48
+ # Return string message for 429 status
49
+ #
50
+ # @param [Integer] secs Remaining seconds
51
+ #
52
+ # @return [String] Rate limit message with seconds
37
53
  def message(secs)
38
54
  "Rate limit exceeded. Try again in #{secs} seconds"
39
55
  end
@@ -1,3 +1,3 @@
1
1
  module Bottleneck
2
- VERSION = "0.4.2".freeze
2
+ VERSION = "0.4.3".freeze
3
3
  end
data/lib/bottleneck.rb CHANGED
@@ -6,33 +6,47 @@ require "redis-namespace"
6
6
 
7
7
  module Bottleneck
8
8
  class << self
9
+ # Run method call on Core object
10
+ #
11
+ # @param [String] A name to uniquely identify this rate limit. For example, '127.0.0.1'
9
12
  def check(ip)
10
13
  Core.new(ip).run
11
14
  end
12
15
 
16
+ # Init Redis Namespace storage
17
+ #
18
+ # @return [Redis::Namespace] Redis::Namespace instance
13
19
  def storage
14
20
  init_storage
15
21
  end
16
22
 
23
+ # Init Redis instance
24
+ #
25
+ # @return [Redis] Redis instance
17
26
  def redis_conn
18
27
  redis_conf = load_config("redis.yml")
19
28
  Redis.new(host: redis_conf["host"], port: redis_conf["port"])
20
29
  end
21
30
 
22
- # Init redis client from config
31
+ # Init Redis Namespace storage
32
+ #
33
+ # @return [Redis::Namespace] Redis::Namespace instance
23
34
  def init_storage
24
35
  Redis::Namespace.new(:bottleneck, redis: redis_conn)
25
36
  end
26
37
 
27
- # Get limits from config
38
+ # Load limits config file
39
+ #
40
+ # @return [Hash] Hash for bottleneck.yml file
28
41
  def config
29
42
  load_config("bottleneck.yml")
30
43
  end
31
44
 
32
45
  private
33
-
46
+ # Load config file
47
+ #
48
+ # @return [Hash] Hash with configuration
34
49
  def load_config(file)
35
- # Check for Rails defined, or use current path
36
50
  root = (defined?(Rails) && Rails.respond_to?(:root) && Rails.root) || Dir.pwd
37
51
  path = "#{root}/config/#{file}"
38
52
  raise "No #{file} file found in your config directory!" unless File.exist?(path)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bottleneck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marat Galiev
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.52.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: rdoc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '6.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '6.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: fakeredis
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.6'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: redis
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +114,14 @@ dependencies:
86
114
  requirements:
87
115
  - - "~>"
88
116
  - !ruby/object:Gem::Version
89
- version: 1.6.0
117
+ version: '1.6'
90
118
  type: :runtime
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: 1.6.0
124
+ version: '1.6'
97
125
  description: Simple Redis based Rate Limiter for Rails applications
98
126
  email:
99
127
  - kazanlug@gmail.com