usaidwat 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -4
- data/features/browse.feature +62 -15
- data/features/help.feature +1 -1
- data/features/step_definitions/time_steps.rb +3 -0
- data/features/support/time.rb +5 -0
- data/lib/usaidwat/algo.rb +31 -0
- data/lib/usaidwat/application.rb +7 -3
- data/lib/usaidwat/ext/string.rb +8 -0
- data/lib/usaidwat/ext/time.rb +86 -0
- data/lib/usaidwat/formatter.rb +2 -2
- data/lib/usaidwat/version.rb +1 -1
- data/lib/usaidwat.rb +1 -0
- data/spec/usaidwat/algo_spec.rb +53 -0
- data/spec/usaidwat/client_spec.rb +3 -3
- data/spec/usaidwat/formatter_spec.rb +10 -1
- data/spec/usaidwat/string_spec.rb +42 -0
- data/spec/usaidwat/time_spec.rb +204 -0
- data/usaidwat.gemspec +3 -2
- metadata +34 -10
- /data/features/fixtures/{palorchild.json → testuser.json} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2042e843c42b44f059297bb23e7350e9b0575978
|
4
|
+
data.tar.gz: 2a716a7208ab8af75b394701bd3b691f405b6a97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ed1d0358a6a8156dd27ac8f5e4bda3c2836874d126c8c40c850e07aa466c13d43fa1a0941b80ceddced3a52c56f5ba012f8a60f536ee21c7df91472ef162a51
|
7
|
+
data.tar.gz: 6a49f252762dd2664fb15f33b9966212ce0155e74d92c4771f17e91e021d34c95577313544ec88ebcbed5cd45b74cc2919af3504c4b0658479203e2dc9da31ff
|
data/Gemfile
CHANGED
data/features/browse.feature
CHANGED
@@ -6,13 +6,14 @@ Feature: Browse comments
|
|
6
6
|
|
7
7
|
Scenario: List all comments
|
8
8
|
Given the Reddit service returns comments for the user "mipadi"
|
9
|
+
And time is frozen at Jun 24, 2015 11:05 AM
|
9
10
|
When I run `usaidwat mipadi`
|
10
11
|
Then it should pass with:
|
11
12
|
"""
|
12
13
|
wikipedia
|
13
14
|
http://www.reddit.com/r/wikipedia/comments/142t4w/z/c79peed
|
14
15
|
Heisenbug: a software bug that seems to disappear or alter its behavior when one
|
15
|
-
|
16
|
+
over 3 years ago
|
16
17
|
|
17
18
|
Yep. My first experience with a Heisenbug occurred in a C++ program, and disappeared when I tried to print a variable with printf (only to reappear when that call was removed).
|
18
19
|
|
@@ -20,7 +21,7 @@ Feature: Browse comments
|
|
20
21
|
nyc
|
21
22
|
http://www.reddit.com/r/nyc/comments/141zqc/z/c79dxg6
|
22
23
|
NYC taxi roof lights get overhaul - A light simply will mean the cab is availab
|
23
|
-
|
24
|
+
over 3 years ago
|
24
25
|
|
25
26
|
It has a fare when the lights are *off.*
|
26
27
|
|
@@ -28,17 +29,17 @@ Feature: Browse comments
|
|
28
29
|
worldnews
|
29
30
|
http://www.reddit.com/r/worldnews/comments/140mra/z/c797jq4
|
30
31
|
Palestinians win upgraded UN status by wide margin
|
31
|
-
|
32
|
+
over 3 years ago
|
32
33
|
|
33
34
|
The Judgment of Solomon Accords.
|
34
35
|
"""
|
35
36
|
|
36
37
|
Scenario: List all comments for a user that does not exist
|
37
|
-
Given the Reddit service does not have a user "
|
38
|
-
When I run `usaidwat
|
38
|
+
Given the Reddit service does not have a user "testuser"
|
39
|
+
When I run `usaidwat testuser`
|
39
40
|
Then it should fail with:
|
40
41
|
"""
|
41
|
-
No such user:
|
42
|
+
No such user: testuser
|
42
43
|
"""
|
43
44
|
|
44
45
|
Scenario: List all comments when user has no comments
|
@@ -69,6 +70,26 @@ Feature: Browse comments
|
|
69
70
|
worldnews 2
|
70
71
|
"""
|
71
72
|
|
73
|
+
Scenario: Sort comments
|
74
|
+
Given the Reddit service returns comments for the user "mipadi"
|
75
|
+
When I run `usaidwat -T mipadi`
|
76
|
+
Then it should pass with:
|
77
|
+
"""
|
78
|
+
AskReddit 61
|
79
|
+
programming 20
|
80
|
+
apple 6
|
81
|
+
battlefield3 2
|
82
|
+
books 2
|
83
|
+
worldnews 2
|
84
|
+
django 1
|
85
|
+
Games 1
|
86
|
+
nyc 1
|
87
|
+
personalfinance 1
|
88
|
+
photography 1
|
89
|
+
redditcasual 1
|
90
|
+
wikipedia 1
|
91
|
+
"""
|
92
|
+
|
72
93
|
Scenario: Tally comments when user has no comments
|
73
94
|
Given the Reddit service returns comments for the user "blank"
|
74
95
|
When I run `usaidwat -t blank`
|
@@ -77,15 +98,24 @@ Feature: Browse comments
|
|
77
98
|
blank has no comments.
|
78
99
|
"""
|
79
100
|
|
101
|
+
Scenario: Sort comments when user has no comments
|
102
|
+
Given the Reddit service returns comments for the user "blank"
|
103
|
+
When I run `usaidwat -T blank`
|
104
|
+
Then it should pass with:
|
105
|
+
"""
|
106
|
+
blank has no comments.
|
107
|
+
"""
|
108
|
+
|
80
109
|
Scenario: List comments for a particular subreddit
|
81
110
|
Given the Reddit service returns comments for the user "mipadi"
|
111
|
+
And time is frozen at Jun 24, 2015 11:05 AM
|
82
112
|
When I run `usaidwat mipadi AskReddit`
|
83
113
|
Then it should pass with:
|
84
114
|
"""
|
85
115
|
AskReddit
|
86
116
|
http://www.reddit.com/r/AskReddit/comments/141kt9/z/c795rwz
|
87
117
|
Do colleges actually teach students how to think critically? Or even to think/qu
|
88
|
-
|
118
|
+
over 3 years ago
|
89
119
|
|
90
120
|
I think it depends on where you go and what you study, but yes, I think they do teach you to think critically, especially in humanities courses and seminars. Maybe it's just because I went to a small, private liberal arts college rather than a huge school, but critical thinking was definitely a part of my education.
|
91
121
|
|
@@ -93,7 +123,7 @@ Feature: Browse comments
|
|
93
123
|
AskReddit
|
94
124
|
http://www.reddit.com/r/AskReddit/comments/140t5c/z/c795nw3
|
95
125
|
I'm from Tennessee and most of our jokes are geared toward Mississippi and Alaba
|
96
|
-
|
126
|
+
over 3 years ago
|
97
127
|
|
98
128
|
You're from New Jersey? Which exit?
|
99
129
|
|
@@ -101,20 +131,21 @@ Feature: Browse comments
|
|
101
131
|
AskReddit
|
102
132
|
http://www.reddit.com/r/AskReddit/comments/140h3z/z/c795muo
|
103
133
|
Today I was going 80mph in a 55 when an unmarked police car pulled up next to me
|
104
|
-
|
134
|
+
over 3 years ago
|
105
135
|
|
106
136
|
You didn't slow down for very long though, did you?
|
107
137
|
"""
|
108
138
|
|
109
139
|
Scenario: List comments for a particular subreddit specified with the wrong case
|
110
140
|
Given the Reddit service returns comments for the user "mipadi"
|
141
|
+
And time is frozen at Jun 24, 2015 11:05 AM
|
111
142
|
When I run `usaidwat mipadi askreddit`
|
112
143
|
Then it should pass with:
|
113
144
|
"""
|
114
145
|
AskReddit
|
115
146
|
http://www.reddit.com/r/AskReddit/comments/141kt9/z/c795rwz
|
116
147
|
Do colleges actually teach students how to think critically? Or even to think/qu
|
117
|
-
|
148
|
+
over 3 years ago
|
118
149
|
|
119
150
|
I think it depends on where you go and what you study, but yes, I think they do teach you to think critically, especially in humanities courses and seminars. Maybe it's just because I went to a small, private liberal arts college rather than a huge school, but critical thinking was definitely a part of my education.
|
120
151
|
|
@@ -122,7 +153,7 @@ Feature: Browse comments
|
|
122
153
|
AskReddit
|
123
154
|
http://www.reddit.com/r/AskReddit/comments/140t5c/z/c795nw3
|
124
155
|
I'm from Tennessee and most of our jokes are geared toward Mississippi and Alaba
|
125
|
-
|
156
|
+
over 3 years ago
|
126
157
|
|
127
158
|
You're from New Jersey? Which exit?
|
128
159
|
|
@@ -130,7 +161,7 @@ Feature: Browse comments
|
|
130
161
|
AskReddit
|
131
162
|
http://www.reddit.com/r/AskReddit/comments/140h3z/z/c795muo
|
132
163
|
Today I was going 80mph in a 55 when an unmarked police car pulled up next to me
|
133
|
-
|
164
|
+
over 3 years ago
|
134
165
|
|
135
166
|
You didn't slow down for very long though, did you?
|
136
167
|
"""
|
@@ -148,7 +179,15 @@ Feature: Browse comments
|
|
148
179
|
When I run `usaidwat -t mipadi AskReddit`
|
149
180
|
Then it should fail with:
|
150
181
|
"""
|
151
|
-
Usage: usaidwat [-t] <user> [<subreddit>]
|
182
|
+
Usage: usaidwat [-t | -T] <user> [<subreddit>]
|
183
|
+
"""
|
184
|
+
|
185
|
+
Scenario: Sort comments with subreddit
|
186
|
+
Given the Reddit service returns comments for the user "mipadi"
|
187
|
+
When I run `usaidwat -T mipadi AskReddit`
|
188
|
+
Then it should fail with:
|
189
|
+
"""
|
190
|
+
Usage: usaidwat [-t | -T] <user> [<subreddit>]
|
152
191
|
"""
|
153
192
|
|
154
193
|
Scenario: Pass no arguments
|
@@ -156,7 +195,7 @@ Feature: Browse comments
|
|
156
195
|
When I run `usaidwat`
|
157
196
|
Then it should fail with:
|
158
197
|
"""
|
159
|
-
Usage: usaidwat [-t] <user> [<subreddit>]
|
198
|
+
Usage: usaidwat [-t | -T] <user> [<subreddit>]
|
160
199
|
"""
|
161
200
|
|
162
201
|
Scenario: Pass no arguments when tallying
|
@@ -164,5 +203,13 @@ Feature: Browse comments
|
|
164
203
|
When I run `usaidwat -t`
|
165
204
|
Then it should fail with:
|
166
205
|
"""
|
167
|
-
Usage: usaidwat [-t] <user> [<subreddit>]
|
206
|
+
Usage: usaidwat [-t | -T] <user> [<subreddit>]
|
207
|
+
"""
|
208
|
+
|
209
|
+
Scenario: Pass no arguments when sorting
|
210
|
+
Given the Reddit service returns comments for the user "mipadi"
|
211
|
+
When I run `usaidwat -T`
|
212
|
+
Then it should fail with:
|
213
|
+
"""
|
214
|
+
Usage: usaidwat [-t | -T] <user> [<subreddit>]
|
168
215
|
"""
|
data/features/help.feature
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module USaidWat
|
2
|
+
module Algorithms
|
3
|
+
class Algorithm
|
4
|
+
attr_reader :buckets
|
5
|
+
|
6
|
+
def initialize(buckets)
|
7
|
+
@buckets = buckets
|
8
|
+
end
|
9
|
+
|
10
|
+
def sort(a, b)
|
11
|
+
a <=> b
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class LexicographicalAlgorithm < Algorithm
|
16
|
+
def sort(a, b)
|
17
|
+
a.downcase <=> b.downcase
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class CountAlgorithm < Algorithm
|
22
|
+
def sort(a, b)
|
23
|
+
if buckets[a] == buckets[b]
|
24
|
+
a.downcase <=> b.downcase
|
25
|
+
else
|
26
|
+
buckets[b] <=> buckets[a]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/usaidwat/application.rb
CHANGED
@@ -17,6 +17,7 @@ module USaidWat
|
|
17
17
|
opts, args = handle_arguments(argv)
|
18
18
|
username = args.first
|
19
19
|
@redditor = @client.new(username)
|
20
|
+
@algo = opts.algorithm
|
20
21
|
begin
|
21
22
|
return tally_comments if opts.tally
|
22
23
|
return list_comments_for_subreddit(args[1]) if args.length == 2
|
@@ -27,7 +28,7 @@ module USaidWat
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def usage(code=0)
|
30
|
-
puts "Usage: usaidwat [-t] <user> [<subreddit>]"
|
31
|
+
puts "Usage: usaidwat [-t | -T] <user> [<subreddit>]"
|
31
32
|
exit code
|
32
33
|
end
|
33
34
|
|
@@ -68,7 +69,8 @@ module USaidWat
|
|
68
69
|
longest_subreddit = subreddit.length if subreddit.length > longest_subreddit
|
69
70
|
buckets[subreddit] += 1
|
70
71
|
end
|
71
|
-
|
72
|
+
algo = @algo.new(buckets)
|
73
|
+
subreddits = buckets.keys.sort { |a,b| algo.sort(a, b) }
|
72
74
|
subreddits.each do |subreddit|
|
73
75
|
tally = buckets[subreddit]
|
74
76
|
printf "%-*s %3d\n", longest_subreddit, subreddit, tally
|
@@ -80,11 +82,13 @@ module USaidWat
|
|
80
82
|
def handle_arguments(argv)
|
81
83
|
opts = OpenStruct.new
|
82
84
|
opts.tally = false
|
85
|
+
opts.algorithm = USaidWat::Algorithms::LexicographicalAlgorithm
|
83
86
|
usage(1) if argv.length == 0
|
84
87
|
usage if argv.first == "--help"
|
85
88
|
version if argv.first == "--version"
|
86
|
-
if argv.first
|
89
|
+
if %W{-t -T}.include?(argv.first)
|
87
90
|
opts.tally = true
|
91
|
+
opts.algorithm = USaidWat::Algorithms::CountAlgorithm if argv.first == "-T"
|
88
92
|
argv.shift
|
89
93
|
usage(1) unless argv.length == 1
|
90
94
|
end
|
data/lib/usaidwat/ext/string.rb
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'usaidwat/ext/string'
|
2
|
+
|
3
|
+
class Time
|
4
|
+
def ago
|
5
|
+
case minutes_ago
|
6
|
+
when 0..1
|
7
|
+
case seconds_ago
|
8
|
+
when 0..5 then "less than 5 seconds ago"
|
9
|
+
when 6..10 then "less than 10 seconds ago"
|
10
|
+
when 11..20 then "less than 20 seconds ago"
|
11
|
+
when 21..40 then "half a minute ago"
|
12
|
+
when 41..59 then "less than a minute ago"
|
13
|
+
else "a minute ago"
|
14
|
+
end
|
15
|
+
when 2..45 then "#{minutes_ago.round} minutes ago"
|
16
|
+
when 46..90 then "about an hour ago"
|
17
|
+
when 90..1440 then "about #{hours_ago.round} hours ago"
|
18
|
+
when 1441..2880 then "a day ago"
|
19
|
+
when 2881..10080 then "about #{days_ago.round} days ago"
|
20
|
+
when 10081..43220 then "about #{weeks_ago.round} #{"week".pluralize(weeks_ago.round)} ago"
|
21
|
+
when 43221..525960 then "about #{months_ago.round} #{"month".pluralize(months_ago.round)} ago"
|
22
|
+
when 525960..1051920 then "about a year ago"
|
23
|
+
else "over #{years_ago.round} years ago"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def seconds_ago
|
28
|
+
Time.now.to_i - to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
def minutes_ago
|
32
|
+
seconds_ago / 60.0
|
33
|
+
end
|
34
|
+
|
35
|
+
def hours_ago
|
36
|
+
minutes_ago / 60.0
|
37
|
+
end
|
38
|
+
|
39
|
+
def days_ago
|
40
|
+
hours_ago / 24.0
|
41
|
+
end
|
42
|
+
|
43
|
+
def weeks_ago
|
44
|
+
days_ago / 7.0
|
45
|
+
end
|
46
|
+
|
47
|
+
def months_ago
|
48
|
+
days_ago / 30.0
|
49
|
+
end
|
50
|
+
|
51
|
+
def years_ago
|
52
|
+
days_ago / 365.0
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class Integer
|
57
|
+
def seconds
|
58
|
+
self
|
59
|
+
end
|
60
|
+
alias_method :second, :seconds
|
61
|
+
|
62
|
+
def minutes
|
63
|
+
self * 60
|
64
|
+
end
|
65
|
+
alias_method :minute, :minutes
|
66
|
+
|
67
|
+
def hours
|
68
|
+
minutes * 60
|
69
|
+
end
|
70
|
+
alias_method :hour, :hours
|
71
|
+
|
72
|
+
def days
|
73
|
+
hours * 24
|
74
|
+
end
|
75
|
+
alias_method :day, :days
|
76
|
+
|
77
|
+
def weeks
|
78
|
+
days * 7
|
79
|
+
end
|
80
|
+
alias_method :week, :weeks
|
81
|
+
|
82
|
+
def years
|
83
|
+
days * 365
|
84
|
+
end
|
85
|
+
alias_method :year, :years
|
86
|
+
end
|
data/lib/usaidwat/formatter.rb
CHANGED
@@ -3,6 +3,7 @@ require 'highline'
|
|
3
3
|
require 'stringio'
|
4
4
|
require 'rainbow/ext/string'
|
5
5
|
require 'usaidwat/ext/string'
|
6
|
+
require 'usaidwat/ext/time'
|
6
7
|
|
7
8
|
Rainbow.enabled = true unless ENV['USAIDWAT_ENV'] == 'cucumber'
|
8
9
|
|
@@ -35,8 +36,7 @@ module USaidWat
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def comment_date(comment)
|
38
|
-
|
39
|
-
DateTime.strptime(comment.created_utc.to_s, "%s").to_time.localtime.strftime(fmt)
|
39
|
+
DateTime.strptime(comment.created_utc.to_s, "%s").to_time.localtime.ago
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/usaidwat/version.rb
CHANGED
data/lib/usaidwat.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module USaidWat
|
4
|
+
module Algorithms
|
5
|
+
describe LexicographicalAlgorithm do
|
6
|
+
let (:algo) { LexicographicalAlgorithm.new(nil) }
|
7
|
+
|
8
|
+
it "should return -1 if the first object is before the second" do
|
9
|
+
expect(algo.sort("a", "b")).to eq(-1)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return 1 if the first object is after the second" do
|
13
|
+
expect(algo.sort("b", "a")).to eq(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should return 0 if the objects are equal" do
|
17
|
+
expect(algo.sort("a", "a")).to eq(0)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should ignore case when comparing objects that are ordered" do
|
21
|
+
expect(algo.sort("a", "B")).to eq(-1)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should ignore case when comparing objects that are ordered in reverse" do
|
25
|
+
expect(algo.sort("B", "a")).to eq(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should ignore case when comparing equal objects" do
|
29
|
+
expect(algo.sort("A", "a")).to eq(0)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe CountAlgorithm do
|
34
|
+
let (:algo) { CountAlgorithm.new({"a" => 10, "b" => 20, "c" => 5, "d" => 10}) }
|
35
|
+
|
36
|
+
it "should return -1 if the first object has a higher count than the second" do
|
37
|
+
expect(algo.sort("b", "a")).to eq(-1)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return 1 if the first object has a lower count than the second" do
|
41
|
+
expect(algo.sort("a", "b")).to eq(1)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return -1 if the objects have the same count but the first occurs first alphabetically" do
|
45
|
+
expect(algo.sort("a", "d")).to eq(-1)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return 1 if the objects have the same count but the second occurs first alphabetically" do
|
49
|
+
expect(algo.sort("d", "a")).to eq(1)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -38,13 +38,13 @@ module USaidWat
|
|
38
38
|
WebMock.disable_net_connect!
|
39
39
|
WebMock.reset!
|
40
40
|
root = File.expand_path("../../../features/fixtures", __FILE__)
|
41
|
-
stub_request(:get, "http://www.reddit.com/user/
|
42
|
-
to_return(:status => 404, :body => IO.read(File.join(root, "
|
41
|
+
stub_request(:get, "http://www.reddit.com/user/testuser/comments.json?after=&limit=100").
|
42
|
+
to_return(:status => 404, :body => IO.read(File.join(root, "testuser.json")))
|
43
43
|
end
|
44
44
|
|
45
45
|
describe "#comments" do
|
46
46
|
it "raises an exception if the user does not exist" do
|
47
|
-
expect { Redditor.new("
|
47
|
+
expect { Redditor.new("testuser").comments }.to raise_error(NoSuchUserError, /testuser/)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
@@ -1,9 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'timecop'
|
2
3
|
|
3
4
|
module USaidWat
|
4
5
|
module CLI
|
5
6
|
describe CommentFormatter do
|
6
7
|
let(:formatter) { CommentFormatter.new }
|
8
|
+
|
9
|
+
before do
|
10
|
+
Timecop.freeze(Time.new(2015, 6, 16, 17, 8))
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
Timecop.return
|
15
|
+
end
|
7
16
|
|
8
17
|
describe "#format" do
|
9
18
|
it "should return a string containing the formatted comment" do
|
@@ -18,7 +27,7 @@ module USaidWat
|
|
18
27
|
programming
|
19
28
|
http://www.reddit.com/r/programming/comments/13f783/z/c73qhxi
|
20
29
|
Why Brit Ruby 2013 was cancelled and why this is not ok - Gist
|
21
|
-
|
30
|
+
about 2 weeks ago
|
22
31
|
|
23
32
|
Welcome to the wonderful world of Python drama!
|
24
33
|
EXPECTED
|
@@ -25,6 +25,48 @@ module USaidWat
|
|
25
25
|
expect(actual).to eq(expected)
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
describe "#truncate" do
|
30
|
+
it "truncates strings longer than the given width to the width" do
|
31
|
+
n = 80
|
32
|
+
s = "-" * n * 2
|
33
|
+
expect(s.truncate(n).length).to eq(n)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not change strings shorter than the given width" do
|
37
|
+
n = 80
|
38
|
+
s = "string"
|
39
|
+
expect(s.truncate(n).length).to eq(s.length)
|
40
|
+
expect(s.truncate(n).length).to be < n
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#pluralize" do
|
45
|
+
it "should not append an 's' to a singular noun" do
|
46
|
+
s = "dog"
|
47
|
+
expect(s.pluralize(1)).to eq(s)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should append an 's' to a plural noun" do
|
51
|
+
s = "dog"
|
52
|
+
expect(s.pluralize(2)).to eq("dogs")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should append an 's' to a noun with count 0" do
|
56
|
+
s = "dog"
|
57
|
+
expect(s.pluralize(0)).to eq("dogs")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should append 'ies' to a plural noun" do
|
61
|
+
s = "popp"
|
62
|
+
expect(s.pluralize(2, "ies", "y")).to eq("poppies")
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should not append 'ies' to a singular noun" do
|
66
|
+
s = "popp"
|
67
|
+
expect(s.pluralize(1, "ies", "y")).to eq("poppy")
|
68
|
+
end
|
69
|
+
end
|
28
70
|
end
|
29
71
|
end
|
30
72
|
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'timecop'
|
3
|
+
|
4
|
+
module USaidWat
|
5
|
+
module Ext
|
6
|
+
describe Integer do
|
7
|
+
describe "#seconds" do
|
8
|
+
it "should convert itself into seconds" do
|
9
|
+
expect(10.seconds).to eq(10)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should accept a singular form of seconds" do
|
13
|
+
expect(1.second).to eq(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should convert itself into minutes" do
|
17
|
+
expect(10.minutes).to eq(600)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should accept a singular form of minutes" do
|
21
|
+
expect(1.minute).to eq(60)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should convert itself into hours" do
|
25
|
+
expect(10.hours).to eq(36_000)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should accept a singular form of hours" do
|
29
|
+
expect(1.hour).to eq(3600)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should convert itself into days" do
|
33
|
+
expect(10.days).to eq(864_000)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should accept a singular form of days" do
|
37
|
+
expect(1.day).to eq(86_400)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should convert itself into weeks" do
|
41
|
+
expect(10.weeks).to eq(6_048_000)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should accept a singular form of weeks" do
|
45
|
+
expect(1.week).to eq(604_800)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should convert itself into years" do
|
49
|
+
expect(10.years).to eq(315_360_000)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should accept a singular form of years" do
|
53
|
+
expect(1.year).to eq(31_536_000)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe Time do
|
59
|
+
before do
|
60
|
+
Timecop.freeze(2015, 6, 23, 17, 22, 0)
|
61
|
+
end
|
62
|
+
|
63
|
+
after do
|
64
|
+
Timecop.return
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#seconds_ago" do
|
68
|
+
it "returns the elapsed seconds between now and then" do
|
69
|
+
then_ = Time.new(2015, 6, 23, 17, 21, 25)
|
70
|
+
expect(then_.seconds_ago).to eq(35)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#minutes_ago" do
|
75
|
+
it "returns the elapsed minutes between now and then" do
|
76
|
+
then_ = Time.new(2015, 6, 23, 17, 20, 30)
|
77
|
+
expect(then_.minutes_ago).to be_within(0.01).of(1.5)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#hours_ago" do
|
82
|
+
it "returns the elapsed hours between now and then" do
|
83
|
+
then_ = Time.new(2015, 6, 23, 13, 12)
|
84
|
+
expect(then_.hours_ago).to be_within(0.01).of(4.16)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "#days_ago" do
|
89
|
+
it "returns the elapsed days between now and then" do
|
90
|
+
then_ = Time.new(2015, 6, 18, 8, 14)
|
91
|
+
expect(then_.days_ago).to be_within(0.01).of(5.38)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#weeks_ago" do
|
96
|
+
it "returns the elapsed weeks between now and then" do
|
97
|
+
then_ = Time.new(2015, 5, 26, 12, 14)
|
98
|
+
expect(then_.weeks_ago).to be_within(0.01).of(4.03)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "#months_ago" do
|
103
|
+
it "returns the elapsed months between now and then" do
|
104
|
+
then_ = Time.new(2013, 12, 25, 7, 49)
|
105
|
+
expect(then_.months_ago).to be_within(0.01).of(18.17)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "#years_ago" do
|
110
|
+
it "returns the elapsed years between now and then" do
|
111
|
+
then_ = Time.new(1988, 4, 1, 21, 32)
|
112
|
+
expect(then_.years_ago).to be_within(0.01).of(27.24)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#ago" do
|
117
|
+
it "should respond when then was a few seconds ago" do
|
118
|
+
then_ = Time.now - 5
|
119
|
+
expect(then_.ago).to eq("less than 5 seconds ago")
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should respond when then was less than 10 seconds ago" do
|
123
|
+
then_ = Time.now - 10
|
124
|
+
expect(then_.ago).to eq("less than 10 seconds ago")
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should respond when then was less than 20 seconds ago" do
|
128
|
+
then_ = Time.now - 20
|
129
|
+
expect(then_.ago).to eq("less than 20 seconds ago")
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should respond when then was less than a half minute ago" do
|
133
|
+
then_ = Time.now - 40
|
134
|
+
expect(then_.ago).to eq("half a minute ago")
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should respond when then was less than a minute ago" do
|
138
|
+
then_ = Time.now - 59
|
139
|
+
expect(then_.ago).to eq("less than a minute ago")
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should respond when then was a minute ago" do
|
143
|
+
then_ = Time.now - 1.minute
|
144
|
+
expect(then_.ago).to eq("a minute ago")
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should respond when then was several minutes ago" do
|
148
|
+
then_ = Time.now - 45.minutes
|
149
|
+
expect(then_.ago).to eq("45 minutes ago")
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should respond when then was an hour ago" do
|
153
|
+
then_ = Time.now - 90.minutes
|
154
|
+
expect(then_.ago).to eq("about an hour ago")
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should respond when then was several hours ago" do
|
158
|
+
then_ = Time.now - 1440.minutes
|
159
|
+
expect(then_.ago).to eq("about 24 hours ago")
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should respond when then was a day ago" do
|
163
|
+
then_ = Time.now - 2880.minutes
|
164
|
+
expect(then_.ago).to eq("a day ago")
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should respond when then was several days ago" do
|
168
|
+
then_ = Time.now - 10080.minutes
|
169
|
+
expect(then_.ago).to eq("about 7 days ago")
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should respond when then was a week ago" do
|
173
|
+
then_ = Time.now - 1.week - 1.minute
|
174
|
+
expect(then_.ago).to eq("about 1 week ago")
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should respond when then was several weeks ago" do
|
178
|
+
then_ = Time.now - 43220.minutes
|
179
|
+
expect(then_.ago).to eq("about 4 weeks ago")
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should respond when then was a month ago" do
|
183
|
+
then_ = Time.now - 43221.minutes
|
184
|
+
expect(then_.ago).to eq("about 1 month ago")
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should respond when then was several months ago" do
|
188
|
+
then_ = Time.now - 180.days
|
189
|
+
expect(then_.ago).to eq("about 6 months ago")
|
190
|
+
end
|
191
|
+
|
192
|
+
it "should respond when then was a year ago" do
|
193
|
+
then_ = Time.now - 1051920.minutes
|
194
|
+
expect(then_.ago).to eq("about a year ago")
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should respond when then was several years ago" do
|
198
|
+
then_ = Time.now - 1051920.minutes - 1
|
199
|
+
expect(then_.ago).to eq("over 2 years ago")
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
data/usaidwat.gemspec
CHANGED
@@ -22,8 +22,9 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_runtime_dependency('rainbow', '~> 2.0')
|
23
23
|
gem.add_runtime_dependency('highline', '~> 1.7', '>= 1.7.2')
|
24
24
|
|
25
|
-
gem.add_development_dependency('rspec', '~> 3.2')
|
26
|
-
gem.add_development_dependency('cucumber', '~> 2.0')
|
27
25
|
gem.add_development_dependency('aruba', '~> 0.6.2')
|
26
|
+
gem.add_development_dependency('cucumber', '~> 2.0')
|
27
|
+
gem.add_development_dependency('rspec', '~> 3.2')
|
28
|
+
gem.add_development_dependency('timecop', '~> 0.7.4')
|
28
29
|
gem.add_development_dependency('webmock', '~> 1.21')
|
29
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usaidwat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Dippery
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: snooby
|
@@ -59,19 +59,19 @@ dependencies:
|
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 1.7.2
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
62
|
+
name: aruba
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
67
|
+
version: 0.6.2
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
74
|
+
version: 0.6.2
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: cucumber
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,19 +87,33 @@ dependencies:
|
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '2.0'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
90
|
+
name: rspec
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
95
|
+
version: '3.2'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
102
|
+
version: '3.2'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: timecop
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.7.4
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.7.4
|
103
117
|
- !ruby/object:Gem::Dependency
|
104
118
|
name: webmock
|
105
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,22 +145,28 @@ files:
|
|
131
145
|
- features/browse.feature
|
132
146
|
- features/fixtures/blank.json
|
133
147
|
- features/fixtures/mipadi.json
|
134
|
-
- features/fixtures/
|
148
|
+
- features/fixtures/testuser.json
|
135
149
|
- features/help.feature
|
136
150
|
- features/step_definitions/reddit_steps.rb
|
151
|
+
- features/step_definitions/time_steps.rb
|
137
152
|
- features/support/aruba.rb
|
153
|
+
- features/support/time.rb
|
138
154
|
- lib/usaidwat.rb
|
155
|
+
- lib/usaidwat/algo.rb
|
139
156
|
- lib/usaidwat/application.rb
|
140
157
|
- lib/usaidwat/client.rb
|
141
158
|
- lib/usaidwat/ext/string.rb
|
159
|
+
- lib/usaidwat/ext/time.rb
|
142
160
|
- lib/usaidwat/formatter.rb
|
143
161
|
- lib/usaidwat/service.rb
|
144
162
|
- lib/usaidwat/version.rb
|
145
163
|
- spec/spec_helper.rb
|
164
|
+
- spec/usaidwat/algo_spec.rb
|
146
165
|
- spec/usaidwat/client_spec.rb
|
147
166
|
- spec/usaidwat/formatter_spec.rb
|
148
167
|
- spec/usaidwat/service_spec.rb
|
149
168
|
- spec/usaidwat/string_spec.rb
|
169
|
+
- spec/usaidwat/time_spec.rb
|
150
170
|
- usaidwat.gemspec
|
151
171
|
homepage: https://github.com/mdippery/usaidwat
|
152
172
|
licenses:
|
@@ -176,12 +196,16 @@ test_files:
|
|
176
196
|
- features/browse.feature
|
177
197
|
- features/fixtures/blank.json
|
178
198
|
- features/fixtures/mipadi.json
|
179
|
-
- features/fixtures/
|
199
|
+
- features/fixtures/testuser.json
|
180
200
|
- features/help.feature
|
181
201
|
- features/step_definitions/reddit_steps.rb
|
202
|
+
- features/step_definitions/time_steps.rb
|
182
203
|
- features/support/aruba.rb
|
204
|
+
- features/support/time.rb
|
183
205
|
- spec/spec_helper.rb
|
206
|
+
- spec/usaidwat/algo_spec.rb
|
184
207
|
- spec/usaidwat/client_spec.rb
|
185
208
|
- spec/usaidwat/formatter_spec.rb
|
186
209
|
- spec/usaidwat/service_spec.rb
|
187
210
|
- spec/usaidwat/string_spec.rb
|
211
|
+
- spec/usaidwat/time_spec.rb
|
File without changes
|