sord 1.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- data/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
- data/.gitignore +0 -0
- data/.parlour +6 -2
- data/.rspec +0 -0
- data/.travis.yml +0 -0
- data/CHANGELOG.md +58 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +71 -43
- data/Rakefile +25 -7
- data/exe/sord +45 -7
- data/lib/sord.rb +1 -1
- data/lib/sord/generator.rb +601 -0
- data/lib/sord/logging.rb +0 -0
- data/lib/sord/parlour_plugin.rb +23 -2
- data/lib/sord/resolver.rb +4 -0
- data/lib/sord/type_converter.rb +71 -63
- data/lib/sord/version.rb +1 -1
- data/rbi/sord.rbi +211 -30
- data/sord.gemspec +1 -1
- metadata +10 -10
- data/lib/sord/rbi_generator.rb +0 -437
data/lib/sord/logging.rb
CHANGED
File without changes
|
data/lib/sord/parlour_plugin.rb
CHANGED
@@ -37,11 +37,21 @@ module Sord
|
|
37
37
|
end
|
38
38
|
Sord::Logging.enabled_types = Sord::Logging::AVAILABLE_TYPES - blacklist
|
39
39
|
end
|
40
|
+
|
41
|
+
if !(options[:rbi] || options[:rbs])
|
42
|
+
Sord::Logging.error('No output format given; please specify --rbi or --rbs')
|
43
|
+
exit 1
|
44
|
+
end
|
45
|
+
|
46
|
+
if (options[:rbi] && options[:rbs])
|
47
|
+
Sord::Logging.error('You cannot specify both --rbi and --rbs; please use only one')
|
48
|
+
exit 1
|
49
|
+
end
|
40
50
|
|
41
51
|
if options[:regenerate]
|
42
52
|
begin
|
43
53
|
Sord::Logging.info('Running YARD...')
|
44
|
-
|
54
|
+
Sord::ParlourPlugin.with_clean_env do
|
45
55
|
system('bundle exec yard')
|
46
56
|
end
|
47
57
|
rescue Errno::ENOENT
|
@@ -52,12 +62,23 @@ module Sord
|
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
65
|
+
options[:mode] = \
|
66
|
+
if options[:rbi] then :rbi elsif options[:rbs] then :rbs end
|
55
67
|
options[:parlour] = @parlour
|
56
68
|
options[:root] = root
|
57
69
|
|
58
|
-
Sord::
|
70
|
+
Sord::Generator.new(options).run
|
59
71
|
|
60
72
|
true
|
61
73
|
end
|
74
|
+
|
75
|
+
def self.with_clean_env &block
|
76
|
+
meth = if Bundler.respond_to?(:with_unbundled_env)
|
77
|
+
:with_unbundled_env
|
78
|
+
else
|
79
|
+
:with_clean_env
|
80
|
+
end
|
81
|
+
Bundler.send meth, &block
|
82
|
+
end
|
62
83
|
end
|
63
84
|
end
|
data/lib/sord/resolver.rb
CHANGED
@@ -39,8 +39,12 @@ module Sord
|
|
39
39
|
# This prints some deprecation warnings, so suppress them
|
40
40
|
prev_stderr = $stderr
|
41
41
|
$stderr = StringIO.new
|
42
|
+
|
43
|
+
major = RUBY_VERSION.split('.').first.to_i
|
44
|
+
sorted_set_removed = major >= 3
|
42
45
|
|
43
46
|
Object.constants
|
47
|
+
.reject { |x| sorted_set_removed && x == :SortedSet }
|
44
48
|
.select { |x| Object.const_get(x).is_a?(Class) }
|
45
49
|
.map(&:to_s)
|
46
50
|
ensure
|
data/lib/sord/type_converter.rb
CHANGED
@@ -2,11 +2,12 @@
|
|
2
2
|
require 'yaml'
|
3
3
|
require 'sord/logging'
|
4
4
|
require 'sord/resolver'
|
5
|
+
require 'parlour'
|
5
6
|
|
6
7
|
module Sord
|
7
|
-
# Contains methods to convert YARD types to
|
8
|
+
# Contains methods to convert YARD types to Parlour types.
|
8
9
|
module TypeConverter
|
9
|
-
# A regular expression which matches Ruby namespaces and identifiers.
|
10
|
+
# A regular expression which matches Ruby namespaces and identifiers.
|
10
11
|
# "Foo", "Foo::Bar", and "::Foo::Bar" are all matches, whereas "Foo.Bar"
|
11
12
|
# or "Foo#bar" are not.
|
12
13
|
SIMPLE_TYPE_REGEX =
|
@@ -19,27 +20,26 @@ module Sord
|
|
19
20
|
# "Hash{String => Symbol}", etc.
|
20
21
|
GENERIC_TYPE_REGEX =
|
21
22
|
/(#{SIMPLE_TYPE_REGEX})\s*[<{]\s*(.*)\s*[>}]/
|
22
|
-
|
23
|
+
|
23
24
|
# Match duck types which require the object implement one or more methods,
|
24
25
|
# like '#foo', '#foo & #bar', '#foo&#bar&#baz', and '#foo&#bar&#baz&#foo_bar'.
|
25
26
|
DUCK_TYPE_REGEX =
|
26
27
|
/^\#[a-zA-Z_][\w]*(?:[a-zA-Z_][\w=]*)*(?:( ?\& ?\#)*[a-zA-Z_][\w=]*)*$/
|
27
|
-
|
28
|
+
|
28
29
|
# A regular expression which matches ordered lists in the format of
|
29
30
|
# either "Array(String, Symbol)" or "(String, Symbol)".
|
30
31
|
ORDERED_LIST_REGEX = /^(?:Array|)\((.*)\s*\)$/
|
31
32
|
|
32
|
-
# A regular expression which matches the shorthand Hash syntax,
|
33
|
+
# A regular expression which matches the shorthand Hash syntax,
|
33
34
|
# "{String => Symbol}".
|
34
35
|
SHORTHAND_HASH_SYNTAX = /^{\s*(.*)\s*}$/
|
35
36
|
|
36
|
-
# A regular expression which matches the shorthand Array syntax,
|
37
|
+
# A regular expression which matches the shorthand Array syntax,
|
37
38
|
# "<String>".
|
38
39
|
SHORTHAND_ARRAY_SYNTAX = /^<\s*(.*)\s*>$/
|
39
40
|
|
40
|
-
#
|
41
|
-
|
42
|
-
SORBET_SINGLE_ARG_GENERIC_TYPES = %w{Array Set Enumerable Enumerator Range}
|
41
|
+
# Built in parlour single arg generics
|
42
|
+
SINGLE_ARG_GENERIC_TYPES = %w{Array Set Enumerable Enumerator Range}
|
43
43
|
|
44
44
|
# Given a string of YARD type parameters (without angle brackets), splits
|
45
45
|
# the string into an array of each type parameter.
|
@@ -50,7 +50,7 @@ module Sord
|
|
50
50
|
buffer = ""
|
51
51
|
current_bracketing_level = 0
|
52
52
|
character_pointer = 0
|
53
|
-
|
53
|
+
|
54
54
|
while character_pointer < params.length
|
55
55
|
should_buffer = true
|
56
56
|
|
@@ -90,7 +90,7 @@ module Sord
|
|
90
90
|
result
|
91
91
|
end
|
92
92
|
|
93
|
-
# Converts a YARD type into a
|
93
|
+
# Converts a YARD type into a Parlour type.
|
94
94
|
# @param [Boolean, Array, String] yard The YARD type.
|
95
95
|
# @param [YARD::CodeObjects::Base] item The CodeObject which the YARD type
|
96
96
|
# is associated with. This is used for logging and can be nil, but this
|
@@ -99,30 +99,34 @@ module Sord
|
|
99
99
|
# instead of SORD_ERROR_ constants for unknown types.
|
100
100
|
# @param [Boolean] replace_unresolved_with_untyped If true, T.untyped is used
|
101
101
|
# when Sord is unable to resolve a constant.
|
102
|
-
# @return [
|
103
|
-
def self.
|
102
|
+
# @return [Parlour::Types::Type]
|
103
|
+
def self.yard_to_parlour(yard, item = nil, replace_errors_with_untyped = false, replace_unresolved_with_untyped = false)
|
104
104
|
case yard
|
105
105
|
when nil # Type not specified
|
106
|
-
|
106
|
+
Parlour::Types::Untyped.new
|
107
107
|
when "bool", "Bool", "boolean", "Boolean", "true", "false"
|
108
|
-
|
108
|
+
Parlour::Types::Boolean.new
|
109
109
|
when 'self'
|
110
|
-
|
110
|
+
Parlour::Types::Self.new
|
111
111
|
when Array
|
112
112
|
# If there's only one element, unwrap it, otherwise allow for a
|
113
113
|
# selection of any of the types
|
114
114
|
types = yard
|
115
115
|
.reject { |x| x == 'nil' }
|
116
|
-
.map { |x|
|
117
|
-
.uniq
|
118
|
-
result = types.length == 1
|
119
|
-
|
116
|
+
.map { |x| yard_to_parlour(x, item, replace_errors_with_untyped, replace_unresolved_with_untyped) }
|
117
|
+
.uniq(&:hash)
|
118
|
+
result = types.length == 1 \
|
119
|
+
? types.first
|
120
|
+
: Parlour::Types::Union.new(types)
|
121
|
+
result = Parlour::Types::Nilable.new(result) if yard.include?('nil')
|
120
122
|
result
|
121
123
|
when /^#{SIMPLE_TYPE_REGEX}$/
|
122
|
-
if
|
123
|
-
return
|
124
|
+
if SINGLE_ARG_GENERIC_TYPES.include?(yard)
|
125
|
+
return Parlour::Types.const_get(yard).new(Parlour::Types::Untyped.new)
|
124
126
|
elsif yard == "Hash"
|
125
|
-
return
|
127
|
+
return Parlour::Types::Hash.new(
|
128
|
+
Parlour::Types::Untyped.new, Parlour::Types::Untyped.new
|
129
|
+
)
|
126
130
|
end
|
127
131
|
# If this doesn't begin with an uppercase letter, warn
|
128
132
|
if /^[_a-z]/ === yard
|
@@ -136,78 +140,79 @@ module Sord
|
|
136
140
|
new_path = Resolver.path_for(yard)
|
137
141
|
Logging.infer("#{yard} was resolved to #{new_path}", item) \
|
138
142
|
unless yard == new_path
|
139
|
-
new_path
|
143
|
+
Parlour::Types::Raw.new(new_path)
|
140
144
|
else
|
141
145
|
if replace_unresolved_with_untyped
|
142
|
-
Logging.warn("#{yard} wasn't able to be resolved to a constant in this project, replaced with
|
143
|
-
|
146
|
+
Logging.warn("#{yard} wasn't able to be resolved to a constant in this project, replaced with untyped", item)
|
147
|
+
Parlour::Types::Untyped.new
|
144
148
|
else
|
145
149
|
Logging.warn("#{yard} wasn't able to be resolved to a constant in this project", item)
|
146
|
-
yard
|
150
|
+
Parlour::Types::Raw.new(yard)
|
147
151
|
end
|
148
152
|
end
|
149
153
|
else
|
150
|
-
yard
|
154
|
+
Parlour::Types::Raw.new(yard)
|
151
155
|
end
|
152
156
|
when DUCK_TYPE_REGEX
|
153
|
-
Logging.duck("#{yard} looks like a duck type, replacing with
|
154
|
-
|
157
|
+
Logging.duck("#{yard} looks like a duck type, replacing with untyped", item)
|
158
|
+
Parlour::Types::Untyped.new
|
155
159
|
when /^#{GENERIC_TYPE_REGEX}$/
|
156
160
|
generic_type = $1
|
157
161
|
type_parameters = $2
|
158
162
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
"T::Hash[#{parameters.join(', ')}]"
|
169
|
-
else
|
170
|
-
handle_sord_error(parameters.join, "Invalid hash, must have exactly two types: #{yard.inspect}.", item, replace_errors_with_untyped)
|
171
|
-
end
|
163
|
+
parameters = split_type_parameters(type_parameters)
|
164
|
+
.map { |x| yard_to_parlour(x, item, replace_errors_with_untyped, replace_unresolved_with_untyped) }
|
165
|
+
if SINGLE_ARG_GENERIC_TYPES.include?(generic_type) && parameters.length > 1
|
166
|
+
Parlour::Types.const_get(generic_type).new(Parlour::Types::Union.new(parameters))
|
167
|
+
elsif generic_type == 'Class' && parameters.length == 1
|
168
|
+
Parlour::Types::Class.new(parameters.first)
|
169
|
+
elsif generic_type == 'Hash'
|
170
|
+
if parameters.length == 2
|
171
|
+
Parlour::Types::Hash.new(*parameters)
|
172
172
|
else
|
173
|
-
"
|
173
|
+
handle_sord_error(parameters.map(&:describe).join, "Invalid hash, must have exactly two types: #{yard.inspect}.", item, replace_errors_with_untyped)
|
174
174
|
end
|
175
175
|
else
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
176
|
+
if Parlour::Types.const_defined?(generic_type)
|
177
|
+
# This generic is built in to parlour, but sord doesn't
|
178
|
+
# explicitly know about it.
|
179
|
+
Parlour::Types.const_get(generic_type).new(*parameters)
|
180
|
+
else
|
181
|
+
# This is a user defined generic
|
182
|
+
Parlour::Types::Generic.new(
|
183
|
+
yard_to_parlour(generic_type),
|
184
|
+
parameters
|
185
|
+
)
|
186
|
+
end
|
182
187
|
end
|
183
188
|
# Converts ordered lists like Array(Symbol, String) or (Symbol, String)
|
184
|
-
# into
|
189
|
+
# into tuples.
|
185
190
|
when ORDERED_LIST_REGEX
|
186
191
|
type_parameters = $1
|
187
192
|
parameters = split_type_parameters(type_parameters)
|
188
|
-
.map { |x|
|
189
|
-
|
193
|
+
.map { |x| yard_to_parlour(x, item, replace_errors_with_untyped, replace_unresolved_with_untyped) }
|
194
|
+
Parlour::Types::Tuple.new(parameters)
|
190
195
|
when SHORTHAND_HASH_SYNTAX
|
191
196
|
type_parameters = $1
|
192
197
|
parameters = split_type_parameters(type_parameters)
|
193
|
-
.map { |x|
|
198
|
+
.map { |x| yard_to_parlour(x, item, replace_errors_with_untyped, replace_unresolved_with_untyped) }
|
194
199
|
# Return a warning about an invalid hash when it has more or less than two elements.
|
195
200
|
if parameters.length == 2
|
196
|
-
|
201
|
+
Parlour::Types::Hash.new(*parameters)
|
197
202
|
else
|
198
|
-
handle_sord_error(parameters.join, "Invalid hash, must have exactly two types: #{yard.inspect}.", item, replace_errors_with_untyped)
|
203
|
+
handle_sord_error(parameters.map(&:describe).join, "Invalid hash, must have exactly two types: #{yard.inspect}.", item, replace_errors_with_untyped)
|
199
204
|
end
|
200
205
|
when SHORTHAND_ARRAY_SYNTAX
|
201
206
|
type_parameters = $1
|
202
207
|
parameters = split_type_parameters(type_parameters)
|
203
|
-
.map { |x|
|
208
|
+
.map { |x| yard_to_parlour(x, item, replace_errors_with_untyped, replace_unresolved_with_untyped) }
|
204
209
|
parameters.one? \
|
205
|
-
?
|
206
|
-
:
|
210
|
+
? Parlour::Types::Array.new(parameters.first)
|
211
|
+
: Parlour::Types::Array.new(Parlour::Types::Union.new(parameters))
|
207
212
|
else
|
208
213
|
# Check for literals
|
209
214
|
from_yaml = YAML.load(yard) rescue nil
|
210
|
-
return from_yaml.class.to_s \
|
215
|
+
return Parlour::Types::Raw.new(from_yaml.class.to_s) \
|
211
216
|
if [Symbol, Float, Integer].include?(from_yaml.class)
|
212
217
|
|
213
218
|
return handle_sord_error(yard.to_s, "#{yard.inspect} does not appear to be a type", item, replace_errors_with_untyped)
|
@@ -216,14 +221,17 @@ module Sord
|
|
216
221
|
|
217
222
|
# Handles SORD_ERRORs.
|
218
223
|
#
|
219
|
-
# @param [String] name
|
224
|
+
# @param [String, Parlour::Types::Type] name
|
220
225
|
# @param [String] log_warning
|
221
226
|
# @param [YARD::CodeObjects::Base] item
|
222
227
|
# @param [Boolean] replace_errors_with_untyped
|
223
|
-
# @return [
|
228
|
+
# @return [Parlour::Types::Type]
|
224
229
|
def self.handle_sord_error(name, log_warning, item, replace_errors_with_untyped)
|
225
230
|
Logging.warn(log_warning, item)
|
226
|
-
|
231
|
+
str = name.is_a?(Parlour::Types::Type) ? name.describe : name
|
232
|
+
return replace_errors_with_untyped \
|
233
|
+
? Parlour::Types::Untyped.new
|
234
|
+
: Parlour::Types::Raw.new("SORD_ERROR_#{name.gsub(/[^0-9A-Za-z_]/i, '')}")
|
227
235
|
end
|
228
236
|
end
|
229
237
|
end
|
data/lib/sord/version.rb
CHANGED
data/rbi/sord.rbi
CHANGED
@@ -1,29 +1,57 @@
|
|
1
1
|
# typed: strong
|
2
|
+
|
2
3
|
module Sord
|
3
|
-
VERSION = T.let('0.
|
4
|
+
VERSION = T.let('3.0.1', T.untyped)
|
4
5
|
|
6
|
+
# Handles writing logs to stdout and any other classes which request them.
|
5
7
|
module Logging
|
6
8
|
AVAILABLE_TYPES = T.let([:warn, :info, :duck, :error, :infer, :omit, :done].freeze, T.untyped)
|
7
9
|
|
10
|
+
# _@return_ — The hooks registered on the logger.
|
8
11
|
sig { returns(T::Array[Proc]) }
|
9
12
|
def self.hooks; end
|
10
13
|
|
14
|
+
# _@return_ — Whether log messages should be printed or not. This is
|
15
|
+
# used for testing.
|
11
16
|
sig { returns(T::Boolean) }
|
12
17
|
def self.silent?; end
|
13
18
|
|
19
|
+
# Sets whether log messages should be printed or not.
|
20
|
+
#
|
21
|
+
# _@param_ `value`
|
14
22
|
sig { params(value: T::Boolean).void }
|
15
23
|
def self.silent=(value); end
|
16
24
|
|
25
|
+
# Sets the array of log messages types which should be processed. Any not on
|
26
|
+
# this list will be discarded. This should be a subset of AVAILABLE_TYPES.
|
27
|
+
#
|
28
|
+
# _@param_ `value`
|
17
29
|
sig { params(value: T::Array[Symbol]).void }
|
18
30
|
def self.enabled_types=(value); end
|
19
31
|
|
32
|
+
# Gets the array of log messages types which should be processed. Any not on
|
33
|
+
# this list will be discarded.
|
20
34
|
sig { returns(T::Array[Symbol]) }
|
21
35
|
def self.enabled_types; end
|
22
36
|
|
37
|
+
# Returns a boolean indicating whether a given array is a valid value for
|
38
|
+
# #enabled_types.
|
39
|
+
#
|
40
|
+
# _@param_ `value`
|
23
41
|
sig { params(value: T::Array[Symbol]).void }
|
24
42
|
def self.valid_types?(value); end
|
25
43
|
|
26
44
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
45
|
+
# A generic log message writer which is called by all other specific logging
|
46
|
+
# methods. This shouldn't be called outside of the Logging class itself.
|
47
|
+
#
|
48
|
+
# _@param_ `kind` — The kind of log message this is.
|
49
|
+
#
|
50
|
+
# _@param_ `header` — The prefix for this log message. For consistency, it should be up to five uppercase characters wrapped in square brackets, with some unique colour applied.
|
51
|
+
#
|
52
|
+
# _@param_ `msg` — The log message to write.
|
53
|
+
#
|
54
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
27
55
|
sig do
|
28
56
|
params(
|
29
57
|
kind: Symbol,
|
@@ -35,38 +63,91 @@ module Sord
|
|
35
63
|
def self.generic(kind, header, msg, item); end
|
36
64
|
|
37
65
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
66
|
+
# Print a warning message. This should be used for things which require the
|
67
|
+
# user's attention but do not prevent the process from stopping.
|
68
|
+
#
|
69
|
+
# _@param_ `msg` — The log message to write.
|
70
|
+
#
|
71
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
38
72
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
39
73
|
def self.warn(msg, item = nil); end
|
40
74
|
|
41
75
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
76
|
+
# Print an info message. This should be used for generic informational
|
77
|
+
# messages which the user doesn't need to act on.
|
78
|
+
#
|
79
|
+
# _@param_ `msg` — The log message to write.
|
80
|
+
#
|
81
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
42
82
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
43
83
|
def self.info(msg, item = nil); end
|
44
84
|
|
45
85
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
86
|
+
# Print a duck-typing message. This should be used when the YARD
|
87
|
+
# documentation contains duck typing, which isn't supported by Sorbet, so
|
88
|
+
# it is substituted for something different.
|
89
|
+
#
|
90
|
+
# _@param_ `msg` — The log message to write.
|
91
|
+
#
|
92
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
46
93
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
47
94
|
def self.duck(msg, item = nil); end
|
48
95
|
|
49
96
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
97
|
+
# Print an error message. This should be used for things which require the
|
98
|
+
# current process to stop.
|
99
|
+
#
|
100
|
+
# _@param_ `msg` — The log message to write.
|
101
|
+
#
|
102
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
50
103
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
51
104
|
def self.error(msg, item = nil); end
|
52
105
|
|
53
106
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
107
|
+
# Print an infer message. This should be used when the user should be told
|
108
|
+
# that some information has been filled in or guessed for them, and that
|
109
|
+
# information is likely correct.
|
110
|
+
#
|
111
|
+
# _@param_ `msg` — The log message to write.
|
112
|
+
#
|
113
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
54
114
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
55
115
|
def self.infer(msg, item = nil); end
|
56
116
|
|
57
117
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
118
|
+
# Print an omit message. This should be used as a special type of warning
|
119
|
+
# to alert the user that there is some information missing, but this
|
120
|
+
# information is not critical to the completion of the process.
|
121
|
+
#
|
122
|
+
# _@param_ `msg` — The log message to write.
|
123
|
+
#
|
124
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
58
125
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
59
126
|
def self.omit(msg, item = nil); end
|
60
127
|
|
61
128
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
129
|
+
# Print a done message. This should be used when a process completes
|
130
|
+
# successfully.
|
131
|
+
#
|
132
|
+
# _@param_ `msg` — The log message to write.
|
133
|
+
#
|
134
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
62
135
|
sig { params(msg: String, item: T.nilable(YARD::CodeObjects::Base)).void }
|
63
136
|
def self.done(msg, item = nil); end
|
64
137
|
|
65
138
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
139
|
+
# Invokes all registered hooks on the logger.
|
140
|
+
#
|
141
|
+
# _@param_ `kind` — The kind of log message this is.
|
142
|
+
#
|
143
|
+
# _@param_ `msg` — The log message to write.
|
144
|
+
#
|
145
|
+
# _@param_ `item` — The CodeObject which this log is associated with, if any. This is shown before the log message if it is specified.
|
66
146
|
sig { params(kind: Symbol, msg: String, item: YARD::CodeObjects::Base).void }
|
67
147
|
def self.invoke_hooks(kind, msg, item); end
|
68
148
|
|
69
149
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
150
|
+
# Adds a hook to the logger.
|
70
151
|
sig { params(blk: T.proc.params(kind: Symbol, msg: String, item: YARD::CodeObjects::Base).void).void }
|
71
152
|
def self.add_hook(&blk); end
|
72
153
|
end
|
@@ -78,85 +159,159 @@ module Sord
|
|
78
159
|
sig { void }
|
79
160
|
def self.clear; end
|
80
161
|
|
162
|
+
# _@param_ `name`
|
81
163
|
sig { params(name: String).returns(T::Array[String]) }
|
82
164
|
def self.paths_for(name); end
|
83
165
|
|
166
|
+
# _@param_ `name`
|
84
167
|
sig { params(name: String).returns(T.nilable(String)) }
|
85
168
|
def self.path_for(name); end
|
86
169
|
|
87
170
|
sig { returns(T::Array[String]) }
|
88
171
|
def self.builtin_classes; end
|
89
172
|
|
173
|
+
# _@param_ `name`
|
174
|
+
#
|
175
|
+
# _@param_ `item`
|
90
176
|
sig { params(name: String, item: Object).returns(T::Boolean) }
|
91
177
|
def self.resolvable?(name, item); end
|
92
178
|
end
|
93
179
|
|
94
|
-
|
180
|
+
# Converts the current working directory's YARD registry into an type
|
181
|
+
# signature file.
|
182
|
+
class Generator
|
183
|
+
VALID_MODES = T.let([:rbi, :rbs], T.untyped)
|
184
|
+
|
185
|
+
# _@return_ — The number of objects this generator has processed so
|
186
|
+
# far.
|
95
187
|
sig { returns(Integer) }
|
96
188
|
def object_count; end
|
97
189
|
|
98
|
-
#
|
99
|
-
|
100
|
-
|
101
|
-
|
190
|
+
# Create a new generator.
|
191
|
+
#
|
192
|
+
# _@param_ `options`
|
102
193
|
sig { params(options: T::Hash[T.untyped, T.untyped]).void }
|
103
194
|
def initialize(options); end
|
104
195
|
|
196
|
+
# Increment the namespace counter.
|
105
197
|
sig { void }
|
106
198
|
def count_namespace; end
|
107
199
|
|
200
|
+
# Increment the method counter.
|
108
201
|
sig { void }
|
109
202
|
def count_method; end
|
110
203
|
|
111
204
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
205
|
+
# Given a YARD CodeObject, add lines defining its mixins (that is, extends
|
206
|
+
# and includes) to the current file. Returns the number of mixins.
|
207
|
+
#
|
208
|
+
# _@param_ `item`
|
112
209
|
sig { params(item: YARD::CodeObjects::Base).returns(Integer) }
|
113
210
|
def add_mixins(item); end
|
114
211
|
|
115
212
|
# sord warn - YARD::CodeObjects::NamespaceObject wasn't able to be resolved to a constant in this project
|
213
|
+
# Given a YARD NamespaceObject, add lines defining constants.
|
214
|
+
#
|
215
|
+
# _@param_ `item`
|
116
216
|
sig { params(item: YARD::CodeObjects::NamespaceObject).void }
|
117
217
|
def add_constants(item); end
|
118
218
|
|
119
219
|
# sord warn - YARD::CodeObjects::NamespaceObject wasn't able to be resolved to a constant in this project
|
220
|
+
# sord warn - Parlour::TypedObject wasn't able to be resolved to a constant in this project
|
221
|
+
# Adds comments to an object based on a docstring.
|
222
|
+
#
|
223
|
+
# _@param_ `item`
|
224
|
+
#
|
225
|
+
# _@param_ `typed_object`
|
226
|
+
sig { params(item: YARD::CodeObjects::NamespaceObject, typed_object: Parlour::TypedObject).void }
|
227
|
+
def add_comments(item, typed_object); end
|
228
|
+
|
229
|
+
# sord warn - YARD::CodeObjects::NamespaceObject wasn't able to be resolved to a constant in this project
|
230
|
+
# Given a YARD NamespaceObject, add lines defining its methods and their
|
231
|
+
# signatures to the current file.
|
232
|
+
#
|
233
|
+
# _@param_ `item`
|
120
234
|
sig { params(item: YARD::CodeObjects::NamespaceObject).void }
|
121
235
|
def add_methods(item); end
|
122
236
|
|
123
237
|
# sord warn - YARD::CodeObjects::NamespaceObject wasn't able to be resolved to a constant in this project
|
238
|
+
# Given a YARD NamespaceObject, add lines defining either its class
|
239
|
+
# and instance attributes and their signatures to the current file.
|
240
|
+
#
|
241
|
+
# _@param_ `item`
|
242
|
+
sig { params(item: YARD::CodeObjects::NamespaceObject).void }
|
243
|
+
def add_attributes(item); end
|
244
|
+
|
245
|
+
# sord warn - YARD::CodeObjects::NamespaceObject wasn't able to be resolved to a constant in this project
|
246
|
+
# Given a YARD NamespaceObject, add lines defining its mixins, methods
|
247
|
+
# and children to the file.
|
248
|
+
#
|
249
|
+
# _@param_ `item`
|
124
250
|
sig { params(item: YARD::CodeObjects::NamespaceObject).void }
|
125
251
|
def add_namespace(item); end
|
126
252
|
|
253
|
+
# Populates the generator with the contents of the YARD registry. You
|
254
|
+
# must load the YARD registry first!
|
127
255
|
sig { void }
|
128
256
|
def populate; end
|
129
257
|
|
258
|
+
# Populates the generator with the contents of the YARD registry, then
|
259
|
+
# uses the loaded Parlour::Generator to generate the file. You must
|
260
|
+
# load the YARD registry first!
|
130
261
|
sig { void }
|
131
262
|
def generate; end
|
132
263
|
|
264
|
+
# Loads the YARD registry, populates the file, and prints any relevant
|
265
|
+
# final logs.
|
133
266
|
sig { void }
|
134
267
|
def run; end
|
135
|
-
end
|
136
268
|
|
137
|
-
|
138
|
-
#
|
139
|
-
|
140
|
-
|
269
|
+
# Given two pairs of arrays representing method parameters, in the form
|
270
|
+
# of ["variable_name", "default_value"], sort the parameters so they're
|
271
|
+
# valid for Sorbet. Sorbet requires that, e.g. required kwargs go before
|
272
|
+
# optional kwargs.
|
273
|
+
#
|
274
|
+
# _@param_ `pair1`
|
275
|
+
#
|
276
|
+
# _@param_ `pair2`
|
277
|
+
#
|
278
|
+
# _@return_ — Integer
|
279
|
+
sig { params(pair1: T::Array[T.untyped], pair2: T::Array[T.untyped]).returns(T.untyped) }
|
280
|
+
def sort_params(pair1, pair2); end
|
141
281
|
|
142
|
-
# sord
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
282
|
+
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
283
|
+
# _@return_ — The
|
284
|
+
# errors encountered by by the generator. Each element is of the form
|
285
|
+
# [message, item, line].
|
286
|
+
sig { returns(T::Array[[String, YARD::CodeObjects::Base, Integer]]) }
|
287
|
+
attr_reader :warnings
|
288
|
+
end
|
149
289
|
|
150
|
-
|
151
|
-
|
290
|
+
class ParlourPlugin < Parlour::Plugin
|
291
|
+
# sord omit - no YARD type given for "options", using untyped
|
292
|
+
sig { params(options: T.untyped).void }
|
152
293
|
def initialize(options); end
|
153
294
|
|
154
|
-
# sord omit - no YARD type given for "root", using
|
155
|
-
# sord omit - no YARD return type given, using
|
295
|
+
# sord omit - no YARD type given for "root", using untyped
|
296
|
+
# sord omit - no YARD return type given, using untyped
|
156
297
|
sig { params(root: T.untyped).returns(T.untyped) }
|
157
298
|
def generate(root); end
|
299
|
+
|
300
|
+
# sord omit - no YARD return type given, using untyped
|
301
|
+
sig { params(block: T.untyped).returns(T.untyped) }
|
302
|
+
def self.with_clean_env(&block); end
|
303
|
+
|
304
|
+
# sord omit - no YARD type given for :options, using untyped
|
305
|
+
# Returns the value of attribute options.
|
306
|
+
sig { returns(T.untyped) }
|
307
|
+
attr_reader :options
|
308
|
+
|
309
|
+
# Returns the value of attribute parlour.
|
310
|
+
sig { returns(T.untyped) }
|
311
|
+
attr_accessor :parlour
|
158
312
|
end
|
159
313
|
|
314
|
+
# Contains methods to convert YARD types to Parlour types.
|
160
315
|
module TypeConverter
|
161
316
|
SIMPLE_TYPE_REGEX = T.let(/(?:\:\:)?[a-zA-Z_][\w]*(?:\:\:[a-zA-Z_][\w]*)*/, T.untyped)
|
162
317
|
GENERIC_TYPE_REGEX = T.let(/(#{SIMPLE_TYPE_REGEX})\s*[<{]\s*(.*)\s*[>}]/, T.untyped)
|
@@ -164,32 +319,58 @@ module Sord
|
|
164
319
|
ORDERED_LIST_REGEX = T.let(/^(?:Array|)\((.*)\s*\)$/, T.untyped)
|
165
320
|
SHORTHAND_HASH_SYNTAX = T.let(/^{\s*(.*)\s*}$/, T.untyped)
|
166
321
|
SHORTHAND_ARRAY_SYNTAX = T.let(/^<\s*(.*)\s*>$/, T.untyped)
|
167
|
-
|
168
|
-
|
169
|
-
|
322
|
+
SINGLE_ARG_GENERIC_TYPES = T.let(%w{Array Set Enumerable Enumerator Range}, T.untyped)
|
323
|
+
|
324
|
+
# Given a string of YARD type parameters (without angle brackets), splits
|
325
|
+
# the string into an array of each type parameter.
|
326
|
+
#
|
327
|
+
# _@param_ `params` — The type parameters.
|
328
|
+
#
|
329
|
+
# _@return_ — The split type parameters.
|
170
330
|
sig { params(params: String).returns(T::Array[String]) }
|
171
331
|
def self.split_type_parameters(params); end
|
172
332
|
|
173
333
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
334
|
+
# sord warn - Parlour::Types::Type wasn't able to be resolved to a constant in this project
|
335
|
+
# Converts a YARD type into a Parlour type.
|
336
|
+
#
|
337
|
+
# _@param_ `yard` — The YARD type.
|
338
|
+
#
|
339
|
+
# _@param_ `item` — The CodeObject which the YARD type is associated with. This is used for logging and can be nil, but this will lead to less informative log messages.
|
340
|
+
#
|
341
|
+
# _@param_ `replace_errors_with_untyped` — If true, T.untyped is used instead of SORD_ERROR_ constants for unknown types.
|
342
|
+
#
|
343
|
+
# _@param_ `replace_unresolved_with_untyped` — If true, T.untyped is used when Sord is unable to resolve a constant.
|
174
344
|
sig do
|
175
345
|
params(
|
176
346
|
yard: T.any(T::Boolean, T::Array[T.untyped], String),
|
177
347
|
item: T.nilable(YARD::CodeObjects::Base),
|
178
348
|
replace_errors_with_untyped: T::Boolean,
|
179
349
|
replace_unresolved_with_untyped: T::Boolean
|
180
|
-
).returns(
|
350
|
+
).returns(Parlour::Types::Type)
|
181
351
|
end
|
182
|
-
def self.
|
352
|
+
def self.yard_to_parlour(yard, item = nil, replace_errors_with_untyped = false, replace_unresolved_with_untyped = false); end
|
183
353
|
|
354
|
+
# sord warn - Parlour::Types::Type wasn't able to be resolved to a constant in this project
|
184
355
|
# sord warn - YARD::CodeObjects::Base wasn't able to be resolved to a constant in this project
|
356
|
+
# sord warn - Parlour::Types::Type wasn't able to be resolved to a constant in this project
|
357
|
+
# Handles SORD_ERRORs.
|
358
|
+
#
|
359
|
+
# _@param_ `name`
|
360
|
+
#
|
361
|
+
# _@param_ `log_warning`
|
362
|
+
#
|
363
|
+
# _@param_ `item`
|
364
|
+
#
|
365
|
+
# _@param_ `replace_errors_with_untyped`
|
185
366
|
sig do
|
186
367
|
params(
|
187
|
-
name: String,
|
368
|
+
name: T.any(String, Parlour::Types::Type),
|
188
369
|
log_warning: String,
|
189
370
|
item: YARD::CodeObjects::Base,
|
190
371
|
replace_errors_with_untyped: T::Boolean
|
191
|
-
).returns(
|
372
|
+
).returns(Parlour::Types::Type)
|
192
373
|
end
|
193
374
|
def self.handle_sord_error(name, log_warning, item, replace_errors_with_untyped); end
|
194
375
|
end
|
195
|
-
end
|
376
|
+
end
|