bellboy 0.4.0 → 0.5.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.
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem "berkshelf", github: "berkshelf/berkshelf"
4
+ gem "rspec"
5
+
3
6
  gemspec
data/README.md CHANGED
@@ -124,3 +124,22 @@ $PWD/config.json
124
124
  You can also specify the path to the Berkshelf configuration file with the ```-c``` option:
125
125
 
126
126
  bellboy install -c /path/to/berkshelf/config.json
127
+
128
+ ### Databags API
129
+
130
+ Bellboy requires a working API server which it uses to download databag items. Normally Bellboy expects this API to run alongside your existing Berkshelf API, and Bellboy will use the existing `site` directive from the Berksfile to find the API.
131
+
132
+ For example, if your Berksfile contains
133
+
134
+ site "https://example.com"
135
+
136
+ then Bellboy assumes that the databag API is running at `https://example.com/databags`
137
+
138
+ It is also possible to run the databag API at a different location. You can specify the URL to the API with the Bellboy specific `databags` directive in your Berksfile. However, Berkshelf will not understand this directive, so using `databags` in your Berksfile is slightly more complicated
139
+
140
+ site "https://example.com"
141
+ databags "https://databags.example.com" if Object.constants.include? :Bellboy
142
+
143
+ The `if` clause ensures that Berkshelf will ignore the new directive, but that it will be processed if the Berksfile is loaded by Bellboy.
144
+
145
+ The databag API is a simple Sinatra application. See [the Githib page](https://github.com/dyninc/databagapi) for the source and documentation.
@@ -7,15 +7,14 @@ Gem::Specification.new do |g|
7
7
  g.description = "Version, install & upload data bag items that are stored alongside your Berkshelf Cookbooks"
8
8
  g.authors = ["Kristian Van Der Vliet"]
9
9
  g.email = 'kvandervliet@dyn.com'
10
- g.homepage = ''
10
+ g.homepage = 'https://github.com/Vanders/bellboy'
11
11
  g.license = 'Apache-2.0'
12
12
 
13
13
  g.files = `git ls-files`.split($\)
14
14
  g.executables = g.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
15
15
 
16
16
  g.add_runtime_dependency 'thor', '~> 0.18.0'
17
- g.add_runtime_dependency 'berkshelf', '~> 2.0.10'
18
17
  g.add_runtime_dependency 'faraday', '~> 0.8.0'
19
- g.add_runtime_dependency 'ridley', '~> 1.5.0'
18
+ g.add_runtime_dependency 'ridley', '~> 2.3'
20
19
  g.add_runtime_dependency 'knife-data-bag-version', '~> 1.1.1'
21
20
  end
@@ -42,8 +42,15 @@ module Bellboy
42
42
  attr_accessor :logger
43
43
 
44
44
  def berks_sources(berksfile)
45
- resolver = Berkshelf.ui.mute { berksfile.resolve(berksfile.sources) }
46
- resolver[:sources]
45
+ sources = Array.new
46
+
47
+ dependencies = berksfile.list
48
+ dependencies.each do |dependency|
49
+ Bellboy.logger.debug "Adding source for #{dependency.name}"
50
+ sources << berksfile.retrieve_locked(dependency)
51
+ end
52
+
53
+ sources
47
54
  end
48
55
 
49
56
  def ridley_connection(options = {})
@@ -74,9 +81,9 @@ module Bellboy
74
81
  local_sources = Bellboy.berks_sources(berksfile)
75
82
 
76
83
  local_sources.each do |source|
77
- Bellboy.logger.debug "Source: #{source.cached_cookbook.path}"
84
+ Bellboy.logger.debug "Source: #{source.path}"
78
85
 
79
- path = File.join(source.cached_cookbook.path, 'data_bags')
86
+ path = File.join(source.path, 'data_bags')
80
87
  Dir.foreach(path) do |dir|
81
88
  subdir = File.join(path, dir)
82
89
 
@@ -26,25 +26,30 @@ module Bellboy
26
26
  def install(berksfile, options = {})
27
27
  @bellboyfile = options[:bellboyfile]
28
28
 
29
+ # Make sure no one (E.g. rspec) did anything silly
30
+ abort if @bellboyfile.nil?
31
+
29
32
  local_sources = Bellboy.berks_sources(berksfile)
30
33
 
31
34
  local_sources.each do |source|
32
- Bellboy.logger.debug "Source: #{source.cached_cookbook.path}"
35
+ Bellboy.logger.debug "Source: #{source.path}"
33
36
 
34
- if File.exists?(File.join(source.cached_cookbook.path, @bellboyfile))
35
- site = berksfile.locations.select { |loc| loc[:type] == :databags }.first
37
+ if File.exists?(File.join(source.path, @bellboyfile))
38
+ site = berksfile.databags_source
36
39
 
37
40
  if site.nil?
38
- # Try the 'site' location
39
- site = berksfile.locations.select { |loc| loc[:type] == :site }.first
41
+ # Try the first source
42
+ site = berksfile.sources.first
40
43
 
41
44
  fail Berkshelf::InvalidChefAPILocation if site.nil?
42
45
 
43
- location = "#{site[:value]}/databags"
46
+ location = "#{site.uri}/databags"
44
47
  else
45
- location = site[:value]
48
+ location = site.uri
46
49
  end
47
50
 
51
+ Bellboy.logger.debug "Using #{site} for databags API location"
52
+
48
53
  download_databags(source, location)
49
54
  end
50
55
 
@@ -54,9 +59,9 @@ module Bellboy
54
59
  private
55
60
 
56
61
  def download_databags(source, site)
57
- Bellboy.logger.log "Downloading databags for #{source.cached_cookbook.name}"
62
+ Bellboy.logger.log "Downloading databags for #{source.name}"
58
63
 
59
- path = source.cached_cookbook.path
64
+ path = source.path
60
65
  containerpath = File.join(path, 'data_bags')
61
66
 
62
67
  begin
@@ -4,6 +4,7 @@ module Bellboy
4
4
  def self.included(base)
5
5
  base.class_eval do
6
6
  expose_method :databags
7
+ expose_method :databags_source
7
8
  end
8
9
  end
9
10
 
@@ -14,9 +15,16 @@ module Bellboy
14
15
  #
15
16
  # @param [String] value
16
17
  #
17
- # @return [Hash]
18
- def databags(value)
19
- add_location(:databags, value)
18
+ # @return [Berkshelf::Source]
19
+ def databags(api_url)
20
+ @databags = Berkshelf::Source.new(api_url)
21
+ end
22
+
23
+ # Get the 'Databags' location which will be used to resolve databag sources.
24
+ #
25
+ # @return [Berkshelf::Source]
26
+ def databags_source
27
+ @databags
20
28
  end
21
29
 
22
30
  end
@@ -29,9 +29,9 @@ module Bellboy
29
29
  conn = Bellboy.ridley_connection(options)
30
30
 
31
31
  local_sources.each do |source|
32
- Bellboy.logger.debug "Source: #{source.cached_cookbook.path}"
32
+ Bellboy.logger.debug "Source: #{source.path}"
33
33
 
34
- upload_databags(source.cached_cookbook, conn)
34
+ upload_databags(source, conn)
35
35
  end
36
36
  end
37
37
 
@@ -26,10 +26,10 @@ module Bellboy
26
26
  local_sources = Bellboy.berks_sources(berksfile)
27
27
 
28
28
  local_sources.each do |source|
29
- Bellboy.logger.debug "Source: #{source.cached_cookbook.path}"
29
+ Bellboy.logger.debug "Source: #{source.path}"
30
30
 
31
- DatabagVersion.process_all(options[:verbose], "#{source.cached_cookbook.path}/data_bags") if
32
- Dir.exists?("#{source.cached_cookbook.path}/data_bags")
31
+ DatabagVersion.process_all(options[:verbose], "#{source.path}/data_bags") if
32
+ Dir.exists?("#{source.path}/data_bags")
33
33
  end
34
34
  end
35
35
  end
@@ -5,6 +5,8 @@ require 'bellboy'
5
5
  require_relative 'spec-helpers'
6
6
 
7
7
  describe 'cli' do
8
+ include UsesTempFiles
9
+
8
10
  it 'should output help information if run with no arguments' do
9
11
  content = capture(:stdout) { Bellboy::Cli.start(%w[]) }
10
12
  expect(content).to match(/Commands:/)
@@ -30,20 +32,30 @@ describe 'cli' do
30
32
  expect(content).to match(/Upload all databags for all Cookbooks known by Berkshelf/)
31
33
  end
32
34
 
33
- it 'should not fail to run the \'version\' command with an empty Berksfile' do
34
- Bellboy::Cli.start(%w[version -b /dev/null])
35
+ it 'should fail to run with an invalid Berksfile' do
36
+ content = capture(:stdout) { lambda{ Bellboy::Cli.start(%w[version -b /i/dont/exist]) }.should exit_with_code(0) }
37
+ expect(content).to match(/could not be found/)
35
38
  end
36
39
 
37
- it 'should not fail to run the \'install\' command with an empty Berksfile' do
38
- Bellboy::Cli.start(%w[install -b /dev/null])
39
- end
40
+ context "with non-empty Berksfile" do
40
41
 
41
- it 'should not fail to run the \'upload\' command with an empty Berksfile' do
42
- Bellboy::Cli.start(%w[upload -b /dev/null])
43
- end
42
+ in_directory_with_file('Berksfile')
43
+
44
+ before (:each) do
45
+ content_for_file("source 'http://example.com'")
46
+ end
47
+
48
+ it 'should not fail to run the \'version\' command' do
49
+ Bellboy::Cli.start(%w[version -b Berksfile])
50
+ end
51
+
52
+ it 'should not fail to run the \'install\' command' do
53
+ Bellboy::Cli.start(%w[install -b Berksfile])
54
+ end
55
+
56
+ it 'should not fail to run the \'upload\' command' do
57
+ Bellboy::Cli.start(%w[upload -b Berksfile])
58
+ end
44
59
 
45
- it 'should fail to run with an invalid Berksfile' do
46
- content = capture(:stdout) { lambda{ Bellboy::Cli.start(%w[version -b /i/dont/exist]) }.should exit_with_code(0) }
47
- expect(content).to match(/could not be found/)
48
60
  end
49
61
  end
@@ -4,11 +4,20 @@ $LOAD_PATH.push File.expand_path('../../lib', __FILE__)
4
4
  require 'bellboy'
5
5
 
6
6
  describe 'installer' do
7
- before (:each) do
8
- @berksfile = Bellboy.berks_from_file('/dev/null')
9
- end
7
+ include UsesTempFiles
8
+
9
+ context "with non-empty Berksfile" do
10
+
11
+ in_directory_with_file('Berksfile')
12
+
13
+ before (:each) do
14
+ content_for_file("source 'http://example.com'")
15
+ @berksfile = Bellboy.berks_from_file('Berksfile')
16
+ end
17
+
18
+ it 'should not throw any exceptions' do
19
+ Bellboy::Installer.install(@berksfile, {:bellboyfile => '/dev/null'})
20
+ end
10
21
 
11
- it 'should not throw any exceptions' do
12
- Bellboy::Installer.install(@berksfile)
13
22
  end
14
23
  end
@@ -19,3 +19,33 @@ RSpec::Matchers.define :exit_with_code do |exp_code|
19
19
  "expect block to call exit(#{exp_code})"
20
20
  end
21
21
  end
22
+
23
+ module UsesTempFiles
24
+ def self.included(example_group)
25
+ example_group.extend(self)
26
+ end
27
+
28
+ def in_directory_with_file(file)
29
+ before do
30
+ @pwd = Dir.pwd
31
+ @tmp_dir = File.join(File.dirname(__FILE__), 'tmp')
32
+ FileUtils.mkdir_p(@tmp_dir)
33
+ Dir.chdir(@tmp_dir)
34
+
35
+ FileUtils.mkdir_p(File.dirname(file))
36
+ FileUtils.touch(file)
37
+ end
38
+
39
+ define_method(:content_for_file) do |content|
40
+ f = File.new(File.join(@tmp_dir, file), 'a+')
41
+ f.write(content)
42
+ f.flush
43
+ f.close
44
+ end
45
+
46
+ after do
47
+ Dir.chdir(@pwd)
48
+ FileUtils.rm_rf(@tmp_dir)
49
+ end
50
+ end
51
+ end
@@ -4,11 +4,19 @@ $LOAD_PATH.push File.expand_path('../../lib', __FILE__)
4
4
  require 'bellboy'
5
5
 
6
6
  describe 'uploader' do
7
- before (:each) do
8
- @berksfile = Bellboy.berks_from_file('/dev/null')
9
- end
7
+ include UsesTempFiles
8
+
9
+ context "with non-empty Berksfile" do
10
+
11
+ in_directory_with_file('Berksfile')
12
+
13
+ before (:each) do
14
+ content_for_file("source 'http://example.com'")
15
+ @berksfile = Bellboy.berks_from_file('Berksfile')
16
+ end
10
17
 
11
- it 'should not throw any exceptions' do
12
- Bellboy::Uploader.upload(@berksfile)
18
+ it 'should not throw any exceptions' do
19
+ Bellboy::Uploader.upload(@berksfile)
20
+ end
13
21
  end
14
22
  end
@@ -4,11 +4,19 @@ $LOAD_PATH.push File.expand_path('../../lib', __FILE__)
4
4
  require 'bellboy'
5
5
 
6
6
  describe 'versioner' do
7
- before (:each) do
8
- @berksfile = Bellboy.berks_from_file('/dev/null')
9
- end
7
+ include UsesTempFiles
8
+
9
+ context "with non-empty Berksfile" do
10
+
11
+ in_directory_with_file('Berksfile')
12
+
13
+ before (:each) do
14
+ content_for_file("source 'http://example.com'")
15
+ @berksfile = Bellboy.berks_from_file('Berksfile')
16
+ end
10
17
 
11
- it 'should not throw any exceptions' do
12
- Bellboy::Versioner.version(@berksfile)
18
+ it 'should not throw any exceptions' do
19
+ Bellboy::Versioner.version(@berksfile)
20
+ end
13
21
  end
14
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bellboy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-21 00:00:00.000000000 Z
12
+ date: 2014-03-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -27,22 +27,6 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 0.18.0
30
- - !ruby/object:Gem::Dependency
31
- name: berkshelf
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ~>
36
- - !ruby/object:Gem::Version
37
- version: 2.0.10
38
- type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 2.0.10
46
30
  - !ruby/object:Gem::Dependency
47
31
  name: faraday
48
32
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +50,7 @@ dependencies:
66
50
  requirements:
67
51
  - - ~>
68
52
  - !ruby/object:Gem::Version
69
- version: 1.5.0
53
+ version: '2.3'
70
54
  type: :runtime
71
55
  prerelease: false
72
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +58,7 @@ dependencies:
74
58
  requirements:
75
59
  - - ~>
76
60
  - !ruby/object:Gem::Version
77
- version: 1.5.0
61
+ version: '2.3'
78
62
  - !ruby/object:Gem::Dependency
79
63
  name: knife-data-bag-version
80
64
  requirement: !ruby/object:Gem::Requirement
@@ -121,7 +105,7 @@ files:
121
105
  - spec/spec-helpers.rb
122
106
  - spec/uploader_spec.rb
123
107
  - spec/versioner_spec.rb
124
- homepage: ''
108
+ homepage: https://github.com/Vanders/bellboy
125
109
  licenses:
126
110
  - Apache-2.0
127
111
  post_install_message: