orthoses-rails 0.9.0 → 1.1.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +20 -65
  3. data/lib/generators/orthoses/rails/install_generator.rb +18 -0
  4. data/lib/generators/orthoses/rails/templates/rails.rake +31 -0
  5. data/lib/orthoses/active_record/belongs_to.rb +15 -4
  6. data/lib/orthoses/active_record/enum.rb +5 -0
  7. data/lib/orthoses/active_record/generated_attribute_methods.rb +47 -55
  8. data/lib/orthoses/active_record/has_many.rb +15 -4
  9. data/lib/orthoses/active_record/has_one.rb +12 -2
  10. data/lib/orthoses/active_record/relation.rb +56 -0
  11. data/lib/orthoses/active_record/secure_token.rb +28 -0
  12. data/lib/orthoses/active_record.rb +37 -0
  13. data/lib/orthoses/active_storage/attached/model.rb +47 -0
  14. data/lib/orthoses/active_storage.rb +3 -0
  15. data/lib/orthoses/active_support/aliasing.rb +34 -0
  16. data/lib/orthoses/active_support/delegation.rb +17 -6
  17. data/lib/orthoses/active_support/time_with_zone.rb +30 -21
  18. data/lib/orthoses/active_support.rb +1 -0
  19. data/lib/orthoses/rails/application.rb +47 -0
  20. data/lib/orthoses/rails/version.rb +1 -1
  21. data/lib/orthoses/rails.rb +4 -2
  22. metadata +13 -45
  23. data/examples/rails/Gemfile +0 -16
  24. data/examples/rails/Gemfile.lock +0 -179
  25. data/examples/rails/Rakefile +0 -328
  26. data/examples/rails/config/database.yml +0 -8
  27. data/examples/rails/config/storage.yml +0 -3
  28. data/examples/rails/known_sig/actionpack/7.0/action_controller/metal.rbs +0 -4
  29. data/examples/rails/known_sig/activemodel/7.0/active_model/serialization.rbs +0 -4
  30. data/examples/rails/known_sig/activemodel/7.0/active_model/validations.rbs +0 -4
  31. data/examples/rails/known_sig/activerecord/6.0/_active_record_relation.rbs +0 -49
  32. data/examples/rails/known_sig/activerecord/6.0/_active_record_relation_class_methods.rbs +0 -45
  33. data/examples/rails/known_sig/activerecord/6.0/active_record/result.rbs +0 -5
  34. data/examples/rails/known_sig/activerecord/6.1/_active_record_relation.rbs +0 -49
  35. data/examples/rails/known_sig/activerecord/6.1/_active_record_relation_class_methods.rbs +0 -45
  36. data/examples/rails/known_sig/activerecord/6.1/active_record/result.rbs +0 -5
  37. data/examples/rails/known_sig/activerecord/7.0/_active_record_relation.rbs +0 -49
  38. data/examples/rails/known_sig/activerecord/7.0/_active_record_relation_class_methods.rbs +0 -45
  39. data/examples/rails/known_sig/activerecord/7.0/active_record/encryption/context.rbs +0 -9
  40. data/examples/rails/known_sig/activerecord/7.0/active_record/result.rbs +0 -5
  41. data/examples/rails/known_sig/activesupport/7.0/active_support/callbacks/callback_chain.rbs +0 -9
  42. data/examples/rails/known_sig/activesupport/7.0/active_support/duration.rbs +0 -4
  43. data/examples/rails/known_sig/activesupport/7.0/active_support/hash_with_indifferent_access.rbs +0 -6
  44. data/examples/rails/known_sig/activesupport/7.0/active_support/multibyte/chars.rbs +0 -7
  45. data/examples/rails/known_sig/activesupport/7.0/active_support/time_with_zone.rbs +0 -5
  46. data/examples/rails/known_sig/activesupport/7.0/active_support/time_zone.rbs +0 -3
  47. data/examples/rails/known_sig/activesupport/7.0/date.rbs +0 -6
  48. data/examples/rails/known_sig/activesupport/7.0/date_and_time/zones.rbs +0 -4
  49. data/examples/rails/known_sig/activesupport/7.0/hash_with_indifferent_access.rbs +0 -2
  50. data/examples/rails/known_sig/activesupport/7.0/integer.rbs +0 -9
  51. data/examples/rails/known_sig/activesupport/7.0/numeric.rbs +0 -15
  52. data/examples/rails/known_sig/activesupport/7.0/string.rbs +0 -4
  53. data/examples/rails/known_sig/activesupport/7.0/time.rbs +0 -46
  54. data/examples/rails/tasks/action_pack.rake +0 -141
  55. data/examples/rails/tasks/action_view.rake +0 -77
  56. data/examples/rails/tasks/active_job.rake +0 -99
  57. data/examples/rails/tasks/active_model.rake +0 -46
  58. data/examples/rails/tasks/active_record.rake +0 -88
  59. data/examples/rails/tasks/active_storage.rake +0 -94
  60. data/examples/rails/tasks/active_support.rake +0 -99
  61. data/examples/rails/tasks/railties.rake +0 -34
  62. data/orthoses-rails.gemspec +0 -36
@@ -20,14 +20,16 @@ module Orthoses
20
20
  delegate.captures.each do |capture|
21
21
  receiver_name = Utils.module_name(capture.method.receiver) or next
22
22
  receiver_content = store[receiver_name]
23
+ prefix = capture.argument[:private] ? "private " : ""
23
24
 
24
25
  case capture.argument[:to]
26
+ # delegate :foo, to: Foo
25
27
  when Module
26
28
  to_module_name = Utils.module_name(capture.argument[:to]) or next
27
29
  capture.argument[:methods].each do |arg|
28
30
  if sig = resource.build_signature(to_module_name, arg, :singleton, false)
29
31
  receiver_content << "# defined by `delegate` to: #{to_module_name}"
30
- receiver_content << sig
32
+ receiver_content << "#{prefix}#{sig}"
31
33
  else
32
34
  Orthoses.logger.warn("[ActiveSupport::Delegation] Ignore since missing type for #{to_module_name}.#{arg.inspect} in #{capture.argument.inspect}")
33
35
  end
@@ -35,20 +37,28 @@ module Orthoses
35
37
  else
36
38
  to_name = capture.argument[:to].to_s.to_sym
37
39
  tag, to_return_type = resource.find(receiver_name, to_name, :instance, false)
38
- raise "bug" if tag == :multi
40
+ if tag == :multi
41
+ to_return_type = if to_return_type.length == 1
42
+ to_return_type.first.type.return_type
43
+ else
44
+ nil
45
+ end
46
+ end
39
47
 
40
48
  case to_return_type
41
49
  when nil, RBS::Types::Bases::Any
50
+ # no type found
42
51
  capture.argument[:methods].each do |method|
43
52
  receiver_content << "# defined by `delegate` to: #{to_return_type}##{to_name}"
44
- receiver_content << "def #{method}: (*untyped, **untyped) -> untyped"
53
+ receiver_content << "#{prefix}def #{method}: (*untyped, **untyped) -> untyped"
45
54
  end
46
55
  else
56
+ # found return type in store or env
47
57
  to_typename = to_return_type.name.relative!.to_s
48
58
  capture.argument[:methods].each do |method|
49
59
  if sig = resource.build_signature(to_typename, method, :instance, true)
50
60
  receiver_content << "# defined by `delegate` to #{to_return_type}##{to_name}"
51
- receiver_content << sig
61
+ receiver_content << "#{prefix}#{sig}"
52
62
  else
53
63
  Orthoses.logger.warn("[ActiveSupport::Delegation] Ignore since missing type for #{to_typename}##{method.inspect} in #{capture.argument.inspect}")
54
64
  end
@@ -73,6 +83,7 @@ module Orthoses
73
83
  typename = TypeName(mod_name).absolute!
74
84
 
75
85
  if definition_method = build_definition(typename, kind)&.methods&.[](name)
86
+ # found in env
76
87
  return [:multi, definition_method.defs.map(&:type)]
77
88
  end
78
89
  resolve_type_by_name(@store[mod_name].to_decl.members, name, kind, argument)
@@ -85,7 +96,7 @@ module Orthoses
85
96
  when :singleton
86
97
  @definition_builder.build_singleton(typename)
87
98
  else
88
- raise "big"
99
+ raise "bug"
89
100
  end
90
101
  rescue RuntimeError => e
91
102
  if e.message.match?(/\AUnknown name for/)
@@ -115,7 +126,7 @@ module Orthoses
115
126
  when RBS::AST::Members::MethodDefinition
116
127
  next unless member.name == name && member.kind == kind
117
128
  if argument
118
- return [:multi, member.types]
129
+ return [:multi, member.overloads.map { |o| o.method_type }]
119
130
  else
120
131
  method_type = member.overloads.map(&:method_type).find do |method_type|
121
132
  method_type.type.required_positionals.empty? && method_type.type.required_keywords.empty?
@@ -13,6 +13,7 @@ module Orthoses
13
13
  store = @loader.call
14
14
 
15
15
  time_with_zone_store = store["ActiveSupport::TimeWithZone"]
16
+ time_with_zone_store.body.replace(filter_decl(time_with_zone_store))
16
17
  each_line_from_core_time_definition(store) do |line|
17
18
  time_with_zone_store << line
18
19
  end
@@ -22,19 +23,28 @@ module Orthoses
22
23
 
23
24
  private
24
25
 
25
- NOT_DELEGATE_METHODS = Set.new(%i[
26
- utc
27
- getgm
28
- getutc
29
- gmtime
30
- localtime
31
- ])
32
-
33
26
  TYPE_MERGE_METHODS = Set.new(%i[
34
27
  +
35
28
  -
36
29
  ])
37
30
 
31
+ TIME_MODULES = [
32
+ TypeName("::Time"),
33
+ TypeName("::DateAndTime::Zones"),
34
+ TypeName("::DateAndTime::Calculations"),
35
+ TypeName("::DateAndTime::Compatibility")
36
+ ]
37
+
38
+ def filter_decl(time_with_zone_store)
39
+ writer = RBS::Writer.new(out: StringIO.new)
40
+ time_with_zone_store.to_decl.members.each do |member|
41
+ # ActiveSupport::TimeWithZone.name has been deprecated
42
+ next if member.instance_of?(RBS::AST::Members::MethodDefinition) && member.kind == :singleton && member.name == :name
43
+ writer.write_member(member)
44
+ end
45
+ writer.out.string.each_line.to_a
46
+ end
47
+
38
48
  def add_signature(env, content)
39
49
  buffer, directives, decls = RBS::Parser.parse_signature(content.to_rbs)
40
50
  env.add_signature(buffer: buffer, directives: directives, decls: decls)
@@ -56,35 +66,34 @@ module Orthoses
56
66
  add_signature(env, store["ActiveSupport::TimeWithZone"])
57
67
 
58
68
  builder = RBS::DefinitionBuilder.new(env: env.resolve_type_names)
59
- one_ancestors = builder.ancestor_builder.one_instance_ancestors(type_name_time)
60
- one_ancestors.included_modules.each do |included_module|
61
- yield "include #{included_module.source.name}"
62
- end
63
69
  twz_methods = builder.build_instance(type_name_time_with_zone).methods
64
70
  builder.build_instance(type_name_time).methods.each do |sym, definition_method|
71
+ next if twz_methods.has_key?(sym) && !TYPE_MERGE_METHODS.include?(sym)
65
72
  next if !definition_method.public?
66
- definition_method.defs.reject! do |type_def|
67
- type_def.implemented_in != type_name_time
73
+
74
+ # delegate to ::Time method
75
+ definition_method.defs.select! do |type_def|
76
+ TIME_MODULES.include?(type_def.implemented_in)
68
77
  end
69
78
  next if definition_method.defs.empty?
70
79
 
71
- if !NOT_DELEGATE_METHODS.include?(sym)
72
- definition_method.method_types.each do |method_type|
73
- rt = method_type.type.return_type
74
- if rt.instance_of?(RBS::Types::ClassInstance) && rt.name.to_s == "::Time"
75
- rt.instance_variable_set(:@name, RBS::Types::Bases::Self.new(location: nil))
76
- end
80
+ definition_method.method_types.each do |method_type|
81
+ rt = method_type.type.return_type
82
+ if rt.instance_of?(RBS::Types::ClassInstance) && rt.name.to_s == "::Time"
83
+ rt.instance_variable_set(:@name, RBS::Types::Bases::Self.new(location: nil))
77
84
  end
78
85
  end
79
86
 
80
87
  if definition_method.alias_of.nil?
81
88
  method_types = definition_method.method_types
82
89
 
90
+ # merge method types (e.g. :+, :-
91
+ # TimeWithZone -delegate-> Time(core_ext) -delegate-> Time(core)
83
92
  if TYPE_MERGE_METHODS.include?(sym)
84
93
  if twz_definition_method = twz_methods[sym]
85
94
  twz_definition_method.defs.each do |type_def|
86
95
  if type_def.implemented_in == type_name_time_with_zone
87
- method_types << type_def.type
96
+ method_types.unshift(type_def.type)
88
97
  end
89
98
  end
90
99
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'active_support/aliasing'
3
4
  require_relative 'active_support/class_attribute'
4
5
  require_relative 'active_support/concern'
5
6
  require_relative 'active_support/configurable'
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Orthoses
4
+ module Rails
5
+ class Application
6
+ class Loader
7
+ def call
8
+ ::Rails.application.initialize!
9
+ ::Rails.application.eager_load!
10
+ end
11
+ end
12
+
13
+ def initialize(loader)
14
+ @loader = loader
15
+ end
16
+
17
+ def call
18
+ loader = @loader
19
+ Orthoses::Builder.new do
20
+ use Orthoses::ActiveModel::HasSecurePassword
21
+
22
+ use Orthoses::ActiveRecord::BelongsTo
23
+ use Orthoses::ActiveRecord::DelegatedType
24
+ use Orthoses::ActiveRecord::Enum
25
+ use Orthoses::ActiveRecord::GeneratedAttributeMethods
26
+ use Orthoses::ActiveRecord::HasMany
27
+ use Orthoses::ActiveRecord::HasOne
28
+ use Orthoses::ActiveRecord::Relation
29
+ use Orthoses::ActiveRecord::Scope
30
+ use Orthoses::ActiveRecord::SecureToken
31
+
32
+ if defined?(::ActiveStorage)
33
+ use Orthoses::ActiveStorage::Attached::Model
34
+ end
35
+
36
+ use Orthoses::ActiveSupport::Aliasing
37
+ use Orthoses::ActiveSupport::ClassAttribute
38
+ use Orthoses::ActiveSupport::Concern
39
+ use Orthoses::ActiveSupport::Delegation
40
+ use Orthoses::ActiveSupport::Configurable
41
+ use Orthoses::ActiveSupport::MattrAccessor
42
+ reset_runner loader
43
+ end.call
44
+ end
45
+ end
46
+ end
47
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Orthoses
4
4
  module Rails
5
- VERSION = "0.9.0"
5
+ VERSION = "1.1.0"
6
6
  end
7
7
  end
@@ -2,9 +2,11 @@
2
2
 
3
3
  require 'orthoses'
4
4
 
5
- require_relative "rails/version"
6
-
7
5
  require_relative 'active_model'
8
6
  require_relative 'active_record'
7
+ require_relative 'active_storage'
9
8
  require_relative 'active_support'
10
9
  require_relative 'railties'
10
+
11
+ require_relative "rails/application"
12
+ require_relative "rails/version"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orthoses-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-02 00:00:00.000000000 Z
11
+ date: 2023-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: orthoses
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.6'
19
+ version: '1.10'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.6'
26
+ version: '1.10'
27
27
  description: Orthoses middleware collection for Ruby on Rails
28
28
  email:
29
29
  - co000ri@gmail.com
@@ -34,45 +34,8 @@ files:
34
34
  - CODE_OF_CONDUCT.md
35
35
  - LICENSE.txt
36
36
  - README.md
37
- - examples/rails/Gemfile
38
- - examples/rails/Gemfile.lock
39
- - examples/rails/Rakefile
40
- - examples/rails/config/database.yml
41
- - examples/rails/config/storage.yml
42
- - examples/rails/known_sig/actionpack/7.0/action_controller/metal.rbs
43
- - examples/rails/known_sig/activemodel/7.0/active_model/serialization.rbs
44
- - examples/rails/known_sig/activemodel/7.0/active_model/validations.rbs
45
- - examples/rails/known_sig/activerecord/6.0/_active_record_relation.rbs
46
- - examples/rails/known_sig/activerecord/6.0/_active_record_relation_class_methods.rbs
47
- - examples/rails/known_sig/activerecord/6.0/active_record/result.rbs
48
- - examples/rails/known_sig/activerecord/6.1/_active_record_relation.rbs
49
- - examples/rails/known_sig/activerecord/6.1/_active_record_relation_class_methods.rbs
50
- - examples/rails/known_sig/activerecord/6.1/active_record/result.rbs
51
- - examples/rails/known_sig/activerecord/7.0/_active_record_relation.rbs
52
- - examples/rails/known_sig/activerecord/7.0/_active_record_relation_class_methods.rbs
53
- - examples/rails/known_sig/activerecord/7.0/active_record/encryption/context.rbs
54
- - examples/rails/known_sig/activerecord/7.0/active_record/result.rbs
55
- - examples/rails/known_sig/activesupport/7.0/active_support/callbacks/callback_chain.rbs
56
- - examples/rails/known_sig/activesupport/7.0/active_support/duration.rbs
57
- - examples/rails/known_sig/activesupport/7.0/active_support/hash_with_indifferent_access.rbs
58
- - examples/rails/known_sig/activesupport/7.0/active_support/multibyte/chars.rbs
59
- - examples/rails/known_sig/activesupport/7.0/active_support/time_with_zone.rbs
60
- - examples/rails/known_sig/activesupport/7.0/active_support/time_zone.rbs
61
- - examples/rails/known_sig/activesupport/7.0/date.rbs
62
- - examples/rails/known_sig/activesupport/7.0/date_and_time/zones.rbs
63
- - examples/rails/known_sig/activesupport/7.0/hash_with_indifferent_access.rbs
64
- - examples/rails/known_sig/activesupport/7.0/integer.rbs
65
- - examples/rails/known_sig/activesupport/7.0/numeric.rbs
66
- - examples/rails/known_sig/activesupport/7.0/string.rbs
67
- - examples/rails/known_sig/activesupport/7.0/time.rbs
68
- - examples/rails/tasks/action_pack.rake
69
- - examples/rails/tasks/action_view.rake
70
- - examples/rails/tasks/active_job.rake
71
- - examples/rails/tasks/active_model.rake
72
- - examples/rails/tasks/active_record.rake
73
- - examples/rails/tasks/active_storage.rake
74
- - examples/rails/tasks/active_support.rake
75
- - examples/rails/tasks/railties.rake
37
+ - lib/generators/orthoses/rails/install_generator.rb
38
+ - lib/generators/orthoses/rails/templates/rails.rake
76
39
  - lib/orthoses-rails.rb
77
40
  - lib/orthoses/active_model.rb
78
41
  - lib/orthoses/active_model/has_secure_password.rb
@@ -84,8 +47,13 @@ files:
84
47
  - lib/orthoses/active_record/has_many.rb
85
48
  - lib/orthoses/active_record/has_one.rb
86
49
  - lib/orthoses/active_record/query_methods.rb
50
+ - lib/orthoses/active_record/relation.rb
87
51
  - lib/orthoses/active_record/scope.rb
52
+ - lib/orthoses/active_record/secure_token.rb
53
+ - lib/orthoses/active_storage.rb
54
+ - lib/orthoses/active_storage/attached/model.rb
88
55
  - lib/orthoses/active_support.rb
56
+ - lib/orthoses/active_support/aliasing.rb
89
57
  - lib/orthoses/active_support/class_attribute.rb
90
58
  - lib/orthoses/active_support/concern.rb
91
59
  - lib/orthoses/active_support/configurable.rb
@@ -93,10 +61,10 @@ files:
93
61
  - lib/orthoses/active_support/mattr_accessor.rb
94
62
  - lib/orthoses/active_support/time_with_zone.rb
95
63
  - lib/orthoses/rails.rb
64
+ - lib/orthoses/rails/application.rb
96
65
  - lib/orthoses/rails/version.rb
97
66
  - lib/orthoses/railties.rb
98
67
  - lib/orthoses/railties/mixin.rb
99
- - orthoses-rails.gemspec
100
68
  - sig/orthoses/rails.rbs
101
69
  homepage: https://github.com/ksss/orthoses-rails
102
70
  licenses:
@@ -120,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
88
  - !ruby/object:Gem::Version
121
89
  version: '0'
122
90
  requirements: []
123
- rubygems_version: 3.4.6
91
+ rubygems_version: 3.4.10
124
92
  signing_key:
125
93
  specification_version: 4
126
94
  summary: Orthoses middleware collection for Ruby on Rails
@@ -1,16 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- ruby ">= 3.1.0"
4
-
5
- gemspec path: '../../'
6
-
7
- gem "rails", path: "_src"
8
- gem "sqlite3"
9
- # gem "orthoses", path: "../../../orthoses"
10
-
11
- if RUBY_VERSION >= "3.1"
12
- gem "net-smtp", require: false
13
- gem "net-imap", require: false
14
- gem "net-pop", require: false
15
- gem "psych", "~> 3"
16
- end
@@ -1,179 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- orthoses-rails (0.7.0)
5
- orthoses (~> 1.0)
6
-
7
- PATH
8
- remote: _src
9
- specs:
10
- actioncable (7.0.3.1)
11
- actionpack (= 7.0.3.1)
12
- activesupport (= 7.0.3.1)
13
- nio4r (~> 2.0)
14
- websocket-driver (>= 0.6.1)
15
- actionmailbox (7.0.3.1)
16
- actionpack (= 7.0.3.1)
17
- activejob (= 7.0.3.1)
18
- activerecord (= 7.0.3.1)
19
- activestorage (= 7.0.3.1)
20
- activesupport (= 7.0.3.1)
21
- mail (>= 2.7.1)
22
- net-imap
23
- net-pop
24
- net-smtp
25
- actionmailer (7.0.3.1)
26
- actionpack (= 7.0.3.1)
27
- actionview (= 7.0.3.1)
28
- activejob (= 7.0.3.1)
29
- activesupport (= 7.0.3.1)
30
- mail (~> 2.5, >= 2.5.4)
31
- net-imap
32
- net-pop
33
- net-smtp
34
- rails-dom-testing (~> 2.0)
35
- actionpack (7.0.3.1)
36
- actionview (= 7.0.3.1)
37
- activesupport (= 7.0.3.1)
38
- rack (~> 2.0, >= 2.2.0)
39
- rack-test (>= 0.6.3)
40
- rails-dom-testing (~> 2.0)
41
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
42
- actiontext (7.0.3.1)
43
- actionpack (= 7.0.3.1)
44
- activerecord (= 7.0.3.1)
45
- activestorage (= 7.0.3.1)
46
- activesupport (= 7.0.3.1)
47
- globalid (>= 0.6.0)
48
- nokogiri (>= 1.8.5)
49
- actionview (7.0.3.1)
50
- activesupport (= 7.0.3.1)
51
- builder (~> 3.1)
52
- erubi (~> 1.4)
53
- rails-dom-testing (~> 2.0)
54
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
55
- activejob (7.0.3.1)
56
- activesupport (= 7.0.3.1)
57
- globalid (>= 0.3.6)
58
- activemodel (7.0.3.1)
59
- activesupport (= 7.0.3.1)
60
- activerecord (7.0.3.1)
61
- activemodel (= 7.0.3.1)
62
- activesupport (= 7.0.3.1)
63
- activestorage (7.0.3.1)
64
- actionpack (= 7.0.3.1)
65
- activejob (= 7.0.3.1)
66
- activerecord (= 7.0.3.1)
67
- activesupport (= 7.0.3.1)
68
- marcel (~> 1.0)
69
- mini_mime (>= 1.1.0)
70
- activesupport (7.0.3.1)
71
- concurrent-ruby (~> 1.0, >= 1.0.2)
72
- i18n (>= 1.6, < 2)
73
- minitest (>= 5.1)
74
- tzinfo (~> 2.0)
75
- rails (7.0.3.1)
76
- actioncable (= 7.0.3.1)
77
- actionmailbox (= 7.0.3.1)
78
- actionmailer (= 7.0.3.1)
79
- actionpack (= 7.0.3.1)
80
- actiontext (= 7.0.3.1)
81
- actionview (= 7.0.3.1)
82
- activejob (= 7.0.3.1)
83
- activemodel (= 7.0.3.1)
84
- activerecord (= 7.0.3.1)
85
- activestorage (= 7.0.3.1)
86
- activesupport (= 7.0.3.1)
87
- bundler (>= 1.15.0)
88
- railties (= 7.0.3.1)
89
- railties (7.0.3.1)
90
- actionpack (= 7.0.3.1)
91
- activesupport (= 7.0.3.1)
92
- method_source
93
- rake (>= 12.2)
94
- thor (~> 1.0)
95
- zeitwerk (~> 2.5)
96
-
97
- GEM
98
- remote: https://rubygems.org/
99
- specs:
100
- builder (3.2.4)
101
- concurrent-ruby (1.1.10)
102
- crass (1.0.6)
103
- digest (3.1.0)
104
- erubi (1.11.0)
105
- globalid (1.0.0)
106
- activesupport (>= 5.0)
107
- i18n (1.12.0)
108
- concurrent-ruby (~> 1.0)
109
- loofah (2.18.0)
110
- crass (~> 1.0.2)
111
- nokogiri (>= 1.5.9)
112
- mail (2.7.1)
113
- mini_mime (>= 0.1.1)
114
- marcel (1.0.2)
115
- method_source (1.0.0)
116
- mini_mime (1.1.2)
117
- mini_portile2 (2.8.0)
118
- minitest (5.16.3)
119
- net-imap (0.2.3)
120
- digest
121
- net-protocol
122
- strscan
123
- net-pop (0.1.1)
124
- digest
125
- net-protocol
126
- timeout
127
- net-protocol (0.1.3)
128
- timeout
129
- net-smtp (0.3.1)
130
- digest
131
- net-protocol
132
- timeout
133
- nio4r (2.5.8)
134
- nokogiri (1.13.8)
135
- mini_portile2 (~> 2.8.0)
136
- racc (~> 1.4)
137
- orthoses (1.0.0)
138
- rbs (~> 2.0)
139
- psych (3.3.3)
140
- racc (1.6.0)
141
- rack (2.2.4)
142
- rack-test (2.0.2)
143
- rack (>= 1.3)
144
- rails-dom-testing (2.0.3)
145
- activesupport (>= 4.2.0)
146
- nokogiri (>= 1.6)
147
- rails-html-sanitizer (1.4.3)
148
- loofah (~> 2.3)
149
- rake (13.0.6)
150
- rbs (2.6.0)
151
- sqlite3 (1.5.0)
152
- mini_portile2 (~> 2.8.0)
153
- strscan (3.0.4)
154
- thor (1.2.1)
155
- timeout (0.3.0)
156
- tzinfo (2.0.5)
157
- concurrent-ruby (~> 1.0)
158
- websocket-driver (0.7.5)
159
- websocket-extensions (>= 0.1.0)
160
- websocket-extensions (0.1.5)
161
- zeitwerk (2.6.0)
162
-
163
- PLATFORMS
164
- arm64-darwin-21
165
-
166
- DEPENDENCIES
167
- net-imap
168
- net-pop
169
- net-smtp
170
- orthoses-rails!
171
- psych (~> 3)
172
- rails!
173
- sqlite3
174
-
175
- RUBY VERSION
176
- ruby 3.1.1p18
177
-
178
- BUNDLED WITH
179
- 2.3.16