orthoses 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e53d784825b1c759916988c4aaca8e6942fd89e0de4c73dff022f40ca265027
4
- data.tar.gz: 7e6fdb9ac599274b713a9930d15bb8b81267c3afcc4a7ed3a6c747a13c711201
3
+ metadata.gz: db149183688863139dfc513f92a150464497d1df409c495377817b4d3671db00
4
+ data.tar.gz: a02eb903127a7f6daf17750b9263ffee63a880b381ccfc47e76aa82e52252af3
5
5
  SHA512:
6
- metadata.gz: 61b9855a1f2744de78e9993d4adb024133aa08eeefa4541f9371bbb9598c500b8e4af2618ff9904039bbb086a2fde61b714c6ae20bc466077b1b46601f9d6735
7
- data.tar.gz: 6a2eaea1e8da4d1231dbcf4ebb4b4b92e228a03656a89385a439ff651b5dc204a9fb5071e8fb11a0fec35e95e85e6e1c332cc341ecb72302bd3d2623e3779585
6
+ metadata.gz: 0ada92bd790f9ff1fd4b4e1293c1d4dad77c08c3c2e39f4513655ce910db7239e2a9e34373395e5abb4025d341c3596ef48b5dd46c05312cf6e2e8ec92152558
7
+ data.tar.gz: cb126e961ab83cc8ce683aa852279bac3a8cd166d73cd9f28f9e13cb482f8949d4b2f48928d617c2e4804b558160aea2feb6b91e66d91bfc0de86822869ba030
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- orthoses (0.4.0)
4
+ orthoses (0.5.0)
5
5
  rbs (~> 2.0)
6
6
 
7
7
  GEM
@@ -22,10 +22,12 @@ task :minitest => :src do
22
22
  !Orthoses::Utils.rbs_defined_const?("#{current}::#{const}")
23
23
  }
24
24
  use Orthoses::Mixin
25
+ use Orthoses::Attribute
25
26
  use Orthoses::RBSPrototypeRB,
26
27
  paths: Dir.glob('src/lib/minitest{.rb,/*.rb}'),
27
28
  constant_filter: ->(_) { false },
28
- mixin_filter: ->(_) { false }
29
+ mixin_filter: ->(_) { false },
30
+ attribute_filter: ->(_) { false }
29
31
  run ->(){
30
32
  require_relative 'src/lib/minitest'
31
33
  require_relative 'src/lib/minitest/test'
@@ -43,6 +45,12 @@ task :minitest => :src do
43
45
  dependencies:
44
46
  - name: mutex_m
45
47
  YAML
48
+ tmp = out.join("kernel.rbs").read
49
+ out.join("kernel.rbs").open("w") do |f|
50
+ f.puts "%a{annotate:rdoc:skip}"
51
+ f.write tmp
52
+ end
53
+ sh "rbs annotate --gems out"
46
54
  end
47
55
 
48
56
  task default: :minitest
@@ -0,0 +1,98 @@
1
+ module Orthoses
2
+ class Attribute
3
+ module Hook
4
+ def attr(*names)
5
+ super
6
+ end
7
+
8
+ def attr_accessor(*names)
9
+ super
10
+ end
11
+
12
+ def attr_reader(*names)
13
+ super
14
+ end
15
+
16
+ def attr_writer(*names)
17
+ super
18
+ end
19
+ end
20
+
21
+ def initialize(loader)
22
+ @loader = loader
23
+ end
24
+
25
+ def call
26
+ Module.prepend(Hook)
27
+
28
+ attr = CallTracer.new
29
+ attr_accessor = CallTracer.new
30
+ attr_reader = CallTracer.new
31
+ attr_writer = CallTracer.new
32
+
33
+ store = attr.trace(Hook.method(:attr)) do
34
+ attr_accessor.trace(Hook.method(:attr_accessor)) do
35
+ attr_reader.trace(Hook.method(:attr_reader)) do
36
+ attr_writer.trace(Hook.method(:attr_writer)) do
37
+ @loader.call
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ store["Module"].body.delete("prepend Orthoses::Attribute::Hook")
44
+
45
+ attr.result.each do |method, argument|
46
+ m = method.receiver.to_s.match(/#<Class:([\w:]+)>/)
47
+ if m && m[1]
48
+ receiver_name = m[1]
49
+ prefix = "self."
50
+ else
51
+ receiver_name = Utils.module_name(method.receiver) or next
52
+ prefix = nil
53
+ end
54
+ content = store[receiver_name]
55
+ if argument[:names][1].equal?(true)
56
+ content << "attr_accessor #{prefix}#{argument[:names][0]}: untyped"
57
+ elsif argument[:names][1].equal?(false)
58
+ content << "attr_reader #{prefix}#{argument[:names][0]}: untyped"
59
+ else
60
+ argument[:names].each do |name|
61
+ content << "attr_reader #{prefix}#{name}: untyped"
62
+ end
63
+ end
64
+ end
65
+
66
+ each_definition(attr_accessor) do |receiver_name, name|
67
+ store[receiver_name] << "attr_accessor #{name}: untyped"
68
+ end
69
+ each_definition(attr_reader) do |receiver_name, name|
70
+ store[receiver_name] << "attr_reader #{name}: untyped"
71
+ end
72
+ each_definition(attr_writer) do |receiver_name, name|
73
+ store[receiver_name] << "attr_writer #{name}: untyped"
74
+ end
75
+
76
+ store
77
+ end
78
+
79
+ private
80
+
81
+ def each_definition(call_tracer)
82
+ call_tracer.result.each do |method, argument|
83
+ m = method.receiver.to_s.match(/#<Class:([\w:]+)>/)
84
+ if m && m[1]
85
+ receiver_name = m[1]
86
+ argument[:names].each do |name|
87
+ yield [receiver_name, "self.#{name}"]
88
+ end
89
+ else
90
+ receiver_name = Utils.module_name(method.receiver) or next
91
+ argument[:names].each do |name|
92
+ yield [receiver_name, name]
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -27,6 +27,7 @@ module Orthoses
27
27
  end
28
28
 
29
29
  def use(middleware, *args, **key, &block)
30
+ Orthoses.logger.debug("use #{middleware}")
30
31
  @use << proc do |loader|
31
32
  middleware.new(loader, *args, **key, &block).tap do |m|
32
33
  m.extend CallLogable
@@ -8,16 +8,16 @@ module Orthoses
8
8
 
9
9
  def update_decl
10
10
  uniq_map = {}
11
- @decl.members.reverse_each do |member|
11
+ @decl.members.each do |member|
12
12
  key = member_key(member)
13
- if uniq_map.key?(key)
14
- Orthoses.logger.warn("#{@decl.name}::#{member_to_s(member)} was droped since duplication")
15
- else
16
- uniq_map[key] = member
13
+ drop_member = uniq_map[key]
14
+ uniq_map[key] = member
15
+ if drop_member
16
+ Orthoses.logger.warn("#{@decl.name}::#{drop_member} was droped since duplication")
17
17
  end
18
18
  end
19
19
  drop_known_method_definition(uniq_map)
20
- @decl.members.replace(uniq_map.values.reverse)
20
+ @decl.members.replace(uniq_map.values)
21
21
  end
22
22
 
23
23
  private
@@ -26,11 +26,8 @@ module Orthoses
26
26
  env = Utils.rbs_environment(collection: true)
27
27
  if m_entry = env.class_decls[@decl.name.absolute!]
28
28
  m_entry.decls.each do |d|
29
- d.decl.members.each do |member|
30
- case member
31
- when RBS::AST::Members::MethodDefinition, RBS::AST::Members::Alias
32
- uniq_map.delete(member_key(member))
33
- end
29
+ d.decl.members.grep_v(RBS::AST::Members::LocationOnly).each do |member|
30
+ uniq_map.delete(member_key(member))
34
31
  end
35
32
  end
36
33
  end
@@ -51,6 +48,13 @@ module Orthoses
51
48
  [member.class]
52
49
  when RBS::AST::Members::Alias
53
50
  [RBS::AST::Members::MethodDefinition, member.new_name, member.kind]
51
+ when RBS::AST::Members::AttrAccessor
52
+ # FIXME: how to check "#{member.name}=" ?
53
+ [RBS::AST::Members::MethodDefinition, member.name, member.kind]
54
+ when RBS::AST::Members::AttrReader
55
+ [RBS::AST::Members::MethodDefinition, member.name, member.kind]
56
+ when RBS::AST::Members::AttrWriter
57
+ [RBS::AST::Members::MethodDefinition, "#{member.name}=", member.kind]
54
58
  else
55
59
  [member.class, member.name]
56
60
  end
@@ -1,18 +1,31 @@
1
1
  module Orthoses
2
2
  class Content
3
3
  class Environment
4
- def initialize(constant_filter: nil, mixin_filter: nil)
4
+ class << self
5
+ def load_from_paths(paths)
6
+ new.tap do |env|
7
+ paths.each do |path|
8
+ Orthoses.logger.debug("Load #{path}")
9
+ buffer = RBS::Buffer.new(name: path.to_s, content: File.read(path.to_s, encoding: "UTF-8"))
10
+ RBS::Parser.parse_signature(buffer).each do |decl|
11
+ env << decl
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize(constant_filter: nil, mixin_filter: nil, attribute_filter: nil)
5
19
  @load_env = RBS::Environment.new
6
- @known_env = Utils.rbs_environment(collection: true)
20
+ @known_env = Utils.rbs_environment(collection: true, cache: false)
7
21
  @constant_filter = constant_filter
8
22
  @mixin_filter = mixin_filter
23
+ @attribute_filter = attribute_filter
9
24
  end
10
25
 
11
26
  def <<(decl)
12
- if known_class_entry = @known_env.class_decls[decl.name.absolute!]
13
- decl.type_params.replace(known_class_entry.primary.decl.type_params)
14
- end
15
27
  @load_env << decl
28
+ @known_env << decl
16
29
  rescue RBS::DuplicatedDeclarationError => err
17
30
  Orthoses.logger.warn(err.inspect)
18
31
  end
@@ -20,13 +33,15 @@ module Orthoses
20
33
  def write_to(store:)
21
34
  each do |add_content|
22
35
  content = store[add_content.name]
23
- content.header ||= add_content.header
36
+ content.header = add_content.header
24
37
  content.concat(add_content.body)
25
38
  end
26
39
  end
27
40
 
28
41
  def each
29
- header_builder = HeaderBuilder.new(env: @load_env)
42
+ avoid_generic_parameter_mismatch_error
43
+
44
+ header_builder = HeaderBuilder.new(env: @known_env)
30
45
 
31
46
  @load_env.class_decls.each do |type_name, m_entry|
32
47
  name = type_name.relative!.to_s
@@ -49,6 +64,23 @@ module Orthoses
49
64
  end
50
65
  end
51
66
 
67
+ private
68
+
69
+ # Avoid `RBS::GenericParameterMismatchError` from like rbs_prototype_rb
70
+ # class Array # <= RBS::GenericParameterMismatchError
71
+ # end
72
+ def avoid_generic_parameter_mismatch_error
73
+ @known_env.class_decls.each do |type_name, m_entry|
74
+ tmp_primary_d = m_entry.decls.find { |d| !d.decl.type_params.empty? }
75
+ next unless tmp_primary_d
76
+ m_entry.decls.each do |d|
77
+ if d.decl.type_params.empty?
78
+ d.decl.type_params.replace(tmp_primary_d.decl.type_params)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
52
84
  def decls_to_lines(decls)
53
85
  out = StringIO.new
54
86
  writer = RBS::Writer.new(out: out)
@@ -61,6 +93,8 @@ module Orthoses
61
93
  next unless @constant_filter.nil? || @constant_filter.call(member)
62
94
  when RBS::AST::Members::Mixin
63
95
  next unless @mixin_filter.nil? || @mixin_filter.call(member)
96
+ when RBS::AST::Members::Attribute
97
+ next unless @attribute_filter.nil? || @attribute_filter.call(member)
64
98
  end
65
99
  writer.write_member(member)
66
100
  end
@@ -48,10 +48,11 @@ module Orthoses
48
48
  context = primary.outer.length.times.map do |i|
49
49
  primary.outer[0, i + 1].map(&:name).inject(:+).to_namespace.absolute!
50
50
  end
51
+ context.push(RBS::Namespace.root)
51
52
 
52
53
  super_class_name = @resolver.resolve(primary.decl.super_class.name, context: context) || primary.decl.super_class.name
53
54
  if primary.decl.super_class.args.empty?
54
- if super_class_entry = @env.class_decls[super_class_name.absolute!]
55
+ if super_class_entry = @env.class_decls[super_class_name]
55
56
  super_primary = super_class_entry.primary
56
57
  " < #{name_and_args(super_class_name, super_primary.decl.type_params.map { :untyped })}"
57
58
  else
@@ -11,14 +11,7 @@ module Orthoses
11
11
 
12
12
  def call
13
13
  @loader.call.tap do |store|
14
- env = Content::Environment.new
15
- @paths.each do |path|
16
- Orthoses.logger.debug("Load #{path}")
17
- buffer = RBS::Buffer.new(name: path.to_s, content: File.read(path.to_s, encoding: "UTF-8"))
18
- RBS::Parser.parse_signature(buffer).each do |decl|
19
- env << decl
20
- end
21
- end
14
+ env = Content::Environment.load_from_paths(@paths)
22
15
  env.write_to(store: store)
23
16
  end
24
17
  end
@@ -3,11 +3,12 @@ module Orthoses
3
3
  # use Orthoses::RBSPrototypeRB,
4
4
  # paths: Dir.glob("lib/**/*.rb")
5
5
  class RBSPrototypeRB
6
- def initialize(loader, paths:, constant_filter: nil, mixin_filter: nil)
6
+ def initialize(loader, paths:, constant_filter: nil, mixin_filter: nil, attribute_filter: nil)
7
7
  @loader = loader
8
8
  @paths = paths
9
9
  @constant_filter = constant_filter
10
10
  @mixin_filter = mixin_filter
11
+ @attribute_filter = attribute_filter
11
12
  end
12
13
 
13
14
  def call
@@ -24,6 +25,7 @@ module Orthoses
24
25
  env = Orthoses::Content::Environment.new(
25
26
  constant_filter: @constant_filter,
26
27
  mixin_filter: @mixin_filter,
28
+ attribute_filter: @attribute_filter,
27
29
  )
28
30
  parser.decls.each do |decl|
29
31
  env << decl
@@ -46,9 +46,9 @@ module Orthoses
46
46
  RBS::Namespace.parse(name).to_type_name
47
47
  end
48
48
 
49
- def self.rbs_environment(library: nil, collection: false)
49
+ def self.rbs_environment(library: nil, collection: false, cache: true)
50
50
  @env_cache ||= {}
51
- if hit = @env_cache[[library, collection]]
51
+ if cache && hit = @env_cache[[library, collection]]
52
52
  return hit
53
53
  end
54
54
 
@@ -71,8 +71,9 @@ module Orthoses
71
71
  end
72
72
  end
73
73
 
74
- environment = RBS::Environment.from_loader(loader).resolve_type_names
75
- @env_cache[[library, collection]] = environment
74
+ RBS::Environment.from_loader(loader).resolve_type_names.tap do |env|
75
+ @env_cache[[library, collection]] = env if cache
76
+ end
76
77
  end
77
78
 
78
79
  def self.object_to_rbs(object, strict:)
@@ -121,6 +122,9 @@ module Orthoses
121
122
  "Hash[#{keys.join(' | ')}, #{values.join(' | ')}]"
122
123
  end
123
124
  end
125
+ when Range
126
+ type = object_to_rbs(object.begin || object.end, strict: false)
127
+ "Range[#{type}]"
124
128
  when ARGF
125
129
  # see also https://github.com/ruby/rbs/pull/975
126
130
  'untyped'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Orthoses
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/orthoses.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'rbs'
4
4
  require 'pathname'
5
5
 
6
+ require_relative 'orthoses/attribute'
6
7
  require_relative 'orthoses/avoid_recursive_ancestor_error'
7
8
  require_relative 'orthoses/builder'
8
9
  require_relative 'orthoses/call_tracer'
@@ -0,0 +1,4 @@
1
+ # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
+
3
+ module Orthoses::Attribute::Hook
4
+ end
@@ -0,0 +1,4 @@
1
+ # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
+
3
+ class Orthoses::Attribute
4
+ end
@@ -1,6 +1,6 @@
1
1
  # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
2
 
3
- class Orthoses::ConstLoadError < StandardError
3
+ class Orthoses::ConstLoadError < ::StandardError
4
4
  attr_reader root: Module
5
5
  attr_reader const: Symbol
6
6
  attr_reader error: untyped
@@ -0,0 +1,4 @@
1
+ # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
+
3
+ class Orthoses::Content::HeaderBuilder
4
+ end
@@ -1,4 +1,4 @@
1
1
  # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
2
 
3
- class Orthoses::NameSpaceError < StandardError
3
+ class Orthoses::NameSpaceError < ::StandardError
4
4
  end
@@ -1,8 +1,6 @@
1
1
  # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
2
 
3
3
  module Orthoses::Utils
4
- UNBOUND_NAME_METHOD: UnboundMethod
5
-
6
4
  def self.unautoload!: () -> void
7
5
 
8
6
  def self.each_const_recursive: (Module root, ?cache: Hash[untyped, true], ?on_error: ^(Orthoses::ConstLoadError) -> void?) ?{ (Module, Symbol, untyped) -> void } -> void
@@ -24,4 +22,6 @@ module Orthoses::Utils
24
22
  def self.known_type_params: (Module | String) -> Array[RBS::AST::TypeParam]
25
23
 
26
24
  def self.new_store: () -> Orthoses::store
25
+
26
+ UNBOUND_NAME_METHOD: UnboundMethod
27
27
  end
data/sig/orthoses.rbs CHANGED
@@ -1,9 +1,9 @@
1
1
  # THIS IS GENERATED CODE from `$ rake generate_self_sig`
2
2
 
3
3
  module Orthoses
4
- VERSION: String
5
-
6
4
  attr_accessor self.logger: ::Logger
7
5
 
8
6
  type store = Hash[String, Orthoses::Content]
7
+
8
+ VERSION: "0.4.0"
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orthoses
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.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: 2022-05-23 00:00:00.000000000 Z
11
+ date: 2022-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rbs
@@ -40,6 +40,7 @@ files:
40
40
  - examples/simple_middleware.rb
41
41
  - examples/simple_middleware.rbs
42
42
  - lib/orthoses.rb
43
+ - lib/orthoses/attribute.rb
43
44
  - lib/orthoses/avoid_recursive_ancestor_error.rb
44
45
  - lib/orthoses/builder.rb
45
46
  - lib/orthoses/call_tracer.rb
@@ -66,6 +67,8 @@ files:
66
67
  - sig/orthoses.rbs
67
68
  - sig/orthoses/_call.rbs
68
69
  - sig/orthoses/_middle_ware.rbs
70
+ - sig/orthoses/attribute.rbs
71
+ - sig/orthoses/attribute/hook.rbs
69
72
  - sig/orthoses/avoid_recursive_ancestor_error.rbs
70
73
  - sig/orthoses/builder.rbs
71
74
  - sig/orthoses/builder/call_logable.rbs
@@ -75,6 +78,7 @@ files:
75
78
  - sig/orthoses/content.rbs
76
79
  - sig/orthoses/content/duplication_checker.rbs
77
80
  - sig/orthoses/content/environment.rbs
81
+ - sig/orthoses/content/header_builder.rbs
78
82
  - sig/orthoses/create_file_by_name.rbs
79
83
  - sig/orthoses/delegate_class.rbs
80
84
  - sig/orthoses/filter.rbs