redis_token 0.0.4 → 0.0.5

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
  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