wt_activerecord_index_spy 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +3 -0
  3. data/.rubocop.yml +3 -0
  4. data/CHANGELOG.md +3 -0
  5. data/Rakefile +0 -14
  6. data/lib/wt_activerecord_index_spy/aggregator.rb +29 -4
  7. data/lib/wt_activerecord_index_spy/notification_listener.rb +3 -2
  8. data/lib/wt_activerecord_index_spy/query_analyser/mysql.rb +1 -0
  9. data/lib/wt_activerecord_index_spy/query_analyser/postgres.rb +1 -0
  10. data/lib/wt_activerecord_index_spy/query_analyser.rb +1 -0
  11. data/lib/wt_activerecord_index_spy/test_helpers.rb +1 -0
  12. data/lib/wt_activerecord_index_spy/test_models.rb +1 -0
  13. data/lib/wt_activerecord_index_spy/version.rb +2 -1
  14. data/lib/wt_activerecord_index_spy.rb +2 -0
  15. data/sorbet/config +3 -0
  16. data/sorbet/rbi/gems/activemodel.rbi +839 -0
  17. data/sorbet/rbi/gems/activerecord.rbi +5324 -0
  18. data/sorbet/rbi/gems/activesupport.rbi +1783 -0
  19. data/sorbet/rbi/gems/ast.rbi +49 -0
  20. data/sorbet/rbi/gems/byebug.rbi +1041 -0
  21. data/sorbet/rbi/gems/coderay.rbi +92 -0
  22. data/sorbet/rbi/gems/concurrent-ruby.rbi +1590 -0
  23. data/sorbet/rbi/gems/dotenv.rbi +68 -0
  24. data/sorbet/rbi/gems/faraday.rbi +544 -0
  25. data/sorbet/rbi/gems/gemfury.rbi +135 -0
  26. data/sorbet/rbi/gems/highline.rbi +567 -0
  27. data/sorbet/rbi/gems/i18n.rbi +445 -0
  28. data/sorbet/rbi/gems/method_source.rbi +64 -0
  29. data/sorbet/rbi/gems/minitest.rbi +420 -0
  30. data/sorbet/rbi/gems/multi_json.rbi +62 -0
  31. data/sorbet/rbi/gems/multipart-post.rbi +53 -0
  32. data/sorbet/rbi/gems/mysql2.rbi +114 -0
  33. data/sorbet/rbi/gems/netrc.rbi +51 -0
  34. data/sorbet/rbi/gems/parallel.rbi +83 -0
  35. data/sorbet/rbi/gems/parser.rbi +1431 -0
  36. data/sorbet/rbi/gems/pg.rbi +546 -0
  37. data/sorbet/rbi/gems/progressbar.rbi +14 -0
  38. data/sorbet/rbi/gems/pry-byebug.rbi +155 -0
  39. data/sorbet/rbi/gems/pry.rbi +1949 -0
  40. data/sorbet/rbi/gems/rainbow.rbi +118 -0
  41. data/sorbet/rbi/gems/rake.rbi +662 -0
  42. data/sorbet/rbi/gems/regexp_parser.rbi +926 -0
  43. data/sorbet/rbi/gems/rexml.rbi +599 -0
  44. data/sorbet/rbi/gems/rspec-core.rbi +1961 -0
  45. data/sorbet/rbi/gems/rspec-expectations.rbi +1148 -0
  46. data/sorbet/rbi/gems/rspec-mocks.rbi +1091 -0
  47. data/sorbet/rbi/gems/rspec-support.rbi +280 -0
  48. data/sorbet/rbi/gems/rspec.rbi +15 -0
  49. data/sorbet/rbi/gems/rubocop-ast.rbi +1372 -0
  50. data/sorbet/rbi/gems/rubocop-sorbet.rbi +197 -0
  51. data/sorbet/rbi/gems/rubocop.rbi +8089 -0
  52. data/sorbet/rbi/gems/ruby-progressbar.rbi +303 -0
  53. data/sorbet/rbi/gems/thor.rbi +525 -0
  54. data/sorbet/rbi/gems/tzinfo.rbi +588 -0
  55. data/sorbet/rbi/gems/unicode-display_width.rbi +20 -0
  56. data/sorbet/rbi/gems/zeitwerk.rbi +139 -0
  57. data/sorbet/rbi/hidden-definitions/errors.txt +15220 -0
  58. data/sorbet/rbi/hidden-definitions/hidden.rbi +28001 -0
  59. data/sorbet/rbi/sorbet-typed/lib/activemodel/all/activemodel.rbi +715 -0
  60. data/sorbet/rbi/sorbet-typed/lib/activerecord/>=5/activerecord.rbi +97 -0
  61. data/sorbet/rbi/sorbet-typed/lib/activerecord/>=5.2/activerecord.rbi +29 -0
  62. data/sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi +1674 -0
  63. data/sorbet/rbi/sorbet-typed/lib/activerecord/all/model_schema.rbi +79 -0
  64. data/sorbet/rbi/sorbet-typed/lib/activerecord/all/sanitization.rbi +36 -0
  65. data/sorbet/rbi/sorbet-typed/lib/activerecord/~>6.1.0.rc1/activerecord.rbi +502 -0
  66. data/sorbet/rbi/sorbet-typed/lib/activesupport/>=6/activesupport.rbi +37 -0
  67. data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +1850 -0
  68. data/sorbet/rbi/sorbet-typed/lib/faraday/all/faraday.rbi +756 -0
  69. data/sorbet/rbi/sorbet-typed/lib/minitest/all/minitest.rbi +108 -0
  70. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
  71. data/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi +645 -0
  72. data/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi +1891 -0
  73. data/sorbet/rbi/sorbet-typed/lib/rubocop/>=1.8/rubocop.rbi +12 -0
  74. data/sorbet/rbi/sorbet-typed/lib/thor/all/thor.rbi +905 -0
  75. data/sorbet/rbi/todo.rbi +10 -0
  76. data/sorbet.md +23 -0
  77. data/wt_activerecord_index_spy.gemspec +3 -0
  78. metadata +106 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80c60b9f84a74e7e6a712ab694cde7d9df2d7bd7b5f02c19e0203c0c3f6a337d
4
- data.tar.gz: c0997eb1f14fbf0a5a136cf977dd2778f02ef09f1951aa28fbdd933e6d47854e
3
+ metadata.gz: 13718502249b3f34cd531659645af8ef885271bfe20889b16c9a8987b1089a95
4
+ data.tar.gz: fa2414fb8ea022fb18c57dd7d4d449e93aec34339693a48336eb6113feadc7eb
5
5
  SHA512:
6
- metadata.gz: 95643efc73118307c0c090e5ce3c1887c2039e74b6049cebb0132ec0b57266783485f972bf7ba3f6f904240814eb2df978f7f484a5ee69b473d4e375886f8177
7
- data.tar.gz: be4478bfce890caeae51f703bed4e13772c60443b9bdb06172a6ed8f52fe5ab228d71c9e03f795a02eb7e49da4bb097fd1eed2e0869ab740e207253e259bc07f
6
+ metadata.gz: ebb5cf1c343b9c831dccf6eb611cf40937168d92b0fef5a0fc5cfc1f0dcb7ba9c4b7cf324857db588c0639ac468b2aa788877f0eee42873c3eb3de16b3a0d00c
7
+ data.tar.gz: 7d2b25ae8c834756741498560b2db3af0f1a3fd96af06b8eb72d34bb51fbecdfee7b4e14578edad84eb1ac9acf8e33c9e91a9decd11a29ea65c24bdfe5357b3b
@@ -33,6 +33,9 @@ jobs:
33
33
  run: |
34
34
  gem install bundler
35
35
  bundle install
36
+ - name: Typecheck
37
+ run: |
38
+ bundle exec srb tc
36
39
  - name: Create databases
37
40
  run: |
38
41
  sudo systemctl start mysql.service
data/.rubocop.yml CHANGED
@@ -1,3 +1,6 @@
1
+ require:
2
+ - rubocop-sorbet
3
+
1
4
  AllCops:
2
5
  TargetRubyVersion: 2.5
3
6
  SuggestExtensions: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.5.0
2
+ * Add Sorbet with a few type definitions
3
+
1
4
  ## 0.4.1
2
5
  * Fix issue with missing identifier from ActiveRecord (#21)
3
6
 
data/Rakefile CHANGED
@@ -11,20 +11,6 @@ RuboCop::RakeTask.new
11
11
 
12
12
  task default: %i[spec rubocop]
13
13
 
14
- Rake::Task["release:rubygem_push"].clear
15
- desc "Pick up the .gem file from pkg/ and push it to Gemfury"
16
- task "release:rubygem_push" do
17
- # IMPORTANT: You need to have the `fury` gem installed, and you need to be logged in.
18
- # Please DO READ about "impersonation", which is how you push to your company account instead
19
- # of your personal account!
20
- # https://gemfury.com/help/collaboration#impersonation
21
- paths = Dir.glob("#{__dir__}/pkg/*.gem")
22
- raise "Must have found only 1 .gem path, but found #{paths.inspect}" if paths.length != 1
23
-
24
- escaped_gem_path = Shellwords.escape(paths.shift)
25
- `fury push #{escaped_gem_path} --as=wetransfer`
26
- end
27
-
28
14
  namespace :db do
29
15
  require_relative "./spec/support/test_database"
30
16
  require "active_record"
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require "erb"
@@ -8,36 +9,59 @@ module WtActiverecordIndexSpy
8
9
  # Since it's not possible to be sure for every query, it separates the result
9
10
  # in certains and uncertains.
10
11
  class Aggregator
12
+ extend T::Sig
13
+
14
+ Results = T.type_alias { T::Hash[String, Item] }
15
+
16
+ sig {returns(Results)}
11
17
  attr_reader :results
12
18
 
13
- Item = Struct.new(:identifier, :query, :origin, :certainity_level, keyword_init: true)
19
+ class Item < T::Struct
20
+ prop :identifier, String
21
+ prop :query, String
22
+ prop :origin, String
23
+ prop :certainity_level, Symbol
24
+ end
14
25
 
26
+ sig {void}
15
27
  def initialize
16
- @results = {}
28
+ @results = T.let({}, Results)
17
29
  end
18
30
 
31
+ sig {void}
19
32
  def reset
20
33
  @results = {}
34
+ nil
21
35
  end
22
36
 
23
- # item: an instance of Aggregator::Item
37
+ sig {params(item: Item).returns(Item)}
24
38
  def add(item)
25
39
  @results[item.query] = item
26
40
  end
27
41
 
42
+ sig {returns(T::Array[Item])}
28
43
  def certain_results
29
44
  @results.map do |_query, item|
30
45
  item if item.certainity_level == :certain
31
46
  end.compact
32
47
  end
33
48
 
49
+ sig {returns(T::Array[Item])}
34
50
  def uncertain_results
35
51
  @results.map do |_query, item|
36
52
  item if item.certainity_level == :uncertain
37
53
  end.compact
38
54
  end
39
55
 
40
- def export_html_results(file, stdout: $stdout)
56
+ sig do
57
+ params(
58
+ file: T.nilable(T.any(File, Tempfile)),
59
+ stdout: IO
60
+ )
61
+ .void
62
+ .checked(:compiled)
63
+ end
64
+ def export_html_results(file=nil, stdout: $stdout)
41
65
  file ||= default_html_output_file
42
66
  content = ERB.new(File.read(File.join(File.dirname(__FILE__), "./results.html.erb")), 0, "-")
43
67
  .result_with_hash(certain_results: certain_results, uncertain_results: uncertain_results)
@@ -49,6 +73,7 @@ module WtActiverecordIndexSpy
49
73
 
50
74
  private
51
75
 
76
+ sig {returns(File)}
52
77
  def default_html_output_file
53
78
  File.new(
54
79
  File.join(Dir.tmpdir, "wt_activerecord_index_spy-results.html"),
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module WtActiverecordIndexSpy
@@ -8,7 +9,7 @@ module WtActiverecordIndexSpy
8
9
  # It gets each query that uses a WHERE statement and runs a EXPLAIN query to
9
10
  # see if it uses an index.
10
11
  class NotificationListener
11
- IGNORED_SQL = [
12
+ IGNORED_SQL = T.let([
12
13
  /^PRAGMA (?!(table_info))/,
13
14
  /^SELECT currval/,
14
15
  /^SELECT CAST/,
@@ -23,7 +24,7 @@ module WtActiverecordIndexSpy
23
24
  /^TRUNCATE TABLE/,
24
25
  /^EXPLAIN/,
25
26
  /FROM INFORMATION_SCHEMA/,
26
- ].freeze
27
+ ].freeze, T::Array[Regexp])
27
28
 
28
29
  attr_reader :queries_missing_index
29
30
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module WtActiverecordIndexSpy
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module WtActiverecordIndexSpy
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module WtActiverecordIndexSpy
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require "rspec/matchers"
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  # This class should not be required by the library because
@@ -1,5 +1,6 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module WtActiverecordIndexSpy
4
- VERSION = "0.4.1"
5
+ VERSION = "0.5.0"
5
6
  end
@@ -1,5 +1,7 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
4
+ require 'sorbet-runtime'
3
5
  require_relative "wt_activerecord_index_spy/version"
4
6
  require_relative "wt_activerecord_index_spy/aggregator"
5
7
  require_relative "wt_activerecord_index_spy/query_analyser"
data/sorbet/config ADDED
@@ -0,0 +1,3 @@
1
+ --dir
2
+ .
3
+ --ignore=/vendor/bundle
@@ -0,0 +1,839 @@
1
+ # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
+ # srb rbi gems
3
+
4
+ # typed: ignore
5
+ #
6
+ # If you would like to make changes to this file, great! Please create the gem's shim here:
7
+ #
8
+ # https://github.com/sorbet/sorbet-typed/new/master?filename=lib/activemodel/all/activemodel.rbi
9
+ #
10
+ # activemodel-6.1.3.2
11
+
12
+ module ActiveModel
13
+ def self.eager_load!; end
14
+ def self.gem_version; end
15
+ def self.version; end
16
+ extend ActiveSupport::Autoload
17
+ end
18
+ module ActiveModel::VERSION
19
+ end
20
+ module ActiveModel::Serializers
21
+ extend ActiveSupport::Autoload
22
+ end
23
+ class ActiveModel::Attribute
24
+ def ==(other); end
25
+ def _original_value_for_database; end
26
+ def assigned?; end
27
+ def came_from_user?; end
28
+ def changed?; end
29
+ def changed_from_assignment?; end
30
+ def changed_in_place?; end
31
+ def encode_with(coder); end
32
+ def eql?(other); end
33
+ def forgetting_assignment; end
34
+ def has_been_read?; end
35
+ def hash; end
36
+ def init_with(coder); end
37
+ def initialize(name, value_before_type_cast, type, original_attribute = nil, value = nil); end
38
+ def initialize_dup(other); end
39
+ def initialized?; end
40
+ def name; end
41
+ def original_attribute; end
42
+ def original_value; end
43
+ def original_value_for_database; end
44
+ def self.from_database(name, value_before_type_cast, type, value = nil); end
45
+ def self.from_user(name, value_before_type_cast, type, original_attribute = nil); end
46
+ def self.null(name); end
47
+ def self.uninitialized(name, type); end
48
+ def self.with_cast_value(name, value_before_type_cast, type); end
49
+ def type; end
50
+ def type_cast(*arg0); end
51
+ def value; end
52
+ def value_before_type_cast; end
53
+ def value_for_database; end
54
+ def with_cast_value(value); end
55
+ def with_type(type); end
56
+ def with_value_from_database(value); end
57
+ def with_value_from_user(value); end
58
+ end
59
+ class ActiveModel::Attribute::FromDatabase < ActiveModel::Attribute
60
+ def _original_value_for_database; end
61
+ def type_cast(value); end
62
+ end
63
+ class ActiveModel::Attribute::FromUser < ActiveModel::Attribute
64
+ def came_from_user?; end
65
+ def type_cast(value); end
66
+ end
67
+ class ActiveModel::Attribute::WithCastValue < ActiveModel::Attribute
68
+ def changed_in_place?; end
69
+ def type_cast(value); end
70
+ end
71
+ class ActiveModel::Attribute::Null < ActiveModel::Attribute
72
+ def initialize(name); end
73
+ def type_cast(*arg0); end
74
+ def with_cast_value(value); end
75
+ def with_type(type); end
76
+ def with_value_from_database(value); end
77
+ def with_value_from_user(value); end
78
+ end
79
+ class ActiveModel::Attribute::Uninitialized < ActiveModel::Attribute
80
+ def forgetting_assignment; end
81
+ def initialize(name, type); end
82
+ def initialized?; end
83
+ def original_value; end
84
+ def value; end
85
+ def value_for_database; end
86
+ def with_type(type); end
87
+ end
88
+ class ActiveModel::AttributeSet
89
+ def ==(other); end
90
+ def [](name); end
91
+ def []=(name, value); end
92
+ def accessed; end
93
+ def attributes; end
94
+ def deep_dup; end
95
+ def default_attribute(name); end
96
+ def each_value(**, &&); end
97
+ def except(**, &&); end
98
+ def fetch(**, &&); end
99
+ def fetch_value(name, &block); end
100
+ def freeze; end
101
+ def initialize(attributes); end
102
+ def initialize_clone(_); end
103
+ def initialize_dup(_); end
104
+ def key?(name); end
105
+ def keys; end
106
+ def map(&block); end
107
+ def reset(key); end
108
+ def to_h; end
109
+ def to_hash; end
110
+ def values_before_type_cast; end
111
+ def write_cast_value(name, value); end
112
+ def write_from_database(name, value); end
113
+ def write_from_user(name, value); end
114
+ end
115
+ class ActiveModel::AttributeSet::Builder
116
+ def build_from_database(values = nil, additional_types = nil); end
117
+ def default_attributes; end
118
+ def initialize(types, default_attributes = nil); end
119
+ def types; end
120
+ end
121
+ class ActiveModel::LazyAttributeSet < ActiveModel::AttributeSet
122
+ def additional_types; end
123
+ def attributes; end
124
+ def default_attribute(name, value_present = nil, value = nil); end
125
+ def default_attributes; end
126
+ def fetch_value(name, &block); end
127
+ def initialize(values, types, additional_types, default_attributes, attributes = nil); end
128
+ def key?(name); end
129
+ def keys; end
130
+ def types; end
131
+ def values; end
132
+ end
133
+ class ActiveModel::LazyAttributeHash
134
+ def ==(other); end
135
+ def [](key); end
136
+ def []=(key, value); end
137
+ def additional_types; end
138
+ def assign_default_value(name); end
139
+ def deep_dup; end
140
+ def default_attributes; end
141
+ def delegate_hash; end
142
+ def each_key(&block); end
143
+ def each_value(**, &&); end
144
+ def except(**, &&); end
145
+ def fetch(**, &&); end
146
+ def initialize(types, values, additional_types, default_attributes, delegate_hash = nil); end
147
+ def initialize_dup(_); end
148
+ def key?(key); end
149
+ def marshal_dump; end
150
+ def marshal_load(values); end
151
+ def materialize; end
152
+ def transform_values(**, &&); end
153
+ def types; end
154
+ def values; end
155
+ end
156
+ class ActiveModel::AttributeSet::YAMLEncoder
157
+ def decode(coder); end
158
+ def default_types; end
159
+ def encode(attribute_set, coder); end
160
+ def initialize(default_types); end
161
+ end
162
+ class ActiveModel::Error
163
+ def ==(other); end
164
+ def attribute; end
165
+ def attributes_for_hash; end
166
+ def base; end
167
+ def detail; end
168
+ def details; end
169
+ def eql?(other); end
170
+ def full_message; end
171
+ def hash; end
172
+ def i18n_customize_full_message; end
173
+ def i18n_customize_full_message=(arg0); end
174
+ def i18n_customize_full_message?; end
175
+ def initialize(base, attribute, type = nil, **options); end
176
+ def initialize_dup(other); end
177
+ def inspect; end
178
+ def match?(attribute, type = nil, **options); end
179
+ def message; end
180
+ def options; end
181
+ def raw_type; end
182
+ def self.full_message(attribute, message, base); end
183
+ def self.generate_message(attribute, type, base, options); end
184
+ def self.i18n_customize_full_message; end
185
+ def self.i18n_customize_full_message=(value); end
186
+ def self.i18n_customize_full_message?; end
187
+ def strict_match?(attribute, type, **options); end
188
+ def type; end
189
+ end
190
+ class ActiveModel::NestedError < ActiveModel::Error
191
+ def initialize(base, inner_error, override_options = nil); end
192
+ def inner_error; end
193
+ def message(*args, &block); end
194
+ extend Forwardable
195
+ end
196
+ class ActiveModel::Errors
197
+ def [](attribute); end
198
+ def add(attribute, type = nil, **options); end
199
+ def add_from_legacy_details_hash(details); end
200
+ def added?(attribute, type = nil, options = nil); end
201
+ def any?(*args, &block); end
202
+ def as_json(options = nil); end
203
+ def attribute_names; end
204
+ def blank?(*args, &block); end
205
+ def clear(*args, &block); end
206
+ def copy!(other); end
207
+ def count(*args, &block); end
208
+ def delete(attribute, type = nil, **options); end
209
+ def deprecation_removal_warning(method_name, alternative_message = nil); end
210
+ def deprecation_rename_warning(old_method_name, new_method_name); end
211
+ def details; end
212
+ def each(&block); end
213
+ def empty?(*args, &block); end
214
+ def errors; end
215
+ def full_message(attribute, message); end
216
+ def full_messages; end
217
+ def full_messages_for(attribute); end
218
+ def generate_message(attribute, type = nil, options = nil); end
219
+ def group_by_attribute; end
220
+ def has_key?(attribute); end
221
+ def import(error, override_options = nil); end
222
+ def include?(attribute); end
223
+ def init_with(coder); end
224
+ def initialize(base); end
225
+ def initialize_dup(other); end
226
+ def key?(attribute); end
227
+ def keys; end
228
+ def marshal_load(array); end
229
+ def merge!(other); end
230
+ def messages; end
231
+ def messages_for(attribute); end
232
+ def normalize_arguments(attribute, type, **options); end
233
+ def objects; end
234
+ def of_kind?(attribute, type = nil); end
235
+ def size(*args, &block); end
236
+ def slice!(*keys); end
237
+ def to_a; end
238
+ def to_h; end
239
+ def to_hash(full_messages = nil); end
240
+ def to_xml(options = nil); end
241
+ def uniq!(*args, &block); end
242
+ def values; end
243
+ def where(attribute, type = nil, **options); end
244
+ extend Forwardable
245
+ include Enumerable
246
+ end
247
+ class ActiveModel::DeprecationHandlingMessageHash < SimpleDelegator
248
+ def []=(attribute, value); end
249
+ def delete(attribute); end
250
+ def initialize(errors); end
251
+ def prepare_content; end
252
+ end
253
+ class ActiveModel::DeprecationHandlingMessageArray < SimpleDelegator
254
+ def <<(message); end
255
+ def clear; end
256
+ def initialize(content, errors, attribute); end
257
+ end
258
+ class ActiveModel::DeprecationHandlingDetailsHash < SimpleDelegator
259
+ def initialize(details); end
260
+ end
261
+ class ActiveModel::StrictValidationFailed < StandardError
262
+ end
263
+ class ActiveModel::RangeError < RangeError
264
+ end
265
+ class ActiveModel::UnknownAttributeError < NoMethodError
266
+ def attribute; end
267
+ def initialize(record, attribute); end
268
+ def record; end
269
+ end
270
+ class ActiveModel::MissingAttributeError < NoMethodError
271
+ end
272
+ module ActiveModel::AttributeMethods
273
+ def _read_attribute(attr); end
274
+ def attribute_method?(attr_name); end
275
+ def attribute_missing(match, *args, &block); end
276
+ def matched_attribute_method(method_name); end
277
+ def method_missing(method, *args, &block); end
278
+ def missing_attribute(attr_name, stack); end
279
+ def respond_to?(method, include_private_methods = nil); end
280
+ def respond_to_without_attributes?(*arg0); end
281
+ extend ActiveSupport::Concern
282
+ end
283
+ module ActiveModel::AttributeMethods::ClassMethods
284
+ def alias_attribute(new_name, old_name); end
285
+ def attribute_alias(name); end
286
+ def attribute_alias?(new_name); end
287
+ def attribute_method_affix(*affixes); end
288
+ def attribute_method_matchers_cache; end
289
+ def attribute_method_matchers_matching(method_name); end
290
+ def attribute_method_prefix(*prefixes); end
291
+ def attribute_method_suffix(*suffixes); end
292
+ def define_attribute_method(attr_name, _owner: nil); end
293
+ def define_attribute_methods(*attr_names); end
294
+ def define_proxy_call(include_private, code_generator, name, target, *extra); end
295
+ def generated_attribute_methods; end
296
+ def instance_method_already_implemented?(method_name); end
297
+ def undefine_attribute_methods; end
298
+ end
299
+ class ActiveModel::AttributeMethods::ClassMethods::CodeGenerator
300
+ def <<(source_line); end
301
+ def execute; end
302
+ def initialize(owner, path, line); end
303
+ def rename_method(old_name, new_name); end
304
+ def self.batch(owner, path, line); end
305
+ end
306
+ class ActiveModel::AttributeMethods::ClassMethods::AttributeMethodMatcher
307
+ def initialize(options = nil); end
308
+ def match(method_name); end
309
+ def method_name(attr_name); end
310
+ def prefix; end
311
+ def suffix; end
312
+ def target; end
313
+ end
314
+ class ActiveModel::AttributeMethods::ClassMethods::AttributeMethodMatcher::AttributeMethodMatch < Struct
315
+ def attr_name; end
316
+ def attr_name=(_); end
317
+ def self.[](*arg0); end
318
+ def self.inspect; end
319
+ def self.members; end
320
+ def self.new(*arg0); end
321
+ def target; end
322
+ def target=(_); end
323
+ end
324
+ module ActiveModel::AttributeMethods::AttrNames
325
+ def self.define_attribute_accessor_method(owner, attr_name, writer: nil); end
326
+ end
327
+ class ActiveModel::Attribute::UserProvidedDefault < ActiveModel::Attribute::FromUser
328
+ def initialize(name, value, type, database_default); end
329
+ def marshal_dump; end
330
+ def marshal_load(values); end
331
+ def user_provided_value; end
332
+ def value_before_type_cast; end
333
+ def with_type(type); end
334
+ end
335
+ class ActiveModel::Name
336
+ def !~(**, &&); end
337
+ def <=>(**, &&); end
338
+ def ==(arg); end
339
+ def ===(arg); end
340
+ def =~(**, &&); end
341
+ def _singularize(string); end
342
+ def as_json(**, &&); end
343
+ def cache_key; end
344
+ def collection; end
345
+ def collection=(arg0); end
346
+ def element; end
347
+ def element=(arg0); end
348
+ def eql?(**, &&); end
349
+ def human(options = nil); end
350
+ def i18n_key; end
351
+ def i18n_key=(arg0); end
352
+ def initialize(klass, namespace = nil, name = nil); end
353
+ def match?(**, &&); end
354
+ def name; end
355
+ def name=(arg0); end
356
+ def param_key; end
357
+ def param_key=(arg0); end
358
+ def plural; end
359
+ def plural=(arg0); end
360
+ def route_key; end
361
+ def route_key=(arg0); end
362
+ def singular; end
363
+ def singular=(arg0); end
364
+ def singular_route_key; end
365
+ def singular_route_key=(arg0); end
366
+ def to_s(**, &&); end
367
+ def to_str(**, &&); end
368
+ include Comparable
369
+ end
370
+ module ActiveModel::Naming
371
+ def model_name; end
372
+ def self.extended(base); end
373
+ def self.model_name_from_record_or_class(record_or_class); end
374
+ def self.param_key(record_or_class); end
375
+ def self.plural(record_or_class); end
376
+ def self.route_key(record_or_class); end
377
+ def self.singular(record_or_class); end
378
+ def self.singular_route_key(record_or_class); end
379
+ def self.uncountable?(record_or_class); end
380
+ end
381
+ module ActiveModel::Translation
382
+ def human_attribute_name(attribute, options = nil); end
383
+ def i18n_scope; end
384
+ def lookup_ancestors; end
385
+ include ActiveModel::Naming
386
+ end
387
+ module ActiveModel::Type
388
+ def self.default_value; end
389
+ def self.lookup(*args, **kwargs); end
390
+ def self.register(type_name, klass = nil, **options, &block); end
391
+ def self.registry; end
392
+ def self.registry=(arg0); end
393
+ end
394
+ module ActiveModel::Type::Helpers
395
+ end
396
+ class ActiveModel::Type::Helpers::AcceptsMultiparameterTime < Module
397
+ def initialize(defaults: nil); end
398
+ end
399
+ module ActiveModel::Type::Helpers::AcceptsMultiparameterTime::InstanceMethods
400
+ def assert_valid_value(value); end
401
+ def cast(value); end
402
+ def serialize(value); end
403
+ def value_constructed_by_mass_assignment?(value); end
404
+ end
405
+ module ActiveModel::Type::Helpers::Numeric
406
+ def cast(value); end
407
+ def changed?(old_value, _new_value, new_value_before_type_cast); end
408
+ def non_numeric_string?(value); end
409
+ def number_to_non_number?(old_value, new_value_before_type_cast); end
410
+ def serialize(value); end
411
+ end
412
+ module ActiveModel::Type::Helpers::Mutable
413
+ def cast(value); end
414
+ def changed_in_place?(raw_old_value, new_value); end
415
+ end
416
+ module ActiveModel::Type::Helpers::TimeValue
417
+ def apply_seconds_precision(value); end
418
+ def fast_string_to_time(string); end
419
+ def new_time(year, mon, mday, hour, min, sec, microsec, offset = nil); end
420
+ def serialize(value); end
421
+ def type_cast_for_schema(value); end
422
+ def user_input_in_time_zone(value); end
423
+ end
424
+ module ActiveModel::Type::Helpers::Timezone
425
+ def default_timezone; end
426
+ def is_utc?; end
427
+ end
428
+ class ActiveModel::Type::Value
429
+ def ==(other); end
430
+ def assert_valid_value(_); end
431
+ def binary?; end
432
+ def cast(value); end
433
+ def cast_value(value); end
434
+ def changed?(old_value, new_value, _new_value_before_type_cast); end
435
+ def changed_in_place?(raw_old_value, new_value); end
436
+ def deserialize(value); end
437
+ def eql?(other); end
438
+ def force_equality?(_value); end
439
+ def hash; end
440
+ def initialize(precision: nil, limit: nil, scale: nil); end
441
+ def limit; end
442
+ def map(value); end
443
+ def precision; end
444
+ def scale; end
445
+ def serializable?(value); end
446
+ def serialize(value); end
447
+ def type; end
448
+ def type_cast_for_schema(value); end
449
+ def value_constructed_by_mass_assignment?(_value); end
450
+ end
451
+ class ActiveModel::Type::Integer < ActiveModel::Type::Value
452
+ def _limit; end
453
+ def cast_value(value); end
454
+ def deserialize(value); end
455
+ def ensure_in_range(value); end
456
+ def in_range?(value); end
457
+ def initialize(**arg0); end
458
+ def max_value; end
459
+ def min_value; end
460
+ def range; end
461
+ def serializable?(value); end
462
+ def serialize(value); end
463
+ def type; end
464
+ include ActiveModel::Type::Helpers::Numeric
465
+ end
466
+ class ActiveModel::Type::BigInteger < ActiveModel::Type::Integer
467
+ def max_value; end
468
+ end
469
+ class ActiveModel::Type::Binary < ActiveModel::Type::Value
470
+ def binary?; end
471
+ def cast(value); end
472
+ def changed_in_place?(raw_old_value, value); end
473
+ def serialize(value); end
474
+ def type; end
475
+ end
476
+ class ActiveModel::Type::Binary::Data
477
+ def ==(other); end
478
+ def hex; end
479
+ def initialize(value); end
480
+ def to_s; end
481
+ def to_str; end
482
+ end
483
+ class ActiveModel::Type::Boolean < ActiveModel::Type::Value
484
+ def cast_value(value); end
485
+ def serialize(value); end
486
+ def type; end
487
+ end
488
+ class ActiveModel::Type::Date < ActiveModel::Type::Value
489
+ def cast_value(value); end
490
+ def fallback_string_to_date(string); end
491
+ def fast_string_to_date(string); end
492
+ def new_date(year, mon, mday); end
493
+ def type; end
494
+ def type_cast_for_schema(value); end
495
+ def value_from_multiparameter_assignment(*arg0); end
496
+ include ActiveModel::Type::Helpers::Timezone
497
+ include Anonymous_ActiveModel_Type_Helpers_AcceptsMultiparameterTime_2
498
+ end
499
+ module Anonymous_ActiveModel_Type_Helpers_AcceptsMultiparameterTime_2
500
+ def value_from_multiparameter_assignment(values_hash); end
501
+ include ActiveModel::Type::Helpers::AcceptsMultiparameterTime::InstanceMethods
502
+ end
503
+ class ActiveModel::Type::DateTime < ActiveModel::Type::Value
504
+ def cast_value(value); end
505
+ def fallback_string_to_time(string); end
506
+ def microseconds(time); end
507
+ def type; end
508
+ def value_from_multiparameter_assignment(values_hash); end
509
+ include ActiveModel::Type::Helpers::TimeValue
510
+ include ActiveModel::Type::Helpers::Timezone
511
+ include Anonymous_ActiveModel_Type_Helpers_AcceptsMultiparameterTime_3
512
+ end
513
+ module Anonymous_ActiveModel_Type_Helpers_AcceptsMultiparameterTime_3
514
+ def value_from_multiparameter_assignment(values_hash); end
515
+ include ActiveModel::Type::Helpers::AcceptsMultiparameterTime::InstanceMethods
516
+ end
517
+ class ActiveModel::Type::Decimal < ActiveModel::Type::Value
518
+ def apply_scale(value); end
519
+ def cast_value(value); end
520
+ def convert_float_to_big_decimal(value); end
521
+ def float_precision; end
522
+ def type; end
523
+ def type_cast_for_schema(value); end
524
+ include ActiveModel::Type::Helpers::Numeric
525
+ end
526
+ class ActiveModel::Type::Float < ActiveModel::Type::Value
527
+ def cast_value(value); end
528
+ def type; end
529
+ def type_cast_for_schema(value); end
530
+ include ActiveModel::Type::Helpers::Numeric
531
+ end
532
+ class ActiveModel::Type::ImmutableString < ActiveModel::Type::Value
533
+ def cast_value(value); end
534
+ def initialize(**args); end
535
+ def serialize(value); end
536
+ def type; end
537
+ end
538
+ class ActiveModel::Type::String < ActiveModel::Type::ImmutableString
539
+ def cast_value(value); end
540
+ def changed_in_place?(raw_old_value, new_value); end
541
+ def to_immutable_string; end
542
+ end
543
+ class ActiveModel::Type::Time < ActiveModel::Type::Value
544
+ def cast_value(value); end
545
+ def type; end
546
+ def user_input_in_time_zone(value); end
547
+ include ActiveModel::Type::Helpers::TimeValue
548
+ include ActiveModel::Type::Helpers::Timezone
549
+ include Anonymous_ActiveModel_Type_Helpers_AcceptsMultiparameterTime_4
550
+ end
551
+ module Anonymous_ActiveModel_Type_Helpers_AcceptsMultiparameterTime_4
552
+ def value_from_multiparameter_assignment(values_hash); end
553
+ include ActiveModel::Type::Helpers::AcceptsMultiparameterTime::InstanceMethods
554
+ end
555
+ class ActiveModel::Type::Registry
556
+ def find_registration(symbol, *args, **kwargs); end
557
+ def initialize; end
558
+ def initialize_dup(other); end
559
+ def lookup(symbol, *args, **kwargs); end
560
+ def register(type_name, klass = nil, **options, &block); end
561
+ def registration_klass; end
562
+ def registrations; end
563
+ end
564
+ class ActiveModel::Type::Registration
565
+ def block; end
566
+ def call(_registry, *args, **kwargs); end
567
+ def initialize(name, block, **arg2); end
568
+ def matches?(type_name, *args, **kwargs); end
569
+ def name; end
570
+ end
571
+ class ActiveModel::ForbiddenAttributesError < StandardError
572
+ end
573
+ module ActiveModel::ForbiddenAttributesProtection
574
+ def sanitize_for_mass_assignment(attributes); end
575
+ def sanitize_forbidden_attributes(attributes); end
576
+ end
577
+ module ActiveModel::AttributeAssignment
578
+ def _assign_attribute(k, v); end
579
+ def _assign_attributes(attributes); end
580
+ def assign_attributes(new_attributes); end
581
+ def attributes=(new_attributes); end
582
+ include ActiveModel::ForbiddenAttributesProtection
583
+ end
584
+ module ActiveModel::Conversion
585
+ def to_key; end
586
+ def to_model; end
587
+ def to_param; end
588
+ def to_partial_path; end
589
+ extend ActiveSupport::Concern
590
+ end
591
+ module ActiveModel::Conversion::ClassMethods
592
+ def _to_partial_path; end
593
+ end
594
+ module ActiveModel::Validations
595
+ def errors; end
596
+ def initialize_dup(other); end
597
+ def invalid?(context = nil); end
598
+ def raise_validation_error; end
599
+ def read_attribute_for_validation(*arg0); end
600
+ def run_validations!; end
601
+ def valid?(context = nil); end
602
+ def validate!(context = nil); end
603
+ def validate(context = nil); end
604
+ def validates_with(*args, &block); end
605
+ extend ActiveSupport::Concern
606
+ end
607
+ module ActiveModel::Validations::ClassMethods
608
+ def _parse_validates_options(options); end
609
+ def _validates_default_keys; end
610
+ def attribute_method?(attribute); end
611
+ def clear_validators!; end
612
+ def inherited(base); end
613
+ def validate(*args, &block); end
614
+ def validates!(*attributes); end
615
+ def validates(*attributes); end
616
+ def validates_each(*attr_names, &block); end
617
+ def validates_with(*args, &block); end
618
+ def validators; end
619
+ def validators_on(*attributes); end
620
+ end
621
+ module ActiveModel::Validations::Clusivity
622
+ def check_validity!; end
623
+ def delimiter; end
624
+ def include?(record, value); end
625
+ def inclusion_method(enumerable); end
626
+ end
627
+ class ActiveModel::Validator
628
+ def initialize(options = nil); end
629
+ def kind; end
630
+ def options; end
631
+ def self.kind; end
632
+ def validate(record); end
633
+ end
634
+ class ActiveModel::EachValidator < ActiveModel::Validator
635
+ def attributes; end
636
+ def check_validity!; end
637
+ def initialize(options); end
638
+ def prepare_value_for_validation(value, record, attr_name); end
639
+ def validate(record); end
640
+ def validate_each(record, attribute, value); end
641
+ end
642
+ class ActiveModel::BlockValidator < ActiveModel::EachValidator
643
+ def initialize(options, &block); end
644
+ def validate_each(record, attribute, value); end
645
+ end
646
+ class ActiveModel::Validations::InclusionValidator < ActiveModel::EachValidator
647
+ def validate_each(record, attribute, value); end
648
+ include ActiveModel::Validations::Clusivity
649
+ end
650
+ module ActiveModel::Validations::HelperMethods
651
+ def _merge_attributes(attr_names); end
652
+ def validates_absence_of(*attr_names); end
653
+ def validates_acceptance_of(*attr_names); end
654
+ def validates_confirmation_of(*attr_names); end
655
+ def validates_exclusion_of(*attr_names); end
656
+ def validates_format_of(*attr_names); end
657
+ def validates_inclusion_of(*attr_names); end
658
+ def validates_length_of(*attr_names); end
659
+ def validates_numericality_of(*attr_names); end
660
+ def validates_presence_of(*attr_names); end
661
+ def validates_size_of(*attr_names); end
662
+ end
663
+ class ActiveModel::Validations::AbsenceValidator < ActiveModel::EachValidator
664
+ def validate_each(record, attr_name, value); end
665
+ end
666
+ class ActiveModel::Validations::NumericalityValidator < ActiveModel::EachValidator
667
+ def allow_only_integer?(record); end
668
+ def check_validity!; end
669
+ def filtered_options(value); end
670
+ def is_hexadecimal_literal?(raw_value); end
671
+ def is_integer?(raw_value); end
672
+ def is_number?(raw_value, precision, scale); end
673
+ def parse_as_number(raw_value, precision, scale); end
674
+ def parse_float(raw_value, precision, scale); end
675
+ def prepare_value_for_validation(value, record, attr_name); end
676
+ def record_attribute_changed_in_place?(record, attr_name); end
677
+ def round(raw_value, scale); end
678
+ def validate_each(record, attr_name, value, precision: nil, scale: nil); end
679
+ end
680
+ module ActiveModel::Validations::Callbacks
681
+ def run_validations!; end
682
+ extend ActiveSupport::Concern
683
+ end
684
+ module ActiveModel::Validations::Callbacks::ClassMethods
685
+ def after_validation(*args, &block); end
686
+ def before_validation(*args, &block); end
687
+ def set_options_for_callback(options); end
688
+ end
689
+ class ActiveModel::Validations::ExclusionValidator < ActiveModel::EachValidator
690
+ def validate_each(record, attribute, value); end
691
+ include ActiveModel::Validations::Clusivity
692
+ end
693
+ class ActiveModel::Validations::ConfirmationValidator < ActiveModel::EachValidator
694
+ def confirmation_value_equal?(record, attribute, value, confirmed); end
695
+ def initialize(options); end
696
+ def setup!(klass); end
697
+ def validate_each(record, attribute, value); end
698
+ end
699
+ class ActiveModel::Validations::FormatValidator < ActiveModel::EachValidator
700
+ def check_options_validity(name); end
701
+ def check_validity!; end
702
+ def option_call(record, name); end
703
+ def record_error(record, attribute, name, value); end
704
+ def regexp_using_multiline_anchors?(regexp); end
705
+ def validate_each(record, attribute, value); end
706
+ end
707
+ class ActiveModel::Validations::PresenceValidator < ActiveModel::EachValidator
708
+ def validate_each(record, attr_name, value); end
709
+ end
710
+ class ActiveModel::Validations::LengthValidator < ActiveModel::EachValidator
711
+ def check_validity!; end
712
+ def initialize(options); end
713
+ def skip_nil_check?(key); end
714
+ def validate_each(record, attribute, value); end
715
+ end
716
+ class ActiveModel::Validations::AcceptanceValidator < ActiveModel::EachValidator
717
+ def acceptable_option?(value); end
718
+ def initialize(options); end
719
+ def setup!(klass); end
720
+ def validate_each(record, attribute, value); end
721
+ end
722
+ class ActiveModel::Validations::AcceptanceValidator::LazilyDefineAttributes < Module
723
+ def ==(other); end
724
+ def attributes; end
725
+ def define_on(klass); end
726
+ def included(klass); end
727
+ def initialize(attributes); end
728
+ def matches?(method_name); end
729
+ end
730
+ class ActiveModel::Validations::WithValidator < ActiveModel::EachValidator
731
+ def validate_each(record, attr, val); end
732
+ end
733
+ class ActiveModel::ValidationError < StandardError
734
+ def initialize(model); end
735
+ def model; end
736
+ end
737
+ module ActiveModel::Callbacks
738
+ def _define_after_model_callback(klass, callback); end
739
+ def _define_around_model_callback(klass, callback); end
740
+ def _define_before_model_callback(klass, callback); end
741
+ def define_model_callbacks(*callbacks); end
742
+ def self.extended(base); end
743
+ end
744
+ class ActiveModel::AttributeMutationTracker
745
+ def any_changes?; end
746
+ def attr_names; end
747
+ def attribute_changed?(attr_name); end
748
+ def attributes; end
749
+ def change_to_attribute(attr_name); end
750
+ def changed?(attr_name, from: nil, to: nil); end
751
+ def changed_attribute_names; end
752
+ def changed_in_place?(attr_name); end
753
+ def changed_values; end
754
+ def changes; end
755
+ def fetch_value(attr_name); end
756
+ def force_change(attr_name); end
757
+ def forced_changes; end
758
+ def forget_change(attr_name); end
759
+ def initialize(attributes); end
760
+ def original_value(attr_name); end
761
+ end
762
+ class ActiveModel::ForcedMutationTracker < ActiveModel::AttributeMutationTracker
763
+ def attr_names; end
764
+ def attribute_changed?(attr_name); end
765
+ def change_to_attribute(attr_name); end
766
+ def changed_in_place?(attr_name); end
767
+ def clone_value(attr_name); end
768
+ def fetch_value(attr_name); end
769
+ def finalize_changes; end
770
+ def finalized_changes; end
771
+ def force_change(attr_name); end
772
+ def forget_change(attr_name); end
773
+ def initialize(attributes); end
774
+ def original_value(attr_name); end
775
+ end
776
+ class ActiveModel::NullMutationTracker
777
+ def any_changes?; end
778
+ def change_to_attribute(attr_name); end
779
+ def changed?(attr_name, **arg1); end
780
+ def changed_attribute_names; end
781
+ def changed_in_place?(attr_name); end
782
+ def changed_values; end
783
+ def changes; end
784
+ def original_value(attr_name); end
785
+ def self.allocate; end
786
+ def self.new(*arg0); end
787
+ extend Singleton::SingletonClassMethods
788
+ include Singleton
789
+ end
790
+ module ActiveModel::Dirty
791
+ def attribute_change(attr_name); end
792
+ def attribute_changed?(attr_name, **options); end
793
+ def attribute_changed_in_place?(attr_name); end
794
+ def attribute_previous_change(attr_name); end
795
+ def attribute_previously_changed?(attr_name, **options); end
796
+ def attribute_previously_was(attr_name); end
797
+ def attribute_was(attr_name); end
798
+ def attribute_will_change!(attr_name); end
799
+ def changed; end
800
+ def changed?; end
801
+ def changed_attributes; end
802
+ def changes; end
803
+ def changes_applied; end
804
+ def clear_attribute_change(attr_name); end
805
+ def clear_attribute_changes(attr_names); end
806
+ def clear_changes_information; end
807
+ def forget_attribute_assignments; end
808
+ def initialize_dup(other); end
809
+ def mutations_before_last_save; end
810
+ def mutations_from_database; end
811
+ def previous_changes; end
812
+ def restore_attribute!(attr_name); end
813
+ def restore_attributes(attr_names = nil); end
814
+ extend ActiveSupport::Concern
815
+ include ActiveModel::AttributeMethods
816
+ end
817
+ module ActiveModel::SecurePassword
818
+ def self.min_cost; end
819
+ def self.min_cost=(arg0); end
820
+ extend ActiveSupport::Concern
821
+ end
822
+ module ActiveModel::SecurePassword::ClassMethods
823
+ def has_secure_password(attribute = nil, validations: nil); end
824
+ end
825
+ class ActiveModel::SecurePassword::InstanceMethodsOnActivation < Module
826
+ def initialize(attribute); end
827
+ end
828
+ module ActiveModel::Serialization
829
+ def read_attribute_for_serialization(*arg0); end
830
+ def serializable_add_includes(options = nil); end
831
+ def serializable_attributes(attribute_names); end
832
+ def serializable_hash(options = nil); end
833
+ end
834
+ module ActiveModel::Serializers::JSON
835
+ def as_json(options = nil); end
836
+ def from_json(json, include_root = nil); end
837
+ extend ActiveSupport::Concern
838
+ include ActiveModel::Serialization
839
+ end