ayadn 1.4.6 → 1.5.0
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/.gitignore +0 -1
- data/CHANGELOG.md +14 -1
- data/README.md +38 -13
- data/ayadn.gemspec +2 -2
- data/doc/01-index.md +38 -0
- data/doc/02-install.md +24 -0
- data/doc/03-first-steps.md +161 -0
- data/doc/04-options.md +13 -0
- data/doc/05-streams.md +288 -0
- data/doc/06-post.md +109 -0
- data/doc/07-actions.md +115 -0
- data/doc/08-listings.md +85 -0
- data/doc/09-accounts.md +33 -0
- data/doc/10-nicerank.md +58 -0
- data/doc/11-blacklist.md +85 -0
- data/doc/12-alias.md +57 -0
- data/doc/13-bookmark.md +51 -0
- data/doc/14-set.md +139 -0
- data/doc/15-nowplaying.md +23 -0
- data/doc/16-contact.md +29 -0
- data/doc/17-shortcuts.md +8 -0
- data/doc/18-examples.md +43 -0
- data/lib/ayadn/action.rb +147 -88
- data/lib/ayadn/api.rb +19 -37
- data/lib/ayadn/app.rb +4 -5
- data/lib/ayadn/databases.rb +0 -6
- data/lib/ayadn/debug.rb +6 -0
- data/lib/ayadn/endpoints.rb +5 -1
- data/lib/ayadn/mark.rb +2 -2
- data/lib/ayadn/nicerank.rb +34 -10
- data/lib/ayadn/post.rb +20 -0
- data/lib/ayadn/set.rb +0 -37
- data/lib/ayadn/settings.rb +32 -20
- data/lib/ayadn/version.rb +1 -1
- data/lib/ayadn/view.rb +52 -32
- data/lib/ayadn/workers.rb +54 -15
- data/spec/unit/api_spec.rb +0 -27
- data/spec/unit/view_spec.rb +11 -11
- data/spec/unit/workers_spec.rb +46 -47
- metadata +23 -5
data/lib/ayadn/view.rb
CHANGED
@@ -17,7 +17,7 @@ module Ayadn
|
|
17
17
|
puts resp unless resp == ""
|
18
18
|
end
|
19
19
|
|
20
|
-
def show_raw(stream)
|
20
|
+
def show_raw(stream, options = {})
|
21
21
|
#puts stream.to_json
|
22
22
|
jj stream
|
23
23
|
end
|
@@ -83,7 +83,7 @@ module Ayadn
|
|
83
83
|
@iter = 0
|
84
84
|
opts = Settings.options.dup
|
85
85
|
opts.each do |k,v|
|
86
|
-
v.delete_if {|ke,_| ke == :deleted || ke == :annotations
|
86
|
+
v.delete_if {|ke,_| ke == :deleted || ke == :annotations} # don't show immutable values
|
87
87
|
v.each do |x,y|
|
88
88
|
t << :separator if @iter >= 1
|
89
89
|
unless y.is_a?(Hash)
|
@@ -101,7 +101,7 @@ module Ayadn
|
|
101
101
|
puts table
|
102
102
|
end
|
103
103
|
|
104
|
-
def show_userinfos(content, token)
|
104
|
+
def show_userinfos(content, token, show_ranks = false)
|
105
105
|
if content['name']
|
106
106
|
view = "Name\t\t\t".color(:cyan) + content['name'].color(Settings.options[:colors][:name])
|
107
107
|
else
|
@@ -130,10 +130,20 @@ module Ayadn
|
|
130
130
|
|
131
131
|
view << "\n\nPosts\t\t\t".color(:cyan) + content['counts']['posts'].to_s.color(:green)
|
132
132
|
|
133
|
+
|
134
|
+
unless show_ranks == false
|
135
|
+
# this is ok for one user, but do not call this in a loop
|
136
|
+
# do call them all at once instead if many
|
137
|
+
ranks = NiceRank.new.get_posts_day([content['id'].to_i])
|
138
|
+
unless ranks.empty?
|
139
|
+
view << "\n\nPosts/day\t\t".color(:cyan) + ranks[0][:posts_day].to_s.color(:green)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
133
143
|
view << "\n\nFollowing\t\t".color(:cyan) + content['counts']['following'].to_s.color(:green)
|
134
144
|
view << "\nFollowers\t\t".color(:cyan) + content['counts']['followers'].to_s.color(:green)
|
135
145
|
|
136
|
-
if content['username'] == Settings.config[:identity][:username]
|
146
|
+
if content['username'] == Settings.config[:identity][:username] && !token.nil?
|
137
147
|
view << "\n\nStorage used\t\t".color(:cyan) + "#{token['storage']['used'].to_filesize}".color(:red)
|
138
148
|
view << "\nStorage available\t".color(:cyan) + "#{token['storage']['available'].to_filesize}".color(:green)
|
139
149
|
end
|
@@ -288,23 +298,21 @@ module Ayadn
|
|
288
298
|
end
|
289
299
|
|
290
300
|
def filter_nicerank posts, options
|
291
|
-
if options[:filter] == true #
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
if
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
next if content[:real_person] == false
|
303
|
-
end
|
304
|
-
filtered[id] = content
|
301
|
+
if options[:filter] == true # if this option is true in Action (it's only for global, actually)
|
302
|
+
if Settings.options[:nicerank][:filter] == true
|
303
|
+
filtered = {}
|
304
|
+
posts.each do |id,content|
|
305
|
+
if Settings.options[:nicerank][:filter_unranked] == true
|
306
|
+
next if content[:nicerank] == false
|
307
|
+
end
|
308
|
+
unless content[:nicerank] == false
|
309
|
+
next if content[:nicerank] < Settings.options[:nicerank][:threshold]
|
310
|
+
next if content[:is_human] == false
|
311
|
+
next if content[:real_person] == false
|
305
312
|
end
|
306
|
-
|
313
|
+
filtered[id] = content
|
307
314
|
end
|
315
|
+
return filtered
|
308
316
|
end
|
309
317
|
end
|
310
318
|
return posts
|
@@ -314,7 +322,9 @@ module Ayadn
|
|
314
322
|
@view = ""
|
315
323
|
posts = filter_nicerank(@workers.build_posts(data.reverse, niceranks), options)
|
316
324
|
posts.each do |id,content|
|
317
|
-
|
325
|
+
format = "%03d" % content[:count]
|
326
|
+
arrow = arrow_count(options, content)
|
327
|
+
count = "#{arrow}#{format}"
|
318
328
|
if content[:username] == Settings.config[:identity][:username]
|
319
329
|
@view << count.color(Settings.options[:colors][:index]).inverse
|
320
330
|
elsif content[:mentions].include?(Settings.config[:identity][:username]) && options[:in_mentions].nil?
|
@@ -332,18 +342,37 @@ module Ayadn
|
|
332
342
|
@view = ""
|
333
343
|
posts = filter_nicerank(@workers.build_posts(data.reverse, niceranks), options)
|
334
344
|
posts.each do |id,content|
|
345
|
+
content[:id] = arrow_id(options, content)
|
335
346
|
if content[:username] == Settings.config[:identity][:username]
|
336
|
-
@view << content[:id].
|
347
|
+
@view << content[:id].color(Settings.options[:colors][:id]).inverse + " "
|
337
348
|
elsif content[:mentions].include?(Settings.config[:identity][:username]) && options[:in_mentions].nil?
|
338
|
-
@view << content[:id].
|
349
|
+
@view << content[:id].color(Settings.options[:colors][:mentions]).inverse + " "
|
339
350
|
else
|
340
|
-
@view << content[:id].
|
351
|
+
@view << content[:id].color(Settings.options[:colors][:id]) + " "
|
341
352
|
end
|
342
353
|
@view << build_content(content)
|
343
354
|
end
|
344
355
|
@view
|
345
356
|
end
|
346
357
|
|
358
|
+
def arrow_count options, content
|
359
|
+
if options[:reply_to]
|
360
|
+
return '⬇︎ ' if options[:reply_to] == content[:id]
|
361
|
+
return '⬆︎ ' if options[:post_id] == content[:id]
|
362
|
+
return ''
|
363
|
+
end
|
364
|
+
''
|
365
|
+
end
|
366
|
+
|
367
|
+
def arrow_id options, content
|
368
|
+
if options[:reply_to]
|
369
|
+
return content[:id].to_s.prepend('⬇︎ ') if options[:reply_to] == content[:id]
|
370
|
+
return content[:id].to_s.prepend('⬆︎ ') if options[:post_id] == content[:id]
|
371
|
+
return content[:id].to_s
|
372
|
+
end
|
373
|
+
content[:id].to_s
|
374
|
+
end
|
375
|
+
|
347
376
|
def build_interactions_stream(data)
|
348
377
|
inter = ""
|
349
378
|
data.reverse.each do |event|
|
@@ -462,14 +491,6 @@ module Ayadn
|
|
462
491
|
header << " "
|
463
492
|
header << content[:name].color(Settings.options[:colors][:name])
|
464
493
|
end
|
465
|
-
|
466
|
-
if Settings.options[:timeline][:show_nicerank] == true && content[:nicerank]
|
467
|
-
if Settings.options[:nicerank][:filter] == true
|
468
|
-
header << " "
|
469
|
-
header << "[#{content[:nicerank]}]".color(Settings.options[:colors][:nicerank])
|
470
|
-
end
|
471
|
-
end
|
472
|
-
|
473
494
|
if Settings.options[:timeline][:show_date]
|
474
495
|
header << " "
|
475
496
|
header << content[:date].color(Settings.options[:colors][:date])
|
@@ -497,7 +518,6 @@ module Ayadn
|
|
497
518
|
hd << "\n"
|
498
519
|
formatted = { header: hd }
|
499
520
|
content[:checkins].each do |key, val|
|
500
|
-
#formatted[key] = val unless (val.nil? || !val)
|
501
521
|
formatted[key] = val
|
502
522
|
end
|
503
523
|
|
data/lib/ayadn/workers.rb
CHANGED
@@ -25,7 +25,7 @@ module Ayadn
|
|
25
25
|
users_list = []
|
26
26
|
list.each do |obj|
|
27
27
|
obj['name'].nil? ? name = "" : name = obj['name']
|
28
|
-
users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you']}
|
28
|
+
users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you'], :id => obj['id']}
|
29
29
|
end
|
30
30
|
table.style = {border_x: ' ', border_i: ' ', border_y: ' '}
|
31
31
|
return users_list, table
|
@@ -37,7 +37,7 @@ module Ayadn
|
|
37
37
|
users_list = []
|
38
38
|
list.each do |obj|
|
39
39
|
obj['name'].nil? ? name = "" : name = obj['name']
|
40
|
-
users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you']}
|
40
|
+
users_list << {:username => obj['username'], :name => name, :you_follow => obj['you_follow'], :follows_you => obj['follows_you'], :id => obj['id']}
|
41
41
|
end
|
42
42
|
table.style = {border_x: ' ', border_i: ' ', border_y: ' '}
|
43
43
|
return users_list, table
|
@@ -81,13 +81,37 @@ module Ayadn
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def build_users_list(list, table)
|
84
|
+
users = Workers.at(list.map {|obj| obj[:username]})
|
85
|
+
ids = list.map {|obj| obj[:id].to_i}
|
86
|
+
ranks = NiceRank.new.from_ids(ids)
|
87
|
+
indexed_ranks = {}
|
88
|
+
ranks.each do |r|
|
89
|
+
if r.empty?
|
90
|
+
indexed_ranks = false
|
91
|
+
break
|
92
|
+
else
|
93
|
+
indexed_ranks[r['user_id']] = r
|
94
|
+
end
|
95
|
+
end
|
96
|
+
table << ['USERNAME'.color(:red), 'NAME'.color(:red), 'POSTS/DAY'.color(:red)]
|
97
|
+
table << :separator
|
84
98
|
list.each_with_index do |obj, index|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
99
|
+
unless indexed_ranks == false
|
100
|
+
details = indexed_ranks[obj[:id].to_i]
|
101
|
+
if details['user']['posts_day'] == -1
|
102
|
+
posts_day = 'ignored'
|
103
|
+
else
|
104
|
+
posts_day = details['user']['posts_day'].round(2).to_s
|
105
|
+
end
|
106
|
+
else
|
107
|
+
posts_day = 'unknown'
|
108
|
+
end
|
109
|
+
obj[:username].length > 23 ? username = "#{obj[:username][0..20]}..." : username = obj[:username]
|
110
|
+
unless obj[:name].nil? || obj[:name].empty?
|
111
|
+
obj[:name].length > 23 ? name = "#{obj[:name][0..20]}..." : name = obj[:name]
|
112
|
+
table << [ "@#{username} ".color(Settings.options[:colors][:username]), "#{name}", posts_day ]
|
89
113
|
else
|
90
|
-
table << [ "@#{username} ".color(Settings.options[:colors][:username]), "" ]
|
114
|
+
table << [ "@#{username} ".color(Settings.options[:colors][:username]), "", posts_day ]
|
91
115
|
end
|
92
116
|
table << :separator unless index + 1 == list.length
|
93
117
|
end
|
@@ -97,15 +121,21 @@ module Ayadn
|
|
97
121
|
def build_posts(data, niceranks = {})
|
98
122
|
# builds a hash of hashes, each hash is a normalized post with post id as a key
|
99
123
|
posts = {}
|
100
|
-
|
101
124
|
data.each.with_index(1) do |post, index|
|
102
|
-
|
103
|
-
|
125
|
+
if Databases.blacklist[post['source']['name'].downcase]
|
126
|
+
Debug.skipped({source: post['source']['name']})
|
127
|
+
next
|
128
|
+
end
|
129
|
+
if Databases.blacklist["-@#{post['user']['username'].downcase}"]
|
130
|
+
Debug.skipped({user: post['user']['username']})
|
131
|
+
next
|
132
|
+
end
|
104
133
|
hashtags = extract_hashtags(post)
|
105
134
|
@skip = false
|
106
135
|
hashtags.each do |h|
|
107
136
|
if Databases.blacklist[h.downcase]
|
108
137
|
@skip = true
|
138
|
+
Debug.skipped({hashtag: h})
|
109
139
|
break
|
110
140
|
end
|
111
141
|
end
|
@@ -115,6 +145,7 @@ module Ayadn
|
|
115
145
|
mentions.each do |m|
|
116
146
|
if Databases.blacklist["@#{m.downcase}"]
|
117
147
|
@skip = true
|
148
|
+
Debug.skipped({mention: m})
|
118
149
|
break
|
119
150
|
end
|
120
151
|
end
|
@@ -271,6 +302,18 @@ module Ayadn
|
|
271
302
|
"#{string[0...10]} #{string[11...19]}"
|
272
303
|
end
|
273
304
|
|
305
|
+
def self.at usernames
|
306
|
+
usernames.map do |user|
|
307
|
+
if user == 'me'
|
308
|
+
'me'
|
309
|
+
elsif user[0] == '@'
|
310
|
+
user
|
311
|
+
else
|
312
|
+
"@#{user}"
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
274
317
|
def self.add_arobase_if_missing(username) # expects an array of username(s), works on the first one and outputs a string
|
275
318
|
unless username.first == "me"
|
276
319
|
username = username.first.chars
|
@@ -319,7 +362,6 @@ module Ayadn
|
|
319
362
|
|
320
363
|
def colorize_text(text, mentions, hashtags)
|
321
364
|
reg_split = '[~:-;,?!\'&`^=+<>*%()\/"“”’°£$€.…]'
|
322
|
-
#reg_tag = '#([A-Za-z0-9_]{1,255})(?![\w+])'
|
323
365
|
reg_tag = '#([[:alpha:]0-9_]{1,255})(?![\w+])'
|
324
366
|
reg_mention = '@([A-Za-z0-9_]{1,20})(?![\w+])'
|
325
367
|
reg_sentence = '^.+[\r\n]*'
|
@@ -404,7 +446,7 @@ module Ayadn
|
|
404
446
|
def build_users_array(list)
|
405
447
|
users_list = []
|
406
448
|
list.each do |key, value|
|
407
|
-
users_list << {:username => value[0], :name => value[1], :you_follow => value[2], :follows_you => value[3]}
|
449
|
+
users_list << {:username => value[0], :name => value[1], :you_follow => value[2], :follows_you => value[3], :id => key}
|
408
450
|
end
|
409
451
|
users_list
|
410
452
|
end
|
@@ -445,9 +487,6 @@ module Ayadn
|
|
445
487
|
unless obj['value']['region'].nil?
|
446
488
|
checkins[:region] = obj['value']['region']
|
447
489
|
end
|
448
|
-
#when "net.app.core.oembed"
|
449
|
-
#has_checkins = true
|
450
|
-
#checkins[:embeddable_url] = obj['value']['embeddable_url']
|
451
490
|
end
|
452
491
|
end
|
453
492
|
end
|
data/spec/unit/api_spec.rb
CHANGED
@@ -18,39 +18,12 @@ describe Ayadn::API do
|
|
18
18
|
it 'returns a URL with count=12' do
|
19
19
|
expect(Ayadn::API.build_query({count: 12})).to match /count=12/
|
20
20
|
end
|
21
|
-
it 'returns a URL with count=50' do
|
22
|
-
expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /count=50/
|
23
|
-
end
|
24
|
-
it 'returns a URL with count=50 (default)' do
|
25
|
-
expect(Ayadn::API.build_query({count: "I'm drunk"})).to match /count=50/
|
26
|
-
end
|
27
21
|
it 'returns a URL with directed=0' do
|
28
22
|
expect(Ayadn::API.build_query({directed: 0})).to match /directed=0/
|
29
23
|
end
|
30
|
-
it 'returns a URL with directed=0 (default)' do
|
31
|
-
expect(Ayadn::API.build_query({directed: "I'm drunk"})).to match /directed=1/
|
32
|
-
end
|
33
|
-
it 'returns a URL with directed=1' do
|
34
|
-
expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /directed=1/
|
35
|
-
end
|
36
|
-
it 'returns a URL with deleted=1' do
|
37
|
-
expect(Ayadn::API.build_query({deleted: 1})).to match /deleted=1/
|
38
|
-
end
|
39
|
-
it 'returns a URL with deleted=0' do
|
40
|
-
expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /deleted=0/
|
41
|
-
end
|
42
24
|
it 'returns a URL with html=1' do
|
43
25
|
expect(Ayadn::API.build_query({html: 1})).to match /html=1/
|
44
26
|
end
|
45
|
-
it 'returns a URL with html=0' do
|
46
|
-
expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /html=0/
|
47
|
-
end
|
48
|
-
it 'returns a URL with annotations=0' do
|
49
|
-
expect(Ayadn::API.build_query({annotations: 0})).to match /annotations=0/
|
50
|
-
end
|
51
|
-
it 'returns a URL with annotations=1' do
|
52
|
-
expect(Ayadn::API.build_query(Ayadn::Settings.options)).to match /annotations=1/
|
53
|
-
end
|
54
27
|
end
|
55
28
|
describe "#check_response_meta_code" do
|
56
29
|
it "returns original response if code is 200" do
|
data/spec/unit/view_spec.rb
CHANGED
@@ -100,18 +100,18 @@ describe Ayadn::View do
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
-
let(:followers) { JSON.parse(File.read("spec/mock/fwr_@ayadn.json")) }
|
103
|
+
# let(:followers) { JSON.parse(File.read("spec/mock/fwr_@ayadn.json")) }
|
104
104
|
|
105
|
-
describe "#show_list_followers" do
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
105
|
+
# describe "#show_list_followers" do
|
106
|
+
# it "outputs the list of followers" do
|
107
|
+
# list = Ayadn::Workers.extract_users(followers[0])
|
108
|
+
# printed = capture_stdout do
|
109
|
+
# Ayadn::View.new.show_list_followers(list, '@ayadn')
|
110
|
+
# end
|
111
|
+
# expect(printed).to include "@ericd"
|
112
|
+
# expect(printed).to include "Nicolas Maumont"
|
113
|
+
# end
|
114
|
+
# end
|
115
115
|
|
116
116
|
|
117
117
|
|
data/spec/unit/workers_spec.rb
CHANGED
@@ -81,53 +81,52 @@ describe Ayadn::Workers do
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
let(:list) { {"007"=>["bond", "James Bond", true, true], "666"=>["mrtest", "Mr Test", false, false]} }
|
85
|
-
|
86
|
-
describe "#build_followers_list" do
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
84
|
+
# let(:list) { {"007"=>["bond", "James Bond", true, true], "666"=>["mrtest", "Mr Test", false, false]} }
|
85
|
+
|
86
|
+
# describe "#build_followers_list" do
|
87
|
+
# it 'builds the followers table list' do
|
88
|
+
# printed = capture_stdout do
|
89
|
+
# puts Ayadn::Workers.new.build_followers_list(list, "@test")
|
90
|
+
# end
|
91
|
+
# expect(printed).to include "@test"
|
92
|
+
# expect(printed).to include "@bond"
|
93
|
+
# expect(printed).to include "Mr Test"
|
94
|
+
# end
|
95
|
+
# end
|
96
|
+
|
97
|
+
# describe "#build_followings_list" do
|
98
|
+
# it 'builds the followings table list' do
|
99
|
+
# printed = capture_stdout do
|
100
|
+
# puts Ayadn::Workers.new.build_followings_list(list, "@test")
|
101
|
+
# end
|
102
|
+
# #expect(printed).to include "+~~~~"
|
103
|
+
# expect(printed).to include "@test"
|
104
|
+
# expect(printed).to include "@bond"
|
105
|
+
# expect(printed).to include "Mr Test"
|
106
|
+
# end
|
107
|
+
# end
|
108
|
+
|
109
|
+
# describe "#build_muted_list" do
|
110
|
+
# it 'builds the muted table list' do
|
111
|
+
# printed = capture_stdout do
|
112
|
+
# puts Ayadn::Workers.new.build_muted_list(list)
|
113
|
+
# end
|
114
|
+
# #expect(printed).to include "+----"
|
115
|
+
# expect(printed).to include "@bond"
|
116
|
+
# expect(printed).to include "Mr Test"
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
|
120
|
+
# describe "#build_blocked_list" do
|
121
|
+
# it 'builds the blocked table list' do
|
122
|
+
# printed = capture_stdout do
|
123
|
+
# puts Ayadn::Workers.new.build_blocked_list(list)
|
124
|
+
# end
|
125
|
+
# #expect(printed).to include "+----"
|
126
|
+
# expect(printed).to include "@bond"
|
127
|
+
# expect(printed).to include "Mr Test"
|
128
|
+
# end
|
129
|
+
# end
|
131
130
|
|
132
131
|
describe ".add_arobase_if_missing" do
|
133
132
|
it 'adds @ to username' do
|