puppet-itemize 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: df934c90b977a46344d8d447060b93bd4fa87487
4
- data.tar.gz: 732ec69ca41de35db175ab77af2c59f5f287e3fd
2
+ SHA256:
3
+ metadata.gz: 1625c1cacf7bc9c0373f02357fdef0d912ed642896c30c0fd372a38f84116924
4
+ data.tar.gz: 7dc10c68119882e62bb4587361a4d1f6b71ee2b94bd36a03af43c4f821863eee
5
5
  SHA512:
6
- metadata.gz: c21938a92b1987f1f0d7f0f5b5a8f57ed9e1a0e5072275206c3dfcf12274da5d9253a5e4979ef37e438ce7c72afe65c13d099e3c5a7b3eeed3707ddae0d3dd2f
7
- data.tar.gz: 8f2f894d7f6d5130759f04e5c85305220b16b3eba7921d51b5ae6eeaf67c0d2435d1b417a59872beb6fa3a49f009efc88460214e0e1ccc93eebd707174d7c0d3
6
+ metadata.gz: c18bb2c71c6ba444d2f11177c273a3ea7b7872ac1999c91d6d044ed90b9a80eb9fb3032ffbbeb6a3f6241bfbe496065f321af1292dee8c03eac8e2c353b642e5
7
+ data.tar.gz: ad95bc731049ae6d803e4961ab2cd1979e06c9adfb71e2d4a76c81c8ae8e0aa309205a99e6daa14c723bad30cfea83319eb7f811244f4d6299d0730adda7667b
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # v0.0.2
2
+
3
+ * Add namespace validation. This will now warn you if you're using elements from
4
+ modules which have not been declared as dependencies.
5
+ * Allow you to filter to external resources only.
6
+
7
+
8
+ # v0.0.1
9
+
10
+ * Initial release
data/README.md CHANGED
@@ -18,7 +18,7 @@ $ gem install puppet-itemize
18
18
  Or as a Puppet module:
19
19
 
20
20
  ```
21
- $ puppet module install binford2k/puppet_itemize
21
+ $ puppet module install binford2k/itemize
22
22
  ```
23
23
 
24
24
  ## Usage
@@ -54,6 +54,34 @@ $ puppet parser itemize manifests/init.pp
54
54
  $ puppet parser itemize manifests/init.pp manifests/example/path.pp
55
55
  ```
56
56
 
57
+ ### Module dependency validation
58
+
59
+ If the tool can identify that you're running this on manifests within a Puppet
60
+ module, then it will validate the dependencies listed in the `metadata.json`.
61
+ By default, it will print out warnings for resources or classes that come from
62
+ modules that aren't declared as dependencies. Facts and Puppet 3.x style functions
63
+ aren't namespaced in the same way, so they cannot be identified, but Puppet 4.x
64
+ namespaced functions will trigger the same validation.
65
+
66
+ You can also use the `--external` argument. This will filter the output to only
67
+ show elements which are either global or from other modules. This can be used to
68
+ help identify how dependencies are being used.
69
+
70
+
71
+ ### Programatic use
72
+
73
+ You can choose to render the output in either JSON or YAML for consumption by
74
+ other tools or testing pipelines by simply passing the `--render-as` argument:
75
+
76
+ ```
77
+ $ puppet parser itemize ~/Projects/puppetlabs-apache/manifests/ --render-as json
78
+ $ puppet parser itemize ~/Projects/puppetlabs-apache/manifests/ --render-as yaml
79
+ ```
80
+
81
+ It's also reasonably easy to invoke this as a library from Ruby tools. See the
82
+ `bin/puppet-itemize` script for an example.
83
+
84
+
57
85
  ### Example output:
58
86
 
59
87
  Because this is static analysis prior to compilation, no variables can be
@@ -63,6 +91,12 @@ below in the class list as `apache::mod::<??>`.
63
91
 
64
92
  ```
65
93
  $ puppet parser itemize ~/Projects/puppetlabs-apache/manifests/
94
+ Warning: Undeclared module dependancy: portage::makeconf
95
+ Warning: Undeclared module dependancy: portage::makeconf
96
+ Warning: Undeclared module dependancy: portage::makeconf
97
+ Warning: Undeclared module dependancy: portage::makeconf
98
+ Warning: Undeclared module dependancy: portage::makeconf
99
+ Warning: Undeclared module dependancy: portage::makeconf
66
100
  Warning: create_resources detected. Please update to use iteration instead.
67
101
  Resource usage analysis:
68
102
  =======================================
@@ -176,6 +210,7 @@ Resource usage analysis:
176
210
  create_resources | 1
177
211
  ```
178
212
 
213
+
179
214
  ## Limitations
180
215
 
181
216
  This is super early in development and has not yet been battle tested.
@@ -185,6 +220,7 @@ This is super early in development and has not yet been battle tested.
185
220
 
186
221
  I take no liability for the use of this tool.
187
222
 
223
+
188
224
  Contact
189
225
  -------
190
226
 
data/bin/puppet-itemize CHANGED
@@ -17,6 +17,10 @@ directories containing manifests. If omitted, it will default to inspecting all
17
17
  manifests in the manifests directory, so you can just run this in the root of a
18
18
  Puppet module and it will do the right thing.
19
19
 
20
+ If this is run from the root of a Puppet module or the `manifests` directory of
21
+ a Puppet module, and the `--external` argument is passed, then it will only
22
+ output elements that come from other modules (or are global).
23
+
20
24
  "
21
25
 
22
26
  opts.on('-r', '--render-as FORMAT', 'Render the output as human, json, or yaml') do |val|
@@ -33,6 +37,10 @@ Puppet module and it will do the right thing.
33
37
  options[:debug] = true
34
38
  end
35
39
 
40
+ opts.on('-x', '--external', 'Show external elements only') do
41
+ options[:debug] = true
42
+ end
43
+
36
44
  opts.on('--shell', 'Open a pry shell for debugging (must have Pry installed)') do
37
45
  options[:shell] = true
38
46
  end
@@ -14,6 +14,10 @@ manifests in the manifests directory, so you can just run this in the root of a
14
14
  Puppet module and it will do the right thing.
15
15
  EOT
16
16
 
17
+ option('--external') do
18
+ summary 'Show external elements only.'
19
+ end
20
+
17
21
  option('--shell') do
18
22
  summary 'Start a debugging shell (requires Pry).'
19
23
  end
@@ -14,7 +14,6 @@ class Puppet_X::Binford2k::Itemize::Parser
14
14
  :classes => {},
15
15
  :functions => {},
16
16
  }
17
- Puppet::Util::Log.newdestination(:console)
18
17
  end
19
18
 
20
19
  def record(kind, thing)
@@ -1,9 +1,37 @@
1
+ require 'puppet'
2
+ require 'puppet/util/logging'
3
+ require 'json'
4
+
1
5
  class Puppet_X::Binford2k::Itemize::Runner
2
6
  attr_reader :results
3
7
  def initialize(options = {})
4
- @paths = expand(Array(options[:manifests]))
5
- @options = options
6
- @results = {}
8
+ Puppet::Util::Log.newdestination(:console)
9
+
10
+ @paths = expand(Array(options[:manifests]))
11
+ @options = options
12
+ @results = {}
13
+
14
+ if options[:manifests].size == 1
15
+ root = options[:manifests].first
16
+ path = [File.expand_path("#{root}/metadata.json"),
17
+ File.expand_path("#{root}/../metadata.json")].select { |p| File.exist? p }.first
18
+
19
+ if path
20
+ @metadata = JSON.parse(File.read(File.expand_path("#{path}/../metadata.json")))
21
+ author = @metadata['author']
22
+ @namespace = @metadata['name'].sub(/^#{author}-/, '')
23
+
24
+ # we can only use the module name part of this, not the user namespace
25
+ @dependencies = @metadata['dependencies'].map do |dep|
26
+ dep['name'].split(/[-\/]/).last
27
+ end
28
+ # inject a few mocked dependencies that we can assume will always exist
29
+ @dependencies << @namespace
30
+ @dependencies << 'puppet_enterprise'
31
+ else
32
+ # what error to display here?
33
+ end
34
+ end
7
35
  end
8
36
 
9
37
  def expand(paths)
@@ -27,6 +55,12 @@ class Puppet_X::Binford2k::Itemize::Runner
27
55
  @results[kind] ||= {}
28
56
 
29
57
  counts.each do |name, count|
58
+ segments = name.split('::')
59
+ if @dependencies and segments.size > 1
60
+ Puppet.warning "Undeclared module dependancy: #{name}" unless @dependencies.include? segments.first
61
+ end
62
+ next if @options[:external] and segments.first == @namespace
63
+
30
64
  @results[kind][name] ||= 0
31
65
  @results[kind][name] += count
32
66
  end
@@ -1,7 +1,7 @@
1
1
  module Puppet_X
2
2
  module Binford2k
3
3
  class Itemize
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet-itemize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Ford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-15 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json
14
+ name: puppet
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '4.10'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: '4.10'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
27
33
  description: |2
28
34
  Run this command with a space separated list of either manifest file paths, or
29
35
  directories containing manifests. If omitted, it will default to inspecting all
@@ -35,6 +41,7 @@ executables:
35
41
  extensions: []
36
42
  extra_rdoc_files: []
37
43
  files:
44
+ - CHANGELOG.md
38
45
  - LICENSE
39
46
  - README.md
40
47
  - bin/puppet-itemize
@@ -44,7 +51,7 @@ files:
44
51
  - lib/puppet_x/binford2k/itemize/parser.rb
45
52
  - lib/puppet_x/binford2k/itemize/runner.rb
46
53
  - lib/puppet_x/binford2k/itemize/version.rb
47
- homepage: https://github.com/binford2k/puppet-itemize
54
+ homepage: https://github.com/binford2k/binford2k-itemize
48
55
  licenses:
49
56
  - Apache-2.0
50
57
  metadata: {}
@@ -64,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
71
  version: '0'
65
72
  requirements: []
66
73
  rubyforge_project:
67
- rubygems_version: 2.6.10
74
+ rubygems_version: 2.7.7
68
75
  signing_key:
69
76
  specification_version: 4
70
77
  summary: Count the number of types, classes, functions used in Puppet manifest(s).