beaker-puppet 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 +15 -0
- data/.gitignore +25 -0
- data/.simplecov +9 -0
- data/Gemfile +25 -0
- data/HISTORY.md +8 -0
- data/LICENSE +202 -0
- data/README.md +55 -0
- data/Rakefile +299 -0
- data/acceptance/config/acceptance-options.rb +6 -0
- data/acceptance/config/gem/acceptance-options.rb +9 -0
- data/acceptance/config/git/acceptance-options.rb +9 -0
- data/acceptance/config/nodes/vagrant-ubuntu-1404.yml +8 -0
- data/acceptance/config/pkg/acceptance-options.rb +8 -0
- data/acceptance/lib/beaker/acceptance/install_utils.rb +58 -0
- data/acceptance/pre_suite/gem/install.rb +8 -0
- data/acceptance/pre_suite/git/install.rb +97 -0
- data/acceptance/pre_suite/pkg/install.rb +9 -0
- data/acceptance/tests/README.md +3 -0
- data/acceptance/tests/backwards_compatible.rb +19 -0
- data/acceptance/tests/install_smoke_test.rb +21 -0
- data/acceptance/tests/stub_host.rb +47 -0
- data/acceptance/tests/web_helpers_test.rb +54 -0
- data/acceptance/tests/with_puppet_running_on.rb +26 -0
- data/beaker-puppet.gemspec +38 -0
- data/bin/beaker-puppet +32 -0
- data/lib/beaker-puppet.rb +46 -0
- data/lib/beaker-puppet/helpers/facter_helpers.rb +57 -0
- data/lib/beaker-puppet/helpers/puppet_helpers.rb +865 -0
- data/lib/beaker-puppet/helpers/tk_helpers.rb +89 -0
- data/lib/beaker-puppet/install_utils/aio_defaults.rb +93 -0
- data/lib/beaker-puppet/install_utils/ezbake_utils.rb +256 -0
- data/lib/beaker-puppet/install_utils/foss_defaults.rb +211 -0
- data/lib/beaker-puppet/install_utils/foss_utils.rb +1309 -0
- data/lib/beaker-puppet/install_utils/module_utils.rb +244 -0
- data/lib/beaker-puppet/install_utils/puppet_utils.rb +157 -0
- data/lib/beaker-puppet/version.rb +3 -0
- data/lib/beaker-puppet/wrappers.rb +93 -0
- data/lib/beaker/dsl/helpers/facter_helpers.rb +1 -0
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +1 -0
- data/lib/beaker/dsl/helpers/tk_helpers.rb +1 -0
- data/lib/beaker/dsl/install_utils/aio_defaults.rb +1 -0
- data/lib/beaker/dsl/install_utils/ezbake_utils.rb +1 -0
- data/lib/beaker/dsl/install_utils/foss_defaults.rb +1 -0
- data/lib/beaker/dsl/install_utils/foss_utils.rb +1 -0
- data/lib/beaker/dsl/install_utils/module_utils.rb +1 -0
- data/lib/beaker/dsl/install_utils/puppet_utils.rb +1 -0
- data/spec/beaker-puppet/helpers/facter_helpers_spec.rb +64 -0
- data/spec/beaker-puppet/helpers/puppet_helpers_spec.rb +1287 -0
- data/spec/beaker-puppet/helpers/tk_helpers_spec.rb +86 -0
- data/spec/helpers.rb +109 -0
- data/spec/spec_helper.rb +23 -0
- metadata +249 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
{
|
2
|
+
:type => 'foss',
|
3
|
+
:add_el_extras => 'true',
|
4
|
+
:is_puppetserver => false,
|
5
|
+
:puppetservice => 'puppet.service',
|
6
|
+
:pre_suite => 'acceptance/pre_suite/gem/install.rb',
|
7
|
+
:tests => 'acceptance/tests',
|
8
|
+
:'master-start-curl-retries' => 30,
|
9
|
+
}.merge(eval File.read('acceptance/config/acceptance-options.rb'))
|
@@ -0,0 +1,9 @@
|
|
1
|
+
{
|
2
|
+
:type => 'foss',
|
3
|
+
:add_el_extras => 'true',
|
4
|
+
:is_puppetserver => false,
|
5
|
+
:puppetservice => 'puppet.service',
|
6
|
+
:pre_suite => 'acceptance/pre_suite/git/install.rb',
|
7
|
+
:tests => 'acceptance/tests',
|
8
|
+
:'master-start-curl-retries' => 30,
|
9
|
+
}.merge(eval File.read('acceptance/config/acceptance-options.rb'))
|
@@ -0,0 +1,8 @@
|
|
1
|
+
{
|
2
|
+
:type => 'foss',
|
3
|
+
:is_puppetserver => false,
|
4
|
+
:puppetservice => 'puppet.service',
|
5
|
+
:pre_suite => 'acceptance/pre_suite/pkg/install.rb',
|
6
|
+
:tests => 'acceptance/tests',
|
7
|
+
:'master-start-curl-retries' => 30,
|
8
|
+
}.merge(eval File.read('acceptance/config/acceptance-options.rb'))
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Beaker
|
2
|
+
module Acceptance
|
3
|
+
module InstallUtils
|
4
|
+
|
5
|
+
PLATFORM_PATTERNS = {
|
6
|
+
:redhat => /fedora|el|centos/,
|
7
|
+
:debian => /debian|ubuntu/,
|
8
|
+
:debian_ruby18 => /debian|ubuntu-lucid|ubuntu-precise/,
|
9
|
+
:solaris_10 => /solaris-10/,
|
10
|
+
:solaris_11 => /solaris-11/,
|
11
|
+
:windows => /windows/,
|
12
|
+
:sles => /sles/,
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
# Installs packages on the hosts.
|
16
|
+
#
|
17
|
+
# @param hosts [Array<Host>] Array of hosts to install packages to.
|
18
|
+
# @param package_hash [Hash{Symbol=>Array<String,Array<String,String>>}]
|
19
|
+
# Keys should be a symbol for a platform in PLATFORM_PATTERNS. Values
|
20
|
+
# should be an array of package names to install, or of two element
|
21
|
+
# arrays where a[0] is the command we expect to find on the platform
|
22
|
+
# and a[1] is the package name (when they are different).
|
23
|
+
# @param options [Hash{Symbol=>Boolean}]
|
24
|
+
# @option options [Boolean] :check_if_exists First check to see if
|
25
|
+
# command is present before installing package. (Default false)
|
26
|
+
# @return true
|
27
|
+
def install_packages_on(hosts, package_hash, options = {})
|
28
|
+
return true if hosts == nil
|
29
|
+
check_if_exists = options[:check_if_exists]
|
30
|
+
hosts = [hosts] unless hosts.kind_of?(Array)
|
31
|
+
hosts.each do |host|
|
32
|
+
package_hash.each do |platform_key,package_list|
|
33
|
+
if pattern = PLATFORM_PATTERNS[platform_key]
|
34
|
+
if pattern.match(host['platform'])
|
35
|
+
package_list.each do |cmd_pkg|
|
36
|
+
if cmd_pkg.kind_of?(Array)
|
37
|
+
command, package = cmd_pkg
|
38
|
+
else
|
39
|
+
command = package = cmd_pkg
|
40
|
+
end
|
41
|
+
if !check_if_exists || !host.check_for_package(command)
|
42
|
+
host.logger.notify("Installing #{package}")
|
43
|
+
additional_switches = '--allow-unauthenticated' if platform_key == :debian
|
44
|
+
host.install_package(package, additional_switches)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
else
|
49
|
+
raise("Unknown platform '#{platform_key}' in package_hash")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
hosts.each do |host|
|
2
|
+
install_puppet_from_gem(host, {:version => '3.8.7'})
|
3
|
+
unless host['platform'] =~ /windows/
|
4
|
+
on(host, "touch #{File.join(host.puppet['confdir'],'puppet.conf')}")
|
5
|
+
on(host, puppet('resource user puppet ensure=present'))
|
6
|
+
on(host, puppet('resource group puppet ensure=present'))
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
begin
|
2
|
+
require 'beaker/acceptance/install_utils'
|
3
|
+
extend Beaker::Acceptance::InstallUtils
|
4
|
+
end
|
5
|
+
test_name 'Puppet git pre-suite'
|
6
|
+
|
7
|
+
install = [
|
8
|
+
'facter#2.1.0',
|
9
|
+
'hiera#1.3.4',
|
10
|
+
'puppet#3.8.7'
|
11
|
+
]
|
12
|
+
|
13
|
+
SourcePath = Beaker::DSL::InstallUtils::SourcePath
|
14
|
+
|
15
|
+
PACKAGES = {
|
16
|
+
:redhat => [
|
17
|
+
'git',
|
18
|
+
'ruby',
|
19
|
+
'rubygem-json', # :add_el_extras is required to find this package
|
20
|
+
],
|
21
|
+
:debian => [
|
22
|
+
['git', 'git-core'],
|
23
|
+
'ruby',
|
24
|
+
],
|
25
|
+
:debian_ruby18 => [
|
26
|
+
'libjson-ruby',
|
27
|
+
],
|
28
|
+
:solaris_11 => [
|
29
|
+
['git', 'developer/versioning/git'],
|
30
|
+
['ruby', 'runtime/ruby-18'],
|
31
|
+
],
|
32
|
+
:solaris_10 => [
|
33
|
+
'coreutils',
|
34
|
+
'curl', # update curl to fix "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!" issue
|
35
|
+
'git',
|
36
|
+
'ruby19',
|
37
|
+
'ruby19_dev',
|
38
|
+
'gcc4core',
|
39
|
+
],
|
40
|
+
:windows => [
|
41
|
+
'git',
|
42
|
+
# there isn't a need for json on windows because it is bundled in ruby 1.9
|
43
|
+
],
|
44
|
+
:sles => [
|
45
|
+
'git-core',
|
46
|
+
]
|
47
|
+
}
|
48
|
+
|
49
|
+
install_packages_on(hosts, PACKAGES, :check_if_exists => true)
|
50
|
+
|
51
|
+
hosts.each do |host|
|
52
|
+
case host['platform']
|
53
|
+
when /windows/
|
54
|
+
arch = host[:ruby_arch] || 'x86'
|
55
|
+
step "#{host} Selected architecture #{arch}"
|
56
|
+
|
57
|
+
revision = if arch == 'x64'
|
58
|
+
'2.1.x-x64'
|
59
|
+
else
|
60
|
+
'2.1.x-x86'
|
61
|
+
end
|
62
|
+
|
63
|
+
step "#{host} Install ruby from git using revision #{revision}"
|
64
|
+
# TODO remove this step once we are installing puppet from msi packages
|
65
|
+
install_from_git(host, "/opt/puppet-git-repos",
|
66
|
+
:name => 'puppet-win32-ruby',
|
67
|
+
:path => build_giturl('puppet-win32-ruby'),
|
68
|
+
:rev => revision)
|
69
|
+
on host, 'cd /opt/puppet-git-repos/puppet-win32-ruby; cp -r ruby/* /'
|
70
|
+
on host, 'cd /lib; icacls ruby /grant "Everyone:(OI)(CI)(RX)"'
|
71
|
+
on host, 'cd /lib; icacls ruby /reset /T'
|
72
|
+
on host, 'cd /; icacls bin /grant "Everyone:(OI)(CI)(RX)"'
|
73
|
+
on host, 'cd /; icacls bin /reset /T'
|
74
|
+
on host, 'ruby --version'
|
75
|
+
on host, 'cmd /c gem list'
|
76
|
+
when /solaris/
|
77
|
+
on host, 'gem install json'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
tmp_repos = []
|
82
|
+
install.each do |reponame|
|
83
|
+
tmp_repos << extract_repo_info_from("https://github.com/puppetlabs/#{reponame}")
|
84
|
+
end
|
85
|
+
|
86
|
+
repos = order_packages(tmp_repos)
|
87
|
+
|
88
|
+
hosts.each do |host|
|
89
|
+
repos.each do |repo|
|
90
|
+
install_from_git(host, SourcePath, repo)
|
91
|
+
end
|
92
|
+
unless host['platform'] =~ /windows/
|
93
|
+
on(host, "touch #{File.join(host.puppet['confdir'],'puppet.conf')}")
|
94
|
+
on(host, puppet('resource user puppet ensure=present'))
|
95
|
+
on(host, puppet('resource group puppet ensure=present'))
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# the version is required on windows
|
2
|
+
# all versions are required for osx
|
3
|
+
install_puppet({
|
4
|
+
:version => ENV['BEAKER_PUPPET_VERSION'] || '4.8.0',
|
5
|
+
:puppet_agent_version => ENV['BEAKER_PUPPET_AGENT_VERSION'] || '1.8.0'
|
6
|
+
})
|
7
|
+
|
8
|
+
on(master, puppet('resource user puppet ensure=present'))
|
9
|
+
on(master, puppet('resource group puppet ensure=present'))
|
@@ -0,0 +1,19 @@
|
|
1
|
+
test_name 'backwards compatible test' do
|
2
|
+
|
3
|
+
step 'calls the new FOSSUtils even if I require & include the old path' do
|
4
|
+
require 'beaker/dsl/install_utils/foss_utils'
|
5
|
+
assert( !Beaker::DSL::InstallUtils::FOSSUtils::SourcePath.nil? )
|
6
|
+
assert( Beaker::DSL::InstallUtils::FOSSUtils.method_defined?(:lookup_in_env) )
|
7
|
+
end
|
8
|
+
|
9
|
+
step 'require old Helpers path, get helpers from new location' do
|
10
|
+
require 'beaker/dsl/helpers/puppet_helpers'
|
11
|
+
assert( Beaker::DSL::Helpers::PuppetHelpers.method_defined?(:puppet_user) )
|
12
|
+
assert( Beaker::DSL::Helpers::PuppetHelpers.method_defined?(:resolve_hostname_on) )
|
13
|
+
end
|
14
|
+
|
15
|
+
step 'require old Helpers module, get from new location' do
|
16
|
+
require 'beaker/dsl/helpers'
|
17
|
+
assert( Beaker::DSL::Helpers.is_a?( Module ) )
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
test_name "puppet install smoketest"
|
2
|
+
|
3
|
+
step 'puppet install smoketest: verify \'facter --help\' can be successfully called on all hosts'
|
4
|
+
hosts.each do |host|
|
5
|
+
on host, facter('--help')
|
6
|
+
end
|
7
|
+
|
8
|
+
step 'puppet install smoketest: verify \'hiera --help\' can be successfully called on all hosts'
|
9
|
+
hosts.each do |host|
|
10
|
+
on host, hiera('--help')
|
11
|
+
end
|
12
|
+
|
13
|
+
step 'puppet install smoketest: verify \'puppet help\' can be successfully called on all hosts'
|
14
|
+
hosts.each do |host|
|
15
|
+
on host, puppet('help')
|
16
|
+
end
|
17
|
+
|
18
|
+
step "puppet install smoketest: can get a configprint of the puppet server setting on all hosts"
|
19
|
+
hosts.each do |host|
|
20
|
+
assert(!host.puppet['server'].empty?, "can get a configprint of the puppet server setting")
|
21
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
test_name "validate host stubbing behavior"
|
2
|
+
|
3
|
+
def get_hosts_file(host)
|
4
|
+
if host['platform'] =~ /win/
|
5
|
+
hosts_file = "C:\\\\Windows\\\\System32\\\\Drivers\\\\etc\\\\hosts"
|
6
|
+
else
|
7
|
+
hosts_file = '/etc/hosts'
|
8
|
+
end
|
9
|
+
return hosts_file
|
10
|
+
end
|
11
|
+
|
12
|
+
step 'verify stub_host_on' do
|
13
|
+
step 'should add entry to hosts file' do
|
14
|
+
hosts.each do |host|
|
15
|
+
stub_hosts_on(host, { 'foo' => '1.1.1.1' }, { 'foo' => [ 'bar', 'baz' ] })
|
16
|
+
hosts_file = get_hosts_file(host)
|
17
|
+
result = on host, "cat #{hosts_file}"
|
18
|
+
assert_match %r{foo}, result.stdout
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
step 'stubbed value should be available for other steps in the test' do
|
23
|
+
hosts.each do |host|
|
24
|
+
hosts_file = get_hosts_file(host)
|
25
|
+
result = on host, "cat #{hosts_file}"
|
26
|
+
assert_match %r{foo}, result.stdout
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
step 'verify with_stub_host_on' do
|
32
|
+
step 'should add entry to hosts file' do
|
33
|
+
hosts.each do |host|
|
34
|
+
hosts_file = get_hosts_file(host)
|
35
|
+
result = with_host_stubbed_on(host, { 'sleepy' => '1.1.1.2' }, { 'sleepy' => [ 'grumpy', 'dopey' ] }) { on host, "cat #{hosts_file}" }
|
36
|
+
assert_match %r{sleepy}, result.stdout
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
step 'stubbed value should be reverted after the execution of the block' do
|
41
|
+
hosts.each do |host|
|
42
|
+
hosts_file = get_hosts_file(host)
|
43
|
+
result = on host, "cat #{hosts_file}"
|
44
|
+
assert_no_match %r{sleepy}, result.stdout
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require 'webrick/https'
|
3
|
+
|
4
|
+
test_name 'dsl::helpers::web_helpers #link_exists?' do
|
5
|
+
cert_name = [
|
6
|
+
%w[CN localhost],
|
7
|
+
]
|
8
|
+
http_cmd = "ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => \"/tmp\").start' > /tmp/mylogfile 2>&1 &"
|
9
|
+
https_cmd = "ruby -rwebrick/https -e'WEBrick::HTTPServer.new(:SSLEnable => true, :SSLCertName => #{cert_name}, :Port => 555,:DocumentRoot => \"/tmp\").start' > /tmp/mylogfile 2>&1 &"
|
10
|
+
on(default, http_cmd)
|
11
|
+
on(default, https_cmd)
|
12
|
+
#allow web servers to start up
|
13
|
+
sleep(3)
|
14
|
+
dir = default.tmpdir('test_dir')
|
15
|
+
file = default.tmpfile('test_file')
|
16
|
+
dir.slice! "/tmp"
|
17
|
+
file.slice! "/tmp"
|
18
|
+
dst_dir = 'web_helpers'
|
19
|
+
|
20
|
+
step '#port_open_within? can tell if a port is open' do
|
21
|
+
assert port_open_within?(default,80)
|
22
|
+
end
|
23
|
+
|
24
|
+
step '#link_exists? can tell if a basic link exists' do
|
25
|
+
assert link_exists?("http://#{default}")
|
26
|
+
end
|
27
|
+
|
28
|
+
step '#link_exists? can tell if a basic link does not exist' do
|
29
|
+
assert !link_exists?("http://#{default}/test")
|
30
|
+
end
|
31
|
+
|
32
|
+
step '#link_exists? can use an ssl link' do
|
33
|
+
assert link_exists?("https://#{default}:555")
|
34
|
+
end
|
35
|
+
|
36
|
+
step '#fetch_http_dir can fetch a dir' do
|
37
|
+
assert_equal "#{dst_dir}#{dir}", fetch_http_dir("http://#{default}/#{dir}", dst_dir)
|
38
|
+
end
|
39
|
+
|
40
|
+
step '#fetch_http_dir will raise an error if unable fetch a dir' do
|
41
|
+
exception = assert_raises(RuntimeError) { fetch_http_dir("http://#{default}/tmps", dst_dir) }
|
42
|
+
assert_match /Failed to fetch_remote_dir.*/, exception.message, "#fetch_http_dir raised an unexpected RuntimeError"
|
43
|
+
end
|
44
|
+
|
45
|
+
step '#fetch_http_file can fetch a file' do
|
46
|
+
assert_equal "#{dst_dir}#{file}", fetch_http_file("http://#{default}", file, dst_dir)
|
47
|
+
end
|
48
|
+
|
49
|
+
step '#fetch_http_file will raise an error if unable to fetch a file' do
|
50
|
+
exception = assert_raises(RuntimeError) { fetch_http_file("http://#{default}", "test2.txt", dst_dir) }
|
51
|
+
assert_match /Failed to fetch_remote_file.*/, exception.message, "#fetch_http_dir raised an unexpected RuntimeError"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
test_name 'skip_test in with_puppet_running_on' do
|
2
|
+
assert_raises SkipTest do
|
3
|
+
with_puppet_running_on(master, {}) do
|
4
|
+
skip_test 'skip rest'
|
5
|
+
assert(false)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
test_name 'pending_test in with_puppet_running_on' do
|
11
|
+
assert_raises PendingTest do
|
12
|
+
with_puppet_running_on(master, {}) do
|
13
|
+
pending_test 'pending appendix prepended'
|
14
|
+
assert(false)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
test_name 'fail_test in with_puppet_running_on' do
|
20
|
+
assert_raises FailTest do
|
21
|
+
with_puppet_running_on(master, {}) do
|
22
|
+
fail_test 'fail_test message'
|
23
|
+
assert(false)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
3
|
+
require 'beaker-puppet/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "beaker-puppet"
|
7
|
+
s.version = BeakerPuppet::VERSION
|
8
|
+
s.authors = ["Puppet"]
|
9
|
+
s.email = ["delivery@puppet.com"]
|
10
|
+
s.homepage = "https://github.com/puppetlabs/beaker-puppet"
|
11
|
+
s.summary = %q{Beaker's Puppet DSL Extension Helpers!}
|
12
|
+
s.description = %q{For use for the Beaker acceptance testing tool}
|
13
|
+
s.license = 'Apache2'
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
# Testing dependencies
|
21
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
22
|
+
s.add_development_dependency 'rspec-its'
|
23
|
+
s.add_development_dependency 'fakefs', '~> 0.6'
|
24
|
+
s.add_development_dependency 'rake', '~> 10.1'
|
25
|
+
s.add_development_dependency 'simplecov'
|
26
|
+
s.add_development_dependency 'pry', '~> 0.10'
|
27
|
+
|
28
|
+
# Documentation dependencies
|
29
|
+
s.add_development_dependency 'yard'
|
30
|
+
s.add_development_dependency 'markdown'
|
31
|
+
s.add_development_dependency 'thin'
|
32
|
+
|
33
|
+
# Run time dependencies
|
34
|
+
s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
|
35
|
+
s.add_runtime_dependency 'in-parallel', '~> 0.1'
|
36
|
+
|
37
|
+
end
|
38
|
+
|