grammer 0.3.0.edge → 0.3.1.edge

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb1057ea3ed30b8316d9f6377dc28af9e3a142b1
4
- data.tar.gz: 073d87b56317ea7fc7cdc26b100620560144fd2d
3
+ metadata.gz: 38ba43956be77f268d26f736ad84df9d4946c5b4
4
+ data.tar.gz: 303ef6f65383cf24c5a8549b6d983e3366fe8044
5
5
  SHA512:
6
- metadata.gz: dd737414e812fb7a82391915d52fc76e2f013a18d5e6682fb8088102f37f0c1995da0600515fe19250b99c056efe4706b6577dce475aa90980c4ee3235645fcd
7
- data.tar.gz: ef9d08968d5bd21e3873526d65c7f7a01ede736193da14f63795af0cf184ef581bb01b6ac61d57a1888b14e567b3f34aa8d8740f63be41f8553422f0e5634c53
6
+ metadata.gz: 65a9b840b812a271f6299cb24f23ff321cd75be76315852864157bf55a9986053a562a7b7caec24d9bd0eaa999acd61e79285bde816302295d74a442cc900fd1
7
+ data.tar.gz: 39c8be3110f8bc1d416fb99bdc0bd041fd901a9e1033606fde53fc741cc28728b9a55efcad6a6cf96d114ab2dfe0766c75073edee48303c6ab03dca166879533
@@ -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
- Node.new(username)
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
@@ -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 = Nokogiri.parse(page)
15
- .at('body script')
16
- .text.match(/({.*})/)[1]
17
- JSON.parse(json)
18
- .dig('entry_data', 'ProfilePage', 0, 'graphql', 'user') || {}
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
@@ -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
- @service = attr[:service] || IgService.new
20
- @data = service.node(username)
32
+ @media_class = attr[:media_class] || Media
33
+ @service = attr[:service] || IgService.new
34
+ @data = service.node(username)
21
35
  end
22
36
 
23
- DATA_PATHS = {
24
- biography: 'biography',
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
@@ -7,7 +7,7 @@ module Grammer
7
7
  module VERSION
8
8
  MAJOR = 0
9
9
  MINOR = 3
10
- PATCH = 0
10
+ PATCH = 1
11
11
  BUILD = 'edge'
12
12
 
13
13
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
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.0.edge
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