orthoses-rails 1.3.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc7b416eba2452375317a5c028aeae285d135ee8c8ef4129f28170f46d0090d9
4
- data.tar.gz: 71148b9456d3038c6960611ac78e764590f8becd9376e1d136fb06549e80a378
3
+ metadata.gz: 5819282d03a6e3fe410434be4dac07eed3fff60677d013c37ce268c7a259e9fa
4
+ data.tar.gz: c8a9a445d6e629057b1db47ad08b5472cb4456bc8454071c9ef711e0d10ef100
5
5
  SHA512:
6
- metadata.gz: 6abe5dd4e76632c6039a20da11e44e63851713a4793e31661e246ce00d1de36ced9c0ecfe182efe2108df2e59c54e00cadf4d857eb1e7c447dd36d289de068b5
7
- data.tar.gz: 6e1df2008c803ffa594d2fc96312ef9d97bda0570339604a40b47e8ff35c94118dd7ed2ca1cf77f7316cf3464ba7cbdc9ec438d182a4099983c0625ece69024c
6
+ metadata.gz: dd864af949021445b9780e5d95282447e391b0099b90121ece4d58278944ab06264dfeaa25134801386f6e1c7629053d32c6b346d3acde0e1946a004bd3b0c6d
7
+ data.tar.gz: 72bcdf7904a00596006d405edadbd2fd9d4fe8d1f3c7d6bb8c2929600fff6f1b996ed574a69f1666de504fb27393af0afa2dbd98a055f4dc984d2d8c66024283
@@ -22,7 +22,7 @@ namespace :orthoses do
22
22
  # By using this middleware, you can add the capability
23
23
  # to generate type information from YARD documentation.
24
24
  # use Orthoses::YARD,
25
- # parse: ['{app/lib}/**/*.rb']
25
+ # parse: ['{app,lib}/**/*.rb']
26
26
 
27
27
  # You can load hand written RBS.
28
28
  # use Orthoses::LoadRBS,
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Orthoses
4
+ module ActionMailer
5
+ class Base
6
+ def initialize(loader)
7
+ @loader = loader
8
+ end
9
+
10
+ def call
11
+ @loader.call.tap do |store|
12
+ ::ActionMailer::Base.descendants.each do |mailer_class|
13
+ base_name = Utils.module_name(mailer_class) or next
14
+ content = store[base_name]
15
+ mailer_class.action_methods.each do |action_method|
16
+ method_object = mailer_class.instance_method(action_method)
17
+ parameters = method_parameters_to_rbs_method_type(method_object).to_s.gsub(' -> untyped', '')
18
+ content << "def self.#{action_method}: #{parameters} -> ::ActionMailer::MessageDelivery"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def method_parameters_to_rbs_method_type(method_object)
27
+ required_positionals = []
28
+ optional_positionals = []
29
+ rest_positionals = nil
30
+ trailing_positionals = []
31
+ required_keywords = {}
32
+ optional_keywords = {}
33
+ rest_keywords = nil
34
+ requireds = required_positionals
35
+ block = nil
36
+ untyped = RBS::Types::Bases::Any.new(location: nil)
37
+
38
+ method_object.parameters.each do |kind, name|
39
+ case kind
40
+ when :req
41
+ requireds << ::RBS::Types::Function::Param.new(name: name, type: untyped)
42
+ when :opt
43
+ requireds = trailing_positionals
44
+ optional_positionals << ::RBS::Types::Function::Param.new(name: name, type: untyped)
45
+ when :rest
46
+ requireds = trailing_positionals
47
+ name = nil if name == :*
48
+ rest_positionals = ::RBS::Types::Function::Param.new(name: name, type: untyped)
49
+ when :keyreq
50
+ required_keywords[name] = ::RBS::Types::Function::Param.new(name: nil, type: untyped)
51
+ when :key
52
+ optional_keywords[name] = ::RBS::Types::Function::Param.new(name: nil, type: untyped)
53
+ when :keyrest
54
+ rest_keywords = ::RBS::Types::Function::Param.new(name: name, type: untyped)
55
+ when :block
56
+ block = RBS::Types::Block.new(
57
+ type: RBS::Types::Function.empty(untyped).update(rest_positionals: RBS::Types::Function::Param.new(name: nil, type: untyped)),
58
+ required: true,
59
+ self_type: nil
60
+ )
61
+ else
62
+ raise "bug"
63
+ end
64
+ end
65
+
66
+ function = ::RBS::Types::Function.new(
67
+ required_positionals: required_positionals,
68
+ optional_positionals: optional_positionals,
69
+ rest_positionals: rest_positionals,
70
+ trailing_positionals: trailing_positionals,
71
+ required_keywords: required_keywords,
72
+ optional_keywords: optional_keywords,
73
+ rest_keywords: rest_keywords,
74
+ return_type: untyped,
75
+ )
76
+ ::RBS::MethodType.new(
77
+ location: nil,
78
+ type_params: [],
79
+ type: function,
80
+ block: block
81
+ )
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'action_mailer/base'
@@ -33,7 +33,16 @@ module Orthoses
33
33
  attribute.captures.each do |capture|
34
34
  receiver_name = Utils.module_name(capture.method.receiver) or next
35
35
  name = capture.argument[:name]
36
- cast_type = capture.argument[:cast_type] || capture.argument[:type]
36
+ active_model_version = Gem::Version.new(::ActiveModel::VERSION::STRING)
37
+ cast_type =
38
+ if active_model_version >= Gem::Version.new('7.1')
39
+ # https://github.com/rails/rails/commit/608cbfae36b125d7962b7ed9083c9e9e6ce70b88
40
+ capture.argument[:*].first
41
+ elsif active_model_version >= Gem::Version.new('7.0')
42
+ capture.argument[:cast_type]
43
+ else
44
+ capture.argument[:type]
45
+ end
37
46
 
38
47
  return_type = DEFAULT_TYPES[cast_type] || 'untyped'
39
48
 
@@ -4,8 +4,6 @@ module Orthoses
4
4
  module ActiveRecord
5
5
  class GeneratedAttributeMethods
6
6
  TARGET_TYPE_MAP = {
7
- "attribute" => "() -> %<type>s",
8
- "attribute=" => "(%<type>s) -> %<type>s",
9
7
  "attribute?" => "() -> bool",
10
8
  "attribute_before_last_save" => "() -> %<opt>s",
11
9
  "attribute_before_type_cast" => "() -> %<type>s",
@@ -50,13 +48,14 @@ module Orthoses
50
48
  opt = "#{req}?"
51
49
  type = col.null ? opt : req
52
50
 
53
- ::ActiveRecord::Base.attribute_method_matchers.each do |matcher|
54
- tmpl = TARGET_TYPE_MAP[matcher.target]
51
+ lines << "attr_accessor #{name}: #{type}"
52
+ attribute_method_patterns(::ActiveRecord::Base).each do |matcher|
53
+ tmpl = TARGET_TYPE_MAP[matcher.proxy_target] or next
55
54
  lines << "def #{matcher.method_name(name)}: #{tmpl % {type: type, opt: opt}}"
56
55
  end
57
56
  end
58
57
  klass.attribute_aliases.each do |alias_name, column_name|
59
- ::ActiveRecord::Base.attribute_method_matchers.each do |matcher|
58
+ attribute_method_patterns(::ActiveRecord::Base).each do |matcher|
60
59
  lines << "alias #{matcher.method_name(alias_name)} #{matcher.method_name(column_name)}"
61
60
  end
62
61
  end
@@ -69,6 +68,20 @@ module Orthoses
69
68
  end
70
69
  end
71
70
  end
71
+
72
+ private
73
+
74
+ def attribute_method_patterns(const)
75
+ if const.respond_to?(:attribute_method_patterns)
76
+ const.attribute_method_patterns
77
+ else
78
+ const.attribute_method_matchers.each do |matcher|
79
+ def matcher.proxy_target
80
+ target
81
+ end
82
+ end
83
+ end
84
+ end
72
85
  end
73
86
  end
74
87
  end
@@ -20,7 +20,7 @@ module Orthoses
20
20
  name = capture.argument[:name]
21
21
  body = capture.argument[:body]
22
22
 
23
- definition = "#{name}: #{parameters_to_type(body.parameters)} -> #{base_name}::ActiveRecord_Relation"
23
+ definition = "#{name}: #{parameters_to_type(parameters(body))} -> #{base_name}::ActiveRecord_Relation"
24
24
  store[base_name] << "def self.#{definition}"
25
25
  store["#{base_name}::GeneratedRelationMethods"].header = "module #{base_name}::GeneratedRelationMethods"
26
26
  store["#{base_name}::GeneratedRelationMethods"] << "def #{definition}"
@@ -47,9 +47,9 @@ module Orthoses
47
47
  when :key
48
48
  res << "?#{name}: untyped"
49
49
  when :rest
50
- res << "*untyped #{name}"
50
+ res << "*untyped"
51
51
  when :keyrest
52
- res << "**untyped #{name}"
52
+ res << "**untyped"
53
53
  when :block
54
54
  block = " { (*untyped) -> untyped }"
55
55
  else
@@ -58,6 +58,14 @@ module Orthoses
58
58
  end
59
59
  "(#{res.join(", ")})#{block}"
60
60
  end
61
+
62
+ def parameters(body)
63
+ if body.respond_to?(:to_proc)
64
+ body.to_proc.parameters
65
+ else
66
+ body.method(:call).parameters
67
+ end
68
+ end
61
69
  end
62
70
  end
63
71
  end
@@ -36,7 +36,7 @@ module Orthoses
36
36
  def members_prototype_of(mod_name)
37
37
  mod = Object.const_get(mod_name)
38
38
  runtime = ::RBS::Prototype::Runtime.new(patterns: nil, env: nil, merge: false)
39
- type_name = runtime.to_type_name(mod_name)
39
+ type_name = TypeName(mod_name)
40
40
  [].tap do |members|
41
41
  runtime.generate_methods(mod, type_name, members)
42
42
  end
@@ -28,12 +28,26 @@ module Orthoses
28
28
  -
29
29
  ])
30
30
 
31
- TIME_MODULES = [
31
+ TIME_MODULES = Set.new([
32
32
  TypeName("::Time"),
33
33
  TypeName("::DateAndTime::Zones"),
34
34
  TypeName("::DateAndTime::Calculations"),
35
35
  TypeName("::DateAndTime::Compatibility")
36
- ]
36
+ ])
37
+
38
+ NONEED_METHODS = Set.new(%i[
39
+ freeze
40
+ hash
41
+ eql?
42
+ method_missing
43
+ respond_to?
44
+ respond_to_missing?
45
+ is_a?
46
+ marshal_dump
47
+ marshal_load
48
+ to_json
49
+ < > <= >=
50
+ ])
37
51
 
38
52
  def filter_decl(time_with_zone_store)
39
53
  writer = RBS::Writer.new(out: StringIO.new)
@@ -68,7 +82,7 @@ module Orthoses
68
82
  builder = RBS::DefinitionBuilder.new(env: env.resolve_type_names)
69
83
  twz_methods = builder.build_instance(type_name_time_with_zone).methods
70
84
  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)
85
+ next if NONEED_METHODS.include?(sym)
72
86
  next if !definition_method.public?
73
87
 
74
88
  # delegate to ::Time method
@@ -17,6 +17,8 @@ module Orthoses
17
17
  def call
18
18
  loader = @loader
19
19
  Orthoses::Builder.new do
20
+ use Orthoses::ActionMailer::Base
21
+
20
22
  use Orthoses::ActiveModel::Attributes
21
23
  use Orthoses::ActiveModel::HasSecurePassword
22
24
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Orthoses
4
4
  module Rails
5
- VERSION = "1.3.0"
5
+ VERSION = "1.5.0"
6
6
  end
7
7
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'orthoses'
4
4
 
5
+ require_relative 'action_mailer'
5
6
  require_relative 'active_model'
6
7
  require_relative 'active_record'
7
8
  require_relative 'active_storage'
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: 1.3.0
4
+ version: 1.5.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-09-21 00:00:00.000000000 Z
11
+ date: 2024-04-11 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.11'
19
+ version: '1.13'
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.11'
26
+ version: '1.13'
27
27
  description: Orthoses middleware collection for Ruby on Rails
28
28
  email:
29
29
  - co000ri@gmail.com
@@ -37,6 +37,8 @@ files:
37
37
  - lib/generators/orthoses/rails/install_generator.rb
38
38
  - lib/generators/orthoses/rails/templates/rails.rake
39
39
  - lib/orthoses-rails.rb
40
+ - lib/orthoses/action_mailer.rb
41
+ - lib/orthoses/action_mailer/base.rb
40
42
  - lib/orthoses/active_model.rb
41
43
  - lib/orthoses/active_model/attributes.rb
42
44
  - lib/orthoses/active_model/has_secure_password.rb
@@ -89,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
91
  - !ruby/object:Gem::Version
90
92
  version: '0'
91
93
  requirements: []
92
- rubygems_version: 3.4.10
94
+ rubygems_version: 3.5.3
93
95
  signing_key:
94
96
  specification_version: 4
95
97
  summary: Orthoses middleware collection for Ruby on Rails