posto 0.3.2 → 0.3.3
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.
- 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
|