sup 0.13.1 → 0.13.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sup might be problematic. Click here for more details.

data/CONTRIBUTORS CHANGED
@@ -1,8 +1,8 @@
1
- William Morgan <wmorgan-sup at the masanjin dot nets>
1
+ William Morgan <william at the twitter dot coms>
2
2
  Rich Lane <rlane at the club.cc.cmu dot edus>
3
3
  Gaute Hope <eg at the gaute.vetsj dot coms>
4
- Hamish Downer <dmishd at the gmail dot coms>
5
4
  Whyme Lyu <callme5long at the gmail dot coms>
5
+ Hamish Downer <dmishd at the gmail dot coms>
6
6
  Sascha Silbe <sascha-pgp at the silbe dot orgs>
7
7
  Ismo Puustinen <ismo at the iki dot fis>
8
8
  Nicolas Pouillard <nicolas.pouillard at the gmail dot coms>
@@ -11,6 +11,7 @@ Eric Sherman <hyperbolist at the gmail dot coms>
11
11
  Tero Tilus <tero at the tilus dot nets>
12
12
  Ben Walton <bwalton at the artsci.utoronto dot cas>
13
13
  Mike Stipicevic <stipim at the rpi dot edus>
14
+ Whyme.Lyu <callme5long at the gmail dot coms>
14
15
  Marcus Williams <marcus-sup at the bar-coded dot nets>
15
16
  Lionel Ott <white.magic at the gmx dot des>
16
17
  Gaudenz Steinlin <gaudenz at the soziologie dot chs>
@@ -21,47 +22,44 @@ Eric Weikl <eric.weikl at the tngtech dot coms>
21
22
  Christopher Warrington <chrisw at the rice dot edus>
22
23
  W. Trevor King <wking at the drexel dot edus>
23
24
  Richard Brown <rbrown at the exherbo dot orgs>
25
+ Anthony Martinez <pi+sup at the pihost dot uss>
24
26
  Marc Hartstein <marc.hartstein at the alum.vassar dot edus>
25
27
  Israel Herraiz <israel.herraiz at the gmail dot coms>
26
- Anthony Martinez <pi+sup at the pihost dot uss>
27
28
  Bo Borgerson <gigabo at the gmail dot coms>
28
- William Erik Baxter <web at the superscript dot coms>
29
29
  Michael Hamann <michael at the content-space dot des>
30
+ William Erik Baxter <web at the superscript dot coms>
30
31
  Grant Hollingworth <grant at the antiflux dot orgs>
32
+ Markus Klinik <markus.klinik at the gmx dot des>
31
33
  Adeodato Simó <dato at the net.com.org dot ess>
32
34
  Daniel Schoepe <daniel.schoepe at the googlemail dot coms>
33
35
  Jason Petsod <jason at the petsod dot orgs>
34
- Steve Goldman <sgoldman at the tower-research dot coms>
36
+ Edward Z. Yang <edwardzyang at the thewritingpot dot coms>
35
37
  Robin Burchell <viroteck at the viroteck dot nets>
38
+ Steve Goldman <sgoldman at the tower-research dot coms>
36
39
  Peter Harkins <ph at the malaprop dot orgs>
37
- Edward Z. Yang <ezyang at the MIT dot EDUs>
38
40
  Decklin Foster <decklin at the red-bean dot coms>
39
41
  Cameron Matheson <cam+sup at the cammunism dot orgs>
40
42
  Carl Worth <cworth at the cworth dot orgs>
41
- Jeff Balogh <its.jeff.balogh at the gmail dot coms>
42
- Alex Vandiver <alexmv at the mit dot edus>
43
+ Alex Vandiver <alex at the chmrr dot nets>
43
44
  Andrew Pimlott <andrew at the pimlott dot nets>
45
+ Jeff Balogh <its.jeff.balogh at the gmail dot coms>
44
46
  Matías Aguirre <matiasaguirre at the gmail dot coms>
45
- Anthony Martinez <pi at the pihost dot uss>
46
47
  Kornilios Kourtis <kkourt at the cslab.ece.ntua dot grs>
47
48
  Kevin Riggle <kevinr at the free-dissociation dot coms>
48
49
  Giorgio Lando <patroclo7 at the gmail dot coms>
49
50
  Benoît PIERRE <benoit.pierre at the gmail dot coms>
50
51
  Alvaro Herrera <alvherre at the alvh.no-ip dot orgs>
51
- Eric Weikl <eric.weikl at the gmx dot nets>
52
+ Steven Lawrance <stl at the koffein dot nets>
52
53
  Jonah <Jonah at the GoodCoffee dot cas>
53
- ian <ian at the lorf dot orgs>
54
+ ian <itaylor at the uark dot edus>
55
+ MichaelRevell <mikearevell at the gmail dot coms>
54
56
  Adam Lloyd <adam at the alloy-d dot nets>
55
57
  Todd Eisenberger <teisenbe at the andrew.cmu dot edus>
56
- Steven Walter <swalter at the monarch.(none)>
57
- Alex Vandiver <alex at the chmrr dot nets>
58
58
  Gregor Hoffleit <gregor at the sam.mediasupervision dot des>
59
- Jon M. Dugan <jdugan at the es dot nets>
59
+ Steven Walter <swalter at the monarch.(none)>
60
+ Jonathan Lassoff <jof at the thejof dot coms>
60
61
  Matthieu Rakotojaona <matthieu.rakotojaona at the gmail dot coms>
61
62
  Stefan Lundström <lundst at the snabb.(none)>
62
63
  Matthias Vallentin <vallentin at the icir dot orgs>
63
- Steven Lawrance <stl at the redhat dot coms>
64
- Jonathan Lassoff <jof at the thejof dot coms>
65
- ian <itaylor at the uark dot edus>
66
- Gregor Hoffleit <gregor at the hoffleit dot des>
64
+ Jon M. Dugan <jdugan at the es dot nets>
67
65
  Kirill Smelkov <kirr at the landau.phys.spbu dot rus>
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.13.2 / 2013-06-26
2
+
3
+ * FreeBSD 10 comptability
4
+ * More threadsafe polling
5
+
1
6
  == 0.13.1 / 2013-06-21
2
7
 
3
8
  * Bugfixes
data/ReleaseNotes CHANGED
@@ -1,3 +1,7 @@
1
+ Release 0.13.2:
2
+
3
+ FreeBSD compatability and more thread safe polling.
4
+
1
5
  Release 0.13.1:
2
6
 
3
7
  Another ruby 1.8 compatible release, various fixes.
data/bin/sup CHANGED
@@ -106,8 +106,6 @@ end
106
106
  ## ncurses.so that's been compiled against libncursesw. (note the w.) why
107
107
  ## this works, i have no idea. much like pretty much every aspect of
108
108
  ## dealing with curses. cargo cult programming at its best.
109
- ##
110
- ## BSD users: if libc.so.6 is not found, try installing compat6x.
111
109
  require 'dl/import'
112
110
  require 'rbconfig'
113
111
  module LibC
@@ -115,6 +113,7 @@ module LibC
115
113
  setlocale_lib = case RbConfig::CONFIG['arch']
116
114
  when /darwin/; "libc.dylib"
117
115
  when /cygwin/; "cygwin1.dll"
116
+ when /freebsd/; "libc.so.7"
118
117
  else; "libc.so.6"
119
118
  end
120
119
 
@@ -127,9 +126,6 @@ module LibC
127
126
  rescue RuntimeError => e
128
127
  warn "cannot dlload setlocale(); ncurses wide character support probably broken."
129
128
  warn "dlload error was #{e.class}: #{e.message}"
130
- if RbConfig::CONFIG['arch'] =~ /bsd/
131
- warn "BSD variant detected. You may have to install a compat6x package to acquire libc."
132
- end
133
129
  end
134
130
  end
135
131
 
data/lib/sup/message.rb CHANGED
@@ -540,7 +540,9 @@ private
540
540
  def inline_gpg_to_chunks body, encoding_to, encoding_from
541
541
  lines = body.split("\n")
542
542
  gpg = lines.between(GPG_SIGNED_START, GPG_SIGNED_END)
543
- if !gpg.empty?
543
+ # between does not check if GPG_END actually exists
544
+ # Reference: http://permalink.gmane.org/gmane.mail.sup.devel/641
545
+ if !gpg.empty? && !lines.index(GPG_END).nil?
544
546
  msg = RMail::Message.new
545
547
  msg.body = gpg.join("\n")
546
548
 
data/lib/sup/poll.rb CHANGED
@@ -22,7 +22,7 @@ Variables:
22
22
  num: the total number of new messages added in this poll
23
23
  num_inbox: the number of new messages added in this poll which
24
24
  appear in the inbox (i.e. were not auto-archived).
25
- num_total: the total number of messages
25
+ num_total: the total number of messages
26
26
  num_inbox_total: the total number of new messages in the inbox.
27
27
  num_inbox_total_unread: the total number of unread messages in the inbox
28
28
  from_and_subj: an array of (from email address, subject) pairs
@@ -35,7 +35,7 @@ EOS
35
35
  @mutex = Mutex.new
36
36
  @thread = nil
37
37
  @last_poll = nil
38
- @polling = false
38
+ @polling = Mutex.new
39
39
  @poll_sources = nil
40
40
  @mode = nil
41
41
  @should_clear_running_totals = false
@@ -57,15 +57,15 @@ EOS
57
57
  @running_totals[:num] += num
58
58
  @running_totals[:numi] += numi
59
59
  @running_totals[:loaded_labels] += loaded_labels || []
60
-
61
-
60
+
61
+
62
62
  if HookManager.enabled? "after-poll"
63
63
  hook_args = { :num => num, :num_inbox => numi,
64
64
  :num_total => @running_totals[:num], :num_inbox_total => @running_totals[:numi],
65
- :from_and_subj => from_and_subj, :from_and_subj_inbox => from_and_subj_inbox,
65
+ :from_and_subj => from_and_subj, :from_and_subj_inbox => from_and_subj_inbox,
66
66
  :num_inbox_total_unread => lambda { Index.num_results_for :labels => [:inbox, :unread] } }
67
67
 
68
- HookManager.run("after-poll", hook_args)
68
+ HookManager.run("after-poll", hook_args)
69
69
  else
70
70
  if @running_totals[:num] > 0
71
71
  BufferManager.flash "Loaded #{@running_totals[:num].pluralize 'new message'}, #{@running_totals[:numi]} to inbox. Labels: #{@running_totals[:loaded_labels].map{|l| l.to_s}.join(', ')}"
@@ -77,21 +77,27 @@ EOS
77
77
  end
78
78
 
79
79
  def poll
80
- return if @polling
81
- @polling = true
82
- @poll_sources = SourceManager.usual_sources
83
- num, numi = poll_with_sources
84
- @polling = false
85
- [num, numi]
80
+ if @polling.try_lock
81
+ @poll_sources = SourceManager.usual_sources
82
+ num, numi = poll_with_sources
83
+ @polling.unlock
84
+ [num, numi]
85
+ else
86
+ debug "poll already in progress."
87
+ return
88
+ end
86
89
  end
87
90
 
88
91
  def poll_unusual
89
- return if @polling
90
- @polling = true
91
- @poll_sources = SourceManager.unusual_sources
92
- num, numi = poll_with_sources
93
- @polling = false
94
- [num, numi]
92
+ if @polling.try_lock
93
+ @poll_sources = SourceManager.unusual_sources
94
+ num, numi = poll_with_sources
95
+ @polling.unlock
96
+ [num, numi]
97
+ else
98
+ debug "poll_unusual already in progress."
99
+ return
100
+ end
95
101
  end
96
102
 
97
103
  def start
@@ -157,7 +163,6 @@ EOS
157
163
  loaded_labels = loaded_labels - LabelManager::HIDDEN_RESERVED_LABELS - [:inbox, :killed]
158
164
  yield "Done polling; loaded #{total_num} new messages total"
159
165
  @last_poll = Time.now
160
- @polling = false
161
166
  end
162
167
  [total_num, total_numi, from_and_subj, from_and_subj_inbox, loaded_labels]
163
168
  end
@@ -166,42 +171,51 @@ EOS
166
171
  ## labels and locations set correctly. The Messages are saved to or removed
167
172
  ## from the index after being yielded.
168
173
  def poll_from source, opts={}
169
- begin
170
- source.poll do |sym, args|
171
- case sym
172
- when :add
173
- m = Message.build_from_source source, args[:info]
174
- old_m = Index.build_message m.id
175
- m.labels += args[:labels]
176
- m.labels.delete :inbox if source.archived?
177
- m.labels.delete :unread if source.read?
178
- m.labels.delete :unread if m.source_marked_read? # preserve read status if possible
179
- m.labels.each { |l| LabelManager << l }
180
- m.labels = old_m.labels + (m.labels - [:unread, :inbox]) if old_m
181
- m.locations = old_m.locations + m.locations if old_m
182
- HookManager.run "before-add-message", :message => m
183
- yield :add, m, old_m, args[:progress] if block_given?
184
- Index.sync_message m, true
185
-
186
- ## We need to add or unhide the message when it either did not exist
187
- ## before at all or when it was updated. We do *not* add/unhide when
188
- ## the same message was found at a different location
189
- if !old_m or not old_m.locations.member? m.location
190
- UpdateManager.relay self, :added, m
191
- end
192
- when :delete
193
- Index.each_message :location => [source.id, args[:info]] do |m|
194
- m.locations.delete Location.new(source, args[:info])
195
- yield :delete, m, [source,args[:info]], args[:progress] if block_given?
196
- Index.sync_message m, false
197
- #UpdateManager.relay self, :deleted, m
174
+ debug "trying to acquiring poll lock for: #{source}.."
175
+ if source.poll_lock.try_lock
176
+ debug "lock acquired for: #{source}."
177
+ begin
178
+ source.poll do |sym, args|
179
+ case sym
180
+ when :add
181
+ m = Message.build_from_source source, args[:info]
182
+ old_m = Index.build_message m.id
183
+ m.labels += args[:labels]
184
+ m.labels.delete :inbox if source.archived?
185
+ m.labels.delete :unread if source.read?
186
+ m.labels.delete :unread if m.source_marked_read? # preserve read status if possible
187
+ m.labels.each { |l| LabelManager << l }
188
+ m.labels = old_m.labels + (m.labels - [:unread, :inbox]) if old_m
189
+ m.locations = old_m.locations + m.locations if old_m
190
+ HookManager.run "before-add-message", :message => m
191
+ yield :add, m, old_m, args[:progress] if block_given?
192
+ Index.sync_message m, true
193
+
194
+ ## We need to add or unhide the message when it either did not exist
195
+ ## before at all or when it was updated. We do *not* add/unhide when
196
+ ## the same message was found at a different location
197
+ if !old_m or not old_m.locations.member? m.location
198
+ UpdateManager.relay self, :added, m
199
+ end
200
+ when :delete
201
+ Index.each_message :location => [source.id, args[:info]] do |m|
202
+ m.locations.delete Location.new(source, args[:info])
203
+ yield :delete, m, [source,args[:info]], args[:progress] if block_given?
204
+ Index.sync_message m, false
205
+ #UpdateManager.relay self, :deleted, m
206
+ end
198
207
  end
199
208
  end
200
- end
201
209
 
202
- source.go_idle
203
- rescue SourceError => e
204
- warn "problem getting messages from #{source}: #{e.message}"
210
+ rescue SourceError => e
211
+ warn "problem getting messages from #{source}: #{e.message}"
212
+
213
+ ensure
214
+ source.go_idle
215
+ source.poll_lock.unlock
216
+ end
217
+ else
218
+ debug "source #{source} is already being polled."
205
219
  end
206
220
  end
207
221
 
data/lib/sup/source.rb CHANGED
@@ -62,7 +62,7 @@ class Source
62
62
 
63
63
  bool_accessor :usual, :archived
64
64
  attr_reader :uri
65
- attr_accessor :id
65
+ attr_accessor :id, :poll_lock
66
66
 
67
67
  def initialize uri, usual=true, archived=false, id=nil
68
68
  raise ArgumentError, "id must be an integer: #{id.inspect}" unless id.is_a? Fixnum if id
@@ -71,6 +71,8 @@ class Source
71
71
  @usual = usual
72
72
  @archived = archived
73
73
  @id = id
74
+
75
+ @poll_lock = Mutex.new
74
76
  end
75
77
 
76
78
  ## overwrite me if you have a disk incarnation (currently used only for sup-sync-back)
data/lib/sup/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Redwood
2
- VERSION = "0.13.1"
2
+ VERSION = "0.13.2"
3
3
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.13.2
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 13
9
- - 1
10
- hash: -2513794677926756067
9
+ - 2
10
+ hash: 1496957733399950236
11
11
  platform: ruby
12
12
  authors:
13
13
  - William Morgan
@@ -46,7 +46,7 @@ cert_chain:
46
46
  ZUw2TWhhNApoRmMyeUFOQmo4dm9hWTVDNzRDZzJWcUV4dGNuU2F4VXRXOXdD
47
47
  NHc1aE9sZzBBVmZiMUpXemc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
48
48
  Cg==
49
- date: 2013-06-21 00:00:00.000000000 Z
49
+ date: 2013-06-26 00:00:00.000000000 Z
50
50
  dependencies:
51
51
  - !ruby/object:Gem::Dependency
52
52
  name: xapian-full-alaveteli
@@ -60,7 +60,7 @@ dependencies:
60
60
  segments:
61
61
  - 1
62
62
  - 2
63
- hash: -853541801780087623
63
+ hash: -3733181840957152875
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
@@ -73,7 +73,7 @@ dependencies:
73
73
  segments:
74
74
  - 1
75
75
  - 2
76
- hash: -853541801780087623
76
+ hash: -3733181840957152875
77
77
  - !ruby/object:Gem::Dependency
78
78
  name: ncursesw-sup
79
79
  requirement: !ruby/object:Gem::Requirement
@@ -86,7 +86,7 @@ dependencies:
86
86
  segments:
87
87
  - 1
88
88
  - 3
89
- hash: 633068654591055268
89
+ hash: -876597745176914036
90
90
  - - ! '>='
91
91
  - !ruby/object:Gem::Version
92
92
  version: 1.3.1
@@ -95,7 +95,7 @@ dependencies:
95
95
  - 1
96
96
  - 3
97
97
  - 1
98
- hash: 2194476579308073519
98
+ hash: -640291375575489877
99
99
  type: :runtime
100
100
  prerelease: false
101
101
  version_requirements: !ruby/object:Gem::Requirement
@@ -108,7 +108,7 @@ dependencies:
108
108
  segments:
109
109
  - 1
110
110
  - 3
111
- hash: 633068654591055268
111
+ hash: -876597745176914036
112
112
  - - ! '>='
113
113
  - !ruby/object:Gem::Version
114
114
  version: 1.3.1
@@ -117,7 +117,7 @@ dependencies:
117
117
  - 1
118
118
  - 3
119
119
  - 1
120
- hash: 2194476579308073519
120
+ hash: -640291375575489877
121
121
  - !ruby/object:Gem::Dependency
122
122
  name: rmail
123
123
  requirement: !ruby/object:Gem::Requirement
@@ -130,7 +130,7 @@ dependencies:
130
130
  segments:
131
131
  - 0
132
132
  - 17
133
- hash: 447830368960240951
133
+ hash: -2258731216383999369
134
134
  type: :runtime
135
135
  prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
@@ -143,7 +143,7 @@ dependencies:
143
143
  segments:
144
144
  - 0
145
145
  - 17
146
- hash: 447830368960240951
146
+ hash: -2258731216383999369
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: highline
149
149
  requirement: !ruby/object:Gem::Requirement
@@ -155,7 +155,7 @@ dependencies:
155
155
  prerelease:
156
156
  segments:
157
157
  - 0
158
- hash: -3209420716314174423
158
+ hash: -3965538710650358713
159
159
  type: :runtime
160
160
  prerelease: false
161
161
  version_requirements: !ruby/object:Gem::Requirement
@@ -167,7 +167,7 @@ dependencies:
167
167
  prerelease:
168
168
  segments:
169
169
  - 0
170
- hash: -3209420716314174423
170
+ hash: -3965538710650358713
171
171
  - !ruby/object:Gem::Dependency
172
172
  name: trollop
173
173
  requirement: !ruby/object:Gem::Requirement
@@ -180,7 +180,7 @@ dependencies:
180
180
  segments:
181
181
  - 1
182
182
  - 12
183
- hash: -78987819028068823
183
+ hash: -2988883823466951243
184
184
  type: :runtime
185
185
  prerelease: false
186
186
  version_requirements: !ruby/object:Gem::Requirement
@@ -193,7 +193,7 @@ dependencies:
193
193
  segments:
194
194
  - 1
195
195
  - 12
196
- hash: -78987819028068823
196
+ hash: -2988883823466951243
197
197
  - !ruby/object:Gem::Dependency
198
198
  name: lockfile
199
199
  requirement: !ruby/object:Gem::Requirement
@@ -205,7 +205,7 @@ dependencies:
205
205
  prerelease:
206
206
  segments:
207
207
  - 0
208
- hash: -3209420716314174423
208
+ hash: -3965538710650358713
209
209
  type: :runtime
210
210
  prerelease: false
211
211
  version_requirements: !ruby/object:Gem::Requirement
@@ -217,7 +217,7 @@ dependencies:
217
217
  prerelease:
218
218
  segments:
219
219
  - 0
220
- hash: -3209420716314174423
220
+ hash: -3965538710650358713
221
221
  - !ruby/object:Gem::Dependency
222
222
  name: mime-types
223
223
  requirement: !ruby/object:Gem::Requirement
@@ -229,7 +229,7 @@ dependencies:
229
229
  prerelease:
230
230
  segments:
231
231
  - 1
232
- hash: 250434563374147666
232
+ hash: -1212563861242074830
233
233
  type: :runtime
234
234
  prerelease: false
235
235
  version_requirements: !ruby/object:Gem::Requirement
@@ -241,7 +241,7 @@ dependencies:
241
241
  prerelease:
242
242
  segments:
243
243
  - 1
244
- hash: 250434563374147666
244
+ hash: -1212563861242074830
245
245
  - !ruby/object:Gem::Dependency
246
246
  name: locale
247
247
  requirement: !ruby/object:Gem::Requirement
@@ -254,7 +254,7 @@ dependencies:
254
254
  segments:
255
255
  - 2
256
256
  - 0
257
- hash: 2973526120172593465
257
+ hash: 1592099054184333623
258
258
  type: :runtime
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
@@ -267,7 +267,7 @@ dependencies:
267
267
  segments:
268
268
  - 2
269
269
  - 0
270
- hash: 2973526120172593465
270
+ hash: 1592099054184333623
271
271
  - !ruby/object:Gem::Dependency
272
272
  name: chronic
273
273
  requirement: !ruby/object:Gem::Requirement
@@ -280,7 +280,7 @@ dependencies:
280
280
  segments:
281
281
  - 0
282
282
  - 9
283
- hash: 825354025702290061
283
+ hash: 2378526325938346664
284
284
  - - ! '>='
285
285
  - !ruby/object:Gem::Version
286
286
  version: 0.9.1
@@ -289,7 +289,7 @@ dependencies:
289
289
  - 0
290
290
  - 9
291
291
  - 1
292
- hash: -4434314476942640720
292
+ hash: 4569877028918522321
293
293
  type: :runtime
294
294
  prerelease: false
295
295
  version_requirements: !ruby/object:Gem::Requirement
@@ -302,7 +302,7 @@ dependencies:
302
302
  segments:
303
303
  - 0
304
304
  - 9
305
- hash: 825354025702290061
305
+ hash: 2378526325938346664
306
306
  - - ! '>='
307
307
  - !ruby/object:Gem::Version
308
308
  version: 0.9.1
@@ -311,7 +311,7 @@ dependencies:
311
311
  - 0
312
312
  - 9
313
313
  - 1
314
- hash: -4434314476942640720
314
+ hash: 4569877028918522321
315
315
  - !ruby/object:Gem::Dependency
316
316
  name: bundler
317
317
  requirement: !ruby/object:Gem::Requirement
metadata.gz.sig CHANGED
Binary file