current_session 0.1.4 → 0.1.6

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: bc53442f7b800e43a4da8cc2690d72ba5466be6afce2b6d28fed7e3e62de9fea
4
- data.tar.gz: 46364f6ee395e2e2734cb0784cf700793dafb022963960d7478a5397feac8bd0
3
+ metadata.gz: fe0094c715e9d1a1152a795e0edd0583434cabcc1d955a8fc5c6e2c2202c0e85
4
+ data.tar.gz: 0d7af31d9cb4f1762c15e6b1a288b2c4c6226dcb153e8709b6e2321ee7007585
5
5
  SHA512:
6
- metadata.gz: 95c0d5af5fd5a896d277ccbb5955675ddaa04ee2caf52b41918c1aa1eae6cf0ca15d3c0cf781eddba225b3eef613a377054309347ddb3f1ae3e45b1f2002562f
7
- data.tar.gz: f8e4b72b8bab60b40af08cf0a7fedcb8cc9613e7aab7a73a8d5d97b4fb7732ccccbd59c8a76890daed5b6382efe9f6e6c9a894fc99db18a9c7a316b99d9ed7b3
6
+ metadata.gz: 41197858ae7dcd61d71a593332ca369ed9526fa0711e3c2b992d2eadaac55df763f800e105d01a67e254043c67ee3673d169be6e5ee889a51797acdfc8b9d962
7
+ data.tar.gz: 6b907dce8ee28afb0a6988cf5384912a732bb56f7ad8f85543cadd02b108c83f15108a6b6ef0593e9c6a86861114ba6aac0e0b053ce2d9cda3bae61469f3acd5
data/.rubocop.yml CHANGED
@@ -32,3 +32,6 @@ Lint/EmptyBlock:
32
32
 
33
33
  RSpec/MultipleExpectations:
34
34
  Enabled: false
35
+
36
+ Style/SignalException:
37
+ EnforcedStyle: semantic
data/Gemfile CHANGED
@@ -9,4 +9,6 @@ gem "rake", "~> 13.0"
9
9
 
10
10
  gem "rspec", "~> 3.0"
11
11
 
12
- gem "rubocop", "~> 1.7"
12
+ gem "rubocop"
13
+ gem "rubocop-performance"
14
+ gem "rubocop-rspec"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- current_session (0.1.4)
4
+ current_session (0.1.6)
5
5
  activesupport (>= 6.0.0)
6
6
 
7
7
  GEM
@@ -40,7 +40,7 @@ GEM
40
40
  coderay (~> 1.1)
41
41
  method_source (~> 1.0)
42
42
  rack (3.0.0)
43
- rack-protection (3.0.1)
43
+ rack-protection (3.0.2)
44
44
  rack
45
45
  rainbow (3.1.1)
46
46
  rake (13.0.6)
@@ -59,18 +59,23 @@ GEM
59
59
  diff-lcs (>= 1.2.0, < 2.0)
60
60
  rspec-support (~> 3.11.0)
61
61
  rspec-support (3.11.1)
62
- rubocop (1.36.0)
62
+ rubocop (1.37.0)
63
63
  json (~> 2.3)
64
64
  parallel (~> 1.10)
65
65
  parser (>= 3.1.2.1)
66
66
  rainbow (>= 2.2.2, < 4.0)
67
67
  regexp_parser (>= 1.8, < 3.0)
68
68
  rexml (>= 3.2.5, < 4.0)
69
- rubocop-ast (>= 1.20.1, < 2.0)
69
+ rubocop-ast (>= 1.22.0, < 2.0)
70
70
  ruby-progressbar (~> 1.7)
71
71
  unicode-display_width (>= 1.4.0, < 3.0)
72
- rubocop-ast (1.21.0)
72
+ rubocop-ast (1.23.0)
73
73
  parser (>= 3.1.1.0)
74
+ rubocop-performance (1.15.0)
75
+ rubocop (>= 1.7.0, < 2.0)
76
+ rubocop-ast (>= 0.4.0)
77
+ rubocop-rspec (2.13.2)
78
+ rubocop (~> 1.33)
74
79
  ruby-progressbar (1.11.0)
75
80
  simplecov (0.21.2)
76
81
  docile (~> 1.1)
@@ -78,13 +83,15 @@ GEM
78
83
  simplecov_json_formatter (~> 0.1)
79
84
  simplecov-html (0.12.3)
80
85
  simplecov_json_formatter (0.1.4)
81
- sqlite3 (1.5.1-arm64-darwin)
86
+ sqlite3 (1.5.3-arm64-darwin)
87
+ sqlite3 (1.5.3-x86_64-linux)
82
88
  tzinfo (2.0.5)
83
89
  concurrent-ruby (~> 1.0)
84
90
  unicode-display_width (2.3.0)
85
91
 
86
92
  PLATFORMS
87
93
  arm64-darwin-20
94
+ x86_64-linux
88
95
 
89
96
  DEPENDENCIES
90
97
  activerecord
@@ -94,7 +101,9 @@ DEPENDENCIES
94
101
  pry
95
102
  rake (~> 13.0)
96
103
  rspec (~> 3.0)
97
- rubocop (~> 1.7)
104
+ rubocop
105
+ rubocop-performance
106
+ rubocop-rspec
98
107
  simplecov
99
108
  sqlite3
100
109
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CurrentSession
4
+ #
5
+ # Base class for providing auth methods
6
+ #
7
+ class AuthMethod
8
+ class_attribute :user_class
9
+
10
+ # only exist users
11
+ class FindBy < self
12
+ def call(&block)
13
+ find_by_auth.try(&block)
14
+ end
15
+ end
16
+
17
+ # admit new users
18
+ class FindOrCreateBy < self
19
+ def call(&block)
20
+ find_or_create_by_auth.try(&block)
21
+ end
22
+ end
23
+
24
+ def self.new_auth_class(auth_methods_module)
25
+ new_auth_class =
26
+ if auth_methods_module.method_defined?(:find_by_auth)
27
+ Class.new(CurrentSession::AuthMethod::FindBy) { include auth_methods_module }
28
+ elsif auth_methods_module.method_defined?(:find_or_create_by_auth)
29
+ Class.new(CurrentSession::AuthMethod::FindOrCreateBy) { include auth_methods_module }
30
+ else
31
+ fail NotImplementedError, "You must implement find_by_auth or find_or_create_by_auth"
32
+ end
33
+ new_auth_class.user_class = user_class
34
+ new_auth_class
35
+ end
36
+
37
+ def initialize(request)
38
+ @request = request
39
+ end
40
+ attr_reader :request
41
+
42
+ def auth
43
+ request.env["omniauth.auth"]
44
+ end
45
+ end
46
+ end
@@ -6,7 +6,6 @@ module CurrentSession
6
6
  #
7
7
  class Base < ActiveSupport::CurrentAttributes
8
8
  include CurrentSession::Interface
9
- include CurrentSession::RaiseNotImplementedError
10
9
  attribute :current_user
11
10
 
12
11
  class << self
@@ -22,30 +21,29 @@ module CurrentSession
22
21
  Time.current
23
22
  end
24
23
 
25
- def session_methods=(session_methods_module)
26
- @session_repository_class = Class.new(CurrentSession::Repository) { include session_methods_module }
24
+ def session_methods=(session_methods)
25
+ @session_methods = session_methods
26
+ @session_class = CurrentSession::SessionMethod.new_session_class(session_methods)
27
27
  end
28
28
 
29
29
  def session_methods(&block)
30
30
  if block
31
- session_methods = Module.new(&block)
32
- @session_repository_class = Class.new(CurrentSession::Repository) { include session_methods }
33
- @session_methods = session_methods
31
+ @session_methods = Module.new(&block)
32
+ @session_class = CurrentSession::SessionMethod.new_session_class(session_methods)
34
33
  else
35
34
  @session_methods
36
35
  end
37
36
  end
38
37
 
39
38
  def auth_methods=(auth_methods_module)
40
- @auth_class = Class.new(CurrentSession::Auth) { include auth_methods_module }
39
+ @auth_class = CurrentSession::AuthMethod.new_auth_class(auth_methods_module)
41
40
  end
42
41
 
43
42
  def auth_methods(&block)
44
43
  if block
45
- auth_methods = Module.new(&block)
46
- @auth_class = Class.new(CurrentSession::Auth) { include auth_methods }
44
+ @auth_methods = Module.new(&block)
45
+ @auth_class = CurrentSession::AuthMethod.new_auth_class(auth_methods)
47
46
  @auth_class.user_class = user_class
48
- @auth_methods = auth_methods
49
47
  else
50
48
  @auth_methods
51
49
  end
@@ -12,15 +12,13 @@ module CurrentSession
12
12
  end
13
13
 
14
14
  def update(request)
15
- session_repository(request).try do |repository|
16
- repository.find { |user| self.current_user = user }
17
- end
15
+ session_repository(request).find_by_token { |user| self.current_user = user }
18
16
  self
19
17
  end
20
18
 
21
19
  def create(request)
22
20
  auth = @auth_class.new(request)
23
- auth.find_or_create_by_auth.try do |user|
21
+ auth.call do |user|
24
22
  auth.update(user)
25
23
  session_repository(request).update_session_token(user)
26
24
  end
@@ -28,16 +26,13 @@ module CurrentSession
28
26
 
29
27
  def destroy(request)
30
28
  self.current_user = nil
31
- session_repository(request).try do |repository|
32
- repository.destroy
33
- repository.delete_session_token
34
- end
29
+ session_repository(request).delete_session_token
35
30
  end
36
31
 
37
32
  private
38
33
 
39
34
  def session_repository(request)
40
- @session_repository_class.new(
35
+ @session_class.new(
41
36
  request: request,
42
37
  user_class: user_class,
43
38
  session_token_class: session_token_class,
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CurrentSession
4
+ #
5
+ # Base class for processing to get session_token from request.session
6
+ #
7
+ class SessionMethod
8
+ def self.new_session_class(session_methods)
9
+ Class.new(CurrentSession::SessionMethod) { include session_methods }
10
+ end
11
+
12
+ def initialize(current_time:, request:, user_class:, session_token_class:)
13
+ @current_time = current_time
14
+ @request = request
15
+ @user_class = user_class
16
+ @session_token_class = session_token_class
17
+ end
18
+ attr_reader :current_time, :request, :user_class, :session_token_class
19
+
20
+ def find_by_token(&block)
21
+ try_session_token { find(&block) }
22
+ end
23
+
24
+ def delete_session_token
25
+ try_session_token do
26
+ request.session.delete(key)
27
+ destroy
28
+ end
29
+ end
30
+
31
+ def update_session_token(user)
32
+ create(user) { |value| request.session[key] = value }
33
+ end
34
+
35
+ protected
36
+
37
+ def try_session_token
38
+ session_token.presence.try do
39
+ yield self
40
+ end
41
+ end
42
+
43
+ def find
44
+ fail NotImplementedError, "You must implement #{self.class}##{__method__}"
45
+ end
46
+
47
+ def create(user, &block)
48
+ fail NotImplementedError, "You must implement #{self.class}##{__method__}"
49
+ end
50
+
51
+ def destroy
52
+ fail NotImplementedError, "You must implement #{self.class}##{__method__}"
53
+ end
54
+
55
+ def key
56
+ @key ||= CurrentSession.key(user_class)
57
+ end
58
+
59
+ def session_token
60
+ @session_token ||= request.session[key]
61
+ end
62
+
63
+ def new_session_token
64
+ SecureRandom.urlsafe_base64(64)
65
+ end
66
+ end
67
+ end
@@ -16,9 +16,16 @@ module CurrentSession
16
16
  def create(user)
17
17
  session_token_class.create(user_id: user.id, value: new_session_token) do |record|
18
18
  update(record)
19
- end.value
19
+ yield record.value
20
+ end
21
+ end
22
+
23
+ def destroy
24
+ session_token_class.find_by(value: session_token)&.destroy
20
25
  end
21
26
 
27
+ private
28
+
22
29
  def update(token)
23
30
  token.update(
24
31
  last_request_at: current_time,
@@ -26,10 +33,6 @@ module CurrentSession
26
33
  last_request_user_agent: request.user_agent
27
34
  )
28
35
  end
29
-
30
- def destroy
31
- session_token_class.find_by(value: session_token)&.destroy
32
- end
33
36
  end
34
37
  end
35
38
  end
@@ -11,7 +11,7 @@ module CurrentSession
11
11
  Module.new do
12
12
  define_method(:current_user) { user_class.find(current_user_id) }
13
13
 
14
- def try
14
+ def try_session_token
15
15
  yield self
16
16
  end
17
17
 
@@ -11,7 +11,7 @@ module CurrentSession
11
11
  end
12
12
 
13
13
  def create(user)
14
- user.uid
14
+ yield user.uid
15
15
  end
16
16
 
17
17
  def destroy
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CurrentSession
4
- VERSION = "0.1.4"
4
+ VERSION = "0.1.6"
5
5
  end
@@ -10,9 +10,8 @@ module CurrentSession
10
10
  extend ActiveSupport::Autoload
11
11
  autoload :Base
12
12
  autoload :Interface
13
- autoload :Auth
14
- autoload :Repository
15
- autoload :RaiseNotImplementedError
13
+ autoload :AuthMethod
14
+ autoload :SessionMethod
16
15
  autoload :SessionMethods
17
16
 
18
17
  def self.key(user_class)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: current_session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masa (Aileron inc)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-03 00:00:00.000000000 Z
11
+ date: 2022-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -146,11 +146,10 @@ files:
146
146
  - bin/setup
147
147
  - current_session.gemspec
148
148
  - lib/current_session.rb
149
- - lib/current_session/auth.rb
149
+ - lib/current_session/auth_method.rb
150
150
  - lib/current_session/base.rb
151
151
  - lib/current_session/interface.rb
152
- - lib/current_session/raise_not_implemented_error.rb
153
- - lib/current_session/repository.rb
152
+ - lib/current_session/session_method.rb
154
153
  - lib/current_session/session_methods.rb
155
154
  - lib/current_session/session_methods/active_record_session.rb
156
155
  - lib/current_session/session_methods/env_session.rb
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CurrentSession
4
- #
5
- # Base class for providing auth methods
6
- #
7
- class Auth
8
- class_attribute :user_class
9
-
10
- def initialize(request)
11
- @request = request
12
- end
13
- attr_reader :request
14
-
15
- def auth
16
- request.env["omniauth.auth"]
17
- end
18
- end
19
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CurrentSession
4
- #
5
- # Class for verifying whether it is implemented correctly
6
- #
7
- module RaiseNotImplementedError
8
- extend ActiveSupport::Concern
9
- class_methods do
10
- def raise_not_implemented_error
11
- raise_not_implemented_error_for_repository
12
- raise_not_implemented_error_for_auth
13
- end
14
-
15
- private
16
-
17
- # rubocop:disable Layout/LineLength
18
- def raise_not_implemented_error_for_repository
19
- raise NotImplementedError, "You must setting self.session_repository_class= or session_methods" unless @session_repository_class
20
- raise NotImplementedError, "You must implement #{@session_repository_class}#find" unless @session_repository_class.method_defined? :find
21
- raise NotImplementedError, "You must implement #{@session_repository_class}#destroy" unless @session_repository_class.method_defined? :destroy
22
- raise NotImplementedError, "You must implement #{@session_repository_class}#destroy" unless @session_repository_class.method_defined? :destroy
23
- raise NotImplementedError, "You must implement #{@session_repository_class}#create" unless @session_repository_class.method_defined? :create
24
- end
25
- # rubocop:enable Layout/LineLength
26
-
27
- # rubocop:disable Layout/LineLength
28
- def raise_not_implemented_error_for_auth
29
- raise NotImplementedError, "You must setting self.auth_class= or auth_methods" unless @auth_class
30
- raise NotImplementedError, "You must implement #{@auth_class}#find_or_create_by_auth" unless @auth_class.method_defined? :find_or_create_by_auth
31
- raise NotImplementedError, "You must implement #{@auth_class}#update" unless @auth_class.method_defined? :update
32
- end
33
- # rubocop:enable Layout/LineLength
34
- end
35
- end
36
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CurrentSession
4
- #
5
- # Base class for processing to get session_token from request.session
6
- #
7
- class Repository
8
- def initialize(current_time:, request:, user_class:, session_token_class:)
9
- @current_time = current_time
10
- @request = request
11
- @user_class = user_class
12
- @session_token_class = session_token_class
13
- end
14
- attr_reader :current_time, :request, :user_class, :session_token_class
15
-
16
- def key
17
- @key ||= CurrentSession.key(user_class)
18
- end
19
-
20
- def session_token
21
- @session_token ||= request.session[key]
22
- end
23
-
24
- def new_session_token
25
- SecureRandom.urlsafe_base64(64)
26
- end
27
-
28
- def delete_session_token
29
- request.session.delete(key)
30
- end
31
-
32
- def update_session_token(user)
33
- request.session[key] = create(user)
34
- end
35
-
36
- def try
37
- session_token.presence.try do |_|
38
- yield self
39
- end
40
- end
41
- end
42
- end