posto 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/posto/application.rb +30 -43
- data/lib/posto/file.rb +12 -4
- data/lib/posto/human_comparison.rb +19 -0
- data/lib/posto/list.rb +11 -3
- data/lib/posto/todo.rb +0 -11
- data/lib/posto.rb +2 -2
- data/test/application_test.rb +48 -0
- data/test/list_test.rb +4 -1
- data/test/monkeypatch_array_test.rb +1 -2
- metadata +6 -4
- data/lib/posto/template.rb +0 -11
data/lib/posto/application.rb
CHANGED
@@ -3,69 +3,56 @@ require 'posto/file'
|
|
3
3
|
|
4
4
|
module Posto
|
5
5
|
class Application
|
6
|
-
|
7
|
-
|
8
|
-
@list_utility = List
|
9
|
-
@io = STDOUT
|
10
|
-
@file = Posto::File.new(@arguments.filename)
|
11
|
-
end
|
12
|
-
|
13
|
-
def list(todos)
|
14
|
-
todos
|
15
|
-
end
|
6
|
+
attr_accessor :todos, :io, :file
|
7
|
+
alias :list :todos
|
16
8
|
|
17
|
-
def
|
18
|
-
@io
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
@
|
23
|
-
end
|
24
|
-
|
25
|
-
def resort(todos)
|
26
|
-
@file.write @list_utility.resort(todos)
|
9
|
+
def initialize(arguments, todos, options = {})
|
10
|
+
@io = options[:io] || STDOUT
|
11
|
+
@list_utility = options[:list_utility] || List
|
12
|
+
@file = options[:file] || Posto::File.new(arguments.filename)
|
13
|
+
@arguments = arguments
|
14
|
+
@todos = todos
|
27
15
|
end
|
28
16
|
|
29
|
-
def
|
30
|
-
@
|
31
|
-
lookup_todo(todos, n)
|
17
|
+
def run
|
18
|
+
@io.puts send(@arguments.command, *@arguments.params)
|
32
19
|
end
|
33
20
|
|
34
|
-
|
35
|
-
|
36
|
-
|
21
|
+
[:sort, :resort].each do |method|
|
22
|
+
define_method method do
|
23
|
+
@file.write(@list_utility.send(method, todos))
|
24
|
+
end
|
37
25
|
end
|
38
26
|
|
39
|
-
|
40
|
-
|
41
|
-
|
27
|
+
[:unsort, :done, :delete, :do, :top, :quick].each do |method|
|
28
|
+
define_method method do |n = 1|
|
29
|
+
@file.write @list_utility.send(method, todos, n.to_i)
|
30
|
+
@list_utility.lookup(todos, n)
|
31
|
+
end
|
42
32
|
end
|
43
33
|
|
44
|
-
def
|
45
|
-
@file.write @list_utility.
|
46
|
-
|
34
|
+
def add(todo)
|
35
|
+
@file.write @todos = @list_utility.add(todos, todo)
|
36
|
+
todo
|
47
37
|
end
|
48
38
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
39
|
+
def start(todo)
|
40
|
+
add(todo)
|
41
|
+
sort
|
42
|
+
@file.commit_alone("[posto] scheduled '#{todo}'")
|
52
43
|
end
|
53
44
|
|
54
|
-
def commit(
|
55
|
-
@file.commit(done(
|
45
|
+
def commit(n = 1)
|
46
|
+
@file.commit("[posto] finished '#{done(n)}'")
|
56
47
|
end
|
57
48
|
|
58
|
-
def init
|
49
|
+
def init
|
59
50
|
@file.touch
|
60
51
|
nil
|
61
52
|
end
|
62
53
|
|
63
|
-
def lookup_todo(todos, n)
|
64
|
-
Posto::Todo.hide_markdown(todos[n.to_i - 1])
|
65
|
-
end
|
66
|
-
|
67
54
|
def method_missing(symbol, *args)
|
68
|
-
STDERR.puts "Unsupported operation '#{symbol} #{args.join "
|
55
|
+
STDERR.puts "Unsupported operation '#{symbol} #{args.join "\n"}'"
|
69
56
|
end
|
70
57
|
end
|
71
58
|
end
|
data/lib/posto/file.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'posto/
|
1
|
+
require 'posto/list'
|
2
2
|
|
3
3
|
module Posto
|
4
4
|
class File
|
@@ -7,7 +7,7 @@ module Posto
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def write(todos)
|
10
|
-
IO.write(@filename,
|
10
|
+
IO.write(@filename, template(todos))
|
11
11
|
end
|
12
12
|
|
13
13
|
def commit(msg)
|
@@ -15,16 +15,24 @@ module Posto
|
|
15
15
|
`git commit -m "#{msg}"`
|
16
16
|
end
|
17
17
|
|
18
|
+
def commit_alone(msg)
|
19
|
+
`git commit -m "#{msg}" #@filename`
|
20
|
+
end
|
21
|
+
|
18
22
|
def touch
|
19
23
|
`touch #@filename`
|
20
24
|
end
|
21
25
|
|
22
|
-
def
|
26
|
+
def todos
|
23
27
|
if ::File.exists? @filename
|
24
|
-
IO.read(@filename).split("\n")
|
28
|
+
List.choose_todo_lines(IO.read(@filename).split("\n"))
|
25
29
|
else
|
26
30
|
[]
|
27
31
|
end
|
28
32
|
end
|
33
|
+
|
34
|
+
def template(todos)
|
35
|
+
"todo\n----\n\n#{todos.join("\n")}\n"
|
36
|
+
end
|
29
37
|
end
|
30
38
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'posto/todo'
|
2
|
+
|
3
|
+
module Posto
|
4
|
+
class HumanComparison
|
5
|
+
def self.template(x, y)
|
6
|
+
"\n================\n\n1. #{x}\n\n2. #{y}\n\n" +
|
7
|
+
"which one is more important? (1, 2 or just hit enter if you don't care): "
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.ask_human(x, y)
|
11
|
+
while true do
|
12
|
+
response = ask(template(Todo.hide_markdown(x), Todo.hide_markdown(y))).to_i
|
13
|
+
return 0 if response == 0
|
14
|
+
return -1 if response == 1
|
15
|
+
return 1 if response == 2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/posto/list.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
require 'posto/todo'
|
2
2
|
require 'posto/monkeypatch_array'
|
3
|
+
require 'posto/human_comparison'
|
3
4
|
|
4
5
|
module Posto
|
5
6
|
class List
|
6
7
|
class << self
|
7
8
|
def number_todos(todos)
|
8
|
-
todos.each_with_index.map { |todo, i| Todo.number(todo, i + 1) }
|
9
|
+
todos.each_with_index.map { |todo, i| Posto::Todo.number(todo, i + 1) }
|
9
10
|
end
|
10
11
|
|
11
12
|
def choose_todo_lines(lines)
|
12
|
-
|
13
|
+
todos, backlog = lines.slice_before(/^backlog$/).to_a
|
14
|
+
todos.select { |todo| Todo.todo?(todo) }
|
13
15
|
end
|
14
16
|
|
15
17
|
def sort(todos)
|
16
|
-
number_todos(todos.sort { |x, y| Todo.compare_sorted_todos(x, y) or
|
18
|
+
number_todos(todos.sort { |x, y| Todo.compare_sorted_todos(x, y) or HumanComparison.ask_human(x, y) })
|
17
19
|
end
|
18
20
|
|
19
21
|
def starred_group(todos)
|
@@ -27,6 +29,7 @@ module Posto
|
|
27
29
|
def done(todos, n)
|
28
30
|
unsort(todos, n)[0..-2]
|
29
31
|
end
|
32
|
+
alias :delete :done
|
30
33
|
|
31
34
|
def unsort(todos, n)
|
32
35
|
numbered_group(todos.reject_at(n - 1)) + starred_group(todos.reject_at(n - 1)) + [Todo.star(todos[n - 1])]
|
@@ -51,6 +54,11 @@ module Posto
|
|
51
54
|
array = [todos[n - 1]]
|
52
55
|
number_todos(array + numbered_group) + starred_group
|
53
56
|
end
|
57
|
+
alias :do :top
|
58
|
+
|
59
|
+
def lookup(todos, n)
|
60
|
+
Posto::Todo.hide_markdown(todos[n.to_i - 1])
|
61
|
+
end
|
54
62
|
end
|
55
63
|
end
|
56
64
|
end
|
data/lib/posto/todo.rb
CHANGED
@@ -1,19 +1,8 @@
|
|
1
|
-
require 'posto/template'
|
2
|
-
|
3
1
|
module Posto
|
4
2
|
class Todo
|
5
3
|
class << self
|
6
4
|
MD_LIST_TODO = /^(\*|\d+\.) /
|
7
5
|
|
8
|
-
def ask_human_to_compare(x, y)
|
9
|
-
while true do
|
10
|
-
response = ask(Template.human_comparison(hide_markdown(x), hide_markdown(y))).to_i
|
11
|
-
return 0 if response == 0
|
12
|
-
return -1 if response == 1
|
13
|
-
return 1 if response == 2
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
6
|
def compare_sorted_todos(x, y)
|
18
7
|
x = x.to_i
|
19
8
|
y = y.to_i
|
data/lib/posto.rb
CHANGED
@@ -8,8 +8,8 @@ module Posto
|
|
8
8
|
class << self
|
9
9
|
def main(args)
|
10
10
|
arguments = Arguments.new(args)
|
11
|
-
todos =
|
12
|
-
Application.new(arguments).run
|
11
|
+
todos = Posto::File.new(arguments.filename).todos
|
12
|
+
Application.new(arguments, todos).run
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'posto/application'
|
3
|
+
require 'grasshopper'
|
4
|
+
|
5
|
+
describe Posto::Application do
|
6
|
+
describe "#list" do
|
7
|
+
it "shows todo items" do
|
8
|
+
args = Stub.like(:command => "list", :params => [])
|
9
|
+
app = Posto::Application.new(args, ["* foo", "* bar"], :io => Mock.new)
|
10
|
+
|
11
|
+
app.run
|
12
|
+
|
13
|
+
Mock.verify(app.io).puts(["* foo", "* bar"])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
[:sort, :resort].each do |method|
|
18
|
+
describe "##{method}" do
|
19
|
+
it "calls #{method} on the list_utility given" do
|
20
|
+
args = Stub.like(:command => method, :params => [])
|
21
|
+
file = Mock.new
|
22
|
+
list_utility = Mock.new
|
23
|
+
|
24
|
+
app = Posto::Application.new(args, [], :file => file, :list_utility => list_utility, :io => Stub.new)
|
25
|
+
app.run
|
26
|
+
|
27
|
+
Mock.verify(list_utility).send(method, [])
|
28
|
+
Mock.verify(file).write(nil)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
[:unsort, :done, :delete, :do, :top, :quick].each do |method|
|
34
|
+
describe "##{method}" do
|
35
|
+
it "calls #{method} on the list_utility given" do
|
36
|
+
args = Stub.like(:command => method, :params => ["4"])
|
37
|
+
list_utility = Mock.new
|
38
|
+
|
39
|
+
file = Mock.new
|
40
|
+
app = Posto::Application.new(args, [], :list_utility => list_utility, :file => file, :io => Stub.new)
|
41
|
+
app.run
|
42
|
+
|
43
|
+
Mock.verify(list_utility).send(method, [], 4)
|
44
|
+
Mock.verify(file).write(nil)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/test/list_test.rb
CHANGED
@@ -9,7 +9,10 @@ class ListTest < MiniTest::Unit::TestCase
|
|
9
9
|
|
10
10
|
def test_choose_todo_lines
|
11
11
|
assert_equal(["99. bottles", "* unsorted todo"],
|
12
|
-
Posto::List.choose_todo_lines(["TODO", "
|
12
|
+
Posto::List.choose_todo_lines(["TODO", "----", "99. bottles", "* unsorted todo", ""]))
|
13
|
+
assert_equal(["99. bottles", "* unsorted todo"],
|
14
|
+
Posto::List.choose_todo_lines(["TODO", "----", "99. bottles", "* unsorted todo", "",
|
15
|
+
"backlog", "-------","","* nada", "* none"]))
|
13
16
|
end
|
14
17
|
|
15
18
|
def test_starred_group
|
@@ -3,7 +3,6 @@ require 'posto/monkeypatch_array'
|
|
3
3
|
|
4
4
|
class MonkeypatchArrayTest < MiniTest::Unit::TestCase
|
5
5
|
def test_reject_at_returns_a_modified_array_doesnt_modify_original
|
6
|
-
|
7
|
-
assert_equal([1, 2], remainder)
|
6
|
+
assert_equal([1, 2], [1, 2, 3].freeze.reject_at(2))
|
8
7
|
end
|
9
8
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: posto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -55,16 +55,17 @@ files:
|
|
55
55
|
- LICENSE.txt
|
56
56
|
- bin/posto
|
57
57
|
- lib/posto/monkeypatch_array.rb
|
58
|
-
- lib/posto/template.rb
|
59
58
|
- lib/posto/application.rb
|
60
59
|
- lib/posto/list.rb
|
61
60
|
- lib/posto/todo.rb
|
62
61
|
- lib/posto/file.rb
|
63
62
|
- lib/posto/arguments.rb
|
63
|
+
- lib/posto/human_comparison.rb
|
64
64
|
- lib/posto.rb
|
65
65
|
- test/list_test.rb
|
66
66
|
- test/arguments_test.rb
|
67
67
|
- test/test_helper.rb
|
68
|
+
- test/application_test.rb
|
68
69
|
- test/monkeypatch_array_test.rb
|
69
70
|
- test/todo_test.rb
|
70
71
|
homepage: http://github.com/mattraibert/posto
|
@@ -82,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
83
|
version: '0'
|
83
84
|
segments:
|
84
85
|
- 0
|
85
|
-
hash:
|
86
|
+
hash: 3530876056305707581
|
86
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
88
|
none: false
|
88
89
|
requirements:
|
@@ -99,5 +100,6 @@ test_files:
|
|
99
100
|
- test/list_test.rb
|
100
101
|
- test/arguments_test.rb
|
101
102
|
- test/test_helper.rb
|
103
|
+
- test/application_test.rb
|
102
104
|
- test/monkeypatch_array_test.rb
|
103
105
|
- test/todo_test.rb
|
data/lib/posto/template.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
module Posto
|
2
|
-
module Template
|
3
|
-
def self.todo_list(todos)
|
4
|
-
"todo\n----\n\n#{todos.join("\n")}\n"
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.human_comparison(x, y)
|
8
|
-
"\n================\n\n1. #{x}\n\n2. #{y}\n\nwhich one is more important? (1, 2 or just hit enter if you don't care): "
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|