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.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +39 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +362 -0
  5. data/SECURITY.md +42 -0
  6. data/config/locales/usernames.en.yml +72 -0
  7. data/config/locales/usernames.es.yml +51 -0
  8. data/config/locales/usernames.pt.yml +51 -0
  9. data/data/LICENSES/allprofanity.txt +24 -0
  10. data/data/LICENSES/big-username-blocklist.txt +25 -0
  11. data/data/LICENSES/corpora.txt +128 -0
  12. data/data/LICENSES/cuss.txt +25 -0
  13. data/data/LICENSES/django-registration.txt +33 -0
  14. data/data/LICENSES/dsojevic-profanity-list.txt +24 -0
  15. data/data/LICENSES/forwardemail.txt +24 -0
  16. data/data/LICENSES/friendly-words.txt +24 -0
  17. data/data/LICENSES/gitea.txt +23 -0
  18. data/data/LICENSES/gitlab.txt +31 -0
  19. data/data/LICENSES/iana-well-known-uris.txt +130 -0
  20. data/data/LICENSES/imsky-wordlists.txt +24 -0
  21. data/data/LICENSES/mottie-github-reserved-names.txt +24 -0
  22. data/data/LICENSES/obscenity.txt +27 -0
  23. data/data/LICENSES/petname.txt +218 -0
  24. data/data/LICENSES/rfc2142.txt +9 -0
  25. data/data/LICENSES/shouldbee.txt +25 -0
  26. data/data/LICENSES/usernames.txt +30 -0
  27. data/data/NOTICE +36 -0
  28. data/data/offensive/README.md +90 -0
  29. data/data/offensive/allowlist/en.txt +727 -0
  30. data/data/offensive/allowlist/es.txt +39 -0
  31. data/data/offensive/en.json +5680 -0
  32. data/data/offensive/es.json +1014 -0
  33. data/data/offensive/hate.yml +51 -0
  34. data/data/offensive/leet.yml +27 -0
  35. data/data/reserved/ALLOWLIST_EXCEPTIONS.txt +6 -0
  36. data/data/reserved/impersonation.txt +69 -0
  37. data/data/reserved/mailboxes.txt +77 -0
  38. data/data/reserved/system.txt +124 -0
  39. data/data/reserved/web.txt +962 -0
  40. data/data/words/adjectives.txt +367 -0
  41. data/data/words/animals.txt +253 -0
  42. data/lib/generators/usernames/availability_generator.rb +67 -0
  43. data/lib/generators/usernames/existing_schema.rb +85 -0
  44. data/lib/generators/usernames/install_generator.rb +241 -0
  45. data/lib/generators/usernames/install_messages.rb +63 -0
  46. data/lib/generators/usernames/locale_generator.rb +56 -0
  47. data/lib/generators/usernames/templates/add_username.rb.erb +53 -0
  48. data/lib/generators/usernames/templates/availability/_field.html.erb.tt +25 -0
  49. data/lib/generators/usernames/templates/availability/availability_controller.rb.tt +107 -0
  50. data/lib/generators/usernames/templates/availability/username_check_controller.js.tt +115 -0
  51. data/lib/generators/usernames/templates/usernames.rb +34 -0
  52. data/lib/tasks/usernames.rake +38 -0
  53. data/lib/usernames/adapters/moderate.rb +37 -0
  54. data/lib/usernames/audit/output.rb +51 -0
  55. data/lib/usernames/audit/values.rb +34 -0
  56. data/lib/usernames/audit.rb +230 -0
  57. data/lib/usernames/candidates.rb +64 -0
  58. data/lib/usernames/comparison/index_contract.rb +241 -0
  59. data/lib/usernames/comparison/index_expression.rb +183 -0
  60. data/lib/usernames/comparison.rb +127 -0
  61. data/lib/usernames/configuration.rb +197 -0
  62. data/lib/usernames/data.rb +205 -0
  63. data/lib/usernames/engine.rb +32 -0
  64. data/lib/usernames/errors.rb +16 -0
  65. data/lib/usernames/generator.rb +206 -0
  66. data/lib/usernames/model.rb +397 -0
  67. data/lib/usernames/normalizer.rb +51 -0
  68. data/lib/usernames/offensive/hate.rb +124 -0
  69. data/lib/usernames/offensive/lexicon.rb +156 -0
  70. data/lib/usernames/offensive/name.rb +254 -0
  71. data/lib/usernames/offensive.rb +136 -0
  72. data/lib/usernames/phrase.rb +68 -0
  73. data/lib/usernames/reserved/listing.rb +79 -0
  74. data/lib/usernames/reserved.rb +219 -0
  75. data/lib/usernames/result.rb +52 -0
  76. data/lib/usernames/rules/options.rb +175 -0
  77. data/lib/usernames/rules.rb +257 -0
  78. data/lib/usernames/unique_violation.rb +176 -0
  79. data/lib/usernames/validator.rb +61 -0
  80. data/lib/usernames/version.rb +5 -0
  81. data/lib/usernames/words.rb +13 -0
  82. data/lib/usernames.rb +138 -0
  83. data/sig/usernames.rbs +75 -0
  84. 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: []