entrance 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9db48b6f4e950ecfecf95a8c51d17fd8e29296cc
4
+ data.tar.gz: 7cd2766497f3634f0ba201d1360055a11201e80d
5
+ SHA512:
6
+ metadata.gz: bbde9df5134233c9eee47139dd28643ed09653fd1f4509db82551e5d85b76fa6dc62bcce43e888dc55130f15525322af62920db80b5a378c34effe333b2fb18e
7
+ data.tar.gz: 6a2da9b7a78dcb87c790a9d1833f7d8591fb99e5bc604f5a51c02002ec70dc39655b78f436df11c5b62b4b5c54d76c5e14a7d83948cf60270d8d9d365c617487
data/README.md CHANGED
@@ -35,7 +35,9 @@ end
35
35
  class User
36
36
  include Entrance::Model
37
37
 
38
- ...
38
+ ... (setup fields)
39
+
40
+ validate_entrance! # ensures fields for authentication/remember/reset are present
39
41
  end
40
42
  ```
41
43
 
@@ -125,15 +127,17 @@ And the following helpers:
125
127
 
126
128
  Provides:
127
129
 
130
+ - .validate_entrance!
128
131
  - .authenticate(username, password)
129
- - #remember_me! and #forget_me!
132
+ - .with_password_reset_token(token)
130
133
  - #password and #password=(value)
131
- - #request_password_reset!
134
+ - #remember_me! and #forget_me! (unless remember_attr is set to nil)
135
+ - #request_password_reset! (unless reset_attr is set to nil)
132
136
 
133
137
  Examples
134
138
  ========
135
139
 
136
- Thought you might ask. There's a full example Rails app in the examples folder. Check it out.
140
+ Thought you might ask. There's a full example Rails app and a Sinatra app in the examples folder. Check them out.
137
141
 
138
142
  Author
139
143
  ======
@@ -1,3 +1,5 @@
1
1
  class User < ActiveRecord::Base
2
2
  include Entrance::Model
3
+
4
+ validate_entrance! # ensures everything is in order, and sets up password validations
3
5
  end
@@ -0,0 +1,12 @@
1
+ ## Example Sinatra App with Entrance
2
+
3
+ A quick example that shows how to use Entrance with a Sinatra modular app. Requires MongoDB.
4
+
5
+ To run:
6
+
7
+ git clone https://github.com/tomas/entrance
8
+ cd entrance/examples/sinatra-app
9
+ bundle install
10
+ bundle exec puma
11
+
12
+ And ready-o. Then point your browser to localhost:9292 and sign up, then sign in using your credentials.
@@ -14,6 +14,7 @@ end
14
14
 
15
15
  class User
16
16
  include MongoMapper::Document
17
+ include Entrance::Model
17
18
 
18
19
  key :state, :default => 'active'
19
20
 
@@ -27,10 +28,10 @@ class User
27
28
  key :reset_token
28
29
  key :reset_token_expires_at, Time
29
30
 
30
- include Entrance::Model # needs to be included after the properties are declared
31
+ validate_entrance! # ensures everything is in order, and sets up password validations
31
32
 
32
33
  def active?
33
34
  state.to_sym == :active
34
35
  end
35
36
 
36
- end
37
+ end
@@ -15,7 +15,7 @@
15
15
  <input checked="checked" id="remember_me" name="remember_me" type="checkbox" />
16
16
  </p>
17
17
 
18
- <input class="right btn btn-primary" data-disable-with="Logging in..." name="commit" tabindex="4" type="submit" value="Log in" />
18
+ <input class="right btn btn-primary" tabindex="3" type="submit" value="Log in" />
19
19
 
20
20
  </form>
21
21
 
@@ -1,6 +1,6 @@
1
1
  <h2>Sign up</h2>
2
2
 
3
- <form accept-charset="UTF-8" action="/signup" class="new_user" method="post">
3
+ <form accept-charset="UTF-8" action="/signup" method="post">
4
4
 
5
5
  <p>
6
6
  <input id="user_name" name="user[name]" placeholder="Your name" tabindex="1" type="text" />
@@ -18,8 +18,8 @@
18
18
  <input id="user_password_confirmation" name="user[password_confirmation]" placeholder="Retype password" tabindex="4" type="password" />
19
19
  </p>
20
20
 
21
- <input class="right btn btn-primary" data-disable-with="Creating account..." name="commit" tabindex="4" type="submit" value="Sign up" />
21
+ <input class="right btn btn-primary" tabindex="5" type="submit" value="Sign up" />
22
22
 
23
23
  </form>
24
24
 
25
- <p>Have an account? <a href="<%= url('/login') %>">Log in</a></p>
25
+ <p>Have an account? <a href="<%= url('/login') %>">Log in</a>.</p>
@@ -3,61 +3,63 @@ module Entrance
3
3
 
4
4
  def self.included(base)
5
5
 
6
- # if the target model class does not have a Model.where() method,
6
+ # if the target model class does not have a Model.where() method,
7
7
  # then login_by_session wont work, nor the ClassMethods below.
8
8
  # won't work so we cannot continue.
9
9
  unless base.respond_to?(:where)
10
- raise "#{base.name} does not have a .where() class method. Cannot continue."
10
+ raise "#{base.name} does not have a .where() finder class method. Cannot continue."
11
11
  end
12
12
 
13
- fields = if base.respond_to?(:columns) # ActiveRecord::Base
14
- base.columns.collect(&:name)
15
- elsif base.respond_to?(:keys) # MongoMapper::Document
16
- base.keys.keys
17
- else # just get setters in the class
18
- base.instance_methods(false).select { |m| m[/\=$/] }.map { |s| s.to_s.sub('=', '') }
19
- end.map { |el| el.to_sym }
20
-
21
- %w(username_attr password_attr).each do |key|
22
- field = Entrance.config.send(key)
23
- unless fields.include?(field.to_sym)
24
- raise "Couldn't find '#{field}' in #{base.name} model."
25
- end
26
- end
13
+ base.extend(ClassMethods)
14
+ end
27
15
 
28
- %w(remember reset).each do |what|
29
- if field = Entrance.config.send("#{what}_token_attr")
30
- until_field = Entrance.config.send("#{what}_until_attr")
16
+ module ClassMethods
31
17
 
18
+ def validate_entrance!
19
+ fields = if self.respond_to?(:columns) # ActiveRecord::Base
20
+ columns.collect(&:name)
21
+ elsif self.respond_to?(:keys) # MongoMapper::Document
22
+ keys.keys
23
+ else # just get setters in the class
24
+ instance_methods(false).select { |m| m[/\=$/] }.map { |s| s.to_s.sub('=', '') }
25
+ end.map { |el| el.to_sym }
26
+
27
+ %w(username_attr password_attr).each do |key|
28
+ field = Entrance.config.send(key)
32
29
  unless fields.include?(field.to_sym)
33
- raise "No #{Entrance.config.send("#{what}_token_attr")} field found. \
34
- Set the config.#{what}_token_attr option to nil to disable the #{what} option."
30
+ raise "Couldn't find '#{field}' in #{base.name} model."
35
31
  end
32
+ end
33
+
34
+ %w(remember reset).each do |what|
35
+ if field = Entrance.config.send("#{what}_token_attr")
36
+ until_field = Entrance.config.send("#{what}_until_attr")
36
37
 
37
- if until_field
38
- unless fields.include?(until_field.to_sym)
39
- raise "Couldn't find a #{Entrance.config.send("#{what}_until_attr")} field. Cannot continue."
38
+ unless fields.include?(field.to_sym)
39
+ raise "No #{Entrance.config.send("#{what}_token_attr")} field found. \
40
+ Set the config.#{what}_token_attr option to nil to disable the #{what} option."
41
+ end
42
+
43
+ if until_field
44
+ unless fields.include?(until_field.to_sym)
45
+ raise "Couldn't find a #{Entrance.config.send("#{what}_until_attr")} field. Cannot continue."
46
+ end
47
+ else
48
+ puts "Disabling expiration timestamp for the #{what} option. This is a VERY bad idea."
40
49
  end
41
- else
42
- puts "Disabling expiration timestamp for the #{what} option. This is a VERY bad idea."
43
- end
44
50
 
45
- Entrance.config.can?(what, true)
46
- base.include what.to_sym == :remember ? RememberMethods : ResetMethods
51
+ Entrance.config.can?(what, true)
52
+ self.send(:include, what.to_sym == :remember ? RememberMethods : ResetMethods)
53
+ end
47
54
  end
48
- end
49
55
 
50
- if base.respond_to?(:validates)
51
- base.validates :password, :presence => true, :length => 6..32, :if => :password_required?
52
- base.validates :password, :confirmation => true, :if => :password_required?
53
- base.validates :password_confirmation, :presence => true, :if => :password_required?
56
+ if self.respond_to?(:validates)
57
+ validates :password, :presence => true, :length => 6..32, :if => :password_required?
58
+ validates :password, :confirmation => true, :if => :password_required?
59
+ validates :password_confirmation, :presence => true, :if => :password_required?
60
+ end
54
61
  end
55
62
 
56
- base.extend(ClassMethods)
57
- end
58
-
59
- module ClassMethods
60
-
61
63
  def authenticate(username, password)
62
64
  return if username.blank? or password.blank?
63
65
 
@@ -0,0 +1,61 @@
1
+ require 'entrance'
2
+
3
+ module Sinatra
4
+
5
+ module Entrance
6
+
7
+ def self.registered(app)
8
+
9
+ app.include ::Entrance::Controller
10
+
11
+ app.helpers do
12
+ def redirect_with(url, type, message)
13
+ flash[type] = message if respond_to?(:flash)
14
+ redirect(to(url))
15
+ end
16
+ end
17
+
18
+ app.get '/login' do
19
+ if logged_in?
20
+ redirect(to('/'))
21
+ else
22
+ erb :'public/login'
23
+ end
24
+ end
25
+
26
+ app.post '/login' do
27
+ remember = ['on', 'true', '1'].include?(params[:remember])
28
+ if user = authenticate_and_login(params[:username], params[:password], remember)
29
+ flash[:success] = 'Welcome back!'
30
+ redirect_to_stored_or(to('/'))
31
+ else
32
+ redirect_with('/login', :error, "Couldn't log you in. Please try again.")
33
+ end
34
+ end
35
+
36
+ app.get '/logout' do
37
+ kill_session!
38
+ redirect_with('/login', :notice, 'Logged out! See you soon.')
39
+ end
40
+
41
+ app.get '/signup' do
42
+ return redirect(to('/')) if logged_in?
43
+ @user = ::Entrance.model.new
44
+ erb :'public/signup'
45
+ end
46
+
47
+ app.post '/signup' do
48
+ @user = ::Entrance.model.new(params[:user])
49
+ if @user.valid? && @user.save
50
+ redirect_with('/login', :success, "Account created! Please sign in to continue.")
51
+ else
52
+ flash[:error] = "Couldn't sign you up. Please try again."
53
+ erb :'public/signup'
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -1,7 +1,7 @@
1
1
  module Entrance
2
2
  MAJOR = 0
3
- MINOR = 2
4
- PATCH = 5
3
+ MINOR = 3
4
+ PATCH = 0
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].join('.')
7
7
  end
metadata CHANGED
@@ -1,46 +1,37 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: entrance
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 2
8
- - 5
9
- version: 0.2.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
10
5
  platform: ruby
11
- authors:
12
- - "Tom\xC3\xA1s Pollak"
6
+ authors:
7
+ - Tomás Pollak
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2015-01-15 00:00:00 -03:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2015-03-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: bcrypt
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 3
29
- - 0
30
- version: "3.0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
31
20
  type: :runtime
32
- version_requirements: *id001
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
33
27
  description: Doesn't fiddle with your controllers and routes.
34
- email:
28
+ email:
35
29
  - tomas@forkhq.com
36
30
  executables: []
37
-
38
31
  extensions: []
39
-
40
32
  extra_rdoc_files: []
41
-
42
- files:
43
- - .gitignore
33
+ files:
34
+ - ".gitignore"
44
35
  - README.md
45
36
  - Rakefile
46
37
  - entrance.gemspec
@@ -109,6 +100,7 @@ files:
109
100
  - examples/rails-app/vendor/assets/javascripts/.keep
110
101
  - examples/rails-app/vendor/assets/stylesheets/.keep
111
102
  - examples/sinatra-app/Gemfile
103
+ - examples/sinatra-app/README.md
112
104
  - examples/sinatra-app/app/models.rb
113
105
  - examples/sinatra-app/app/routes.rb
114
106
  - examples/sinatra-app/app/views/layout.erb
@@ -121,38 +113,30 @@ files:
121
113
  - lib/entrance/config.rb
122
114
  - lib/entrance/controller.rb
123
115
  - lib/entrance/model.rb
116
+ - lib/entrance/sinatra.rb
124
117
  - lib/entrance/version.rb
125
- has_rdoc: true
126
118
  homepage: https://github.com/tomas/entrance
127
119
  licenses: []
128
-
120
+ metadata: {}
129
121
  post_install_message:
130
122
  rdoc_options: []
131
-
132
- require_paths:
123
+ require_paths:
133
124
  - lib
134
- required_ruby_version: !ruby/object:Gem::Requirement
135
- requirements:
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
136
127
  - - ">="
137
- - !ruby/object:Gem::Version
138
- segments:
139
- - 0
140
- version: "0"
141
- required_rubygems_version: !ruby/object:Gem::Requirement
142
- requirements:
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
143
132
  - - ">="
144
- - !ruby/object:Gem::Version
145
- segments:
146
- - 1
147
- - 3
148
- - 6
133
+ - !ruby/object:Gem::Version
149
134
  version: 1.3.6
150
135
  requirements: []
151
-
152
136
  rubyforge_project: entrance
153
- rubygems_version: 1.3.6
137
+ rubygems_version: 2.2.0
154
138
  signing_key:
155
- specification_version: 3
139
+ specification_version: 4
156
140
  summary: Lean authentication alternative for Rails and Sinatra.
157
141
  test_files: []
158
-
142
+ has_rdoc: