hello-rails 0.5.0 → 0.5.1
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.
- checksums.yaml +4 -4
- data/README.md +16 -4
- data/app/controllers/hello/concerns/management/forgot_password.rb +1 -1
- data/app/controllers/hello/concerns/registration/sign_up.rb +7 -3
- data/app/controllers/hello/registration/sign_up_controller.rb +9 -1
- data/app/models/access.rb +2 -1
- data/app/models/credential.rb +2 -1
- data/app/models/email_credential.rb +2 -1
- data/app/models/password_credential.rb +2 -1
- data/app/models/user.rb +2 -1
- data/app/views/hello/shared/_nav_pills.html.erb +0 -2
- data/config/locales/hello.fr.yml +2 -4
- data/db/migrate/3_create_users.rb +10 -15
- data/lib/data/locales.yml +228 -0
- data/lib/generators/hello/install/install_generator.rb +8 -29
- data/lib/generators/hello/install/templates/initializer.rb +1 -1
- data/lib/generators/hello/install/templates/models/concerns/user/authorization.rb +8 -13
- data/lib/generators/hello/install/templates/models/user.rb +2 -1
- data/lib/generators/hello/users/USAGE +10 -0
- data/lib/generators/hello/{install/templates/users → users/templates/app}/controllers/users_controller.rb +2 -4
- data/lib/generators/hello/{install/templates/users → users/templates/app}/views/users/index.html.erb +1 -1
- data/lib/generators/hello/{install/templates/users → users/templates/app}/views/users/list.html.erb +3 -1
- data/lib/generators/hello/{install/templates/users → users/templates/app}/views/users/new.html.erb +2 -2
- data/lib/generators/hello/{install/templates/users → users/templates/app}/views/users/show.html.erb +0 -0
- data/lib/generators/hello/users/users_generator.rb +21 -0
- data/lib/hello/business/registration/sign_up.rb +30 -122
- data/lib/hello/locales.rb +1 -232
- data/lib/hello/rails_active_record/access.rb +12 -10
- data/lib/hello/rails_active_record/credential.rb +22 -18
- data/lib/hello/rails_active_record/email_credential.rb +12 -20
- data/lib/hello/rails_active_record/password_credential.rb +11 -32
- data/lib/hello/rails_active_record/user.rb +75 -54
- data/lib/hello/rails_controller.rb +1 -3
- data/lib/hello/rails_controller/restrict_by_role.rb +2 -2
- data/lib/hello/version.rb +1 -1
- data/spec/bdd/hello/authentication/classic_sign_in_spec.rb +2 -2
- data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_sign_in_form_spec.rb +1 -1
- data/spec/bdd/hello/management/manage_email_credentials/manage_email_credentials_emails_page_spec.rb +7 -7
- data/spec/bdd/hello/management/manage_password_credentials/manage_password_forgot_password_spec.rb +1 -1
- data/spec/bdd/hello/management/manage_password_credentials/manage_password_reset_password_spec.rb +1 -1
- data/spec/bdd/hello/management/manage_profile/manage_profile_page_spec.rb +0 -2
- data/spec/bdd/hello/other/create_user_spec.rb +1 -3
- data/spec/bdd/hello/other/impersonate_user_spec.rb +1 -2
- data/spec/bdd/hello/other/list_users_spec.rb +2 -4
- data/spec/bdd/hello/registration/classic_sign_up_spec.rb +3 -4
- data/spec/bdd/hello/support.rb +0 -4
- data/spec/business/hello/registration/sign_up_spec.rb +10 -2
- data/spec/controllers/authentication_spec.rb +3 -3
- data/spec/models/create_and_destroy/email_credential_create_and_destroy_spec.rb +81 -0
- data/spec/models/create_and_destroy/password_credential_create_and_destroy_spec.rb +60 -0
- data/spec/models/create_and_destroy/user_create_and_destroy_spec.rb +124 -0
- data/spec/models/credential_spec.rb +12 -3
- data/spec/models/email_credential_spec.rb +1 -2
- data/spec/models/password_credential_spec.rb +1 -2
- data/spec/models/user_spec.rb +87 -27
- data/spec/requests/forgot_password_spec.rb +1 -1
- data/spec/support/factories.rb +10 -14
- data/spec/support/helpers/given.rb +8 -16
- data/spec/support/helpers/when.rb +0 -1
- metadata +42 -38
- data/lib/generators/hello/from_devise/USAGE +0 -8
- data/lib/generators/hello/from_devise/from_devise_generator.rb +0 -13
- data/lib/generators/hello/from_devise/templates/from_devise.migration.rb +0 -39
- data/spec/models/hello/sign_up_model_spec.rb +0 -64
@@ -1,17 +1,19 @@
|
|
1
1
|
module Hello
|
2
2
|
module RailsActiveRecord
|
3
|
-
|
4
|
-
|
3
|
+
module Access
|
4
|
+
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
included do
|
7
|
+
# ASSOCIATIONS
|
8
|
+
belongs_to :user, counter_cache: true
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
# VALIDATIONS
|
11
|
+
validates_presence_of :user, :expires_at, :user_agent_string, :token
|
12
|
+
validates_uniqueness_of :token
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
before_validation on: :create do
|
15
|
+
self.token = "#{user_id}-#{Hello::Encryptors::Simple.instance.single(16)}"
|
16
|
+
end
|
15
17
|
end
|
16
18
|
|
17
19
|
# CUSTOM METHODS
|
@@ -50,7 +52,7 @@ module Hello
|
|
50
52
|
update_attributes!(expires_at: 30.minutes.from_now)
|
51
53
|
end
|
52
54
|
|
53
|
-
|
55
|
+
module ClassMethods
|
54
56
|
def destroy_all_expired
|
55
57
|
where('expires_at < ?', Time.now).destroy_all
|
56
58
|
true
|
@@ -1,20 +1,27 @@
|
|
1
1
|
module Hello
|
2
2
|
module RailsActiveRecord
|
3
|
-
|
4
|
-
|
3
|
+
module Credential
|
4
|
+
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
|
7
|
-
belongs_to :user, counter_cache: true, class_name: '::User'
|
6
|
+
included do
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
validates_inclusion_of :type, in: %w(EmailCredential PasswordCredential)
|
8
|
+
# ASSOCIATIONS
|
9
|
+
belongs_to :user, counter_cache: true
|
12
10
|
|
13
|
-
|
11
|
+
# VALIDATIONS
|
12
|
+
validates_presence_of :user, on: :update
|
13
|
+
|
14
|
+
after_destroy do
|
15
|
+
if destroyed_by_association.nil?
|
16
|
+
if user.invalid?
|
17
|
+
user.errors.each { |k, v| errors.add(k, v) if k.to_s.include?('credentials')}
|
18
|
+
fail ActiveRecord::Rollback
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
14
23
|
|
15
|
-
#
|
16
|
-
# is_a?(EmailCredential)
|
17
|
-
# end
|
24
|
+
# CUSTOM METHODS
|
18
25
|
|
19
26
|
def first_error_message
|
20
27
|
errors.messages.values.flatten.first if errors.any?
|
@@ -33,19 +40,16 @@ module Hello
|
|
33
40
|
uuid
|
34
41
|
end
|
35
42
|
|
36
|
-
|
37
|
-
update(verifying_token_digest: nil, verifying_token_digested_at: nil)
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
43
|
+
protected
|
41
44
|
|
42
|
-
def
|
43
|
-
|
45
|
+
def complex_encryptor
|
46
|
+
Hello::Encryptors::Complex.instance
|
44
47
|
end
|
45
48
|
|
46
49
|
def simple_encryptor
|
47
50
|
Hello::Encryptors::Simple.instance
|
48
51
|
end
|
52
|
+
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
@@ -1,12 +1,18 @@
|
|
1
1
|
module Hello
|
2
2
|
module RailsActiveRecord
|
3
|
-
|
3
|
+
module EmailCredential
|
4
4
|
|
5
|
-
|
6
|
-
before_destroy :cannot_destroy_last_email_credential
|
5
|
+
extend ActiveSupport::Concern
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
included do
|
8
|
+
include Credential
|
9
|
+
|
10
|
+
# VALIDATIONS
|
11
|
+
validates_uniqueness_of :email
|
12
|
+
validates_presence_of :email
|
13
|
+
validate :hello_validations, if: :email?
|
14
|
+
|
15
|
+
end
|
10
16
|
|
11
17
|
# SETTERS
|
12
18
|
def email=(v)
|
@@ -34,27 +40,13 @@ module Hello
|
|
34
40
|
private
|
35
41
|
|
36
42
|
def hello_validations
|
37
|
-
|
38
|
-
return false if errors[:email].any?
|
43
|
+
return if errors.has_key?(:email)
|
39
44
|
|
40
45
|
c = Hello.configuration
|
41
46
|
validates_length_of :email, in: c.email_length
|
42
|
-
return false if errors[:email].any?
|
43
|
-
|
44
47
|
validates_format_of :email, with: c.email_regex
|
45
|
-
return false if errors[:email].any?
|
46
|
-
end
|
47
|
-
|
48
|
-
def cannot_destroy_last_email_credential
|
49
|
-
return if hello_is_user_being_destroyed?
|
50
|
-
return unless is_last_email_credential?
|
51
|
-
errors[:base] << 'must have at least one credential'
|
52
|
-
false
|
53
48
|
end
|
54
49
|
|
55
|
-
def is_last_email_credential?
|
56
|
-
user.email_credentials.count == 1
|
57
|
-
end
|
58
50
|
end
|
59
51
|
end
|
60
52
|
end
|
@@ -1,13 +1,16 @@
|
|
1
1
|
module Hello
|
2
2
|
module RailsActiveRecord
|
3
|
-
|
3
|
+
module PasswordCredential
|
4
|
+
extend ActiveSupport::Concern
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
# validates_presence_of :digest
|
6
|
+
included do
|
7
|
+
include Credential
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
# VALIDATIONS
|
10
|
+
validates_presence_of :password, on: :create
|
11
|
+
validate :hello_validations, if: :digest_changed?
|
12
|
+
|
13
|
+
end
|
11
14
|
|
12
15
|
# SETTERS
|
13
16
|
|
@@ -34,37 +37,13 @@ module Hello
|
|
34
37
|
private
|
35
38
|
|
36
39
|
def hello_validations
|
37
|
-
return
|
38
|
-
|
39
|
-
return false if errors[:password].any?
|
40
|
+
return if errors.has_key?(:password)
|
40
41
|
c = Hello.configuration
|
41
|
-
|
42
42
|
validates_length_of :password, in: c.password_length
|
43
|
-
return
|
44
|
-
|
43
|
+
return if errors.has_key?(:password)
|
45
44
|
validates_format_of :password, with: c.password_regex
|
46
|
-
return false if errors[:password].any?
|
47
45
|
end
|
48
46
|
|
49
|
-
def complex_encryptor
|
50
|
-
Hello::Encryptors::Complex.instance
|
51
|
-
end
|
52
|
-
|
53
|
-
def simple_encryptor
|
54
|
-
Hello::Encryptors::Simple.instance
|
55
|
-
end
|
56
|
-
|
57
|
-
# # TODO: code for multiple passwords
|
58
|
-
# def cannot_destroy_last_password_credential
|
59
|
-
# return if hello_is_user_being_destroyed?
|
60
|
-
# return if not is_last_password_credential?
|
61
|
-
# errors[:base] << "must have at least one credential"
|
62
|
-
# false
|
63
|
-
# end
|
64
|
-
|
65
|
-
# def is_last_password_credential?
|
66
|
-
# user.password_credentials.count == 1
|
67
|
-
# end
|
68
47
|
end
|
69
48
|
end
|
70
49
|
end
|
@@ -1,23 +1,26 @@
|
|
1
1
|
module Hello
|
2
2
|
module RailsActiveRecord
|
3
|
-
|
4
|
-
|
3
|
+
module User
|
4
|
+
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
|
6
|
+
included do
|
7
|
+
# ASSOCIATIONS
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
has_many :accesses, dependent: :destroy, class_name: '::Access'
|
9
|
+
has_many :credentials, dependent: :destroy
|
10
|
+
has_many :email_credentials, dependent: :destroy
|
11
|
+
has_many :password_credentials, dependent: :destroy
|
12
|
+
has_many :accesses, dependent: :destroy
|
13
13
|
|
14
|
-
|
14
|
+
# VALIDATIONS
|
15
15
|
|
16
|
-
|
16
|
+
validates_presence_of :role, :locale, :time_zone
|
17
|
+
validates_uniqueness_of :username, if: :username?
|
18
|
+
validate :hello_validations
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
# DELEGATIONS
|
21
|
+
|
22
|
+
delegate :password_is?, to: :password_credential
|
23
|
+
end
|
21
24
|
|
22
25
|
# SETTERS
|
23
26
|
|
@@ -25,36 +28,46 @@ module Hello
|
|
25
28
|
super(v.to_s.downcase.remove(' '))
|
26
29
|
end
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
# It will however, work for Rails 4.1 and 4.2
|
36
|
-
# @hello_is_this_being_destroyed = true
|
37
|
-
Thread.current['Hello.destroying_user'] = true
|
38
|
-
super
|
31
|
+
def email=(v)
|
32
|
+
return if v.blank?
|
33
|
+
if email_credentials.any?
|
34
|
+
fail "use 'email_credentials.build(email: v)' instead"
|
35
|
+
else
|
36
|
+
email_credentials.build(user: self, email: v)
|
37
|
+
end
|
39
38
|
end
|
40
39
|
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
def password=(v)
|
41
|
+
return if v.blank?
|
42
|
+
if password_credentials.any?
|
43
|
+
fail "update your 'password_credential' instead"
|
44
|
+
else
|
45
|
+
password_credential.password=v
|
46
|
+
end
|
47
|
+
end
|
44
48
|
|
49
|
+
# GETTERS
|
45
50
|
|
46
|
-
|
51
|
+
def email
|
52
|
+
email_credentials.first.email
|
53
|
+
rescue
|
54
|
+
nil
|
55
|
+
end
|
47
56
|
|
48
|
-
def
|
49
|
-
|
57
|
+
def password
|
58
|
+
password_credential.password # yes, it might come blank
|
59
|
+
rescue
|
60
|
+
nil
|
50
61
|
end
|
51
62
|
|
52
|
-
def
|
53
|
-
password_credential.
|
63
|
+
def password_credential
|
64
|
+
@password_credential ||= password_credentials.first_or_initialize(user: self)
|
54
65
|
end
|
55
66
|
|
56
|
-
|
57
|
-
|
67
|
+
# CUSTOM METHODS
|
68
|
+
|
69
|
+
def as_json_web_api
|
70
|
+
as_json
|
58
71
|
end
|
59
72
|
|
60
73
|
def in_any_role?(roles)
|
@@ -62,38 +75,46 @@ module Hello
|
|
62
75
|
false
|
63
76
|
end
|
64
77
|
|
65
|
-
def set_generated_username
|
66
|
-
loop do
|
67
|
-
self.username = _make_up_new_username
|
68
|
-
break if _username_unique?
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
78
|
private
|
73
79
|
|
74
80
|
def hello_validations
|
75
81
|
c = Hello.configuration
|
76
|
-
|
77
82
|
validates_inclusion_of :locale, in: c.locales
|
78
83
|
validates_inclusion_of :time_zone, in: c.time_zones
|
79
|
-
|
80
|
-
|
84
|
+
|
85
|
+
hello_validations_username(c)
|
86
|
+
hello_validations_email(c)
|
87
|
+
hello_validations_password(c)
|
81
88
|
end
|
82
89
|
|
83
|
-
def
|
84
|
-
|
90
|
+
def hello_validations_username(c)
|
91
|
+
if c.username_presence
|
92
|
+
validates_presence_of :username
|
93
|
+
end
|
94
|
+
if username.present?
|
95
|
+
validates_format_of :username, with: c.username_regex
|
96
|
+
validates_length_of :username, in: c.username_length
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def hello_validations_email(c)
|
101
|
+
if c.email_presence
|
102
|
+
validates_length_of :email_credentials, minimum: 1
|
103
|
+
validates_presence_of :email
|
104
|
+
end
|
85
105
|
end
|
86
106
|
|
87
|
-
def
|
88
|
-
|
107
|
+
def hello_validations_password(c)
|
108
|
+
if new_record?
|
109
|
+
if c.password_presence
|
110
|
+
validates_presence_of :password
|
111
|
+
elsif password.blank?
|
112
|
+
password_credential.set_generated_password
|
113
|
+
end
|
114
|
+
end
|
115
|
+
validates_length_of :password_credentials, is: 1
|
89
116
|
end
|
90
117
|
|
91
|
-
# def username_suggestions
|
92
|
-
# email1 = email.to_s.split('@').first
|
93
|
-
# name1 = name.to_s.split(' ')
|
94
|
-
# ideas = [name1, email1].flatten
|
95
|
-
# [ideas.sample, rand(999)].join.parameterize
|
96
|
-
# end
|
97
118
|
end
|
98
119
|
end
|
99
120
|
end
|
@@ -46,7 +46,7 @@ module Hello
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def hello_manager
|
49
|
-
env['hello'] ||= Hello::RequestManager.create(request)
|
49
|
+
request.env['hello'] ||= Hello::RequestManager.create(request)
|
50
50
|
end
|
51
51
|
|
52
52
|
|
@@ -106,9 +106,7 @@ module Hello
|
|
106
106
|
logger.info " #{'Hello Session'.bold.light_blue} expires in #{expires_in}"
|
107
107
|
# end keep-alive
|
108
108
|
|
109
|
-
Thread.current['Hello.destroying_user'] = nil
|
110
109
|
Time.use_zone(current_user.time_zone, &block)
|
111
|
-
Thread.current['Hello.destroying_user'] = nil
|
112
110
|
else
|
113
111
|
yield
|
114
112
|
end
|
data/lib/hello/version.rb
CHANGED
@@ -5,7 +5,7 @@ RSpec.bdd.capability 'I can Sign In With Email' do
|
|
5
5
|
role 'User' do
|
6
6
|
|
7
7
|
before do
|
8
|
-
|
8
|
+
given_I_have_a_user
|
9
9
|
expect(Access.count).to eq(0)
|
10
10
|
end
|
11
11
|
|
@@ -222,7 +222,7 @@ RSpec.bdd.capability 'I can Sign In With Email' do
|
|
222
222
|
|
223
223
|
Then 'I should see the access object' do
|
224
224
|
expect(json_response.keys).to match_array ['expires_at', 'token', 'user', 'user_id']
|
225
|
-
expect(json_response['user'].keys).to match_array ['id', 'accesses_count', '
|
225
|
+
expect(json_response['user'].keys).to match_array ['id', 'accesses_count', 'created_at', 'credentials_count', 'locale', 'name', 'role', 'time_zone', 'updated_at', 'username']
|
226
226
|
end
|
227
227
|
|
228
228
|
Then 'I should get a 201 response' do
|
@@ -13,7 +13,7 @@ RSpec.bdd.uic "On The Sign In Form" do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
When "I sign in to a 'pt-BR' user" do
|
16
|
-
user =
|
16
|
+
user = given_I_have_a_user
|
17
17
|
user.update! locale: 'pt-BR'
|
18
18
|
when_sign_in_with_standard_data(skip_expire: true)
|
19
19
|
end
|