parlour 5.0.0.beta.6 → 5.0.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 +4 -4
- data/.travis.yml +4 -0
- data/CHANGELOG.md +64 -32
- data/README.md +2 -0
- data/ci/check_rbi.sh +9 -0
- data/lib/parlour/rbi_generator/class_namespace.rb +4 -2
- data/lib/parlour/rbi_generator/enum_class_namespace.rb +4 -2
- data/lib/parlour/rbi_generator/module_namespace.rb +19 -7
- data/lib/parlour/rbi_generator/namespace.rb +29 -9
- data/lib/parlour/rbi_generator/parameter.rb +3 -3
- data/lib/parlour/rbi_generator/struct_class_namespace.rb +4 -2
- data/lib/parlour/rbi_generator/struct_prop.rb +2 -2
- data/lib/parlour/rbs_generator/method.rb +1 -1
- data/lib/parlour/type_parser.rb +12 -2
- data/lib/parlour/version.rb +1 -1
- data/rbi/parlour.rbi +31 -14
- metadata +5 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb1e682fc74b2ccd30ac9055caf652889e898e2632347bf6cf0898f218bd5562
|
|
4
|
+
data.tar.gz: fcca5ca04676cbeed657add051e344fd9b5fa0a7efc757339847310300aa4d42
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cef41723b922734b49f8377dc3b5c60cf0071d2a9723326299872fea4789f8e6ea1cb280fcd21161d48bd5dbb074b416e60668138116e56caf1c8334cce8e535
|
|
7
|
+
data.tar.gz: b9ea0db060c8789e1324460cde4a69b1c20b829920e660024f53834e48cef536b5423736e6fce4859c2e2fea5339e3f26bdd7513947bafcc82bd239db57cc68a
|
data/.travis.yml
CHANGED
|
@@ -3,6 +3,7 @@ dist: trusty
|
|
|
3
3
|
before_install:
|
|
4
4
|
- gem install bundler
|
|
5
5
|
- gem install yard
|
|
6
|
+
- chmod +x ci/check_rbi.sh
|
|
6
7
|
rvm:
|
|
7
8
|
- 2.3
|
|
8
9
|
- 2.4
|
|
@@ -13,6 +14,9 @@ rvm:
|
|
|
13
14
|
|
|
14
15
|
jobs:
|
|
15
16
|
include:
|
|
17
|
+
- stage: check RBI
|
|
18
|
+
script: ./ci/check_rbi.sh
|
|
19
|
+
rvm: 2.7
|
|
16
20
|
- stage: deploy documentation
|
|
17
21
|
script: yard
|
|
18
22
|
deploy:
|
data/CHANGELOG.md
CHANGED
|
@@ -3,42 +3,13 @@ All notable changes to this project will be documented in this file.
|
|
|
3
3
|
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
5
5
|
|
|
6
|
-
## [5.0.0
|
|
7
|
-
### Fixed
|
|
8
|
-
- Fixed collection types sometimes generating as `T::::Array`
|
|
9
|
-
|
|
10
|
-
## [5.0.0.beta.5] - 2020-10-03
|
|
11
|
-
### Added
|
|
12
|
-
- Added `Types::Generic` for user-defined generic types
|
|
13
|
-
|
|
14
|
-
## [5.0.0.beta.4] - 2020-09-22
|
|
15
|
-
### Added
|
|
16
|
-
- Added support for parsing type aliases from RBI
|
|
17
|
-
- Added conversion from RBI to RBS type aliases
|
|
18
|
-
|
|
19
|
-
## [5.0.0.beta.3] - 2020-09-15
|
|
20
|
-
### Changed
|
|
21
|
-
- Changed the RBS keyword warning to come from "RBS generation" rather than
|
|
22
|
-
"Type generalization"
|
|
23
|
-
- Added many more of RBS' keywords which are detected and prefixed with an
|
|
24
|
-
underscore to avoid syntax errors
|
|
25
|
-
|
|
26
|
-
## [5.0.0.beta.2] - 2020-09-14
|
|
27
|
-
### Added
|
|
28
|
-
- Added `Types::Type#describe` for simple text descriptions of types
|
|
29
|
-
- Added `Types::Self` for RBI's `T.self_type` or RBS' `self`
|
|
30
|
-
|
|
31
|
-
### Fixed
|
|
32
|
-
- Fixed `RbiGenerator::Namespace#create_method`'s `returns:` kwarg only
|
|
33
|
-
accepting String types
|
|
34
|
-
- Fixed lack of spacing between argument lists and blocks in RBS
|
|
35
|
-
- Fixed RBS attributes not having comments
|
|
36
|
-
|
|
37
|
-
## [5.0.0.beta.1] - 2020-09-13
|
|
6
|
+
## [5.0.0] - 2020-12-26
|
|
38
7
|
### Added
|
|
39
8
|
- Added RBS generation support! This includes:
|
|
40
9
|
- The new `RbsGenerator` class
|
|
41
10
|
- `RbsObject` and a set of subclasses representing different RBS components
|
|
11
|
+
- **Note:** RBS does not yet support Parlour plugins and some other features.
|
|
12
|
+
Refer to the README for a full breakdown!
|
|
42
13
|
- Added the `Types` module, which is used to describe types agnostic of the
|
|
43
14
|
underlying type system
|
|
44
15
|
- Added `RbiGenerator::Namespace#generalize_from_rbi!` to convert RBI string
|
|
@@ -50,6 +21,66 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
50
21
|
- `TypedObject`, which `RbiObject` and `RbsObject` both inherit from
|
|
51
22
|
- `Generator`, which `RbiGenerator` and `RbsGenerator` both inherit from
|
|
52
23
|
- Added RBI type aliases
|
|
24
|
+
- Added `sealed!` for RBI namespaces
|
|
25
|
+
- Added `abstract!` for RBI modules
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- `Parlour::RbiGenerator::Options` is now `Parlour::Options`. An alias exists
|
|
29
|
+
for now, but **`Parlour::RbiGenerator::Options` is deprecated** and could be
|
|
30
|
+
removed in future versions.
|
|
31
|
+
- Updated README and gem metadata to refer to Parlour as a type information
|
|
32
|
+
generator, rather than just an RBI generator
|
|
33
|
+
|
|
34
|
+
<details>
|
|
35
|
+
<summary>5.0.0 pre-releases</summary>
|
|
36
|
+
|
|
37
|
+
## [5.0.0.beta.6] - 2020-10-04
|
|
38
|
+
### Fixed
|
|
39
|
+
- Fixed collection types sometimes generating as `T::::Array`
|
|
40
|
+
|
|
41
|
+
## [5.0.0.beta.5] - 2020-10-03
|
|
42
|
+
### Added
|
|
43
|
+
- Added `Types::Generic` for user-defined generic types
|
|
44
|
+
|
|
45
|
+
## [5.0.0.beta.4] - 2020-09-22
|
|
46
|
+
### Added
|
|
47
|
+
- Added support for parsing type aliases from RBI
|
|
48
|
+
- Added conversion from RBI to RBS type aliases
|
|
49
|
+
|
|
50
|
+
## [5.0.0.beta.3] - 2020-09-15
|
|
51
|
+
### Changed
|
|
52
|
+
- Changed the RBS keyword warning to come from "RBS generation" rather than
|
|
53
|
+
"Type generalization"
|
|
54
|
+
- Added many more of RBS' keywords which are detected and prefixed with an
|
|
55
|
+
underscore to avoid syntax errors
|
|
56
|
+
|
|
57
|
+
## [5.0.0.beta.2] - 2020-09-14
|
|
58
|
+
### Added
|
|
59
|
+
- Added `Types::Type#describe` for simple text descriptions of types
|
|
60
|
+
- Added `Types::Self` for RBI's `T.self_type` or RBS' `self`
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
- Fixed `RbiGenerator::Namespace#create_method`'s `returns:` kwarg only
|
|
64
|
+
accepting String types
|
|
65
|
+
- Fixed lack of spacing between argument lists and blocks in RBS
|
|
66
|
+
- Fixed RBS attributes not having comments
|
|
67
|
+
|
|
68
|
+
## [5.0.0.beta.1] - 2020-09-13
|
|
69
|
+
### Added
|
|
70
|
+
- Added RBS generation support! This includes:
|
|
71
|
+
- The new `RbsGenerator` class
|
|
72
|
+
- `RbsObject` and a set of subclasses representing different RBS components
|
|
73
|
+
- Added the `Types` module, which is used to describe types agnostic of the
|
|
74
|
+
underlying type system
|
|
75
|
+
- Added `RbiGenerator::Namespace#generalize_from_rbi!` to convert RBI string
|
|
76
|
+
types into `Types` types
|
|
77
|
+
- **Specifying types as strings is still currently supported, but may be
|
|
78
|
+
phased out in future, and should be avoided in new projects**.
|
|
79
|
+
- Added conversion from RBI to RBS type trees
|
|
80
|
+
- Added a couple of classes to deduplicate functionality between type systems:
|
|
81
|
+
- `TypedObject`, which `RbiObject` and `RbsObject` both inherit from
|
|
82
|
+
- `Generator`, which `RbiGenerator` and `RbsGenerator` both inherit from
|
|
83
|
+
- Added RBI type aliases
|
|
53
84
|
|
|
54
85
|
### Changed
|
|
55
86
|
- `Parlour::RbiGenerator::Options` is now `Parlour::Options`. An alias exists
|
|
@@ -57,6 +88,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
57
88
|
removed in future versions.
|
|
58
89
|
- Updated README and gem metadata to refer to Parlour as a type information
|
|
59
90
|
generator, rather than just an RBI generator
|
|
91
|
+
</details>
|
|
60
92
|
|
|
61
93
|
## [4.0.1] - 2020-08-05
|
|
62
94
|
### Fixed
|
data/README.md
CHANGED
|
@@ -407,6 +407,8 @@ srb rbi gems
|
|
|
407
407
|
srb rbi sorbet-typed
|
|
408
408
|
```
|
|
409
409
|
|
|
410
|
+
You should also regenerate the parlour.rbi file by running `bundle exec parlour`. Don't edit this file manually, as your changes will be overwritten!
|
|
411
|
+
|
|
410
412
|
## License
|
|
411
413
|
|
|
412
414
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/ci/check_rbi.sh
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Checks that the RBI in rbi/parlour.rbi is up-to-date with committed changes.
|
|
3
|
+
# This is done by generating a new RBI and comparing it with the committed RBI.
|
|
4
|
+
set -ev
|
|
5
|
+
|
|
6
|
+
bundle install
|
|
7
|
+
mv rbi/parlour.rbi rbi/parlour-committed.rbi
|
|
8
|
+
bundle exec parlour
|
|
9
|
+
cmp -s rbi/parlour.rbi rbi/parlour-committed.rbi
|
|
@@ -10,6 +10,7 @@ module Parlour
|
|
|
10
10
|
generator: Generator,
|
|
11
11
|
name: String,
|
|
12
12
|
final: T::Boolean,
|
|
13
|
+
sealed: T::Boolean,
|
|
13
14
|
superclass: T.nilable(String),
|
|
14
15
|
abstract: T::Boolean,
|
|
15
16
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
@@ -21,13 +22,14 @@ module Parlour
|
|
|
21
22
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
|
22
23
|
# @param name [String] The name of this class.
|
|
23
24
|
# @param final [Boolean] Whether this namespace is final.
|
|
25
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
24
26
|
# @param superclass [String, nil] The superclass of this class, or nil if it doesn't
|
|
25
27
|
# have one.
|
|
26
28
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
|
27
29
|
# @param block A block which the new instance yields itself to.
|
|
28
30
|
# @return [void]
|
|
29
|
-
def initialize(generator, name, final, superclass, abstract, &block)
|
|
30
|
-
super(generator, name, final, &block)
|
|
31
|
+
def initialize(generator, name, final, sealed, superclass, abstract, &block)
|
|
32
|
+
super(generator, name, final, sealed, &block)
|
|
31
33
|
@superclass = superclass
|
|
32
34
|
@abstract = abstract
|
|
33
35
|
end
|
|
@@ -10,6 +10,7 @@ module Parlour
|
|
|
10
10
|
generator: Generator,
|
|
11
11
|
name: String,
|
|
12
12
|
final: T::Boolean,
|
|
13
|
+
sealed: T::Boolean,
|
|
13
14
|
enums: T::Array[T.any([String, String], String)],
|
|
14
15
|
abstract: T::Boolean,
|
|
15
16
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
|
@@ -21,12 +22,13 @@ module Parlour
|
|
|
21
22
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
|
22
23
|
# @param name [String] The name of this class.
|
|
23
24
|
# @param final [Boolean] Whether this namespace is final.
|
|
25
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
24
26
|
# @param enums [Array<(String, String), String>] The values of the enumeration.
|
|
25
27
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
|
26
28
|
# @param block A block which the new instance yields itself to.
|
|
27
29
|
# @return [void]
|
|
28
|
-
def initialize(generator, name, final, enums, abstract, &block)
|
|
29
|
-
super(generator, name, final, 'T::Enum', abstract, &block)
|
|
30
|
+
def initialize(generator, name, final, sealed, enums, abstract, &block)
|
|
31
|
+
super(generator, name, final, sealed, 'T::Enum', abstract, &block)
|
|
30
32
|
@enums = enums
|
|
31
33
|
end
|
|
32
34
|
|
|
@@ -10,24 +10,29 @@ module Parlour
|
|
|
10
10
|
generator: Generator,
|
|
11
11
|
name: String,
|
|
12
12
|
final: T::Boolean,
|
|
13
|
+
sealed: T::Boolean,
|
|
13
14
|
interface: T::Boolean,
|
|
15
|
+
abstract: T::Boolean,
|
|
14
16
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
15
17
|
).void
|
|
16
18
|
end
|
|
17
19
|
# Creates a new module definition.
|
|
18
20
|
# @note You should use {Namespace#create_module} rather than this directly.
|
|
19
|
-
#
|
|
21
|
+
#
|
|
20
22
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
|
21
23
|
# @param name [String] The name of this module.
|
|
22
24
|
# @param final [Boolean] Whether this namespace is final.
|
|
25
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
23
26
|
# @param interface [Boolean] A boolean indicating whether this module is an
|
|
24
27
|
# interface.
|
|
28
|
+
# @param abstract [Boolean] A boolean indicating whether this module is abstract.
|
|
25
29
|
# @param block A block which the new instance yields itself to.
|
|
26
30
|
# @return [void]
|
|
27
|
-
def initialize(generator, name, final, interface, &block)
|
|
28
|
-
super(generator, name, final, &block)
|
|
31
|
+
def initialize(generator, name, final, sealed, interface, abstract, &block)
|
|
32
|
+
super(generator, name, final, sealed, &block)
|
|
29
33
|
@name = name
|
|
30
34
|
@interface = interface
|
|
35
|
+
@abstract = abstract
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
sig do
|
|
@@ -41,10 +46,11 @@ module Parlour
|
|
|
41
46
|
# @param indent_level [Integer] The indentation level to generate the lines at.
|
|
42
47
|
# @param options [Options] The formatting options to use.
|
|
43
48
|
# @return [Array<String>] The RBI lines, formatted as specified.
|
|
44
|
-
def generate_rbi(indent_level, options)
|
|
49
|
+
def generate_rbi(indent_level, options)
|
|
45
50
|
lines = generate_comments(indent_level, options)
|
|
46
51
|
lines << options.indented(indent_level, "module #{name}")
|
|
47
52
|
lines += [options.indented(indent_level + 1, "interface!"), ""] if interface
|
|
53
|
+
lines += [options.indented(indent_level + 1, "abstract!"), ""] if abstract
|
|
48
54
|
lines += generate_body(indent_level + 1, options)
|
|
49
55
|
lines << options.indented(indent_level, "end")
|
|
50
56
|
end
|
|
@@ -54,6 +60,11 @@ module Parlour
|
|
|
54
60
|
# @return [Boolean]
|
|
55
61
|
attr_reader :interface
|
|
56
62
|
|
|
63
|
+
sig { returns(T::Boolean) }
|
|
64
|
+
# A boolean indicating whether this module is abstract or not.
|
|
65
|
+
# @return [Boolean]
|
|
66
|
+
attr_reader :abstract
|
|
67
|
+
|
|
57
68
|
sig do
|
|
58
69
|
override.params(
|
|
59
70
|
others: T::Array[RbiGenerator::RbiObject]
|
|
@@ -61,7 +72,7 @@ module Parlour
|
|
|
61
72
|
end
|
|
62
73
|
# Given an array of {Namespace} instances, returns true if they may
|
|
63
74
|
# be merged into this instance using {merge_into_self}. For instances to
|
|
64
|
-
# be mergeable, they must either all be interfaces or all not be
|
|
75
|
+
# be mergeable, they must either all be interfaces or all not be
|
|
65
76
|
# interfaces.
|
|
66
77
|
#
|
|
67
78
|
# @param others [Array<RbiGenerator::RbiObject>] An array of other {Namespace} instances.
|
|
@@ -75,7 +86,7 @@ module Parlour
|
|
|
75
86
|
all_modules.map(&:interface).uniq.length == 1
|
|
76
87
|
end
|
|
77
88
|
|
|
78
|
-
sig do
|
|
89
|
+
sig do
|
|
79
90
|
override.params(
|
|
80
91
|
others: T::Array[RbiGenerator::RbiObject]
|
|
81
92
|
).void
|
|
@@ -93,7 +104,8 @@ module Parlour
|
|
|
93
104
|
# Returns a human-readable brief string description of this module.
|
|
94
105
|
# @return [String]
|
|
95
106
|
def describe
|
|
96
|
-
"Module #{name} - #{"interface, " if interface}
|
|
107
|
+
"Module #{name} - #{"interface, " if interface}" +
|
|
108
|
+
"#{"abstract, " if abstract}#{children.length} " +
|
|
97
109
|
"children, #{includes.length} includes, #{extends.length} extends"
|
|
98
110
|
end
|
|
99
111
|
|
|
@@ -27,6 +27,7 @@ module Parlour
|
|
|
27
27
|
generator: Generator,
|
|
28
28
|
name: T.nilable(String),
|
|
29
29
|
final: T::Boolean,
|
|
30
|
+
sealed: T::Boolean,
|
|
30
31
|
block: T.nilable(T.proc.params(x: Namespace).void)
|
|
31
32
|
).void
|
|
32
33
|
end
|
|
@@ -37,13 +38,15 @@ module Parlour
|
|
|
37
38
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
|
38
39
|
# @param name [String, nil] The name of this module.
|
|
39
40
|
# @param final [Boolean] Whether this namespace is final.
|
|
41
|
+
# @param final [Boolean] Whether this namespace is sealed.
|
|
40
42
|
# @param block A block which the new instance yields itself to.
|
|
41
43
|
# @return [void]
|
|
42
|
-
def initialize(generator, name = nil, final = false, &block)
|
|
44
|
+
def initialize(generator, name = nil, final = false, sealed = false, &block)
|
|
43
45
|
super(generator, name || '<anonymous namespace>')
|
|
44
46
|
@children = []
|
|
45
47
|
@next_comments = []
|
|
46
48
|
@final = final
|
|
49
|
+
@sealed = sealed
|
|
47
50
|
yield_self(&block) if block
|
|
48
51
|
end
|
|
49
52
|
|
|
@@ -52,6 +55,11 @@ module Parlour
|
|
|
52
55
|
# @return [Boolean]
|
|
53
56
|
attr_reader :final
|
|
54
57
|
|
|
58
|
+
sig { returns(T::Boolean) }
|
|
59
|
+
# Whether this namespace is sealed.
|
|
60
|
+
# @return [Boolean]
|
|
61
|
+
attr_reader :sealed
|
|
62
|
+
|
|
55
63
|
sig { returns(T::Array[RbiObject]) }
|
|
56
64
|
# The child {RbiObject} instances inside this namespace.
|
|
57
65
|
# @return [Array<RbiObject>]
|
|
@@ -151,6 +159,7 @@ module Parlour
|
|
|
151
159
|
params(
|
|
152
160
|
name: String,
|
|
153
161
|
final: T::Boolean,
|
|
162
|
+
sealed: T::Boolean,
|
|
154
163
|
superclass: T.nilable(String),
|
|
155
164
|
abstract: T::Boolean,
|
|
156
165
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
@@ -168,13 +177,14 @@ module Parlour
|
|
|
168
177
|
#
|
|
169
178
|
# @param name [String] The name of this class.
|
|
170
179
|
# @param final [Boolean] Whether this namespace is final.
|
|
180
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
171
181
|
# @param superclass [String, nil] The superclass of this class, or nil if it doesn't
|
|
172
182
|
# have one.
|
|
173
183
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
|
174
184
|
# @param block A block which the new instance yields itself to.
|
|
175
185
|
# @return [ClassNamespace]
|
|
176
|
-
def create_class(name, final: false, superclass: nil, abstract: false, &block)
|
|
177
|
-
new_class = ClassNamespace.new(generator, name, final, superclass, abstract, &block)
|
|
186
|
+
def create_class(name, final: false, sealed: false, superclass: nil, abstract: false, &block)
|
|
187
|
+
new_class = ClassNamespace.new(generator, name, final, sealed, superclass, abstract, &block)
|
|
178
188
|
move_next_comments(new_class)
|
|
179
189
|
children << new_class
|
|
180
190
|
new_class
|
|
@@ -184,6 +194,7 @@ module Parlour
|
|
|
184
194
|
params(
|
|
185
195
|
name: String,
|
|
186
196
|
final: T::Boolean,
|
|
197
|
+
sealed: T::Boolean,
|
|
187
198
|
enums: T.nilable(T::Array[T.any([String, String], String)]),
|
|
188
199
|
abstract: T::Boolean,
|
|
189
200
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
|
@@ -196,12 +207,13 @@ module Parlour
|
|
|
196
207
|
#
|
|
197
208
|
# @param name [String] The name of this class.
|
|
198
209
|
# @param final [Boolean] Whether this namespace is final.
|
|
210
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
199
211
|
# @param enums [Array<(String, String), String>] The values of the enumeration.
|
|
200
212
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
|
201
213
|
# @param block A block which the new instance yields itself to.
|
|
202
214
|
# @return [EnumClassNamespace]
|
|
203
|
-
def create_enum_class(name, final: false, enums: nil, abstract: false, &block)
|
|
204
|
-
new_enum_class = EnumClassNamespace.new(generator, name, final, enums || [], abstract, &block)
|
|
215
|
+
def create_enum_class(name, final: false, sealed: false, enums: nil, abstract: false, &block)
|
|
216
|
+
new_enum_class = EnumClassNamespace.new(generator, name, final, sealed, enums || [], abstract, &block)
|
|
205
217
|
move_next_comments(new_enum_class)
|
|
206
218
|
children << new_enum_class
|
|
207
219
|
new_enum_class
|
|
@@ -211,6 +223,7 @@ module Parlour
|
|
|
211
223
|
params(
|
|
212
224
|
name: String,
|
|
213
225
|
final: T::Boolean,
|
|
226
|
+
sealed: T::Boolean,
|
|
214
227
|
props: T.nilable(T::Array[StructProp]),
|
|
215
228
|
abstract: T::Boolean,
|
|
216
229
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
|
@@ -225,12 +238,13 @@ module Parlour
|
|
|
225
238
|
#
|
|
226
239
|
# @param name [String] The name of this class.
|
|
227
240
|
# @param final [Boolean] Whether this namespace is final.
|
|
241
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
228
242
|
# @param props [Array<StructProp>] The props of the struct.
|
|
229
243
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
|
230
244
|
# @param block A block which the new instance yields itself to.
|
|
231
245
|
# @return [EnumClassNamespace]
|
|
232
|
-
def create_struct_class(name, final: false, props: nil, abstract: false, &block)
|
|
233
|
-
new_struct_class = StructClassNamespace.new(generator, name, final, props || [], abstract, &block)
|
|
246
|
+
def create_struct_class(name, final: false, sealed: false, props: nil, abstract: false, &block)
|
|
247
|
+
new_struct_class = StructClassNamespace.new(generator, name, final, sealed, props || [], abstract, &block)
|
|
234
248
|
move_next_comments(new_struct_class)
|
|
235
249
|
children << new_struct_class
|
|
236
250
|
new_struct_class
|
|
@@ -240,7 +254,9 @@ module Parlour
|
|
|
240
254
|
params(
|
|
241
255
|
name: String,
|
|
242
256
|
final: T::Boolean,
|
|
257
|
+
sealed: T::Boolean,
|
|
243
258
|
interface: T::Boolean,
|
|
259
|
+
abstract: T::Boolean,
|
|
244
260
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
245
261
|
).returns(ModuleNamespace)
|
|
246
262
|
end
|
|
@@ -256,12 +272,15 @@ module Parlour
|
|
|
256
272
|
#
|
|
257
273
|
# @param name [String] The name of this module.
|
|
258
274
|
# @param final [Boolean] Whether this namespace is final.
|
|
275
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
259
276
|
# @param interface [Boolean] A boolean indicating whether this module is an
|
|
260
277
|
# interface.
|
|
278
|
+
# @param abstract [Boolean] A boolean indicating whether this module is
|
|
279
|
+
# abstract.
|
|
261
280
|
# @param block A block which the new instance yields itself to.
|
|
262
281
|
# @return [ModuleNamespace]
|
|
263
|
-
def create_module(name, final: false, interface: false, &block)
|
|
264
|
-
new_module = ModuleNamespace.new(generator, name, final, interface, &block)
|
|
282
|
+
def create_module(name, final: false, sealed: false, interface: false, abstract: false, &block)
|
|
283
|
+
new_module = ModuleNamespace.new(generator, name, final, sealed, interface, abstract, &block)
|
|
265
284
|
move_next_comments(new_module)
|
|
266
285
|
children << new_module
|
|
267
286
|
new_module
|
|
@@ -657,6 +676,7 @@ module Parlour
|
|
|
657
676
|
result = []
|
|
658
677
|
|
|
659
678
|
result += [options.indented(indent_level, 'final!'), ''] if final
|
|
679
|
+
result += [options.indented(indent_level, 'sealed!'), ''] if sealed
|
|
660
680
|
|
|
661
681
|
# Split away the eigen constants; these need to be put in a
|
|
662
682
|
# "class << self" block later
|
|
@@ -39,7 +39,7 @@ module Parlour
|
|
|
39
39
|
@name = name
|
|
40
40
|
|
|
41
41
|
prefix = /^(\*\*|\*|\&)?/.match(name)&.captures&.first || ''
|
|
42
|
-
@kind = PREFIXES.rassoc(prefix).first
|
|
42
|
+
@kind = T.must(PREFIXES.rassoc(prefix)).first
|
|
43
43
|
|
|
44
44
|
@kind = :keyword if kind == :normal && name.end_with?(':')
|
|
45
45
|
|
|
@@ -123,12 +123,12 @@ module Parlour
|
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
# A mapping of {kind} values to the characteristic prefixes each kind has.
|
|
126
|
-
PREFIXES = {
|
|
126
|
+
PREFIXES = T.let({
|
|
127
127
|
normal: '',
|
|
128
128
|
splat: '*',
|
|
129
129
|
double_splat: '**',
|
|
130
130
|
block: '&'
|
|
131
|
-
}.freeze
|
|
131
|
+
}.freeze, T::Hash[Symbol, String])
|
|
132
132
|
|
|
133
133
|
sig { void }
|
|
134
134
|
def generalize_from_rbi!
|
|
@@ -11,6 +11,7 @@ module Parlour
|
|
|
11
11
|
generator: Generator,
|
|
12
12
|
name: String,
|
|
13
13
|
final: T::Boolean,
|
|
14
|
+
sealed: T::Boolean,
|
|
14
15
|
props: T::Array[StructProp],
|
|
15
16
|
abstract: T::Boolean,
|
|
16
17
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
|
@@ -22,12 +23,13 @@ module Parlour
|
|
|
22
23
|
# @param generator [RbiGenerator] The current RbiGenerator.
|
|
23
24
|
# @param name [String] The name of this class.
|
|
24
25
|
# @param final [Boolean] Whether this namespace is final.
|
|
26
|
+
# @param sealed [Boolean] Whether this namespace is sealed.
|
|
25
27
|
# @param props [Array<StructProp>] The props of the struct.
|
|
26
28
|
# @param abstract [Boolean] A boolean indicating whether this class is abstract.
|
|
27
29
|
# @param block A block which the new instance yields itself to.
|
|
28
30
|
# @return [void]
|
|
29
|
-
def initialize(generator, name, final, props, abstract, &block)
|
|
30
|
-
super(generator, name, final, 'T::Struct', abstract, &block)
|
|
31
|
+
def initialize(generator, name, final, sealed, props, abstract, &block)
|
|
32
|
+
super(generator, name, final, sealed, 'T::Struct', abstract, &block)
|
|
31
33
|
@props = props
|
|
32
34
|
end
|
|
33
35
|
|
|
@@ -112,9 +112,9 @@ module Parlour
|
|
|
112
112
|
attr_reader :redaction
|
|
113
113
|
|
|
114
114
|
# The optional properties available on instances of this class.
|
|
115
|
-
EXTRA_PROPERTIES = %i{
|
|
115
|
+
EXTRA_PROPERTIES = T.let(%i{
|
|
116
116
|
optional enum dont_store foreign default factory immutable array override redaction
|
|
117
|
-
}
|
|
117
|
+
}, T::Array[Symbol])
|
|
118
118
|
|
|
119
119
|
sig { returns(String) }
|
|
120
120
|
# Returns the +prop+ call required to create this property.
|
|
@@ -89,7 +89,7 @@ module Parlour
|
|
|
89
89
|
|
|
90
90
|
# Merge the first signature line, and indent & concat the rest
|
|
91
91
|
first_line, *rest_lines = *partial_sig_lines
|
|
92
|
-
this_sig_lines[0]
|
|
92
|
+
this_sig_lines[0] = T.unsafe(this_sig_lines[0]) + first_line
|
|
93
93
|
rest_lines&.each do |line|
|
|
94
94
|
this_sig_lines << ' ' * definition.length + options.indented(indent_level, line)
|
|
95
95
|
end
|
data/lib/parlour/type_parser.rb
CHANGED
|
@@ -158,6 +158,7 @@ module Parlour
|
|
|
158
158
|
|
|
159
159
|
name, superclass, body = *node
|
|
160
160
|
final = body_has_modifier?(body, :final!)
|
|
161
|
+
sealed = body_has_modifier?(body, :sealed!)
|
|
161
162
|
abstract = body_has_modifier?(body, :abstract!)
|
|
162
163
|
includes, extends = body ? body_includes_and_extends(body) : [[], []]
|
|
163
164
|
|
|
@@ -170,6 +171,7 @@ module Parlour
|
|
|
170
171
|
generator,
|
|
171
172
|
n.to_s,
|
|
172
173
|
false,
|
|
174
|
+
false,
|
|
173
175
|
)
|
|
174
176
|
target.children << new_obj if target
|
|
175
177
|
target = new_obj
|
|
@@ -233,6 +235,7 @@ module Parlour
|
|
|
233
235
|
generator,
|
|
234
236
|
this_name.to_s,
|
|
235
237
|
final,
|
|
238
|
+
sealed,
|
|
236
239
|
props,
|
|
237
240
|
abstract,
|
|
238
241
|
)
|
|
@@ -256,6 +259,7 @@ module Parlour
|
|
|
256
259
|
generator,
|
|
257
260
|
this_name.to_s,
|
|
258
261
|
final,
|
|
262
|
+
sealed,
|
|
259
263
|
enums,
|
|
260
264
|
abstract,
|
|
261
265
|
)
|
|
@@ -264,6 +268,7 @@ module Parlour
|
|
|
264
268
|
generator,
|
|
265
269
|
this_name.to_s,
|
|
266
270
|
final,
|
|
271
|
+
sealed,
|
|
267
272
|
node_to_s(superclass),
|
|
268
273
|
abstract,
|
|
269
274
|
)
|
|
@@ -275,7 +280,7 @@ module Parlour
|
|
|
275
280
|
|
|
276
281
|
if target
|
|
277
282
|
target.children << final_obj
|
|
278
|
-
[top_level]
|
|
283
|
+
[T.must(top_level)]
|
|
279
284
|
else
|
|
280
285
|
[final_obj]
|
|
281
286
|
end
|
|
@@ -283,7 +288,9 @@ module Parlour
|
|
|
283
288
|
parse_err 'cannot declare modules in an eigenclass', node if is_within_eigenclass
|
|
284
289
|
|
|
285
290
|
name, body = *node
|
|
291
|
+
abstract = body_has_modifier?(body, :abstract!)
|
|
286
292
|
final = body_has_modifier?(body, :final!)
|
|
293
|
+
sealed = body_has_modifier?(body, :sealed!)
|
|
287
294
|
interface = body_has_modifier?(body, :interface!)
|
|
288
295
|
includes, extends = body ? body_includes_and_extends(body) : [[], []]
|
|
289
296
|
|
|
@@ -296,6 +303,7 @@ module Parlour
|
|
|
296
303
|
generator,
|
|
297
304
|
n.to_s,
|
|
298
305
|
false,
|
|
306
|
+
false,
|
|
299
307
|
)
|
|
300
308
|
target.children << new_obj if target
|
|
301
309
|
target = new_obj
|
|
@@ -306,7 +314,9 @@ module Parlour
|
|
|
306
314
|
generator,
|
|
307
315
|
this_name.to_s,
|
|
308
316
|
final,
|
|
317
|
+
sealed,
|
|
309
318
|
interface,
|
|
319
|
+
abstract,
|
|
310
320
|
) do |m|
|
|
311
321
|
m.children.concat(parse_path_to_object(path.child(1))) if body
|
|
312
322
|
m.create_includes(includes)
|
|
@@ -315,7 +325,7 @@ module Parlour
|
|
|
315
325
|
|
|
316
326
|
if target
|
|
317
327
|
target.children << final_obj
|
|
318
|
-
[top_level]
|
|
328
|
+
[T.must(top_level)]
|
|
319
329
|
else
|
|
320
330
|
[final_obj]
|
|
321
331
|
end
|
data/lib/parlour/version.rb
CHANGED
data/rbi/parlour.rbi
CHANGED
|
@@ -3,7 +3,7 @@ module Kernel
|
|
|
3
3
|
end
|
|
4
4
|
|
|
5
5
|
module Parlour
|
|
6
|
-
VERSION = '5.0.0
|
|
6
|
+
VERSION = '5.0.0'
|
|
7
7
|
|
|
8
8
|
class ConflictResolver
|
|
9
9
|
extend T::Sig
|
|
@@ -772,12 +772,13 @@ module Parlour
|
|
|
772
772
|
generator: Generator,
|
|
773
773
|
name: String,
|
|
774
774
|
final: T::Boolean,
|
|
775
|
+
sealed: T::Boolean,
|
|
775
776
|
superclass: T.nilable(String),
|
|
776
777
|
abstract: T::Boolean,
|
|
777
778
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
778
779
|
).void
|
|
779
780
|
end
|
|
780
|
-
def initialize(generator, name, final, superclass, abstract, &block); end
|
|
781
|
+
def initialize(generator, name, final, sealed, superclass, abstract, &block); end
|
|
781
782
|
|
|
782
783
|
sig { override.params(indent_level: Integer, options: Options).returns(T::Array[String]) }
|
|
783
784
|
def generate_rbi(indent_level, options); end
|
|
@@ -846,12 +847,13 @@ module Parlour
|
|
|
846
847
|
generator: Generator,
|
|
847
848
|
name: String,
|
|
848
849
|
final: T::Boolean,
|
|
850
|
+
sealed: T::Boolean,
|
|
849
851
|
enums: T::Array[T.any([String, String], String)],
|
|
850
852
|
abstract: T::Boolean,
|
|
851
853
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
|
852
854
|
).void
|
|
853
855
|
end
|
|
854
|
-
def initialize(generator, name, final, enums, abstract, &block); end
|
|
856
|
+
def initialize(generator, name, final, sealed, enums, abstract, &block); end
|
|
855
857
|
|
|
856
858
|
sig { returns(T::Array[T.any([String, String], String)]) }
|
|
857
859
|
attr_reader :enums
|
|
@@ -996,11 +998,13 @@ module Parlour
|
|
|
996
998
|
generator: Generator,
|
|
997
999
|
name: String,
|
|
998
1000
|
final: T::Boolean,
|
|
1001
|
+
sealed: T::Boolean,
|
|
999
1002
|
interface: T::Boolean,
|
|
1003
|
+
abstract: T::Boolean,
|
|
1000
1004
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
1001
1005
|
).void
|
|
1002
1006
|
end
|
|
1003
|
-
def initialize(generator, name, final, interface, &block); end
|
|
1007
|
+
def initialize(generator, name, final, sealed, interface, abstract, &block); end
|
|
1004
1008
|
|
|
1005
1009
|
sig { override.params(indent_level: Integer, options: Options).returns(T::Array[String]) }
|
|
1006
1010
|
def generate_rbi(indent_level, options); end
|
|
@@ -1008,6 +1012,9 @@ module Parlour
|
|
|
1008
1012
|
sig { returns(T::Boolean) }
|
|
1009
1013
|
attr_reader :interface
|
|
1010
1014
|
|
|
1015
|
+
sig { returns(T::Boolean) }
|
|
1016
|
+
attr_reader :abstract
|
|
1017
|
+
|
|
1011
1018
|
sig { override.params(others: T::Array[RbiGenerator::RbiObject]).returns(T::Boolean) }
|
|
1012
1019
|
def mergeable?(others); end
|
|
1013
1020
|
|
|
@@ -1032,14 +1039,18 @@ module Parlour
|
|
|
1032
1039
|
generator: Generator,
|
|
1033
1040
|
name: T.nilable(String),
|
|
1034
1041
|
final: T::Boolean,
|
|
1042
|
+
sealed: T::Boolean,
|
|
1035
1043
|
block: T.nilable(T.proc.params(x: Namespace).void)
|
|
1036
1044
|
).void
|
|
1037
1045
|
end
|
|
1038
|
-
def initialize(generator, name = nil, final = false, &block); end
|
|
1046
|
+
def initialize(generator, name = nil, final = false, sealed = false, &block); end
|
|
1039
1047
|
|
|
1040
1048
|
sig { returns(T::Boolean) }
|
|
1041
1049
|
attr_reader :final
|
|
1042
1050
|
|
|
1051
|
+
sig { returns(T::Boolean) }
|
|
1052
|
+
attr_reader :sealed
|
|
1053
|
+
|
|
1043
1054
|
sig { returns(T::Array[RbiObject]) }
|
|
1044
1055
|
attr_reader :children
|
|
1045
1056
|
|
|
@@ -1065,44 +1076,49 @@ module Parlour
|
|
|
1065
1076
|
params(
|
|
1066
1077
|
name: String,
|
|
1067
1078
|
final: T::Boolean,
|
|
1079
|
+
sealed: T::Boolean,
|
|
1068
1080
|
superclass: T.nilable(String),
|
|
1069
1081
|
abstract: T::Boolean,
|
|
1070
1082
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
1071
1083
|
).returns(ClassNamespace)
|
|
1072
1084
|
end
|
|
1073
|
-
def create_class(name, final: false, superclass: nil, abstract: false, &block); end
|
|
1085
|
+
def create_class(name, final: false, sealed: false, superclass: nil, abstract: false, &block); end
|
|
1074
1086
|
|
|
1075
1087
|
sig do
|
|
1076
1088
|
params(
|
|
1077
1089
|
name: String,
|
|
1078
1090
|
final: T::Boolean,
|
|
1091
|
+
sealed: T::Boolean,
|
|
1079
1092
|
enums: T.nilable(T::Array[T.any([String, String], String)]),
|
|
1080
1093
|
abstract: T::Boolean,
|
|
1081
1094
|
block: T.nilable(T.proc.params(x: EnumClassNamespace).void)
|
|
1082
1095
|
).returns(EnumClassNamespace)
|
|
1083
1096
|
end
|
|
1084
|
-
def create_enum_class(name, final: false, enums: nil, abstract: false, &block); end
|
|
1097
|
+
def create_enum_class(name, final: false, sealed: false, enums: nil, abstract: false, &block); end
|
|
1085
1098
|
|
|
1086
1099
|
sig do
|
|
1087
1100
|
params(
|
|
1088
1101
|
name: String,
|
|
1089
1102
|
final: T::Boolean,
|
|
1103
|
+
sealed: T::Boolean,
|
|
1090
1104
|
props: T.nilable(T::Array[StructProp]),
|
|
1091
1105
|
abstract: T::Boolean,
|
|
1092
1106
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
|
1093
1107
|
).returns(StructClassNamespace)
|
|
1094
1108
|
end
|
|
1095
|
-
def create_struct_class(name, final: false, props: nil, abstract: false, &block); end
|
|
1109
|
+
def create_struct_class(name, final: false, sealed: false, props: nil, abstract: false, &block); end
|
|
1096
1110
|
|
|
1097
1111
|
sig do
|
|
1098
1112
|
params(
|
|
1099
1113
|
name: String,
|
|
1100
1114
|
final: T::Boolean,
|
|
1115
|
+
sealed: T::Boolean,
|
|
1101
1116
|
interface: T::Boolean,
|
|
1117
|
+
abstract: T::Boolean,
|
|
1102
1118
|
block: T.nilable(T.proc.params(x: ClassNamespace).void)
|
|
1103
1119
|
).returns(ModuleNamespace)
|
|
1104
1120
|
end
|
|
1105
|
-
def create_module(name, final: false, interface: false, &block); end
|
|
1121
|
+
def create_module(name, final: false, sealed: false, interface: false, abstract: false, &block); end
|
|
1106
1122
|
|
|
1107
1123
|
sig do
|
|
1108
1124
|
params(
|
|
@@ -1212,12 +1228,12 @@ module Parlour
|
|
|
1212
1228
|
|
|
1213
1229
|
class Parameter
|
|
1214
1230
|
extend T::Sig
|
|
1215
|
-
PREFIXES = {
|
|
1231
|
+
PREFIXES = T.let({
|
|
1216
1232
|
normal: '',
|
|
1217
1233
|
splat: '*',
|
|
1218
1234
|
double_splat: '**',
|
|
1219
1235
|
block: '&'
|
|
1220
|
-
}.freeze
|
|
1236
|
+
}.freeze, T::Hash[Symbol, String])
|
|
1221
1237
|
|
|
1222
1238
|
sig { params(name: String, type: T.nilable(Types::TypeLike), default: T.nilable(String)).void }
|
|
1223
1239
|
def initialize(name, type: nil, default: nil); end
|
|
@@ -1283,12 +1299,13 @@ module Parlour
|
|
|
1283
1299
|
generator: Generator,
|
|
1284
1300
|
name: String,
|
|
1285
1301
|
final: T::Boolean,
|
|
1302
|
+
sealed: T::Boolean,
|
|
1286
1303
|
props: T::Array[StructProp],
|
|
1287
1304
|
abstract: T::Boolean,
|
|
1288
1305
|
block: T.nilable(T.proc.params(x: StructClassNamespace).void)
|
|
1289
1306
|
).void
|
|
1290
1307
|
end
|
|
1291
|
-
def initialize(generator, name, final, props, abstract, &block); end
|
|
1308
|
+
def initialize(generator, name, final, sealed, props, abstract, &block); end
|
|
1292
1309
|
|
|
1293
1310
|
sig { returns(T::Array[StructProp]) }
|
|
1294
1311
|
attr_reader :props
|
|
@@ -1308,9 +1325,9 @@ module Parlour
|
|
|
1308
1325
|
|
|
1309
1326
|
class StructProp
|
|
1310
1327
|
extend T::Sig
|
|
1311
|
-
EXTRA_PROPERTIES = %i{
|
|
1328
|
+
EXTRA_PROPERTIES = T.let(%i{
|
|
1312
1329
|
optional enum dont_store foreign default factory immutable array override redaction
|
|
1313
|
-
}
|
|
1330
|
+
}, T::Array[Symbol])
|
|
1314
1331
|
|
|
1315
1332
|
sig do
|
|
1316
1333
|
params(
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: parlour
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.0.0
|
|
4
|
+
version: 5.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Aaron Christiansen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-12-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: sorbet-runtime
|
|
@@ -156,6 +156,7 @@ files:
|
|
|
156
156
|
- LICENSE.txt
|
|
157
157
|
- README.md
|
|
158
158
|
- Rakefile
|
|
159
|
+
- ci/check_rbi.sh
|
|
159
160
|
- exe/parlour
|
|
160
161
|
- lib/parlour.rb
|
|
161
162
|
- lib/parlour/conflict_resolver.rb
|
|
@@ -224,9 +225,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
224
225
|
version: '0'
|
|
225
226
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
227
|
requirements:
|
|
227
|
-
- - "
|
|
228
|
+
- - ">="
|
|
228
229
|
- !ruby/object:Gem::Version
|
|
229
|
-
version:
|
|
230
|
+
version: '0'
|
|
230
231
|
requirements: []
|
|
231
232
|
rubygems_version: 3.0.3
|
|
232
233
|
signing_key:
|