usernames 0.1.3
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 +7 -0
- data/CHANGELOG.md +39 -0
- data/LICENSE.txt +21 -0
- data/README.md +362 -0
- data/SECURITY.md +42 -0
- data/config/locales/usernames.en.yml +72 -0
- data/config/locales/usernames.es.yml +51 -0
- data/config/locales/usernames.pt.yml +51 -0
- data/data/LICENSES/allprofanity.txt +24 -0
- data/data/LICENSES/big-username-blocklist.txt +25 -0
- data/data/LICENSES/corpora.txt +128 -0
- data/data/LICENSES/cuss.txt +25 -0
- data/data/LICENSES/django-registration.txt +33 -0
- data/data/LICENSES/dsojevic-profanity-list.txt +24 -0
- data/data/LICENSES/forwardemail.txt +24 -0
- data/data/LICENSES/friendly-words.txt +24 -0
- data/data/LICENSES/gitea.txt +23 -0
- data/data/LICENSES/gitlab.txt +31 -0
- data/data/LICENSES/iana-well-known-uris.txt +130 -0
- data/data/LICENSES/imsky-wordlists.txt +24 -0
- data/data/LICENSES/mottie-github-reserved-names.txt +24 -0
- data/data/LICENSES/obscenity.txt +27 -0
- data/data/LICENSES/petname.txt +218 -0
- data/data/LICENSES/rfc2142.txt +9 -0
- data/data/LICENSES/shouldbee.txt +25 -0
- data/data/LICENSES/usernames.txt +30 -0
- data/data/NOTICE +36 -0
- data/data/offensive/README.md +90 -0
- data/data/offensive/allowlist/en.txt +727 -0
- data/data/offensive/allowlist/es.txt +39 -0
- data/data/offensive/en.json +5680 -0
- data/data/offensive/es.json +1014 -0
- data/data/offensive/hate.yml +51 -0
- data/data/offensive/leet.yml +27 -0
- data/data/reserved/ALLOWLIST_EXCEPTIONS.txt +6 -0
- data/data/reserved/impersonation.txt +69 -0
- data/data/reserved/mailboxes.txt +77 -0
- data/data/reserved/system.txt +124 -0
- data/data/reserved/web.txt +962 -0
- data/data/words/adjectives.txt +367 -0
- data/data/words/animals.txt +253 -0
- data/lib/generators/usernames/availability_generator.rb +67 -0
- data/lib/generators/usernames/existing_schema.rb +85 -0
- data/lib/generators/usernames/install_generator.rb +241 -0
- data/lib/generators/usernames/install_messages.rb +63 -0
- data/lib/generators/usernames/locale_generator.rb +56 -0
- data/lib/generators/usernames/templates/add_username.rb.erb +53 -0
- data/lib/generators/usernames/templates/availability/_field.html.erb.tt +25 -0
- data/lib/generators/usernames/templates/availability/availability_controller.rb.tt +107 -0
- data/lib/generators/usernames/templates/availability/username_check_controller.js.tt +115 -0
- data/lib/generators/usernames/templates/usernames.rb +34 -0
- data/lib/tasks/usernames.rake +38 -0
- data/lib/usernames/adapters/moderate.rb +37 -0
- data/lib/usernames/audit/output.rb +51 -0
- data/lib/usernames/audit/values.rb +34 -0
- data/lib/usernames/audit.rb +230 -0
- data/lib/usernames/candidates.rb +64 -0
- data/lib/usernames/comparison/index_contract.rb +241 -0
- data/lib/usernames/comparison/index_expression.rb +183 -0
- data/lib/usernames/comparison.rb +127 -0
- data/lib/usernames/configuration.rb +197 -0
- data/lib/usernames/data.rb +205 -0
- data/lib/usernames/engine.rb +32 -0
- data/lib/usernames/errors.rb +16 -0
- data/lib/usernames/generator.rb +206 -0
- data/lib/usernames/model.rb +397 -0
- data/lib/usernames/normalizer.rb +51 -0
- data/lib/usernames/offensive/hate.rb +124 -0
- data/lib/usernames/offensive/lexicon.rb +156 -0
- data/lib/usernames/offensive/name.rb +254 -0
- data/lib/usernames/offensive.rb +136 -0
- data/lib/usernames/phrase.rb +68 -0
- data/lib/usernames/reserved/listing.rb +79 -0
- data/lib/usernames/reserved.rb +219 -0
- data/lib/usernames/result.rb +52 -0
- data/lib/usernames/rules/options.rb +175 -0
- data/lib/usernames/rules.rb +257 -0
- data/lib/usernames/unique_violation.rb +176 -0
- data/lib/usernames/validator.rb +61 -0
- data/lib/usernames/version.rb +5 -0
- data/lib/usernames/words.rb +13 -0
- data/lib/usernames.rb +138 -0
- data/sig/usernames.rbs +75 -0
- metadata +217 -0
data/sig/usernames.rbs
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# The public surface of the usernames gem: the module functions, the result
|
|
2
|
+
# of a check, the errors, and the has_username macro.
|
|
3
|
+
module Usernames
|
|
4
|
+
VERSION: String
|
|
5
|
+
ROUTE: Regexp
|
|
6
|
+
|
|
7
|
+
class Error < StandardError
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class ConfigurationError < Error
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class NoFreeNameError < Error
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class DataError < Error
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
type rule = :impersonation | :exact | :route | :custom | :severe | :strong | :hate_number | :adapter
|
|
20
|
+
|
|
21
|
+
# Usernames.check("Ad_min") # => #<data Usernames::Result ok?=false, reason=:username_reserved, …>
|
|
22
|
+
class Result
|
|
23
|
+
def ok?: () -> bool
|
|
24
|
+
def reason: () -> Symbol?
|
|
25
|
+
def rule: () -> rule?
|
|
26
|
+
def canonical: () -> String
|
|
27
|
+
def message: () -> String?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.configuration: () -> Configuration
|
|
31
|
+
def self.configuration=: (Configuration) -> Configuration
|
|
32
|
+
def self.configure: () { (Configuration) -> void } -> Configuration
|
|
33
|
+
|
|
34
|
+
def self.check: (untyped value, **untyped options) -> Result
|
|
35
|
+
def self.allowed?: (untyped value, **untyped options) -> bool
|
|
36
|
+
def self.normalize: (untyped value, **untyped options) -> String
|
|
37
|
+
def self.comparison_key: (untyped value, **untyped options) -> String
|
|
38
|
+
def self.normalizer: (**untyped options) -> ^(untyped) -> String?
|
|
39
|
+
def self.route: () -> Regexp
|
|
40
|
+
def self.rules_for_browser: (**untyped options) -> Array[{ rule: Symbol, pattern: String, message: String }]
|
|
41
|
+
def self.generate: (?from: String?, **untyped options) -> String
|
|
42
|
+
def self.candidates_for: (String? seed, count: Integer, **untyped options) -> Array[String]
|
|
43
|
+
|
|
44
|
+
class Configuration
|
|
45
|
+
attr_accessor length: Range[Integer]
|
|
46
|
+
attr_accessor separators: Array[String]
|
|
47
|
+
attr_accessor edge_separators: bool
|
|
48
|
+
attr_accessor case: :lowercase | :preserve
|
|
49
|
+
attr_accessor first_character: :alphanumeric | :letter
|
|
50
|
+
attr_accessor reserve_routes: bool
|
|
51
|
+
attr_accessor app_name: String | false | nil
|
|
52
|
+
attr_accessor reserved: Array[String]
|
|
53
|
+
attr_accessor forbidden: Array[String]
|
|
54
|
+
attr_accessor allowed: Array[String]
|
|
55
|
+
attr_accessor on_adapter_failure: :allow | :reject
|
|
56
|
+
attr_accessor unique_index: (String | Symbol)?
|
|
57
|
+
def offensive: () -> untyped
|
|
58
|
+
def generator: () -> untyped
|
|
59
|
+
def generator=: (untyped callable) -> untyped
|
|
60
|
+
def validate!: () -> self
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# has_username(column = :username, required: false, generate: nil, **rules)
|
|
64
|
+
#
|
|
65
|
+
# required: and generate: take true, false, a method name or a proc,
|
|
66
|
+
# evaluated on the record like Rails' if:. generate: nil (the default)
|
|
67
|
+
# means: wherever a name is not required.
|
|
68
|
+
#
|
|
69
|
+
# Also defines, named after the column: <column>_available?, suggest_<column>s,
|
|
70
|
+
# generate_<column>, find_by_<column>, find_by_<column>!, <column>_options, check_<column>,
|
|
71
|
+
# <column>_rules_for_browser, and <column>_generated? on instances.
|
|
72
|
+
module Model
|
|
73
|
+
def has_username: (?(Symbol | String) column, ?required: (bool | Symbol | Proc), ?generate: (bool | Symbol | Proc)?, **untyped rules) -> void
|
|
74
|
+
end
|
|
75
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: usernames
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.3
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- rameerez
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: activemodel
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: 7.2.0
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '9.0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: 7.2.0
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '9.0'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: activerecord
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: 7.2.0
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '9.0'
|
|
42
|
+
type: :runtime
|
|
43
|
+
prerelease: false
|
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: 7.2.0
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '9.0'
|
|
52
|
+
- !ruby/object:Gem::Dependency
|
|
53
|
+
name: activesupport
|
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
|
55
|
+
requirements:
|
|
56
|
+
- - ">="
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
version: 7.2.0
|
|
59
|
+
- - "<"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '9.0'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 7.2.0
|
|
69
|
+
- - "<"
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
version: '9.0'
|
|
72
|
+
- !ruby/object:Gem::Dependency
|
|
73
|
+
name: railties
|
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: 7.2.0
|
|
79
|
+
- - "<"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '9.0'
|
|
82
|
+
type: :runtime
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 7.2.0
|
|
89
|
+
- - "<"
|
|
90
|
+
- !ruby/object:Gem::Version
|
|
91
|
+
version: '9.0'
|
|
92
|
+
description: Add correct, secure usernames to any Rails model with one line (`has_username`).
|
|
93
|
+
Format rules that read like English (no symbols at the edges, no two in a row, not
|
|
94
|
+
all digits), a bundled list of reserved names (admin, root, login, your own routes)
|
|
95
|
+
matched the way impersonators actually type them (ad.min, adm1n, admin2), offensive-word
|
|
96
|
+
screening in severity tiers per language, case-insensitive uniqueness that actually
|
|
97
|
+
uses your index, a free generated name for every account, suggestions when a name
|
|
98
|
+
is taken, and a live availability check. No table, no network, no API key.
|
|
99
|
+
email:
|
|
100
|
+
- rubygems@rameerez.com
|
|
101
|
+
executables: []
|
|
102
|
+
extensions: []
|
|
103
|
+
extra_rdoc_files: []
|
|
104
|
+
files:
|
|
105
|
+
- CHANGELOG.md
|
|
106
|
+
- LICENSE.txt
|
|
107
|
+
- README.md
|
|
108
|
+
- SECURITY.md
|
|
109
|
+
- config/locales/usernames.en.yml
|
|
110
|
+
- config/locales/usernames.es.yml
|
|
111
|
+
- config/locales/usernames.pt.yml
|
|
112
|
+
- data/LICENSES/allprofanity.txt
|
|
113
|
+
- data/LICENSES/big-username-blocklist.txt
|
|
114
|
+
- data/LICENSES/corpora.txt
|
|
115
|
+
- data/LICENSES/cuss.txt
|
|
116
|
+
- data/LICENSES/django-registration.txt
|
|
117
|
+
- data/LICENSES/dsojevic-profanity-list.txt
|
|
118
|
+
- data/LICENSES/forwardemail.txt
|
|
119
|
+
- data/LICENSES/friendly-words.txt
|
|
120
|
+
- data/LICENSES/gitea.txt
|
|
121
|
+
- data/LICENSES/gitlab.txt
|
|
122
|
+
- data/LICENSES/iana-well-known-uris.txt
|
|
123
|
+
- data/LICENSES/imsky-wordlists.txt
|
|
124
|
+
- data/LICENSES/mottie-github-reserved-names.txt
|
|
125
|
+
- data/LICENSES/obscenity.txt
|
|
126
|
+
- data/LICENSES/petname.txt
|
|
127
|
+
- data/LICENSES/rfc2142.txt
|
|
128
|
+
- data/LICENSES/shouldbee.txt
|
|
129
|
+
- data/LICENSES/usernames.txt
|
|
130
|
+
- data/NOTICE
|
|
131
|
+
- data/offensive/README.md
|
|
132
|
+
- data/offensive/allowlist/en.txt
|
|
133
|
+
- data/offensive/allowlist/es.txt
|
|
134
|
+
- data/offensive/en.json
|
|
135
|
+
- data/offensive/es.json
|
|
136
|
+
- data/offensive/hate.yml
|
|
137
|
+
- data/offensive/leet.yml
|
|
138
|
+
- data/reserved/ALLOWLIST_EXCEPTIONS.txt
|
|
139
|
+
- data/reserved/impersonation.txt
|
|
140
|
+
- data/reserved/mailboxes.txt
|
|
141
|
+
- data/reserved/system.txt
|
|
142
|
+
- data/reserved/web.txt
|
|
143
|
+
- data/words/adjectives.txt
|
|
144
|
+
- data/words/animals.txt
|
|
145
|
+
- lib/generators/usernames/availability_generator.rb
|
|
146
|
+
- lib/generators/usernames/existing_schema.rb
|
|
147
|
+
- lib/generators/usernames/install_generator.rb
|
|
148
|
+
- lib/generators/usernames/install_messages.rb
|
|
149
|
+
- lib/generators/usernames/locale_generator.rb
|
|
150
|
+
- lib/generators/usernames/templates/add_username.rb.erb
|
|
151
|
+
- lib/generators/usernames/templates/availability/_field.html.erb.tt
|
|
152
|
+
- lib/generators/usernames/templates/availability/availability_controller.rb.tt
|
|
153
|
+
- lib/generators/usernames/templates/availability/username_check_controller.js.tt
|
|
154
|
+
- lib/generators/usernames/templates/usernames.rb
|
|
155
|
+
- lib/tasks/usernames.rake
|
|
156
|
+
- lib/usernames.rb
|
|
157
|
+
- lib/usernames/adapters/moderate.rb
|
|
158
|
+
- lib/usernames/audit.rb
|
|
159
|
+
- lib/usernames/audit/output.rb
|
|
160
|
+
- lib/usernames/audit/values.rb
|
|
161
|
+
- lib/usernames/candidates.rb
|
|
162
|
+
- lib/usernames/comparison.rb
|
|
163
|
+
- lib/usernames/comparison/index_contract.rb
|
|
164
|
+
- lib/usernames/comparison/index_expression.rb
|
|
165
|
+
- lib/usernames/configuration.rb
|
|
166
|
+
- lib/usernames/data.rb
|
|
167
|
+
- lib/usernames/engine.rb
|
|
168
|
+
- lib/usernames/errors.rb
|
|
169
|
+
- lib/usernames/generator.rb
|
|
170
|
+
- lib/usernames/model.rb
|
|
171
|
+
- lib/usernames/normalizer.rb
|
|
172
|
+
- lib/usernames/offensive.rb
|
|
173
|
+
- lib/usernames/offensive/hate.rb
|
|
174
|
+
- lib/usernames/offensive/lexicon.rb
|
|
175
|
+
- lib/usernames/offensive/name.rb
|
|
176
|
+
- lib/usernames/phrase.rb
|
|
177
|
+
- lib/usernames/reserved.rb
|
|
178
|
+
- lib/usernames/reserved/listing.rb
|
|
179
|
+
- lib/usernames/result.rb
|
|
180
|
+
- lib/usernames/rules.rb
|
|
181
|
+
- lib/usernames/rules/options.rb
|
|
182
|
+
- lib/usernames/unique_violation.rb
|
|
183
|
+
- lib/usernames/validator.rb
|
|
184
|
+
- lib/usernames/version.rb
|
|
185
|
+
- lib/usernames/words.rb
|
|
186
|
+
- sig/usernames.rbs
|
|
187
|
+
homepage: https://github.com/rameerez/usernames
|
|
188
|
+
licenses:
|
|
189
|
+
- MIT
|
|
190
|
+
metadata:
|
|
191
|
+
allowed_push_host: https://rubygems.org
|
|
192
|
+
homepage_uri: https://github.com/rameerez/usernames
|
|
193
|
+
source_code_uri: https://github.com/rameerez/usernames
|
|
194
|
+
changelog_uri: https://github.com/rameerez/usernames/blob/main/CHANGELOG.md
|
|
195
|
+
bug_tracker_uri: https://github.com/rameerez/usernames/issues
|
|
196
|
+
documentation_uri: https://github.com/rameerez/usernames#readme
|
|
197
|
+
rubygems_mfa_required: 'true'
|
|
198
|
+
rdoc_options: []
|
|
199
|
+
require_paths:
|
|
200
|
+
- lib
|
|
201
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
|
+
requirements:
|
|
203
|
+
- - ">="
|
|
204
|
+
- !ruby/object:Gem::Version
|
|
205
|
+
version: 3.2.0
|
|
206
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
|
+
requirements:
|
|
208
|
+
- - ">="
|
|
209
|
+
- !ruby/object:Gem::Version
|
|
210
|
+
version: '0'
|
|
211
|
+
requirements: []
|
|
212
|
+
rubygems_version: 4.0.10
|
|
213
|
+
specification_version: 4
|
|
214
|
+
summary: 'Add usernames with validations to your Rails app: block reserved names,
|
|
215
|
+
screen profanity, enforce case-insensitive uniqueness, suggest alternatives and
|
|
216
|
+
generate default names'
|
|
217
|
+
test_files: []
|