friends 0.9 → 0.11
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 +39 -0
- data/README.md +1 -1
- data/bin/friends +32 -12
- data/friends.gemspec +1 -0
- data/lib/friends/activity.rb +5 -9
- data/lib/friends/introvert.rb +1 -21
- data/lib/friends/version.rb +1 -1
- data/test/activity_spec.rb +11 -1
- data/test/friend_spec.rb +1 -1
- data/test/introvert_spec.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2611eb26561b8f7b40bdae56b727170223657de4
|
4
|
+
data.tar.gz: bc6d0a9247e655d9f42c439c2f576fb6dcb0c022
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6b161c62dd6b7202e833b0f1a93ddb3b7effe11792b1ba333f905f007180bc9c35ebc8b4105ab873243989eda3256955a984381a0c4e754c681c231b3424b90
|
7
|
+
data.tar.gz: 76f47fc43841a2c225ea25122d560e46f46dd103f3907b96c66472e9d62ea8edc2d3a0932de04e67c003b841c0c020f117e17d1759000bdaf63c933061f6fe75
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,44 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.11](https://github.com/JacobEvelyn/friends/tree/v0.11) (2016-01-13)
|
4
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.10...v0.11)
|
5
|
+
|
6
|
+
**Fixed bugs:**
|
7
|
+
|
8
|
+
- friends update doesn't correctly compare version numbers [\#72](https://github.com/JacobEvelyn/friends/issues/72)
|
9
|
+
- Date gets duplicated with each new activity [\#71](https://github.com/JacobEvelyn/friends/issues/71)
|
10
|
+
|
11
|
+
**Merged pull requests:**
|
12
|
+
|
13
|
+
- Fix bug in comparing gem versions for update [\#74](https://github.com/JacobEvelyn/friends/pull/74) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
14
|
+
- Fix bug in how dates are deserialized [\#73](https://github.com/JacobEvelyn/friends/pull/73) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
15
|
+
|
16
|
+
## [v0.10](https://github.com/JacobEvelyn/friends/tree/v0.10) (2016-01-12)
|
17
|
+
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.9...v0.10)
|
18
|
+
|
19
|
+
**Implemented enhancements:**
|
20
|
+
|
21
|
+
- Add --debug flag for error backtraces [\#62](https://github.com/JacobEvelyn/friends/issues/62)
|
22
|
+
|
23
|
+
**Fixed bugs:**
|
24
|
+
|
25
|
+
- The same name is only highlighted once per description [\#35](https://github.com/JacobEvelyn/friends/issues/35)
|
26
|
+
|
27
|
+
**Closed issues:**
|
28
|
+
|
29
|
+
- Don't write files in middle of commands [\#60](https://github.com/JacobEvelyn/friends/issues/60)
|
30
|
+
- Remove require\_relative from codebase [\#58](https://github.com/JacobEvelyn/friends/issues/58)
|
31
|
+
- Cleanly separate Introvert from non-library concerns [\#57](https://github.com/JacobEvelyn/friends/issues/57)
|
32
|
+
|
33
|
+
**Merged pull requests:**
|
34
|
+
|
35
|
+
- Highlight multiple occurrences [\#70](https://github.com/JacobEvelyn/friends/pull/70) ([GuruKhalsa](https://github.com/GuruKhalsa))
|
36
|
+
- Fix Travis badge \(master only\) [\#67](https://github.com/JacobEvelyn/friends/pull/67) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
37
|
+
- Move activity prompt to bin/friends [\#64](https://github.com/JacobEvelyn/friends/pull/64) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
38
|
+
- Adds the --debug flag for printing backtraces on error [\#63](https://github.com/JacobEvelyn/friends/pull/63) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
39
|
+
- Move file writes to end of command actions [\#61](https://github.com/JacobEvelyn/friends/pull/61) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
40
|
+
- Remove require\_relative from codebase [\#59](https://github.com/JacobEvelyn/friends/pull/59) ([JacobEvelyn](https://github.com/JacobEvelyn))
|
41
|
+
|
3
42
|
## [v0.9](https://github.com/JacobEvelyn/friends/tree/v0.9) (2016-01-07)
|
4
43
|
[Full Changelog](https://github.com/JacobEvelyn/friends/compare/v0.8...v0.9)
|
5
44
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
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)
|
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
|
|
data/bin/friends
CHANGED
@@ -3,11 +3,12 @@
|
|
3
3
|
# Todo:
|
4
4
|
# - Split out serialization into separate repository.
|
5
5
|
# - Add auto check for updates.
|
6
|
-
# - Allow friends to have nicknames.
|
7
6
|
# - Allow easy editing of most recent entry.
|
8
7
|
|
9
8
|
require "gli"
|
10
9
|
require "paint"
|
10
|
+
require "readline"
|
11
|
+
require "semverse"
|
11
12
|
|
12
13
|
require "friends/introvert"
|
13
14
|
require "friends/version"
|
@@ -31,9 +32,9 @@ flag [:filename],
|
|
31
32
|
default_value: "./friends.md",
|
32
33
|
desc: "Set the location of the friends file"
|
33
34
|
|
34
|
-
switch [:
|
35
|
+
switch [:debug],
|
35
36
|
negatable: false,
|
36
|
-
desc: "
|
37
|
+
desc: "Debug error messages with a full backtrace"
|
37
38
|
|
38
39
|
desc "Updates the `friends` program"
|
39
40
|
command :update do |update|
|
@@ -41,7 +42,8 @@ command :update do |update|
|
|
41
42
|
search = `gem search friends`
|
42
43
|
if match = search.match(/^friends\s\(([^\)]+)\)$/)
|
43
44
|
remote_version = match[1]
|
44
|
-
if remote_version
|
45
|
+
if Semverse::Version.coerce(remote_version) >
|
46
|
+
Semverse::Version.coerce(Friends::VERSION)
|
45
47
|
`gem update friends && gem cleanup friends`
|
46
48
|
if $?.success?
|
47
49
|
puts Paint["Updated to friends #{remote_version}", :bold, :green]
|
@@ -116,6 +118,7 @@ command :add do |add|
|
|
116
118
|
add_friend.action do |_, _, args|
|
117
119
|
friend = @introvert.add_friend(name: args.first)
|
118
120
|
@message = "Friend added: \"#{friend.name}\""
|
121
|
+
@dirty = true # Mark the file for cleaning.
|
119
122
|
end
|
120
123
|
end
|
121
124
|
|
@@ -124,7 +127,15 @@ command :add do |add|
|
|
124
127
|
add.command :activity do |add_activity|
|
125
128
|
add_activity.action do |_, _, args|
|
126
129
|
activity = @introvert.add_activity(serialization: args.first)
|
130
|
+
|
131
|
+
# If there's no description, prompt the user for one.
|
132
|
+
if !activity.description
|
133
|
+
activity.description = Readline.readline(activity.display_text)
|
134
|
+
activity.highlight_friends(introvert: @introvert)
|
135
|
+
end
|
136
|
+
|
127
137
|
@message = "Activity added: \"#{activity.display_text}\""
|
138
|
+
@dirty = true # Mark the file for cleaning.
|
128
139
|
end
|
129
140
|
end
|
130
141
|
|
@@ -134,6 +145,7 @@ command :add do |add|
|
|
134
145
|
add_nickname.action do |_, _, args|
|
135
146
|
friend = @introvert.add_nickname(name: args.first, nickname: args[1])
|
136
147
|
@message = "Nickname added: \"#{friend}\""
|
148
|
+
@dirty = true # Mark the file for cleaning.
|
137
149
|
end
|
138
150
|
end
|
139
151
|
end
|
@@ -146,6 +158,7 @@ command :remove do |remove|
|
|
146
158
|
remove_nickname.action do |_, _, args|
|
147
159
|
friend = @introvert.remove_nickname(name: args.first, nickname: args[1])
|
148
160
|
@message = "Nickname removed: \"#{friend}\""
|
161
|
+
@dirty = true # Mark the file for cleaning.
|
149
162
|
end
|
150
163
|
end
|
151
164
|
end
|
@@ -192,8 +205,8 @@ end
|
|
192
205
|
desc "Cleans your friends.md file"
|
193
206
|
command :clean do |clean|
|
194
207
|
clean.action do
|
195
|
-
|
196
|
-
@
|
208
|
+
@clean_command = true
|
209
|
+
@dirty = true # Mark the file for cleaning.
|
197
210
|
end
|
198
211
|
end
|
199
212
|
|
@@ -209,6 +222,8 @@ end
|
|
209
222
|
|
210
223
|
# Before each command, clean up all arguments and create the global Introvert.
|
211
224
|
pre do |global_options, _, options|
|
225
|
+
@debug_mode = global_options[:debug]
|
226
|
+
|
212
227
|
final_options = global_options.merge!(options).select do |key, _|
|
213
228
|
[:filename].include? key
|
214
229
|
end
|
@@ -218,11 +233,12 @@ pre do |global_options, _, options|
|
|
218
233
|
end
|
219
234
|
|
220
235
|
post do |global_options|
|
221
|
-
# After each command, clean if
|
222
|
-
if
|
223
|
-
|
224
|
-
|
225
|
-
|
236
|
+
# After each command, clean the file if we have modifications to make.
|
237
|
+
filename = @introvert.clean if @dirty
|
238
|
+
|
239
|
+
# This is a special-case piece of code that lets us print a message that
|
240
|
+
# includes the filename when `friends clean` is called.
|
241
|
+
@message = "File cleaned: \"#{filename}\"" if @clean_command
|
226
242
|
|
227
243
|
# Print the output message (if there is one) unless --quiet is passed.
|
228
244
|
puts @message unless @message.nil? || global_options[:quiet]
|
@@ -230,7 +246,11 @@ end
|
|
230
246
|
|
231
247
|
# If an error is raised, print the message to STDERR and exit the program.
|
232
248
|
on_error do |error|
|
233
|
-
|
249
|
+
if @debug_mode
|
250
|
+
raise error
|
251
|
+
else
|
252
|
+
abort "Error: #{error}"
|
253
|
+
end
|
234
254
|
end
|
235
255
|
|
236
256
|
# Run the program and return the exit code corresponding to its success.
|
data/friends.gemspec
CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency "gli", "~> 2.12"
|
25
25
|
spec.add_dependency "memoist", "~> 0.11"
|
26
26
|
spec.add_dependency "paint", "~> 1.0"
|
27
|
+
spec.add_dependency "semverse", "~> 1.2"
|
27
28
|
|
28
29
|
spec.add_development_dependency "bundler", "~> 1.6"
|
29
30
|
spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
|
data/lib/friends/activity.rb
CHANGED
@@ -83,12 +83,10 @@ module Friends
|
|
83
83
|
# make those substitutions.
|
84
84
|
regex_map.
|
85
85
|
select { |_, arr| arr.size == 1 }.each do |regex, friend_list|
|
86
|
-
if
|
86
|
+
if @description.match(regex)
|
87
87
|
friend = friend_list.first # There's only one friend in the list.
|
88
88
|
matched_friends << friend
|
89
|
-
@description
|
90
|
-
"**#{friend.name}**"\
|
91
|
-
"#{match.post_match}"
|
89
|
+
@description.gsub!(regex, "**#{friend.name}**")
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
@@ -113,19 +111,17 @@ module Friends
|
|
113
111
|
# guess.
|
114
112
|
regex_map.
|
115
113
|
reject { |_, arr| arr.size == 1 }.each do |regex, friend_list|
|
116
|
-
if
|
114
|
+
if @description.match(regex)
|
117
115
|
guessed_friend = friend_list.sort_by do |friend|
|
118
116
|
[-friend.likelihood_score, -friend.n_activities]
|
119
117
|
end.first
|
120
|
-
@description
|
121
|
-
"**#{guessed_friend.name}**"\
|
122
|
-
"#{match.post_match}"
|
118
|
+
@description.gsub!(regex, "**#{guessed_friend.name}**")
|
123
119
|
end
|
124
120
|
end
|
125
121
|
|
126
122
|
# Lastly, we remove any backslashes, as these are used to escape friends'
|
127
123
|
# names that we don't want to match.
|
128
|
-
@description.
|
124
|
+
@description.delete!("\\")
|
129
125
|
end
|
130
126
|
|
131
127
|
# @param friend [Friend] the friend to test
|
data/lib/friends/introvert.rb
CHANGED
@@ -2,8 +2,6 @@
|
|
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
|
-
|
7
5
|
require "friends/activity"
|
8
6
|
require "friends/friend"
|
9
7
|
require "friends/friends_error"
|
@@ -18,7 +16,6 @@ module Friends
|
|
18
16
|
# @param filename [String] the name of the friends Markdown file
|
19
17
|
def initialize(filename: DEFAULT_FILENAME)
|
20
18
|
@filename = filename
|
21
|
-
@cleaned_file = false # Switches to true when the file is cleaned.
|
22
19
|
|
23
20
|
# Read in the input file. It's easier to do this now and optimize later
|
24
21
|
# than try to overly be clever about what we read and write.
|
@@ -27,10 +24,6 @@ module Friends
|
|
27
24
|
|
28
25
|
# Write out the friends file with cleaned/sorted data.
|
29
26
|
def clean
|
30
|
-
# Short-circuit if we've already cleaned the file so we don't write it
|
31
|
-
# twice.
|
32
|
-
return @filename if @cleaned_file
|
33
|
-
|
34
27
|
descriptions = @activities.sort.map(&:serialize)
|
35
28
|
names = @friends.sort.map(&:serialize)
|
36
29
|
|
@@ -43,8 +36,6 @@ module Friends
|
|
43
36
|
names.each { |name| file.puts(name) }
|
44
37
|
end
|
45
38
|
|
46
|
-
@cleaned_file = true
|
47
|
-
|
48
39
|
@filename
|
49
40
|
end
|
50
41
|
|
@@ -64,7 +55,6 @@ module Friends
|
|
64
55
|
end
|
65
56
|
|
66
57
|
@friends << friend
|
67
|
-
clean # Write a cleaned file.
|
68
58
|
|
69
59
|
friend # Return the added friend.
|
70
60
|
end
|
@@ -79,12 +69,8 @@ module Friends
|
|
79
69
|
raise FriendsError, e
|
80
70
|
end
|
81
71
|
|
82
|
-
|
83
|
-
activity.description ||= Readline.readline(activity.display_text)
|
84
|
-
|
85
|
-
activity.highlight_friends(introvert: self)
|
72
|
+
activity.highlight_friends(introvert: self) if activity.description
|
86
73
|
@activities.unshift(activity)
|
87
|
-
clean # Write a cleaned file.
|
88
74
|
|
89
75
|
activity # Return the added activity.
|
90
76
|
end
|
@@ -97,9 +83,6 @@ module Friends
|
|
97
83
|
def add_nickname(name:, nickname:)
|
98
84
|
friend = friend_with_name_in(name)
|
99
85
|
friend.add_nickname(nickname.strip)
|
100
|
-
|
101
|
-
clean # Write a cleaned file.
|
102
|
-
|
103
86
|
friend
|
104
87
|
end
|
105
88
|
|
@@ -112,9 +95,6 @@ module Friends
|
|
112
95
|
def remove_nickname(name:, nickname:)
|
113
96
|
friend = friend_with_name_in(name)
|
114
97
|
friend.remove_nickname(nickname.strip)
|
115
|
-
|
116
|
-
clean # Write a cleaned file.
|
117
|
-
|
118
98
|
friend
|
119
99
|
end
|
120
100
|
|
data/lib/friends/version.rb
CHANGED
data/test/activity_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require "./test/helper"
|
2
2
|
|
3
3
|
describe Friends::Activity do
|
4
4
|
let(:date) { Date.today }
|
@@ -174,6 +174,16 @@ describe Friends::Activity do
|
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
+
describe "when a friend's name is mentioned multiple times" do
|
178
|
+
let(:description) { "Dinner with Elizabeth. Elizabeth made us pasta." }
|
179
|
+
it "highlights all occurrences of the friend's name" do
|
180
|
+
subject
|
181
|
+
activity.description.
|
182
|
+
must_equal "Dinner with **Elizabeth Cady Stanton**."\
|
183
|
+
" **Elizabeth Cady Stanton** made us pasta."
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
177
187
|
describe "when there are multiple matches" do
|
178
188
|
describe "when there is context from past activities" do
|
179
189
|
let(:description) { "Dinner with Elizabeth and John." }
|
data/test/friend_spec.rb
CHANGED
data/test/introvert_spec.rb
CHANGED
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.11'
|
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-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: semverse
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.2'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.2'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|