puppet-function-updater 0.0.3 → 0.0.4
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/CHANGELOG.md +5 -0
- data/README.md +51 -7
- data/bin/puppet_function_updater +1 -1
- data/lib/pfu/generator.rb +13 -2
- data/lib/pfu/parser.rb +1 -1
- data/lib/pfu/version.rb +1 -1
- data/templates/function_spec.erb +41 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5913312054d42bd2b3bfdcb744600991f0b23aa09a4763153f48f0cddb2f355
|
4
|
+
data.tar.gz: 8734defb6ff4b41c8e99dcd2baad098aa58a3534d2ed4bb61ba244535d405a63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4ddd547257eca3091c81ca70f85a8ce81d371f2f409f335079cb26fc3fe263b2698cf0fe1c71d2a688662f031127b1212a27d169e9d1c6fe9054d9a3b02d83c
|
7
|
+
data.tar.gz: 3b987e1bce14d1b7d4f74c459911975cadd43816b38da43e6ce70d64da5f976f98acb580f91e8276ebcb549f29c81ca807631618ce6f8558322c5f067dbaf764
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -17,8 +17,52 @@ $ gem install puppet-function-updater
|
|
17
17
|
|
18
18
|
## Usage
|
19
19
|
|
20
|
-
Run the command
|
21
|
-
inspect all the generated functions for suitability.
|
20
|
+
Run the command puppet_function_updater in the root of a Puppet module, then
|
21
|
+
inspect all the generated functions for suitability when it’s done. If you pass
|
22
|
+
the --clean argument it will **delete the legacy function file from disk** after
|
23
|
+
validating that the new function works.
|
24
|
+
|
25
|
+
You might see some warnings. Many can be ignored. For example, the following
|
26
|
+
warning just means that the function attempted to require a library file outside
|
27
|
+
of the the function block. You might evaluate whether you could remove the call
|
28
|
+
or move it inside the function declaration so it's lazily loaded.
|
29
|
+
|
30
|
+
```
|
31
|
+
INFO: Creating lib/puppet/functions/stdlib/deep_merge.rb
|
32
|
+
WARN: The function attempted to load libraries outside the function block.
|
33
|
+
WARN: cannot load such file -- puppet/parser/functions (ignored)
|
34
|
+
```
|
35
|
+
|
36
|
+
On the other hand, errors like below indicate that the function code doesn't parse
|
37
|
+
properly after porting. It's generally an issue with the original source code.
|
38
|
+
|
39
|
+
```
|
40
|
+
INFO: Creating lib/puppet/functions/stdlib/validate_x509_rsa_key_pair.rb
|
41
|
+
ERROR: Oh crap; the generated function isn't valid Ruby code!
|
42
|
+
ERROR: <compiled>:47: dynamic constant assignment
|
43
|
+
NUM_ARGS = 2 unless defined? NUM_ARGS
|
44
|
+
^
|
45
|
+
```
|
46
|
+
|
47
|
+
### After porting
|
48
|
+
|
49
|
+
Two files will be generated, the function file and the spec test for that function.
|
50
|
+
|
51
|
+
* `lib/puppet/functions/<namespace>/<function>.rb`
|
52
|
+
* `spec/functions/<namespace>_<function>_spec.rb`
|
53
|
+
|
54
|
+
After porting, you should inspect the generated files. At a minimum, you'll want
|
55
|
+
to clean up the documentation comments, but I'd also suggest reading a bit on the
|
56
|
+
new function API and writing better dispatches to provide proper type checking
|
57
|
+
and reduce the amount of manual argument validation your function must do.
|
58
|
+
|
59
|
+
The test simply validates that the function compiles and defines a function
|
60
|
+
properly, so you'll also want to write more test cases. If your legacy function
|
61
|
+
has unit tests, you might consider porting them to the new function, following
|
62
|
+
the examples provided as comments.
|
63
|
+
|
64
|
+
See a [tutorial](https://binford2k.com/2019/11/27/automagic-function-port/) on its usage on my blog.
|
65
|
+
|
22
66
|
|
23
67
|
### Example:
|
24
68
|
|
@@ -42,7 +86,7 @@ INFO: Creating lib/puppet/functions/stdlib/concat.rb
|
|
42
86
|
INFO: Creating lib/puppet/functions/stdlib/convert_base.rb
|
43
87
|
INFO: Creating lib/puppet/functions/stdlib/count.rb
|
44
88
|
INFO: Creating lib/puppet/functions/stdlib/deep_merge.rb
|
45
|
-
|
89
|
+
WARN: The function attempted to load libraries outside the function block.
|
46
90
|
WARN: cannot load such file -- puppet/parser/functions (ignored)
|
47
91
|
INFO: Creating lib/puppet/functions/stdlib/defined_with_params.rb
|
48
92
|
INFO: Creating lib/puppet/functions/stdlib/delete.rb
|
@@ -60,10 +104,10 @@ INFO: Creating lib/puppet/functions/stdlib/downcase.rb
|
|
60
104
|
INFO: Creating lib/puppet/functions/stdlib/empty.rb
|
61
105
|
INFO: Creating lib/puppet/functions/stdlib/enclose_ipv6.rb
|
62
106
|
INFO: Creating lib/puppet/functions/stdlib/ensure_packages.rb
|
63
|
-
|
107
|
+
WARN: The function attempted to load libraries outside the function block.
|
64
108
|
WARN: cannot load such file -- puppet/parser/functions (ignored)
|
65
109
|
INFO: Creating lib/puppet/functions/stdlib/ensure_resource.rb
|
66
|
-
|
110
|
+
WARN: The function attempted to load libraries outside the function block.
|
67
111
|
WARN: cannot load such file -- puppet/parser/functions (ignored)
|
68
112
|
INFO: Creating lib/puppet/functions/stdlib/ensure_resources.rb
|
69
113
|
INFO: Creating lib/puppet/functions/stdlib/flatten.rb
|
@@ -72,7 +116,7 @@ INFO: Creating lib/puppet/functions/stdlib/fqdn_rand_string.rb
|
|
72
116
|
INFO: Creating lib/puppet/functions/stdlib/fqdn_rotate.rb
|
73
117
|
INFO: Creating lib/puppet/functions/stdlib/fqdn_uuid.rb
|
74
118
|
INFO: Creating lib/puppet/functions/stdlib/get_module_path.rb
|
75
|
-
|
119
|
+
WARN: The function attempted to load libraries outside the function block.
|
76
120
|
WARN: cannot load such file -- puppet/parser/functions (ignored)
|
77
121
|
INFO: Creating lib/puppet/functions/stdlib/getparam.rb
|
78
122
|
INFO: Creating lib/puppet/functions/stdlib/getvar.rb
|
@@ -153,7 +197,7 @@ INFO: Creating lib/puppet/functions/stdlib/validate_absolute_path.rb
|
|
153
197
|
INFO: Creating lib/puppet/functions/stdlib/validate_array.rb
|
154
198
|
INFO: Creating lib/puppet/functions/stdlib/validate_augeas.rb
|
155
199
|
INFO: Creating lib/puppet/functions/stdlib/validate_bool.rb
|
156
|
-
|
200
|
+
WARN: The function attempted to load libraries outside the function block.
|
157
201
|
WARN: cannot load such file -- puppet/util/execution (ignored)
|
158
202
|
INFO: Creating lib/puppet/functions/stdlib/validate_cmd.rb
|
159
203
|
INFO: Creating lib/puppet/functions/stdlib/validate_domain_name.rb
|
data/bin/puppet_function_updater
CHANGED
data/lib/pfu/generator.rb
CHANGED
@@ -4,8 +4,11 @@ require 'fileutils'
|
|
4
4
|
class Pfu::Generator
|
5
5
|
def self.write(opts)
|
6
6
|
newpath = "lib/puppet/functions/#{opts[:namespace]}/#{opts[:name]}.rb"
|
7
|
-
|
8
|
-
|
7
|
+
specpath = "spec/functions/#{opts[:namespace]}_#{opts[:name]}_spec.rb"
|
8
|
+
|
9
|
+
[newpath, specpath].each do |path|
|
10
|
+
next unless File.exist?(path)
|
11
|
+
$logger.error "Cowardly refusing to overwrite #{path}"
|
9
12
|
return
|
10
13
|
end
|
11
14
|
|
@@ -19,6 +22,9 @@ class Pfu::Generator
|
|
19
22
|
template = File.join(File.dirname(__FILE__), '..', '..', 'templates', 'function.erb')
|
20
23
|
contents = ERB.new(File.read(template), nil, '-').result(binding)
|
21
24
|
|
25
|
+
template = File.join(File.dirname(__FILE__), '..', '..', 'templates', 'function_spec.erb')
|
26
|
+
specfile = ERB.new(File.read(template), nil, '-').result(binding)
|
27
|
+
|
22
28
|
$logger.info "Creating #{newpath}"
|
23
29
|
$logger.debug "Function contents:\n#{contents}"
|
24
30
|
|
@@ -26,8 +32,13 @@ class Pfu::Generator
|
|
26
32
|
# syntax check the code before writing it
|
27
33
|
# TODO: validate that it actually creates a puppet function
|
28
34
|
RubyVM::InstructionSequence.compile(contents)
|
35
|
+
|
29
36
|
FileUtils.mkdir_p("lib/puppet/functions/#{opts[:namespace]}")
|
30
37
|
File.write(newpath, contents)
|
38
|
+
|
39
|
+
FileUtils.mkdir_p("spec/functions")
|
40
|
+
File.write(specpath, specfile)
|
41
|
+
|
31
42
|
return true
|
32
43
|
rescue Exception => e
|
33
44
|
$logger.error "Oh crap; the generated function isn't valid Ruby code!"
|
data/lib/pfu/parser.rb
CHANGED
@@ -17,7 +17,7 @@ module Kernel
|
|
17
17
|
def require(*a, &b)
|
18
18
|
original_require(*a, &b)
|
19
19
|
rescue LoadError => e
|
20
|
-
$logger.
|
20
|
+
$logger.warn "The function attempted to load libraries outside the function block."
|
21
21
|
$logger.warn "#{e.message} (ignored)"
|
22
22
|
end
|
23
23
|
end
|
data/lib/pfu/version.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe '<%= opts[:fullname] %>' do
|
4
|
+
# without knowing details about the implementation, this is the only test
|
5
|
+
# case that we can autogenerate. You should add more examples below!
|
6
|
+
it { is_expected.not_to eq(nil) }
|
7
|
+
|
8
|
+
#################################
|
9
|
+
# Below are some example test cases. You may uncomment and modify them to match
|
10
|
+
# your needs. Notice that they all expect the base error class of `StandardError`.
|
11
|
+
# This is because the autogenerated function uses an untyped array for parameters
|
12
|
+
# and relies on your implementation to do the validation. As you convert your
|
13
|
+
# function to proper dispatches and typed signatures, you should change the
|
14
|
+
# expected error of the argument validation examples to `ArgumentError`.
|
15
|
+
#
|
16
|
+
# Other error types you might encounter include
|
17
|
+
#
|
18
|
+
# * StandardError
|
19
|
+
# * ArgumentError
|
20
|
+
# * Puppet::ParseError
|
21
|
+
#
|
22
|
+
# Read more about writing function unit tests at https://rspec-puppet.com/documentation/functions/
|
23
|
+
#
|
24
|
+
# it 'raises an error if called with no argument' do
|
25
|
+
# is_expected.to run.with_params.and_raise_error(StandardError)
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# it 'raises an error if there is more than 1 arguments' do
|
29
|
+
# is_expected.to run.with_params({ 'foo' => 1 }, 'bar' => 2).and_raise_error(StandardError)
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# it 'raises an error if argument is not the proper type' do
|
33
|
+
# is_expected.to run.with_params('foo').and_raise_error(StandardError)
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# it 'returns the proper output' do
|
37
|
+
# is_expected.to run.with_params(123).and_return('the expected output')
|
38
|
+
# end
|
39
|
+
#################################
|
40
|
+
|
41
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-function-updater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Ford
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-11-
|
11
|
+
date: 2019-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
Run this command with a space separated list of either function file paths, or
|
@@ -33,6 +33,7 @@ files:
|
|
33
33
|
- lib/puppet/functions/testing/module.rb
|
34
34
|
- lib/puppet/functions/testing/noopts.rb
|
35
35
|
- templates/function.erb
|
36
|
+
- templates/function_spec.erb
|
36
37
|
homepage:
|
37
38
|
licenses:
|
38
39
|
- Apache-2.0
|