fun_with_files 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -13,4 +13,5 @@ group :development do
13
13
  gem "jeweler", "~> 1.8.4"
14
14
  end
15
15
 
16
+ gem "xdg"
16
17
  gem "debugger"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -0,0 +1,179 @@
1
+ module FunWith
2
+ module Files
3
+
4
+ # Describes a domain-specific language for creating and populating a
5
+ # directory of files.
6
+ class DirectoryBuilder
7
+ attr_accessor :current_path, :current_file
8
+
9
+ def initialize( path )
10
+ @paths = []
11
+ @current_path = path.fwf_filepath
12
+ make_path
13
+ end
14
+
15
+ def self.create( path, &block )
16
+ builder = self.new( path )
17
+ yield builder if block_given?
18
+ builder
19
+ end
20
+
21
+ def dir( *args, &block )
22
+ descend( *args ) do
23
+ yield if block_given?
24
+ end
25
+ end
26
+
27
+ # Beware: if block is given, the temp directory will be
28
+ #
29
+ def self.tmpdir( &block )
30
+ if block_given?
31
+ FilePath.tmpdir do |dir|
32
+ self.create( dir ) do |builder|
33
+ yield builder
34
+ end
35
+ end
36
+ else
37
+ self.create( FilePath.tmpdir )
38
+ end
39
+ end
40
+
41
+ # Copies the given source file into a file in the current_path.
42
+ # If a dest_name is given, the new file will be given that name.
43
+ def copy( src_filepath, dst_name = nil )
44
+ dst_filepath = dst_name ? @current_path.join( dst_name ) : @current_path
45
+ FileUtils.copy( src_filepath, dst_filepath )
46
+ end
47
+
48
+ def file( name = nil, content = nil, &block )
49
+ # if name && content
50
+ # begin
51
+ # f = open_file( name )
52
+ # f << content
53
+ # ensure
54
+ # close_file
55
+ # end
56
+ if name
57
+ open_file( name )
58
+ @current_file << content if content
59
+ if block_given?
60
+ begin
61
+ yield @current_file
62
+ ensure
63
+ close_file
64
+ end
65
+ end
66
+ else
67
+ @current_file
68
+ end
69
+ end
70
+
71
+ def current_file
72
+ @current_file ? FunWith::Files::FilePath.new( @current_file.path ) : nil
73
+ end
74
+
75
+ # if file not given, the result is appended to the current file.
76
+ def download( url, file = nil )
77
+ if file
78
+ if file.fwf_filepath.relative?
79
+ file = FunWith::Files::FilePath.new( @current_path, file )
80
+ end
81
+
82
+ File.open( file, "w" ) do |f|
83
+ download_to_target( url, f )
84
+ end
85
+ elsif @current_file
86
+ download_to_target( url, @current_file )
87
+ else
88
+ puts "No current file to append #{url} to."
89
+ end
90
+ end
91
+
92
+ protected
93
+ def make_path
94
+ FileUtils.mkdir_p( @current_path ) unless @current_path.exist?
95
+ end
96
+
97
+ def descend( *args, &block )
98
+ if @current_path.directory?
99
+ close_file
100
+ @paths << @current_path
101
+ @current_path = @paths.last.join( *args )
102
+ make_path
103
+ yield
104
+ @current_path = @paths.pop
105
+ close_file
106
+ else
107
+ raise "Cannot descend."
108
+ end
109
+ end
110
+
111
+ def open_file( name )
112
+ close_file
113
+ @current_file = File.open( @current_path.join( name ), "w" )
114
+ end
115
+
116
+ def close_file
117
+ if @current_file
118
+ @current_file.flush
119
+ @current_file.close
120
+ end
121
+
122
+ @current_file = nil
123
+ end
124
+
125
+ def download_to_target( url, file )
126
+ Downloader.new.download( url, file )
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+
133
+ # sample code
134
+ #
135
+ # DirBuilder.create( '~/project' ) do |b| # starts by creating directory. If parent
136
+ # # directories don't exist, they will soon.
137
+ # # if you use DirBuilder.tmp('~/project'), a tempdir
138
+ # # is created, and its contents relocated to ~/project when the
139
+ # # block terminates.
140
+ # b.dir("images") do # creates subdirectory "images"
141
+ # for img in src_dir.entries.select{|img| img.extension == ".png"}
142
+ # b.copy( src_dir.join( img.filename ) ) # copies a bunch of files from another directory
143
+ # end # rises back to the initial '~/project directory
144
+ #
145
+ # b.copy( src_dir.join( "rorshach.xml" ) )
146
+ # b.download( "dest.bash", "http://get.rvm.io" ) # downloads file directly beneath '~/project'
147
+ # # maybe someday, though
148
+ #
149
+ # b.dir("text", "scenes") do # creates ~/project/text/scenes subdir
150
+ # b.file( "adventure_time.txt" ) do |f|
151
+ # f << "Fill this in later"
152
+ # end
153
+ #
154
+ # # calling .file without feeding it a block leaves it open for writing,
155
+ # # until either the enclosing block terminates or .file is called
156
+ # # again with a string argument.
157
+ # b.file( "another_brick.txt" )
158
+ # b.file << "Hey, you!"
159
+ # b.file << "Yes, you!"
160
+ # b.file.push "Stand still, laddie!"
161
+ #
162
+ # b.template(templates_dir.join("blue_template.txt")) do |t|
163
+ # t.var(:fname, "John")
164
+ # t.var(:lname, "Macey")
165
+ # t.var(:state, "Ohio")
166
+ # t.vars(graduated: "2003")
167
+ # t.vars(quot: "That wasn't my duck.", photo: "john.png", css: "font-family: arial")
168
+ # end
169
+ #
170
+ # b.copy( [src_dir.join("abba.txt"), "baab.txt"] ) # contents of abba.txt copied into baab.txt
171
+ #
172
+ #
173
+ # b.file( ".lockfile" ) # creates an empty file
174
+ # end
175
+ #
176
+ # b.
177
+ # end
178
+ #
179
+
@@ -0,0 +1,62 @@
1
+ require 'open-uri' # needed by Utils::Downloader
2
+ require 'net/http'
3
+ require 'timeout'
4
+
5
+
6
+ module FunWith
7
+ module Files
8
+ class Downloader
9
+ # stolen from:
10
+ # http://stackoverflow.com/questions/2263540/how-do-i-download-a-binary-file-over-http-using-ruby
11
+ def download( url, io )
12
+ @uri = URI.parse( url )
13
+ @io = io
14
+
15
+ open( url ) do |f|
16
+ @io << f.read
17
+ end
18
+
19
+ # @io << Net::HTTP.get( @uri )
20
+
21
+ # Net::HTTP.start( @uri.host, @uri.port ) do |http|
22
+ # http.request_get( @uri.path ) do |request|
23
+ # request.read_body do |seg|
24
+ # puts "============================== #{seg} ============================="
25
+ # io << seg
26
+ # #hack -- adjust to suit:
27
+ # sleep 0.005
28
+ # end
29
+ # end
30
+ # end
31
+ rescue Exception => e
32
+ handle_network_errors( e )
33
+ end
34
+
35
+ def handle_network_errors( e )
36
+ raise e
37
+ rescue URI::InvalidURIError => e
38
+ puts "Tried to get #{@uri.path} but failed with URI::InvalidURIError."
39
+ rescue OpenURI::HTTPError => e
40
+ STDERR.write( "Couldn't fetch podcast info from #{@uri.path}\n" )
41
+ STDERR.write( "#{e}\n\n" )
42
+ rescue SocketError => e
43
+ STDERR.write( "Problem connecting to server (Socket error) when downloading #{@uri.path}." )
44
+ STDERR.write( "#{e}\n\n" )
45
+ rescue URI::InvalidURIError => e
46
+ STDERR.write( "URI::InvalidURIError for #{@uri.path}." )
47
+ STDERR.write( "#{e}\n\n" )
48
+ # this may be too broad a filter
49
+ # TODO: retry?
50
+ rescue SystemCallError => e
51
+ STDERR.write( "Problem connecting to server (System call error) when downloading #{@uri.path}" )
52
+ STDERR.write( "#{e}\n\n" )
53
+ rescue OpenSSL::SSL::SSLError => e
54
+ STDERR.write( "OpenSSL::SSL::SSLError while downloading #{@uri.path}" )
55
+ STDERR.write( "#{e}\n\n" )
56
+ rescue Timeout::Error
57
+ STDERR.write( "Timeout error connecting to #{@uri.path}" )
58
+ STDERR.write( "#{e}\n\n" )
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,44 @@
1
+ module FunWith
2
+ module Files
3
+ # FileOrderer holds a set of strings/regexes, then reorders a set of files (FunWith::Files::FilePaths, actually)
4
+ # by matching the filenames against one regex after another. Allows you to say,
5
+ # "I want the title page, the foreward, then all the chapters, then all the appendixes, then the afterword."
6
+ # Ex: FileOrderer( ["title_page", "forward", "chapter-.*", "afterword", "appendix.*" ).reorder( pages )
7
+ # Only compares the basename minus extension. Files should come from the same directory. cover.extension always comes first.
8
+ class FileOrderer
9
+ def initialize( matchers )
10
+ @matchers = matchers.map do |m|
11
+ case m
12
+ when Regexp
13
+ m
14
+ when String
15
+ /^#{m}$/
16
+ end
17
+ end
18
+
19
+ @matchers.unshift( /^cover$/ )
20
+ @matchers.push( /^.*$/ )
21
+ end
22
+
23
+ def reorder( files )
24
+ files = files.map(&:fwf_filepath)
25
+
26
+ ordered_files = @matchers.inject( [] ) do |collector, matcher|
27
+ matched_files = files.select do |f|
28
+ name = f.basename_no_ext.to_s
29
+ matcher.match( name )
30
+ end
31
+
32
+ matched_files.sort_by! do |filename|
33
+ filename.basename_no_ext.to_s
34
+ end
35
+
36
+ collector += matched_files.sort
37
+ files -= matched_files
38
+
39
+ collector
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -14,6 +14,11 @@ module FunWith
14
14
  self.cwd( *args )
15
15
  end
16
16
 
17
+ # If block given, temporary directory is deleted at the end of the block, and the
18
+ # value given by the block is returned.
19
+ #
20
+ # If no block given, the path to the temp directory is returned as a FilePath.
21
+ # Don't forget to delete it when you're done.
17
22
  def self.tmpdir( &block )
18
23
  if block_given?
19
24
  Dir.mktmpdir do |d|
@@ -28,6 +33,10 @@ module FunWith
28
33
  Dir.home.fwf_filepath.join( *args )
29
34
  end
30
35
 
36
+ def self.template( src, dest, vars = {} )
37
+ raise "require 'fun_with_templates' to use this method"
38
+ end
39
+
31
40
  def join( *args, &block )
32
41
  if block_given?
33
42
  yield self.class.new( super(*args) )
@@ -38,6 +47,8 @@ module FunWith
38
47
 
39
48
  alias :exists? :exist?
40
49
 
50
+ # If called on a file instead of a directory,
51
+ # has the same effect as path.dirname
41
52
  def up
42
53
  self.class.new( self.join("..") ).expand
43
54
  end
@@ -169,6 +180,7 @@ module FunWith
169
180
  end
170
181
  end
171
182
 
183
+ # Returns a [list] of the lines in the file matching the given file
172
184
  def grep( regex )
173
185
  return [] unless self.file?
174
186
  matching = []
@@ -207,23 +219,21 @@ module FunWith
207
219
 
208
220
  # base, ext = @path.basename_and_ext
209
221
  def basename_and_ext
210
- [basename_no_ext, ext]
222
+ [self.basename_no_ext, self.ext]
211
223
  end
212
224
 
213
- # Basically Pathname.relative_path_from, but you can pass in strings
214
- def relative_path_from( dir )
215
- dir = super( Pathname.new( dir ) )
216
- self.class.new( dir )
225
+ def dirname_and_basename
226
+ [self.dirname, self.basename]
217
227
  end
218
228
 
219
- # gsub acts on the filepath, not the file contents
220
- def gsub( *args )
221
- self.to_s.gsub(*args).fwf_filepath
229
+ def dirname_and_basename_and_ext
230
+ [self.dirname, self.basename_no_ext, self.ext]
222
231
  end
223
232
 
224
- def gsub!( *args )
225
- new_path = self.to_s.gsub(*args)
226
- self.instance_variable_set(:@path, new_path)
233
+ # Basically Pathname.relative_path_from, but you can pass in strings
234
+ def relative_path_from( dir )
235
+ dir = super( Pathname.new( dir ) )
236
+ self.class.new( dir )
227
237
  end
228
238
 
229
239
  def fwf_filepath
@@ -339,10 +349,7 @@ module FunWith
339
349
  FileUtils.rmtree( self )
340
350
  end
341
351
  end
342
-
343
- def =~( rval )
344
- self.to_s =~ rval
345
- end
352
+
346
353
 
347
354
  def load
348
355
  if self.directory?
@@ -360,6 +367,32 @@ module FunWith
360
367
  require self.expand.gsub( /\.rb$/, '' )
361
368
  end
362
369
  end
370
+
371
+ def root?
372
+ self == self.up
373
+ end
374
+
375
+ def descend( &block )
376
+ path = self.clone
377
+
378
+ if path.root?
379
+ yield path
380
+ else
381
+ self.up.descend( &block )
382
+ yield self
383
+ end
384
+ end
385
+
386
+ def ascend( &block )
387
+ path = self.clone
388
+
389
+ if path.root?
390
+ yield path
391
+ else
392
+ yield self
393
+ self.up.ascend( &block )
394
+ end
395
+ end
363
396
  end
364
397
  end
365
398
  end
@@ -0,0 +1,24 @@
1
+ # Allow FilePaths to participate in some of the String-based mischief.
2
+
3
+ module FunWith
4
+ module Files
5
+ module StringBehavior
6
+ def =~( rval )
7
+ @path =~ rval
8
+ end
9
+
10
+ def match( *args )
11
+ @path.match( *args )
12
+ end
13
+
14
+ # gsub acts on the filepath, not the file contents
15
+ def gsub( *args )
16
+ @path.gsub(*args).fwf_filepath
17
+ end
18
+
19
+ def gsub!( *args )
20
+ @path = @path.gsub(*args)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ module XDG
2
+ class BaseDir
3
+ def fwf_filepath( *args )
4
+ FunWith::Files::FilePath.new( self.to_s, *args )
5
+ end
6
+ end
7
+ end
@@ -1,10 +1,22 @@
1
1
  require 'pathname' #stdlib
2
2
  require 'tmpdir'
3
- require "debugger"
3
+ require 'debugger'
4
4
 
5
- for file in %w(file_path root_path remote_path string_extensions pathname_extensions)
5
+ for file in %w(directory_builder
6
+ downloader
7
+ file_orderer
8
+ file_path
9
+ root_path
10
+ remote_path
11
+ string_extensions
12
+ string_behavior
13
+ pathname_extensions
14
+ xdg_extensions)
15
+
6
16
  require_relative File.join("files", file)
7
17
  end
8
18
 
9
19
  FunWith::Files::RootPath.rootify( FunWith::Files, __FILE__.fwf_filepath.dirname.up )
10
20
  FunWith::Files::VERSION = FunWith::Files.root("VERSION").read
21
+
22
+ FunWith::Files::FilePath.send( :include, FunWith::Files::StringBehavior )
@@ -20,4 +20,12 @@ class Test::Unit::TestCase
20
20
  end
21
21
 
22
22
  class FunWith::Files::TestCase < Test::Unit::TestCase
23
+ include FunWith::Files
24
+
25
+ def tmpdir( &block )
26
+ FunWith::Files::FilePath.tmpdir do |d|
27
+ @tmpdir = d
28
+ yield
29
+ end
30
+ end
23
31
  end
@@ -0,0 +1,21 @@
1
+ require 'helper'
2
+
3
+ class TestDescent < FunWith::Files::TestCase
4
+ should "descend and ascend" do
5
+ root = FunWith::Files.root
6
+
7
+ ascent = []
8
+ descent = []
9
+
10
+ FunWith::Files.root.ascend do |path|
11
+ ascent << path
12
+ end
13
+
14
+ FunWith::Files.root.descend do |path|
15
+ descent << path
16
+ end
17
+
18
+ assert_equal ascent, descent.reverse
19
+ assert_equal ascent[1], ascent[0].up
20
+ end
21
+ end
@@ -0,0 +1,136 @@
1
+ require 'helper'
2
+
3
+ class TestDirectoryBuilder < FunWith::Files::TestCase
4
+ context "tearing my hair out because shoulda seems borked" do
5
+ should "stop blaming shoulda for my problems" do
6
+ assert true
7
+ end
8
+
9
+ should "realize that assert statements need to be inside should blocks" do
10
+ assert "Okay, okay. I get it. Now lay off me."
11
+ end
12
+
13
+ should "figure out why the hell [].is_a?(Array) returns false" do
14
+ assert_kind_of Array, []
15
+ assert [].is_a?(Array)
16
+ end
17
+ end
18
+
19
+ context "In a temporary directory" do
20
+ should "create a temporary directory" do
21
+ DirectoryBuilder.tmpdir do |b|
22
+ assert_equal DirectoryBuilder, b.class #
23
+ assert b.current_path.exist?
24
+ end
25
+ end
26
+
27
+ should "write data to a new file" do
28
+ DirectoryBuilder.tmpdir do |b|
29
+ assert_equal DirectoryBuilder, b.class
30
+ assert b.current_path
31
+ assert b.current_path.exist?
32
+ b.file("widdershins.txt") do |f|
33
+ f << "Hello World"
34
+ f.flush
35
+
36
+ assert b.current_file.exist?
37
+ assert_equal 11, b.current_file.size
38
+ end
39
+ end
40
+ end
41
+
42
+ should "copy files from elsewhere into the directory" do
43
+ DirectoryBuilder.tmpdir do |b|
44
+ assert_equal DirectoryBuilder, b.class
45
+ src = FunWith::Files.root.join("Gemfile")
46
+ assert src.exist?
47
+
48
+ b.copy( FunWith::Files.root.join("Gemfile") )
49
+
50
+ gemfile = b.current_path.join("Gemfile")
51
+ assert gemfile.exist?
52
+ assert !gemfile.zero?
53
+ assert_equal 1, gemfile.grep( /jeweler/ ).length
54
+ end
55
+ end
56
+
57
+ should "copy files from elsewhere, renaming the file in the destination" do
58
+ DirectoryBuilder.tmpdir do |b|
59
+ assert_equal DirectoryBuilder, b.class
60
+ assert !b.current_path.join("helpers.rb").exist?
61
+ b.copy( FunWith::Files.root("lib", "fun_with_files.rb"), "fwf.rb" )
62
+ assert b.current_path.join("fwf.rb").exist?
63
+ end
64
+ end
65
+
66
+ should "download random crap from all over the Internet" do
67
+ DirectoryBuilder.tmpdir do |b|
68
+ gist_url = "http://bannedsorcery.com/downloads/testfile.txt"
69
+ gist_text = "This is a file\n==============\n\n**silent**: But _bold_! [Link](http://slashdot.org)\n"
70
+ b.download( gist_url, "gist.txt" )
71
+
72
+ b.file( "gist.txt.2" ) do
73
+ b.download( gist_url )
74
+ end
75
+
76
+ assert b.current_file.nil?
77
+ assert b.current_path.join("gist.txt").exist?
78
+ assert b.current_path.join("gist.txt.2").exist?
79
+ assert_equal gist_text, b.current_path.join("gist.txt").read
80
+ end
81
+ end
82
+
83
+ should "exercise all manner of features to create a complex directory" do
84
+ DirectoryBuilder.tmpdir do |b|
85
+ assert_equal DirectoryBuilder, b.class
86
+ root = FunWith::Files.root
87
+ gemfile = root.join("Gemfile")
88
+ b.copy( gemfile )
89
+ assert gemfile.exist?
90
+ assert_equal gemfile.size, b.current_path.join("Gemfile").size
91
+
92
+ b.dir( "earth" ) do
93
+ b.dir( "air") do
94
+ b.dir( "fire" ) do
95
+ b.dir( "water" ) do
96
+ b.file( "hello.txt" )
97
+ b.file << "H"
98
+ b.file << "e"
99
+ b.file << "l"
100
+ b.file << "l"
101
+ b.file << "o"
102
+ end
103
+
104
+ assert b.current_file.nil?
105
+ end
106
+ end
107
+ end
108
+
109
+ assert "Hello", b.current_path.join("earth", "air", "fire", "water", "hello.txt").read
110
+
111
+ b.dir( "fire", "water", "earth", "air" ) do
112
+ assert b.current_path.exist?
113
+ b.copy( FunWith::Files.root.join("Gemfile"), "Gemfile.example" )
114
+ b.copy( FunWith::Files.root.join("Gemfile.lock"), "Gemfile.lock.example" )
115
+ b.copy( FunWith::Files.root.join("Rakefile"), "Rakefile" )
116
+
117
+ for file in %W(Gemfile.example Gemfile.lock.example Rakefile)
118
+ assert b.current_path.join(file).exist?, "#{file} should exist"
119
+ end
120
+ end
121
+
122
+ directory = ["air", "earth", "water", "fire"]
123
+ b.dir( *directory ) do
124
+ b.file( "slipstream.txt", "file contents" )
125
+ end
126
+
127
+ assert b.current_path.join(*directory).exist?
128
+ slip = b.current_path.join(*directory).join("slipstream.txt")
129
+ assert slip.exist?
130
+ assert_equal false, slip.empty?
131
+ assert_equal "file contents", b.current_path.join(*directory).join( "slipstream.txt" ).read
132
+
133
+ end
134
+ end
135
+ end
136
+ end
@@ -1,7 +1,5 @@
1
1
  require 'helper'
2
2
 
3
- include FunWith::Files
4
-
5
3
  class TestFilePath < FunWith::Files::TestCase
6
4
  context "testing basics" do
7
5
  setup do
@@ -1,7 +1,5 @@
1
1
  require 'helper'
2
2
 
3
- include FunWith::Files
4
-
5
3
  class TestGlobbing < FunWith::Files::TestCase
6
4
  should "glob some ruby files from the test/loadable_dir directory" do
7
5
  assert FunWith::Files.respond_to?(:root)
@@ -1,7 +1,5 @@
1
1
  require 'helper'
2
2
 
3
- include FunWith::Files
4
-
5
3
  class TestLoading < FunWith::Files::TestCase
6
4
  should "require a file" do
7
5
  assert !defined?( LoadedOrRequiredModule::Loaded1 ), "LoadedOrRequiredModule::Loaded1 shouldn't be defined yet."
@@ -1,7 +1,5 @@
1
1
  require 'helper'
2
2
 
3
- include FunWith::Files
4
-
5
3
  class TestRootPath < FunWith::Files::TestCase
6
4
  should "add a root to a module" do
7
5
  mod = Module.new
@@ -1,7 +1,5 @@
1
1
  require 'helper'
2
2
 
3
- include FunWith::Files
4
-
5
3
  class TestTouching < FunWith::Files::TestCase
6
4
  context "inside a tmpdir" do
7
5
  setup do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fun_with_files
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-13 00:00:00.000000000 Z
12
+ date: 2014-02-02 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: xdg
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: debugger
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -105,11 +121,16 @@ extra_rdoc_files:
105
121
  - LICENSE.txt
106
122
  - README.rdoc
107
123
  files:
124
+ - ./lib/files/directory_builder.rb
125
+ - ./lib/files/downloader.rb
126
+ - ./lib/files/file_orderer.rb
108
127
  - ./lib/files/file_path.rb
109
128
  - ./lib/files/pathname_extensions.rb
110
129
  - ./lib/files/remote_path.rb
111
130
  - ./lib/files/root_path.rb
131
+ - ./lib/files/string_behavior.rb
112
132
  - ./lib/files/string_extensions.rb
133
+ - ./lib/files/xdg_extensions.rb
113
134
  - ./lib/fun_with_files.rb
114
135
  - ./test/data/empty.txt
115
136
  - ./test/data/grep1.txt
@@ -119,6 +140,8 @@ files:
119
140
  - ./test/loadable_dir/dir2/file2.rb
120
141
  - ./test/loadable_dir/dir3/file3.rb
121
142
  - ./test/loadable_dir/dir4/file4.rb
143
+ - ./test/test_descent.rb
144
+ - ./test/test_directory_builder.rb
122
145
  - ./test/test_file_path.rb
123
146
  - ./test/test_globbing.rb
124
147
  - ./test/test_loading.rb
@@ -144,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
167
  version: '0'
145
168
  segments:
146
169
  - 0
147
- hash: -676116548205951635
170
+ hash: -363617118462161826
148
171
  required_rubygems_version: !ruby/object:Gem::Requirement
149
172
  none: false
150
173
  requirements: