redis_token 0.0.4 → 0.0.5

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: dcf6777bd64b7edcf40d35f801b5d4c02710aa15
4
- data.tar.gz: 36d9f23b0639760c52e6da3542a5ddc42e6daa03
3
+ metadata.gz: 875d8513b286fd87257c6f5dfb329b290651e18b
4
+ data.tar.gz: 3d95c64ffa4c45c18cb1696ce3a42e9de07ae042
5
5
  SHA512:
6
- metadata.gz: c0f69f527ca4b973da240aac91d68cd8b41e3e9bed3cddd58e07db4581c103b6f356dae807047b7ed0f65d1908d55ee2133a239e3ef7128971ee79ab235ff834
7
- data.tar.gz: 4e0db086c2aad9462374682414f0cb9239ec9cd35d4cf48be397fe4899e7ad4d5a57fecb05c3225f4cd10c3a390589de757aab21cf2c385d53b755f7fa532723
6
+ metadata.gz: c907b23ac817799726c69fcbe206bbfd160c61eda0b074eda50dec93dc2f4ddd47272f92e8af807df2f928023d125656f474442930ef4252cac1ca8b601ce3cf
7
+ data.tar.gz: 72d605d0d3f28e5e6b7256e383d6224ec63533dd49b202a017a2e2e419c1d4a3a40a1b433e4254f280e6a1b07b71c0282f45025693e69af9fee26002bd3929f5
data/README.md CHANGED
@@ -94,6 +94,10 @@ user_token = r.create("u:#{current_user.id}", ttl: 15.hours)
94
94
  # Create token with payload:
95
95
  mobile_token = r.create("c.#{client.id}", payload: { source: :native })
96
96
  # => "865249d6b87c4e6dd8f6b0796ace7fa0"
97
+
98
+ # Save exist token:
99
+ r.create('api', token: SecureRandom.uuid)
100
+ # => "aed6e179-14b4-4a8c-9a1b-6b0f9150ede3"
97
101
  ```
98
102
 
99
103
  ### Get token
@@ -140,3 +144,26 @@ r.delete('865249d6b87c4e6dd8f6b0796ace7fa0')
140
144
  r.delete_all('client.1')
141
145
  # => 8
142
146
  ```
147
+
148
+ ### Serialization
149
+
150
+ redis_token uses native Marshal class for data serialization by default. You can override it like this:
151
+
152
+ ```ruby
153
+ require 'msgpack'
154
+
155
+ class MsgPackSerializer
156
+ def pack(value)
157
+ MessagePack.pack(value)
158
+ end
159
+
160
+ def unpack(value)
161
+ MessagePack.unpack(value)
162
+ end
163
+ end
164
+
165
+ r = RedisToken.new(prefix: PREFIX, serializer_class: MsgPackSerializer)
166
+ # Or
167
+ r = RedisToken.new(prefix: PREFIX)
168
+ r.use(MsgPackSerializer)
169
+ ```
@@ -0,0 +1,13 @@
1
+ class RedisToken
2
+ class Serializers
3
+ class Native
4
+ def pack(value)
5
+ Marshal.dump(value)
6
+ end
7
+
8
+ def unpack(value)
9
+ Marshal.load(value)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  class RedisToken
2
- VERSION = '0.0.4'.freeze
2
+ VERSION = '0.0.5'.freeze
3
3
  end
data/lib/redis_token.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'redis_token/version'
2
+ require 'redis_token/serializers/native'
3
+
2
4
  require 'redis'
3
5
 
4
6
  require 'securerandom'
@@ -25,6 +27,7 @@ class RedisToken
25
27
  # @param [Hash] args
26
28
  # @option args [String] :prefix redis keys prefix (e.g. 'myproject.tokens.')
27
29
  # @option args [Integer] :ttl token time to live value (14 days by default)
30
+ # @option args [Class] :serializer_class serialization class, see RedisToken::Serializers::Native, or #use method
28
31
  #
29
32
  # @return [RedisToken] a new RedisToken instance
30
33
  def initialize(args = {}, opts = {})
@@ -41,6 +44,7 @@ class RedisToken
41
44
  #
42
45
  # @param [String] owner owner of a token, e.g. 'client.1' or 'user-123'
43
46
  # @param [Hash] args
47
+ # @option args [String] :token (SecureRandom.hex(16)) user defined token
44
48
  # @option args :payload
45
49
  # @option args [Integer] :ttl redefines the default ttl
46
50
  #
@@ -49,7 +53,7 @@ class RedisToken
49
53
  raise 'owner should be specified' unless owner
50
54
 
51
55
  token = args[:token] || generate_token
52
- value = { owner: owner, at: Time.now }
56
+ value = { owner: owner, at: Time.now.to_i }
53
57
 
54
58
  payload = args[:payload]
55
59
  value[:payload] = payload if payload
@@ -58,7 +62,7 @@ class RedisToken
58
62
  key_ttl = args[:ttl] || @default_ttl
59
63
 
60
64
  @redis.multi do |multi|
61
- multi.set(token_to_key(token), Marshal.dump(value), ex: key_ttl)
65
+ multi.set(token_to_key(token), serializer.pack(value), ex: key_ttl)
62
66
  multi.set(token_to_owner(owner, token), nil, ex: key_ttl)
63
67
  end
64
68
 
@@ -83,7 +87,7 @@ class RedisToken
83
87
 
84
88
  @redis.multi do |multi|
85
89
  multi.expire(key, key_ttl)
86
- multi.expire(token_to_owner(value[:owner], token), key_ttl)
90
+ multi.expire(token_to_owner(hash_get(value, :owner), token), key_ttl)
87
91
  end
88
92
 
89
93
  value
@@ -106,8 +110,8 @@ class RedisToken
106
110
  key_ttl = args[:ttl] || @redis.ttl(key)
107
111
 
108
112
  @redis.multi do |multi|
109
- multi.set(key, Marshal.dump(value), ex: key_ttl)
110
- multi.expire(token_to_owner(value[:owner], token), key_ttl)
113
+ multi.set(key, serializer.pack(value), ex: key_ttl)
114
+ multi.expire(token_to_owner(hash_get(value, :owner), token), key_ttl)
111
115
  end
112
116
 
113
117
  true
@@ -119,7 +123,7 @@ class RedisToken
119
123
  #
120
124
  # @return [Enumerator]
121
125
  def owned_by(owner)
122
- owned_tokens(owner).map { |token| [token, redis_get(token_to_key(token))]}
126
+ owned_tokens(owner).map { |token| [token, redis_get(token_to_key(token))] }
123
127
  end
124
128
 
125
129
  # Delete a token
@@ -134,7 +138,7 @@ class RedisToken
134
138
 
135
139
  @redis.multi do |multi|
136
140
  multi.del(key)
137
- multi.del(token_to_owner(value[:owner], token))
141
+ multi.del(token_to_owner(hash_get(value, :owner), token))
138
142
  end
139
143
 
140
144
  true
@@ -166,6 +170,46 @@ class RedisToken
166
170
  @redis.ttl(token_to_key(token))
167
171
  end
168
172
 
173
+ # Use custom serialization class
174
+ #
175
+ # Base serializer example:
176
+ # class RedisToken
177
+ # class Serializers
178
+ # class Native
179
+ # def pack(value)
180
+ # Marshal.dump(value)
181
+ # end
182
+ #
183
+ # def unpack(value)
184
+ # Marshal.load(value)
185
+ # end
186
+ # end
187
+ # end
188
+ # end
189
+ #
190
+ # MessagePack example:
191
+ # require 'msgpack'
192
+ #
193
+ # class MsgPackSerializer
194
+ # def pack(value)
195
+ # MessagePack.pack(value)
196
+ # end
197
+ #
198
+ # def unpack(value)
199
+ # MessagePack.unpack(value)
200
+ # end
201
+ # end
202
+ #
203
+ # RedisToken.new(prefix: PREFIX).use(MsgPackSerializer)
204
+ #
205
+ # @param [Object] serializer_class
206
+ #
207
+ # @return [RedisToken]
208
+ def use(serializer_class)
209
+ @serializer_class = serializer_class
210
+ self
211
+ end
212
+
169
213
  private
170
214
 
171
215
  def generate_token
@@ -175,6 +219,9 @@ class RedisToken
175
219
  def init_params(args)
176
220
  @default_ttl = args[:ttl] || DEFAULT_TTL
177
221
  @prefix = args[:prefix]
222
+
223
+ @serializer_class = args[:serializer_class]
224
+ @serializer_class = Serializers::Native unless @serializer_class
178
225
  end
179
226
 
180
227
  def token_to_key(token)
@@ -192,25 +239,33 @@ class RedisToken
192
239
  def redis_get(key)
193
240
  value = @redis.get(key)
194
241
  return unless value
195
- Marshal.load(value)
242
+ serializer.unpack(value)
196
243
  end
197
244
 
198
245
  def owned_tokens(owner)
199
246
  mask = "#{@prefix}#{owner}.*"
200
247
 
201
248
  Enumerator.new do |y|
202
- cursor = 0
249
+ cursor = '0'
203
250
  loop do
204
251
  cursor, r = @redis.scan(cursor, match: mask)
205
- cursor = cursor.to_i
206
252
 
207
253
  r.each do |key|
208
254
  token = owner_key_to_token(owner, key)
209
255
  y << token
210
256
  end
211
257
 
212
- break if cursor == 0
258
+ break if cursor == '0'
213
259
  end
214
260
  end
215
261
  end
262
+
263
+ def serializer
264
+ @serializer ||= @serializer_class.new
265
+ end
266
+
267
+ # Some serializers can't store symbols out of the box
268
+ def hash_get(hash, sym)
269
+ hash.key?(sym) ? hash[sym] : hash[sym.to_s]
270
+ end
216
271
  end
data/redis_token.gemspec CHANGED
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'rake', '~> 10.0'
29
29
  spec.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.3'
30
30
  spec.add_development_dependency 'minitest-reporters', '~> 1.1', '>= 1.1.14'
31
+ spec.add_development_dependency 'pry', '~> 0.10.4'
31
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_token
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Baikuzin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-18 00:00:00.000000000 Z
11
+ date: 2017-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -98,6 +98,20 @@ dependencies:
98
98
  - - ">="
99
99
  - !ruby/object:Gem::Version
100
100
  version: 1.1.14
101
+ - !ruby/object:Gem::Dependency
102
+ name: pry
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: 0.10.4
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: 0.10.4
101
115
  description: Create and get API tokens with redis
102
116
  email:
103
117
  - ybinzu@gmail.com
@@ -111,6 +125,7 @@ files:
111
125
  - README.md
112
126
  - Rakefile
113
127
  - lib/redis_token.rb
128
+ - lib/redis_token/serializers/native.rb
114
129
  - lib/redis_token/version.rb
115
130
  - redis_token.gemspec
116
131
  homepage: https://github.com/ybinzu/redis_token