quirk 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.md +50 -14
  2. data/quirk +3 -3
  3. data/quirk.rb +30 -4
  4. data/quirk_test.rb +68 -3
  5. metadata +3 -3
data/README.md CHANGED
@@ -6,32 +6,32 @@ Quirk is a command line utility for tracking good and bad habits.
6
6
  Installation
7
7
  ============
8
8
 
9
- % gem install quirk
9
+ $ gem install quirk
10
10
 
11
11
  Then configure your habits in a plaintext file:
12
12
 
13
- % quirk -e
13
+ $ quirk -e
14
14
  mile-run: monday, wednesday, thursday
15
15
  walk-dog: everyday
16
- ; comments start with semi-colons
17
- ^quit-tv: friday
16
+ ^quit-tv: friday ; comments start with semi-colons
17
+
18
+ By default, all this does is edit the `~/.quirk` file. You can configure
19
+ which file to use by setting the environment variable `QUIRKFILE`.
18
20
 
19
21
  If a habit is prefixed with `^`, it means you're trying to break that habit.
20
22
  In this case you're trying to quit TV on Fridays.
21
23
 
22
- By default, all this does is edit the `~/.quirk` file. You can configure
23
- which file to use by setting the environment variable `QUIRKFILE`.
24
24
 
25
25
  Usage
26
26
  =====
27
27
 
28
28
  When you've done something, mark it with:
29
29
 
30
- % quirk -m mile-run
30
+ $ quirk -m mile-run
31
31
 
32
32
  To see a single habit (green days are good, red is bad):
33
33
 
34
- % quirk -c mile-run
34
+ $ quirk -c mile-run
35
35
  Jan 2012
36
36
  Su Mo Tu We Th Fr Sa
37
37
  1 2 3 4 5 6 7
@@ -42,15 +42,21 @@ To see a single habit (green days are good, red is bad):
42
42
 
43
43
  Looking for a specific year?
44
44
 
45
- % quirk mile-run -y 2011
45
+ $ quirk mile-run -y 2011
46
46
 
47
47
  See all of your current streaks:
48
48
 
49
- % quirk -s
49
+ $ quirk
50
50
  17 mile-run
51
51
  3 walk-dog
52
52
  -3 quit-tv
53
53
 
54
+ See which habits are pending for today:
55
+
56
+ $ quirk -t
57
+ mile-run
58
+ walk-dog
59
+
54
60
  Habits are stored in plaintext in `~/.quirk`. You can use `quirk -e` to
55
61
  add/remove entries. Note that habits start on the day of the first mark
56
62
  by default. You can also specify the first day using `^`:
@@ -59,9 +65,20 @@ by default. You can also specify the first day using `^`:
59
65
  2012/01/01 ^quit-tv
60
66
 
61
67
  The first line means you walked the dog on `1/1`. The second line means you
62
- started the habit of quitting TV. This is especailly handy for starting
68
+ started the habit of quitting TV. This is especially handy for starting
63
69
  quitting habits on a green day.
64
70
 
71
+ You can specify the last day for a habit using `$`:
72
+
73
+ 2012/01/01 ^quit-tv
74
+ 2012/01/30 $quit-tv
75
+ 2012/01/15 quit-tv
76
+ 2012/01/16 quit-tv
77
+
78
+ The first line means on `1/1`, I'm going to start quitting TV. The second line
79
+ means I'll stop the habit on `1/30`, it's just a temporary goal for 1 month.
80
+ The last two lines means I watched TV on `1/15` and `1/16` (two red days).
81
+
65
82
  Zsh Tab Completion
66
83
  ==================
67
84
 
@@ -72,12 +89,31 @@ Here's an example zsh completion function:
72
89
 
73
90
  Put this into your `site-functions` directory (wherever `$fpath` points to):
74
91
 
75
- % echo $fpath
92
+ $ echo $fpath
76
93
  /usr/share/zsh/site-functions /usr/share/zsh/4.3.11/functions
77
- % sudo vim /usr/share/zsh/site-functions/_quirk
94
+ $ vim /usr/share/zsh/site-functions/_quirk
95
+
96
+ Tmux and Other Notifications Integration
97
+ ========================================
98
+
99
+ Use `quirk -t` to see which habits are pending for today. Habits are separated
100
+ by a newline. Use `xargs` and/or `tr` to format as you see fit:
101
+
102
+ $ quirk -t
103
+ mile-run
104
+ wlak-dog
105
+ $ quirk -t | xargs
106
+ mile-run walk-dog
107
+ $ quirk -t | xargs | tr " " ,
108
+ mile-run,walk-dog
109
+
110
+ This is useful for `tmux`'s status as a reminder of which habits are pending.
111
+ Put this in your `.tmux.conf` file:
112
+
113
+ set -g status-right '#[fg=yellow]#(quirk -t | xargs | tr " " ,)'
78
114
 
79
115
  License
80
116
  =======
81
117
 
82
- Copyright 2012 Hugh Bien - http://hughbien.com.
118
+ Copyright Hugh Bien - http://hughbien.com.
83
119
  Released under BSD License, see LICENSE.md for more info.
data/quirk CHANGED
@@ -5,7 +5,7 @@ require File.expand_path('quirk', File.dirname(__FILE__))
5
5
  ARGV.options do |o|
6
6
  begin
7
7
  app = Quirk::App.new
8
- action = nil
8
+ action = 'streaks'
9
9
  o.set_summary_indent(' ')
10
10
  o.banner = "Usage: #{File.basename($0)} [OPTION]"
11
11
  o.define_head "Track good and bad habits (v#{Quirk::VERSION})"
@@ -13,11 +13,11 @@ ARGV.options do |o|
13
13
  o.on('-e', '--edit', 'edit habits') { action = [:edit] }
14
14
  o.on('-l', '--list', 'list habits') { action = [:list] }
15
15
  o.on('-m', '--mark habit', 'mark for today') { |h| action = [:mark, h] }
16
- o.on('-s', '--streaks', 'list streaks') { action = [:streaks] }
16
+ o.on('-t', '--today', 'unfinished habits for today') { action = [:today] }
17
17
  o.on('-y', '--year year', 'set calendar year') { |y| app.year = y }
18
18
  o.on('-h', '--help', 'show this help message') { puts o; exit }
19
19
  o.parse!
20
- action.nil? ? puts(o) : app.send(*action)
20
+ app.send(*action)
21
21
  rescue RuntimeError => e
22
22
  puts e.to_s
23
23
  end
data/quirk.rb CHANGED
@@ -2,7 +2,7 @@ require 'date'
2
2
  require 'colorize'
3
3
 
4
4
  module Quirk
5
- VERSION = '0.0.4'
5
+ VERSION = '0.0.5'
6
6
  QUIRKFILE = ENV['QUIRKFILE'] || "#{ENV['HOME']}/.quirk"
7
7
  EDITOR = ENV['EDITOR'] || 'vi'
8
8
 
@@ -39,6 +39,10 @@ module Quirk
39
39
  end
40
40
  end
41
41
 
42
+ def today
43
+ puts cal.today if cal.today !~ /^\s*$/
44
+ end
45
+
42
46
  def streaks
43
47
  puts cal.streaks
44
48
  end
@@ -75,14 +79,23 @@ module Quirk
75
79
  @first_date = date
76
80
  end
77
81
 
82
+ def mark_last!(date)
83
+ @last_date = date
84
+ end
85
+
78
86
  def first_date
79
87
  @first_date || @marks.first
80
88
  end
81
89
 
90
+ def pending?(date)
91
+ weekday = date.strftime("%w").to_i
92
+ !quitting? && days.include?(weekday) && color_on(date) != :light_green
93
+ end
94
+
82
95
  def color_on(date)
83
96
  hit_color = quitting? ? :light_red : :light_green
84
97
  miss_color = quitting? ? :light_green : :light_red
85
- last_date = Quirk.today
98
+ last_date = [@last_date, Quirk.today].compact.min
86
99
  if first_date.nil? ||
87
100
  date < first_date ||
88
101
  date > last_date ||
@@ -96,7 +109,7 @@ module Quirk
96
109
  end
97
110
 
98
111
  def streak
99
- return 0 if @marks.empty?
112
+ return 0 if first_date.nil?
100
113
 
101
114
  count = 0
102
115
  deltas = {:light_red => -1, :light_green => 1, :white => 0}
@@ -208,12 +221,24 @@ module Quirk
208
221
  original = original.sub(/^\^\s*/, '')
209
222
  habit = @habits[original] if has_habit?(original)
210
223
  habit.mark_first!(date)
224
+ elsif original =~ /^\$\s*/
225
+ original = original.sub(/^\$\s*/, '')
226
+ habit = @habits[original] if has_habit?(original)
227
+ habit.mark_last!(date)
211
228
  elsif has_habit?(original)
212
229
  @habits[original].mark!(date)
213
230
  end
214
231
  end
215
232
  end
216
233
 
234
+ def today
235
+ @habits.values.
236
+ select {|h| h.pending?(Quirk.today)}.
237
+ map(&:id).
238
+ sort.
239
+ join("\n")
240
+ end
241
+
217
242
  def streaks
218
243
  pairs = @habits.values.map do |habit|
219
244
  [habit.streak, habit.id]
@@ -227,9 +252,10 @@ module Quirk
227
252
  def self.parse(text)
228
253
  marks, habits = [], []
229
254
  text.strip.each_line do |line|
255
+ line = line.split(';')[0].to_s.strip # remove comments
230
256
  if line =~ /^\d\d\d\d\/\d\d?\/\d\d?\s+/
231
257
  marks << line
232
- elsif line !~ /^\s*$/ && line !~ /^\s*;.*$/
258
+ elsif line !~ /^\s*$/
233
259
  habits << Habit.parse(line)
234
260
  end
235
261
  end
data/quirk_test.rb CHANGED
@@ -28,6 +28,19 @@ class QuirkHabitTest < MiniTest::Unit::TestCase
28
28
  assert(habit3.quitting?)
29
29
  end
30
30
 
31
+ def test_pending
32
+ habit = Quirk::Habit.parse('running: monday')
33
+ refute(habit.pending?(Date.new(2012, 1, 1)))
34
+ assert(habit.pending?(Date.new(2012, 1, 2)))
35
+ habit.mark!(Date.new(2012, 1, 2))
36
+ refute(habit.pending?(Date.new(2012, 1, 2)))
37
+
38
+ habit2 = Quirk::Habit.parse('^quit-tv: everyday')
39
+ refute(habit.pending?(Date.new(2012, 1, 1)))
40
+ habit.mark!(Date.new(2012, 1, 1))
41
+ refute(habit.pending?(Date.new(2012, 1, 1)))
42
+ end
43
+
31
44
  def test_color_on
32
45
  habit = Quirk::Habit.parse('running: sunday, monday, wednesday, thursday')
33
46
  habit.mark!(Date.new(2012, 1, 2))
@@ -65,6 +78,51 @@ class QuirkHabitTest < MiniTest::Unit::TestCase
65
78
  assert_equal(:white, quit.color_on(Date.new(2012, 1, 6)))
66
79
  end
67
80
 
81
+ def test_color_on_last_date
82
+ habit = Quirk::Habit.parse('running: everyday')
83
+ habit.mark!(Date.new(2012, 1, 2))
84
+ habit.mark!(Date.new(2012, 1, 3))
85
+ habit.mark_last!(Date.new(2012, 1, 4))
86
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 1)))
87
+ assert_equal(:light_green, habit.color_on(Date.new(2012, 1, 2)))
88
+ assert_equal(:light_green, habit.color_on(Date.new(2012, 1, 3)))
89
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 4)))
90
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 5)))
91
+
92
+ habit.mark!(Date.new(2012, 1, 4))
93
+ habit.mark!(Date.new(2012, 1, 5))
94
+ assert_equal(:light_green, habit.color_on(Date.new(2012, 1, 4)))
95
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 5)))
96
+ end
97
+
98
+ def test_color_on_future_last_date
99
+ habit = Quirk::Habit.parse('running: everyday')
100
+ habit.mark!(Date.new(2012, 1, 2))
101
+ habit.mark!(Date.new(2012, 1, 4))
102
+ habit.mark_last!(Date.new(2012, 1, 29))
103
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 1)))
104
+ assert_equal(:light_green, habit.color_on(Date.new(2012, 1, 2)))
105
+ assert_equal(:light_red, habit.color_on(Date.new(2012, 1, 3)))
106
+ assert_equal(:light_green, habit.color_on(Date.new(2012, 1, 4)))
107
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 5)))
108
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 6)))
109
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 28)))
110
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 29)))
111
+ assert_equal(:white, habit.color_on(Date.new(2012, 1, 30)))
112
+ end
113
+
114
+ def test_color_on_quit_last_date
115
+ quit = Quirk::Habit.parse('^quit-tv: everyday')
116
+ quit.mark_first!(Date.new(2012, 1, 1))
117
+ quit.mark_last!(Date.new(2012, 1, 4))
118
+ quit.mark!(Date.new(2012, 1, 5))
119
+ assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 1)))
120
+ assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 2)))
121
+ assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 3)))
122
+ assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 4)))
123
+ assert_equal(:white, quit.color_on(Date.new(2012, 1, 5)))
124
+ end
125
+
68
126
  def test_streak
69
127
  missing = Quirk::Habit.parse('running: everyday')
70
128
  assert_equal(0, missing.streak)
@@ -103,6 +161,7 @@ class QuirkCalendarTest < MiniTest::Unit::TestCase
103
161
  @smoking = Quirk::Habit.parse('^smoking: everyday')
104
162
  @cal = Quirk::Calendar.new([@running, @walking, @smoking])
105
163
  @cal.mark!('2012/01/01 ^smoking')
164
+ @cal.mark!('2012/01/04 $smoking')
106
165
  @cal.mark!('2012/01/01 running, walk-dog')
107
166
  @cal.mark!('2012/01/02 running, walk-dog')
108
167
  end
@@ -110,10 +169,10 @@ class QuirkCalendarTest < MiniTest::Unit::TestCase
110
169
  def test_parse
111
170
  calendar = Quirk::Calendar.parse(
112
171
  "; ignore comment line\n" +
113
- "running: everyday\n" +
172
+ "running: everyday ; ignore comment\n" +
114
173
  "^smoking: everyday\n\n" +
115
174
  "; ignore comment line\n" +
116
- "2012/01/01 ^smoking\n" +
175
+ "2012/01/01 ^smoking ; ignore comment\n" +
117
176
  "2012/01/01 running\n\n")
118
177
 
119
178
  assert(calendar.has_habit?('running'))
@@ -135,7 +194,13 @@ class QuirkCalendarTest < MiniTest::Unit::TestCase
135
194
  assert_equal(Date.new(2012, 1, 1), @smoking.first_date)
136
195
  end
137
196
 
197
+ def test_today
198
+ assert_equal("running", @cal.today)
199
+ @cal.mark!('2012/01/05 running')
200
+ assert_equal("", @cal.today)
201
+ end
202
+
138
203
  def test_streaks
139
- assert_equal("-2 running\n 0 smoking\n 1 walk-dog", @cal.streaks)
204
+ assert_equal("-2 running\n 1 walk-dog\n 4 smoking", @cal.streaks)
140
205
  end
141
206
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quirk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: .
11
11
  cert_chain: []
12
- date: 2012-05-31 00:00:00.000000000 Z
12
+ date: 2013-02-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -53,8 +53,8 @@ extra_rdoc_files: []
53
53
  files:
54
54
  - quirk.rb
55
55
  - quirk_test.rb
56
- - README.md
57
56
  - LICENSE.md
57
+ - README.md
58
58
  - quirk
59
59
  - ./quirk
60
60
  homepage: https://github.com/hughbien/quirk