spiceweasel 0.1.0 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,42 +10,31 @@ This is the current, previous and future development milestones and contains the
10
10
 
11
11
  0.2
12
12
  ===
13
- * new CLI args
14
- * --chef-client The option `--chef-client` will make a `knife ssh` call to each box and run `chef-client` on each.
15
- * --delete The option `--delete` will delete each cookbook, role, data bag, environment and node described in the yml file. All nodes from the system are deleted with `knife node bulk_delete`. Since knife does not currently manage deletion of the instances from cloud providers, that is still a required step.
13
+ * switch to mixlib-cli
14
+ * --dryrun The option `--dryrun` will print the commands to run, but not actually execute them (the default behavior)
15
+ * --delete The option `--delete` will delete each cookbook, role, data bag, environment and node described in the yml file. All nodes from the system are deleted with `knife node bulk_delete`.
16
16
  * --rebuild The option `--rebuild` will remove all currently managed infrastructure for this chef repository and rebuild it from scratch.
17
17
 
18
18
  0.3
19
19
  ===
20
- * --chef-client validation
20
+ * renamed MILESTONES.md to CHANGELOG.md
21
+ * fixed version number
22
+ * updated YAML schema and examples because Ruby 1.8 does not order hashes.
23
+ * validate that the recipes and roles listed in the nodes are loaded
24
+
25
+ 0.4
26
+ ===
27
+ * --chef-client The option `--chef-client` will make a `knife ssh` call to each box and run `chef-client` on each.
28
+ * --chef-client validation that nodes are added
21
29
 
22
30
  BACKLOG
23
31
  =======
24
- Cookbooks
25
- ---------
26
- * site vendor?
27
- * JSON?
28
-
29
- Roles
30
- -----
31
- * JSON?
32
- * validate recipes and roles have been uploaded
33
-
34
- Data Bags
35
- ---------
36
-
37
- Environments
38
- ------------
39
-
40
- Nodes
41
- -----
42
- * Provider
43
- * on delete... what to do?
32
+ * support site vendor for cookbooks
33
+ * support versions for cookbooks
34
+ * add support for environments
35
+ * make the JSON calls directly with Spice (https://github.com/danryan/spice)
36
+ * -e/--execute execute the commands
37
+ * catching return codes and retrying (with retry count?)
38
+ * on provider delete take count of vendor-specific, delete if match (ec2 server delete and node delete)
44
39
  * knife windows bootstrap FQDN [RUN LIST...] (options)
45
-
46
- Wishlist
47
- --------
48
- * use GNU parallel
49
- * make the JSON calls directly (and possibly parallelize)
50
- * --dryrun The option `--dryrun` will print the commands to run, but not actually execute them.
51
-
40
+ * use GNU parallel with knife?
data/README.md CHANGED
@@ -1,59 +1,59 @@
1
1
  Description
2
2
  ===========
3
- Spiceweasel is a command-line tool for batch loading Chef infrastructure. It provides a simple syntax for describing and deploying infrastructure with the Chef command-line tool `knife`.
3
+ Spiceweasel is a command-line tool for batch loading Chef infrastructure. It provides a simple syntax for describing and deploying infrastructure in order with the Chef command-line tool `knife`.
4
4
 
5
- MILESTONES.md covers current, previous and future development milestones and contains the features backlog.
5
+ CHANGELOG.md covers current, previous and future development milestones and contains the features backlog.
6
6
 
7
7
  Requirements
8
8
  ============
9
9
  Spiceweasel currently depends on `knife` to run commands for it.
10
10
 
11
- Written with Chef 0.9.12 and supports cookbooks, recipes, roles, data bags and nodes. Support for environments will be added with the Chef 0.10 release.
11
+ Written with Chef 0.9.12 and 0.9.14 and supports cookbooks, recipes, roles, data bags and nodes. Support for environments will be added with the Chef 0.10 release.
12
12
 
13
13
  Testing
14
14
  -------
15
- Tested with Ubuntu 10.04 and 10.10 and Chef 0.9.12.
15
+ Tested with Ubuntu 10.04 and 10.10 and Chef 0.9.12 and 0.9.14.
16
16
 
17
17
  File Syntax
18
18
  ===========
19
19
  The syntax for the spiceweasel file is a simple YAML format of Chef primitives describing what is to be instantiated.
20
20
 
21
21
  cookbooks:
22
- - apache2
23
- - apt
24
- - mysql
22
+ - apache2:
23
+ - apt:
24
+ - mysql:
25
25
 
26
26
  roles:
27
- - base
28
- - monitoring
29
- - webserver
27
+ - base:
28
+ - monitoring:
29
+ - webserver:
30
30
 
31
31
  data bags:
32
- users:
33
- - alice
34
- - bob
35
- - chuck
36
- data:
32
+ - users:
33
+ - alice
34
+ - bob
35
+ - chuck
36
+ - data:
37
37
 
38
38
  nodes:
39
- serverA:
40
- - role[loadbalancer]
41
- - -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
42
- ec2 5:
43
- - role[webserver]
44
- - -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
45
- rackspace 3:
46
- - recipe[mysql] role[clustered_mysql]
47
- - --image 49 --flavor 2
39
+ - serverA:
40
+ - role[base]
41
+ - -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
42
+ - ec2 5:
43
+ - role[webserver] recipe[mysql::client]
44
+ - -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
45
+ - rackspace 3:
46
+ - recipe[mysql] role[monitoring]
47
+ - --image 49 --flavor 2
48
48
 
49
49
  Cookbooks
50
50
  ---------
51
51
  The `cookbooks` section of the YAML file currently supports `knife cookbook upload FOO` where `FOO` is the name of the cookbook in the `cookbooks` directory. The YAML snippet
52
52
 
53
53
  cookbooks:
54
- - apache2
55
- - apt
56
- - mysql
54
+ - apache2:
55
+ - apt:
56
+ - mysql:
57
57
 
58
58
  produces the knife commands
59
59
 
@@ -66,9 +66,9 @@ Roles
66
66
  The `roles` section of the YAML file currently supports `knife role from file FOO` where `FOO` is the name of the role file ending in `.rb` in the `roles` directory. The YAML snippet
67
67
 
68
68
  roles:
69
- - base
70
- - monitoring
71
- - webserver
69
+ - base:
70
+ - monitoring:
71
+ - webserver:
72
72
 
73
73
  produces the knife commands
74
74
 
@@ -81,46 +81,46 @@ Data Bags
81
81
  The `data bags` section of the YAML file currently creates the data bags listed with `knife data bag create FOO` where `FOO` is the name of the data bag. Individual items may be added to the data bag as part of a YAML sequence, the assumption is made that they `.json` files and in the `data_bags` directory. The YAML snippet
82
82
 
83
83
  data bags:
84
- users:
85
- - alice
86
- - bob
87
- - chuck
88
- data:
84
+ - users:
85
+ - alice
86
+ - bob
87
+ - chuck
88
+ - data:
89
89
 
90
90
  produces the knife commands
91
91
 
92
- knife data bag create data
93
92
  knife data bag create users
94
93
  knife data bag from file users data_bags/alice.json
95
94
  knife data bag from file users data_bags/bob.json
96
95
  knife data bag from file users data_bags/chuck.json
96
+ knife data bag create data
97
97
 
98
98
  Nodes
99
99
  -----
100
- The `nodes` section of the YAML file bootstraps a node for each entry where the entry is a hostname or provider and count. Each node requires 2 items after it in a YAML sequence. The first item is the run_list and the second the CLI options used. A shortcut syntax for bulk-creating nodes with various providers where the line starts with the provider and ends with the number of nodes to be provisioned. The YAML snippet
100
+ The `nodes` section of the YAML file bootstraps a node for each entry where the entry is a hostname or provider and count. Each node requires 2 items after it in a YAML sequence. The first item is the run_list and the second the CLI options used. Validation is performed on the run_list components to ensure that only recipes and roles listed in the YAML file are used. A shortcut syntax for bulk-creating nodes with various providers where the line starts with the provider and ends with the number of nodes to be provisioned. The YAML snippet
101
101
 
102
102
  nodes:
103
- serverA:
104
- - role[loadbalancer]
105
- - -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
106
- ec2 5:
107
- - role[webserver]
108
- - -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
109
- rackspace 3:
110
- - recipe[mysql] role[clustered_mysql]
111
- - --image 49 --flavor 2
103
+ - serverA:
104
+ - role[base]
105
+ - -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
106
+ - ec2 5:
107
+ - role[webserver] recipe[mysql::client]
108
+ - -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
109
+ - rackspace 3:
110
+ - recipe[mysql] role[monitoring]
111
+ - --image 49 --flavor 2
112
112
 
113
113
  produces the knife commands
114
114
 
115
- knife bootstrap serverA 'role[loadbalancer]' -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
116
- knife ec2 server create 'role[webserver]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
117
- knife ec2 server create 'role[webserver]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
118
- knife ec2 server create 'role[webserver]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
119
- knife ec2 server create 'role[webserver]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
120
- knife ec2 server create 'role[webserver]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
121
- knife rackspace server create 'recipe[mysql]' 'role[clustered_mysql]' --image 49 --flavor 2
122
- knife rackspace server create 'recipe[mysql]' 'role[clustered_mysql]' --image 49 --flavor 2
123
- knife rackspace server create 'recipe[mysql]' 'role[clustered_mysql]' --image 49 --flavor 2
115
+ knife bootstrap serverA 'role[base]' -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
116
+ knife ec2 server create 'role[webserver]' 'recipe[mysql::client]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
117
+ knife ec2 server create 'role[webserver]' 'recipe[mysql::client]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
118
+ knife ec2 server create 'role[webserver]' 'recipe[mysql::client]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
119
+ knife ec2 server create 'role[webserver]' 'recipe[mysql::client]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
120
+ knife ec2 server create 'role[webserver]' 'recipe[mysql::client]' -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
121
+ knife rackspace server create 'recipe[mysql]' 'role[monitoring]' --image 49 --flavor 2
122
+ knife rackspace server create 'recipe[mysql]' 'role[monitoring]' --image 49 --flavor 2
123
+ knife rackspace server create 'recipe[mysql]' 'role[monitoring]' --image 49 --flavor 2
124
124
 
125
125
  Usage
126
126
  =====
@@ -130,6 +130,26 @@ To run a spiceweasel file, run the following from you Chef repository directory:
130
130
 
131
131
  This will generate the knife commands to build the described infrastructure.
132
132
 
133
+ --dryrun
134
+ --------
135
+ This is the default action, printing the knife commands to be run without executing them.
136
+
137
+ -d/--delete
138
+ -----------
139
+ The delete command will generate the knife commands to delete the infrastructure described in the YAML file. This includes each cookbook, role, data bag, environment and node listed. Currently all nodes from the system are deleted with `knife node bulk_delete`, specific-node support will be added in a future release.
140
+
141
+ -h/--help
142
+ ---------
143
+ Print the currently-supported usage options for spiceweasel.
144
+
145
+ -r/--rebuild
146
+ ---------
147
+ The rebuild command will generate the knife commands to delete and recreate the infrastructure described in the YAML file. This includes each cookbook, role, data bag, environment and node listed. Currently all nodes from the system are deleted with `knife node bulk_delete`, specific-node support will be added in a future release.
148
+
149
+ -v/--version
150
+ ------------
151
+ Print the version of spiceweasel currently installed.
152
+
133
153
  License and Author
134
154
  ==================
135
155
  Author: Matt Ray <matt@opscode.com>
data/bin/spiceweasel CHANGED
@@ -1,84 +1,169 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'optparse'
3
+ require 'mixlib/cli'
4
4
  require 'yaml'
5
-
6
- options = {}
7
- optparse = OptionParser.new do |opts|
8
- opts.banner = "Usage: spiceweasel [options] file"
9
- opts.on('-h', '--help', 'Show this message') do
10
- puts opts
11
- exit
12
- end
13
- opts.on('-v', '--version', 'Version') do
14
- puts "spiceweasel 0.1"
15
- exit
5
+ require 'spiceweasel/version'
6
+
7
+ #ensure that the run_list contents are present in either the cookbooks or roles
8
+ def validate_run_list(run_list, cookbooks, roles)
9
+ run_list.each do |item|
10
+ if item.start_with?("recipe")
11
+ #recipe[foo] or recipe[foo::bar]
12
+ recipe = item.slice(7..-2).split("::")[0]
13
+ unless cookbooks.member?(recipe)
14
+ raise "'#{item}' is an invalid run_list recipe not managed by spiceweasel"
15
+ exit(-1)
16
+ end
17
+ elsif item.start_with?("role")
18
+ #role[blah]
19
+ role = item.slice(5..-2)
20
+ unless roles.member?(role)
21
+ raise "'#{item}' is an invalid run_list role not managed by spiceweasel"
22
+ exit(-1)
23
+ end
24
+ else
25
+ raise "'#{item}' is an invalid run_list component"
26
+ exit(-1)
27
+ end
16
28
  end
17
29
  end
18
30
 
31
+ class SpiceweaselCLI
32
+ include Mixlib::CLI
33
+
34
+ banner("Usage: spiceweasel [option] file")
35
+
36
+ option :delete,
37
+ :short => "-d",
38
+ :long => "--delete",
39
+ :description => "Print the knife commands to be delete the infrastructure",
40
+ :boolean => true
41
+
42
+ option :dryrun,
43
+ :long => "--dryrun",
44
+ :description => "Print the knife commands to be executed to STDOUT",
45
+ :boolean => true
46
+
47
+ option :help,
48
+ :short => "-h",
49
+ :long => "--help",
50
+ :description => "Show this message",
51
+ :on => :tail,
52
+ :boolean => true,
53
+ :show_options => true,
54
+ :exit => 0
55
+
56
+ option :rebuild,
57
+ :short => "-r",
58
+ :long => "--rebuild",
59
+ :description => "Print the knife commands to be delete and recreate the infrastructure",
60
+ :boolean => true
61
+
62
+ option :version,
63
+ :short => "-v",
64
+ :long => "--version",
65
+ :description => "Version",
66
+ :boolean => true,
67
+ :proc => lambda {|v| puts "Spiceweasel: #{Spiceweasel::VERSION}" },
68
+ :exit => 0
69
+
70
+ end
71
+
72
+ #process command line options
19
73
  begin
20
74
  ARGV << "-h" if ARGV.empty?
21
- optparse.parse!(ARGV)
22
- rescue OptionParser::ParseError => e
23
- STDERR.puts e.message, "\n", optparse
75
+ cli = SpiceweaselCLI.new
76
+ cli.parse_options
77
+ rescue OptionParser::InvalidOption => e
78
+ STDERR.puts e.message
79
+ #puts???
24
80
  exit(-1)
25
81
  end
26
82
 
83
+ begin
84
+ yml = YAML.load_file ARGV.last
85
+ rescue Exception
86
+ STDERR.puts "No infrastructure YAML file provided."
87
+ #puts???
88
+ exit(-1)
89
+ end
27
90
 
28
- yml = YAML.load_file ARGV[0]
29
- knife = ""
91
+ create = String.new()
92
+ delete = String.new()
30
93
 
31
94
  #cookbooks
32
95
  cookbooks = yml['cookbooks'] || []
96
+ cookbook_list = []
33
97
  cookbooks.each do |cookbook|
34
- knife += "knife cookbook upload #{cookbook}\n"
98
+ delete += "knife cookbook delete #{cookbook.keys[0]} -y\n"
99
+ create += "knife cookbook upload #{cookbook.keys[0]}\n"
100
+ #flatten list of cookbooks for validation later
101
+ cookbook_list.push(cookbook.keys[0])
35
102
  end
36
103
 
37
104
  #roles
38
105
  roles = yml['roles'] || []
106
+ role_list = []
39
107
  roles.each do |role|
40
- knife += "knife role from file #{role}.rb\n"
108
+ delete += "knife role delete #{role.keys[0]} -y\n"
109
+ create += "knife role from file #{role.keys[0]}.rb\n"
110
+ #flatten list of roles for validation later
111
+ role_list.push(role.keys[0])
41
112
  end
42
113
 
43
114
  #data bags
44
115
  bags = yml['data bags'] || []
45
- bags.keys.each do |bag|
46
- knife += "knife data bag create #{bag}\n"
47
- items = bags[bag] || []
116
+ bags.each do |bag|
117
+ delete += "knife data bag delete #{bag.keys[0]} -y\n"
118
+ create += "knife data bag create #{bag.keys[0]}\n"
119
+ items = bag[bag.keys[0]] || []
48
120
  items.each do |item|
49
- knife += "knife data bag from file #{bag} data_bags/#{item}.json\n"
121
+ create += "knife data bag from file #{bag.keys[0]} data_bags/#{item}.json\n"
50
122
  end
51
123
  end
52
124
 
53
125
  nodes = yml['nodes'] || []
54
- nodes.keys.each do |node|
55
- run_list = nodes[node][0].split()
56
- #TODO verify the run_list against the nodes and recipes
57
- if node.start_with?("bluebox","ec2","rackspace","slicehost","terremark")
58
- provider = node.split()
126
+ #currently use bulk_delete for deleting, add provider support real soon
127
+ delete += "knife node bulk_delete .* -y\n"
128
+ nodes.each do |node|
129
+ # delete += "knife node delete #{node[node.keys[0]}\n"
130
+ run_list = node[node.keys[0]][0].split()
131
+ validate_run_list(run_list, cookbook_list, role_list)
132
+ if node.keys[0].start_with?("bluebox","ec2","rackspace","slicehost","terremark")
133
+ provider = node.keys[0].split()
59
134
  count = 1
60
135
  if (provider.length == 2)
61
136
  count = provider[1]
62
137
  end
63
138
  count.to_i.times do
64
- knife += "knife #{provider[0]} server create "
139
+ create += "knife #{provider[0]} server create "
65
140
  run_list.each do |x|
66
- knife += "\'#{x}\' "
141
+ create += "\'#{x}\' "
67
142
  end
68
- knife +="#{nodes[node][1]}\n"
143
+ create +="#{node[node.keys[0]][1]}\n"
69
144
  end
70
145
  else
71
- knife += "knife bootstrap #{node} "
146
+ create += "knife bootstrap #{node.keys[0]} "
72
147
  run_list.each do |x|
73
- knife += "\'#{x}\' "
148
+ create += "\'#{x}\' "
74
149
  end
75
- knife +="#{nodes[node][1]}\n"
150
+ create +="#{node[node.keys[0]][1]}\n"
76
151
  end
77
152
  end
78
153
 
79
- puts knife
80
- #--clientsync
81
- #--delete
82
- #--dryrun
83
- #--rebuild
84
- #remember to -y
154
+ #just print the knife commands, do not execute
155
+ #if cli.config[:dryrun]
156
+ if cli.config[:delete]
157
+ puts delete unless delete.empty?
158
+ elsif cli.config[:rebuild]
159
+ puts delete unless delete.empty?
160
+ puts create unless create.empty?
161
+ else
162
+ puts create unless create.empty?
163
+ end
164
+ #else
165
+ #eventually we will execute instead of printing knife commands
166
+ #puts "BAM!"
167
+ #end
168
+
169
+
data/example.yml CHANGED
@@ -1,27 +1,27 @@
1
1
  cookbooks:
2
- - apache2
3
- - apt
4
- - mysql
2
+ - apache2:
3
+ - apt:
4
+ - mysql:
5
5
 
6
6
  roles:
7
- - base
8
- - monitoring
9
- - webserver
7
+ - base:
8
+ - monitoring:
9
+ - webserver:
10
10
 
11
11
  data bags:
12
- users:
13
- - alice
14
- - bob
15
- - chuck
16
- data:
12
+ - users:
13
+ - alice
14
+ - bob
15
+ - chuck
16
+ - data:
17
17
 
18
18
  nodes:
19
- serverA:
20
- - role[loadbalancer]
21
- - -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
22
- ec2 5:
23
- - role[webserver]
24
- - -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
25
- rackspace 3:
26
- - recipe[mysql] role[clustered_mysql]
27
- - --image 49 --flavor 2
19
+ - serverA:
20
+ - role[base]
21
+ - -i ~/.ssh/mray.pem -x user --sudo -d ubuntu10.04-gems
22
+ - ec2 5:
23
+ - role[webserver] recipe[mysql::client]
24
+ - -S mray -I ~/.ssh/mray.pem -x ubuntu -G default -i ami-a403f7cd -f m1.small
25
+ - rackspace 3:
26
+ - recipe[mysql] role[monitoring]
27
+ - --image 49 --flavor 2
@@ -1,3 +1,3 @@
1
1
  module Spiceweasel
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3"
3
3
  end
data/test.sh ADDED
@@ -0,0 +1,48 @@
1
+ echo "------------>spiceweasel"
2
+ spiceweasel
3
+ echo "------------>Return code:$?"
4
+ echo "------------>spiceweasel -h"
5
+ spiceweasel -h
6
+ echo "------------>Return code:$?"
7
+ echo "------------>spiceweasel -h example.yml"
8
+ spiceweasel -h example.yml
9
+ echo "------------>Return code:$?"
10
+ echo "------------>spiceweasel -v"
11
+ spiceweasel -v
12
+ echo "------------>Return code:$?"
13
+ echo "------------>spiceweasel -v example.yml"
14
+ spiceweasel -v example.yml
15
+ echo "------------>Return code:$?"
16
+ echo "------------>spiceweasel --version"
17
+ spiceweasel --version
18
+ echo "------------>Return code:$?"
19
+ echo "------------>spiceweasel example.yml"
20
+ spiceweasel example.yml
21
+ echo "------------>Return code:$?"
22
+ echo "------------>spiceweasel --dryrun"
23
+ spiceweasel --dryrun
24
+ echo "------------>Return code:$?"
25
+ echo "------------>spiceweasel --dryrun example.yml"
26
+ spiceweasel --dryrun example.yml
27
+ echo "------------>Return code:$?"
28
+ echo "------------>spiceweasel --help"
29
+ spiceweasel --help
30
+ echo "------------>Return code:$?"
31
+ echo "------------>spiceweasel -d"
32
+ spiceweasel -d
33
+ echo "------------>Return code:$?"
34
+ echo "------------>spiceweasel -d example.yml"
35
+ spiceweasel -d example.yml
36
+ echo "------------>Return code:$?"
37
+ echo "------------>spiceweasel --delete example.yml"
38
+ spiceweasel --delete example.yml
39
+ echo "------------>Return code:$?"
40
+ echo "------------>spiceweasel -r"
41
+ spiceweasel -r
42
+ echo "------------>Return code:$?"
43
+ echo "------------>spiceweasel -r example.yml"
44
+ spiceweasel -r example.yml
45
+ echo "------------>Return code:$?"
46
+ echo "------------>spiceweasel --rebuild example.yml"
47
+ spiceweasel --rebuild example.yml
48
+ echo "------------>Return code:$?"
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spiceweasel
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 13
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 1
8
- - 0
9
- version: 0.1.0
8
+ - 3
9
+ version: "0.3"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Matt Ray
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-03-04 00:00:00 -06:00
17
+ date: 2011-03-07 00:00:00 -06:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -29,8 +29,8 @@ extra_rdoc_files: []
29
29
 
30
30
  files:
31
31
  - .gitignore
32
+ - CHANGELOG.md
32
33
  - Gemfile
33
- - MILESTONES.md
34
34
  - README.md
35
35
  - Rakefile
36
36
  - bin/spiceweasel
@@ -38,6 +38,7 @@ files:
38
38
  - lib/spiceweasel.rb
39
39
  - lib/spiceweasel/version.rb
40
40
  - spiceweasel.gemspec
41
+ - test.sh
41
42
  has_rdoc: true
42
43
  homepage: ""
43
44
  licenses: []
@@ -52,6 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
52
53
  requirements:
53
54
  - - ">="
54
55
  - !ruby/object:Gem::Version
56
+ hash: 3
55
57
  segments:
56
58
  - 0
57
59
  version: "0"
@@ -60,6 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
62
  requirements:
61
63
  - - ">="
62
64
  - !ruby/object:Gem::Version
65
+ hash: 3
63
66
  segments:
64
67
  - 0
65
68
  version: "0"