puppet-lint 3.4.0 → 4.0.0.rc.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/lib/puppet-lint/bin.rb +7 -11
- data/lib/puppet-lint/checkplugin.rb +4 -8
- data/lib/puppet-lint/checks.rb +7 -9
- data/lib/puppet-lint/configuration.rb +2 -2
- data/lib/puppet-lint/data.rb +35 -39
- data/lib/puppet-lint/lexer/string_slurper.rb +2 -3
- data/lib/puppet-lint/lexer/token.rb +6 -5
- data/lib/puppet-lint/lexer.rb +35 -38
- data/lib/puppet-lint/monkeypatches.rb +4 -4
- data/lib/puppet-lint/optparser.rb +1 -1
- data/lib/puppet-lint/plugins/check_classes/arrow_on_right_operand_line.rb +1 -0
- data/lib/puppet-lint/plugins/check_classes/autoloader_layout.rb +2 -4
- data/lib/puppet-lint/plugins/check_classes/class_inherits_from_params_class.rb +2 -2
- data/lib/puppet-lint/plugins/check_classes/code_on_top_scope.rb +1 -1
- data/lib/puppet-lint/plugins/check_classes/nested_classes_or_defines.rb +5 -5
- data/lib/puppet-lint/plugins/check_classes/parameter_order.rb +8 -9
- data/lib/puppet-lint/plugins/check_classes/variable_scope.rb +32 -34
- data/lib/puppet-lint/plugins/check_conditionals/case_without_default.rb +2 -2
- data/lib/puppet-lint/plugins/check_documentation/documentation.rb +7 -6
- data/lib/puppet-lint/plugins/check_nodes/unquoted_node_name.rb +1 -1
- data/lib/puppet-lint/plugins/check_resources/ensure_first_param.rb +3 -5
- data/lib/puppet-lint/plugins/check_resources/ensure_not_symlink_target.rb +2 -2
- data/lib/puppet-lint/plugins/check_resources/file_mode.rb +6 -6
- data/lib/puppet-lint/plugins/check_resources/unquoted_file_mode.rb +4 -4
- data/lib/puppet-lint/plugins/check_strings/double_quoted_strings.rb +4 -4
- data/lib/puppet-lint/plugins/check_strings/only_variable_string.rb +4 -5
- data/lib/puppet-lint/plugins/check_strings/quoted_booleans.rb +4 -4
- data/lib/puppet-lint/plugins/check_strings/single_quote_string_with_variables.rb +2 -2
- data/lib/puppet-lint/plugins/check_strings/variables_not_enclosed.rb +8 -7
- data/lib/puppet-lint/plugins/check_variables/variable_contains_dash.rb +3 -3
- data/lib/puppet-lint/plugins/check_variables/variable_is_lowercase.rb +2 -2
- data/lib/puppet-lint/plugins/check_whitespace/140chars.rb +1 -0
- data/lib/puppet-lint/plugins/check_whitespace/80chars.rb +2 -1
- data/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb +9 -9
- data/lib/puppet-lint/plugins/check_whitespace/hard_tabs.rb +2 -2
- data/lib/puppet-lint/plugins/check_whitespace/line_length.rb +6 -6
- data/lib/puppet-lint/plugins/legacy_facts/legacy_facts.rb +106 -105
- data/lib/puppet-lint/plugins/top_scope_facts/top_scope_facts.rb +3 -2
- data/lib/puppet-lint/plugins.rb +3 -4
- data/lib/puppet-lint/report/codeclimate.rb +3 -2
- data/lib/puppet-lint/report/github.rb +1 -0
- data/lib/puppet-lint/tasks/puppet-lint.rb +7 -26
- data/lib/puppet-lint/tasks/release_test.rb +4 -4
- data/lib/puppet-lint/version.rb +1 -1
- data/lib/puppet-lint.rb +5 -3
- data/rubocop_baseline.yml +3 -440
- data/spec/spec_helper.rb +3 -2
- data/spec/spec_helper_acceptance_local.rb +1 -1
- data/spec/unit/puppet-lint/bin_spec.rb +12 -2
- data/spec/unit/puppet-lint/configuration_spec.rb +14 -14
- data/spec/unit/puppet-lint/lexer/string_slurper_spec.rb +3 -5
- data/spec/unit/puppet-lint/lexer_spec.rb +10 -11
- data/spec/unit/puppet-lint/plugins/check_classes/parameter_order_spec.rb +2 -2
- data/spec/unit/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +5 -5
- data/spec/unit/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +1 -1
- data/spec/unit/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +1 -1
- data/spec/unit/puppet-lint/plugins/check_whitespace/140chars_spec.rb +0 -2
- data/spec/unit/puppet-lint/plugins/check_whitespace/80chars_spec.rb +1 -3
- data/spec/unit/puppet-lint/plugins/legacy_facts/legacy_facts_spec.rb +16 -0
- data/spec/unit/puppet-lint/plugins/top_scope_facts/top_scope_facts_spec.rb +1 -0
- metadata +5 -5
| @@ -5,7 +5,7 @@ | |
| 5 5 | 
             
            PuppetLint.new_check(:class_inherits_from_params_class) do
         | 
| 6 6 | 
             
              def check
         | 
| 7 7 | 
             
                class_indexes.each do |class_idx|
         | 
| 8 | 
            -
                  next unless class_idx[:inherited_token] | 
| 8 | 
            +
                  next unless class_idx[:inherited_token]&.value&.end_with?('::params')
         | 
| 9 9 |  | 
| 10 10 | 
             
                  notify(
         | 
| 11 11 | 
             
                    :warning,
         | 
| @@ -18,4 +18,4 @@ PuppetLint.new_check(:class_inherits_from_params_class) do | |
| 18 18 | 
             
                end
         | 
| 19 19 | 
             
              end
         | 
| 20 20 | 
             
            end
         | 
| 21 | 
            -
            PuppetLint.configuration.send( | 
| 21 | 
            +
            PuppetLint.configuration.send(:disable_class_inherits_from_params_class)
         | 
| @@ -2,18 +2,18 @@ | |
| 2 2 | 
             
            # defined inside another class.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#nested-classes-or-defined-types
         | 
| 5 | 
            +
            CLASS_DEFINE_TOKENS = Set[:CLASS, :DEFINE]
         | 
| 5 6 | 
             
            PuppetLint.new_check(:nested_classes_or_defines) do
         | 
| 6 | 
            -
              TOKENS = Set[:CLASS, :DEFINE]
         | 
| 7 | 
            -
             | 
| 8 7 | 
             
              def check
         | 
| 9 8 | 
             
                class_indexes.each do |class_idx|
         | 
| 10 9 | 
             
                  # Skip the first token so that we don't pick up the first :CLASS
         | 
| 11 | 
            -
                  class_tokens = class_idx[:tokens][1 | 
| 10 | 
            +
                  class_tokens = class_idx[:tokens][1..]
         | 
| 12 11 |  | 
| 13 12 | 
             
                  class_tokens.each do |token|
         | 
| 14 | 
            -
                    next unless  | 
| 13 | 
            +
                    next unless CLASS_DEFINE_TOKENS.include?(token.type)
         | 
| 15 14 | 
             
                    next if token.next_code_token.type == :LBRACE
         | 
| 16 | 
            -
             | 
| 15 | 
            +
             | 
| 16 | 
            +
                    type = (token.type == :CLASS) ? 'class' : 'defined type'
         | 
| 17 17 |  | 
| 18 18 | 
             
                    notify(
         | 
| 19 19 | 
             
                      :warning,
         | 
| @@ -11,13 +11,14 @@ PuppetLint.new_check(:parameter_order) do | |
| 11 11 | 
             
                  paren_stack = []
         | 
| 12 12 | 
             
                  hash_or_array_stack = []
         | 
| 13 13 | 
             
                  class_idx[:param_tokens].each_with_index do |token, i|
         | 
| 14 | 
            -
                     | 
| 14 | 
            +
                    case token.type
         | 
| 15 | 
            +
                    when :LPAREN
         | 
| 15 16 | 
             
                      paren_stack.push(true)
         | 
| 16 | 
            -
                     | 
| 17 | 
            +
                    when :RPAREN
         | 
| 17 18 | 
             
                      paren_stack.pop
         | 
| 18 | 
            -
                     | 
| 19 | 
            +
                    when :LBRACE, :LBRACK
         | 
| 19 20 | 
             
                      hash_or_array_stack.push(true)
         | 
| 20 | 
            -
                     | 
| 21 | 
            +
                    when :RBRACE, :RBRACK
         | 
| 21 22 | 
             
                      hash_or_array_stack.pop
         | 
| 22 23 | 
             
                    end
         | 
| 23 24 |  | 
| @@ -34,8 +35,8 @@ PuppetLint.new_check(:parameter_order) do | |
| 34 35 | 
             
                      message: msg,
         | 
| 35 36 | 
             
                      line: token.line,
         | 
| 36 37 | 
             
                      column: token.column,
         | 
| 37 | 
            -
                      description: 'Test the manifest tokens for any parameterised classes or defined types that take '\
         | 
| 38 | 
            -
             | 
| 38 | 
            +
                      description: 'Test the manifest tokens for any parameterised classes or defined types that take ' \
         | 
| 39 | 
            +
                                   'parameters and record a warning if there are any optional parameters listed before required parameters.',
         | 
| 39 40 | 
             
                      help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#display-order-of-parameters',
         | 
| 40 41 | 
             
                    )
         | 
| 41 42 | 
             
                  end
         | 
| @@ -58,9 +59,7 @@ PuppetLint.new_check(:parameter_order) do | |
| 58 59 | 
             
                data_type = token.prev_token_of(:TYPE, skip_blocks: true)
         | 
| 59 60 | 
             
                return false if data_type && data_type.value == 'Optional'
         | 
| 60 61 |  | 
| 61 | 
            -
                if token.next_code_token.nil? || [:COMMA, :RPAREN].include?(token.next_code_token.type)
         | 
| 62 | 
            -
                  return !(token.prev_code_token && token.prev_code_token.type == :EQUALS)
         | 
| 63 | 
            -
                end
         | 
| 62 | 
            +
                return !(token.prev_code_token && token.prev_code_token.type == :EQUALS) if token.next_code_token.nil? || [:COMMA, :RPAREN].include?(token.next_code_token.type)
         | 
| 64 63 |  | 
| 65 64 | 
             
                false
         | 
| 66 65 | 
             
              end
         | 
| @@ -5,35 +5,35 @@ | |
| 5 5 | 
             
            # not.
         | 
| 6 6 | 
             
            #
         | 
| 7 7 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#namespacing-variables
         | 
| 8 | 
            -
             | 
| 9 | 
            -
               | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
              POST_VAR_TOKENS = Set[:COMMA, :EQUALS, :RPAREN]
         | 
| 8 | 
            +
            DEFAULT_SCOPE_VARS = Set[
         | 
| 9 | 
            +
              'name',
         | 
| 10 | 
            +
              'title',
         | 
| 11 | 
            +
              'module_name',
         | 
| 12 | 
            +
              'environment',
         | 
| 13 | 
            +
              'clientcert',
         | 
| 14 | 
            +
              'clientversion',
         | 
| 15 | 
            +
              'servername',
         | 
| 16 | 
            +
              'serverip',
         | 
| 17 | 
            +
              'serverversion',
         | 
| 18 | 
            +
              'caller_module_name',
         | 
| 19 | 
            +
              'alias',
         | 
| 20 | 
            +
              'audit',
         | 
| 21 | 
            +
              'before',
         | 
| 22 | 
            +
              'loglevel',
         | 
| 23 | 
            +
              'noop',
         | 
| 24 | 
            +
              'notify',
         | 
| 25 | 
            +
              'require',
         | 
| 26 | 
            +
              'schedule',
         | 
| 27 | 
            +
              'stage',
         | 
| 28 | 
            +
              'subscribe',
         | 
| 29 | 
            +
              'tag',
         | 
| 30 | 
            +
              'facts',
         | 
| 31 | 
            +
              'trusted',
         | 
| 32 | 
            +
              'server_facts',
         | 
| 33 | 
            +
            ]
         | 
| 34 | 
            +
            POST_VAR_TOKENS = Set[:COMMA, :EQUALS, :RPAREN]
         | 
| 36 35 |  | 
| 36 | 
            +
            PuppetLint.new_check(:variable_scope) do
         | 
| 37 37 | 
             
              def check
         | 
| 38 38 | 
             
                variables_in_scope = DEFAULT_SCOPE_VARS.clone
         | 
| 39 39 |  | 
| @@ -93,7 +93,7 @@ PuppetLint.new_check(:variable_scope) do | |
| 93 93 | 
             
                        end_token = nil
         | 
| 94 94 | 
             
                        brace_depth = 0
         | 
| 95 95 |  | 
| 96 | 
            -
                        tokens[start_idx | 
| 96 | 
            +
                        tokens[start_idx..].each do |sub_token|
         | 
| 97 97 | 
             
                          case sub_token.type
         | 
| 98 98 | 
             
                          when :LBRACE
         | 
| 99 99 | 
             
                            brace_depth += 1
         | 
| @@ -117,9 +117,7 @@ PuppetLint.new_check(:variable_scope) do | |
| 117 117 |  | 
| 118 118 | 
             
                  msg = 'top-scope variable being used without an explicit namespace'
         | 
| 119 119 | 
             
                  referenced_variables.each do |token|
         | 
| 120 | 
            -
                     | 
| 121 | 
            -
                      next if future_parser_scopes[token.line].include?(token.value.gsub(%r{\[.+\]\Z}, ''))
         | 
| 122 | 
            -
                    end
         | 
| 120 | 
            +
                    next if !future_parser_scopes[token.line].nil? && future_parser_scopes[token.line].include?(token.value.gsub(%r{\[.+\]\Z}, ''))
         | 
| 123 121 |  | 
| 124 122 | 
             
                    next if token.value.include?('::')
         | 
| 125 123 | 
             
                    next if %r{^(facts|trusted)\[.+\]}.match?(token.value)
         | 
| @@ -132,8 +130,8 @@ PuppetLint.new_check(:variable_scope) do | |
| 132 130 | 
             
                      line: token.line,
         | 
| 133 131 | 
             
                      column: token.column,
         | 
| 134 132 | 
             
                      description: 'Test the manifest tokens for any variables that are referenced in the manifest. ' \
         | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 133 | 
            +
                                   'If the variables are not fully qualified or one of the variables automatically created in the scope, ' \
         | 
| 134 | 
            +
                                   'check that they have been defined in the local scope and record a warning for each variable that has not.',
         | 
| 137 135 | 
             
                      help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#namespacing-variables',
         | 
| 138 136 | 
             
                    )
         | 
| 139 137 | 
             
                  end
         | 
| @@ -10,7 +10,7 @@ PuppetLint.new_check(:case_without_default) do | |
| 10 10 | 
             
                  next unless tokens[token_idx].type == :CASE
         | 
| 11 11 |  | 
| 12 12 | 
             
                  depth = 0
         | 
| 13 | 
            -
                  tokens[(token_idx + 1) | 
| 13 | 
            +
                  tokens[(token_idx + 1)..].each_index do |case_token_idx|
         | 
| 14 14 | 
             
                    idx = case_token_idx + token_idx + 1
         | 
| 15 15 | 
             
                    if tokens[idx].type == :LBRACE
         | 
| 16 16 | 
             
                      depth += 1
         | 
| @@ -27,7 +27,7 @@ PuppetLint.new_check(:case_without_default) do | |
| 27 27 | 
             
                case_indexes.each_with_index do |kase, kase_index|
         | 
| 28 28 | 
             
                  case_tokens = tokens[kase[:start]..kase[:end]]
         | 
| 29 29 |  | 
| 30 | 
            -
                  case_indexes[(kase_index + 1) | 
| 30 | 
            +
                  case_indexes[(kase_index + 1)..].each do |successor_kase|
         | 
| 31 31 | 
             
                    case_tokens -= tokens[successor_kase[:start]..successor_kase[:end]]
         | 
| 32 32 | 
             
                  end
         | 
| 33 33 |  | 
| @@ -3,10 +3,10 @@ | |
| 3 3 | 
             
            # record a warning for each instance found.
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#public-and-private
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
              WHITESPACE_TOKENS = Set[:WHITESPACE, :NEWLINE, :INDENT]
         | 
| 6 | 
            +
            COMMENT_TOKENS = Set[:COMMENT, :MLCOMMENT, :SLASH_COMMENT]
         | 
| 7 | 
            +
            WHITESPACE_TOKENS = Set[:WHITESPACE, :NEWLINE, :INDENT]
         | 
| 9 8 |  | 
| 9 | 
            +
            PuppetLint.new_check(:documentation) do
         | 
| 10 10 | 
             
              def check
         | 
| 11 11 | 
             
                (class_indexes + defined_type_indexes).each do |item_idx|
         | 
| 12 12 | 
             
                  comment_token = find_comment_token(item_idx[:tokens].first)
         | 
| @@ -25,9 +25,9 @@ PuppetLint.new_check(:documentation) do | |
| 25 25 | 
             
                    message: "#{type} not documented",
         | 
| 26 26 | 
             
                    line: first_token.line,
         | 
| 27 27 | 
             
                    column: first_token.column,
         | 
| 28 | 
            -
                    description: 'Check the manifest tokens for any class or defined type that does not '\
         | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 28 | 
            +
                    description: 'Check the manifest tokens for any class or defined type that does not ' \
         | 
| 29 | 
            +
                                 'have a comment directly above it (hopefully, explaining the usage of it) and record ' \
         | 
| 30 | 
            +
                                 'a warning for each instance found.',
         | 
| 31 31 | 
             
                    help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#public-and-private',
         | 
| 32 32 | 
             
                  )
         | 
| 33 33 | 
             
                end
         | 
| @@ -40,6 +40,7 @@ PuppetLint.new_check(:documentation) do | |
| 40 40 | 
             
                while !prev_token.nil? && WHITESPACE_TOKENS.include?(prev_token.type)
         | 
| 41 41 | 
             
                  newlines += 1 if prev_token.type == :NEWLINE
         | 
| 42 42 | 
             
                  break if newlines > 1
         | 
| 43 | 
            +
             | 
| 43 44 | 
             
                  prev_token = prev_token.prev_token
         | 
| 44 45 | 
             
                end
         | 
| 45 46 |  | 
| @@ -7,7 +7,7 @@ PuppetLint.new_check(:unquoted_node_name) do | |
| 7 7 | 
             
                node_tokens = tokens.select { |token| token.type == :NODE }
         | 
| 8 8 | 
             
                node_tokens.each do |node|
         | 
| 9 9 | 
             
                  node_token_idx = tokens.index(node)
         | 
| 10 | 
            -
                  node_lbrace_tok = tokens[node_token_idx | 
| 10 | 
            +
                  node_lbrace_tok = tokens[node_token_idx..].find { |token| token.type == :LBRACE }
         | 
| 11 11 | 
             
                  if node_lbrace_tok.nil?
         | 
| 12 12 | 
             
                    notify(
         | 
| 13 13 | 
             
                      :error,
         | 
| @@ -21,8 +21,8 @@ PuppetLint.new_check(:ensure_first_param) do | |
| 21 21 | 
             
                    line: ensure_token.line,
         | 
| 22 22 | 
             
                    column: ensure_token.column,
         | 
| 23 23 | 
             
                    resource: resource,
         | 
| 24 | 
            -
                    description: 'Check the tokens of each resource instance for an ensure parameter and if '\
         | 
| 25 | 
            -
             | 
| 24 | 
            +
                    description: 'Check the tokens of each resource instance for an ensure parameter and if ' \
         | 
| 25 | 
            +
                                 'found, check that it is the first parameter listed.  If it is not the first parameter, record a warning.',
         | 
| 26 26 | 
             
                    help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#attribute-ordering',
         | 
| 27 27 | 
             
                  )
         | 
| 28 28 | 
             
                end
         | 
| @@ -37,9 +37,7 @@ PuppetLint.new_check(:ensure_first_param) do | |
| 37 37 |  | 
| 38 38 | 
             
                ensure_param_comma_token = ensure_param_name_token.next_token_of([:COMMA, :SEMIC])
         | 
| 39 39 |  | 
| 40 | 
            -
                if first_param_name_token.nil? || first_param_comma_token.nil? || ensure_param_comma_token.nil?
         | 
| 41 | 
            -
                  raise PuppetLint::NoFix
         | 
| 42 | 
            -
                end
         | 
| 40 | 
            +
                raise PuppetLint::NoFix if first_param_name_token.nil? || first_param_comma_token.nil? || ensure_param_comma_token.nil?
         | 
| 43 41 |  | 
| 44 42 | 
             
                first_param_name_idx = tokens.index(first_param_name_token)
         | 
| 45 43 | 
             
                first_param_comma_idx = tokens.index(first_param_comma_token)
         | 
| @@ -21,8 +21,8 @@ PuppetLint.new_check(:ensure_not_symlink_target) do | |
| 21 21 | 
             
                      column: value_token.column,
         | 
| 22 22 | 
             
                      param_token: ensure_token,
         | 
| 23 23 | 
             
                      value_token: value_token,
         | 
| 24 | 
            -
                      description: 'Check the tokens of each File resource instance for an ensure parameter and '\
         | 
| 25 | 
            -
             | 
| 24 | 
            +
                      description: 'Check the tokens of each File resource instance for an ensure parameter and ' \
         | 
| 25 | 
            +
                                   'record a warning if the value of that parameter looks like a symlink target (starts with a \'/\').',
         | 
| 26 26 | 
             
                      help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#symbolic-links',
         | 
| 27 27 | 
             
                    )
         | 
| 28 28 | 
             
                  end
         | 
| @@ -3,12 +3,12 @@ | |
| 3 3 | 
             
            # not a 4 digit octal value (0755) or a symbolic mode ('o=rwx,g+r').
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#file-modes
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
              MODE_RE = %r{\A([0-7]{4}|#{SYM_RE})\Z}.freeze
         | 
| 6 | 
            +
            MSG = 'mode should be represented as a 4 digit octal value or symbolic mode'.freeze
         | 
| 7 | 
            +
            SYM_RE = '([ugoa]*[-=+][-=+rstwxXugo]*)(,[ugoa]*[-=+][-=+rstwxXugo]*)*'.freeze
         | 
| 8 | 
            +
            IGNORE_TYPES = Set[:VARIABLE, :UNDEF, :FUNCTION_NAME]
         | 
| 9 | 
            +
            MODE_RE = %r{\A([0-7]{4}|#{SYM_RE})\Z}.freeze
         | 
| 11 10 |  | 
| 11 | 
            +
            PuppetLint.new_check(:file_mode) do
         | 
| 12 12 | 
             
              def check
         | 
| 13 13 | 
             
                resource_indexes.each do |resource|
         | 
| 14 14 | 
             
                  next unless resource[:type].value == 'file' || resource[:type].value == 'concat'
         | 
| @@ -30,7 +30,7 @@ PuppetLint.new_check(:file_mode) do | |
| 30 30 | 
             
                      column: value_token.column,
         | 
| 31 31 | 
             
                      token: value_token,
         | 
| 32 32 | 
             
                      description: 'Check the tokens of each File resource instance for a mode parameter and if found, ' \
         | 
| 33 | 
            -
             | 
| 33 | 
            +
                                   'record a warning if the value of that parameter is not a 4 digit octal value (0755) or a symbolic mode (\'o=rwx,g\+r\').',
         | 
| 34 34 | 
             
                      help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#file-modes',
         | 
| 35 35 | 
             
                    )
         | 
| 36 36 | 
             
                  end
         | 
| @@ -3,9 +3,9 @@ | |
| 3 3 | 
             
            # not a quoted string.
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#file-modes
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              TOKEN_TYPES = Set[:NAME, :NUMBER]
         | 
| 6 | 
            +
            TOKEN_TYPES = Set[:NAME, :NUMBER]
         | 
| 8 7 |  | 
| 8 | 
            +
            PuppetLint.new_check(:unquoted_file_mode) do
         | 
| 9 9 | 
             
              def check
         | 
| 10 10 | 
             
                resource_indexes.each do |resource|
         | 
| 11 11 | 
             
                  next unless resource[:type].value == 'file' || resource[:type].value == 'concat'
         | 
| @@ -23,8 +23,8 @@ PuppetLint.new_check(:unquoted_file_mode) do | |
| 23 23 | 
             
                      line: value_token.line,
         | 
| 24 24 | 
             
                      column: value_token.column,
         | 
| 25 25 | 
             
                      token: value_token,
         | 
| 26 | 
            -
                      description: 'Check the tokens of each File resource instance for a mode parameter '\
         | 
| 27 | 
            -
             | 
| 26 | 
            +
                      description: 'Check the tokens of each File resource instance for a mode parameter ' \
         | 
| 27 | 
            +
                                   'and if found, record a warning if the value of that parameter is not a quoted string.',
         | 
| 28 28 | 
             
                      help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#file-modes',
         | 
| 29 29 | 
             
                    )
         | 
| 30 30 | 
             
                  end
         | 
| @@ -3,9 +3,9 @@ | |
| 3 3 | 
             
            # each instance found.
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#quoting
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              ESCAPE_CHAR_RE = %r{(\\\$|\\"|\\'|'|\r|\t|\\t|\\s|\n|\\n|\\\\)}.freeze
         | 
| 6 | 
            +
            ESCAPE_CHAR_RE = %r{(\\\$|\\"|\\'|'|\r|\t|\\t|\\s|\n|\\n|\\\\)}.freeze
         | 
| 8 7 |  | 
| 8 | 
            +
            PuppetLint.new_check(:double_quoted_strings) do
         | 
| 9 9 | 
             
              def check
         | 
| 10 10 | 
             
                invalid_tokens = tokens.select do |token|
         | 
| 11 11 | 
             
                  token.type == :STRING &&
         | 
| @@ -19,8 +19,8 @@ PuppetLint.new_check(:double_quoted_strings) do | |
| 19 19 | 
             
                    line: token.line,
         | 
| 20 20 | 
             
                    column: token.column,
         | 
| 21 21 | 
             
                    token: token,
         | 
| 22 | 
            -
                    description: 'Check the manifest tokens for any double quoted strings that don\'t '\
         | 
| 23 | 
            -
             | 
| 22 | 
            +
                    description: 'Check the manifest tokens for any double quoted strings that don\'t ' \
         | 
| 23 | 
            +
                                 'contain any variables or common escape characters and record a warning for each instance found.',
         | 
| 24 24 | 
             
                    help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#quoting',
         | 
| 25 25 | 
             
                  )
         | 
| 26 26 | 
             
                end
         | 
| @@ -2,9 +2,9 @@ | |
| 2 2 | 
             
            # a single variable only and record a warning for each instance found.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#quoting
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              VAR_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
         | 
| 5 | 
            +
            VAR_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
         | 
| 7 6 |  | 
| 7 | 
            +
            PuppetLint.new_check(:only_variable_string) do
         | 
| 8 8 | 
             
              def check
         | 
| 9 9 | 
             
                tokens.each_with_index do |start_token, start_token_idx|
         | 
| 10 10 | 
             
                  next unless start_token.type == :DQPRE && start_token.value == ''
         | 
| @@ -20,9 +20,8 @@ PuppetLint.new_check(:only_variable_string) do | |
| 20 20 | 
             
                      eos_offset += 3
         | 
| 21 21 | 
             
                    when :DQPOST
         | 
| 22 22 | 
             
                      if eos_token.value == ''
         | 
| 23 | 
            -
                        if eos_token.next_code_token && eos_token.next_code_token.type == :FARROW
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                        end
         | 
| 23 | 
            +
                        break if eos_token.next_code_token && eos_token.next_code_token.type == :FARROW
         | 
| 24 | 
            +
             | 
| 26 25 | 
             
                        notify(
         | 
| 27 26 | 
             
                          :warning,
         | 
| 28 27 | 
             
                          message: 'string containing only a variable',
         | 
| @@ -3,10 +3,10 @@ | |
| 3 3 | 
             
            # found.
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # No style guide reference
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
              BOOLEANS = Set['true', 'false']
         | 
| 6 | 
            +
            STRING_TYPES = Set[:STRING, :SSTRING]
         | 
| 7 | 
            +
            BOOLEANS = Set['true', 'false']
         | 
| 9 8 |  | 
| 9 | 
            +
            PuppetLint.new_check(:quoted_booleans) do
         | 
| 10 10 | 
             
              def check
         | 
| 11 11 | 
             
                invalid_tokens = tokens.select do |token|
         | 
| 12 12 | 
             
                  STRING_TYPES.include?(token.type) && BOOLEANS.include?(token.value)
         | 
| @@ -29,4 +29,4 @@ PuppetLint.new_check(:quoted_booleans) do | |
| 29 29 | 
             
                problem[:token].type = problem[:token].value.upcase.to_sym
         | 
| 30 30 | 
             
              end
         | 
| 31 31 | 
             
            end
         | 
| 32 | 
            -
            PuppetLint.configuration.send( | 
| 32 | 
            +
            PuppetLint.configuration.send(:disable_quoted_booleans)
         | 
| @@ -14,8 +14,8 @@ PuppetLint.new_check(:single_quote_string_with_variables) do | |
| 14 14 | 
             
                    message: 'single quoted string containing a variable found',
         | 
| 15 15 | 
             
                    line: token.line,
         | 
| 16 16 | 
             
                    column: token.column,
         | 
| 17 | 
            -
                    description: 'Check the manifest tokens for any single quoted strings containing '\
         | 
| 18 | 
            -
             | 
| 17 | 
            +
                    description: 'Check the manifest tokens for any single quoted strings containing ' \
         | 
| 18 | 
            +
                                 'a enclosed variable and record an error for each instance found.',
         | 
| 19 19 | 
             
                    help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#quoting',
         | 
| 20 20 | 
             
                  )
         | 
| 21 21 | 
             
                end
         | 
| @@ -6,14 +6,14 @@ require 'strscan' | |
| 6 6 | 
             
            # found.
         | 
| 7 7 | 
             
            #
         | 
| 8 8 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#quoting
         | 
| 9 | 
            -
             | 
| 10 | 
            -
               | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
              ]
         | 
| 9 | 
            +
            STRING_TOKEN_TYPES = Set[
         | 
| 10 | 
            +
              :DQMID,
         | 
| 11 | 
            +
              :DQPOST,
         | 
| 12 | 
            +
              :HEREDOC_MID,
         | 
| 13 | 
            +
              :HEREDOC_POST,
         | 
| 14 | 
            +
            ]
         | 
| 16 15 |  | 
| 16 | 
            +
            PuppetLint.new_check(:variables_not_enclosed) do
         | 
| 17 17 | 
             
              def check
         | 
| 18 18 | 
             
                invalid_tokens = tokens.select do |token|
         | 
| 19 19 | 
             
                  token.type == :UNENC_VARIABLE
         | 
| @@ -74,6 +74,7 @@ PuppetLint.new_check(:variables_not_enclosed) do | |
| 74 74 | 
             
                var_token.value = var_name
         | 
| 75 75 |  | 
| 76 76 | 
             
                return if str_token.nil?
         | 
| 77 | 
            +
             | 
| 77 78 | 
             
                str_token.value = "-#{text}#{str_token.value}"
         | 
| 78 79 | 
             
              end
         | 
| 79 80 |  | 
| @@ -2,16 +2,16 @@ | |
| 2 2 | 
             
            # record a warning for each instance found.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # No style guide reference
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              VARIABLE_DASH_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
         | 
| 5 | 
            +
            VARIABLE_DASH_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
         | 
| 7 6 |  | 
| 7 | 
            +
            PuppetLint.new_check(:variable_contains_dash) do
         | 
| 8 8 | 
             
              def check
         | 
| 9 9 | 
             
                invalid_tokens = tokens.select do |token|
         | 
| 10 10 | 
             
                  VARIABLE_DASH_TYPES.include?(token.type)
         | 
| 11 11 | 
             
                end
         | 
| 12 12 |  | 
| 13 13 | 
             
                invalid_tokens.each do |token|
         | 
| 14 | 
            -
                  next unless  | 
| 14 | 
            +
                  next unless token.value.gsub(%r{\[.+?\]}, '').include?('-')
         | 
| 15 15 |  | 
| 16 16 | 
             
                  notify(
         | 
| 17 17 | 
             
                    :warning,
         | 
| @@ -2,9 +2,9 @@ | |
| 2 2 | 
             
            # letter and record a warning for each instance found.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # No style guide reference
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              VARIABLE_LOWERCASE_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
         | 
| 5 | 
            +
            VARIABLE_LOWERCASE_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
         | 
| 7 6 |  | 
| 7 | 
            +
            PuppetLint.new_check(:variable_is_lowercase) do
         | 
| 8 8 | 
             
              def check
         | 
| 9 9 | 
             
                invalid_tokens = tokens.select do |token|
         | 
| 10 10 | 
             
                  VARIABLE_LOWERCASE_TYPES.include?(token.type)
         | 
| @@ -9,8 +9,9 @@ PuppetLint.new_check(:'80chars') do | |
| 9 9 | 
             
                  result = PuppetLint::LineLengthCheck.check(idx + 1, line, 80)
         | 
| 10 10 |  | 
| 11 11 | 
             
                  next if result.nil?
         | 
| 12 | 
            +
             | 
| 12 13 | 
             
                  notify(*result)
         | 
| 13 14 | 
             
                end
         | 
| 14 15 | 
             
              end
         | 
| 15 16 | 
             
            end
         | 
| 16 | 
            -
            PuppetLint.configuration.send( | 
| 17 | 
            +
            PuppetLint.configuration.send(:disable_80chars)
         | 
| @@ -2,9 +2,9 @@ | |
| 2 2 | 
             
            # are not aligned with other arrows in that grouping.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#spacing-indentation-and-whitespace
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              COMMENT_TYPES = Set[:COMMENT, :SLASH_COMMENT, :MLCOMMENT]
         | 
| 5 | 
            +
            COMMENT_TYPES = Set[:COMMENT, :SLASH_COMMENT, :MLCOMMENT]
         | 
| 7 6 |  | 
| 7 | 
            +
            PuppetLint.new_check(:arrow_alignment) do
         | 
| 8 8 | 
             
              def check
         | 
| 9 9 | 
             
                resource_indexes.each do |res_idx|
         | 
| 10 10 | 
             
                  arrow_column = [0]
         | 
| @@ -24,7 +24,8 @@ PuppetLint.new_check(:arrow_alignment) do | |
| 24 24 | 
             
                  next if resource_tokens[first_arrow].line == resource_tokens[last_arrow].line
         | 
| 25 25 |  | 
| 26 26 | 
             
                  resource_tokens.each do |token|
         | 
| 27 | 
            -
                     | 
| 27 | 
            +
                    case token.type
         | 
| 28 | 
            +
                    when :FARROW
         | 
| 28 29 | 
             
                      param_token = token.prev_code_token
         | 
| 29 30 |  | 
| 30 31 | 
             
                      if param_token.type == :DQPOST
         | 
| @@ -54,17 +55,15 @@ PuppetLint.new_check(:arrow_alignment) do | |
| 54 55 | 
             
                        this_arrow_column += 1
         | 
| 55 56 | 
             
                      end
         | 
| 56 57 |  | 
| 57 | 
            -
                      if arrow_column[level_idx] < this_arrow_column
         | 
| 58 | 
            -
                        arrow_column[level_idx] = this_arrow_column
         | 
| 59 | 
            -
                      end
         | 
| 58 | 
            +
                      arrow_column[level_idx] = this_arrow_column if arrow_column[level_idx] < this_arrow_column
         | 
| 60 59 |  | 
| 61 60 | 
             
                      (level_tokens[level_idx] ||= []) << token
         | 
| 62 | 
            -
                     | 
| 61 | 
            +
                    when :LBRACE
         | 
| 63 62 | 
             
                      level_idx += 1
         | 
| 64 63 | 
             
                      arrow_column << 0
         | 
| 65 64 | 
             
                      level_tokens[level_idx] ||= []
         | 
| 66 65 | 
             
                      param_column << nil
         | 
| 67 | 
            -
                     | 
| 66 | 
            +
                    when :RBRACE, :SEMIC
         | 
| 68 67 | 
             
                      if (level_tokens[level_idx] ||= []).map(&:line).uniq.length > 1
         | 
| 69 68 | 
             
                        level_tokens[level_idx].each do |arrow_tok|
         | 
| 70 69 | 
             
                          next if arrow_tok.column == arrow_column[level_idx] || level_tokens[level_idx].size == 1
         | 
| @@ -117,7 +116,8 @@ PuppetLint.new_check(:arrow_alignment) do | |
| 117 116 | 
             
                  new_ws_len += (problem[:arrow_column] - problem[:token].column)
         | 
| 118 117 | 
             
                end
         | 
| 119 118 |  | 
| 120 | 
            -
                raise PuppetLint::NoFix if new_ws_len | 
| 119 | 
            +
                raise PuppetLint::NoFix if new_ws_len.negative?
         | 
| 120 | 
            +
             | 
| 121 121 | 
             
                new_ws = ' ' * new_ws_len
         | 
| 122 122 |  | 
| 123 123 | 
             
                if problem[:token].prev_token.type == :WHITESPACE
         | 
| @@ -2,9 +2,9 @@ | |
| 2 2 | 
             
            # characters and record an error for each instance found.
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # https://puppet.com/docs/puppet/latest/style_guide.html#spacing-indentation-and-whitespace
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              WHITESPACE_TYPES = Set[:INDENT, :WHITESPACE]
         | 
| 5 | 
            +
            WHITESPACE_TYPES = Set[:INDENT, :WHITESPACE]
         | 
| 7 6 |  | 
| 7 | 
            +
            PuppetLint.new_check(:hard_tabs) do
         | 
| 8 8 | 
             
              def check
         | 
| 9 9 | 
             
                invalid_tokens = tokens.select do |token|
         | 
| 10 10 | 
             
                  WHITESPACE_TYPES.include?(token.type) && token.value.include?("\t")
         | 
| @@ -18,12 +18,12 @@ class PuppetLint::LineLengthCheck | |
| 18 18 |  | 
| 19 19 | 
             
                [
         | 
| 20 20 | 
             
                  :warning,
         | 
| 21 | 
            -
                  message: "line has more than #{character_count} characters",
         | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 21 | 
            +
                  { message: "line has more than #{character_count} characters",
         | 
| 22 | 
            +
                    line: line_number,
         | 
| 23 | 
            +
                    column: character_count,
         | 
| 24 | 
            +
                    description: "Test the raw manifest string for lines containing more than #{character_count} characters and record a warning for each instance found. " \
         | 
| 25 | 
            +
                                 'The only exceptions to this rule are lines containing URLs and template() calls which would hurt readability if split.',
         | 
| 26 | 
            +
                    help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#spacing-indentation-and-whitespace' },
         | 
| 27 27 | 
             
                ]
         | 
| 28 28 | 
             
              end
         | 
| 29 29 | 
             
            end
         |