Skip to content

Commit ca90029

Browse files
committed
Add support for puppetfile resolver
* This adds experimental support for the puppetfile resolver. Since the resolver is better, faster, stronger it might be useful to use this library in the future. A resolve task task has been added but it is not clear what that yet provides.
1 parent 4ba308b commit ca90029

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

lib/ra10ke.rb

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'ra10ke/version'
44
require 'ra10ke/solve'
55
require 'ra10ke/syntax'
6+
require 'ra10ke/resolver'
67
require 'ra10ke/dependencies'
78
require 'ra10ke/deprecation'
89
require 'ra10ke/duplicates'
@@ -20,6 +21,7 @@ class RakeTask < ::Rake::TaskLib
2021
include Ra10ke::Duplicates
2122
include Ra10ke::Install
2223
include Ra10ke::Validate
24+
include Ra10ke::Resolver
2325

2426
attr_accessor :basedir, :moduledir, :puppetfile_path, :puppetfile_name, :force, :purge
2527

@@ -41,6 +43,8 @@ def initialize(*args)
4143
define_task_duplicates(*args)
4244
define_task_install(*args)
4345
define_task_validate(*args)
46+
define_task_resolver(*args)
47+
4448
end
4549
end
4650

lib/ra10ke/resolver.rb

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
require 'puppetfile-resolver'
2+
require 'puppetfile-resolver/puppetfile/parser/r10k_eval'
3+
4+
module Ra10ke
5+
module Resolver
6+
7+
def define_task_resolver(*args)
8+
desc 'Run the puppetfile Resolver'
9+
task :resolver do
10+
resolver = Ra10ke::Resolver::Instance.new(get_puppetfile.puppetfile_path)
11+
result = resolver.resolve
12+
# Output resolution validation errors
13+
result.validation_errors.each { |err| puts "Resolution Validation Error: #{err}\n"}
14+
end
15+
end
16+
17+
class Instance
18+
attr_reader :puppetfile
19+
20+
def initialize(puppetfile_path = File.expand_path(Dir.pwd))
21+
22+
# Parse the Puppetfile into an object model
23+
content = File.open(puppetfile_path, 'rb') { |f| f.read }
24+
25+
@puppetfile = ::PuppetfileResolver::Puppetfile::Parser::R10KEval.parse(content)
26+
27+
# Make sure the Puppetfile is valid
28+
unless puppetfile.valid?
29+
puts 'Puppetfile is not valid'
30+
puppetfile.validation_errors.each { |err| puts err }
31+
exit 1
32+
end
33+
end
34+
35+
def resolve
36+
# Create the resolver
37+
# - Use the document we just parsed (puppetfile)
38+
# - Don't restrict by Puppet version (nil)
39+
resolver = ::PuppetfileResolver::Resolver.new(puppetfile, nil)
40+
41+
# Configure the resolver
42+
cache = nil # Use the default inmemory cache
43+
ui = nil # Don't output any information
44+
module_paths = [] # List of paths to search for modules on the local filesystem
45+
allow_missing_modules = true # Allow missing dependencies to be resolved
46+
opts = { cache: cache, ui: ui, module_paths: module_paths, allow_missing_modules: allow_missing_modules }
47+
48+
# Resolve
49+
result = resolver.resolve(opts)
50+
51+
52+
end
53+
54+
end
55+
end
56+
end

ra10ke.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
1717
spec.required_ruby_version = '>= 2.4.0'
1818

1919
spec.add_dependency "rake"
20+
spec.add_dependency 'puppetfile-resolver'
2021
spec.add_dependency "puppet_forge"
2122
spec.add_dependency "r10k"
2223
spec.add_dependency "git"

spec/ra10ke/resolver_spec.rb

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
require 'ra10ke/resolver'
5+
RSpec::Mocks.configuration.allow_message_expectations_on_nil = true
6+
7+
RSpec.describe 'Ra10ke::Resolver::Instance' do
8+
include Ra10ke::Resolver
9+
let(:instance) do
10+
Ra10ke::Resolver::Instance.new(puppetfile)
11+
end
12+
13+
let(:puppetfile) do
14+
File.join(fixtures_dir, 'Puppetfile')
15+
end
16+
17+
it 'resolves the puppetfile' do
18+
expect(instance.resolve).to be nil
19+
end
20+
end

0 commit comments

Comments
 (0)