Class: Dry::Files
- Inherits:
-
Object
- Object
- Dry::Files
- Defined in:
- lib/dry/files.rb,
lib/dry/files/path.rb,
lib/dry/files/error.rb,
lib/dry/files/adapter.rb,
lib/dry/files/version.rb,
lib/dry/files/file_system.rb,
lib/dry/files/memory_file_system.rb,
lib/dry/files/memory_file_system/node.rb
Overview
File manipulations
Defined Under Namespace
Modules: Path Classes: Adapter, Delimiter, Error, FileSystem, IOError, MemoryFileSystem, MissingTargetError, NotMemoryFileError, UnknownMemoryNodeError
Constant Summary collapse
- OPEN_MODE =
::File::RDWR
- WRITE_MODE =
(::File::CREAT | ::File::WRONLY | ::File::TRUNC).freeze
- VERSION =
"1.1.0"
Instance Method Summary collapse
-
#append(path, contents) ⇒ Object
Adds a new line at the bottom of the file.
-
#chdir(path, &blk) ⇒ Object
Temporary changes the current working directory of the process to the given path and yield the given block.
-
#chmod(path, mode) ⇒ Object
Sets UNIX permissions of the file at the given path.
-
#cp(source, destination) ⇒ Object
Copies source into destination.
-
#delete(path) ⇒ Object
Deletes given path (file).
-
#delete_directory(path) ⇒ Object
Deletes given path (directory).
-
#directory?(path) ⇒ TrueClass, FalseClass
Checks if
pathis a directory. -
#executable?(path) ⇒ TrueClass, FalseClass
Checks if
pathis an executable. -
#exist?(path) ⇒ TrueClass, FalseClass
Checks if
pathexist. -
#expand_path(path, dir = pwd) ⇒ String
Converts a path to an absolute path.
-
#initialize(memory: false, adapter: Adapter.call(memory: memory)) ⇒ Dry::Files
constructor
Creates a new instance.
-
#inject_line_after(path, target, contents) ⇒ Object
Inject
contentsinpathaftertarget. -
#inject_line_after_last(path, target, contents) ⇒ Object
Inject
contentsinpathafter lasttarget. -
#inject_line_at_block_bottom(path, target, *contents) ⇒ Object
Inject
contentsinpathwithin the first Ruby block that matchestarget. -
#inject_line_at_block_top(path, target, *contents) ⇒ Object
Inject
contentsinpathwithin the first Ruby block that matchestarget. -
#inject_line_at_class_bottom(path, target, *contents) ⇒ Object
Inject
contentsinpathat the bottom of the Ruby class that matchestarget. -
#inject_line_before(path, target, contents) ⇒ Object
Inject
contentsinpathbeforetarget. -
#inject_line_before_last(path, target, contents) ⇒ Object
Inject
contentsinpathafter lasttarget. -
#join(*path) ⇒ String
Returns a new string formed by joining the strings using Operating System path separator.
-
#mkdir(path) ⇒ Object
Creates a directory for the given path.
-
#mkdir_p(path) ⇒ Object
Creates a directory for the given path.
-
#open(path, mode = OPEN_MODE, *args, &blk) {|the| ... } ⇒ File, Dry::Files::MemoryFileSystem::Node
Opens (or creates) a new file for both read/write operations.
-
#pwd ⇒ String
Returns the name of the current working directory.
-
#read(path) ⇒ String
Read file content.
-
#remove_block(path, target) ⇒ Object
Removes
targetblock frompath. -
#remove_line(path, target) ⇒ Object
Removes line from
path, matchingtarget. -
#replace_first_line(path, target, replacement) ⇒ Object
Replace first line in
paththat containstargetwithreplacement. -
#replace_last_line(path, target, replacement) ⇒ Object
Replace last line in
paththat containstargetwithreplacement. -
#touch(path) ⇒ Object
Creates an empty file for the given path.
-
#unshift(path, line) ⇒ Object
Adds a new line at the top of the file.
-
#write(path, *content) ⇒ Object
Creates a new file or rewrites the contents of an existing file for the given path and content All the intermediate directories are created.
Constructor Details
#initialize(memory: false, adapter: Adapter.call(memory: memory)) ⇒ Dry::Files
Creates a new instance
Memory file system is experimental
36 37 38 |
# File 'lib/dry/files.rb', line 36 def initialize(memory: false, adapter: Adapter.call(memory: memory)) @adapter = adapter end |
Instance Method Details
#append(path, contents) ⇒ Object
Adds a new line at the bottom of the file
351 352 353 354 355 356 357 358 359 360 |
# File 'lib/dry/files.rb', line 351 def append(path, contents) mkdir_p(path) touch(path) content = adapter.readlines(path) content << newline unless newline?(content.last) content << newline(contents) write(path, content) end |
#chdir(path, &blk) ⇒ Object
Temporary changes the current working directory of the process to the given path and yield the given block.
166 167 168 |
# File 'lib/dry/files.rb', line 166 def chdir(path, &blk) adapter.chdir(path, &blk) end |
#chmod(path, mode) ⇒ Object
Sets UNIX permissions of the file at the given path.
Accepts permissions in numeric mode only, best provided as octal numbers matching the standard UNIX octal permission modes, such as 0o544 for a file writeable by its owner and readable by others, or 0o755 for a file writeable by its owner and executable by everyone.
98 99 100 101 102 |
# File 'lib/dry/files.rb', line 98 def chmod(path, mode) raise Dry::Files::Error, "mode should be an integer (e.g. 0o755)" unless mode.is_a?(Integer) adapter.chmod(path, mode) end |
#cp(source, destination) ⇒ Object
Copies source into destination. All the intermediate directories are created. If the destination already exists, it overrides the contents.
234 235 236 |
# File 'lib/dry/files.rb', line 234 def cp(source, destination) adapter.cp(source, destination) end |
#delete(path) ⇒ Object
Deletes given path (file).
246 247 248 |
# File 'lib/dry/files.rb', line 246 def delete(path) adapter.rm(path) end |
#delete_directory(path) ⇒ Object
Deletes given path (directory).
258 259 260 |
# File 'lib/dry/files.rb', line 258 def delete_directory(path) adapter.rm_rf(path) end |
#directory?(path) ⇒ TrueClass, FalseClass
Checks if path is a directory
298 299 300 |
# File 'lib/dry/files.rb', line 298 def directory?(path) adapter.directory?(path) end |
#executable?(path) ⇒ TrueClass, FalseClass
Checks if path is an executable
318 319 320 |
# File 'lib/dry/files.rb', line 318 def executable?(path) adapter.executable?(path) end |
#exist?(path) ⇒ TrueClass, FalseClass
Checks if path exist
278 279 280 |
# File 'lib/dry/files.rb', line 278 def exist?(path) adapter.exist?(path) end |
#expand_path(path, dir = pwd) ⇒ String
Converts a path to an absolute path.
Relative paths are referenced from the current working directory of the process unless dir is given.
128 129 130 |
# File 'lib/dry/files.rb', line 128 def (path, dir = pwd) adapter.(path, dir) end |
#inject_line_after(path, target, contents) ⇒ Object
Inject contents in path after target.
455 456 457 |
# File 'lib/dry/files.rb', line 455 def inject_line_after(path, target, contents) _inject_line_after(path, target, contents, method(:index)) end |
#inject_line_after_last(path, target, contents) ⇒ Object
Inject contents in path after last target.
474 475 476 |
# File 'lib/dry/files.rb', line 474 def inject_line_after_last(path, target, contents) _inject_line_after(path, target, contents, method(:rindex)) end |
#inject_line_at_block_bottom(path, target, *contents) ⇒ Object
Inject contents in path within the first Ruby block that matches target. The given contents will appear at the BOTTOM of the Ruby block.
702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 |
# File 'lib/dry/files.rb', line 702 def inject_line_at_block_bottom(path, target, *contents) content = adapter.readlines(path) starting = index(content, path, target) line = content[starting] delimiter = if line.match?(INLINE_OPEN_BLOCK_MATCHER) INLINE_BLOCK_DELIMITER else BLOCK_DELIMITER end target = content[starting..] ending = closing_block_index(target, starting, path, line, delimiter) offset = SPACE * (content[ending][SPACE_MATCHER].bytesize + INDENTATION) contents = Array(contents).flatten contents = _offset_block_lines(contents, offset) content.insert(ending, contents) write(path, content) end |
#inject_line_at_block_top(path, target, *contents) ⇒ Object
Inject contents in path within the first Ruby block that matches target. The given contents will appear at the TOP of the Ruby block.
584 585 586 587 588 589 590 591 592 593 594 |
# File 'lib/dry/files.rb', line 584 def inject_line_at_block_top(path, target, *contents) content = adapter.readlines(path) starting = index(content, path, target) offset = SPACE * (content[starting][SPACE_MATCHER].bytesize + INDENTATION) contents = Array(contents).flatten contents = _offset_block_lines(contents, offset) content.insert(starting + CONTENT_OFFSET, contents) write(path, content) end |
#inject_line_at_class_bottom(path, target, *contents) ⇒ Object
Inject contents in path at the bottom of the Ruby class that matches target. The given contents will appear at the BOTTOM of the Ruby class.
782 783 784 785 786 787 788 789 790 791 792 793 794 795 |
# File 'lib/dry/files.rb', line 782 def inject_line_at_class_bottom(path, target, *contents) content = adapter.readlines(path) starting = index(content, path, target) line = content[starting] target = content[starting..] ending = closing_class_index(target, starting, path, line, BLOCK_DELIMITER) offset = SPACE * (content[ending][SPACE_MATCHER].bytesize + INDENTATION) contents = Array(contents).flatten contents = _offset_block_lines(contents, offset) content.insert(ending, contents) write(path, content) end |
#inject_line_before(path, target, contents) ⇒ Object
Inject contents in path before target.
417 418 419 |
# File 'lib/dry/files.rb', line 417 def inject_line_before(path, target, contents) _inject_line_before(path, target, contents, method(:index)) end |
#inject_line_before_last(path, target, contents) ⇒ Object
Inject contents in path after last target.
436 437 438 |
# File 'lib/dry/files.rb', line 436 def inject_line_before_last(path, target, contents) _inject_line_before(path, target, contents, method(:rindex)) end |
#join(*path) ⇒ String
Returns a new string formed by joining the strings using Operating System path separator
113 114 115 |
# File 'lib/dry/files.rb', line 113 def join(*path) adapter.join(*path) end |
#mkdir(path) ⇒ Object
Creates a directory for the given path. It assumes that all the tokens in path are meant to be a directory. All the intermediate directories are created.
192 193 194 |
# File 'lib/dry/files.rb', line 192 def mkdir(path) adapter.mkdir(path) end |
#mkdir_p(path) ⇒ Object
Creates a directory for the given path. It assumes that all the tokens, but the last, in path are meant to be a directory, whereas the last is meant to be a file. All the intermediate directories are created.
219 220 221 |
# File 'lib/dry/files.rb', line 219 def mkdir_p(path) adapter.mkdir_p(path) end |
#open(path, mode = OPEN_MODE, *args, &blk) {|the| ... } ⇒ File, Dry::Files::MemoryFileSystem::Node
Opens (or creates) a new file for both read/write operations
153 154 155 |
# File 'lib/dry/files.rb', line 153 def open(path, mode = OPEN_MODE, *args, &blk) adapter.open(path, mode, *args, &blk) end |
#pwd ⇒ String
Returns the name of the current working directory.
137 138 139 |
# File 'lib/dry/files.rb', line 137 def pwd adapter.pwd end |
#read(path) ⇒ String
Read file content
TODO: allow buffered read
52 53 54 |
# File 'lib/dry/files.rb', line 52 def read(path) adapter.read(path) end |
#remove_block(path, target) ⇒ Object
Removes target block from path
843 844 845 846 847 848 849 850 851 852 853 854 855 856 |
# File 'lib/dry/files.rb', line 843 def remove_block(path, target) content = adapter.readlines(path) starting = index(content, path, target) line = content[starting] size = line[SPACE_MATCHER].bytesize closing = (SPACE * size) + (target.match?(INLINE_OPEN_BLOCK_MATCHER) ? INLINE_CLOSE_BLOCK : CLOSE_BLOCK) ending = starting + index(content[starting..-CONTENT_OFFSET], path, closing) content.slice!(starting..ending) write(path, content) remove_block(path, target) if match?(content, target) end |
#remove_line(path, target) ⇒ Object
Removes line from path, matching target.
807 808 809 810 811 812 813 |
# File 'lib/dry/files.rb', line 807 def remove_line(path, target) content = adapter.readlines(path) i = index(content, path, target) content.delete_at(i) write(path, content) end |
#replace_first_line(path, target, replacement) ⇒ Object
Replace first line in path that contains target with replacement.
375 376 377 378 379 380 |
# File 'lib/dry/files.rb', line 375 def replace_first_line(path, target, replacement) content = adapter.readlines(path) content[index(content, path, target)] = newline(replacement) write(path, content) end |
#replace_last_line(path, target, replacement) ⇒ Object
Replace last line in path that contains target with replacement.
395 396 397 398 399 400 |
# File 'lib/dry/files.rb', line 395 def replace_last_line(path, target, replacement) content = adapter.readlines(path) content[-index(content.reverse, path, target) - CONTENT_OFFSET] = newline(replacement) write(path, content) end |
#touch(path) ⇒ Object
Creates an empty file for the given path. All the intermediate directories are created. If the path already exists, it doesn’t change the contents
66 67 68 |
# File 'lib/dry/files.rb', line 66 def touch(path) adapter.touch(path) end |
#unshift(path, line) ⇒ Object
Adds a new line at the top of the file
333 334 335 336 337 338 |
# File 'lib/dry/files.rb', line 333 def unshift(path, line) content = adapter.readlines(path) content.unshift(newline(line)) write(path, content) end |
#write(path, *content) ⇒ Object
Creates a new file or rewrites the contents of an existing file for the given path and content All the intermediate directories are created.
81 82 83 |
# File 'lib/dry/files.rb', line 81 def write(path, *content) adapter.write(path, *content) end |