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
         |