nanoid 2.0.0 → 2.0.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/lib/nanoid/version.rb +1 -1
- data/lib/nanoid.rb +52 -14
- metadata +20 -63
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 87fdbe5ba4c21183b9da7d5a5d706c00f0f3b7647b82c8f7e63890d70d89ce04
|
|
4
|
+
data.tar.gz: 8b54115d83b84bd69b2893f23a772430de534edb4d1b63e4398ac12f9f9deff8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c39194cb3368b1663c77276998111a2cb41522a1dbbb23682675fa98b6239f1bc7c71c0feeb5870171f65cf034c6be3c0121d679b29d37670d007282f5b15671
|
|
7
|
+
data.tar.gz: d9340bfc477d2d629085c62c6737c280f653f10320942ea55f868e637bd493368324e391649e4ed8037e3e099797104357bdccd5d2e288cdd2c05a52510160b2
|
data/lib/nanoid/version.rb
CHANGED
data/lib/nanoid.rb
CHANGED
|
@@ -1,37 +1,65 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
require 'securerandom'
|
|
4
2
|
|
|
5
3
|
module Nanoid
|
|
6
|
-
SAFE_ALPHABET = '_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
4
|
+
SAFE_ALPHABET = '_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.freeze
|
|
7
5
|
|
|
8
6
|
def self.generate(size: 21, alphabet: SAFE_ALPHABET, non_secure: false)
|
|
9
|
-
|
|
7
|
+
size = normalize_size(size)
|
|
8
|
+
return '' if size.zero?
|
|
9
|
+
|
|
10
|
+
return non_secure_generate(size, alphabet) if non_secure
|
|
10
11
|
|
|
11
|
-
return simple_generate(size
|
|
12
|
+
return simple_generate(size) if alphabet == SAFE_ALPHABET
|
|
12
13
|
|
|
13
|
-
complex_generate(size
|
|
14
|
+
complex_generate(size, alphabet)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
private
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
# Mirrors upstream NanoID's handling of a non-integer/negative `size`:
|
|
20
|
+
# truncate floats instead of looping forever, and fail fast on negative
|
|
21
|
+
# sizes instead of raising a cryptic SecureRandom error later on.
|
|
22
|
+
def self.normalize_size(size)
|
|
23
|
+
raise ArgumentError, "size must be a number, got #{size.class}" unless size.is_a?(Numeric)
|
|
24
|
+
|
|
25
|
+
size = size.to_i
|
|
26
|
+
# Integer#negative? arrived in Ruby 2.3.
|
|
27
|
+
raise ArgumentError, 'size must not be negative' if size < 0
|
|
28
|
+
|
|
29
|
+
size
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.validate_alphabet!(alphabet)
|
|
33
|
+
raise ArgumentError, 'alphabet must not be empty' if alphabet.empty?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.simple_generate(size)
|
|
19
37
|
bytes = random_bytes(size)
|
|
20
38
|
|
|
21
|
-
(0...size).reduce(''
|
|
39
|
+
(0...size).reduce('') do |acc, i|
|
|
22
40
|
acc << SAFE_ALPHABET[bytes[i] & 63]
|
|
23
41
|
end
|
|
24
42
|
end
|
|
25
43
|
|
|
26
|
-
def self.complex_generate(size
|
|
44
|
+
def self.complex_generate(size, alphabet)
|
|
45
|
+
validate_alphabet!(alphabet)
|
|
46
|
+
|
|
27
47
|
alphabet_size = alphabet.size
|
|
28
|
-
|
|
48
|
+
# A single-character alphabet has no entropy to extract a mask from
|
|
49
|
+
# (and would hit a Math::DomainError below), so short-circuit it.
|
|
50
|
+
return alphabet[0] * size if alphabet_size == 1
|
|
51
|
+
|
|
52
|
+
mask = alphabet_mask(alphabet_size)
|
|
29
53
|
step = (1.6 * mask * size / alphabet_size).ceil
|
|
30
54
|
|
|
31
|
-
id = ''
|
|
55
|
+
id = ''
|
|
32
56
|
|
|
33
57
|
loop do
|
|
34
|
-
bytes
|
|
58
|
+
# Request `step` bytes (not `size`), matching upstream: `step` is
|
|
59
|
+
# always >= the number of bytes actually consumed per iteration, so
|
|
60
|
+
# this avoids wasted extra loop iterations/SecureRandom calls caused
|
|
61
|
+
# by indexing past a too-small buffer (which silently yields `nil`).
|
|
62
|
+
bytes = random_bytes(step)
|
|
35
63
|
(0...step).each do |idx|
|
|
36
64
|
byte = bytes[idx] & mask
|
|
37
65
|
character = byte && alphabet[byte]
|
|
@@ -43,10 +71,12 @@ module Nanoid
|
|
|
43
71
|
end
|
|
44
72
|
end
|
|
45
73
|
|
|
46
|
-
def self.non_secure_generate(size
|
|
74
|
+
def self.non_secure_generate(size, alphabet)
|
|
75
|
+
validate_alphabet!(alphabet)
|
|
76
|
+
|
|
47
77
|
alphabet_size = alphabet.size
|
|
48
78
|
|
|
49
|
-
id = ''
|
|
79
|
+
id = ''
|
|
50
80
|
|
|
51
81
|
size.times do
|
|
52
82
|
id << alphabet[(Random.rand * alphabet_size).floor]
|
|
@@ -58,4 +88,12 @@ module Nanoid
|
|
|
58
88
|
def self.random_bytes(size)
|
|
59
89
|
SecureRandom.random_bytes(size).bytes
|
|
60
90
|
end
|
|
91
|
+
|
|
92
|
+
# Smallest bitmask of the form 2**n - 1 that covers every alphabet index.
|
|
93
|
+
# Integer shifts only: `2 << float` raises TypeError on Ruby 2.0.
|
|
94
|
+
def self.alphabet_mask(alphabet_size)
|
|
95
|
+
limit = 1
|
|
96
|
+
limit <<= 1 while limit <= alphabet_size - 1
|
|
97
|
+
limit - 1
|
|
98
|
+
end
|
|
61
99
|
end
|
metadata
CHANGED
|
@@ -1,101 +1,59 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nanoid
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Radovan Smitala
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-10-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: benchmark-ips
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 2.7.2
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: bundler
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '1.15'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - ">="
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '1.15'
|
|
26
|
+
version: 2.7.2
|
|
41
27
|
- !ruby/object:Gem::Dependency
|
|
42
28
|
name: minitest
|
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
|
44
30
|
requirements:
|
|
45
|
-
- - "
|
|
31
|
+
- - "~>"
|
|
46
32
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
33
|
+
version: 5.11.3
|
|
48
34
|
type: :development
|
|
49
35
|
prerelease: false
|
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
37
|
requirements:
|
|
52
|
-
- - "
|
|
38
|
+
- - "~>"
|
|
53
39
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
40
|
+
version: 5.11.3
|
|
55
41
|
- !ruby/object:Gem::Dependency
|
|
56
42
|
name: rake
|
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
|
58
44
|
requirements:
|
|
59
|
-
- - "
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '12.0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '12.0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: reek
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '5.0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '5.0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: rubocop
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
45
|
+
- - "~>"
|
|
88
46
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
47
|
+
version: 12.3.3
|
|
90
48
|
type: :development
|
|
91
49
|
prerelease: false
|
|
92
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
51
|
requirements:
|
|
94
|
-
- - "
|
|
52
|
+
- - "~>"
|
|
95
53
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
97
|
-
description:
|
|
98
|
-
email:
|
|
54
|
+
version: 12.3.3
|
|
55
|
+
description:
|
|
56
|
+
email:
|
|
99
57
|
executables: []
|
|
100
58
|
extensions: []
|
|
101
59
|
extra_rdoc_files: []
|
|
@@ -106,7 +64,7 @@ homepage: https://github.com/radeno/nanoid.rb
|
|
|
106
64
|
licenses:
|
|
107
65
|
- MIT
|
|
108
66
|
metadata: {}
|
|
109
|
-
post_install_message:
|
|
67
|
+
post_install_message:
|
|
110
68
|
rdoc_options: []
|
|
111
69
|
require_paths:
|
|
112
70
|
- lib
|
|
@@ -121,9 +79,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
121
79
|
- !ruby/object:Gem::Version
|
|
122
80
|
version: '0'
|
|
123
81
|
requirements: []
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
signing_key:
|
|
82
|
+
rubygems_version: 3.5.22
|
|
83
|
+
signing_key:
|
|
127
84
|
specification_version: 4
|
|
128
85
|
summary: Ruby implementation of Nanoid, secure URL-friendly unique ID generator
|
|
129
86
|
test_files: []
|