token_attribute 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/RELEASE_NOTE.md ADDED
@@ -0,0 +1,8 @@
1
+ Release notes
2
+ =====
3
+
4
+ ## 0.1.0
5
+
6
+ ### `#token_attribute`
7
+
8
+ Add option `length` to specify token length.
@@ -1,3 +1,3 @@
1
1
  module TokenAttribute
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -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(10)
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
- key = send generator_method_name
39
+ candidate = send generator_method_name
35
40
 
36
- cond = {}
37
- scope_items.each do |scope_item|
38
- cond[scope_item] = self.send(scope_item)
41
+ # Gererate scope condition
42
+ condition = {}
43
+ attribute_to_scope.each do |name|
44
+ condition[name] = self.attributes[name]
39
45
  end
40
- cond.merge!(attribute => key)
46
+ condition.merge!(attribute => candidate)
41
47
 
42
- unless self.class.where(cond).exists?
43
- self[attribute] = key
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
- test 'can be scoped' do
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(10) { 'abcde' }
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
@@ -3,7 +3,7 @@ require File.expand_path('../../lib/token_attribute', __FILE__)
3
3
  require 'minitest/unit'
4
4
  require 'contest'
5
5
  require 'rr'
6
- require 'ruby-debug'
6
+ require 'pry'
7
7
  require 'turn'
8
8
  Test::Unit::TestCase.send :include, RR::Adapters::TestUnit
9
9
 
@@ -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
- if RUBY_VERSION.to_f == 1.9
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
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: 2011-10-25 00:00:00.000000000Z
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: &70158298353140 !ruby/object:Gem::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: *70158298353140
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: &70158298352680 !ruby/object:Gem::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: *70158298352680
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: &70158298352300 !ruby/object:Gem::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: *70158298352300
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: &70158298351880 !ruby/object:Gem::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: *70158298351880
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: &70158298351460 !ruby/object:Gem::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: *70158298351460
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: &70158298351040 !ruby/object:Gem::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: *70158298351040
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: &70158298350540 !ruby/object:Gem::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: *70158298350540
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: &70158298350160 !ruby/object:Gem::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: *70158298350160
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: ruby-debug19
104
- requirement: &70158298349720 !ruby/object:Gem::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: *70158298349720
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.10
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: