Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.DS_Store
.files_tracker.json
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add empty line

37 changes: 37 additions & 0 deletions lib/commander.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
require_relative './initializator.rb'
require_relative './removed_files_tracker.rb'
require_relative './recycle_bin.rb'
require_relative './printer.rb'
require 'optparse'

class Commander
def self.call
ARGV.include?('--silent') ? $printer = Printer.new(true) : $printer = Printer.new
ARGV.reject! { |argv| argv == '--silent' }
OptionParser.new do |parser|
parser.on('-i', '--init', 'Initializes recycle bin and files tracker.') do
Initializator.call
end
parser.on('-l', '--list', 'Prints recycle bin contents.') do
RecycleBin.print_bin_contents
end
parser.on('-d', '--delete', 'Deletes user input files from current directory.') do
RecycleBin.file_to_bin(ARGV)
end
parser.on('-c', '--clean', 'Permanently deletes all data from the recycle bin.') do
RecycleBin.delete_all_from_bin
end
parser.on('-r', '--restore', 'Restores user input files from the recycle bin.') do
RecycleBin.restore_from_bin(ARGV)
end
parser.on('-ar', '--restore_all', 'Restores all data from the recycle bin.') do
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's use ra(restore all) instead of ar

RecycleBin.restore_all_from_bin
end
parser.on('-h', '--help') do
puts parser
end
end.parse!
end
end

Commander.call
53 changes: 53 additions & 0 deletions lib/directory_object.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# require 'json'

# class DirectoryObject
# attr_reader :dir_name, :deletion_date, :initial_path

# def initialize(dir_name, deletion_date, initial_path)
# @dir_name = dir_name
# @deletion_date = deletion_date
# @initial_path = initial_path
# end

# def create_Deleted_Objects_Info_dir
# if !File.exist?(deleted_objects_info.json)
# deleted_objects_info.json = File.new('deleted_objects_info.json', 'a')
# puts 'The DeletedObjectsInfo file has just been created!'
# else
# puts 'The DeletedObjectsInfo file already exists.'
# end
# end

# def add_to_deleted_objects_info(data)
# file = File.open('deleted_objects_info.json', 'a')
# file.write('deleted_objects_info.json', data + "\n", mode: 'a')
# file.close
# end #array

# def to_json
# {
# dir_name: @dir_name,
# deletion_date: @deletion_date,
# initial_path: @initial_path
# }.to_json
# end

# def self.from_json(data)
# DirectoryObject.new(data['dir_name'], data['deletion_date'], data['initial_path'])
# end

# def deserialize_log
# file = File.read('deleted_objects_info.json')
# removed_files_in_json = JSON.parse(file)
# removed_files = DirectoryObject.from_json(removed_files_in_json)
# p removed_files
# end

# end

# # Dir.mkdir('Testdir')
# test = DirectoryObject.new('Testdir', '07.02.2023', '/Users/manichkagrechechka/Desktop/Ruby/rm_utility')
# p test
# p test.to_json
# test.add_to_deleted_objects_info(test.to_json)
# test.deserialize_log
23 changes: 23 additions & 0 deletions lib/file_object.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
require 'json'

class FileObject
attr_accessor :file_name, :deletion_date, :initial_path

def initialize(file_name, deletion_date, initial_path)
@file_name = file_name
@deletion_date = deletion_date
@initial_path = initial_path
end

def to_json
{
file_name: @file_name,
deletion_date: @deletion_date,
initial_path: @initial_path
}
end

def self.from_json(data)
FileObject.new(data['file_name'], data['deletion_date'], data['initial_path'])
end
end
26 changes: 26 additions & 0 deletions lib/initializator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
require_relative './removed_files_tracker.rb'
require_relative './recycle_bin.rb'

class Initializator
class << self
def call
initialize_recycle_bin
initialize_remove_files_tracker
# setup_command_line
end

private

def initialize_recycle_bin
RecycleBin.setup
end

def initialize_remove_files_tracker
RemovedFilesTracker.setup
end

def setup_command_line
# TODO: later
end
end
end
11 changes: 11 additions & 0 deletions lib/printer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class Printer
def call(text)
return if @silent_mode

puts text
end

def initialize(silent_mode = false)
@silent_mode = silent_mode
end
end
108 changes: 108 additions & 0 deletions lib/recycle_bin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
require_relative './printer.rb'
require_relative './file_object.rb'
require_relative './removed_files_tracker.rb'
require 'fileutils'

class RecycleBin
RECYCLE_BIN_PATH = File.expand_path('~/.recycle_bin')

class << self
def setup
if !Dir.exist?(RECYCLE_BIN_PATH)
Dir.mkdir(RECYCLE_BIN_PATH)
$printer.call('The recycle bin has just been created.')
recycle_bin = RecycleBin.new
end
end

def print_bin_contents
puts 'The contents in recycle bin:'
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use printer instead of puts

puts '_________________________'
puts Dir.each_child(RECYCLE_BIN_PATH) { |file| puts file }
puts '_________________________'
end

def file_to_bin(file_names)
file_names.each do |file_name|
if File.exist?(file_name)
file = FileObject.new(file_name, Time.now, File.expand_path('.'))
FileUtils.mv(file.file_name, RECYCLE_BIN_PATH)
RemovedFilesTracker.add_to_files_tracker(file)
$printer.call("#{file_name} has been moved to the recycle bin.")
else
$printer.call("No file '#{file_name}' was found in #{Dir.pwd}")
end
end
end

def delete_all_from_bin
if Dir.empty?(RECYCLE_BIN_PATH)
$printer.call('The recycle bin is already empty.')
exit
end
Dir.each_child(RECYCLE_BIN_PATH) do |file_name|
file_to_delete = File.join(RECYCLE_BIN_PATH, file_name)
File.delete(file_to_delete) if File.exist?(file_to_delete)
end
$printer.call('The bin is now empty.')
end

def restore_from_bin(files_to_restore)
objects = RemovedFilesTracker.get_file_objects_from_files_tracker
Dir.chdir(RECYCLE_BIN_PATH)
file_restored = false
files_to_restore.each do |file_to_restore|
objects.each do |object|
next if object.file_name != file_to_restore
FileUtils.mv(object.file_name, object.initial_path)
RemovedFilesTracker.delete_from_files_tracker(object)
file_restored = true
$printer.call("#{object.file_name} was successfully restored to #{object.initial_path}")
end
if !file_restored
$printer.call("#{file_to_restore} doesn't exist in bin.")
end
end
end

def restore_all_from_bin
Dir.chdir(RECYCLE_BIN_PATH)
if Dir.empty?(RECYCLE_BIN_PATH)
$printer.call('The recycle bin is already empty.')
exit
end
objects = RemovedFilesTracker.get_file_objects_from_files_tracker
objects.each do |object|
FileUtils.mv(object.file_name, object.initial_path)
RemovedFilesTracker.delete_from_files_tracker(object)
file_restored = true
$printer.call("#{object.file_name} was successfully restored to #{object.initial_path}")
if !file_restored
$printer.call("Something went wrong with #{object.file_name}.")
end
end
end

def delete_file_from_bin(files_to_delete)
if Dir.children(RECYCLE_BIN_PATH).empty?
$printer.call('The recycle bin is empty.')
exit
end
files_to_delete.each do |file_to_delete_name|
Dir.each_child(RECYCLE_BIN_PATH) do |file_name|
found_to_delete = false
next if file_name != file_to_delete_name
file_to_delete = File.join(RECYCLE_BIN_PATH, file_to_delete_name)
File.delete(file_to_delete) if File.exist?(file_to_delete)
RemovedFilesTracker.delete_from_files_tracker(file_to_delete)
found_to_delete = true
$printer.call("The file #{file_to_delete_name} has been deleted from the recycle bin.")
if !found_to_delete
puts "Such file doesn't exist in #{RECYCLE_BIN_PATH}."
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use printer

exit
end
end
end
end
end
end
40 changes: 40 additions & 0 deletions lib/removed_files_tracker.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
require_relative './file_object.rb'
require_relative './printer.rb'

class RemovedFilesTracker
FILES_TRACKER = File.expand_path('~/.files_tracker.json')

class << self
def setup
if !File.exist?(FILES_TRACKER)
initial_data = [].to_json
File.write(FILES_TRACKER, initial_data, mode: 'w')
$printer.call('The files tracker file has just been created!')
else
$printer.call('The files tracker file already exists.')
end
end

def add_to_files_tracker(deleted_file)
already_removed_files = get_file_objects_from_files_tracker
files_to_track = already_removed_files << deleted_file
prepared_data_to_track = files_to_track.map(&:to_json)
File.write(FILES_TRACKER, prepared_data_to_track.to_json, mode: 'w')
end

def delete_from_files_tracker(file_to_exclude)
removed_files = get_file_objects_from_files_tracker
removed_files.reject! { |deleted_file| deleted_file.file_name == file_to_exclude.file_name && deleted_file.initial_path == file_to_exclude.initial_path && deleted_file.deletion_date == file_to_exclude.deletion_date }
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's use do ... end instead of {}

updated_data_to_track = removed_files.map(&:to_json)
File.write(FILES_TRACKER, updated_data_to_track.to_json, mode: 'w')
end

def get_file_objects_from_files_tracker
files_tracker_file = File.read(FILES_TRACKER)
files_tracker_data = JSON.parse(files_tracker_file)
files_tracker_data.map do |removed_file_data|
FileObject.from_json(removed_file_data)
end
end
end
end
6 changes: 6 additions & 0 deletions rm.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env ruby

require_relative './lib/commander.rb'

Commander.call
# Если программа без флагов, то она просто удаляет файлы (автоматически вызывает file to bin)