passwd 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +28 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +168 -0
- data/.ruby-version +1 -0
- data/README.md +4 -2
- data/Rakefile +5 -7
- data/lib/generators/passwd/install/templates/passwd.rb +3 -9
- data/lib/passwd.rb +10 -18
- data/lib/passwd/config.rb +3 -5
- data/lib/passwd/errors.rb +1 -0
- data/lib/passwd/rails/action_controller_ext.rb +8 -7
- data/lib/passwd/rails/active_record_ext.rb +7 -9
- data/lib/passwd/railtie.rb +2 -2
- data/lib/passwd/version.rb +1 -2
- data/passwd.gemspec +13 -9
- metadata +53 -24
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f9a0399d0e6b478da6e96ad38e2806fb32199bae624d5bddf4abd5093d652cf8
|
4
|
+
data.tar.gz: 6b7a805295dcd19b924156838b24463cbdd9bf233280027cf3ce49d4abeeb9df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99d186d8eb981e43d3ece62f8d96c74ec84cb328d5d5fc56338d322cd9e0cef8f626ef405647eaad01e5cb0fda7e1af3f077beed16ec2fe9adc2798bc3ad9fa7
|
7
|
+
data.tar.gz: 7498777e9c67f19b18be0e4c1119fa810551bc4a2fc01411ac1ada816879fce1c2b16d9f31635e1f0426aa2c1486af985dc5b47894529a3b31e657457b5ec748
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: CI
|
9
|
+
on:
|
10
|
+
push:
|
11
|
+
branches: [ master ]
|
12
|
+
pull_request:
|
13
|
+
branches: [ master ]
|
14
|
+
jobs:
|
15
|
+
test:
|
16
|
+
runs-on: ubuntu-latest
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: 2.7.2
|
23
|
+
- name: Install dependencies
|
24
|
+
run: bundle install
|
25
|
+
- name: Run tests
|
26
|
+
run: bundle exec rake spec
|
27
|
+
- name: Run rubocop
|
28
|
+
run: bundle exec rake rubocop
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
AllCops:
|
2
|
+
NewCops: enable
|
3
|
+
TargetRubyVersion: 2.7
|
4
|
+
Exclude:
|
5
|
+
- "node_modules/**/*"
|
6
|
+
- "vendor/**/*"
|
7
|
+
|
8
|
+
# Private methods indent.
|
9
|
+
Layout/IndentationConsistency:
|
10
|
+
EnforcedStyle: indented_internal_methods
|
11
|
+
|
12
|
+
# Warning: 120 characters
|
13
|
+
# Error: 160 characters
|
14
|
+
# Make the library more restrictive.
|
15
|
+
Layout/LineLength:
|
16
|
+
Max: 120
|
17
|
+
|
18
|
+
# Multi-line indentation with receiver.
|
19
|
+
Layout/MultilineMethodCallIndentation:
|
20
|
+
EnforcedStyle: indented_relative_to_receiver
|
21
|
+
|
22
|
+
Layout/SpaceInsideBlockBraces:
|
23
|
+
SpaceBeforeBlockParameters: false
|
24
|
+
|
25
|
+
Lint/AmbiguousBlockAssociation:
|
26
|
+
Exclude:
|
27
|
+
- "spec/**/*_spec.rb"
|
28
|
+
|
29
|
+
# May define constants within the block in spec.
|
30
|
+
Lint/ConstantDefinitionInBlock:
|
31
|
+
Exclude:
|
32
|
+
- "spec/**/*_spec.rb"
|
33
|
+
|
34
|
+
Lint/InheritException:
|
35
|
+
EnforcedStyle: standard_error
|
36
|
+
|
37
|
+
Lint/UnderscorePrefixedVariableName:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Lint/UnusedMethodArgument:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Metrics/AbcSize:
|
44
|
+
Max: 24
|
45
|
+
|
46
|
+
Metrics/BlockLength:
|
47
|
+
Exclude:
|
48
|
+
- "spec/**/*.rb"
|
49
|
+
- "Gemfile"
|
50
|
+
- "*.gemspec"
|
51
|
+
|
52
|
+
Metrics/CyclomaticComplexity:
|
53
|
+
Max: 10
|
54
|
+
|
55
|
+
Metrics/MethodLength:
|
56
|
+
Max: 20
|
57
|
+
|
58
|
+
Security/YAMLLoad:
|
59
|
+
Enabled: false
|
60
|
+
|
61
|
+
Style/Alias:
|
62
|
+
EnforcedStyle: prefer_alias_method
|
63
|
+
|
64
|
+
Style/AndOr:
|
65
|
+
EnforcedStyle: conditionals
|
66
|
+
|
67
|
+
Style/AsciiComments:
|
68
|
+
Enabled: false
|
69
|
+
|
70
|
+
Style/BlockDelimiters:
|
71
|
+
Enabled: false
|
72
|
+
|
73
|
+
Style/ClassAndModuleChildren:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
Style/CollectionMethods:
|
77
|
+
PreferredMethods:
|
78
|
+
detect: "detect"
|
79
|
+
find: "detect"
|
80
|
+
inject: "inject"
|
81
|
+
reduce: "inject"
|
82
|
+
|
83
|
+
Style/Documentation:
|
84
|
+
Enabled: false
|
85
|
+
|
86
|
+
Style/DoubleNegation:
|
87
|
+
Enabled: false
|
88
|
+
|
89
|
+
Style/EmptyCaseCondition:
|
90
|
+
Enabled: false
|
91
|
+
|
92
|
+
Style/EmptyElse:
|
93
|
+
EnforcedStyle: empty
|
94
|
+
|
95
|
+
Style/EmptyMethod:
|
96
|
+
EnforcedStyle: expanded
|
97
|
+
|
98
|
+
Style/FormatString:
|
99
|
+
EnforcedStyle: percent
|
100
|
+
|
101
|
+
# Do not use frozen_string_literal comment.
|
102
|
+
Style/FrozenStringLiteralComment:
|
103
|
+
Enabled: false
|
104
|
+
|
105
|
+
Style/HashSyntax:
|
106
|
+
Exclude:
|
107
|
+
- "Rakefile"
|
108
|
+
|
109
|
+
Style/MultilineBlockChain:
|
110
|
+
Enabled: false
|
111
|
+
|
112
|
+
Style/MixinUsage:
|
113
|
+
Exclude:
|
114
|
+
- "bin/setup"
|
115
|
+
|
116
|
+
# Use _ when 7 digits or more.
|
117
|
+
Style/NumericLiterals:
|
118
|
+
MinDigits: 7
|
119
|
+
Strict: true
|
120
|
+
|
121
|
+
Style/NumericPredicate:
|
122
|
+
Enabled: false
|
123
|
+
|
124
|
+
Style/OrAssignment:
|
125
|
+
Enabled: false
|
126
|
+
|
127
|
+
Style/PercentLiteralDelimiters:
|
128
|
+
Enabled: false
|
129
|
+
|
130
|
+
# `has_xxx?` is more readable.
|
131
|
+
Style/PreferredHashMethods:
|
132
|
+
EnforcedStyle: verbose
|
133
|
+
|
134
|
+
# Do not use unnecessary returns. (Allow to return multiple values.)
|
135
|
+
Style/RedundantReturn:
|
136
|
+
AllowMultipleReturnValues: true
|
137
|
+
|
138
|
+
# Do not specify error class when rescuing StandardError.
|
139
|
+
Style/RescueStandardError:
|
140
|
+
EnforcedStyle: implicit
|
141
|
+
|
142
|
+
# String literals use double quotes.
|
143
|
+
Style/StringLiterals:
|
144
|
+
EnforcedStyle: double_quotes
|
145
|
+
|
146
|
+
# String literal inside the string interpolation use double quotes too.
|
147
|
+
Style/StringLiteralsInInterpolation:
|
148
|
+
EnforcedStyle: double_quotes
|
149
|
+
|
150
|
+
# Percent(`%i(a b)`) and brackets(`[:a, :b]`) are acceptable.
|
151
|
+
Style/SymbolArray:
|
152
|
+
Enabled: false
|
153
|
+
|
154
|
+
# Put a trailing comma in argument list.
|
155
|
+
Style/TrailingCommaInArguments:
|
156
|
+
EnforcedStyleForMultiline: comma
|
157
|
+
|
158
|
+
# Put a trailing comma in Array literal.
|
159
|
+
Style/TrailingCommaInArrayLiteral:
|
160
|
+
EnforcedStyleForMultiline: comma
|
161
|
+
|
162
|
+
# Put a trailing comma in Hash literal.
|
163
|
+
Style/TrailingCommaInHashLiteral:
|
164
|
+
EnforcedStyleForMultiline: comma
|
165
|
+
|
166
|
+
# Percent(`%w(a b)`) and brackets(`["a", "b"]`) are acceptable.
|
167
|
+
Style/WordArray:
|
168
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.2
|
data/README.md
CHANGED
@@ -36,7 +36,10 @@ See [config](https://github.com/i2bskn/passwd/blob/master/lib/generators/passwd/
|
|
36
36
|
```ruby
|
37
37
|
passwd = Passwd.current
|
38
38
|
passwd.random(10) # Create random password of 10 characters.
|
39
|
-
passwd.
|
39
|
+
password = passwd.password_hashing("secret") # Create hashed password from plain text.
|
40
|
+
password == "secret" # => true
|
41
|
+
load_password = passwd.load_password("hashed_password") # Load hashed password.
|
42
|
+
load_password == "secret"
|
40
43
|
```
|
41
44
|
|
42
45
|
### ActiveRecord with Rails
|
@@ -56,7 +59,6 @@ User model The following column are required.
|
|
56
59
|
Column name can be changed with the specified options.
|
57
60
|
|
58
61
|
- `:id => :email` Unique value to be used for authentication.
|
59
|
-
- `:salt => :salt` Column of String to save the salt.
|
60
62
|
- `:password => :password` Column of String to save the hashed password.
|
61
63
|
|
62
64
|
Use the `name` column as id.
|
data/Rakefile
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require "
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
require "rubocop/rake_task"
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
t.libs << "lib"
|
7
|
-
t.test_files = FileList["test/**/*_test.rb"]
|
8
|
-
end
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
RuboCop::RakeTask.new
|
9
7
|
|
10
|
-
task :default =>
|
8
|
+
task :default => %i(spec rubocop)
|
@@ -1,11 +1,8 @@
|
|
1
1
|
Passwd.current.config.tap do |config|
|
2
|
-
# Hashing algorithm
|
3
|
-
# Supported algorithm is :md5, :rmd160, :sha1, :sha256, :sha384 and :sha512
|
4
|
-
# config.algorithm = :sha512
|
5
|
-
|
6
2
|
# Number of hashed by stretching
|
7
|
-
#
|
8
|
-
#
|
3
|
+
# Minimum is 4, maximum is 31, default is 12.
|
4
|
+
# See also BCrypt::Engine
|
5
|
+
# config.stretching = 12
|
9
6
|
|
10
7
|
# Random generate password length
|
11
8
|
# config.length = 10
|
@@ -22,6 +19,3 @@ end
|
|
22
19
|
|
23
20
|
# Redirect path when not signin
|
24
21
|
# Rails.application.config.passwd.signin_path = :signin_path
|
25
|
-
|
26
|
-
# Salt generation logic
|
27
|
-
# Rails.application.config.passwd.random_salt = proc { SecureRandom.uuid }
|
data/lib/passwd.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require "
|
2
|
-
require "securerandom"
|
3
|
-
|
1
|
+
require "bcrypt"
|
4
2
|
require "passwd/version"
|
5
3
|
require "passwd/errors"
|
6
4
|
require "passwd/config"
|
@@ -12,32 +10,26 @@ class Passwd
|
|
12
10
|
@current ||= new
|
13
11
|
end
|
14
12
|
|
15
|
-
|
16
|
-
@current = passwd
|
17
|
-
end
|
13
|
+
attr_writer :current
|
18
14
|
end
|
19
15
|
|
20
16
|
def initialize(conf = nil)
|
21
17
|
@config = conf
|
22
18
|
end
|
23
19
|
|
24
|
-
def
|
25
|
-
config.stretching.
|
26
|
-
|
27
|
-
|
20
|
+
def password_hashing(plain)
|
21
|
+
BCrypt::Password.create(plain, cost: config.stretching.clamp(BCrypt::Engine::MIN_COST, BCrypt::Engine::MAX_COST))
|
22
|
+
end
|
23
|
+
|
24
|
+
def load_password(hashed_password)
|
25
|
+
BCrypt::Password.new(hashed_password)
|
28
26
|
end
|
29
27
|
|
30
|
-
def random(
|
31
|
-
Array.new(
|
28
|
+
def random(long = nil)
|
29
|
+
Array.new(long || config.length) { config.characters[rand(config.characters.size)] }.join
|
32
30
|
end
|
33
31
|
|
34
32
|
def config
|
35
33
|
@config ||= Config.new
|
36
34
|
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def digest_class
|
41
|
-
Digest.const_get(config.algorithm.upcase)
|
42
|
-
end
|
43
35
|
end
|
data/lib/passwd/config.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
class Passwd
|
2
2
|
class Config
|
3
3
|
VALID_OPTIONS = [
|
4
|
-
:algorithm,
|
5
4
|
:stretching,
|
6
5
|
:length,
|
7
6
|
:characters,
|
8
7
|
].freeze
|
9
8
|
|
10
|
-
attr_accessor
|
9
|
+
attr_accessor(*VALID_OPTIONS)
|
11
10
|
|
12
11
|
def initialize(options = {})
|
13
12
|
reset
|
@@ -15,13 +14,12 @@ class Passwd
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def merge(options)
|
18
|
-
options.
|
17
|
+
options.each_key {|key| send("#{key}=", options[key]) }
|
19
18
|
self
|
20
19
|
end
|
21
20
|
|
22
21
|
def reset
|
23
|
-
@
|
24
|
-
@stretching = 100
|
22
|
+
@stretching = 12
|
25
23
|
@length = 10
|
26
24
|
@characters = [("a".."z"), ("A".."Z"), ("0".."9")].map(&:to_a).flatten
|
27
25
|
end
|
data/lib/passwd/errors.rb
CHANGED
@@ -33,16 +33,17 @@ module Passwd::Rails
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def redirect_to_referer_or(path, options = {})
|
36
|
-
redirect_to session[:
|
36
|
+
redirect_to session[:signin_referer].presence || path, **options
|
37
37
|
end
|
38
38
|
|
39
39
|
def require_signin
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
return if signin?
|
41
|
+
|
42
|
+
path = _signin_path
|
43
|
+
raise UnauthorizedAccess unless path
|
44
|
+
|
45
|
+
session[:signin_referer] = request.fullpath
|
46
|
+
redirect_to path
|
46
47
|
end
|
47
48
|
|
48
49
|
def passwd_auth_class
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Passwd::Rails
|
2
2
|
module ActiveRecordExt
|
3
|
-
def with_authenticate(passwd: nil, user_id: :email,
|
3
|
+
def with_authenticate(passwd: nil, user_id: :email, password: :password)
|
4
4
|
passwd ||= Passwd.current
|
5
5
|
define_singleton_auth_with_passwd(user_id)
|
6
|
-
define_instance_auth_with_passwd(passwd,
|
7
|
-
define_instance_set_password(passwd,
|
6
|
+
define_instance_auth_with_passwd(passwd, password)
|
7
|
+
define_instance_set_password(passwd, password)
|
8
8
|
end
|
9
9
|
|
10
10
|
private
|
@@ -18,18 +18,16 @@ module Passwd::Rails
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
def define_instance_auth_with_passwd(passwd,
|
21
|
+
def define_instance_auth_with_passwd(passwd, password_col)
|
22
22
|
define_method :authenticate do |plain|
|
23
|
-
|
23
|
+
BCrypt::Password.new(send(password_col)) == plain
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def define_instance_set_password(passwd,
|
27
|
+
def define_instance_set_password(passwd, password_col)
|
28
28
|
define_method :set_password do |plain = nil|
|
29
29
|
plain ||= passwd.random
|
30
|
-
|
31
|
-
send("#{salt_col}=", random_salt.call(self)) unless send(salt_col)
|
32
|
-
send("#{password_col}=", passwd.hashed_password(plain, send(salt_col)))
|
30
|
+
send("#{password_col}=", passwd.password_hashing(plain))
|
33
31
|
plain
|
34
32
|
end
|
35
33
|
end
|
data/lib/passwd/railtie.rb
CHANGED
@@ -7,11 +7,11 @@ class Passwd
|
|
7
7
|
require "passwd/rails/active_record_ext"
|
8
8
|
|
9
9
|
ActiveSupport.on_load(:action_controller) do
|
10
|
-
::ActionController::Base.
|
10
|
+
::ActionController::Base.include ::Passwd::Rails::ActionControllerExt
|
11
11
|
end
|
12
12
|
|
13
13
|
ActiveSupport.on_load(:active_record) do
|
14
|
-
::ActiveRecord::Base.
|
14
|
+
::ActiveRecord::Base.extend Passwd::Rails::ActiveRecordExt
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/lib/passwd/version.rb
CHANGED
data/passwd.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path("
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
require "passwd/version"
|
4
4
|
|
@@ -6,10 +6,10 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "passwd"
|
7
7
|
spec.version = Passwd::VERSION
|
8
8
|
spec.authors = ["i2bskn"]
|
9
|
-
spec.email = ["
|
9
|
+
spec.email = ["iiboshi@craftake.co.jp"]
|
10
10
|
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
11
|
+
spec.description = "Passwd is provide hashed password creation and authentication."
|
12
|
+
spec.summary = "Passwd is provide hashed password creation and authentication."
|
13
13
|
spec.homepage = "https://github.com/i2bskn/passwd"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -18,11 +18,15 @@ Gem::Specification.new do |spec|
|
|
18
18
|
end
|
19
19
|
|
20
20
|
spec.bindir = "exe"
|
21
|
-
spec.executables = spec.files.grep(%r{^exe/}) {
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.
|
25
|
-
|
26
|
-
spec.
|
27
|
-
spec.add_development_dependency "
|
24
|
+
spec.required_ruby_version = ">= 2.7.0"
|
25
|
+
|
26
|
+
spec.add_dependency "bcrypt", "~> 3.1.0"
|
27
|
+
spec.add_development_dependency "bundler", ">= 2.1.0"
|
28
|
+
spec.add_development_dependency "pry", "~> 0.14.0"
|
29
|
+
spec.add_development_dependency "rake", "~> 13.0.0"
|
30
|
+
spec.add_development_dependency "rspec", "~> 3.10.0"
|
31
|
+
spec.add_development_dependency "rubocop", "1.11.0"
|
28
32
|
end
|
metadata
CHANGED
@@ -1,80 +1,110 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passwd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- i2bskn
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bcrypt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.1.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
33
|
+
version: 2.1.0
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
40
|
+
version: 2.1.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.14.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.14.0
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rake
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
|
-
- - "
|
59
|
+
- - "~>"
|
32
60
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
61
|
+
version: 13.0.0
|
34
62
|
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
|
-
- - "
|
66
|
+
- - "~>"
|
39
67
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
68
|
+
version: 13.0.0
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
70
|
+
name: rspec
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
75
|
+
version: 3.10.0
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
82
|
+
version: 3.10.0
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
84
|
+
name: rubocop
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
|
-
- -
|
87
|
+
- - '='
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
89
|
+
version: 1.11.0
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
|
-
- -
|
94
|
+
- - '='
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
96
|
+
version: 1.11.0
|
69
97
|
description: Passwd is provide hashed password creation and authentication.
|
70
98
|
email:
|
71
|
-
-
|
99
|
+
- iiboshi@craftake.co.jp
|
72
100
|
executables: []
|
73
101
|
extensions: []
|
74
102
|
extra_rdoc_files: []
|
75
103
|
files:
|
104
|
+
- ".github/workflows/ci.yml"
|
76
105
|
- ".gitignore"
|
77
|
-
- ".
|
106
|
+
- ".rubocop.yml"
|
107
|
+
- ".ruby-version"
|
78
108
|
- Gemfile
|
79
109
|
- LICENSE
|
80
110
|
- README.md
|
@@ -96,7 +126,7 @@ homepage: https://github.com/i2bskn/passwd
|
|
96
126
|
licenses:
|
97
127
|
- MIT
|
98
128
|
metadata: {}
|
99
|
-
post_install_message:
|
129
|
+
post_install_message:
|
100
130
|
rdoc_options: []
|
101
131
|
require_paths:
|
102
132
|
- lib
|
@@ -104,16 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
134
|
requirements:
|
105
135
|
- - ">="
|
106
136
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
137
|
+
version: 2.7.0
|
108
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
139
|
requirements:
|
110
140
|
- - ">="
|
111
141
|
- !ruby/object:Gem::Version
|
112
142
|
version: '0'
|
113
143
|
requirements: []
|
114
|
-
|
115
|
-
|
116
|
-
signing_key:
|
144
|
+
rubygems_version: 3.1.4
|
145
|
+
signing_key:
|
117
146
|
specification_version: 4
|
118
147
|
summary: Passwd is provide hashed password creation and authentication.
|
119
148
|
test_files: []
|