stored_session 0.2.0 → 0.4.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 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