grocery_delivery 0.0.4 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []