stored_session 0.2.0 → 0.4.0

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: 7e2fdeeb48d5eb6f3038a4e8eaa45fb12a9be202f1900f0af907f2f77b0be9cb
4
- data.tar.gz: 3e41d710e4d7409c5be132303729ccc721994b243491c1fb5a54f42140eab556
3
+ metadata.gz: 0fdc7320b5869cf417a6f35aca5177abe2c45443962df8331dfffbd069a245c0
4
+ data.tar.gz: 0634dc8376279d46db4c4be0914dcc15e60eaad5d6b5a39d8962ccdff4cbf91d
5
5
  SHA512:
6
- metadata.gz: bc4bed114bd6254e33aee198440dcbf1fa326194b93d9eb8a9b939ce7d5134a76a27adfbf475e147d797aa90db2b50683ad8043f7a90c4bdbb89ed2e6bb6d694
7
- data.tar.gz: 45ba948f5c61992521424cbeaba950f13aaf992a0191d78030b6e3475e648ad26f207d77805720eaf97b8838231f98944be39553cd6e234a5d8ba28390a52bd8
6
+ metadata.gz: 5c515410928dbca10c0ef9f6392bfa8b808cd5371ffd14eee0ebb04c49ce29cf01b9feaabd125c77c158f82e31e75256689bb26c298900561ee27d8384209877
7
+ data.tar.gz: eca89926f65686e00f9d6f7de2e968e8aff0dfc1b1d672caf50ea46438b7474a1f5e554fb75fc746d84a700a6167d719b619543b7b1a4c717af6ec00683c8c21
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,7 +1,17 @@
1
- # Solid Session Changelog
1
+ # Stored Session Changelog
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.4.0](https://github.com/tbhb/stored_session/releases/tag/v0.4.0)
6
+
7
+ - Update minimum Rails version to 8.0.0 (<https://github.com/tbhb/stored_session/pull/47>)
8
+
9
+ ## [0.3.0](https://github.com/tbhb/stored_session/releases/tag/v0.3.0)
10
+
11
+ - Add log subscriber events (<https://github.com/tbhb/stored_session/pull/22>)
12
+ - Extract session model behavior into concern (<https://github.com/tbhb/stored_session/pull/24>)
13
+ - Rename trim to expire and add Rake tasks (<https://github.com/tbhb/stored_session/pull/27>)
14
+
5
15
  ## [0.2.0](https://github.com/tbhb/stored_session/releases/tag/v0.2.0)
6
16
 
7
17
  - Rename gem to `stored_session` (<https://github.com/tbhb/stored_session/pull/19>)
data/README.md CHANGED
@@ -1,27 +1,33 @@
1
1
  # Stored Session
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/stored_session.svg)](https://badge.fury.io/rb/stored_session) [![Required Ruby Version](https://img.shields.io/badge/ruby-%3E%3D%203.2-ruby.svg)](https://www.ruby-lang.org/en/downloads/) [![Required Rails Version](https://img.shields.io/badge/rails-%3E%3D%208.0.0-brightgreen.svg)](https://edgeguides.rubyonrails.org/) [![CI](https://github.com/tbhb/stored_session/actions/workflows/ci.yml/badge.svg)](https://github.com/tbhb/stored_session/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
+
3
5
  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
6
 
5
7
  > [!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.
8
+ > 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. See the [roadmap](https://github.com/users/tbhb/projects/6/views/1) for more details.
7
9
 
8
- ## Features and roadmap
10
+ ## Features
9
11
 
10
12
  - [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
13
+ - [x] Built-in job for expiring inactive sessions
12
14
  - [x] Tested with MySQL, PostgreSQL, and SQLite
13
15
  - [x] Instrumentation with [ActiveSupport::Notifications](https://guides.rubyonrails.org/active_support_instrumentation.html)
14
- - [ ] Installation generator
15
- - [ ] Rake tasks for session maintenance
16
+ - [ ] Privacy-friendly, indexed session metadata (IP, user agent, geocoding)
17
+ - [ ] Callbacks for session operations
18
+ - [ ] Session statistics
16
19
  - [ ] 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
+ - [ ] Testing framework helpers
21
+ - [ ] Installation generator
22
+ - [ ] Full demo application
23
+ - [ ] `stored_session_web` gem for monitoring and maintenance
24
+
25
+ See [the roadmap](https://github.com/users/tbhb/projects/6/views/1) for the complete list of planned and in-progress features.
20
26
 
21
27
  ## Prerequisites
22
28
 
23
29
  - Ruby >= 3.2.0
24
- - Rails >= 8.0.0.rc2
30
+ - Rails >= 8.0.0
25
31
 
26
32
  ## Installation
27
33
 
@@ -39,12 +45,12 @@ Then, set your session store in `config/initializers/session_store.rb`:
39
45
  Rails.application.config.session_store :stored_session_store, key: '_my_app_session`
40
46
  ```
41
47
 
42
- When [Solid Queue](https://github.com/rails/solid_queue) is used as your ActiveJob queue adapter, add `StoredSession::TrimSessionsJob` to `config/recurring.yml`:
48
+ When [Solid Queue](https://github.com/rails/solid_queue) is used as your ActiveJob queue adapter, add `StoredSession::ExpireSessionsJob` to `config/recurring.yml`:
43
49
 
44
50
  ```ruby
45
51
  production:
46
- trim_sessions:
47
- class: "StoredSession::TrimSessionsJob"
52
+ expire_sessions:
53
+ class: "StoredSession::ExpireSessionsJob"
48
54
  schedule: every day
49
55
  ```
50
56
 
@@ -0,0 +1,9 @@
1
+ class StoredSession::ExpireSessionsJob < StoredSession.config.base_job_class
2
+ queue_as StoredSession.config.expire_sessions_job_queue_as
3
+
4
+ def perform(max_created_age: nil, max_updated_age: nil)
5
+ StoredSession::Session.expire(max_created_age:, max_updated_age:)
6
+ end
7
+
8
+ ActiveSupport.run_load_hooks(:stored_session_expire_sessions_job, self)
9
+ end
@@ -1,44 +1,9 @@
1
1
  require "active_support/core_ext/integer/time"
2
2
 
3
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
4
+ include StoredSession::Model
17
5
 
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
6
+ self.table_name = StoredSession.config.sessions_table_name
42
7
 
43
8
  ActiveSupport.run_load_hooks(:stored_session_session, self)
44
9
  end
@@ -7,14 +7,13 @@ class StoredSession::Configuration
7
7
  attribute :base_record_class_name, :string, default: "::ApplicationRecord"
8
8
 
9
9
  attribute :connects_to
10
- attribute :max_created_age, default: 30.days
11
- attribute :max_updated_age, default: 30.days
12
10
 
13
11
  attribute :sessions_table_name, :string, default: "stored_sessions"
14
12
  attribute :session_class_name, :string, default: "::StoredSession::Session"
13
+ attribute :session_max_created_age, default: 30.days
14
+ attribute :session_max_updated_age, default: 30.days
15
15
 
16
- attribute :trim_sessions_job_enabled, :boolean, default: true
17
- attribute :trim_sessions_job_queue_as, default: :default
16
+ attribute :expire_sessions_job_queue_as, default: :default
18
17
 
19
18
  validates :base_controller_class_name, presence: true
20
19
  validates :base_job_class_name, presence: true
@@ -22,11 +21,10 @@ class StoredSession::Configuration
22
21
 
23
22
  validates :sessions_table_name, presence: true
24
23
  validates :session_class_name, presence: true
24
+ validates :session_max_created_age, numericality: { greater_than: 0 }, presence: true
25
+ validates :session_max_updated_age, numericality: { greater_than: 0 }, presence: true
25
26
 
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
27
+ validates :expire_sessions_job_queue_as, presence: true
30
28
 
31
29
  def base_controller_class = base_controller_class_name.constantize
32
30
  def base_job_class = base_job_class_name.constantize
@@ -1,2 +1,40 @@
1
1
  class StoredSession::LogSubscriber < ActiveSupport::LogSubscriber
2
+ def initialize
3
+ super
4
+ @logger = logger || StoredSession.logger
5
+ end
6
+
7
+ attr_writer :logger
8
+
9
+ def logger
10
+ @logger ||= StoredSession.logger
11
+ end
12
+
13
+ def session_read(event)
14
+ debug formatted_event(event, "Session Read", **event.payload.slice(:sid))
15
+ end
16
+ subscribe_log_level :session_read, :debug
17
+
18
+ def session_write(event)
19
+ debug formatted_event(event, "Session Write", **event.payload.slice(:sid))
20
+ end
21
+ subscribe_log_level :session_write, :debug
22
+
23
+ def session_delete(event)
24
+ debug formatted_event(event, "Session Delete", **event.payload.slice(:sid))
25
+ end
26
+ subscribe_log_level :session_delete, :debug
27
+
28
+ private
29
+ def formatted_event(event, operation, **)
30
+ " [StoredSession] #{operation} in #{formatted_duration(event)} (#{formatted_payload(**)})"
31
+ end
32
+
33
+ def formatted_duration(event)
34
+ "%.1fms" % event.duration
35
+ end
36
+
37
+ def formatted_payload(**attributes)
38
+ attributes.map { |k, v| "#{k}: #{v.inspect}" }.join(" | ")
39
+ end
2
40
  end
@@ -0,0 +1,48 @@
1
+ module StoredSession::Model
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ serialize :data, coder: ActiveSupport::MessagePack, type: Hash
6
+ encrypts :data, message_serializer: ActiveRecord::Encryption::MessagePackMessageSerializer.new
7
+
8
+ scope :by_sid, ->(sid) { where(sid: sid) }
9
+ end
10
+
11
+ module ClassMethods
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 expire(max_created_age: nil, max_updated_age: nil)
28
+ max_created_threshold = (max_created_age || StoredSession.config.session_max_created_age).ago
29
+ max_updated_threshold = (max_updated_age || StoredSession.config.session_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
+ def expire_later(max_created_age: nil, max_updated_age: nil)
34
+ StoredSession::ExpireSessionsJob.perform_later(max_created_age: max_created_age, max_updated_age: max_updated_age)
35
+ end
36
+
37
+ private
38
+ def upsert_unique_by
39
+ connection.supports_insert_conflict_target? ? :sid : nil
40
+ end
41
+
42
+ def without_query_cache(&)
43
+ uncached(dirties: false, &)
44
+ end
45
+ end
46
+
47
+ ActiveSupport.run_load_hooks(:stored_session_model, self)
48
+ end
@@ -1,14 +1,21 @@
1
+ require_relative "logging"
2
+
1
3
  module StoredSession
2
4
  class Store < ActionDispatch::Session::AbstractSecureStore
3
5
  module Instrumentation
4
6
  extend ActiveSupport::Concern
5
7
 
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)
8
+ include StoredSession::Store::Logging
9
+
10
+ private
11
+ def instrument(operation, sid, **options, &blk)
12
+ silence do
13
+ payload = { sid: sid&.private_id, **options }
14
+ ActiveSupport::Notifications.instrument("session_#{operation}.stored_session", payload) do
15
+ blk&.call(payload)
16
+ end
17
+ end
10
18
  end
11
- end
12
19
 
13
20
  ActiveSupport.run_load_hooks(:stored_session_store_instrumentation, self)
14
21
  end
@@ -0,0 +1,23 @@
1
+ module StoredSession
2
+ class Store < ActionDispatch::Session::AbstractSecureStore
3
+ module Logging
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ delegate :logger, to: :StoredSession
8
+ end
9
+
10
+ def initialize(app, options = {})
11
+ super
12
+ @silence = options.fetch(:silence) { true }
13
+ end
14
+
15
+ private
16
+ def silence(&blk)
17
+ @silence ? ActiveRecord::Base.logger.silence(&blk) : yield
18
+ end
19
+
20
+ ActiveSupport.run_load_hooks(:stored_session_store_logging, self)
21
+ end
22
+ end
23
+ end
@@ -1,57 +1,41 @@
1
1
  require_relative "store/instrumentation"
2
+ require_relative "store/logging"
2
3
 
3
4
  class StoredSession::Store < ActionDispatch::Session::AbstractSecureStore
4
- include ActiveSupport::Configurable
5
+ include StoredSession::Store::Logging
5
6
  include StoredSession::Store::Instrumentation
6
7
 
7
- delegate :logger, to: :StoredSession
8
-
9
- attr_reader :silence
10
- alias :silence? :silence
11
-
12
8
  attr_reader :session_class
13
9
 
14
10
  def initialize(app, options = {})
15
11
  super
16
-
17
12
  @session_class = options.fetch(:session_class) { StoredSession.config.session_class }
18
- @silence = true unless options.key?(:silence)
19
13
  end
20
14
 
21
15
  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
16
+ instrument(:read, sid) do |payload|
17
+ if sid && (data = session_class.read(sid.private_id))
18
+ [ sid, data || {} ]
19
+ else
20
+ [ generate_sid, {} ]
29
21
  end
30
22
  end
31
23
  end
32
24
 
33
25
  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)
26
+ instrument(:write, sid) do |payload|
27
+ return false unless session_class.write(sid.private_id, session)
37
28
 
38
- sid
39
- end
29
+ sid
40
30
  end
41
31
  end
42
32
 
43
33
  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
34
+ instrument(:delete, sid) do |payload|
35
+ session_class.by_sid(sid.private_id).delete_all
36
+ generate_sid
49
37
  end
50
38
  end
51
39
 
52
- def silence(&)
53
- @silence ? logger.silence(&) : yield
54
- end
55
-
56
40
  ActiveSupport.run_load_hooks(:stored_session_store, self)
57
41
  end
@@ -1,3 +1,22 @@
1
+ # :markup: markdown
2
+
1
3
  module StoredSession
2
- VERSION = "0.2.0".freeze
4
+ module VERSION
5
+ MAJOR = 0
6
+ MINOR = 4
7
+ TINY = 0
8
+ PRE = nil
9
+
10
+ STRING = [ MAJOR, MINOR, TINY, PRE ].compact.join(".")
11
+ end
12
+
13
+ # Returns the currently loaded version of Stored Session as a `Gem::Version`.
14
+ def self.gem_version
15
+ Gem::Version.new VERSION::STRING
16
+ end
17
+
18
+ # Returns the currently loaded version of Stored Session as a `String`.
19
+ def self.version
20
+ VERSION::STRING
21
+ end
3
22
  end
@@ -0,0 +1,11 @@
1
+ namespace :stored_session do
2
+ desc "Expire inactive sessions"
3
+ task expire: :environment do
4
+ StoredSession::Session.expire
5
+ end
6
+
7
+ desc "Queue a job to expire inactive sessions"
8
+ task "expire_later" => :environment do
9
+ StoredSession::Session.expire_later
10
+ end
11
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stored_session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Burns
@@ -35,7 +35,7 @@ cert_chain:
35
35
  Gso2iuR/JK+nlYYHnXZSMQgPTNEv7urC3s3YBLkEeZAyKSzTub/yFiZ0f1rZECNq
36
36
  RdwSWsf01XE0bKBtz4/dixrX45mIFrPmGp1gobRN/q4Tq3lU
37
37
  -----END CERTIFICATE-----
38
- date: 2024-11-05 00:00:00.000000000 Z
38
+ date: 2024-11-08 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: actionpack
@@ -43,56 +43,56 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 8.0.0.rc2
46
+ version: 8.0.0
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 8.0.0.rc2
53
+ version: 8.0.0
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: activejob
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: 8.0.0.rc2
60
+ version: 8.0.0
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: 8.0.0.rc2
67
+ version: 8.0.0
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: activerecord
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 8.0.0.rc2
74
+ version: 8.0.0
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
80
80
  - !ruby/object:Gem::Version
81
- version: 8.0.0.rc2
81
+ version: 8.0.0
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: railties
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
- version: 8.0.0.rc2
88
+ version: 8.0.0
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - ">="
94
94
  - !ruby/object:Gem::Version
95
- version: 8.0.0.rc2
95
+ version: 8.0.0
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: zeitwerk
98
98
  requirement: !ruby/object:Gem::Requirement
@@ -131,7 +131,7 @@ files:
131
131
  - CHANGELOG.md
132
132
  - MIT-LICENSE
133
133
  - README.md
134
- - app/jobs/stored_session/trim_sessions_job.rb
134
+ - app/jobs/stored_session/expire_sessions_job.rb
135
135
  - app/models/stored_session/record.rb
136
136
  - app/models/stored_session/session.rb
137
137
  - config/locales/stored_session.en.yml
@@ -142,10 +142,11 @@ files:
142
142
  - lib/stored_session/configuration.rb
143
143
  - lib/stored_session/deprecator.rb
144
144
  - lib/stored_session/engine.rb
145
- - lib/stored_session/gem_version.rb
146
145
  - lib/stored_session/log_subscriber.rb
146
+ - lib/stored_session/model.rb
147
147
  - lib/stored_session/store.rb
148
148
  - lib/stored_session/store/instrumentation.rb
149
+ - lib/stored_session/store/logging.rb
149
150
  - lib/stored_session/test_helper.rb
150
151
  - lib/stored_session/version.rb
151
152
  - lib/tasks/stored_session_tasks.rake
@@ -154,10 +155,10 @@ licenses:
154
155
  - MIT
155
156
  metadata:
156
157
  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
+ changelog_uri: https://github.com/tbhb/stored_session/blob/v0.4.0/CHANGELOG.md
158
159
  documentation_uri: https://github.com/tbhb/stored_session
159
160
  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
+ source_code_uri: https://github.com/tbhb/stored_session/tree/v0.4.0
161
162
  rubygems_mfa_required: 'true'
162
163
  post_install_message:
163
164
  rdoc_options: []
metadata.gz.sig CHANGED
Binary file
@@ -1,9 +0,0 @@
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
@@ -1,17 +0,0 @@
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