friends 0.17 → 0.18
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/CHANGELOG.md +22 -2
- data/README.md +389 -145
- data/RELEASING.md +5 -4
- data/bin/friends +12 -2
- data/friends.md +1 -1
- data/lib/friends/friend.rb +22 -1
- data/lib/friends/regex_builder.rb +7 -2
- data/lib/friends/version.rb +1 -1
- data/test/activity_spec.rb +72 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cafcf4ae0c7862e767cfa66d62f82358aa4427dd
|
4
|
+
data.tar.gz: ce713e78e33183b58d1dfe8a0a4ee56434bef476
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abe895385b3b8fead89b0d05693b8c8ccce448a3a0af2af65bb0eb0441cc22e4b25d8de0d62b2318572053d5db977ec69dd33b90003017b89bd7349124baa0e1
|
7
|
+
data.tar.gz: 26ccbf5fe8b0178a8473ed8c7b541bed990cc9d65644760cd21a642a00a4b840048c1a3cde58e87c619d3ee5554e660342b4fce81bc7a012ea29bdff3c631509
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.18](https://github.com/JacobEvelyn/friends/tree/v0.18) (2016-05-02)
|
4
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.17...v0.18)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Improve documentation [\#92](https://github.com/JacobEvelyn/friends/issues/92)
|
9
|
+
- Have a way to correct mistakes? [\#91](https://github.com/JacobEvelyn/friends/issues/91)
|
10
|
+
- Allow friends to be found with first name and last name initial [\#87](https://github.com/JacobEvelyn/friends/issues/87)
|
11
|
+
|
12
|
+
**Fixed bugs:**
|
13
|
+
|
14
|
+
- Nicknames including first names should match over first name [\#111](https://github.com/JacobEvelyn/friends/issues/111)
|
15
|
+
|
16
|
+
**Merged pull requests:**
|
17
|
+
|
18
|
+
- Match friends with first name and last name initial [\#114](https://github.com/JacobEvelyn/friends/pull/114) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
19
|
+
- Give nicknames matching precedence over first names [\#113](https://github.com/JacobEvelyn/friends/pull/113) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
20
|
+
- Add `friends edit` command [\#112](https://github.com/JacobEvelyn/friends/pull/112) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
21
|
+
- Organize documentation in README [\#110](https://github.com/JacobEvelyn/friends/pull/110) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
22
|
+
|
3
23
|
## [v0.17](https://github.com/JacobEvelyn/friends/tree/v0.17) (2016-03-28)
|
4
24
|
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.16...v0.17)
|
5
25
|
|
@@ -62,7 +82,7 @@
|
|
62
82
|
**Merged pull requests:**
|
63
83
|
|
64
84
|
- Improve handling of double-names and names within names [\#81](https://github.com/JacobEvelyn/friends/pull/81) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
65
|
-
- Update RuboCop and fix many offenses [\#79](https://github.com/JacobEvelyn/friends/pull/79) ([
|
85
|
+
- Update RuboCop and fix many offenses [\#79](https://github.com/JacobEvelyn/friends/pull/79) ([codyjroberts](https://github.com/codyjroberts))
|
66
86
|
|
67
87
|
## [v0.12](https://github.com/JacobEvelyn/friends/tree/v0.12) (2016-01-16)
|
68
88
|
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.11...v0.12)
|
@@ -75,7 +95,7 @@
|
|
75
95
|
**Merged pull requests:**
|
76
96
|
|
77
97
|
- Update README and CONTRIBUTING docs. Closes \#76 [\#77](https://github.com/JacobEvelyn/friends/pull/77) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
78
|
-
- Add rename friend [\#75](https://github.com/JacobEvelyn/friends/pull/75) ([
|
98
|
+
- Add rename friend [\#75](https://github.com/JacobEvelyn/friends/pull/75) ([codyjroberts](https://github.com/codyjroberts))
|
79
99
|
|
80
100
|
## [v0.11](https://github.com/JacobEvelyn/friends/tree/v0.11) (2016-01-13)
|
81
101
|
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.10...v0.11)
|
data/README.md
CHANGED
@@ -5,25 +5,66 @@
|
|
5
5
|
Spend time with the people you care about. Introvert-tested.
|
6
6
|
Extrovert-approved.
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
## Table of Contents
|
9
|
+
|
10
|
+
- [Overview](#overview)
|
11
|
+
- [Installation](#installation)
|
12
|
+
- [Usage](#usage)
|
13
|
+
- [Core concepts](#core-concepts)
|
14
|
+
- [Global flags](#global-flags)
|
15
|
+
- [Syncing across multiple machines](#syncing-across-multiple-machines)
|
16
|
+
- [Command reference](#command-reference)
|
17
|
+
- [`add`](#add)
|
18
|
+
- [`add activity`](#add-activity)
|
19
|
+
- [`add friend`](#add-friend)
|
20
|
+
- [`add location`](#add-location)
|
21
|
+
- [`add nickname`](#add-nickname)
|
22
|
+
- [`clean`](#clean)
|
23
|
+
- [`graph`](#graph)
|
24
|
+
- [`help`](#help)
|
25
|
+
- [`list`](#list)
|
26
|
+
- [`list activities`](#list-activities)
|
27
|
+
- [`list favorites`](#list-favorites)
|
28
|
+
- [`list friends`](#list-friends)
|
29
|
+
- [`list locations`](#list-locations)
|
30
|
+
- [`remove nickname`](#remove-nickname)
|
31
|
+
- [`rename`](#rename)
|
32
|
+
- [`rename friend`](#rename-friend)
|
33
|
+
- [`rename location`](#rename-location)
|
34
|
+
- [`set location`](#set)
|
35
|
+
- [`stats`](#stats)
|
36
|
+
- [`suggest`](#suggest)
|
37
|
+
- [`update`](#update)
|
38
|
+
- [Other documentation](#other-documentation)
|
39
|
+
- [Contributing (it's encouraged!)](#contributing-its-encouraged)
|
40
|
+
- [Code of Conduct](#code-of-conduct)
|
41
|
+
- [License](#license)
|
42
|
+
|
43
|
+
----
|
44
|
+
|
45
|
+
## Overview
|
46
|
+
|
47
|
+
`friends` is both a Ruby library and a command-line interface that
|
11
48
|
allows you to keep track of your relationships with the people you
|
12
49
|
care about.
|
13
50
|
|
14
|
-
|
51
|
+
`friends` gives you:
|
52
|
+
- More organization around staying in touch with friends and
|
53
|
+
family.
|
54
|
+
- A way to track the ebbs and flows of your relationships over
|
55
|
+
time.
|
56
|
+
- Suggestions for who to call or hang out with when you have free
|
57
|
+
time, whether it's fifteen minutes or an entire weekend.
|
58
|
+
- A low-cost way to record and remember big moments in your life.
|
59
|
+
|
60
|
+
Its philosophy emphasizes:
|
15
61
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
time, whether it's fifteen minutes or an entire weekend.
|
23
|
-
- A low-cost way to record and remember big moments in your life.
|
24
|
-
2. **Friends** stores its data in a human-readable `friends.md`
|
25
|
-
Markdown file. No proprietary formats here!
|
26
|
-
3. **Friends** is open-source and very open to new ideas. Contribute!
|
62
|
+
- **Simplicity**—it should be quick and easy to use.
|
63
|
+
- **Transparency**—all data is stored in a human-readable Markdown file. No
|
64
|
+
proprietary formats here! And in addition to being open-source, `friends` is
|
65
|
+
very much open to new ideas. Contribute!
|
66
|
+
- **Intelligence**—specify dates with English phrases like "yesterday." Specify
|
67
|
+
friends with their first names, even when you're friends with many *Joanne*s. `friends` will figure it out.
|
27
68
|
|
28
69
|
## Installation
|
29
70
|
|
@@ -31,240 +72,443 @@ care about.
|
|
31
72
|
$ gem install friends
|
32
73
|
```
|
33
74
|
|
34
|
-
|
75
|
+
Easy, huh?
|
35
76
|
|
36
|
-
|
77
|
+
## Usage
|
78
|
+
|
79
|
+
### Core concepts
|
80
|
+
|
81
|
+
`friends` is structured around several different types of things:
|
37
82
|
|
38
|
-
|
83
|
+
- **Activities**: The things you do. Each activity has a date associated with
|
84
|
+
it.
|
85
|
+
- **Friends**: The people you do *activities* with. Each friend has a name and,
|
86
|
+
optionally, one or several nicknames.
|
87
|
+
- **Locations**: The places in which *activities* happen.
|
39
88
|
|
40
|
-
|
89
|
+
The `friends.md` Markdown file that stores all of your data contains:
|
90
|
+
|
91
|
+
- an alphabetical list of all locations:
|
92
|
+
|
93
|
+
```markdown
|
94
|
+
### Locations:
|
95
|
+
- Atlantis
|
96
|
+
- Marie's Diner
|
97
|
+
- Paris
|
41
98
|
```
|
42
|
-
|
43
|
-
|
99
|
+
|
100
|
+
- an alphabetical list of all friends and their nicknames and locations:
|
101
|
+
|
102
|
+
```markdown
|
103
|
+
### Friends:
|
104
|
+
- George Washington Carver
|
105
|
+
- Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace) [Paris]
|
106
|
+
- Marie Curie [Atlantis]
|
107
|
+
```
|
108
|
+
|
109
|
+
- and an ordered list of all activities:
|
110
|
+
|
111
|
+
```markdown
|
112
|
+
### Activities:
|
113
|
+
- 2015-11-01: **Grace Hopper** and I went to _Marie's Diner_. George had to cancel at the last minute.
|
114
|
+
- 2015-01-04: Got lunch with **Grace Hopper** and **George Washington Carver**.
|
115
|
+
- 2014-12-31: Celebrated the new year in _Paris_ with **Marie Curie**.
|
116
|
+
- 2014-11-15: Talked to **George Washington Carver** on the phone for an hour.
|
117
|
+
```
|
118
|
+
|
119
|
+
See the example
|
120
|
+
[`friends.md`](https://github.com/JacobEvelyn/friends/blob/master/friends.md)
|
121
|
+
file for more information.
|
122
|
+
|
123
|
+
### Global flags
|
124
|
+
|
125
|
+
`friends` supports several global flags that can be used on any command when
|
126
|
+
specified before the name of the command, like: `friends [flags] [command]`.
|
127
|
+
|
128
|
+
These flags are:
|
129
|
+
|
130
|
+
- `--debug`: Debug error messages with a full backtrace.
|
131
|
+
- `--filename`: Set the location of the friends file to use (default: ./friends.md)
|
132
|
+
|
133
|
+
```bash
|
134
|
+
$ friends --filename ./test/tmp/friends.md clean
|
135
|
+
File cleaned: "./test/tmp/friends.md"
|
136
|
+
```
|
137
|
+
|
138
|
+
- `--quiet`: Quiet output messages.
|
139
|
+
|
140
|
+
```bash
|
141
|
+
$ friends --quiet add activity "Went rollerskating with George."
|
142
|
+
$ # No output!
|
143
|
+
```
|
144
|
+
|
145
|
+
In addition, these flags may be used without any command:
|
146
|
+
|
147
|
+
- `--help`: Show the help menu. This is equivalent to `friends help`.
|
148
|
+
Help menus are available for all levels of commands:
|
149
|
+
|
150
|
+
```bash
|
151
|
+
$ friends --help
|
152
|
+
```
|
153
|
+
|
154
|
+
```bash
|
155
|
+
$ friends list --help
|
44
156
|
```
|
45
|
-
|
157
|
+
|
158
|
+
```bash
|
159
|
+
$ friends list activities --help
|
46
160
|
```
|
161
|
+
|
162
|
+
- `--version`: Show the `friends` program version.
|
163
|
+
|
164
|
+
### Syncing across multiple machines
|
165
|
+
|
166
|
+
Wouldn't it be nice to be able to use `friends` across all of your
|
167
|
+
devices? Hooray, you can! Just put the `friends.md` file in your
|
168
|
+
Dropbox/Box Sync/Google Drive/whatever folder and use the
|
169
|
+
`--filename` flag. You can even set up a Bash/Zsh/whatever alias to
|
170
|
+
do this for you, like so:
|
171
|
+
|
172
|
+
```bash
|
173
|
+
alias friends="friends --filename '~/Dropbox/friends.md'"
|
174
|
+
```
|
175
|
+
|
176
|
+
### Command reference*
|
177
|
+
|
178
|
+
*Note that the command-line output is colored, which this README cannot show.
|
179
|
+
|
180
|
+
#### `add`
|
181
|
+
|
182
|
+
##### `add activity`
|
183
|
+
|
184
|
+
```bash
|
47
185
|
$ friends add activity "Got lunch with Grace and George."
|
48
186
|
Activity added: "2015-01-04: Got lunch with Grace Hopper and George Washington Carver."
|
49
187
|
```
|
188
|
+
|
50
189
|
`friends` will **automatically** figure out which "Grace" and "George" you're referring to, *even if you're friends with lots of different Graces and Georges*.
|
51
190
|
|
52
|
-
|
191
|
+
Nicknames will be used to match friends in activities,
|
192
|
+
just like formal names:
|
193
|
+
|
194
|
+
```bash
|
195
|
+
$ friends add activity "Invented debugging with The Admiral."
|
196
|
+
Activity added: "2016-01-06: Invented debugging with Grace Hopper."
|
197
|
+
```
|
198
|
+
|
199
|
+
You can also use the first initial of a last name instead of the whole thing.
|
200
|
+
`friends` will figure out what to do with those pesky periods (if you include
|
201
|
+
them) based on whether you're in the middle of a sentence or not:
|
202
|
+
|
203
|
+
```bash
|
204
|
+
$ friends add activity "Got lunch with Earnest H and Earnest S. in the park. Man, I like Earnest H. but really love Earnest S."
|
205
|
+
Activity added: "2016-05-01: Got lunch with Earnest Hemingway and Earnest Shackleton in the park. Man, I like Earnest Hemingway but really love Earnest Shackleton."
|
206
|
+
```
|
207
|
+
|
208
|
+
And locations will be matched as well:
|
209
|
+
|
210
|
+
```bash
|
211
|
+
$ friends add activity "Went swimming near atlantis with George."
|
212
|
+
Activity added: "2016-01-06: Went swimming near Atlantis with George Washington Carver."
|
53
213
|
```
|
214
|
+
|
215
|
+
You can of course specify a date for the activity:
|
216
|
+
|
217
|
+
```bash
|
54
218
|
$ friends add activity "Yesterday: Celebrated the new year with Marie."
|
55
219
|
Activity added: "2014-12-31: Celebrated the new year with Marie Curie."
|
56
220
|
```
|
221
|
+
|
57
222
|
Or get an **interactive prompt** by just typing `friends add activity`, with or without a date specified:
|
58
|
-
|
223
|
+
|
224
|
+
```bash
|
59
225
|
$ friends add activity 2015-11-01
|
60
226
|
2015-11-01: <type description here>
|
61
227
|
```
|
228
|
+
|
62
229
|
**Natural-language dates** work just fine:
|
63
|
-
|
230
|
+
|
231
|
+
```bash
|
64
232
|
$ friends add activity 'last Monday'
|
65
233
|
2016-03-07: <type description here>
|
66
234
|
```
|
235
|
+
|
67
236
|
You can escape the names of friends you don't want `friends` to match with a backslash:
|
68
|
-
|
237
|
+
|
238
|
+
```bash
|
69
239
|
$ friends add activity "2015-11-01: Grace and I went to \Marie's Diner. \George had to cancel at the last minute."
|
70
240
|
Activity added: "2015-11-01: Grace Hopper and I went to Marie's Diner. George had to cancel at the last minute."
|
71
241
|
```
|
72
|
-
|
242
|
+
|
243
|
+
##### `add friend`
|
244
|
+
|
245
|
+
```bash
|
246
|
+
$ friends add friend "Grace Hopper"
|
247
|
+
Friend added: "Grace Hopper"
|
248
|
+
```
|
249
|
+
|
250
|
+
##### `add location`
|
251
|
+
|
252
|
+
```
|
253
|
+
$ friends add location Atlantis
|
254
|
+
Location added: "Atlantis"
|
73
255
|
```
|
256
|
+
|
257
|
+
##### `add nickname`
|
258
|
+
|
259
|
+
```bash
|
74
260
|
$ friends add nickname "Grace Hopper" "The Admiral"
|
75
261
|
Nickname added: "Grace Hopper (a.k.a. The Admiral)
|
76
262
|
$ friends add nickname "Grace Hopper" "Amazing Grace"
|
77
263
|
Nickname added: "Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace)"
|
78
264
|
```
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
```
|
85
|
-
|
86
|
-
|
87
|
-
$ friends remove nickname "Grace Hopper" "The Admiral"
|
88
|
-
Nickname removed: "Grace Hopper (a.k.a. Amazing Grace)"
|
89
|
-
```
|
90
|
-
##### Set a friend's location:
|
91
|
-
```
|
92
|
-
$ friends set location Marie Paris
|
93
|
-
Marie Curie's location set to: Paris
|
94
|
-
```
|
95
|
-
##### Change a friend's name:
|
96
|
-
```
|
97
|
-
$ friends rename friend "Grace Hopper" "Grace Brewster Murray Hopper"
|
98
|
-
Name changed: "Grace Brewster Murray Hopper (a.k.a. Amazing Grace)"
|
99
|
-
```
|
100
|
-
##### Change the name of a location:
|
101
|
-
```
|
102
|
-
$ friends rename location Paris "Paris, France"
|
103
|
-
Location renamed: "Paris, France"
|
104
|
-
```
|
105
|
-
##### Suggest a friend to do something with:
|
265
|
+
|
266
|
+
#### `clean`
|
267
|
+
|
268
|
+
Reads and re-writes the `friends.md` file:
|
269
|
+
|
270
|
+
```bash
|
271
|
+
$ friends clean
|
272
|
+
File cleaned: "./friends.md"
|
106
273
|
```
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
274
|
+
|
275
|
+
This command is useful after manual editing of the file, for re-ordering its
|
276
|
+
contents.
|
277
|
+
|
278
|
+
#### `edit`
|
279
|
+
|
280
|
+
Allows you to manually edit the file:
|
281
|
+
|
282
|
+
```bash
|
283
|
+
$ friends edit
|
284
|
+
Opening "./friends.md" in vim
|
111
285
|
```
|
112
|
-
|
286
|
+
|
287
|
+
The file is opened with the command specified by the `$EDITOR` environment
|
288
|
+
variable, falling back to `vim` if it is not set:
|
289
|
+
|
290
|
+
```bash
|
291
|
+
$ export EDITOR=atom
|
292
|
+
$ friends edit
|
293
|
+
Opening "./friends.md" in atom
|
113
294
|
```
|
114
|
-
|
115
|
-
|
295
|
+
|
296
|
+
#### `graph`
|
297
|
+
|
298
|
+
Graphs (in color!) your relationship with a given friend over time:
|
299
|
+
|
300
|
+
```bash
|
301
|
+
$ friends graph George
|
302
|
+
Nov 2014 |█
|
303
|
+
Dec 2014 |
|
304
|
+
Jan 2015 |█████
|
305
|
+
Feb 2015 |███
|
116
306
|
```
|
117
|
-
|
307
|
+
|
308
|
+
Or just graph all of your activities:
|
309
|
+
|
310
|
+
```bash
|
311
|
+
$ friends graph
|
312
|
+
Nov 2014 |███
|
313
|
+
Dec 2014 |██
|
314
|
+
Jan 2015 |███████
|
315
|
+
Feb 2015 |█████
|
118
316
|
```
|
119
|
-
|
120
|
-
|
317
|
+
|
318
|
+
#### `help`
|
319
|
+
|
320
|
+
Displays a help menu. This is equivalent to `friends --help`.
|
321
|
+
|
322
|
+
```bash
|
323
|
+
$ friends help
|
324
|
+
NAME
|
325
|
+
friends - Spend time with the people you care about. Introvert-tested. Extrovert-approved.
|
326
|
+
|
327
|
+
SYNOPSIS
|
328
|
+
friends [global options] command [command options] [arguments...]
|
329
|
+
|
330
|
+
...
|
121
331
|
```
|
122
|
-
|
332
|
+
|
333
|
+
Help menus are available for all levels of commands:
|
334
|
+
|
335
|
+
```bash
|
336
|
+
$ friends help
|
123
337
|
```
|
124
|
-
|
125
|
-
|
338
|
+
|
339
|
+
```bash
|
340
|
+
$ friends help list
|
126
341
|
```
|
127
|
-
|
342
|
+
|
343
|
+
```bash
|
344
|
+
$ friends help list activities
|
128
345
|
```
|
346
|
+
|
347
|
+
#### `list`
|
348
|
+
|
349
|
+
##### `list activities`
|
350
|
+
|
351
|
+
Lists recent activities:
|
352
|
+
|
353
|
+
```bash
|
129
354
|
$ friends list activities
|
130
355
|
2015-01-04: Got lunch with Grace Hopper and George Washington Carver.
|
131
356
|
2014-12-31: Celebrated the new year with Marie Curie in New York City.
|
132
357
|
2014-11-15: Talked to George Washington Carver on the phone for an hour.
|
133
358
|
```
|
134
|
-
|
359
|
+
|
360
|
+
You can adjust how many activities are shown:
|
361
|
+
|
362
|
+
```bash
|
363
|
+
$ friends list activities --limit 2
|
364
|
+
2015-01-04: Got lunch with Grace Hopper and George Washington Carver.
|
365
|
+
2014-12-31: Celebrated the new year with Marie Curie in New York City.
|
135
366
|
```
|
367
|
+
|
368
|
+
Or only list the activities you did with a certain friend:
|
369
|
+
|
370
|
+
```bash
|
136
371
|
$ friends list activities --with "George"
|
137
372
|
2015-01-04: Got lunch with Grace Hopper and George Washington Carver.
|
138
373
|
2014-11-15: Talked to George Washington Carver on the phone for an hour.
|
139
|
-
|
140
374
|
```
|
375
|
+
|
141
376
|
Or filter your activities by location:
|
142
|
-
|
377
|
+
|
378
|
+
```bash
|
143
379
|
$ friends list activities --in "New York"
|
144
380
|
2014-12-31: Celebrated the new year with Marie Curie in New York City.
|
145
381
|
```
|
146
|
-
|
147
|
-
|
382
|
+
|
383
|
+
##### `list favorites`
|
384
|
+
|
385
|
+
Lists your "favorite" friends (by total number of activities):
|
386
|
+
|
387
|
+
```bash
|
148
388
|
$ friends list favorites
|
149
389
|
Your favorite friends:
|
150
390
|
1. George Washington Carver (2 activities)
|
151
391
|
2. Grace Hopper (1)
|
152
392
|
3. Marie Curie (1)
|
153
393
|
```
|
154
|
-
|
155
|
-
|
394
|
+
|
395
|
+
You can specify a number of favorites to show:
|
396
|
+
|
397
|
+
```bash
|
156
398
|
$ friends list favorites --limit 2
|
157
399
|
Your favorite friends:
|
158
400
|
1. George Washington Carver (2 activities)
|
159
401
|
2. Grace Hopper (1)
|
160
402
|
```
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
Feb 2015 |███
|
168
|
-
```
|
169
|
-
##### Or just graph all of your activities:
|
170
|
-
```
|
171
|
-
$ friends graph
|
172
|
-
Nov 2014 |███
|
173
|
-
Dec 2014 |██
|
174
|
-
Jan 2015 |███████
|
175
|
-
Feb 2015 |█████
|
176
|
-
```
|
177
|
-
##### Or just check out your lifetime stats:
|
178
|
-
```
|
179
|
-
$ friends stats
|
180
|
-
Total activities: 4
|
181
|
-
Total friends: 3
|
182
|
-
Total time elapsed: 5 days
|
183
|
-
```
|
184
|
-
##### List all of your friends:
|
185
|
-
```
|
403
|
+
|
404
|
+
##### `list friends`
|
405
|
+
|
406
|
+
Lists all of your friends:
|
407
|
+
|
408
|
+
```bash
|
186
409
|
$ friends list friends
|
187
410
|
George Washington Carver
|
188
411
|
Grace Hopper
|
189
412
|
Marie Curie
|
190
413
|
```
|
191
|
-
|
192
|
-
|
414
|
+
|
415
|
+
You can filter your friends by location:
|
416
|
+
|
417
|
+
```bash
|
193
418
|
$ friends list friends --in Paris
|
194
419
|
Marie Curie
|
195
420
|
```
|
196
|
-
|
421
|
+
|
422
|
+
##### `list locations`
|
423
|
+
|
424
|
+
Lists all of the locations you've added:
|
425
|
+
|
197
426
|
```
|
198
427
|
$ friends list locations
|
199
428
|
Atlantis
|
200
429
|
New York City
|
201
430
|
Paris
|
202
431
|
```
|
203
|
-
##### Update to the latest version:
|
204
|
-
```
|
205
|
-
$ friends update
|
206
|
-
Updated to friends 0.3
|
207
|
-
```
|
208
|
-
### Global options:
|
209
432
|
|
210
|
-
|
433
|
+
#### `remove nickname`
|
211
434
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
$
|
435
|
+
Removes a specific nickname from a friend:
|
436
|
+
|
437
|
+
```bash
|
438
|
+
$ friends remove nickname "Grace Hopper" "The Admiral"
|
439
|
+
Nickname removed: "Grace Hopper (a.k.a. Amazing Grace)"
|
216
440
|
```
|
217
441
|
|
218
|
-
|
442
|
+
#### `rename`
|
219
443
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
444
|
+
##### `rename friend`
|
445
|
+
|
446
|
+
```bash
|
447
|
+
$ friends rename friend "Grace Hopper" "Grace Brewster Murray Hopper"
|
448
|
+
Name changed: "Grace Brewster Murray Hopper (a.k.a. Amazing Grace)"
|
224
449
|
```
|
225
450
|
|
226
|
-
#####
|
451
|
+
##### `rename location`
|
227
452
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
$ friends --clean list friends
|
232
|
-
George Washington Carver
|
233
|
-
Grace Hopper
|
234
|
-
Marie Curie
|
235
|
-
File cleaned: "./friends.md"
|
453
|
+
```bash
|
454
|
+
$ friends rename location Paris "Paris, France"
|
455
|
+
Location renamed: "Paris, France"
|
236
456
|
```
|
237
457
|
|
238
|
-
|
458
|
+
#### `set location`
|
459
|
+
|
460
|
+
Sets a friend's location:
|
239
461
|
|
240
|
-
Wouldn't it be nice to be able to use **Friends** across all of your
|
241
|
-
devices? Hooray, you can! Just put the `friends.md` file in your
|
242
|
-
Dropbox/Box Sync/Google Drive/whatever folder and use the
|
243
|
-
`--filename` flag. You can even set up a Bash/Zsh/whatever alias to
|
244
|
-
do this for you, like so:
|
245
462
|
```bash
|
246
|
-
|
463
|
+
$ friends set location Marie Paris
|
464
|
+
Marie Curie's location set to: Paris
|
247
465
|
```
|
248
466
|
|
249
|
-
|
467
|
+
#### `stats`
|
250
468
|
|
251
|
-
|
252
|
-
|
253
|
-
|
469
|
+
Gives you your lifetime usage stats:
|
470
|
+
|
471
|
+
```bash
|
472
|
+
$ friends stats
|
473
|
+
Total activities: 4
|
474
|
+
Total friends: 3
|
475
|
+
Total time elapsed: 5 days
|
254
476
|
```
|
477
|
+
|
478
|
+
#### `suggest`
|
479
|
+
|
480
|
+
Gives you suggestions of up to three random friends to do something with, based
|
481
|
+
on how often you've done things with them in the past:
|
482
|
+
|
483
|
+
```bash
|
484
|
+
$ friends suggest
|
485
|
+
Distant friend: Marie Curie
|
486
|
+
Moderate friend: Grace Hopper
|
487
|
+
Close friend: George Washington Carver
|
255
488
|
```
|
256
|
-
|
489
|
+
|
490
|
+
You can request suggestions of friends in a specific location:
|
491
|
+
|
492
|
+
```bash
|
493
|
+
$ friends suggest --in Paris
|
494
|
+
Distant friend: Marie Curie
|
257
495
|
```
|
496
|
+
|
497
|
+
#### `update`
|
498
|
+
|
499
|
+
Updates `friends` to the latest version on RubyGems:
|
500
|
+
|
258
501
|
```
|
259
|
-
$ friends
|
502
|
+
$ friends update
|
503
|
+
Updated to friends 0.17
|
260
504
|
```
|
261
505
|
|
262
|
-
##
|
506
|
+
## Other documentation
|
263
507
|
|
264
|
-
In case you're *really* interested, we have
|
265
|
-
[
|
508
|
+
In case you're *really* interested, we have documentation on
|
509
|
+
[RubyDoc](http://www.rubydoc.info/github/JacobEvelyn/friends).
|
266
510
|
|
267
|
-
## Contributing
|
511
|
+
## Contributing (it's encouraged!)
|
268
512
|
|
269
513
|
If you have an idea,
|
270
514
|
[make a GitHub Issue](https://github.com/JacobEvelyn/friends/issues/new)!
|
data/RELEASING.md
CHANGED
@@ -7,7 +7,8 @@ These are steps for the maintainer to take to release a new version of this gem.
|
|
7
7
|
2. Commit the change (`git add -A && git commit -m 'Bump to vX.X'`).
|
8
8
|
3. Add a tag (`git tag -am "vX.X" vX.X`).
|
9
9
|
4. `git push && git push --tags`
|
10
|
-
5. `github_changelog_generator
|
11
|
-
6. `git
|
12
|
-
7. `
|
13
|
-
8.
|
10
|
+
5. `CHANGELOG_GITHUB_TOKEN=... github_changelog_generator`
|
11
|
+
6. `git add -A && git commit -m 'Update CHANGELOG for vX.X'`
|
12
|
+
7. `git push`
|
13
|
+
8. `gem build friends.gemspec && gem push *.gem && rm *.gem`
|
14
|
+
9. Celebrate!
|
data/bin/friends
CHANGED
@@ -34,9 +34,8 @@ switch [:debug],
|
|
34
34
|
desc "Updates the `friends` program"
|
35
35
|
command :update do |update|
|
36
36
|
update.action do
|
37
|
-
search = `gem search friends`
|
38
37
|
# rubocop:disable Lint/AssignmentInCondition
|
39
|
-
if match = search
|
38
|
+
if match = `gem search friends`.match(/^friends\s\(([^\)]+)\)$/)
|
40
39
|
# rubocop:enable Lint/AssignmentInCondition
|
41
40
|
remote_version = match[1]
|
42
41
|
if Semverse::Version.coerce(remote_version) >
|
@@ -56,6 +55,17 @@ command :update do |update|
|
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
58
|
+
desc "Opens the `friends.md` file in $EDITOR for manual editing"
|
59
|
+
command :edit do |edit|
|
60
|
+
edit.action do |global_options|
|
61
|
+
editor = ENV["EDITOR"] || "vim"
|
62
|
+
filename = global_options[:filename]
|
63
|
+
|
64
|
+
puts "Opening \"#{filename}\" in #{editor}" unless global_options[:quiet]
|
65
|
+
Kernel.exec "#{editor} #{filename}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
59
69
|
desc "Lists friends, activities, and locations"
|
60
70
|
command :list do |list|
|
61
71
|
list.desc "List all friends"
|
data/friends.md
CHANGED
data/lib/friends/friend.rb
CHANGED
@@ -101,7 +101,28 @@ module Friends
|
|
101
101
|
|
102
102
|
# Create the list of regexes and return it.
|
103
103
|
chunks = name.split(Regexp.new(splitter))
|
104
|
-
|
104
|
+
|
105
|
+
# We check nicknames before first names because nicknames may contain
|
106
|
+
# first names, as in "Amazing Grace" being a nickname for Grace Hopper.
|
107
|
+
[
|
108
|
+
chunks,
|
109
|
+
*@nicknames.map { |n| [n] },
|
110
|
+
|
111
|
+
# Match a first name followed by a last name initial, period, and then
|
112
|
+
# (via lookahead) spacing followed by a lowercase letter. This matches
|
113
|
+
# the "Jake E." part of something like "Jake E. and I went skiing." This
|
114
|
+
# allows us to correctly count the period as part of the name when it's
|
115
|
+
# in the middle of a sentence.
|
116
|
+
[chunks.first, "#{chunks.last[0]}\.(?=#{splitter}(?-i)[a-z])"],
|
117
|
+
|
118
|
+
# If the above doesn't match, we check for just the first name and then
|
119
|
+
# a last name initial. This matches the "Jake E" part of something like
|
120
|
+
# "I went skiing with Jake E." This allows us to correctly exclude the
|
121
|
+
# period from the name when it's at the end of a sentence.
|
122
|
+
[chunks.first, chunks.last[0]],
|
123
|
+
|
124
|
+
[chunks.first]
|
125
|
+
].map do |words|
|
105
126
|
Friends::RegexBuilder.regex(words.join(splitter))
|
106
127
|
end
|
107
128
|
end
|
@@ -21,17 +21,22 @@ module Friends
|
|
21
21
|
NO_LEADING_ALPHABETICALS = "(?<![A-z])".freeze
|
22
22
|
NO_TRAILING_ALPHABETICALS = "(?![A-z])".freeze
|
23
23
|
|
24
|
+
# We ignore case within the regex as opposed to globally to allow consumers
|
25
|
+
# of this API the ability to pass in strings that turn off this modifier
|
26
|
+
# with the "(?-i)" string.
|
27
|
+
IGNORE_CASE = "(?i)".freeze
|
28
|
+
|
24
29
|
def self.regex(str)
|
25
30
|
Regexp.new(
|
26
31
|
NO_LEADING_BACKSLASH +
|
27
32
|
NO_LEADING_ASTERISKS +
|
28
33
|
NO_LEADING_UNDERSCORES +
|
29
34
|
NO_LEADING_ALPHABETICALS +
|
35
|
+
IGNORE_CASE +
|
30
36
|
str +
|
31
37
|
NO_TRAILING_ALPHABETICALS +
|
32
38
|
NO_TRAILING_UNDERSCORES +
|
33
|
-
NO_TRAILING_ASTERISKS
|
34
|
-
Regexp::IGNORECASE
|
39
|
+
NO_TRAILING_ASTERISKS
|
35
40
|
)
|
36
41
|
end
|
37
42
|
end
|
data/lib/friends/version.rb
CHANGED
data/test/activity_spec.rb
CHANGED
@@ -173,6 +173,78 @@ describe Friends::Activity do
|
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
|
+
describe "when description has nicknames" do
|
177
|
+
let(:description) { "Lunch with Lizzy and Johnny." }
|
178
|
+
it "matches friends" do
|
179
|
+
friend1.add_nickname("Lizzy")
|
180
|
+
friend2.add_nickname("Johnny")
|
181
|
+
subject
|
182
|
+
activity.description.
|
183
|
+
must_equal "Lunch with **#{friend1.name}** and **#{friend2.name}**."
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
describe "when discription has nicknames which contain first names" do
|
188
|
+
let(:nickname1) { "Awesome #{friend1.name}" }
|
189
|
+
let(:nickname2) { "Long #{friend2.name} Silver" }
|
190
|
+
let(:description) { "Lunch with #{nickname1} and #{nickname2}." }
|
191
|
+
it "matches friends" do
|
192
|
+
friend1.add_nickname(nickname1)
|
193
|
+
friend2.add_nickname(nickname2)
|
194
|
+
subject
|
195
|
+
activity.description.
|
196
|
+
must_equal "Lunch with **#{friend1.name}** and **#{friend2.name}**."
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe 'when description ends with "<first name> <last name initial>"' do
|
201
|
+
let(:description) { "Lunch with John C" }
|
202
|
+
it "matches the friend" do
|
203
|
+
subject
|
204
|
+
activity.description.
|
205
|
+
must_equal "Lunch with **#{friend2.name}**"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe 'when description ends with "<first name> <last name initial>".' do
|
210
|
+
let(:description) { "Lunch with John C." }
|
211
|
+
it "matches the friend and keeps the period" do
|
212
|
+
subject
|
213
|
+
activity.description.
|
214
|
+
must_equal "Lunch with **#{friend2.name}**."
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe "when description has \"<first name> <last name initial>\" in "\
|
219
|
+
"the middle of a sentence" do
|
220
|
+
let(:description) { "Lunch with John C in the park." }
|
221
|
+
it "matches the friend" do
|
222
|
+
subject
|
223
|
+
activity.description.
|
224
|
+
must_equal "Lunch with **#{friend2.name}** in the park."
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "when description has \"<first name> <last name initial>.\" in "\
|
229
|
+
"the middle of a sentence" do
|
230
|
+
let(:description) { "Lunch with John C. in the park." }
|
231
|
+
it "matches the friend and swallows the period" do
|
232
|
+
subject
|
233
|
+
activity.description.
|
234
|
+
must_equal "Lunch with **#{friend2.name}** in the park."
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
describe "when description has \"<first name> <last name initial>\". at "\
|
239
|
+
"the end of a sentence" do
|
240
|
+
let(:description) { "Lunch with John C. It was great!" }
|
241
|
+
it "matches the friend and keeps the period" do
|
242
|
+
subject
|
243
|
+
activity.description.
|
244
|
+
must_equal "Lunch with **#{friend2.name}**. It was great!"
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
176
248
|
describe "when names are not entered case-sensitively" do
|
177
249
|
let(:description) { "Lunch with elizabeth cady stanton." }
|
178
250
|
it "matches friends" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: friends
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.18'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Evelyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chronic
|