avocado 0.1.0 → 0.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +19 -6
- data/lib/avocado/mailer.rb +38 -0
- data/lib/avocado/user.rb +17 -0
- data/lib/avocado/user_email.rb +15 -0
- data/lib/avocado/{user_concern.rb → user_email_affirmation.rb} +4 -2
- data/lib/avocado/user_email_verification.rb +17 -0
- data/lib/avocado/user_password.rb +18 -0
- data/lib/avocado/user_password_reset.rb +27 -0
- data/lib/avocado/version.rb +1 -1
- data/lib/avocado.rb +8 -1
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '04228885896e7d922d727e6497a22a933f3910c96afad40b69bd21d209ab4a3c'
|
4
|
+
data.tar.gz: 8a71cb118b5d97513f506d44ee5b2e01a0af5747d9e8151c9d866a589565d660
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ff80323ec0979cbfecaa008f7cca93a73c7e2e82df4ac5590caae93de5b3b903c9fc724ab8508c50d70299d118df94718d6c22d00b0f990798a0a3544091a7f
|
7
|
+
data.tar.gz: d39393b42cfc22511acecaceacce2dc345a65a1500fe3071c7b69f11876f479eb48d9d03beee052a0518b485da2ded599b6fe919454df7bb547a4e2d3ac67664
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.3.0] - 2023-07-17
|
4
|
+
|
5
|
+
- Add an `Avocado::Mailer` which generates each of the signed ids
|
6
|
+
- Rename `password_recovery` to `password_reset`
|
7
|
+
|
8
|
+
## [0.2.0] - 2023-07-15
|
9
|
+
|
10
|
+
- Validate presence, uniqueness, and format on `email` attribute
|
11
|
+
- Normalize email value during save
|
12
|
+
- Validate password format and length
|
13
|
+
- Include a token generator for password recovery
|
14
|
+
- Rename `Avocado::UserConcern` to `Avocado::User`
|
15
|
+
|
3
16
|
## [0.1.0] - 2023-07-14
|
4
17
|
|
5
18
|
- Initial release
|
data/README.md
CHANGED
@@ -15,18 +15,31 @@ Without bundler, install the gem by executing:
|
|
15
15
|
## Usage
|
16
16
|
|
17
17
|
If you have a `User` model in your application and are nervous about using Rails
|
18
|
-
features directly, preferring to consume the features via a packaged gem,
|
19
|
-
|
20
|
-
adding the `Avocado::UserConcern` to your `User` model:
|
18
|
+
features directly, preferring to consume the features via a packaged gem, add
|
19
|
+
the `Avocado::User` to your `User` model:
|
21
20
|
|
22
21
|
```ruby
|
23
22
|
class User < ApplicationRecord
|
24
|
-
include Avocado::
|
23
|
+
include Avocado::User
|
25
24
|
end
|
26
25
|
```
|
27
26
|
|
28
|
-
|
29
|
-
|
27
|
+
This will do a few things behind the scenes:
|
28
|
+
|
29
|
+
- Use the built-in `has_secure_password` to generate relevant password methods
|
30
|
+
- Add some basic validations for the `email` and `password` fields on `User`
|
31
|
+
- Normalize email values when records are saved
|
32
|
+
- Provide signed token generators for `password_reset`, `email_verification`,
|
33
|
+
and `email_affirmation`
|
34
|
+
|
35
|
+
It's sort of funny to do this because you genuinely just could have put this
|
36
|
+
stuff right in your app, and yet here we are making gems instead!
|
37
|
+
|
38
|
+
There is an `Avocado::Mailer` which can be included in a mailer class and
|
39
|
+
provides some basic mailers.
|
40
|
+
|
41
|
+
The `spec/internal` app within this repo has some example usage of both model
|
42
|
+
and mailer.
|
30
43
|
|
31
44
|
## Development
|
32
45
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module Mailer
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
before_action :set_user
|
11
|
+
before_action :set_signed_id
|
12
|
+
|
13
|
+
default to: -> { @user.email }
|
14
|
+
end
|
15
|
+
|
16
|
+
def email_affirmation
|
17
|
+
mail
|
18
|
+
end
|
19
|
+
|
20
|
+
def email_verification
|
21
|
+
mail
|
22
|
+
end
|
23
|
+
|
24
|
+
def password_reset
|
25
|
+
mail
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def set_user
|
31
|
+
@user = params[:user]
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_signed_id
|
35
|
+
@signed_id = @user.generate_token_for(action_name.to_sym)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/avocado/user.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module User
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
include UserEmail
|
11
|
+
include UserEmailAffirmation
|
12
|
+
include UserEmailVerification
|
13
|
+
include UserPassword
|
14
|
+
include UserPasswordReset
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module UserEmail
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
validates :email, presence: true, uniqueness: true, format: {with: URI::MailTo::EMAIL_REGEXP}
|
11
|
+
|
12
|
+
normalizes :email, with: ->(email) { email.downcase.strip }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -3,11 +3,13 @@
|
|
3
3
|
require "active_support/concern"
|
4
4
|
|
5
5
|
module Avocado
|
6
|
-
module
|
6
|
+
module UserEmailAffirmation
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
|
+
TOKEN_EXPIRATION = 16.minutes
|
10
|
+
|
9
11
|
included do
|
10
|
-
|
12
|
+
generates_token_for :email_affirmation, expires_in: TOKEN_EXPIRATION
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module UserEmailVerification
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
TOKEN_EXPIRATION = 2_048.minutes
|
10
|
+
|
11
|
+
included do
|
12
|
+
generates_token_for :email_verification, expires_in: TOKEN_EXPIRATION do
|
13
|
+
email
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module UserPassword
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
REQUIRED_FORMAT = /\A(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*\z/x
|
10
|
+
REQUIRED_LENGTH = 8
|
11
|
+
|
12
|
+
included do
|
13
|
+
has_secure_password
|
14
|
+
|
15
|
+
validates :password, format: {with: REQUIRED_FORMAT}, length: {minimum: REQUIRED_LENGTH}, allow_nil: true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module UserPasswordReset
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
TOKEN_EXPIRATION = 64.minutes
|
10
|
+
|
11
|
+
included do
|
12
|
+
generates_token_for :password_reset, expires_in: TOKEN_EXPIRATION do
|
13
|
+
password_digest_salt
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def password_digest_salt
|
20
|
+
password_from_digest.salt[-10..]
|
21
|
+
end
|
22
|
+
|
23
|
+
def password_from_digest
|
24
|
+
BCrypt::Password.new(password_digest)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/avocado/version.rb
CHANGED
data/lib/avocado.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "avocado/version"
|
4
|
-
require_relative "avocado/user_concern"
|
5
4
|
|
6
5
|
module Avocado
|
7
6
|
class Error < StandardError; end
|
7
|
+
|
8
|
+
autoload :Mailer, "avocado/mailer"
|
9
|
+
autoload :User, "avocado/user"
|
10
|
+
autoload :UserEmail, "avocado/user_email"
|
11
|
+
autoload :UserEmailAffirmation, "avocado/user_email_affirmation"
|
12
|
+
autoload :UserEmailVerification, "avocado/user_email_verification"
|
13
|
+
autoload :UserPassword, "avocado/user_password"
|
14
|
+
autoload :UserPasswordReset, "avocado/user_password_reset"
|
8
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avocado
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Jankowski
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bcrypt
|
@@ -82,7 +82,13 @@ files:
|
|
82
82
|
- Rakefile
|
83
83
|
- config.ru
|
84
84
|
- lib/avocado.rb
|
85
|
-
- lib/avocado/
|
85
|
+
- lib/avocado/mailer.rb
|
86
|
+
- lib/avocado/user.rb
|
87
|
+
- lib/avocado/user_email.rb
|
88
|
+
- lib/avocado/user_email_affirmation.rb
|
89
|
+
- lib/avocado/user_email_verification.rb
|
90
|
+
- lib/avocado/user_password.rb
|
91
|
+
- lib/avocado/user_password_reset.rb
|
86
92
|
- lib/avocado/version.rb
|
87
93
|
- sig/avocado.rbs
|
88
94
|
homepage: https://github.com/unicorngroomers/avocado
|