friends 0.39 → 0.40
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 +5 -5
- data/CHANGELOG.md +17 -2
- data/README.md +93 -95
- data/bin/friends +13 -4
- data/friends.gemspec +15 -10
- data/lib/friends/commands/edit.rb +1 -4
- data/lib/friends/commands/list.rb +4 -23
- data/lib/friends/event.rb +2 -0
- data/lib/friends/graph.rb +6 -5
- data/lib/friends/introvert.rb +65 -98
- data/lib/friends/version.rb +1 -1
- data/test/commands/graph_spec.rb +94 -94
- data/test/commands/list/activities_spec.rb +0 -21
- data/test/commands/list/favorite/friends_spec.rb +0 -48
- data/test/commands/list/favorite/locations_spec.rb +0 -53
- data/test/commands/list/notes_spec.rb +0 -21
- data/test/paging_spec.rb +34 -0
- metadata +21 -4
data/lib/friends/version.rb
CHANGED
data/test/commands/graph_spec.rb
CHANGED
|
@@ -48,19 +48,19 @@ clean_describe "graph" do
|
|
|
48
48
|
|
|
49
49
|
it "graphs all activities" do
|
|
50
50
|
stdout_only <<-OUTPUT
|
|
51
|
-
Nov 2014 |█
|
|
52
|
-
Dec 2014 |█
|
|
53
|
-
Jan 2015 |████
|
|
54
|
-
Feb 2015 |
|
|
55
|
-
Mar 2015 |
|
|
56
|
-
Apr 2015 |
|
|
57
|
-
May 2015 |
|
|
58
|
-
Jun 2015 |
|
|
59
|
-
Jul 2015 |
|
|
60
|
-
Aug 2015 |
|
|
61
|
-
Sep 2015 |
|
|
62
|
-
Oct 2015 |
|
|
63
51
|
Nov 2015 |█
|
|
52
|
+
Oct 2015 |
|
|
53
|
+
Sep 2015 |
|
|
54
|
+
Aug 2015 |
|
|
55
|
+
Jul 2015 |
|
|
56
|
+
Jun 2015 |
|
|
57
|
+
May 2015 |
|
|
58
|
+
Apr 2015 |
|
|
59
|
+
Mar 2015 |
|
|
60
|
+
Feb 2015 |
|
|
61
|
+
Jan 2015 |████
|
|
62
|
+
Dec 2014 |█
|
|
63
|
+
Nov 2014 |█
|
|
64
64
|
OUTPUT
|
|
65
65
|
end
|
|
66
66
|
|
|
@@ -88,19 +88,19 @@ Nov 2015 |█
|
|
|
88
88
|
let(:location_name) { "paris" }
|
|
89
89
|
it "matches location case-insensitively" do
|
|
90
90
|
stdout_only <<-OUTPUT
|
|
91
|
-
Nov 2014 |∙|
|
|
92
|
-
Dec 2014 |█
|
|
93
|
-
Jan 2015 |███∙|
|
|
94
|
-
Feb 2015 |
|
|
95
|
-
Mar 2015 |
|
|
96
|
-
Apr 2015 |
|
|
97
|
-
May 2015 |
|
|
98
|
-
Jun 2015 |
|
|
99
|
-
Jul 2015 |
|
|
100
|
-
Aug 2015 |
|
|
101
|
-
Sep 2015 |
|
|
102
|
-
Oct 2015 |
|
|
103
91
|
Nov 2015 |∙|
|
|
92
|
+
Oct 2015 |
|
|
93
|
+
Sep 2015 |
|
|
94
|
+
Aug 2015 |
|
|
95
|
+
Jul 2015 |
|
|
96
|
+
Jun 2015 |
|
|
97
|
+
May 2015 |
|
|
98
|
+
Apr 2015 |
|
|
99
|
+
Mar 2015 |
|
|
100
|
+
Feb 2015 |
|
|
101
|
+
Jan 2015 |███∙|
|
|
102
|
+
Dec 2014 |█
|
|
103
|
+
Nov 2014 |∙|
|
|
104
104
|
OUTPUT
|
|
105
105
|
end
|
|
106
106
|
end
|
|
@@ -130,19 +130,19 @@ Nov 2015 |∙|
|
|
|
130
130
|
|
|
131
131
|
it "matches friend case-insensitively" do
|
|
132
132
|
stdout_only <<-OUTPUT
|
|
133
|
-
Nov 2014 |█
|
|
134
|
-
Dec 2014 |∙|
|
|
135
|
-
Jan 2015 |█∙∙∙|
|
|
136
|
-
Feb 2015 |
|
|
137
|
-
Mar 2015 |
|
|
138
|
-
Apr 2015 |
|
|
139
|
-
May 2015 |
|
|
140
|
-
Jun 2015 |
|
|
141
|
-
Jul 2015 |
|
|
142
|
-
Aug 2015 |
|
|
143
|
-
Sep 2015 |
|
|
144
|
-
Oct 2015 |
|
|
145
133
|
Nov 2015 |∙|
|
|
134
|
+
Oct 2015 |
|
|
135
|
+
Sep 2015 |
|
|
136
|
+
Aug 2015 |
|
|
137
|
+
Jul 2015 |
|
|
138
|
+
Jun 2015 |
|
|
139
|
+
May 2015 |
|
|
140
|
+
Apr 2015 |
|
|
141
|
+
Mar 2015 |
|
|
142
|
+
Feb 2015 |
|
|
143
|
+
Jan 2015 |█∙∙∙|
|
|
144
|
+
Dec 2014 |∙|
|
|
145
|
+
Nov 2014 |█
|
|
146
146
|
OUTPUT
|
|
147
147
|
end
|
|
148
148
|
end
|
|
@@ -154,19 +154,19 @@ Nov 2015 |∙|
|
|
|
154
154
|
|
|
155
155
|
it "matches all friends case-insensitively" do
|
|
156
156
|
stdout_only <<-OUTPUT
|
|
157
|
-
Nov 2014 |∙|
|
|
158
|
-
Dec 2014 |∙|
|
|
159
|
-
Jan 2015 |█∙∙∙|
|
|
160
|
-
Feb 2015 |
|
|
161
|
-
Mar 2015 |
|
|
162
|
-
Apr 2015 |
|
|
163
|
-
May 2015 |
|
|
164
|
-
Jun 2015 |
|
|
165
|
-
Jul 2015 |
|
|
166
|
-
Aug 2015 |
|
|
167
|
-
Sep 2015 |
|
|
168
|
-
Oct 2015 |
|
|
169
157
|
Nov 2015 |∙|
|
|
158
|
+
Oct 2015 |
|
|
159
|
+
Sep 2015 |
|
|
160
|
+
Aug 2015 |
|
|
161
|
+
Jul 2015 |
|
|
162
|
+
Jun 2015 |
|
|
163
|
+
May 2015 |
|
|
164
|
+
Apr 2015 |
|
|
165
|
+
Mar 2015 |
|
|
166
|
+
Feb 2015 |
|
|
167
|
+
Jan 2015 |█∙∙∙|
|
|
168
|
+
Dec 2014 |∙|
|
|
169
|
+
Nov 2014 |∙|
|
|
170
170
|
OUTPUT
|
|
171
171
|
end
|
|
172
172
|
end
|
|
@@ -177,19 +177,19 @@ Nov 2015 |∙|
|
|
|
177
177
|
|
|
178
178
|
it "matches tag case-sensitively" do
|
|
179
179
|
stdout_only <<-OUTPUT
|
|
180
|
-
Nov 2014 |∙|
|
|
181
|
-
Dec 2014 |█
|
|
182
|
-
Jan 2015 |█∙∙∙|
|
|
183
|
-
Feb 2015 |
|
|
184
|
-
Mar 2015 |
|
|
185
|
-
Apr 2015 |
|
|
186
|
-
May 2015 |
|
|
187
|
-
Jun 2015 |
|
|
188
|
-
Jul 2015 |
|
|
189
|
-
Aug 2015 |
|
|
190
|
-
Sep 2015 |
|
|
191
|
-
Oct 2015 |
|
|
192
180
|
Nov 2015 |█
|
|
181
|
+
Oct 2015 |
|
|
182
|
+
Sep 2015 |
|
|
183
|
+
Aug 2015 |
|
|
184
|
+
Jul 2015 |
|
|
185
|
+
Jun 2015 |
|
|
186
|
+
May 2015 |
|
|
187
|
+
Apr 2015 |
|
|
188
|
+
Mar 2015 |
|
|
189
|
+
Feb 2015 |
|
|
190
|
+
Jan 2015 |█∙∙∙|
|
|
191
|
+
Dec 2014 |█
|
|
192
|
+
Nov 2014 |∙|
|
|
193
193
|
OUTPUT
|
|
194
194
|
end
|
|
195
195
|
|
|
@@ -200,19 +200,19 @@ Nov 2015 |█
|
|
|
200
200
|
|
|
201
201
|
it "matches all tags case-sensitively" do
|
|
202
202
|
stdout_only <<-OUTPUT
|
|
203
|
-
Nov 2014 |∙|
|
|
204
|
-
Dec 2014 |█
|
|
205
|
-
Jan 2015 |∙∙∙∙|
|
|
206
|
-
Feb 2015 |
|
|
207
|
-
Mar 2015 |
|
|
208
|
-
Apr 2015 |
|
|
209
|
-
May 2015 |
|
|
210
|
-
Jun 2015 |
|
|
211
|
-
Jul 2015 |
|
|
212
|
-
Aug 2015 |
|
|
213
|
-
Sep 2015 |
|
|
214
|
-
Oct 2015 |
|
|
215
203
|
Nov 2015 |∙|
|
|
204
|
+
Oct 2015 |
|
|
205
|
+
Sep 2015 |
|
|
206
|
+
Aug 2015 |
|
|
207
|
+
Jul 2015 |
|
|
208
|
+
Jun 2015 |
|
|
209
|
+
May 2015 |
|
|
210
|
+
Apr 2015 |
|
|
211
|
+
Mar 2015 |
|
|
212
|
+
Feb 2015 |
|
|
213
|
+
Jan 2015 |∙∙∙∙|
|
|
214
|
+
Dec 2014 |█
|
|
215
|
+
Nov 2014 |∙|
|
|
216
216
|
OUTPUT
|
|
217
217
|
end
|
|
218
218
|
end
|
|
@@ -223,17 +223,17 @@ Nov 2015 |∙|
|
|
|
223
223
|
|
|
224
224
|
it "graphs activities on and after the specified date" do
|
|
225
225
|
stdout_only <<-OUTPUT
|
|
226
|
-
Jan 2015 |███
|
|
227
|
-
Feb 2015 |
|
|
228
|
-
Mar 2015 |
|
|
229
|
-
Apr 2015 |
|
|
230
|
-
May 2015 |
|
|
231
|
-
Jun 2015 |
|
|
232
|
-
Jul 2015 |
|
|
233
|
-
Aug 2015 |
|
|
234
|
-
Sep 2015 |
|
|
235
|
-
Oct 2015 |
|
|
236
226
|
Nov 2015 |█
|
|
227
|
+
Oct 2015 |
|
|
228
|
+
Sep 2015 |
|
|
229
|
+
Aug 2015 |
|
|
230
|
+
Jul 2015 |
|
|
231
|
+
Jun 2015 |
|
|
232
|
+
May 2015 |
|
|
233
|
+
Apr 2015 |
|
|
234
|
+
Mar 2015 |
|
|
235
|
+
Feb 2015 |
|
|
236
|
+
Jan 2015 |███
|
|
237
237
|
OUTPUT
|
|
238
238
|
end
|
|
239
239
|
end
|
|
@@ -243,9 +243,9 @@ Nov 2015 |█
|
|
|
243
243
|
|
|
244
244
|
it "graphs activities before and on the specified date" do
|
|
245
245
|
stdout_only <<-OUTPUT
|
|
246
|
-
Nov 2014 |█
|
|
247
|
-
Dec 2014 |█
|
|
248
246
|
Jan 2015 |███
|
|
247
|
+
Dec 2014 |█
|
|
248
|
+
Nov 2014 |█
|
|
249
249
|
OUTPUT
|
|
250
250
|
end
|
|
251
251
|
end
|
|
@@ -257,17 +257,17 @@ Jan 2015 |███
|
|
|
257
257
|
# If we just rounded to the month, there would be three unfiltered activities in
|
|
258
258
|
# January displayed (due to the one on 1/5/2015). Instead, we correctly display two.
|
|
259
259
|
stdout_only <<-OUTPUT
|
|
260
|
-
Jan 2015 |█∙∙|
|
|
261
|
-
Feb 2015 |
|
|
262
|
-
Mar 2015 |
|
|
263
|
-
Apr 2015 |
|
|
264
|
-
May 2015 |
|
|
265
|
-
Jun 2015 |
|
|
266
|
-
Jul 2015 |
|
|
267
|
-
Aug 2015 |
|
|
268
|
-
Sep 2015 |
|
|
269
|
-
Oct 2015 |
|
|
270
260
|
Nov 2015 |█
|
|
261
|
+
Oct 2015 |
|
|
262
|
+
Sep 2015 |
|
|
263
|
+
Aug 2015 |
|
|
264
|
+
Jul 2015 |
|
|
265
|
+
Jun 2015 |
|
|
266
|
+
May 2015 |
|
|
267
|
+
Apr 2015 |
|
|
268
|
+
Mar 2015 |
|
|
269
|
+
Feb 2015 |
|
|
270
|
+
Jan 2015 |█∙∙|
|
|
271
271
|
OUTPUT
|
|
272
272
|
end
|
|
273
273
|
end
|
|
@@ -36,27 +36,6 @@ clean_describe "list activities" do
|
|
|
36
36
|
OUTPUT
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
describe "--limit" do
|
|
40
|
-
subject { run_cmd("list activities --limit #{limit}") }
|
|
41
|
-
|
|
42
|
-
describe "when limit is less than 1" do
|
|
43
|
-
let(:limit) { 0 }
|
|
44
|
-
it "prints an error message" do
|
|
45
|
-
stderr_only "Error: Limit must be positive"
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
describe "when limit is 1 or greater" do
|
|
50
|
-
let(:limit) { 2 }
|
|
51
|
-
it "limits output to the number specified" do
|
|
52
|
-
stdout_only <<-OUTPUT
|
|
53
|
-
2015-01-04: Got lunch with Grace Hopper and George Washington Carver. @food
|
|
54
|
-
2015-11-01: Grace Hopper and I went to Marie's Diner. George had to cancel at the last minute. @food
|
|
55
|
-
OUTPUT
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
39
|
describe "--in" do
|
|
61
40
|
subject { run_cmd("list activities --in #{location_name}") }
|
|
62
41
|
|
|
@@ -109,53 +109,5 @@ FILE
|
|
|
109
109
|
lines.last.must_include "3. Friend"
|
|
110
110
|
end
|
|
111
111
|
end
|
|
112
|
-
|
|
113
|
-
describe "--limit" do
|
|
114
|
-
subject { run_cmd("list favorite friends --limit #{limit}") }
|
|
115
|
-
|
|
116
|
-
describe "when limit is less than 1" do
|
|
117
|
-
let(:limit) { 0 }
|
|
118
|
-
it "prints an error message" do
|
|
119
|
-
stderr_only "Error: Favorites limit must be positive"
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
describe "when limit is 1" do
|
|
124
|
-
let(:limit) { 1 }
|
|
125
|
-
|
|
126
|
-
it "uses correct friend pluralization" do
|
|
127
|
-
stdout_only "Your favorite friend is Grace Hopper (3 activities)"
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
describe "when favorite friend only has one activity" do
|
|
131
|
-
let(:content) do
|
|
132
|
-
<<-FILE
|
|
133
|
-
### Activities:
|
|
134
|
-
- 2017-01-01: Did some math with **Grace Hopper**.
|
|
135
|
-
|
|
136
|
-
### Friends:
|
|
137
|
-
- George Washington Carver
|
|
138
|
-
- Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris] @navy @science
|
|
139
|
-
- Marie Curie [Atlantis] @science
|
|
140
|
-
FILE
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it "uses correct activity pluralization" do
|
|
144
|
-
stdout_only "Your favorite friend is Grace Hopper (1 activity)"
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
describe "when limit is greater than 1" do
|
|
150
|
-
let(:limit) { 2 }
|
|
151
|
-
it "limits output to the number specified" do
|
|
152
|
-
stdout_only <<-OUTPUT
|
|
153
|
-
Your favorite friends:
|
|
154
|
-
1. Grace Hopper (3 activities)
|
|
155
|
-
2. George Washington Carver (2)
|
|
156
|
-
OUTPUT
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
112
|
end
|
|
161
113
|
end
|
|
@@ -114,58 +114,5 @@ FILE
|
|
|
114
114
|
lines.last.must_include "3. Location"
|
|
115
115
|
end
|
|
116
116
|
end
|
|
117
|
-
|
|
118
|
-
describe "--limit" do
|
|
119
|
-
subject { run_cmd("list favorite locations --limit #{limit}") }
|
|
120
|
-
|
|
121
|
-
describe "when limit is less than 1" do
|
|
122
|
-
let(:limit) { 0 }
|
|
123
|
-
it "prints an error message" do
|
|
124
|
-
stderr_only "Error: Favorites limit must be positive"
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
describe "when limit is 1" do
|
|
129
|
-
let(:limit) { 1 }
|
|
130
|
-
|
|
131
|
-
it "uses correct location pluralization" do
|
|
132
|
-
stdout_only "Your favorite location is Marie's Diner (2 activities)"
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
describe "when favorite location only has one activity" do
|
|
136
|
-
let(:content) do
|
|
137
|
-
<<-FILE
|
|
138
|
-
### Activities:
|
|
139
|
-
- 2017-01-01: Did some math with **Grace Hopper** at _Marie's Diner_.
|
|
140
|
-
|
|
141
|
-
### Friends:
|
|
142
|
-
- George Washington Carver
|
|
143
|
-
- Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris] @navy @science
|
|
144
|
-
- Marie Curie [Atlantis] @science
|
|
145
|
-
|
|
146
|
-
### Locations:
|
|
147
|
-
- Atlantis
|
|
148
|
-
- Marie's Diner
|
|
149
|
-
- Paris
|
|
150
|
-
FILE
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it "uses correct activity pluralization" do
|
|
154
|
-
stdout_only "Your favorite location is Marie's Diner (1 activity)"
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
describe "when limit is greater than 1" do
|
|
160
|
-
let(:limit) { 2 }
|
|
161
|
-
it "limits output to the number specified" do
|
|
162
|
-
stdout_only <<-OUTPUT
|
|
163
|
-
Your favorite locations:
|
|
164
|
-
1. Marie's Diner (2 activities)
|
|
165
|
-
2. Paris (1)
|
|
166
|
-
OUTPUT
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
117
|
end
|
|
171
118
|
end
|
|
@@ -35,27 +35,6 @@ clean_describe "list notes" do
|
|
|
35
35
|
OUTPUT
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
describe "--limit" do
|
|
39
|
-
subject { run_cmd("list notes --limit #{limit}") }
|
|
40
|
-
|
|
41
|
-
describe "when limit is less than 1" do
|
|
42
|
-
let(:limit) { 0 }
|
|
43
|
-
it "prints an error message" do
|
|
44
|
-
stderr_only "Error: Limit must be positive"
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
describe "when limit is 1 or greater" do
|
|
49
|
-
let(:limit) { 2 }
|
|
50
|
-
it "limits output to the number specified" do
|
|
51
|
-
stdout_only <<-OUTPUT
|
|
52
|
-
2015-01-04: Grace Hopper and George Washington Carver both won an award.
|
|
53
|
-
2015-06-06: Marie Curie just got accepted into a PhD program in Paris. @school
|
|
54
|
-
OUTPUT
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
38
|
describe "--in" do
|
|
60
39
|
subject { run_cmd("list notes --in #{location_name}") }
|
|
61
40
|
|
data/test/paging_spec.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "./test/helper"
|
|
4
|
+
|
|
5
|
+
clean_describe "paging" do
|
|
6
|
+
subject { run_cmd("stats", env_vars: env_vars) }
|
|
7
|
+
|
|
8
|
+
let(:content) { nil }
|
|
9
|
+
let(:expected_output) do
|
|
10
|
+
<<-OUTPUT
|
|
11
|
+
Total activities: 0
|
|
12
|
+
Total friends: 0
|
|
13
|
+
Total locations: 0
|
|
14
|
+
Total notes: 0
|
|
15
|
+
Total tags: 0
|
|
16
|
+
Total time elapsed: 0 days
|
|
17
|
+
OUTPUT
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "when using the default pager" do
|
|
21
|
+
let(:env_vars) { "" }
|
|
22
|
+
it { stdout_only expected_output }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "when using a custom pager" do
|
|
26
|
+
let(:env_vars) { "FRIENDS_PAGER='head -n 3 | tail -n 2'" }
|
|
27
|
+
it { stdout_only expected_output.split("\n").take(3).drop(1).join("\n") }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "when using a nonexistent pager" do
|
|
31
|
+
let(:env_vars) { "FRIENDS_PAGER=garbage" }
|
|
32
|
+
it { stdout_only expected_output }
|
|
33
|
+
end
|
|
34
|
+
end
|