rtodotxt 0.0.2
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/.autotest +2 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +19 -0
- data/Rakefile +2 -0
- data/lib/rtodotxt.rb +99 -0
- data/lib/rtodotxt/version.rb +3 -0
- data/rtodotxt.gemspec +20 -0
- data/spec/rtodotxt_spec.rb +150 -0
- data/spec/spec_helper.rb +7 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 21ba6fcc82ae122035a4bd878dba4c5d03602f0b
|
4
|
+
data.tar.gz: 526dc4fe246aedfb54ef95d00a899e33a1ffd5c4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1c005c02f8b20f03e8c6190571afffda2e30693f5decf1e31696fdfa3cdcba737d81de48c6a21ec579b86e526bbe72379c11e9cfe63b63baac1b3b5ddd6e0d86
|
7
|
+
data.tar.gz: 5cdb916685eb8568ce469696ba77f1ad5a587324eaa07d4a0cb8892921963b6a740f04396b06cd81b438a4d19c612adef91828344f2245b4d0e72645fe65c5a2
|
data/.autotest
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Philipp Fehre
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Rtodotxt
|
2
|
+
========
|
3
|
+
Work with [todo.txt](http://todotxt.com/) files from ruby.
|
4
|
+
|
5
|
+
Usage
|
6
|
+
-----
|
7
|
+
Simply work with any todo.txt formatted file
|
8
|
+
|
9
|
+
require 'rtodotxt'
|
10
|
+
|
11
|
+
list = Rtodotxt::List.new(File.read('./todo.txt')) # load list
|
12
|
+
list.first # first todo
|
13
|
+
list.first.done! # mark first todo done
|
14
|
+
list.first.done? # => true
|
15
|
+
|
16
|
+
list.map(&:contexts).flatten.uniq # get all contexts
|
17
|
+
list.map(&:projects).flatten.uniq # get all projects
|
18
|
+
|
19
|
+
|
data/Rakefile
ADDED
data/lib/rtodotxt.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require "rtodotxt/version"
|
2
|
+
require "date"
|
3
|
+
|
4
|
+
module Rtodotxt
|
5
|
+
|
6
|
+
class List < Array
|
7
|
+
|
8
|
+
def initialize list
|
9
|
+
super self.class.gen_list_from_string list
|
10
|
+
end
|
11
|
+
|
12
|
+
# Split a string by each line and generate an array of todos
|
13
|
+
def read str
|
14
|
+
super self.class.gen_list_from_string str
|
15
|
+
end
|
16
|
+
|
17
|
+
# Join the todo text together to return the list
|
18
|
+
def print
|
19
|
+
str = self.map { |t| t.text }.join "\n"
|
20
|
+
# the result must end with a newline!
|
21
|
+
str << "\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.gen_list_from_string str
|
25
|
+
str.split( "\n" ).map! do |line|
|
26
|
+
Todo.new line unless line.empty?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class Todo
|
33
|
+
include Comparable
|
34
|
+
attr_accessor :text
|
35
|
+
|
36
|
+
def initialize text
|
37
|
+
@text = text
|
38
|
+
end
|
39
|
+
|
40
|
+
# Compare todos, the order is reversed so that a printed list is in correct
|
41
|
+
# order
|
42
|
+
def <=> a_todo
|
43
|
+
if done?
|
44
|
+
a_todo.done? ? 0 : 1
|
45
|
+
elsif a_todo.prio.empty? || prio.empty?
|
46
|
+
if a_todo.prio.empty? && prio.empty?
|
47
|
+
0
|
48
|
+
elsif a_todo.prio.empty?
|
49
|
+
-1
|
50
|
+
else
|
51
|
+
1
|
52
|
+
end
|
53
|
+
else
|
54
|
+
prio <=> a_todo.prio
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def done!
|
59
|
+
@text = "x #{Date.today.to_s} " + @text.gsub( /\(.\)\s/, '' ) unless done?
|
60
|
+
# return self to allow method chaining
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
def prio! p
|
65
|
+
if p == ""
|
66
|
+
# Remove the priority
|
67
|
+
@text.gsub! /\(.\)\s/, ''
|
68
|
+
elsif p.match /\A.\Z/
|
69
|
+
# Single char to be used as priority
|
70
|
+
@text = "(#{p.match(/\A.\Z/)[0].upcase}) #{@text}"
|
71
|
+
else
|
72
|
+
raise ArgumentError, "Illegal priority", caller
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def prio
|
77
|
+
# Match the priority from the string
|
78
|
+
prio = @text.match(/\((.)\)/)
|
79
|
+
prio.nil? ? "" : prio[1]
|
80
|
+
end
|
81
|
+
|
82
|
+
def done?
|
83
|
+
# if todo text starts with x than it is done
|
84
|
+
@text.match( /\Ax\s/ ).nil? ? false : true
|
85
|
+
end
|
86
|
+
|
87
|
+
def contexts
|
88
|
+
contexts = @text.scan /@(\S+)/
|
89
|
+
contexts.uniq.flatten
|
90
|
+
end
|
91
|
+
|
92
|
+
def projects
|
93
|
+
projects = @text.scan /\+(\S+)/
|
94
|
+
projects.uniq.flatten
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
data/rtodotxt.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/rtodotxt/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Philipp Fehre"]
|
6
|
+
gem.email = ["philipp.fehre@googlemail.com"]
|
7
|
+
gem.description = %q{Working with todo.txt file in ruby}
|
8
|
+
gem.summary = %q{Use a todotxt formatted file in ruby}
|
9
|
+
gem.homepage = "http://github.com/sideshowcoder/rtodotxt"
|
10
|
+
|
11
|
+
# Development dependencies
|
12
|
+
gem.add_development_dependency "rspec", "~> 2.13.0"
|
13
|
+
|
14
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
15
|
+
gem.files = `git ls-files`.split("\n")
|
16
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
gem.name = "rtodotxt"
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.version = Rtodotxt::VERSION
|
20
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
a_list = "(A) Buy milk @supermarket +groceries
|
4
|
+
(C) Fix rtodotxt
|
5
|
+
(B) get phil to organize +bbq
|
6
|
+
(A) Buy bread @baker +groceries
|
7
|
+
Get some coffee +groceries
|
8
|
+
"
|
9
|
+
|
10
|
+
a_list_sorted = "(A) Buy milk @supermarket +groceries
|
11
|
+
(A) Buy bread @baker +groceries
|
12
|
+
(B) get phil to organize +bbq
|
13
|
+
(C) Fix rtodotxt
|
14
|
+
Get some coffee +groceries
|
15
|
+
"
|
16
|
+
|
17
|
+
b_list = "(C) Fix rtodotxt
|
18
|
+
x 2012-03-13 get phil to organize +bbq
|
19
|
+
(A) Buy bread @baker +groceries
|
20
|
+
x 2012-03-13 Buy milk @supermarket +groceries
|
21
|
+
Get some coffee +groceries
|
22
|
+
"
|
23
|
+
|
24
|
+
b_list_sorted = "(A) Buy bread @baker +groceries
|
25
|
+
(C) Fix rtodotxt
|
26
|
+
Get some coffee +groceries
|
27
|
+
x 2012-03-13 Buy milk @supermarket +groceries
|
28
|
+
x 2012-03-13 get phil to organize +bbq
|
29
|
+
"
|
30
|
+
|
31
|
+
|
32
|
+
a_todo = "Buy milk @supermarket +groceries"
|
33
|
+
a_todo_prio = "(A) Buy milk @supermarket +groceries"
|
34
|
+
a_todo_done = "x #{Date.today.to_s} Buy milk @supermarket +groceries"
|
35
|
+
|
36
|
+
b_todo = "Get some coffee +groceries"
|
37
|
+
b_todo_done = "x #{Date.today.to_s} Get some coffee +groceries"
|
38
|
+
b_todo_prio = "(A) Get some coffee +groceries"
|
39
|
+
|
40
|
+
|
41
|
+
describe Rtodotxt::List do
|
42
|
+
|
43
|
+
it "should read a string" do
|
44
|
+
tl = Rtodotxt::List.new a_list
|
45
|
+
tl.print.should eql a_list
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should generate enumerable todos" do
|
49
|
+
tl = Rtodotxt::List.new a_list
|
50
|
+
tl.each do |t|
|
51
|
+
t.class.should eql Rtodotxt::Todo
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should sort a list by priority" do
|
56
|
+
tl = Rtodotxt::List.new a_list
|
57
|
+
tl_sorted = Rtodotxt::List.new a_list_sorted
|
58
|
+
tl.sort.should == tl_sorted
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should sort a list by done" do
|
62
|
+
tl = Rtodotxt::List.new b_list
|
63
|
+
tl_sorted = Rtodotxt::List.new b_list_sorted
|
64
|
+
tl.sort.should == tl_sorted
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
describe Rtodotxt::Todo do
|
70
|
+
|
71
|
+
it "should initialize with text" do
|
72
|
+
t = Rtodotxt::Todo.new a_todo
|
73
|
+
t.text.should eql a_todo
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should mark as done" do
|
77
|
+
t = Rtodotxt::Todo.new b_todo
|
78
|
+
t.done!.text.should eql b_todo_done
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should not change a done todo if mark is done is called" do
|
82
|
+
t = Rtodotxt::Todo.new b_todo_done
|
83
|
+
t.done!.text.should eql b_todo_done
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should mark as done with priority removed" do
|
87
|
+
t = Rtodotxt::Todo.new a_todo_prio
|
88
|
+
t.done!.text.should eql a_todo_done
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should set priority" do
|
92
|
+
t = Rtodotxt::Todo.new b_todo
|
93
|
+
t.prio!("A").should eql b_todo_prio
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should unset priority" do
|
97
|
+
t = Rtodotxt::Todo.new b_todo_prio
|
98
|
+
t.prio!("").should eql b_todo
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should raise Argument error on illegal priority" do
|
102
|
+
t = Rtodotxt::Todo.new b_todo_prio
|
103
|
+
lambda { t.prio!("ABC") }.should raise_error
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should give its contexts" do
|
107
|
+
t = Rtodotxt::Todo.new "(C) +bbq @supermarket go +get some +bbq stuff @home for @home"
|
108
|
+
t.contexts.should eql ["supermarket", "home"]
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should return its projects" do
|
112
|
+
t = Rtodotxt::Todo.new "(C) +bbq @supermarket go +get some +bbq stuff @home for @home"
|
113
|
+
t.projects.should eql ["bbq", "get"]
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should return its priority" do
|
117
|
+
t = Rtodotxt::Todo.new "(C) something"
|
118
|
+
t.prio.should eql "C"
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should return empty string for no priority" do
|
122
|
+
t = Rtodotxt::Todo.new "something"
|
123
|
+
t.prio.should eql ""
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
it "should determine if a todo is done" do
|
128
|
+
t = Rtodotxt::Todo.new a_todo_done
|
129
|
+
t.done?.should eql true
|
130
|
+
t = Rtodotxt::Todo.new a_todo
|
131
|
+
t.done?.should eql false
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should evaluate lower prio to be smaller" do
|
135
|
+
t_c = Rtodotxt::Todo.new "(C) something"
|
136
|
+
t_b = Rtodotxt::Todo.new "(B) something"
|
137
|
+
t_c.should be > t_b
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should evaluate lower equal and bigger accordingly" do
|
141
|
+
t_d = Rtodotxt::Todo.new a_todo_done
|
142
|
+
t_p = Rtodotxt::Todo.new a_todo_prio
|
143
|
+
t_n = Rtodotxt::Todo.new a_todo
|
144
|
+
t_d.should be > t_p
|
145
|
+
t_d.should be > t_n
|
146
|
+
t_p.should be < t_n
|
147
|
+
t_p.should be < t_d
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rtodotxt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Philipp Fehre
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.13.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.13.0
|
27
|
+
description: Working with todo.txt file in ruby
|
28
|
+
email:
|
29
|
+
- philipp.fehre@googlemail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .autotest
|
35
|
+
- .gitignore
|
36
|
+
- .rspec
|
37
|
+
- Gemfile
|
38
|
+
- LICENSE
|
39
|
+
- README.md
|
40
|
+
- Rakefile
|
41
|
+
- lib/rtodotxt.rb
|
42
|
+
- lib/rtodotxt/version.rb
|
43
|
+
- rtodotxt.gemspec
|
44
|
+
- spec/rtodotxt_spec.rb
|
45
|
+
- spec/spec_helper.rb
|
46
|
+
homepage: http://github.com/sideshowcoder/rtodotxt
|
47
|
+
licenses: []
|
48
|
+
metadata: {}
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 2.0.0
|
66
|
+
signing_key:
|
67
|
+
specification_version: 4
|
68
|
+
summary: Use a todotxt formatted file in ruby
|
69
|
+
test_files:
|
70
|
+
- spec/rtodotxt_spec.rb
|
71
|
+
- spec/spec_helper.rb
|