grocery_delivery 0.0.4 → 0.0.9

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f337a09319eafef3f7c95d9fd358468a320c6912c580c9ec52fb59ab74203b44
4
+ data.tar.gz: 56bb4c32c4be6387fded401705215f699d17ba9d8ee90a1825e6bfefd5566fbb
5
+ SHA512:
6
+ metadata.gz: 110709d96037e3dec5636b43d2b4324dbeef043e5ec6476142c4a28023e5f18d9a90e8b8e5e24cf8126db0018bc4397bf66d563835199bb2783710061372570f
7
+ data.tar.gz: 35c38494431c9af2f7e1bdffd5a023160fa8744b7e94600d128be8ccf62ed4f218f36c50e589ec891bc1a3684020468f6b4450c6135d6115875e326cf3d47b14
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Grocery Delivery
2
2
 
3
+ ![Continuous Integration](https://github.com/facebook/grocery-delivery/workflows/Continuous%20Integration/badge.svg?event=push)
4
+
3
5
  ## Intro
4
6
  Ohai!
5
7
 
@@ -27,12 +29,12 @@ principals:
27
29
  * You want all your chef-servers in sync
28
30
  * Everything you care about comes from version control.
29
31
 
30
- We recommend using the whitelist_node_attrs
31
- (https://github.com/opscode/whitelist-node-attrs) cookbook to prevent node
32
- attributes being saved back to the server. Or in recent versions of Chef 11,
33
- this feature is built-in:
34
-
35
- http://docs.getchef.com/essentials_node_object.html#whitelist-attributes
32
+ We recommend enabling attributes whitelisting to prevent node attributes being
33
+ saved back to the server. In recent versions of Chef (past Chef 11), this
34
+ feature is [built-in](https://docs.chef.io/nodes/#whitelist-attributes). For
35
+ older versions, we recommend using the
36
+ [`whitelist_node_attrs`](https://github.com/chef-boneyard/whitelist-node-attrs)
37
+ cookbook.
36
38
 
37
39
  ## Dependencies
38
40
 
@@ -41,45 +43,51 @@ http://docs.getchef.com/essentials_node_object.html#whitelist-attributes
41
43
 
42
44
  ## Config file
43
45
 
44
- The default config file is `/etc/gd-config.rb` but you may use -c to specify
46
+ The default config file is `/etc/gd-config.rb` but you may use `-c` to specify
45
47
  another. The config file works the same as client.rb does for Chef - there
46
- are a series of keywords that take an arguement and anything else is just
48
+ are a series of keywords that take an argument and anything else is just
47
49
  standard Ruby.
48
50
 
49
51
  All command-line options are available in the config file:
50
52
  * dry_run (bool, default: false)
51
53
  * debug (bool, default: false)
52
- * timestamp (bool, default: false)
53
54
  * config_file (string, default: `/etc/gd-config.rb`)
54
55
  * lockfile (string, default: `/var/lock/subsys/grocery_delivery`)
55
56
  * pidfile (string, default: `/var/run/grocery_delivery.pid`)
56
57
 
57
58
  In addition the following are also available:
58
- * master_path - The top-level path for Grocery Delivery's work. Most other
59
+ * `master_path` - The top-level path for Grocery Delivery's work. Most other
59
60
  paths are relative to this. Default: `/var/chef/grocery_delivery_work`
60
- * repo_url - The URL to clone/checkout if it doesn't exist. Default: `nil`
61
- * reponame - The relative directory to check the repo out to, inside of
61
+ * `repo_url` - The URL to clone/checkout if it doesn't exist. Default: `nil`
62
+ * `reponame` - The relative directory to check the repo out to, inside of
62
63
  `master_path`. Default: `ops`
63
- * cookbook_paths - An array of directories that contain cookbooks relative to
64
+ * `cookbook_paths` - An array of directories that contain cookbooks relative to
64
65
  `reponame`. Default: `['chef/cookbooks']`
65
- * role_path - A directory to find roles in relative to `reponame`. Default:
66
- `['chef/roles']`
67
- * databag_path - A directory to find databags in relative to `reponame`.
68
- Default: `['chef/databags']`
69
- * rev_checkpoint - Name of the file to store the last-uploaded revision,
66
+ * `role_path` - A directory to find roles in relative to `reponame`. Default:
67
+ `'chef/roles'`
68
+ * `role_type` - RB or JSON roles? Default: `rb`
69
+ * `databag_path` - A directory to find databags in relative to `reponame`.
70
+ Default: `'chef/databags'`
71
+ * `rev_checkpoint` - Name of the file to store the last-uploaded revision,
70
72
  relative to `reponame`. Default: `gd_revision`
71
- * knife_config - Knife config to use for uploads. Default:
73
+ * `knife_config` - Knife config to use for uploads. Default:
72
74
  `/root/.chef/knife.rb`
73
- * knife_bin - Path to knife. Default: `/opt/chef/bin/knife`
74
- * vcs_type - Git or SVN? Default: `svn`
75
- * vcs_path - Path to git or svn binary. If not given, just uses 'git' or 'svn'.
75
+ Note: `knife.rb` will need to set `cookbook_path` pointing to the cookbook
76
+ path in the work directory,
77
+ e.g. `/var/chef/grocery_delivery_work/ops/chef/cookbooks`
78
+ * `knife_bin` - Path to knife. Default: `/opt/chef/bin/knife`
79
+ * `vcs_type` - Git or SVN? Default: `svn`
80
+ * `vcs_path` - Path to git or svn binary. If not given, just uses 'git' or 'svn'.
76
81
  Default: `nil`
77
- * plugin_path - Path to plugin file. Default: `/etc/gd-plugin.rb`
82
+ * `plugin_path` - Path to plugin file. Default: `/etc/gd-plugin.rb`
83
+ * `berks` - Boolean to determine if we should use berkshelf to resolve
84
+ dependencies and upload cookbooks. Default: `false`
85
+ * `berks_bin` - Path to berkshelf. Default: `/opt/chefdk/bin/berks`
78
86
 
79
87
  ## Plugin
80
88
 
81
89
  The plugin should be a ruby file which defines several class methods. It is
82
- class_eval()d into a Hooks class.
90
+ `class_eval()`d into a `Hooks` class.
83
91
 
84
92
  The following functions can optionally be defined:
85
93
 
@@ -101,7 +109,7 @@ to parse it.
101
109
 
102
110
  * self.postrun(dryrun, success, msg)
103
111
 
104
- After we've parsed the updates to the repo and uploaded/deleted the relevent
112
+ After we've parsed the updates to the repo and uploaded/deleted the relevant
105
113
  items from the local server. `Success` is a bool for whether we succeeded, and
106
114
  `msg` is the status message - either the revision we sync'd or an error.
107
115
 
@@ -109,3 +117,7 @@ items from the local server. `Success` is a bool for whether we succeeded, and
109
117
 
110
118
  Same as postrun, but is registered as an atexit function so it happens even
111
119
  if we crash.
120
+
121
+ ## License
122
+
123
+ See the `LICENSE` file in this repo.
@@ -1,14 +1,14 @@
1
- #!/opt/chef/embedded/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
  # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
3
3
 
4
4
  # Copyright 2013-present Facebook
5
- #
5
+ #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -42,7 +42,7 @@ end
42
42
  def get_lock
43
43
  GroceryDelivery::Log.warn('Attempting to acquire lock')
44
44
  $lockfileh = File.open(GroceryDelivery::Config.lockfile,
45
- File::RDWR | File::CREAT, 0600)
45
+ File::RDWR | File::CREAT, 0o600)
46
46
  $lockfileh.flock(File::LOCK_EX)
47
47
  GroceryDelivery::Log.warn('Lock acquired')
48
48
  end
@@ -62,12 +62,20 @@ end
62
62
 
63
63
  def read_checkpoint
64
64
  GroceryDelivery::Log.debug("Reading #{checkpoint_path}")
65
- File.exists?(checkpoint_path) ? File.read(checkpoint_path).strip : nil
65
+ File.exist?(checkpoint_path) ? File.read(checkpoint_path).strip : nil
66
66
  end
67
67
 
68
68
  def full_upload(knife)
69
- GroceryDelivery::Log.warn('Uploading all cookbooks')
70
- knife.cookbook_upload_all
69
+ if GroceryDelivery::Config.berks
70
+ GroceryDelivery::Log.warn('Uploading all cookbooks with berkshelf')
71
+ GroceryDelivery::Log.debug(
72
+ "Using cookbook paths: #{GroceryDelivery::Config.cookbook_paths}",
73
+ )
74
+ knife.berks_cookbook_upload_all
75
+ else
76
+ GroceryDelivery::Log.warn('Uploading all cookbooks')
77
+ knife.cookbook_upload_all
78
+ end
71
79
  GroceryDelivery::Log.warn('Uploading all roles')
72
80
  knife.role_upload_all
73
81
  GroceryDelivery::Log.warn('Uploading all databags')
@@ -76,7 +84,7 @@ end
76
84
 
77
85
  def partial_upload(knife, repo, checkpoint, local_head)
78
86
  GroceryDelivery::Log.warn(
79
- "Determing changes... from #{checkpoint} to #{local_head}"
87
+ "Determining changes... from #{checkpoint} to #{local_head}",
80
88
  )
81
89
 
82
90
  begin
@@ -93,6 +101,7 @@ def partial_upload(knife, repo, checkpoint, local_head)
93
101
  :databag_dir =>
94
102
  GroceryDelivery::Config.databag_path,
95
103
  },
104
+ GroceryDelivery::Config.track_symlinks,
96
105
  )
97
106
  rescue BetweenMeals::Changeset::ReferenceError
98
107
  GroceryDelivery::Log.error('Repo error, invalid revision, exiting')
@@ -115,12 +124,19 @@ def partial_upload(knife, repo, checkpoint, local_head)
115
124
  'Deleted databags' => deleted_databags,
116
125
  }.each do |msg, list|
117
126
  if list
118
- GroceryDelivery::Log.warn("#{msg}: #{list}")
127
+ GroceryDelivery::Log.warn("#{msg}: #{list.map(&:to_s)}")
119
128
  end
120
129
  end
121
130
 
122
131
  knife.cookbook_delete(deleted_cookbooks) if deleted_cookbooks
123
- knife.cookbook_upload(added_cookbooks) if added_cookbooks
132
+ if added_cookbooks
133
+ if GroceryDelivery::Config.berks
134
+ GroceryDelivery::Log.warn('Using Berkshelf to upload cookbooks')
135
+ knife.berks_cookbook_upload(added_cookbooks)
136
+ else
137
+ knife.cookbook_upload(added_cookbooks)
138
+ end
139
+ end
124
140
  knife.role_delete(deleted_roles) if deleted_roles
125
141
  knife.role_upload(added_roles) if added_roles
126
142
  knife.databag_delete(deleted_databags) if deleted_databags
@@ -137,12 +153,18 @@ def upload_changed(repo, checkpoint)
137
153
  :logger => GroceryDelivery::Log,
138
154
  :config => GroceryDelivery::Config.knife_config,
139
155
  :bin => GroceryDelivery::Config.knife_bin,
156
+ :berks_bin => GroceryDelivery::Config.berks_bin,
157
+ :berks_config => GroceryDelivery::Config.berks_config,
140
158
  :role_dir => File.join(base_dir, GroceryDelivery::Config.role_path),
159
+ :role_type => GroceryDelivery::Config.role_type,
141
160
  :cookbook_dirs => GroceryDelivery::Config.cookbook_paths.map do |x|
142
161
  File.join(base_dir, x)
143
162
  end,
144
163
  :databag_dir => File.join(base_dir, GroceryDelivery::Config.databag_path),
145
- }
164
+ },
165
+ )
166
+ GroceryDelivery::Hooks.pre_upload(
167
+ GroceryDelivery::Config.dry_run, knife, local_head
146
168
  )
147
169
 
148
170
  if checkpoint
@@ -168,11 +190,8 @@ def setup_config
168
190
  options[:verbosity] = ::Logger::INFO
169
191
  end
170
192
  end
171
- opts.on('-T', '--timestamp', 'Timestamp output') do |s|
172
- options[:timestamp] = s
173
- end
174
193
  opts.on('-c', '--config-file FILE', 'config file') do |s|
175
- unless File.exists?(File.expand_path(s))
194
+ unless File.exist?(File.expand_path(s))
176
195
  GroceryDelivery::Log.error("Config file #{s} not found.")
177
196
  exit(2)
178
197
  end
@@ -181,15 +200,19 @@ def setup_config
181
200
  opts.on('-l', '--lockfile FILE', 'lockfile') do |s|
182
201
  options[:lockfile] = s
183
202
  end
203
+ opts.on('--stdout', 'Log to stdout as well.') do |_s|
204
+ options[:stdout] = true
205
+ end
184
206
  opts.on('-p', '--pidfile FILE', 'pidfile') do |s|
185
207
  options[:pidfile] = s
186
208
  end
187
209
  end.parse!
188
- if File.exists?(File.expand_path(options[:config_file]))
210
+ if File.exist?(File.expand_path(options[:config_file]))
189
211
  GroceryDelivery::Config.from_file(options[:config_file])
190
212
  end
191
213
  GroceryDelivery::Config.merge!(options)
192
214
  GroceryDelivery::Log.verbosity = GroceryDelivery::Config.verbosity
215
+ GroceryDelivery::Log.stdout = GroceryDelivery::Config.stdout
193
216
  if GroceryDelivery::Config.dry_run
194
217
  GroceryDelivery::Log.warn('Dryrun mode activated, no changes will be made.')
195
218
  end
@@ -227,7 +250,7 @@ if repo.exists?
227
250
  else
228
251
  unless GroceryDelivery::Config.repo_url
229
252
  GroceryDelivery::Log.error(
230
- 'No repo URL was specified, and no repo is checked out'
253
+ 'No repo URL was specified, and no repo is checked out',
231
254
  )
232
255
  exit(1)
233
256
  end
@@ -241,7 +264,7 @@ GroceryDelivery::Hooks.post_repo_up(GroceryDelivery::Config.dry_run)
241
264
 
242
265
  if GroceryDelivery::Config.dry_run && !repo.exists?
243
266
  GroceryDelivery::Log.warn(
244
- 'In dryrun mode, with no repo, there\'s not much I can dryrun'
267
+ 'In dryrun mode, with no repo, there\'s not much I can dryrun',
245
268
  )
246
269
  GroceryDelivery::Hooks.postrun(GroceryDelivery::Config.dry_run, true,
247
270
  'dryrun mode')
@@ -259,7 +282,7 @@ else
259
282
  write_checkpoint(ver)
260
283
  $success = true
261
284
  $status_msg = "Success at #{ver}"
262
- rescue => e
285
+ rescue StandardError => e
263
286
  $status_msg = e.message
264
287
  e.backtrace.each do |line|
265
288
  GroceryDelivery::Log.error(line)
@@ -270,4 +293,5 @@ end
270
293
  GroceryDelivery::Log.warn($status_msg)
271
294
  GroceryDelivery::Hooks.postrun(GroceryDelivery::Config.dry_run, $success,
272
295
  $status_msg)
296
+ exit($success)
273
297
  # rubocop:enable GlobalVars
@@ -1,13 +1,13 @@
1
1
  # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
2
2
 
3
3
  # Copyright 2013-present Facebook
4
- #
4
+ #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
7
7
  # You may obtain a copy of the License at
8
- #
8
+ #
9
9
  # http://www.apache.org/licenses/LICENSE-2.0
10
- #
10
+ #
11
11
  # Unless required by applicable law or agreed to in writing, software
12
12
  # distributed under the License is distributed on an "AS IS" BASIS,
13
13
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -23,10 +23,9 @@ module GroceryDelivery
23
23
  # it's compatible with v2, so it should work in 11 too.
24
24
  class Config
25
25
  extend Mixlib::Config
26
-
26
+ stdout false
27
27
  dry_run false
28
28
  verbosity Logger::WARN
29
- timestamp false
30
29
  config_file '/etc/gd-config.rb'
31
30
  pidfile '/var/run/grocery_delivery.pid'
32
31
  lockfile '/var/lock/subsys/grocery_delivery'
@@ -35,6 +34,7 @@ module GroceryDelivery
35
34
  reponame 'ops'
36
35
  cookbook_paths ['chef/cookbooks']
37
36
  role_path 'chef/roles'
37
+ role_type 'rb'
38
38
  databag_path 'chef/databags'
39
39
  rev_checkpoint 'gd_revision'
40
40
  knife_config '/root/.chef/knife.rb'
@@ -42,5 +42,9 @@ module GroceryDelivery
42
42
  vcs_type 'svn'
43
43
  vcs_path nil
44
44
  plugin_path '/etc/gd-plugin.rb'
45
+ berks false
46
+ berks_bin '/opt/chefdk/bin/berks'
47
+ berks_config nil
48
+ track_symlinks false
45
49
  end
46
50
  end
@@ -1,13 +1,13 @@
1
1
  # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
2
2
 
3
3
  # Copyright 2013-present Facebook
4
- #
4
+ #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
7
7
  # You may obtain a copy of the License at
8
- #
8
+ #
9
9
  # http://www.apache.org/licenses/LICENSE-2.0
10
- #
10
+ #
11
11
  # Unless required by applicable law or agreed to in writing, software
12
12
  # distributed under the License is distributed on an "AS IS" BASIS,
13
13
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -19,30 +19,28 @@ module GroceryDelivery
19
19
  class Hooks
20
20
  # This code will run once we've read our config and loaded our plugins
21
21
  # but before *anything* else. We don't even have a lock yet.
22
- def self.preflight_checks(_dryrun)
23
- end
22
+ def self.preflight_checks(_dryrun); end
24
23
 
25
24
  # This is run after we've gotten a lock, written a pidfile and initialized
26
25
  # our repo object (but not touched the repo yet)
27
- def self.prerun(_dryrun)
28
- end
26
+ def self.prerun(_dryrun); end
29
27
 
30
28
  # This is code to run after we've updated the repo, but before we've done
31
29
  # any work to parse it.
32
- def self.post_repo_up(_dryrun)
33
- end
30
+ def self.post_repo_up(_dryrun); end
31
+
32
+ # This is code to run after right before we start uploads
33
+ def self.pre_upload(_dryrun, _knife, _local_head); end
34
34
 
35
35
  # After we parse the updates to the repo and uploaded/deleted the relevent
36
36
  # items from the local server.
37
- def self.postrun(_dryrun, _success, _msg)
38
- end
37
+ def self.postrun(_dryrun, _success, _msg); end
39
38
 
40
39
  # exit hooks.
41
- def self.atexit(_dryrun, _success, _msg)
42
- end
40
+ def self.atexit(_dryrun, _success, _msg); end
43
41
 
44
42
  def self.get(file)
45
- class_eval(File.read(file), __FILE__, __LINE__) if File.exists?(file)
43
+ class_eval(File.read(file), file, 1) if File.exist?(file)
46
44
  end
47
45
  end
48
46
  end
@@ -1,13 +1,13 @@
1
1
  # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
2
2
 
3
3
  # Copyright 2013-present Facebook
4
- #
4
+ #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
7
7
  # You may obtain a copy of the License at
8
- #
8
+ #
9
9
  # http://www.apache.org/licenses/LICENSE-2.0
10
- #
10
+ #
11
11
  # Unless required by applicable law or agreed to in writing, software
12
12
  # distributed under the License is distributed on an "AS IS" BASIS,
13
13
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,40 +29,48 @@ module GroceryDelivery
29
29
  @@init = true
30
30
  end
31
31
 
32
+ def self.level
33
+ @@level
34
+ end
35
+
32
36
  def self.verbosity=(val)
33
37
  @@level = val
34
38
  end
35
39
 
40
+ def self.stdout=(val)
41
+ @@stdout = val
42
+ end
43
+
36
44
  def self.logit(level, msg)
37
45
  init unless @@init
38
46
  # You can't do `Syslog.log(level, msg)` because if there is a
39
47
  # `%` in `msg` then ruby will interpret it as a printf string and
40
48
  # expect more arguments to log().
41
49
  Syslog.log(level, '%s', msg)
42
- puts msg if $stdout.tty?
50
+ puts msg if $stdout.tty? || @@stdout
43
51
  end
44
52
 
45
53
  def self.debug(msg)
46
54
  if @@level == Logger::DEBUG
47
- msg.prepend('DEBUG: ')
55
+ msg.to_s.prepend('DEBUG: ')
48
56
  logit(Syslog::LOG_DEBUG, msg)
49
57
  end
50
58
  end
51
59
 
52
60
  def self.info(msg)
53
61
  if @@level == Logger::INFO
54
- msg.prepend('INFO: ')
62
+ msg.to_s.prepend('INFO: ')
55
63
  logit(Syslog::LOG_INFO, msg)
56
64
  end
57
65
  end
58
66
 
59
67
  def self.warn(msg)
60
- msg.prepend('WARN: ')
68
+ msg.to_s.prepend('WARN: ')
61
69
  logit(Syslog::LOG_WARNING, msg)
62
70
  end
63
71
 
64
72
  def self.error(msg)
65
- msg.prepend('ERROR: ')
73
+ msg.to_s.prepend('ERROR: ')
66
74
  logit(Syslog::LOG_ERR, msg)
67
75
  end
68
76
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grocery_delivery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.0.9
6
5
  platform: ruby
7
6
  authors:
8
7
  - Phil Dibowitz
@@ -10,40 +9,148 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2014-09-23 00:00:00.000000000 Z
12
+ date: 2020-06-27 00:00:00.000000000 Z
14
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: between_meals
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 0.0.11
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 0.0.11
15
28
  - !ruby/object:Gem::Dependency
16
29
  name: mixlib-config
17
30
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
31
  requirements:
20
- - - ! '>='
32
+ - - ">="
21
33
  - !ruby/object:Gem::Version
22
34
  version: '0'
23
35
  type: :runtime
24
36
  prerelease: false
25
37
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
38
  requirements:
28
- - - ! '>='
39
+ - - ">="
29
40
  - !ruby/object:Gem::Version
30
41
  version: '0'
31
42
  - !ruby/object:Gem::Dependency
32
- name: between_meals
43
+ name: chef-zero
33
44
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
45
  requirements:
36
- - - ! '>='
46
+ - - ">="
37
47
  - !ruby/object:Gem::Version
38
48
  version: '0'
39
- type: :runtime
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: chef-dk
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: openssl
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec-core
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rspec-expectations
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rspec-mocks
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
40
120
  prerelease: false
41
121
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
122
  requirements:
44
- - - ! '>='
123
+ - - ">="
45
124
  - !ruby/object:Gem::Version
46
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rubocop
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '='
145
+ - !ruby/object:Gem::Version
146
+ version: 0.55.0
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - '='
152
+ - !ruby/object:Gem::Version
153
+ version: 0.55.0
47
154
  description: Utility for keeping Chef servers in sync with a repo
48
155
  email:
49
156
  executables:
@@ -53,35 +160,33 @@ extra_rdoc_files:
53
160
  - README.md
54
161
  - LICENSE
55
162
  files:
56
- - README.md
57
163
  - LICENSE
58
- - lib/grocery_delivery/hooks.rb
164
+ - README.md
165
+ - bin/grocery-delivery
59
166
  - lib/grocery_delivery/config.rb
167
+ - lib/grocery_delivery/hooks.rb
60
168
  - lib/grocery_delivery/logging.rb
61
- - bin/grocery-delivery
62
169
  homepage:
63
170
  licenses:
64
171
  - Apache
172
+ metadata: {}
65
173
  post_install_message:
66
174
  rdoc_options: []
67
175
  require_paths:
68
176
  - lib
69
177
  required_ruby_version: !ruby/object:Gem::Requirement
70
- none: false
71
178
  requirements:
72
- - - ! '>='
179
+ - - ">="
73
180
  - !ruby/object:Gem::Version
74
181
  version: '0'
75
182
  required_rubygems_version: !ruby/object:Gem::Requirement
76
- none: false
77
183
  requirements:
78
- - - ! '>='
184
+ - - ">="
79
185
  - !ruby/object:Gem::Version
80
186
  version: '0'
81
187
  requirements: []
82
- rubyforge_project:
83
- rubygems_version: 1.8.29
188
+ rubygems_version: 3.0.1
84
189
  signing_key:
85
- specification_version: 3
190
+ specification_version: 4
86
191
  summary: Grocery Delivery
87
192
  test_files: []