puppet-lint 3.4.0 → 4.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/lib/puppet-lint/bin.rb +7 -11
  3. data/lib/puppet-lint/checkplugin.rb +4 -8
  4. data/lib/puppet-lint/checks.rb +7 -9
  5. data/lib/puppet-lint/configuration.rb +2 -2
  6. data/lib/puppet-lint/data.rb +35 -39
  7. data/lib/puppet-lint/lexer/string_slurper.rb +2 -3
  8. data/lib/puppet-lint/lexer/token.rb +6 -5
  9. data/lib/puppet-lint/lexer.rb +35 -38
  10. data/lib/puppet-lint/monkeypatches.rb +4 -4
  11. data/lib/puppet-lint/optparser.rb +1 -1
  12. data/lib/puppet-lint/plugins/check_classes/arrow_on_right_operand_line.rb +1 -0
  13. data/lib/puppet-lint/plugins/check_classes/autoloader_layout.rb +2 -4
  14. data/lib/puppet-lint/plugins/check_classes/class_inherits_from_params_class.rb +2 -2
  15. data/lib/puppet-lint/plugins/check_classes/code_on_top_scope.rb +1 -1
  16. data/lib/puppet-lint/plugins/check_classes/nested_classes_or_defines.rb +5 -5
  17. data/lib/puppet-lint/plugins/check_classes/parameter_order.rb +8 -9
  18. data/lib/puppet-lint/plugins/check_classes/variable_scope.rb +32 -34
  19. data/lib/puppet-lint/plugins/check_conditionals/case_without_default.rb +2 -2
  20. data/lib/puppet-lint/plugins/check_documentation/documentation.rb +7 -6
  21. data/lib/puppet-lint/plugins/check_nodes/unquoted_node_name.rb +1 -1
  22. data/lib/puppet-lint/plugins/check_resources/ensure_first_param.rb +3 -5
  23. data/lib/puppet-lint/plugins/check_resources/ensure_not_symlink_target.rb +2 -2
  24. data/lib/puppet-lint/plugins/check_resources/file_mode.rb +6 -6
  25. data/lib/puppet-lint/plugins/check_resources/unquoted_file_mode.rb +4 -4
  26. data/lib/puppet-lint/plugins/check_strings/double_quoted_strings.rb +4 -4
  27. data/lib/puppet-lint/plugins/check_strings/only_variable_string.rb +4 -5
  28. data/lib/puppet-lint/plugins/check_strings/quoted_booleans.rb +4 -4
  29. data/lib/puppet-lint/plugins/check_strings/single_quote_string_with_variables.rb +2 -2
  30. data/lib/puppet-lint/plugins/check_strings/variables_not_enclosed.rb +8 -7
  31. data/lib/puppet-lint/plugins/check_variables/variable_contains_dash.rb +3 -3
  32. data/lib/puppet-lint/plugins/check_variables/variable_is_lowercase.rb +2 -2
  33. data/lib/puppet-lint/plugins/check_whitespace/140chars.rb +1 -0
  34. data/lib/puppet-lint/plugins/check_whitespace/80chars.rb +2 -1
  35. data/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb +9 -9
  36. data/lib/puppet-lint/plugins/check_whitespace/hard_tabs.rb +2 -2
  37. data/lib/puppet-lint/plugins/check_whitespace/line_length.rb +6 -6
  38. data/lib/puppet-lint/plugins/legacy_facts/legacy_facts.rb +106 -105
  39. data/lib/puppet-lint/plugins/top_scope_facts/top_scope_facts.rb +3 -2
  40. data/lib/puppet-lint/plugins.rb +3 -4
  41. data/lib/puppet-lint/report/codeclimate.rb +3 -2
  42. data/lib/puppet-lint/report/github.rb +1 -0
  43. data/lib/puppet-lint/tasks/puppet-lint.rb +7 -26
  44. data/lib/puppet-lint/tasks/release_test.rb +4 -4
  45. data/lib/puppet-lint/version.rb +1 -1
  46. data/lib/puppet-lint.rb +5 -3
  47. data/rubocop_baseline.yml +3 -440
  48. data/spec/spec_helper.rb +3 -2
  49. data/spec/spec_helper_acceptance_local.rb +1 -1
  50. data/spec/unit/puppet-lint/bin_spec.rb +12 -2
  51. data/spec/unit/puppet-lint/configuration_spec.rb +14 -14
  52. data/spec/unit/puppet-lint/lexer/string_slurper_spec.rb +3 -5
  53. data/spec/unit/puppet-lint/lexer_spec.rb +10 -11
  54. data/spec/unit/puppet-lint/plugins/check_classes/parameter_order_spec.rb +2 -2
  55. data/spec/unit/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +5 -5
  56. data/spec/unit/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +1 -1
  57. data/spec/unit/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +1 -1
  58. data/spec/unit/puppet-lint/plugins/check_whitespace/140chars_spec.rb +0 -2
  59. data/spec/unit/puppet-lint/plugins/check_whitespace/80chars_spec.rb +1 -3
  60. data/spec/unit/puppet-lint/plugins/legacy_facts/legacy_facts_spec.rb +16 -0
  61. data/spec/unit/puppet-lint/plugins/top_scope_facts/top_scope_facts_spec.rb +1 -0
  62. metadata +5 -5
@@ -6,111 +6,111 @@
6
6
  #
7
7
  # This plugin was adopted in to puppet-lint from https://github.com/mmckinst/puppet-lint-legacy_facts-check
8
8
  # Thanks to @mmckinst, @seanmil, @rodjek, @baurmatt, @bart2 and @joshcooper for the original work.
9
- PuppetLint.new_check(:legacy_facts) do
10
- LEGACY_FACTS_VAR_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
11
-
12
- # These facts that can't be converted to new facts.
13
- UNCONVERTIBLE_FACTS = ['memoryfree_mb', 'memorysize_mb', 'swapfree_mb',
14
- 'swapsize_mb', 'blockdevices', 'interfaces', 'zones',
15
- 'sshfp_dsa', 'sshfp_ecdsa', 'sshfp_ed25519',
16
- 'sshfp_rsa'].freeze
17
-
18
- # These facts will depend on how a system is set up and can't just be
19
- # enumerated like the EASY_FACTS below.
20
- #
21
- # For example a server might have two block devices named 'sda' and 'sdb' so
22
- # there would be a $blockdeivce_sda_vendor and $blockdeivce_sdb_vendor fact
23
- # for each device. Or it could have 26 block devices going all the way up to
24
- # 'sdz'. There is no way to know what the possibilities are so we have to use
25
- # a regex to match them.
26
- REGEX_FACTS = [%r{^blockdevice_(?<devicename>.*)_(?<attribute>model|size|vendor)$},
27
- %r{^(?<attribute>ipaddress|ipaddress6|macaddress|mtu|netmask|netmask6|network|network6)_(?<interface>.*)$},
28
- %r{^processor(?<id>[0-9]+)$},
29
- %r{^sp_(?<name>.*)$},
30
- %r{^ssh(?<algorithm>dsa|ecdsa|ed25519|rsa)key$},
31
- %r{^ldom_(?<name>.*)$},
32
- %r{^zone_(?<name>.*)_(?<attribute>brand|iptype|name|uuid|id|path|status)$}].freeze
33
-
34
- # These facts have a one to one correlation between a legacy fact and a new
35
- # structured fact.
36
- EASY_FACTS = {
37
- 'architecture' => "facts['os']['architecture']",
38
- 'augeasversion' => "facts['augeas']['version']",
39
- 'bios_release_date' => "facts['dmi']['bios']['release_date']",
40
- 'bios_vendor' => "facts['dmi']['bios']['vendor']",
41
- 'bios_version' => "facts['dmi']['bios']['version']",
42
- 'boardassettag' => "facts['dmi']['board']['asset_tag']",
43
- 'boardmanufacturer' => "facts['dmi']['board']['manufacturer']",
44
- 'boardproductname' => "facts['dmi']['board']['product']",
45
- 'boardserialnumber' => "facts['dmi']['board']['serial_number']",
46
- 'chassisassettag' => "facts['dmi']['chassis']['asset_tag']",
47
- 'chassistype' => "facts['dmi']['chassis']['type']",
48
- 'domain' => "facts['networking']['domain']",
49
- 'fqdn' => "facts['networking']['fqdn']",
50
- 'gid' => "facts['identity']['group']",
51
- 'hardwareisa' => "facts['processors']['isa']",
52
- 'hardwaremodel' => "facts['os']['hardware']",
53
- 'hostname' => "facts['networking']['hostname']",
54
- 'id' => "facts['identity']['user']",
55
- 'ipaddress' => "facts['networking']['ip']",
56
- 'ipaddress6' => "facts['networking']['ip6']",
57
- 'lsbdistcodename' => "facts['os']['distro']['codename']",
58
- 'lsbdistdescription' => "facts['os']['distro']['description']",
59
- 'lsbdistid' => "facts['os']['distro']['id']",
60
- 'lsbdistrelease' => "facts['os']['distro']['release']['full']",
61
- 'lsbmajdistrelease' => "facts['os']['distro']['release']['major']",
62
- 'lsbminordistrelease' => "facts['os']['distro']['release']['minor']",
63
- 'lsbrelease' => "facts['os']['distro']['release']['specification']",
64
- 'macaddress' => "facts['networking']['mac']",
65
- 'macosx_buildversion' => "facts['os']['macosx']['build']",
66
- 'macosx_productname' => "facts['os']['macosx']['product']",
67
- 'macosx_productversion' => "facts['os']['macosx']['version']['full']",
68
- 'macosx_productversion_major' => "facts['os']['macosx']['version']['major']",
69
- 'macosx_productversion_minor' => "facts['os']['macosx']['version']['minor']",
70
- 'manufacturer' => "facts['dmi']['manufacturer']",
71
- 'memoryfree' => "facts['memory']['system']['available']",
72
- 'memorysize' => "facts['memory']['system']['total']",
73
- 'netmask' => "facts['networking']['netmask']",
74
- 'netmask6' => "facts['networking']['netmask6']",
75
- 'network' => "facts['networking']['network']",
76
- 'network6' => "facts['networking']['network6']",
77
- 'operatingsystem' => "facts['os']['name']",
78
- 'operatingsystemmajrelease' => "facts['os']['release']['major']",
79
- 'operatingsystemrelease' => "facts['os']['release']['full']",
80
- 'osfamily' => "facts['os']['family']",
81
- 'physicalprocessorcount' => "facts['processors']['physicalcount']",
82
- 'processorcount' => "facts['processors']['count']",
83
- 'productname' => "facts['dmi']['product']['name']",
84
- 'rubyplatform' => "facts['ruby']['platform']",
85
- 'rubysitedir' => "facts['ruby']['sitedir']",
86
- 'rubyversion' => "facts['ruby']['version']",
87
- 'selinux' => "facts['os']['selinux']['enabled']",
88
- 'selinux_config_mode' => "facts['os']['selinux']['config_mode']",
89
- 'selinux_config_policy' => "facts['os']['selinux']['config_policy']",
90
- 'selinux_current_mode' => "facts['os']['selinux']['current_mode']",
91
- 'selinux_enforced' => "facts['os']['selinux']['enforced']",
92
- 'selinux_policyversion' => "facts['os']['selinux']['policy_version']",
93
- 'serialnumber' => "facts['dmi']['product']['serial_number']",
94
- 'swapencrypted' => "facts['memory']['swap']['encrypted']",
95
- 'swapfree' => "facts['memory']['swap']['available']",
96
- 'swapsize' => "facts['memory']['swap']['total']",
97
- 'system32' => "facts['os']['windows']['system32']",
98
- 'uptime' => "facts['system_uptime']['uptime']",
99
- 'uptime_days' => "facts['system_uptime']['days']",
100
- 'uptime_hours' => "facts['system_uptime']['hours']",
101
- 'uptime_seconds' => "facts['system_uptime']['seconds']",
102
- 'uuid' => "facts['dmi']['product']['uuid']",
103
- 'xendomains' => "facts['xen']['domains']",
104
- 'zonename' => "facts['solaris_zones']['current']",
105
- }.freeze
106
-
107
- # A list of valid hash key token types
108
- HASH_KEY_TYPES = Set[
109
- :STRING, # Double quoted string
110
- :SSTRING, # Single quoted string
111
- :NAME, # Unquoted single word
112
- ].freeze
9
+ LEGACY_FACTS_VAR_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
10
+
11
+ # These facts that can't be converted to new facts.
12
+ UNCONVERTIBLE_FACTS = ['memoryfree_mb', 'memorysize_mb', 'swapfree_mb',
13
+ 'swapsize_mb', 'blockdevices', 'interfaces', 'zones',
14
+ 'sshfp_dsa', 'sshfp_ecdsa', 'sshfp_ed25519',
15
+ 'sshfp_rsa'].freeze
16
+
17
+ # These facts will depend on how a system is set up and can't just be
18
+ # enumerated like the EASY_FACTS below.
19
+ #
20
+ # For example a server might have two block devices named 'sda' and 'sdb' so
21
+ # there would be a $blockdeivce_sda_vendor and $blockdeivce_sdb_vendor fact
22
+ # for each device. Or it could have 26 block devices going all the way up to
23
+ # 'sdz'. There is no way to know what the possibilities are so we have to use
24
+ # a regex to match them.
25
+ REGEX_FACTS = [%r{^blockdevice_(?<devicename>.*)_(?<attribute>model|size|vendor)$},
26
+ %r{^(?<attribute>ipaddress|ipaddress6|macaddress|mtu|netmask|netmask6|network|network6)_(?<interface>.*)$},
27
+ %r{^processor(?<id>[0-9]+)$},
28
+ %r{^sp_(?<name>.*)$},
29
+ %r{^ssh(?<algorithm>dsa|ecdsa|ed25519|rsa)key$},
30
+ %r{^ldom_(?<name>.*)$},
31
+ %r{^zone_(?<name>.*)_(?<attribute>brand|iptype|name|uuid|id|path|status)$}].freeze
32
+
33
+ # These facts have a one to one correlation between a legacy fact and a new
34
+ # structured fact.
35
+ EASY_FACTS = {
36
+ 'architecture' => "facts['os']['architecture']",
37
+ 'augeasversion' => "facts['augeas']['version']",
38
+ 'bios_release_date' => "facts['dmi']['bios']['release_date']",
39
+ 'bios_vendor' => "facts['dmi']['bios']['vendor']",
40
+ 'bios_version' => "facts['dmi']['bios']['version']",
41
+ 'boardassettag' => "facts['dmi']['board']['asset_tag']",
42
+ 'boardmanufacturer' => "facts['dmi']['board']['manufacturer']",
43
+ 'boardproductname' => "facts['dmi']['board']['product']",
44
+ 'boardserialnumber' => "facts['dmi']['board']['serial_number']",
45
+ 'chassisassettag' => "facts['dmi']['chassis']['asset_tag']",
46
+ 'chassistype' => "facts['dmi']['chassis']['type']",
47
+ 'domain' => "facts['networking']['domain']",
48
+ 'fqdn' => "facts['networking']['fqdn']",
49
+ 'gid' => "facts['identity']['group']",
50
+ 'hardwareisa' => "facts['processors']['isa']",
51
+ 'hardwaremodel' => "facts['os']['hardware']",
52
+ 'hostname' => "facts['networking']['hostname']",
53
+ 'id' => "facts['identity']['user']",
54
+ 'ipaddress' => "facts['networking']['ip']",
55
+ 'ipaddress6' => "facts['networking']['ip6']",
56
+ 'lsbdistcodename' => "facts['os']['distro']['codename']",
57
+ 'lsbdistdescription' => "facts['os']['distro']['description']",
58
+ 'lsbdistid' => "facts['os']['distro']['id']",
59
+ 'lsbdistrelease' => "facts['os']['distro']['release']['full']",
60
+ 'lsbmajdistrelease' => "facts['os']['distro']['release']['major']",
61
+ 'lsbminordistrelease' => "facts['os']['distro']['release']['minor']",
62
+ 'lsbrelease' => "facts['os']['distro']['release']['specification']",
63
+ 'macaddress' => "facts['networking']['mac']",
64
+ 'macosx_buildversion' => "facts['os']['macosx']['build']",
65
+ 'macosx_productname' => "facts['os']['macosx']['product']",
66
+ 'macosx_productversion' => "facts['os']['macosx']['version']['full']",
67
+ 'macosx_productversion_major' => "facts['os']['macosx']['version']['major']",
68
+ 'macosx_productversion_minor' => "facts['os']['macosx']['version']['minor']",
69
+ 'manufacturer' => "facts['dmi']['manufacturer']",
70
+ 'memoryfree' => "facts['memory']['system']['available']",
71
+ 'memorysize' => "facts['memory']['system']['total']",
72
+ 'netmask' => "facts['networking']['netmask']",
73
+ 'netmask6' => "facts['networking']['netmask6']",
74
+ 'network' => "facts['networking']['network']",
75
+ 'network6' => "facts['networking']['network6']",
76
+ 'operatingsystem' => "facts['os']['name']",
77
+ 'operatingsystemmajrelease' => "facts['os']['release']['major']",
78
+ 'operatingsystemrelease' => "facts['os']['release']['full']",
79
+ 'osfamily' => "facts['os']['family']",
80
+ 'physicalprocessorcount' => "facts['processors']['physicalcount']",
81
+ 'processorcount' => "facts['processors']['count']",
82
+ 'productname' => "facts['dmi']['product']['name']",
83
+ 'rubyplatform' => "facts['ruby']['platform']",
84
+ 'rubysitedir' => "facts['ruby']['sitedir']",
85
+ 'rubyversion' => "facts['ruby']['version']",
86
+ 'selinux' => "facts['os']['selinux']['enabled']",
87
+ 'selinux_config_mode' => "facts['os']['selinux']['config_mode']",
88
+ 'selinux_config_policy' => "facts['os']['selinux']['config_policy']",
89
+ 'selinux_current_mode' => "facts['os']['selinux']['current_mode']",
90
+ 'selinux_enforced' => "facts['os']['selinux']['enforced']",
91
+ 'selinux_policyversion' => "facts['os']['selinux']['policy_version']",
92
+ 'serialnumber' => "facts['dmi']['product']['serial_number']",
93
+ 'swapencrypted' => "facts['memory']['swap']['encrypted']",
94
+ 'swapfree' => "facts['memory']['swap']['available']",
95
+ 'swapsize' => "facts['memory']['swap']['total']",
96
+ 'system32' => "facts['os']['windows']['system32']",
97
+ 'uptime' => "facts['system_uptime']['uptime']",
98
+ 'uptime_days' => "facts['system_uptime']['days']",
99
+ 'uptime_hours' => "facts['system_uptime']['hours']",
100
+ 'uptime_seconds' => "facts['system_uptime']['seconds']",
101
+ 'uuid' => "facts['dmi']['product']['uuid']",
102
+ 'xendomains' => "facts['xen']['domains']",
103
+ 'zonename' => "facts['solaris_zones']['current']"
104
+ }.freeze
105
+
106
+ # A list of valid hash key token types
107
+ HASH_KEY_TYPES = Set[
108
+ :STRING, # Double quoted string
109
+ :SSTRING, # Single quoted string
110
+ :NAME, # Unquoted single word
111
+ ].freeze
113
112
 
113
+ PuppetLint.new_check(:legacy_facts) do
114
114
  def check
115
115
  tokens.select { |x| LEGACY_FACTS_VAR_TYPES.include?(x.type) }.each do |token|
116
116
  fact_name = ''
@@ -137,12 +137,13 @@ PuppetLint.new_check(:legacy_facts) do
137
137
  end
138
138
 
139
139
  next unless EASY_FACTS.include?(fact_name) || UNCONVERTIBLE_FACTS.include?(fact_name) || fact_name.match(Regexp.union(REGEX_FACTS))
140
+
140
141
  notify :warning, {
141
142
  message: "legacy fact '#{fact_name}'",
142
143
  line: token.line,
143
144
  column: token.column,
144
145
  token: token,
145
- fact_name: fact_name,
146
+ fact_name: fact_name
146
147
  }
147
148
  end
148
149
  end
@@ -13,8 +13,9 @@
13
13
  #
14
14
  # This plugin was adopted in to puppet-lint from https://github.com/mmckinst/puppet-lint-top_scope_facts-check
15
15
  # Thanks to @mmckinst, @seanmil and @alexjfisher for the original work.
16
+ TOP_SCOPE_FACTS_VAR_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
17
+
16
18
  PuppetLint.new_check(:top_scope_facts) do
17
- TOP_SCOPE_FACTS_VAR_TYPES = Set[:VARIABLE, :UNENC_VARIABLE]
18
19
  def check
19
20
  whitelist = ['trusted', 'facts'] + (PuppetLint.configuration.top_scope_variables || [])
20
21
  whitelist = whitelist.join('|')
@@ -27,7 +28,7 @@ PuppetLint.new_check(:top_scope_facts) do
27
28
  message: 'top scope fact instead of facts hash',
28
29
  line: token.line,
29
30
  column: token.column,
30
- token: token,
31
+ token: token
31
32
  }
32
33
  end
33
34
  end
@@ -55,9 +55,8 @@ class PuppetLint::Plugins
55
55
  def load_prerelease_plugins?
56
56
  # Load prerelease plugins (which ruby defines as any gem which has a letter in its version number).
57
57
  # Can't use puppet-lint configuration object here because this code executes before the command line is parsed.
58
- if ENV['PUPPET_LINT_LOAD_PRERELEASE_PLUGINS']
59
- return ['true', 'yes'].include?(ENV['PUPPET_LINT_LOAD_PRERELEASE_PLUGINS'].downcase)
60
- end
58
+ return ['true', 'yes'].include?(ENV['PUPPET_LINT_LOAD_PRERELEASE_PLUGINS'].downcase) if ENV['PUPPET_LINT_LOAD_PRERELEASE_PLUGINS']
59
+
61
60
  false
62
61
  end
63
62
 
@@ -76,7 +75,7 @@ class PuppetLint::Plugins
76
75
  end
77
76
  end
78
77
 
79
- Dir[File.expand_path('plugins/**/*.rb', File.dirname(__FILE__))].each do |file|
78
+ Dir[File.expand_path('plugins/**/*.rb', File.dirname(__FILE__))].sort.each do |file|
80
79
  require file
81
80
  end
82
81
 
@@ -3,6 +3,7 @@
3
3
  require 'digest'
4
4
  require 'json'
5
5
 
6
+ # rubocop:disable Style/ClassAndModuleChildren
6
7
  class PuppetLint::Report
7
8
  # Formats problems and writes them to a file as a code climate compatible report.
8
9
  class CodeClimateReporter
@@ -29,9 +30,9 @@ class PuppetLint::Report
29
30
  path: message[:path],
30
31
  lines: {
31
32
  begin: message[:line],
32
- end: message[:line],
33
+ end: message[:line]
33
34
  }
34
- },
35
+ }
35
36
  }
36
37
 
37
38
  issue[:fingerprint] = Digest::MD5.hexdigest(Marshal.dump(issue))
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Style/ClassAndModuleChildren
3
4
  class PuppetLint::Report
4
5
  # This formatter formats report data as GitHub Workflow commands resulting
5
6
  # in GitHub check annotations when run within GitHub Actions.
@@ -12,24 +12,12 @@ require 'puppet-lint/report/codeclimate'
12
12
  #
13
13
  # require 'puppet-lint'
14
14
  # PuppetLint::RakeTask.new
15
- class PuppetLint::RakeTask < ::Rake::TaskLib
15
+ class PuppetLint::RakeTask < Rake::TaskLib
16
16
  include ::Rake::DSL if defined?(::Rake::DSL)
17
17
 
18
18
  DEFAULT_PATTERN = '**/*.pp'.freeze
19
19
 
20
- attr_accessor :name
21
- attr_accessor :pattern
22
- attr_accessor :ignore_paths
23
- attr_accessor :with_filename
24
- attr_accessor :disable_checks
25
- attr_accessor :only_checks
26
- attr_accessor :fail_on_warnings
27
- attr_accessor :error_level
28
- attr_accessor :log_format
29
- attr_accessor :with_context
30
- attr_accessor :fix
31
- attr_accessor :show_ignored
32
- attr_accessor :relative
20
+ attr_accessor :name, :pattern, :ignore_paths, :with_filename, :disable_checks, :only_checks, :fail_on_warnings, :error_level, :log_format, :with_context, :fix, :show_ignored, :relative
33
21
 
34
22
  # Public: Initialise a new PuppetLint::RakeTask.
35
23
  #
@@ -80,13 +68,9 @@ class PuppetLint::RakeTask < ::Rake::TaskLib
80
68
  PuppetLint.configuration.send("#{config}=".to_sym, value) unless value.nil?
81
69
  end
82
70
 
83
- if PuppetLint.configuration.ignore_paths && @ignore_paths.empty?
84
- @ignore_paths = PuppetLint.configuration.ignore_paths
85
- end
71
+ @ignore_paths = PuppetLint.configuration.ignore_paths if PuppetLint.configuration.ignore_paths && @ignore_paths.empty?
86
72
 
87
- if PuppetLint.configuration.pattern
88
- @pattern = PuppetLint.configuration.pattern
89
- end
73
+ @pattern = PuppetLint.configuration.pattern if PuppetLint.configuration.pattern
90
74
 
91
75
  RakeFileUtils.send(:verbose, true) do
92
76
  linter = PuppetLint.new
@@ -97,18 +81,15 @@ class PuppetLint::RakeTask < ::Rake::TaskLib
97
81
 
98
82
  matched_files.to_a.each do |puppet_file|
99
83
  next unless File.file?(puppet_file)
84
+
100
85
  linter.file = puppet_file
101
86
  linter.run
102
87
  all_problems << linter.print_problems
103
88
 
104
- if PuppetLint.configuration.fix && linter.problems.none? { |e| e[:check] == :syntax }
105
- IO.write(puppet_file, linter.manifest)
106
- end
89
+ File.write(puppet_file, linter.manifest) if PuppetLint.configuration.fix && linter.problems.none? { |e| e[:check] == :syntax }
107
90
  end
108
91
 
109
- if PuppetLint.configuration.codeclimate_report_file
110
- PuppetLint::Report::CodeClimateReporter.write_report_file(all_problems, PuppetLint.configuration.codeclimate_report_file)
111
- end
92
+ PuppetLint::Report::CodeClimateReporter.write_report_file(all_problems, PuppetLint.configuration.codeclimate_report_file) if PuppetLint.configuration.codeclimate_report_file
112
93
 
113
94
  abort if linter.errors? || (
114
95
  linter.warnings? && PuppetLint.configuration.fail_on_warnings
@@ -27,7 +27,7 @@ def run_cmd(message, *cmd)
27
27
  [output.strip, status.success?]
28
28
  end
29
29
 
30
- def with_puppet_lint_head
30
+ def with_puppet_lint_head(&block)
31
31
  print(' Updating Gemfile to use puppet-lint HEAD... ')
32
32
 
33
33
  buffer = Parser::Source::Buffer.new('Gemfile')
@@ -49,7 +49,7 @@ def with_puppet_lint_head
49
49
 
50
50
  puts 'Done'
51
51
 
52
- Bundler.with_clean_env { yield }
52
+ Bundler.with_clean_env(&block)
53
53
 
54
54
  run_cmd('Restoring Gemfile', 'git', 'checkout', '--', 'Gemfile')
55
55
  end
@@ -58,9 +58,9 @@ task :release_test do
58
58
  branch = if ENV['GITHUB_REF']
59
59
  ENV['GITHUB_REF']
60
60
  elsif ENV['APPVEYOR']
61
- ENV['APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH']
61
+ ENV.fetch('APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH', nil)
62
62
  elsif ENV['TRAVIS']
63
- ENV['TRAVIS_PULL_REQUEST_BRANCH']
63
+ ENV.fetch('TRAVIS_PULL_REQUEST_BRANCH', nil)
64
64
  else
65
65
  false
66
66
  end
@@ -1,3 +1,3 @@
1
1
  class PuppetLint
2
- VERSION = '3.4.0'.freeze
2
+ VERSION = '4.0.0.rc.1'.freeze
3
3
  end
data/lib/puppet-lint.rb CHANGED
@@ -95,7 +95,7 @@ class PuppetLint
95
95
 
96
96
  # Check if the input is an SE Linux policy package file (which also use
97
97
  # the .pp extension), which all have the first 4 bytes 0xf97cff8f.
98
- @code = '' if @code[0..3].unpack('V').first == 0xf97cff8f
98
+ @code = '' if @code[0..3].unpack1('V') == 0xf97cff8f
99
99
  end
100
100
 
101
101
  # Internal: Retrieve the format string to be used when writing problems to
@@ -155,8 +155,10 @@ class PuppetLint
155
155
  def print_context(message)
156
156
  return if message[:check] == 'documentation'
157
157
  return if message[:kind] == :fixed
158
+
158
159
  line = message[:context]
159
160
  return unless line
161
+
160
162
  offset = line.index(%r{\S}) || 1
161
163
  puts "\n #{line.strip}"
162
164
  printf("%#{message[:column] + 2 - offset}s\n\n", '^')
@@ -188,7 +190,7 @@ class PuppetLint
188
190
  print_github_annotation(message) if configuration.github_actions
189
191
  end
190
192
  end
191
- $stderr.puts 'Try running `puppet parser validate <file>`' if problems.any? { |p| p[:check] == :syntax }
193
+ warn 'Try running `puppet parser validate <file>`' if problems.any? { |p| p[:check] == :syntax }
192
194
  json
193
195
  end
194
196
 
@@ -251,7 +253,7 @@ class PuppetLint
251
253
  def self.new_check(name, &block)
252
254
  class_name = name.to_s.split('_').map(&:capitalize).join
253
255
  klass = PuppetLint.const_set("Check#{class_name}", Class.new(PuppetLint::CheckPlugin))
254
- klass.const_set('NAME', name)
256
+ klass.const_set(:NAME, name)
255
257
  klass.class_exec(&block)
256
258
  PuppetLint.configuration.add_check(name, klass)
257
259
  PuppetLint::Data.ignore_overrides[name] ||= {}