halite 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e31ce37e3c552a468e47471ddca26379265e6ee
4
- data.tar.gz: 0b3404564d2f9687e26c0b132d6b0efcdb075cd8
3
+ metadata.gz: 3bd9453c15ddb7b58021da152d53ee281e00e13e
4
+ data.tar.gz: 641b09025f131006f0707625a4f22a475deac522
5
5
  SHA512:
6
- metadata.gz: 8a1d326bf0b05463d54b2eee1d75d99bcf975a8f396b313183b29ecd61e40874e3da881f66510d1aa4beee89f55dda5663c16db39b410f2777f8aa7dd5c728f0
7
- data.tar.gz: d5bc501dc9431f2a2af53b63084da17c3f2150ace12000e52b7dee2b06759cc1815e447bb4a92c4911e78cea14e90cfd5b4f40f74fe42a065cff3a84d6cdd305
6
+ metadata.gz: 7bdb648670ef4bc5afdb954e7c5f769c8bf643f8e58c6065c63211e90e4bfc5336cf358d68313585e53b31e0bad5c70b647c858f2f51d917cb921fbc603e7c19
7
+ data.tar.gz: 36c524bb699a35b9a7c3f772e56d74cf220cc8e1a41df349dfcb632f52d9a815f0fc515922999457394d54fdc71ff91cc4c3cb097876df0b898301c247899c44
@@ -1,5 +1,10 @@
1
1
  # Halite Changelog
2
2
 
3
+ ## v1.6.0
4
+
5
+ * Chef 13 compatibility.
6
+ * Structural supports for gathering development dependencies for cookbook gems.
7
+
3
8
  ## v1.5.0
4
9
 
5
10
  * Set the default spec platform and version even when using the Halite runner
@@ -39,11 +39,17 @@ module Halite
39
39
  end
40
40
  end
41
41
 
42
- def self.extract(spec)
42
+ # Extract the cookbook dependencies from a gem specification.
43
+ #
44
+ # @since 1.6.0 Added development parameter.
45
+ # @param spec [Gem::Specification] Gem to extract from.
46
+ # @param development [Boolean] If true, consider development depencies.
47
+ # @return [Array<Halite::Dependencies::Dependency>]
48
+ def self.extract(spec, development: false)
43
49
  deps = []
44
50
  deps += clean_and_tag(extract_from_requirements(spec), :requirements)
45
51
  deps += clean_and_tag(extract_from_metadata(spec), :metadata)
46
- deps += clean_and_tag(extract_from_dependencies(spec), :dependencies)
52
+ deps += clean_and_tag(extract_from_dependencies(spec, development: development), :dependencies)
47
53
  deps
48
54
  end
49
55
 
@@ -58,10 +64,10 @@ module Halite
58
64
  spec.metadata.fetch('halite_dependencies', '').split(/,/)
59
65
  end
60
66
 
61
- def self.extract_from_dependencies(spec)
67
+ def self.extract_from_dependencies(spec, development: false)
62
68
  # Find any gem dependencies that are cookbooks in disguise.
63
69
  spec.dependencies.select do |dep|
64
- dep.type == :runtime && Gem.new(dep).is_halite_cookbook?
70
+ (development || dep.type == :runtime) && Gem.new(dep).is_halite_cookbook?
65
71
  end.map do |dep|
66
72
  gem = Gem.new(dep)
67
73
  [gem.cookbook_name] + dep.requirements_list + [gem.spec]
@@ -156,8 +156,8 @@ module Halite
156
156
  each_file(spec.require_paths, &block)
157
157
  end
158
158
 
159
- def cookbook_dependencies
160
- @cookbook_dependencies ||= Dependencies.extract(spec)
159
+ def cookbook_dependencies(development: false)
160
+ Dependencies.extract(spec, development: development)
161
161
  end
162
162
 
163
163
  # Is this gem really a cookbook? (anything that depends directly on halite and doesn't have the ignore flag)
@@ -175,10 +175,17 @@ module Halite
175
175
  # Put this in a local variable for a closure below.
176
176
  path = spec.full_gem_path
177
177
  Chef::CookbookVersion.new(cookbook_name, File.join(path, 'chef')).tap do |c|
178
- c.attribute_filenames = each_file('chef/attributes').map(&:first)
179
- c.file_filenames = each_file('chef/files').map(&:first)
180
- c.recipe_filenames = each_file('chef/recipes').map(&:first)
181
- c.template_filenames = each_file('chef/templates').map(&:first)
178
+ # Use CookbookVersion#files_for as a feature test for ManifestV2. This
179
+ # can be changed to ::Gem::Requirement.create('>= 13').satisfied_by?(::Gem::Version.create(Chef::VERSION))
180
+ # once https://github.com/chef/chef/pull/5929 is merged.
181
+ if defined?(c.files_for)
182
+ c.all_files = each_file('chef').map(&:first)
183
+ else
184
+ c.attribute_filenames = each_file('chef/attributes').map(&:first)
185
+ c.file_filenames = each_file('chef/files').map(&:first)
186
+ c.recipe_filenames = each_file('chef/recipes').map(&:first)
187
+ c.template_filenames = each_file('chef/templates').map(&:first)
188
+ end
182
189
  # Haxx, rewire the filevendor for this cookbook to look up in our folder.
183
190
  # This is touching two different internal interfaces, but ¯\_(ツ)_/¯
184
191
  c.send(:file_vendor).define_singleton_method(:get_filename) do |filename|
@@ -264,7 +264,7 @@ module Halite
264
264
  # end
265
265
  # it { is_expected.to run_my_resource('test').with(path: '/tmp') }
266
266
  # end
267
- def resource(name, auto: true, parent: Chef::Resource, step_into: true, unwrap_notifying_block: true, defined_at: caller[0], &block)
267
+ def resource(name, auto: true, parent: Chef::Resource, step_into: true, unwrap_notifying_block: true, patch: true, defined_at: caller[0], &block)
268
268
  parent = resources[parent] if parent.is_a?(Symbol)
269
269
  raise Halite::Error.new("Parent class for #{name} is not a class: #{parent.inspect}") unless parent.is_a?(Class)
270
270
  # Pull out the example group for use in the class.
@@ -320,7 +320,7 @@ module Halite
320
320
  end
321
321
 
322
322
  # Clean up any global registration that happens on class compile.
323
- Patcher.post_create_cleanup(name, resource_class)
323
+ Patcher.post_create_cleanup(name, resource_class) if patch
324
324
 
325
325
  # Store for use up with the parent system
326
326
  halite_helpers[:resources][name.to_sym] = resource_class
@@ -329,7 +329,7 @@ module Halite
329
329
  step_into(resource_class, name, unwrap_notifying_block: unwrap_notifying_block) if step_into
330
330
 
331
331
  around do |ex|
332
- if resource(name) == resource_class
332
+ if patch && resource(name) == resource_class
333
333
  # We haven't been overridden from a nested scope.
334
334
  Patcher.patch(name, resource_class, Chef::Resource) { ex.run }
335
335
  else
@@ -367,9 +367,9 @@ module Halite
367
367
  # it { is_expected.to run_my_resource('test') }
368
368
  # it { is_expected.to run_ruby_block('test') }
369
369
  # end
370
- def provider(name, auto: true, rspec: true, parent: Chef::Provider, defined_at: caller[0], &block)
370
+ def provider(name, auto: true, rspec: true, parent: Chef::Provider, patch: true, defined_at: caller[0], &block)
371
371
  parent = providers[parent] if parent.is_a?(Symbol)
372
- raise Halite::Error.new("Parent class for #{name} is not a class: #{options[:parent].inspect}") unless parent.is_a?(Class)
372
+ raise Halite::Error.new("Parent class for #{name} is not a class: #{parent.inspect}") unless parent.is_a?(Class)
373
373
  # Pull out the example group for use in the class.
374
374
  example_group = self
375
375
  # Create the provider class.
@@ -414,13 +414,13 @@ module Halite
414
414
  end
415
415
 
416
416
  # Clean up any global registration that happens on class compile.
417
- Patcher.post_create_cleanup(name, provider_class)
417
+ Patcher.post_create_cleanup(name, provider_class) if patch
418
418
 
419
419
  # Store for use up with the parent system
420
420
  halite_helpers[:providers][name.to_sym] = provider_class
421
421
 
422
422
  around do |ex|
423
- if provider(name) == provider_class
423
+ if patch && provider(name) == provider_class
424
424
  # We haven't been overridden from a nested scope.
425
425
  Patcher.patch(name, provider_class, Chef::Provider) { ex.run }
426
426
  else
@@ -15,6 +15,7 @@
15
15
  #
16
16
 
17
17
  require 'chef/resource'
18
+ require 'chef/version'
18
19
 
19
20
 
20
21
  module Halite
@@ -25,6 +26,9 @@ module Halite
25
26
  # @since 1.0.0
26
27
  # @api private
27
28
  module Patcher
29
+ # Flag to disable module-name patching.
30
+ DISABLE_PATCH_MODULE = ::Gem::Requirement.create('>= 13').satisfied_by?(::Gem::Version.create(Chef::VERSION))
31
+
28
32
  # Patch a class in to Chef for the duration of a block.
29
33
  #
30
34
  # @param name [String, Symbol] Name to create in snake-case (eg. :my_name).
@@ -90,6 +94,7 @@ module Halite
90
94
  # @param block [Proc] Block to execute while the name is available.
91
95
  # @return [void]
92
96
  def self.patch_module(mod, name, obj, &block)
97
+ return block.call if DISABLE_PATCH_MODULE
93
98
  class_name = Chef::Mixin::ConvertToClassName.convert_to_class_name(name.to_s)
94
99
  if mod.const_defined?(class_name, false)
95
100
  old_class = mod.const_get(class_name, false)
@@ -17,5 +17,5 @@
17
17
 
18
18
  module Halite
19
19
  # Halite version.
20
- VERSION = '1.5.0'
20
+ VERSION = '1.6.0'
21
21
  end
@@ -98,6 +98,25 @@ describe Halite::Dependencies do
98
98
  let(:gemspec) { fake_gem {|s| s.add_development_dependency 'gem1' } }
99
99
  it { is_expected.to eq [] }
100
100
  end
101
+
102
+ context 'with development mode' do
103
+ subject { described_class.extract_from_dependencies(gemspec, development: true) }
104
+
105
+ context 'with a halite-ish dependency' do
106
+ let(:gemspec) { fake_gem {|s| s.add_dependency 'gem3' } }
107
+ it { is_expected.to eq [['gem3', '>= 0', gem_stubs[2]]] }
108
+ end
109
+
110
+ context 'with a development dependency' do
111
+ let(:gemspec) { fake_gem {|s| s.add_development_dependency 'gem3' } }
112
+ it { is_expected.to eq [['gem3', '>= 0', gem_stubs[2]]] }
113
+ end
114
+
115
+ context 'with a non-halite dependency' do
116
+ let(:gemspec) { fake_gem {|s| s.add_development_dependency 'gem1' } }
117
+ it { is_expected.to eq [] }
118
+ end
119
+ end # /context with development mode
101
120
  end # /describe #extract_from_dependencies
102
121
 
103
122
  describe '#clean' do
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'chef', '>= 1'
24
24
 
25
25
  spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'test2', '~> 4.5.6'
26
27
  end
@@ -147,6 +147,8 @@ describe Halite::Gem do
147
147
  context 'when loading test4' do
148
148
  let(:gem_name) { 'test4' }
149
149
  its(:cookbook_name) { is_expected.to eq 'test4' }
150
+ its(:cookbook_dependencies) { is_expected.to eq [] }
151
+ it { expect(subject.cookbook_dependencies(development: true)).to eq [Halite::Dependencies::Dependency.new('test2', '~> 4.5.6', :dependencies)] }
150
152
  its(:version) { is_expected.to eq '2.3.1.rc.1' }
151
153
  its(:cookbook_version) { is_expected.to eq '2.3.1' }
152
154
  its(:issues_url) { is_expected.to eq 'http://issues' }
@@ -87,7 +87,7 @@ describe Halite::SpecHelper do
87
87
  resource(:halite_test, parent: :halite_parent)
88
88
  it { is_expected.to be_a(Class) }
89
89
  it { is_expected.to be < Chef::Resource }
90
- it { is_expected.to be < Chef::Resource::HaliteParent }
90
+ it { is_expected.to be < resource('halite_parent') }
91
91
  its(:resource_name) { is_expected.to eq :halite_test } if defined?(Chef::Resource.resource_name)
92
92
  it { expect(subject.new(nil, nil).resource_name).to eq(:halite_test) }
93
93
  end # /context with a helper-defined parent
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: halite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Noah Kantrowitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-29 00:00:00.000000000 Z
11
+ date: 2017-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef
@@ -241,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
241
  version: '0'
242
242
  requirements: []
243
243
  rubyforge_project:
244
- rubygems_version: 2.6.4
244
+ rubygems_version: 2.6.11
245
245
  signing_key:
246
246
  specification_version: 4
247
247
  summary: A set of helpers to write Chef cookbooks as Ruby gems.