grammer 0.3.0.edge → 0.3.1.edge
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/grammer.rb +4 -2
- data/lib/grammer/data_forwardable.rb +16 -0
- data/lib/grammer/ig_service.rb +9 -5
- data/lib/grammer/media.rb +29 -0
- data/lib/grammer/node.rb +18 -18
- data/lib/grammer/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38ba43956be77f268d26f736ad84df9d4946c5b4
|
4
|
+
data.tar.gz: 303ef6f65383cf24c5a8549b6d983e3366fe8044
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65a9b840b812a271f6299cb24f23ff321cd75be76315852864157bf55a9986053a562a7b7caec24d9bd0eaa999acd61e79285bde816302295d74a442cc900fd1
|
7
|
+
data.tar.gz: 39c8be3110f8bc1d416fb99bdc0bd041fd901a9e1033606fde53fc741cc28728b9a55efcad6a6cf96d114ab2dfe0766c75073edee48303c6ab03dca166879533
|
data/lib/grammer.rb
CHANGED
@@ -6,15 +6,17 @@ module Grammer
|
|
6
6
|
require 'httparty'
|
7
7
|
require 'nokogiri'
|
8
8
|
|
9
|
+
require 'grammer/data_forwardable'
|
9
10
|
require 'grammer/ig_service'
|
10
11
|
require 'grammer/macros'
|
12
|
+
require 'grammer/media'
|
11
13
|
require 'grammer/macro_handler'
|
12
14
|
require 'grammer/node'
|
13
15
|
|
14
16
|
##
|
15
17
|
# Initializes a node with a given username
|
16
|
-
def self.node(username)
|
17
|
-
|
18
|
+
def self.node(username, with: Node)
|
19
|
+
with.new(username)
|
18
20
|
end
|
19
21
|
|
20
22
|
##
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Grammer
|
4
|
+
##
|
5
|
+
# Allows data forwarding paths to be defined, abstracting some of the
|
6
|
+
# repetitive reader definitions away from the class
|
7
|
+
module DataForwardable
|
8
|
+
def attr_data_forwarder(paths)
|
9
|
+
paths.each do |method_name, path|
|
10
|
+
define_method(method_name) do
|
11
|
+
@data.dig(*path)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/grammer/ig_service.rb
CHANGED
@@ -6,16 +6,20 @@ module Grammer
|
|
6
6
|
class IgService
|
7
7
|
include HTTParty
|
8
8
|
base_uri 'https://www.instagram.com'
|
9
|
+
def initialize(options = {})
|
10
|
+
@json_parser = options[:json_parser] || JSON
|
11
|
+
@html_parser = options[:html_parser] || Nokogiri
|
12
|
+
end
|
9
13
|
|
10
14
|
##
|
11
15
|
# Requests Instagram node information with a given username.
|
12
16
|
def node(username)
|
13
17
|
page = self.class.get("/#{username}")
|
14
|
-
json =
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
json = @html_parser.parse(page)
|
19
|
+
.at('body script')
|
20
|
+
.text.match(/({.*})/)[1]
|
21
|
+
@json_parser.parse(json)
|
22
|
+
.dig('entry_data', 'ProfilePage', 0, 'graphql', 'user') || {}
|
19
23
|
end
|
20
24
|
end
|
21
25
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Grammer
|
4
|
+
##
|
5
|
+
# = Media
|
6
|
+
# Represents Instagram media
|
7
|
+
class Media
|
8
|
+
extend DataForwardable
|
9
|
+
attr_data_forwarder(
|
10
|
+
image_url: 'display_url',
|
11
|
+
likes_count: %w[edge_liked_by count],
|
12
|
+
video?: 'is_video'
|
13
|
+
)
|
14
|
+
|
15
|
+
##
|
16
|
+
# General Instagram hash of data from the media
|
17
|
+
attr_reader :data
|
18
|
+
|
19
|
+
def initialize(media_data)
|
20
|
+
@data = media_data
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.all_from(node)
|
24
|
+
node.data.dig('edge_owner_to_timeline_media', 'edges').map do |media|
|
25
|
+
new(media.dig('node'))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/grammer/node.rb
CHANGED
@@ -5,6 +5,19 @@ module Grammer
|
|
5
5
|
# = Node
|
6
6
|
# Represents Instagram nodes (accounts)
|
7
7
|
class Node
|
8
|
+
extend DataForwardable
|
9
|
+
attr_data_forwarder(
|
10
|
+
biography: 'biography',
|
11
|
+
business?: 'is_business_account',
|
12
|
+
followers_count: %w[edge_followed_by count],
|
13
|
+
following_count: %w[edge_follow count],
|
14
|
+
full_name: 'full_name',
|
15
|
+
id: 'id',
|
16
|
+
private?: 'is_private',
|
17
|
+
username: 'username',
|
18
|
+
verified?: 'is_verified'
|
19
|
+
)
|
20
|
+
|
8
21
|
##
|
9
22
|
# General Instagram hash of data from the node
|
10
23
|
attr_reader :data
|
@@ -16,26 +29,13 @@ module Grammer
|
|
16
29
|
##
|
17
30
|
# Creates a new instagram node defined by its username.
|
18
31
|
def initialize(username, attr = {})
|
19
|
-
@
|
20
|
-
@
|
32
|
+
@media_class = attr[:media_class] || Media
|
33
|
+
@service = attr[:service] || IgService.new
|
34
|
+
@data = service.node(username)
|
21
35
|
end
|
22
36
|
|
23
|
-
|
24
|
-
|
25
|
-
business?: 'is_business_account',
|
26
|
-
followers_count: %w[edge_followed_by count],
|
27
|
-
following_count: %w[edge_follow count],
|
28
|
-
full_name: 'full_name',
|
29
|
-
id: 'id',
|
30
|
-
private?: 'is_private',
|
31
|
-
username: 'username',
|
32
|
-
verified?: 'is_verified'
|
33
|
-
}.freeze
|
34
|
-
|
35
|
-
DATA_PATHS.each do |method_name, path|
|
36
|
-
define_method(method_name) do
|
37
|
-
@data.dig(*path)
|
38
|
-
end
|
37
|
+
def media
|
38
|
+
@media_class.all_from(self)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/lib/grammer/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grammer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1.edge
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Caio Andrade
|
@@ -144,9 +144,11 @@ extra_rdoc_files:
|
|
144
144
|
files:
|
145
145
|
- README.md
|
146
146
|
- lib/grammer.rb
|
147
|
+
- lib/grammer/data_forwardable.rb
|
147
148
|
- lib/grammer/ig_service.rb
|
148
149
|
- lib/grammer/macro_handler.rb
|
149
150
|
- lib/grammer/macros.rb
|
151
|
+
- lib/grammer/media.rb
|
150
152
|
- lib/grammer/node.rb
|
151
153
|
- lib/grammer/version.rb
|
152
154
|
homepage: https://github.com/caioertai/grammer
|