fun_with_files 0.0.7 → 0.0.8
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 +8 -8
- data/Gemfile +6 -5
- data/Rakefile +4 -3
- data/VERSION +1 -1
- data/lib/fun_with/files/digest_methods.rb +29 -1
- data/lib/fun_with/files/file_manipulation_methods.rb +45 -13
- data/lib/fun_with/files/file_path.rb +100 -43
- data/lib/fun_with/files/file_path_location_methods.rb +38 -0
- data/lib/fun_with/files/root_path.rb +5 -1
- data/lib/fun_with/files/string_behavior.rb +5 -0
- data/lib/fun_with_files.rb +11 -8
- data/test/helper.rb +28 -15
- data/test/test_copying.rb +0 -48
- data/test/test_digest.rb +31 -0
- data/test/test_file_manipulation.rb +78 -3
- data/test/test_file_path.rb +56 -21
- data/test/test_fun_with_files.rb +15 -1
- data/test/test_globbing.rb +32 -6
- data/test/test_touching.rb +5 -4
- metadata +10 -50
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YjBjMTU1NDdlNDRhMmM5YmRhOGQ2MDJiMTFhM2QwMjZmM2ZjMmQwYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmRiMGRmZmE1YzRkYTRhZjMyNzI4MDYyZTkyMWFjNmVhMTQ4ZGJjZA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NzAxZjhmYTA2NzIyNjkwNmVlNTMwMjNiZmQ3MjhlYTc5ZWM5ZDMyOTUwNmY1
|
10
|
+
YTAyMTNiMDkwZTgzY2FiMTMyMzMwMTk2NzBiMTcyNDBiNTQ2YTMyNmQwNjMw
|
11
|
+
MmM0ODdiYWM3Yjk3ZDBkZTI4ZjA1MDdmYWYxYzM0NDBhODE3MTI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YjhlYjRhODBmMzc3NDNkZGE4NDM3MzgwMTFlMDgyMWZjY2U5MTdjZjI0NDU5
|
14
|
+
M2VmNzAxOGU2NmQ4N2ZlN2Y4NTE4NWQ1OWUwZDMxODE3ODJkYmNhMGU3MWRh
|
15
|
+
YjFhMDc3NTZkODRkMTBiMDc4N2I4YTZiYTVhZGFhNDQ4MmZlZDY=
|
data/Gemfile
CHANGED
@@ -7,11 +7,12 @@ source "http://rubygems.org"
|
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
|
9
9
|
group :development do
|
10
|
-
gem "shoulda", ">= 3.5"
|
11
|
-
gem "rdoc", "~> 3.12"
|
12
|
-
gem "bundler", "~> 1.5"
|
13
|
-
gem "jeweler", "~> 2.0"
|
10
|
+
# gem "shoulda", "~> 3", ">= 3.5"
|
11
|
+
# gem "rdoc", "~> 3.12"
|
12
|
+
# gem "bundler", "~> 1.5"
|
13
|
+
# gem "jeweler", "~> 2.0"
|
14
14
|
# gem "debugger", "~> 1.6"
|
15
|
+
gem "fun_with_testing", "~> 0.0"
|
15
16
|
end
|
16
17
|
|
17
|
-
gem "xdg"
|
18
|
+
gem "xdg", "~> 2"
|
data/Rakefile
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'fun_with_testing'
|
4
|
+
# require 'rubygems'
|
5
|
+
# require 'bundler'
|
5
6
|
|
6
7
|
begin
|
7
8
|
Bundler.setup(:default, :development)
|
@@ -13,7 +14,7 @@ end
|
|
13
14
|
|
14
15
|
require 'rake'
|
15
16
|
|
16
|
-
require 'jeweler'
|
17
|
+
# require 'jeweler'
|
17
18
|
Jeweler::Tasks.new do |gem|
|
18
19
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
19
20
|
gem.name = "fun_with_files"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
@@ -2,7 +2,35 @@ module FunWith
|
|
2
2
|
module Files
|
3
3
|
module DigestMethods
|
4
4
|
def md5
|
5
|
-
|
5
|
+
digest( Digest::MD5 )
|
6
|
+
end
|
7
|
+
|
8
|
+
def sha1
|
9
|
+
digest( Digest::SHA1 )
|
10
|
+
end
|
11
|
+
|
12
|
+
def sha2
|
13
|
+
digest( Digest::SHA2 )
|
14
|
+
end
|
15
|
+
|
16
|
+
def sha224
|
17
|
+
digest( Digest::SHA224 )
|
18
|
+
end
|
19
|
+
|
20
|
+
def sha256
|
21
|
+
digest( Digest::SHA256 )
|
22
|
+
end
|
23
|
+
|
24
|
+
def sha384
|
25
|
+
digest( Digest::SHA384 )
|
26
|
+
end
|
27
|
+
|
28
|
+
def sha512
|
29
|
+
digest( Digest::SHA512 )
|
30
|
+
end
|
31
|
+
|
32
|
+
def digest( digest_class = Digest::MD5 )
|
33
|
+
self.file? ? digest_class.hexdigest( self.read ) : ""
|
6
34
|
end
|
7
35
|
end
|
8
36
|
end
|
@@ -15,11 +15,13 @@ module FunWith
|
|
15
15
|
# ln_s(list, destdir, options)
|
16
16
|
# ln_sf(src, dest, options)
|
17
17
|
|
18
|
+
# Opts are same as for FileUtils.cp_r
|
19
|
+
# returns the destination path.
|
20
|
+
# How to detect failure? What to return on failure?
|
18
21
|
def cp( *args )
|
19
|
-
self.destination_and_options( args )
|
20
|
-
|
21
|
-
|
22
|
-
end
|
22
|
+
dest, opts = self.destination_and_options( args )
|
23
|
+
FileUtils.cp_r( self, dest, opts )
|
24
|
+
dest.fwf_filepath
|
23
25
|
end
|
24
26
|
|
25
27
|
alias :copy :cp
|
@@ -41,11 +43,15 @@ module FunWith
|
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
def ln_s(
|
45
|
-
|
46
|
+
def ln_s( *args )
|
47
|
+
link, opts = self.destination_and_options( args )
|
48
|
+
FileUtils.ln_s( self, link, opts )
|
46
49
|
link.fwf_filepath
|
47
50
|
end
|
48
51
|
|
52
|
+
alias :symlink :ln_s
|
53
|
+
|
54
|
+
|
49
55
|
def file_gsub( *args, &block )
|
50
56
|
lines = []
|
51
57
|
self.each_line do |line|
|
@@ -59,6 +65,18 @@ module FunWith
|
|
59
65
|
self.write( self.file_gsub(*args,&block) )
|
60
66
|
end
|
61
67
|
|
68
|
+
def empty!
|
69
|
+
if self.directory?
|
70
|
+
FileUtils.rm_rf( self.entries, secure: true )
|
71
|
+
else
|
72
|
+
self.write( "" )
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def truncate( len )
|
77
|
+
self.write( self.read( len ) )
|
78
|
+
end
|
79
|
+
|
62
80
|
protected
|
63
81
|
def destination_and_options( args, &block )
|
64
82
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -72,19 +90,33 @@ module FunWith
|
|
72
90
|
end
|
73
91
|
|
74
92
|
|
75
|
-
|
76
93
|
# logic should be shared by various manipulators
|
94
|
+
#
|
95
|
+
# You can describe the destination as either a filepath or a bunch of strings for arguments.
|
96
|
+
# If the FilePath is relative, or if string args are given, then the destination will be
|
97
|
+
# relative to the path being copied (or in the case of a file, its parent directory).
|
98
|
+
#
|
99
|
+
# If dest doesn't exist, and src (self) is a file, dest is taken to be the complete path.
|
100
|
+
# If dest doesn't exist, and src (self) is a directory, then dest is taken to be
|
101
|
+
# If dest is a directory and the source is a file, then the file will be copied into dest with the src's basename
|
77
102
|
def find_destination_from_args( args )
|
103
|
+
raise ArgumentError.new("File #{self} must exist.") unless self.exist?
|
104
|
+
|
78
105
|
if args.first.is_a?(Pathname)
|
106
|
+
raise ArgumentError.new( "accepts a FilePath or string args, not both" ) unless args.length == 1
|
79
107
|
dest = args.first
|
80
|
-
|
81
|
-
# what if they're trying to define an absolute dest, but being splitty?
|
82
|
-
dest = self.join( *args )
|
108
|
+
dest = dest.directory.join( dest ).expand if dest.relative?
|
83
109
|
else
|
84
|
-
#
|
85
|
-
|
86
|
-
|
110
|
+
dest = self.directory.join(*args).expand # expand gets rid of /../ (parent_dir)
|
111
|
+
end
|
112
|
+
|
113
|
+
if self.file? && dest.directory?
|
114
|
+
dest = dest.join( self.basename )
|
115
|
+
elsif self.directory? && dest.file?
|
116
|
+
raise ArgumentError.new( "cannot overwrite a file with a directory" )
|
87
117
|
end
|
118
|
+
|
119
|
+
dest
|
88
120
|
end
|
89
121
|
|
90
122
|
# rm(list, options)
|
@@ -1,19 +1,13 @@
|
|
1
1
|
module FunWith
|
2
2
|
module Files
|
3
3
|
class FilePath < Pathname
|
4
|
+
SUCC_DIGIT_COUNT = 6
|
5
|
+
DEFAULT_TIMESTAMP_FORMAT = "%Y%m%d%H%M%S%L"
|
6
|
+
|
4
7
|
def initialize( *args )
|
5
8
|
super( File.join( *args ) )
|
6
9
|
end
|
7
10
|
|
8
|
-
# args implicitly joined to cwd
|
9
|
-
def self.cwd( *args )
|
10
|
-
Dir.pwd.fwf_filepath.join( *args )
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.pwd( *args )
|
14
|
-
self.cwd( *args )
|
15
|
-
end
|
16
|
-
|
17
11
|
# If block given, temporary directory is deleted at the end of the block, and the
|
18
12
|
# value given by the block is returned.
|
19
13
|
#
|
@@ -29,10 +23,6 @@ module FunWith
|
|
29
23
|
end
|
30
24
|
end
|
31
25
|
|
32
|
-
def self.home( *args )
|
33
|
-
Dir.home.fwf_filepath.join( *args )
|
34
|
-
end
|
35
|
-
|
36
26
|
def join( *args, &block )
|
37
27
|
if block_given?
|
38
28
|
yield self.class.new( super(*args) )
|
@@ -61,11 +51,11 @@ module FunWith
|
|
61
51
|
# Can be given as an integer: (File::FNM_DOTMATCH | File::FNM_NOESCAPE)
|
62
52
|
# or as an array: [File::FNM_CASEFOLD, File::FNM_DOTMATCH]
|
63
53
|
#
|
64
|
-
# :class => [self.class] The class of objects you want returned (String, FilePath,
|
54
|
+
# :class => [self.class] The class of objects you want returned (String, FilePath, etc.)
|
65
55
|
# Should probably be a subclass of FilePath or String. Class.initialize() must accept a string
|
66
56
|
# [representing a file path] as the sole argument.
|
67
57
|
#
|
68
|
-
# :recurse => [
|
58
|
+
# :recurse => [defaults true]
|
69
59
|
# :recursive (synonym for :recurse)
|
70
60
|
#
|
71
61
|
# :ext => [] A single symbol, or a list containing strings/symbols representing file name extensions.
|
@@ -80,48 +70,88 @@ module FunWith
|
|
80
70
|
# results explicitly with arguments like .glob("**", "*.rb")
|
81
71
|
#
|
82
72
|
# :all : if :all is the only argument, this is the same as .glob("**", "*")
|
73
|
+
#
|
74
|
+
# Examples:
|
75
|
+
# @path.glob( "css", "*.css" ) # Picks up all css files in the css folder
|
76
|
+
# @path.glob( "css", :ext => :css ) # same
|
77
|
+
# @path.glob # Picks up all directories, subdirectories, and files
|
78
|
+
# @path.glob(:all) # same. Note: :all cannot be used in conjunction with :ext
|
79
|
+
# @path.glob("**", "*") # same
|
80
|
+
# @path.entries # synonym for :all, :recursive => false
|
81
|
+
#
|
83
82
|
def glob( *args )
|
83
|
+
args.push( :all ) if args.fwf_blank?
|
84
84
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
memo | obj
|
92
|
-
end
|
93
|
-
when Integer
|
94
|
-
opts[:flags]
|
86
|
+
if args.last == :all
|
87
|
+
all_arg_given = true
|
88
|
+
args.pop
|
89
|
+
else
|
90
|
+
all_arg_given = false
|
95
91
|
end
|
96
92
|
|
93
|
+
flags = case (flags_given = opts.delete(:flags))
|
94
|
+
when NilClass
|
95
|
+
0
|
96
|
+
when Array # should be an array of integers
|
97
|
+
flags_given.inject(0) do |memo, obj|
|
98
|
+
memo | obj
|
99
|
+
end
|
100
|
+
when Integer
|
101
|
+
flags_given
|
102
|
+
end
|
103
|
+
|
97
104
|
flags |= File::FNM_DOTMATCH if opts[:dots]
|
98
105
|
flags |= File::FNM_CASEFOLD if opts[:sensitive]
|
106
|
+
|
107
|
+
recurse = if all_arg_given
|
108
|
+
if opts[:recursive] == false || opts[:recurse] == false
|
109
|
+
false
|
110
|
+
else
|
111
|
+
true
|
112
|
+
end
|
113
|
+
else
|
114
|
+
opts[:recursive] == true || opts[:recurse] == true || false
|
115
|
+
end
|
99
116
|
|
100
|
-
if
|
101
|
-
|
117
|
+
if all_arg_given
|
118
|
+
if recurse
|
119
|
+
args = ["**", "*"]
|
120
|
+
else
|
121
|
+
args = ["*"]
|
122
|
+
end
|
102
123
|
else
|
103
|
-
|
124
|
+
args.push("**") if recurse
|
125
|
+
|
104
126
|
extensions = case opts[:ext]
|
105
127
|
when Symbol, String
|
106
128
|
"*.#{opts[:ext]}"
|
107
129
|
when Array
|
108
130
|
extensions = opts[:ext].map(&:to_s).join(',')
|
109
|
-
"*.{#{extensions}}"
|
131
|
+
"*.{#{extensions}}" # The Dir.glob format for this is '.{ext1,ext2,ext3}'
|
110
132
|
when NilClass
|
111
|
-
|
133
|
+
if args.fwf_blank?
|
134
|
+
"*"
|
135
|
+
else
|
136
|
+
nil
|
137
|
+
end
|
112
138
|
end
|
113
139
|
|
114
|
-
args
|
115
|
-
args.compact!
|
140
|
+
args.push( extensions ) if extensions
|
116
141
|
end
|
117
142
|
|
118
|
-
opts[:class]
|
143
|
+
class_to_return = opts[:class] || self.class
|
144
|
+
|
145
|
+
files = Dir.glob( self.join(*args), flags ).map{ |f| class_to_return.new( f ) }
|
146
|
+
files.reject!{ |f| f.basename.to_s.match( /^\.\.?$/ ) } unless opts[:parent_and_current]
|
119
147
|
|
120
|
-
files = Dir.glob( self.join(*args), flags ).map{ |f| opts[:class].new(f) }
|
121
|
-
files.reject!{ |f| f.basename.to_s.match(/^\.{1,2}$/) } unless opts[:parent_and_current]
|
122
148
|
files
|
123
149
|
end
|
124
150
|
|
151
|
+
def entries
|
152
|
+
self.glob( :recurse => false )
|
153
|
+
end
|
154
|
+
|
125
155
|
def expand
|
126
156
|
self.class.new( File.expand_path( self ) )
|
127
157
|
end
|
@@ -193,7 +223,7 @@ module FunWith
|
|
193
223
|
if self.file?
|
194
224
|
File.size( self ) == 0
|
195
225
|
elsif self.directory?
|
196
|
-
self.glob(
|
226
|
+
self.glob( :all ).fwf_blank?
|
197
227
|
end
|
198
228
|
end
|
199
229
|
|
@@ -206,11 +236,18 @@ module FunWith
|
|
206
236
|
self.gsub(/\.#{self.ext}$/, '')
|
207
237
|
end
|
208
238
|
|
239
|
+
# Two separate modes. With no arguments given, returns the current extension as a string (not a filepath)
|
240
|
+
# With an argument, returns the path with a .(arg) tacked onto the end. The leading period is wholly optional.
|
209
241
|
# Does not return a filepath.
|
210
242
|
# Does not include leading period
|
211
|
-
def ext
|
212
|
-
|
213
|
-
|
243
|
+
def ext( *args )
|
244
|
+
if args.length == 0
|
245
|
+
split_basename = self.basename.to_s.split(".")
|
246
|
+
split_basename.length > 1 ? split_basename.last : ""
|
247
|
+
elsif args.length == 1
|
248
|
+
ext = args.first.to_s.gsub(/^\./,'')
|
249
|
+
self.class.new( @path.dup + ".#{ext}" )
|
250
|
+
end
|
214
251
|
end
|
215
252
|
|
216
253
|
# base, ext = @path.basename_and_ext
|
@@ -226,6 +263,20 @@ module FunWith
|
|
226
263
|
[self.dirname, self.basename_no_ext, self.ext]
|
227
264
|
end
|
228
265
|
|
266
|
+
# if it's a file, returns the immediate parent directory.
|
267
|
+
# if it's not a file, returns itself
|
268
|
+
def directory
|
269
|
+
self.directory? ? self : self.dirname
|
270
|
+
end
|
271
|
+
|
272
|
+
def original?
|
273
|
+
!self.symlink?
|
274
|
+
end
|
275
|
+
|
276
|
+
def original
|
277
|
+
self.symlink? ? self.readlink.original : self
|
278
|
+
end
|
279
|
+
|
229
280
|
# Basically Pathname.relative_path_from, but you can pass in strings
|
230
281
|
def relative_path_from( dir )
|
231
282
|
dir = super( Pathname.new( dir ) )
|
@@ -245,10 +296,12 @@ module FunWith
|
|
245
296
|
# You can change the length of the sequence string by passing
|
246
297
|
# in an argument, but it should always be the same value for
|
247
298
|
# a given set of files.
|
248
|
-
|
299
|
+
#
|
300
|
+
# TODO: Need to get this relying on the specifier() method.
|
249
301
|
def succ( opts = { digit_count: SUCC_DIGIT_COUNT, timestamp: false } )
|
250
|
-
if opts[:timestamp]
|
251
|
-
|
302
|
+
if timestamp = opts[:timestamp]
|
303
|
+
timestamp_format = timestamp.is_a?(String) ? timestamp : DEFAULT_TIMESTAMP_FORMAT
|
304
|
+
timestamp = Time.now.strftime( timestamp_format )
|
252
305
|
digit_count = timestamp.length
|
253
306
|
else
|
254
307
|
timestamp = false
|
@@ -287,6 +340,10 @@ module FunWith
|
|
287
340
|
self.up.join( chunks.join(".") )
|
288
341
|
end
|
289
342
|
|
343
|
+
|
344
|
+
def timestamp( format = true )
|
345
|
+
self.succ( :timestamp => format )
|
346
|
+
end
|
290
347
|
|
291
348
|
def specifier( str )
|
292
349
|
str = str.to_s
|
@@ -334,7 +391,7 @@ module FunWith
|
|
334
391
|
stamped = [ chunks[0..-2], glob_stamp_matcher, chunks[-1] ].flatten.join(".")
|
335
392
|
end
|
336
393
|
|
337
|
-
[self.dirname.
|
394
|
+
[self.dirname.join(original), self.dirname.glob(stamped)].flatten
|
338
395
|
end
|
339
396
|
|
340
397
|
|
@@ -394,7 +451,7 @@ module FunWith
|
|
394
451
|
successfully_required += 1
|
395
452
|
rescue Exception => e
|
396
453
|
failed_requirements << requirement
|
397
|
-
error_messages << "#{e.message} (#{e.class})"
|
454
|
+
error_messages << "Error while requiring #{requirement} : #{e.message} (#{e.class})"
|
398
455
|
end
|
399
456
|
end
|
400
457
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module FunWith
|
2
|
+
module Files
|
3
|
+
module FilePathLocationMethods
|
4
|
+
# args implicitly joined to cwd
|
5
|
+
def cwd( *args )
|
6
|
+
Dir.pwd.fwf_filepath.join( *args )
|
7
|
+
end
|
8
|
+
|
9
|
+
def pwd( *args )
|
10
|
+
self.cwd( *args )
|
11
|
+
end
|
12
|
+
|
13
|
+
def home( *args )
|
14
|
+
Dir.home.fwf_filepath.join( *args )
|
15
|
+
end
|
16
|
+
|
17
|
+
def config_dir( *args )
|
18
|
+
XDG['CONFIG'].fwf_filepath.join( *args )
|
19
|
+
end
|
20
|
+
|
21
|
+
def data_dir( *args )
|
22
|
+
XDG['DATA'].fwf_filepath.join( *args )
|
23
|
+
end
|
24
|
+
|
25
|
+
# Honestly this is a token attempt at Windows compatibility.
|
26
|
+
# This could go wrong all sorts of ways, and hasn't been tested
|
27
|
+
# on Windows. More to the point, when a Windows machine has
|
28
|
+
# multiple drives mounted, what do you even call the root?
|
29
|
+
def root( *args )
|
30
|
+
if self.home =~ /^[a-zA-Z]:/
|
31
|
+
self.home.to_s[0..3].fwf_filepath.join( *args )
|
32
|
+
else
|
33
|
+
"/".fwf_filepath.join( *args )
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -17,7 +17,11 @@ module FunWith
|
|
17
17
|
|
18
18
|
class RootPath
|
19
19
|
def self.rootify( target, path )
|
20
|
-
|
20
|
+
if target.respond_to?(:root)
|
21
|
+
warn( "#{target} already responds to :root, skipping installation" )
|
22
|
+
return nil
|
23
|
+
end
|
24
|
+
|
21
25
|
target.extend( RootPathExtensions )
|
22
26
|
target.set_root_path( FilePath.new( path ) )
|
23
27
|
end
|
data/lib/fun_with_files.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'xdg'
|
2
|
+
require 'digest' # stdlib
|
3
|
+
require 'pathname' # stdlib
|
4
|
+
require 'tmpdir' # Dir.tmpdir
|
4
5
|
|
5
6
|
files = Dir.glob( File.join( File.dirname(__FILE__), "fun_with", "**", "*.rb" ) )
|
6
7
|
|
@@ -13,12 +14,14 @@ FunWith::Files::RootPath.rootify( FunWith::Files, __FILE__.fwf_filepath.dirname.
|
|
13
14
|
module FunWith
|
14
15
|
module Files
|
15
16
|
class FilePath
|
16
|
-
for
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
include
|
17
|
+
for moduul in [ StringBehavior,
|
18
|
+
FileManipulationMethods,
|
19
|
+
FilePermissionMethods,
|
20
|
+
DigestMethods ]
|
21
|
+
include moduul
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
26
|
+
|
27
|
+
FunWith::Files::FilePath.extend( FunWith::Files::FilePathLocationMethods )
|
data/test/helper.rb
CHANGED
@@ -1,31 +1,44 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
1
|
+
# require 'rubygems'
|
2
|
+
# require 'bundler'
|
3
|
+
# require 'debugger'
|
4
|
+
require 'fun_with_testing'
|
3
5
|
|
4
|
-
begin
|
5
|
-
Bundler.setup(:default, :development)
|
6
|
-
rescue Bundler::BundlerError => e
|
7
|
-
$stderr.puts e.message
|
8
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
9
|
-
exit e.status_code
|
10
|
-
end
|
11
6
|
|
12
|
-
|
13
|
-
|
7
|
+
# begin
|
8
|
+
# Bundler.setup(:default, :development)
|
9
|
+
# rescue Bundler::BundlerError => e
|
10
|
+
# $stderr.puts e.message
|
11
|
+
# $stderr.puts "Run `bundle install` to install missing gems"
|
12
|
+
# exit e.status_code
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# require 'test/unit'
|
16
|
+
# require 'shoulda'
|
14
17
|
|
15
18
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
16
19
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
17
20
|
require 'fun_with_files'
|
18
21
|
|
19
|
-
class Test::Unit::TestCase
|
20
|
-
end
|
22
|
+
# class Test::Unit::TestCase
|
23
|
+
# end
|
21
24
|
|
22
|
-
class FunWith::Files::TestCase <
|
25
|
+
class FunWith::Files::TestCase < FunWith::Testing::TestCase
|
23
26
|
include FunWith::Files
|
27
|
+
include FunWith::Testing::Assertions::FunWithFiles
|
28
|
+
include FunWith::Testing::Assertions::Basics
|
24
29
|
|
25
30
|
def tmpdir( &block )
|
26
|
-
|
31
|
+
FilePath.tmpdir do |d|
|
27
32
|
@tmpdir = d
|
28
33
|
yield
|
29
34
|
end
|
30
35
|
end
|
36
|
+
|
37
|
+
def empty_temp_directory
|
38
|
+
tmp = FunWith::Files.root("test", "tmp")
|
39
|
+
tmp.empty!
|
40
|
+
assert_directory tmp
|
41
|
+
puts tmp.glob(:all)
|
42
|
+
assert_empty_directory tmp
|
43
|
+
end
|
31
44
|
end
|
data/test/test_copying.rb
CHANGED
@@ -1,52 +1,4 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestCopying < FunWith::Files::TestCase
|
4
|
-
context "inside a tmpdir" do
|
5
|
-
setup do
|
6
|
-
@dir = FilePath.tmpdir
|
7
|
-
assert @dir.exist?
|
8
|
-
end
|
9
|
-
|
10
|
-
teardown do
|
11
|
-
@dir.rm
|
12
|
-
assert_equal false, @dir.directory?
|
13
|
-
end
|
14
|
-
|
15
|
-
should "copy a single file" do
|
16
|
-
outdir = @dir.join( "down", "down", "down", "to", "the", "depths" )
|
17
|
-
assert !outdir.exist?
|
18
|
-
outdir.touch_dir
|
19
|
-
assert outdir.exist?
|
20
|
-
|
21
|
-
infile = FunWith::Files.root( "test", "helper.rb" )
|
22
|
-
assert infile.exist?
|
23
|
-
|
24
|
-
outfile = outdir.join("copy_of_helper.rb")
|
25
|
-
assert !outfile.exist?
|
26
|
-
|
27
|
-
infile.cp( outdir )
|
28
|
-
assert outdir.join("helper.rb").exist?
|
29
|
-
|
30
|
-
infile.cp( outfile )
|
31
|
-
assert outfile.exist?
|
32
|
-
end
|
33
|
-
|
34
|
-
should "copy a directory structure" do
|
35
|
-
outdir = @dir.join( "down", "down", "abandon", "all", "hope" )
|
36
|
-
indir = FunWith::Files.root( "test" )
|
37
|
-
outdir.touch_dir
|
38
|
-
indir.cp( outdir )
|
39
|
-
|
40
|
-
assert outdir.exist?
|
41
|
-
helper_file = outdir.join( "test", "helper.rb" )
|
42
|
-
assert helper_file.exist?
|
43
|
-
assert_equal indir.join( "helper.rb" ).grep( /FunWith::Files/ ).length, helper_file.grep( /FunWith::Files/ ).length
|
44
|
-
|
45
|
-
assert_equal indir.glob(:all).length, outdir.join("test").glob(:all).length
|
46
|
-
end
|
47
|
-
|
48
|
-
should "symlink masterfully" do
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
4
|
end
|
data/test/test_digest.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestDigest < FunWith::Files::TestCase
|
4
|
+
context "inside a tmpdir" do
|
5
|
+
setup do
|
6
|
+
@dir = FilePath.tmpdir
|
7
|
+
end
|
8
|
+
|
9
|
+
teardown do
|
10
|
+
@dir.rm
|
11
|
+
assert_equal false, @dir.directory?
|
12
|
+
end
|
13
|
+
|
14
|
+
should "digest a blank file" do
|
15
|
+
blankfile = @dir.touch('blank.dat')
|
16
|
+
assert_empty_file blankfile
|
17
|
+
|
18
|
+
results = { :md5 => "d41d8cd98f00b204e9800998ecf8427e",
|
19
|
+
:sha1 => "da39a3ee5e6b4b0d3255bfef95601890afd80709",
|
20
|
+
:sha2 => "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
21
|
+
:sha256 => "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
22
|
+
:sha384 => "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
|
23
|
+
:sha512 => "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
|
24
|
+
}
|
25
|
+
|
26
|
+
for h in %w(md5 sha1 sha2 sha256 sha384 sha512).map(&:to_sym)
|
27
|
+
assert_equal( results[h], blankfile.send(h), "A blank file should have a #{h}() digest of #{results[h]}" )
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -4,13 +4,18 @@ class TestFileManipulation < FunWith::Files::TestCase
|
|
4
4
|
context "testing gsubs" do
|
5
5
|
setup do
|
6
6
|
@license = FunWith::Files.root("LICENSE.txt")
|
7
|
+
@tmp_dir = FunWith::Files.root("test", "tmp")
|
8
|
+
end
|
9
|
+
|
10
|
+
teardown do
|
11
|
+
empty_temp_directory
|
7
12
|
end
|
8
13
|
|
9
14
|
should "copy LICENSE.txt" do
|
10
15
|
copied = @license.cp( "test", "tmp" )
|
11
16
|
assert_match /LICENSE\.txt/, copied.to_s
|
12
|
-
|
13
|
-
|
17
|
+
assert_file copied
|
18
|
+
assert_file_has_content copied
|
14
19
|
end
|
15
20
|
|
16
21
|
should "gsub copy of license.txt" do
|
@@ -18,7 +23,77 @@ class TestFileManipulation < FunWith::Files::TestCase
|
|
18
23
|
copied.file_gsub!( /Bryce Anderson/, "Wilford Brimley" )
|
19
24
|
assert copied.size > 1000
|
20
25
|
|
21
|
-
|
26
|
+
assert_file_contents copied, /Wilford Brimley/
|
27
|
+
end
|
28
|
+
|
29
|
+
should "empty files and directories" do
|
30
|
+
license_copy = @license.cp( @tmp_dir )
|
31
|
+
assert_file( license_copy )
|
32
|
+
assert_equal( FunWith::Files.root("test", "tmp", "LICENSE.txt"), license_copy )
|
33
|
+
assert_file_has_content( license_copy )
|
34
|
+
license_copy.empty!
|
35
|
+
assert_empty_file( license_copy )
|
36
|
+
assert_zero( license_copy.read.length )
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "inside a tmpdir" do
|
43
|
+
setup do
|
44
|
+
@dir = FilePath.tmpdir
|
45
|
+
assert_directory @dir
|
46
|
+
end
|
47
|
+
|
48
|
+
teardown do
|
49
|
+
@dir.rm
|
50
|
+
assert_not_directory @dir
|
51
|
+
end
|
52
|
+
|
53
|
+
should "copy a single file" do
|
54
|
+
outdir = @dir.join( "down", "down", "down", "to", "the", "depths" )
|
55
|
+
assert_no_file outdir
|
56
|
+
outdir.touch_dir
|
57
|
+
assert outdir.exist?
|
58
|
+
|
59
|
+
infile = FunWith::Files.root( "test", "helper.rb" )
|
60
|
+
assert infile.exist?
|
61
|
+
|
62
|
+
outfile = outdir.join("copy_of_helper.rb")
|
63
|
+
assert !outfile.exist?
|
64
|
+
|
65
|
+
infile.cp( outdir )
|
66
|
+
assert outdir.join("helper.rb").exist?
|
67
|
+
|
68
|
+
infile.cp( outfile )
|
69
|
+
assert outfile.exist?
|
70
|
+
end
|
71
|
+
|
72
|
+
should "copy test directory structure to a temporary directory" do
|
73
|
+
outdir = @dir.join( "down", "down", "abandon", "all", "hope" )
|
74
|
+
indir = FunWith::Files.root( "test" )
|
75
|
+
outdir.touch_dir
|
76
|
+
indir.cp( outdir )
|
77
|
+
|
78
|
+
assert outdir.exist?
|
79
|
+
helper_file = outdir.join( "test", "helper.rb" )
|
80
|
+
assert_file_has_content helper_file
|
81
|
+
assert_equal indir.join( "helper.rb" ).grep( /FunWith::Files/ ).length, helper_file.grep( /FunWith::Files/ ).length
|
82
|
+
|
83
|
+
assert_equal indir.glob(:all).length, outdir.join("test").glob(:all).length
|
84
|
+
end
|
85
|
+
|
86
|
+
should "symlink masterfully" do
|
87
|
+
file = @dir.join( "original.txt" )
|
88
|
+
file.write( "This is the original file" )
|
89
|
+
|
90
|
+
clone = file.symlink( "clone.txt" )
|
91
|
+
clone_of_clone = clone.symlink( "clone_of_clone.txt" )
|
92
|
+
assert_false( clone_of_clone.original? )
|
93
|
+
assert( clone_of_clone.symlink? )
|
94
|
+
assert_equal( file, clone_of_clone.original )
|
95
|
+
|
96
|
+
assert_file_contents( clone_of_clone, /This is the/ )
|
22
97
|
end
|
23
98
|
end
|
24
99
|
end
|
data/test/test_file_path.rb
CHANGED
@@ -2,15 +2,25 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestFilePath < FunWith::Files::TestCase
|
4
4
|
context "testing basics" do
|
5
|
-
setup do
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
5
|
should "initialize kindly" do
|
10
6
|
f1 = FilePath.new( "/", "bin", "bash" )
|
11
7
|
f2 = "/".fwf_filepath( "bin", "bash" )
|
12
|
-
|
13
|
-
|
8
|
+
assert_file f1
|
9
|
+
assert_file f2
|
10
|
+
end
|
11
|
+
|
12
|
+
should "have location class methods available" do
|
13
|
+
assert_respond_to( FunWith::Files::FilePath, :home )
|
14
|
+
assert_respond_to( FunWith::Files::FilePath, :config_dir )
|
15
|
+
assert_respond_to( FunWith::Files::FilePath, :root )
|
16
|
+
assert_respond_to( FunWith::Files::FilePath, :data_dir )
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
should "join smoothly" do
|
21
|
+
bin_dir = "/bin".fwf_filepath
|
22
|
+
assert_equal( "/bin/bash", bin_dir.join("bash").to_s )
|
23
|
+
assert_equal( "/bin/bash", bin_dir.join("bash".fwf_filepath).to_s )
|
14
24
|
end
|
15
25
|
|
16
26
|
should "go up/down when asked" do
|
@@ -27,8 +37,8 @@ class TestFilePath < FunWith::Files::TestCase
|
|
27
37
|
assert_equal f1, f2.down( "monkeylips" ).down( "ask_for_floyd" )
|
28
38
|
assert_equal f1, f2.down( "monkeylips", "ask_for_floyd" )
|
29
39
|
|
30
|
-
#invoking down didn't change original
|
31
|
-
|
40
|
+
# invoking down didn't change original
|
41
|
+
refute_match( /ask_for_floyd/, f2.to_s )
|
32
42
|
end
|
33
43
|
|
34
44
|
should "convert from string" do
|
@@ -94,12 +104,12 @@ class TestFilePath < FunWith::Files::TestCase
|
|
94
104
|
seqfile = seqfile.succ
|
95
105
|
end
|
96
106
|
|
97
|
-
|
98
|
-
|
99
|
-
|
107
|
+
assert_file @tmp_dir.join("sequence.txt")
|
108
|
+
assert_file @tmp_dir.join("sequence.000000.txt")
|
109
|
+
assert_file @tmp_dir.join("sequence.000008.txt")
|
100
110
|
|
101
|
-
|
102
|
-
|
111
|
+
assert_file_contents @tmp_dir.join("sequence.txt"), "0"
|
112
|
+
assert_file_contents @tmp_dir.join("sequence.000008.txt"), "9"
|
103
113
|
end
|
104
114
|
|
105
115
|
should "sequence files with custom stamp length" do
|
@@ -110,12 +120,12 @@ class TestFilePath < FunWith::Files::TestCase
|
|
110
120
|
seqfile = seqfile.succ( digit_count: 4 )
|
111
121
|
end
|
112
122
|
|
113
|
-
|
114
|
-
|
115
|
-
|
123
|
+
assert_file @tmp_dir.join("sequence.txt")
|
124
|
+
assert_file @tmp_dir.join("sequence.0000.txt")
|
125
|
+
assert_file @tmp_dir.join("sequence.0008.txt")
|
116
126
|
|
117
|
-
|
118
|
-
|
127
|
+
assert_file_contents @tmp_dir.join("sequence.txt"), "0"
|
128
|
+
assert_file_contents @tmp_dir.join("sequence.0008.txt"), "9"
|
119
129
|
end
|
120
130
|
|
121
131
|
should "sequence files with datestamps" do
|
@@ -131,15 +141,26 @@ class TestFilePath < FunWith::Files::TestCase
|
|
131
141
|
assert files.length == 10
|
132
142
|
|
133
143
|
files.each_with_index do |file, i|
|
134
|
-
|
135
|
-
|
144
|
+
assert_file file
|
145
|
+
assert_file_contents file, i.to_s
|
136
146
|
end
|
137
147
|
|
138
148
|
file_name_strings = files.map(&:to_s)
|
139
149
|
assert_equal file_name_strings[1..-1], file_name_strings[1..-1].sort
|
140
150
|
end
|
151
|
+
|
152
|
+
should "timestamp files using the timestamp() method" do
|
153
|
+
timestampable_file = @tmp_dir.join( "timestamped.dat" )
|
154
|
+
timestamped_file1 = timestampable_file.timestamp
|
155
|
+
timestamped_file2 = timestampable_file.timestamp("%Y")
|
156
|
+
|
157
|
+
assert timestamped_file1 =~ /timestamped.\d{17}.dat$/
|
158
|
+
assert timestamped_file2 =~ /timestamped.\d{4}.dat$/
|
159
|
+
end
|
141
160
|
end
|
142
161
|
|
162
|
+
|
163
|
+
|
143
164
|
context "test specify()" do
|
144
165
|
should "just friggin' work" do
|
145
166
|
fil = "resume.doc".fwf_filepath
|
@@ -163,7 +184,7 @@ class TestFilePath < FunWith::Files::TestCase
|
|
163
184
|
end
|
164
185
|
|
165
186
|
teardown do
|
166
|
-
|
187
|
+
empty_temp_directory
|
167
188
|
end
|
168
189
|
|
169
190
|
should "md5hash a file" do
|
@@ -179,4 +200,18 @@ class TestFilePath < FunWith::Files::TestCase
|
|
179
200
|
assert_equal( nilhashhash, file.md5 )
|
180
201
|
end
|
181
202
|
end
|
203
|
+
|
204
|
+
context "test access" do
|
205
|
+
should "receive an electric shock when it tries to touch an unwritable file" do
|
206
|
+
@read_only_file = "/bin/bash".fwf_filepath # This usually exists. I don't know enough Windows to think of a similarly ubiquitous file.
|
207
|
+
|
208
|
+
if @read_only_file.file? && ! @read_only_file.writable?
|
209
|
+
assert_raises( Errno::EACCES ) do
|
210
|
+
@read_only_file.touch
|
211
|
+
end
|
212
|
+
else
|
213
|
+
skip
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
182
217
|
end
|
data/test/test_fun_with_files.rb
CHANGED
@@ -2,7 +2,7 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestFunWithFiles < FunWith::Files::TestCase
|
4
4
|
context "testing basics" do
|
5
|
-
should "have
|
5
|
+
should "have fwf_blank?() working" do
|
6
6
|
assert [].fwf_blank?
|
7
7
|
assert false.fwf_blank?
|
8
8
|
assert Hash.new.fwf_blank?
|
@@ -11,5 +11,19 @@ class TestFunWithFiles < FunWith::Files::TestCase
|
|
11
11
|
refute true.fwf_blank?
|
12
12
|
refute Object.new.fwf_blank?
|
13
13
|
end
|
14
|
+
|
15
|
+
should "have fwf_present?() working" do
|
16
|
+
refute [].fwf_present?
|
17
|
+
refute false.fwf_present?
|
18
|
+
refute Hash.new.fwf_present?
|
19
|
+
refute "".fwf_present?
|
20
|
+
refute " ".fwf_present?
|
21
|
+
assert true.fwf_present?
|
22
|
+
assert Object.new.fwf_present?
|
23
|
+
end
|
24
|
+
|
25
|
+
should "respond to api" do
|
26
|
+
assert_respond_to( FunWith::Files, :root )
|
27
|
+
end
|
14
28
|
end
|
15
29
|
end
|
data/test/test_globbing.rb
CHANGED
@@ -1,11 +1,37 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestGlobbing < FunWith::Files::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
context "testing globbing" do
|
5
|
+
setup do
|
6
|
+
@loadable_dir = FunWith::Files.root("test", "loadable_dir")
|
7
|
+
assert @loadable_dir.directory?
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
should "glob some ruby files from the test/loadable_dir directory" do
|
12
|
+
globs = @loadable_dir.glob( :recursive => true, :ext => "rb" )
|
13
|
+
assert_equal 8, globs.length
|
14
|
+
end
|
15
|
+
|
16
|
+
should "only glob the top-level when recurse is false" do
|
17
|
+
globs = @loadable_dir.glob( :recurse => false )
|
18
|
+
assert_equal( 5, globs.length )
|
19
|
+
|
20
|
+
globs = @loadable_dir.glob( :all, :recurse => false )
|
21
|
+
assert_equal( 5, globs.length )
|
22
|
+
end
|
23
|
+
|
24
|
+
should "glob everything in the tree by default" do
|
25
|
+
globs = @loadable_dir.glob
|
26
|
+
assert_equal( 13, globs.length )
|
27
|
+
|
28
|
+
globs = @loadable_dir.glob(:all)
|
29
|
+
assert_equal( 13, globs.length )
|
30
|
+
end
|
31
|
+
|
32
|
+
should "glob only files when an extension is given" do
|
33
|
+
globs = @loadable_dir.glob( :recurse => true, :ext => :rb )
|
34
|
+
assert_equal( 8, globs.length )
|
35
|
+
end
|
10
36
|
end
|
11
37
|
end
|
data/test/test_touching.rb
CHANGED
@@ -13,13 +13,14 @@ class TestTouching < FunWith::Files::TestCase
|
|
13
13
|
|
14
14
|
should "touch a subdirectory" do
|
15
15
|
@subdir = @dir.touch_dir( "Movies", "Basketball", "Shaquille" )
|
16
|
-
|
17
|
-
|
16
|
+
assert_fwf_filepath @subdir
|
17
|
+
assert_directory @subdir
|
18
18
|
assert_equal @dir, @subdir.up.up.up
|
19
19
|
|
20
20
|
@subdir_file = @dir.join( "Movies", "Basketball", "Shaquille", "JamNinja.m4v" ).touch
|
21
|
-
|
22
|
-
|
21
|
+
|
22
|
+
assert_fwf_filepath @subdir_file
|
23
|
+
assert_empty_file @subdir_file
|
23
24
|
assert_equal @dir, @subdir_file.dirname.up.up.up
|
24
25
|
end
|
25
26
|
|
metadata
CHANGED
@@ -1,85 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fun_with_files
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryce Anderson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xdg
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ! '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ! '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: shoulda
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ! '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.5'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ! '>='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3.5'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rdoc
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '3.12'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
16
|
requirements:
|
52
17
|
- - ~>
|
53
18
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
-
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.5'
|
62
|
-
type: :development
|
19
|
+
version: '2'
|
20
|
+
type: :runtime
|
63
21
|
prerelease: false
|
64
22
|
version_requirements: !ruby/object:Gem::Requirement
|
65
23
|
requirements:
|
66
24
|
- - ~>
|
67
25
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
26
|
+
version: '2'
|
69
27
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
28
|
+
name: fun_with_testing
|
71
29
|
requirement: !ruby/object:Gem::Requirement
|
72
30
|
requirements:
|
73
31
|
- - ~>
|
74
32
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
33
|
+
version: '0.0'
|
76
34
|
type: :development
|
77
35
|
prerelease: false
|
78
36
|
version_requirements: !ruby/object:Gem::Requirement
|
79
37
|
requirements:
|
80
38
|
- - ~>
|
81
39
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
40
|
+
version: '0.0'
|
83
41
|
description: ! " A more intuitive syntax for performing a variety of file actions.
|
84
42
|
Examples:\n \"/\".fwf_filepath.join('usr', 'bin', 'bash').touch\n FunWith::Files::FilePath.home(\"Music\").glob(:ext
|
85
43
|
=> \"mp3\", :recurse => true)\n home = FunWith::Files::FilePath.home\n home.touch(
|
@@ -107,6 +65,7 @@ files:
|
|
107
65
|
- ./lib/fun_with/files/file_manipulation_methods.rb
|
108
66
|
- ./lib/fun_with/files/file_orderer.rb
|
109
67
|
- ./lib/fun_with/files/file_path.rb
|
68
|
+
- ./lib/fun_with/files/file_path_location_methods.rb
|
110
69
|
- ./lib/fun_with/files/file_permission_methods.rb
|
111
70
|
- ./lib/fun_with/files/pathname_extensions.rb
|
112
71
|
- ./lib/fun_with/files/remote_path.rb
|
@@ -131,6 +90,7 @@ files:
|
|
131
90
|
- ./test/loadable_dir/dir5/d.rb
|
132
91
|
- ./test/test_copying.rb
|
133
92
|
- ./test/test_descent.rb
|
93
|
+
- ./test/test_digest.rb
|
134
94
|
- ./test/test_directory_builder.rb
|
135
95
|
- ./test/test_file_manipulation.rb
|
136
96
|
- ./test/test_file_path.rb
|