taskr-wannabe 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/taskr +30 -0
- data/lib/taskr.rb +9 -0
- data/lib/taskr/dsl.rb +36 -0
- data/lib/taskr/task.rb +15 -0
- data/lib/taskr/task_manager.rb +36 -0
- data/lib/taskr/version.rb +3 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/unit/dsl_spec.rb +64 -0
- data/spec/unit/task_manager_spec.rb +50 -0
- data/spec/unit/task_spec.rb +35 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 138495b6e63f52eed5676d2ab017c39fb4cf2e4c
|
4
|
+
data.tar.gz: 56174b77f344ad62c9fd804bbf78e40493ad8c34
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: aa4b9956560a7189c5c994fd2fe4ccca4fbb8e7797f4a978c2986bb2c4fb9d12f8b90f75100e3236e0d1631e0d1d1994af3f04b9a15c6ec5e6fcae61b5b9d8f9
|
7
|
+
data.tar.gz: e7d0fb096847a771c6e034ef359a2ff938238199df67e2ec77988fe45b9d76995c995a97d6496e0995804b5ae8146bfe1ec7e5842b2d62882f99bad5070a482a
|
data/bin/taskr
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require File.expand_path('../../lib/taskr', __FILE__)
|
5
|
+
include Taskr::DSL
|
6
|
+
instance_eval(File.read('Taskrfile'))
|
7
|
+
|
8
|
+
OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: taskr task_name"
|
10
|
+
|
11
|
+
opts.on('-h', '--help', 'Displays Help') do
|
12
|
+
puts opts
|
13
|
+
exit 0
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on('-t', '--tasks', 'Displays Available Tasks') do
|
17
|
+
task_manager.tasks.each do |task|
|
18
|
+
puts "#{task.name}: #{task.description}"
|
19
|
+
end
|
20
|
+
exit 0
|
21
|
+
end
|
22
|
+
|
23
|
+
unless ARGV.any?
|
24
|
+
puts opts
|
25
|
+
exit 1
|
26
|
+
end
|
27
|
+
end.parse!
|
28
|
+
|
29
|
+
task_name = ARGV.first
|
30
|
+
task_manager.run(task_name)
|
data/lib/taskr.rb
ADDED
data/lib/taskr/dsl.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Taskr
|
2
|
+
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
def task_manager
|
6
|
+
@task_manager ||= TaskManager.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def desc(description)
|
10
|
+
@description = description
|
11
|
+
end
|
12
|
+
|
13
|
+
def task(task_name, &action)
|
14
|
+
deps = []
|
15
|
+
if task_name.is_a? Hash
|
16
|
+
deps = [task_name.values.first].flatten
|
17
|
+
task_name = task_name.keys.first
|
18
|
+
end
|
19
|
+
task_description = description
|
20
|
+
reset_description
|
21
|
+
task_manager.register(Task.new(task_name, action, task_description), deps)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def description
|
27
|
+
@description ||= ''
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset_description
|
31
|
+
@description = ''
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/taskr/task.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Taskr
|
2
|
+
class Task
|
3
|
+
attr_reader :name, :description
|
4
|
+
|
5
|
+
def initialize(name, action, description)
|
6
|
+
raise ArgumentError.new('Action is not callable') unless action.respond_to? :call
|
7
|
+
@name = name
|
8
|
+
@action = action
|
9
|
+
@description = description
|
10
|
+
end
|
11
|
+
def run
|
12
|
+
@action.call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Taskr
|
2
|
+
|
3
|
+
class TaskManager
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@data = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def register(task, deps=[])
|
10
|
+
raise ArgumentError.new('Can register only instances of Taskr::Task') unless task.is_a? Task
|
11
|
+
@data[task.name] = {:task => task, :deps => deps}
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def tasks
|
16
|
+
@data.values.map {|task_record| task_record[:task]}
|
17
|
+
end
|
18
|
+
|
19
|
+
def run(task_name)
|
20
|
+
task_record = find_by_name(task_name)
|
21
|
+
task_record[:deps].each { |task_dep_name| run(task_dep_name) }
|
22
|
+
task_record[:task].run
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def find_by_name(task_name)
|
28
|
+
task = @data.fetch(task_name, nil)
|
29
|
+
raise TaskNotFoundError.new("Task with name #{task_name} could not be found") if task.nil?
|
30
|
+
task
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe Taskr::DSL do
|
5
|
+
|
6
|
+
include Taskr::DSL
|
7
|
+
|
8
|
+
|
9
|
+
it 'can register tasks' do
|
10
|
+
task :sample_task do
|
11
|
+
"Just a sample action"
|
12
|
+
end
|
13
|
+
task_manager.tasks.find do |task|
|
14
|
+
task.name == :sample_task
|
15
|
+
end.wont_be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'can register task with a single dependency' do
|
19
|
+
task :dep1 do
|
20
|
+
"Dep1"
|
21
|
+
end
|
22
|
+
task :the_task => :dep1 do
|
23
|
+
"The task"
|
24
|
+
end
|
25
|
+
dep1 = task_manager.tasks.find {|task| task.name == :dep1}
|
26
|
+
dep1.expects(:run)
|
27
|
+
task_manager.run(:the_task)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'can register task with multilple dependencies' do
|
31
|
+
task :dep1 do
|
32
|
+
"Dep1"
|
33
|
+
end
|
34
|
+
task :dep2 do
|
35
|
+
"Dep2"
|
36
|
+
end
|
37
|
+
task :the_task => [:dep1, :dep2] do
|
38
|
+
"The task"
|
39
|
+
end
|
40
|
+
dep1 = task_manager.tasks.find {|task| task.name == :dep1}
|
41
|
+
dep2 = task_manager.tasks.find {|task| task.name == :dep2}
|
42
|
+
dep1.expects(:run)
|
43
|
+
dep2.expects(:run)
|
44
|
+
task_manager.run(:the_task)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'can add a description to a task' do
|
48
|
+
desc "sample task description"
|
49
|
+
task :sample_task_1 do
|
50
|
+
"Sample task 1"
|
51
|
+
end
|
52
|
+
task :sample_task_2 do
|
53
|
+
"Sample task 2"
|
54
|
+
end
|
55
|
+
task_manager.tasks.find do |task|
|
56
|
+
task.name == :sample_task_1
|
57
|
+
end.description.must_equal "sample task description"
|
58
|
+
task_manager.tasks.find do |task|
|
59
|
+
task.name == :sample_task_2
|
60
|
+
end.description.must_equal ""
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe Taskr::TaskManager do
|
5
|
+
|
6
|
+
let(:task_manager) { Taskr::TaskManager.new }
|
7
|
+
let(:task) { Taskr::Task.new('name', stub(:call => nil), 'desc') }
|
8
|
+
|
9
|
+
it 'can register task' do
|
10
|
+
task_manager.register(task).must_equal true
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'can register tasks only' do
|
14
|
+
e = lambda do
|
15
|
+
task_manager.register('something else')
|
16
|
+
end.must_raise ArgumentError
|
17
|
+
e.message.must_equal 'Can register only instances of Taskr::Task'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'provides access to the tasks registered' do
|
21
|
+
task_manager.register(task)
|
22
|
+
task_manager.tasks.must_include task
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'can find and run a task by its name' do
|
26
|
+
task_manager.register(task)
|
27
|
+
task.expects(:run)
|
28
|
+
task_manager.run(task.name)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'can register task with dependencies' do
|
32
|
+
begin
|
33
|
+
task_manager.register(task, [:one, :two, :three])
|
34
|
+
rescue ArgumentError
|
35
|
+
flunk("Should be able to register a task with its dependencies")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'runs the dependencies when we run the task' do
|
40
|
+
dep1 = Taskr::Task.new('dep1', stub(:call => nil), '')
|
41
|
+
dep2 = Taskr::Task.new('dep2', stub(:call => nil), '')
|
42
|
+
task_manager.register(task, [dep1.name, dep2.name])
|
43
|
+
task_manager.register(dep1)
|
44
|
+
task_manager.register(dep2)
|
45
|
+
dep1.expects(:run)
|
46
|
+
dep2.expects(:run)
|
47
|
+
task_manager.run(task.name)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Taskr::Task do
|
4
|
+
|
5
|
+
it 'can be created with a name, callable action and description' do
|
6
|
+
begin
|
7
|
+
Taskr::Task.new('name', stub(:call => nil), 'description')
|
8
|
+
rescue ArgumentError
|
9
|
+
flunk("Should not raise ArgumentError")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'must have the name and the task accessible' do
|
14
|
+
t = Taskr::Task.new('name', stub(:call => nil), 'desc')
|
15
|
+
t.name.must_equal 'name'
|
16
|
+
t.description.must_equal 'desc'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'must be created with a callable action' do
|
20
|
+
e = lambda do
|
21
|
+
Taskr::Task.new('name', 'something not callable', 'desc')
|
22
|
+
end.must_raise ArgumentError
|
23
|
+
e.message.must_equal 'Action is not callable'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'must run the action when we run the task' do
|
27
|
+
action = stub(:call => nil)
|
28
|
+
action.expects(:call)
|
29
|
+
task = Taskr::Task.new('name', action, 'desc')
|
30
|
+
task.run
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: taskr-wannabe
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Filip Kostovski
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-23 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Just a dummy task runner dsl
|
14
|
+
email:
|
15
|
+
- github.sirfilip@gmail.com
|
16
|
+
executables:
|
17
|
+
- taskr
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/taskr
|
22
|
+
- lib/taskr.rb
|
23
|
+
- lib/taskr/dsl.rb
|
24
|
+
- lib/taskr/task.rb
|
25
|
+
- lib/taskr/task_manager.rb
|
26
|
+
- lib/taskr/version.rb
|
27
|
+
- spec/spec_helper.rb
|
28
|
+
- spec/unit/dsl_spec.rb
|
29
|
+
- spec/unit/task_manager_spec.rb
|
30
|
+
- spec/unit/task_spec.rb
|
31
|
+
homepage: https://github.com/sirfilip/blogcode/tree/master/taskr
|
32
|
+
licenses:
|
33
|
+
- MIT
|
34
|
+
metadata: {}
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 2.5.1
|
52
|
+
signing_key:
|
53
|
+
specification_version: 4
|
54
|
+
summary: Run your tasks everyday
|
55
|
+
test_files:
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
- spec/unit/task_manager_spec.rb
|
58
|
+
- spec/unit/dsl_spec.rb
|
59
|
+
- spec/unit/task_spec.rb
|