instagram_basic_display 0.2.0 → 0.2.2

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
  SHA256:
3
- metadata.gz: f91c7c3b242f6488c78b3cfafb99ec3ae263c3ce158c8bdfd0a29c6a4a515241
4
- data.tar.gz: 0107b170ee8997987a12a0c8136d5346150c70e555b36f20bc381ea30ad3f7f6
3
+ metadata.gz: 917e8dc235fd078d724ccbd775d6306e5b61411443f3fe64a083e2dc988f89db
4
+ data.tar.gz: 9d842051035ee2852e273d195109570dd953e053116caa99a242d337705fcbf8
5
5
  SHA512:
6
- metadata.gz: e4c9a9b95abc448be189ddd0c024bb24412aff97feb75a551219810e1cbe39aa5bc1ef991b34402b8a919bc21953675ac8e18e78c2238e7214aabb3921eca4f5
7
- data.tar.gz: d4b1ae2e93ff561878f7d71acba22ce318709013f1fe43de29b2409853c486c44a0f06c0c9de512fb705e94c28de61cf732af88fedad6d8423e519c276f97f67
6
+ metadata.gz: 83c536d281626fe977a917869f805aee783f982b9c458c752da2b23f6b80d6af32d4e6c4add9d5ebc592e18f74861616fcb403a7a0ca990ba6c6b477ea636fc9
7
+ data.tar.gz: 9099d5adad7117b3368fa7724f7dba4ec8379fb214b6de4585a4a72ec49e1975fae71c2ac5cebdb47635047da08da8cbb7a868c203cd37a340f492ff12f46ebd
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.5.3
1
+ 3.2.2
data/Gemfile CHANGED
@@ -1,15 +1,15 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
5
  group :development, :test do
6
- gem 'rubocop', '~> 0.74.0'
7
- gem 'pry'
8
6
  gem 'dotenv'
7
+ gem 'pry'
8
+ gem 'rubocop', '~> 1.68'
9
9
  end
10
10
 
11
11
  group :test do
12
- gem 'rspec', '~> 3.8.0'
13
- gem 'webmock'
12
+ gem 'rspec', '~> 3.13.0'
14
13
  gem 'vcr'
14
+ gem 'webmock'
15
15
  end
data/Gemfile.lock CHANGED
@@ -1,73 +1,87 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- instagram_basic_display (0.2.0)
4
+ instagram_basic_display (0.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- addressable (2.7.0)
10
- public_suffix (>= 2.0.2, < 5.0)
11
- ast (2.4.0)
12
- coderay (1.1.2)
13
- crack (0.4.3)
14
- safe_yaml (~> 1.0.0)
15
- diff-lcs (1.3)
16
- dotenv (2.7.5)
17
- hashdiff (1.0.0)
18
- jaro_winkler (1.5.4)
19
- method_source (0.9.2)
20
- parallel (1.19.1)
21
- parser (2.7.0.2)
22
- ast (~> 2.4.0)
23
- pry (0.12.2)
24
- coderay (~> 1.1.0)
25
- method_source (~> 0.9.0)
26
- public_suffix (4.0.3)
27
- rainbow (3.0.0)
28
- rake (10.5.0)
29
- rspec (3.8.0)
30
- rspec-core (~> 3.8.0)
31
- rspec-expectations (~> 3.8.0)
32
- rspec-mocks (~> 3.8.0)
33
- rspec-core (3.8.2)
34
- rspec-support (~> 3.8.0)
35
- rspec-expectations (3.8.6)
9
+ addressable (2.8.7)
10
+ public_suffix (>= 2.0.2, < 7.0)
11
+ ast (2.4.2)
12
+ base64 (0.2.0)
13
+ bigdecimal (3.1.8)
14
+ coderay (1.1.3)
15
+ crack (1.0.0)
16
+ bigdecimal
17
+ rexml
18
+ diff-lcs (1.5.1)
19
+ dotenv (3.1.4)
20
+ hashdiff (1.1.1)
21
+ json (2.8.1)
22
+ language_server-protocol (3.17.0.3)
23
+ method_source (1.1.0)
24
+ parallel (1.26.3)
25
+ parser (3.3.6.0)
26
+ ast (~> 2.4.1)
27
+ racc
28
+ pry (0.14.2)
29
+ coderay (~> 1.1)
30
+ method_source (~> 1.0)
31
+ public_suffix (6.0.1)
32
+ racc (1.8.1)
33
+ rainbow (3.1.1)
34
+ rake (13.2.1)
35
+ regexp_parser (2.9.2)
36
+ rexml (3.3.9)
37
+ rspec (3.13.0)
38
+ rspec-core (~> 3.13.0)
39
+ rspec-expectations (~> 3.13.0)
40
+ rspec-mocks (~> 3.13.0)
41
+ rspec-core (3.13.2)
42
+ rspec-support (~> 3.13.0)
43
+ rspec-expectations (3.13.3)
36
44
  diff-lcs (>= 1.2.0, < 2.0)
37
- rspec-support (~> 3.8.0)
38
- rspec-mocks (3.8.2)
45
+ rspec-support (~> 3.13.0)
46
+ rspec-mocks (3.13.2)
39
47
  diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.8.0)
41
- rspec-support (3.8.3)
42
- rubocop (0.74.0)
43
- jaro_winkler (~> 1.5.1)
48
+ rspec-support (~> 3.13.0)
49
+ rspec-support (3.13.1)
50
+ rubocop (1.68.0)
51
+ json (~> 2.3)
52
+ language_server-protocol (>= 3.17.0)
44
53
  parallel (~> 1.10)
45
- parser (>= 2.6)
54
+ parser (>= 3.3.0.2)
46
55
  rainbow (>= 2.2.2, < 4.0)
56
+ regexp_parser (>= 2.4, < 3.0)
57
+ rubocop-ast (>= 1.32.2, < 2.0)
47
58
  ruby-progressbar (~> 1.7)
48
- unicode-display_width (>= 1.4.0, < 1.7)
49
- ruby-progressbar (1.10.1)
50
- safe_yaml (1.0.5)
51
- unicode-display_width (1.6.1)
52
- vcr (5.0.0)
53
- webmock (3.8.0)
54
- addressable (>= 2.3.6)
59
+ unicode-display_width (>= 2.4.0, < 3.0)
60
+ rubocop-ast (1.34.0)
61
+ parser (>= 3.3.1.0)
62
+ ruby-progressbar (1.13.0)
63
+ unicode-display_width (2.6.0)
64
+ vcr (6.3.1)
65
+ base64
66
+ webmock (3.24.0)
67
+ addressable (>= 2.8.0)
55
68
  crack (>= 0.3.2)
56
69
  hashdiff (>= 0.4.0, < 2.0.0)
57
70
 
58
71
  PLATFORMS
72
+ arm64-darwin-22
59
73
  ruby
60
74
 
61
75
  DEPENDENCIES
62
- bundler (~> 1.16)
76
+ bundler (~> 2.5.23)
63
77
  dotenv
64
78
  instagram_basic_display!
65
79
  pry
66
- rake (~> 10.0)
67
- rspec (~> 3.8.0)
68
- rubocop (~> 0.74.0)
80
+ rake (~> 13.2)
81
+ rspec (~> 3.13.0)
82
+ rubocop (~> 1.68)
69
83
  vcr
70
84
  webmock
71
85
 
72
86
  BUNDLED WITH
73
- 1.17.3
87
+ 2.5.23
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # InstagramBasicDisplay
1
+ # Instagram Basic Display
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/instagram_basic_display`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ This is a client gem for Instagram’s [Basic Display API](https://developers.facebook.com/docs/instagram-basic-display-api/). It’s a small wrapper around the API that provides access to users’ media and profile information. Not every endpoint has been implemented, so pull requests are welcome to round things out!
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ Updates to the documentation are also very welcome!
6
6
 
7
7
  ## Installation
8
8
 
@@ -20,9 +20,204 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install instagram_basic_display
22
22
 
23
- ## Usage
23
+ ## Usage and examples
24
24
 
25
- TODO: Write usage instructions here
25
+ ### Configuration
26
+
27
+ Set three environment variables to configure the client:
28
+
29
+ ```
30
+ INSTAGRAM_CLIENT_ID=your_client_id
31
+ INSTAGRAM_CLIENT_SECRET=your_client_secret
32
+ INSTAGRAM_REDIRECT_URI=your_redirect_url
33
+ ```
34
+
35
+ These variables can be obtained from the Facebook developer console.
36
+
37
+ ### Using the client
38
+
39
+ When initializing the client, you can optionally pass in an auth token from Instagram, which will be used to make further requests. If you do not already have a token, you can use one of the methods provided to retrieve one.
40
+
41
+ ```ruby
42
+ client = InstagramBasicDisplay::Client.new
43
+
44
+ # OR
45
+
46
+ client = InstagramBasicDisplay::Client.new(auth_token: token)
47
+ ```
48
+
49
+ ### Getting auth tokens
50
+
51
+ Authenticating with Instagram starts with an access code. This access code is retrieved by implementing Instagram's [authortization window](https://developers.facebook.com/docs/instagram-basic-display-api/overview#authorization-window), and is not covered by this gem.
52
+
53
+ Once you have an access code, you can exchange it for a short-lived authentication token.
54
+
55
+ ```ruby
56
+ user = User.first
57
+ client = InstagramBasicDisplay::Client.new
58
+
59
+ short_token_request = client.short_lived_token(access_code: code)
60
+
61
+ if short_token_request.success?
62
+ auth_token = token_request.payload.access_token
63
+ expires_in = token_request.payload.expires_in
64
+ user.update_instagram_token(token: token, expires_in: expires_in)
65
+ else
66
+ render json: short_token_request.error, status: 400
67
+ end
68
+ ```
69
+
70
+ You can exchange your short-lived token for a long-lived token.
71
+
72
+ ```ruby
73
+ client = InstagramBasicDisplay::Client.new
74
+ user = User.first
75
+
76
+ long_token_request = client.long_lived_token(short_lived_token: user.instagram_token)
77
+
78
+ if long_token_request.success?
79
+ auth_token = token_request.payload.access_token
80
+ expires_in = token_request.payload.expires_in
81
+ user.update_instagram_token(token: token, expires_in: expires_in)
82
+ else
83
+ render json: long_token_request.error, status: 400
84
+ end
85
+ ```
86
+
87
+ You can also pass an access code to `#long_lived_token`. It will be exchanged for a short-lived token, and then that will immediately be exchanged for a long-lived token.
88
+
89
+ ```ruby
90
+ access_code = params[:access_code]
91
+ client = InstagramBasicDisplay::Client.new
92
+ user = User.first
93
+
94
+ long_token_request = client.long_lived_token(access_code: access_code)
95
+
96
+ if long_token_request.success?
97
+ auth_token = token_request.payload.access_token
98
+ expires_in = token_request.payload.expires_in
99
+ user.update_instagram_token(token: token, expires_in: expires_in)
100
+ else
101
+ render json: long_token_request.error, status: 400
102
+ end
103
+ ```
104
+
105
+ You can refresh a long-lived token so that it remains valid for another period (at this stage, Instagram have set the validity period to 60 days).
106
+
107
+ ```ruby
108
+ user = User.first
109
+ client = InstagramBasicDisplay::Client.new
110
+
111
+ refresh_request = client.refresh_long_lived_token(token: user.instagram_token)
112
+
113
+ if refresh_request.success?
114
+ client.update_instagram_token(token: token_request.payload.access_token)
115
+ else
116
+ render json: refresh_request.error, status: 400
117
+ end
118
+ ```
119
+
120
+ To use an auth token when making requests, you can either pass it in when initializing the client,
121
+ or on-the-fly.
122
+
123
+ ```ruby
124
+ auth_token = User.first.instagram_token
125
+
126
+ client = InstagramBasicDisplay::Client.new(auth_token: auth_token)
127
+
128
+ # OR
129
+
130
+ client = InstagramBasicDisplay::Client.new
131
+ client.configuration.auth_token = auth_token
132
+ ```
133
+
134
+ ### Getting profile information
135
+
136
+ You can retrieve a user's profile information (e.g. their username and Instagram id).
137
+
138
+ If no `user_id` is provided, the request will be made against the user associated with the client's auth token. For example:
139
+
140
+ ```ruby
141
+ auth_token = User.first.instagram_token
142
+
143
+ client = InstagramBasicDisplay::Client.new(auth_token: auth_token)
144
+ response = client.profile
145
+
146
+ instagram_id = response.payload.id
147
+ instagram_username = response.payload.username
148
+ ```
149
+
150
+ But you can also pass in a `user_id`, and request specific profile fields. Check the Instagram documentation to find out [which fields are supported](https://developers.facebook.com/docs/instagram-basic-display-api/reference/user#fields).
151
+
152
+ ```ruby
153
+ user = User.first
154
+
155
+ client = InstagramBasicDisplay::Client.new(auth_token: user.instagram_token)
156
+ response = client.profile(user_id: user.instagram_id, fields: %i[username])
157
+
158
+ instagram_username = response.payload.username
159
+ ```
160
+
161
+ ### Getting media
162
+
163
+ You can query a user's media feed like this:
164
+
165
+ ```ruby
166
+ user = User.first
167
+
168
+ client = InstagramBasicDisplay::Client.new(auth_token: user.instagram_token)
169
+ response = client.media_feed
170
+
171
+ media = response.payload.data
172
+ ```
173
+
174
+ You can query for specific fields on the media, but by default you'll receive the `id` and `media_url` of each item. Refer to the Instagram documentation to [find out about other fields](https://developers.facebook.com/docs/instagram-basic-display-api/reference/media/).
175
+
176
+ ```ruby
177
+ user = User.first
178
+
179
+ client = InstagramBasicDisplay::Client.new(auth_token: user.instagram_token)
180
+ response = client.media_feed(fields: %i[caption media_url])
181
+
182
+ media = response.payload.data
183
+ ```
184
+
185
+ For pagination, the Instagram API provides previous/next links. Use those to retrieve the next page of results.
186
+
187
+ ```ruby
188
+
189
+ user = User.first
190
+
191
+ client = InstagramBasicDisplay::Client.new(auth_token: user.instagram_token)
192
+
193
+ first_page = client.media_feed(fields: %i[caption media_url])
194
+
195
+ # you can ask the response whether there is a next/previous page
196
+ has_next_page_link = first_page.next_page?
197
+
198
+ # or ask for the url
199
+ next_page_link = first_page.next_page_link
200
+
201
+ second_page = client.media_feed(fields: %i[caption media_url], paginated_url: next_page_link)
202
+ ```
203
+
204
+ You can pass some additional parameters to the media feed. They aren't yet well-documented by Instagram, but you can make some reasonable guesses at what will be accepted, based on the Facebook API. For example, to limit the number of results retrieved:
205
+
206
+ ```ruby
207
+ user = User.first
208
+
209
+ client = InstagramBasicDisplay::Client.new(auth_token: user.instagram_token)
210
+ client.media_feed(limit: 10)
211
+ ```
212
+
213
+ To retrieve a single piece of media, you'll need to know its id. As with the other requests, you can request whichever fields are supported by Instagram.
214
+
215
+ ```ruby
216
+ user = User.first
217
+ client = InstagramBasicDisplay::Client.new(auth_token: user.instagram_token)
218
+
219
+ client.media_node(media_id: id, fields: %i[caption media_url id])
220
+ ```
26
221
 
27
222
  ## Development
28
223
 
@@ -32,8 +227,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
227
 
33
228
  ## Contributing
34
229
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/instagram_basic_display. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
-
37
- ## Code of Conduct
38
-
39
- Everyone interacting in the InstagramBasicDisplay project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/instagram_basic_display/blob/master/CODE_OF_CONDUCT.md).
230
+ Bug reports and pull requests are welcome on GitHub at https://github.com/convertkit/instagram_basic_display. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
@@ -1,27 +1,27 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "instagram_basic_display/version"
3
+ require 'instagram_basic_display/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "instagram_basic_display"
6
+ spec.name = 'instagram_basic_display'
7
7
  spec.version = InstagramBasicDisplay::VERSION
8
- spec.authors = ["ConvertKit, LLC"]
9
- spec.email = ["engineering@convertkit.com"]
8
+ spec.authors = ['Kit, LLC']
9
+ spec.email = ['engineering@kit.com']
10
10
 
11
- spec.summary = %q{A ruby wrapper for the Instagram Basic Display API}
12
- spec.description = %q{A ruby wrapper for the Instagram Basic Display API}
13
- spec.homepage = "https://github.com/ConvertKit/instagram_basic_display"
11
+ spec.summary = 'A ruby wrapper for the Instagram Basic Display API'
12
+ spec.description = 'A ruby wrapper for the Instagram Basic Display API'
13
+ spec.homepage = 'https://github.com/Kit/instagram_basic_display'
14
14
 
15
15
  # Specify which files should be added to the gem when it is released.
16
16
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
18
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
19
  end
20
- spec.bindir = "exe"
20
+ spec.bindir = 'exe'
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.16"
25
- spec.add_development_dependency "rake", "~> 10.0"
26
- spec.add_development_dependency "rspec", "~> 3.0"
24
+ spec.add_development_dependency 'bundler', '~> 2.5.23'
25
+ spec.add_development_dependency 'rake', '~> 13.2'
26
+ spec.add_development_dependency 'rspec', '~> 3.13.0'
27
27
  end
@@ -19,14 +19,34 @@ require 'instagram_basic_display/configuration'
19
19
  require 'instagram_basic_display/response'
20
20
 
21
21
  module InstagramBasicDisplay
22
+ # A module to handle authentication requests to the Instagram API. Allows you to retrieve
23
+ # short- and long-lived tokens, and refresh long-lived tokens.
24
+ #
25
+ # Does not handle retrieving access codes. These must be retrieved by implementing Instagram's
26
+ # authentication window.
27
+ # https://developers.facebook.com/docs/instagram-basic-display-api/overview#authentication-window
22
28
  class Auth
29
+ # Constructor
30
+ #
31
+ # @param configuration [InstagramBasicDisplay::Configuration] configuration information
32
+ # that should be used to make requests against the Instagram API.
33
+ #
34
+ # @return void
23
35
  def initialize(configuration)
24
36
  @configuration = configuration
25
37
  end
26
38
 
39
+ # Exchanges an access code for a _short-lived_ access token. A short-lived token is valid
40
+ # for one hour, but can be exchanged for a long-lived token. Refer to Instagram's documentation.
41
+ # https://developers.facebook.com/docs/instagram-basic-display-api/overview#short-lived-access-tokens
42
+ #
43
+ # @param access_code [String] A code retrieved by implementing Instagram's authentication window
44
+ # flow: https://developers.facebook.com/docs/instagram-basic-display-api/overview#authentication-window
45
+ #
46
+ # @return [InstagramBasicDisplay::Response] a response object containing either the token or an error
27
47
  def short_lived_token(access_code:)
28
48
  response = Net::HTTP.post_form(
29
- URI('https://api.instagram.com/oauth/access_token'),
49
+ URI(auth_url),
30
50
  client_id: configuration.client_id,
31
51
  client_secret: configuration.client_secret,
32
52
  grant_type: 'authorization_code',
@@ -37,6 +57,13 @@ module InstagramBasicDisplay
37
57
  InstagramBasicDisplay::Response.new(response)
38
58
  end
39
59
 
60
+ # Exchanges _either_ an access code OR a short-lived token for a long-lived token.
61
+ # If an access code is passed, it will first be exchanged for a short-lived token.
62
+ # Once that is achieved, the short-lived token will be exchanged for a long-lived token.
63
+ # Refer to Instagram's documentation for more information on tokens:
64
+ # https://developers.facebook.com/docs/instagram-basic-display-api/overview
65
+ #
66
+ # @return [InstagramBasicDisplay::Response] a response object containing either the token or an error
40
67
  def long_lived_token(short_lived_token: nil, access_code: nil)
41
68
  short_lived_token ||= short_lived_token(access_code: access_code).payload.access_token
42
69
 
@@ -52,6 +79,9 @@ module InstagramBasicDisplay
52
79
  InstagramBasicDisplay::Response.new(response)
53
80
  end
54
81
 
82
+ # Refreshes a long-lived token for a new period of validity.
83
+ #
84
+ # @return [InstagramBasicDisplay::Response] a response object containing either the token or an error
55
85
  def refresh_long_lived_token(token:)
56
86
  uri = URI('https://graph.instagram.com/refresh_access_token')
57
87
  params = {
@@ -67,5 +97,13 @@ module InstagramBasicDisplay
67
97
  private
68
98
 
69
99
  attr_reader :configuration
100
+
101
+ def auth_url
102
+ if configuration.version == 1
103
+ 'https://api.instagram.com/oauth/access_token'
104
+ else
105
+ 'https://graph.instagram.com/oauth/access_token'
106
+ end
107
+ end
70
108
  end
71
109
  end
@@ -19,23 +19,43 @@ require 'instagram_basic_display/auth'
19
19
  require 'instagram_basic_display/profile'
20
20
 
21
21
  module InstagramBasicDisplay
22
+ # Exposes all the functionality of the gem, so that you can interact with the Instagram API.
23
+ # Methods are defined in separate modules, but delegated here for simplicity when interacting
24
+ # with the gem.
22
25
  class Client
23
26
  extend Forwardable
24
27
 
25
28
  def_delegators :@auth, :short_lived_token, :long_lived_token, :refresh_long_lived_token
26
29
  def_delegators :@profile, :profile, :media_feed, :media_node, :media_feed_from_link
27
30
 
28
- def initialize(auth_token: nil)
31
+ # Constructor method
32
+ #
33
+ # @param auth_token [String] optionally pass an auth token that will be used to
34
+ # make requests. If you do not have a token, you can retrieve one by using the
35
+ # authentication utilities provided.
36
+ #
37
+ # @return void
38
+ def initialize(auth_token: nil, version: 1)
29
39
  @auth_token = auth_token
40
+ @version = version
30
41
 
31
42
  @auth = Auth.new(configuration)
32
43
  @profile = Profile.new(configuration)
33
44
  end
34
45
 
46
+ # Configuration that will be used to make requests against the Instagram API:
47
+ # redirect_uri, client secret, and client ID. These are automatically picked up from
48
+ # environment variables. Optionally, you can pass an auth token which will be used
49
+ # to make requests.
50
+ #
51
+ # @return [InstagramBasicDisplay::Configuration]
35
52
  def configuration
36
- @configuration ||= InstagramBasicDisplay::Configuration.new(auth_token: @auth_token)
53
+ @configuration ||= InstagramBasicDisplay::Configuration.new(auth_token: @auth_token, version: @version)
37
54
  end
38
55
 
56
+ # Sets the gem's configuration
57
+ #
58
+ # @return void
39
59
  def configure
40
60
  yield(configuration) if block_given?
41
61
  nil
@@ -15,10 +15,18 @@
15
15
  # limitations under the License.
16
16
 
17
17
  module InstagramBasicDisplay
18
+ # Holds configuration values that are used to make requests against the
19
+ # Instagram API
18
20
  class Configuration
19
- attr_accessor :client_id, :client_secret, :redirect_uri, :auth_token
21
+ attr_accessor :client_id, :client_secret, :redirect_uri, :auth_token, :version
20
22
 
21
- def initialize(auth_token: nil)
23
+ # Constructor method
24
+ #
25
+ # @param auth_token [String] token that will be used to make requests
26
+ #
27
+ # @return void
28
+ def initialize(auth_token: nil, version: 1)
29
+ @version = version
22
30
  @client_id = set_client_id
23
31
  @client_secret = set_client_secret
24
32
  @redirect_uri = set_redirect_uri
@@ -26,15 +34,27 @@ module InstagramBasicDisplay
26
34
  end
27
35
 
28
36
  def set_client_id
29
- ENV.fetch('INSTAGRAM_CLIENT_ID')
37
+ if version == 1
38
+ ENV.fetch('INSTAGRAM_CLIENT_ID')
39
+ else
40
+ ENV.fetch('INSTAGRAM_CLIENT_ID_V2')
41
+ end
30
42
  end
31
43
 
32
44
  def set_client_secret
33
- ENV.fetch('INSTAGRAM_CLIENT_SECRET')
45
+ if version == 1
46
+ ENV.fetch('INSTAGRAM_CLIENT_SECRET')
47
+ else
48
+ ENV.fetch('INSTAGRAM_CLIENT_SECRET_V2')
49
+ end
34
50
  end
35
51
 
36
52
  def set_redirect_uri
37
- ENV.fetch('INSTAGRAM_REDIRECT_URI')
53
+ if version == 1
54
+ ENV.fetch('INSTAGRAM_REDIRECT_URI')
55
+ else
56
+ ENV.fetch('INSTAGRAM_REDIRECT_URI_V2')
57
+ end
38
58
  end
39
59
  end
40
60
  end
@@ -20,11 +20,37 @@ require 'instagram_basic_display/response'
20
20
  require 'instagram_basic_display/errors'
21
21
 
22
22
  module InstagramBasicDisplay
23
+ # Module for interacting with an Instagram user's profile. You can retrieve profile information
24
+ # and media.
23
25
  class Profile
26
+ # Constructor
27
+ #
28
+ # @param configuration [InstagramBasicDisplay::Configuration] the configuration
29
+ # information to use when making requests to Instagram.
30
+ #
31
+ # @return void
24
32
  def initialize(configuration)
25
33
  @configuration = configuration
26
34
  end
27
35
 
36
+ # Method for interacting with an Instagram user's profile. Can be used to retrieve
37
+ # information such as their id and username.
38
+ #
39
+ # @param user_id [String] the id of the user whose information you are retrieving.
40
+ # If no user_id is passed, the query will be made agains the user associated with the
41
+ # current auth token.
42
+ #
43
+ # @param fields [Array<Symbol>] array of fields to retrieve. Defaults to id and username.
44
+ # The full list of fields can be found in the Instagram documentation:
45
+ # https://developers.facebook.com/docs/instagram-basic-display-api/reference/user#fields
46
+ #
47
+ # @param params [Hash] any additional request parameters that should be passed to the API.
48
+ #
49
+ # @return [InstagramBasicDisplay::Response] a response object containing the response from
50
+ # the Instagram API.
51
+ #
52
+ # @raise [InstagramBasicDisplay::NoAuthToken] raises when no auth token is provided in the
53
+ # client configuration
28
54
  def profile(user_id: nil, fields: %i[id username], **params)
29
55
  check_for_auth_token!(params)
30
56
 
@@ -38,7 +64,23 @@ module InstagramBasicDisplay
38
64
  make_request(uri, params)
39
65
  end
40
66
 
41
- # document that you can add a limit here
67
+ # Method for retrieving a user's media feed.
68
+ #
69
+ # @param user_id [String] the id of the user whose information you are retrieving.
70
+ # If no user_id is passed, the query will be made agains the user associated with the
71
+ # current auth token.
72
+ #
73
+ # @param fields [Array<Symbol>] array of fields to retrieve. Defaults to id and media_url.
74
+ # The full list of fields can be found in the Instagram documentation:
75
+ # https://developers.facebook.com/docs/instagram-basic-display-api/reference/media/
76
+ #
77
+ # @param paginated_url [String] a url to retrieve the next or previous set of results
78
+ # from the API. This url is provided by the response from Instagram.
79
+ #
80
+ # @param params [Hash] any additional request parameters that should be passed to the API
81
+ #
82
+ # @raise [InstagramBasicDisplay::NoAuthToken] raises when no auth token is provided in the
83
+ # client configuration
42
84
  def media_feed(user_id: nil, fields: %i[id media_url], paginated_url: nil, **params)
43
85
  check_for_auth_token!(params)
44
86
 
@@ -57,7 +99,18 @@ module InstagramBasicDisplay
57
99
  make_request(uri, params)
58
100
  end
59
101
 
60
-
102
+ # Method for retrieving information for a particular media node (i.e. one image or video).
103
+ #
104
+ # @param media_id [String] the id of the media you are querying for.
105
+ #
106
+ # @param fields [Array<Symbol>] array of fields to retrieve. Defaults to id and media_url.
107
+ # The full list of fields can be found in the Instagram documentation:
108
+ # https://developers.facebook.com/docs/instagram-basic-display-api/reference/media/
109
+ #
110
+ # @param params [Hash] any additional request parameters that should be passed to the API
111
+ #
112
+ # @raise [InstagramBasicDisplay::NoAuthToken] raises when no auth token is provided in the
113
+ # client configuration
61
114
  def media_node(media_id:, fields: %i[id media_url], **params)
62
115
  check_for_auth_token!(params)
63
116
 
@@ -18,6 +18,10 @@ module InstagramBasicDisplay
18
18
  class Response
19
19
  attr_reader :status, :body, :response, :paging
20
20
 
21
+ # Constructor
22
+ # @param response [String] raw JSON repsonse from the Instagram API
23
+ #
24
+ # @return void
21
25
  def initialize(response)
22
26
  @response = response
23
27
  @body = JSON.parse(response.body)
@@ -25,30 +29,44 @@ module InstagramBasicDisplay
25
29
  @paging = body['paging']
26
30
  end
27
31
 
32
+ # Returns whether or not a next page of results from the Instagram API is available
33
+ # @return [Boolean]
28
34
  def next_page?
29
35
  !next_page_link.nil?
30
36
  end
31
37
 
38
+ # Returns whether or not a previous page of results from the Instagram API is available
39
+ # @return [Boolean]
32
40
  def previous_page?
33
41
  !previous_page_link.nil?
34
42
  end
35
43
 
44
+ # Returns a link to the next page of results from the Instagram API
45
+ # @return [String]
36
46
  def next_page_link
37
47
  paging['next'] if paging
38
48
  end
39
49
 
50
+ # Returns a link to the previous page of results from the Instagram API
51
+ # @return [String]
40
52
  def previous_page_link
41
53
  paging['previous'] if paging
42
54
  end
43
55
 
56
+ # Returns whether the request to the Instagram API was a success
57
+ # @return [Boolean]
44
58
  def success?
45
59
  response.message == 'OK'
46
60
  end
47
61
 
62
+ # Returns the raw payload from Instagram's API deserialized into a Struct
63
+ # @return [Struct]
48
64
  def payload
49
65
  deserialize_json(body)
50
66
  end
51
67
 
68
+ # If an error is returned from the Instagram API, returns it as a Struct
69
+ # @return [Nil, Struct]
52
70
  def error
53
71
  return unless body['error'] || body['error_message']
54
72
 
@@ -15,6 +15,5 @@
15
15
  # limitations under the License.
16
16
 
17
17
  module InstagramBasicDisplay
18
- VERSION = '0.2.0'
18
+ VERSION = '0.2.2'
19
19
  end
20
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instagram_basic_display
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
- - ConvertKit, LLC
8
- autorequire:
7
+ - Kit, LLC
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-25 00:00:00.000000000 Z
11
+ date: 2024-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,45 +16,45 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: 2.5.23
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.16'
26
+ version: 2.5.23
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.2'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: 3.13.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: 3.13.0
55
55
  description: A ruby wrapper for the Instagram Basic Display API
56
56
  email:
57
- - engineering@convertkit.com
57
+ - engineering@kit.com
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
@@ -80,10 +80,10 @@ files:
80
80
  - lib/instagram_basic_display/profile.rb
81
81
  - lib/instagram_basic_display/response.rb
82
82
  - lib/instagram_basic_display/version.rb
83
- homepage: https://github.com/ConvertKit/instagram_basic_display
83
+ homepage: https://github.com/Kit/instagram_basic_display
84
84
  licenses: []
85
85
  metadata: {}
86
- post_install_message:
86
+ post_install_message:
87
87
  rdoc_options: []
88
88
  require_paths:
89
89
  - lib
@@ -98,9 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  - !ruby/object:Gem::Version
99
99
  version: '0'
100
100
  requirements: []
101
- rubyforge_project:
102
- rubygems_version: 2.7.6
103
- signing_key:
101
+ rubygems_version: 3.4.10
102
+ signing_key:
104
103
  specification_version: 4
105
104
  summary: A ruby wrapper for the Instagram Basic Display API
106
105
  test_files: []