sord 1.0.0 → 3.0.1
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 +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
|