prettier 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0630719fd8b07b6f6fc180db0c88a5d2d2f0aad3d4cdeef4f14aeba83a87d2f1'
4
- data.tar.gz: 925d6a78992ae155cb65ccd336ec34c3cda7538421151d91952a31461718be2b
3
+ metadata.gz: 3c6028bdf8198f8cfdd43bdb8d8b577e7a3bae5aaa108af45e0ee065d0b373b3
4
+ data.tar.gz: 90847afd8a74ba465b5a1bcc3dcfdc146ce57c01df77f1e3fa8c04a8b254c870
5
5
  SHA512:
6
- metadata.gz: b8e07ba6fd2839a1c055ec42b08c2f35a92b912a555c227bb644ea91afec560feaa27318df72dfda1023ffbe7a65c446f4ea1ba97ec6202a617d4622abcdbb4b
7
- data.tar.gz: 7ef40ccd4d7bc5f3b521070402b1a592706d60cb19edfc3072ab45c9086e954f0f4b801a260e8ccb76efbede4b227ca07e4a6e7c1bd670b230b56b0ff01c3496
6
+ metadata.gz: d99e6fefc109919be2317805e2462c0f38d2cfc7b005df3b200ea9b29ff2ac6f4438617580df94ae58c95a0df21717d87025b9ed6301e35c62fd1b84be63f321
7
+ data.tar.gz: 97353a101ef9256d63035e8838c32435816a84f735dc9aaf40a6f62b69e699249acbb2cc51ea4075802f848368712fca11ba54d8b5203392050199b1cc1f5f13
@@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.2.4] - 2021-01-03
10
+
11
+ ### Added
12
+
13
+ - [@andyw8] - Explain usage with Rubocop, as well as shipping a rubocop.yml config.
14
+
15
+ ### Changed
16
+
17
+ - [@kddeisz] - Reduce JSON size passing from Ruby process to node process by changing `char_start` -> `sc`, `char_end` -> `ec`, `start` -> `sl`, `end` -> `el`.
18
+ - [@kddeisz] - Up the max buffer size between the Ruby and node processes to 15K.
19
+
9
20
  ## [1.2.3] - 2021-01-02
10
21
 
11
22
  ### Changed
data/README.md CHANGED
@@ -149,6 +149,19 @@ Or, they can be passed to `prettier` as arguments:
149
149
  prettier --ruby-single-quote false --write '**/*.rb'
150
150
  ```
151
151
 
152
+ ### Usage with RuboCop
153
+
154
+ RuboCop and Prettier for Ruby serve different purposes, but there is overlap
155
+ with some of RuboCop's functionality.
156
+
157
+ Prettier provides a RuboCop configuration fle to disable the rules which clash.
158
+ To enable, add the following config at the top of your project's `.rubocop.yml`:
159
+
160
+ ```yaml
161
+ inherit_gem:
162
+ prettier: rubocop.yml
163
+ ```
164
+
152
165
  ## Contributing
153
166
 
154
167
  Check out our [contributing guide](CONTRIBUTING.md). Bug reports and pull requests are welcome on GitHub at https://github.com/prettier/plugin-ruby.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prettier/plugin-ruby",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
4
4
  "description": "prettier plugin for the Ruby programming language",
5
5
  "main": "src/plugin.js",
6
6
  "scripts": {
@@ -0,0 +1,26 @@
1
+ # Disabling all Layout/* rules, as they're unnecessary when the user is using
2
+ # prettier to handle all of the formatting.
3
+
4
+ Layout:
5
+ Enabled: false
6
+
7
+ # Disabling all of the following options because they could conflict with a
8
+ # prettier configuration setting.
9
+
10
+ Style/MultilineIfModifier: # rubyModifier
11
+ Enabled: false
12
+
13
+ Style/SymbolArray: # rubyArrayLiteral
14
+ Enabled: false
15
+
16
+ Style/WordArray: # rubyArrayLiteral
17
+ Enabled: false
18
+
19
+ Style/TrailingCommaInArguments: # trailingComma
20
+ Enabled: false
21
+
22
+ Style/TrailingCommaInArrayLiteral: # trailingComma
23
+ Enabled: false
24
+
25
+ Style/TrailingCommaInHashLiteral: # trailingComma
26
+ Enabled: false
@@ -1,6 +1,7 @@
1
1
  // If `RBPRETTIER` is set, then this is being run from the `Prettier::run` ruby
2
2
  // method. In that case, we need to pull `prettier` from the node_modules
3
3
  // directly, as it's been shipped with the gem.
4
+ /* istanbul ignore next */
4
5
  const source = process.env.RBPRETTIER ? "../node_modules/prettier" : "prettier";
5
6
 
6
7
  const prettier = require(source);
@@ -20,6 +20,10 @@ const parsers = {
20
20
  scss: "scss"
21
21
  };
22
22
 
23
+ // This function is in here because it handles embedded parser values. I don't
24
+ // have a test that exercises it because I'm not sure for which parser it is
25
+ // necessary, but since it's in prettier core I'm keeping it here.
26
+ /* istanbul ignore next */
23
27
  const replaceNewlines = (doc) =>
24
28
  mapDoc(doc, (currentDoc) =>
25
29
  typeof currentDoc === "string" && currentDoc.includes("\n")
@@ -10,76 +10,81 @@ const {
10
10
  } = require("../../prettier");
11
11
  const { hasAncestor } = require("../../utils");
12
12
 
13
- const printBlock = (braces) => (path, opts, print) => {
14
- const [variables, statements] = path.getValue().body;
15
- const stmts =
16
- statements.type === "stmts" ? statements.body : statements.body[0].body;
13
+ function printBlockVar(path, opts, print) {
14
+ const parts = ["|", removeLines(path.call(print, "body", 0))];
17
15
 
18
- let doBlockBody = "";
19
- if (
20
- stmts.length !== 1 ||
21
- stmts[0].type !== "void_stmt" ||
22
- stmts[0].comments
23
- ) {
24
- doBlockBody = indent(concat([softline, path.call(print, "body", 1)]));
16
+ // The second part of this node is a list of optional block-local variables
17
+ if (path.getValue().body[1]) {
18
+ parts.push("; ", join(", ", path.map(print, "body", 1)));
25
19
  }
26
20
 
27
- // If this block is nested underneath a command or command_call node, then we
28
- // can't use `do...end` because that will get associated with the parent node
29
- // as opposed to the current node (because of the difference in operator
30
- // precedence). Instead, we still use a multi-line format but switch to using
31
- // braces instead.
32
- const useBraces = braces && hasAncestor(path, ["command", "command_call"]);
21
+ parts.push("| ");
22
+ return concat(parts);
23
+ }
33
24
 
34
- const doBlock = concat([
35
- useBraces ? " {" : " do",
36
- variables ? concat([" ", path.call(print, "body", 0)]) : "",
37
- doBlockBody,
38
- concat([softline, useBraces ? "}" : "end"])
39
- ]);
25
+ function printBlock(braces) {
26
+ return function printBlockWithBraces(path, opts, print) {
27
+ const [variables, statements] = path.getValue().body;
28
+ const stmts =
29
+ statements.type === "stmts" ? statements.body : statements.body[0].body;
40
30
 
41
- // We can hit this next pattern if within the block the only statement is a
42
- // comment.
43
- if (
44
- stmts.length === 1 &&
45
- stmts[0].type === "void_stmt" &&
46
- stmts[0].comments
47
- ) {
48
- return concat([breakParent, doBlock]);
49
- }
31
+ let doBlockBody = "";
32
+ if (
33
+ stmts.length !== 1 ||
34
+ stmts[0].type !== "void_stmt" ||
35
+ stmts[0].comments
36
+ ) {
37
+ doBlockBody = indent(concat([softline, path.call(print, "body", 1)]));
38
+ }
50
39
 
51
- // If the parent node is a command node, then there are no parentheses around
52
- // the arguments to that command, so we need to break the block
53
- if (["command", "command_call"].includes(path.getParentNode().body[0].type)) {
54
- return concat([breakParent, doBlock]);
55
- }
40
+ // If this block is nested underneath a command or command_call node, then
41
+ // we can't use `do...end` because that will get associated with the parent
42
+ // node as opposed to the current node (because of the difference in
43
+ // operator precedence). Instead, we still use a multi-line format but
44
+ // switch to using braces instead.
45
+ const useBraces = braces && hasAncestor(path, ["command", "command_call"]);
56
46
 
57
- const hasBody = stmts.some(({ type }) => type !== "void_stmt");
58
- const braceBlock = concat([
59
- " {",
60
- hasBody || variables ? " " : "",
61
- variables ? path.call(print, "body", 0) : "",
62
- path.call(print, "body", 1),
63
- hasBody ? " " : "",
64
- "}"
65
- ]);
47
+ const doBlock = concat([
48
+ useBraces ? " {" : " do",
49
+ variables ? concat([" ", path.call(print, "body", 0)]) : "",
50
+ doBlockBody,
51
+ concat([softline, useBraces ? "}" : "end"])
52
+ ]);
66
53
 
67
- return group(ifBreak(doBlock, braceBlock));
68
- };
54
+ // We can hit this next pattern if within the block the only statement is a
55
+ // comment.
56
+ if (
57
+ stmts.length === 1 &&
58
+ stmts[0].type === "void_stmt" &&
59
+ stmts[0].comments
60
+ ) {
61
+ return concat([breakParent, doBlock]);
62
+ }
69
63
 
70
- module.exports = {
71
- block_var: (path, opts, print) => {
72
- const parts = ["|", removeLines(path.call(print, "body", 0))];
64
+ const blockReceiver = path.getParentNode().body[0];
73
65
 
74
- // The second part of this node is a list of optional block-local variables
75
- if (path.getValue().body[1]) {
76
- parts.push("; ", join(", ", path.map(print, "body", 1)));
66
+ // If the parent node is a command node, then there are no parentheses
67
+ // around the arguments to that command, so we need to break the block
68
+ if (["command", "command_call"].includes(blockReceiver.type)) {
69
+ return concat([breakParent, doBlock]);
77
70
  }
78
71
 
79
- parts.push("| ");
80
- return concat(parts);
81
- },
72
+ const hasBody = stmts.some(({ type }) => type !== "void_stmt");
73
+ const braceBlock = concat([
74
+ " {",
75
+ hasBody || variables ? " " : "",
76
+ variables ? path.call(print, "body", 0) : "",
77
+ path.call(print, "body", 1),
78
+ hasBody ? " " : "",
79
+ "}"
80
+ ]);
81
+
82
+ return group(ifBreak(doBlock, braceBlock));
83
+ };
84
+ }
85
+
86
+ module.exports = {
87
+ block_var: printBlockVar,
82
88
  brace_block: printBlock(true),
83
- do_block: printBlock(false),
84
- excessed_comma: () => ""
89
+ do_block: printBlock(false)
85
90
  };
@@ -1,5 +1,4 @@
1
1
  const { concat, group, indent, line } = require("../../prettier");
2
- const { isEmptyStmts } = require("../../utils");
3
2
 
4
3
  // The `BEGIN` and `END` keywords are used to hook into the Ruby process. Any
5
4
  // `BEGIN` blocks are executed right when the process starts up, and the `END`
@@ -17,24 +16,15 @@ const { isEmptyStmts } = require("../../utils");
17
16
  // nodes contain one child which is a `stmts` node.
18
17
  function printHook(name) {
19
18
  return function printHookWithName(path, opts, print) {
20
- const stmtsNode = path.getValue().body[1];
21
- const printedStmts = path.call(print, "body", 1);
22
-
23
- const parts = [
24
- name,
25
- " ",
26
- path.call(print, "body", 0),
27
- indent(concat([line, printedStmts])),
28
- concat([line, "}"])
29
- ];
30
-
31
- // If there are no statements but there are comments, then we want to skip
32
- // printing the newline so that we don't end up with multiple spaces.
33
- if (isEmptyStmts(stmtsNode) && stmtsNode.comments) {
34
- parts[1] = indent(printedStmts);
35
- }
36
-
37
- return group(concat(parts));
19
+ return group(
20
+ concat([
21
+ name,
22
+ " ",
23
+ path.call(print, "body", 0),
24
+ indent(concat([line, path.call(print, "body", 1)])),
25
+ concat([line, "}"])
26
+ ])
27
+ );
38
28
  };
39
29
  }
40
30
 
@@ -47,15 +47,13 @@ function printMethod(offset) {
47
47
  }
48
48
 
49
49
  function printSingleLineMethod(path, opts, print) {
50
- let paramsNode = path.getValue().body[1];
50
+ let parensNode = path.getValue().body[1];
51
51
  let paramsDoc = "";
52
52
 
53
- if (paramsNode) {
54
- if (paramsNode.body[0].type === "params") {
55
- paramsNode = paramsNode.body[0];
56
- }
53
+ if (parensNode) {
54
+ const paramsNode = parensNode.body[0];
57
55
 
58
- if (paramsNode.type === "params" && paramsNode.body.some((type) => type)) {
56
+ if (paramsNode.body.some((type) => type)) {
59
57
  paramsDoc = path.call(print, "body", 1);
60
58
  }
61
59
  }
@@ -29,18 +29,22 @@ function printParams(path, opts, print) {
29
29
  let parts = [];
30
30
 
31
31
  if (reqs) {
32
- parts = parts.concat(path.map(print, "body", 0));
32
+ path.each(
33
+ (reqPath) => {
34
+ // For some very strange reason, if you have a comment attached to a
35
+ // rest_param, it shows up here in the list of required params.
36
+ if (reqPath.getValue().type !== "rest_param") {
37
+ parts.push(print(reqPath));
38
+ }
39
+ },
40
+ "body",
41
+ 0
42
+ );
33
43
  }
34
44
 
35
45
  if (optls) {
36
46
  parts = parts.concat(
37
- optls.map((_, index) =>
38
- concat([
39
- path.call(print, "body", 1, index, 0),
40
- " = ",
41
- path.call(print, "body", 1, index, 1)
42
- ])
43
- )
47
+ path.map((optlPath) => join(" = ", optlPath.map(print)), "body", 1)
44
48
  );
45
49
  }
46
50
 
@@ -54,12 +58,16 @@ function printParams(path, opts, print) {
54
58
 
55
59
  if (kwargs) {
56
60
  parts = parts.concat(
57
- kwargs.map(([, value], index) => {
58
- if (!value) {
59
- return path.call(print, "body", 4, index, 0);
60
- }
61
- return group(join(" ", path.map(print, "body", 4, index)));
62
- })
61
+ path.map(
62
+ (kwargPath) => {
63
+ if (!kwargPath.getValue()[1]) {
64
+ return kwargPath.call(print, 0);
65
+ }
66
+ return group(join(" ", kwargPath.map(print)));
67
+ },
68
+ "body",
69
+ 4
70
+ )
63
71
  );
64
72
  }
65
73
 
@@ -1,4 +1,5 @@
1
1
  const {
2
+ align,
2
3
  concat,
3
4
  group,
4
5
  hardline,
@@ -74,7 +75,7 @@ function printHshPtn(path, opts, print) {
74
75
  const [constant, keyValuePairs, keyValueRest] = path.getValue().body;
75
76
  let args = [];
76
77
 
77
- if (keyValuePairs) {
78
+ if (keyValuePairs.length > 0) {
78
79
  const printPair = (pairPath) => {
79
80
  const parts = [pairPath.call(print, 0)];
80
81
 
@@ -116,10 +117,13 @@ function printHshPtn(path, opts, print) {
116
117
  function printIn(path, opts, print) {
117
118
  const parts = [
118
119
  "in ",
119
- path.call(
120
- (valuePath) => printPatternArg(valuePath, opts, print),
121
- "body",
122
- 0
120
+ align(
121
+ "in ".length,
122
+ path.call(
123
+ (valuePath) => printPatternArg(valuePath, opts, print),
124
+ "body",
125
+ 0
126
+ )
123
127
  ),
124
128
  indent(concat([hardline, path.call(print, "body", 1)]))
125
129
  ];
@@ -41,10 +41,6 @@ const printReturn = (path, opts, print) => {
41
41
  let args = path.getValue().body[0].body[0];
42
42
  let steps = ["body", 0, "body", 0];
43
43
 
44
- if (!args) {
45
- return "return";
46
- }
47
-
48
44
  if (args.body.length === 1) {
49
45
  // If the body of the return contains parens, then just skip directly to the
50
46
  // content of the parens so that we can skip printing parens if we don't
@@ -30,6 +30,7 @@ function printBodyStmt(path, opts, print) {
30
30
 
31
31
  if (elseClause) {
32
32
  // Before Ruby 2.6, this piece of bodystmt was an explicit "else" node
33
+ /* istanbul ignore next */
33
34
  const stmts =
34
35
  elseClause.type === "else"
35
36
  ? path.call(print, "body", 2, "body", 0)
@@ -69,11 +70,7 @@ function printParen(path, opts, print) {
69
70
  }
70
71
 
71
72
  return group(
72
- concat([
73
- "(",
74
- indent(concat([softline, contentDoc])),
75
- concat([softline, ")"])
76
- ])
73
+ concat(["(", indent(concat([softline, contentDoc])), softline, ")"])
77
74
  );
78
75
  }
79
76
 
@@ -123,12 +120,12 @@ module.exports = {
123
120
  if (lineNo === null) {
124
121
  parts.push(printed);
125
122
  } else if (
126
- stmt.start - lineNo > 1 ||
123
+ stmt.sl - lineNo > 1 ||
127
124
  [stmt.type, stmts[index - 1].type].includes("access_ctrl")
128
125
  ) {
129
126
  parts.push(hardline, hardline, printed);
130
127
  } else if (
131
- stmt.start !== lineNo ||
128
+ stmt.sl !== lineNo ||
132
129
  path.getParentNode().type !== "string_embexpr"
133
130
  ) {
134
131
  parts.push(hardline, printed);
@@ -136,7 +133,7 @@ module.exports = {
136
133
  parts.push("; ", printed);
137
134
  }
138
135
 
139
- lineNo = stmt.end;
136
+ lineNo = stmt.el;
140
137
  });
141
138
 
142
139
  return concat(parts);