puppetfiler 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6a40769b4aa2a0201e674c15b721130beaee9ac
4
- data.tar.gz: 00733ee0f252f42cc63c17f81aeb5be2c590d006
3
+ metadata.gz: 0e2e5783e88c6066b2e029741e8246192c59216f
4
+ data.tar.gz: c6a19c79436262c91b7d263205de583b5eb5484b
5
5
  SHA512:
6
- metadata.gz: 355e96a75fbafe5cbe0ac079f9fa6cb9ee28f34397f7888952a70edb0c896aa19aef773fbfeda207669abe6af177261716703e10257ac0e3482ca11b340a5bba
7
- data.tar.gz: 0922e770b569f21c47ba227c78d78c511d09a4826daf0d3a17a2222f7867e59a9d89e32e978e385837e2d81fe8f2ae465c11444fa509bc31f27c3d177eab72ca
6
+ metadata.gz: 263b769794f7d8aadff453d04d11a92ab9eaeb7fb1a461fb9d64d83ddd8a8a4b326318adfd75ac8473b1e24279a2e902d19543e257002307702633beacfde14d
7
+ data.tar.gz: 49d3855d4009093d043fcdc74e7b3fe1a34f08b0450cd0e26d214db327e2690a7c7bca29006289a3c944d9924ed259d8a1ab52b1e23d76d9e51cc29225be164d
data/CHANGELOG.rst ADDED
@@ -0,0 +1,52 @@
1
+ v0.1.5
2
+ ------
3
+
4
+ Breaking changes
5
+ ~~~~~~~~~~~~~~~~
6
+ - Puppetfile/metadata.json are now specified via flags instead of
7
+ passing them in.
8
+ If neither are passed puppetfiler checks for a Puppetfile first, then
9
+ for a metadata.json.
10
+ If neither are found puppetfiler fails.
11
+
12
+ Changes
13
+ ~~~~~~~
14
+ - The fixture method is now a module function with the following
15
+ signature ``fixture(forge_modules, repos, modifier)``, with
16
+ forge_modules being instances of ``Puppetfiler::Mod``
17
+
18
+ ``Puppetfiler::Puppetfile#fixture`` is still available.
19
+
20
+ - Fixtures can now also be generated from metadata.json files
21
+
22
+
23
+ v0.1.4
24
+ ------
25
+ Bugfix release
26
+
27
+ The output of the fixture() method did not include the top-level
28
+ 'fixtures' key.
29
+
30
+ v0.1.3
31
+ ------
32
+
33
+ Changes
34
+ ~~~~~~~
35
+
36
+ - A hash can now be passed into the fixture() method, allowing to
37
+ modify the resulting hashes.
38
+ Primarily useful to pass additional proxy flags or to target in-house
39
+ mirrors
40
+
41
+ v0.1.2
42
+ ------
43
+
44
+ Changes
45
+ ~~~~~~~
46
+
47
+ - Set mimimum ruby version to latest stable 2.1
48
+
49
+ v0.1.1
50
+ ------
51
+
52
+ Initial release
data/TODO CHANGED
@@ -9,8 +9,8 @@
9
9
  environment, which'd favor matching against found metaparams below the
10
10
  current path
11
11
 
12
- * Building of .fixtures.yml for modules based on the metadata
13
- I did something similar on my modulesync config[1], however having it
14
- this way and called via a rake task might be favorable
12
+ * Mock api calls in aruba tests
13
+ Not as easy as with rspec, see https://github.com/cucumber/aruba/issues/169
14
+ However using arubas in-process execution it is possible to use webmock to mock these calls.
15
15
 
16
- [1]: https://github.com/ntnn/modulesync-cfg/blob/master/moduleroot/.fixtures.yml
16
+ It is quite ugly though: https://github.com/erikhuda/thor/wiki/Integrating-with-Aruba-In-Process-Runs
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "example-module",
3
+ "version": "0.1.0",
4
+ "author": "Some Author",
5
+ "summary": "Examplary summary",
6
+ "license": "MIT",
7
+ "source": "https://github.com/ntnn/puppetfiler",
8
+ "project_page": "https://github.com/ntnn/puppetfiler",
9
+ "issues_url": "https://github.com/ntnn/puppetfiler/issues",
10
+ "dependencies": [
11
+ ]
12
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "example-module",
3
+ "version": "0.1.0",
4
+ "author": "Some Author",
5
+ "summary": "Examplary summary",
6
+ "license": "MIT",
7
+ "source": "https://github.com/ntnn/puppetfiler",
8
+ "project_page": "https://github.com/ntnn/puppetfiler",
9
+ "issues_url": "https://github.com/ntnn/puppetfiler/issues"
10
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "example-module",
3
+ "version": "0.1.0",
4
+ "author": "Some Author",
5
+ "summary": "Examplary summary",
6
+ "license": "MIT",
7
+ "source": "https://github.com/ntnn/puppetfiler",
8
+ "project_page": "https://github.com/ntnn/puppetfiler",
9
+ "issues_url": "https://github.com/ntnn/puppetfiler/issues",
10
+ "dependencies": [
11
+ {
12
+ "name": "puppetlabs/stdlib",
13
+ "version_requirement": ">= 4.13.0 < 5.0.0"
14
+ }
15
+ ]
16
+ }
@@ -5,22 +5,56 @@ require 'puppetfiler/version'
5
5
 
6
6
  module Puppetfiler
7
7
  class CLI < Thor
8
- desc 'check [puppetfile]', 'Check forge for newer versions of used forge modules'
9
- def check(puppetfile = 'Puppetfile')
10
- pf = Puppetfiler::Puppetfile.new(puppetfile)
11
- format = "% -#{pf.maxlen_name}s % -#{pf.maxlen_ver}s %s"
8
+ class_option :puppetfile, {
9
+ :default => nil,
10
+ :desc => 'Puppetfile to act on',
11
+ :aliases => ['p'],
12
+ }
13
+
14
+ class_option :metadata, {
15
+ :default => nil,
16
+ :desc => 'metadata.json to act on',
17
+ :aliases => ['m'],
18
+ }
19
+
20
+ desc 'check', 'Check forge for newer versions of used forge modules'
21
+ def check()
22
+ target = target(options)
23
+
24
+ case target[:type]
25
+ when :puppetfile
26
+ t = Puppetfiler::Puppetfile.new(target[:result])
27
+ when :metadata
28
+ # TODO see below
29
+ fail 'Checking metadata.json for version range updates is not implemented yet'
30
+ else fail "Unkown type: #{target[:type]}"
31
+ end
32
+
33
+ format = "% -#{t.maxlen_name}s % -#{t.maxlen_ver}s %s"
12
34
 
13
35
  puts sprintf(format, 'module', 'current', 'newest')
14
36
 
15
- pf.updates.each do |name, hash|
37
+ # TODO the updates should be collected asynchronously to
38
+ # speed up the process
39
+ t.updates.each do |name, hash|
16
40
  puts sprintf(format, name, hash[:current], hash[:newest])
17
41
  end
18
42
  end
19
43
 
20
- desc 'fixture [puppetfile]', 'Create puppetlabs_spec_helper compatible .fixtures.yml from puppetfile'
44
+ desc 'fixture', 'Create puppetlabs_spec_helper compatible .fixtures.yml from puppetfile or metadata.json'
21
45
  method_option :stdout, :aliases => '-o'
22
- def fixture(puppetfile = 'Puppetfile')
23
- f = Puppetfiler::Puppetfile.new(puppetfile).fixture.to_yaml
46
+ def fixture()
47
+ target = target(options)
48
+
49
+ case target[:type]
50
+ when :puppetfile
51
+ f = Puppetfiler::Puppetfile.new(target[:result])
52
+ when :metadata
53
+ f = Puppetfiler::Metadata.new(File.new(target[:result]))
54
+ else fail "Unkown type: #{target[:type]}"
55
+ end
56
+
57
+ f = f.fixture.to_yaml
24
58
 
25
59
  if options[:stdout]
26
60
  puts f
@@ -33,5 +67,21 @@ module Puppetfiler
33
67
  def version
34
68
  puts "puppetfiler v#{Puppetfiler::VERSION}"
35
69
  end
70
+
71
+ private
72
+ def target(opts)
73
+ {
74
+ :puppetfile => 'Puppetfile',
75
+ :metadata => 'metadata.json',
76
+ }.each do |sym, str|
77
+ if opts[sym]
78
+ return { :result => opts[sym], :type => sym }
79
+ elsif File.exists?(str)
80
+ return { :result => str, :type => sym }
81
+ end
82
+ end
83
+
84
+ fail 'No Puppetfile or metadata.json found, aborting'
85
+ end
36
86
  end
37
87
  end
@@ -0,0 +1,37 @@
1
+ require 'json'
2
+ require 'puppetfiler/mod'
3
+ require 'semantic_puppet'
4
+
5
+ module Puppetfiler
6
+ class Metadata
7
+ attr :dependencies
8
+ attr :path
9
+ def initialize(target)
10
+ @dependencies = {}
11
+
12
+ parse target
13
+ end
14
+
15
+ def fixture(modifiers = {})
16
+ Puppetfiler.fixture(@dependencies, {}, modifiers)
17
+ end
18
+
19
+ def eql?(other)
20
+ @dependencies.eql?(other.dependencies)
21
+ end
22
+
23
+ private
24
+ def parse(target)
25
+ json = JSON.load(target)
26
+
27
+ if not json.has_key?('dependencies') or json['dependencies'].eql?([])
28
+ warn 'No dependencies found'
29
+ return nil
30
+ end
31
+
32
+ json['dependencies'].each do |hash|
33
+ @dependencies[hash['name']] = Puppetfiler::Mod.new(hash)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -3,10 +3,90 @@ require 'semantic_puppet'
3
3
 
4
4
  module Puppetfiler
5
5
  class Mod
6
- def self.newest(name)
7
- mod = PuppetForge::Module.find(name.gsub('/', '-'))
8
- version = mod.current_release.version
9
- return SemanticPuppet::Version.parse(version)
6
+ attr :name
7
+ attr :slug
8
+ attr :range
9
+
10
+ def initialize(*args)
11
+ require 'hashie'
12
+ args = Hashie.symbolize_keys(args[0])
13
+
14
+ raise "Names with dashes are disallowed: #{args[:name]}" if /-/.match(args[:name])
15
+
16
+ @name = args[:name]
17
+ @slug = @name.gsub('/', '-')
18
+
19
+ @forge = PuppetForge::Module.find(@slug)
20
+
21
+ @range = nil
22
+ [:range, 'range', 'version_requirement'].each do |v|
23
+ if args.has_key?(v)
24
+ if not args[v].is_a?(SemanticPuppet::VersionRange)
25
+ args[v] = SemanticPuppet::VersionRange.parse(args[v])
26
+ end
27
+
28
+ @range = args[v]
29
+ end
30
+ end
31
+
32
+ @version = nil
33
+ [:version, 'version'].each do |v|
34
+ @version = SemanticPuppet::Version.parse(args[v]) if args.has_key?(v)
35
+ end
36
+ @version = latest_valid if not @version
37
+ end
38
+
39
+ def eql?(other)
40
+ return false if not @name.eql?(other.name)
41
+
42
+ # range has to be checked first, sine version is a method
43
+ # returning at least latest
44
+ if @range
45
+ return false if not other.range
46
+ return true if @range.eql?(other.range)
47
+ end
48
+
49
+ return true if version.eql?(other.version)
50
+
51
+ return false
52
+ end
53
+
54
+ def version
55
+ return latest_valid if not @version
56
+
57
+ return @version
58
+ end
59
+
60
+ def latest
61
+ return SemanticPuppet::Version.parse(@forge.current_release.version)
62
+ end
63
+
64
+ def valid_versions
65
+ return [] if not @range
66
+
67
+ versions = []
68
+
69
+ @forge.releases.each do |release|
70
+ version = SemanticPuppet::Version.parse(release.version)
71
+ versions << version if @range.cover?(version)
72
+ end
73
+
74
+ return versions
75
+ end
76
+
77
+ def latest_valid
78
+ if not @range
79
+ return latest
80
+ end
81
+
82
+ return valid_versions[0]
83
+ end
84
+
85
+ def version_valid(version = @version)
86
+ return false if not @range
87
+
88
+ version = SemanticPuppet::Version.parse(version) if not version.is_a?(SemanticPuppet::Version)
89
+ return range.cover?(version)
10
90
  end
11
91
  end
12
92
  end
@@ -1,4 +1,4 @@
1
- require 'puppetfiler/mod'
1
+ require 'puppetfiler'
2
2
 
3
3
  module Puppetfiler
4
4
  class Puppetfile
@@ -25,6 +25,9 @@ module Puppetfiler
25
25
  end
26
26
 
27
27
  begin
28
+ # TODO similar to Metadata, allow IO objects like File,
29
+ # string or similar to be passed in instead of expecting
30
+ # a path
28
31
  self.instance_eval(File.read(@puppetfile))
29
32
  rescue SyntaxError => error
30
33
  STDERR.puts "Puppetfile at path '#{@puppetfile}' is invalid:"
@@ -40,9 +43,9 @@ module Puppetfiler
40
43
  def updates
41
44
  updates = {}
42
45
 
43
- @modules.each do |name, version|
44
- current = SemanticPuppet::Version.parse(version)
45
- newest = Puppetfiler::Mod.newest(name)
46
+ @modules.each do |name, mod|
47
+ current = mod.version
48
+ newest = mod.latest
46
49
 
47
50
  if not newest.eql?(current)
48
51
  updates[name] = {
@@ -56,62 +59,7 @@ module Puppetfiler
56
59
  end
57
60
 
58
61
  def fixture(modifiers = {})
59
- fixtures = {
60
- 'forge_modules' => {},
61
- 'repositories' => {},
62
- }
63
-
64
- fixtures.each do |k, v|
65
- modifiers[k] = {} if not modifiers.has_key?(k)
66
- end
67
-
68
- @modules.each do |name, version|
69
- short = name.split('/')[1]
70
- value = {
71
- 'repo' => name,
72
- 'ref' => version,
73
- }
74
-
75
- modifiers['forge_modules'].each do |modifier, merger|
76
- # TODO use x.match?(y) on ruby 2.4
77
- value.merge!(merger) if name =~ /#{modifier}/
78
- end
79
-
80
- fixtures['forge_modules'][short] = value
81
- end
82
-
83
- @repos.each do |name, hash|
84
- if hash.has_key?(:ref)
85
- content = {
86
- 'repo' => hash[:uri],
87
- 'ref' => hash[:ref],
88
- }
89
-
90
- modifiers['repositories'].each do |modifier, merger|
91
- content.merge!(merger) if name =~ /#{modifier}/
92
- end
93
- else
94
- content = hash[:uri]
95
-
96
- modifiers['repositories'].each do |modifier, merger|
97
- if name =~ /#{modifier}/
98
- if merger.is_a?(String)
99
- content = merger
100
- else
101
- content = {
102
- 'repo' => hash[:uri],
103
- }
104
-
105
- content.merge!(merger)
106
- end
107
- end
108
- end
109
- end
110
-
111
- fixtures['repositories'][name] = content
112
- end
113
-
114
- { 'fixtures' => fixtures }
62
+ Puppetfiler.fixture(@modules, @repos, modifiers)
115
63
  end
116
64
 
117
65
  private
@@ -124,7 +72,9 @@ module Puppetfiler
124
72
 
125
73
  if arg.is_a?(String)
126
74
  return if arg == 'latest'
127
- @modules[name] = arg
75
+
76
+ @modules[name] = Puppetfiler::Mod.new(:name => name, :version => arg)
77
+
128
78
  @maxlen_name = name.length if name.length > @maxlen_name
129
79
  @maxlen_ver = arg.length if arg.length > @maxlen_ver
130
80
  else args.is_a?(Hash)
@@ -1,3 +1,3 @@
1
1
  module Puppetfiler
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
data/lib/puppetfiler.rb CHANGED
@@ -1,7 +1,65 @@
1
1
  require 'puppetfiler/cli'
2
+ require 'puppetfiler/metadata'
2
3
  require 'puppetfiler/mod'
3
4
  require 'puppetfiler/puppetfile'
4
5
  require 'puppetfiler/version'
5
6
 
6
7
  module Puppetfiler
8
+ def self.fixture(modules, repos, modifiers = {})
9
+ fixtures = {}
10
+
11
+ %w{forge_modules repositories}.each do |k|
12
+ modifiers[k] = {} if not modifiers.has_key?(k)
13
+ end
14
+
15
+ modules.each do |name, mod|
16
+ short = name.split('/')[1]
17
+ value = {
18
+ 'repo' => name,
19
+ 'ref' => mod.version.to_s,
20
+ }
21
+
22
+ modifiers['forge_modules'].each do |modifier, merger|
23
+ # TODO use x.match?(y) on ruby 2.4
24
+ value.merge!(merger) if name =~ /#{modifier}/
25
+ end
26
+
27
+ fixtures['forge_modules'] = {} if not fixtures.has_key?('forge_modules')
28
+ fixtures['forge_modules'][short] = value
29
+ end
30
+
31
+ repos.each do |name, hash|
32
+ if hash.has_key?(:ref)
33
+ content = {
34
+ 'repo' => hash[:uri],
35
+ 'ref' => hash[:ref],
36
+ }
37
+
38
+ modifiers['repositories'].each do |modifier, merger|
39
+ content.merge!(merger) if name =~ /#{modifier}/
40
+ end
41
+ else
42
+ content = hash[:uri]
43
+
44
+ modifiers['repositories'].each do |modifier, merger|
45
+ if name =~ /#{modifier}/
46
+ if merger.is_a?(String)
47
+ content = merger
48
+ else
49
+ content = {
50
+ 'repo' => hash[:uri],
51
+ }
52
+
53
+ content.merge!(merger)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ fixtures['repositories'] = {} if not fixtures.has_key?('repositories')
60
+ fixtures['repositories'][name] = content
61
+ end
62
+
63
+ return { 'fixtures' => fixtures }
64
+ end
7
65
  end
data/puppetfiler.gemspec CHANGED
@@ -31,8 +31,10 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'pry', '~> 0.10.4'
32
32
  spec.add_development_dependency 'simplecov', '~> 0.13.0'
33
33
  spec.add_development_dependency 'simplecov-console', '~> 0.4.1'
34
+ spec.add_development_dependency 'webmock', '~> 2.3'
34
35
 
35
36
  spec.add_dependency 'puppet_forge', '~> 2.2'
36
37
  spec.add_dependency 'semantic_puppet', '~> 0.1.4'
37
38
  spec.add_dependency 'thor', '~> 0.19.4'
39
+ spec.add_dependency 'hashie', '~> 3.5'
38
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppetfiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nelo-T. Wallus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-06 00:00:00.000000000 Z
11
+ date: 2017-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: 0.4.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.3'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: puppet_forge
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +178,20 @@ dependencies:
164
178
  - - "~>"
165
179
  - !ruby/object:Gem::Version
166
180
  version: 0.19.4
181
+ - !ruby/object:Gem::Dependency
182
+ name: hashie
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '3.5'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '3.5'
167
195
  description:
168
196
  email:
169
197
  - nelo@wallus.de
@@ -176,6 +204,7 @@ files:
176
204
  - ".gitignore"
177
205
  - ".rspec"
178
206
  - ".travis.yml"
207
+ - CHANGELOG.rst
179
208
  - Gemfile
180
209
  - LICENSE.txt
181
210
  - README.rst
@@ -183,10 +212,14 @@ files:
183
212
  - TODO
184
213
  - bin/console
185
214
  - bin/setup
215
+ - data/metadata_emptydeps.json
216
+ - data/metadata_nodeps.json
217
+ - data/simple_metadata.json
186
218
  - data/simple_puppetfile.rb
187
219
  - exe/puppetfiler
188
220
  - lib/puppetfiler.rb
189
221
  - lib/puppetfiler/cli.rb
222
+ - lib/puppetfiler/metadata.rb
190
223
  - lib/puppetfiler/mod.rb
191
224
  - lib/puppetfiler/puppetfile.rb
192
225
  - lib/puppetfiler/version.rb
@@ -211,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
244
  version: '0'
212
245
  requirements: []
213
246
  rubyforge_project:
214
- rubygems_version: 2.4.5
247
+ rubygems_version: 2.6.10
215
248
  signing_key:
216
249
  specification_version: 4
217
250
  summary: Miscallenous actions on Puppetfiles