From c94a1920f555dd94a0a6781a24b553e6dfeea06b Mon Sep 17 00:00:00 2001 From: eelco Date: Tue, 3 Jun 2025 11:35:07 +0700 Subject: [PATCH] Check for existing vault_line (eg. `vault` declaration) on add generator This makes the generator a fair bit smarter by using `vaults :item1, item2` instead of multiple vault declarations, eg. `vault :item1`\nvault :item2`. --- lib/generators/rails_vault/add_generator.rb | 27 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/generators/rails_vault/add_generator.rb b/lib/generators/rails_vault/add_generator.rb index ecfec6f..6f6f7d6 100644 --- a/lib/generators/rails_vault/add_generator.rb +++ b/lib/generators/rails_vault/add_generator.rb @@ -14,11 +14,30 @@ def create_vault_file end def inject_vault_into_model - parent_class = class_name.split("::").first + has_existing_vault? ? + gsub_file(model_path, /^\s*vaults?\s+.+$/, vault_line) : + inject_into_class(model_path, class_name.deconstantize) { "#{vault_line}\n" } + end + + private + + def has_existing_vault? + model_content =~ /vaults?\s+/ + end + + def vault_line + vaults = Set.new(model_content[/vaults?\s+(.+)$/, 1]&.scan(/:(\w+)/)&.flatten || []) << plural_name + method_name = vaults.many? ? "vaults" : "vault" + + " #{method_name} #{vaults.map { ":#{_1}" }.join(", ")}" + end + + def model_content + @model_content ||= File.binread(model_path) + end - inject_into_class "app/models/#{class_path.join("/")}.rb", parent_class do - " vault :#{plural_name}\n" - end + def model_path + "app/models/#{class_path.join("/")}.rb" end end end