prettier 1.0.0.pre.rc2 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 305f0248dc0f0b4ab56d698f04858e3d25df0f91888a203f75740ae5a06a7e0d
4
- data.tar.gz: 192eaf1d3cd95a9dc3693c0346f636f53ae2baede4cd3de5d827bd671571daf3
3
+ metadata.gz: 1738251faac58ab78438da2dcf568a86708d1ccb651d7ec593f0e3c3efc5075a
4
+ data.tar.gz: 91666c89e8846d9a908883339238dfec94816adb14c8949fe9232590e493c48b
5
5
  SHA512:
6
- metadata.gz: 33a09aa76044b30dde5aa1555bfabc8f178607335ca0af9e4709d0f9fbfdc437c986097da85cc2d0c411326cb25d0672587a0253016bc89e71ca1245a5cfd652
7
- data.tar.gz: b293f495c164808c4372dc79cfa801fd1603fe4907eafb374b61ba171cffbf1aaa09b6e0b1a427bc949099091db790a79d74d56c50f72c3ba006acc718b0065c
6
+ metadata.gz: d7df78d09da53ada78d9d9a0d3421e279bc0f1593aaff7a099ef397deea85f4fdde3a044ef91bb88f8f5d6a4f91d52d303e912e60f84b946c35528c0c6f139e1
7
+ data.tar.gz: 95e810fa06b71063a010f8e3e3dd3cf7302e2cf1b3573f8da4b7e7fed9288ecaf4d75cbd6429c4b04dbc31728dc879cf1605c8c104fc130bdbfc30583c837e5b
@@ -6,6 +6,16 @@ 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.0.0] - 2020-12-11
10
+
11
+ ### Changed
12
+
13
+ - [@kddeisz] - Do not unescape double quotes in a single quote string.
14
+ - [@kddeisz] - Only force braces on regexp for spaces and equals if it's inside a command or command_call.
15
+ - [@kddeisz] - Leave Sorbet type annotations in place.
16
+ - [@kddeisz] - Don't group hash contents, just allow them to break with their parent node.
17
+ - [@kddeisz] - Honor the UTF-8 lang passed in through ENV vars.
18
+
9
19
  ## [1.0.0-rc2] - 2020-12-10
10
20
 
11
21
  ### Changed
@@ -252,7 +262,8 @@ will now be printed as:
252
262
  ```ruby
253
263
  Config::Download.new(
254
264
  'prettier',
255
- filename: 'prettier.yml', url: 'https://raw.githubusercontent.com/...'
265
+ filename: 'prettier.yml',
266
+ url: 'https://raw.githubusercontent.com/...'
256
267
  ).perform
257
268
  ```
258
269
 
@@ -940,7 +951,8 @@ would previously result in `array[]`, but now prints properly.
940
951
 
941
952
  - Initial release 🎉
942
953
 
943
- [unreleased]: https://github.com/prettier/plugin-ruby/compare/v1.0.0-rc2...HEAD
954
+ [unreleased]: https://github.com/prettier/plugin-ruby/compare/v1.0.0...HEAD
955
+ [1.0.0]: https://github.com/prettier/plugin-ruby/compare/v1.0.0-rc2...v1.0.0
944
956
  [1.0.0-rc2]: https://github.com/prettier/plugin-ruby/compare/v1.0.0-rc1...v1.0.0-rc2
945
957
  [1.0.0-rc1]: https://github.com/prettier/plugin-ruby/compare/v0.22.0...v1.0.0-rc1
946
958
  [0.22.0]: https://github.com/prettier/plugin-ruby/compare/v0.21.0...v0.22.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@prettier/plugin-ruby",
3
- "version": "1.0.0-rc2",
3
+ "version": "1.0.0",
4
4
  "description": "prettier plugin for the Ruby programming language",
5
5
  "main": "src/ruby.js",
6
6
  "scripts": {
7
+ "check-format": "prettier --check '**/*'",
7
8
  "lint": "eslint --cache .",
8
- "print": "prettier --plugin=.",
9
9
  "test": "jest"
10
10
  },
11
11
  "repository": {
@@ -25,9 +25,9 @@
25
25
  "all-contributors-cli": "^6.14.1",
26
26
  "eslint": "^7.8.1",
27
27
  "eslint-config-prettier": "^7.0.0",
28
- "husky": "^5.0.4",
28
+ "husky": "^4.3.5",
29
29
  "jest": "^26.0.0",
30
- "pretty-quick": "^3.0.0"
30
+ "pretty-quick": "^3.1.0"
31
31
  },
32
32
  "eslintConfig": {
33
33
  "extends": [
@@ -61,6 +61,9 @@
61
61
  }
62
62
  },
63
63
  "prettier": {
64
- "trailingComma": "none"
64
+ "trailingComma": "none",
65
+ "plugins": [
66
+ "."
67
+ ]
65
68
  }
66
69
  }
@@ -100,15 +100,44 @@ function printMethodAddArg(path, opts, print) {
100
100
  return concat([methodDoc, argsDoc]);
101
101
  }
102
102
 
103
- function printMethodAddBlock(path, { rubyToProc }, print) {
103
+ // Sorbet type annotations look like the following:
104
+ //
105
+ // {method_add_block
106
+ // [{method_add_arg
107
+ // [{fcall
108
+ // [{@ident "sig"}]},
109
+ // {args []}]},
110
+ // {brace_block [nil, {stmts}]}}]}
111
+ //
112
+ function isSorbetTypeAnnotation(node) {
113
+ const [callNode, blockNode] = node.body;
114
+
115
+ return (
116
+ callNode.type === "method_add_arg" &&
117
+ callNode.body[0].type === "fcall" &&
118
+ callNode.body[0].body[0].body === "sig" &&
119
+ callNode.body[1].type === "args" &&
120
+ callNode.body[1].body.length === 0 &&
121
+ blockNode.type === "brace_block"
122
+ );
123
+ }
124
+
125
+ function printMethodAddBlock(path, opts, print) {
104
126
  const node = path.getValue();
105
127
 
106
128
  const [callNode, blockNode] = node.body;
107
129
  const [callDoc, blockDoc] = path.map(print, "body");
108
130
 
131
+ // Very special handling here for sorbet type annotations. They look like Ruby
132
+ // code, but they're not actually Ruby code, so we're not going to mess with
133
+ // them at all.
134
+ if (isSorbetTypeAnnotation(node)) {
135
+ return opts.originalText.slice(opts.locStart(node), opts.locEnd(node));
136
+ }
137
+
109
138
  // Don't bother trying to do any kind of fancy toProc transform if the option
110
139
  // is disabled.
111
- if (rubyToProc) {
140
+ if (opts.rubyToProc) {
112
141
  const proc = toProc(path, blockNode);
113
142
 
114
143
  if (proc && callNode.type === "call") {
@@ -93,32 +93,7 @@ function printHashContents(path, opts, print) {
93
93
  ? printHashKeyLabel
94
94
  : printHashKeyRocket;
95
95
 
96
- const contents = join(concat([",", line]), path.map(print, "body"));
97
-
98
- // If we're inside a hash literal, then we want to add the braces at this
99
- // level so that the grouping is correct. Otherwise you could end up with
100
- // opening and closing braces being split up, but the contents not being split
101
- // correctly.
102
- if (path.getParentNode().type === "hash") {
103
- return group(
104
- concat([
105
- "{",
106
- indent(
107
- concat([
108
- line,
109
- contents,
110
- getTrailingComma(opts) ? ifBreak(",", "") : ""
111
- ])
112
- ),
113
- line,
114
- "}"
115
- ])
116
- );
117
- }
118
-
119
- // Otherwise, we're inside a bare_assoc_hash, so we don't want to print
120
- // braces at all.
121
- return group(contents);
96
+ return join(concat([",", line]), path.map(print, "body"));
122
97
  }
123
98
 
124
99
  function printEmptyHashWithComments(path, opts) {
@@ -129,14 +104,16 @@ function printEmptyHashWithComments(path, opts) {
129
104
  return opts.printer.printComment(commentPath);
130
105
  };
131
106
 
132
- return concat([
133
- "{",
134
- indent(
135
- concat([hardline, join(hardline, path.map(printComment, "comments"))])
136
- ),
137
- line,
138
- "}"
139
- ]);
107
+ return group(
108
+ concat([
109
+ "{",
110
+ indent(
111
+ concat([hardline, join(hardline, path.map(printComment, "comments"))])
112
+ ),
113
+ line,
114
+ "}"
115
+ ])
116
+ );
140
117
  }
141
118
 
142
119
  function printHash(path, opts, print) {
@@ -149,7 +126,20 @@ function printHash(path, opts, print) {
149
126
  return hashNode.comments ? printEmptyHashWithComments(path, opts) : "{}";
150
127
  }
151
128
 
152
- return path.call(print, "body", 0);
129
+ return group(
130
+ concat([
131
+ "{",
132
+ indent(
133
+ concat([
134
+ line,
135
+ path.call(print, "body", 0),
136
+ getTrailingComma(opts) ? ifBreak(",", "") : ""
137
+ ])
138
+ ),
139
+ line,
140
+ "}"
141
+ ])
142
+ );
153
143
  }
154
144
 
155
145
  module.exports = {
@@ -1,16 +1,23 @@
1
1
  const { concat } = require("../prettier");
2
+ const { hasAncestor } = require("../utils");
2
3
 
3
4
  function isStringContent(node) {
4
5
  return node.type === "@tstring_content";
5
6
  }
6
7
 
7
- function shouldUseBraces(node) {
8
+ function shouldUseBraces(path) {
9
+ const node = path.getValue();
8
10
  const first = node.body[0];
9
11
 
10
12
  // If the first part of this regex is plain string content and we have a
11
13
  // space or an =, then we want to use braces because otherwise we could end up
12
14
  // with an ambiguous operator, e.g. foo / bar/ or foo /=bar/
13
- if (first && isStringContent(first) && [" ", "="].includes(first.body[0])) {
15
+ if (
16
+ first &&
17
+ isStringContent(first) &&
18
+ [" ", "="].includes(first.body[0]) &&
19
+ hasAncestor(path, ["command", "command_call"])
20
+ ) {
14
21
  return true;
15
22
  }
16
23
 
@@ -28,7 +35,7 @@ function shouldUseBraces(node) {
28
35
  // itself. In that case we switch over to using %r with braces.
29
36
  function printRegexpLiteral(path, opts, print) {
30
37
  const node = path.getValue();
31
- const useBraces = shouldUseBraces(node);
38
+ const useBraces = shouldUseBraces(path);
32
39
 
33
40
  const parts = [useBraces ? "%r{" : "/"]
34
41
  .concat(path.map(print, "body"))
@@ -32,7 +32,7 @@ function isSingleQuotable(node) {
32
32
  const quotePattern = new RegExp("\\\\([\\s\\S])|(['\"])", "g");
33
33
 
34
34
  function normalizeQuotes(content, enclosingQuote, originalQuote) {
35
- const replaceOther = ["'", '"'].includes(originalQuote);
35
+ const replaceOther = originalQuote === '"';
36
36
  const otherQuote = enclosingQuote === '"' ? "'" : '"';
37
37
 
38
38
  // Escape and unescape single and double quotes as needed to be able to
@@ -3,18 +3,33 @@ const path = require("path");
3
3
 
4
4
  // In order to properly parse ruby code, we need to tell the ruby process to
5
5
  // parse using UTF-8. Unfortunately, the way that you accomplish this looks
6
- // differently depending on your platform. This object below represents all of
7
- // the possible values of process.platform per:
8
- // https://nodejs.org/api/process.html#process_process_platform
9
- const LANG = {
10
- aix: "C.UTF-8",
11
- darwin: "en_US.UTF-8",
12
- freebsd: "C.UTF-8",
13
- linux: "C.UTF-8",
14
- openbsd: "C.UTF-8",
15
- sunos: "C.UTF-8",
16
- win32: ".UTF-8"
17
- }[process.platform];
6
+ // differently depending on your platform.
7
+ const LANG = (() => {
8
+ const { env, platform } = process;
9
+ const envValue = env.LC_ALL || env.LC_CTYPE || env.LANG;
10
+
11
+ // If an env var is set for the locale that already includes UTF-8 in the
12
+ // name, then assume we can go with that.
13
+ if (envValue && envValue.includes("UTF-8")) {
14
+ return envValue;
15
+ }
16
+
17
+ // Otherwise, we're going to guess which encoding to use based on the system.
18
+ // This is probably not the best approach in the world, as you could be on
19
+ // linux and not have C.UTF-8, but in that case you're probably passing an env
20
+ // var for it. This object below represents all of the possible values of
21
+ // process.platform per:
22
+ // https://nodejs.org/api/process.html#process_process_platform
23
+ return {
24
+ aix: "C.UTF-8",
25
+ darwin: "en_US.UTF-8",
26
+ freebsd: "C.UTF-8",
27
+ linux: "C.UTF-8",
28
+ openbsd: "C.UTF-8",
29
+ sunos: "C.UTF-8",
30
+ win32: ".UTF-8"
31
+ }[platform];
32
+ })();
18
33
 
19
34
  // This function is responsible for taking an input string of text and returning
20
35
  // to prettier a JavaScript object that is the equivalent AST that represents
@@ -314,7 +314,9 @@ class Prettier::Parser < Ripper
314
314
  arg.merge(type: :args, body: [arg])
315
315
  else
316
316
  args.merge!(
317
- body: args[:body] << arg, end: arg[:end], char_end: arg[:char_end]
317
+ body: args[:body] << arg,
318
+ end: arg[:end],
319
+ char_end: arg[:char_end]
318
320
  )
319
321
  end
320
322
  end
@@ -1186,7 +1188,8 @@ class Prettier::Parser < Ripper
1186
1188
  # Here we're going to expand out the location information for the assocs
1187
1189
  # node so that it can grab up any remaining comments inside the hash.
1188
1190
  assoclist_from_args.merge!(
1189
- char_start: beging[:char_end], char_end: ending[:char_start]
1191
+ char_start: beging[:char_end],
1192
+ char_end: ending[:char_start]
1190
1193
  )
1191
1194
  end
1192
1195
 
@@ -1448,7 +1451,9 @@ class Prettier::Parser < Ripper
1448
1451
  part.merge(type: :mlhs, body: [part])
1449
1452
  else
1450
1453
  mlhs.merge!(
1451
- body: mlhs[:body] << part, end: part[:end], char_end: part[:char_end]
1454
+ body: mlhs[:body] << part,
1455
+ end: part[:end],
1456
+ char_end: part[:char_end]
1452
1457
  )
1453
1458
  end
1454
1459
  end
@@ -1551,7 +1556,9 @@ class Prettier::Parser < Ripper
1551
1556
  part.merge(type: :mrhs, body: [part])
1552
1557
  else
1553
1558
  mrhs.merge!(
1554
- body: mrhs[:body] << part, end: part[:end], char_end: part[:char_end]
1559
+ body: mrhs[:body] << part,
1560
+ end: part[:end],
1561
+ char_end: part[:char_end]
1555
1562
  )
1556
1563
  end
1557
1564
  end
@@ -1960,7 +1967,9 @@ class Prettier::Parser < Ripper
1960
1967
  # piece of the string.
1961
1968
  def on_string_add(string, piece)
1962
1969
  string.merge!(
1963
- body: string[:body] << piece, end: piece[:end], char_end: piece[:char_end]
1970
+ body: string[:body] << piece,
1971
+ end: piece[:end],
1972
+ char_end: piece[:char_end]
1964
1973
  )
1965
1974
  end
1966
1975
 
@@ -2417,7 +2426,9 @@ class Prettier::Parser < Ripper
2417
2426
  piece.merge(type: :word, body: [piece])
2418
2427
  else
2419
2428
  word.merge!(
2420
- body: word[:body] << piece, end: piece[:end], char_end: piece[:char_end]
2429
+ body: word[:body] << piece,
2430
+ end: piece[:end],
2431
+ char_end: piece[:char_end]
2421
2432
  )
2422
2433
  end
2423
2434
  end
@@ -2498,7 +2509,9 @@ class Prettier::Parser < Ripper
2498
2509
  else
2499
2510
  ending = find_scanner_event(:@tstring_end)
2500
2511
  xstring.merge!(
2501
- type: :xstring_literal, end: ending[:end], char_end: ending[:char_end]
2512
+ type: :xstring_literal,
2513
+ end: ending[:end],
2514
+ char_end: ending[:char_end]
2502
2515
  )
2503
2516
  end
2504
2517
  end
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prettier
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.rc2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Deisz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-10 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: minitest
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '5.13'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '5.13'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '13.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '13.0'
11
+ date: 2020-12-11 00:00:00.000000000 Z
12
+ dependencies: []
55
13
  description:
56
14
  email:
57
15
  executables:
@@ -130,11 +88,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
88
  version: '0'
131
89
  required_rubygems_version: !ruby/object:Gem::Requirement
132
90
  requirements:
133
- - - ">"
91
+ - - ">="
134
92
  - !ruby/object:Gem::Version
135
- version: 1.3.1
93
+ version: '0'
136
94
  requirements: []
137
- rubygems_version: 3.0.3
95
+ rubygems_version: 3.1.4
138
96
  signing_key:
139
97
  specification_version: 4
140
98
  summary: prettier plugin for the Ruby programming language