rubysl-fileutils 1.0.0 → 2.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b32a64d95c1993c930254216320469b966869446
4
- data.tar.gz: 387397e75debc65e26b03d8ade363b78a25e3875
3
+ metadata.gz: 173d0166bae6fc09c6d92734779f6154ab902977
4
+ data.tar.gz: 94834b7147331eb2267fdb562f8a36fb20e0f6e5
5
5
  SHA512:
6
- metadata.gz: 6cc84df8c5cb4d77a9b3605e63b833a20217424e5b20a65ebb217178754b530473d0d8b332c8ee9c65696c9ee8966a5a3943a8f132cca5e674afaa1549e22daa
7
- data.tar.gz: 2e13c00eebfcd395eccc9df567c940072d611e420ab5f2cd1bff29e1a41e7d1d4fdd435831f992a8b85c72256059ac141099bd854050aba96ba075761f8f3e56
6
+ metadata.gz: 1ad8a03fc6f39ad60cd1ccdbe7f3be92c5a3c125b2740b3ec2a7401b255b4fd03319f99f9676909e6480369bf919f9212ec2cc8b72b054f1d71250846add46bd
7
+ data.tar.gz: bc42abdd8c74f0a52d4a262b340f801bfc74abfc55818e55d6fcb550ad14856ef7144971cd735c29326d459e55c0dcb6ac4546e7e8196b68dc157acf4382cecc
@@ -3,5 +3,5 @@ env:
3
3
  - RUBYLIB=lib
4
4
  script: bundle exec mspec
5
5
  rvm:
6
- - 1.8.7
7
- - rbx-nightly-18mode
6
+ - 1.9.3
7
+ - rbx-nightly-19mode
@@ -1,7 +1,7 @@
1
1
  #
2
2
  # = fileutils.rb
3
3
  #
4
- # Copyright (c) 2000-2006 Minero Aoki
4
+ # Copyright (c) 2000-2007 Minero Aoki
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute/modify this program under the same terms of ruby.
@@ -115,6 +115,10 @@ module FileUtils
115
115
  #
116
116
  # FileUtils.cd('/', :verbose => true) # chdir and report it
117
117
  #
118
+ # FileUtils.cd('/') do # chdir
119
+ # [...] # do something
120
+ # end # return to original directory
121
+ #
118
122
  def cd(dir, options = {}, &block) # :yield: dir
119
123
  fu_check_options options, OPT_TABLE['cd']
120
124
  fu_output_message "cd #{dir}" if options[:verbose]
@@ -198,7 +202,7 @@ module FileUtils
198
202
  fu_output_message "mkdir -p #{options[:mode] ? ('-m %03o ' % options[:mode]) : ''}#{list.join ' '}" if options[:verbose]
199
203
  return *list if options[:noop]
200
204
 
201
- list.map {|path| path.sub(%r</\z>, '') }.each do |path|
205
+ list.map {|path| path.chomp(?/) }.each do |path|
202
206
  # optimize for the most common case
203
207
  begin
204
208
  fu_mkdir path, options[:mode]
@@ -212,11 +216,11 @@ module FileUtils
212
216
  stack.push path
213
217
  path = File.dirname(path)
214
218
  end
215
- stack.reverse_each do |path|
219
+ stack.reverse_each do |dir|
216
220
  begin
217
- fu_mkdir path, options[:mode]
218
- rescue SystemCallError => err
219
- raise unless File.directory?(path)
221
+ fu_mkdir dir, options[:mode]
222
+ rescue SystemCallError
223
+ raise unless File.directory?(dir)
220
224
  end
221
225
  end
222
226
  end
@@ -235,7 +239,7 @@ module FileUtils
235
239
  OPT_TABLE['makedirs'] = [:mode, :noop, :verbose]
236
240
 
237
241
  def fu_mkdir(path, mode) #:nodoc:
238
- path = path.sub(%r</\z>, '')
242
+ path = path.chomp(?/)
239
243
  if mode
240
244
  Dir.mkdir path, mode
241
245
  File.chmod mode, path
@@ -258,15 +262,24 @@ module FileUtils
258
262
  def rmdir(list, options = {})
259
263
  fu_check_options options, OPT_TABLE['rmdir']
260
264
  list = fu_list(list)
261
- fu_output_message "rmdir #{list.join ' '}" if options[:verbose]
265
+ parents = options[:parents]
266
+ fu_output_message "rmdir #{parents ? '-p ' : ''}#{list.join ' '}" if options[:verbose]
262
267
  return if options[:noop]
263
268
  list.each do |dir|
264
- Dir.rmdir dir.sub(%r</\z>, '')
269
+ begin
270
+ Dir.rmdir(dir = dir.chomp(?/))
271
+ if parents
272
+ until (parent = File.dirname(dir)) == '.' or parent == dir
273
+ Dir.rmdir(dir)
274
+ end
275
+ end
276
+ rescue Errno::ENOTEMPTY, Errno::ENOENT
277
+ end
265
278
  end
266
279
  end
267
280
  module_function :rmdir
268
281
 
269
- OPT_TABLE['rmdir'] = [:noop, :verbose]
282
+ OPT_TABLE['rmdir'] = [:parents, :noop, :verbose]
270
283
 
271
284
  #
272
285
  # Options: force noop verbose
@@ -472,7 +485,7 @@ module FileUtils
472
485
  # +dest+ must respond to #write(str).
473
486
  #
474
487
  def copy_stream(src, dest)
475
- fu_copy_stream0 src, dest, fu_stream_blksize(src, dest)
488
+ IO.copy_stream(src, dest)
476
489
  end
477
490
  module_function :copy_stream
478
491
 
@@ -480,7 +493,7 @@ module FileUtils
480
493
  # Options: force noop verbose
481
494
  #
482
495
  # Moves file(s) +src+ to +dest+. If +file+ and +dest+ exist on the different
483
- # disk partition, the file is copied instead.
496
+ # disk partition, the file is copied then the original file is removed.
484
497
  #
485
498
  # FileUtils.mv 'badname.rb', 'goodname.rb'
486
499
  # FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', :force => true # no error
@@ -526,7 +539,7 @@ module FileUtils
526
539
  OPT_TABLE['move'] = [:force, :noop, :verbose, :secure]
527
540
 
528
541
  def rename_cannot_overwrite_file? #:nodoc:
529
- /djgpp|cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
542
+ /cygwin|mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM
530
543
  end
531
544
  private_module_function :rename_cannot_overwrite_file?
532
545
 
@@ -687,7 +700,7 @@ module FileUtils
687
700
  end
688
701
  # is a directory.
689
702
  parent_st = File.stat(File.dirname(fullpath))
690
- unless fu_world_writable?(parent_st)
703
+ unless parent_st.world_writable?
691
704
  remove_entry path, force
692
705
  return
693
706
  end
@@ -730,12 +743,7 @@ module FileUtils
730
743
  end
731
744
  module_function :remove_entry_secure
732
745
 
733
- def fu_world_writable?(st)
734
- (st.mode & 0002) != 0
735
- end
736
- private_module_function :fu_world_writable?
737
-
738
- def fu_have_symlink? #:nodoc
746
+ def fu_have_symlink? #:nodoc:
739
747
  File.symlink nil, nil
740
748
  rescue NotImplementedError
741
749
  return false
@@ -843,10 +851,9 @@ module FileUtils
843
851
  fu_check_options options, OPT_TABLE['install']
844
852
  fu_output_message "install -c#{options[:preserve] && ' -p'}#{options[:mode] ? (' -m 0%o' % options[:mode]) : ''} #{[src,dest].flatten.join ' '}" if options[:verbose]
845
853
  return if options[:noop]
846
- fu_each_src_dest(src, dest) do |s, d|
854
+ fu_each_src_dest(src, dest) do |s, d, st|
847
855
  unless File.exist?(d) and compare_file(s, d)
848
856
  remove_file d, true
849
- st = File.stat(s) if options[:preserve]
850
857
  copy_file s, d
851
858
  File.utime st.atime, st.mtime, d if options[:preserve]
852
859
  File.chmod options[:mode], d if options[:mode]
@@ -857,23 +864,110 @@ module FileUtils
857
864
 
858
865
  OPT_TABLE['install'] = [:mode, :preserve, :noop, :verbose]
859
866
 
867
+ def user_mask(target) #:nodoc:
868
+ mask = 0
869
+ target.each_byte do |byte_chr|
870
+ case byte_chr.chr
871
+ when "u"
872
+ mask |= 04700
873
+ when "g"
874
+ mask |= 02070
875
+ when "o"
876
+ mask |= 01007
877
+ when "a"
878
+ mask |= 07777
879
+ end
880
+ end
881
+ mask
882
+ end
883
+ private_module_function :user_mask
884
+
885
+ def mode_mask(mode, path) #:nodoc:
886
+ mask = 0
887
+ mode.each_byte do |byte_chr|
888
+ case byte_chr.chr
889
+ when "r"
890
+ mask |= 0444
891
+ when "w"
892
+ mask |= 0222
893
+ when "x"
894
+ mask |= 0111
895
+ when "X"
896
+ mask |= 0111 if FileTest::directory? path
897
+ when "s"
898
+ mask |= 06000
899
+ when "t"
900
+ mask |= 01000
901
+ end
902
+ end
903
+ mask
904
+ end
905
+ private_module_function :mode_mask
906
+
907
+ def symbolic_modes_to_i(modes, path) #:nodoc:
908
+ current_mode = (File.stat(path).mode & 07777)
909
+ modes.split(/,/).inject(0) do |mode, mode_sym|
910
+ mode_sym = "a#{mode_sym}" if mode_sym =~ %r!^[+-=]!
911
+ target, mode = mode_sym.split %r![+-=]!
912
+ user_mask = user_mask(target)
913
+ mode_mask = mode_mask(mode ? mode : "", path)
914
+
915
+ case mode_sym
916
+ when /=/
917
+ current_mode &= ~(user_mask)
918
+ current_mode |= user_mask & mode_mask
919
+ when /\+/
920
+ current_mode |= user_mask & mode_mask
921
+ when /-/
922
+ current_mode &= ~(user_mask & mode_mask)
923
+ end
924
+ end
925
+ end
926
+ private_module_function :symbolic_modes_to_i
927
+
928
+ def fu_mode(mode, path) #:nodoc:
929
+ mode.is_a?(String) ? symbolic_modes_to_i(mode, path) : mode
930
+ end
931
+ private_module_function :fu_mode
932
+
860
933
  #
861
934
  # Options: noop verbose
862
935
  #
863
936
  # Changes permission bits on the named files (in +list+) to the bit pattern
864
937
  # represented by +mode+.
865
938
  #
939
+ # +mode+ is the symbolic and absolute mode can be used.
940
+ #
941
+ # Absolute mode is
866
942
  # FileUtils.chmod 0755, 'somecommand'
867
943
  # FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
868
944
  # FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true
869
945
  #
946
+ # Symbolic mode is
947
+ # FileUtils.chmod "u=wrx,go=rx", 'somecommand'
948
+ # FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
949
+ # FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true
950
+ #
951
+ # "a" is user, group, other mask.
952
+ # "u" is user's mask.
953
+ # "g" is group's mask.
954
+ # "o" is other's mask.
955
+ # "w" is write permission.
956
+ # "r" is read permission.
957
+ # "x" is execute permission.
958
+ # "s" is uid, gid.
959
+ # "t" is sticky bit.
960
+ # "+" is added to a class given the specified mode.
961
+ # "-" Is removed from a given class given mode.
962
+ # "=" Is the exact nature of the class will be given a specified mode.
963
+
870
964
  def chmod(mode, list, options = {})
871
965
  fu_check_options options, OPT_TABLE['chmod']
872
966
  list = fu_list(list)
873
967
  fu_output_message sprintf('chmod %o %s', mode, list.join(' ')) if options[:verbose]
874
968
  return if options[:noop]
875
969
  list.each do |path|
876
- Entry_.new(path).chmod mode
970
+ Entry_.new(path).chmod(fu_mode(mode, path))
877
971
  end
878
972
  end
879
973
  module_function :chmod
@@ -887,6 +981,7 @@ module FileUtils
887
981
  # to the bit pattern represented by +mode+.
888
982
  #
889
983
  # FileUtils.chmod_R 0700, "/tmp/app.#{$$}"
984
+ # FileUtils.chmod_R "u=wrx", "/tmp/app.#{$$}"
890
985
  #
891
986
  def chmod_R(mode, list, options = {})
892
987
  fu_check_options options, OPT_TABLE['chmod_R']
@@ -898,7 +993,7 @@ module FileUtils
898
993
  list.each do |root|
899
994
  Entry_.new(root).traverse do |ent|
900
995
  begin
901
- ent.chmod mode
996
+ ent.chmod(fu_mode(mode, ent.path))
902
997
  rescue
903
998
  raise unless options[:force]
904
999
  end
@@ -980,20 +1075,26 @@ module FileUtils
980
1075
 
981
1076
  def fu_get_uid(user) #:nodoc:
982
1077
  return nil unless user
983
- user = user.to_s
984
- if /\A\d+\z/ =~ user
985
- then user.to_i
986
- else Etc.getpwnam(user).uid
1078
+ case user
1079
+ when Integer
1080
+ user
1081
+ when /\A\d+\z/
1082
+ user.to_i
1083
+ else
1084
+ Etc.getpwnam(user).uid
987
1085
  end
988
1086
  end
989
1087
  private_module_function :fu_get_uid
990
1088
 
991
1089
  def fu_get_gid(group) #:nodoc:
992
1090
  return nil unless group
993
- group = group.to_s
994
- if /\A\d+\z/ =~ group
995
- then group.to_i
996
- else Etc.getgrnam(group).gid
1091
+ case group
1092
+ when Integer
1093
+ group
1094
+ when /\A\d+\z/
1095
+ group.to_i
1096
+ else
1097
+ Etc.getgrnam(group).gid
997
1098
  end
998
1099
  end
999
1100
  private_module_function :fu_get_gid
@@ -1027,7 +1128,7 @@ module FileUtils
1027
1128
  created = nocreate = options[:nocreate]
1028
1129
  t = options[:mtime]
1029
1130
  if options[:verbose]
1030
- fu_output_message "touch #{nocreate ? ' -c' : ''}#{t ? t.strftime(' -t %Y%m%d%H%M.%S') : ''}#{list.join ' '}"
1131
+ fu_output_message "touch #{nocreate ? '-c ' : ''}#{t ? t.strftime('-t %Y%m%d%H%M.%S ') : ''}#{list.join ' '}"
1031
1132
  end
1032
1133
  return if options[:noop]
1033
1134
  list.each do |path|
@@ -1054,14 +1155,11 @@ module FileUtils
1054
1155
  private
1055
1156
 
1056
1157
  def fu_windows?
1057
- /mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
1158
+ /mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM
1058
1159
  end
1059
1160
 
1060
- def fu_copy_stream0(src, dest, blksize) #:nodoc:
1061
- # FIXME: readpartial?
1062
- while s = src.read(blksize)
1063
- dest.write s
1064
- end
1161
+ def fu_copy_stream0(src, dest, blksize = nil) #:nodoc:
1162
+ IO.copy_stream(src, dest)
1065
1163
  end
1066
1164
 
1067
1165
  def fu_stream_blksize(*streams)
@@ -1110,7 +1208,7 @@ module FileUtils
1110
1208
 
1111
1209
  def path
1112
1210
  if @path
1113
- @path.to_str
1211
+ File.path(@path)
1114
1212
  else
1115
1213
  join(@prefix, @rel)
1116
1214
  end
@@ -1175,7 +1273,9 @@ module FileUtils
1175
1273
  end
1176
1274
 
1177
1275
  def entries
1178
- Dir.entries(path())\
1276
+ opts = {}
1277
+ opts[:encoding] = ::Encoding::UTF_8 if fu_windows?
1278
+ Dir.entries(path(), opts)\
1179
1279
  .reject {|n| n == '.' or n == '..' }\
1180
1280
  .map {|n| Entry_.new(prefix(), join(rel(), n.untaint)) }
1181
1281
  end
@@ -1237,6 +1337,9 @@ module FileUtils
1237
1337
  when file?
1238
1338
  copy_file dest
1239
1339
  when directory?
1340
+ if !File.exist?(dest) and descendant_diretory?(dest, path)
1341
+ raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
1342
+ end
1240
1343
  begin
1241
1344
  Dir.mkdir dest
1242
1345
  rescue
@@ -1264,12 +1367,11 @@ module FileUtils
1264
1367
  end
1265
1368
 
1266
1369
  def copy_file(dest)
1267
- st = stat()
1268
- File.open(path(), 'rb') {|r|
1269
- File.open(dest, 'wb', st.mode) {|w|
1270
- fu_copy_stream0 r, w, (fu_blksize(st) || fu_default_blksize())
1271
- }
1272
- }
1370
+ File.open(path()) do |s|
1371
+ File.open(dest, 'wb', s.stat.mode) do |f|
1372
+ IO.copy_stream(s, f)
1373
+ end
1374
+ end
1273
1375
  end
1274
1376
 
1275
1377
  def copy_metadata(path)
@@ -1295,7 +1397,7 @@ module FileUtils
1295
1397
 
1296
1398
  def remove_dir1
1297
1399
  platform_support {
1298
- Dir.rmdir path().sub(%r</\z>, '')
1400
+ Dir.rmdir path().chomp(?/)
1299
1401
  }
1300
1402
  end
1301
1403
 
@@ -1385,60 +1487,58 @@ module FileUtils
1385
1487
  end
1386
1488
 
1387
1489
  def join(dir, base)
1388
- return dir.to_str if not base or base == '.'
1389
- return base.to_str if not dir or dir == '.'
1490
+ return File.path(dir) if not base or base == '.'
1491
+ return File.path(base) if not dir or dir == '.'
1390
1492
  File.join(dir, base)
1391
1493
  end
1494
+
1495
+ if File::ALT_SEPARATOR
1496
+ DIRECTORY_TERM = "(?=[/#{Regexp.quote(File::ALT_SEPARATOR)}]|\\z)".freeze
1497
+ else
1498
+ DIRECTORY_TERM = "(?=/|\\z)".freeze
1499
+ end
1500
+ SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : ""
1501
+
1502
+ def descendant_diretory?(descendant, ascendant)
1503
+ /\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant)
1504
+ end
1392
1505
  end # class Entry_
1393
1506
 
1394
1507
  def fu_list(arg) #:nodoc:
1395
- [arg].flatten.map {|path| path.to_str }
1508
+ [arg].flatten.map {|path| File.path(path) }
1396
1509
  end
1397
1510
  private_module_function :fu_list
1398
1511
 
1399
1512
  def fu_each_src_dest(src, dest) #:nodoc:
1400
1513
  fu_each_src_dest0(src, dest) do |s, d|
1401
1514
  raise ArgumentError, "same file: #{s} and #{d}" if fu_same?(s, d)
1402
- yield s, d
1515
+ yield s, d, File.stat(s)
1403
1516
  end
1404
1517
  end
1405
1518
  private_module_function :fu_each_src_dest
1406
1519
 
1407
1520
  def fu_each_src_dest0(src, dest) #:nodoc:
1408
- if src.is_a?(Array)
1409
- src.each do |s|
1410
- s = s.to_str
1521
+ if tmp = Array.try_convert(src)
1522
+ tmp.each do |s|
1523
+ s = File.path(s)
1411
1524
  yield s, File.join(dest, File.basename(s))
1412
1525
  end
1413
1526
  else
1414
- src = src.to_str
1527
+ src = File.path(src)
1415
1528
  if File.directory?(dest)
1416
1529
  yield src, File.join(dest, File.basename(src))
1417
1530
  else
1418
- yield src, dest.to_str
1531
+ yield src, File.path(dest)
1419
1532
  end
1420
1533
  end
1421
1534
  end
1422
1535
  private_module_function :fu_each_src_dest0
1423
1536
 
1424
1537
  def fu_same?(a, b) #:nodoc:
1425
- if fu_have_st_ino?
1426
- st1 = File.stat(a)
1427
- st2 = File.stat(b)
1428
- st1.dev == st2.dev and st1.ino == st2.ino
1429
- else
1430
- File.expand_path(a) == File.expand_path(b)
1431
- end
1432
- rescue Errno::ENOENT
1433
- return false
1538
+ File.identical?(a, b)
1434
1539
  end
1435
1540
  private_module_function :fu_same?
1436
1541
 
1437
- def fu_have_st_ino? #:nodoc:
1438
- not fu_windows?
1439
- end
1440
- private_module_function :fu_have_st_ino?
1441
-
1442
1542
  def fu_check_options(options, optdecl) #:nodoc:
1443
1543
  h = options.dup
1444
1544
  optdecl.each do |opt|
@@ -1449,8 +1549,8 @@ module FileUtils
1449
1549
  private_module_function :fu_check_options
1450
1550
 
1451
1551
  def fu_update_option(args, new) #:nodoc:
1452
- if args.last.is_a?(Hash)
1453
- args[-1] = args.last.dup.update(new)
1552
+ if tmp = Hash.try_convert(args.last)
1553
+ args[-1] = tmp.dup.update(new)
1454
1554
  else
1455
1555
  args.push new
1456
1556
  end
@@ -1516,8 +1616,14 @@ module FileUtils
1516
1616
  OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
1517
1617
  end
1518
1618
 
1519
- METHODS = singleton_methods() - %w( private_module_function
1520
- commands options have_option? options_of collect_method )
1619
+ LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern)
1620
+ module LowMethods
1621
+ module_eval("private\n" + ::FileUtils::LOW_METHODS.map {|name| "def #{name}(*)end"}.join("\n"),
1622
+ __FILE__, __LINE__)
1623
+ end
1624
+
1625
+ METHODS = singleton_methods() - [:private_module_function,
1626
+ :commands, :options, :have_option?, :options_of, :collect_method]
1521
1627
 
1522
1628
  #
1523
1629
  # This module has all methods of FileUtils module, but it outputs messages
@@ -1551,6 +1657,7 @@ module FileUtils
1551
1657
  #
1552
1658
  module NoWrite
1553
1659
  include FileUtils
1660
+ include LowMethods
1554
1661
  @fileutils_output = $stderr
1555
1662
  @fileutils_label = ''
1556
1663
  ::FileUtils.collect_method(:noop).each do |name|
@@ -1577,6 +1684,7 @@ module FileUtils
1577
1684
  #
1578
1685
  module DryRun
1579
1686
  include FileUtils
1687
+ include LowMethods
1580
1688
  @fileutils_output = $stderr
1581
1689
  @fileutils_label = ''
1582
1690
  ::FileUtils.collect_method(:noop).each do |name|
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module FileUtils
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -16,6 +16,8 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
+ spec.add_runtime_dependency "redcard", "~> 1.0"
20
+
19
21
  spec.add_development_dependency "bundler", "~> 1.3"
20
22
  spec.add_development_dependency "rake", "~> 10.0"
21
23
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-fileutils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-27 00:00:00.000000000 Z
11
+ date: 2013-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redcard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement