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 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