friends 0.7 → 0.8
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/.overcommit.yml +2 -0
- data/CHANGELOG.md +63 -8
- data/CODE_OF_CONDUCT.md +1 -1
- data/CONTRIBUTING.md +61 -0
- data/README.md +29 -14
- data/RELEASING.md +13 -0
- data/bin/friends +24 -2
- data/friends.gemspec +2 -0
- data/friends.md +1 -1
- data/lib/friends/friend.rb +34 -5
- data/lib/friends/introvert.rb +31 -0
- data/lib/friends/version.rb +1 -1
- data/test/friend_spec.rb +39 -0
- data/test/introvert_spec.rb +31 -0
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11ffd724b0c9aa013571f545c49efec501856191
|
4
|
+
data.tar.gz: efb5fa9791decbb6eb8fb050a2e1d61bd4aa913a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6f3e3b822d68ec469ecd11ece0d9ea96838f7c95be0fcf7cff6fe17f47eea9900ab66b3c649f2690f0552bb533ff188ae5aafbbcedf37a2ced7fe3b0bcf408e
|
7
|
+
data.tar.gz: ed8468dea41326b0a221960bf9efe5b67707b840479a9a2a9be6014bc16e11fe490fc2786f337a1fa8f86b0fd45375a4d03d2b5f5a8944caf19b6ae4a1a5d559
|
data/.overcommit.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.8](https://github.com/JacobEvelyn/friends/tree/v0.8) (2016-01-06)
|
4
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.7...v0.8)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Reference friends by real name or nickname [\#40](https://github.com/JacobEvelyn/friends/issues/40)
|
9
|
+
|
10
|
+
**Merged pull requests:**
|
11
|
+
|
12
|
+
- Fix nicknames bug and add README documentation [\#54](https://github.com/JacobEvelyn/friends/pull/54) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
13
|
+
- Add basic nickname support [\#53](https://github.com/JacobEvelyn/friends/pull/53) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
14
|
+
- Add CHANGELOG.md and RELEASING.md [\#52](https://github.com/JacobEvelyn/friends/pull/52) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
15
|
+
- Update Code of Conduct [\#51](https://github.com/JacobEvelyn/friends/pull/51) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
16
|
+
- Improve contributing documentation [\#50](https://github.com/JacobEvelyn/friends/pull/50) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
17
|
+
- Add badgefury.io badge [\#49](https://github.com/JacobEvelyn/friends/pull/49) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
18
|
+
|
3
19
|
## [v0.7](https://github.com/JacobEvelyn/friends/tree/v0.7) (2016-01-05)
|
4
20
|
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.6...v0.7)
|
5
21
|
|
@@ -32,21 +48,62 @@
|
|
32
48
|
- Make activities on same day chronologically ordered [\#38](https://github.com/JacobEvelyn/friends/pull/38) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
33
49
|
|
34
50
|
## [v0.4](https://github.com/JacobEvelyn/friends/tree/v0.4) (2015-11-14)
|
51
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.3...v0.4)
|
52
|
+
|
53
|
+
## [v0.3](https://github.com/JacobEvelyn/friends/tree/v0.3) (2015-11-11)
|
54
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.2...v0.3)
|
55
|
+
|
35
56
|
**Implemented enhancements:**
|
36
57
|
|
37
58
|
- Be able to enter activity with normal prompt [\#34](https://github.com/JacobEvelyn/friends/issues/34)
|
59
|
+
- Create file if none exists [\#25](https://github.com/JacobEvelyn/friends/issues/25)
|
60
|
+
- Friends should be able to have nicknames [\#17](https://github.com/JacobEvelyn/friends/issues/17)
|
61
|
+
- Add ability to change friend name [\#16](https://github.com/JacobEvelyn/friends/issues/16)
|
62
|
+
- Auto-update? [\#8](https://github.com/JacobEvelyn/friends/issues/8)
|
63
|
+
|
64
|
+
## [v0.2](https://github.com/JacobEvelyn/friends/tree/v0.2) (2015-11-08)
|
65
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.1...v0.2)
|
66
|
+
|
67
|
+
## [v0.1](https://github.com/JacobEvelyn/friends/tree/v0.1) (2015-11-03)
|
68
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.0.6...v0.1)
|
69
|
+
|
70
|
+
## [v0.0.6](https://github.com/JacobEvelyn/friends/tree/v0.0.6) (2015-06-28)
|
71
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.0.5...v0.0.6)
|
72
|
+
|
73
|
+
**Implemented enhancements:**
|
74
|
+
|
75
|
+
- Have robustness around name extraction from activities [\#21](https://github.com/JacobEvelyn/friends/issues/21)
|
76
|
+
|
77
|
+
## [v0.0.5](https://github.com/JacobEvelyn/friends/tree/v0.0.5) (2015-06-28)
|
78
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.0.4...v0.0.5)
|
79
|
+
|
80
|
+
## [v0.0.4](https://github.com/JacobEvelyn/friends/tree/v0.0.4) (2015-06-01)
|
81
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.0.3...v0.0.4)
|
82
|
+
|
83
|
+
**Merged pull requests:**
|
84
|
+
|
85
|
+
- Bump version to 0.0.3 [\#33](https://github.com/JacobEvelyn/friends/pull/33) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
86
|
+
|
87
|
+
## [v0.0.3](https://github.com/JacobEvelyn/friends/tree/v0.0.3) (2015-05-28)
|
88
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.0.2...v0.0.3)
|
89
|
+
|
90
|
+
**Merged pull requests:**
|
91
|
+
|
92
|
+
- Allow limiting of activity lists [\#32](https://github.com/JacobEvelyn/friends/pull/32) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
93
|
+
- Improve friend matching code [\#31](https://github.com/JacobEvelyn/friends/pull/31) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
94
|
+
|
95
|
+
## [v0.0.2](https://github.com/JacobEvelyn/friends/tree/v0.0.2) (2015-01-11)
|
96
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.0.1...v0.0.2)
|
97
|
+
|
98
|
+
**Implemented enhancements:**
|
99
|
+
|
38
100
|
- Add confirmation after commands \(and --quiet\) [\#28](https://github.com/JacobEvelyn/friends/issues/28)
|
39
101
|
- Have activity dates default to today if none provided [\#27](https://github.com/JacobEvelyn/friends/issues/27)
|
40
|
-
- Create file if none exists [\#25](https://github.com/JacobEvelyn/friends/issues/25)
|
41
102
|
- Add more detailed usage example to README. [\#23](https://github.com/JacobEvelyn/friends/issues/23)
|
42
|
-
- Have robustness around name extraction from activities [\#21](https://github.com/JacobEvelyn/friends/issues/21)
|
43
103
|
- Put activities before friends in friends.md [\#20](https://github.com/JacobEvelyn/friends/issues/20)
|
44
104
|
- Friend name lookups should be case-insensitive [\#18](https://github.com/JacobEvelyn/friends/issues/18)
|
45
|
-
- Friends should be able to have nicknames [\#17](https://github.com/JacobEvelyn/friends/issues/17)
|
46
|
-
- Add ability to change friend name [\#16](https://github.com/JacobEvelyn/friends/issues/16)
|
47
105
|
- Add link to RubyDoc in README [\#12](https://github.com/JacobEvelyn/friends/issues/12)
|
48
106
|
- Release to RubyGems [\#10](https://github.com/JacobEvelyn/friends/issues/10)
|
49
|
-
- Auto-update? [\#8](https://github.com/JacobEvelyn/friends/issues/8)
|
50
107
|
- Gracefully handle friend name conflicts in all commands [\#7](https://github.com/JacobEvelyn/friends/issues/7)
|
51
108
|
- Be able to list activities [\#6](https://github.com/JacobEvelyn/friends/issues/6)
|
52
109
|
- Be able to add activities [\#5](https://github.com/JacobEvelyn/friends/issues/5)
|
@@ -57,9 +114,6 @@
|
|
57
114
|
|
58
115
|
**Merged pull requests:**
|
59
116
|
|
60
|
-
- Bump version to 0.0.3 [\#33](https://github.com/JacobEvelyn/friends/pull/33) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
61
|
-
- Allow limiting of activity lists [\#32](https://github.com/JacobEvelyn/friends/pull/32) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
62
|
-
- Improve friend matching code [\#31](https://github.com/JacobEvelyn/friends/pull/31) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
63
117
|
- Improve documentation [\#30](https://github.com/JacobEvelyn/friends/pull/30) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
64
118
|
- Add confirm messages and --quiet switch [\#29](https://github.com/JacobEvelyn/friends/pull/29) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
65
119
|
- Put activities above friends in file [\#26](https://github.com/JacobEvelyn/friends/pull/26) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
@@ -72,6 +126,7 @@
|
|
72
126
|
- Clean up gemspec dependencies [\#11](https://github.com/JacobEvelyn/friends/pull/11) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
73
127
|
- Clean up README [\#9](https://github.com/JacobEvelyn/friends/pull/9) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
74
128
|
|
129
|
+
## [v0.0.1](https://github.com/JacobEvelyn/friends/tree/v0.0.1) (2014-12-11)
|
75
130
|
|
76
131
|
|
77
132
|
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
data/CODE_OF_CONDUCT.md
CHANGED
@@ -35,7 +35,7 @@ This Code of Conduct applies both within project spaces and in public spaces
|
|
35
35
|
when an individual is representing the project or its community.
|
36
36
|
|
37
37
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
38
|
-
reported by contacting a project maintainer at
|
38
|
+
reported by contacting a project maintainer at jacobevelyn@gmail.com. All
|
39
39
|
complaints will be reviewed and investigated and will result in a response that
|
40
40
|
is deemed necessary and appropriate to the circumstances. Maintainers are
|
41
41
|
obligated to maintain confidentiality with regard to the reporter of an
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
If you're reading this, it means you want to contribute to this project. Hooray!
|
4
|
+
|
5
|
+
Here's what to do:
|
6
|
+
|
7
|
+
1. If you're looking for a task to work on, check the
|
8
|
+
["up-for-grabs" Issues](https://github.com/JacobEvelyn/friends/labels/upforgrabs). If you see something there that catches your
|
9
|
+
eye, leave a comment indicating you'll work on it and
|
10
|
+
it's yours! If you already have something to work on,
|
11
|
+
that's great as well!
|
12
|
+
2. Fork the repository (https://github.com/JacobEvelyn/friends/fork).
|
13
|
+
3. Clone your forked repository.
|
14
|
+
4. From within the repository directory, run:
|
15
|
+
`bundle install && overcommit --install`
|
16
|
+
5. Create your feature branch
|
17
|
+
(`git checkout -b my-new-feature`).
|
18
|
+
6. Make your changes. Add or modify tests if necessary!
|
19
|
+
(Run tests with `rake test`.) Do your best to conform to
|
20
|
+
existing style and commenting patterns.
|
21
|
+
7. Commit your changes
|
22
|
+
(`git commit -am "Add some feature"`). You should see
|
23
|
+
output from
|
24
|
+
[`overcommit`](https://github.com/brigade/overcommit) as
|
25
|
+
it runs commit hooks that looks something like this:
|
26
|
+
|
27
|
+
```
|
28
|
+
Running pre-commit hooks
|
29
|
+
Analyzing with RuboCop......................................[RuboCop] OK
|
30
|
+
|
31
|
+
✓ All pre-commit hooks passed
|
32
|
+
|
33
|
+
Running commit-msg hooks
|
34
|
+
Checking subject capitalization..................[CapitalizedSubject] OK
|
35
|
+
Checking subject line.............................[SingleLineSubject] OK
|
36
|
+
Checking text width.......................................[TextWidth] OK
|
37
|
+
Checking for trailing periods in subject.............[TrailingPeriod] OK
|
38
|
+
|
39
|
+
✓ All commit-msg hooks passed
|
40
|
+
```
|
41
|
+
|
42
|
+
If any of the commit hook checks fail, fix them if you
|
43
|
+
can but don't hesitate to reach out if you don't know
|
44
|
+
how! This practice is meant to keep the code clean but
|
45
|
+
it shouldn't be scary and it's totally fine to need
|
46
|
+
help!
|
47
|
+
8. Push your changes to GitHub, and open a Pull Request.
|
48
|
+
9. Your code will be reviewed and merged as quickly as
|
49
|
+
possible!
|
50
|
+
10. Check yourself out on the [contributors page](https://github.com/JacobEvelyn/friends/graphs/contributors)! Look at how cool you are!
|
51
|
+
|
52
|
+
If you have any questions at all or get stuck on any step,
|
53
|
+
don't hesitate to
|
54
|
+
[open a GitHub Issue](https://github.com/JacobEvelyn/friends/issues/new)!
|
55
|
+
I'll respond as quickly as I can, and I'm friendly! I
|
56
|
+
promise I don't bite. 😊
|
57
|
+
|
58
|
+
## Code of Conduct
|
59
|
+
|
60
|
+
Note that this project follows a [Code of Conduct](https://github.com/JacobEvelyn/friends/blob/master/CODE_OF_CONDUCT.md).
|
61
|
+
If you're a polite, reasonable person you won't have any issues!
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[](https://codeclimate.com/github/JacobEvelyn/friends) [](https://codeclimate.com/github/JacobEvelyn/friends) [](https://travis-ci.org/JacobEvelyn/friends) [](http://inch-ci.org/github/JacobEvelyn/friends) [](https://ghit.me/repo/JacobEvelyn/friends)
|
1
|
+
[](https://badge.fury.io/rb/friends) [](https://codeclimate.com/github/JacobEvelyn/friends) [](https://codeclimate.com/github/JacobEvelyn/friends) [](https://travis-ci.org/JacobEvelyn/friends) [](http://inch-ci.org/github/JacobEvelyn/friends) [](https://ghit.me/repo/JacobEvelyn/friends)
|
2
2
|
|
3
3
|
# Friends
|
4
4
|
|
@@ -38,7 +38,6 @@ $ gem install friends
|
|
38
38
|
### Basic commands:
|
39
39
|
|
40
40
|
##### Add a friend:
|
41
|
-
|
42
41
|
```
|
43
42
|
$ friends add friend "Grace Hopper"
|
44
43
|
Friend added: "Grace Hopper"
|
@@ -65,6 +64,24 @@ You can escape the names of friends you don't want `friends` to match with a bac
|
|
65
64
|
$ friends add activity "2015-11-01: Grace and I went to \Marie's Diner. \George had to cancel at the last minute."
|
66
65
|
Activity added: "2015-11-01: Grace Hopper and I went to Marie's Diner. George had to cancel at the last minute."
|
67
66
|
```
|
67
|
+
##### Set a friend's nicknames:
|
68
|
+
```
|
69
|
+
$ friends add nickname "Grace Hopper" "The Admiral"
|
70
|
+
Nickname added: "Grace Hopper (a.k.a. The Admiral)
|
71
|
+
$ friends add nickname "Grace Hopper" "Amazing Grace"
|
72
|
+
Nickname added: "Grace Hopper (a.k.a. The Admiral a.k.a. Amazing Grace)"
|
73
|
+
```
|
74
|
+
Nicknames will be used to match friends in activities,
|
75
|
+
just like formal names:
|
76
|
+
```
|
77
|
+
$ friends add activity "Invented debugging with Amazing Grace.""
|
78
|
+
Activity added: "2016-01-06: Invented debugging with Amazing Grace Hopper."
|
79
|
+
```
|
80
|
+
And they can be removed as well:
|
81
|
+
```
|
82
|
+
$ friends remove nickname "Grace Hopper" "The Admiral"
|
83
|
+
Nickname removed: "Grace Hopper (a.k.a. Amazing Grace)"
|
84
|
+
```
|
68
85
|
##### Suggest a friend to do something with:
|
69
86
|
```
|
70
87
|
$ friends suggest
|
@@ -185,18 +202,16 @@ In case you're *really* interested, we have
|
|
185
202
|
If you have an idea,
|
186
203
|
[make a GitHub Issue](https://github.com/JacobEvelyn/friends/issues/new)!
|
187
204
|
Suggestions are very very welcome, and usually are implemented very
|
188
|
-
quickly. And if you'd like to do the implementing yourself
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
[overcommit](https://github.com/brigade/overcommit) to enforce good
|
199
|
-
code.**
|
205
|
+
quickly. And if you'd like to do the implementing yourself, see the
|
206
|
+
[contributing guide](https://github.com/JacobEvelyn/friends/blob/master/CONTRIBUTING.md).
|
207
|
+
|
208
|
+
A big big thanks to all of this project's lovely
|
209
|
+
[contributors](https://github.com/JacobEvelyn/friends/graphs/contributors)!
|
210
|
+
|
211
|
+
## Code of Conduct
|
212
|
+
|
213
|
+
Note that this project follows a [Code of Conduct](https://github.com/JacobEvelyn/friends/blob/master/CODE_OF_CONDUCT.md).
|
214
|
+
If you're a polite, reasonable person you won't have any issues!
|
200
215
|
|
201
216
|
## License
|
202
217
|
|
data/RELEASING.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Releasing
|
2
|
+
|
3
|
+
These are steps for the maintainer to take to release a new version of this gem.
|
4
|
+
|
5
|
+
1. On the `master` branch, update the `VERSION` constant in
|
6
|
+
`lib/friends/version.rb`.
|
7
|
+
2. Commit the change (`git commit -m 'Bump to vX.X'`).
|
8
|
+
3. Add a tag (`git tag -am "vX.X" vX.X`).
|
9
|
+
4. `git push && git push --tags`
|
10
|
+
5. `github_changelog_generator && git commit -m 'Update CHANGELOG for vX.X'`
|
11
|
+
6. `git push`
|
12
|
+
7. `gem build friends.gemspec && gem push *.gem && rm *.gem`
|
13
|
+
8. Celebrate!
|
data/bin/friends
CHANGED
@@ -35,6 +35,7 @@ switch [:clean],
|
|
35
35
|
negatable: false,
|
36
36
|
desc: "Force a clean write of the friends file"
|
37
37
|
|
38
|
+
desc "Updates the `friends` program"
|
38
39
|
command :update do |update|
|
39
40
|
update.action do
|
40
41
|
search = `gem search friends`
|
@@ -126,9 +127,30 @@ command :add do |add|
|
|
126
127
|
@message = "Activity added: \"#{activity.display_text}\""
|
127
128
|
end
|
128
129
|
end
|
130
|
+
|
131
|
+
add.desc "Adds a nickname to a friend"
|
132
|
+
add.arg_name "NAME NICKNAME"
|
133
|
+
add.command :nickname do |add_nickname|
|
134
|
+
add_nickname.action do |_, _, args|
|
135
|
+
friend = @introvert.add_nickname(name: args.first, nickname: args[1])
|
136
|
+
@message = "Nickname added: \"#{friend}\""
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
desc "Remove a nickname"
|
142
|
+
command :remove do |remove|
|
143
|
+
remove.desc "Removes a nickname from a friend"
|
144
|
+
remove.arg_name "NAME NICKNAME"
|
145
|
+
remove.command :nickname do |remove_nickname|
|
146
|
+
remove_nickname.action do |_, _, args|
|
147
|
+
friend = @introvert.remove_nickname(name: args.first, nickname: args[1])
|
148
|
+
@message = "Nickname removed: \"#{friend}\""
|
149
|
+
end
|
150
|
+
end
|
129
151
|
end
|
130
152
|
|
131
|
-
desc "Graph"
|
153
|
+
desc "Graph a friend's relationship over time"
|
132
154
|
arg_name "NAME"
|
133
155
|
command :graph do |graph|
|
134
156
|
graph.action do |_, _, args|
|
@@ -153,7 +175,7 @@ command :graph do |graph|
|
|
153
175
|
end
|
154
176
|
end
|
155
177
|
|
156
|
-
desc "Suggest"
|
178
|
+
desc "Suggest friends to do activities with"
|
157
179
|
command :suggest do |suggest|
|
158
180
|
suggest.action do
|
159
181
|
suggestions = @introvert.suggest
|
data/friends.gemspec
CHANGED
@@ -28,5 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency "bundler", "~> 1.6"
|
29
29
|
spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
|
30
30
|
spec.add_development_dependency "minitest", "~> 5.5"
|
31
|
+
spec.add_development_dependency "overcommit", "~> 0.30"
|
31
32
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
|
+
spec.add_development_dependency "rubocop", "~> 0.35"
|
32
34
|
end
|
data/friends.md
CHANGED
data/lib/friends/friend.rb
CHANGED
@@ -7,10 +7,11 @@ module Friends
|
|
7
7
|
extend Serializable
|
8
8
|
|
9
9
|
SERIALIZATION_PREFIX = "- "
|
10
|
+
NICKNAME_PREFIX = "a.k.a. "
|
10
11
|
|
11
12
|
# @return [Regexp] the regex for capturing groups in deserialization
|
12
13
|
def self.deserialization_regex
|
13
|
-
/(#{SERIALIZATION_PREFIX})?(?<name
|
14
|
+
/(#{SERIALIZATION_PREFIX})?(?<name>[^\(]+)(\((?<nickname_str>#{NICKNAME_PREFIX}.+)\))?/
|
14
15
|
end
|
15
16
|
|
16
17
|
# @return [Regexp] the string of what we expected during deserialization
|
@@ -19,15 +20,43 @@ module Friends
|
|
19
20
|
end
|
20
21
|
|
21
22
|
# @param name [String] the name of the friend
|
22
|
-
def initialize(name:)
|
23
|
-
@name = name
|
23
|
+
def initialize(name:, nickname_str: nil)
|
24
|
+
@name = name.strip
|
25
|
+
@nicknames = nickname_str &&
|
26
|
+
nickname_str.split(NICKNAME_PREFIX)[1..-1].map(&:strip) ||
|
27
|
+
[]
|
24
28
|
end
|
25
29
|
|
26
30
|
attr_accessor :name
|
27
31
|
|
28
32
|
# @return [String] the file serialization text for the friend
|
29
33
|
def serialize
|
30
|
-
"#{SERIALIZATION_PREFIX}#{
|
34
|
+
"#{SERIALIZATION_PREFIX}#{to_s}"
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [String] a string representing the friend's name and nicknames
|
38
|
+
def to_s
|
39
|
+
return name if @nicknames.empty?
|
40
|
+
|
41
|
+
nickname_str = @nicknames.map { |n| "#{NICKNAME_PREFIX}#{n}" }.join(" ")
|
42
|
+
"#{name} (#{nickname_str})"
|
43
|
+
end
|
44
|
+
|
45
|
+
# Adds a nickname, avoiding duplicates and stripping surrounding whitespace.
|
46
|
+
# @param nickname [String] the nickname to add
|
47
|
+
def add_nickname(nickname)
|
48
|
+
@nicknames << nickname
|
49
|
+
@nicknames.uniq!
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param nickname [String] the nickname to remove
|
53
|
+
# @return [Boolean] true if the nickname was present, false otherwise
|
54
|
+
def remove_nickname(nickname)
|
55
|
+
unless @nicknames.include? nickname
|
56
|
+
raise FriendsError, "Nickname \"#{nickname}\" not found for \"#{name}\""
|
57
|
+
end
|
58
|
+
|
59
|
+
@nicknames.delete(nickname)
|
31
60
|
end
|
32
61
|
|
33
62
|
# The number of activities this friend is in. This is for internal use only
|
@@ -74,7 +103,7 @@ module Friends
|
|
74
103
|
# Create the list of regexes and return it.
|
75
104
|
chunks = name.split(Regexp.new(splitter))
|
76
105
|
|
77
|
-
[chunks, [chunks.first]].map do |words|
|
106
|
+
[chunks, [chunks.first], *@nicknames.map { |n| [n] }].map do |words|
|
78
107
|
Regexp.new(
|
79
108
|
no_leading_backslash +
|
80
109
|
no_leading_asterisks +
|
data/lib/friends/introvert.rb
CHANGED
@@ -89,6 +89,35 @@ module Friends
|
|
89
89
|
activity # Return the added activity.
|
90
90
|
end
|
91
91
|
|
92
|
+
# Add a nickname to an existing friend and write out the new friends file.
|
93
|
+
# @param name [String] the name of the friend
|
94
|
+
# @param nickname [String] the nickname to add to the friend
|
95
|
+
# @raise [FriendsError] if 0 of 2+ friends match the given name
|
96
|
+
# @return [Friend] the existing friend
|
97
|
+
def add_nickname(name:, nickname:)
|
98
|
+
friend = friend_with_name_in(name)
|
99
|
+
friend.add_nickname(nickname.strip)
|
100
|
+
|
101
|
+
clean # Write a cleaned file.
|
102
|
+
|
103
|
+
friend
|
104
|
+
end
|
105
|
+
|
106
|
+
# Remove a nickname from an existing friend and write out the new friends
|
107
|
+
# file.
|
108
|
+
# @param name [String] the name of the friend
|
109
|
+
# @param nickname [String] the nickname to remove from the friend
|
110
|
+
# @raise [FriendsError] if 0 of 2+ friends match the given name
|
111
|
+
# @return [Friend] the existing friend
|
112
|
+
def remove_nickname(name:, nickname:)
|
113
|
+
friend = friend_with_name_in(name)
|
114
|
+
friend.remove_nickname(nickname.strip)
|
115
|
+
|
116
|
+
clean # Write a cleaned file.
|
117
|
+
|
118
|
+
friend
|
119
|
+
end
|
120
|
+
|
92
121
|
# List all friend names in the friends file.
|
93
122
|
# @return [Array] a list of all friend names
|
94
123
|
def list_friends
|
@@ -127,6 +156,7 @@ module Friends
|
|
127
156
|
# @param with [String] the name of a friend to filter by, or nil for
|
128
157
|
# unfiltered
|
129
158
|
# @return [Array] a list of all activity text values
|
159
|
+
# @raise [FriendsError] if 0 of 2+ friends match the given `with` text
|
130
160
|
def list_activities(limit:, with:)
|
131
161
|
acts = @activities
|
132
162
|
|
@@ -153,6 +183,7 @@ module Friends
|
|
153
183
|
# The keys of the hash are all of the months (inclusive) between the first
|
154
184
|
# and last month in which activities for the given friend have been
|
155
185
|
# recorded.
|
186
|
+
# @raise [FriendsError] if 0 of 2+ friends match the given name
|
156
187
|
def graph(name:)
|
157
188
|
friend = friend_with_name_in(name) # Find the friend by name.
|
158
189
|
|
data/lib/friends/version.rb
CHANGED
data/test/friend_spec.rb
CHANGED
@@ -40,6 +40,45 @@ describe Friends::Friend do
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
describe "#add_nickname" do
|
44
|
+
subject { friend.add_nickname("The Dude") }
|
45
|
+
|
46
|
+
it "adds the nickname" do
|
47
|
+
subject
|
48
|
+
friend.instance_variable_get(:@nicknames).must_include("The Dude")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "does not keep duplicates" do
|
52
|
+
# Add the same nickname twice. Do not use `subject` because it's memoized.
|
53
|
+
friend.add_nickname("The Dude")
|
54
|
+
friend.add_nickname("The Dude")
|
55
|
+
|
56
|
+
friend.instance_variable_get(:@nicknames).must_equal ["The Dude"]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#remove_nickname" do
|
61
|
+
subject { friend.remove_nickname("Jake") }
|
62
|
+
|
63
|
+
describe "when the nickname is present" do
|
64
|
+
let(:friend) do
|
65
|
+
Friends::Friend.new(name: friend_name, nickname_str: "a.k.a. Jake")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "removes the nickname" do
|
69
|
+
friend.instance_variable_get(:@nicknames).must_equal ["Jake"]
|
70
|
+
subject
|
71
|
+
friend.instance_variable_get(:@nicknames).must_equal []
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "when the nickname is not present" do
|
76
|
+
it "raises an error if the nickname is not found" do
|
77
|
+
proc { subject }.must_raise Friends::FriendsError
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
43
82
|
describe "#n_activities" do
|
44
83
|
subject { friend.n_activities }
|
45
84
|
|
data/test/introvert_spec.rb
CHANGED
@@ -255,6 +255,37 @@ describe Friends::Introvert do
|
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
|
+
describe "#add_nickname" do
|
259
|
+
subject do
|
260
|
+
introvert.add_nickname(name: friend_names.first, nickname: "The Dude")
|
261
|
+
end
|
262
|
+
|
263
|
+
# Delete the file that is created each time.
|
264
|
+
after { File.delete(filename) if File.exists?(filename) }
|
265
|
+
|
266
|
+
it "returns the modified friend" do
|
267
|
+
stub_friends(friends) do
|
268
|
+
subject.must_equal friends.first
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
describe "#remove_nickname" do
|
274
|
+
subject do
|
275
|
+
introvert.remove_nickname(name: "Jeff", nickname: "The Dude")
|
276
|
+
end
|
277
|
+
|
278
|
+
# Delete the file that is created each time.
|
279
|
+
after { File.delete(filename) if File.exists?(filename) }
|
280
|
+
|
281
|
+
it "returns the modified friend" do
|
282
|
+
friend = Friends::Friend.new(name: "Jeff", nickname_str: "a.k.a. The Dude")
|
283
|
+
stub_friends([friend]) do
|
284
|
+
subject.must_equal friend
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
258
289
|
describe "#list_favorites" do
|
259
290
|
subject { introvert.list_favorites(limit: limit) }
|
260
291
|
|
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.8'
|
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-01-
|
11
|
+
date: 2016-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '5.5'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: overcommit
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.30'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.30'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rake
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,20 @@ dependencies:
|
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '10.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.35'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.35'
|
111
139
|
description: Spend time with the people you care about. Introvert-tested. Extrovert-approved.
|
112
140
|
email:
|
113
141
|
- jacobevelyn@gmail.com
|
@@ -123,9 +151,11 @@ files:
|
|
123
151
|
- ".travis.yml"
|
124
152
|
- CHANGELOG.md
|
125
153
|
- CODE_OF_CONDUCT.md
|
154
|
+
- CONTRIBUTING.md
|
126
155
|
- Gemfile
|
127
156
|
- LICENSE.txt
|
128
157
|
- README.md
|
158
|
+
- RELEASING.md
|
129
159
|
- Rakefile
|
130
160
|
- bin/friends
|
131
161
|
- friends.gemspec
|