在 ruby 上实现 DSL 以生成嵌套文件夹和文件结构
Implementing a DSL on ruby to generate nested folders and files structure
我正在开发自定义 DSL 以在树状结构中生成文件夹和文件
DSL (folders_tree.rb)
FoldersFilesGenerator::DSL.setup do
root_folder_1 do
root_folder_file_1
subfolder_1 do
subfolder_file_1
subfolder_file_2
sub_subfolder do
...
end
end
subfolder_2 do
...
end
root_folder_file_2
end
root_folder_2 do
...
end
end
发电机
PATH = 'path/to/folders_tree.rb'
#FoldersFilesGenerator::Generator.new.generate
def generate
instance_eval(File.read(PATH), File.basename(PATH), 0)
end
DSL 处理器
module FoldersFilesGenerator
class DSL
attr_accessor :current_path
def self.setup(*args, &block)
new.instance_eval &block
end
def initialize
@current_path = 'initial/root/folder'
end
def method_missing(m, *args, &block)
if block_given?
#need help here
self.current_path = renew_path(@current_path)
FileUtils.mkdir_p current_path #create nested folder
instance_eval(&block)
else
FileCreator.create(m, @current_path) #create file on a current tree level
end
end
private
def renew_path(current_path)
end
end
end
我假设我的工作路径只有在我深入研究或出现在我的 DSL 块树结构上时才会改变,所以我需要用 renew_path
方法重新分配我的 current_path
,但我完全搞砸了我的代码在这里。请帮忙。
解决方案可以完全不同。我只需要我的 DSL 像我描述的那样工作。
谢谢。
不确定您想要renew_path
做什么。它应该像这样简单:
if block_given?
remembered_path = current_path
self.current_path = File.join(current_path, m.to_s)
FileUtils.mkdir_p current_path #create nested folder
instance_eval(&block)
self.current_path = remembered_path
else
我正在开发自定义 DSL 以在树状结构中生成文件夹和文件
DSL (folders_tree.rb)
FoldersFilesGenerator::DSL.setup do
root_folder_1 do
root_folder_file_1
subfolder_1 do
subfolder_file_1
subfolder_file_2
sub_subfolder do
...
end
end
subfolder_2 do
...
end
root_folder_file_2
end
root_folder_2 do
...
end
end
发电机
PATH = 'path/to/folders_tree.rb'
#FoldersFilesGenerator::Generator.new.generate
def generate
instance_eval(File.read(PATH), File.basename(PATH), 0)
end
DSL 处理器
module FoldersFilesGenerator
class DSL
attr_accessor :current_path
def self.setup(*args, &block)
new.instance_eval &block
end
def initialize
@current_path = 'initial/root/folder'
end
def method_missing(m, *args, &block)
if block_given?
#need help here
self.current_path = renew_path(@current_path)
FileUtils.mkdir_p current_path #create nested folder
instance_eval(&block)
else
FileCreator.create(m, @current_path) #create file on a current tree level
end
end
private
def renew_path(current_path)
end
end
end
我假设我的工作路径只有在我深入研究或出现在我的 DSL 块树结构上时才会改变,所以我需要用 renew_path
方法重新分配我的 current_path
,但我完全搞砸了我的代码在这里。请帮忙。
解决方案可以完全不同。我只需要我的 DSL 像我描述的那样工作。
谢谢。
不确定您想要renew_path
做什么。它应该像这样简单:
if block_given?
remembered_path = current_path
self.current_path = File.join(current_path, m.to_s)
FileUtils.mkdir_p current_path #create nested folder
instance_eval(&block)
self.current_path = remembered_path
else