simple-dependency-manager 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 168b18a544c62918825cd2b742b1a9b41ee16dbb
4
+ data.tar.gz: 7536abc891fbf95d392bf0e8dd3bbb5b5cc4e547
5
+ SHA512:
6
+ metadata.gz: 07ba46c5356dc317bf89ff8db420221fa102ca2c229949f04f38110947ad69f2e27c8412a7b4a60df55787f5dd36f764f4776bbf0d37ec982d6f21cc72a3a368
7
+ data.tar.gz: 12269ec9a17deb076a7a5c2bf6be6493a112c7c020f3507522ba257ff7c4606407fb60c4e8853f0862c01f0dfd95392cac933a41b36abb1e5bd324f46f1e3438
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .rspec
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ vendor/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "thor", "~> 0.15"
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2013-2014 Dan Bode
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # librarian-puppet-simple
2
+
3
+ This project was created out of my frustration with dependency management in librarian-puppet, some people need external dependencies, I just need to be able to pin revisions for a collection of modules, and I found the dependency managment features of librarian-puppet too heavy for my simple use case.
4
+
5
+ This project just has fewer commands, but they should be compatible with the original librarian-puppet:
6
+
7
+ ### Clean
8
+ Remove the directory where the modules will be installed. At the moment the supported options are:
9
+ * `--verbose` display progress messages
10
+ * `--path` override the default `./modules` where modules will be installed
11
+
12
+ ```
13
+ librarian-puppet clean [--verbose] [--path]
14
+ ```
15
+
16
+ ### Install
17
+ Iterates through your Puppetfile and installs git sources. At the moment the supported options are:
18
+ * `--verbose` display progress messages
19
+ * `--clean` remove the directory before installing modules
20
+ * `--path` override the default `./modules` where modules will be installed
21
+ * `--puppetfile` override the default `./Puppetfile` used to find the modules
22
+
23
+ ```
24
+ librarian-puppet install [--verbose] [--clean] [--path] [--puppetfile]
25
+ ```
26
+
27
+ ### Update
28
+ Iterates through your Puppetfile and updates git sources. If a SHA-1 hash is specified in the `:ref`, the module will not be updated.
29
+
30
+ Supported options are:<br/>
31
+ <li>`--verbose` display progress messages</li>
32
+ <li>`--path` override the default `./modules` where modules will be installed</li>
33
+ <li> `--puppetfile` override the default `./Puppetfile` used to find the modules</li>
34
+
35
+ ```
36
+ librarian-puppet update [--verbose] [--path] [--puppetfile]
37
+ ```
38
+
39
+ ## Puppetfile
40
+ The processed Puppetfile may contain two different types of modules, `git` and `tarball`. The `git` option accepts an optional `ref` parameter.
41
+
42
+ The module names can be namespaced, but the created directory will only contain the last part of the name. For example, a module named `puppetlabs/ntp` will generate a directory `ntp`, and so will a module simply named `ntp`.
43
+
44
+ Here's an example of a valid Puppetfile showcasing all valid options:
45
+
46
+ ```
47
+ mod "puppetlabs/ntp",
48
+ :git => "git://github.com/puppetlabs/puppetlabs-ntp.git",
49
+ :ref => "99bae40f225db0dd052efbf1d4078a21f0333331"
50
+
51
+ mod "apache",
52
+ :tarball => "https://forge.puppetlabs.com/puppetlabs/apache/0.6.0.tar.gz"
53
+ ```
54
+
55
+ ## Setting up for development and running the specs
56
+ Just clone the repo and run the following commands:
57
+ ```
58
+ bundle exec install --path=vendor
59
+ bundle exec rspec
60
+ ```
61
+
62
+ Beware that the functional tests will download files from GitHub and PuppetForge and will break if either is unavailable.
63
+
64
+ ## License
65
+
66
+ See [LICENSE](/LICENSE)
67
+
68
+ ## Credits
69
+ The untar and ungzip methods came from https://gist.github.com/sinisterchipmunk/1335041
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'thor'
4
+ lib = File.expand_path('../../lib', __FILE__)
5
+ $:.unshift(lib) unless $:.include?(lib)
6
+ require 'bodepd/simple/cli'
7
+
8
+ Bodepd::Simple::CLI.bin!
@@ -0,0 +1,9 @@
1
+ require "librarian/puppet/simple/version"
2
+
3
+ module Librarian
4
+ module Puppet
5
+ module Simple
6
+ # Your code goes here...
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,169 @@
1
+ require 'bodepd/simple/installer'
2
+ require 'bodepd/simple/iterator'
3
+ require 'fileutils'
4
+
5
+ module Bodepd
6
+ module Simple
7
+ class CLI < Thor
8
+
9
+ include Bodepd::Simple::Util
10
+ include Bodepd::Simple::Installer
11
+ include Bodepd::Simple::Iterator
12
+
13
+ class_option :verbose, :type => :boolean,
14
+ :desc => 'verbose output for executed commands'
15
+
16
+ class_option :path, :type => :string,
17
+ :desc => "overrides target directory, default is ./modules"
18
+ class_option :depfile, :type => :string,
19
+ :desc => "overrides used Depfile",
20
+ :default => './Depfile'
21
+
22
+
23
+ def self.bin!
24
+ start
25
+ end
26
+
27
+ desc 'install', 'installs all git sources from your Depfile'
28
+ method_option :clean, :type => :boolean, :desc => "calls clean before executing install"
29
+ def install
30
+ @verbose = options[:verbose]
31
+ clean if options[:clean]
32
+ @custom_module_path = options[:path]
33
+ # evaluate the file to populate @modules
34
+ eval(File.read(File.expand_path(options[:depfile])))
35
+ install!
36
+ end
37
+
38
+ desc 'update', 'updates all git sources from your Depfile'
39
+ method_option :update, :type => :boolean, :desc => "Updates git sources"
40
+ def update
41
+ @verbose = options[:verbose]
42
+ @custom_module_path = options[:path]
43
+ eval(File.read(File.expand_path(options[:depfile])))
44
+ each_module_of_type(:git) do |repo|
45
+ if Dir.exists?(File.join(module_path, repo[:name]))
46
+ Dir.chdir(File.join(module_path, repo[:name])) do
47
+ remote = repo[:git]
48
+ # if no ref is given, assume master
49
+ branch = repo[:ref] || 'master'
50
+ if branch =~ /^origin\/(.*)$/
51
+ branch = $1
52
+ end
53
+ co_cmd = 'git checkout FETCH_HEAD'
54
+ update_cmd = "git fetch #{repo[:git]} #{branch} && #{co_cmd}"
55
+ print_verbose "\n\n#{repo[:name]} -- #{update_cmd}"
56
+ git_pull_cmd = system_cmd(update_cmd)
57
+ end
58
+ else
59
+ install_git module_path, repo[:name], repo[:git], repo[:ref]
60
+ end
61
+ end
62
+ end
63
+
64
+ desc 'clean', 'clean modules directory'
65
+ def clean
66
+ target_directory = options[:path] || File.expand_path("./modules")
67
+ puts "Target Directory: #{target_directory}" if options[:verbose]
68
+ FileUtils.rm_rf target_directory
69
+ end
70
+
71
+ desc 'git_status', 'determine the current status of checked out git repos'
72
+ def git_status
73
+ @custom_module_path = options[:path]
74
+ # populate @modules
75
+ eval(File.read(File.expand_path(options[:depfile])))
76
+ each_module_of_type(:git) do |repo|
77
+ Dir.chdir(File.join(module_path, repo[:name])) do
78
+ status = system_cmd('git status')
79
+ if status.include?('nothing to commit (working directory clean)')
80
+ puts "Module #{repo[:name]} has not changed" if options[:verbose]
81
+ else
82
+ puts "Uncommitted changes for: #{repo[:name]}"
83
+ puts " #{status.join("\n ")}"
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ desc 'dev_setup', 'adds development r/w remotes to each repo (assumes remote has the same name as current repo)'
90
+ def dev_setup(remote_name)
91
+ @custom_module_path = options[:path]
92
+ # populate @modules
93
+ eval(File.read(File.expand_path(options[:depfile])))
94
+ each_module_of_type(:git) do |repo|
95
+ Dir.chdir(File.join((options[:path] || 'modules'), repo[:name])) do
96
+ print_verbose "Adding development remote for git repo #{repo[:name]}"
97
+ remotes = system_cmd('git remote')
98
+ if remotes.include?(remote_name)
99
+ puts "Did not have to add remote #{remote_name} to #{repo[:name]}"
100
+ elsif ! remotes.include?('origin')
101
+ raise(TestException, "Repo #{repo[:name]} has no remote called origin, failing")
102
+ else
103
+ remote_url = system_cmd('git remote show origin').detect {|x| x =~ /\s+Push\s+URL: / }
104
+ if remote_url =~ /(git|https?):\/\/(.+)\/(.+)?\/(.+)/
105
+ url = "git@#{$2}:#{remote_name}/#{$4}"
106
+ puts "Adding remote #{remote_name} as #{url}"
107
+ system_cmd("git remote add #{remote_name} #{url}")
108
+ elsif remote_url =~ /^git@/
109
+ puts "Origin is already a read/write remote, skipping b/c this is unexpected"
110
+ else
111
+ puts "remote_url #{remote_url} did not have the expected format. weird..."
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ desc 'generate_depfile', 'generates a static version of the Depfile'
119
+ method_option :out_file,
120
+ :desc => 'output file where static depfile should be written to'
121
+ def generate_depfile
122
+ eval(File.read(File.expand_path(options[:depfile])))
123
+ if options[:out_file]
124
+ File.open(options[:out_file], 'w') do |fh|
125
+ print_puppet_file(fh)
126
+ end
127
+ else
128
+ print_puppet_file(STDOUT)
129
+ end
130
+ end
131
+
132
+ private
133
+
134
+ def print_dep_file(stream)
135
+ each_module do |repo|
136
+ repo.delete(:name)
137
+ out_str = repo.delete(:full_name)
138
+ repo.each do |k,v|
139
+ out_str << ", :#{k} => #{v}"
140
+ end
141
+ stream.puts(out_str)
142
+ end
143
+ end
144
+
145
+ # builds out a certain type of repo
146
+ def build_depfile(name, perform_installation=false)
147
+ repo_hash = {}
148
+ # set environment variable to determine what version of modules to install
149
+ # this assumes that the environment variable repos_to_use has been coded in
150
+ # your Depfile to allow installation of different versions of modules
151
+ ENV['repos_to_use'] = name
152
+ # parse Depfile and install modules in our tmp directory.
153
+ eval(File.read(File.expand_path(options[:depfile])))
154
+ # install modules if desired
155
+ install! if perform_installation
156
+
157
+ # iterate through all git modules
158
+ each_module_of_type(:git) do |git_repo|
159
+ abort("Module git_repo[:name] was defined multiple times in same Depfile") if repo_hash[git_repo[:name]]
160
+ repo_hash[git_repo[:name]] = git_repo
161
+ end
162
+ # clear out the modules once finished
163
+ clear_modules
164
+ repo_hash
165
+ end
166
+
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,111 @@
1
+ require 'fileutils'
2
+ require 'rubygems/package'
3
+ require 'zlib'
4
+ require 'open-uri'
5
+ require 'bodepd/simple/util'
6
+ require 'bodepd/simple/iterator'
7
+
8
+ # This is an extremely simple file that can consume
9
+ # a Puppet file with git references
10
+ #
11
+ # It does absolutely no dependency resolution by design.
12
+ #
13
+ module Bodepd
14
+ module Simple
15
+ module Installer
16
+
17
+ include Bodepd::Simple::Util
18
+ include Bodepd::Simple::Iterator
19
+
20
+ # installs modules using the each_module method from our
21
+ # iterator mixin
22
+ def install!
23
+ each_module do |repo|
24
+
25
+ print_verbose "\n##### processing module #{repo[:name]}..."
26
+
27
+ module_dir = File.join(module_path, repo[:name])
28
+
29
+ unless File.exists?(module_dir)
30
+ case
31
+ when repo[:git]
32
+ install_git module_path, repo[:name], repo[:git], repo[:ref]
33
+ when repo[:tarball]
34
+ install_tarball module_path, repo[:name], repo[:tarball]
35
+ else
36
+ abort('only the :git and :tarball provider are currently supported')
37
+ end
38
+ else
39
+ print_verbose "\nModule #{repo[:name]} already installed in #{module_path}"
40
+ end
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # installs sources that are git repos
47
+ def install_git(module_path, module_name, repo, ref = nil)
48
+ module_dir = File.join(module_path, module_name)
49
+
50
+ Dir.chdir(module_path) do
51
+ print_verbose "cloning #{repo}"
52
+ system_cmd("git clone #{repo} #{module_name}")
53
+ Dir.chdir(module_dir) do
54
+ system_cmd('git branch -r')
55
+ system_cmd("git checkout #{ref}") if ref
56
+ end
57
+ end
58
+ end
59
+
60
+ def install_tarball(module_path, module_name, remote_tarball)
61
+ Dir.mktmpdir do |tmp|
62
+ temp_file = File.join(tmp,"downloaded_module.tar.gz")
63
+ File.open(temp_file, "w+b") do |saved_file|
64
+ print_verbose "Downloading #{remote_tarball}..."
65
+ open(remote_tarball, 'rb') do |read_file|
66
+ saved_file.write(read_file.read)
67
+ end
68
+ saved_file.rewind
69
+
70
+ target_directory = File.join(module_path, module_name)
71
+ print_verbose "Extracting #{remote_tarball} to #{target_directory}..."
72
+ unzipped_target = ungzip(saved_file)
73
+ tarfile_full_name = untar(unzipped_target, module_path)
74
+ FileUtils.mv File.join(module_path, tarfile_full_name), target_directory
75
+ end
76
+ end
77
+ end
78
+
79
+ # un-gzips the given IO, returning the
80
+ # decompressed version as a StringIO
81
+ def ungzip(tarfile)
82
+ z = Zlib::GzipReader.new(tarfile)
83
+ unzipped = StringIO.new(z.read)
84
+ z.close
85
+ unzipped
86
+ end
87
+
88
+ # untars the given IO into the specified
89
+ # directory
90
+ def untar(io, destination)
91
+ tarfile_full_name = nil
92
+ Gem::Package::TarReader.new io do |tar|
93
+ tar.each do |tarfile|
94
+ tarfile_full_name ||= tarfile.full_name
95
+ destination_file = File.join destination, tarfile.full_name
96
+ if tarfile.directory?
97
+ FileUtils.mkdir_p destination_file
98
+ else
99
+ destination_directory = File.dirname(destination_file)
100
+ FileUtils.mkdir_p destination_directory unless File.directory?(destination_directory)
101
+ File.open destination_file, "wb" do |f|
102
+ f.write tarfile.read
103
+ end
104
+ end
105
+ end
106
+ end
107
+ tarfile_full_name
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,54 @@
1
+ require 'bodepd/simple/util'
2
+
3
+ module Bodepd
4
+ module Simple
5
+ module Iterator
6
+
7
+ # evaluate a module and add it our @modules instance variable
8
+ def mod(name, options = {})
9
+ @modules ||= {}
10
+ full_name = name
11
+ module_name = name.split('/', 2).last
12
+
13
+ case
14
+ when options[:git]
15
+ @modules[:git] ||= {}
16
+ @modules[:git][module_name] = options.merge(:name => module_name, :full_name => full_name)
17
+ when options[:tarball]
18
+ @modules[:tarball] ||= {}
19
+ @modules[:tarball][module_name] = options.merge(:name => module_name, :full_name => full_name)
20
+ else
21
+ @modules[:forge] ||= {}
22
+ @modules[:forge][module_name] = options.merge(:name => module_name, :full_name => full_name)
23
+ #abort('only the :git and :tarball providers are currently supported')
24
+ end
25
+ end
26
+
27
+ def modules
28
+ @modules
29
+ end
30
+
31
+ def clear_modules
32
+ @modules = nil
33
+ end
34
+
35
+ # iterate through all modules
36
+ def each_module(&block)
37
+ (@modules || {}).each do |type, repos|
38
+ (repos || {}).values.each do |repo|
39
+ yield repo
40
+ end
41
+ end
42
+ end
43
+
44
+ # loop over each module of a certain type
45
+ def each_module_of_type(type, &block)
46
+ abort("undefined type #{type}") unless [:git, :tarball].include?(type)
47
+ ((@modules || {})[type] || {}).values.each do |repo|
48
+ yield repo
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,49 @@
1
+ #
2
+ # this module contains all of the base helper methods
3
+ # used by the other actions
4
+ #
5
+ module Bodepd
6
+ module Simple
7
+ module Util
8
+
9
+ def forge(repo)
10
+ # this does nothing atm
11
+ end
12
+ # figure out what directory we are working out og
13
+ def base_dir
14
+ @base_dir ||= Dir.pwd
15
+ end
16
+
17
+ # figure out what the modulepath is
18
+ def module_path(dir=base_dir)
19
+ unless @module_path
20
+ if @custom_module_path
21
+ @module_path = File.expand_path @custom_module_path
22
+ else
23
+ @module_path = File.join(dir, 'modules')
24
+ end
25
+ Dir.mkdir(@module_path) unless File.exists?(@module_path)
26
+ end
27
+ @module_path
28
+ end
29
+
30
+ # run a command on the system
31
+ def system_cmd (cmd, print_output=false)
32
+ print_verbose "Running cmd: #{cmd}"
33
+ output = `#{cmd}`.split("\n")
34
+ if print_output
35
+ puts output
36
+ else
37
+ print_verbose output
38
+ end
39
+ raise(StandardError, "Cmd #{cmd} failed") unless $?.success?
40
+ output
41
+ end
42
+
43
+ def print_verbose(text)
44
+ puts text if @verbose
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ module Bodepd
2
+ module Simple
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ require 'bodepd/simple/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'simple-dependency-manager'
7
+ s.version = Bodepd::Simple::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Dan Bode']
10
+ s.email = ['bodepd@gmail.com']
11
+ s.homepage = 'https://github.com/bodepd/simple-dependency-manager'
12
+ s.summary = 'Language agnostic dependency file'
13
+ s.description = 'Simply grabs things from a Dependencies file and installs them. Simple.'
14
+
15
+ s.files = `git ls-files`.split($/)
16
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency "thor", "~> 0.15"
21
+
22
+ s.add_development_dependency "rspec", "~> 2.13"
23
+ end
@@ -0,0 +1,13 @@
1
+ mod 'puppetlabs/ntp',
2
+ :git => 'git://github.com/puppetlabs/puppetlabs-ntp.git',
3
+ :ref => '99bae40f225db0dd052efbf1d4078a21f0333331'
4
+
5
+ mod 'apache',
6
+ :tarball => 'https://forge.puppetlabs.com/puppetlabs/apache/0.6.0.tar.gz'
7
+
8
+ mod 'ghoneycutt/testlps',
9
+ :git => 'git://github.com/ghoneycutt/testlps.git'
10
+
11
+ mod 'ghoneycutt/dnsclient',
12
+ :git => 'git://github.com/ghoneycutt/puppet-module-dnsclient.git',
13
+ :ref => 'v3.0.4'
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ require 'tmpdir'
4
+
5
+ describe "Functional - Clean" do
6
+ it "displays install help message" do
7
+ output, status = execute_captured("bin/librarian-puppet help clean")
8
+ output.should_not include("ERROR")
9
+ output.should_not include("Could not find command")
10
+ status.should == 0
11
+ end
12
+
13
+ describe "when running 'librarian-puppet clean'" do
14
+ temp_directory = nil
15
+
16
+ before :each do
17
+ temp_directory = Dir.mktmpdir
18
+ Dir.entries(temp_directory).should =~ ['.', '..']
19
+ FileUtils.touch File.join(temp_directory, 'trashfile')
20
+ Dir.entries(temp_directory).should =~ ['.', '..', 'trashfile']
21
+ end
22
+
23
+ after :each do
24
+ FileUtils.rm_rf temp_directory if File.exist?(temp_directory)
25
+ end
26
+
27
+ it "with --path it cleans the directory" do
28
+ output, status = execute_captured("bin/librarian-puppet clean --path=#{temp_directory}")
29
+
30
+ status.should == 0
31
+ # Using File.exist? to be compatible with Ruby 1.8.7
32
+ File.exist?(temp_directory).should be_false
33
+ end
34
+
35
+ it "with --verbose it shows progress messages" do
36
+ output, status = execute_captured("bin/librarian-puppet clean --verbose --path=#{temp_directory}")
37
+
38
+ status.should == 0
39
+ output.should include("Target Directory: #{temp_directory}")
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ require 'tmpdir'
4
+
5
+ describe "Functional - Install" do
6
+ before :all do
7
+ warning_message = "ATTENTION: these tests download information from github.com and forge.puppetlabs.com"
8
+ puts '*' * warning_message.length
9
+ puts warning_message
10
+ puts '*' * warning_message.length
11
+ end
12
+
13
+ it "displays install help message" do
14
+ output, status = execute_captured("bin/librarian-puppet help install")
15
+ output.should_not include("ERROR")
16
+ output.should_not include("Could not find command")
17
+ status.should == 0
18
+ end
19
+
20
+ describe "when running 'librarian-puppet install'" do
21
+ temp_directory = nil
22
+
23
+ before :each do
24
+ temp_directory = Dir.mktmpdir
25
+ Dir.entries(temp_directory).should =~ ['.', '..']
26
+ FileUtils.touch File.join(temp_directory, 'trashfile')
27
+ Dir.entries(temp_directory).should =~ ['.', '..', 'trashfile']
28
+ end
29
+
30
+ after :each do
31
+ FileUtils.rm_rf temp_directory
32
+ end
33
+
34
+ it "install the modules in a temp directory" do
35
+ output, status = execute_captured("bin/librarian-puppet install --path=#{temp_directory} --puppetfile=spec/fixtures/Puppetfile")
36
+
37
+ status.should == 0
38
+ Dir.entries(temp_directory).should =~ %w|. .. apache ntp trashfile dnsclient testlps|
39
+ end
40
+
41
+ it "with --clean it cleans the directory before installing the modules in a temp directory" do
42
+ output, status = execute_captured("bin/librarian-puppet install --clean --path=#{temp_directory} --puppetfile=spec/fixtures/Puppetfile")
43
+
44
+ status.should == 0
45
+ Dir.entries(temp_directory).should =~ %w|. .. apache ntp dnsclient testlps|
46
+ end
47
+
48
+ it "with --verbose it outputs progress messages" do
49
+ output, status = execute_captured("bin/librarian-puppet install --verbose --path=#{temp_directory} --puppetfile=spec/fixtures/Puppetfile")
50
+
51
+ status.should == 0
52
+ output.should include('##### processing module apache')
53
+ end
54
+
55
+ describe 'when modules are already installed' do
56
+ temp_directory = nil
57
+
58
+ before :each do
59
+ temp_directory = Dir.mktmpdir
60
+ Dir.entries(temp_directory).should =~ ['.', '..']
61
+ FileUtils.touch File.join(temp_directory, 'apache')
62
+ Dir.entries(temp_directory).should =~ ['.', '..', 'apache']
63
+ end
64
+
65
+ it 'without clean it should only install ntp' do
66
+ output, status = execute_captured("bin/librarian-puppet install --verbose --path=#{temp_directory} --puppetfile=spec/fixtures/Puppetfile")
67
+ status.should == 0
68
+ output.should include('Module apache already installed')
69
+ Dir.entries(temp_directory).should =~ %w|. .. apache ntp dnsclient testlps|
70
+ end
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,25 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ require 'open3'
8
+
9
+ RSpec.configure do |config|
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+ config.run_all_when_everything_filtered = true
12
+ config.filter_run :focus
13
+
14
+ # Run specs in random order to surface order dependencies. If you find an
15
+ # order dependency and want to debug it, you can fix the order by providing
16
+ # the seed, which is printed after each run.
17
+ # --seed 1234
18
+ config.order = 'random'
19
+
20
+ def execute_captured(command)
21
+ stdin, stdout, stderr = Open3.popen3(command)
22
+ condensed = stdout.readlines.join + stderr.readlines.join
23
+ [condensed, $?.exitstatus]
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple-dependency-manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dan Bode
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '0.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '2.13'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '2.13'
41
+ description: Simply grabs things from a Dependencies file and installs them. Simple.
42
+ email:
43
+ - bodepd@gmail.com
44
+ executables:
45
+ - simple-dependency-manager
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - .gitignore
50
+ - Gemfile
51
+ - LICENSE
52
+ - README.md
53
+ - bin/simple-dependency-manager
54
+ - lib/bodepd/simple.rb
55
+ - lib/bodepd/simple/cli.rb
56
+ - lib/bodepd/simple/installer.rb
57
+ - lib/bodepd/simple/iterator.rb
58
+ - lib/bodepd/simple/util.rb
59
+ - lib/bodepd/simple/version.rb
60
+ - simple-dependency-manager.gemspec
61
+ - spec/fixtures/Puppetfile
62
+ - spec/functional/clean_spec.rb
63
+ - spec/functional/install_spec.rb
64
+ - spec/spec_helper.rb
65
+ homepage: https://github.com/bodepd/simple-dependency-manager
66
+ licenses: []
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.0.14
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: Language agnostic dependency file
88
+ test_files:
89
+ - spec/fixtures/Puppetfile
90
+ - spec/functional/clean_spec.rb
91
+ - spec/functional/install_spec.rb
92
+ - spec/spec_helper.rb