rfd 0.5.2 → 0.6.0

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: f88e92471a817afd233405868bab1793df50f33c
4
- data.tar.gz: de66b26038bcba42bc51b926702d2626934f5e61
3
+ metadata.gz: 7c84b042ee4196d959b2aa91af8c59ca9fa3b28b
4
+ data.tar.gz: 46504bdc73c1b0f8a1779955f455e09fe73bc06a
5
5
  SHA512:
6
- metadata.gz: 2aa57038d747467073c2bd99d9edc359bf66263a7c243b1ede45bf29f7ae81e40a7653e37d5700721195117888b6f47a71b42bff17f8ef296868494ea4a934af
7
- data.tar.gz: e2da5fc82b60839e72713f08ce0f0096c7d7ce852017e54aa5b90dca9bd4803c762f1c0e88fa67cdcaff2f292a1c18bc5f3c29e2b15e5225d230d935e67176b5
6
+ metadata.gz: 538534dad4ea1aadd91e06c02ad6ed31b794e25de2460f4329120e7a1988bded79d7086eb8983d479302db4a9e0d751d68129f3e73ad2238fdf80c25a141bca1
7
+ data.tar.gz: b15391a9ca20f6a2d171542fd0fa3aa92f077471cc43d963ab6182fe75146e9607315a6d7f08710381e04fd21ab059040504a193c1c1840e2c1b09105812d330
data/lib/rfd.rb CHANGED
@@ -34,6 +34,7 @@ module Rfd
34
34
  def self.start(dir = '.')
35
35
  init_curses
36
36
  Rfd::Window.draw_borders
37
+ Curses.refresh
37
38
  rfd = Rfd::Controller.new
38
39
  rfd.cd dir
39
40
  rfd
@@ -50,6 +51,7 @@ module Rfd
50
51
  @header_l = HeaderLeftWindow.new
51
52
  @header_r = HeaderRightWindow.new
52
53
  @command_line = CommandLineWindow.new
54
+ @debug = DebugWindow.new if ENV['DEBUG']
53
55
  @direction, @dir_history, @last_command, @times, @yanked_items = nil, [], nil, nil, nil
54
56
  end
55
57
 
@@ -58,12 +60,12 @@ module Rfd
58
60
  loop do
59
61
  begin
60
62
  number_pressed = false
61
- case (c = Curses.getch).ord
63
+ case (c = Curses.getch)
62
64
  when 10, 13 # enter, return
63
65
  enter
64
- when 27
66
+ when 27 # ESC
65
67
  q
66
- when 32 # space
68
+ when ' ' # space
67
69
  space
68
70
  when 127 # DEL
69
71
  del
@@ -78,12 +80,12 @@ module Rfd
78
80
  when Curses::KEY_CTRL_A..Curses::KEY_CTRL_Z
79
81
  chr = ((c - 1 + 65) ^ 0b0100000).chr
80
82
  public_send "ctrl_#{chr}" if respond_to?("ctrl_#{chr}")
81
- when 48..57 # ?0..?9
82
- public_send c.chr
83
+ when ?0..?9
84
+ public_send c
83
85
  number_pressed = true
84
- when 0..255
85
- if respond_to? c.chr
86
- public_send c.chr
86
+ when ?!..?~
87
+ if respond_to? c
88
+ public_send c
87
89
  else
88
90
  debug "key: #{c}" if ENV['DEBUG']
89
91
  end
@@ -113,7 +115,7 @@ module Rfd
113
115
 
114
116
  # Change the number of columns in the main window.
115
117
  def spawn_panes(num)
116
- main.spawn_panes num
118
+ main.number_of_panes = num
117
119
  @current_row = @current_page = 0
118
120
  end
119
121
 
@@ -145,15 +147,12 @@ module Rfd
145
147
  # The row number can be out of range of the current page.
146
148
  def move_cursor(row = nil)
147
149
  if row
148
- page, item_index_in_page = row.divmod max_items
149
- if page != current_page
150
- switch_page page
151
- else
152
- if (prev_item = items[current_row])
153
- main.draw_item prev_item
154
- end
150
+ if (prev_item = items[current_row])
151
+ main.draw_item prev_item
155
152
  end
156
- main.activate_pane item_index_in_page / maxy
153
+ page = row / max_items
154
+ switch_page page if page != current_page
155
+ main.activate_pane row / maxy
157
156
  @current_row = row
158
157
  else
159
158
  @current_row = 0
@@ -161,9 +160,10 @@ module Rfd
161
160
 
162
161
  item = items[current_row]
163
162
  main.draw_item item, current: true
163
+ main.display current_page
164
164
 
165
165
  header_l.draw_current_file_info item
166
- header_l.wrefresh
166
+ header_l.refresh
167
167
  @current_row
168
168
  end
169
169
 
@@ -255,16 +255,16 @@ module Rfd
255
255
  unless in_zip?
256
256
  @items = Dir.foreach(current_dir).map {|fn|
257
257
  stat = File.lstat current_dir.join(fn)
258
- Item.new dir: current_dir, name: fn, stat: stat, window_width: maxx
258
+ Item.new dir: current_dir, name: fn, stat: stat, window_width: main.width
259
259
  }.to_a.partition {|i| %w(. ..).include? i.name}.flatten
260
260
  else
261
- @items = [Item.new(dir: current_dir, name: '.', stat: File.stat(current_dir), window_width: maxx),
262
- Item.new(dir: current_dir, name: '..', stat: File.stat(File.dirname(current_dir)), window_width: maxx)]
261
+ @items = [Item.new(dir: current_dir, name: '.', stat: File.stat(current_dir), window_width: main.width),
262
+ Item.new(dir: current_dir, name: '..', stat: File.stat(File.dirname(current_dir)), window_width: main.width)]
263
263
  zf = Zip::File.new current_dir
264
264
  zf.each {|entry|
265
265
  next if entry.name_is_directory?
266
266
  stat = zf.file.stat entry.name
267
- @items << Item.new(dir: current_dir, name: entry.name, stat: stat, window_width: maxx)
267
+ @items << Item.new(dir: current_dir, name: entry.name, stat: stat, window_width: main.width)
268
268
  }
269
269
  end
270
270
  end
@@ -298,7 +298,9 @@ module Rfd
298
298
 
299
299
  # Update the main window with the loaded files and directories. Also update the header.
300
300
  def draw_items
301
- main.draw_items_to_each_pane (@displayed_items = items[current_page * max_items, max_items])
301
+ main.newpad items
302
+ @displayed_items = items[current_page * max_items, max_items]
303
+ main.display current_page
302
304
  header_l.draw_path_and_page_number path: current_dir.path, current: current_page + 1, total: total_pages
303
305
  end
304
306
 
@@ -597,8 +599,9 @@ module Rfd
597
599
  # ==== Parameters
598
600
  # * +page+ - Target page number
599
601
  def switch_page(page)
600
- @current_page = page
601
- draw_items
602
+ main.display (@current_page = page)
603
+ @displayed_items = items[current_page * max_items, max_items]
604
+ header_l.draw_path_and_page_number path: current_dir.path, current: current_page + 1, total: total_pages
602
605
  end
603
606
 
604
607
  # Update the header information concerning currently marked files or directories.
@@ -633,12 +636,12 @@ module Rfd
633
636
  cmd, *args = command_line.get_command(prompt: prompt).split(' ')
634
637
  if cmd && !cmd.empty? && respond_to?(cmd)
635
638
  self.public_send cmd, *args
636
- command_line.wclear
637
- command_line.wrefresh
639
+ command_line.clear
640
+ command_line.refresh
638
641
  end
639
642
  rescue Interrupt
640
- command_line.wclear
641
- command_line.wrefresh
643
+ command_line.clear
644
+ command_line.refresh
642
645
  end
643
646
 
644
647
  # Accept user input, and directly execute it in an external shell.
@@ -650,8 +653,8 @@ module Rfd
650
653
  end
651
654
  rescue Interrupt
652
655
  ensure
653
- command_line.wclear
654
- command_line.wrefresh
656
+ command_line.clear
657
+ command_line.refresh
655
658
  end
656
659
 
657
660
  # Let the user answer y or n.
@@ -660,12 +663,12 @@ module Rfd
660
663
  # * +prompt+ - Prompt message
661
664
  def ask(prompt = '(y/n)')
662
665
  command_line.set_prompt prompt
663
- command_line.wrefresh
666
+ command_line.refresh
664
667
  while (c = Curses.getch)
665
668
  next unless [?N, ?Y, ?n, ?y, 3, 27] .include? c # N, Y, n, y, ^c, esc
666
- command_line.wclear
667
- command_line.wrefresh
668
- break %[Y y].include? c # Y, y
669
+ command_line.clear
670
+ command_line.refresh
671
+ break (c == 'y') || (c == 'Y')
669
672
  end
670
673
  end
671
674
 
@@ -734,8 +737,8 @@ module Rfd
734
737
  Curses.getch if pause
735
738
  #NOTE needs to draw borders and ls again here since the stdlib Curses.refresh fails to retrieve the previous screen
736
739
  Rfd::Window.draw_borders
737
- ls
738
740
  Curses.refresh
741
+ ls
739
742
  end
740
743
 
741
744
  def expand_path(path)
@@ -756,7 +759,7 @@ module Rfd
756
759
  end
757
760
 
758
761
  def debug(str)
759
- header_r.debug str
762
+ @debug.debug str
760
763
  end
761
764
  end
762
765
  end
data/lib/rfd/commands.rb CHANGED
@@ -192,7 +192,7 @@ module Rfd
192
192
  draw_items
193
193
  move_cursor current_row
194
194
  draw_marked_items
195
- header_r.wrefresh
195
+ header_r.refresh
196
196
  end
197
197
 
198
198
  # "b"ack to the previous page.
@@ -279,7 +279,7 @@ module Rfd
279
279
  toggle_mark
280
280
  j
281
281
  draw_marked_items
282
- header_r.wrefresh
282
+ header_r.refresh
283
283
  end
284
284
 
285
285
  # cd to the upper hierarchy.
data/lib/rfd/windows.rb CHANGED
@@ -1,95 +1,35 @@
1
- module Rfd
2
- class Window
3
- ACS_URCORNER = 4194411
4
- ACS_LRCORNER = 4194410
5
- ACS_ULCORNER = 4194412
6
- ACS_LLCORNER = 4194413
7
- ACS_HLINE = 4194417
8
- ACS_LTEE = 4194420
9
- ACS_RTEE = 4194421
10
- ACS_BTEE = 4194422
11
- ACS_TTEE = 4194423
12
- ACS_VLINE = 4194424
13
-
14
- attr_reader :window
1
+ require 'delegate'
15
2
 
3
+ module Rfd
4
+ class Window < DelegateClass(Curses::Window)
16
5
  def self.draw_borders
17
- Curses.attron Curses.color_pair(Curses::COLOR_CYAN) do
18
- Curses.addch ACS_ULCORNER
19
- (Curses.cols - 32).times { Curses.addch ACS_HLINE }
20
- Curses.addch ACS_TTEE
21
- 29.times { Curses.addch ACS_HLINE }
22
- Curses.addch ACS_URCORNER
23
-
24
- [*1..3, *5..(Curses.lines - 3)].each do |i|
25
- Curses.setpos i, 0
26
- Curses.addch ACS_VLINE
27
- Curses.setpos i, Curses.cols - 1
28
- Curses.addch ACS_VLINE
29
- end
30
- [1, 2, 3].each do |i|
31
- Curses.setpos i, Curses.cols - 31
32
- Curses.addch ACS_VLINE
33
- end
34
-
35
- Curses.setpos 4, 0
36
- Curses.addch ACS_LTEE
37
- (Curses.cols - 32).times { Curses.addch ACS_HLINE }
38
- Curses.addch ACS_BTEE
39
- 29.times { Curses.addch ACS_HLINE }
40
- Curses.addch ACS_RTEE
41
-
42
- Curses.setpos Curses.lines - 2, 0
43
- Curses.addch ACS_LLCORNER
44
- (Curses.cols - 2).times { Curses.addch ACS_HLINE }
45
- Curses.addch ACS_LRCORNER
6
+ [[5, Curses.stdscr.maxx, 0, 0], [5, Curses.cols - 30, 0, 0], [Curses.stdscr.maxy - 5, Curses.stdscr.maxx, 4, 0]].each do |height, width, top, left|
7
+ w = Curses.stdscr.subwin height, width, top, left
8
+ w.bkgdset Curses.color_pair(Curses::COLOR_CYAN)
9
+ w.box 0, 0
10
+ w.close
46
11
  end
47
12
  end
48
13
 
49
- def wmove(y, x = 0)
50
- window.setpos y, x
51
- end
52
-
53
- def waddstr(str, clear_to_eol_before_add: false)
54
- window.clrtoeol if clear_to_eol_before_add
55
- window.addstr str
56
- end
57
-
58
- def wclear
59
- window.clear
60
- end
61
-
62
- def wrefresh
63
- window.refresh
14
+ def initialize(maxy: nil, maxx: nil, begy: nil, begx: nil, window: nil)
15
+ super window || Curses.stdscr.subwin(maxy, maxx, begy, begx)
64
16
  end
65
17
 
66
- def maxx
67
- window.maxx
68
- end
69
-
70
- def maxy
71
- window.maxy
72
- end
73
-
74
- def begx
75
- window.begx
76
- end
77
-
78
- def begy
79
- window.begy
18
+ def writeln(row, str)
19
+ setpos row, 0
20
+ clrtoeol
21
+ self << str
80
22
  end
81
23
  end
82
24
 
83
25
  class HeaderLeftWindow < Window
84
26
  def initialize
85
- @window = Curses.stdscr.subwin 3, Curses.cols - 32, 1, 1
27
+ super maxy: 3, maxx: Curses.cols - 32, begy: 1, begx: 1
86
28
  end
87
29
 
88
30
  def draw_path_and_page_number(path: nil, current: 1, total: nil)
89
- @path_and_page_number = %Q[Page: #{"#{current}/ #{total}".ljust(11)} Path: #{path}]
90
- wmove 0
91
- waddstr @path_and_page_number, clear_to_eol_before_add: true
92
- wrefresh
31
+ writeln 0, %Q[Page: #{"#{current}/ #{total}".ljust(11)} Path: #{path}]
32
+ refresh
93
33
  end
94
34
 
95
35
  def draw_current_file_info(current_file)
@@ -98,170 +38,128 @@ module Rfd
98
38
  end
99
39
 
100
40
  def draw_current_filename(current_file_name)
101
- @current_file_name = "File: #{current_file_name}"
102
- wmove 1
103
- waddstr @current_file_name, clear_to_eol_before_add: true
41
+ writeln 1, "File: #{current_file_name}"
104
42
  end
105
43
 
106
44
  def draw_stat(item)
107
- @stat = " #{item.size_or_dir.ljust(13)}#{item.mtime} #{item.mode}"
108
- wmove 2
109
- waddstr @stat, clear_to_eol_before_add: true
45
+ writeln 2, " #{item.size_or_dir.ljust(13)}#{item.mtime} #{item.mode}"
110
46
  end
111
47
  end
112
48
 
113
49
  class HeaderRightWindow < Window
114
50
  def initialize
115
- @window = Curses.stdscr.subwin 3, 29, 1, Curses.cols - 30
51
+ super maxy: 2, maxx: 29, begy: 2, begx: Curses.cols - 30
116
52
  end
117
53
 
118
54
  def draw_marked_items(count: 0, size: 0)
119
- wmove 1
120
- waddstr %Q[#{"#{count}Marked".rjust(11)} #{size.to_s.reverse.gsub( /(\d{3})(?=\d)/, '\1,').reverse.rjust(16)}], clear_to_eol_before_add: true
55
+ writeln 0, %Q[#{"#{count}Marked".rjust(11)} #{size.to_s.reverse.gsub( /(\d{3})(?=\d)/, '\1,').reverse.rjust(16)}]
121
56
  end
122
57
 
123
58
  def draw_total_items(count: 0, size: 0)
124
- wmove 2
125
- waddstr %Q[#{"#{count}Files".rjust(10)} #{size.to_s.reverse.gsub( /(\d{3})(?=\d)/, '\1,').reverse.rjust(17)}], clear_to_eol_before_add: true
126
- wrefresh
59
+ writeln 1, %Q[#{"#{count}Files".rjust(10)} #{size.to_s.reverse.gsub( /(\d{3})(?=\d)/, '\1,').reverse.rjust(17)}]
60
+ refresh
61
+ end
62
+ end
63
+
64
+ class DebugWindow < Window
65
+ def initialize
66
+ super maxy: 1, maxx: 29, begy: 1, begx: Curses.cols - 30
127
67
  end
128
68
 
129
69
  def debug(s)
130
- wmove 0, 0
131
- window.clrtoeol
132
- waddstr s.to_s
133
- wrefresh
70
+ writeln 0, s.to_s
71
+ refresh
134
72
  end
135
73
  end
136
74
 
137
75
  class MainWindow < Window
138
- class Panes
139
- attr_reader :current_index
140
-
141
- def initialize(panes)
142
- @panes, @current_index = panes, 0
143
- end
144
-
145
- def active
146
- @panes[@current_index]
147
- end
76
+ attr_reader :current_index, :begy
77
+ attr_writer :number_of_panes
148
78
 
149
- def activate(index)
150
- @current_index = index if index < @panes.size
151
- end
152
-
153
- def get_index_by_point(y: nil, x: nil)
154
- @panes.each.with_index do |p, i|
155
- return i if include_point? pane: p, y: y, x: x
156
- end if y && x
157
- nil
158
- end
159
-
160
- def size
161
- @panes.size
162
- end
163
-
164
- def close_all
165
- @panes.each do |p|
166
- p.clear
167
- p.close
168
- end
169
- end
170
-
171
- def include_point?(pane: pane, y: nil, x: nil)
172
- (y >= pane.begy) && (pane.begy + pane.maxy > y) && (x >= pane.begx) && (pane.begx + pane.maxx > x)
173
- end
79
+ def initialize(dir = '.')
80
+ @begy, @current_index, @number_of_panes = 5, 0, 2
81
+ super window: Curses::Pad.new(Curses.lines - 7, Curses.cols - 2)
174
82
  end
175
83
 
176
- def initialize(dir = '.')
177
- spawn_panes 2
84
+ def newpad(items)
85
+ clear
86
+ columns = items.size / maxy + 1
87
+ newx = width * (((columns - 1) / @number_of_panes + 1) * @number_of_panes)
88
+ resize maxy, newx if newx != maxx
89
+
90
+ draw_items_to_each_pane items
178
91
  end
179
92
 
180
- def spawn_panes(num)
181
- @panes.close_all if defined? @panes
182
- width = (Curses.cols - 2) / num
183
- windows = 0.upto(num - 1).inject([]) {|arr, i| arr << Curses.stdscr.subwin(Curses.lines - 7, width - 1, 5, width * i + 1)}
184
- @panes = Panes.new windows
185
- activate_pane 0
93
+ def display(page)
94
+ refresh 0, (Curses.cols - 2) * page, begy, 1, begy + maxy - 1, Curses.cols - 2
186
95
  end
187
96
 
188
97
  def activate_pane(num)
189
- @panes.activate num
98
+ @current_index = num
190
99
  end
191
100
 
192
101
  def pane_index_at(y: nil, x: nil)
193
- @panes.get_index_by_point y: y, x: x
102
+ (y >= begy) && (begy + maxy > y) && (x / width)
194
103
  end
195
104
 
196
- def window
197
- @panes.active
105
+ def width
106
+ (Curses.cols - 2) / @number_of_panes
198
107
  end
199
108
 
200
109
  def max_items
201
- maxy * @panes.size
110
+ maxy * @number_of_panes
202
111
  end
203
112
 
204
113
  def draw_item(item, current: false)
205
- window.setpos item.index % maxy, 0
206
- window.attron(Curses.color_pair(item.color) | (current ? Curses::A_UNDERLINE : Curses::A_NORMAL)) do
207
- window.addstr "#{item.to_s}\n"
114
+ setpos item.index % maxy, width * @current_index
115
+ attron(Curses.color_pair(item.color) | (current ? Curses::A_UNDERLINE : Curses::A_NORMAL)) do
116
+ self << item.to_s
208
117
  end
209
- wrefresh
210
118
  end
211
119
 
212
120
  def draw_items_to_each_pane(items)
213
- original_active_pane_index = @panes.current_index
214
-
215
- 0.upto(@panes.size - 1) do |index|
216
- activate_pane index
217
- wclear
218
- wmove 0
219
- items[maxy * index, maxy * (index + 1)].each do |item|
220
- window.attron(Curses.color_pair(item.color) | Curses::A_NORMAL) { waddstr "#{item.to_s}\n" }
221
- end if items[maxy * index, maxy * (index + 1)]
222
- wrefresh
121
+ items.each_slice(maxy).each.with_index do |arr, col_index|
122
+ arr.each.with_index do |item, i|
123
+ setpos i, width * col_index
124
+ attron(Curses.color_pair(item.color) | Curses::A_NORMAL) { self << item.to_s }
125
+ end
223
126
  end
224
- activate_pane original_active_pane_index
225
127
  end
226
128
 
227
129
  def toggle_mark(item)
228
130
  if item.toggle_mark
229
- window.setpos item.index % maxy, 0
230
- window.addstr item.current_mark
131
+ setpos item.index % maxy, 0
132
+ self << item.current_mark
231
133
  end
232
134
  end
233
135
  end
234
136
 
235
137
  class CommandLineWindow < Window
236
138
  def initialize
237
- @window = Curses.stdscr.subwin 1, Curses.cols, Curses.lines - 1, 0
139
+ super maxy: 1, maxx: Curses.cols, begy: Curses.lines - 1, begx: 0
238
140
  end
239
141
 
240
142
  def set_prompt(str)
241
- window.attron(Curses.color_pair(Curses::COLOR_WHITE) | Curses::A_BOLD) do
242
- wmove 0
243
- window.clrtoeol
244
- waddstr str
143
+ attron(Curses.color_pair(Curses::COLOR_WHITE) | Curses::A_BOLD) do
144
+ writeln 0, str
245
145
  end
246
146
  end
247
147
 
248
148
  def get_command(prompt: nil)
249
149
  Curses.echo
250
150
  startx = prompt ? prompt.size : 1
251
- window.setpos 0, startx
252
- s = window.getstr
151
+ setpos 0, startx
152
+ s = getstr
253
153
  "#{prompt[1..-1] if prompt}#{s.strip}"
254
154
  ensure
255
155
  Curses.noecho
256
156
  end
257
157
 
258
158
  def show_error(str)
259
- window.attron(Curses.color_pair(Curses::COLOR_RED) | Curses::A_BOLD) do
260
- wmove 0
261
- window.clrtoeol
262
- waddstr str
159
+ attron(Curses.color_pair(Curses::COLOR_RED) | Curses::A_BOLD) do
160
+ writeln 0, str
263
161
  end
264
- wrefresh
162
+ refresh
265
163
  end
266
164
  end
267
165
  end
data/rfd.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "rfd"
7
- spec.version = '0.5.2'
7
+ spec.version = '0.6.0'
8
8
  spec.authors = ["Akira Matsuda"]
9
9
  spec.email = ["ronnie@dio.jp"]
10
10
  spec.description = 'Ruby on Files & Directories'
@@ -31,8 +31,8 @@ describe Rfd::Controller do
31
31
  describe '#spawn_panes' do
32
32
  before { controller.spawn_panes 3 }
33
33
 
34
- subject { controller.main.instance_variable_get :@panes }
35
- it { should have(3).panes }
34
+ subject { controller.main.instance_variable_get :@number_of_panes }
35
+ it { should == 3 }
36
36
  end
37
37
 
38
38
  describe '#current_item' do
@@ -89,8 +89,8 @@ describe Rfd::Controller do
89
89
  before do
90
90
  controller.move_cursor 5
91
91
  end
92
- subject { controller.main.instance_variable_get :@panes }
93
- its(:current_index) { should == 1 }
92
+ subject { controller.main.instance_variable_get :@current_index }
93
+ it { should == 1 }
94
94
  end
95
95
 
96
96
  context 'When moving to the second page' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-18 00:00:00.000000000 Z
11
+ date: 2013-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip