token_attribute 0.0.4 → 0.1.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.
- data/RELEASE_NOTE.md +8 -0
- data/lib/token_attribute/version.rb +1 -1
- data/lib/token_attribute.rb +18 -11
- data/test/lib/token_attribute_test.rb +31 -3
- data/test/test_helper.rb +1 -1
- data/token_attribute.gemspec +1 -5
- metadata +69 -22
data/RELEASE_NOTE.md
ADDED
data/lib/token_attribute.rb
CHANGED
|
@@ -6,6 +6,7 @@ module TokenAttribute
|
|
|
6
6
|
extend ActiveSupport::Concern
|
|
7
7
|
|
|
8
8
|
module ClassMethods
|
|
9
|
+
DEFAULT_TOKEN_LENGTH = 10
|
|
9
10
|
|
|
10
11
|
# Macro-ish method to define token-setter.
|
|
11
12
|
# #set_#{attribute_name} will be defined to set unique token.
|
|
@@ -18,30 +19,36 @@ module TokenAttribute
|
|
|
18
19
|
attr_protected *attribute_names
|
|
19
20
|
end
|
|
20
21
|
|
|
22
|
+
# `/ 2` because "The length of the result string is twice of n".
|
|
23
|
+
# see: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html#method-c-hex
|
|
24
|
+
raise "Can't set odd number to token length" if options[:length] && (options[:length] % 2) == 1
|
|
25
|
+
length = (options[:length] || DEFAULT_TOKEN_LENGTH) / 2
|
|
26
|
+
|
|
21
27
|
attribute_names.each do |attribute|
|
|
22
28
|
|
|
23
29
|
generator_method_name = "generate_#{attribute}"
|
|
30
|
+
setter_method_name = "set_#{attribute}"
|
|
31
|
+
attribute_to_scope = Array.wrap(options[:scope])
|
|
24
32
|
|
|
25
33
|
define_method generator_method_name do
|
|
26
|
-
key = SecureRandom.hex(
|
|
34
|
+
key = SecureRandom.hex(length)
|
|
27
35
|
end
|
|
28
|
-
scope_items = Array.wrap(options[:scope])
|
|
29
|
-
|
|
30
|
-
setter_method_name = "set_#{attribute}"
|
|
31
36
|
|
|
32
37
|
define_method setter_method_name do
|
|
33
38
|
|
|
34
|
-
|
|
39
|
+
candidate = send generator_method_name
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
# Gererate scope condition
|
|
42
|
+
condition = {}
|
|
43
|
+
attribute_to_scope.each do |name|
|
|
44
|
+
condition[name] = self.attributes[name]
|
|
39
45
|
end
|
|
40
|
-
|
|
46
|
+
condition.merge!(attribute => candidate)
|
|
41
47
|
|
|
42
|
-
unless self.class.where(
|
|
43
|
-
self[attribute] =
|
|
48
|
+
unless self.class.where(condition).exists?
|
|
49
|
+
self[attribute] = candidate
|
|
44
50
|
else
|
|
51
|
+
# Recur if the token is already used
|
|
45
52
|
send setter_method_name
|
|
46
53
|
end
|
|
47
54
|
end
|
|
@@ -22,6 +22,7 @@ class TokenAttributeTest < Test::Unit::TestCase
|
|
|
22
22
|
assert klass.new.methods.map(&:to_sym).include? method_name
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
|
+
|
|
25
26
|
test 'can make attr_protected with option' do
|
|
26
27
|
klass = User.dup
|
|
27
28
|
klass.class_eval do
|
|
@@ -30,7 +31,8 @@ class TokenAttributeTest < Test::Unit::TestCase
|
|
|
30
31
|
end
|
|
31
32
|
assert klass.protected_attributes.include? :download_ticket
|
|
32
33
|
end
|
|
33
|
-
|
|
34
|
+
|
|
35
|
+
test 'can scope' do
|
|
34
36
|
klass = User.dup
|
|
35
37
|
klass.class_eval do
|
|
36
38
|
include TokenAttribute
|
|
@@ -43,13 +45,39 @@ class TokenAttributeTest < Test::Unit::TestCase
|
|
|
43
45
|
[one, two].each {|u| u.save }
|
|
44
46
|
assert one.download_ticket == two.download_ticket
|
|
45
47
|
end
|
|
48
|
+
|
|
49
|
+
describe 'Token length' do
|
|
50
|
+
test '10 by default' do
|
|
51
|
+
klass = User.dup
|
|
52
|
+
klass.class_eval do
|
|
53
|
+
include TokenAttribute
|
|
54
|
+
token_attribute :download_ticket
|
|
55
|
+
before_save :set_download_ticket
|
|
56
|
+
end
|
|
57
|
+
one = klass.new :name => 'fujimura'
|
|
58
|
+
one.save
|
|
59
|
+
assert_equal one.download_ticket.length, 10
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
test 'can be configured' do
|
|
63
|
+
klass = User.dup
|
|
64
|
+
klass.class_eval do
|
|
65
|
+
include TokenAttribute
|
|
66
|
+
token_attribute :download_ticket, :length => 8
|
|
67
|
+
before_save :set_download_ticket
|
|
68
|
+
end
|
|
69
|
+
one = klass.new :name => 'fujimura'
|
|
70
|
+
one.save
|
|
71
|
+
assert_equal one.download_ticket.length, 8
|
|
72
|
+
end
|
|
73
|
+
end
|
|
46
74
|
end
|
|
47
75
|
|
|
48
76
|
context 'class with access_token as token_attribute' do
|
|
49
77
|
|
|
50
78
|
describe '#generate_access_token' do
|
|
51
79
|
test 'returns random string' do
|
|
52
|
-
stub(SecureRandom).hex
|
|
80
|
+
stub(SecureRandom).hex { 'abcde' }
|
|
53
81
|
assert_equal @user.generate_access_token, 'abcde'
|
|
54
82
|
end
|
|
55
83
|
end
|
|
@@ -59,6 +87,7 @@ class TokenAttributeTest < Test::Unit::TestCase
|
|
|
59
87
|
@user.set_access_token
|
|
60
88
|
assert @user.access_token != nil
|
|
61
89
|
end
|
|
90
|
+
|
|
62
91
|
test 'set again if it duplicates' do
|
|
63
92
|
dup = 'duplicating'
|
|
64
93
|
User.create :access_token => dup
|
|
@@ -78,5 +107,4 @@ class TokenAttributeTest < Test::Unit::TestCase
|
|
|
78
107
|
assert coupon.code == 'my code'
|
|
79
108
|
end
|
|
80
109
|
end
|
|
81
|
-
|
|
82
110
|
end
|
data/test/test_helper.rb
CHANGED
data/token_attribute.gemspec
CHANGED
|
@@ -27,9 +27,5 @@ Gem::Specification.new do |s|
|
|
|
27
27
|
s.add_development_dependency "contest"
|
|
28
28
|
s.add_development_dependency "turn", '>= 0.8.3'
|
|
29
29
|
s.add_development_dependency "rr"
|
|
30
|
-
|
|
31
|
-
s.add_development_dependency "ruby-debug19"
|
|
32
|
-
else
|
|
33
|
-
s.add_development_dependency "ruby-debug"
|
|
34
|
-
end
|
|
30
|
+
s.add_development_dependency "pry"
|
|
35
31
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: token_attribute
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2012-12-19 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activerecord
|
|
16
|
-
requirement:
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,10 +21,15 @@ dependencies:
|
|
|
21
21
|
version: 3.0.0
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements:
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: 3.0.0
|
|
25
30
|
- !ruby/object:Gem::Dependency
|
|
26
31
|
name: activesupport
|
|
27
|
-
requirement:
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
28
33
|
none: false
|
|
29
34
|
requirements:
|
|
30
35
|
- - ! '>='
|
|
@@ -32,10 +37,15 @@ dependencies:
|
|
|
32
37
|
version: 3.0.0
|
|
33
38
|
type: :runtime
|
|
34
39
|
prerelease: false
|
|
35
|
-
version_requirements:
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: 3.0.0
|
|
36
46
|
- !ruby/object:Gem::Dependency
|
|
37
47
|
name: rake
|
|
38
|
-
requirement:
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
39
49
|
none: false
|
|
40
50
|
requirements:
|
|
41
51
|
- - ! '>='
|
|
@@ -43,10 +53,15 @@ dependencies:
|
|
|
43
53
|
version: '0'
|
|
44
54
|
type: :development
|
|
45
55
|
prerelease: false
|
|
46
|
-
version_requirements:
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ! '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
47
62
|
- !ruby/object:Gem::Dependency
|
|
48
63
|
name: sqlite3
|
|
49
|
-
requirement:
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
50
65
|
none: false
|
|
51
66
|
requirements:
|
|
52
67
|
- - ! '>='
|
|
@@ -54,10 +69,15 @@ dependencies:
|
|
|
54
69
|
version: '0'
|
|
55
70
|
type: :development
|
|
56
71
|
prerelease: false
|
|
57
|
-
version_requirements:
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '0'
|
|
58
78
|
- !ruby/object:Gem::Dependency
|
|
59
79
|
name: minitest
|
|
60
|
-
requirement:
|
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
|
61
81
|
none: false
|
|
62
82
|
requirements:
|
|
63
83
|
- - ! '>='
|
|
@@ -65,10 +85,15 @@ dependencies:
|
|
|
65
85
|
version: '0'
|
|
66
86
|
type: :development
|
|
67
87
|
prerelease: false
|
|
68
|
-
version_requirements:
|
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
+
none: false
|
|
90
|
+
requirements:
|
|
91
|
+
- - ! '>='
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '0'
|
|
69
94
|
- !ruby/object:Gem::Dependency
|
|
70
95
|
name: contest
|
|
71
|
-
requirement:
|
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
97
|
none: false
|
|
73
98
|
requirements:
|
|
74
99
|
- - ! '>='
|
|
@@ -76,10 +101,15 @@ dependencies:
|
|
|
76
101
|
version: '0'
|
|
77
102
|
type: :development
|
|
78
103
|
prerelease: false
|
|
79
|
-
version_requirements:
|
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
+
none: false
|
|
106
|
+
requirements:
|
|
107
|
+
- - ! '>='
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0'
|
|
80
110
|
- !ruby/object:Gem::Dependency
|
|
81
111
|
name: turn
|
|
82
|
-
requirement:
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
83
113
|
none: false
|
|
84
114
|
requirements:
|
|
85
115
|
- - ! '>='
|
|
@@ -87,10 +117,15 @@ dependencies:
|
|
|
87
117
|
version: 0.8.3
|
|
88
118
|
type: :development
|
|
89
119
|
prerelease: false
|
|
90
|
-
version_requirements:
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
none: false
|
|
122
|
+
requirements:
|
|
123
|
+
- - ! '>='
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: 0.8.3
|
|
91
126
|
- !ruby/object:Gem::Dependency
|
|
92
127
|
name: rr
|
|
93
|
-
requirement:
|
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
|
94
129
|
none: false
|
|
95
130
|
requirements:
|
|
96
131
|
- - ! '>='
|
|
@@ -98,10 +133,15 @@ dependencies:
|
|
|
98
133
|
version: '0'
|
|
99
134
|
type: :development
|
|
100
135
|
prerelease: false
|
|
101
|
-
version_requirements:
|
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
137
|
+
none: false
|
|
138
|
+
requirements:
|
|
139
|
+
- - ! '>='
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '0'
|
|
102
142
|
- !ruby/object:Gem::Dependency
|
|
103
|
-
name:
|
|
104
|
-
requirement:
|
|
143
|
+
name: pry
|
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
|
105
145
|
none: false
|
|
106
146
|
requirements:
|
|
107
147
|
- - ! '>='
|
|
@@ -109,7 +149,12 @@ dependencies:
|
|
|
109
149
|
version: '0'
|
|
110
150
|
type: :development
|
|
111
151
|
prerelease: false
|
|
112
|
-
version_requirements:
|
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
+
none: false
|
|
154
|
+
requirements:
|
|
155
|
+
- - ! '>='
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '0'
|
|
113
158
|
description: Small macro to generate unique random token attribute for ActiveRecord
|
|
114
159
|
email:
|
|
115
160
|
- me@fujimuradaisuke.com
|
|
@@ -121,6 +166,7 @@ files:
|
|
|
121
166
|
- .travis.yml
|
|
122
167
|
- Gemfile
|
|
123
168
|
- README.md
|
|
169
|
+
- RELEASE_NOTE.md
|
|
124
170
|
- Rakefile
|
|
125
171
|
- TODO.md
|
|
126
172
|
- lib/token_attribute.rb
|
|
@@ -148,10 +194,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
148
194
|
version: '0'
|
|
149
195
|
requirements: []
|
|
150
196
|
rubyforge_project: token_attribute
|
|
151
|
-
rubygems_version: 1.8.
|
|
197
|
+
rubygems_version: 1.8.23
|
|
152
198
|
signing_key:
|
|
153
199
|
specification_version: 3
|
|
154
200
|
summary: Small macro to generate unique random token attribute for ActiveRecord
|
|
155
201
|
test_files:
|
|
156
202
|
- test/lib/token_attribute_test.rb
|
|
157
203
|
- test/test_helper.rb
|
|
204
|
+
has_rdoc:
|