active_session 0.1.0 → 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.
@@ -1,117 +1,7 @@
1
1
  require "active_model"
2
- require "active_support/core_ext"
3
- require "active_session/attribute_methods"
2
+ require "authencitity_validator"
4
3
  require "active_session/errors"
5
4
 
6
5
  module ActiveSession
7
- # Adds a simple session mechanism for a given model.
8
- #
9
- # <tt>authenticates :user</tt> adds <tt>user</tt> and
10
- # <tt>user=(new_user)</tt> methods.
11
- #
12
- # Options are:
13
- # * <tt>:class_name</tt> - Specifies the class name of the
14
- # association. Use it only if that name can't be inferred from the
15
- # name. So <tt>authenticates :user</tt> will by default be linked
16
- # to the User class, but if the real class name is Admin, you'll
17
- # have to specify it using this option.
18
- # * <tt>:foreign_key</tt> - Specifies the foreign key of the
19
- # association. Use it only if the key can't be inferred from the
20
- # name. So <tt>authenticates :user</tt> will by default add
21
- # <tt>user_id</tt> and <tt>user_id=(new_user_id)</tt> methods.
22
- # * <tt>:primary_key</tt> - Specifies the primary key of the
23
- # association. Use it only if the key is different than <tt>id</tt>.
24
- # * <tt>:finder_method</tt> - Specifies the finder_method for the
25
- # association. Uses <tt>find_for_authentication</tt> method by
26
- # default.
27
- # * <tt>:persists</tt> - Specifies if the session model is
28
- # persistable in the store. If set to <tt>true</tt> (default)
29
- # <tt>foreign_key</tt> will be used to store session. So
30
- # <tt>authenticates :user</tt> will by default store the session
31
- # using <tt>:user_id</tt> key in the store, and use
32
- # <tt>user_id</tt> method to fetch the stored value. You can
33
- # change it to <tt>:email</tt> if you want to use <tt>:email</tt>
34
- # key and <tt>email</tt> method to store the session. You can also
35
- # turn the persistence off by passing <tt>false</tt>. Adds
36
- # <tt>save</tt>, <tt>destroy</tt>, <tt>persisted?</tt> and a class
37
- # method <tt>find</tt> when turned on. When turned off adds only
38
- # <tt>persisted?</tt> method that returns false to comply with
39
- # <tt>ActiveModel::Lint</tt>.
40
6
 
41
- def authenticates(name, options = {})
42
- options.assert_valid_keys(:class_name, :foreign_key, :primary_key, :finder_method, :persists)
43
-
44
- klass = options.fetch(:class_name, name.to_s.classify)
45
- foreign_key = options.fetch(:foreign_key, "#{name}_id").to_sym
46
- primary_key = options.fetch(:primary_key, "id").to_sym
47
- finder_method = options.fetch(:finder_method, "find_for_authentication").to_sym
48
- persists = options.fetch(:persists, foreign_key)
49
-
50
- extend ActiveModel::Naming
51
- include ActiveModel::AttributeMethods
52
- include ActiveModel::Conversion
53
- include ActiveModel::MassAssignmentSecurity
54
- include ActiveModel::Validations
55
-
56
- include AttributeMethods
57
-
58
- attribute_method_suffix "", "="
59
-
60
- validates name, :presence => true
61
-
62
- class_eval <<-END, __FILE__, __LINE__ + 1
63
- def #{name}
64
- return @#{name} if defined?(@#{name})
65
- @#{name} = #{klass}.#{finder_method}(:#{primary_key} => #{foreign_key})
66
- end
67
-
68
- def #{name}=(model)
69
- raise ActiveSession::AssociationTypeMismatch, "#{klass} expected, got \#{model.class}" unless model.nil? or model.is_a?(#{klass})
70
- self.#{foreign_key} = model.try(:#{primary_key})
71
- end
72
-
73
- def #{foreign_key}
74
- @attributes[:#{foreign_key}]
75
- end
76
-
77
- def #{foreign_key}=(model_id)
78
- remove_instance_variable("@#{name}") if instance_variable_defined?("@#{name}")
79
- @attributes[:#{foreign_key}] = model_id
80
- end
81
- END
82
-
83
- persists(persists == true ? foreign_key : persists)
84
- end
85
-
86
- private
87
-
88
- def persists(key)
89
- if key
90
- instance_eval <<-END, __FILE__, __LINE__ + 1
91
- def find(store)
92
- new(store, :#{key} => store[:#{key}])
93
- end
94
- END
95
-
96
- class_eval <<-END, __FILE__, __LINE__ + 1
97
- def persisted?
98
- @store[:#{key}].present? and @store[:#{key}] == #{key}
99
- end
100
-
101
- def destroy
102
- persisted? && @store.delete(:#{key}) && true
103
- end
104
-
105
- def save
106
- valid? && (@store[:#{key}] = #{key}) && true
107
- end
108
- END
109
- else
110
- class_eval <<-END, __FILE__, __LINE__ + 1
111
- def persisted?
112
- false
113
- end
114
- END
115
- end
116
- end
117
7
  end
@@ -1,5 +1,13 @@
1
1
  module ActiveSession
2
- module AttributeMethods
2
+ class Base
3
+ extend ActiveModel::Naming
4
+ include ActiveModel::AttributeMethods
5
+ include ActiveModel::Conversion
6
+ include ActiveModel::MassAssignmentSecurity
7
+ include ActiveModel::Validations
8
+
9
+ attribute_method_suffix "", "="
10
+
3
11
  def initialize(store, attributes = nil, options = {})
4
12
  @store = store
5
13
  @attributes = {}
@@ -7,10 +15,6 @@ module ActiveSession
7
15
  yield self if block_given?
8
16
  end
9
17
 
10
- def attributes
11
- @attributes
12
- end
13
-
14
18
  def attributes=(attributes)
15
19
  assign_attributes(attributes)
16
20
  end
@@ -33,6 +37,10 @@ module ActiveSession
33
37
  end
34
38
  end
35
39
 
40
+ def persisted?
41
+ false
42
+ end
43
+
36
44
  private
37
45
 
38
46
  def attribute(attribute)
@@ -6,8 +6,4 @@ module ActiveSession
6
6
  class UnknownAttributeError < NoMethodError
7
7
  include ActiveSessionError
8
8
  end
9
-
10
- class AssociationTypeMismatch < StandardError
11
- include ActiveSessionError
12
- end
13
9
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveSession
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,7 @@
1
+ class AuthenticityValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ authenticating_record = options[:of] ? record.send(options[:of]) : record
4
+ authentic = authenticating_record ? authenticating_record.authenticate(value) : true
5
+ record.errors.add(attribute, :invalid) unless authentic
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-10-19 00:00:00.000000000Z
13
+ date: 2011-10-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
17
- requirement: &11440600 !ruby/object:Gem::Requirement
17
+ requirement: &19050140 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.1.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *11440600
25
+ version_requirements: *19050140
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &11440080 !ruby/object:Gem::Requirement
28
+ requirement: &19049640 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 3.1.1
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *11440080
36
+ version_requirements: *19049640
37
37
  description: ActiveModel session
38
38
  email:
39
39
  - qoobaa@gmail.com
@@ -49,13 +49,11 @@ files:
49
49
  - Rakefile
50
50
  - active_session.gemspec
51
51
  - lib/active_session.rb
52
- - lib/active_session/attribute_methods.rb
52
+ - lib/active_session/base.rb
53
53
  - lib/active_session/errors.rb
54
54
  - lib/active_session/version.rb
55
+ - lib/authenticity_validator.rb
55
56
  - test/helper.rb
56
- - test/models/user.rb
57
- - test/models/user_session.rb
58
- - test/user_session_test.rb
59
57
  homepage: ''
60
58
  licenses: []
61
59
  post_install_message:
@@ -76,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
74
  version: '0'
77
75
  requirements: []
78
76
  rubyforge_project:
79
- rubygems_version: 1.8.6
77
+ rubygems_version: 1.8.10
80
78
  signing_key:
81
79
  specification_version: 3
82
80
  summary: ActiveModel session
data/test/models/user.rb DELETED
@@ -1,11 +0,0 @@
1
- class User
2
- attr_reader :id
3
-
4
- def self.find_for_authentication(conditions)
5
- new(conditions[:id]) if conditions[:id].to_i > 0
6
- end
7
-
8
- def initialize(id)
9
- @id = id
10
- end
11
- end
@@ -1,4 +0,0 @@
1
- class UserSession
2
- extend ActiveSession
3
- authenticates :user
4
- end
@@ -1,126 +0,0 @@
1
- require "helper"
2
-
3
- require "models/user"
4
- require "models/user_session"
5
-
6
- describe UserSession do
7
- include ActiveModel::Lint::Tests
8
-
9
- before do
10
- @store = {}
11
- @model = UserSession.new(@store)
12
- end
13
-
14
- describe "valid?" do
15
-
16
- it "returns false if new record" do
17
- session = UserSession.new(@store)
18
- assert_equal false, session.valid?
19
- end
20
-
21
- it "returns true with existing user_id" do
22
- session = UserSession.new(@store, :user_id => 1)
23
- assert_equal true, session.valid?
24
- end
25
-
26
- it "returns false with non-existing user_id" do
27
- session = UserSession.new(@store, :user_id => "non-existing")
28
- assert_equal false, session.valid?
29
- end
30
-
31
- it "returns true with existing user" do
32
- session = UserSession.new(@store, :user => User.new(1))
33
- assert_equal true, session.valid?
34
- end
35
-
36
- it "returns false when user is nil" do
37
- session = UserSession.new(@store, :user => nil)
38
- assert_equal false, session.valid?
39
- end
40
-
41
- end
42
-
43
- describe "save" do
44
-
45
- it "returns true with existing user_id" do
46
- session = UserSession.new(@store, :user_id => 5)
47
- assert_equal true, session.save
48
- assert_equal 5, @store[:user_id]
49
- end
50
-
51
- it "returns false with non-existing user" do
52
- @store[:user_id] = "666"
53
- session = UserSession.new(@store, :user => nil)
54
- assert_equal false, session.save
55
- assert_equal "666", @store[:user_id]
56
- end
57
-
58
- end
59
-
60
- describe "persisted?" do
61
-
62
- it "returns true with existing user and user_id in store" do
63
- @store[:user_id] = 1
64
- session = UserSession.new(@store, :user_id => 1)
65
- assert_equal true, session.persisted?
66
- end
67
-
68
- it "returns false without user_id" do
69
- @store[:user_id] = "666"
70
- session = UserSession.new(@store)
71
- assert_equal false, session.persisted?
72
- end
73
-
74
- it "returns false with existing user and different user_id in store" do
75
- @store[:user_id] = "666"
76
- session = UserSession.new(@store, :user_id => 1)
77
- assert_equal false, session.persisted?
78
- end
79
-
80
- end
81
-
82
- describe "destroy" do
83
-
84
- it "returns true when persisted with existing user" do
85
- @store[:user_id] = 1
86
- session = UserSession.new(@store, :user_id => 1)
87
- assert_equal true, session.destroy
88
- assert_nil @store[:user_id]
89
- end
90
-
91
- it "returns false when not persisted" do
92
- @store[:user_id] = "666"
93
- session = UserSession.new(@store, :user_id => 1)
94
- assert_equal false, session.destroy
95
- assert_equal "666", @store[:user_id]
96
- end
97
-
98
- end
99
-
100
- describe "user" do
101
-
102
- it "returns user with given user_id" do
103
- session = UserSession.new(@store)
104
- assert_nil session.user
105
- session.user_id = 1
106
- assert_equal 1, session.user.id
107
- end
108
-
109
- end
110
-
111
- describe "user=" do
112
-
113
- it "works properly with nil" do
114
- session = UserSession.new(@store, :user => User.new(1))
115
- session.user = nil
116
- assert_nil session.user
117
- assert_nil session.user_id
118
- end
119
-
120
- it "raises exception when non-user class given" do
121
- session = UserSession.new(@store, :user_id => 1)
122
- assert_raises(ActiveSession::AssociationTypeMismatch) { session.user = "zomg" }
123
- end
124
-
125
- end
126
- end