patient_zero 0.4.0 → 0.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/lib/patient_zero/analytics/facebook.rb +7 -1
- data/lib/patient_zero/analytics/twitter.rb +4 -0
- data/lib/patient_zero/source.rb +15 -2
- data/lib/patient_zero/version.rb +1 -1
- data/spec/patient_zero/analytics/facebook_spec.rb +12 -8
- data/spec/patient_zero/analytics/twitter_spec.rb +8 -1
- data/spec/patient_zero/source_spec.rb +32 -5
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce71c0439f0fe87f14660f320fc6cbde9a4fe9dc
|
4
|
+
data.tar.gz: 55b5fe0d9fd823d7e547f77e5395d7e88d73a484
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32961c40e4712bbcf9d023ebd6cc5ae390648717df4818ddd80df2a9a4629ea6a93210e2c7d695b62984fb903719328c866b0cd14c56ad1cce0c18de9661eb19
|
7
|
+
data.tar.gz: 89b559a859c5ea756a4f57502bff911c3b1bc87e86975aff46862de3fb59e094574ba153a8d67e17ef6886870d013e4e0b65758139acf5094d1955b86ee5a1f2
|
@@ -6,7 +6,13 @@ module PatientZero
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def impressions
|
9
|
-
page_impressions + message_impressions
|
9
|
+
@impressions ||= page_impressions + message_impressions
|
10
|
+
end
|
11
|
+
|
12
|
+
def reach
|
13
|
+
@reach ||= analytical_data['total_reach'].find do |reach_hash|
|
14
|
+
reach_hash['key'] == 'Total Reach'
|
15
|
+
end['values'].each_value.reduce(:+)
|
10
16
|
end
|
11
17
|
|
12
18
|
def impressions_by_city
|
data/lib/patient_zero/source.rb
CHANGED
@@ -2,7 +2,7 @@ module PatientZero
|
|
2
2
|
class Source
|
3
3
|
include Client
|
4
4
|
|
5
|
-
attr_accessor :id, :name, :platform, :token
|
5
|
+
attr_accessor :id, :name, :platform, :token, :delete_id
|
6
6
|
|
7
7
|
def initialize attributes, token
|
8
8
|
@id = attributes.fetch 'id'
|
@@ -10,6 +10,7 @@ module PatientZero
|
|
10
10
|
@invalid = attributes.fetch 'is_invalid'
|
11
11
|
@tracked = attributes.fetch 'is_tracked'
|
12
12
|
@platform = attributes.fetch 'platform'
|
13
|
+
@delete_id = attributes.fetch 'delete_id'
|
13
14
|
@token = token
|
14
15
|
end
|
15
16
|
|
@@ -27,10 +28,22 @@ module PatientZero
|
|
27
28
|
raise NotFoundError, e
|
28
29
|
end
|
29
30
|
|
30
|
-
def
|
31
|
+
def platform_id
|
31
32
|
id.split('#').last
|
32
33
|
end
|
33
34
|
|
35
|
+
def social_type
|
36
|
+
id.scan(/\d+#(\w+)#\d+/).flatten.first
|
37
|
+
end
|
38
|
+
|
39
|
+
def parent
|
40
|
+
if delete_id == id
|
41
|
+
self
|
42
|
+
else
|
43
|
+
Source.find delete_id, token
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
34
47
|
def analytics start_date: nil, end_date: nil
|
35
48
|
@analytics ||= {}
|
36
49
|
@analytics["#{start_date}#{end_date}"] ||= Analytics.for_platform platform, token: token, source_id: id, start_date: start_date, end_date: end_date
|
data/lib/patient_zero/version.rb
CHANGED
@@ -4,6 +4,7 @@ module PatientZero
|
|
4
4
|
module Analytics
|
5
5
|
describe Facebook do
|
6
6
|
let(:source_id) { "12345##{platform}#1234567890" }
|
7
|
+
let(:token) { 'token-shmoken' }
|
7
8
|
let(:platform) { 'facebook' }
|
8
9
|
let(:message) do
|
9
10
|
{ 'platform' => 'FB',
|
@@ -14,22 +15,19 @@ module PatientZero
|
|
14
15
|
'clicks' => 38 }
|
15
16
|
end
|
16
17
|
let(:messages) { [ message ] }
|
17
|
-
let(:page_impressions)
|
18
|
-
[ { 'key'=>'Total',
|
19
|
-
'values'=>
|
20
|
-
{ '2010-10-10'=> 99 } } ]
|
21
|
-
end
|
22
|
-
let(:age_data) { {"13-17"=>14_000, "18-24"=>240_000, "25-34"=>650_000, "35-44"=>660_000, "45-54"=>380_000, "55-64"=>170_000, "65+"=>93_000} }
|
18
|
+
let(:page_impressions) { [ { 'key'=>'Total', 'values'=> { '2010-10-10'=> 99 } } ] }
|
23
19
|
let(:impressions_by_city) { [{"title"=>"Atlanta, GA", "count"=>16_000}, {"title"=>"Los Angeles, CA", "count"=>15_000}, {"title"=>"San Diego, CA", "count"=>14_000}] }
|
24
20
|
let(:impressions_by_age) { [{"key"=>"Users", "values"=>age_data}] }
|
25
21
|
let(:impressions_by_gender) { {"F"=>100_000, "M"=>70_000, "U"=>10_000} }
|
26
|
-
let(:
|
22
|
+
let(:age_data) { {"13-17"=>14_000, "18-24"=>240_000, "25-34"=>650_000, "35-44"=>660_000, "45-54"=>380_000, "55-64"=>170_000, "65+"=>93_000} }
|
23
|
+
let(:total_reach) { [ { 'key'=>'Total Reach', 'values'=> { '2010-10-10'=> 4567 } } ] }
|
27
24
|
let(:analytical_data) do
|
28
25
|
{ 'messages' => messages,
|
29
26
|
'page_impressions' => page_impressions,
|
30
27
|
'impressions_by_cities' => impressions_by_city,
|
31
28
|
'impressions_by_ages' => impressions_by_age,
|
32
|
-
'impressions_by_genders' => impressions_by_gender
|
29
|
+
'impressions_by_genders' => impressions_by_gender,
|
30
|
+
'total_reach' => total_reach }
|
33
31
|
end
|
34
32
|
let(:facebook_analytics) { Facebook.new token: token, source_id: source_id }
|
35
33
|
before{ allow(facebook_analytics).to receive(:analytical_data).and_return analytical_data }
|
@@ -72,6 +70,12 @@ module PatientZero
|
|
72
70
|
expect(facebook_analytics.engagements).to eq 160
|
73
71
|
end
|
74
72
|
end
|
73
|
+
|
74
|
+
describe '#reach' do
|
75
|
+
it 'returns the sum of total_reach for each day' do
|
76
|
+
expect(facebook_analytics.reach).to eq 4567
|
77
|
+
end
|
78
|
+
end
|
75
79
|
end
|
76
80
|
end
|
77
81
|
end
|
@@ -14,7 +14,8 @@ module PatientZero
|
|
14
14
|
end
|
15
15
|
let(:messages) { [ message ] }
|
16
16
|
let(:token) { 'token-shmoken' }
|
17
|
-
let(:
|
17
|
+
let(:followers) { 35 }
|
18
|
+
let(:analytical_data) { { 'messages' => messages, 'total_impressions' => 13, 'followers' => followers } }
|
18
19
|
let(:twitter_analytics) { Twitter.new token: token, source_id: source_id }
|
19
20
|
before{ allow(twitter_analytics).to receive(:analytical_data).and_return analytical_data }
|
20
21
|
|
@@ -29,6 +30,12 @@ module PatientZero
|
|
29
30
|
expect(twitter_analytics.engagements).to eq 20
|
30
31
|
end
|
31
32
|
end
|
33
|
+
|
34
|
+
describe '#reach' do
|
35
|
+
it 'returns 12% of the number of follers, rounded to the nearest whole' do
|
36
|
+
expect(twitter_analytics.reach).to eq (followers * 0.12).round
|
37
|
+
end
|
38
|
+
end
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
@@ -2,7 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module PatientZero
|
4
4
|
describe Source do
|
5
|
-
let(:id) {
|
5
|
+
let(:id) { "12345##{social_type}#1234567890" }
|
6
|
+
let(:delete_id) { id }
|
7
|
+
let(:social_type) { 'facebook_account' }
|
6
8
|
let(:token) { 'token-shmoken' }
|
7
9
|
let(:sources_response_data) { [source_response_data] }
|
8
10
|
let(:source_response_data) do
|
@@ -10,8 +12,8 @@ module PatientZero
|
|
10
12
|
'name' => 'account_name',
|
11
13
|
'is_invalid' => false,
|
12
14
|
'is_tracked' => true,
|
13
|
-
'platform' => '
|
14
|
-
'delete_id' =>
|
15
|
+
'platform' => 'facebook',
|
16
|
+
'delete_id' => delete_id }
|
15
17
|
end
|
16
18
|
let(:source) { Source.new source_response_data, token }
|
17
19
|
|
@@ -63,9 +65,34 @@ module PatientZero
|
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
66
|
-
describe '#
|
68
|
+
describe '#platform_id' do
|
67
69
|
it 'returns the number at the end of the id' do
|
68
|
-
expect(source.
|
70
|
+
expect(source.platform_id).to eq '1234567890'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#social_type' do
|
75
|
+
it 'returns the source type' do
|
76
|
+
expect(source.social_type).to eq social_type
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#parent' do
|
81
|
+
context 'when the delete_id is the same as the id' do
|
82
|
+
it 'returns self' do
|
83
|
+
expect(source.parent).to eq source
|
84
|
+
end
|
85
|
+
end
|
86
|
+
context 'when the delete_id is not the same as the id' do
|
87
|
+
let(:delete_id) { '12345#facebook_page#1234567890' }
|
88
|
+
before { allow(Source).to receive(:find).and_return double :parent_source, id: delete_id }
|
89
|
+
it 'calls Source.find' do
|
90
|
+
expect(Source).to receive(:find)
|
91
|
+
source.parent
|
92
|
+
end
|
93
|
+
it 'returns a source that is not the same as itself' do
|
94
|
+
expect(source.parent.id).to_not eq source.id
|
95
|
+
end
|
69
96
|
end
|
70
97
|
end
|
71
98
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: patient_zero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Zaninovich
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-04-
|
12
|
+
date: 2015-04-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -198,4 +198,3 @@ test_files:
|
|
198
198
|
- spec/patient_zero/profile_spec.rb
|
199
199
|
- spec/patient_zero/source_spec.rb
|
200
200
|
- spec/spec_helper.rb
|
201
|
-
has_rdoc:
|