Class: Staticky::Files
- Inherits:
-
Object
- Object
- Staticky::Files
- Defined in:
- lib/staticky/files.rb,
lib/staticky/files/path.rb,
lib/staticky/files/error.rb,
lib/staticky/files/adapter.rb,
lib/staticky/files/version.rb,
lib/staticky/files/file_system.rb,
lib/staticky/files/memory_file_system.rb,
lib/staticky/files/memory_file_system/node.rb
Overview
rubocop:disable Metrics/ClassLength
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 =
"0.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.
-
#entries(path) ⇒ Object
Reads entries from 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:)) ⇒ Staticky::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) {|the| ... } ⇒ File, Staticky::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:)) ⇒ Staticky::Files
Creates a new instance
Memory file system is experimental
20 21 22 |
# File 'lib/staticky/files.rb', line 20 def initialize(memory: false, adapter: Adapter.call(memory:)) @adapter = adapter end |
Instance Method Details
#append(path, contents) ⇒ Object
Adds a new line at the bottom of the file
316 317 318 319 320 321 322 323 324 325 |
# File 'lib/staticky/files.rb', line 316 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.
131 132 133 |
# File 'lib/staticky/files.rb', line 131 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.
69 70 71 72 73 74 75 76 |
# File 'lib/staticky/files.rb', line 69 def chmod(path, mode) unless mode.is_a?(Integer) raise Staticky::Files::Error, "mode should be an integer (e.g. 0o755)" end 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.
199 200 201 |
# File 'lib/staticky/files.rb', line 199 def cp(source, destination) adapter.cp(source, destination) end |
#delete(path) ⇒ Object
Deletes given path (file).
211 212 213 |
# File 'lib/staticky/files.rb', line 211 def delete(path) adapter.rm(path) end |
#delete_directory(path) ⇒ Object
Deletes given path (directory).
223 224 225 |
# File 'lib/staticky/files.rb', line 223 def delete_directory(path) adapter.rm_rf(path) end |
#directory?(path) ⇒ TrueClass, FalseClass
Checks if ‘path` is a directory
263 264 265 |
# File 'lib/staticky/files.rb', line 263 def directory?(path) adapter.directory?(path) end |
#entries(path) ⇒ Object
Reads entries from a directory
842 843 844 |
# File 'lib/staticky/files.rb', line 842 def entries(path) adapter.entries(path) end |
#executable?(path) ⇒ TrueClass, FalseClass
Checks if ‘path` is an executable
283 284 285 |
# File 'lib/staticky/files.rb', line 283 def executable?(path) adapter.executable?(path) end |
#exist?(path) ⇒ TrueClass, FalseClass
Checks if ‘path` exist
243 244 245 |
# File 'lib/staticky/files.rb', line 243 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.
97 98 99 |
# File 'lib/staticky/files.rb', line 97 def (path, dir = pwd) adapter.(path, dir) end |
#inject_line_after(path, target, contents) ⇒ Object
Inject ‘contents` in `path` after `target`.
421 422 423 |
# File 'lib/staticky/files.rb', line 421 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`.
440 441 442 |
# File 'lib/staticky/files.rb', line 440 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.
668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 |
# File 'lib/staticky/files.rb', line 668 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.
550 551 552 553 554 555 556 557 558 559 560 |
# File 'lib/staticky/files.rb', line 550 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.
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 |
# File 'lib/staticky/files.rb', line 748 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`.
383 384 385 |
# File 'lib/staticky/files.rb', line 383 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`.
402 403 404 |
# File 'lib/staticky/files.rb', line 402 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
84 85 86 |
# File 'lib/staticky/files.rb', line 84 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.
157 158 159 |
# File 'lib/staticky/files.rb', line 157 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.
184 185 186 |
# File 'lib/staticky/files.rb', line 184 def mkdir_p(path) adapter.mkdir_p(path) end |
#open(path, mode = OPEN_MODE) {|the| ... } ⇒ File, Staticky::Files::MemoryFileSystem::Node
Opens (or creates) a new file for both read/write operations
120 121 122 |
# File 'lib/staticky/files.rb', line 120 def open(path, mode = OPEN_MODE, ...) adapter.open(path, mode, ...) end |
#pwd ⇒ String
Returns the name of the current working directory.
104 105 106 |
# File 'lib/staticky/files.rb', line 104 def pwd adapter.pwd end |
#read(path) ⇒ String
Read file content
TODO: allow buffered read
32 33 34 |
# File 'lib/staticky/files.rb', line 32 def read(path) adapter.read(path) end |
#remove_block(path, target) ⇒ Object
Removes ‘target` block from `path`
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 |
# File 'lib/staticky/files.rb', line 815 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`.
779 780 781 782 783 784 785 |
# File 'lib/staticky/files.rb', line 779 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`.
340 341 342 343 344 345 |
# File 'lib/staticky/files.rb', line 340 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`.
360 361 362 363 364 365 366 |
# File 'lib/staticky/files.rb', line 360 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
43 44 45 |
# File 'lib/staticky/files.rb', line 43 def touch(path) adapter.touch(path) end |
#unshift(path, line) ⇒ Object
Adds a new line at the top of the file
298 299 300 301 302 303 |
# File 'lib/staticky/files.rb', line 298 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.
55 56 57 |
# File 'lib/staticky/files.rb', line 55 def write(path, *content) adapter.write(path, *content) end |