social_net 0.1.1 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +23 -0
- data/CHANGELOG.md +5 -1
- data/MIT-LICENSE +1 -1
- data/README.md +20 -3
- data/lib/social_net/instagram/models/user.rb +15 -1
- data/lib/social_net/instagram/models/video.rb +17 -0
- data/lib/social_net/instagram/models.rb +1 -0
- data/lib/social_net/version.rb +1 -1
- data/spec/social_net/instagram/models/user_spec.rb +13 -0
- data/spec/support/cassettes/Posts/_posts/given_an_existing_case-insensitive_username/returns_an_object_representing_that_user.yml +48 -0
- data/spec/support/cassettes/Posts/_posts/given_an_unknown_username/.yml +48 -0
- data/spec/support/cassettes/SocialNet_Instagram_Models_User/_posts/given_an_existing_user/returns_an_array_of_posts_from_the_user.yml +883 -0
- metadata +9 -31
- data/Gemfile.lock +0 -94
- data/coverage/.last_run.json +0 -5
- data/coverage/.resultset.json +0 -847
- data/coverage/.resultset.json.lock +0 -0
- data/coverage/assets/0.9.0/application.css +0 -799
- data/coverage/assets/0.9.0/application.js +0 -1707
- data/coverage/assets/0.9.0/colorbox/border.png +0 -0
- data/coverage/assets/0.9.0/colorbox/controls.png +0 -0
- data/coverage/assets/0.9.0/colorbox/loading.gif +0 -0
- data/coverage/assets/0.9.0/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.9.0/favicon_green.png +0 -0
- data/coverage/assets/0.9.0/favicon_red.png +0 -0
- data/coverage/assets/0.9.0/favicon_yellow.png +0 -0
- data/coverage/assets/0.9.0/loading.gif +0 -0
- data/coverage/assets/0.9.0/magnify.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.9.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/index.html +0 -5624
- data/social_net-0.1.0.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f98753cdb78bc43e646f22a215b0b2dcdb638630
|
4
|
+
data.tar.gz: bce5fe766ad93f60dc36d4657aa521c397007e3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1e583a86fd6e9233169107eaa05e30a865ba148a1a2787030e6dc3a0ec5d4f86dc03221dc0a35d11cba044de0ce53ad29182b48d526088a4938175c53412e5e
|
7
|
+
data.tar.gz: d83f3ece9d7c1c546404d2f8c945e6b09c57709eca1984a9d6825b7f1ec82cd1f48716e36e46ed050254b93dde354ead27f2d7a146bdaf4acded2157fc8dab43
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
23
|
+
.DS_Store
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,10 @@ For more information about changelogs, check
|
|
6
6
|
[Keep a Changelog](http://keepachangelog.com) and
|
7
7
|
[Vandamme](http://tech-angels.github.io/vandamme).
|
8
8
|
|
9
|
-
## 0.1.
|
9
|
+
## 0.1.1 - 2017-3-13
|
10
10
|
|
11
11
|
* Initial release with `Instagram::User` supporting `find_by`, `find_by!` and `where`.
|
12
|
+
|
13
|
+
## 0.2.1 - 2017-3-14
|
14
|
+
|
15
|
+
* [FEATURE] Add `.posts` to instance of `Instagram::User`.
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,7 @@ SocialNet - a Ruby client for social networks API
|
|
3
3
|
|
4
4
|
SocialNet helps you write apps that need to interact with Twitter, Instagram and Facebook.
|
5
5
|
|
6
|
+
## Note: Only Instagram works at the moment
|
6
7
|
|
7
8
|
After [configuring your Twitter app](#configuring-your-twitter-app), you can run commands like:
|
8
9
|
|
@@ -17,6 +18,13 @@ After [configuring your Instagram app](#configuring-your-instagram-app), you can
|
|
17
18
|
user = SocialNet::Instagram::User.find_by username: 'Collab'
|
18
19
|
user.username #=> "Collab"
|
19
20
|
user.follower_count #=> 7025
|
21
|
+
user.posts #=>
|
22
|
+
# [SocialNet::Instagram::Models::Video
|
23
|
+
# @caption='Diet starts Monday... 😂🍩',
|
24
|
+
# @file='https://scontent.cdninstagram.com/t50.2886-16/17192719_791273527696774_5253726776697290752_n.mp4',
|
25
|
+
# @id='1464710084172115373_487786346',
|
26
|
+
# @likes=127,
|
27
|
+
# @thumbnail='https://scontent.cdninstagram.com/t51.2885-15/e15/17076697_308353549580106_8220285822193106944_n.jpg']"
|
20
28
|
```
|
21
29
|
|
22
30
|
After [configuring your Facebook app](#configuring-your-facebook-app), you can run commands like:
|
@@ -24,7 +32,7 @@ After [configuring your Facebook app](#configuring-your-facebook-app), you can r
|
|
24
32
|
```ruby
|
25
33
|
page = SocialNet::Facebook::Page.find_by username: 'collab'
|
26
34
|
page.username #=> "collab"
|
27
|
-
page.likes #=>
|
35
|
+
page.likes #=> 23289
|
28
36
|
```
|
29
37
|
|
30
38
|
How to install
|
@@ -32,11 +40,11 @@ How to install
|
|
32
40
|
|
33
41
|
To install on your system, run
|
34
42
|
|
35
|
-
gem install
|
43
|
+
gem install social_net
|
36
44
|
|
37
45
|
To use inside a bundled Ruby project, add this line to the Gemfile:
|
38
46
|
|
39
|
-
gem 'social_net', '~> 0.1.
|
47
|
+
gem 'social_net', '~> 0.1.1'
|
40
48
|
|
41
49
|
Since the gem follows [Semantic Versioning](http://semver.org),
|
42
50
|
indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
|
@@ -73,6 +81,7 @@ Use [SocialNet::Instagram::User]() to:
|
|
73
81
|
* retrieve an Instagram user by username
|
74
82
|
* retrieve an Instagram user by id
|
75
83
|
* access the number of followers of an Instagram user
|
84
|
+
* retrieve recent posts of an Instagram user
|
76
85
|
|
77
86
|
```ruby
|
78
87
|
user = SocialNet::Instagram::User.find_by username: 'collab'
|
@@ -80,6 +89,14 @@ user.follower_count #=> 24198
|
|
80
89
|
|
81
90
|
user = SocialNet::Instagram::User.find_by id: 270587948
|
82
91
|
user.follower_count #=> 24198
|
92
|
+
|
93
|
+
user.posts #=>
|
94
|
+
# [SocialNet::Instagram::Models::Video
|
95
|
+
# @caption='Diet starts Monday... 😂🍩',
|
96
|
+
# @file='https://scontent.cdninstagram.com/t50.2886-16/17192719_791273527696774_5253726776697290752_n.mp4',
|
97
|
+
# @id='1464710084172115373_487786346',
|
98
|
+
# @likes=127,
|
99
|
+
# @thumbnail='https://scontent.cdninstagram.com/t51.2885-15/e15/17076697_308353549580106_8220285822193106944_n.jpg']"
|
83
100
|
```
|
84
101
|
|
85
102
|
*The methods above require a configured Instagram app (see below).*
|
@@ -5,13 +5,27 @@ module SocialNet
|
|
5
5
|
module Instagram
|
6
6
|
module Models
|
7
7
|
class User
|
8
|
-
attr_reader :username, :follower_count
|
8
|
+
attr_reader :id, :username, :follower_count
|
9
9
|
|
10
10
|
def initialize(attrs = {})
|
11
|
+
@id = attrs['id']
|
11
12
|
@username = attrs['username']
|
12
13
|
@follower_count = attrs['counts']['followed_by']
|
13
14
|
end
|
14
15
|
|
16
|
+
# Returns the existing Instagram user's posts
|
17
|
+
#
|
18
|
+
# @return [SocialNet::Instagram::Models::Video] when the posts are found.
|
19
|
+
def posts
|
20
|
+
request = Api::Request.new endpoint: "users/#{id}/media/recent"
|
21
|
+
videos = request.run.select {|p| p['type'] == 'video'}
|
22
|
+
videos.map {|r| SocialNet::Instagram::Video.new r }
|
23
|
+
rescue Errors::ResponseError => error
|
24
|
+
case error.response
|
25
|
+
when Net::HTTPBadRequest then raise Errors::UnknownUser
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
# Returns the existing Instagram user matching the provided attributes or
|
16
30
|
# nil when the user is not found.
|
17
31
|
#
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SocialNet
|
2
|
+
module Instagram
|
3
|
+
module Models
|
4
|
+
class Video
|
5
|
+
attr_reader :id, :caption, :likes, :file, :thumbnail
|
6
|
+
|
7
|
+
def initialize(attrs = {})
|
8
|
+
@id = attrs['id']
|
9
|
+
@caption = attrs['caption']['text']
|
10
|
+
@likes = attrs['likes']['count']
|
11
|
+
@file = attrs['videos']['standard_resolution']['url']
|
12
|
+
@thumbnail = attrs['images']['standard_resolution']['url']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/social_net/version.rb
CHANGED
@@ -37,6 +37,7 @@ describe SocialNet::Instagram::User, :vcr do
|
|
37
37
|
let(:username) { existing_username }
|
38
38
|
|
39
39
|
it 'returns an object representing that user' do
|
40
|
+
|
40
41
|
expect(user.username).to eq 'collab'
|
41
42
|
expect(user.follower_count).to be_an Integer
|
42
43
|
end
|
@@ -47,4 +48,16 @@ describe SocialNet::Instagram::User, :vcr do
|
|
47
48
|
it { expect{user}.to raise_error SocialNet::Instagram::UnknownUser }
|
48
49
|
end
|
49
50
|
end
|
51
|
+
|
52
|
+
describe '.posts' do
|
53
|
+
subject(:user) { SocialNet::Instagram::User.find_by! username: username }
|
54
|
+
context 'given an existing user' do
|
55
|
+
let(:username) { existing_username }
|
56
|
+
|
57
|
+
it 'returns an array of posts from the user' do
|
58
|
+
expect(user.posts).to be_an Array
|
59
|
+
expect(user.posts.first).to be_an_instance_of SocialNet::Instagram::Video
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
50
63
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.instagram.com/v1/users/search?access_token=INSTAGRAM_ACCESS_TOKEN&q=Collab
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 400
|
19
|
+
message: Bad Request
|
20
|
+
headers:
|
21
|
+
Expires:
|
22
|
+
- Sat, 01 Jan 2000 00:00:00 GMT
|
23
|
+
Cache-Control:
|
24
|
+
- private, no-cache, no-store, must-revalidate
|
25
|
+
Date:
|
26
|
+
- Tue, 14 Mar 2017 18:30:53 GMT
|
27
|
+
Content-Type:
|
28
|
+
- application/json; charset=utf-8
|
29
|
+
Vary:
|
30
|
+
- Cookie, Accept-Language
|
31
|
+
Pragma:
|
32
|
+
- no-cache
|
33
|
+
Content-Language:
|
34
|
+
- en
|
35
|
+
Set-Cookie:
|
36
|
+
- csrftoken=qm9rhW3Ww7Yj6slrRPYWIrsnuh2w7DXs; expires=Tue, 13-Mar-2018 18:30:53
|
37
|
+
GMT; Max-Age=31449600; Path=/; Secure
|
38
|
+
Connection:
|
39
|
+
- keep-alive
|
40
|
+
Content-Length:
|
41
|
+
- '124'
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: '{"meta": {"error_type": "OAuthAccessTokenException", "error_message":
|
45
|
+
"The access_token provided is invalid.", "code": 400}}'
|
46
|
+
http_version:
|
47
|
+
recorded_at: Tue, 14 Mar 2017 18:30:53 GMT
|
48
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.instagram.com/v1/users/search?access_token=INSTAGRAM_ACCESS_TOKEN&q=01LjqweoojkjR
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 400
|
19
|
+
message: Bad Request
|
20
|
+
headers:
|
21
|
+
Pragma:
|
22
|
+
- no-cache
|
23
|
+
Date:
|
24
|
+
- Tue, 14 Mar 2017 18:30:53 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Vary:
|
28
|
+
- Cookie, Accept-Language
|
29
|
+
Expires:
|
30
|
+
- Sat, 01 Jan 2000 00:00:00 GMT
|
31
|
+
Cache-Control:
|
32
|
+
- private, no-cache, no-store, must-revalidate
|
33
|
+
Content-Language:
|
34
|
+
- en
|
35
|
+
Set-Cookie:
|
36
|
+
- csrftoken=bOYUC9lDOgvLXo3ihcbQ3YMASKPOVTWS; expires=Tue, 13-Mar-2018 18:30:53
|
37
|
+
GMT; Max-Age=31449600; Path=/; Secure
|
38
|
+
Connection:
|
39
|
+
- keep-alive
|
40
|
+
Content-Length:
|
41
|
+
- '124'
|
42
|
+
body:
|
43
|
+
encoding: UTF-8
|
44
|
+
string: '{"meta": {"code": 400, "error_message": "The access_token provided
|
45
|
+
is invalid.", "error_type": "OAuthAccessTokenException"}}'
|
46
|
+
http_version:
|
47
|
+
recorded_at: Tue, 14 Mar 2017 18:30:53 GMT
|
48
|
+
recorded_with: VCR 2.9.3
|