parlour 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +13 -1
- data/CHANGELOG.md +10 -0
- data/README.md +5 -66
- data/lib/parlour.rb +4 -0
- data/lib/parlour/rbi_generator/arbitrary.rb +92 -0
- data/lib/parlour/rbi_generator/constant.rb +94 -0
- data/lib/parlour/rbi_generator/extend.rb +87 -0
- data/lib/parlour/rbi_generator/include.rb +87 -0
- data/lib/parlour/rbi_generator/namespace.rb +108 -51
- data/lib/parlour/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cfa95875716d50b33a4d3557fd6b60d6d477bed3e933c6c369d148399193cff
|
4
|
+
data.tar.gz: 2c9f22571d96d3d592353807c3b40e96e1e567968b761a1ba1174cfeb3a5ecca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a40ddab81583e19e1552c1b4e35257a8f99cf8d862221eb4c5b8641097d299a07b0290ab8d6ecedacfc94b0881cd95ab709bf9596446d1e41fceaebd823bc720
|
7
|
+
data.tar.gz: 4de8a3ac91b6c17ebc99d5659f2af8f4cf52083963f60a5851809b05e7237797af6ea81126d35e716b9c46ebe90ace4c0d561d0d582f8ae16a973a159957218a
|
data/.travis.yml
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
language: ruby
|
2
|
+
dist: trusty
|
2
3
|
before_install:
|
3
4
|
- gem install bundler
|
5
|
+
- gem install yard
|
4
6
|
rvm:
|
5
|
-
- 2.6
|
7
|
+
- 2.6
|
8
|
+
after_success:
|
9
|
+
- yard
|
10
|
+
deploy:
|
11
|
+
provider: pages
|
12
|
+
local_dir: doc
|
13
|
+
skip_cleanup: true
|
14
|
+
github_token: $GITHUB_TOKEN
|
15
|
+
keep_history: true
|
16
|
+
on:
|
17
|
+
branch: master
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,16 @@ 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
|
+
## [0.5.0] - 2019-07-20
|
7
|
+
### Added
|
8
|
+
- Added the `create_arbitrary` method for inserting arbitrary code into the
|
9
|
+
generated RBI file. This is intended for using constructs which Parlour does
|
10
|
+
not yet support.
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
- Breaking change: `add_constant`, `add_include` and `add_extend` have been
|
14
|
+
replaced with `create_constant`, `create_include` and `create_extend`.
|
15
|
+
|
6
16
|
## [0.4.0] - 2019-07-10
|
7
17
|
### Changed
|
8
18
|
- Breaking change: The Parlour CLI tool no longer takes command-line arguments, and instead uses a `.parlour` configuration file. See the README!
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Parlour
|
2
2
|
|
3
3
|
[![Build Status](https://travis-ci.org/AaronC81/parlour.svg?branch=master)](https://travis-ci.org/AaronC81/parlour)
|
4
|
+
![Gem](https://img.shields.io/gem/v/parlour.svg)
|
4
5
|
|
5
6
|
Parlour is an RBI generator and merger for Sorbet. It consists of two key parts:
|
6
7
|
|
@@ -20,10 +21,11 @@ Parlour is an RBI generator and merger for Sorbet. It consists of two key parts:
|
|
20
21
|
single command and consolidating all of their definitions into a single
|
21
22
|
RBI output file.
|
22
23
|
|
23
|
-
## Usage
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
Please [**read the wiki**](https://github.com/AaronC81/parlour/wiki) to get
|
26
|
+
started!
|
27
|
+
|
28
|
+
## Creating RBIs
|
27
29
|
|
28
30
|
### Using just the generator
|
29
31
|
|
@@ -150,69 +152,6 @@ _Have you written an awesome Parlour plugin? Please submit a PR to add it to thi
|
|
150
152
|
|
151
153
|
- [Sord](https://github.com/AaronC81/sord) - Generate RBIs from YARD documentation
|
152
154
|
|
153
|
-
## Parlour's Code Structure
|
154
|
-
|
155
|
-
### Overall Flow
|
156
|
-
```
|
157
|
-
STEP 1
|
158
|
-
All plugins mutate the
|
159
|
-
instance of RbiGenerator
|
160
|
-
They generate a tree
|
161
|
-
structure of RbiObjects
|
162
|
-
|
163
|
-
+--------+ +--------+
|
164
|
-
|Plugin 1| |Plugin 2|
|
165
|
-
+----+---+ +----+---+ STEP 2
|
166
|
-
^ ^ ConflictResolver
|
167
|
-
| | mutates the structure
|
168
|
-
+-------------------+ | | to fix conflicts
|
169
|
-
| | | |
|
170
|
-
| One instance of +-------------+ +----------------+
|
171
|
-
| RbiGenerator +--------------------->+ConflictResolver|
|
172
|
-
| | +----------------+
|
173
|
-
+---------+---------+
|
174
|
-
|
|
175
|
-
|
|
176
|
-
| +-------+ STEP 3
|
177
|
-
+--------->+ File | The final RBI is written
|
178
|
-
+-------+ to a file
|
179
|
-
```
|
180
|
-
|
181
|
-
### Generation
|
182
|
-
Everything that can generate lines of the RBI implements the
|
183
|
-
`RbiGenerator::RbiObject` abstract class. The function `generate_rbi`
|
184
|
-
accepts the current indentation level and a set of formatting options.
|
185
|
-
(Each object is responsible for generating its own indentation; that is, the
|
186
|
-
lines generated by a child object should not then be indented by its parent.)
|
187
|
-
|
188
|
-
### Plugins
|
189
|
-
Plugins are automatically detected when they subclass `Plugin`. Plugins can then
|
190
|
-
be run by passing an array of them, along with an `RbiGenerator`, to
|
191
|
-
`Plugin.run_plugins`. Once done, the generator will be populated with a tree of
|
192
|
-
(possibly conflicting) `RbiObjects` - the conflict resolver (detailed below)
|
193
|
-
will clear up any conflicts.
|
194
|
-
|
195
|
-
### Conflict Resolution
|
196
|
-
This is a key part of the plugin/build system. The `ConflictResolver` takes
|
197
|
-
a namespace from the `RbiGenerator` and merges duplicate items in it together.
|
198
|
-
This means that many plugins can generate their own signatures which are all
|
199
|
-
bundled into one, conflict-free output RBI.
|
200
|
-
|
201
|
-
It is able to do the following merges automatically:
|
202
|
-
|
203
|
-
- If many methods are identical, delete all but one.
|
204
|
-
- If many classes are defined with the same name, merge their methods,
|
205
|
-
includes and extends. (But only if they are all abstract or all not,
|
206
|
-
and only if they don't define more than one superclass together.)
|
207
|
-
- If many modules are defined with the same name, merge their methods,
|
208
|
-
includes and extends. (But only if they are all interfaces or all not.)
|
209
|
-
|
210
|
-
If a merge can't be performed automatically, then the `#resolve_conflicts`
|
211
|
-
method takes a block. This block is passed all the conflicting objects, and one
|
212
|
-
should be selected and returned - all others will be deleted. (Alternatively,
|
213
|
-
the block can return nil, and all will be deleted.) This allows the CLI to
|
214
|
-
prompt the user asking them what they'd like to do, in the case of conflicts
|
215
|
-
between each plugin's signatures which can't automatically be resolved.
|
216
155
|
|
217
156
|
## Contributing
|
218
157
|
|
data/lib/parlour.rb
CHANGED
@@ -9,7 +9,11 @@ require 'parlour/rbi_generator/parameter'
|
|
9
9
|
require 'parlour/rbi_generator/rbi_object'
|
10
10
|
require 'parlour/rbi_generator/method'
|
11
11
|
require 'parlour/rbi_generator/attribute'
|
12
|
+
require 'parlour/rbi_generator/arbitrary'
|
12
13
|
require 'parlour/rbi_generator/options'
|
14
|
+
require 'parlour/rbi_generator/include'
|
15
|
+
require 'parlour/rbi_generator/extend'
|
16
|
+
require 'parlour/rbi_generator/constant'
|
13
17
|
require 'parlour/rbi_generator/namespace'
|
14
18
|
require 'parlour/rbi_generator/module_namespace'
|
15
19
|
require 'parlour/rbi_generator/class_namespace'
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# typed: true
|
2
|
+
module Parlour
|
3
|
+
class RbiGenerator
|
4
|
+
# Represents miscellaneous Ruby code.
|
5
|
+
class Arbitrary < RbiObject
|
6
|
+
sig do
|
7
|
+
params(
|
8
|
+
generator: RbiGenerator,
|
9
|
+
code: String,
|
10
|
+
block: T.nilable(T.proc.params(x: Arbitrary).void)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
# Creates new arbitrary code.
|
14
|
+
#
|
15
|
+
# @param code [String] The arbitrary code string. Indentation is added to
|
16
|
+
# the beginning of each line.
|
17
|
+
def initialize(generator, code: '', &block)
|
18
|
+
super(generator, '')
|
19
|
+
@code = code
|
20
|
+
yield_self(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { returns(String) }
|
24
|
+
# Returns arbitrary code string.
|
25
|
+
attr_accessor :code
|
26
|
+
|
27
|
+
sig { params(other: Object).returns(T::Boolean) }
|
28
|
+
# Returns true if this instance is equal to another arbitrary code line.
|
29
|
+
#
|
30
|
+
# @param other [Object] The other instance. If this is not a {Arbitrary} (or a
|
31
|
+
# subclass of it), this will always return false.
|
32
|
+
# @return [Boolean]
|
33
|
+
def ==(other)
|
34
|
+
Arbitrary === other && code == other.code
|
35
|
+
end
|
36
|
+
|
37
|
+
sig do
|
38
|
+
implementation.params(
|
39
|
+
indent_level: Integer,
|
40
|
+
options: Options
|
41
|
+
).returns(T::Array[String])
|
42
|
+
end
|
43
|
+
# Generates the RBI lines for this arbitrary code.
|
44
|
+
#
|
45
|
+
# @param indent_level [Integer] The indentation level to generate the lines at.
|
46
|
+
# @param options [Options] The formatting options to use.
|
47
|
+
# @return [Array<String>] The RBI lines, formatted as specified.
|
48
|
+
def generate_rbi(indent_level, options)
|
49
|
+
code.split("\n").map { |l| options.indented(indent_level, l) }
|
50
|
+
end
|
51
|
+
|
52
|
+
sig do
|
53
|
+
implementation.params(
|
54
|
+
others: T::Array[RbiGenerator::RbiObject]
|
55
|
+
).returns(T::Boolean)
|
56
|
+
end
|
57
|
+
# Given an array of {Arbitrary} instances, returns true if they may be
|
58
|
+
# merged into this instance using {merge_into_self}. This is always false.
|
59
|
+
#
|
60
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
61
|
+
# {Arbitrary} instances.
|
62
|
+
# @return [Boolean] Whether this instance may be merged with them.
|
63
|
+
def mergeable?(others)
|
64
|
+
false
|
65
|
+
end
|
66
|
+
|
67
|
+
sig do
|
68
|
+
implementation.params(
|
69
|
+
others: T::Array[RbiGenerator::RbiObject]
|
70
|
+
).void
|
71
|
+
end
|
72
|
+
# Given an array of {Arbitrary} instances, merges them into this one.
|
73
|
+
# This particular implementation always throws an exception, because
|
74
|
+
# {mergeable?} is always false.
|
75
|
+
#
|
76
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
77
|
+
# {Arbitrary} instances.
|
78
|
+
# @return [void]
|
79
|
+
def merge_into_self(others)
|
80
|
+
raise 'arbitrary code is never mergeable'
|
81
|
+
end
|
82
|
+
|
83
|
+
sig { override.returns(String) }
|
84
|
+
# Returns a human-readable brief string description of this code.
|
85
|
+
#
|
86
|
+
# @return [String]
|
87
|
+
def describe
|
88
|
+
"Arbitrary code (#{code})"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# typed: true
|
2
|
+
module Parlour
|
3
|
+
class RbiGenerator
|
4
|
+
# Represents a constant definition.
|
5
|
+
class Constant < RbiObject
|
6
|
+
sig do
|
7
|
+
params(
|
8
|
+
generator: RbiGenerator,
|
9
|
+
name: String,
|
10
|
+
value: String,
|
11
|
+
block: T.nilable(T.proc.params(x: Constant).void)
|
12
|
+
).void
|
13
|
+
end
|
14
|
+
# Creates a new constant definition.
|
15
|
+
#
|
16
|
+
# @param name [String] The name of the constant.
|
17
|
+
# @param value [String] The value of the constant, as a Ruby code string.
|
18
|
+
def initialize(generator, name: '', value: '', &block)
|
19
|
+
super(generator, name)
|
20
|
+
@value = value
|
21
|
+
yield_self(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [String] The value of the constant, as a Ruby code string.
|
25
|
+
sig { returns(String) }
|
26
|
+
attr_reader :value
|
27
|
+
|
28
|
+
sig { params(other: Object).returns(T::Boolean) }
|
29
|
+
# Returns true if this instance is equal to another extend.
|
30
|
+
#
|
31
|
+
# @param other [Object] The other instance. If this is not a {Extend} (or a
|
32
|
+
# subclass of it), this will always return false.
|
33
|
+
# @return [Boolean]
|
34
|
+
def ==(other)
|
35
|
+
Constant === other && name == other.name && value == other.value
|
36
|
+
end
|
37
|
+
|
38
|
+
sig do
|
39
|
+
implementation.params(
|
40
|
+
indent_level: Integer,
|
41
|
+
options: Options
|
42
|
+
).returns(T::Array[String])
|
43
|
+
end
|
44
|
+
# Generates the RBI lines for this constant.
|
45
|
+
#
|
46
|
+
# @param indent_level [Integer] The indentation level to generate the lines at.
|
47
|
+
# @param options [Options] The formatting options to use.
|
48
|
+
# @return [Array<String>] The RBI lines, formatted as specified.
|
49
|
+
def generate_rbi(indent_level, options)
|
50
|
+
[options.indented(indent_level, "#{name} = #{value}")]
|
51
|
+
end
|
52
|
+
|
53
|
+
sig do
|
54
|
+
implementation.params(
|
55
|
+
others: T::Array[RbiGenerator::RbiObject]
|
56
|
+
).returns(T::Boolean)
|
57
|
+
end
|
58
|
+
# Given an array of {Constant} instances, returns true if they may be
|
59
|
+
# merged into this instance using {merge_into_self}. This is always false.
|
60
|
+
#
|
61
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
62
|
+
# {Constant} instances.
|
63
|
+
# @return [Boolean] Whether this instance may be merged with them.
|
64
|
+
def mergeable?(others)
|
65
|
+
others.all? { |other| self == other }
|
66
|
+
end
|
67
|
+
|
68
|
+
sig do
|
69
|
+
implementation.params(
|
70
|
+
others: T::Array[RbiGenerator::RbiObject]
|
71
|
+
).void
|
72
|
+
end
|
73
|
+
# Given an array of {Constant} instances, merges them into this one.
|
74
|
+
# This particular implementation will simply do nothing, as instances
|
75
|
+
# are only mergeable if they are indentical.
|
76
|
+
# You MUST ensure that {mergeable?} is true for those instances.
|
77
|
+
#
|
78
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
79
|
+
# {Extend} instances.
|
80
|
+
# @return [void]
|
81
|
+
def merge_into_self(others)
|
82
|
+
# We don't need to change anything! We only merge identical constants
|
83
|
+
end
|
84
|
+
|
85
|
+
sig { implementation.returns(String) }
|
86
|
+
# Returns a human-readable brief string description of this code.
|
87
|
+
#
|
88
|
+
# @return [String]
|
89
|
+
def describe
|
90
|
+
"Constant (#{name} = #{value})"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# typed: true
|
2
|
+
module Parlour
|
3
|
+
class RbiGenerator
|
4
|
+
# Represents an +extend+ call.
|
5
|
+
class Extend < RbiObject
|
6
|
+
sig do
|
7
|
+
params(
|
8
|
+
generator: RbiGenerator,
|
9
|
+
name: String,
|
10
|
+
block: T.nilable(T.proc.params(x: Extend).void)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
# Creates a new +extend+ call.
|
14
|
+
#
|
15
|
+
# @param name [String] The name of the object to be extended.
|
16
|
+
def initialize(generator, name: '', &block)
|
17
|
+
super(generator, name)
|
18
|
+
yield_self(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
sig { params(other: Object).returns(T::Boolean) }
|
22
|
+
# Returns true if this instance is equal to another extend.
|
23
|
+
#
|
24
|
+
# @param other [Object] The other instance. If this is not a {Extend} (or a
|
25
|
+
# subclass of it), this will always return false.
|
26
|
+
# @return [Boolean]
|
27
|
+
def ==(other)
|
28
|
+
Extend === other && name == other.name
|
29
|
+
end
|
30
|
+
|
31
|
+
sig do
|
32
|
+
implementation.params(
|
33
|
+
indent_level: Integer,
|
34
|
+
options: Options
|
35
|
+
).returns(T::Array[String])
|
36
|
+
end
|
37
|
+
# Generates the RBI lines for this extend.
|
38
|
+
#
|
39
|
+
# @param indent_level [Integer] The indentation level to generate the lines at.
|
40
|
+
# @param options [Options] The formatting options to use.
|
41
|
+
# @return [Array<String>] The RBI lines, formatted as specified.
|
42
|
+
def generate_rbi(indent_level, options)
|
43
|
+
[options.indented(indent_level, "extend #{name}")]
|
44
|
+
end
|
45
|
+
|
46
|
+
sig do
|
47
|
+
implementation.params(
|
48
|
+
others: T::Array[RbiGenerator::RbiObject]
|
49
|
+
).returns(T::Boolean)
|
50
|
+
end
|
51
|
+
# Given an array of {Extend} instances, returns true if they may be
|
52
|
+
# merged into this instance using {merge_into_self}. This is always false.
|
53
|
+
#
|
54
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
55
|
+
# {Extend} instances.
|
56
|
+
# @return [Boolean] Whether this instance may be merged with them.
|
57
|
+
def mergeable?(others)
|
58
|
+
others.all? { |other| self == other }
|
59
|
+
end
|
60
|
+
|
61
|
+
sig do
|
62
|
+
implementation.params(
|
63
|
+
others: T::Array[RbiGenerator::RbiObject]
|
64
|
+
).void
|
65
|
+
end
|
66
|
+
# Given an array of {Extend} instances, merges them into this one.
|
67
|
+
# This particular implementation will simply do nothing, as instances
|
68
|
+
# are only mergeable if they are indentical.
|
69
|
+
# You MUST ensure that {mergeable?} is true for those instances.
|
70
|
+
#
|
71
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
72
|
+
# {Extend} instances.
|
73
|
+
# @return [void]
|
74
|
+
def merge_into_self(others)
|
75
|
+
# We don't need to change anything! We only merge identical extends
|
76
|
+
end
|
77
|
+
|
78
|
+
sig { implementation.returns(String) }
|
79
|
+
# Returns a human-readable brief string description of this code.
|
80
|
+
#
|
81
|
+
# @return [String]
|
82
|
+
def describe
|
83
|
+
"Extend (#{name})"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# typed: true
|
2
|
+
module Parlour
|
3
|
+
class RbiGenerator
|
4
|
+
# Represents an +include+ call.
|
5
|
+
class Include < RbiObject
|
6
|
+
sig do
|
7
|
+
params(
|
8
|
+
generator: RbiGenerator,
|
9
|
+
name: String,
|
10
|
+
block: T.nilable(T.proc.params(x: Include).void)
|
11
|
+
).void
|
12
|
+
end
|
13
|
+
# Creates a new +include+ call.
|
14
|
+
#
|
15
|
+
# @param name [String] The name of the object to be included.
|
16
|
+
def initialize(generator, name: '', &block)
|
17
|
+
super(generator, name)
|
18
|
+
yield_self(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
sig { params(other: Object).returns(T::Boolean) }
|
22
|
+
# Returns true if this instance is equal to another include.
|
23
|
+
#
|
24
|
+
# @param other [Object] The other instance. If this is not a {Include} (or a
|
25
|
+
# subclass of it), this will always return false.
|
26
|
+
# @return [Boolean]
|
27
|
+
def ==(other)
|
28
|
+
Include === other && name == other.name
|
29
|
+
end
|
30
|
+
|
31
|
+
sig do
|
32
|
+
implementation.params(
|
33
|
+
indent_level: Integer,
|
34
|
+
options: Options
|
35
|
+
).returns(T::Array[String])
|
36
|
+
end
|
37
|
+
# Generates the RBI lines for this include.
|
38
|
+
#
|
39
|
+
# @param indent_level [Integer] The indentation level to generate the lines at.
|
40
|
+
# @param options [Options] The formatting options to use.
|
41
|
+
# @return [Array<String>] The RBI lines, formatted as specified.
|
42
|
+
def generate_rbi(indent_level, options)
|
43
|
+
[options.indented(indent_level, "include #{name}")]
|
44
|
+
end
|
45
|
+
|
46
|
+
sig do
|
47
|
+
implementation.params(
|
48
|
+
others: T::Array[RbiGenerator::RbiObject]
|
49
|
+
).returns(T::Boolean)
|
50
|
+
end
|
51
|
+
# Given an array of {Include} instances, returns true if they may be
|
52
|
+
# merged into this instance using {merge_into_self}. This is always false.
|
53
|
+
#
|
54
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
55
|
+
# {Include} instances.
|
56
|
+
# @return [Boolean] Whether this instance may be merged with them.
|
57
|
+
def mergeable?(others)
|
58
|
+
others.all? { |other| self == other }
|
59
|
+
end
|
60
|
+
|
61
|
+
sig do
|
62
|
+
implementation.params(
|
63
|
+
others: T::Array[RbiGenerator::RbiObject]
|
64
|
+
).void
|
65
|
+
end
|
66
|
+
# Given an array of {Include} instances, merges them into this one.
|
67
|
+
# This particular implementation will simply do nothing, as instances
|
68
|
+
# are only mergeable if they are indentical.
|
69
|
+
# You MUST ensure that {mergeable?} is true for those instances.
|
70
|
+
#
|
71
|
+
# @param others [Array<RbiGenerator::RbiObject>] An array of other
|
72
|
+
# {Include} instances.
|
73
|
+
# @return [void]
|
74
|
+
def merge_into_self(others)
|
75
|
+
# We don't need to change anything! We only merge identical includes
|
76
|
+
end
|
77
|
+
|
78
|
+
sig { implementation.returns(String) }
|
79
|
+
# Returns a human-readable brief string description of this code.
|
80
|
+
#
|
81
|
+
# @return [String]
|
82
|
+
def describe
|
83
|
+
"Include (#{name})"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -18,7 +18,7 @@ module Parlour
|
|
18
18
|
# @param options [Options] The formatting options to use.
|
19
19
|
# @return [Array<String>] The RBI lines, formatted as specified.
|
20
20
|
def generate_rbi(indent_level, options)
|
21
|
-
generate_comments(indent_level, options) +
|
21
|
+
generate_comments(indent_level, options) +
|
22
22
|
generate_body(indent_level, options)
|
23
23
|
end
|
24
24
|
|
@@ -40,9 +40,6 @@ module Parlour
|
|
40
40
|
def initialize(generator, name = nil, &block)
|
41
41
|
super(generator, name || '<anonymous namespace>')
|
42
42
|
@children = []
|
43
|
-
@extends = []
|
44
|
-
@includes = []
|
45
|
-
@constants = []
|
46
43
|
@next_comments = []
|
47
44
|
yield_self(&block)
|
48
45
|
end
|
@@ -52,23 +49,35 @@ module Parlour
|
|
52
49
|
# @return [Array<RbiObject>]
|
53
50
|
attr_reader :children
|
54
51
|
|
55
|
-
sig { returns(T::Array[
|
56
|
-
#
|
57
|
-
#
|
58
|
-
|
59
|
-
|
52
|
+
sig { returns(T::Array[RbiGenerator::Extend]) }
|
53
|
+
# The {RbiGenerator::Extend} objects from {children}.
|
54
|
+
# @return [Array<RbiGenerator::Extend>]
|
55
|
+
def extends
|
56
|
+
T.cast(
|
57
|
+
children.select { |c| c.is_a?(RbiGenerator::Extend) },
|
58
|
+
T::Array[RbiGenerator::Extend]
|
59
|
+
)
|
60
|
+
end
|
60
61
|
|
61
|
-
sig { returns(T::Array[
|
62
|
-
#
|
63
|
-
#
|
64
|
-
|
65
|
-
|
62
|
+
sig { returns(T::Array[RbiGenerator::Include]) }
|
63
|
+
# The {RbiGenerator::Include} objects from {children}.
|
64
|
+
# @return [Array<RbiGenerator::Include>]
|
65
|
+
def includes
|
66
|
+
T.cast(
|
67
|
+
children.select { |c| c.is_a?(RbiGenerator::Include) },
|
68
|
+
T::Array[RbiGenerator::Include]
|
69
|
+
)
|
70
|
+
end
|
66
71
|
|
67
|
-
sig { returns(T::Array[
|
68
|
-
#
|
69
|
-
#
|
70
|
-
|
71
|
-
|
72
|
+
sig { returns(T::Array[RbiGenerator::Constant]) }
|
73
|
+
# The {RbiGenerator::Constant} objects from {children}.
|
74
|
+
# @return [Array<RbiGenerator::Constant>]
|
75
|
+
def constants
|
76
|
+
T.cast(
|
77
|
+
children.select { |c| c.is_a?(RbiGenerator::Constant) },
|
78
|
+
T::Array[RbiGenerator::Constant]
|
79
|
+
)
|
80
|
+
end
|
72
81
|
|
73
82
|
sig { params(comment: T.any(String, T::Array[String])).void }
|
74
83
|
# Adds one or more comments to the next child RBI object to be created.
|
@@ -282,41 +291,90 @@ module Parlour
|
|
282
291
|
create_attribute(name: name, kind: :accessor, type: type, &block)
|
283
292
|
end
|
284
293
|
|
285
|
-
|
294
|
+
# Creates a new arbitrary code section.
|
295
|
+
# You should rarely have to use this!
|
296
|
+
#
|
297
|
+
# @param code [String] The code to insert.
|
298
|
+
# @param block A block which the new instance yields itself to.
|
299
|
+
# @return [RbiGenerator::Arbitrary]
|
300
|
+
def create_arbitrary(code: nil, &block)
|
301
|
+
code = T.must(code)
|
302
|
+
new_arbitrary = RbiGenerator::Arbitrary.new(
|
303
|
+
generator,
|
304
|
+
code: code,
|
305
|
+
&block
|
306
|
+
)
|
307
|
+
move_next_comments(new_arbitrary)
|
308
|
+
children << new_arbitrary
|
309
|
+
new_arbitrary
|
310
|
+
end
|
311
|
+
|
312
|
+
sig { params(name: String, block: T.nilable(T.proc.params(x: Extend).void)).returns(RbiGenerator::Extend) }
|
286
313
|
# Adds a new +extend+ to this namespace.
|
287
314
|
#
|
288
315
|
# @example Add an +extend+ to a class.
|
289
|
-
# class.
|
316
|
+
# class.create_extend(name: 'ExtendableClass') #=> extend ExtendableClass
|
290
317
|
#
|
291
|
-
# @param
|
318
|
+
# @param object [String] A code string for what is extended, for example
|
292
319
|
# +"MyModule"+.
|
293
|
-
# @
|
294
|
-
|
295
|
-
|
320
|
+
# @param block A block which the new instance yields itself to.
|
321
|
+
# @return [RbiGenerator::Extend]
|
322
|
+
def create_extend(name: nil, &block)
|
323
|
+
name = T.must(name)
|
324
|
+
new_extend = RbiGenerator::Extend.new(
|
325
|
+
generator,
|
326
|
+
name: name,
|
327
|
+
&block
|
328
|
+
)
|
329
|
+
move_next_comments(new_extend)
|
330
|
+
children << new_extend
|
331
|
+
new_extend
|
296
332
|
end
|
297
333
|
|
298
|
-
sig { params(name: String).void }
|
334
|
+
sig { params(name: String, block: T.nilable(T.proc.params(x: Include).void)).returns(Include) }
|
299
335
|
# Adds a new +include+ to this namespace.
|
300
336
|
#
|
301
337
|
# @example Add an +include+ to a class.
|
302
|
-
# class.
|
338
|
+
# class.create_include(name: 'IncludableClass') #=> include IncludableClass
|
303
339
|
#
|
304
|
-
# @param
|
340
|
+
# @param object [String] A code string for what is included, for example
|
305
341
|
# +"Enumerable"+.
|
306
|
-
# @
|
307
|
-
|
308
|
-
|
342
|
+
# @param block A block which the new instance yields itself to.
|
343
|
+
# @return [RbiGenerator::Include]
|
344
|
+
def create_include(name: nil, &block)
|
345
|
+
name = T.must(name)
|
346
|
+
new_include = RbiGenerator::Include.new(
|
347
|
+
generator,
|
348
|
+
name: name,
|
349
|
+
&block
|
350
|
+
)
|
351
|
+
move_next_comments(new_include)
|
352
|
+
children << new_include
|
353
|
+
new_include
|
309
354
|
end
|
310
355
|
|
311
|
-
sig { params(name: String, value: String).void }
|
356
|
+
sig { params(name: String, value: String, block: T.nilable(T.proc.params(x: Constant).void)).returns(Constant) }
|
312
357
|
# Adds a new constant definition to this namespace.
|
313
358
|
#
|
359
|
+
# @example Add an +Elem+ constant to the class.
|
360
|
+
# class.create_include(name: 'IncludableClass') #=> Elem = String
|
361
|
+
#
|
314
362
|
# @param name [String] The name of the constant.
|
315
|
-
# @param value [String]
|
316
|
-
#
|
317
|
-
# @return [
|
318
|
-
def
|
319
|
-
|
363
|
+
# @param value [String] The value of the constant, as a Ruby code string.
|
364
|
+
# @param block A block which the new instance yields itself to.
|
365
|
+
# @return [RbiGenerator::Constant]
|
366
|
+
def create_constant(name: nil, value: nil, &block)
|
367
|
+
name = T.must(name)
|
368
|
+
value = T.must(value)
|
369
|
+
new_constant = RbiGenerator::Constant.new(
|
370
|
+
generator,
|
371
|
+
name: name,
|
372
|
+
value: value,
|
373
|
+
&block
|
374
|
+
)
|
375
|
+
move_next_comments(new_constant)
|
376
|
+
children << new_constant
|
377
|
+
new_constant
|
320
378
|
end
|
321
379
|
|
322
380
|
sig do
|
@@ -352,9 +410,6 @@ module Parlour
|
|
352
410
|
other = T.cast(other, Namespace)
|
353
411
|
|
354
412
|
other.children.each { |c| children << c }
|
355
|
-
other.extends.each { |e| extends << e }
|
356
|
-
other.includes.each { |i| includes << i }
|
357
|
-
other.constants.each { |i| constants << i }
|
358
413
|
end
|
359
414
|
end
|
360
415
|
|
@@ -385,20 +440,22 @@ module Parlour
|
|
385
440
|
result = []
|
386
441
|
|
387
442
|
if includes.any? || extends.any? || constants.any?
|
388
|
-
result += includes
|
389
|
-
|
390
|
-
|
391
|
-
result += extends
|
392
|
-
|
393
|
-
|
394
|
-
result += constants
|
395
|
-
|
396
|
-
|
397
|
-
end
|
443
|
+
result += includes
|
444
|
+
.flat_map { |x| x.generate_rbi(indent_level, options) }
|
445
|
+
.reject { |x| x.strip == '' }
|
446
|
+
result += extends
|
447
|
+
.flat_map { |x| x.generate_rbi(indent_level, options) }
|
448
|
+
.reject { |x| x.strip == '' }
|
449
|
+
result += constants
|
450
|
+
.flat_map { |x| x.generate_rbi(indent_level, options) }
|
451
|
+
.reject { |x| x.strip == '' }
|
398
452
|
result << ""
|
399
453
|
end
|
400
454
|
|
401
|
-
first, *rest = children
|
455
|
+
first, *rest = children.reject do |child|
|
456
|
+
# We already processed these kinds of children
|
457
|
+
child.is_a?(Include) || child.is_a?(Extend) || child.is_a?(Constant)
|
458
|
+
end
|
402
459
|
unless first
|
403
460
|
# Remove any trailing whitespace due to includes
|
404
461
|
result.pop if result.last == ''
|
data/lib/parlour/version.rb
CHANGED
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: 0.
|
4
|
+
version: 0.5.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: 2019-07-
|
11
|
+
date: 2019-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sorbet-runtime
|
@@ -132,8 +132,12 @@ files:
|
|
132
132
|
- lib/parlour/conflict_resolver.rb
|
133
133
|
- lib/parlour/plugin.rb
|
134
134
|
- lib/parlour/rbi_generator.rb
|
135
|
+
- lib/parlour/rbi_generator/arbitrary.rb
|
135
136
|
- lib/parlour/rbi_generator/attribute.rb
|
136
137
|
- lib/parlour/rbi_generator/class_namespace.rb
|
138
|
+
- lib/parlour/rbi_generator/constant.rb
|
139
|
+
- lib/parlour/rbi_generator/extend.rb
|
140
|
+
- lib/parlour/rbi_generator/include.rb
|
137
141
|
- lib/parlour/rbi_generator/method.rb
|
138
142
|
- lib/parlour/rbi_generator/module_namespace.rb
|
139
143
|
- lib/parlour/rbi_generator/namespace.rb
|