todotxt 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NjE5ZGQyNjI2ODg5YzBhNGM3MDBlNjAzZDhkN2I4YTEwMDcxZDA2NA==
5
- data.tar.gz: !binary |-
6
- ZGY2NmJiOTM2OWUxMzUzMjFkYmZmMzE1NGJlMGQ1OGU2ZWZmZjNhYg==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- ZGU5YTU3YjIwNmU3YTNmNzg4ZTlhNDczMmJjZGI5YTE2OTFkY2JmYTM3MDNm
10
- MTBhNjliYThhOTk4YjdmODM1ZGM4MTEyYmQwNzRkMDU0Y2IzNjVjMTg3YjBh
11
- ZTdiZDIyMjZiODg3YjAzMzRhZmM0YjdjNGFkYzZmNjA4Y2JlOTI=
12
- data.tar.gz: !binary |-
13
- MjFiMTU5YzIxNjMxMTZlZTlhZmIxYTRmZmFkMTAzMzY3NmM2OGQ2NDJjYWY3
14
- N2ExMDgwZThjMGJhODk0NmJmNTM5Nzc0N2IxNTJiMWM1ODcwYzY5ZjFlMDAy
15
- NWI0MmEwNjcxMzNmMDJlNjZlMWY4ZTM1NGEwNGQwOWEyZDU2YjA=
2
+ SHA256:
3
+ metadata.gz: 21a772c6a03508479892cd47bd8b75e9d6161a369340d9d42991ffac17c18267
4
+ data.tar.gz: 9f8ee70e7841c6684360964dbcd3dfc23be934fdcfc314160073d5dda66244cf
5
+ SHA512:
6
+ metadata.gz: f6fc1646f58339be5635fb1021301374dbb4a524de107b0689c3910cadffcf757e392de8c7aa61e4745ecb82425f00acd70f5f128a7b393597cfd9a6a1f92249
7
+ data.tar.gz: 1f180c48442d392b95b6875fe27d4cd8fd8f6941c4825a4c38be05d3343cdf5c77ff4e809900846ee7c7f5cbb7550225cc94dfdcff7c1b813fd8a253d90e5d21
data/.gitignore CHANGED
@@ -4,3 +4,5 @@ Gemfile.lock
4
4
  pkg/*
5
5
  coverage/*
6
6
  tmp/*
7
+ doc/
8
+ .yardoc/
data/README.md CHANGED
@@ -38,27 +38,49 @@ The gem will install a command, `todotxt` which is used to interact with your
38
38
  todo.txt.
39
39
 
40
40
  Tasks:
41
- todotxt add | a TEXT # Add a new Todo item
42
- todotxt append | app ITEM# STRING # Append STRING to ITEM#
43
- todotxt del | rm ITEM#[, ITEM#, ITEM#, ...] # Remove ITEM#
44
- todotxt do ITEM#[, ITEM#, ITEM#, ...] # Mark ITEM# as done
45
- todotxt dp | depri ITEM#[, ITEM#, ITEM#, ...] # Remove priority for ITEM#
46
- todotxt edit # Open todo.txt file in your default editor
47
- todotxt generate_txt # Create a sample todo.txt
48
- todotxt generate_config # Create a .todotxt.cfg file in your home folder, containing the path to todo.txt
49
- todotxt help [TASK] # Describe available tasks or one specific task
50
- todotxt list | ls [SEARCH] # List all todos, or todos matching SEARCH
51
- todotxt listproj | lsproj # List all projects
52
- todotxt lscon | lsc # List all contexts
53
- todotxt lsdone | lsd # List all done items
54
- todotxt prepend | prep ITEM# STRING # Prepend STRING to ITEM#
55
- todotxt pri | p ITEM# PRIORITY # Set priority of ITEM# to PRIORITY
56
- todotxt replace ITEM# TEXT # Completely replace ITEM# text with TEXT
57
- todotxt undo | u ITEM#[, ITEM#, ITEM#, ...] # Mark ITEM# item as not done
58
- todotxt version # Show todotxt version
41
+ todotxt add | a TEXT # Add a new Todo item
42
+ todotxt append | app ITEM# STRING # Append STRING to ITEM#
43
+ todotxt del | rm ITEM#[, ITEM#, ITEM#, ...] # Remove ITEM#
44
+ todotxt do ITEM#[, ITEM#, ITEM#, ...] # Mark ITEM# as done
45
+ todotxt dp | depri ITEM#[, ITEM#, ITEM#, ...] # Remove priority for ITEM#
46
+ todotxt due # List due items
47
+ todotxt edit # Open todo.txt file in your default editor
48
+ todotxt generate_config # Create a .todotxt.cfg file in your home folder, containing the path to todo.txt
49
+ todotxt generate_txt # Create a sample todo.txt
50
+ todotxt help [TASK] # Describe available tasks or one specific task
51
+ todotxt list | ls [SEARCH] # List all todos, or todos matching SEARCH
52
+ todotxt listproj | lsproj # List all projects
53
+ todotxt lscon | lsc # List all contexts
54
+ todotxt lsdone | lsd # List all done items
55
+ todotxt move | mv ITEM#[, ITEM#, ITEM#, ...] file # Move ITEM# to another file
56
+ todotxt prepend | prep ITEM# STRING # Prepend STRING to ITEM#
57
+ todotxt pri | p ITEM# PRIORITY # Set priority of ITEM# to PRIORITY
58
+ todotxt replace ITEM# TEXT # Completely replace ITEM# text with TEXT
59
+ todotxt undo | u ITEM#[, ITEM#, ITEM#, ...] # Mark ITEM# item as not done
60
+ todotxt version # Show todotxt version
59
61
 
60
62
  Calling simply `todotxt` will automatically run the `ls` command.
61
63
 
64
+ You can pass the option `--file=` to point todotxt to another file. You
65
+ can pass an alias, defined in the configuration, or the path to an
66
+ arbitrary file.
67
+
68
+ With a file wishlist, in the configuration defined as "wishlist", you
69
+ can run:
70
+
71
+ todotxt ls --file=wishlist
72
+
73
+ To list all items form this wishlist file. Alternatively you can run:
74
+
75
+ todotxt ls --file="~/Dropbox/todo/deferred.txt"
76
+
77
+ To list all items from the file deferred.txt, provided that file
78
+ exists.
79
+
80
+ In order to list all items from all files defined in the config, use the
81
+ `--all` flag with ls:
82
+
83
+ todotxt ls --all
62
84
 
63
85
  ## Screenshot
64
86
 
data/Rakefile CHANGED
@@ -1,8 +1,5 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
- RSpec::Core::RakeTask.new(:spec) do |t|
5
- t.pattern = 'spec/*_spec.rb'
6
- end
7
-
4
+ RSpec::Core::RakeTask.new(:spec)
8
5
  task :default => [:spec]
data/bin/todotxt CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- libdir = File.join(File.dirname(File.dirname(__FILE__)), "lib")
3
+ libdir = File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
  $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
5
5
 
6
6
  args = ARGV.clone
7
7
 
8
- #if args.empty?
9
- #args.push "ls"
10
- #end
8
+ # if args.empty?
9
+ # args.push "ls"
10
+ # end
11
11
 
12
- require "todotxt"
12
+ require 'todotxt'
13
13
  Todotxt::CLI.start(args)
@@ -13,7 +13,7 @@ Feature: Edit
13
13
  | 2012-12-12 Buy GTD book @amazon +wishlist |
14
14
 
15
15
  Scenario: Open the file in the systems editor
16
- Given the enviromnent variable "EDITOR" is set to "echo"
16
+ Given the environment variable "EDITOR" is set to "echo"
17
17
  And a default config exists
18
18
  When I run `todotxt edit`
19
19
  Then it should pass with:
@@ -0,0 +1,53 @@
1
+ Feature: Files
2
+
3
+ So that I can organise my Todo-items better
4
+ As a user
5
+ I want to use different files
6
+
7
+ Background:
8
+ Given a config exists with the following files:
9
+ | alias | path |
10
+ | todo | todo.txt |
11
+ | wishlist | wishlist.txt |
12
+ And a todofile with the following items exists:
13
+ | todo |
14
+ | Read book on GTD |
15
+ | Publish wishlist on site |
16
+ And a todofile named "wishlist.txt" with the following items exists:
17
+ | todo |
18
+ | Getting Things Done @bookstore |
19
+ | Label Maker @officesupply |
20
+
21
+ Scenario: Run list with --files option
22
+ When I run `todotxt list --file=wishlist`
23
+ Then it should pass with:
24
+ """
25
+ Getting Things Done @bookstore
26
+ """
27
+
28
+ Scenario: Provide a file that is not in the config
29
+ When I run `todotxt list --file=doesnotexist` interactively
30
+ Then it should fail with:
31
+ """
32
+ \"doesnotexist\" is not defined in the config
33
+ """
34
+
35
+ Scenario: Run list with --files option and a filename for a file not in the config
36
+ Given a todofile named "deferred.txt" with the following items exists:
37
+ | todo |
38
+ | Getting Things Done @bookstore |
39
+ When I run `todotxt list --file=./deferred.txt`
40
+ Then it should pass with:
41
+ """
42
+ Getting Things Done @bookstore
43
+ """
44
+
45
+ Scenario: List entries from all files
46
+ When I run `todotxt list --all`
47
+ Then it should pass with:
48
+ """
49
+ 1. Read book on GTD
50
+ 2. Publish wishlist on site
51
+ 3. Getting Things Done @bookstore
52
+ 4. Label Maker @officesupply
53
+ """
@@ -60,14 +60,3 @@ Feature: Initialize
60
60
  When I run `todotxt` interactively
61
61
  And I type "no"
62
62
  Then a file named "todo.txt" should not exist
63
-
64
- Scenario: Running with an old config-file still works
65
- Given an old config exists
66
- And a todofile with the following items exists:
67
- | todo |
68
- | Update my config file |
69
- When I run `todotxt`
70
- Then it should pass with:
71
- """
72
- 1. Update my config file
73
- """
@@ -25,6 +25,19 @@ Feature: move
25
25
  And the file "todo.txt" should not contain "Getting Things Done @bookstore"
26
26
  And the file "wishlist.txt" should contain "Getting Things Done @bookstore"
27
27
 
28
+ Scenario: Move an item from wishlist.txt to todo.txt
29
+ Given a todofile named "wishlist.txt" with the following items exists:
30
+ | todo |
31
+ | x Archive todotxt @gtd |
32
+ When I run `todotxt move 1 todo --file=wishlist`
33
+ Then it should pass with:
34
+ """
35
+ 1. x Archive todotxt @gtd
36
+ => Moved to todo.txt
37
+ """
38
+ And the file "wishlist.txt" should not contain "x Archive todotxt @gtd"
39
+ And the file "todo.txt" should contain "x Archive todotxt @gtd"
40
+
28
41
  Scenario: Move an illegal item
29
42
  When I run `todotxt move 1337 wishlist`
30
43
  Then it should pass with:
@@ -29,19 +29,23 @@ Given /^a todofile with done items exists$/ do
29
29
  write_file("todo.txt", "Read documentation for todotxt\nx Install todotxt\nWrite cucumber steps for todotxt")
30
30
  end
31
31
 
32
- Given /^a todofile with the following items exists:$/ do |todolist|
32
+ Given /^a todofile named "(.*?)" with the following items exists:$/ do |filename, todolist|
33
33
  contents = todolist.hashes.map {|row| row["todo"] }.join("\n")
34
- write_file("todo.txt", contents)
34
+ write_file(filename, contents)
35
+ end
36
+
37
+ Given /^a todofile with the following items exists:$/ do |todolist|
38
+ step %{a todofile named "todo.txt" with the following items exists:}, todolist
35
39
  end
36
40
 
37
41
  Given /^an empty todofile named "(.*?)" exists$/ do |filename|
38
42
  write_file(filename, "")
39
43
  end
40
44
 
41
- Given /^the enviromnent variable "(.*?)" is set to "(.*?)"$/ do |name, value|
45
+ Given /^the environment variable "(.*?)" is set to "(.*?)"$/ do |name, value|
42
46
  ENV[name] = value
43
47
  end
44
48
 
45
49
  Given /^the date is "(.*?)"$/ do |date|
46
- step %{the enviromnent variable "date" is set to "#{date}"}
50
+ step %{the environment variable "date" is set to "#{date}"}
47
51
  end
@@ -1,6 +1,10 @@
1
1
  Then /^I should see all entries from the todofile with numbers$/ do
2
+ step %{I should see all entries from the todofile named "todo.txt" with numbers}
3
+ end
4
+
5
+ Then /^I should see all entries from the todofile named "([^"]*)" with numbers$/ do |filename|
2
6
  contents = ""
3
- File.open(File.join(ENV["HOME"], "todo.txt")).each_line do |line|
7
+ File.open(File.join(ENV["HOME"], filename)).each_line do |line|
4
8
  # matching "1. Do Something"
5
9
  contents += "([\\d]\.\\s+)#{Regexp.escape(line.strip)}.*"
6
10
  end
data/lib/todotxt.rb CHANGED
@@ -2,14 +2,15 @@
2
2
  libdir = File.dirname(__FILE__)
3
3
  $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
4
4
 
5
+ # Todotxt is a Ruby librairy / CLI interface to work with [todo.txt](http://www.todotxt.com) format files.
5
6
  module Todotxt
6
- autoload :Todo, "todotxt/todo"
7
- autoload :TodoList, "todotxt/todolist"
8
- autoload :TodoFile, "todotxt/todofile"
9
- autoload :CLI, "todotxt/cli"
10
- autoload :CLIHelpers, "todotxt/clihelpers"
11
- autoload :Config, "todotxt/config"
7
+ autoload :Todo, 'todotxt/todo'
8
+ autoload :TodoList, 'todotxt/todolist'
9
+ autoload :TodoFile, 'todotxt/todofile'
10
+ autoload :CLI, 'todotxt/cli'
11
+ autoload :CLIHelpers, 'todotxt/clihelpers'
12
+ autoload :Config, 'todotxt/config'
12
13
  end
13
14
 
14
- require "todotxt/regex"
15
- require "todotxt/version"
15
+ require 'todotxt/regex'
16
+ require 'todotxt/version'
data/lib/todotxt/cli.rb CHANGED
@@ -1,39 +1,41 @@
1
- require "thor"
2
- require "rainbow"
3
- require "chronic"
4
- require "parseconfig"
1
+ require 'thor'
2
+ require 'rainbow'
3
+ require 'chronic'
4
+ require 'parseconfig'
5
5
 
6
6
  module Todotxt
7
+ CFG_PATH = File.expand_path('~/.todotxt.cfg')
8
+
7
9
  class CLI < Thor
8
10
  include Thor::Actions
9
11
  include Todotxt::CLIHelpers
10
12
 
11
13
  def self.source_root
12
- File.join File.dirname(__FILE__), "..", "..", "conf"
14
+ File.join File.dirname(__FILE__), '..', '..', 'conf'
13
15
  end
14
16
 
15
17
  def initialize(*args)
16
18
  super
17
19
  # Allow testing colors, rainbow usually detects whether
18
- # the output goes to a TTY, but Aruba/Cucumber is not a
20
+ # the output goes to a TTY, but Aruba/Cucumber is not a
19
21
  # TTY, so we enforce it here, based on an environment var
20
- Sickill::Rainbow.enabled = true if ENV["FORCE_COLORS"] == "TRUE"
21
- @config = Config.new
22
+ Sickill::Rainbow.enabled = true if ENV['FORCE_COLORS'] == 'TRUE'
23
+
24
+ # Open config file and render config.
25
+ @config = Config.new options
22
26
  @list = nil
23
- unless ["help", "generate_config", "generate_txt"].include? ARGV[0]
27
+ unless %w[help generate_config generate_txt].include? ARGV[0]
24
28
  ask_and_create @config unless @config.file_exists?
25
- if @config.deprecated? and options[:file]
26
- error_and_exit "You are using an old config, which has no support for mulitple files. Please update your configuration."
29
+ if @config.deprecated? && options[:file]
30
+ error_and_exit 'You are using an old config, which has no support for multiple files. Please update your configuration.'
27
31
  end
28
32
 
29
- parse_conf
30
- ask_and_create @file unless @file.exists?
31
- @list = TodoList.new @file
33
+ ask_and_create @config.file unless @config.file.exists?
34
+ @list = TodoList.new @config.file
32
35
  end
33
-
34
36
  end
35
37
 
36
- class_option :file, :type => :string, :desc => "Use a different file than todo.txt
38
+ class_option :file, type: :string, desc: "Use a different file than todo.txt
37
39
  E.g. use 'done' to have the action performed on the file you set for 'done' in the todotxt
38
40
  configuration under [files]."
39
41
 
@@ -43,49 +45,57 @@ module Todotxt
43
45
  # Listing
44
46
  #
45
47
 
46
- desc "list | ls [SEARCH]", "List all todos, or todos matching SEARCH"
47
- method_option :done, :type => :boolean, :aliases => "-d", :desc => "Include todo items that have been marked as done"
48
- method_option :simple, :type => :boolean, :desc => "Simple output (for scripts, etc)"
49
- def list search=""
50
- @list.filter(search, :with_done => (options[:done] ? true : false))
51
- render_list :simple => !!options[:simple]
48
+ desc 'list | ls [SEARCH]', 'List all todos, or todos matching SEARCH'
49
+ method_option :done, type: :boolean, aliases: '-d', desc: 'Include todo items that have been marked as done'
50
+ method_option :simple, type: :boolean, desc: 'Simple output (for scripts, etc)'
51
+ method_option :all, type: :boolean, aliases: '-a', desc: 'List items from all files'
52
+ def list(search = '')
53
+ if options[:all]
54
+ @config.files.each do |file|
55
+ count = @list.todos.count || 0
56
+ @list.todos += TodoList.new(file[1], count).todos unless file[0] == 'todo'
57
+ end
58
+ end
59
+
60
+ @list.filter(search, with_done: (options[:done] ? true : false))
61
+ render_list simple: !!options[:simple]
52
62
  end
53
- map "ls" => :list
63
+ map 'ls' => :list
54
64
 
55
- desc "lsdone | lsd", "List all done items"
56
- def lsdone search=""
57
- @list.filter(search, :only_done => true)
65
+ desc 'lsdone | lsd', 'List all done items'
66
+ def lsdone(search = '')
67
+ @list.filter(search, only_done: true)
58
68
 
59
69
  render_list
60
70
  end
61
- map "lsd" => :lsdone
71
+ map 'lsd' => :lsdone
62
72
 
63
- desc "listproj | lsproj", "List all projects"
73
+ desc 'listproj | lsproj', 'List all projects'
64
74
  def listproj
65
75
  @list.projects.each { |p| say p }
66
76
  end
67
- map "lsproj" => :listproj
77
+ map 'lsproj' => :listproj
68
78
 
69
- desc "lscon | lsc", "List all contexts"
79
+ desc 'lscon | lsc', 'List all contexts'
70
80
  def lscon
71
81
  @list.contexts.each { |c| say c }
72
82
  end
73
- map "lsc" => :lscon
83
+ map 'lsc' => :lscon
74
84
 
75
- desc "due", "List due items"
85
+ desc 'due', 'List due items'
76
86
  def due
77
- if ENV["date"] # Allow testing to "freeze" the date
78
- today = DateTime.parse(ENV["date"]).to_date
79
- else
80
- today = DateTime.now.to_date
81
- end
87
+ today = if ENV['date'] # Allow testing to "freeze" the date
88
+ DateTime.parse(ENV['date']).to_date
89
+ else
90
+ DateTime.now.to_date
91
+ end
82
92
 
83
- puts "Due today (#{today.strftime("%Y-%m-%d")})".bright
93
+ puts "Due today (#{today.strftime('%Y-%m-%d')})".bright
84
94
  @list.on_date(today).each { |todo| puts format_todo(todo) }
85
95
  puts "\nPast-due items".bright
86
96
  @list.before_date(today).each { |todo| puts format_todo(todo) }
87
97
  puts "\nDue 7 days in advance".bright
88
- ((today+1)..(today+7)).each do |day|
98
+ ((today + 1)..(today + 7)).each do |day|
89
99
  @list.on_date(day).each { |todo| puts format_todo(todo) }
90
100
  end
91
101
  end
@@ -94,7 +104,7 @@ module Todotxt
94
104
  # Todo management
95
105
  #
96
106
 
97
- desc "add | a TEXT", "Add a new Todo item"
107
+ desc 'add | a TEXT', 'Add a new Todo item'
98
108
  def add(str, *str2)
99
109
  string = "#{str} #{str2.join(' ')}"
100
110
  todo = @list.add string
@@ -103,10 +113,10 @@ module Todotxt
103
113
 
104
114
  @list.save
105
115
  end
106
- map "a" => :add
116
+ map 'a' => :add
107
117
 
108
- desc "do ITEM#[, ITEM#, ITEM#, ...]", "Mark ITEM# as done"
109
- def do line1, *lines
118
+ desc 'do ITEM#[, ITEM#, ITEM#, ...]', 'Mark ITEM# as done'
119
+ def do(line1, *lines)
110
120
  lines.unshift(line1).each do |line|
111
121
  todo = @list.find_by_line line
112
122
  if todo
@@ -120,8 +130,8 @@ module Todotxt
120
130
  end
121
131
  end
122
132
 
123
- desc "undo | u ITEM#[, ITEM#, ITEM#, ...]", "Mark ITEM# item as not done"
124
- def undo line1, *lines
133
+ desc 'undo | u ITEM#[, ITEM#, ITEM#, ...]', 'Mark ITEM# item as not done'
134
+ def undo(line1, *lines)
125
135
  lines.unshift(line1).each do |line|
126
136
  todo = @list.find_by_line line
127
137
  if todo
@@ -134,10 +144,10 @@ module Todotxt
134
144
  end
135
145
  end
136
146
  end
137
- map "u" => :undo
147
+ map 'u' => :undo
138
148
 
139
- desc "pri | p ITEM# PRIORITY", "Set priority of ITEM# to PRIORITY"
140
- def pri line, priority
149
+ desc 'pri | p ITEM# PRIORITY', 'Set priority of ITEM# to PRIORITY'
150
+ def pri(line, priority)
141
151
  todo = @list.find_by_line line
142
152
  if todo
143
153
  todo.prioritize priority
@@ -148,10 +158,10 @@ module Todotxt
148
158
  error "No todo found at line #{line}"
149
159
  end
150
160
  end
151
- map "p" => :pri
161
+ map 'p' => :pri
152
162
 
153
- desc "dp | depri ITEM#[, ITEM#, ITEM#, ...]", "Remove priority for ITEM#"
154
- def dp line1, *lines
163
+ desc 'dp | depri ITEM#[, ITEM#, ITEM#, ...]', 'Remove priority for ITEM#'
164
+ def dp(line1, *lines)
155
165
  lines.unshift(line1).each do |line|
156
166
  todo = @list.find_by_line line
157
167
  if todo
@@ -164,10 +174,10 @@ module Todotxt
164
174
  end
165
175
  end
166
176
  end
167
- map "depri" => :dp
177
+ map 'depri' => :dp
168
178
 
169
- desc "append | app ITEM# STRING", "Append STRING to ITEM#"
170
- def append line, str, *str2
179
+ desc 'append | app ITEM# STRING', 'Append STRING to ITEM#'
180
+ def append(line, str, *str2)
171
181
  string = "#{str} #{str2.join(' ')}"
172
182
  todo = @list.find_by_line line
173
183
  if todo
@@ -179,10 +189,10 @@ module Todotxt
179
189
  error "No todo found at line #{line}"
180
190
  end
181
191
  end
182
- map "app" => :append
192
+ map 'app' => :append
183
193
 
184
- desc "prepend | prep ITEM# STRING", "Prepend STRING to ITEM#"
185
- def prepend line, str, *str2
194
+ desc 'prepend | prep ITEM# STRING', 'Prepend STRING to ITEM#'
195
+ def prepend(line, str, *str2)
186
196
  string = "#{str} #{str2.join(' ')}"
187
197
  todo = @list.find_by_line line
188
198
  if todo
@@ -194,10 +204,10 @@ module Todotxt
194
204
  error "No todo found at line #{line}"
195
205
  end
196
206
  end
197
- map "prep" => :prepend
207
+ map 'prep' => :prepend
198
208
 
199
- desc "replace ITEM# TEXT", "Completely replace ITEM# text with TEXT"
200
- def replace line, str, *str2
209
+ desc 'replace ITEM# TEXT', 'Completely replace ITEM# text with TEXT'
210
+ def replace(line, str, *str2)
201
211
  string = "#{str} #{str2.join(' ')}"
202
212
  todo = @list.find_by_line line
203
213
  if todo
@@ -210,16 +220,16 @@ module Todotxt
210
220
  end
211
221
  end
212
222
 
213
- desc "del | rm ITEM#[, ITEM#, ITEM#, ...]", "Remove ITEM#"
214
- method_option :force, :type => :boolean, :aliases => "-f", :desc => "Don't confirm removal"
215
- def del line1, *lines
223
+ desc 'del | rm ITEM#[, ITEM#, ITEM#, ...]', 'Remove ITEM#'
224
+ method_option :force, type: :boolean, aliases: '-f', desc: "Don't confirm removal"
225
+ def del(line1, *lines)
216
226
  lines.unshift(line1).each do |line|
217
227
  todo = @list.find_by_line line
218
228
  if todo
219
229
  say format_todo(todo)
220
- if options[:force] || yes?("Remove this item? [y/N]")
230
+ if options[:force] || yes?('Remove this item? [y/N]')
221
231
  @list.remove line
222
- notice "Removed from list"
232
+ notice 'Removed from list'
223
233
 
224
234
  @list.save
225
235
  end
@@ -228,19 +238,19 @@ module Todotxt
228
238
  end
229
239
  end
230
240
  end
231
- map "rm" => :del
241
+ map 'rm' => :del
232
242
 
233
- desc "edit", "Open todo.txt file in your default editor"
243
+ desc 'edit', 'Open todo.txt file in your default editor'
234
244
  def edit
235
- system "#{@editor} #{@file.path}"
245
+ Kernel.system "#{@config.editor} #{@config.file.path}"
236
246
  end
237
247
 
238
- desc "move | mv ITEM#[, ITEM#, ITEM#, ...] file", "Move ITEM# to another file"
239
- def move line1, *lines, other_list_alias
240
- if @files[other_list_alias.to_sym].nil?
248
+ desc 'move | mv ITEM#[, ITEM#, ITEM#, ...] file', 'Move ITEM# to another file'
249
+ def move(line1, *lines, other_list_alias)
250
+ if @config.files[other_list_alias].nil?
241
251
  error_and_exit "File alias #{other_list_alias} not found"
242
252
  else
243
- other_list = TodoList.new @files[other_list_alias.to_sym]
253
+ other_list = TodoList.new @config.files[other_list_alias]
244
254
  end
245
255
 
246
256
  lines.unshift(line1).each do |line|
@@ -257,65 +267,42 @@ module Todotxt
257
267
  end
258
268
  end
259
269
  end
260
- map "mv" => :move
261
-
262
- desc "move | mv ITEM#[, ITEM#, ITEM#, ...] file", "Move ITEM# to another file"
263
- def move line1, *lines, other_list_alias
264
- if @files[other_list_alias.to_sym].nil?
265
- error_and_exit "File alias #{other_list_alias} not found"
266
- else
267
- other_list = TodoList.new @files[other_list_alias.to_sym]
268
- end
269
-
270
- lines.unshift(line1).each do |line|
271
- todo = @list.find_by_line line
272
- if todo
273
- say format_todo(todo)
274
- @list.move line, other_list
275
- notice "Moved to #{other_list}"
276
-
277
- other_list.save
278
- @list.save
279
- else
280
- error "No todo found at line #{line}"
281
- end
282
- end
283
- end
284
- map "mv" => :move
270
+ map 'mv' => :move
285
271
 
286
272
  #
287
273
  # File generation
288
274
  #
289
275
 
290
- desc "generate_config", "Create a .todotxt.cfg file in your home folder, containing the path to todo.txt"
276
+ desc 'generate_config', 'Create a .todotxt.cfg file in your home folder, containing the path to todo.txt'
291
277
  def generate_config
292
- copy_file "todotxt.cfg", Config.config_path
293
- puts ""
278
+ copy_file 'todotxt.cfg', Config.config_path
279
+ puts ''
294
280
  end
295
281
 
296
- desc "generate_txt", "Create a sample todo.txt"
282
+ desc 'generate_txt', 'Create a sample todo.txt'
297
283
  def generate_txt
298
- copy_file "todo.txt", @file
299
- puts ""
284
+ copy_file 'todo.txt', @file
285
+ puts ''
300
286
  end
301
287
 
302
288
  #
303
289
  # Extras
304
290
  #
305
291
 
306
- desc "version", "Show todotxt version"
292
+ desc 'version', 'Show todotxt version'
307
293
  def version
308
294
  say "todotxt #{VERSION}"
309
295
  end
310
296
 
311
- private
312
- def render_list opts={}
297
+ private
298
+
299
+ def render_list(opts = {})
313
300
  numsize = @list.count + 1
314
301
  numsize = numsize.to_s.length + 0
315
302
 
316
303
  @list.each do |t|
317
304
  if opts[:simple]
318
- say "#{t.line} #{t.to_s}"
305
+ say "#{t.line} #{t}"
319
306
  else
320
307
  say format_todo(t, numsize)
321
308
  end
@@ -327,49 +314,16 @@ module Todotxt
327
314
  end
328
315
 
329
316
  # File should respond_to "basename", "path" and "generate!"
330
- def ask_and_create file
317
+ def ask_and_create(file)
331
318
  puts "#{file.basename} doesn't exist yet. Would you like to generate a sample file?"
332
319
  confirm_generate = yes? "Create #{file.path}? [y/N]"
333
320
 
334
321
  if confirm_generate
335
322
  file.generate!
336
323
  else
337
- puts ""
324
+ puts ''
338
325
  exit
339
326
  end
340
327
  end
341
-
342
- def parse_conf
343
- @files = {}
344
-
345
- return if @config.nil?
346
-
347
- # Backwards compatibility with todo_txt_path
348
- # when old variable is still set, and no files=>todo
349
- # given, fallback to this old version.
350
- if @config["todo_txt_path"]
351
- @files[:todo] ||= TodoFile.new(@config["todo_txt_path"])
352
- else
353
- # Fill the @files from settings.
354
- @config["files"].each do |name, file_path|
355
- unless file_path.empty?
356
- @files[name.to_sym] = TodoFile.new(file_path)
357
- end
358
- end
359
- end
360
-
361
- # Determine what file should be activated, set that in @file
362
- if options[:file]
363
- file_sym = options[:file].to_sym
364
- if @files.has_key? file_sym
365
- @file = @files[file_sym]
366
- end
367
- else
368
- @file = @files[:todo]
369
- end
370
-
371
- # Determine the editor
372
- @editor = @config["editor"] || ENV["EDITOR"]
373
- end
374
328
  end
375
329
  end