chef-cookie_cutter 0.0.4 → 0.1.0

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: 393e8183e4a8bfdf5e0711871b29dae7ad897a3c
4
- data.tar.gz: df372a6b6342845e13a80f81a9a69d44453d33ca
3
+ metadata.gz: 4246908dca8f0d509ebb6cf23c6b8e104ad85394
4
+ data.tar.gz: cd07e7cf228e450988f8fd683006a58dd734c939
5
5
  SHA512:
6
- metadata.gz: 3bc2ffde8f09a5d41a9cfd01c501f609afae97231921a687c3030d9b7dc4f7d00ea987ed6190e123067f1e2a3dda570d6e313c08ac66d173bf506efc89b224fa
7
- data.tar.gz: 0b727fbf2e2a348a722dcb69bd31da7adc4d5d9d4b71ac9cb6da780ac209767689dc8b0ded476ec2d4003cd2d25b4cafc0657dbbbe228d8553ba4bf127b4359e
6
+ metadata.gz: 9578264778f45b5162a75506d2733414b98b362585bd8dd6ebc3a8787887de7eb5d2a6cf9c8d98c7e0b42ab05072f36efc0b499ec47577df56d59798e316677d
7
+ data.tar.gz: 2d27b1efdd5eac956b39403251ee831a1450281f9fd341a6bbb5adf7babfc7aab91fd7fd3350687fda0fa05925c1285dda6e92ddfdbfc5a65ffd472ddf904f47
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright 2015, Ole Claussen <claussen.ole@gmail.com>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ class Chef
19
+ module CookieCutter
20
+ module MonkeyPatches
21
+ module RunContext
22
+ attr_reader :resource_builder
23
+
24
+ def build_resource(builder)
25
+ @resource_builder = builder
26
+ end
27
+ end
28
+
29
+ module ResourceBuilder
30
+ def build(&block)
31
+ run_context.build_resource(self)
32
+ super(&block)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -21,6 +21,7 @@ class Chef
21
21
  class FancyProperty < ::Chef::Property
22
22
  def call(resource, *args, **kwargs, &blk)
23
23
  return get(resource) if args.empty? && kwargs.empty? && !block_given?
24
+ return get(resource) if args[0] == NOT_PASSED
24
25
  set(resource, *args, **kwargs, &blk)
25
26
  end
26
27
 
@@ -43,12 +44,14 @@ class Chef
43
44
  end
44
45
 
45
46
  def coerce(resource, *args, **kwargs, &blk)
46
- if options.key?(:coerce_class) && options.key?(:coerce)
47
+ if options.key?(:coerce_class)
47
48
  value = coerce_class(options[:coerce_class], *args, **kwargs, &blk)
48
- value = coerce_proc(resource, options[:coerce], value)
49
+ value = coerce_proc(resource, options[:coerce], value) if options.key?(:coerce)
50
+ value
51
+ elsif options.key?(:coerce_resource)
52
+ value = coerce_resource(resource, options[:coerce_resource], args[0], &blk)
53
+ value = coerce_proc(resource, options[:coerce], value) if options.key?(:coerce)
49
54
  value
50
- elsif options.key?(:coerce_class)
51
- coerce_class(options[:coerce_class], *args, **kwargs, &blk)
52
55
  elsif options.key?(:coerce)
53
56
  coerce_proc(resource, options[:coerce], *args, **kwargs, &blk)
54
57
  elsif args.length == 1 && kwargs.empty?
@@ -59,13 +62,35 @@ class Chef
59
62
  end
60
63
 
61
64
  def coerce_class(clazz, *args, **kwargs, &blk)
62
- value = clazz.new(*args, **kwargs)
65
+ args << kwargs unless kwargs.empty?
66
+ value = clazz.new(*args)
63
67
  value.instance_eval(&blk) if block_given?
64
68
  value
65
69
  end
66
70
 
71
+ def coerce_resource(resource, resource_type, value, &blk)
72
+ return value if value.is_a?(::Chef::Resource) && value.declared_type == resource_type
73
+ new_resource = ::Chef::ResourceBuilder.new(
74
+ type: resource_type,
75
+ name: value,
76
+ created_at: caller[0],
77
+ params: nil,
78
+ run_context: resource.run_context,
79
+ cookbook_name: resource.cookbook_name,
80
+ recipe_name: resource.recipe_name,
81
+ enclosing_provider: nil
82
+ ).build(&blk)
83
+ resource.run_context.resource_collection.insert(
84
+ new_resource,
85
+ resource_type: resource_type,
86
+ instance_name: value
87
+ )
88
+ new_resource
89
+ end
90
+
67
91
  def coerce_proc(resource, coerce, *args, **kwargs, &blk)
68
- value = resource.instance_exec(*args, **kwargs, &coerce) unless resource.nil?
92
+ args << kwargs unless kwargs.empty?
93
+ value = resource.instance_exec(*args, &coerce) unless resource.nil?
69
94
  value.instance_eval(&blk) if block_given?
70
95
  value = coerce(resource, value) if value.is_a?(DelayedEvaluator)
71
96
  value
@@ -73,24 +98,42 @@ class Chef
73
98
 
74
99
  def emit_dsl
75
100
  return unless instance_variable_name
76
- # Holy shit, this looks evil. But Chef does it the same way so yeah.
77
- declared_in.class_eval <<-EOM, __FILE__, __LINE__ + 1
78
- def #{name}(*args, **kwargs, &blk)
79
- self.class.properties[#{name.inspect}].call(self, *args, **kwargs, &blk)
80
- end
81
- EOM
101
+
102
+ if allow_kwargs?
103
+ declared_in.class_eval <<-EOM, __FILE__, __LINE__ + 1
104
+ def #{name}(*args, **kwargs, &blk)
105
+ self.class.properties[#{name.inspect}].call(self, *args, **kwargs, &blk)
106
+ end
107
+ EOM
108
+ else
109
+ declared_in.class_eval <<-EOM, __FILE__, __LINE__ + 1
110
+ def #{name}(value=NOT_PASSED, &blk)
111
+ self.class.properties[#{name.inspect}].call(self, value, {}, &blk)
112
+ end
113
+ def #{name}=(value)
114
+ self.class.properties[#{name.inspect}].set(self, value, {})
115
+ end
116
+ EOM
117
+ end
82
118
  end
83
119
 
84
120
  def collect?
85
121
  options[:collect]
86
122
  end
87
123
 
124
+ def allow_kwargs?
125
+ return true if options[:allow_kwargs]
126
+ return true if options.key?(:coerce) && options[:coerce].arity != 1
127
+ return true if options.key?(:coerce_class) && options[:coerce_class].instance_method(:initialize).arity != 1
128
+ false
129
+ end
130
+
88
131
  def validation_options
89
132
  @validation_options ||= options.reject do |k, _|
90
133
  [
91
134
  :declared_in, :name, :instance_variable_name, :desired_state,
92
135
  :identity, :default, :name_property, :coerce, :required, :collect,
93
- :coerce_class
136
+ :allow_kwargs, :coerce_class, :coerce_resource
94
137
  ].include?(k)
95
138
  end
96
139
  end
@@ -29,6 +29,7 @@ class Chef
29
29
 
30
30
  require_relative 'cookie_cutter/fancy_property' if chef_version('~> 12.5')
31
31
 
32
+ require_relative 'cookie_cutter/extended_provides'
32
33
  require_relative 'cookie_cutter/lwrp_build_params'
33
34
  require_relative 'cookie_cutter/lwrp_include'
34
35
  require_relative 'cookie_cutter/namespace'
@@ -41,6 +42,8 @@ CC = Chef::CookieCutter
41
42
 
42
43
  # Register Monkey Patches
43
44
  Chef::Node.send :prepend, CC::MonkeyPatches::Node
45
+ Chef::RunContext.send :prepend, CC::MonkeyPatches::RunContext
46
+ Chef::ResourceBuilder.send :prepend, CC::MonkeyPatches::ResourceBuilder
44
47
  Chef::Resource::LWRPBase.send :prepend, CC::MonkeyPatches::LWRPResource
45
48
  Chef::Provider::LWRPBase.send :prepend, CC::MonkeyPatches::LWRPProvider
46
49
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-cookie_cutter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ole Claussen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-11 00:00:00.000000000 Z
11
+ date: 2015-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.34'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.3'
55
69
  description: A small collection of Chef hacks and workarounds.
56
70
  email: claussen.ole@gmail.com
57
71
  executables: []
@@ -59,6 +73,7 @@ extensions: []
59
73
  extra_rdoc_files: []
60
74
  files:
61
75
  - lib/chef/cookie_cutter.rb
76
+ - lib/chef/cookie_cutter/extended_provides.rb
62
77
  - lib/chef/cookie_cutter/fancy_property.rb
63
78
  - lib/chef/cookie_cutter/lwrp_build_params.rb
64
79
  - lib/chef/cookie_cutter/lwrp_include.rb