friends 0.28 → 0.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +2 -0
- data/CHANGELOG.md +13 -0
- data/README.md +35 -5
- data/Rakefile +1 -1
- data/bin/friends +7 -379
- data/friends.gemspec +3 -1
- data/lib/friends/activity.rb +4 -4
- data/lib/friends/commands/add.rb +64 -0
- data/lib/friends/commands/clean.rb +9 -0
- data/lib/friends/commands/edit.rb +12 -0
- data/lib/friends/commands/graph.rb +56 -0
- data/lib/friends/commands/list.rb +143 -0
- data/lib/friends/commands/remove.rb +27 -0
- data/lib/friends/commands/rename.rb +30 -0
- data/lib/friends/commands/set.rb +14 -0
- data/lib/friends/commands/stats.rb +11 -0
- data/lib/friends/commands/suggest.rb +20 -0
- data/lib/friends/commands/update.rb +29 -0
- data/lib/friends/graph.rb +7 -7
- data/lib/friends/introvert.rb +23 -18
- data/lib/friends/version.rb +1 -1
- data/test/commands/add/activity_spec.rb +379 -0
- data/test/commands/add/friend_spec.rb +30 -0
- data/test/commands/add/location_spec.rb +30 -0
- data/test/commands/add/nickname_spec.rb +50 -0
- data/test/commands/add/tag_spec.rb +65 -0
- data/test/commands/clean_spec.rb +39 -0
- data/test/commands/graph_spec.rb +147 -0
- data/test/commands/help_spec.rb +45 -0
- data/test/commands/list/activities_spec.rb +136 -0
- data/test/commands/list/favorite/friends_spec.rb +77 -0
- data/test/commands/list/favorite/locations_spec.rb +82 -0
- data/test/commands/list/friends_spec.rb +76 -0
- data/test/commands/list/locations_spec.rb +35 -0
- data/test/commands/list/tags_spec.rb +58 -0
- data/test/commands/remove/nickname_spec.rb +63 -0
- data/test/commands/remove/tag_spec.rb +64 -0
- data/test/commands/rename/friend_spec.rb +55 -0
- data/test/commands/rename/location_spec.rb +43 -0
- data/test/commands/set/location_spec.rb +54 -0
- data/test/commands/stats_spec.rb +41 -0
- data/test/commands/suggest_spec.rb +86 -0
- data/test/commands/update_spec.rb +13 -0
- data/test/helper.rb +114 -0
- metadata +89 -15
- data/test/activity_spec.rb +0 -597
- data/test/friend_spec.rb +0 -241
- data/test/graph_spec.rb +0 -92
- data/test/introvert_spec.rb +0 -969
- data/test/location_spec.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 266cfedd5b0654ca5ebd434c11ead3d8c21d4e9e
|
4
|
+
data.tar.gz: 76d290e42cc9babe0dcfe3dd9419dded6ca4825d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41e311c6cd3f8dc4a0c9e86d5268badad683731307626f6f50ef33eaf15edfc930754adce617f2934262b6915caa87b3167b138741b3e6b99025d0c4cc542a06
|
7
|
+
data.tar.gz: e838474558ec1a065cd7d72a828fb6073adafac32a6aec23b4bc6e930063f5838e55129d9a6d82d01bf0236a79777db936a31a32b15104fce83cdd3c146e1c5c
|
data/.rubocop.yml
CHANGED
@@ -74,9 +74,6 @@ Delegate:
|
|
74
74
|
DeprecatedClassMethods:
|
75
75
|
Enabled: false
|
76
76
|
|
77
|
-
DeprecatedHashMethods:
|
78
|
-
Enabled: false
|
79
|
-
|
80
77
|
Documentation:
|
81
78
|
Enabled: false
|
82
79
|
|
@@ -132,7 +129,7 @@ LineEndConcatenation:
|
|
132
129
|
Enabled: false
|
133
130
|
|
134
131
|
LineLength:
|
135
|
-
Max:
|
132
|
+
Max: 100
|
136
133
|
|
137
134
|
LiteralInCondition:
|
138
135
|
Enabled: false
|
@@ -146,6 +143,9 @@ Loop:
|
|
146
143
|
MethodLength:
|
147
144
|
Enabled: false
|
148
145
|
|
146
|
+
Metrics/BlockLength:
|
147
|
+
Enabled: false
|
148
|
+
|
149
149
|
ModuleFunction:
|
150
150
|
Enabled: false
|
151
151
|
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.4.0
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.29](https://github.com/JacobEvelyn/friends/tree/v0.29) (2017-03-18)
|
4
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.28...v0.29)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Add `--since \<date\>` and `--until \<date\>` flags, and remove extraneous months from `graph` [\#153](https://github.com/JacobEvelyn/friends/issues/153)
|
9
|
+
- Add integration tests for bin/friends? [\#127](https://github.com/JacobEvelyn/friends/issues/127)
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- Add --since and --until flags to `graph` and `list activities` [\#157](https://github.com/JacobEvelyn/friends/pull/157) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
14
|
+
- Restructuring [\#155](https://github.com/JacobEvelyn/friends/pull/155) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
15
|
+
|
3
16
|
## [v0.28](https://github.com/JacobEvelyn/friends/tree/v0.28) (2016-06-25)
|
4
17
|
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.27...v0.28)
|
5
18
|
|
data/README.md
CHANGED
@@ -42,7 +42,7 @@ lots of help), and give feedback!**
|
|
42
42
|
- `rename`
|
43
43
|
- [`rename friend`](#rename-friend)
|
44
44
|
- [`rename location`](#rename-location)
|
45
|
-
- [`set location`](#set)
|
45
|
+
- [`set location`](#set-location)
|
46
46
|
- [`stats`](#stats)
|
47
47
|
- [`suggest`](#suggest)
|
48
48
|
- [`update`](#update)
|
@@ -55,9 +55,8 @@ lots of help), and give feedback!**
|
|
55
55
|
|
56
56
|
## Overview
|
57
57
|
|
58
|
-
`friends` is
|
59
|
-
|
60
|
-
care about.
|
58
|
+
`friends` is a command-line program that helps you to keep track of your relationships with the
|
59
|
+
people you care about.
|
61
60
|
|
62
61
|
`friends` gives you:
|
63
62
|
- More organization around staying in touch with friends and
|
@@ -364,10 +363,27 @@ Jan 2015 |
|
|
364
363
|
Feb 2015 |█
|
365
364
|
```
|
366
365
|
|
366
|
+
Or graph only activities on or after a certain date:
|
367
|
+
|
368
|
+
```bash
|
369
|
+
$ friends graph --since 'January 1st 2015'
|
370
|
+
Jan 2015 |███████
|
371
|
+
Feb 2015 |█████
|
372
|
+
```
|
373
|
+
|
374
|
+
Or graph only activities before or on a certain date:
|
375
|
+
|
376
|
+
```bash
|
377
|
+
$ friends graph --until 'January 1st 2015'
|
378
|
+
Nov 2014 |███
|
379
|
+
Dec 2014 |██
|
380
|
+
Jan 2015 |███████
|
381
|
+
```
|
382
|
+
|
367
383
|
And you can use multiple of these flags together:
|
368
384
|
|
369
385
|
```bash
|
370
|
-
$ friends graph --in Paris --tagged food --with George
|
386
|
+
$ friends graph --in Paris --tagged food --with George --after 'September 2014'
|
371
387
|
Nov 2014 |█
|
372
388
|
```
|
373
389
|
|
@@ -441,6 +457,20 @@ $ friends list activities --tagged food
|
|
441
457
|
2015-01-04: Got lunch with Grace Hopper and George Washington Carver. @food
|
442
458
|
```
|
443
459
|
|
460
|
+
Or by date:
|
461
|
+
|
462
|
+
```bash
|
463
|
+
$ friends graph --since 'December 31st 2014'
|
464
|
+
2015-01-04: Got lunch with Grace Hopper and George Washington Carver. @food
|
465
|
+
2014-12-31: Celebrated the new year with Marie Curie in New York City. @partying
|
466
|
+
```
|
467
|
+
|
468
|
+
```bash
|
469
|
+
$ friends graph --until 'December 31st 2014'
|
470
|
+
2014-12-31: Celebrated the new year with Marie Curie in New York City. @partying
|
471
|
+
2014-11-15: Talked to George Washington Carver on the phone for an hour.
|
472
|
+
```
|
473
|
+
|
444
474
|
And you can mix and match these options to your heart's content:
|
445
475
|
|
446
476
|
```bash
|
data/Rakefile
CHANGED
data/bin/friends
CHANGED
@@ -39,6 +39,12 @@ end
|
|
39
39
|
class Stripped; end
|
40
40
|
accept(Stripped, &:strip)
|
41
41
|
|
42
|
+
class InputDate; end
|
43
|
+
accept(InputDate) do |value|
|
44
|
+
time = Chronic.parse(value)
|
45
|
+
time && time.to_date
|
46
|
+
end
|
47
|
+
|
42
48
|
switch [:quiet],
|
43
49
|
negatable: false,
|
44
50
|
desc: "Quiet output messages"
|
@@ -56,385 +62,7 @@ switch [:colorless],
|
|
56
62
|
negatable: false,
|
57
63
|
desc: "Disable output colorization and other effects"
|
58
64
|
|
59
|
-
|
60
|
-
command :update do |update|
|
61
|
-
update.action do
|
62
|
-
# rubocop:disable Lint/AssignmentInCondition
|
63
|
-
if match = `gem search friends`.match(/^friends\s\(([^\)]+)\)$/)
|
64
|
-
# rubocop:enable Lint/AssignmentInCondition
|
65
|
-
remote_version = match[1]
|
66
|
-
if Semverse::Version.coerce(remote_version) >
|
67
|
-
Semverse::Version.coerce(Friends::VERSION)
|
68
|
-
`gem update friends && gem cleanup friends`
|
69
|
-
if $?.success?
|
70
|
-
@message = Paint[
|
71
|
-
"Updated to friends #{remote_version}", :bold, :green
|
72
|
-
]
|
73
|
-
else
|
74
|
-
@message = Paint[
|
75
|
-
"Error updating to friends version #{remote_version}", :bold, :red
|
76
|
-
]
|
77
|
-
end
|
78
|
-
else
|
79
|
-
@message = Paint[
|
80
|
-
"Already up-to-date (#{Friends::VERSION})", :bold, :green
|
81
|
-
]
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
desc "Opens the `friends.md` file in $EDITOR for manual editing"
|
88
|
-
command :edit do |edit|
|
89
|
-
edit.action do |global_options|
|
90
|
-
editor = ENV["EDITOR"] || "vim"
|
91
|
-
filename = global_options[:filename]
|
92
|
-
|
93
|
-
puts "Opening \"#{filename}\" in #{editor}" unless global_options[:quiet]
|
94
|
-
Kernel.exec "#{editor} #{filename}"
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
desc "Lists friends, activities, and locations"
|
99
|
-
command :list do |list|
|
100
|
-
list.desc "List all friends"
|
101
|
-
list.command :friends do |list_friends|
|
102
|
-
list_friends.flag [:in],
|
103
|
-
arg_name: "LOCATION",
|
104
|
-
desc: "List only friends in the given location",
|
105
|
-
type: Stripped
|
106
|
-
|
107
|
-
list_friends.flag [:tagged],
|
108
|
-
arg_name: "@TAG",
|
109
|
-
desc: "List only friends with the given tag",
|
110
|
-
type: Tag
|
111
|
-
|
112
|
-
list_friends.switch [:verbose],
|
113
|
-
negatable: false,
|
114
|
-
desc: "Output friend nicknames, locations, and tags"
|
115
|
-
|
116
|
-
list_friends.action do |_, options|
|
117
|
-
puts @introvert.list_friends(
|
118
|
-
location_name: options[:in],
|
119
|
-
tagged: options[:tagged],
|
120
|
-
verbose: options[:verbose]
|
121
|
-
)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
list.desc "Lists all activities"
|
126
|
-
list.command :activities do |list_activities|
|
127
|
-
list_activities.flag [:limit],
|
128
|
-
arg_name: "NUMBER",
|
129
|
-
desc: "The number of activities to return",
|
130
|
-
default_value: 10,
|
131
|
-
type: Integer
|
132
|
-
|
133
|
-
list_activities.flag [:with],
|
134
|
-
arg_name: "NAME",
|
135
|
-
desc: "List only activities with the given friend",
|
136
|
-
type: Stripped
|
137
|
-
|
138
|
-
list_activities.flag [:in],
|
139
|
-
arg_name: "LOCATION",
|
140
|
-
desc: "List only activities in the given location",
|
141
|
-
type: Stripped
|
142
|
-
|
143
|
-
list_activities.flag [:tagged],
|
144
|
-
arg_name: "@TAG",
|
145
|
-
desc: "List only activities with the given tag",
|
146
|
-
type: Tag
|
147
|
-
|
148
|
-
list_activities.action do |_, options|
|
149
|
-
puts @introvert.list_activities(
|
150
|
-
limit: options[:limit],
|
151
|
-
with: options[:with],
|
152
|
-
location_name: options[:in],
|
153
|
-
tagged: options[:tagged]
|
154
|
-
)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
list.desc "List all locations"
|
159
|
-
list.command :locations do |list_locations|
|
160
|
-
list_locations.action do
|
161
|
-
puts @introvert.list_locations
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
list.desc "List all tags used"
|
166
|
-
list.command :tags do |list_tags|
|
167
|
-
list_tags.flag [:from],
|
168
|
-
arg_name: '"activities" or "friends" (default: both)',
|
169
|
-
desc: "List only tags from activities or friends instead of"\
|
170
|
-
"both"
|
171
|
-
list_tags.action do |_, options|
|
172
|
-
puts @introvert.list_tags(from: options[:from])
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
list.desc "List favorite friends and locations"
|
177
|
-
list.command :favorite do |list_favorite|
|
178
|
-
list_favorite.desc "List favorite friends"
|
179
|
-
list_favorite.command :friends do |list_favorite_friends|
|
180
|
-
list_favorite_friends.flag [:limit],
|
181
|
-
arg_name: "NUMBER",
|
182
|
-
desc: "The number of friends to return",
|
183
|
-
default_value: 10,
|
184
|
-
type: Integer
|
185
|
-
|
186
|
-
list_favorite_friends.action do |_, options|
|
187
|
-
favorites = @introvert.list_favorite_friends(limit: options[:limit])
|
188
|
-
|
189
|
-
if options[:limit] == 1
|
190
|
-
puts "Your best friend is #{favorites.first}"
|
191
|
-
else
|
192
|
-
puts "Your favorite friends:"
|
193
|
-
|
194
|
-
num_str_size = favorites.size.to_s.size + 1
|
195
|
-
favorites.each.with_index(1) do |name, rank|
|
196
|
-
puts "#{"#{rank}.".ljust(num_str_size)} #{name}"
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
list_favorite.desc "List favorite locations"
|
203
|
-
list_favorite.command :locations do |list_favorite_locations|
|
204
|
-
list_favorite_locations.flag [:limit],
|
205
|
-
arg_name: "NUMBER",
|
206
|
-
desc: "The number of locations to return",
|
207
|
-
default_value: 10,
|
208
|
-
type: Integer
|
209
|
-
|
210
|
-
list_favorite_locations.action do |_, options|
|
211
|
-
favorites = @introvert.list_favorite_locations(limit: options[:limit])
|
212
|
-
|
213
|
-
if options[:limit] == 1
|
214
|
-
puts "Your favorite location is #{favorites.first}"
|
215
|
-
else
|
216
|
-
puts "Your favorite locations:"
|
217
|
-
|
218
|
-
num_str_size = favorites.size.to_s.size + 1
|
219
|
-
favorites.each.with_index(1) do |name, rank|
|
220
|
-
puts "#{"#{rank}.".ljust(num_str_size)} #{name}"
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
desc "Adds a friend (or nickname), activity, or location"
|
229
|
-
command :add do |add|
|
230
|
-
add.desc "Adds a friend"
|
231
|
-
add.arg_name "NAME"
|
232
|
-
add.command :friend do |add_friend|
|
233
|
-
add_friend.action do |_, _, args|
|
234
|
-
friend = @introvert.add_friend(name: args.join(" "))
|
235
|
-
@message = "Friend added: \"#{friend.name}\""
|
236
|
-
@dirty = true # Mark the file for cleaning.
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
add.desc "Adds an activity"
|
241
|
-
add.arg_name "DESCRIPTION"
|
242
|
-
add.command :activity do |add_activity|
|
243
|
-
add_activity.action do |_, _, args|
|
244
|
-
activity = @introvert.add_activity(serialization: args.join(" "))
|
245
|
-
|
246
|
-
# If there's no description, prompt the user for one.
|
247
|
-
if activity.description.nil? || activity.description.empty?
|
248
|
-
activity.description = Readline.readline(activity.to_s)
|
249
|
-
activity.highlight_description(introvert: @introvert)
|
250
|
-
end
|
251
|
-
|
252
|
-
@message = "Activity added: \"#{activity}\""
|
253
|
-
@dirty = true # Mark the file for cleaning.
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
add.desc "Adds a location"
|
258
|
-
add.arg_name "LOCATION"
|
259
|
-
add.command :location do |add_location|
|
260
|
-
add_location.action do |_, _, args|
|
261
|
-
location = @introvert.add_location(name: args.join(" "))
|
262
|
-
@message = "Location added: \"#{location.name}\""
|
263
|
-
@dirty = true # Mark the file for cleaning.
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
add.desc "Adds a nickname to a friend"
|
268
|
-
add.arg_name "NAME NICKNAME"
|
269
|
-
add.command :nickname do |add_nickname|
|
270
|
-
add_nickname.action do |_, _, args|
|
271
|
-
friend = @introvert.add_nickname(name: args.first, nickname: args[1])
|
272
|
-
@message = "Nickname added: \"#{friend}\""
|
273
|
-
@dirty = true # Mark the file for cleaning.
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
add.desc "Adds a tag to a friend"
|
278
|
-
add.arg_name "NAME @TAG"
|
279
|
-
add.command :tag do |add_tag|
|
280
|
-
add_tag.action do |_, _, args|
|
281
|
-
friend = @introvert.add_tag(
|
282
|
-
name: args[0..-2].join(" "),
|
283
|
-
tag: Tag.convert_to_tag(args.last)
|
284
|
-
)
|
285
|
-
@message = "Tag added to friend: \"#{friend}\""
|
286
|
-
@dirty = true # Mark the file for cleaning.
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
|
-
desc "Set data about friends"
|
292
|
-
command :set do |set|
|
293
|
-
set.desc "Set a friend's location"
|
294
|
-
set.arg_name "NAME LOCATION"
|
295
|
-
set.command :location do |set_location|
|
296
|
-
set_location.action do |_, _, args|
|
297
|
-
friend = @introvert.set_location(name: args.first, location_name: args[1])
|
298
|
-
@message = "#{friend.name}'s location set to: #{friend.location_name}"
|
299
|
-
@dirty = true # Mark the file for cleaning.
|
300
|
-
end
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
desc "Remove a nickname"
|
305
|
-
command :remove do |remove|
|
306
|
-
remove.desc "Removes a nickname from a friend"
|
307
|
-
remove.arg_name "NAME NICKNAME"
|
308
|
-
remove.command :nickname do |remove_nickname|
|
309
|
-
remove_nickname.action do |_, _, args|
|
310
|
-
friend = @introvert.remove_nickname(name: args.first, nickname: args[1])
|
311
|
-
@message = "Nickname removed: \"#{friend}\""
|
312
|
-
@dirty = true # Mark the file for cleaning.
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
remove.desc "Removes a tag from a friend"
|
317
|
-
remove.arg_name "NAME @TAG"
|
318
|
-
remove.command :tag do |remove_tag|
|
319
|
-
remove_tag.action do |_, _, args|
|
320
|
-
friend = @introvert.remove_tag(
|
321
|
-
name: args[0..-2].join(" "),
|
322
|
-
tag: Tag.convert_to_tag(args.last)
|
323
|
-
)
|
324
|
-
@message = "Tag removed from friend: \"#{friend}\""
|
325
|
-
@dirty = true # Mark the file for cleaning.
|
326
|
-
end
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
desc "Graph activities over time"
|
331
|
-
command :graph do |graph|
|
332
|
-
graph.flag [:with],
|
333
|
-
arg_name: "NAME",
|
334
|
-
desc: "Graph activities with the given friend",
|
335
|
-
type: Stripped
|
336
|
-
|
337
|
-
graph.flag [:in],
|
338
|
-
arg_name: "LOCATION",
|
339
|
-
desc: "Graph activities in the given location",
|
340
|
-
type: Stripped
|
341
|
-
|
342
|
-
graph.flag [:tagged],
|
343
|
-
arg_name: "@TAG",
|
344
|
-
desc: "Graph activities with the given tag",
|
345
|
-
type: Tag
|
346
|
-
|
347
|
-
graph.action do |_, options|
|
348
|
-
# This math is taken from Minitest's Pride plugin (the PrideLOL class).
|
349
|
-
PI_3 = Math::PI / 3
|
350
|
-
|
351
|
-
colors = (0...(6 * 7)).map do |n|
|
352
|
-
n *= 1.0 / 6
|
353
|
-
r = (3 * Math.sin(n) + 3).to_i
|
354
|
-
g = (3 * Math.sin(n + 2 * PI_3) + 3).to_i
|
355
|
-
b = (3 * Math.sin(n + 4 * PI_3) + 3).to_i
|
356
|
-
|
357
|
-
[r, g, b].map { |c| c * 51 }
|
358
|
-
end
|
359
|
-
|
360
|
-
data = @introvert.graph(
|
361
|
-
with: options[:with],
|
362
|
-
location_name: options[:in],
|
363
|
-
tagged: options[:tagged]
|
364
|
-
)
|
365
|
-
|
366
|
-
data.each do |month, count|
|
367
|
-
print "#{month} |"
|
368
|
-
puts colors.take(count).map { |rgb| Paint["█", rgb] }.join
|
369
|
-
end
|
370
|
-
end
|
371
|
-
end
|
372
|
-
|
373
|
-
desc "Suggest friends to do activities with"
|
374
|
-
command :suggest do |suggest|
|
375
|
-
suggest.flag [:in],
|
376
|
-
arg_name: "LOCATION",
|
377
|
-
desc: "Suggest only friends in the given location",
|
378
|
-
type: Stripped
|
379
|
-
|
380
|
-
suggest.action do |_, options|
|
381
|
-
suggestions = @introvert.suggest(location_name: options[:in])
|
382
|
-
|
383
|
-
puts "Distant friend: "\
|
384
|
-
"#{Paint[suggestions[:distant].sample || 'None found', :bold, :magenta]}"
|
385
|
-
puts "Moderate friend: "\
|
386
|
-
"#{Paint[suggestions[:moderate].sample || 'None found', :bold, :magenta]}"
|
387
|
-
puts "Close friend: "\
|
388
|
-
"#{Paint[suggestions[:close].sample || 'None found', :bold, :magenta]}"
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
|
-
desc "Cleans your friends.md file"
|
393
|
-
command :clean do |clean|
|
394
|
-
clean.action do
|
395
|
-
@clean_command = true
|
396
|
-
@dirty = true # Mark the file for cleaning.
|
397
|
-
end
|
398
|
-
end
|
399
|
-
|
400
|
-
desc "List all stats"
|
401
|
-
command :stats do |stats|
|
402
|
-
stats.action do
|
403
|
-
puts "Total activities: #{@introvert.total_activities}"
|
404
|
-
puts "Total friends: #{@introvert.total_friends}"
|
405
|
-
days = @introvert.elapsed_days
|
406
|
-
puts "Total time elapsed: #{days} day#{'s' if days != 1}"
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
desc "Renames a friend or location"
|
411
|
-
command :rename do |rename|
|
412
|
-
rename.desc "Renames a friend"
|
413
|
-
rename.arg_name "NAME NEW_NAME"
|
414
|
-
rename.command :friend do |rename_friend|
|
415
|
-
rename_friend.action do |_, _, args|
|
416
|
-
friend = @introvert.rename_friend(
|
417
|
-
old_name: args.first,
|
418
|
-
new_name: args[1]
|
419
|
-
)
|
420
|
-
@message = "Name changed: \"#{friend}\""
|
421
|
-
@dirty = true # Mark the file for cleaning.
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
rename.desc "Renames a location"
|
426
|
-
rename.arg_name "NAME NEW_NAME"
|
427
|
-
rename.command :location do |rename_location|
|
428
|
-
rename_location.action do |_, _, args|
|
429
|
-
location = @introvert.rename_location(
|
430
|
-
old_name: args.first,
|
431
|
-
new_name: args[1]
|
432
|
-
)
|
433
|
-
@message = "Location renamed: \"#{location.name}\""
|
434
|
-
@dirty = true # Mark the file for cleaning.
|
435
|
-
end
|
436
|
-
end
|
437
|
-
end
|
65
|
+
commands_from "friends/commands"
|
438
66
|
|
439
67
|
# Before each command, clean up all arguments and create the global Introvert.
|
440
68
|
pre do |global_options, cmd, options|
|