redis-session-store 0.11.3 → 0.11.4
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 +4 -4
- data/.github/workflows/ruby.yml +34 -0
- data/.rubocop.yml +6 -0
- data/.rubocop_todo.yml +67 -0
- data/AUTHORS.md +1 -0
- data/CHANGELOG.md +9 -0
- data/README.md +0 -1
- data/lib/redis-session-store.rb +2 -2
- data/redis-session-store.gemspec +6 -4
- data/spec/redis_session_store_spec.rb +24 -15
- data/spec/support.rb +16 -3
- metadata +39 -10
- data/.travis.yml +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d849f844f92e7e968078cf93d5802c868613bad0bfcefce1b72dd89724f76e3c
|
4
|
+
data.tar.gz: 6c022fcdc3cdf7254ef738e7450530238fb813eed58b73055f7e851c8335fca4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6c00740b8272f8626e3e4f902b927cefb50901e9fa7981d4a4b4e291d2c2bbbe9ab5d60c0b44453a38d08777aee818f4ae7218a7bc7e221996e54f659add5e4
|
7
|
+
data.tar.gz: 6d39606e90215ecda6a7575231082da256381f765c457fc220a339a287618f820f8af44e3d2efb32fa160dc7351a51c92b4326afae5c670acd1b1292384aa5ec
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
ruby: [2.5, 2.6, 2.7, head, jruby-9.2.20.1, jruby-head]
|
23
|
+
|
24
|
+
steps:
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
- name: Set up Ruby
|
27
|
+
uses: ruby/setup-ruby@v1
|
28
|
+
with:
|
29
|
+
ruby-version: ${{ matrix.ruby }}
|
30
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
31
|
+
continue-on-error: true
|
32
|
+
- name: Run tests
|
33
|
+
run: bundle exec rake
|
34
|
+
continue-on-error: true
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2022-01-29 11:55:33 UTC using RuboCop version 1.25.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
# Configuration parameters: Include.
|
11
|
+
# Include: **/*.gemspec
|
12
|
+
Gemspec/RequiredRubyVersion:
|
13
|
+
Exclude:
|
14
|
+
- 'redis-session-store.gemspec'
|
15
|
+
|
16
|
+
# Offense count: 6
|
17
|
+
# Configuration parameters: Prefixes.
|
18
|
+
# Prefixes: when, with, without
|
19
|
+
RSpec/ContextWording:
|
20
|
+
Exclude:
|
21
|
+
- 'spec/redis_session_store_spec.rb'
|
22
|
+
|
23
|
+
# Offense count: 2
|
24
|
+
# Configuration parameters: CountAsOne.
|
25
|
+
RSpec/ExampleLength:
|
26
|
+
Max: 9
|
27
|
+
|
28
|
+
# Offense count: 5
|
29
|
+
# Configuration parameters: AssignmentOnly.
|
30
|
+
RSpec/InstanceVariable:
|
31
|
+
Exclude:
|
32
|
+
- 'spec/redis_session_store_spec.rb'
|
33
|
+
|
34
|
+
# Offense count: 8
|
35
|
+
# Configuration parameters: .
|
36
|
+
# SupportedStyles: have_received, receive
|
37
|
+
RSpec/MessageSpies:
|
38
|
+
EnforcedStyle: receive
|
39
|
+
|
40
|
+
# Offense count: 5
|
41
|
+
RSpec/MultipleExpectations:
|
42
|
+
Max: 2
|
43
|
+
|
44
|
+
# Offense count: 17
|
45
|
+
# Configuration parameters: AllowSubject.
|
46
|
+
RSpec/MultipleMemoizedHelpers:
|
47
|
+
Max: 10
|
48
|
+
|
49
|
+
# Offense count: 13
|
50
|
+
RSpec/NestedGroups:
|
51
|
+
Max: 5
|
52
|
+
|
53
|
+
# Offense count: 2
|
54
|
+
RSpec/StubbedMock:
|
55
|
+
Exclude:
|
56
|
+
- 'spec/redis_session_store_spec.rb'
|
57
|
+
|
58
|
+
# Offense count: 20
|
59
|
+
RSpec/SubjectStub:
|
60
|
+
Exclude:
|
61
|
+
- 'spec/redis_session_store_spec.rb'
|
62
|
+
|
63
|
+
# Offense count: 16
|
64
|
+
# Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
|
65
|
+
RSpec/VerifiedDoubles:
|
66
|
+
Exclude:
|
67
|
+
- 'spec/redis_session_store_spec.rb'
|
data/AUTHORS.md
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,15 @@
|
|
4
4
|
|
5
5
|
## [Unreleased]
|
6
6
|
|
7
|
+
## [0.11.4] - 2022-01-29
|
8
|
+
### Fixed
|
9
|
+
- Use AbstractSecureStore for security fix
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
- Support actionpack 7.x
|
13
|
+
- Move from TravisCI to Github Actions
|
14
|
+
- Drop support for ruby 2.3, 2.4
|
15
|
+
|
7
16
|
## [0.11.3] - 2020-07-23
|
8
17
|
### Fixed
|
9
18
|
- https://github.com/roidrage/redis-session-store/issues/121
|
data/README.md
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# Redis Session Store
|
2
2
|
|
3
|
-
[](https://travis-ci.org/roidrage/redis-session-store)
|
4
3
|
[](https://codeclimate.com/github/roidrage/redis-session-store)
|
5
4
|
[](http://badge.fury.io/rb/redis-session-store)
|
6
5
|
|
data/lib/redis-session-store.rb
CHANGED
@@ -2,8 +2,8 @@ require 'redis'
|
|
2
2
|
|
3
3
|
# Redis session storage for Rails, and for Rails only. Derived from
|
4
4
|
# the MemCacheStore code, simply dropping in Redis instead.
|
5
|
-
class RedisSessionStore < ActionDispatch::Session::
|
6
|
-
VERSION = '0.11.
|
5
|
+
class RedisSessionStore < ActionDispatch::Session::AbstractSecureStore
|
6
|
+
VERSION = '0.11.4'.freeze
|
7
7
|
# Rails 3.1 and beyond defines the constant elsewhere
|
8
8
|
unless defined?(ENV_SESSION_OPTIONS_KEY)
|
9
9
|
ENV_SESSION_OPTIONS_KEY = if Rack.release.split('.').first.to_i > 1
|
data/redis-session-store.gemspec
CHANGED
@@ -4,7 +4,7 @@ Gem::Specification.new do |gem|
|
|
4
4
|
gem.email = ['meyer@paperplanes.de']
|
5
5
|
gem.summary = 'A drop-in replacement for e.g. MemCacheStore to ' \
|
6
6
|
'store Rails sessions (and Rails sessions only) in Redis.'
|
7
|
-
gem.description = gem.summary
|
7
|
+
gem.description = "#{gem.summary} For great glory!"
|
8
8
|
gem.homepage = 'https://github.com/roidrage/redis-session-store'
|
9
9
|
gem.license = 'MIT'
|
10
10
|
|
@@ -15,12 +15,14 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.version = File.read('lib/redis-session-store.rb')
|
16
16
|
.match(/^ VERSION = '(.*)'/)[1]
|
17
17
|
|
18
|
-
gem.add_runtime_dependency 'actionpack', '>= 3', '<
|
18
|
+
gem.add_runtime_dependency 'actionpack', '>= 3', '< 8'
|
19
19
|
gem.add_runtime_dependency 'redis', '>= 3', '< 5'
|
20
20
|
|
21
21
|
gem.add_development_dependency 'fakeredis', '~> 0.8'
|
22
22
|
gem.add_development_dependency 'rake', '~> 13'
|
23
23
|
gem.add_development_dependency 'rspec', '~> 3'
|
24
|
-
gem.add_development_dependency 'rubocop', '~>
|
25
|
-
gem.add_development_dependency '
|
24
|
+
gem.add_development_dependency 'rubocop', '~> 1.25'
|
25
|
+
gem.add_development_dependency 'rubocop-rake', '~> 0.6'
|
26
|
+
gem.add_development_dependency 'rubocop-rspec', '~> 2.8'
|
27
|
+
gem.add_development_dependency 'simplecov', '~> 0.21'
|
26
28
|
end
|
@@ -1,20 +1,19 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
describe RedisSessionStore do
|
4
|
+
subject(:store) { described_class.new(nil, options) }
|
5
|
+
|
4
6
|
let :random_string do
|
5
7
|
"#{rand}#{rand}#{rand}"
|
6
8
|
end
|
9
|
+
let :default_options do
|
10
|
+
store.instance_variable_get(:@default_options)
|
11
|
+
end
|
7
12
|
|
8
13
|
let :options do
|
9
14
|
{}
|
10
15
|
end
|
11
16
|
|
12
|
-
subject(:store) { RedisSessionStore.new(nil, options) }
|
13
|
-
|
14
|
-
let :default_options do
|
15
|
-
store.instance_variable_get(:@default_options)
|
16
|
-
end
|
17
|
-
|
18
17
|
it 'assigns a :namespace to @default_options' do
|
19
18
|
expect(default_options[:namespace]).to eq('rack:session')
|
20
19
|
end
|
@@ -35,7 +34,7 @@ describe RedisSessionStore do
|
|
35
34
|
end
|
36
35
|
|
37
36
|
it 'creates a redis instance' do
|
38
|
-
expect(store.instance_variable_get(:@redis)).
|
37
|
+
expect(store.instance_variable_get(:@redis)).not_to be_nil
|
39
38
|
end
|
40
39
|
|
41
40
|
it 'assigns the :host option to @default_options' do
|
@@ -96,7 +95,7 @@ describe RedisSessionStore do
|
|
96
95
|
end
|
97
96
|
|
98
97
|
it 'creates a redis instance' do
|
99
|
-
expect(store.instance_variable_get(:@redis)).
|
98
|
+
expect(store.instance_variable_get(:@redis)).not_to be_nil
|
100
99
|
end
|
101
100
|
|
102
101
|
it 'assigns the :host option to @default_options' do
|
@@ -228,6 +227,7 @@ describe RedisSessionStore do
|
|
228
227
|
context 'when session id is not provided' do
|
229
228
|
context 'when session id is nil' do
|
230
229
|
let(:session_id) { nil }
|
230
|
+
|
231
231
|
it 'returns false' do
|
232
232
|
expect(store.send(:session_exists?, :env)).to eq(false)
|
233
233
|
end
|
@@ -235,6 +235,7 @@ describe RedisSessionStore do
|
|
235
235
|
|
236
236
|
context 'when session id is empty string' do
|
237
237
|
let(:session_id) { '' }
|
238
|
+
|
238
239
|
it 'returns false' do
|
239
240
|
allow(store).to receive(:current_session_id).with(:env).and_return('')
|
240
241
|
expect(store.send(:session_exists?, :env)).to eq(false)
|
@@ -281,6 +282,13 @@ describe RedisSessionStore do
|
|
281
282
|
|
282
283
|
let(:fake_key) { 'thisisarediskey' }
|
283
284
|
|
285
|
+
describe 'generate_sid' do
|
286
|
+
it 'generates a secure ID' do
|
287
|
+
sid = store.send(:generate_sid)
|
288
|
+
expect(sid).to be_a(Rack::Session::SessionId)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
284
292
|
it 'retrieves the prefixed key from redis' do
|
285
293
|
redis = double('redis')
|
286
294
|
allow(store).to receive(:redis).and_return(redis)
|
@@ -397,14 +405,15 @@ describe RedisSessionStore do
|
|
397
405
|
|
398
406
|
context 'marshal' do
|
399
407
|
let(:options) { { serializer: :marshal } }
|
400
|
-
|
408
|
+
|
409
|
+
it_behaves_like 'serializer'
|
401
410
|
end
|
402
411
|
|
403
412
|
context 'json' do
|
404
413
|
let(:options) { { serializer: :json } }
|
405
414
|
let(:encoded_data) { '{"some":"data"}' }
|
406
415
|
|
407
|
-
|
416
|
+
it_behaves_like 'serializer'
|
408
417
|
end
|
409
418
|
|
410
419
|
context 'hybrid' do
|
@@ -412,13 +421,13 @@ describe RedisSessionStore do
|
|
412
421
|
let(:expected_encoding) { '{"some":"data"}' }
|
413
422
|
|
414
423
|
context 'marshal encoded data' do
|
415
|
-
|
424
|
+
it_behaves_like 'serializer'
|
416
425
|
end
|
417
426
|
|
418
427
|
context 'json encoded data' do
|
419
428
|
let(:encoded_data) { '{"some":"data"}' }
|
420
429
|
|
421
|
-
|
430
|
+
it_behaves_like 'serializer'
|
422
431
|
end
|
423
432
|
end
|
424
433
|
|
@@ -438,7 +447,7 @@ describe RedisSessionStore do
|
|
438
447
|
let(:options) { { serializer: custom_serializer } }
|
439
448
|
let(:expected_encoding) { 'somedata' }
|
440
449
|
|
441
|
-
|
450
|
+
it_behaves_like 'serializer'
|
442
451
|
end
|
443
452
|
end
|
444
453
|
|
@@ -514,7 +523,7 @@ describe RedisSessionStore do
|
|
514
523
|
%w(on_redis_down on_session_load_error).each do |h|
|
515
524
|
context 'when nil' do
|
516
525
|
it 'does not explode at init' do
|
517
|
-
expect { store }.
|
526
|
+
expect { store }.not_to raise_error
|
518
527
|
end
|
519
528
|
end
|
520
529
|
|
@@ -522,7 +531,7 @@ describe RedisSessionStore do
|
|
522
531
|
let(:options) { { "#{h}": ->(*) { true } } }
|
523
532
|
|
524
533
|
it 'does not explode at init' do
|
525
|
-
expect { store }.
|
534
|
+
expect { store }.not_to raise_error
|
526
535
|
end
|
527
536
|
end
|
528
537
|
|
data/spec/support.rb
CHANGED
@@ -7,11 +7,24 @@ unless defined?(Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY)
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
10
|
+
unless defined?(Rack::Session::SessionId)
|
11
|
+
module Rack
|
12
|
+
module Session
|
13
|
+
class SessionId
|
14
|
+
attr_reader :public_id
|
15
|
+
|
16
|
+
def initialize(_public_id)
|
17
|
+
@public_id
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
10
23
|
|
11
|
-
unless defined?(ActionDispatch::Session::
|
24
|
+
unless defined?(ActionDispatch::Session::AbstractSecureStore)
|
12
25
|
module ActionDispatch
|
13
26
|
module Session
|
14
|
-
class
|
27
|
+
class AbstractSecureStore
|
15
28
|
ENV_SESSION_OPTIONS_KEY = 'rack.session.options'.freeze
|
16
29
|
DEFAULT_OPTIONS = {
|
17
30
|
key: '_session_id',
|
@@ -33,7 +46,7 @@ unless defined?(ActionDispatch::Session::AbstractStore)
|
|
33
46
|
private
|
34
47
|
|
35
48
|
def generate_sid
|
36
|
-
rand(999..9999).to_s(16)
|
49
|
+
Rack::Session::SessionId.new(rand(999..9999).to_s(16))
|
37
50
|
end
|
38
51
|
end
|
39
52
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-session-store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathias Meyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '3'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '3'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: redis
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,28 +98,56 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: '
|
101
|
+
version: '1.25'
|
102
102
|
type: :development
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version: '
|
108
|
+
version: '1.25'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: rubocop-rake
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0.6'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0.6'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: rubocop-rspec
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '2.8'
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '2.8'
|
109
137
|
- !ruby/object:Gem::Dependency
|
110
138
|
name: simplecov
|
111
139
|
requirement: !ruby/object:Gem::Requirement
|
112
140
|
requirements:
|
113
141
|
- - "~>"
|
114
142
|
- !ruby/object:Gem::Version
|
115
|
-
version: '0.
|
143
|
+
version: '0.21'
|
116
144
|
type: :development
|
117
145
|
prerelease: false
|
118
146
|
version_requirements: !ruby/object:Gem::Requirement
|
119
147
|
requirements:
|
120
148
|
- - "~>"
|
121
149
|
- !ruby/object:Gem::Version
|
122
|
-
version: '0.
|
150
|
+
version: '0.21'
|
123
151
|
description: A drop-in replacement for e.g. MemCacheStore to store Rails sessions
|
124
152
|
(and Rails sessions only) in Redis. For great glory!
|
125
153
|
email:
|
@@ -131,11 +159,12 @@ extra_rdoc_files:
|
|
131
159
|
- AUTHORS.md
|
132
160
|
- CONTRIBUTING.md
|
133
161
|
files:
|
162
|
+
- ".github/workflows/ruby.yml"
|
134
163
|
- ".gitignore"
|
135
164
|
- ".rspec"
|
136
165
|
- ".rubocop.yml"
|
166
|
+
- ".rubocop_todo.yml"
|
137
167
|
- ".simplecov"
|
138
|
-
- ".travis.yml"
|
139
168
|
- AUTHORS.md
|
140
169
|
- CHANGELOG.md
|
141
170
|
- CODE_OF_CONDUCT.md
|
@@ -168,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
197
|
- !ruby/object:Gem::Version
|
169
198
|
version: '0'
|
170
199
|
requirements: []
|
171
|
-
rubygems_version: 3.1.
|
200
|
+
rubygems_version: 3.1.6
|
172
201
|
signing_key:
|
173
202
|
specification_version: 4
|
174
203
|
summary: A drop-in replacement for e.g. MemCacheStore to store Rails sessions (and
|
data/.travis.yml
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
cache: bundler
|
3
|
-
rvm:
|
4
|
-
- 2.3
|
5
|
-
- 2.4
|
6
|
-
- 2.5
|
7
|
-
- 2.6
|
8
|
-
- ruby-head
|
9
|
-
- jruby-9.2.12.0
|
10
|
-
matrix:
|
11
|
-
allow_failures:
|
12
|
-
- rvm: ruby-head
|
13
|
-
- rvm: jruby-9.2.12.0
|
14
|
-
notifications:
|
15
|
-
email: false
|
16
|
-
deploy:
|
17
|
-
provider: rubygems
|
18
|
-
api_key:
|
19
|
-
secure: jL1lH/wfeRa5MoZRHvkXcZP/Ch7huFxqzbvhEV7UZhiDUBnApcJWkb346jeLEDYnFObUhqhaCZ1/l4fDeSFg2GgatSfEnoWATFVkIf1e4TTGAePlS+4qqsGOcr+XrjP6CEf4o4JACdLuSoT9dtUFj0xkFLnDWILxneXIrqDE9VU=
|
20
|
-
gem: redis-session-store
|
21
|
-
on:
|
22
|
-
tags: true
|
23
|
-
repo: roidrage/redis-session-store
|
24
|
-
rvm: 2.6.6
|