hbtrack 0.0.3 → 0.0.4
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 +4 -4
- data/Rakefile +7 -5
- data/exe/hbtrack +2 -0
- data/lib/hbtrack/habit.rb +52 -26
- data/lib/hbtrack/habit_tracker.rb +52 -20
- data/lib/hbtrack/version.rb +1 -1
- data/lib/hbtrack.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42e80f09161cc593527386d9d47f73364e6a69b6
|
4
|
+
data.tar.gz: 36ad20ec43500749a0261fa496e363efca27a648
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74bfb5ee6b795b000c856b851d88ef36a5ab634d4a07f5eeaedd8811de261778ebe146e2d5e922b70f0e08487783d2b84937c197d105b3626d10f03cabd5e942
|
7
|
+
data.tar.gz: b9b51aec3bd911037382fea14cf13a07ea115e68f00272a1375132f94c22ae37892d243d6ec0322962e74523941e904396e9532c9992e1bf7ea3b49f351b57fd
|
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rake/testtask'
|
3
5
|
|
4
6
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs <<
|
6
|
-
t.libs <<
|
7
|
+
t.libs << 'test'
|
8
|
+
t.libs << 'lib'
|
7
9
|
t.test_files = FileList['test/**/*_test.rb']
|
8
10
|
end
|
9
11
|
|
10
|
-
task :
|
12
|
+
task default: :test
|
data/exe/hbtrack
CHANGED
data/lib/hbtrack/habit.rb
CHANGED
@@ -5,7 +5,7 @@ require 'hbtrack/cli'
|
|
5
5
|
|
6
6
|
module Hbtrack
|
7
7
|
# Habit provide a rich library to track the
|
8
|
-
# progress of your habit.
|
8
|
+
# progress of your habit.
|
9
9
|
class Habit
|
10
10
|
attr_accessor :name
|
11
11
|
attr_reader :progress
|
@@ -42,8 +42,9 @@ module Hbtrack
|
|
42
42
|
habit_name = arr.shift
|
43
43
|
hash = {}
|
44
44
|
arr.each do |s|
|
45
|
-
a = s.split(':')
|
46
|
-
|
45
|
+
a = s.split(': ')
|
46
|
+
value = a[1] ? a[1] : ''
|
47
|
+
hash[a[0].to_sym] = value
|
47
48
|
end
|
48
49
|
Habit.new(habit_name, hash)
|
49
50
|
end
|
@@ -53,7 +54,7 @@ module Hbtrack
|
|
53
54
|
|
54
55
|
def initialize(name,
|
55
56
|
progress = {
|
56
|
-
Habit.get_progress_key_from(Date.today) => '
|
57
|
+
Habit.get_progress_key_from(Date.today) => ''
|
57
58
|
})
|
58
59
|
@name = name
|
59
60
|
@progress = progress
|
@@ -63,9 +64,19 @@ module Hbtrack
|
|
63
64
|
name.length
|
64
65
|
end
|
65
66
|
|
67
|
+
def latest_key
|
68
|
+
Habit.get_progress_key_from(Date.today)
|
69
|
+
end
|
70
|
+
|
66
71
|
def latest_progress
|
67
|
-
|
68
|
-
|
72
|
+
progress[latest_key]
|
73
|
+
end
|
74
|
+
|
75
|
+
def longest_month
|
76
|
+
key = progress.keys.max_by do |x|
|
77
|
+
get_month_from(x).length
|
78
|
+
end
|
79
|
+
get_month_from(key)
|
69
80
|
end
|
70
81
|
|
71
82
|
def done(done = true, date = Date.today)
|
@@ -75,66 +86,81 @@ module Hbtrack
|
|
75
86
|
end
|
76
87
|
|
77
88
|
def pretty_print_all
|
78
|
-
@progress.map do |key,
|
79
|
-
|
89
|
+
@progress.map do |key, _value|
|
90
|
+
space = longest_month.length - get_month_from(key).length
|
91
|
+
convert_key_to_date(key, space) +
|
92
|
+
pretty_print_progress(key)
|
80
93
|
end.join("\n")
|
81
94
|
end
|
82
95
|
|
83
96
|
def pretty_print_latest(no_of_space = 0)
|
84
97
|
name.to_s + ' ' * no_of_space + ' : ' +
|
85
|
-
pretty_print_progress(
|
98
|
+
pretty_print_progress(latest_key)
|
86
99
|
end
|
87
100
|
|
88
|
-
def pretty_print_progress(
|
89
|
-
stat =
|
101
|
+
def pretty_print_progress(key)
|
102
|
+
stat = progress[key].split('').map do |x|
|
90
103
|
x == '0' ? Hbtrack::CLI.red('*') : Hbtrack::CLI.green('*')
|
91
104
|
end.join('')
|
92
|
-
stat
|
105
|
+
stat + ' ' * (32 - progress[key].size) +
|
106
|
+
one_liner_progress_stat_output_for(key)
|
107
|
+
end
|
108
|
+
|
109
|
+
def convert_key_to_date(key, no_of_space)
|
110
|
+
year = key.to_s.split(",")[0]
|
111
|
+
' ' * no_of_space + get_month_from(key) +
|
112
|
+
" #{year}" + " : "
|
93
113
|
end
|
94
114
|
|
95
|
-
def
|
115
|
+
def get_month_from(key)
|
96
116
|
key = key.to_s.split(',')
|
97
|
-
|
117
|
+
Date::MONTHNAMES[key[1].to_i]
|
98
118
|
end
|
99
119
|
|
100
120
|
# Get all of the progress of the habit in string form
|
101
121
|
#
|
102
122
|
# Example:
|
103
|
-
#
|
123
|
+
#
|
104
124
|
# habit.progress_output
|
105
125
|
# # => "2017,5: 0010001010\n2017,6: 000010010\n"
|
106
126
|
#
|
107
127
|
def progress_output
|
108
128
|
arr = @progress.map do |key, value|
|
109
|
-
"#{key}
|
129
|
+
"#{key}: #{value}\n"
|
110
130
|
end
|
111
131
|
arr.join('')
|
112
132
|
end
|
113
133
|
|
114
134
|
def progress_stat
|
115
|
-
@progress.map do |key,
|
116
|
-
convert_key_to_date(key) + "\n" +
|
117
|
-
|
135
|
+
@progress.map do |key, _value|
|
136
|
+
convert_key_to_date(key, 0) + "\n" +
|
137
|
+
progress_stat_output_for(key)
|
118
138
|
end.join("\n")
|
119
139
|
end
|
120
140
|
|
141
|
+
def one_liner_progress_stat_output_for(key)
|
142
|
+
hash = progress_stat_for(key)
|
143
|
+
"(All: #{progress[key].size}," \
|
144
|
+
" Done: #{hash[:done]}, Undone: #{hash[:undone]})"
|
145
|
+
end
|
146
|
+
|
121
147
|
def progress_stat_output_for(key)
|
122
148
|
hash = progress_stat_for(key)
|
123
149
|
Hbtrack::CLI.green("Done: #{hash[:done]}") + "\n" +
|
124
|
-
|
150
|
+
Hbtrack::CLI.red("Undone: #{hash[:undone]}") + "\n"
|
125
151
|
end
|
126
152
|
|
127
153
|
# Get the stat of the progress.
|
128
|
-
#
|
154
|
+
#
|
129
155
|
# key - Key for the progress (hash)
|
130
156
|
#
|
131
157
|
# Example:
|
132
|
-
#
|
158
|
+
#
|
133
159
|
# habit.progress_stat_for("2017,5".to_sym)
|
134
160
|
# # => { done: 5, undone: 2 }
|
135
161
|
def progress_stat_for(key)
|
136
|
-
undone = @progress[key].split(
|
137
|
-
done = @progress[key].
|
162
|
+
undone = @progress[key].split('').count { |x| x == '0' }
|
163
|
+
done = @progress[key].length - undone
|
138
164
|
{ done: done, undone: undone }
|
139
165
|
end
|
140
166
|
|
@@ -147,11 +173,11 @@ module Hbtrack
|
|
147
173
|
private
|
148
174
|
|
149
175
|
def initialize_progress_hash_from(key)
|
150
|
-
@progress[key] = '
|
176
|
+
@progress[key] = '' unless @progress.key? key
|
151
177
|
end
|
152
178
|
|
153
179
|
def update_progress_for(key, day, done)
|
154
|
-
i = day - @progress[key].length
|
180
|
+
i = day - @progress[key].length - 1
|
155
181
|
result = @progress[key].split('')
|
156
182
|
i.times { result << '0' }
|
157
183
|
result[day] = done ? '1' : '0'
|
@@ -47,7 +47,7 @@ module Hbtrack
|
|
47
47
|
@habits.max_by(&:name_length).name
|
48
48
|
end
|
49
49
|
|
50
|
-
def method_missing(
|
50
|
+
def method_missing(*args)
|
51
51
|
HabitTracker.help
|
52
52
|
end
|
53
53
|
|
@@ -62,20 +62,28 @@ module Hbtrack
|
|
62
62
|
def list(args)
|
63
63
|
habit_name, _options = parse_options(args)
|
64
64
|
habit = find(habit_name) do
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
if habit_name.nil?
|
66
|
+
list_all_habits
|
67
|
+
else
|
68
|
+
raise_habit_not_found(habit_name)
|
68
69
|
end
|
69
70
|
return
|
70
71
|
end
|
71
72
|
puts habit.pretty_print_all
|
72
73
|
end
|
73
74
|
|
75
|
+
def list_all_habits
|
76
|
+
@habits.each_with_index do |h, index|
|
77
|
+
space = longest_name.length - h.name_length
|
78
|
+
puts "#{index + 1}. #{h.pretty_print_latest(space)}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
74
82
|
def add(args)
|
75
83
|
habit_name, _options = parse_options(args)
|
76
84
|
find(habit_name) do
|
77
85
|
habit = create(habit_name)
|
78
|
-
save_to_file(habit,
|
86
|
+
save_to_file(habit, 'Add') unless habit.nil?
|
79
87
|
return
|
80
88
|
end
|
81
89
|
puts Hbtrack::CLI.blue("#{habit_name} already existed!")
|
@@ -85,7 +93,7 @@ module Hbtrack
|
|
85
93
|
habit_name, options = parse_options(args)
|
86
94
|
day = get_day_based_on(options)
|
87
95
|
habit = find_or_create(habit_name)
|
88
|
-
save_to_file(habit,
|
96
|
+
save_to_file(habit, 'Done') do
|
89
97
|
habit.done(true, day)
|
90
98
|
end
|
91
99
|
end
|
@@ -93,34 +101,39 @@ module Hbtrack
|
|
93
101
|
def undone(args)
|
94
102
|
habit_name, options = parse_options(args)
|
95
103
|
day = get_day_based_on(options)
|
96
|
-
habit = find(habit_name) {
|
97
|
-
save_to_file(habit,
|
104
|
+
habit = find(habit_name) { raise_if_habit_error(habit_name) }
|
105
|
+
save_to_file(habit, 'Undone', 'blue') do
|
98
106
|
habit.done(false, day)
|
99
107
|
end
|
100
108
|
end
|
101
109
|
|
102
110
|
def remove(args)
|
103
111
|
habit_name, _options = parse_options(args)
|
104
|
-
habit = find(habit_name) {
|
105
|
-
save_to_file(habit,
|
112
|
+
habit = find(habit_name) { raise_if_habit_error(habit_name) }
|
113
|
+
save_to_file(habit, 'Remove', 'blue') do
|
106
114
|
@habits.delete(habit)
|
107
|
-
end
|
115
|
+
end
|
108
116
|
end
|
109
117
|
|
110
118
|
def find_or_create(habit_name)
|
111
119
|
habit = find(habit_name) do
|
112
|
-
habit = create(habit_name)
|
120
|
+
habit = create(habit_name)
|
113
121
|
return habit
|
114
122
|
end
|
115
123
|
end
|
116
124
|
|
117
125
|
def create(habit_name)
|
118
|
-
unless
|
126
|
+
unless invalid_habit_name?(habit_name)
|
119
127
|
habit = Hbtrack::Habit.new(habit_name)
|
120
128
|
@habits << habit
|
121
129
|
return habit
|
122
130
|
end
|
123
|
-
|
131
|
+
|
132
|
+
if habit_name && habit_name.length > 11
|
133
|
+
raise_habit_name_too_long
|
134
|
+
else
|
135
|
+
raise_invalid_arguments
|
136
|
+
end
|
124
137
|
end
|
125
138
|
|
126
139
|
def parse_options(args)
|
@@ -134,10 +147,31 @@ module Hbtrack
|
|
134
147
|
Date.today - 1
|
135
148
|
end
|
136
149
|
|
150
|
+
def raise_error_msg(msg)
|
151
|
+
puts Hbtrack::CLI.red msg
|
152
|
+
return
|
153
|
+
end
|
154
|
+
|
155
|
+
def raise_if_habit_error(habit_name)
|
156
|
+
return raise_invalid_arguments if habit_name.nil?
|
157
|
+
raise_habit_not_found(habit_name)
|
158
|
+
end
|
159
|
+
|
137
160
|
def raise_habit_not_found(habit_name)
|
138
|
-
|
139
|
-
|
140
|
-
|
161
|
+
raise_error_msg "Invalid argument: #{habit_name} not found."
|
162
|
+
end
|
163
|
+
|
164
|
+
def raise_invalid_arguments
|
165
|
+
raise_error_msg "Invalid argument: habit_name is expected."
|
166
|
+
end
|
167
|
+
|
168
|
+
def raise_habit_name_too_long
|
169
|
+
raise_error_msg "habit_name too long."
|
170
|
+
end
|
171
|
+
|
172
|
+
def invalid_habit_name?(habit_name)
|
173
|
+
habit_name.nil? || habit_name =~ /\s+/ ||
|
174
|
+
habit_name.length > 11
|
141
175
|
end
|
142
176
|
|
143
177
|
def save
|
@@ -148,7 +182,7 @@ module Hbtrack
|
|
148
182
|
end
|
149
183
|
end
|
150
184
|
|
151
|
-
def save_to_file(habit, action, color =
|
185
|
+
def save_to_file(habit, action, color = 'green')
|
152
186
|
unless habit.nil?
|
153
187
|
yield if block_given?
|
154
188
|
save
|
@@ -158,5 +192,3 @@ module Hbtrack
|
|
158
192
|
end
|
159
193
|
end
|
160
194
|
end
|
161
|
-
|
162
|
-
|
data/lib/hbtrack/version.rb
CHANGED
data/lib/hbtrack.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hbtrack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kw7oe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.0'
|
55
|
-
description: Habit Tracker CLI
|
55
|
+
description: Habit Tracker CLI. A CLI to track your habits.
|
56
56
|
email:
|
57
57
|
- choongkwern@hotmail.com
|
58
58
|
executables:
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
version: '0'
|
95
95
|
requirements: []
|
96
96
|
rubyforge_project:
|
97
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.6.11
|
98
98
|
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: A CLI to track your habits.
|