between_meals 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5952ca7e5fa6d2486432f7a3c6680e01829056e0
4
- data.tar.gz: e1a35decf62bb0cc2fbb7bda9e449754184f50cd
3
+ metadata.gz: a8a35526d4eb577be4dab5579a7049efb1188f97
4
+ data.tar.gz: 2f277ba7902ccbd1d2cb4c95e768d3adb4171481
5
5
  SHA512:
6
- metadata.gz: 5b179124ee7a2330a15e52c87784ad975f1110954cfefc61ad351dc125b57740604eb8197b2ec3320ee3c237ff1ae6bb79471b678a03fd5e4693837289ffaca3
7
- data.tar.gz: fa1efa5aaa80231f1b9b2dab50427e608ea3a4bd6e1c910d36ab61ffa33928076b2f841e5aa1d8a4a93e00aaa19b8bd4a0545dccb0db4e1d0648090bc93e0b15
6
+ metadata.gz: 0dd9a6e457c41ac7385498944eee2e76e2b413983872616ebe835d76221accdf62fc240a7312fe287c08008095d29e210b9696d563399744149288eefd9dca28
7
+ data.tar.gz: d0eeca1bf8f1d2c4a9388fb1902cd5a679f2c88a4f0b38a48905b3c04ef5a5858a02bb03f89107df2f328a4eacd7bf8299dc657ea120d71ecd70c02d94fc5072
data/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # Between Meals
2
2
 
3
- [![Build Status](https://travis-ci.org/facebook/between-meals.svg)](http://travis-ci.org/facebook/between-meals)
3
+ [![TravisCI](https://travis-ci.org/facebook/between-meals.svg)](http://travis-ci.org/facebook/between-meals)
4
+ [![CircleCI](https://circleci.com/gh/facebook/between-meals.svg?style=svg)](https://circleci.com/gh/facebook/between-meals)
4
5
 
5
6
  ## Intro
6
7
  Ohai!
7
8
 
8
9
  Between Meals is the library for calculating what Chef objects where modified
9
10
  between two revisions in a version control system. It is also the library
10
- that that backs Taste Tester and Grocery Delivery.
11
+ that backs Taste Tester and Grocery Delivery.
11
12
 
12
13
  It currently supports SVN, GIT and HG, but plugins can easily be written for
13
14
  other source control systems.
@@ -58,3 +58,4 @@ module BetweenMeals
58
58
  end
59
59
  end
60
60
  end
61
+ # rubocop:enable ClassVars
@@ -14,23 +14,16 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- # rubocop:disable ClassVars
18
17
  module BetweenMeals
19
18
  module Changes
20
19
  # Changeset aware cookbook
21
20
  class Cookbook < Change
22
- def self.meaningful_cookbook_file?(path, cookbook_dirs)
23
- cookbook_dirs.each do |dir|
24
- re = %r{^#{dir}/([^/]+)/.*}
25
- m = path.match(re)
26
- debug("[cookbook] #{path} meaningful? [#{re}]: #{m}")
27
- return true if m
28
- end
29
- false
21
+ def self.meaningful_cookbook_file?(path)
22
+ !explode_path(path).nil?
30
23
  end
31
24
 
32
- def self.explode_path(path, cookbook_dirs)
33
- cookbook_dirs.each do |dir|
25
+ def self.explode_path(path)
26
+ @cookbook_dirs.each do |dir|
34
27
  re = %r{^#{dir}/([^/]+)/.*}
35
28
  debug("[cookbook] Matching #{path} against ^#{re}")
36
29
  m = path.match(re)
@@ -44,19 +37,63 @@ module BetweenMeals
44
37
  nil
45
38
  end
46
39
 
40
+ def self.map_symlinks(files)
41
+ # For each symlink get the source path, if any files have changed under
42
+ # the source path, fake them as coming from the symlink path. This
43
+ # allows the normal cookbook logic to just work.
44
+ symlinks = {}
45
+ @cookbook_dirs.each do |dir|
46
+ dir = File.join(@repo_dir, dir)
47
+ # Find symlinks in each cookbook_dir
48
+ links = Dir.foreach(dir).select do |d|
49
+ File.symlink?(File.join(dir, d))
50
+ end
51
+ links.each do |link|
52
+ link = File.join(dir, link)
53
+ next if symlinks[link]
54
+ source = File.realpath(link)
55
+ repo = File.join(@repo_dir, '/')
56
+ # maps absolute symlink path to relative source and link paths
57
+ symlinks[link] = {
58
+ 'source' => source.gsub(repo, ''),
59
+ 'link' => link.gsub(repo, ''),
60
+ }
61
+ end
62
+ end
63
+
64
+ # Create the file hash expected for each file that is a link or coming
65
+ # from a linked directory but fake the source path as a symlink path.
66
+ # Hacky but works :)
67
+ links_to_append = []
68
+ symlinks.each_value do |lrp| # link_abs_path, link_relative_path
69
+ files.each do |f|
70
+ # a symlink will never have trailing '/', add one.
71
+ f[:path] += '/' if f[:path] == lrp['link']
72
+ next unless f[:path].start_with?(lrp['source'])
73
+ # This make a deep dup of the file hash
74
+ l = Marshal.load(Marshal.dump(f))
75
+ l[:path].gsub!(lrp['source'], lrp['link'])
76
+ links_to_append << l
77
+ end
78
+ end
79
+ links_to_append
80
+ end
81
+
47
82
  def initialize(files, cookbook_dirs)
48
83
  @files = files
49
- @name = self.class.explode_path(
50
- files.sample[:path],
51
- cookbook_dirs,
52
- )[:name]
84
+ @cookbook_dirs = cookbook_dirs
85
+ @name = self.class.explode_path(files.sample[:path])[:name]
53
86
  # if metadata.rb is being deleted
54
87
  # cookbook is marked for deletion
55
88
  # otherwise it was modified
56
89
  # and will be re-uploaded
57
90
  if files.
58
91
  select { |x| x[:status] == :deleted }.
59
- map { |x| x[:path].match(%{.*metadata\.rb$}) }.
92
+ map do |x|
93
+ x[:path].match(
94
+ %{^(#{cookbook_dirs.join('|')})/[^/]+/metadata\.(rb|json)$},
95
+ )
96
+ end.
60
97
  compact.
61
98
  any?
62
99
  @status = :deleted
@@ -67,16 +104,21 @@ module BetweenMeals
67
104
 
68
105
  # Given a list of changed files
69
106
  # create a list of Cookbook objects
70
- def self.find(list, cookbook_dirs, logger)
107
+ def self.find(list, cookbook_dirs, logger, repo, track_symlinks = false)
108
+ # rubocop:disable ClassVars
71
109
  @@logger = logger
110
+ # rubocop:enable ClassVars
72
111
  return [] if list.nil? || list.empty?
73
112
  # rubocop:disable MultilineBlockChain
113
+ @repo_dir = File.realpath(repo.repo_path)
114
+ @cookbook_dirs = cookbook_dirs
115
+ list += map_symlinks(list) if track_symlinks
74
116
  list.
75
117
  group_by do |x|
76
118
  # Group by prefix of cookbok_dir + cookbook_name
77
119
  # so that we treat deletes and modifications across
78
120
  # two locations separately
79
- g = self.explode_path(x[:path], cookbook_dirs)
121
+ g = self.explode_path(x[:path])
80
122
  g[:cookbook_dir] + '/' + g[:name] if g
81
123
  end.
82
124
  map do |_, change|
@@ -84,10 +126,10 @@ module BetweenMeals
84
126
  # Changes to OWNERS or other stuff that might end up
85
127
  # in [core, other, secure] dirs are ignored
86
128
  is_cookbook = change.select do |c|
87
- self.meaningful_cookbook_file?(c[:path], cookbook_dirs)
129
+ self.meaningful_cookbook_file?(c[:path])
88
130
  end.any?
89
131
  if is_cookbook
90
- BetweenMeals::Changes::Cookbook.new(change, cookbook_dirs)
132
+ BetweenMeals::Changes::Cookbook.new(change, @cookbook_dirs)
91
133
  end
92
134
  end.compact
93
135
  # rubocop:enable MultilineBlockChain
@@ -14,7 +14,6 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- # rubocop:disable ClassVars
18
17
  module BetweenMeals
19
18
  module Changes
20
19
  # Changeset aware databag
@@ -37,7 +36,9 @@ module BetweenMeals
37
36
  end
38
37
 
39
38
  def self.find(list, databag_dir, logger)
39
+ # rubocop:disable ClassVars
40
40
  @@logger = logger
41
+ # rubocop:enable ClassVars
41
42
  return [] if list.nil? || list.empty?
42
43
  list.
43
44
  select { |x| self.name_from_path(x[:path], databag_dir) }.
@@ -14,7 +14,6 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- # rubocop:disable ClassVars
18
17
  module BetweenMeals
19
18
  module Changes
20
19
  # Changeset aware role
@@ -38,7 +37,9 @@ module BetweenMeals
38
37
  # Given a list of changed files
39
38
  # create a list of Role objects
40
39
  def self.find(list, role_dir, logger)
40
+ # rubocop:disable ClassVars
41
41
  @@logger = logger
42
+ # rubocop:enable ClassVars
42
43
  return [] if list.nil? || list.empty?
43
44
  list.
44
45
  select { |x| self.name_from_path(x[:path], role_dir) }.
@@ -29,13 +29,17 @@ module BetweenMeals
29
29
  class Changeset
30
30
  class ReferenceError < RuntimeError
31
31
  end
32
-
33
- def initialize(logger, repo, start_ref, end_ref, locations)
32
+ # rubocop:disable Metrics/ParameterLists
33
+ def initialize(
34
+ logger, repo, start_ref, end_ref, locations, track_symlinks = false
35
+ )
36
+ # rubocop:enable Metrics/ParameterLists
34
37
  @logger = logger
35
38
  @repo = repo
36
39
  @cookbook_dirs = locations[:cookbook_dirs].dup
37
40
  @role_dir = locations[:role_dir]
38
41
  @databag_dir = locations[:databag_dir]
42
+ @track_symlinks = track_symlinks
39
43
  # Figure out which files changed if refs provided
40
44
  # or return all files (full upload) otherwise
41
45
  if start_ref
@@ -49,7 +53,9 @@ module BetweenMeals
49
53
  end
50
54
 
51
55
  def cookbooks
52
- BetweenMeals::Changes::Cookbook.find(@files, @cookbook_dirs, @logger)
56
+ BetweenMeals::Changes::Cookbook.find(
57
+ @files, @cookbook_dirs, @logger, @repo, @track_symlinks
58
+ )
53
59
  end
54
60
 
55
61
  def roles
@@ -27,15 +27,17 @@ module BetweenMeals
27
27
  end
28
28
 
29
29
  def cmd(params, cwd = nil)
30
- unless cwd
31
- cwd = File.expand_path(@cwd)
32
- end
30
+ cwd ||= File.expand_path(@cwd)
33
31
  cmd = "#{@bin} #{params}"
34
32
  @logger.info("Running \"#{cmd}\"")
35
33
  c = Mixlib::ShellOut.new(
36
34
  cmd,
37
35
  :cwd => cwd,
38
36
  )
37
+ # macOS needs /usr/local/bin as hg cannot be installed in /bin or /usr/bin
38
+ c.environment = {
39
+ 'PATH' => '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin',
40
+ }
39
41
  c.run_command
40
42
  c.error!
41
43
  c
@@ -26,6 +26,8 @@ module BetweenMeals
26
26
  class Knife
27
27
  include BetweenMeals::Util
28
28
 
29
+ attr_accessor :cookbook_dirs
30
+
29
31
  def initialize(opts = {})
30
32
  @logger = opts[:logger] || nil
31
33
  @user = opts[:user] || ENV['USER']
@@ -225,6 +227,10 @@ IAMAEpsWX2s2A6phgMCx7kH6wMmoZn3hb7Thh9+PfR8Jtp2/7k+ibCeF4gEWUCs5
225
227
  -----END PRIVATE KEY-----
226
228
  BLOCK
227
229
 
230
+ unless File.directory?(File.dirname(@pem))
231
+ Dir.mkdir(File.dirname(@pem), 0o755)
232
+ end
233
+
228
234
  unless File.exists?(@pem)
229
235
  @logger.info("Generating #{@pem}")
230
236
  File.write(@pem, pem)
@@ -27,7 +27,7 @@ module BetweenMeals
27
27
  @repo = nil
28
28
  @bin = nil
29
29
  setup
30
- rescue
30
+ rescue StandardError
31
31
  @logger.warn("Unable to read repo from #{File.expand_path(repo_path)}")
32
32
  exit(1)
33
33
  end
@@ -54,7 +54,7 @@ module BetweenMeals
54
54
  logger.info("Repo found to be #{klass.to_s.split('::').last}")
55
55
  return r
56
56
  end
57
- rescue
57
+ rescue StandardError
58
58
  logger.debug("Skipping #{klass}")
59
59
  end
60
60
  end
@@ -29,7 +29,7 @@ module BetweenMeals
29
29
  if File.exists?(File.expand_path(@repo_path))
30
30
  begin
31
31
  @repo = Rugged::Repository.new(File.expand_path(@repo_path))
32
- rescue
32
+ rescue StandardError
33
33
  @repo = nil
34
34
  end
35
35
  else
@@ -86,7 +86,7 @@ module BetweenMeals
86
86
  stdout = @cmd.diff(start_ref, end_ref).stdout
87
87
  begin
88
88
  parse_status(stdout).compact
89
- rescue => e
89
+ rescue StandardError => e
90
90
  # We've seen some weird non-reproducible failures here
91
91
  @logger.error(
92
92
  'Something went wrong. Please report this output.',
@@ -113,7 +113,7 @@ module BetweenMeals
113
113
  return true
114
114
  end
115
115
  return false
116
- rescue
116
+ rescue StandardError
117
117
  return false
118
118
  end
119
119
 
@@ -50,7 +50,7 @@ module BetweenMeals
50
50
  stdout = @cmd.status(start_ref, end_ref).stdout
51
51
  begin
52
52
  parse_status(stdout).compact
53
- rescue => e
53
+ rescue StandardError => e
54
54
  # We've seen some weird non-reproducible failures here
55
55
  @logger.error(
56
56
  'Something went wrong. Please report this output.',
@@ -65,7 +65,7 @@ module BetweenMeals
65
65
 
66
66
  def update
67
67
  @cmd.pull.stdout
68
- rescue
68
+ rescue StandardError
69
69
  @logger.error('Something went wrong with hg!')
70
70
  @logger.error(cmd.stdout)
71
71
  raise
@@ -83,7 +83,7 @@ module BetweenMeals
83
83
  :time => Time.parse(@cmd.log('date|isodate', 'master').stdout),
84
84
  :rev => @cmd.log('node', 'master').stdout,
85
85
  }]
86
- rescue
86
+ rescue StandardError
87
87
  [{
88
88
  :time => nil,
89
89
  :rev => nil,
@@ -103,7 +103,7 @@ module BetweenMeals
103
103
 
104
104
  def last_msg
105
105
  @cmd.log('desc').stdout
106
- rescue
106
+ rescue StandardError
107
107
  nil
108
108
  end
109
109
 
@@ -115,13 +115,13 @@ module BetweenMeals
115
115
 
116
116
  def email
117
117
  username[2]
118
- rescue
118
+ rescue StandardError
119
119
  nil
120
120
  end
121
121
 
122
122
  def name
123
123
  username[1]
124
- rescue
124
+ rescue StandardError
125
125
  nil
126
126
  end
127
127
 
@@ -143,7 +143,7 @@ module BetweenMeals
143
143
  def valid_ref?(ref)
144
144
  @cmd.rev(ref)
145
145
  return true
146
- rescue
146
+ rescue StandardError
147
147
  raise Changeset::ReferenceError
148
148
  end
149
149
 
@@ -64,7 +64,7 @@ module BetweenMeals
64
64
 
65
65
  begin
66
66
  parse_status(changes).compact
67
- rescue => e
67
+ rescue StandardError => e
68
68
  @logger.error(
69
69
  'Something went wrong. Please report this output.',
70
70
  )
@@ -88,12 +88,11 @@ module BetweenMeals
88
88
  end
89
89
  end
90
90
 
91
- def upstream?
92
- end
91
+ def upstream?; end
93
92
 
94
93
  def valid_ref?(ref)
95
94
  @cmd.info_r(ref, @repo_path)
96
- rescue
95
+ rescue StandardError
97
96
  raise Changeset::ReferenceError
98
97
  end
99
98
 
@@ -86,3 +86,4 @@ module BetweenMeals
86
86
  end
87
87
  end
88
88
  end
89
+ # rubocop:enable ClassVars
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: between_meals
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phil Dibowitz
@@ -9,132 +9,132 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-26 00:00:00.000000000 Z
12
+ date: 2017-12-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: colorize
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: json
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: mixlib-shellout
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rugged
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rspec-core
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rspec-expectations
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rspec-mocks
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: rubocop
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: simplecov
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - '>='
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  description: Library for calculation Chef differences between revisions
@@ -145,23 +145,23 @@ extra_rdoc_files:
145
145
  - README.md
146
146
  - LICENSE
147
147
  files:
148
- - README.md
149
148
  - LICENSE
150
- - lib/between_meals/util.rb
149
+ - README.md
150
+ - lib/between_meals/changes/change.rb
151
+ - lib/between_meals/changes/cookbook.rb
152
+ - lib/between_meals/changes/databag.rb
153
+ - lib/between_meals/changes/role.rb
151
154
  - lib/between_meals/changeset.rb
155
+ - lib/between_meals/cmd.rb
152
156
  - lib/between_meals/knife.rb
153
157
  - lib/between_meals/repo.rb
154
- - lib/between_meals/cmd.rb
155
- - lib/between_meals/changes/databag.rb
156
- - lib/between_meals/changes/cookbook.rb
157
- - lib/between_meals/changes/change.rb
158
- - lib/between_meals/changes/role.rb
159
158
  - lib/between_meals/repo/git.rb
160
- - lib/between_meals/repo/svn.rb
161
159
  - lib/between_meals/repo/git/cmd.rb
162
- - lib/between_meals/repo/svn/cmd.rb
163
- - lib/between_meals/repo/hg/cmd.rb
164
160
  - lib/between_meals/repo/hg.rb
161
+ - lib/between_meals/repo/hg/cmd.rb
162
+ - lib/between_meals/repo/svn.rb
163
+ - lib/between_meals/repo/svn/cmd.rb
164
+ - lib/between_meals/util.rb
165
165
  homepage: https://github.com/facebook/between-meals
166
166
  licenses:
167
167
  - Apache
@@ -172,17 +172,17 @@ require_paths:
172
172
  - lib
173
173
  required_ruby_version: !ruby/object:Gem::Requirement
174
174
  requirements:
175
- - - '>='
175
+ - - ">="
176
176
  - !ruby/object:Gem::Version
177
177
  version: '0'
178
178
  required_rubygems_version: !ruby/object:Gem::Requirement
179
179
  requirements:
180
- - - '>='
180
+ - - ">="
181
181
  - !ruby/object:Gem::Version
182
182
  version: '0'
183
183
  requirements: []
184
184
  rubyforge_project:
185
- rubygems_version: 2.0.14
185
+ rubygems_version: 2.6.11
186
186
  signing_key:
187
187
  specification_version: 4
188
188
  summary: Between Meals