quirk 0.0.5 → 0.0.6

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0c95eaa5792bfc25d6564edb67b4d89886b7bb15
4
+ data.tar.gz: 3dbe38d53f23a061f031a64d01f94ed6497b4a27
5
+ SHA512:
6
+ metadata.gz: 52846f87cdb6eab06d4a28c01549eec005abf6d677619d7cbbc8d474d63dd26e108a60055e83a134285a20b857872a86e4012ba1e198c5342784429e2f9d6d38
7
+ data.tar.gz: 66f1b30d10f5aaafdfa584108622cba75dca66cb93c7d6253d669339bdcb4cd7a69df69a945db4793e1cbed3aafd57ccd51acd877c408f7b849ec43f8c26c9e9
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012, Hugh Bien
1
+ Copyright (c) Hugh Bien
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
data/README.md CHANGED
@@ -1,29 +1,21 @@
1
- Description
2
- ===========
1
+ # Description
3
2
 
4
3
  Quirk is a command line utility for tracking good and bad habits.
5
4
 
6
- Installation
7
- ============
5
+ # Installation
8
6
 
9
7
  $ gem install quirk
10
8
 
11
9
  Then configure your habits in a plaintext file:
12
10
 
13
11
  $ quirk -e
14
- mile-run: monday, wednesday, thursday
12
+ mile-run: monday, wednesday, thursday ; comments start with semi-colons
15
13
  walk-dog: everyday
16
- ^quit-tv: friday ; comments start with semi-colons
17
14
 
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`.
15
+ By default, all this does is edit the `~/.quirk` file. You can configure which file to use by
16
+ setting the environment variable `QUIRKFILE`.
20
17
 
21
- If a habit is prefixed with `^`, it means you're trying to break that habit.
22
- In this case you're trying to quit TV on Fridays.
23
-
24
-
25
- Usage
26
- =====
18
+ # Usage
27
19
 
28
20
  When you've done something, mark it with:
29
21
 
@@ -42,78 +34,28 @@ To see a single habit (green days are good, red is bad):
42
34
 
43
35
  Looking for a specific year?
44
36
 
45
- $ quirk mile-run -y 2011
37
+ $ quirk -c mile-run -y 2011
46
38
 
47
39
  See all of your current streaks:
48
40
 
49
41
  $ quirk
50
42
  17 mile-run
51
43
  3 walk-dog
52
- -3 quit-tv
53
-
54
- See which habits are pending for today:
55
-
56
- $ quirk -t
57
- mile-run
58
- walk-dog
59
44
 
60
- Habits are stored in plaintext in `~/.quirk`. You can use `quirk -e` to
61
- add/remove entries. Note that habits start on the day of the first mark
62
- by default. You can also specify the first day using `^`:
45
+ Habits are stored in plaintext in `~/.quirk`. You can use `quirk -e` to add/remove entries. Habits
46
+ start on the day of the first mark by default.
63
47
 
64
48
  2012/01/01 walk-dog
65
- 2012/01/01 ^quit-tv
66
-
67
- The first line means you walked the dog on `1/1`. The second line means you
68
- started the habit of quitting TV. This is especially handy for starting
69
- quitting habits on a green day.
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
-
82
- Zsh Tab Completion
83
- ==================
84
-
85
- Here's an example zsh completion function:
86
-
87
- #compdef quirk
88
- compadd `quirk -l`
89
-
90
- Put this into your `site-functions` directory (wherever `$fpath` points to):
91
-
92
- $ echo $fpath
93
- /usr/share/zsh/site-functions /usr/share/zsh/4.3.11/functions
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
49
 
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
50
+ The first line means you walked the dog on `1/1`. You can specify the first/last day for a habit
51
+ using the `^`/`$` prefixes:
109
52
 
110
- This is useful for `tmux`'s status as a reminder of which habits are pending.
111
- Put this in your `.tmux.conf` file:
53
+ 2012/01/01 ^walk-dog
54
+ 2012/01/30 $walk-dog
112
55
 
113
- set -g status-right '#[fg=yellow]#(quirk -t | xargs | tr " " ,)'
56
+ This means I'll start on `1/1` and end on `1/30`, it's just a temporary goal for 1 month.
114
57
 
115
- License
116
- =======
58
+ # License
117
59
 
118
60
  Copyright Hugh Bien - http://hughbien.com.
119
61
  Released under BSD License, see LICENSE.md for more info.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'optparse'
3
- require File.expand_path('quirk', File.dirname(__FILE__))
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'quirk'))
4
4
 
5
5
  ARGV.options do |o|
6
6
  begin
@@ -11,9 +11,7 @@ ARGV.options do |o|
11
11
  o.define_head "Track good and bad habits (v#{Quirk::VERSION})"
12
12
  o.on('-c', '--calendar habit', 'show calendar') { |h| action = [:calendar, h] }
13
13
  o.on('-e', '--edit', 'edit habits') { action = [:edit] }
14
- o.on('-l', '--list', 'list habits') { action = [:list] }
15
14
  o.on('-m', '--mark habit', 'mark for today') { |h| action = [:mark, h] }
16
- o.on('-t', '--today', 'unfinished habits for today') { action = [:today] }
17
15
  o.on('-y', '--year year', 'set calendar year') { |y| app.year = y }
18
16
  o.on('-h', '--help', 'show this help message') { puts o; exit }
19
17
  o.parse!
@@ -2,7 +2,7 @@ require 'date'
2
2
  require 'colorize'
3
3
 
4
4
  module Quirk
5
- VERSION = '0.0.5'
5
+ VERSION = '0.0.6'
6
6
  QUIRKFILE = ENV['QUIRKFILE'] || "#{ENV['HOME']}/.quirk"
7
7
  EDITOR = ENV['EDITOR'] || 'vi'
8
8
 
@@ -27,22 +27,25 @@ module Quirk
27
27
  `#{EDITOR} #{QUIRKFILE} < \`tty\` > \`tty\``
28
28
  end
29
29
 
30
- def list
31
- puts cal.list
32
- end
33
-
34
30
  def mark(habit_id)
35
- File.open(@quirkfile, 'a') do |file|
36
- if cal.has_habit?(habit_id)
37
- file.puts("#{Quirk.today.strftime('%Y/%m/%d')} #{habit_id}")
38
- end
31
+ contents = File.read(@quirkfile)
32
+ return if !cal.has_habit?(habit_id)
33
+
34
+ date = Quirk.today.strftime('%Y/%m/%d')
35
+ match = contents.match(/^(#{date} .*)$/)
36
+ if match # already has date, add habit to line
37
+ old_line = match.captures[0]
38
+ ids = old_line.strip.split(/\s+/, 2)[1].split(',').map(&:strip)
39
+ ids << habit_id
40
+ ids = ids.sort.uniq
41
+ new_line = "#{date} #{ids.join(', ')}"
42
+ contents.sub!(old_line, new_line)
43
+ File.open(@quirkfile, 'w') { |f| f.print(contents) }
44
+ else
45
+ File.open(@quirkfile, 'a') { |f| f.puts("#{date} #{habit_id}") }
39
46
  end
40
47
  end
41
48
 
42
- def today
43
- puts cal.today if cal.today !~ /^\s*$/
44
- end
45
-
46
49
  def streaks
47
50
  puts cal.streaks
48
51
  end
@@ -61,15 +64,11 @@ module Quirk
61
64
  class Habit
62
65
  attr_reader :id, :days, :marks
63
66
 
64
- def initialize(id, days, quitting)
65
- @id, @days, @quitting, @marks = id, days, quitting, []
67
+ def initialize(id, days)
68
+ @id, @days, @marks = id, days, []
66
69
  raise "No days found for #{id}" if @days.empty?
67
70
  end
68
71
 
69
- def quitting?
70
- !!@quitting
71
- end
72
-
73
72
  def mark!(date)
74
73
  @marks << date
75
74
  @marks.sort
@@ -89,12 +88,12 @@ module Quirk
89
88
 
90
89
  def pending?(date)
91
90
  weekday = date.strftime("%w").to_i
92
- !quitting? && days.include?(weekday) && color_on(date) != :light_green
91
+ days.include?(weekday) && color_on(date) != :light_green
93
92
  end
94
93
 
95
94
  def color_on(date)
96
- hit_color = quitting? ? :light_red : :light_green
97
- miss_color = quitting? ? :light_green : :light_red
95
+ hit_color = :light_green
96
+ miss_color = :light_red
98
97
  last_date = [@last_date, Quirk.today].compact.min
99
98
  if first_date.nil? ||
100
99
  date < first_date ||
@@ -104,7 +103,7 @@ module Quirk
104
103
  elsif @marks.include?(date)
105
104
  hit_color
106
105
  else
107
- date == last_date && !quitting? ? :white : miss_color
106
+ date == last_date ? :white : miss_color
108
107
  end
109
108
  end
110
109
 
@@ -132,10 +131,8 @@ module Quirk
132
131
  line.strip!
133
132
  line.gsub!(/\s+/, ' ')
134
133
 
135
- quitting = line =~ /^\^/
136
- line = line[1..-1] if quitting
137
134
  id, days = line.split(':', 2).map(&:strip)
138
- self.new(id, parse_days(days), quitting)
135
+ self.new(id, parse_days(days))
139
136
  end
140
137
 
141
138
  def self.parse_days(text)
@@ -159,6 +156,7 @@ module Quirk
159
156
 
160
157
  def initialize(habits)
161
158
  @habits = habits.reduce({}) {|hash,habit| hash[habit.id] = habit; hash}
159
+ @ids = habits.map(&:id)
162
160
  end
163
161
 
164
162
  def year
@@ -209,10 +207,6 @@ module Quirk
209
207
  out
210
208
  end
211
209
 
212
- def list
213
- @habits.values.map(&:id).sort.join("\n")
214
- end
215
-
216
210
  def mark!(line)
217
211
  date = Date.parse(line.strip.split(/\s+/)[0])
218
212
  originals = line.strip.split(/\s+/, 2)[1].split(',').map(&:strip)
@@ -231,18 +225,10 @@ module Quirk
231
225
  end
232
226
  end
233
227
 
234
- def today
235
- @habits.values.
236
- select {|h| h.pending?(Quirk.today)}.
237
- map(&:id).
238
- sort.
239
- join("\n")
240
- end
241
-
242
228
  def streaks
243
- pairs = @habits.values.map do |habit|
244
- [habit.streak, habit.id]
245
- end.sort_by(&:first)
229
+ pairs = @ids.map do |id|
230
+ [@habits[id].streak, id]
231
+ end
246
232
  len = pairs.map {|p| p.first.to_s.length}.max
247
233
  pairs.map do |count, id|
248
234
  "#{' ' * (len - count.to_s.length)}#{count} #{id}"
metadata CHANGED
@@ -1,46 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quirk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
5
- prerelease:
4
+ version: 0.0.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Hugh Bien
9
8
  autorequire:
10
- bindir: .
9
+ bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-16 00:00:00.000000000 Z
11
+ date: 2014-12-29 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: minitest
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: colorize
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  description: Command line tool for tracking good/bad habits, data stored in plaintext.
@@ -51,34 +46,31 @@ executables:
51
46
  extensions: []
52
47
  extra_rdoc_files: []
53
48
  files:
54
- - quirk.rb
55
- - quirk_test.rb
56
49
  - LICENSE.md
57
50
  - README.md
58
- - quirk
59
- - ./quirk
51
+ - bin/quirk
52
+ - lib/quirk.rb
60
53
  homepage: https://github.com/hughbien/quirk
61
54
  licenses: []
55
+ metadata: {}
62
56
  post_install_message:
63
57
  rdoc_options: []
64
58
  require_paths:
65
59
  - lib
66
60
  required_ruby_version: !ruby/object:Gem::Requirement
67
- none: false
68
61
  requirements:
69
- - - ! '>='
62
+ - - ">="
70
63
  - !ruby/object:Gem::Version
71
64
  version: '0'
72
65
  required_rubygems_version: !ruby/object:Gem::Requirement
73
- none: false
74
66
  requirements:
75
- - - ! '>='
67
+ - - ">="
76
68
  - !ruby/object:Gem::Version
77
69
  version: 1.3.6
78
70
  requirements: []
79
71
  rubyforge_project:
80
- rubygems_version: 1.8.23
72
+ rubygems_version: 2.2.2
81
73
  signing_key:
82
- specification_version: 3
74
+ specification_version: 4
83
75
  summary: Track good and bad habits
84
76
  test_files: []
@@ -1,206 +0,0 @@
1
- require 'rubygems'
2
- require "#{File.dirname(__FILE__)}/quirk"
3
- require 'minitest/autorun'
4
-
5
- Quirk.today = Date.new(2012, 1, 5) # 1 Su, 2 Mo, 3 Tu, 4 We, 5 Th
6
-
7
- class QuirkAppTest < MiniTest::Unit::TestCase
8
- def setup
9
- @app = Quirk::App.new(File.join(File.dirname(__FILE__), 'quirkfile'))
10
- end
11
- end
12
-
13
- class QuirkHabitTest < MiniTest::Unit::TestCase
14
- def test_parse
15
- habit = Quirk::Habit.parse(' running: monday , tuesday, wednesday')
16
- assert_equal('running', habit.id)
17
- assert_equal([1, 2, 3], habit.days)
18
- refute(habit.quitting?)
19
-
20
- habit2 = Quirk::Habit.parse('walk-dog: everyday')
21
- assert_equal('walk-dog', habit2.id)
22
- assert_equal([0, 1, 2, 3, 4, 5, 6], habit2.days)
23
- refute(habit2.quitting?)
24
-
25
- habit3 = Quirk::Habit.parse('^quit-tv: everyday')
26
- assert_equal('quit-tv', habit3.id)
27
- assert_equal([0, 1, 2, 3, 4, 5, 6], habit3.days)
28
- assert(habit3.quitting?)
29
- end
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
-
44
- def test_color_on
45
- habit = Quirk::Habit.parse('running: sunday, monday, wednesday, thursday')
46
- habit.mark!(Date.new(2012, 1, 2))
47
- habit.mark!(Date.new(2012, 1, 3))
48
- assert_equal(:white, habit.color_on(Date.new(2012, 1, 1)))
49
- assert_equal(:light_green, habit.color_on(Date.new(2012, 1, 2)))
50
- assert_equal(:white, habit.color_on(Date.new(2012, 1, 3)))
51
- assert_equal(:light_red, habit.color_on(Date.new(2012, 1, 4)))
52
- assert_equal(:white, habit.color_on(Date.new(2012, 1, 5)))
53
- end
54
-
55
- def test_color_on_quit
56
- quit = Quirk::Habit.parse('^quit-tv: sunday, monday, wednesday, thursday')
57
- quit.mark!(Date.new(2012, 1, 2))
58
- assert_equal(:white, quit.color_on(Date.new(2012, 1, 1)))
59
- assert_equal(:light_red, quit.color_on(Date.new(2012, 1, 2)))
60
- assert_equal(:white, quit.color_on(Date.new(2012, 1, 3)))
61
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 4)))
62
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 5)))
63
- assert_equal(:white, quit.color_on(Date.new(2012, 1, 6)))
64
-
65
- quit.mark_first!(Date.new(2012, 1, 1))
66
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 1)))
67
- end
68
-
69
- def test_color_on_empty_quit
70
- quit = Quirk::Habit.parse('^quit-tv: everyday')
71
- quit.mark_first!(Date.new(2012, 1, 1))
72
- assert_equal(:white, quit.color_on(Date.new(2011, 12, 31)))
73
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 1)))
74
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 2)))
75
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 3)))
76
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 4)))
77
- assert_equal(:light_green, quit.color_on(Date.new(2012, 1, 5)))
78
- assert_equal(:white, quit.color_on(Date.new(2012, 1, 6)))
79
- end
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
-
126
- def test_streak
127
- missing = Quirk::Habit.parse('running: everyday')
128
- assert_equal(0, missing.streak)
129
-
130
- perfect = Quirk::Habit.parse('running: monday, wednesday')
131
- perfect.mark!(Date.new(2012, 1, 2))
132
- perfect.mark!(Date.new(2012, 1, 4))
133
- assert_equal(2, perfect.streak)
134
-
135
- bad = Quirk::Habit.parse('running: monday, tuesday, wednesday')
136
- bad.mark!(Date.new(2012, 1, 1))
137
- bad.mark!(Date.new(2012, 1, 2))
138
- assert_equal(-2, bad.streak)
139
- end
140
-
141
- def test_streak_quit
142
- missing = Quirk::Habit.parse('^quit-tv: everyday')
143
- assert_equal(0, missing.streak)
144
-
145
- perfect = Quirk::Habit.parse('^quit-tv: monday, tuesday')
146
- perfect.mark!(Date.new(2011, 12, 31))
147
- perfect.mark!(Date.new(2012, 1, 4))
148
- assert_equal(2, perfect.streak)
149
-
150
- bad = Quirk::Habit.parse('^quit-tv: sunday, thursday')
151
- bad.mark!(Date.new(2012, 1, 1)) # sunday
152
- bad.mark!(Date.new(2012, 1, 5)) # thursday
153
- assert_equal(-2, bad.streak)
154
- end
155
- end
156
-
157
- class QuirkCalendarTest < MiniTest::Unit::TestCase
158
- def setup
159
- @running = Quirk::Habit.parse('running: everyday')
160
- @walking = Quirk::Habit.parse('walk-dog: sunday, saturday')
161
- @smoking = Quirk::Habit.parse('^smoking: everyday')
162
- @cal = Quirk::Calendar.new([@running, @walking, @smoking])
163
- @cal.mark!('2012/01/01 ^smoking')
164
- @cal.mark!('2012/01/04 $smoking')
165
- @cal.mark!('2012/01/01 running, walk-dog')
166
- @cal.mark!('2012/01/02 running, walk-dog')
167
- end
168
-
169
- def test_parse
170
- calendar = Quirk::Calendar.parse(
171
- "; ignore comment line\n" +
172
- "running: everyday ; ignore comment\n" +
173
- "^smoking: everyday\n\n" +
174
- "; ignore comment line\n" +
175
- "2012/01/01 ^smoking ; ignore comment\n" +
176
- "2012/01/01 running\n\n")
177
-
178
- assert(calendar.has_habit?('running'))
179
- assert(calendar.has_habit?('smoking'))
180
- assert_equal(Date.new(2012, 1, 1), calendar.habits['running'].first_date)
181
- assert_equal(Date.new(2012, 1, 1), calendar.habits['smoking'].first_date)
182
- end
183
-
184
- def test_parse_day_error
185
- assert_raises(RuntimeError) { Quirk::Calendar.parse('running: invalid') }
186
- end
187
-
188
- def test_mark
189
- assert_equal([Date.new(2012,1,1), Date.new(2012,1,2)], @running.marks)
190
- assert_equal([Date.new(2012,1,1), Date.new(2012,1,2)], @walking.marks)
191
- end
192
-
193
- def test_mark_first
194
- assert_equal(Date.new(2012, 1, 1), @smoking.first_date)
195
- end
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
-
203
- def test_streaks
204
- assert_equal("-2 running\n 1 walk-dog\n 4 smoking", @cal.streaks)
205
- end
206
- end