istox 0.1.112 → 0.1.113

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: 6cbdf9678aebebaa528663485d031f2ac625080bd727e11da0a81321fe608391
4
- data.tar.gz: 65f5626fb8199e82121d3e8a6d3da03462c815de316c4326a904c9d257841ea5
3
+ metadata.gz: 051bd3f64bac36e0344335c8d977aad2cbb7fc339bc0aa38bd6602718faaff74
4
+ data.tar.gz: 56f242af8d6fa59be8a800a977ede487cab6e511fbf7fada1a105096c8a996e6
5
5
  SHA512:
6
- metadata.gz: d3e27bf821044a933dbd84e9b590cb9d6066926e8a1b8b9a92c9d3514a426147b4b79eae3f15f4671d9f834180a6b3da3e035de8ac1b68814bc3e16c09ef1236
7
- data.tar.gz: d50d68a85ba7994b50887077aebbe9947bf8c68ffb51dd9be23e5ff4bd27a2896b77d640ebdff526174c857b509dfcc7c6ca0b3549ef4ef25b2373fe84d61486
6
+ metadata.gz: f0101e6728edd36b69ea6cdded9258feacc4f17fe79e0b7f5393c5210424b1925b8280a5a2289ba88a09020fb008a46477790171856ddfa046abc3d5a1a67af8
7
+ data.tar.gz: f49243acb52c4865c5541b10a1093ac88efc4bb9673ade9d7d56f198de6fea99d6f90db71992001f9b384228ae517534ab0a7c7caea49a5fcc14d2006a10e6cb
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- istox (0.1.111)
4
+ istox (0.1.112)
5
5
  awesome_print
6
6
  binding_of_caller
7
7
  bunny (>= 2.12.0)
@@ -11,6 +11,8 @@ PATH
11
11
  listen (~> 3.0.5)
12
12
  ougai
13
13
  paranoia (~> 2.2)
14
+ redis (>= 2.0.0)
15
+ redis-namespace (>= 1.0.0)
14
16
  vault (~> 0.1)
15
17
 
16
18
  GEM
@@ -84,6 +86,8 @@ GEM
84
86
  railties (>= 3.0.0)
85
87
  faker (1.7.3)
86
88
  i18n (~> 0.5)
89
+ fakeredis (0.7.0)
90
+ redis (>= 3.2, < 5.0)
87
91
  faraday (0.17.3)
88
92
  multipart-post (>= 1.2, < 3)
89
93
  faraday_middleware (0.13.1)
@@ -91,7 +95,7 @@ GEM
91
95
  ffi (1.11.3)
92
96
  globalid (0.4.2)
93
97
  activesupport (>= 4.2.0)
94
- google-protobuf (3.11.2-universal-darwin)
98
+ google-protobuf (3.11.2)
95
99
  googleapis-common-protos-types (1.0.4)
96
100
  google-protobuf (~> 3.0)
97
101
  graphlient (0.3.7)
@@ -102,7 +106,7 @@ GEM
102
106
  graphql-client (0.16.0)
103
107
  activesupport (>= 3.0)
104
108
  graphql (~> 1.8)
105
- grpc (1.26.0-universal-darwin)
109
+ grpc (1.26.0)
106
110
  google-protobuf (~> 3.8)
107
111
  googleapis-common-protos-types (~> 1.0)
108
112
  grpc-tools (1.26.0)
@@ -175,6 +179,9 @@ GEM
175
179
  rb-fsevent (0.10.3)
176
180
  rb-inotify (0.10.1)
177
181
  ffi (~> 1.0)
182
+ redis (4.1.3)
183
+ redis-namespace (1.7.0)
184
+ redis (>= 3.0.4)
178
185
  rspec (3.8.0)
179
186
  rspec-core (~> 3.8.0)
180
187
  rspec-expectations (~> 3.8.0)
@@ -207,6 +214,7 @@ GEM
207
214
  sqlite3 (1.3.13)
208
215
  thor (0.20.3)
209
216
  thread_safe (0.3.6)
217
+ timecop (0.9.1)
210
218
  tzinfo (1.2.5)
211
219
  thread_safe (~> 0.1)
212
220
  uniform_notifier (1.11.0)
@@ -225,12 +233,14 @@ DEPENDENCIES
225
233
  database_cleaner (~> 1.6.0)
226
234
  factory_bot_rails (~> 4.8.2)
227
235
  faker (~> 1.7.3)
236
+ fakeredis
228
237
  istox!
229
238
  rails (~> 5.2.1)
230
239
  rake (~> 10.0)
231
240
  rspec (~> 3.0)
232
241
  rspec-rails (~> 3.8.0)
233
242
  sqlite3 (~> 1.3.6)
243
+ timecop
234
244
 
235
245
  BUNDLED WITH
236
246
  1.17.3
data/istox.gemspec CHANGED
@@ -1,17 +1,16 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "istox/version"
3
+ require 'istox/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "istox"
6
+ spec.name = 'istox'
8
7
  spec.version = Istox::VERSION
9
- spec.authors = ["Siong Leng"]
10
- spec.email = ["siongleng@ich-group.com"]
8
+ spec.authors = ['Siong Leng']
9
+ spec.email = ['siongleng@ich-group.com']
11
10
 
12
- spec.summary = "istox backend shared gem"
13
- spec.description = "istox backend shared gem"
14
- spec.homepage = "http://www.abc.com"
11
+ spec.summary = 'istox backend shared gem'
12
+ spec.description = 'istox backend shared gem'
13
+ spec.homepage = 'http://www.abc.com'
15
14
 
16
15
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
16
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -24,31 +23,35 @@ Gem::Specification.new do |spec|
24
23
 
25
24
  # Specify which files should be added to the gem when it is released.
26
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
28
  end
30
- spec.bindir = "exe"
29
+ spec.bindir = 'exe'
31
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
- spec.require_paths = ["lib"]
31
+ spec.require_paths = ['lib']
33
32
 
34
- spec.add_dependency "bunny", ">= 2.12.0"
35
- spec.add_dependency "istox_gruf"
36
- spec.add_dependency "gruf"
37
- spec.add_dependency 'vault', '~> 0.1'
38
- spec.add_dependency "paranoia", "~> 2.2"
39
- spec.add_dependency "graphlient"
33
+ spec.add_dependency 'awesome_print'
34
+ spec.add_dependency 'binding_of_caller'
35
+ spec.add_dependency 'bunny', '>= 2.12.0'
36
+ spec.add_dependency 'graphlient'
37
+ spec.add_dependency 'gruf'
38
+ spec.add_dependency 'istox_gruf'
40
39
  spec.add_dependency 'listen', '~> 3.0.5'
41
- spec.add_dependency "binding_of_caller"
42
- spec.add_dependency "ougai"
43
- spec.add_dependency "awesome_print"
44
- spec.add_development_dependency "bundler", "~> 1.16"
45
- spec.add_development_dependency "rake", "~> 10.0"
46
- spec.add_development_dependency "rspec", "~> 3.0"
47
- spec.add_development_dependency "rspec-rails", "~> 3.8.0"
48
- spec.add_development_dependency "factory_bot_rails", "~> 4.8.2"
49
- spec.add_development_dependency "faker", "~> 1.7.3"
50
- spec.add_development_dependency "bullet", "~> 5.7.5"
51
- spec.add_development_dependency "rails", "~> 5.2.1"
52
- spec.add_development_dependency "sqlite3", "~> 1.3.6"
53
- spec.add_development_dependency "database_cleaner", "~> 1.6.0"
40
+ spec.add_dependency 'ougai'
41
+ spec.add_dependency 'paranoia', '~> 2.2'
42
+ spec.add_dependency 'redis', '>= 2.0.0'
43
+ spec.add_dependency 'redis-namespace', '>= 1.0.0'
44
+ spec.add_dependency 'vault', '~> 0.1'
45
+ spec.add_development_dependency 'bullet', '~> 5.7.5'
46
+ spec.add_development_dependency 'bundler', '~> 1.16'
47
+ spec.add_development_dependency 'database_cleaner', '~> 1.6.0'
48
+ spec.add_development_dependency 'factory_bot_rails', '~> 4.8.2'
49
+ spec.add_development_dependency 'faker', '~> 1.7.3'
50
+ spec.add_development_dependency 'fakeredis'
51
+ spec.add_development_dependency 'rails', '~> 5.2.1'
52
+ spec.add_development_dependency 'rake', '~> 10.0'
53
+ spec.add_development_dependency 'rspec', '~> 3.0'
54
+ spec.add_development_dependency 'rspec-rails', '~> 3.8.0'
55
+ spec.add_development_dependency 'sqlite3', '~> 1.3.6'
56
+ spec.add_development_dependency 'timecop'
54
57
  end
data/lib/istox.rb CHANGED
@@ -16,6 +16,7 @@ module Istox
16
16
  require 'istox/interfaces/chainhub/transaction'
17
17
  require 'istox/helpers/publisher'
18
18
  require 'istox/helpers/bunny_boot'
19
+ require 'istox/helpers/rate_limit'
19
20
  require 'istox/helpers/vault'
20
21
  require 'istox/helpers/order_book_price_time'
21
22
  require 'istox/helpers/order_book_prorate'
@@ -0,0 +1,119 @@
1
+ require 'redis'
2
+ require 'redis-namespace'
3
+
4
+ # Documentation: https://github.com/ejfinneran/ratelimit
5
+
6
+ module Istox
7
+ class RateLimit
8
+ # Create a Ratelimit object.
9
+ #
10
+ # @param [String] key A name to uniquely identify this rate limit. For example, 'emails'
11
+ # @param [Hash] options Options hash
12
+ # @option options [Integer] :bucket_span (600) Time span to track in seconds
13
+ # @option options [Integer] :bucket_interval (5) How many seconds each bucket represents
14
+ # @option options [Integer] :bucket_expiry (@bucket_span) How long we keep data in each bucket before it is auto expired.
15
+ # Cannot be larger than the bucket_span.
16
+ # @option options [Redis] :redis (nil) Redis client if you need to customize connection options
17
+ #
18
+ # @return [Ratelimit] Ratelimit instance
19
+ #
20
+ def initialize(key, options = {})
21
+ @key = key
22
+ raise ArgumentError, 'Redis object is now passed in via the options hash - options[:redis]' unless options.is_a?(Hash)
23
+
24
+ @bucket_span = options[:bucket_span] || 600
25
+ @bucket_interval = options[:bucket_interval] || 5
26
+ @bucket_expiry = options[:bucket_expiry] || @bucket_span
27
+ raise ArgumentError, 'Bucket expiry cannot be larger than the bucket span' if @bucket_expiry > @bucket_span
28
+
29
+ @bucket_count = (@bucket_span / @bucket_interval).round
30
+ raise ArgumentError, 'Cannot have less than 3 buckets' if @bucket_count < 3
31
+
32
+ @raw_redis = options[:redis]
33
+ end
34
+
35
+ # Add to the counter for a given subject.
36
+ #
37
+ # @param [String] subject A unique key to identify the subject. For example, 'user@foo.com'
38
+ # @param [Integer] count The number by which to increase the counter
39
+ #
40
+ # @return [Integer] The counter value
41
+ def add(subject, count = 1)
42
+ bucket = get_bucket
43
+ subject = "#{@key}:#{subject}"
44
+ redis.multi do
45
+ redis.hincrby(subject, bucket, count)
46
+ redis.hdel(subject, (bucket + 1) % @bucket_count)
47
+ redis.hdel(subject, (bucket + 2) % @bucket_count)
48
+ redis.expire(subject, @bucket_expiry)
49
+ end.first
50
+ end
51
+
52
+ # Returns the count for a given subject and interval
53
+ #
54
+ # @param [String] subject Subject for the count
55
+ # @param [Integer] interval How far back (in seconds) to retrieve activity.
56
+ def count(subject, interval)
57
+ bucket = get_bucket
58
+ interval = [[interval, @bucket_interval].max, @bucket_span].min
59
+ count = (interval / @bucket_interval).floor
60
+ subject = "#{@key}:#{subject}"
61
+
62
+ keys = (0..count - 1).map do |i|
63
+ (bucket - i) % @bucket_count
64
+ end
65
+ redis.hmget(subject, *keys).inject(0) { |a, i| a + i.to_i }
66
+ end
67
+
68
+ # Check if the rate limit has been exceeded.
69
+ #
70
+ # @param [String] subject Subject to check
71
+ # @param [Hash] options Options hash
72
+ # @option options [Integer] :interval How far back to retrieve activity.
73
+ # @option options [Integer] :threshold Maximum number of actions
74
+ def exceeded?(subject, options = {})
75
+ count(subject, options[:interval]) >= options[:threshold]
76
+ end
77
+
78
+ # Check if the rate limit is within bounds
79
+ #
80
+ # @param [String] subject Subject to check
81
+ # @param [Hash] options Options hash
82
+ # @option options [Integer] :interval How far back to retrieve activity.
83
+ # @option options [Integer] :threshold Maximum number of actions
84
+ def within_bounds?(subject, options = {})
85
+ !exceeded?(subject, options)
86
+ end
87
+
88
+ # Execute a block once the rate limit is within bounds
89
+ # *WARNING* This will block the current thread until the rate limit is within bounds.
90
+ #
91
+ # @param [String] subject Subject for this rate limit
92
+ # @param [Hash] options Options hash
93
+ # @option options [Integer] :interval How far back to retrieve activity.
94
+ # @option options [Integer] :threshold Maximum number of actions
95
+ # @yield The block to be run
96
+ #
97
+ # @example Send an email as long as we haven't send 5 in the last 10 minutes
98
+ # ratelimit.exec_with_threshold(email, [:threshold => 5, :interval => 600]) do
99
+ # send_another_email
100
+ # ratelimit.add(email)
101
+ # end
102
+ def exec_within_threshold(subject, options = {})
103
+ options[:threshold] ||= 30
104
+ options[:interval] ||= 30
105
+ sleep @bucket_interval while exceeded?(subject, options)
106
+ yield(self)
107
+ end
108
+
109
+ private
110
+
111
+ def get_bucket(time = Time.now.to_i)
112
+ ((time % @bucket_span) / @bucket_interval).floor
113
+ end
114
+
115
+ def redis
116
+ @redis ||= Redis::Namespace.new(:ratelimit, redis: @raw_redis || Redis.new)
117
+ end
118
+ end
119
+ end
data/lib/istox/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Istox
2
- VERSION = '0.1.112'.freeze
2
+ VERSION = '0.1.113'.freeze
3
3
  end
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: istox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.112
4
+ version: 0.1.113
5
5
  platform: ruby
6
6
  authors:
7
7
  - Siong Leng
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-02 00:00:00.000000000 Z
11
+ date: 2020-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bunny
14
+ name: awesome_print
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.12.0
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.12.0
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: istox_gruf
28
+ name: binding_of_caller
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,49 +39,49 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: gruf
42
+ name: bunny
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 2.12.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 2.12.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: vault
56
+ name: graphlient
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0.1'
61
+ version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0.1'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: paranoia
70
+ name: gruf
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '2.2'
75
+ version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '2.2'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: graphlient
84
+ name: istox_gruf
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: 3.0.5
111
111
  - !ruby/object:Gem::Dependency
112
- name: binding_of_caller
112
+ name: ougai
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,89 +123,103 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: ougai
126
+ name: paranoia
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.2'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: redis
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="
130
144
  - !ruby/object:Gem::Version
131
- version: '0'
145
+ version: 2.0.0
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
- version: '0'
152
+ version: 2.0.0
139
153
  - !ruby/object:Gem::Dependency
140
- name: awesome_print
154
+ name: redis-namespace
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - ">="
144
158
  - !ruby/object:Gem::Version
145
- version: '0'
159
+ version: 1.0.0
146
160
  type: :runtime
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
164
  - - ">="
151
165
  - !ruby/object:Gem::Version
152
- version: '0'
166
+ version: 1.0.0
153
167
  - !ruby/object:Gem::Dependency
154
- name: bundler
168
+ name: vault
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: '1.16'
160
- type: :development
173
+ version: '0.1'
174
+ type: :runtime
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
178
  - - "~>"
165
179
  - !ruby/object:Gem::Version
166
- version: '1.16'
180
+ version: '0.1'
167
181
  - !ruby/object:Gem::Dependency
168
- name: rake
182
+ name: bullet
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: '10.0'
187
+ version: 5.7.5
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: '10.0'
194
+ version: 5.7.5
181
195
  - !ruby/object:Gem::Dependency
182
- name: rspec
196
+ name: bundler
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - "~>"
186
200
  - !ruby/object:Gem::Version
187
- version: '3.0'
201
+ version: '1.16'
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
- version: '3.0'
208
+ version: '1.16'
195
209
  - !ruby/object:Gem::Dependency
196
- name: rspec-rails
210
+ name: database_cleaner
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
213
  - - "~>"
200
214
  - !ruby/object:Gem::Version
201
- version: 3.8.0
215
+ version: 1.6.0
202
216
  type: :development
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
- version: 3.8.0
222
+ version: 1.6.0
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: factory_bot_rails
211
225
  requirement: !ruby/object:Gem::Requirement
@@ -235,19 +249,19 @@ dependencies:
235
249
  - !ruby/object:Gem::Version
236
250
  version: 1.7.3
237
251
  - !ruby/object:Gem::Dependency
238
- name: bullet
252
+ name: fakeredis
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
- - - "~>"
255
+ - - ">="
242
256
  - !ruby/object:Gem::Version
243
- version: 5.7.5
257
+ version: '0'
244
258
  type: :development
245
259
  prerelease: false
246
260
  version_requirements: !ruby/object:Gem::Requirement
247
261
  requirements:
248
- - - "~>"
262
+ - - ">="
249
263
  - !ruby/object:Gem::Version
250
- version: 5.7.5
264
+ version: '0'
251
265
  - !ruby/object:Gem::Dependency
252
266
  name: rails
253
267
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +276,48 @@ dependencies:
262
276
  - - "~>"
263
277
  - !ruby/object:Gem::Version
264
278
  version: 5.2.1
279
+ - !ruby/object:Gem::Dependency
280
+ name: rake
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '10.0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '10.0'
293
+ - !ruby/object:Gem::Dependency
294
+ name: rspec
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '3.0'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '3.0'
307
+ - !ruby/object:Gem::Dependency
308
+ name: rspec-rails
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - "~>"
312
+ - !ruby/object:Gem::Version
313
+ version: 3.8.0
314
+ type: :development
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - "~>"
319
+ - !ruby/object:Gem::Version
320
+ version: 3.8.0
265
321
  - !ruby/object:Gem::Dependency
266
322
  name: sqlite3
267
323
  requirement: !ruby/object:Gem::Requirement
@@ -277,19 +333,19 @@ dependencies:
277
333
  - !ruby/object:Gem::Version
278
334
  version: 1.3.6
279
335
  - !ruby/object:Gem::Dependency
280
- name: database_cleaner
336
+ name: timecop
281
337
  requirement: !ruby/object:Gem::Requirement
282
338
  requirements:
283
- - - "~>"
339
+ - - ">="
284
340
  - !ruby/object:Gem::Version
285
- version: 1.6.0
341
+ version: '0'
286
342
  type: :development
287
343
  prerelease: false
288
344
  version_requirements: !ruby/object:Gem::Requirement
289
345
  requirements:
290
- - - "~>"
346
+ - - ">="
291
347
  - !ruby/object:Gem::Version
292
- version: 1.6.0
348
+ version: '0'
293
349
  description: istox backend shared gem
294
350
  email:
295
351
  - siongleng@ich-group.com
@@ -331,6 +387,7 @@ files:
331
387
  - lib/istox/helpers/order_book_price_time.rb
332
388
  - lib/istox/helpers/order_book_prorate.rb
333
389
  - lib/istox/helpers/publisher.rb
390
+ - lib/istox/helpers/rate_limit.rb
334
391
  - lib/istox/helpers/regex_helper.rb
335
392
  - lib/istox/helpers/result_handler.rb
336
393
  - lib/istox/helpers/vault.rb