Skip to content

Commit f6aa2af

Browse files
committed
Support custom task names
Resolves #2
1 parent b3be502 commit f6aa2af

File tree

5 files changed

+95
-4
lines changed

5 files changed

+95
-4
lines changed

CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Changelog
2+
3+
## Unreleased
4+
5+
- Support custom task names
6+
7+
## v0.1.0
8+
9+
- Initial release

README.md

+18
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,24 @@ Invocation:
110110
bundle exec rake admin:special
111111
```
112112

113+
### Task with a custom name
114+
115+
```ruby
116+
class ObscureClassNameTask do
117+
include OopsARake::Task.with_name("custom_name")
118+
119+
def call
120+
puts "Hello"
121+
end
122+
end
123+
```
124+
125+
Invocation:
126+
127+
```sh
128+
bundle exec rake custom_name
129+
```
130+
113131
## Motivation
114132

115133
Rake is an omnipresent tool in the Ruby world. It has some drawbacks – the main

lib/oops_a_rake/registry.rb

+1-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ class Registry
66
@tasks = {}
77

88
def self.register(task_class)
9-
task_name = task_class.name.underscore.gsub("/", ":").delete_suffix("_task")
10-
11-
task = Rake::Task.define_task(task_name) do |_, args|
9+
task = Rake::Task.define_task(task_class.task_name) do |_, args|
1210
task_class.new.call(*args)
1311
end
1412

lib/oops_a_rake/task.rb

+18-1
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,28 @@
33
module OopsARake
44
module Task
55
def self.included(klass)
6-
Registry::register(klass)
76
klass.extend(ClassMethods)
7+
Registry::register(klass)
8+
end
9+
10+
def self.with_name(custom_task_name)
11+
module_name = "#{custom_task_name.gsub(":", "_").classify}ClassMethods"
12+
mod = const_set(module_name, Module.new)
13+
14+
mod.define_singleton_method(:included) do |klass|
15+
klass.extend(OopsARake::Task::ClassMethods)
16+
klass.define_singleton_method(:task_name) { custom_task_name }
17+
Registry::register(klass)
18+
end
19+
20+
mod
821
end
922

1023
module ClassMethods
24+
def task_name
25+
name.underscore.gsub("/", ":").delete_suffix("_task")
26+
end
27+
1128
def description(description)
1229
task.comment = description
1330
end

spec/lib/oops_a_rake/task_spec.rb

+49
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ def call
1616
expect { Rake::Task["greeting"].invoke }.to output(/Hello/).to_stdout
1717
end
1818

19+
it "defines the task name on the class" do
20+
define_class("GreetingTask") do
21+
include OopsARake::Task
22+
23+
def call
24+
end
25+
end
26+
27+
expect(GreetingTask.task_name).to eq("greeting")
28+
end
29+
1930
it "supports tasks with arguments" do
2031
define_class("PersonalizedGreetingTask") do
2132
include OopsARake::Task
@@ -81,6 +92,44 @@ def call
8192
expect(Rake::Task["well_documented"].comment).to eq("Informative")
8293
end
8394

95+
describe "custom task name" do
96+
it "allows tasks to specify a custom name" do
97+
define_class("ObscureClassNameTask") do
98+
include OopsARake::Task.with_name("clear_name")
99+
100+
def call
101+
puts "Hello"
102+
end
103+
end
104+
105+
expect { Rake::Task["clear_name"].invoke }.to output(/Hello/).to_stdout
106+
expect(Rake::Task.task_defined?("obscure_class_name")).to be false
107+
end
108+
109+
it "provides access to the task name from the class" do
110+
define_class("ObscureClassNameTask") do
111+
include OopsARake::Task.with_name("custom_name")
112+
113+
def call
114+
end
115+
end
116+
117+
expect(ObscureClassNameTask.task_name).to eq("custom_name")
118+
end
119+
120+
it "names the module" do
121+
define_class("ObscureClassNameTask") do
122+
include OopsARake::Task.with_name("foo:bar_baz")
123+
124+
def call
125+
end
126+
end
127+
128+
expect(ObscureClassNameTask.included_modules.map(&:to_s))
129+
.to include("OopsARake::Task::FooBarBazClassMethods")
130+
end
131+
end
132+
84133
private
85134

86135
def define_class(name, &block)

0 commit comments

Comments
 (0)