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 ‘path` is a directory.
-
#executable?(path) ⇒ TrueClass, FalseClass
Checks if ‘path` is an executable.
-
#exist?(path) ⇒ TrueClass, FalseClass
Checks if ‘path` exist.
-
#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 ‘contents` in `path` after `target`.
-
#inject_line_after_last(path, target, contents) ⇒ Object
Inject ‘contents` in `path` after last `target`.
-
#inject_line_at_block_bottom(path, target, *contents) ⇒ Object
Inject ‘contents` in `path` within the first Ruby block that matches `target`.
-
#inject_line_at_block_top(path, target, *contents) ⇒ Object
Inject ‘contents` in `path` within the first Ruby block that matches `target`.
-
#inject_line_at_class_bottom(path, target, *contents) ⇒ Object
Inject ‘contents` in `path` at the bottom of the Ruby class that matches `target`.
-
#inject_line_before(path, target, contents) ⇒ Object
Inject ‘contents` in `path` before `target`.
-
#inject_line_before_last(path, target, contents) ⇒ Object
Inject ‘contents` in `path` after last `target`.
-
#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 ‘target` block from `path`.
-
#remove_line(path, target) ⇒ Object
Removes line from ‘path`, matching `target`.
-
#replace_first_line(path, target, replacement) ⇒ Object
Replace first line in ‘path` that contains `target` with `replacement`.
-
#replace_last_line(path, target, replacement) ⇒ Object
Replace last line in ‘path` that contains `target` with `replacement`.
-
#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 |