r10k 1.1.4 → 1.2.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +1 -0
- data/.nodeset.yml +7 -0
- data/.rspec +1 -0
- data/.travis.yml +2 -1
- data/CHANGELOG +17 -12
- data/Gemfile +8 -0
- data/README.markdown +4 -2
- data/Rakefile +1 -0
- data/doc/dynamic-environments.markdown +206 -0
- data/doc/puppetfile.markdown +87 -0
- data/lib/r10k/cli.rb +1 -1
- data/lib/r10k/errors.rb +30 -3
- data/lib/r10k/execution.rb +5 -2
- data/lib/r10k/git/cache.rb +26 -42
- data/lib/r10k/git/commit.rb +22 -0
- data/lib/r10k/git/errors.rb +31 -22
- data/lib/r10k/git/head.rb +33 -0
- data/lib/r10k/git/ref.rb +63 -0
- data/lib/r10k/git/repository.rb +65 -36
- data/lib/r10k/git/tag.rb +26 -0
- data/lib/r10k/git/working_dir.rb +93 -83
- data/lib/r10k/git.rb +14 -0
- data/lib/r10k/module/forge.rb +129 -62
- data/lib/r10k/module/git.rb +72 -6
- data/lib/r10k/module/metadata.rb +47 -0
- data/lib/r10k/module/svn.rb +99 -0
- data/lib/r10k/module.rb +1 -0
- data/lib/r10k/module_repository/forge.rb +64 -0
- data/lib/r10k/module_repository.rb +8 -0
- data/lib/r10k/semver.rb +1 -1
- data/lib/r10k/svn/working_dir.rb +76 -0
- data/lib/r10k/task/deployment.rb +21 -28
- data/lib/r10k/util/subprocess/io.rb +12 -0
- data/lib/r10k/util/subprocess/result.rb +36 -0
- data/lib/r10k/util/subprocess/runner.rb +88 -0
- data/lib/r10k/util/subprocess.rb +107 -0
- data/lib/r10k/version.rb +1 -1
- data/r10k.gemspec +11 -1
- data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/and_the_expected_version_is_latest/can_fetch_all_versions_of_a_given_module.yml +42 -0
- data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/and_the_expected_version_is_latest/can_fetch_the_latest_version_of_a_given_module.yml +42 -0
- data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/looking_up_versions/can_fetch_all_versions_of_a_given_module.yml +42 -0
- data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/looking_up_versions/can_fetch_the_latest_version_of_a_given_module.yml +42 -0
- data/spec/fixtures/vcr/cassettes/R10K_ModuleRepository_Forge/looking_up_versions.yml +42 -0
- data/spec/fixtures/vcr/cassettes/R10K_Module_Forge/and_the_expected_version_is_latest/sets_the_expected_version_based_on_the_latest_forge_version.yml +42 -0
- data/spec/rspec-system-r10k/puppetfile.rb +24 -0
- data/spec/rspec-system-r10k/tmpdir.rb +32 -0
- data/spec/shared-examples/git-ref.rb +49 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/system/module/forge/install_spec.rb +51 -0
- data/spec/system/module/git/install_spec.rb +117 -0
- data/spec/system/module/svn/install_spec.rb +51 -0
- data/spec/system/module/svn/update_spec.rb +38 -0
- data/spec/system/spec_helper.rb +60 -0
- data/spec/system/system-helpers.rb +4 -0
- data/spec/system/version_spec.rb +7 -0
- data/spec/system-provisioning/el.rb +38 -0
- data/spec/unit/deployment/source_spec.rb +1 -1
- data/spec/unit/git/cache_spec.rb +38 -0
- data/spec/unit/git/commit_spec.rb +33 -0
- data/spec/unit/git/head_spec.rb +27 -0
- data/spec/unit/git/ref_spec.rb +68 -0
- data/spec/unit/git/tag_spec.rb +31 -0
- data/spec/unit/module/forge_spec.rb +157 -37
- data/spec/unit/module/git_spec.rb +49 -0
- data/spec/unit/module/metadata_spec.rb +68 -0
- data/spec/unit/module/svn_spec.rb +146 -0
- data/spec/unit/module_repository/forge_spec.rb +32 -0
- metadata +151 -8
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDUwMzg3OTY2MGUxZjA3MmFkMmQyNTAxOTUyMTc2YmJjNDU3ZWIyMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODkwYWNjOGRjNzcyMGEwYTJiOTM5ZmE0ZDcwYjdlYzdkYjkwMmE2YQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZmRmZmJiMjRkMGM3MjcwZGRlODk2YTAzZDM4ZTYwNTFhZTNhYjA0ZTg4Yzg5
|
10
|
+
M2M3OTI2YjgxYjdjZTE3NjQ5MWU1MmY3ZTcxYTg0ZTA1MDQ0MmI0ODI0NTI3
|
11
|
+
NWJmMDk0M2NhODczNjllNzA4MDU4ODJiNjRmOWQ4NzNjMmQ3YmU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzExZTMyY2VjZTI4N2E3M2M2NjQ3Yzg4YTZmYzZjMjUwMmE0ZmQ4MjNmMWJk
|
14
|
+
MmY3NTEwNmJlNDVkNWI5MGEyN2MwMjZjMmQ0NjYyYmJmZTQ0ZGNkYTU2MzZi
|
15
|
+
NWRmZTViMTBjZGEzYTAwOTdiMmYzYmNkMmM2NThkM2U1MGQyMjk=
|
data/.gitignore
CHANGED
data/.nodeset.yml
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--default_path spec/unit
|
data/.travis.yml
CHANGED
data/CHANGELOG
CHANGED
@@ -1,26 +1,31 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
-
1.
|
4
|
+
1.2.0
|
5
5
|
-----
|
6
6
|
|
7
|
-
2014
|
7
|
+
2014/02/08
|
8
8
|
|
9
|
-
|
9
|
+
### User Notes
|
10
10
|
|
11
|
-
|
11
|
+
Preliminary support for Puppetfile modules from SVN sources. SVN repositories
|
12
|
+
can track the latest available revision or may be pinned to a specific revision.
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
been fixed and all environments should be deployed when updates are run.
|
14
|
+
Forge modules can now track the latest available version. This can be enabled by
|
15
|
+
setting the module version to `:latest`.
|
16
16
|
|
17
|
-
|
17
|
+
Git based Puppetfile modules can now be specified as branches, tags, and
|
18
|
+
commits. When tags and commits are specified r10k can perform optimizations
|
19
|
+
when updating the given repositories to reduce network accesses.
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
+
Command execution has been greatly improved. The old library for executing
|
22
|
+
commands (systemu) had very high overhead and was 50 - 100 times slower than
|
23
|
+
%x[] or fork/exec. It's been replaced with a custom process execution
|
24
|
+
implementation.
|
21
25
|
|
22
|
-
|
23
|
-
|
26
|
+
Modules can swap out sources. When an existing module is changed from Forge to
|
27
|
+
Git, for instance, the existing module will be removed before the new module is
|
28
|
+
installed. (GH-30)
|
24
29
|
|
25
30
|
1.1.3
|
26
31
|
-----
|
data/Gemfile
CHANGED
@@ -2,6 +2,14 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
+
group(:system) do
|
6
|
+
gem 'rake'
|
7
|
+
gem 'rspec-system', '~> 2.8.0'
|
8
|
+
gem 'rspec-system-serverspec', '~> 2.0.1'
|
9
|
+
gem 'net-ssh', '2.7.0'
|
10
|
+
gem 'vagrant', :git => 'git://github.com/mitchellh/vagrant', :tag => 'v1.4.1'
|
11
|
+
end
|
12
|
+
|
5
13
|
if File.exists? "#{__FILE__}.local"
|
6
14
|
eval(File.read("#{__FILE__}.local"), binding)
|
7
15
|
end
|
data/README.markdown
CHANGED
@@ -75,9 +75,11 @@ Common Commands
|
|
75
75
|
Puppetfile support
|
76
76
|
------------------
|
77
77
|
|
78
|
-
r10k can operate on a Puppetfile
|
78
|
+
r10k can operate on a Puppetfile using the same syntax as librarian-puppet uses.
|
79
79
|
Puppetfiles are a simple Ruby based DSL that specifies a list of modules to
|
80
|
-
install, what version to install, and where to fetch them from.
|
80
|
+
install, what version to install, and where to fetch them from. Unlike
|
81
|
+
librarian-puppet dependency resolution is not yet implemented but is on the
|
82
|
+
roadmap.
|
81
83
|
|
82
84
|
Puppetfile based commands are under the `r10k puppetfile` subcommand.
|
83
85
|
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rspec-system/rake_task'
|
@@ -0,0 +1,206 @@
|
|
1
|
+
Dynamic Environments
|
2
|
+
====================
|
3
|
+
|
4
|
+
r10k implements the dynamic environment workflow with Puppet. This allows you to
|
5
|
+
create, modify, and remove Puppet environments on the fly with Git branches.
|
6
|
+
|
7
|
+
Dynamic Environments in a nutshell
|
8
|
+
----------------------------------
|
9
|
+
|
10
|
+
The core idea of dynamic environments is that you should be able to manage your
|
11
|
+
Puppet modules in the same manner that you would manage any other code base. It
|
12
|
+
builds on top of Git topic branch model.
|
13
|
+
|
14
|
+
[git-topic-branching]: http://git-scm.com/book/en/Git-Branching-Branching-Workflows#Topic-Branches "Git Topic Branches"
|
15
|
+
|
16
|
+
One of the most prevalent ways of using Git relies on using [topic branches][git-topic-branching].
|
17
|
+
Whenever changes need to be made that need to be reviewed or tested before going
|
18
|
+
live, they should be done in a different, short lived branch called a topic
|
19
|
+
branch. Work can be freely done on a topic branch in isolation and when the work
|
20
|
+
is completed it is merged into a "master" or "production" branch. This is very
|
21
|
+
powerful because it allows any number of people to rapidly develop features in
|
22
|
+
isolation and merge features in a single operation.
|
23
|
+
|
24
|
+
The dynamic environment model extends extends this git branching strategy to
|
25
|
+
your live Puppet masters. It creates a mapping between Git branches and Puppet
|
26
|
+
environments so that you can use the Git branching model and have that be
|
27
|
+
seamlessly reflected in Puppet environments. This means that creating a new Git
|
28
|
+
branch creates a new Puppet environment, updating a Git branch will update that
|
29
|
+
environment, and deleting a Git branch will remove that environment.
|
30
|
+
|
31
|
+
How it works
|
32
|
+
------------
|
33
|
+
|
34
|
+
r10k works by tracking the state of your git repositories and comparing them the
|
35
|
+
the currently deployed environments. If there's a Git branch that doesn't have a
|
36
|
+
corresponding Puppet environment then r10k will clone that branch into the
|
37
|
+
appropriate directory. When Git branches are updated r10k will update the
|
38
|
+
appropriate Puppet environment to the latest version. Finally if there are
|
39
|
+
Puppet environments that don't have matching Git branches, r10k will assume that
|
40
|
+
the branches for those environments were deleted and will remove those
|
41
|
+
environments.
|
42
|
+
|
43
|
+
Configuration
|
44
|
+
-------------
|
45
|
+
|
46
|
+
r10k uses a configuration file to determine how dynamic environments should be
|
47
|
+
deployed.
|
48
|
+
|
49
|
+
### Config file location
|
50
|
+
|
51
|
+
By default r10k will try to read `/etc/r10k.yaml` for configuration settings.
|
52
|
+
You can specify an alternate configuration file by specifying the `--config`
|
53
|
+
option, like so:
|
54
|
+
|
55
|
+
r10k deploy -c /srv/puppet/r10k.yaml
|
56
|
+
|
57
|
+
### Configuration format
|
58
|
+
|
59
|
+
#### cachedir
|
60
|
+
|
61
|
+
The `cachedir` setting specifies where r10k should keep cached information.
|
62
|
+
Right now this is predominantly used for caching git repositories but will be
|
63
|
+
expanded as other subsystems can take advantage of caching.
|
64
|
+
|
65
|
+
For example:
|
66
|
+
|
67
|
+
---
|
68
|
+
# Store all cache information in /var/cache
|
69
|
+
cachedir: '/var/cache/r10k'
|
70
|
+
|
71
|
+
#### sources
|
72
|
+
|
73
|
+
The `sources` setting specifies what repositories should be used for creating
|
74
|
+
dynamic environments.
|
75
|
+
|
76
|
+
The `sources` setting is a hash where each key is the short name of a specific
|
77
|
+
repository (for instance, "qa" or "web" or "ops") and the value is a hash of
|
78
|
+
properties for that source.
|
79
|
+
|
80
|
+
#### source sub-options
|
81
|
+
|
82
|
+
##### remote
|
83
|
+
|
84
|
+
The remote is the URL of the Git repository to clone. This repository will need
|
85
|
+
to be cloned without user intervention so SSH keys will need to be configured
|
86
|
+
for the user running r10k.
|
87
|
+
|
88
|
+
##### basedir
|
89
|
+
|
90
|
+
The basedir is the directory that will be populated with Puppet environments.
|
91
|
+
This directory will be entirely managed by r10k and any contents that r10k did
|
92
|
+
not put there will be _removed_.
|
93
|
+
|
94
|
+
##### prefix
|
95
|
+
|
96
|
+
The prefix setting allows environment names to be prefixed with the short name
|
97
|
+
of the given source. This prevents collisions when multiple sources are deployed
|
98
|
+
into the same directory.
|
99
|
+
|
100
|
+
#### source examples
|
101
|
+
|
102
|
+
##### Basic examples
|
103
|
+
|
104
|
+
The majority of users will only have a single repository where all modules and
|
105
|
+
hiera data files are kept. In this case you will specify a single source:
|
106
|
+
|
107
|
+
---
|
108
|
+
# Specify a single environment source
|
109
|
+
sources:
|
110
|
+
operations:
|
111
|
+
remote: 'git@github.com:my-org/org-modules'
|
112
|
+
basedir: '/etc/puppet/environments'
|
113
|
+
|
114
|
+
- - -
|
115
|
+
|
116
|
+
##### Advanced examples
|
117
|
+
|
118
|
+
For more complex cases where you want to store hiera data in a different
|
119
|
+
repository and your modules in another repository, you can specify two sources:
|
120
|
+
|
121
|
+
---
|
122
|
+
sources:
|
123
|
+
operations:
|
124
|
+
remote: 'git@github.com:my-org/org-modules'
|
125
|
+
basedir: '/etc/puppet/environments'
|
126
|
+
hiera:
|
127
|
+
remote: 'git@github.com:my-org/org-hiera-data'
|
128
|
+
basedir: '/etc/puppet/hiera-data'
|
129
|
+
|
130
|
+
- - -
|
131
|
+
|
132
|
+
Alternately you may want to create separate environments from multiple
|
133
|
+
repositories. This is useful when you want two groups to be able to deploy
|
134
|
+
Puppet modules but they should only have write access to their own modules and
|
135
|
+
not the modules of other groups.
|
136
|
+
|
137
|
+
---
|
138
|
+
sources:
|
139
|
+
main:
|
140
|
+
remote: 'git@github.com:my-org/main-modules'
|
141
|
+
basedir: '/etc/puppet/environments'
|
142
|
+
prefix: false # Prefix defaults to false so this is only here for clarity
|
143
|
+
qa:
|
144
|
+
remote: 'git@github.com:my-org/qa-puppet-modules'
|
145
|
+
basedir: '/etc/puppet/environments'
|
146
|
+
prefix: true
|
147
|
+
dev:
|
148
|
+
remote: 'git@github.com:my-org/dev-puppet-modules'
|
149
|
+
basedir: '/etc/puppet/environments'
|
150
|
+
prefix: true
|
151
|
+
|
152
|
+
This will create the following directory structure:
|
153
|
+
|
154
|
+
|
155
|
+
/etc/puppet/environments
|
156
|
+
|-- production # main-modules repository, production branch
|
157
|
+
|-- upgrade_apache # main-modules repository, upgrade_apache branch
|
158
|
+
|-- qa_production # qa repository, production branch
|
159
|
+
|-- qa_jenkins_test # qa repository, jenkins_test branch
|
160
|
+
|-- dev_production # dev repository, production branch
|
161
|
+
`-- dev_loadtest # dev repository, loadtest branch
|
162
|
+
|
163
|
+
Dynamic environments and Puppetfiles
|
164
|
+
------------------------------------
|
165
|
+
|
166
|
+
TODO
|
167
|
+
|
168
|
+
Interacting with dynamic environments
|
169
|
+
-------------------------------------
|
170
|
+
|
171
|
+
r10k provides fairly fine grained controls over your environments to fit your
|
172
|
+
needs. If you want to do a full update of all of your environments and modules
|
173
|
+
and don't need it to be done in real time, you can trigger a full update and let
|
174
|
+
it run in the background. If you are actively developing code and need to run
|
175
|
+
very fast updates of one specific environment, you can do a targeted update of
|
176
|
+
that code as well.
|
177
|
+
|
178
|
+
All commands that deal with deploying environments are grouped under the `r10k
|
179
|
+
deploy` subcommand.
|
180
|
+
|
181
|
+
### Examples
|
182
|
+
|
183
|
+
#### Deploying environments
|
184
|
+
|
185
|
+
# Update all environments across all sources. This can be slow depending
|
186
|
+
# on the number of environments and modules that you're using.
|
187
|
+
r10k deploy environment
|
188
|
+
|
189
|
+
# Update a single environment. When you're actively working on an
|
190
|
+
# environment this is the best way to deploy your changes.
|
191
|
+
r10k deploy environment my_working_environment
|
192
|
+
|
193
|
+
# This is the brute force approach of "update everything, ever." This can
|
194
|
+
# run for an extremely long time so it should not be something you run
|
195
|
+
# interactively on a regular basis.
|
196
|
+
r10k deploy environment --puppetfile
|
197
|
+
|
198
|
+
#### Deploying modules
|
199
|
+
|
200
|
+
# Update a single module across all environments This is useful for when
|
201
|
+
# you're working on a module in an environment and only want to update that
|
202
|
+
# one module.
|
203
|
+
r10k deploy module apache
|
204
|
+
|
205
|
+
# More than one module can be updated at a time.
|
206
|
+
r10k deploy module apache jenkins java
|
@@ -0,0 +1,87 @@
|
|
1
|
+
Puppetfile
|
2
|
+
==========
|
3
|
+
|
4
|
+
The Puppetfile is a way to reuse independent Puppet modules in your codebase.
|
5
|
+
|
6
|
+
When directly working with Puppetfiles, you can use the `r10k puppetfile`
|
7
|
+
subcommand to interact with a Puppetfile.
|
8
|
+
|
9
|
+
When using r10k's deploy functionality, interacting with Puppetfiles is handled
|
10
|
+
on a case by case basis.
|
11
|
+
|
12
|
+
The Puppetfile format is actually implemented using a Ruby DSL so any valid Ruby
|
13
|
+
expression can be used. That being said, being a bit too creative in the DSL
|
14
|
+
can lead to surprising (read: bad) things happening, so consider keeping it
|
15
|
+
simple.
|
16
|
+
|
17
|
+
Module types
|
18
|
+
------------
|
19
|
+
|
20
|
+
### Git
|
21
|
+
|
22
|
+
Modules can be installed via git.
|
23
|
+
|
24
|
+
#### Examples
|
25
|
+
|
26
|
+
# Install puppetlabs/apache and keep it up to date with 'master'
|
27
|
+
mod 'apache',
|
28
|
+
:git => 'https://github.com/puppetlabs/puppetlabs-apache'
|
29
|
+
|
30
|
+
# Install puppetlabs/apache and track the 'docs_experiment' branch
|
31
|
+
mod 'apache',
|
32
|
+
:git => 'https://github.com/puppetlabs/puppetlabs-apache',
|
33
|
+
:ref => 'docs_experiment'
|
34
|
+
|
35
|
+
You can also use the exact object type you want to check out. This may be a
|
36
|
+
little bit more work but it has the advantage that r10k make certain
|
37
|
+
optimizations based on the object type that you specify.
|
38
|
+
|
39
|
+
mod 'apache',
|
40
|
+
:git => 'https://github.com/puppetlabs/puppetlabs-apache',
|
41
|
+
:tag => '0.9.0'
|
42
|
+
|
43
|
+
mod 'apache',
|
44
|
+
:git => 'https://github.com/puppetlabs/puppetlabs-apache',
|
45
|
+
:commit => '83401079053dca11d61945bd9beef9ecf7576cbf'
|
46
|
+
|
47
|
+
You can also explicitly specify a branch, but this behaves the same as
|
48
|
+
specifying :ref and is mainly useful for clarity.
|
49
|
+
|
50
|
+
mod 'apache',
|
51
|
+
:git => 'https://github.com/puppetlabs/puppetlabs-apache',
|
52
|
+
:branch => 'docs_experiment'
|
53
|
+
|
54
|
+
### Forge
|
55
|
+
|
56
|
+
Modules can be installed using the Puppet module tool.
|
57
|
+
|
58
|
+
If no version is specified the latest version available at the time will be
|
59
|
+
installed, and will be kept at that version.
|
60
|
+
|
61
|
+
mod 'puppetlabs/apache'
|
62
|
+
|
63
|
+
If a version is specified then that version will be installed.
|
64
|
+
|
65
|
+
mod 'puppetlabs/apache', '0.10.0'
|
66
|
+
|
67
|
+
If the version is set to :latest then the module will be always updated to the
|
68
|
+
latest version available.
|
69
|
+
|
70
|
+
mod 'puppetlabs/apache', :latest
|
71
|
+
|
72
|
+
### SVN
|
73
|
+
|
74
|
+
Modules can be installed via SVN.
|
75
|
+
|
76
|
+
mod 'apache',
|
77
|
+
:svn => 'https://github.com/puppetlabs/puppetlabs-apache/trunk'
|
78
|
+
|
79
|
+
mod 'apache',
|
80
|
+
:svn => 'https://github.com/puppetlabs/puppetlabs-apache/trunk',
|
81
|
+
:rev => '154'
|
82
|
+
|
83
|
+
Alternately,
|
84
|
+
|
85
|
+
mod 'apache',
|
86
|
+
:svn => 'https://github.com/puppetlabs/puppetlabs-apache/trunk',
|
87
|
+
:revision => '154'
|
data/lib/r10k/cli.rb
CHANGED
@@ -28,7 +28,7 @@ module R10K::CLI
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
required :c, :config, 'Specify a configuration file' do |value, cmd|
|
31
|
+
required :c, :config, 'Specify a global configuration file (deprecated, use `r10k deploy -c`)' do |value, cmd|
|
32
32
|
logger.warn "Calling `r10k --config <action>` as a global option is deprecated; use r10k <action> --config"
|
33
33
|
end
|
34
34
|
|
data/lib/r10k/errors.rb
CHANGED
@@ -1,5 +1,32 @@
|
|
1
1
|
module R10K
|
2
|
-
class ExecutionFailure < StandardError
|
3
|
-
|
4
|
-
end
|
2
|
+
class ExecutionFailure < StandardError
|
3
|
+
attr_accessor :exit_code, :stdout, :stderr
|
4
|
+
end
|
5
|
+
|
6
|
+
# An error class that accepts an optional hash.
|
7
|
+
#
|
8
|
+
# @overload initialize(mesg)
|
9
|
+
# @param mesg [String] The exception mesg
|
10
|
+
#
|
11
|
+
# @overload initialize(mesg, options)
|
12
|
+
# @param mesg [String] The exception mesg
|
13
|
+
# @param options [Hash] A set of options to store on the exception
|
14
|
+
#
|
15
|
+
# @overload initialize(options)
|
16
|
+
# @param options [Hash] A set of options to store on the exception
|
17
|
+
#
|
18
|
+
class R10KError < StandardError
|
19
|
+
def initialize(mesg = nil, options = {})
|
20
|
+
if mesg.is_a? String
|
21
|
+
super(mesg)
|
22
|
+
@mesg = mesg
|
23
|
+
@options = options
|
24
|
+
elsif mesg.is_a? Hash
|
25
|
+
@mesg = nil
|
26
|
+
@options = mesg
|
27
|
+
elsif mesg.nil? and options
|
28
|
+
@options = options
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
5
32
|
end
|