titleist 0.1.1 → 1.0.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/.github/workflows/tests.yml +19 -0
- data/.gitignore +1 -2
- data/.rubocop.yml +26 -1
- data/.ruby-version +1 -1
- data/Gemfile +13 -2
- data/README.md +95 -25
- data/Rakefile +17 -6
- data/docs/index.md +7 -0
- data/lib/generators/titleist/titleist_generator.rb +3 -0
- data/lib/titleist.rb +14 -9
- data/lib/titleist/controller.rb +36 -0
- data/lib/titleist/engine.rb +10 -4
- data/lib/titleist/helper.rb +23 -0
- data/lib/titleist/title.rb +52 -89
- data/lib/titleist/version.rb +5 -1
- data/rbi/sord.rbi +117 -0
- data/sorbet/config +2 -0
- data/sorbet/rbi/gems/actioncable.rbi +318 -0
- data/sorbet/rbi/gems/actionmailbox.rbi +56 -0
- data/sorbet/rbi/gems/actionmailer.rbi +446 -0
- data/sorbet/rbi/gems/actionpack.rbi +3411 -0
- data/sorbet/rbi/gems/actiontext.rbi +79 -0
- data/sorbet/rbi/gems/actionview.rbi +1185 -0
- data/sorbet/rbi/gems/activejob.rbi +362 -0
- data/sorbet/rbi/gems/activemodel.rbi +749 -0
- data/sorbet/rbi/gems/activerecord.rbi +5713 -0
- data/sorbet/rbi/gems/activestorage.rbi +221 -0
- data/sorbet/rbi/gems/activesupport.rbi +2437 -0
- data/sorbet/rbi/gems/addressable.rbi +146 -0
- data/sorbet/rbi/gems/ast.rbi +47 -0
- data/sorbet/rbi/gems/capybara.rbi +1787 -0
- data/sorbet/rbi/gems/childprocess.rbi +106 -0
- data/sorbet/rbi/gems/codeclimate-test-reporter.rbi +125 -0
- data/sorbet/rbi/gems/concurrent-ruby.rbi +1587 -0
- data/sorbet/rbi/gems/crass.rbi +92 -0
- data/sorbet/rbi/gems/docile.rbi +29 -0
- data/sorbet/rbi/gems/erubi.rbi +26 -0
- data/sorbet/rbi/gems/globalid.rbi +98 -0
- data/sorbet/rbi/gems/i18n.rbi +191 -0
- data/sorbet/rbi/gems/jaro_winkler.rbi +14 -0
- data/sorbet/rbi/gems/loofah.rbi +129 -0
- data/sorbet/rbi/gems/mail.rbi +1582 -0
- data/sorbet/rbi/gems/marcel.rbi +12 -0
- data/sorbet/rbi/gems/method_source.rbi +63 -0
- data/sorbet/rbi/gems/mini_mime.rbi +51 -0
- data/sorbet/rbi/gems/minitest.rbi +419 -0
- data/sorbet/rbi/gems/mocha.rbi +794 -0
- data/sorbet/rbi/gems/nio4r.rbi +67 -0
- data/sorbet/rbi/gems/nokogiri.rbi +1010 -0
- data/sorbet/rbi/gems/parallel.rbi +81 -0
- data/sorbet/rbi/gems/parser.rbi +920 -0
- data/sorbet/rbi/gems/public_suffix.rbi +103 -0
- data/sorbet/rbi/gems/puma.rbi +586 -0
- data/sorbet/rbi/gems/rack-test.rbi +161 -0
- data/sorbet/rbi/gems/rack.rbi +634 -0
- data/sorbet/rbi/gems/rails-dom-testing.rbi +67 -0
- data/sorbet/rbi/gems/rails-html-sanitizer.rbi +91 -0
- data/sorbet/rbi/gems/railties.rbi +834 -0
- data/sorbet/rbi/gems/rainbow.rbi +117 -0
- data/sorbet/rbi/gems/rake.rbi +269 -0
- data/sorbet/rbi/gems/regexp_parser.rbi +912 -0
- data/sorbet/rbi/gems/rubocop.rbi +7232 -0
- data/sorbet/rbi/gems/ruby-progressbar.rbi +304 -0
- data/sorbet/rbi/gems/rubyzip.rbi +546 -0
- data/sorbet/rbi/gems/selenium-webdriver.rbi +1450 -0
- data/sorbet/rbi/gems/simplecov-html.rbi +30 -0
- data/sorbet/rbi/gems/simplecov.rbi +189 -0
- data/sorbet/rbi/gems/site_ruby.rbi +265 -0
- data/sorbet/rbi/gems/sprockets-rails.rbi +105 -0
- data/sorbet/rbi/gems/sprockets.rbi +753 -0
- data/sorbet/rbi/gems/sqlite3.rbi +353 -0
- data/sorbet/rbi/gems/thor.rbi +579 -0
- data/sorbet/rbi/gems/thread_safe.rbi +81 -0
- data/sorbet/rbi/gems/tzinfo.rbi +405 -0
- data/sorbet/rbi/gems/unicode-display_width.rbi +16 -0
- data/sorbet/rbi/gems/webdrivers.rbi +155 -0
- data/sorbet/rbi/gems/xpath.rbi +158 -0
- data/sorbet/rbi/gems/yard.rbi +1159 -0
- data/sorbet/rbi/hidden-definitions/errors.txt +14957 -0
- data/sorbet/rbi/hidden-definitions/hidden.rbi +24898 -0
- data/sorbet/rbi/sorbet-typed/lib/actionmailer/all/actionmailer.rbi +13 -0
- data/sorbet/rbi/sorbet-typed/lib/actionpack/all/actionpack.rbi +938 -0
- data/sorbet/rbi/sorbet-typed/lib/actionview/all/actionview.rbi +314 -0
- data/sorbet/rbi/sorbet-typed/lib/activemodel/all/activemodel.rbi +425 -0
- data/sorbet/rbi/sorbet-typed/lib/activerecord/>=5.2/activerecord.rbi +17 -0
- data/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1425 -0
- data/sorbet/rbi/sorbet-typed/lib/activerecord/~>6.0.0/activerecord.rbi +475 -0
- data/sorbet/rbi/sorbet-typed/lib/activestorage/>=6.0.0/activestorage.rbi +19 -0
- data/sorbet/rbi/sorbet-typed/lib/activestorage/all/activestorage.rbi +173 -0
- data/sorbet/rbi/sorbet-typed/lib/activesupport/>=6.0.0.rc1/activesupport.rbi +23 -0
- data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +858 -0
- data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +8684 -0
- data/sorbet/rbi/sorbet-typed/lib/minitest/all/minitest.rbi +108 -0
- data/sorbet/rbi/sorbet-typed/lib/railties/all/railties.rbi +25 -0
- data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +254 -0
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi +4222 -0
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +111 -0
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +543 -0
- data/sorbet/rbi/todo.rbi +20 -0
- data/titleist.gemspec +3 -14
- metadata +96 -155
- data/.travis.yml +0 -45
- data/app/controllers/.keep +0 -0
- data/app/helpers/.keep +0 -0
- data/app/helpers/titleist_helper.rb +0 -47
- data/app/mailers/.keep +0 -0
- data/app/models/.keep +0 -0
- data/app/views/.keep +0 -0
@@ -0,0 +1,314 @@
|
|
1
|
+
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
2
|
+
# srb rbi sorbet-typed
|
3
|
+
#
|
4
|
+
# If you would like to make changes to this file, great! Please upstream any changes you make here:
|
5
|
+
#
|
6
|
+
# https://github.com/sorbet/sorbet-typed/edit/master/lib/actionview/all/actionview.rbi
|
7
|
+
#
|
8
|
+
# typed: strong
|
9
|
+
|
10
|
+
module ActionView
|
11
|
+
class ActionViewError < StandardError; end
|
12
|
+
class EncodingError < StandardError; end
|
13
|
+
class WrongEncodingError < EncodingError; end
|
14
|
+
|
15
|
+
class MissingTemplate < ActionViewError
|
16
|
+
sig { returns(String) }
|
17
|
+
def path; end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Template
|
21
|
+
class Error < ActionViewError; end
|
22
|
+
end
|
23
|
+
|
24
|
+
TemplateError = T.type_alias {Template::Error}
|
25
|
+
|
26
|
+
class SyntaxErrorInTemplate < Template::Error; end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Provides a set of methods for making links and getting URLs that
|
30
|
+
# depend on the routing subsystem (see ActionDispatch::Routing).
|
31
|
+
# This allows you to use the same format for links in views
|
32
|
+
# and controllers.
|
33
|
+
module ActionView::Helpers::UrlHelper
|
34
|
+
# Creates an anchor element of the given `name` using a URL created by the set of `options`.
|
35
|
+
# See the valid options in the documentation for `url_for`. It's also possible to
|
36
|
+
# pass a String instead of an options hash, which generates an anchor element that uses the
|
37
|
+
# value of the String as the href for the link. Using a `:back` Symbol instead
|
38
|
+
# of an options hash will generate a link to the referrer (a JavaScript back link
|
39
|
+
# will be used in place of a referrer if none exists). If `nil` is passed as the name
|
40
|
+
# the value of the link itself will become the name.
|
41
|
+
#
|
42
|
+
# #### Signatures
|
43
|
+
#
|
44
|
+
# ```ruby
|
45
|
+
# link_to(body, url, html_options = {})
|
46
|
+
# # url is a String; you can use URL helpers like
|
47
|
+
# # posts_path
|
48
|
+
#
|
49
|
+
# link_to(body, url_options = {}, html_options = {})
|
50
|
+
# # url_options, except :method, is passed to url_for
|
51
|
+
#
|
52
|
+
# link_to(options = {}, html_options = {}) do
|
53
|
+
# # name
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# link_to(url, html_options = {}) do
|
57
|
+
# # name
|
58
|
+
# end
|
59
|
+
# ```
|
60
|
+
#
|
61
|
+
# #### Options
|
62
|
+
# * `:data` - This option can be used to add custom data attributes.
|
63
|
+
# * `method: symbol of HTTP verb` - This modifier will dynamically
|
64
|
+
# create an HTML form and immediately submit the form for processing using
|
65
|
+
# the HTTP verb specified. Useful for having links perform a POST operation
|
66
|
+
# in dangerous actions like deleting a record (which search bots can follow
|
67
|
+
# while spidering your site). Supported verbs are `:post`, `:delete`, `:patch`, and `:put`.
|
68
|
+
# Note that if the user has JavaScript disabled, the request will fall back
|
69
|
+
# to using GET. If `href: '#'` is used and the user has JavaScript
|
70
|
+
# disabled clicking the link will have no effect. If you are relying on the
|
71
|
+
# POST behavior, you should check for it in your controller's action by using
|
72
|
+
# the request object's methods for `post?`, `delete?`, `patch?`, or `put?`.
|
73
|
+
# * `remote: true` - This will allow the unobtrusive JavaScript
|
74
|
+
# driver to make an Ajax request to the URL in question instead of following
|
75
|
+
# the link. The drivers each provide mechanisms for listening for the
|
76
|
+
# completion of the Ajax request and performing JavaScript operations once
|
77
|
+
# they're complete
|
78
|
+
#
|
79
|
+
# #### Data attributes
|
80
|
+
#
|
81
|
+
# * `confirm: 'question?'` - This will allow the unobtrusive JavaScript
|
82
|
+
# driver to prompt with the question specified (in this case, the
|
83
|
+
# resulting text would be `question?`. If the user accepts, the
|
84
|
+
# link is processed normally, otherwise no action is taken.
|
85
|
+
# * `:disable_with` - Value of this parameter will be used as the
|
86
|
+
# name for a disabled version of the link. This feature is provided by
|
87
|
+
# the unobtrusive JavaScript driver.
|
88
|
+
#
|
89
|
+
# #### Examples
|
90
|
+
# Because it relies on `url_for`, `link_to` supports both older-style controller/action/id arguments
|
91
|
+
# and newer RESTful routes. Current Rails style favors RESTful routes whenever possible, so base
|
92
|
+
# your application on resources and use
|
93
|
+
#
|
94
|
+
# ```ruby
|
95
|
+
# link_to "Profile", profile_path(@profile)
|
96
|
+
# # => <a href="/profiles/1">Profile</a>
|
97
|
+
# ```
|
98
|
+
#
|
99
|
+
# or the even pithier
|
100
|
+
#
|
101
|
+
# ```ruby
|
102
|
+
# link_to "Profile", @profile
|
103
|
+
# # => <a href="/profiles/1">Profile</a>
|
104
|
+
# ```
|
105
|
+
#
|
106
|
+
# in place of the older more verbose, non-resource-oriented
|
107
|
+
#
|
108
|
+
# ```ruby
|
109
|
+
# link_to "Profile", controller: "profiles", action: "show", id: @profile
|
110
|
+
# # => <a href="/profiles/show/1">Profile</a>
|
111
|
+
# ```
|
112
|
+
#
|
113
|
+
# Similarly,
|
114
|
+
#
|
115
|
+
# ```ruby
|
116
|
+
# link_to "Profiles", profiles_path
|
117
|
+
# # => <a href="/profiles">Profiles</a>
|
118
|
+
# ```
|
119
|
+
#
|
120
|
+
# is better than
|
121
|
+
#
|
122
|
+
# ```ruby
|
123
|
+
# link_to "Profiles", controller: "profiles"
|
124
|
+
# # => <a href="/profiles">Profiles</a>
|
125
|
+
# ```
|
126
|
+
#
|
127
|
+
# When name is `nil` the href is presented instead
|
128
|
+
#
|
129
|
+
# ```ruby
|
130
|
+
# link_to nil, "http://example.com"
|
131
|
+
# # => <a href="http://www.example.com">http://www.example.com</a>
|
132
|
+
# ```
|
133
|
+
#
|
134
|
+
# You can use a block as well if your link target is hard to fit into the name parameter. ERB example:
|
135
|
+
#
|
136
|
+
# ```html
|
137
|
+
# <%= link_to(@profile) do %>
|
138
|
+
# <strong><%= @profile.name %></strong> -- <span>Check it out!</span>
|
139
|
+
# <% end %>
|
140
|
+
# # => <a href="/profiles/1">
|
141
|
+
# <strong>David</strong> -- <span>Check it out!</span>
|
142
|
+
# </a>
|
143
|
+
# ```
|
144
|
+
#
|
145
|
+
# Classes and ids for CSS are easy to produce:
|
146
|
+
#
|
147
|
+
# ```ruby
|
148
|
+
# link_to "Articles", articles_path, id: "news", class: "article"
|
149
|
+
# # => <a href="/articles" class="article" id="news">Articles</a>
|
150
|
+
# ```
|
151
|
+
#
|
152
|
+
# Be careful when using the older argument style, as an extra literal hash is needed:
|
153
|
+
#
|
154
|
+
# ```ruby
|
155
|
+
# link_to "Articles", { controller: "articles" }, id: "news", class: "article"
|
156
|
+
# # => <a href="/articles" class="article" id="news">Articles</a>
|
157
|
+
# ```
|
158
|
+
#
|
159
|
+
# Leaving the hash off gives the wrong link:
|
160
|
+
#
|
161
|
+
# ```ruby
|
162
|
+
# link_to "WRONG!", controller: "articles", id: "news", class: "article"
|
163
|
+
# # => <a href="/articles/index/news?class=article">WRONG!</a>
|
164
|
+
# ```
|
165
|
+
#
|
166
|
+
# `link_to` can also produce links with anchors or query strings:
|
167
|
+
#
|
168
|
+
# ```ruby
|
169
|
+
# link_to "Comment wall", profile_path(@profile, anchor: "wall")
|
170
|
+
# # => <a href="/profiles/1#wall">Comment wall</a>
|
171
|
+
#
|
172
|
+
# link_to "Ruby on Rails search", controller: "searches", query: "ruby on rails"
|
173
|
+
# # => <a href="/searches?query=ruby+on+rails">Ruby on Rails search</a>
|
174
|
+
#
|
175
|
+
# link_to "Nonsense search", searches_path(foo: "bar", baz: "quux")
|
176
|
+
# # => <a href="/searches?foo=bar&baz=quux">Nonsense search</a>
|
177
|
+
# ```
|
178
|
+
#
|
179
|
+
# The only option specific to `link_to` (`:method`) is used as follows:
|
180
|
+
#
|
181
|
+
# ```ruby
|
182
|
+
# link_to("Destroy", "http://www.example.com", method: :delete)
|
183
|
+
# # => <a href='http://www.example.com' rel="nofollow" data-method="delete">Destroy</a>
|
184
|
+
# ```
|
185
|
+
#
|
186
|
+
# You can also use custom data attributes using the `:data` option:
|
187
|
+
#
|
188
|
+
# ```ruby
|
189
|
+
# link_to "Visit Other Site", "http://www.rubyonrails.org/", data: { confirm: "Are you sure?" }
|
190
|
+
# # => <a href="http://www.rubyonrails.org/" data-confirm="Are you sure?">Visit Other Site</a>
|
191
|
+
# ```
|
192
|
+
#
|
193
|
+
# Also you can set any link attributes such as `target`, `rel`, `type`:
|
194
|
+
#
|
195
|
+
# ```ruby
|
196
|
+
# link_to "External link", "http://www.rubyonrails.org/", target: "_blank", rel: "nofollow"
|
197
|
+
# # => <a href="http://www.rubyonrails.org/" target="_blank" rel="nofollow">External link</a>
|
198
|
+
# ```
|
199
|
+
sig do
|
200
|
+
params(
|
201
|
+
name: String,
|
202
|
+
options: T.untyped,
|
203
|
+
html_options: T.untyped,
|
204
|
+
block: T.untyped
|
205
|
+
).returns(ActiveSupport::SafeBuffer)
|
206
|
+
end
|
207
|
+
def link_to(name = nil, options = nil, html_options = nil, &block); end
|
208
|
+
|
209
|
+
# Creates a link tag of the given `name` using a URL created by the set of
|
210
|
+
# `options` if `condition` is true, otherwise only the name is
|
211
|
+
# returned. To specialize the default behavior, you can pass a block that
|
212
|
+
# accepts the name or the full argument list for `link_to_unless` (see the examples
|
213
|
+
# in `link_to_unless`).
|
214
|
+
#
|
215
|
+
# #### Examples
|
216
|
+
# ```ruby
|
217
|
+
# <%= link_to_if(@current_user.nil?, "Login", { controller: "sessions", action: "new" }) %>
|
218
|
+
# # If the user isn't logged in...
|
219
|
+
# # => <a href="/sessions/new/">Login</a>
|
220
|
+
# ```
|
221
|
+
#
|
222
|
+
# ```ruby
|
223
|
+
# <%=
|
224
|
+
# link_to_if(@current_user.nil?, "Login", { controller: "sessions", action: "new" }) do
|
225
|
+
# link_to(@current_user.login, { controller: "accounts", action: "show", id: @current_user })
|
226
|
+
# end
|
227
|
+
# %>
|
228
|
+
# # If the user isn't logged in...
|
229
|
+
# # => <a href="/sessions/new/">Login</a>
|
230
|
+
# # If they are logged in...
|
231
|
+
# # => <a href="/accounts/show/3">my_username</a>
|
232
|
+
# ```
|
233
|
+
sig do
|
234
|
+
params(
|
235
|
+
condition: T.untyped,
|
236
|
+
name: String,
|
237
|
+
options: T.untyped,
|
238
|
+
html_options: T.untyped,
|
239
|
+
block: T.untyped
|
240
|
+
).returns(T.untyped)
|
241
|
+
end
|
242
|
+
def link_to_if(condition, name, options = {}, html_options = {}, &block); end
|
243
|
+
|
244
|
+
# True if the current request URI was generated by the given `options`.
|
245
|
+
#
|
246
|
+
# #### Examples
|
247
|
+
# Let's say we're in the `http://www.example.com/shop/checkout?order=desc&page=1` action.
|
248
|
+
#
|
249
|
+
# ```ruby
|
250
|
+
# current_page?(action: 'process')
|
251
|
+
# # => false
|
252
|
+
#
|
253
|
+
# current_page?(action: 'checkout')
|
254
|
+
# # => true
|
255
|
+
#
|
256
|
+
# current_page?(controller: 'library', action: 'checkout')
|
257
|
+
# # => false
|
258
|
+
#
|
259
|
+
# current_page?(controller: 'shop', action: 'checkout')
|
260
|
+
# # => true
|
261
|
+
#
|
262
|
+
# current_page?(controller: 'shop', action: 'checkout', order: 'asc')
|
263
|
+
# # => false
|
264
|
+
#
|
265
|
+
# current_page?(controller: 'shop', action: 'checkout', order: 'desc', page: '1')
|
266
|
+
# # => true
|
267
|
+
#
|
268
|
+
# current_page?(controller: 'shop', action: 'checkout', order: 'desc', page: '2')
|
269
|
+
# # => false
|
270
|
+
#
|
271
|
+
# current_page?('http://www.example.com/shop/checkout')
|
272
|
+
# # => true
|
273
|
+
#
|
274
|
+
# current_page?('http://www.example.com/shop/checkout', check_parameters: true)
|
275
|
+
# # => false
|
276
|
+
#
|
277
|
+
# current_page?('/shop/checkout')
|
278
|
+
# # => true
|
279
|
+
#
|
280
|
+
# current_page?('http://www.example.com/shop/checkout?order=desc&page=1')
|
281
|
+
# # => true
|
282
|
+
# ```
|
283
|
+
#
|
284
|
+
# Let's say we're in the `http://www.example.com/products` action with method POST in case of invalid product.
|
285
|
+
#
|
286
|
+
# ```ruby
|
287
|
+
# current_page?(controller: 'product', action: 'index')
|
288
|
+
# # => false
|
289
|
+
# ```
|
290
|
+
#
|
291
|
+
# We can also pass in the symbol arguments instead of strings.
|
292
|
+
sig { params(options: T.untyped, check_parameters: T::Boolean).returns(T::Boolean) }
|
293
|
+
def current_page?(options, check_parameters: false); end
|
294
|
+
end
|
295
|
+
|
296
|
+
module ActionView::Layouts
|
297
|
+
extend T::Helpers
|
298
|
+
|
299
|
+
module ClassMethods; end
|
300
|
+
|
301
|
+
mixes_in_class_methods(ActionView::Layouts::ClassMethods)
|
302
|
+
end
|
303
|
+
|
304
|
+
module ActionView::Rendering
|
305
|
+
extend T::Helpers
|
306
|
+
|
307
|
+
mixes_in_class_methods(ActionView::Rendering::ClassMethods)
|
308
|
+
end
|
309
|
+
|
310
|
+
module ActionView::ViewPaths
|
311
|
+
extend T::Helpers
|
312
|
+
|
313
|
+
mixes_in_class_methods(ActionView::ViewPaths::ClassMethods)
|
314
|
+
end
|
@@ -0,0 +1,425 @@
|
|
1
|
+
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
2
|
+
# srb rbi sorbet-typed
|
3
|
+
#
|
4
|
+
# If you would like to make changes to this file, great! Please upstream any changes you make here:
|
5
|
+
#
|
6
|
+
# https://github.com/sorbet/sorbet-typed/edit/master/lib/activemodel/all/activemodel.rbi
|
7
|
+
#
|
8
|
+
# typed: false
|
9
|
+
|
10
|
+
module ActiveModel::Dirty
|
11
|
+
extend T::Sig
|
12
|
+
sig { params(attr: Symbol, from: T.untyped, to: T.untyped).returns(T::Boolean) }
|
13
|
+
def attribute_changed?(attr, from: nil, to: nil); end
|
14
|
+
|
15
|
+
sig { params(attr_name: Symbol).returns(T::Boolean) }
|
16
|
+
def attribute_changed_in_place?(attr_name); end
|
17
|
+
|
18
|
+
sig { params(attr_name: Symbol).returns(T::Boolean) }
|
19
|
+
def attribute_previously_changed?(attr_name); end
|
20
|
+
|
21
|
+
sig { returns(T::Boolean) }
|
22
|
+
def changed?; end
|
23
|
+
end
|
24
|
+
|
25
|
+
module ActiveModel::Validations
|
26
|
+
mixes_in_class_methods(ClassMethods)
|
27
|
+
|
28
|
+
module ClassMethods
|
29
|
+
# https://github.com/rails/rails/blob/v5.2.3/activemodel/lib/active_model/validations.rb#L136-L154
|
30
|
+
sig do
|
31
|
+
params(
|
32
|
+
names: T.any(Symbol, String),
|
33
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
34
|
+
on: T.any(Symbol, String),
|
35
|
+
prepend: T::Boolean,
|
36
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
37
|
+
).void
|
38
|
+
end
|
39
|
+
def validate(
|
40
|
+
*names,
|
41
|
+
if: nil,
|
42
|
+
on: nil,
|
43
|
+
prepend: false,
|
44
|
+
unless: nil
|
45
|
+
); end
|
46
|
+
|
47
|
+
# https://github.com/rails/rails/blob/v5.2.3/activemodel/lib/active_model/validations/validates.rb#L75-L105
|
48
|
+
sig do
|
49
|
+
params(
|
50
|
+
names: T.any(Symbol, String), # a splat of at least one attribute name
|
51
|
+
absence: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
|
52
|
+
acceptance: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
|
53
|
+
allow_blank: T::Boolean,
|
54
|
+
allow_nil: T::Boolean,
|
55
|
+
confirmation: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
|
56
|
+
# `exclusion` and `inclusion` are tricky to type without better support
|
57
|
+
# for overloading and shapes. Value can be anything that responds to
|
58
|
+
# `include?` (e.g. (1..3)), or a hash having an `in` or `within` key,
|
59
|
+
# like { in: [1, 2, 3], ... }
|
60
|
+
exclusion: T::Enumerable[T.untyped],
|
61
|
+
# `format` hash must additionally contain either :with or :without keys.
|
62
|
+
# Alternatively, it can be a Regexp.
|
63
|
+
format: T.any(T::Hash[T.untyped, T.untyped], Regexp),
|
64
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
65
|
+
# `exclusion` and `inclusion` are tricky to type without better support
|
66
|
+
# for overloading and shapes. Value can be anything that responds to
|
67
|
+
# `include?` (e.g. (1..3)), or a hash having an `in` or `within` key,
|
68
|
+
# like { in: [1, 2, 3], ... }
|
69
|
+
inclusion: T::Enumerable[T.untyped],
|
70
|
+
# if Hash, must contain :in, :within, :maximum, :minimum, or :is keys
|
71
|
+
length: T.any(T::Range[T.untyped], T::Hash[T.untyped, T.untyped]),
|
72
|
+
numericality: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
|
73
|
+
on: T.any(Symbol, String, T::Array[T.any(Symbol, String)]),
|
74
|
+
presence: T::Boolean,
|
75
|
+
size: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
|
76
|
+
strict: T::Boolean,
|
77
|
+
uniqueness: T.any(T::Boolean, T::Hash[T.untyped, T.untyped]),
|
78
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
79
|
+
).void
|
80
|
+
end
|
81
|
+
def validates(
|
82
|
+
*names,
|
83
|
+
absence: false,
|
84
|
+
acceptance: {},
|
85
|
+
allow_blank: false,
|
86
|
+
allow_nil: false,
|
87
|
+
confirmation: false,
|
88
|
+
exclusion: [],
|
89
|
+
format: {},
|
90
|
+
if: nil,
|
91
|
+
inclusion: [],
|
92
|
+
length: {},
|
93
|
+
numericality: false,
|
94
|
+
on: :_,
|
95
|
+
presence: false,
|
96
|
+
size: false,
|
97
|
+
strict: false,
|
98
|
+
uniqueness: false,
|
99
|
+
unless: :_
|
100
|
+
)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class ActiveModel::Type::Boolean
|
106
|
+
sig { params(arg0: T.untyped).returns(T.nilable(T::Boolean))}
|
107
|
+
def cast(arg0); end
|
108
|
+
end
|
109
|
+
|
110
|
+
module ActiveModel::Validations::HelperMethods
|
111
|
+
sig do
|
112
|
+
params(
|
113
|
+
attr_names: T.any(String, Symbol),
|
114
|
+
message: String,
|
115
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
116
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
117
|
+
on: T.any(Symbol, String),
|
118
|
+
allow_nil: T::Boolean,
|
119
|
+
allow_blank: T::Boolean,
|
120
|
+
strict: T::Boolean
|
121
|
+
).void
|
122
|
+
end
|
123
|
+
def validates_absence_of(
|
124
|
+
*attr_names,
|
125
|
+
message: 'must be blank',
|
126
|
+
if: nil,
|
127
|
+
unless: :_,
|
128
|
+
on: :_,
|
129
|
+
allow_nil: false,
|
130
|
+
allow_blank: false,
|
131
|
+
strict: false
|
132
|
+
); end
|
133
|
+
|
134
|
+
sig do
|
135
|
+
params(
|
136
|
+
attr_names: T.any(String, Symbol),
|
137
|
+
message: String,
|
138
|
+
accept: T.untyped,
|
139
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
140
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
141
|
+
on: T.any(Symbol, String),
|
142
|
+
allow_nil: T::Boolean,
|
143
|
+
allow_blank: T::Boolean,
|
144
|
+
strict: T::Boolean
|
145
|
+
).void
|
146
|
+
end
|
147
|
+
def validates_acceptance_of(
|
148
|
+
*attr_names,
|
149
|
+
message: 'must be accepted',
|
150
|
+
accept: ['1', true],
|
151
|
+
if: nil,
|
152
|
+
unless: :_,
|
153
|
+
on: :_,
|
154
|
+
allow_nil: false,
|
155
|
+
allow_blank: false,
|
156
|
+
strict: false
|
157
|
+
); end
|
158
|
+
|
159
|
+
sig do
|
160
|
+
params(
|
161
|
+
attr_names: T.any(String, Symbol),
|
162
|
+
message: String,
|
163
|
+
case_sensitive: T::Boolean,
|
164
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
165
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
166
|
+
on: T.any(Symbol, String),
|
167
|
+
allow_nil: T::Boolean,
|
168
|
+
allow_blank: T::Boolean,
|
169
|
+
strict: T::Boolean
|
170
|
+
).void
|
171
|
+
end
|
172
|
+
def validates_confirmation_of(
|
173
|
+
*attr_names,
|
174
|
+
message: "doesn't match %{translated_attribute_name}",
|
175
|
+
case_sensitive: true,
|
176
|
+
if: nil,
|
177
|
+
unless: :_,
|
178
|
+
on: :_,
|
179
|
+
allow_nil: false,
|
180
|
+
allow_blank: false,
|
181
|
+
strict: false
|
182
|
+
); end
|
183
|
+
|
184
|
+
# A type alias for the in/within parameters on the
|
185
|
+
# validates_(inclusion/exclusion)_of methods.
|
186
|
+
InWithinType = T.type_alias do
|
187
|
+
T.nilable(
|
188
|
+
T.any(
|
189
|
+
Symbol,
|
190
|
+
String,
|
191
|
+
T::Array[T.any(String, Symbol)],
|
192
|
+
T::Range[Integer],
|
193
|
+
T::Array[T::Boolean],
|
194
|
+
T.proc.params(arg0: T.untyped).returns(T::Boolean)
|
195
|
+
)
|
196
|
+
)
|
197
|
+
end
|
198
|
+
sig do
|
199
|
+
params(
|
200
|
+
attr_names: T.any(String, Symbol),
|
201
|
+
message: String,
|
202
|
+
in: InWithinType,
|
203
|
+
within: InWithinType,
|
204
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
205
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
206
|
+
on: T.any(Symbol, String),
|
207
|
+
allow_nil: T::Boolean,
|
208
|
+
allow_blank: T::Boolean,
|
209
|
+
strict: T::Boolean
|
210
|
+
).void
|
211
|
+
end
|
212
|
+
def validates_exclusion_of(
|
213
|
+
*attr_names,
|
214
|
+
message: 'is reserved',
|
215
|
+
in: nil,
|
216
|
+
within: nil,
|
217
|
+
if: nil,
|
218
|
+
unless: :_,
|
219
|
+
on: :_,
|
220
|
+
allow_nil: false,
|
221
|
+
allow_blank: false,
|
222
|
+
strict: false
|
223
|
+
); end
|
224
|
+
|
225
|
+
sig do
|
226
|
+
params(
|
227
|
+
attr_names: T.any(String, Symbol),
|
228
|
+
message: String,
|
229
|
+
with: T.untyped,
|
230
|
+
without: T.untyped,
|
231
|
+
multiline: T.untyped,
|
232
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
233
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
234
|
+
on: T.any(Symbol, String),
|
235
|
+
allow_nil: T::Boolean,
|
236
|
+
allow_blank: T::Boolean,
|
237
|
+
strict: T::Boolean
|
238
|
+
).void
|
239
|
+
end
|
240
|
+
def validates_format_of(
|
241
|
+
*attr_names,
|
242
|
+
message: 'is invalid',
|
243
|
+
with: nil,
|
244
|
+
without: nil,
|
245
|
+
multiline: nil,
|
246
|
+
if: nil,
|
247
|
+
unless: :_,
|
248
|
+
on: :_,
|
249
|
+
allow_nil: false,
|
250
|
+
allow_blank: false,
|
251
|
+
strict: false
|
252
|
+
); end
|
253
|
+
|
254
|
+
sig do
|
255
|
+
params(
|
256
|
+
attr_names: T.any(String, Symbol),
|
257
|
+
message: String,
|
258
|
+
in: InWithinType,
|
259
|
+
within: InWithinType,
|
260
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
261
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
262
|
+
on: T.any(Symbol, String),
|
263
|
+
allow_nil: T::Boolean,
|
264
|
+
allow_blank: T::Boolean,
|
265
|
+
strict: T::Boolean
|
266
|
+
).void
|
267
|
+
end
|
268
|
+
def validates_inclusion_of(
|
269
|
+
*attr_names,
|
270
|
+
message: 'is not included in the list',
|
271
|
+
in: nil,
|
272
|
+
within: nil,
|
273
|
+
if: nil,
|
274
|
+
unless: :_,
|
275
|
+
on: :_,
|
276
|
+
allow_nil: false,
|
277
|
+
allow_blank: false,
|
278
|
+
strict: false
|
279
|
+
); end
|
280
|
+
|
281
|
+
sig do
|
282
|
+
params(
|
283
|
+
attr_names: T.any(String, Symbol),
|
284
|
+
message: T.nilable(String),
|
285
|
+
minimum: T.nilable(Integer),
|
286
|
+
maximum: T.nilable(Integer),
|
287
|
+
is: T.nilable(Integer),
|
288
|
+
within: T.nilable(T::Range[Integer]),
|
289
|
+
in: T.nilable(T::Range[Integer]),
|
290
|
+
too_long: String,
|
291
|
+
too_short: String,
|
292
|
+
wrong_length: String,
|
293
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
294
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
295
|
+
on: T.any(Symbol, String),
|
296
|
+
allow_nil: T::Boolean,
|
297
|
+
allow_blank: T::Boolean,
|
298
|
+
strict: T::Boolean
|
299
|
+
).void
|
300
|
+
end
|
301
|
+
def validates_length_of(
|
302
|
+
*attr_names,
|
303
|
+
message: nil,
|
304
|
+
minimum: nil,
|
305
|
+
maximum: nil,
|
306
|
+
is: nil,
|
307
|
+
within: nil,
|
308
|
+
in: nil,
|
309
|
+
too_long: 'is too long (maximum is %{count} characters)',
|
310
|
+
too_short: 'is too short (minimum is %{count} characters)',
|
311
|
+
wrong_length: 'is the wrong length (should be %{count} characters)',
|
312
|
+
if: nil,
|
313
|
+
unless: :_,
|
314
|
+
on: :_,
|
315
|
+
allow_nil: false,
|
316
|
+
allow_blank: false,
|
317
|
+
strict: false
|
318
|
+
); end
|
319
|
+
|
320
|
+
# validates_size_of is an alias of validates_length_of
|
321
|
+
sig do
|
322
|
+
params(
|
323
|
+
attr_names: T.any(String, Symbol),
|
324
|
+
message: T.nilable(String),
|
325
|
+
minimum: T.nilable(Integer),
|
326
|
+
maximum: T.nilable(Integer),
|
327
|
+
is: T.nilable(Integer),
|
328
|
+
within: T.nilable(T::Range[Integer]),
|
329
|
+
in: T.nilable(T::Range[Integer]),
|
330
|
+
too_long: String,
|
331
|
+
too_short: String,
|
332
|
+
wrong_length: String,
|
333
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
334
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
335
|
+
on: T.any(Symbol, String),
|
336
|
+
allow_nil: T::Boolean,
|
337
|
+
allow_blank: T::Boolean,
|
338
|
+
strict: T::Boolean
|
339
|
+
).void
|
340
|
+
end
|
341
|
+
def validates_size_of(
|
342
|
+
*attr_names,
|
343
|
+
message: nil,
|
344
|
+
minimum: nil,
|
345
|
+
maximum: nil,
|
346
|
+
is: nil,
|
347
|
+
within: nil,
|
348
|
+
in: nil,
|
349
|
+
too_long: 'is too long (maximum is %{count} characters)',
|
350
|
+
too_short: 'is too short (minimum is %{count} characters)',
|
351
|
+
wrong_length: 'is the wrong length (should be %{count} characters)',
|
352
|
+
if: nil,
|
353
|
+
unless: :_,
|
354
|
+
on: :_,
|
355
|
+
allow_nil: false,
|
356
|
+
allow_blank: false,
|
357
|
+
strict: false
|
358
|
+
); end
|
359
|
+
|
360
|
+
# Create a type alias so we don't have to repeat this long type signature 6 times.
|
361
|
+
NumberComparatorType = T.type_alias {T.nilable(T.any(Integer, Float, T.proc.params(arg0: T.untyped).returns(T::Boolean), Symbol))}
|
362
|
+
sig do
|
363
|
+
params(
|
364
|
+
attr_names: T.any(String, Symbol),
|
365
|
+
message: String,
|
366
|
+
only_integer: T::Boolean,
|
367
|
+
greater_than: NumberComparatorType,
|
368
|
+
greater_than_or_equal_to: NumberComparatorType,
|
369
|
+
equal_to: NumberComparatorType,
|
370
|
+
less_than: NumberComparatorType,
|
371
|
+
less_than_or_equal_to: NumberComparatorType,
|
372
|
+
other_than: NumberComparatorType,
|
373
|
+
odd: T::Boolean,
|
374
|
+
even: T::Boolean,
|
375
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
376
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
377
|
+
on: T.any(Symbol, String),
|
378
|
+
allow_nil: T::Boolean,
|
379
|
+
allow_blank: T::Boolean,
|
380
|
+
strict: T::Boolean
|
381
|
+
).void
|
382
|
+
end
|
383
|
+
def validates_numericality_of(
|
384
|
+
*attr_names,
|
385
|
+
message: 'is not a number',
|
386
|
+
only_integer: false,
|
387
|
+
greater_than: nil,
|
388
|
+
greater_than_or_equal_to: nil,
|
389
|
+
equal_to: nil,
|
390
|
+
less_than: nil,
|
391
|
+
less_than_or_equal_to: nil,
|
392
|
+
other_than: nil,
|
393
|
+
odd: false,
|
394
|
+
even: false,
|
395
|
+
if: nil,
|
396
|
+
unless: :_,
|
397
|
+
on: :_,
|
398
|
+
allow_nil: false,
|
399
|
+
allow_blank: false,
|
400
|
+
strict: false
|
401
|
+
); end
|
402
|
+
|
403
|
+
sig do
|
404
|
+
params(
|
405
|
+
attr_names: T.any(String, Symbol),
|
406
|
+
message: String,
|
407
|
+
if: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
408
|
+
unless: T.any(Symbol, String, T.proc.params(arg0: T.untyped).returns(T::Boolean)),
|
409
|
+
on: T.any(Symbol, String),
|
410
|
+
allow_nil: T::Boolean,
|
411
|
+
allow_blank: T::Boolean,
|
412
|
+
strict: T::Boolean
|
413
|
+
).void
|
414
|
+
end
|
415
|
+
def validates_presence_of(
|
416
|
+
*attr_names,
|
417
|
+
message: "can't be blank",
|
418
|
+
if: nil,
|
419
|
+
unless: :_,
|
420
|
+
on: :_,
|
421
|
+
allow_nil: false,
|
422
|
+
allow_blank: false,
|
423
|
+
strict: false
|
424
|
+
); end
|
425
|
+
end
|