puppet-repl 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 +4 -4
- data/README.md +13 -8
- data/lib/puppet-repl/cli.rb +15 -35
- data/lib/puppet-repl/support.rb +138 -0
- data/lib/version.rb +1 -1
- data/puppet-repl.gemspec +5 -3
- data/spec/puppet-repl_spec.rb +17 -1
- data/spec/support_spec.rb +43 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 264126ccdd7fafe72a52274c967c28ef18d53679
|
4
|
+
data.tar.gz: 31d01dd0eaa97e130ec51d9679424839d48cb73d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c12edea95534472ad07ba667ecdebd21a6d5f61eeccf01950b587e9e43eb6ea23563ccd5743731f91aba7f0245bb0898fdbe1580e9cf8b5839518cfe438f5910
|
7
|
+
data.tar.gz: 023f8e084288ca93a16366d8d8dfb473adadb0baa53c83f87951d2e99f14ecc3e55f9bd140622cb0b5fd4f531b9dee76482be9830c46745f63a26a0689c53957
|
data/README.md
CHANGED
@@ -8,6 +8,12 @@ Requires Puppet 3.8+ and only uses the future parser.
|
|
8
8
|
## Installation
|
9
9
|
`gem install puppet-repl`
|
10
10
|
|
11
|
+
## Load path
|
12
|
+
puppet-repl will load all functions from your basemodulepath and environmentpath.
|
13
|
+
|
14
|
+
This means if you run `puppet module install puppetlabs-stdlib` and they will be available
|
15
|
+
in the repl.
|
16
|
+
|
11
17
|
## Usage
|
12
18
|
Puppet-repl will only parse and evaulate your code. It will not build a catalog
|
13
19
|
and try to enforce the catalog. This has a few side affects.
|
@@ -34,7 +40,8 @@ Type "exit", "functions", "types", "reset", "help" for more information.
|
|
34
40
|
|
35
41
|
```
|
36
42
|
|
37
|
-
Using Variables
|
43
|
+
## Using Variables
|
44
|
+
|
38
45
|
```
|
39
46
|
MacBook-Pro-2/tmp % prepl
|
40
47
|
Puppet Version: 4.2.2
|
@@ -49,16 +56,13 @@ Type "exit", "functions", "types", "reset", "help" for more information.
|
|
49
56
|
>>
|
50
57
|
```
|
51
58
|
|
52
|
-
Using functions
|
59
|
+
## Using functions
|
60
|
+
Functions will run and produce the desired output. If you type the word `functions`
|
61
|
+
a list of available functions will be displayed on the screen.
|
53
62
|
|
54
63
|
```
|
55
64
|
>> split('hello/there/one/two/three','/')
|
56
|
-
=>
|
57
|
-
hello
|
58
|
-
there
|
59
|
-
one
|
60
|
-
two
|
61
|
-
three
|
65
|
+
=> ["hello", "there", "one", "two", "three"]
|
62
66
|
|
63
67
|
```
|
64
68
|
## Duplicate resource error
|
@@ -72,6 +76,7 @@ Just like normal puppet code you cannot create duplicate resources.
|
|
72
76
|
You can reset the parser by running `reset` within the repl without having to exit.
|
73
77
|
|
74
78
|
## Troubleshooting
|
79
|
+
|
75
80
|
## Forward
|
76
81
|
I was just playing around and created this simple tool. Its alpha quality,
|
77
82
|
and a ton of features need to be added. Please create a issue if you see a bug or feature that should be added.
|
data/lib/puppet-repl/cli.rb
CHANGED
@@ -1,42 +1,17 @@
|
|
1
1
|
require 'puppet'
|
2
2
|
require 'puppet/pops'
|
3
|
-
require
|
4
|
-
|
3
|
+
require 'readline'
|
4
|
+
require_relative 'support'
|
5
5
|
module PuppetRepl
|
6
6
|
class Cli
|
7
|
+
include PuppetRepl::Support
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def module_dirs
|
14
|
-
Puppet.settings[:basemodulepath].split(':')
|
15
|
-
end
|
16
|
-
|
17
|
-
# creates a puppet environment given a module path and environment name
|
18
|
-
def puppet_environment
|
19
|
-
@puppet_environment ||= Puppet::Node::Environment.create('production', module_dirs)
|
20
|
-
end
|
21
|
-
|
22
|
-
def scope
|
23
|
-
unless @scope
|
24
|
-
begin
|
25
|
-
Puppet.initialize_settings
|
26
|
-
rescue
|
27
|
-
# do nothing otherwise calling init twice raises an error
|
28
|
-
end
|
29
|
-
#options['parameters']
|
30
|
-
#options['facts']
|
31
|
-
#options[:classes]
|
32
|
-
node_name = 'node_name'
|
33
|
-
node = Puppet::Node.new(node_name, :environment => puppet_environment)
|
34
|
-
compiler = Puppet::Parser::Compiler.new(node)
|
35
|
-
@scope = Puppet::Parser::Scope.new(compiler)
|
36
|
-
@scope.source = Puppet::Resource::Type.new(:node, node_name)
|
37
|
-
@scope.parent = compiler.topscope
|
9
|
+
def initialize
|
10
|
+
begin
|
11
|
+
Puppet.initialize_settings
|
12
|
+
rescue
|
13
|
+
# do nothing otherwise calling init twice raises an error
|
38
14
|
end
|
39
|
-
@scope
|
40
15
|
end
|
41
16
|
|
42
17
|
def puppet_eval(input)
|
@@ -59,21 +34,25 @@ module PuppetRepl
|
|
59
34
|
end
|
60
35
|
result
|
61
36
|
end
|
62
|
-
|
37
|
+
|
63
38
|
def handle_input(input)
|
64
39
|
case input
|
65
40
|
when 'help'
|
66
41
|
PuppetRepl::Cli.print_repl_desc
|
67
42
|
when 'functions'
|
68
|
-
puts
|
43
|
+
puts function_map.keys.sort
|
69
44
|
when 'types'
|
70
45
|
puts "list of types coming soon"
|
71
46
|
when '_'
|
72
47
|
puts(" => #{@last_item}")
|
48
|
+
when 'environment'
|
49
|
+
puts "Puppet Environment: #{puppet_env_name}"
|
73
50
|
when 'exit'
|
74
51
|
exit 0
|
75
52
|
when 'reset'
|
76
53
|
@scope = nil
|
54
|
+
when 'current_resources'
|
55
|
+
compiler.known_resource_types
|
77
56
|
else
|
78
57
|
result = puppet_eval(input)
|
79
58
|
@last_item = result
|
@@ -87,6 +66,7 @@ module PuppetRepl
|
|
87
66
|
|
88
67
|
def self.print_repl_desc
|
89
68
|
puts(<<-EOT)
|
69
|
+
Ruby Version: #{RUBY_VERSION}
|
90
70
|
Puppet Version: #{Puppet.version}
|
91
71
|
Puppet Repl Version: #{PuppetRepl::VERSION}
|
92
72
|
Created by: NWOps <corey@nwops.io>
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module PuppetRepl
|
2
|
+
module Support
|
3
|
+
|
4
|
+
# returns an array of module directories
|
5
|
+
def module_dirs
|
6
|
+
dirs = []
|
7
|
+
dirs << File.join(Puppet[:environmentpath],puppet_env_name,'modules')
|
8
|
+
dirs << Puppet.settings[:basemodulepath].split(':')
|
9
|
+
dirs.flatten
|
10
|
+
end
|
11
|
+
|
12
|
+
def puppet_lib_dir
|
13
|
+
# returns something like "/Library/Ruby/Gems/2.0.0/gems/puppet-4.2.2/lib/puppet.rb"
|
14
|
+
@puppet_lib_dir ||= File.dirname(Puppet.method(:[]).source_location.first)
|
15
|
+
end
|
16
|
+
|
17
|
+
# returns a array of function files
|
18
|
+
def function_files
|
19
|
+
search_dirs = lib_dirs.map do |lib_dir|
|
20
|
+
[File.join(lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
21
|
+
File.join(lib_dir, 'functions', '**', '*.rb'),
|
22
|
+
File.join(lib_dir, 'puppet', 'parser', 'functions', '*.rb')
|
23
|
+
]
|
24
|
+
end
|
25
|
+
# add puppet lib directories
|
26
|
+
search_dirs << [File.join(puppet_lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
27
|
+
File.join(puppet_lib_dir, 'puppet', 'parser', 'functions', '*.rb')
|
28
|
+
]
|
29
|
+
Dir.glob(search_dirs.flatten)
|
30
|
+
end
|
31
|
+
|
32
|
+
# returns either the module name or puppet version
|
33
|
+
def mod_finder
|
34
|
+
@mod_finder ||= Regexp.new('\/([\w\-\.]+)\/lib')
|
35
|
+
end
|
36
|
+
|
37
|
+
# returns a map of functions
|
38
|
+
def function_map
|
39
|
+
unless @functions
|
40
|
+
@functions = {}
|
41
|
+
function_files.each do |file|
|
42
|
+
obj = {}
|
43
|
+
name = File.basename(file, '.rb')
|
44
|
+
obj[:name] = name
|
45
|
+
obj[:parent] = mod_finder.match(file)[1]
|
46
|
+
@functions["#{obj[:parent]}::#{name}"] = obj
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@functions
|
50
|
+
end
|
51
|
+
|
52
|
+
def lib_dirs
|
53
|
+
module_dirs.map do |mod_dir|
|
54
|
+
Dir["#{mod_dir}/*/lib"].entries
|
55
|
+
end.flatten
|
56
|
+
end
|
57
|
+
|
58
|
+
def load_lib_dirs
|
59
|
+
lib_dirs.each do |lib|
|
60
|
+
$LOAD_PATH << lib
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# returns a future parser for evaluating code
|
65
|
+
def parser
|
66
|
+
@parser || ::Puppet::Pops::Parser::EvaluatingParser.new
|
67
|
+
end
|
68
|
+
|
69
|
+
# the cached name of the environment
|
70
|
+
def puppet_env_name
|
71
|
+
@penv ||= ENV['PUPPET_ENV'] || Puppet[:environment]
|
72
|
+
end
|
73
|
+
|
74
|
+
# creates a puppet environment given a module path and environment name
|
75
|
+
# this is cached
|
76
|
+
def puppet_environment
|
77
|
+
@puppet_environment ||= Puppet::Node::Environment.create(
|
78
|
+
puppet_env_name,
|
79
|
+
module_dirs,
|
80
|
+
manifests_dir
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
# def functions
|
85
|
+
# @functions = []
|
86
|
+
# @functions << compiler.loaders.static_loader.loaded.keys.find_all {|l| l.type == :function}
|
87
|
+
# end
|
88
|
+
|
89
|
+
def environment_loaders
|
90
|
+
name = compiler.loaders.public_environment_loader.loader_name
|
91
|
+
end
|
92
|
+
|
93
|
+
def compiler
|
94
|
+
@compiler
|
95
|
+
end
|
96
|
+
|
97
|
+
def create_scope(node_name)
|
98
|
+
#options['parameters']
|
99
|
+
#options['facts']
|
100
|
+
#options[:classes]
|
101
|
+
node = create_node(node_name)
|
102
|
+
@compiler = create_compiler(node)
|
103
|
+
scope = Puppet::Parser::Scope.new(compiler)
|
104
|
+
scope.source = Puppet::Resource::Type.new(:node, node_name)
|
105
|
+
scope.parent = @compiler.topscope
|
106
|
+
load_lib_dirs
|
107
|
+
scope
|
108
|
+
end
|
109
|
+
|
110
|
+
def create_compiler(node)
|
111
|
+
Puppet::Parser::Compiler.new(node)
|
112
|
+
end
|
113
|
+
|
114
|
+
def create_node(node_name)
|
115
|
+
Puppet::Node.new(node_name, :environment => puppet_environment)
|
116
|
+
end
|
117
|
+
|
118
|
+
def scope
|
119
|
+
begin
|
120
|
+
Puppet.initialize_settings
|
121
|
+
rescue
|
122
|
+
# do nothing otherwise calling init twice raises an error
|
123
|
+
end
|
124
|
+
@scope ||= create_scope('node_name')
|
125
|
+
end
|
126
|
+
|
127
|
+
def manifests_dir
|
128
|
+
File.join(Puppet[:environmentpath],puppet_env_name,'manifests')
|
129
|
+
end
|
130
|
+
|
131
|
+
def build_node(name, opts = {})
|
132
|
+
opts.merge!({:environment => node_environment})
|
133
|
+
Puppet::Node.new(name, opts)
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
#scope.environment.known_resource_types
|
data/lib/version.rb
CHANGED
data/puppet-repl.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "puppet-repl"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Corey Osman"]
|
12
|
-
s.date = "2016-02-
|
12
|
+
s.date = "2016-02-25"
|
13
13
|
s.description = "A interactive command line tool for evaluating the puppet language"
|
14
14
|
s.email = "corey@nwops.io"
|
15
15
|
s.executables = ["prepl"]
|
@@ -29,10 +29,12 @@ Gem::Specification.new do |s|
|
|
29
29
|
"bin/prepl",
|
30
30
|
"lib/puppet-repl.rb",
|
31
31
|
"lib/puppet-repl/cli.rb",
|
32
|
+
"lib/puppet-repl/support.rb",
|
32
33
|
"lib/version.rb",
|
33
34
|
"puppet-repl.gemspec",
|
34
35
|
"spec/puppet-repl_spec.rb",
|
35
|
-
"spec/spec_helper.rb"
|
36
|
+
"spec/spec_helper.rb",
|
37
|
+
"spec/support_spec.rb"
|
36
38
|
]
|
37
39
|
s.homepage = "http://github.com/nwops/puppet-repl"
|
38
40
|
s.licenses = ["MIT"]
|
data/spec/puppet-repl_spec.rb
CHANGED
@@ -14,7 +14,7 @@ describe "PuppetRepl" do
|
|
14
14
|
'help'
|
15
15
|
end
|
16
16
|
it 'can show the help screen' do
|
17
|
-
repl_output = "
|
17
|
+
repl_output = "Ruby Version: #{RUBY_VERSION}\nPuppet Version: 4.3.2\nPuppet Repl Version: 0.0.1\nCreated by: NWOps <corey@nwops.io>\nType \"exit\", \"functions\", \"types\", \"reset\", \"help\" for more information.\n\n"
|
18
18
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
19
19
|
end
|
20
20
|
end
|
@@ -49,6 +49,22 @@ describe "PuppetRepl" do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
describe 'reset' do
|
53
|
+
before(:each) do
|
54
|
+
repl.handle_input(input)
|
55
|
+
end
|
56
|
+
let(:input) do
|
57
|
+
"file{'/tmp/reset': ensure => present}"
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'can process a each block' do
|
61
|
+
repl.handle_input('reset')
|
62
|
+
repl_output = " => File['/tmp/reset']\n"
|
63
|
+
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
52
68
|
describe 'each block' do
|
53
69
|
let(:input) do
|
54
70
|
"['/tmp/test3', '/tmp/test4'].each |String $path| { file{$path: ensure => present} }"
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe 'support' do
|
5
|
+
|
6
|
+
let(:repl) do
|
7
|
+
PuppetRepl::Cli.new
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:scope) do
|
11
|
+
repl.scope
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:puppet_version) do
|
15
|
+
repl.mod_finder.match(repl.puppet_lib_dir)[1]
|
16
|
+
end
|
17
|
+
|
18
|
+
context '#function_map' do
|
19
|
+
|
20
|
+
it 'should list functions' do
|
21
|
+
func = repl.function_map["#{puppet_version}::hiera"]
|
22
|
+
expect(repl.function_map).to be_instance_of(Hash)
|
23
|
+
expect(func).to eq({:name => 'hiera', :parent => puppet_version})
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should return a puppet version' do
|
29
|
+
expect(puppet_version).to match(/puppet-\d\.\d.\d/)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return lib dirs' do
|
33
|
+
expect(repl.lib_dirs.count).to be >= 1
|
34
|
+
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return module dirs' do
|
39
|
+
expect(repl.module_dirs.count).to be >= 1
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-repl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Osman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet
|
@@ -142,10 +142,12 @@ files:
|
|
142
142
|
- bin/prepl
|
143
143
|
- lib/puppet-repl.rb
|
144
144
|
- lib/puppet-repl/cli.rb
|
145
|
+
- lib/puppet-repl/support.rb
|
145
146
|
- lib/version.rb
|
146
147
|
- puppet-repl.gemspec
|
147
148
|
- spec/puppet-repl_spec.rb
|
148
149
|
- spec/spec_helper.rb
|
150
|
+
- spec/support_spec.rb
|
149
151
|
homepage: http://github.com/nwops/puppet-repl
|
150
152
|
licenses:
|
151
153
|
- MIT
|