prettier 1.0.0.pre.rc2 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +57 -2
 - data/README.md +3 -0
 - data/node_modules/prettier/index.js +54 -54
 - data/package.json +10 -5
 - data/src/nodes/arrays.js +2 -21
 - data/src/nodes/assign.js +5 -1
 - data/src/nodes/calls.js +67 -4
 - data/src/nodes/case.js +53 -49
 - data/src/nodes/hashes.js +23 -56
 - data/src/nodes/loops.js +66 -66
 - data/src/nodes/methods.js +29 -4
 - data/src/nodes/patterns.js +37 -9
 - data/src/nodes/regexp.js +32 -18
 - data/src/nodes/statements.js +2 -2
 - data/src/nodes/strings.js +1 -1
 - data/src/parser.js +27 -12
 - data/src/parser.rb +86 -18
 - data/src/printer.js +13 -0
 - data/src/utils.js +2 -0
 - data/src/utils/printEmptyCollection.js +42 -0
 - metadata +7 -48
 
    
        data/src/nodes/regexp.js
    CHANGED
    
    | 
         @@ -1,21 +1,25 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            const { concat } = require("../prettier");
         
     | 
| 
      
 2 
     | 
    
         
            +
            const { hasAncestor } = require("../utils");
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            function  
     | 
| 
       4 
     | 
    
         
            -
              return node. 
     | 
| 
      
 4 
     | 
    
         
            +
            function hasContent(node, pattern) {
         
     | 
| 
      
 5 
     | 
    
         
            +
              return node.body.some(
         
     | 
| 
      
 6 
     | 
    
         
            +
                (child) => child.type === "@tstring_content" && pattern.test(child.body)
         
     | 
| 
      
 7 
     | 
    
         
            +
              );
         
     | 
| 
       5 
8 
     | 
    
         
             
            }
         
     | 
| 
       6 
9 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
               
     | 
| 
       13 
     | 
    
         
            -
               
     | 
| 
       14 
     | 
    
         
            -
                return true;
         
     | 
| 
       15 
     | 
    
         
            -
              }
         
     | 
| 
      
 10 
     | 
    
         
            +
            // If the first part of this regex is plain string content, we have a space
         
     | 
| 
      
 11 
     | 
    
         
            +
            // or an =, and we're contained within a command or command_call node, then we
         
     | 
| 
      
 12 
     | 
    
         
            +
            // want to use braces because otherwise we could end up with an ambiguous
         
     | 
| 
      
 13 
     | 
    
         
            +
            // operator, e.g. foo / bar/ or foo /=bar/
         
     | 
| 
      
 14 
     | 
    
         
            +
            function forwardSlashIsAmbiguous(path) {
         
     | 
| 
      
 15 
     | 
    
         
            +
              const node = path.getValue();
         
     | 
| 
      
 16 
     | 
    
         
            +
              const firstChildNode = node.body[0];
         
     | 
| 
       16 
17 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
              return  
     | 
| 
       18 
     | 
    
         
            -
                 
     | 
| 
      
 18 
     | 
    
         
            +
              return (
         
     | 
| 
      
 19 
     | 
    
         
            +
                firstChildNode &&
         
     | 
| 
      
 20 
     | 
    
         
            +
                firstChildNode.type === "@tstring_content" &&
         
     | 
| 
      
 21 
     | 
    
         
            +
                [" ", "="].includes(firstChildNode.body[0]) &&
         
     | 
| 
      
 22 
     | 
    
         
            +
                hasAncestor(path, ["command", "command_call"])
         
     | 
| 
       19 
23 
     | 
    
         
             
              );
         
     | 
| 
       20 
24 
     | 
    
         
             
            }
         
     | 
| 
       21 
25 
     | 
    
         | 
| 
         @@ -28,13 +32,23 @@ function shouldUseBraces(node) { 
     | 
|
| 
       28 
32 
     | 
    
         
             
            // itself. In that case we switch over to using %r with braces.
         
     | 
| 
       29 
33 
     | 
    
         
             
            function printRegexpLiteral(path, opts, print) {
         
     | 
| 
       30 
34 
     | 
    
         
             
              const node = path.getValue();
         
     | 
| 
       31 
     | 
    
         
            -
              const  
     | 
| 
      
 35 
     | 
    
         
            +
              const docs = path.map(print, "body");
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              // We should use braces if using a forward slash would be ambiguous in the
         
     | 
| 
      
 38 
     | 
    
         
            +
              // current context or if there's a forward slash in the content of the regexp.
         
     | 
| 
      
 39 
     | 
    
         
            +
              const useBraces = forwardSlashIsAmbiguous(path) || hasContent(node, /\//);
         
     | 
| 
       32 
40 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
               
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
              // If we should be using braces but we have braces in the body of the regexp,
         
     | 
| 
      
 42 
     | 
    
         
            +
              // then we're just going to resort to using whatever the original content was.
         
     | 
| 
      
 43 
     | 
    
         
            +
              if (useBraces && hasContent(node, /[{}]/)) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                return concat([node.beging].concat(docs).concat(node.ending));
         
     | 
| 
      
 45 
     | 
    
         
            +
              }
         
     | 
| 
       36 
46 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
              return concat( 
     | 
| 
      
 47 
     | 
    
         
            +
              return concat(
         
     | 
| 
      
 48 
     | 
    
         
            +
                [useBraces ? "%r{" : "/"]
         
     | 
| 
      
 49 
     | 
    
         
            +
                  .concat(docs)
         
     | 
| 
      
 50 
     | 
    
         
            +
                  .concat(useBraces ? "}" : "/", node.ending.slice(1))
         
     | 
| 
      
 51 
     | 
    
         
            +
              );
         
     | 
| 
       38 
52 
     | 
    
         
             
            }
         
     | 
| 
       39 
53 
     | 
    
         | 
| 
       40 
54 
     | 
    
         
             
            module.exports = {
         
     | 
    
        data/src/nodes/statements.js
    CHANGED
    
    | 
         @@ -98,8 +98,8 @@ module.exports = { 
     | 
|
| 
       98 
98 
     | 
    
         
             
                  stmts[0].comments
         
     | 
| 
       99 
99 
     | 
    
         
             
                ) {
         
     | 
| 
       100 
100 
     | 
    
         
             
                  const comments = path.map(
         
     | 
| 
       101 
     | 
    
         
            -
                    (commentPath 
     | 
| 
       102 
     | 
    
         
            -
                       
     | 
| 
      
 101 
     | 
    
         
            +
                    (commentPath) => {
         
     | 
| 
      
 102 
     | 
    
         
            +
                      commentPath.getValue().printed = true;
         
     | 
| 
       103 
103 
     | 
    
         
             
                      return opts.printer.printComment(commentPath);
         
     | 
| 
       104 
104 
     | 
    
         
             
                    },
         
     | 
| 
       105 
105 
     | 
    
         
             
                    "body",
         
     | 
    
        data/src/nodes/strings.js
    CHANGED
    
    | 
         @@ -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 =  
     | 
| 
      
 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
         
     | 
    
        data/src/parser.js
    CHANGED
    
    | 
         @@ -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. 
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            const  
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
               
     | 
| 
       12 
     | 
    
         
            -
               
     | 
| 
       13 
     | 
    
         
            -
               
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
               
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 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
         
     | 
    
        data/src/parser.rb
    CHANGED
    
    | 
         @@ -63,14 +63,14 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       63 
63 
     | 
    
         
             
              # would happen to be the innermost keyword). Then the outer one would only be
         
     | 
| 
       64 
64 
     | 
    
         
             
              # able to grab the first one. In this way all of the scanner events act as
         
     | 
| 
       65 
65 
     | 
    
         
             
              # their own stack.
         
     | 
| 
       66 
     | 
    
         
            -
              def find_scanner_event(type, body = :any)
         
     | 
| 
      
 66 
     | 
    
         
            +
              def find_scanner_event(type, body = :any, consume: true)
         
     | 
| 
       67 
67 
     | 
    
         
             
                index =
         
     | 
| 
       68 
68 
     | 
    
         
             
                  scanner_events.rindex do |scanner_event|
         
     | 
| 
       69 
69 
     | 
    
         
             
                    scanner_event[:type] == type &&
         
     | 
| 
       70 
70 
     | 
    
         
             
                      (body == :any || (scanner_event[:body] == body))
         
     | 
| 
       71 
71 
     | 
    
         
             
                  end
         
     | 
| 
       72 
72 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
                scanner_events.delete_at(index)
         
     | 
| 
      
 73 
     | 
    
         
            +
                consume ? scanner_events.delete_at(index) : (index && scanner_events[index])
         
     | 
| 
       74 
74 
     | 
    
         
             
              end
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
              # Scanner events occur when the lexer hits a new token, like a keyword or an
         
     | 
| 
         @@ -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, 
     | 
| 
      
 317 
     | 
    
         
            +
                    body: args[:body] << arg,
         
     | 
| 
      
 318 
     | 
    
         
            +
                    end: arg[:end],
         
     | 
| 
      
 319 
     | 
    
         
            +
                    char_end: arg[:char_end]
         
     | 
| 
       318 
320 
     | 
    
         
             
                  )
         
     | 
| 
       319 
321 
     | 
    
         
             
                end
         
     | 
| 
       320 
322 
     | 
    
         
             
              end
         
     | 
| 
         @@ -673,8 +675,15 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       673 
675 
     | 
    
         
             
              # It accepts as arguments the switch of the case and the consequent
         
     | 
| 
       674 
676 
     | 
    
         
             
              # clause.
         
     | 
| 
       675 
677 
     | 
    
         
             
              def on_case(switch, consequent)
         
     | 
| 
       676 
     | 
    
         
            -
                 
     | 
| 
       677 
     | 
    
         
            -
                   
     | 
| 
      
 678 
     | 
    
         
            +
                beging =
         
     | 
| 
      
 679 
     | 
    
         
            +
                  if event = find_scanner_event(:@kw, 'case', consume: false)
         
     | 
| 
      
 680 
     | 
    
         
            +
                    scanner_events.delete(event).merge!(type: :case)
         
     | 
| 
      
 681 
     | 
    
         
            +
                  else
         
     | 
| 
      
 682 
     | 
    
         
            +
                    keyword = find_scanner_event(:@kw, 'in', consume: false)
         
     | 
| 
      
 683 
     | 
    
         
            +
                    switch.merge(type: :rassign, keyword: keyword)
         
     | 
| 
      
 684 
     | 
    
         
            +
                  end
         
     | 
| 
      
 685 
     | 
    
         
            +
             
     | 
| 
      
 686 
     | 
    
         
            +
                beging.merge!(
         
     | 
| 
       678 
687 
     | 
    
         
             
                  body: [switch, consequent],
         
     | 
| 
       679 
688 
     | 
    
         
             
                  end: consequent[:end],
         
     | 
| 
       680 
689 
     | 
    
         
             
                  char_end: consequent[:char_end]
         
     | 
| 
         @@ -812,18 +821,43 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       812 
821 
     | 
    
         
             
              #          │   └> params
         
     | 
| 
       813 
822 
     | 
    
         
             
              #          └> ident
         
     | 
| 
       814 
823 
     | 
    
         
             
              #
         
     | 
| 
      
 824 
     | 
    
         
            +
              # You can also have single-line methods since Ruby 3.0+, which have slightly
         
     | 
| 
      
 825 
     | 
    
         
            +
              # different syntax but still flow through this method. Those look like:
         
     | 
| 
      
 826 
     | 
    
         
            +
              #
         
     | 
| 
      
 827 
     | 
    
         
            +
              #     def foo = bar
         
     | 
| 
      
 828 
     | 
    
         
            +
              #          |     |
         
     | 
| 
      
 829 
     | 
    
         
            +
              #          |     └> stmt
         
     | 
| 
      
 830 
     | 
    
         
            +
              #          └> ident
         
     | 
| 
      
 831 
     | 
    
         
            +
              #
         
     | 
| 
       815 
832 
     | 
    
         
             
              def on_def(ident, params, bodystmt)
         
     | 
| 
       816 
833 
     | 
    
         
             
                # Make sure to delete this scanner event in case you're defining something
         
     | 
| 
       817 
834 
     | 
    
         
             
                # like def class which would lead to this being a kw and causing all kinds
         
     | 
| 
       818 
835 
     | 
    
         
             
                # of trouble
         
     | 
| 
       819 
836 
     | 
    
         
             
                scanner_events.delete(ident)
         
     | 
| 
       820 
837 
     | 
    
         | 
| 
      
 838 
     | 
    
         
            +
                # Find the beginning of the method definition, which works for single-line
         
     | 
| 
      
 839 
     | 
    
         
            +
                # and normal method definitions.
         
     | 
| 
      
 840 
     | 
    
         
            +
                beging = find_scanner_event(:@kw, 'def')
         
     | 
| 
      
 841 
     | 
    
         
            +
             
     | 
| 
      
 842 
     | 
    
         
            +
                # If we don't have a bodystmt node, then we have a single-line method
         
     | 
| 
      
 843 
     | 
    
         
            +
                if bodystmt[:type] != :bodystmt
         
     | 
| 
      
 844 
     | 
    
         
            +
                  return(
         
     | 
| 
      
 845 
     | 
    
         
            +
                    {
         
     | 
| 
      
 846 
     | 
    
         
            +
                      type: :defsl,
         
     | 
| 
      
 847 
     | 
    
         
            +
                      body: [ident, params, bodystmt],
         
     | 
| 
      
 848 
     | 
    
         
            +
                      start: beging[:start],
         
     | 
| 
      
 849 
     | 
    
         
            +
                      char_start: beging[:char_start],
         
     | 
| 
      
 850 
     | 
    
         
            +
                      end: bodystmt[:end],
         
     | 
| 
      
 851 
     | 
    
         
            +
                      char_end: bodystmt[:char_end]
         
     | 
| 
      
 852 
     | 
    
         
            +
                    }
         
     | 
| 
      
 853 
     | 
    
         
            +
                  )
         
     | 
| 
      
 854 
     | 
    
         
            +
                end
         
     | 
| 
      
 855 
     | 
    
         
            +
             
     | 
| 
       821 
856 
     | 
    
         
             
                if params[:type] == :params && !params[:body].any?
         
     | 
| 
       822 
857 
     | 
    
         
             
                  location = ident[:char_end]
         
     | 
| 
       823 
858 
     | 
    
         
             
                  params.merge!(char_start: location, char_end: location)
         
     | 
| 
       824 
859 
     | 
    
         
             
                end
         
     | 
| 
       825 
860 
     | 
    
         | 
| 
       826 
     | 
    
         
            -
                beging = find_scanner_event(:@kw, 'def')
         
     | 
| 
       827 
861 
     | 
    
         
             
                ending = find_scanner_event(:@kw, 'end')
         
     | 
| 
       828 
862 
     | 
    
         | 
| 
       829 
863 
     | 
    
         
             
                bodystmt.bind(
         
     | 
| 
         @@ -979,7 +1013,7 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       979 
1013 
     | 
    
         
             
              #
         
     | 
| 
       980 
1014 
     | 
    
         
             
              # which would be the same symbol as above.
         
     | 
| 
       981 
1015 
     | 
    
         
             
              def on_dyna_symbol(string)
         
     | 
| 
       982 
     | 
    
         
            -
                if  
     | 
| 
      
 1016 
     | 
    
         
            +
                if find_scanner_event(:@symbeg, consume: false)
         
     | 
| 
       983 
1017 
     | 
    
         
             
                  # A normal dynamic symbol
         
     | 
| 
       984 
1018 
     | 
    
         
             
                  beging = find_scanner_event(:@symbeg)
         
     | 
| 
       985 
1019 
     | 
    
         
             
                  ending = find_scanner_event(:@tstring_end)
         
     | 
| 
         @@ -1155,6 +1189,24 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1155 
1189 
     | 
    
         
             
                }
         
     | 
| 
       1156 
1190 
     | 
    
         
             
              end
         
     | 
| 
       1157 
1191 
     | 
    
         | 
| 
      
 1192 
     | 
    
         
            +
              # fndptn is a parser event that represents matching against a pattern where
         
     | 
| 
      
 1193 
     | 
    
         
            +
              # you find a pattern in an array using the Ruby 3.0+ pattern matching syntax.
         
     | 
| 
      
 1194 
     | 
    
         
            +
              def on_fndptn(const, presplat, args, postsplat)
         
     | 
| 
      
 1195 
     | 
    
         
            +
                beging = const || find_scanner_event(:@lbracket)
         
     | 
| 
      
 1196 
     | 
    
         
            +
                ending = find_scanner_event(:@rbracket)
         
     | 
| 
      
 1197 
     | 
    
         
            +
             
     | 
| 
      
 1198 
     | 
    
         
            +
                pieces = [const, presplat, *args, postsplat].compact
         
     | 
| 
      
 1199 
     | 
    
         
            +
             
     | 
| 
      
 1200 
     | 
    
         
            +
                {
         
     | 
| 
      
 1201 
     | 
    
         
            +
                  type: :fndptn,
         
     | 
| 
      
 1202 
     | 
    
         
            +
                  body: [const, presplat, args, postsplat],
         
     | 
| 
      
 1203 
     | 
    
         
            +
                  start: beging[:start],
         
     | 
| 
      
 1204 
     | 
    
         
            +
                  char_start: beging[:char_start],
         
     | 
| 
      
 1205 
     | 
    
         
            +
                  end: ending[:end],
         
     | 
| 
      
 1206 
     | 
    
         
            +
                  char_end: ending[:char_end]
         
     | 
| 
      
 1207 
     | 
    
         
            +
                }
         
     | 
| 
      
 1208 
     | 
    
         
            +
              end
         
     | 
| 
      
 1209 
     | 
    
         
            +
             
     | 
| 
       1158 
1210 
     | 
    
         
             
              # for is a parser event that represents using the somewhat esoteric for
         
     | 
| 
       1159 
1211 
     | 
    
         
             
              # loop. It accepts as arguments an ident which is the iterating variable,
         
     | 
| 
       1160 
1212 
     | 
    
         
             
              # an enumerable for that which is being enumerated, and a stmts event that
         
     | 
| 
         @@ -1186,7 +1238,8 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1186 
1238 
     | 
    
         
             
                  # Here we're going to expand out the location information for the assocs
         
     | 
| 
       1187 
1239 
     | 
    
         
             
                  # node so that it can grab up any remaining comments inside the hash.
         
     | 
| 
       1188 
1240 
     | 
    
         
             
                  assoclist_from_args.merge!(
         
     | 
| 
       1189 
     | 
    
         
            -
                    char_start: beging[:char_end], 
     | 
| 
      
 1241 
     | 
    
         
            +
                    char_start: beging[:char_end],
         
     | 
| 
      
 1242 
     | 
    
         
            +
                    char_end: ending[:char_start]
         
     | 
| 
       1190 
1243 
     | 
    
         
             
                  )
         
     | 
| 
       1191 
1244 
     | 
    
         
             
                end
         
     | 
| 
       1192 
1245 
     | 
    
         | 
| 
         @@ -1299,8 +1352,12 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1299 
1352 
     | 
    
         
             
              end
         
     | 
| 
       1300 
1353 
     | 
    
         | 
| 
       1301 
1354 
     | 
    
         
             
              # in is a parser event that represents using the in keyword within the
         
     | 
| 
       1302 
     | 
    
         
            -
              # Ruby 2.7+ pattern matching syntax.
         
     | 
| 
      
 1355 
     | 
    
         
            +
              # Ruby 2.7+ pattern matching syntax. Alternatively in Ruby 3+ it is also used
         
     | 
| 
      
 1356 
     | 
    
         
            +
              # to handle rightward assignment for pattern matching.
         
     | 
| 
       1303 
1357 
     | 
    
         
             
              def on_in(pattern, stmts, consequent)
         
     | 
| 
      
 1358 
     | 
    
         
            +
                # Here we have a rightward assignment
         
     | 
| 
      
 1359 
     | 
    
         
            +
                return pattern unless stmts
         
     | 
| 
      
 1360 
     | 
    
         
            +
             
     | 
| 
       1304 
1361 
     | 
    
         
             
                beging = find_scanner_event(:@kw, 'in')
         
     | 
| 
       1305 
1362 
     | 
    
         
             
                ending = consequent || find_scanner_event(:@kw, 'end')
         
     | 
| 
       1306 
1363 
     | 
    
         | 
| 
         @@ -1338,8 +1395,8 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1338 
1395 
     | 
    
         
             
              def on_lambda(params, stmts)
         
     | 
| 
       1339 
1396 
     | 
    
         
             
                beging = find_scanner_event(:@tlambda)
         
     | 
| 
       1340 
1397 
     | 
    
         | 
| 
       1341 
     | 
    
         
            -
                if  
     | 
| 
       1342 
     | 
    
         
            -
                  opening =  
     | 
| 
      
 1398 
     | 
    
         
            +
                if event = find_scanner_event(:@tlambeg, consume: false)
         
     | 
| 
      
 1399 
     | 
    
         
            +
                  opening = scanner_events.delete(event)
         
     | 
| 
       1343 
1400 
     | 
    
         
             
                  closing = find_scanner_event(:@rbrace)
         
     | 
| 
       1344 
1401 
     | 
    
         
             
                else
         
     | 
| 
       1345 
1402 
     | 
    
         
             
                  opening = find_scanner_event(:@kw, 'do')
         
     | 
| 
         @@ -1448,7 +1505,9 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1448 
1505 
     | 
    
         
             
                  part.merge(type: :mlhs, body: [part])
         
     | 
| 
       1449 
1506 
     | 
    
         
             
                else
         
     | 
| 
       1450 
1507 
     | 
    
         
             
                  mlhs.merge!(
         
     | 
| 
       1451 
     | 
    
         
            -
                    body: mlhs[:body] << part, 
     | 
| 
      
 1508 
     | 
    
         
            +
                    body: mlhs[:body] << part,
         
     | 
| 
      
 1509 
     | 
    
         
            +
                    end: part[:end],
         
     | 
| 
      
 1510 
     | 
    
         
            +
                    char_end: part[:char_end]
         
     | 
| 
       1452 
1511 
     | 
    
         
             
                  )
         
     | 
| 
       1453 
1512 
     | 
    
         
             
                end
         
     | 
| 
       1454 
1513 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1551,7 +1610,9 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1551 
1610 
     | 
    
         
             
                  part.merge(type: :mrhs, body: [part])
         
     | 
| 
       1552 
1611 
     | 
    
         
             
                else
         
     | 
| 
       1553 
1612 
     | 
    
         
             
                  mrhs.merge!(
         
     | 
| 
       1554 
     | 
    
         
            -
                    body: mrhs[:body] << part, 
     | 
| 
      
 1613 
     | 
    
         
            +
                    body: mrhs[:body] << part,
         
     | 
| 
      
 1614 
     | 
    
         
            +
                    end: part[:end],
         
     | 
| 
      
 1615 
     | 
    
         
            +
                    char_end: part[:char_end]
         
     | 
| 
       1555 
1616 
     | 
    
         
             
                  )
         
     | 
| 
       1556 
1617 
     | 
    
         
             
                end
         
     | 
| 
       1557 
1618 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1712,7 +1773,8 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1712 
1773 
     | 
    
         
             
              # expression literal, like /foo/. It can be followed by any number of
         
     | 
| 
       1713 
1774 
     | 
    
         
             
              # regexp_add events, which we'll append onto an array body.
         
     | 
| 
       1714 
1775 
     | 
    
         
             
              def on_regexp_new
         
     | 
| 
       1715 
     | 
    
         
            -
                find_scanner_event(:@regexp_beg) 
     | 
| 
      
 1776 
     | 
    
         
            +
                beging = find_scanner_event(:@regexp_beg)
         
     | 
| 
      
 1777 
     | 
    
         
            +
                beging.merge!(type: :regexp, body: [], beging: beging[:body])
         
     | 
| 
       1716 
1778 
     | 
    
         
             
              end
         
     | 
| 
       1717 
1779 
     | 
    
         | 
| 
       1718 
1780 
     | 
    
         
             
              # regexp_add is a parser event that represents a piece of a regular
         
     | 
| 
         @@ -1960,7 +2022,9 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       1960 
2022 
     | 
    
         
             
              # piece of the string.
         
     | 
| 
       1961 
2023 
     | 
    
         
             
              def on_string_add(string, piece)
         
     | 
| 
       1962 
2024 
     | 
    
         
             
                string.merge!(
         
     | 
| 
       1963 
     | 
    
         
            -
                  body: string[:body] << piece, 
     | 
| 
      
 2025 
     | 
    
         
            +
                  body: string[:body] << piece,
         
     | 
| 
      
 2026 
     | 
    
         
            +
                  end: piece[:end],
         
     | 
| 
      
 2027 
     | 
    
         
            +
                  char_end: piece[:char_end]
         
     | 
| 
       1964 
2028 
     | 
    
         
             
                )
         
     | 
| 
       1965 
2029 
     | 
    
         
             
              end
         
     | 
| 
       1966 
2030 
     | 
    
         | 
| 
         @@ -2296,7 +2360,7 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       2296 
2360 
     | 
    
         
             
                else
         
     | 
| 
       2297 
2361 
     | 
    
         
             
                  # You can hit this pattern if you're assigning to a splat using pattern
         
     | 
| 
       2298 
2362 
     | 
    
         
             
                  # matching syntax in Ruby 2.7+
         
     | 
| 
       2299 
     | 
    
         
            -
                  { type: :var_field, body:  
     | 
| 
      
 2363 
     | 
    
         
            +
                  { type: :var_field, body: nil }
         
     | 
| 
       2300 
2364 
     | 
    
         
             
                end
         
     | 
| 
       2301 
2365 
     | 
    
         
             
              end
         
     | 
| 
       2302 
2366 
     | 
    
         | 
| 
         @@ -2417,7 +2481,9 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       2417 
2481 
     | 
    
         
             
                  piece.merge(type: :word, body: [piece])
         
     | 
| 
       2418 
2482 
     | 
    
         
             
                else
         
     | 
| 
       2419 
2483 
     | 
    
         
             
                  word.merge!(
         
     | 
| 
       2420 
     | 
    
         
            -
                    body: word[:body] << piece, 
     | 
| 
      
 2484 
     | 
    
         
            +
                    body: word[:body] << piece,
         
     | 
| 
      
 2485 
     | 
    
         
            +
                    end: piece[:end],
         
     | 
| 
      
 2486 
     | 
    
         
            +
                    char_end: piece[:char_end]
         
     | 
| 
       2421 
2487 
     | 
    
         
             
                  )
         
     | 
| 
       2422 
2488 
     | 
    
         
             
                end
         
     | 
| 
       2423 
2489 
     | 
    
         
             
              end
         
     | 
| 
         @@ -2498,7 +2564,9 @@ class Prettier::Parser < Ripper 
     | 
|
| 
       2498 
2564 
     | 
    
         
             
                else
         
     | 
| 
       2499 
2565 
     | 
    
         
             
                  ending = find_scanner_event(:@tstring_end)
         
     | 
| 
       2500 
2566 
     | 
    
         
             
                  xstring.merge!(
         
     | 
| 
       2501 
     | 
    
         
            -
                    type: :xstring_literal, 
     | 
| 
      
 2567 
     | 
    
         
            +
                    type: :xstring_literal,
         
     | 
| 
      
 2568 
     | 
    
         
            +
                    end: ending[:end],
         
     | 
| 
      
 2569 
     | 
    
         
            +
                    char_end: ending[:char_end]
         
     | 
| 
       2502 
2570 
     | 
    
         
             
                  )
         
     | 
| 
       2503 
2571 
     | 
    
         
             
                end
         
     | 
| 
       2504 
2572 
     | 
    
         
             
              end
         
     | 
    
        data/src/printer.js
    CHANGED
    
    | 
         @@ -20,6 +20,18 @@ function printNode(path, opts, print) { 
     | 
|
| 
       20 
20 
     | 
    
         
             
              throw new Error(`Unsupported node encountered: ${type}\n${ast}`);
         
     | 
| 
       21 
21 
     | 
    
         
             
            }
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
      
 23 
     | 
    
         
            +
            // This is an escape-hatch to ignore nodes in the tree. If you have a comment
         
     | 
| 
      
 24 
     | 
    
         
            +
            // that includes this pattern, then the entire node will be ignored and just the
         
     | 
| 
      
 25 
     | 
    
         
            +
            // original source will be printed out.
         
     | 
| 
      
 26 
     | 
    
         
            +
            function hasPrettierIgnore(path) {
         
     | 
| 
      
 27 
     | 
    
         
            +
              const node = path.getValue();
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              return (
         
     | 
| 
      
 30 
     | 
    
         
            +
                node.comments &&
         
     | 
| 
      
 31 
     | 
    
         
            +
                node.comments.some((comment) => comment.value.includes("prettier-ignore"))
         
     | 
| 
      
 32 
     | 
    
         
            +
              );
         
     | 
| 
      
 33 
     | 
    
         
            +
            }
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
       23 
35 
     | 
    
         
             
            const noComments = [
         
     | 
| 
       24 
36 
     | 
    
         
             
              "args",
         
     | 
| 
       25 
37 
     | 
    
         
             
              "args_add_block",
         
     | 
| 
         @@ -83,6 +95,7 @@ function isBlockComment(comment) { 
     | 
|
| 
       83 
95 
     | 
    
         
             
            module.exports = {
         
     | 
| 
       84 
96 
     | 
    
         
             
              embed,
         
     | 
| 
       85 
97 
     | 
    
         
             
              print: printNode,
         
     | 
| 
      
 98 
     | 
    
         
            +
              hasPrettierIgnore,
         
     | 
| 
       86 
99 
     | 
    
         
             
              canAttachComment,
         
     | 
| 
       87 
100 
     | 
    
         
             
              getCommentChildNodes,
         
     | 
| 
       88 
101 
     | 
    
         
             
              printComment,
         
     | 
    
        data/src/utils.js
    CHANGED
    
    | 
         @@ -1,6 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            const { concat } = require("./prettier");
         
     | 
| 
       2 
2 
     | 
    
         
             
            const isEmptyStmts = require("./utils/isEmptyStmts");
         
     | 
| 
       3 
3 
     | 
    
         
             
            const literalLineNoBreak = require("./utils/literalLineNoBreak");
         
     | 
| 
      
 4 
     | 
    
         
            +
            const printEmptyCollection = require("./utils/printEmptyCollection");
         
     | 
| 
       4 
5 
     | 
    
         | 
| 
       5 
6 
     | 
    
         
             
            // If the node is a type of assignment or if the node is a paren and nested
         
     | 
| 
       6 
7 
     | 
    
         
             
            // inside that paren is a node that is a type of assignment.
         
     | 
| 
         @@ -89,5 +90,6 @@ module.exports = { 
     | 
|
| 
       89 
90 
     | 
    
         
             
              makeCall,
         
     | 
| 
       90 
91 
     | 
    
         
             
              noIndent,
         
     | 
| 
       91 
92 
     | 
    
         
             
              prefix,
         
     | 
| 
      
 93 
     | 
    
         
            +
              printEmptyCollection,
         
     | 
| 
       92 
94 
     | 
    
         
             
              skipAssignIndent
         
     | 
| 
       93 
95 
     | 
    
         
             
            };
         
     | 
| 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            const { concat, group, hardline, indent, join, line } = require("../prettier");
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            // Empty collections are array or hash literals that do not contain any
         
     | 
| 
      
 4 
     | 
    
         
            +
            // contents. They can, however, have comments inside the body. You can solve
         
     | 
| 
      
 5 
     | 
    
         
            +
            // this by having a child node inside the array that gets the comments attached
         
     | 
| 
      
 6 
     | 
    
         
            +
            // to it, but that requires modifying the parser. Instead, we can just manually
         
     | 
| 
      
 7 
     | 
    
         
            +
            // print out the non-leading comments here.
         
     | 
| 
      
 8 
     | 
    
         
            +
            function printEmptyCollection(path, opts, startToken, endToken) {
         
     | 
| 
      
 9 
     | 
    
         
            +
              const node = path.getValue();
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              // If there are no comments or only leading comments, then we can just print
         
     | 
| 
      
 12 
     | 
    
         
            +
              // out the start and end token and be done, as there are no comments inside
         
     | 
| 
      
 13 
     | 
    
         
            +
              // the body of this node.
         
     | 
| 
      
 14 
     | 
    
         
            +
              if (!node.comments || !node.comments.some((comment) => !comment.leading)) {
         
     | 
| 
      
 15 
     | 
    
         
            +
                return `${startToken}${endToken}`;
         
     | 
| 
      
 16 
     | 
    
         
            +
              }
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              const comments = [];
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              // For each comment, go through its path and print it out manually.
         
     | 
| 
      
 21 
     | 
    
         
            +
              const printComment = (commentPath) => {
         
     | 
| 
      
 22 
     | 
    
         
            +
                const comment = commentPath.getValue();
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                if (!comment.leading) {
         
     | 
| 
      
 25 
     | 
    
         
            +
                  comment.printed = true;
         
     | 
| 
      
 26 
     | 
    
         
            +
                  comments.push(opts.printer.printComment(commentPath));
         
     | 
| 
      
 27 
     | 
    
         
            +
                }
         
     | 
| 
      
 28 
     | 
    
         
            +
              };
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              path.each(printComment, "comments");
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              return group(
         
     | 
| 
      
 33 
     | 
    
         
            +
                concat([
         
     | 
| 
      
 34 
     | 
    
         
            +
                  startToken,
         
     | 
| 
      
 35 
     | 
    
         
            +
                  indent(concat([hardline, join(hardline, comments)])),
         
     | 
| 
      
 36 
     | 
    
         
            +
                  line,
         
     | 
| 
      
 37 
     | 
    
         
            +
                  endToken
         
     | 
| 
      
 38 
     | 
    
         
            +
                ])
         
     | 
| 
      
 39 
     | 
    
         
            +
              );
         
     | 
| 
      
 40 
     | 
    
         
            +
            }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            module.exports = printEmptyCollection;
         
     | 
    
        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. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.2.1
         
     | 
| 
       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- 
     | 
| 
       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-27 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies: []
         
     | 
| 
       55 
13 
     | 
    
         
             
            description:
         
     | 
| 
       56 
14 
     | 
    
         
             
            email:
         
     | 
| 
       57 
15 
     | 
    
         
             
            executables:
         
     | 
| 
         @@ -115,6 +73,7 @@ files: 
     | 
|
| 
       115 
73 
     | 
    
         
             
            - src/utils/inlineEnsureParens.js
         
     | 
| 
       116 
74 
     | 
    
         
             
            - src/utils/isEmptyStmts.js
         
     | 
| 
       117 
75 
     | 
    
         
             
            - src/utils/literalLineNoBreak.js
         
     | 
| 
      
 76 
     | 
    
         
            +
            - src/utils/printEmptyCollection.js
         
     | 
| 
       118 
77 
     | 
    
         
             
            homepage: https://github.com/prettier/plugin-ruby#readme
         
     | 
| 
       119 
78 
     | 
    
         
             
            licenses:
         
     | 
| 
       120 
79 
     | 
    
         
             
            - MIT
         
     | 
| 
         @@ -130,11 +89,11 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       130 
89 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       131 
90 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       132 
91 
     | 
    
         
             
              requirements:
         
     | 
| 
       133 
     | 
    
         
            -
              - - " 
     | 
| 
      
 92 
     | 
    
         
            +
              - - ">="
         
     | 
| 
       134 
93 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       135 
     | 
    
         
            -
                  version:  
     | 
| 
      
 94 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
       136 
95 
     | 
    
         
             
            requirements: []
         
     | 
| 
       137 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 96 
     | 
    
         
            +
            rubygems_version: 3.1.4
         
     | 
| 
       138 
97 
     | 
    
         
             
            signing_key:
         
     | 
| 
       139 
98 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       140 
99 
     | 
    
         
             
            summary: prettier plugin for the Ruby programming language
         
     |