ptf 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 +4 -4
- data/lib/ptf.rb +5 -2
- data/lib/ptf/client.rb +4 -2
- data/lib/ptf/client/group.rb +5 -10
- data/lib/ptf/client/summary.rb +3 -3
- data/lib/ptf/client/task.rb +10 -10
- data/lib/ptf/commands/group.rb +1 -0
- data/lib/ptf/commands/group/add.rb +13 -18
- data/lib/ptf/commands/group/remove.rb +52 -0
- data/lib/ptf/commands/init.rb +19 -20
- data/lib/ptf/commands/list.rb +76 -21
- data/lib/ptf/commands/task.rb +19 -23
- data/lib/ptf/commands/task/create.rb +11 -11
- data/lib/ptf/commands/task/edit.rb +104 -20
- data/lib/ptf/data_file.rb +40 -0
- data/lib/ptf/date.rb +61 -0
- data/lib/ptf/file_system.rb +81 -0
- data/lib/ptf/group.rb +115 -0
- data/lib/ptf/metadata_file.rb +301 -0
- data/lib/ptf/version.rb +1 -1
- metadata +8 -9
- data/lib/ptf/data.rb +0 -9
- data/lib/ptf/data/data_file.rb +0 -42
- data/lib/ptf/data/group.rb +0 -107
- data/lib/ptf/data/metadata_file.rb +0 -237
- data/lib/ptf/utilities.rb +0 -28
- data/lib/ptf/utilities/date.rb +0 -63
- data/lib/ptf/utilities/file_system.rb +0 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b064a82fc522d39a16f0e27203cdfdd38a75c6fb
|
4
|
+
data.tar.gz: 162fc849a41882f39ceee43bbae6c35d1e7abbcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f348ea5ab25b189b8ac0f01a29e3a639836d17adc8c555111c3d592b67b1089e287718b771784bd5243d9711986ef94984773e70093118c1f21341a2e1c5c35c
|
7
|
+
data.tar.gz: 88e2b468612959d5e32271ed38bd14e36d22732f7a3b7f423caa8f775c045f32a27a157915f25457274fad59845667dafc46b6af6d0d861572a20ffa7d4f0dd4
|
data/lib/ptf.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'ptf/version'
|
2
2
|
require 'ptf/client'
|
3
3
|
require 'ptf/config'
|
4
|
-
require 'ptf/
|
5
|
-
require 'ptf/
|
4
|
+
require 'ptf/date'
|
5
|
+
require 'ptf/file_system'
|
6
|
+
require 'ptf/data_file'
|
7
|
+
require 'ptf/group'
|
8
|
+
require 'ptf/metadata_file'
|
6
9
|
require 'ptf/commands'
|
7
10
|
|
8
11
|
module Ptf
|
data/lib/ptf/client.rb
CHANGED
@@ -16,7 +16,7 @@ module Ptf
|
|
16
16
|
LONGDESC
|
17
17
|
option :f, :type => :boolean
|
18
18
|
def init
|
19
|
-
Ptf::Commands::Init.init(options[:f])
|
19
|
+
puts Ptf::Commands::Init.init(options[:f])
|
20
20
|
end
|
21
21
|
|
22
22
|
desc "task", "Subcommand to manage tasks"
|
@@ -26,8 +26,10 @@ module Ptf
|
|
26
26
|
subcommand "group", Group
|
27
27
|
|
28
28
|
desc "list DELIMIT", "List tasks. Given 'all' or a group name"
|
29
|
+
option :open, :type => :boolean, :aliases => :o
|
30
|
+
option :closed, :type => :boolean, :aliases => :c
|
29
31
|
def list(delimiter)
|
30
|
-
Ptf::Commands::List.list(delimiter)
|
32
|
+
puts Ptf::Commands::List.list(delimiter, options[:open], options[:closed])
|
31
33
|
end
|
32
34
|
|
33
35
|
desc "summary", "Subcommand to manage a summary of all tasks"
|
data/lib/ptf/client/group.rb
CHANGED
@@ -2,19 +2,14 @@ module Ptf
|
|
2
2
|
module Cli
|
3
3
|
class Group < Thor
|
4
4
|
|
5
|
-
desc "
|
5
|
+
desc "add GROUP ABBREVIATION", "Create a new group"
|
6
6
|
def add(group, abbrev)
|
7
|
-
Ptf::Commands::Group::Add.add(group, abbrev)
|
7
|
+
puts Ptf::Commands::Group::Add.add(group, abbrev)
|
8
8
|
end
|
9
9
|
|
10
|
-
desc "
|
11
|
-
def remove
|
12
|
-
puts
|
13
|
-
end
|
14
|
-
|
15
|
-
desc "group transfer", "Transfer a group to another"
|
16
|
-
def transfer
|
17
|
-
puts "transfer group not implemented"
|
10
|
+
desc "remove GROUP", "Remove a group"
|
11
|
+
def remove(group)
|
12
|
+
puts Ptf::Commands::Group::Remove.remove(group)
|
18
13
|
end
|
19
14
|
|
20
15
|
end
|
data/lib/ptf/client/summary.rb
CHANGED
@@ -2,17 +2,17 @@ module Ptf
|
|
2
2
|
module Cli
|
3
3
|
class Summary < Thor
|
4
4
|
|
5
|
-
desc "
|
5
|
+
desc "create", "Create a summary"
|
6
6
|
def create
|
7
7
|
puts "summary create not implemented"
|
8
8
|
end
|
9
9
|
|
10
|
-
desc "
|
10
|
+
desc "edit", "Edit summary"
|
11
11
|
def edit
|
12
12
|
puts "summary edit not implemented"
|
13
13
|
end
|
14
14
|
|
15
|
-
desc "
|
15
|
+
desc "show", "Show summary"
|
16
16
|
def show
|
17
17
|
puts "summary show not implemented"
|
18
18
|
end
|
data/lib/ptf/client/task.rb
CHANGED
@@ -2,33 +2,33 @@ module Ptf
|
|
2
2
|
module Cli
|
3
3
|
class Task < Thor
|
4
4
|
|
5
|
-
desc "
|
5
|
+
desc "create", "Create a new task"
|
6
6
|
option :title, :type => :string, :required => true, :aliases => :t
|
7
7
|
option :group, :type => :string, :aliases => :g
|
8
8
|
option :date, :type => :string, :aliases => :d
|
9
9
|
option :estimate, :type => :numeric, :aliases => :e
|
10
10
|
def create
|
11
|
-
Ptf::Commands::Task::Create.create(options[:title], options[:group], options[:date], options[:estimate])
|
11
|
+
puts Ptf::Commands::Task::Create.create(options[:title], options[:group], options[:date], options[:estimate])
|
12
12
|
end
|
13
13
|
|
14
|
-
desc "
|
14
|
+
desc "edit ID", "Edit a task"
|
15
15
|
def edit(id)
|
16
|
-
Ptf::Commands::Task::Edit.edit(id.to_i)
|
16
|
+
puts Ptf::Commands::Task::Edit.edit(id.to_i)
|
17
17
|
end
|
18
18
|
|
19
|
-
desc "
|
19
|
+
desc "show ID", "Show a task"
|
20
20
|
def show(id)
|
21
|
-
Ptf::Commands::Task.show(id)
|
21
|
+
puts Ptf::Commands::Task.show(id)
|
22
22
|
end
|
23
23
|
|
24
|
-
desc "
|
24
|
+
desc "close ID", "Mark a task a completed"
|
25
25
|
def close(id)
|
26
|
-
Ptf::Commands::Task.close(id)
|
26
|
+
puts Ptf::Commands::Task.close(id)
|
27
27
|
end
|
28
28
|
|
29
|
-
desc "
|
29
|
+
desc "reopen ID", "Reopen a closed task"
|
30
30
|
def reopen(id)
|
31
|
-
Ptf::Commands::Task.reopen(id)
|
31
|
+
puts Ptf::Commands::Task.reopen(id)
|
32
32
|
end
|
33
33
|
|
34
34
|
end
|
data/lib/ptf/commands/group.rb
CHANGED
@@ -5,41 +5,36 @@ module Ptf
|
|
5
5
|
class << self
|
6
6
|
|
7
7
|
def add(group, abbrev)
|
8
|
-
if Ptf::
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
puts "Group already exists using the abbreviation #{abbrev}."
|
13
|
-
return
|
8
|
+
if Ptf::Group.group_exist?(group)
|
9
|
+
return "Group already exists using the name #{group}."
|
10
|
+
elsif Ptf::Group.group_exist?(abbrev)
|
11
|
+
return "Group already exists using the abbreviation #{abbrev}."
|
14
12
|
end
|
15
13
|
|
16
14
|
if abbrev.length > 4
|
17
|
-
|
18
|
-
return
|
15
|
+
return "Abbreviation cannot be longer than 4 characters."
|
19
16
|
end
|
20
17
|
|
21
18
|
if group != group.downcase
|
22
|
-
|
23
|
-
return
|
19
|
+
return "Group names must be entirely lowercase."
|
24
20
|
elsif abbrev != abbrev.upcase
|
25
|
-
|
26
|
-
return
|
21
|
+
return "Group abbreviations must be entirely uppercase."
|
27
22
|
end
|
28
23
|
|
29
|
-
new_group = Ptf::
|
24
|
+
new_group = Ptf::Group.new(group, abbrev)
|
30
25
|
|
31
|
-
group_file = Ptf::
|
26
|
+
group_file = Ptf::FileSystem.group_list_file
|
32
27
|
|
33
28
|
File.open(group_file, 'a') { |f| f.write("#{new_group.to_s}\n") }
|
34
29
|
|
35
|
-
open_dir = Ptf::
|
36
|
-
closed_dir = Ptf::
|
30
|
+
open_dir = Ptf::FileSystem.metadata_open_dir
|
31
|
+
closed_dir = Ptf::FileSystem.metadata_closed_dir
|
37
32
|
|
38
33
|
[open_dir, closed_dir].each do |d|
|
39
|
-
Dir.mkdir(File.join(d, new_group.name), Ptf::
|
34
|
+
Dir.mkdir(File.join(d, new_group.name), Ptf::FileSystem.file_permission)
|
40
35
|
end
|
41
36
|
|
42
|
-
|
37
|
+
return "Added group #{new_group.to_s} successfully!"
|
43
38
|
end
|
44
39
|
|
45
40
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Ptf
|
2
|
+
module Commands
|
3
|
+
module Group
|
4
|
+
module Remove
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def remove(group)
|
8
|
+
if !Ptf::Group.group_exist?(group)
|
9
|
+
return "Group #{group} does not exist. Add it with ptf group add GROUP ABBREVIATION."
|
10
|
+
end
|
11
|
+
|
12
|
+
group = Ptf::Group.get_group(group)
|
13
|
+
|
14
|
+
if group.is_default?
|
15
|
+
return "#{group.to_s} is the default group. It cannot be removed."
|
16
|
+
end
|
17
|
+
|
18
|
+
# Prompt for user confirmation
|
19
|
+
puts "Are you sure you want to remove #{group.to_s}? This will delete ALL tasks associated with this group."
|
20
|
+
confirm = STDIN.gets.chomp
|
21
|
+
|
22
|
+
if confirm.downcase != "y" && confirm.downcase != "yes"
|
23
|
+
return "Group removal aborted."
|
24
|
+
end
|
25
|
+
|
26
|
+
# Remove from group_list
|
27
|
+
tmp_file = "#{Ptf::FileSystem.group_list_file}.tmp"
|
28
|
+
File.open(Ptf::FileSystem.group_list_file, "r") do |original|
|
29
|
+
File.open(tmp_file, "w") do |tmp|
|
30
|
+
original.each_line do |line|
|
31
|
+
tmp.write(line) unless line.gsub(/\s+/, "") == group.to_s
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
File.rename(tmp_file, Ptf::FileSystem.group_list_file)
|
37
|
+
|
38
|
+
# Remove from info/open/[group]
|
39
|
+
FileUtils.rm_r File.join(Ptf::FileSystem.metadata_open_dir, group.name)
|
40
|
+
|
41
|
+
# Remove from info/closed/[group]
|
42
|
+
FileUtils.rm_r File.join(Ptf::FileSystem.metadata_closed_dir, group.name)
|
43
|
+
|
44
|
+
return "Group removed."
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
data/lib/ptf/commands/init.rb
CHANGED
@@ -5,57 +5,56 @@ module Ptf
|
|
5
5
|
|
6
6
|
def init(force_override = false)
|
7
7
|
|
8
|
-
default_permissions = Ptf::
|
9
|
-
default_group = Ptf::
|
10
|
-
default_counter = Ptf::
|
8
|
+
default_permissions = Ptf::FileSystem.file_permission
|
9
|
+
default_group = Ptf::Group.default_group
|
10
|
+
default_counter = Ptf::FileSystem.id_counter_starting_content
|
11
11
|
|
12
|
-
base_dir = Ptf::
|
12
|
+
base_dir = Ptf::FileSystem.base_dir
|
13
13
|
|
14
|
+
return_prefix = ""
|
14
15
|
if Dir.exist? base_dir
|
15
16
|
if force_override
|
16
|
-
|
17
|
-
|
17
|
+
FileUtils.rm_r base_dir
|
18
|
+
return_prefix = "PTF workspace existed, erasing...\n"
|
18
19
|
else
|
19
|
-
|
20
|
-
return
|
20
|
+
return "A PTF workspace has already been initialized."
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
begin
|
25
25
|
Dir.mkdir(base_dir, default_permissions)
|
26
26
|
|
27
|
-
info_dir = Ptf::
|
27
|
+
info_dir = Ptf::FileSystem.metadata_dir
|
28
28
|
Dir.mkdir(info_dir, default_permissions)
|
29
29
|
|
30
|
-
data_dir = Ptf::
|
30
|
+
data_dir = Ptf::FileSystem.data_dir
|
31
31
|
Dir.mkdir(data_dir, default_permissions)
|
32
32
|
|
33
|
-
tmp_dir = Ptf::
|
33
|
+
tmp_dir = Ptf::FileSystem.tmp_dir
|
34
34
|
Dir.mkdir(tmp_dir, default_permissions)
|
35
35
|
|
36
|
-
open_dir = Ptf::
|
36
|
+
open_dir = Ptf::FileSystem.metadata_open_dir
|
37
37
|
Dir.mkdir(open_dir, default_permissions)
|
38
38
|
|
39
|
-
closed_dir = Ptf::
|
39
|
+
closed_dir = Ptf::FileSystem.metadata_closed_dir
|
40
40
|
Dir.mkdir(closed_dir, default_permissions)
|
41
41
|
|
42
42
|
Dir.mkdir(File.join(open_dir, default_group.name), default_permissions)
|
43
43
|
Dir.mkdir(File.join(closed_dir, default_group.name), default_permissions)
|
44
44
|
|
45
|
-
counter_file = File.new(Ptf::
|
45
|
+
counter_file = File.new(Ptf::FileSystem.id_counter_file, "w")
|
46
46
|
counter_file.puts default_counter
|
47
47
|
counter_file.close
|
48
48
|
|
49
|
-
group_file = File.new(Ptf::
|
49
|
+
group_file = File.new(Ptf::FileSystem.group_list_file, "w")
|
50
50
|
group_file.puts default_group.to_s
|
51
51
|
group_file.close
|
52
|
-
rescue
|
53
|
-
|
54
|
-
|
55
|
-
raise e
|
52
|
+
rescue
|
53
|
+
FileUtils.rm_r base_dir
|
54
|
+
return return_prefix + "Failed to create PTF workspace."
|
56
55
|
end
|
57
56
|
|
58
|
-
|
57
|
+
return return_prefix + "Created PTF workspace at #{base_dir} successfully!"
|
59
58
|
end
|
60
59
|
|
61
60
|
end
|
data/lib/ptf/commands/list.rb
CHANGED
@@ -3,24 +3,41 @@ module Ptf
|
|
3
3
|
module List
|
4
4
|
class << self
|
5
5
|
|
6
|
-
def get_metadata_for_group(group)
|
7
|
-
raise ArgumentError, "Group #{group} does not exist." unless Ptf::
|
6
|
+
def get_metadata_for_group(group, flag)
|
7
|
+
raise ArgumentError, "Group #{group} does not exist." unless Ptf::Group.group_exist?(group)
|
8
8
|
|
9
|
-
group_name = Ptf::
|
10
|
-
open_group_path = File.join(Ptf::
|
9
|
+
group_name = Ptf::Group.get_group(group).name
|
10
|
+
open_group_path = File.join(Ptf::FileSystem.metadata_open_dir, group_name)
|
11
11
|
open_group_dir = Dir.new(open_group_path)
|
12
|
-
|
12
|
+
closed_group_path = File.join(Ptf::FileSystem.metadata_closed_dir, group_name)
|
13
|
+
closed_group_dir = Dir.new(closed_group_path)
|
14
|
+
|
15
|
+
open_tasks = []
|
16
|
+
closed_tasks = []
|
17
|
+
if flag == :open || flag == :both
|
18
|
+
open_group_dir.to_a.each do |file|
|
19
|
+
path = File.join(open_group_path, file)
|
20
|
+
|
21
|
+
if File.file? path
|
22
|
+
open_tasks.push Ptf::MetadataFile.create_from_file(path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
13
26
|
|
14
|
-
|
15
|
-
|
27
|
+
if flag == :closed || flag == :both
|
28
|
+
closed_group_dir.to_a.each do |file|
|
29
|
+
path = File.join(closed_group_path, file)
|
16
30
|
|
17
|
-
|
31
|
+
if File.file? path
|
32
|
+
closed_tasks.push Ptf::MetadataFile.create_from_file(path)
|
33
|
+
end
|
34
|
+
end
|
18
35
|
end
|
19
36
|
|
20
|
-
open_tasks
|
37
|
+
[open_tasks, closed_tasks]
|
21
38
|
end
|
22
39
|
|
23
|
-
def
|
40
|
+
def sort_open_task_arr(task_arr)
|
24
41
|
sorted_arr = task_arr
|
25
42
|
|
26
43
|
sorted_arr.sort! do |a,b|
|
@@ -38,10 +55,20 @@ module Ptf
|
|
38
55
|
sorted_arr
|
39
56
|
end
|
40
57
|
|
41
|
-
def
|
58
|
+
def sort_closed_task_arr(task_arr)
|
59
|
+
sorted_arr = task_arr
|
60
|
+
|
61
|
+
sorted_arr.sort! do |a,b|
|
62
|
+
b.completed_at <=> a.completed_at
|
63
|
+
end
|
64
|
+
|
65
|
+
sorted_arr
|
66
|
+
end
|
67
|
+
|
68
|
+
def generate_list_display(open, closed)
|
42
69
|
list_display = ""
|
43
70
|
first = true, past_due = false, have_due_date = true
|
44
|
-
|
71
|
+
open.each do |t|
|
45
72
|
if have_due_date && t.due_date.nil?
|
46
73
|
have_due_date = false
|
47
74
|
list_display += "\n" unless first
|
@@ -65,23 +92,51 @@ module Ptf
|
|
65
92
|
list_display += "#{t.due_date_list_format} #{t.title} (#{t.group.abbreviation} #{t.id})\n"
|
66
93
|
end
|
67
94
|
|
95
|
+
show_closed_banner = true
|
96
|
+
closed.each do |t|
|
97
|
+
if show_closed_banner
|
98
|
+
list_display += "\n" unless list_display == ""
|
99
|
+
list_display += "=========== Closed ===========\n\n"
|
100
|
+
show_closed_banner = false
|
101
|
+
end
|
102
|
+
|
103
|
+
list_display += "#{t.completed_at_list_format} #{t.title} (#{t.group.abbreviation} #{t.id})\n"
|
104
|
+
end
|
105
|
+
|
68
106
|
list_display
|
69
107
|
end
|
70
108
|
|
71
|
-
def list(delimiter)
|
72
|
-
if
|
73
|
-
|
109
|
+
def list(delimiter, open, closed)
|
110
|
+
if open && closed
|
111
|
+
flag = :both
|
112
|
+
elsif closed
|
113
|
+
flag = :closed
|
74
114
|
else
|
75
|
-
|
76
|
-
|
77
|
-
|
115
|
+
flag = :open
|
116
|
+
end
|
117
|
+
|
118
|
+
if delimiter.downcase == "all"
|
119
|
+
all_groups = Ptf::Group.all_groups
|
120
|
+
|
121
|
+
open_tasks = []
|
122
|
+
closed_tasks = []
|
123
|
+
all_groups.each do |g|
|
124
|
+
open, closed = get_metadata_for_group(g.name, flag)
|
125
|
+
open_tasks.concat open
|
126
|
+
closed_tasks.concat closed
|
78
127
|
end
|
79
128
|
|
80
|
-
|
81
|
-
|
129
|
+
else
|
130
|
+
if !Ptf::Group.group_exist?(delimiter)
|
131
|
+
return "Group #{delimiter} does not exist."
|
132
|
+
end
|
82
133
|
|
83
|
-
|
134
|
+
open_tasks, closed_tasks = get_metadata_for_group(delimiter, flag)
|
84
135
|
end
|
136
|
+
|
137
|
+
open_tasks = sort_open_task_arr(open_tasks)
|
138
|
+
closed_tasks = sort_closed_task_arr(closed_tasks)
|
139
|
+
return generate_list_display(open_tasks, closed_tasks)
|
85
140
|
end
|
86
141
|
|
87
142
|
end
|