diff --git a/lib/rake/name_space.rb b/lib/rake/name_space.rb index 32f8139fc..22ad1f416 100644 --- a/lib/rake/name_space.rb +++ b/lib/rake/name_space.rb @@ -21,6 +21,10 @@ def [](name) @task_manager.lookup(name, @scope) end + def path + @scope.path + end + ## # The scope of the namespace (a LinkedList) @@ -35,4 +39,20 @@ def tasks @task_manager.tasks_in_scope(@scope) end + def namespaces + @task_manager.namespaces_in_scope(@scope) + end + + def clear + namespaces.each do |ns| + @task_manager.remove_namespace(ns.path) + end + end + + class << self + def [](namespace_name) + Rake.application.lookup_namespace(namespace_name) + end + end + end diff --git a/lib/rake/task_manager.rb b/lib/rake/task_manager.rb index 97e3b9459..9ee718949 100644 --- a/lib/rake/task_manager.rb +++ b/lib/rake/task_manager.rb @@ -8,6 +8,7 @@ module TaskManager def initialize # :nodoc: super + @namespaces = Hash.new @tasks = Hash.new @rules = Array.new @scope = Scope.make @@ -50,6 +51,10 @@ def intern(task_class, task_name) @tasks[task_name.to_s] ||= task_class.new(task_name, self) end + def remove_task(task_name) # :nodoc: + @tasks.delete(task_name) + end + # Find a matching task for +task_name+. def [](task_name, scopes=nil) task_name = task_name.to_s @@ -178,6 +183,13 @@ def tasks_in_scope(scope) } end + def namespaces_in_scope(scope) + prefix = scope.path + @namespaces.select { |name| + name.start_with?(prefix) + }.values + end + # Clear all tasks in this application. def clear @tasks.clear @@ -229,12 +241,24 @@ def in_namespace(name) name ||= generate_name @scope = Scope.new(name, @scope) ns = NameSpace.new(self, @scope) + @namespaces[ns.path] = ns yield(ns) ns ensure @scope = @scope.tail end + def lookup_namespace(name) # :nodoc: + @namespaces[name] + end + + def remove_namespace(name) # :nodoc: + ns = @namespaces.delete(name) + if ns + ns.tasks.each { |t| remove_task(t.name) } + end + end + private # Add a location to the locations field of the given task.