orthoses 0.4.0 → 0.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: 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