rspec-puppet-utils 1.0.0 → 1.0.1

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
  SHA512:
3
- metadata.gz: 73d31647aca9a8ea92a51e91875d9428ddf36d65522e540205bd22fc056c577c025bac30e777479234c390977a1b13d815a64ebb5a33e742543e489b59493d80
4
- data.tar.gz: 875c88ed3de884c3acdf8341e3dc675d011fba4f04b112ac3f9cb370580af86ba5ec9d256c0f82c62787b151035903bc1e5e40b11b3f8b1a1ac8cfab6026c2a6
3
+ metadata.gz: 41a4497de981008000489d01e33176c07417196b7cbcb55479d24c66c2906a91ce39869e431fe0ee11f7b7efb5224f51a2e33dfe463681cf3eb5909efae42ac9
4
+ data.tar.gz: aebf955a77f6235a8259c89186bdb5544a912c12ec8daa6de71715840c6fa58dbc1c816917289311f862f3a131f2fe82825772da41b74e84b25dcef399fa3806
5
5
  SHA1:
6
- metadata.gz: a44abeac9ab5e7f480bc8a9e0d1587cd41e8d596
7
- data.tar.gz: 69010a95237c2e8c0c0e8777b266e98d7c00e3ae
6
+ metadata.gz: 45f31b9cc95b9c2a29aba88d9ddb3dac85b81d28
7
+ data.tar.gz: 5beeeb27784486ac29730b0bb082a971fc46ad92
@@ -0,0 +1,25 @@
1
+
2
+ module HieraData
3
+
4
+ class Validator
5
+
6
+ attr_accessor :data
7
+
8
+ def validate?(key, &block)
9
+
10
+ raise StandardError, '@data is nil, try load() first' unless @data
11
+ raise StandardError, '@data is empty' if @data.empty?
12
+
13
+ found = false
14
+ @data.keys.each do |file|
15
+ if @data[file].has_key? key
16
+ found = true
17
+ valid = block.call(@data[file][key])
18
+ raise StandardError, "Key #{key} is not valid in file #{file}" unless valid
19
+ end
20
+ end
21
+ raise StandardError, "Key #{key} was not found in any files" unless found
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,40 @@
1
+ require 'hieradata/validator'
2
+ require 'yaml'
3
+
4
+ module HieraData
5
+
6
+ class YamlValidator < Validator
7
+
8
+ def initialize(directory, extensions = ['yaml', 'yml'])
9
+ raise ArgumentError, 'extensions should be an Array' unless extensions.is_a? Array
10
+ @directory = directory
11
+ @extensions = extensions.map {|ext| ext =~ /\..*/ ? ext : ".#{ext}" }
12
+ end
13
+
14
+ def load(ignore_empty = false)
15
+
16
+ files = Dir.glob(File.join(@directory, '**', '*')).reject { |path|
17
+ File.directory?(path) || !@extensions.include?(File.extname path )
18
+ }
19
+
20
+ @data = {}
21
+ files.each { |file|
22
+
23
+ # Assume all file names are unique i.e. thing.yaml and thing.yml don't both exist
24
+ file_name = File.basename(file).split('.').first
25
+
26
+ begin
27
+ yaml = File.open(file) { |yf|
28
+ YAML::load( yf )
29
+ }
30
+ rescue ArgumentError => e
31
+ raise StandardError, "Yaml Syntax error in file #{file}: #{e.message}"
32
+ end
33
+ raise StandardError, "Yaml file is empty: #{file}" if !yaml && !ignore_empty
34
+
35
+ @data[file_name.to_sym] = yaml
36
+ }
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,27 @@
1
+ require 'rspec-puppet'
2
+
3
+ class MockFunction
4
+
5
+ attr_accessor :function_type, :has_default_value, :default_value
6
+
7
+ def initialize(example_group, name, options = {})
8
+ opts = options.nil? ? {} : options
9
+
10
+ @function_type = opts.has_key?(:type) ? opts[:type] : :rvalue
11
+
12
+ opts[:default_value] = nil if @function_type == :statement
13
+
14
+ @has_default_value = false
15
+ if opts.has_key?(:default_value)
16
+ @has_default_value = true
17
+ @default_value = opts[:default_value]
18
+ end
19
+
20
+ this = self
21
+ example_group.before(:each) {
22
+ Puppet::Parser::Functions.newfunction(name.to_sym, {:type => this.function_type}) { |args| this.call(args) }
23
+ this.stubs(:call).returns(this.default_value) if this.has_default_value
24
+ }
25
+ end
26
+
27
+ end
@@ -1,64 +1,10 @@
1
- require 'rspec-puppet'
1
+ require 'rspec'
2
2
  require 'mocha'
3
- require 'erb'
3
+ require 'lib/mock_function'
4
+ require 'lib/template_harness'
5
+ require 'lib/hieradata/validator'
6
+ require 'lib/hieradata/yaml_validator'
4
7
 
5
8
  RSpec.configure do |c|
6
9
  c.mock_with :mocha
7
10
  end
8
-
9
- class MockFunction
10
-
11
- attr_accessor :function_type, :has_default_value, :default_value
12
-
13
- def initialize(example_group, name, options = {})
14
- opts = options.nil? ? {} : options
15
-
16
- @function_type = opts.has_key?(:type) ? opts[:type] : :rvalue
17
-
18
- opts[:default_value] = nil if @function_type == :statement
19
-
20
- @has_default_value = false
21
- if opts.has_key?(:default_value)
22
- @has_default_value = true
23
- @default_value = opts[:default_value]
24
- end
25
-
26
- this = self
27
- example_group.before(:each) {
28
- Puppet::Parser::Functions.newfunction(name.to_sym, {:type => this.function_type}) { |args| this.call(args) }
29
- this.stubs(:call).returns(this.default_value) if this.has_default_value
30
- }
31
- end
32
- end
33
-
34
- class TemplateHarness
35
-
36
- def initialize(template, scope = nil)
37
- @template = template
38
- @isolator = Isolator.new(scope)
39
- end
40
-
41
- def set(name, value)
42
- var_name = name.start_with?('@') ? name : "@#{name}"
43
- @isolator.instance_variable_set(var_name, value)
44
- end
45
-
46
- def run
47
- b = @isolator.get_binding
48
- template = File.exists?(@template) ? File.new(@template).read : @template
49
- ERB.new(template, 0, '-').result b
50
- end
51
-
52
- class Isolator
53
- # Isolates the binding so that only the defined set
54
- # of instance variables are available to erb
55
- def initialize scope
56
- @scope = scope
57
- end
58
- def get_binding
59
- scope = @scope
60
- binding
61
- end
62
- end
63
-
64
- end
@@ -0,0 +1,33 @@
1
+ require 'erb'
2
+
3
+ class TemplateHarness
4
+
5
+ def initialize(template, scope = nil)
6
+ @template = template
7
+ @isolator = Isolator.new(scope)
8
+ end
9
+
10
+ def set(name, value)
11
+ var_name = name.start_with?('@') ? name : "@#{name}"
12
+ @isolator.instance_variable_set(var_name, value)
13
+ end
14
+
15
+ def run
16
+ b = @isolator.get_binding
17
+ template = File.exists?(@template) ? File.new(@template).read : @template
18
+ ERB.new(template, 0, '-').result b
19
+ end
20
+
21
+ class Isolator
22
+ # Isolates the binding so that only the defined set
23
+ # of instance variables are available to erb
24
+ def initialize scope
25
+ @scope = scope
26
+ end
27
+ def get_binding
28
+ scope = @scope
29
+ binding
30
+ end
31
+ end
32
+
33
+ end
@@ -1,8 +1,8 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |gem|
3
3
  gem.name = 'rspec-puppet-utils'
4
- gem.version = '1.0.0'
5
- gem.description = 'Helper classes for mock functions and templates'
4
+ gem.version = '1.0.1'
5
+ gem.description = 'Helper classes for mock/stub functions, templates and hierdata'
6
6
  gem.summary = ''
7
7
  gem.author = 'Tom Poulton'
8
8
  #gem.license = ''
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+ require 'lib/hieradata/validator'
3
+
4
+ module HieraData
5
+ class Test < Validator
6
+ def load
7
+ @data = {
8
+ :file1 => {
9
+ 'key' => 'value',
10
+ :other => 'other value',
11
+ 'missmatch' => 'string'
12
+ },
13
+ :file2 => {
14
+ 'hello' => 'world',
15
+ 'missmatch' => ['array']
16
+ }
17
+ }
18
+ end
19
+ def load_empty
20
+ @data = {}
21
+ end
22
+ end
23
+ end
24
+
25
+ describe HieraData::Validator do
26
+
27
+ validator = HieraData::Test.new
28
+ validator.load
29
+
30
+ it 'should have public data variable' do
31
+ expect(validator.data).to have_key :file1
32
+ end
33
+
34
+ it 'should use block to validate key' do
35
+ expect {
36
+ validator.validate?('key') { |v| v == 'value' }
37
+ }.to_not raise_error
38
+
39
+ expect {
40
+ validator.validate?('key') { |v| v == 'oooops' }
41
+ }.to raise_error StandardError, /Key key is not valid in file/
42
+ end
43
+
44
+ it 'should accept symbol as key' do
45
+ expect {
46
+ validator.validate?(:other) { |v| v == 'other value' }
47
+ }.to_not raise_error
48
+ end
49
+
50
+ it 'should validate key in all files' do
51
+ expect {
52
+ validator.validate?('missmatch') { |v| v.is_a? String }
53
+ }.to raise_error StandardError, /Key missmatch is not valid in file file2/
54
+ end
55
+
56
+ it 'should raise error if data is nil' do
57
+ nil_validator = HieraData::Test.new
58
+ expect {
59
+ nil_validator.validate?('meh') { }
60
+ }.to raise_error StandardError, /@data is nil, try load\(\) first/
61
+ end
62
+
63
+ it 'should raise error if data is empty' do
64
+ empty_validator = HieraData::Test.new
65
+ empty_validator.load_empty
66
+ expect {
67
+ empty_validator.validate?('meh') { }
68
+ }.to raise_error StandardError, /@data is empty/
69
+ end
70
+
71
+ end
@@ -0,0 +1,72 @@
1
+ require 'lib/hieradata/yaml_validator'
2
+
3
+ describe HieraData::YamlValidator do
4
+
5
+ it 'should be of type Validator' do
6
+ validator = HieraData::YamlValidator.new('spec/fixtures/hieradata/valid')
7
+ expect(validator).to be_a_kind_of HieraData::Validator
8
+ end
9
+
10
+ context 'with valid yaml' do
11
+
12
+ validator = HieraData::YamlValidator.new('spec/fixtures/hieradata/valid')
13
+ validator.load
14
+
15
+ it 'should load yaml files into data' do
16
+ expect(validator.data.keys.size).to_not be 0
17
+ end
18
+
19
+ it 'should load yaml files recursively' do
20
+ expect(validator.data.keys).to include :nested
21
+ end
22
+
23
+ it 'should load yaml data from files' do
24
+ expect(validator.data[:valid]['string-value']).to eq 'a string'
25
+ end
26
+
27
+ end
28
+
29
+ context 'with multiple extensions' do
30
+
31
+ validator = HieraData::YamlValidator.new('spec/fixtures/hieradata/valid', ['yaml', 'foo'])
32
+ validator.load
33
+
34
+ it 'should load yml files into data' do
35
+ expect(validator.data).to have_key :other
36
+ end
37
+
38
+ end
39
+
40
+ context 'with extensions as string' do
41
+
42
+ it 'should load yml files into data' do
43
+ expect { HieraData::YamlValidator.new('meh', 'whooops') }.to raise_error ArgumentError, /extensions should be an Array/
44
+ end
45
+
46
+ end
47
+
48
+ context 'with invalid yaml' do
49
+
50
+ validator = HieraData::YamlValidator.new('spec/fixtures/hieradata/invalid')
51
+
52
+ it 'should raise error with syntax error' do
53
+ expect { validator.load }.to raise_error StandardError, /Yaml Syntax error in file .*\/invalid.yaml/
54
+ end
55
+
56
+ end
57
+
58
+ context 'with empty yaml' do
59
+
60
+ validator = HieraData::YamlValidator.new('spec/fixtures/hieradata/empty')
61
+
62
+ it 'should raise error' do
63
+ expect { validator.load }.to raise_error StandardError, /Yaml file is empty: .*\/empty.yaml/
64
+ end
65
+
66
+ it 'should ignore empty files when flag is set' do
67
+ expect { validator.load true }.to_not raise_error
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'rspec-puppet-utils'
2
+ require 'lib/mock_function'
3
3
 
4
4
  describe MockFunction do
5
5
 
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
- require 'rspec-puppet-utils'
2
+ require 'lib/template_harness'
3
3
 
4
4
  describe TemplateHarness do
5
5
 
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'rspec-puppet-utils'
3
+
4
+ describe 'rspec-puppet-utils' do
5
+
6
+ it 'should require MockFunction' do
7
+ expect { MockFunction.class }.to_not raise_error
8
+ end
9
+
10
+ it 'should require TemplateHarness' do
11
+ expect { TemplateHarness.class }.to_not raise_error
12
+ end
13
+
14
+ it 'should require HieraData Validator' do
15
+ expect { HieraData::Validator.class }.to_not raise_error
16
+ end
17
+
18
+ it 'should require HieraData YamlValidator' do
19
+ expect { HieraData::YamlValidator.class }.to_not raise_error
20
+ end
21
+
22
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ # missing : between key and value
3
+ 'hello' 'world'
@@ -0,0 +1,2 @@
1
+ ---
2
+ 'smtp': 25
@@ -0,0 +1,2 @@
1
+ ---
2
+ 'hello': 'world'
@@ -0,0 +1,2 @@
1
+ ---
2
+ 'string-value' : 'a string'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-puppet-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Poulton
@@ -9,10 +9,10 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2014-03-04 00:00:00 Z
12
+ date: 2014-03-11 00:00:00 Z
13
13
  dependencies: []
14
14
 
15
- description: Helper classes for mock functions and templates
15
+ description: Helper classes for mock/stub functions, templates and hierdata
16
16
  email:
17
17
  executables: []
18
18
 
@@ -25,10 +25,22 @@ files:
25
25
  - Gemfile
26
26
  - README.md
27
27
  - Rakefile
28
+ - lib/hieradata/validator.rb
29
+ - lib/hieradata/yaml_validator.rb
30
+ - lib/mock_function.rb
28
31
  - lib/rspec-puppet-utils.rb
32
+ - lib/template_harness.rb
29
33
  - rspec-puppet-utils.gemspec
34
+ - spec/classes/hieradata/validator_spec.rb
35
+ - spec/classes/hieradata/yaml_validator_spec.rb
30
36
  - spec/classes/mock_function_spec.rb
31
37
  - spec/classes/template_harness_spec.rb
38
+ - spec/classes/utils_spec.rb
39
+ - spec/fixtures/hieradata/empty/empty.yaml
40
+ - spec/fixtures/hieradata/invalid/invalid.yaml
41
+ - spec/fixtures/hieradata/valid/other.foo
42
+ - spec/fixtures/hieradata/valid/sub/nested.yaml
43
+ - spec/fixtures/hieradata/valid/valid.yaml
32
44
  - spec/fixtures/templates/returns_elephant.erb
33
45
  - spec/spec_helper.rb
34
46
  homepage: https://github.com/Accuity/rspec-puppet-utils
@@ -58,7 +70,15 @@ signing_key:
58
70
  specification_version: 4
59
71
  summary: ""
60
72
  test_files:
73
+ - spec/classes/hieradata/validator_spec.rb
74
+ - spec/classes/hieradata/yaml_validator_spec.rb
61
75
  - spec/classes/mock_function_spec.rb
62
76
  - spec/classes/template_harness_spec.rb
77
+ - spec/classes/utils_spec.rb
78
+ - spec/fixtures/hieradata/empty/empty.yaml
79
+ - spec/fixtures/hieradata/invalid/invalid.yaml
80
+ - spec/fixtures/hieradata/valid/other.foo
81
+ - spec/fixtures/hieradata/valid/sub/nested.yaml
82
+ - spec/fixtures/hieradata/valid/valid.yaml
63
83
  - spec/fixtures/templates/returns_elephant.erb
64
84
  - spec/spec_helper.rb