avocado 0.1.0 → 0.2.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 +8 -0
- data/README.md +12 -6
- data/lib/avocado/{user_concern.rb → user.rb} +3 -2
- data/lib/avocado/user_email_concern.rb +15 -0
- data/lib/avocado/user_password_concern.rb +29 -0
- data/lib/avocado/version.rb +1 -1
- data/lib/avocado.rb +4 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b2bf2a8946882c7f2c799f8f545f34d3d34c6d3a64a932258350e57b32fdabe
|
4
|
+
data.tar.gz: 0f2430fff76f6912de3b1f09d08ab9b12858fa245e278e5542341eddfe116314
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 547b8e2c1e35508a75828c4f735b021c1022fe6e9e70f4a41c33dbb2d823592ff86d65732475c72fb3ee5cac0a3bed3f74c1fc12521b4344cc743313b6ed922c
|
7
|
+
data.tar.gz: 016be93303ef00a75c3e7a63e2a1d030f2955eb7eaf92d80ab03fed4704da6fecc5b194d6a73e567e524087063dd2b1e947799fd5f0f338eba20a6f25f585831
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.2.0] - 2023-07-15
|
4
|
+
|
5
|
+
- Validate presence, uniqueness, and format on `email` attribute
|
6
|
+
- Normalize email value during save
|
7
|
+
- Validate password format and length
|
8
|
+
- Include a token generator for password recovery
|
9
|
+
- Rename `Avocado::UserConcern` to `Avocado::User`
|
10
|
+
|
3
11
|
## [0.1.0] - 2023-07-14
|
4
12
|
|
5
13
|
- Initial release
|
data/README.md
CHANGED
@@ -15,18 +15,24 @@ 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 a token generator for password recovery
|
33
|
+
|
34
|
+
It's sort of funny to do this because you genuinely just could have put this
|
35
|
+
stuff right in your app, and yet here we are making gems instead!
|
30
36
|
|
31
37
|
## Development
|
32
38
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module UserEmailConcern
|
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
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Avocado
|
6
|
+
module UserPasswordConcern
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
REQUIRED_FORMAT = /\A(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*\z/x
|
10
|
+
REQUIRED_LENGTH = 8
|
11
|
+
TOKEN_EXPIRATION = 64.minutes
|
12
|
+
|
13
|
+
included do
|
14
|
+
has_secure_password
|
15
|
+
|
16
|
+
validates :password, format: {with: REQUIRED_FORMAT}, length: {minimum: REQUIRED_LENGTH}, allow_nil: true
|
17
|
+
|
18
|
+
generates_token_for :password_recovery, expires_in: TOKEN_EXPIRATION do
|
19
|
+
password_digest_salt
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def password_digest_salt
|
26
|
+
BCrypt::Password.new(password_digest).salt[-10..]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/avocado/version.rb
CHANGED
data/lib/avocado.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
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 :User, "avocado/user"
|
9
|
+
autoload :UserEmailConcern, "avocado/user_email_concern"
|
10
|
+
autoload :UserPasswordConcern, "avocado/user_password_concern"
|
8
11
|
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.2.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-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bcrypt
|
@@ -82,7 +82,9 @@ files:
|
|
82
82
|
- Rakefile
|
83
83
|
- config.ru
|
84
84
|
- lib/avocado.rb
|
85
|
-
- lib/avocado/
|
85
|
+
- lib/avocado/user.rb
|
86
|
+
- lib/avocado/user_email_concern.rb
|
87
|
+
- lib/avocado/user_password_concern.rb
|
86
88
|
- lib/avocado/version.rb
|
87
89
|
- sig/avocado.rbs
|
88
90
|
homepage: https://github.com/unicorngroomers/avocado
|