grammer 0.1.0.edge

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3186086c6b4c56b0aa46f5ea3578324783750d01
4
+ data.tar.gz: 41e4c66758aa2caad094bba82fa83b4663f20cf0
5
+ SHA512:
6
+ metadata.gz: 518755629c23e64dbe0c5e53559c6d2586fa8303018fce20c77af60cb31b2496bec74e9cd5fdfbf8b23d2a8db8572bacea250c3972e3dc507e2ef7a426b2587a
7
+ data.tar.gz: 7c8324ef8481fa9c9caa3780dd23defc587d6fc7b64b15a738ec99f3ced38834f172c3a59910e81b7ce60627edfd2f071e07975c94f56f25faf612fdcb0e11ef
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Grammer
4
+ # Handles Ig Requests
5
+ class IgService
6
+ include HTTParty
7
+ base_uri 'https://www.instagram.com'
8
+
9
+ def node(username)
10
+ page = self.class.get("/#{username}")
11
+ json = Nokogiri.parse(page)
12
+ .at('body script')
13
+ .text.match(/({.*})/)[1]
14
+ JSON.parse(json)
15
+ .dig('entry_data', 'ProfilePage', 0, 'graphql', 'user') || {}
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adds class macros to top level module
4
+ module Grammer
5
+ def self.included(klass)
6
+ klass.extend(Macros)
7
+ end
8
+
9
+ # Defines class macros
10
+ module Macros
11
+ def get_or_set_const(module_name)
12
+ const_set(module_name, Module.new) unless const_defined?(module_name)
13
+ const_get(module_name)
14
+ end
15
+
16
+ def grammed_by(method, options = {})
17
+ mod = get_or_set_const(:"GammerMod#{object_id}")
18
+ mod.class_eval do
19
+ target_attribute = options[:on]
20
+ define_method(target_attribute) do
21
+ username = send(method)
22
+ instance_var = "@#{target_attribute}"
23
+
24
+ instance_var_value = instance_variable_get(instance_var)
25
+ unless instance_var_value
26
+ instance_variable_set(
27
+ instance_var,
28
+ Node.new(username, service: options[:service])
29
+ )
30
+ end
31
+ instance_var_value
32
+ end
33
+ end
34
+ prepend mod
35
+ end
36
+
37
+ def grammed_by_class_method(*methods)
38
+ singleton_class.class_eval do
39
+ include Grammer
40
+ grammed_by(*methods)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Grammer
4
+ # Represents Instagram nodes (Users)
5
+ class Node
6
+ attr_reader :data, :service
7
+
8
+ def initialize(username, attr = {})
9
+ @service = attr[:service] || IgService.new
10
+ @data = service.node(username)
11
+ end
12
+
13
+ def biography
14
+ @data.dig('biography')
15
+ end
16
+
17
+ def followers_count
18
+ @data.dig('edge_followed_by', 'count')
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Grammer
4
+ # Describes version for gemspec
5
+ module VERSION
6
+ MAJOR = 0
7
+ MINOR = 1
8
+ PATCH = 0
9
+ BUILD = 'edge'
10
+
11
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
12
+
13
+ def self.version
14
+ STRING
15
+ end
16
+ end
17
+ end
data/lib/grammer.rb ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Main Module
4
+ module Grammer
5
+ require 'httparty'
6
+ require 'nokogiri'
7
+
8
+ require 'grammer/ig_service'
9
+ require 'grammer/macros'
10
+ require 'grammer/node'
11
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grammer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.edge
5
+ platform: ruby
6
+ authors:
7
+ - Caio Andrade
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.16'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.16.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.16'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.16.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: nokogiri
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.8'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.8.2
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.8'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.8.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: pry-byebug
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3.6'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '3.6'
67
+ - !ruby/object:Gem::Dependency
68
+ name: reek
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '4.8'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '4.8'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '3.0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubocop
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 0.62.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 0.62.0
109
+ - !ruby/object:Gem::Dependency
110
+ name: simplecov
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: 0.16.1
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: 0.16.1
123
+ description: Provides a simple way to connect objects to the info on a Instagram account.
124
+ email: caioertai@gmail.com
125
+ executables: []
126
+ extensions: []
127
+ extra_rdoc_files: []
128
+ files:
129
+ - lib/grammer.rb
130
+ - lib/grammer/ig_service.rb
131
+ - lib/grammer/macros.rb
132
+ - lib/grammer/node.rb
133
+ - lib/grammer/version.rb
134
+ homepage: http://rubygems.org/gems/grammer
135
+ licenses:
136
+ - MIT
137
+ metadata: {}
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">"
150
+ - !ruby/object:Gem::Version
151
+ version: 1.3.1
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.6.14.1
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: Instragram basic info scraping handler.
158
+ test_files: []