friends 0.0.6 → 0.2
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/.ruby-version +1 -1
- data/bin/friends +24 -2
- data/lib/friends/activity.rb +4 -4
- data/lib/friends/introvert.rb +31 -0
- data/lib/friends/serializable.rb +1 -1
- data/lib/friends/version.rb +1 -1
- data/test/activity_spec.rb +4 -2
- data/test/introvert_spec.rb +16 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 594e797cfad3741eac04b32f65fad9bdaa79e6d6
|
4
|
+
data.tar.gz: d4db59517521f8d5110b85426533d8a199db2d75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dc7bb05e42a152f8fc5e5d532069295525bceb3c5f30b8a35cbf9b32dcd8561644d947f205a5a0cb964b4d1a2ae084bc745ee14bfa1e48daeb1c880130cf4fe
|
7
|
+
data.tar.gz: e675e071c9be2c956c7d138c327ef15a5c20823643480b754304d7ef9b219159d8de3c853351d054fd9648a0bdd519691be8bafea31d87cb9cbf1dcef6d160e6
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.2.
|
1
|
+
2.2.2
|
data/bin/friends
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
# Todo:
|
4
|
+
# - Allow easy editing of most recent entry.
|
5
|
+
# - Make automatching use context better. (David & Meryl vs. David & Patricia)
|
6
|
+
# - Allow escape char to prevent automatching. ("\Zane wasn't there.")
|
7
|
+
|
3
8
|
require "gli"
|
9
|
+
require "minitest/pride"
|
4
10
|
|
5
11
|
require "friends/introvert"
|
6
12
|
require "friends/version"
|
@@ -105,12 +111,28 @@ arg_name "NAME"
|
|
105
111
|
command :graph do |graph|
|
106
112
|
graph.action do |_, _, args|
|
107
113
|
data = @introvert.graph(name: args.first)
|
114
|
+
|
108
115
|
data.each do |month, count|
|
109
|
-
|
116
|
+
print "#{month} |"
|
117
|
+
|
118
|
+
colorer = Minitest::PrideLOL.new($stdout)
|
119
|
+
count.times { print colorer.pride "█" }
|
120
|
+
puts
|
110
121
|
end
|
111
122
|
end
|
112
123
|
end
|
113
124
|
|
125
|
+
desc "Suggest"
|
126
|
+
command :suggest do |suggest|
|
127
|
+
suggest.action do
|
128
|
+
suggestions = @introvert.suggest
|
129
|
+
|
130
|
+
puts "Distant friend: \e[1m#{suggestions[:distant].sample}\e[0m"
|
131
|
+
puts "Moderate friend: \e[1m#{suggestions[:moderate].sample}\e[0m"
|
132
|
+
puts "Close friend: \e[1m#{suggestions[:close].sample}\e[0m"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
114
136
|
desc "Cleans your friends.md file"
|
115
137
|
command :clean do |clean|
|
116
138
|
clean.action do
|
@@ -145,5 +167,5 @@ on_error do |error|
|
|
145
167
|
abort "Error: #{error}"
|
146
168
|
end
|
147
169
|
|
148
|
-
# Run the program and return the exit code corresponding to
|
170
|
+
# Run the program and return the exit code corresponding to its success.
|
149
171
|
exit run(ARGV)
|
data/lib/friends/activity.rb
CHANGED
@@ -13,7 +13,7 @@ module Friends
|
|
13
13
|
|
14
14
|
# @return [Regexp] the regex for capturing groups in deserialization
|
15
15
|
def self.deserialization_regex
|
16
|
-
/(#{SERIALIZATION_PREFIX})?((?<date_s>\d{4}-\d\d-\d\d):\s)?(?<description>.+)
|
16
|
+
/(#{SERIALIZATION_PREFIX})?((?<date_s>\d{4}-\d\d-\d\d)(:\s)?)?(?<description>.+)?/
|
17
17
|
end
|
18
18
|
|
19
19
|
# @return [Regexp] the string of what we expected during deserialization
|
@@ -24,18 +24,18 @@ module Friends
|
|
24
24
|
# @param date_s [String] the activity's date, parsed using Date.parse()
|
25
25
|
# @param description [String] the activity's description
|
26
26
|
# @return [Activity] the new activity
|
27
|
-
def initialize(date_s: Date.today.to_s, description:)
|
27
|
+
def initialize(date_s: Date.today.to_s, description: nil)
|
28
28
|
@date = Date.parse(date_s)
|
29
29
|
@description = description
|
30
30
|
end
|
31
31
|
|
32
32
|
attr_reader :date
|
33
|
-
|
33
|
+
attr_accessor :description
|
34
34
|
|
35
35
|
# @return [String] the command-line display text for the activity
|
36
36
|
def display_text
|
37
37
|
date_s = "\e[1m#{date}\e[0m"
|
38
|
-
description_s = description
|
38
|
+
description_s = description.to_s
|
39
39
|
while match = description_s.match(/(\*\*)([^\*]+)(\*\*)/)
|
40
40
|
description_s =
|
41
41
|
"#{match.pre_match}\e[1m#{match[2]}\e[0m#{match.post_match}"
|
data/lib/friends/introvert.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
# able to be used directly within another Ruby program, without needing to call
|
3
3
|
# the command-line script explicitly.
|
4
4
|
|
5
|
+
require "readline"
|
6
|
+
|
5
7
|
require "friends/activity"
|
6
8
|
require "friends/friend"
|
7
9
|
require "friends/friends_error"
|
@@ -80,6 +82,9 @@ module Friends
|
|
80
82
|
raise FriendsError, e
|
81
83
|
end
|
82
84
|
|
85
|
+
# If there's no description, prompt the user for one.
|
86
|
+
activity.description ||= Readline.readline(activity.display_text)
|
87
|
+
|
83
88
|
activity.highlight_friends(introvert: self, friends: friends)
|
84
89
|
activities << activity
|
85
90
|
clean # Write a cleaned file.
|
@@ -174,6 +179,32 @@ module Friends
|
|
174
179
|
act_table
|
175
180
|
end
|
176
181
|
|
182
|
+
# @return [Hash] of the format:
|
183
|
+
# {
|
184
|
+
# distant: ["Distant Friend 1 Name", "Distant Friend 2 Name", ...],
|
185
|
+
# moderate: ["Moderate Friend 1 Name", "Moderate Friend 2 Name", ...],
|
186
|
+
# close: ["Close Friend 1 Name", "Close Friend 2 Name", ...]
|
187
|
+
# }
|
188
|
+
def suggest
|
189
|
+
set_n_activities! # Set n_activities for all friends.
|
190
|
+
|
191
|
+
# Sort our friends, with the least favorite friend first.
|
192
|
+
sorted_friends = friends.sort_by(&:n_activities)
|
193
|
+
|
194
|
+
output = Hash.new { |h, k| h[k] = [] }
|
195
|
+
|
196
|
+
# First, get not-so-good friends.
|
197
|
+
while sorted_friends.first.n_activities < 2 do
|
198
|
+
output[:distant] << sorted_friends.shift.name
|
199
|
+
end
|
200
|
+
|
201
|
+
output[:moderate] = sorted_friends.slice!(0, sorted_friends.size * 3 / 4).
|
202
|
+
map!(&:name)
|
203
|
+
output[:close] = sorted_friends.map!(&:name)
|
204
|
+
|
205
|
+
output
|
206
|
+
end
|
207
|
+
|
177
208
|
# Sets the n_activities field on each friend.
|
178
209
|
def set_n_activities!
|
179
210
|
# Construct a hash of friend name to frequency of appearance.
|
data/lib/friends/serializable.rb
CHANGED
@@ -12,7 +12,7 @@ module Serializable
|
|
12
12
|
# - deserialization_expectation
|
13
13
|
# a string for what was expected, if the regex does not match
|
14
14
|
def deserialize(str)
|
15
|
-
match = str.match(deserialization_regex)
|
15
|
+
match = str.to_s.match(deserialization_regex)
|
16
16
|
|
17
17
|
unless match
|
18
18
|
raise SerializationError,
|
data/lib/friends/version.rb
CHANGED
data/test/activity_spec.rb
CHANGED
@@ -35,10 +35,12 @@ describe Friends::Activity do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
describe "when
|
38
|
+
describe "when no description is present" do
|
39
39
|
let(:serialized_str) { "" }
|
40
40
|
|
41
|
-
it
|
41
|
+
it "sets no description in deserialization" do
|
42
|
+
subject.description.must_equal nil
|
43
|
+
end
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
data/test/introvert_spec.rb
CHANGED
@@ -262,6 +262,22 @@ describe Friends::Introvert do
|
|
262
262
|
end
|
263
263
|
end
|
264
264
|
|
265
|
+
describe "#suggest" do
|
266
|
+
subject { introvert.suggest }
|
267
|
+
|
268
|
+
it "returns distant, moderate, and close friends" do
|
269
|
+
introvert.stub(:friends, friends) do
|
270
|
+
introvert.stub(:activities, activities) do
|
271
|
+
subject.must_equal(
|
272
|
+
distant: ["George Washington Carver"],
|
273
|
+
moderate: [],
|
274
|
+
close: ["Betsy Ross"]
|
275
|
+
)
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
265
281
|
describe "#graph" do
|
266
282
|
subject { introvert.graph(name: friend_name) }
|
267
283
|
|
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.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Evelyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
requirements: []
|
148
148
|
rubyforge_project:
|
149
|
-
rubygems_version: 2.4.
|
149
|
+
rubygems_version: 2.4.8
|
150
150
|
signing_key:
|
151
151
|
specification_version: 4
|
152
152
|
summary: Spend time with the people you care about.
|