stored_session 0.2.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7e2fdeeb48d5eb6f3038a4e8eaa45fb12a9be202f1900f0af907f2f77b0be9cb
4
+ data.tar.gz: 3e41d710e4d7409c5be132303729ccc721994b243491c1fb5a54f42140eab556
5
+ SHA512:
6
+ metadata.gz: bc4bed114bd6254e33aee198440dcbf1fa326194b93d9eb8a9b939ce7d5134a76a27adfbf475e147d797aa90db2b50683ad8043f7a90c4bdbb89ed2e6bb6d694
7
+ data.tar.gz: 45ba948f5c61992521424cbeaba950f13aaf992a0191d78030b6e3475e648ad26f207d77805720eaf97b8838231f98944be39553cd6e234a5d8ba28390a52bd8
checksums.yaml.gz.sig ADDED
Binary file
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Solid Session Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## [0.2.0](https://github.com/tbhb/stored_session/releases/tag/v0.2.0)
6
+
7
+ - Rename gem to `stored_session` (<https://github.com/tbhb/stored_session/pull/19>)
8
+
9
+ ## [0.1.0](https://github.com/tbhb/stored_session/releases/tag/v0.1.0)
10
+
11
+ - Initial release
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) Tony Burns
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # Stored Session
2
+
3
+ Encrypted, database-backed [session store](https://guides.rubyonrails.org/security.html#session-storage) for [Rails](https://rubyonrails.org). It is a modernization of the [activerecord-session_store](https://github.com/rails/activerecord-session_store) gem that was previously extracted from Rails. Stored Session is encrypted by default and is tested with MySQL, PostgreSQL, and SQLite against Rails 8+.
4
+
5
+ > [!WARNING]
6
+ > This gem is currently in active development and should be considered alpha software. The API and functionality are subject to change without notice until a stable 1.0 release.
7
+
8
+ ## Features and roadmap
9
+
10
+ - [x] Compact, encrypted serialization with [MessagePack](https://msgpack.org/) (inspired by [Solid Cache](https://github.com/rails/solid_cache))
11
+ - [x] Built-in [ActiveJob](https://edgeguides.rubyonrails.org/active_job_basics.html) job for trimming inactive sessions
12
+ - [x] Tested with MySQL, PostgreSQL, and SQLite
13
+ - [x] Instrumentation with [ActiveSupport::Notifications](https://guides.rubyonrails.org/active_support_instrumentation.html)
14
+ - [ ] Installation generator
15
+ - [ ] Rake tasks for session maintenance
16
+ - [ ] Support for dedicated sessions database
17
+ - [ ] Session metadata tracking (IP address, user agent, geocoding)
18
+ - [ ] Integration test helpers for Minitest and RSpec
19
+ - [ ] `mission_control-sessions` gem for monitoring and administration
20
+
21
+ ## Prerequisites
22
+
23
+ - Ruby >= 3.2.0
24
+ - Rails >= 8.0.0.rc2
25
+
26
+ ## Installation
27
+
28
+ Add Stored Session to your application by following these steps:
29
+
30
+ 1. `bundle add stored_session`
31
+ 2. `bin/rails stored_session:install:migrations`
32
+ 3. `bin/rails db:migrate`
33
+
34
+ [ActiveRecord encryption](https://guides.rubyonrails.org/active_record_encryption.html) must be enabled in order to use Stored Session. Follow the instructions in [the guide](https://guides.rubyonrails.org/active_record_encryption.html#setup) to configure.
35
+
36
+ Then, set your session store in `config/initializers/session_store.rb`:
37
+
38
+ ```ruby
39
+ Rails.application.config.session_store :stored_session_store, key: '_my_app_session`
40
+ ```
41
+
42
+ When [Solid Queue](https://github.com/rails/solid_queue) is used as your ActiveJob queue adapter, add `StoredSession::TrimSessionsJob` to `config/recurring.yml`:
43
+
44
+ ```ruby
45
+ production:
46
+ trim_sessions:
47
+ class: "StoredSession::TrimSessionsJob"
48
+ schedule: every day
49
+ ```
50
+
51
+ ## Instrumentation
52
+
53
+ Stored Session instruments session store operations with `ActiveSupport::Notifications`:
54
+
55
+ ### `session_read.stored_session`
56
+
57
+ | Key | Value |
58
+ | ------ | --------------------- |
59
+ | `:sid` | The hashed session ID |
60
+
61
+ ```ruby
62
+ {
63
+ sid: '2::350cabf53a661de4fcf3d0ba6c6c65fd560b41e9697cf000168a9f420fb5366a'
64
+ }
65
+ ```
66
+
67
+ ### `session_write.stored_session`
68
+
69
+ | Key | Value |
70
+ | ------ | --------------------- |
71
+ | `:sid` | The hashed session ID |
72
+
73
+ ```ruby
74
+ {
75
+ sid: '2::350cabf53a661de4fcf3d0ba6c6c65fd560b41e9697cf000168a9f420fb5366a'
76
+ }
77
+ ```
78
+
79
+ ### `session_delete.stored_session`
80
+
81
+ | Key | Value |
82
+ | ------ | --------------------- |
83
+ | `:sid` | The hashed session ID |
84
+
85
+ ```ruby
86
+ {
87
+ sid: '2::350cabf53a661de4fcf3d0ba6c6c65fd560b41e9697cf000168a9f420fb5366a'
88
+ }
89
+ ```
90
+
91
+ ## Acknowledgements
92
+
93
+ This gem builds upon the excellent work of many contributors in the Ruby on Rails ecosystem. Special thanks to:
94
+
95
+ - The Rails core team and contributors, whose test suites and session store implementations in Rails itself core provided a robust foundation.
96
+ - The maintainers and contributors of the original [activerecord-session_store](https://github.com/rails/activerecord-session_store) gem, whose longstanding work influenced this implementation.
97
+ - The [Solid Cache](https://github.com/rails/solid_cache) and [Solid Queue](https://github.com/rails/solid_queue) maintainers and contributors, particularly for their modern database interaction patterns.
98
+
99
+ Portions of the gem boilerplate, implementation, and test suite and gem infrastructure were adapted from these projects, each of which are also distributed under the MIT License.
100
+
101
+ ## License
102
+
103
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,9 @@
1
+ class StoredSession::TrimSessionsJob < StoredSession.config.base_job_class
2
+ queue_as StoredSession.config.trim_sessions_job_queue_as
3
+
4
+ def perform(max_created_age: nil, max_updated_age: nil)
5
+ StoredSession::Session.trim!(max_created_age:, max_updated_age:)
6
+ end
7
+
8
+ ActiveSupport.run_load_hooks(:stored_session_trim_sessions_job, self)
9
+ end
@@ -0,0 +1,7 @@
1
+ class StoredSession::Record < StoredSession.config.base_record_class
2
+ self.abstract_class = true
3
+
4
+ connects_to(**StoredSession.config.connects_to) if StoredSession.config.connects_to
5
+
6
+ ActiveSupport.run_load_hooks :stored_session_record, self
7
+ end
@@ -0,0 +1,44 @@
1
+ require "active_support/core_ext/integer/time"
2
+
3
+ class StoredSession::Session < StoredSession::Record
4
+ self.table_name = StoredSession.config.sessions_table_name
5
+
6
+ serialize :data, coder: ActiveSupport::MessagePack, type: Hash
7
+ encrypts :data, message_serializer: ActiveRecord::Encryption::MessagePackMessageSerializer.new
8
+
9
+ scope :by_sid, ->(sid) { where(sid: sid) }
10
+
11
+ class << self
12
+ def read(sid)
13
+ without_query_cache do
14
+ select(:data).find_by(sid: sid)&.data
15
+ end
16
+ end
17
+
18
+ def write(sid, data)
19
+ without_query_cache do
20
+ upsert({ sid:, data: }, unique_by: upsert_unique_by, on_duplicate: :update, update_only: %i[sid data])
21
+ end
22
+ true
23
+ rescue ActiveRecord::SerializationTypeMismatch
24
+ false
25
+ end
26
+
27
+ def trim!(max_created_age: nil, max_updated_age: nil)
28
+ max_created_threshold = (max_created_age || StoredSession.config.max_created_age).ago
29
+ max_updated_threshold = (max_updated_age || StoredSession.config.max_updated_age).ago
30
+ where(created_at: ...max_created_threshold).or(where(updated_at: ...max_updated_threshold)).in_batches.delete_all
31
+ end
32
+
33
+ private
34
+ def upsert_unique_by
35
+ connection.supports_insert_conflict_target? ? :sid : nil
36
+ end
37
+
38
+ def without_query_cache(&)
39
+ uncached(dirties: false, &)
40
+ end
41
+ end
42
+
43
+ ActiveSupport.run_load_hooks(:stored_session_session, self)
44
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ en:
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ # StoredSession::Engine.routes.draw do
2
+ # end
@@ -0,0 +1,15 @@
1
+ class CreateStoredSessions < ActiveRecord::Migration[7.2]
2
+ def change
3
+ config = Rails.configuration.generators
4
+ primary_key_type = config.options.dig(config.orm, :primary_key_type) || :primary_key
5
+
6
+ create_table :stored_sessions, id: primary_key_type do |t|
7
+ t.timestamps
8
+ t.string :sid, null: false, index: { unique: true }
9
+ t.binary :data, limit: 536870912
10
+
11
+ t.index :created_at
12
+ t.index :updated_at
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require "stored_session/store"
2
+
3
+ module ActionDispatch
4
+ module Session
5
+ StoredSessionStore = StoredSession::Store
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ class StoredSession::Configuration
2
+ include ActiveModel::Model
3
+ include ActiveModel::Attributes
4
+
5
+ attribute :base_controller_class_name, :string, default: "::ApplicationController"
6
+ attribute :base_job_class_name, :string, default: "::ApplicationJob"
7
+ attribute :base_record_class_name, :string, default: "::ApplicationRecord"
8
+
9
+ attribute :connects_to
10
+ attribute :max_created_age, default: 30.days
11
+ attribute :max_updated_age, default: 30.days
12
+
13
+ attribute :sessions_table_name, :string, default: "stored_sessions"
14
+ attribute :session_class_name, :string, default: "::StoredSession::Session"
15
+
16
+ attribute :trim_sessions_job_enabled, :boolean, default: true
17
+ attribute :trim_sessions_job_queue_as, default: :default
18
+
19
+ validates :base_controller_class_name, presence: true
20
+ validates :base_job_class_name, presence: true
21
+ validates :base_record_class_name, presence: true
22
+
23
+ validates :sessions_table_name, presence: true
24
+ validates :session_class_name, presence: true
25
+
26
+ validates :max_created_age, numericality: { greater_than: 0 }, presence: true
27
+ validates :max_updated_age, numericality: { greater_than: 0 }, presence: true
28
+
29
+ validates :trim_sessions_job_queue_as, presence: true
30
+
31
+ def base_controller_class = base_controller_class_name.constantize
32
+ def base_job_class = base_job_class_name.constantize
33
+ def base_record_class = base_record_class_name.constantize
34
+ def session_class = session_class_name.constantize
35
+ end
@@ -0,0 +1,5 @@
1
+ module StoredSession
2
+ def self.deprecator
3
+ @deprecator ||= ActiveSupport::Deprecation.new
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ require "action_dispatch/session/stored_session_store"
2
+
3
+ require "active_support"
4
+ require "action_dispatch"
5
+ require "action_controller"
6
+ require "active_record"
7
+
8
+ module StoredSession
9
+ class Engine < ::Rails::Engine
10
+ isolate_namespace StoredSession
11
+
12
+ config.stored_session = ActiveSupport::OrderedOptions.new
13
+
14
+ initializer "stored_session.deprecator", before: :load_environment_config do |app|
15
+ app.deprecators[:stored_session] = StoredSession.deprecator
16
+ end
17
+
18
+ initializer "stored_session.config" do |app|
19
+ StoredSession.config = StoredSession::Configuration.new(app.config.stored_session)
20
+ end
21
+
22
+ initializer "stored_session.logger" do
23
+ ActiveSupport.on_load(:stored_session) { self.logger ||= ::Rails.logger }
24
+ StoredSession::LogSubscriber.attach_to :stored_session
25
+ end
26
+
27
+ config.after_initialize do |app|
28
+ unless app.config.eager_load
29
+ StoredSession.config.base_controller_class
30
+ StoredSession.config.base_job_class
31
+ StoredSession.config.base_record_class
32
+ end
33
+
34
+ StoredSession.config.validate!
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+ # :markup: markdown
2
+
3
+ module StoredSession
4
+ # Returns the currently loaded version of Stored Session as a `Gem::Version`.
5
+ def self.gem_version
6
+ Gem::Version.new VERSION::STRING
7
+ end
8
+
9
+ module VERSION
10
+ MAJOR = 0
11
+ MINOR = 2
12
+ TINY = 0
13
+ PRE = "".freeze
14
+
15
+ STRING = [ MAJOR, MINOR, TINY, PRE ].compact.join(".")
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ class StoredSession::LogSubscriber < ActiveSupport::LogSubscriber
2
+ end
@@ -0,0 +1,16 @@
1
+ module StoredSession
2
+ class Store < ActionDispatch::Session::AbstractSecureStore
3
+ module Instrumentation
4
+ extend ActiveSupport::Concern
5
+
6
+ def instrument(operation, sid, **options, &blk)
7
+ payload = { sid: sid&.private_id, **options }
8
+ ActiveSupport::Notifications.instrument("session_#{operation}.stored_session", payload) do
9
+ blk&.call(payload)
10
+ end
11
+ end
12
+
13
+ ActiveSupport.run_load_hooks(:stored_session_store_instrumentation, self)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,57 @@
1
+ require_relative "store/instrumentation"
2
+
3
+ class StoredSession::Store < ActionDispatch::Session::AbstractSecureStore
4
+ include ActiveSupport::Configurable
5
+ include StoredSession::Store::Instrumentation
6
+
7
+ delegate :logger, to: :StoredSession
8
+
9
+ attr_reader :silence
10
+ alias :silence? :silence
11
+
12
+ attr_reader :session_class
13
+
14
+ def initialize(app, options = {})
15
+ super
16
+
17
+ @session_class = options.fetch(:session_class) { StoredSession.config.session_class }
18
+ @silence = true unless options.key?(:silence)
19
+ end
20
+
21
+ def find_session(env, sid)
22
+ silence do
23
+ instrument(:read, sid) do |payload|
24
+ if sid && (data = session_class.read(sid.private_id))
25
+ [ sid, data || {} ]
26
+ else
27
+ [ generate_sid, {} ]
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def write_session(req, sid, session, options)
34
+ silence do
35
+ instrument(:write, sid) do |payload|
36
+ return false unless session_class.write(sid.private_id, session)
37
+
38
+ sid
39
+ end
40
+ end
41
+ end
42
+
43
+ def delete_session(req, sid, options)
44
+ silence do
45
+ instrument(:delete, sid) do |payload|
46
+ session_class.by_sid(sid.private_id).delete_all
47
+ generate_sid
48
+ end
49
+ end
50
+ end
51
+
52
+ def silence(&)
53
+ @silence ? logger.silence(&) : yield
54
+ end
55
+
56
+ ActiveSupport.run_load_hooks(:stored_session_store, self)
57
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ module StoredSession
2
+ VERSION = "0.2.0".freeze
3
+ end
@@ -0,0 +1,47 @@
1
+ require "stored_session/version"
2
+ require "stored_session/deprecator"
3
+ require "stored_session/engine"
4
+
5
+ require "action_dispatch"
6
+ require "action_dispatch/middleware/session/abstract_store"
7
+
8
+ require "active_job"
9
+
10
+ require "active_record/encryption/message_pack_message_serializer"
11
+
12
+ require "active_support"
13
+ require "active_support/core_ext/integer/time"
14
+ require "active_support/log_subscriber"
15
+ require "active_support/message_pack"
16
+ require "active_support/notifications"
17
+
18
+ require "zeitwerk"
19
+
20
+ loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
21
+ loader.ignore(
22
+ "#{__dir__}/stored_session/deprecator.rb",
23
+ "#{__dir__}/stored_session/gem_version.rb",
24
+ "#{__dir__}/stored_session/version.rb",
25
+ "#{__dir__}/generators",
26
+ "#{__dir__}/tasks"
27
+ )
28
+ loader.do_not_eager_load(
29
+ "#{__dir__}/stored_session/test_helper.rb"
30
+ )
31
+ loader.setup
32
+
33
+ module StoredSession
34
+ mattr_accessor :config, default: StoredSession::Configuration.new
35
+ mattr_accessor :logger
36
+
37
+ def self.configure
38
+ yield config
39
+ validate_config!
40
+ end
41
+
42
+ def self.validate_config!
43
+ config.validate!
44
+ end
45
+
46
+ ActiveSupport.run_load_hooks(:stored_session, self)
47
+ end
File without changes
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stored_session
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Tony Burns
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MQ0wCwYDVQQDDAR0b255
14
+ MRkwFwYKCZImiZPyLGQBGRYJdG9ueWJ1cm5zMRMwEQYKCZImiZPyLGQBGRYDbmV0
15
+ MB4XDTI0MDcxNDAxMDg0OVoXDTI1MDcxNDAxMDg0OVowPzENMAsGA1UEAwwEdG9u
16
+ eTEZMBcGCgmSJomT8ixkARkWCXRvbnlidXJuczETMBEGCgmSJomT8ixkARkWA25l
17
+ dDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKggfvyjaYMtMwan119S
18
+ oOKyXi6ES6fn92c4jsiNowr15QR5VUlqI53RBowrLZzVTAYs7duxLT1jd6H58vpC
19
+ bJEkTtFWmJj8tL4+XozzESDnytcdLiT51fb7fmq9LUUwF+iJbotP7EOuzdp58p4O
20
+ qAIhL9HTPSgV02xqgoLV/9qBfMGMp2OIg8LxeY4j6tsu/NWxf19vBYI++ETr8vce
21
+ NjafoEa3zuVhB7aasnURf5nuhl+Rlp/CZ3DunXLsfCRil1Lu5FD53YDmozEVlWb0
22
+ wBbcbg/v73x2TV5jyIzxW6HOde2LhC/eI1sNitCflLZ0Q7kWAKMbx82RMTuNHNVa
23
+ JJRB2D6A64V+IJ9GAsYgyrkZ63sTlABylI2IXasif5Y4gsHLzr8m8f+6bKoKmKxo
24
+ qPs+sLlD3PbeWeNuxYnd2VP55NqTHSpFyytYjuFP0PErdChini435Zrxedq4UuRx
25
+ 0Bhq4cVlspDqbVhJoFqL27ZVyJWVpwMPXbN8sWZCJgWaAQIDAQABo3cwdTAJBgNV
26
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUJWq36v7uqFV7BcGsCCpzg+r7
27
+ OVQwHQYDVR0RBBYwFIESdG9ueUB0b255YnVybnMubmV0MB0GA1UdEgQWMBSBEnRv
28
+ bnlAdG9ueWJ1cm5zLm5ldDANBgkqhkiG9w0BAQsFAAOCAYEAhCrMM1e7kL5MtTRy
29
+ 9kOU48uTLtLuyvUxFkdN/b/iMh+MKYRButfY35SxqRzs76Lta58V6cgRpRNb/WZv
30
+ Y5613dW/XF3oPOjaSyjYTGT/RyVobT5BydDIZ5uN/l38cd4fM++PEyIyP0D/CyNY
31
+ EVs+WvSSCAWzjO5PRgQDBU0+VrQaA2sp/qohi9kjxEFllkqi9eC2Py1rSndlXv0s
32
+ UW1jECxYZ56EHfypdqGjb9FRheRcEB6FtUzgjN8+IFsq1KyKDTproT3qVYFPT7IU
33
+ VSYwGC6ZO8B+/FxtebityYd+WuwSIcGoZVdbnl/GUPzT/O+5VdEmOFfn9lG3RbL2
34
+ xZax49uLQDvhfCrzISFszjYMMzfBhgpR+j9kq0HvZhrhZJRvlu8r7KP9EDvWrkXG
35
+ Gso2iuR/JK+nlYYHnXZSMQgPTNEv7urC3s3YBLkEeZAyKSzTub/yFiZ0f1rZECNq
36
+ RdwSWsf01XE0bKBtz4/dixrX45mIFrPmGp1gobRN/q4Tq3lU
37
+ -----END CERTIFICATE-----
38
+ date: 2024-11-05 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: actionpack
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 8.0.0.rc2
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 8.0.0.rc2
54
+ - !ruby/object:Gem::Dependency
55
+ name: activejob
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 8.0.0.rc2
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 8.0.0.rc2
68
+ - !ruby/object:Gem::Dependency
69
+ name: activerecord
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 8.0.0.rc2
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 8.0.0.rc2
82
+ - !ruby/object:Gem::Dependency
83
+ name: railties
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 8.0.0.rc2
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 8.0.0.rc2
96
+ - !ruby/object:Gem::Dependency
97
+ name: zeitwerk
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.6'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.6'
110
+ - !ruby/object:Gem::Dependency
111
+ name: bundler
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 1.15.0
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.15.0
124
+ description: Encrypted, database-backed session store for Rails.
125
+ email:
126
+ - tony@tonyburns.net
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - CHANGELOG.md
132
+ - MIT-LICENSE
133
+ - README.md
134
+ - app/jobs/stored_session/trim_sessions_job.rb
135
+ - app/models/stored_session/record.rb
136
+ - app/models/stored_session/session.rb
137
+ - config/locales/stored_session.en.yml
138
+ - config/routes.rb
139
+ - db/migrate/20241103224006_create_stored_sessions.rb
140
+ - lib/action_dispatch/session/stored_session_store.rb
141
+ - lib/stored_session.rb
142
+ - lib/stored_session/configuration.rb
143
+ - lib/stored_session/deprecator.rb
144
+ - lib/stored_session/engine.rb
145
+ - lib/stored_session/gem_version.rb
146
+ - lib/stored_session/log_subscriber.rb
147
+ - lib/stored_session/store.rb
148
+ - lib/stored_session/store/instrumentation.rb
149
+ - lib/stored_session/test_helper.rb
150
+ - lib/stored_session/version.rb
151
+ - lib/tasks/stored_session_tasks.rake
152
+ homepage: https://github.com/tbhb/stored_session
153
+ licenses:
154
+ - MIT
155
+ metadata:
156
+ bug_tracker_uri: https://github.com/tbhb/stored_session/issues
157
+ changelog_uri: https://github.com/tbhb/stored_session/blob/v0.2.0/CHANGELOG.md
158
+ documentation_uri: https://github.com/tbhb/stored_session
159
+ mailing_list_uri: https://github.com/tbhb/stored_session/discussions
160
+ source_code_uri: https://github.com/tbhb/stored_session/tree/v0.2.0
161
+ rubygems_mfa_required: 'true'
162
+ post_install_message:
163
+ rdoc_options: []
164
+ require_paths:
165
+ - lib
166
+ required_ruby_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: 3.2.0
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubygems_version: 3.4.19
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: Encrypted, database-backed session store for Rails.
181
+ test_files: []
metadata.gz.sig ADDED
Binary file