feedly 0.1.0

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: b584ca76792a8ca8919d310b981dc0bc22e7d386
4
+ data.tar.gz: 3f496c753ef37b0948343fb891a162a895dfd4b2
5
+ SHA512:
6
+ metadata.gz: 9c08a509c391b84a8c9aaddb516d13573aa5f35b62432c8d730b14709770bc318e8a4521f7ab8e5873c16a50859925c0f48acaeb9706be8b93da61f493cb2eac
7
+ data.tar.gz: bd89f5ff9a383f16b93e9c157a31c0836c6fb60eded0c1253c2c52ed1ed697b6a8e4c6e43c2efc35b342ba9750847015366f267c6f82ad6aa1e6c1f371bd3170
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ spec
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=documentation
3
+
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in feedly.gemspec
4
+ gemspec
5
+ gem 'rspec'
6
+ gem 'pry'
7
+
data/LICENSE ADDED
@@ -0,0 +1,31 @@
1
+ Copyright 2013 Myuzu
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
15
+
16
+
17
+ Copyright 2013 kmdsbng
18
+
19
+ Licensed under the Apache License, Version 2.0 (the "License");
20
+ you may not use this file except in compliance with the License.
21
+ You may obtain a copy of the License at
22
+
23
+ http://www.apache.org/licenses/LICENSE-2.0
24
+
25
+ Unless required by applicable law or agreed to in writing, software
26
+ distributed under the License is distributed on an "AS IS" BASIS,
27
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28
+ See the License for the specific language governing permissions and
29
+ limitations under the License.
30
+
31
+
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Feedly
2
+
3
+ This gem can access to Feely Cloud API.
4
+ Supports GETS, POSTS, AUTH apis.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'feedly'
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install feedly
19
+
20
+ ## Usage
21
+
22
+ TODO: Write usage instructions here
23
+
24
+ ## Contributing
25
+
26
+ 1. Fork it
27
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
28
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
29
+ 4. Push to the branch (`git push origin my-new-feature`)
30
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/feedly.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'feedly/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "feedly"
8
+ spec.version = Feedly::VERSION
9
+ spec.authors = ["Yoshihiro Kameda"]
10
+ spec.email = ["kameda.sbng@gmail.com"]
11
+ spec.description = %q{This gem can access to Feely Cloud API. Supports GETS, POSTS, AUTH apis.}
12
+ spec.summary = %q{Feedly Cloud API wrapper library.}
13
+ spec.homepage = "https://github.com/kmdsbng/feedly"
14
+ spec.license = "Apache2"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+ end
data/lib/feedly.rb ADDED
@@ -0,0 +1,241 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require "feedly/version"
3
+ require 'uri'
4
+ require 'net/http'
5
+ require 'json'
6
+
7
+ class Feedly
8
+ class Error < StandardError; end
9
+ class BadRequest < StandardError; end
10
+ class AuthError < StandardError; end
11
+ class NotFound < StandardError; end
12
+
13
+ #API_URL = 'http://sandbox.feedly.com/v3/'
14
+ attr_reader :access_token
15
+
16
+ def initialize(option={})
17
+ @refresh_token = option[:refresh_token]
18
+ @access_token = option[:access_token]
19
+ @sandbox = option[:sandbox]
20
+ if !@access_token && @refresh_token
21
+ get_access_token_by_refrech_token
22
+ end
23
+ end
24
+
25
+ def api_root
26
+ if @sandbox
27
+ 'http://sandbox.feedly.com'
28
+ else
29
+ 'http://cloud.feedly.com'
30
+ end
31
+ end
32
+
33
+ def client_id
34
+ @client_id if @client_id
35
+ if @sandbox
36
+ 'sandbox'
37
+ else
38
+ 'feedly'
39
+ end
40
+ end
41
+
42
+ def client_secret
43
+ @client_secret if @client_secret
44
+ if @sandbox
45
+ 'QNFQRFCFM1IQCJB367ON'
46
+ else
47
+ '0XP4XQ07VVMDWBKUHTJM4WUQ'
48
+ end
49
+ end
50
+
51
+ def redirect_uri
52
+ @redirect_uri if @redirect_uri
53
+ if @sandbox
54
+ 'http://localhost'
55
+ else
56
+ 'https://cloud.feedly.com/feedly.html'
57
+ end
58
+ end
59
+
60
+ def auth_url
61
+ api_get_redirect('auth/auth',
62
+ :client_id => self.client_id,
63
+ :redirect_uri => self.redirect_uri,
64
+ :scope => 'https://cloud.feedly.com/subscriptions',
65
+ :response_type => 'code',
66
+ :provider => 'google',
67
+ :migrate => 'false')
68
+ end
69
+
70
+ require 'pry'
71
+
72
+ def get_token_by_code(code)
73
+ #https://sandbox.feedly.com/v3/auth/token -X POST -d 'client_id=sandbox&client_secret=QNFQRFCFM1IQCJB367ON&grant_type=authorization_code&redirect_uri=http%3A%2F%2Flocalhost&code=AQAACggvIv3qZbrjYmz-Grq3r0POtTpduXUuKDd-4fQeO-yZisHCGQRSmZ-FDEMndQVCalBzBZuyceyEH0jJDSbTD42eqJU2dzVFT_qt0ak3wknJhx3xvHXc55gcYtC2YURCm-PDsFmFhLBdKQcK1pBlT-JX6K35_xx2vAmt1wOu'
74
+
75
+
76
+ url = make_url('auth/token', {})
77
+ uri = URI(url)
78
+ req = Net::HTTP::Post.new(uri.request_uri)
79
+ req['Authorization'] = "OAuth #{self.access_token}"
80
+ req['Content-type'] = 'application/json'
81
+ req.set_form_data({
82
+ :refresh_token => @refresh_token,
83
+ :client_id => self.client_id,
84
+ :client_secret => self.client_secret,
85
+ :grant_type => 'authorization_code',
86
+ :redirect_uri => self.redirect_uri,
87
+ :code => code,
88
+ })
89
+
90
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
91
+ http.request(req)
92
+ end
93
+
94
+ handle_errors(response)
95
+ JSON.parse(response.body)
96
+ end
97
+
98
+ def get_access_token_by_refrech_token
99
+ url = make_url('auth/token', {})
100
+ uri = URI(url)
101
+ req = Net::HTTP::Post.new(uri.request_uri)
102
+ req['Authorization'] = "OAuth #{self.access_token}"
103
+ req['Content-type'] = 'application/json'
104
+ #req.body = body.to_json
105
+ req.set_form_data({:refresh_token => @refresh_token, :client_id => 'sandbox', :client_secret => 'QNFQRFCFM1IQCJB367ON', :grant_type => 'refresh_token'})
106
+
107
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
108
+ http.request(req)
109
+ end
110
+
111
+ handle_errors(response)
112
+ json = JSON.parse(response.body)
113
+ @access_token = json['access_token']
114
+ end
115
+
116
+ def api_get(path, argv={})
117
+ url = make_url(path, argv)
118
+ uri = URI(url)
119
+ req = Net::HTTP::Get.new(uri.request_uri)
120
+ req['Authorization'] = "OAuth #{self.access_token}"
121
+
122
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
123
+ http.request(req)
124
+ end
125
+
126
+ handle_errors(response)
127
+ JSON.parse(response.body)
128
+ end
129
+
130
+ def api_get_redirect(path, argv={})
131
+ url = make_url(path, argv)
132
+ uri = URI(url)
133
+ req = Net::HTTP::Get.new(uri.request_uri)
134
+ req['Authorization'] = "OAuth #{self.access_token}"
135
+
136
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
137
+ http.request(req)
138
+ end
139
+
140
+ if response.code.to_i == 302
141
+ return response['location']
142
+ end
143
+
144
+ handle_errors(response)
145
+ raise "Unknown state #{response.code}"
146
+ end
147
+
148
+ def api_post(path, body, argv={})
149
+ url = make_url(path, argv)
150
+ uri = URI(url)
151
+ req = Net::HTTP::Post.new(uri.request_uri)
152
+ req['Authorization'] = "OAuth #{self.access_token}"
153
+ req['Content-type'] = 'application/json'
154
+ req.body = body.to_json
155
+
156
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
157
+ http.request(req)
158
+ end
159
+
160
+ handle_errors(response)
161
+ true
162
+ end
163
+
164
+ def api_delete(path, argv={})
165
+ url = make_url(path, argv)
166
+ uri = URI(url)
167
+ req = Net::HTTP::Delete.new(uri.request_uri)
168
+ req['Authorization'] = "OAuth #{self.access_token}"
169
+
170
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
171
+ http.request(req)
172
+ end
173
+
174
+ handle_errors(response)
175
+ true
176
+ end
177
+
178
+ def get_profile
179
+ api_get('profile')
180
+ end
181
+
182
+ def get_preferences
183
+ api_get('preferences')
184
+ end
185
+
186
+ def get_categories
187
+ api_get('categories')
188
+ end
189
+
190
+ def get_subscriptions
191
+ api_get('subscriptions')
192
+ end
193
+
194
+ def get_topics
195
+ api_get('topics')
196
+ end
197
+
198
+ def get_tags
199
+ api_get('tags')
200
+ end
201
+
202
+ def get_search_feeds(q, n=20)
203
+ api_get('search/feeds', :q => q, :n => n)
204
+ end
205
+
206
+ def get_feeds(feed_id)
207
+ api_get('feeds/' + URI.encode_www_form_component(feed_id))
208
+ end
209
+
210
+ def post_subscriptions(feed_id)
211
+ api_post('subscriptions', {:id => feed_id})
212
+ end
213
+
214
+ def delete_subscriptions(feed_id)
215
+ api_delete('subscriptions/' + URI.encode_www_form_component(feed_id))
216
+ end
217
+
218
+ def make_url(path, argv)
219
+ base_url = api_root + '/v3/' + path
220
+ query = argv.map {|k, v|
221
+ "#{URI.encode_www_form_component(k)}=#{URI.encode_www_form_component(v)}"
222
+ }.join('&')
223
+ query.empty? ? base_url : base_url + '?' + query
224
+ end
225
+
226
+ def handle_errors(response)
227
+ raise BadRequest if 'null' == response.body
228
+
229
+ case response.code.to_i
230
+ when 200 then response.body
231
+ when 401 then raise AuthError
232
+ when 403 then raise AuthError
233
+ when 404 then raise NotFound
234
+ when 500 then raise Error
235
+ else
236
+ raise Error
237
+ end
238
+ end
239
+ end
240
+
241
+
@@ -0,0 +1,3 @@
1
+ class Feedly
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'feedly'
3
+
4
+ def main
5
+ feedly = Feedly.new
6
+ puts '1. Access this url. Then redirect https://cloud.feedly.com/feedly.html?code=???&status= .'
7
+ puts feedly.auth_url
8
+
9
+ puts '2. Please input code'
10
+ print '> '
11
+ code = gets.chomp
12
+
13
+ token = feedly.get_token_by_code(code)
14
+ puts "OK. success to get tokens"
15
+ puts "access_token: " + token["access_token"]
16
+ puts "refresh_token: " + token["refresh_token"]
17
+ end
18
+
19
+ case $0
20
+ when __FILE__
21
+ main
22
+ when /spec[^\/]*$/
23
+ # {spec of the implementation}
24
+ end
25
+
26
+
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'feedly'
3
+
4
+ def main
5
+ access_token = ARGV[0]
6
+ f = Feedly.new(:access_token => access_token)
7
+ profile = f.get_profile
8
+ puts profile["fullName"] # MyName
9
+ puts profile["client"] # "Feedly sandbox client"
10
+ puts profile["email"] # "myaddress@example.com"
11
+ end
12
+
13
+ case $0
14
+ when __FILE__
15
+ main
16
+ when /spec[^\/]*$/
17
+ # {spec of the implementation}
18
+ end
19
+
20
+
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: feedly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yoshihiro Kameda
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: This gem can access to Feely Cloud API. Supports GETS, POSTS, AUTH apis.
70
+ email:
71
+ - kameda.sbng@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - feedly.gemspec
83
+ - lib/feedly.rb
84
+ - lib/feedly/version.rb
85
+ - sample/get_token.rb
86
+ - sample/hello_world.rb
87
+ homepage: https://github.com/kmdsbng/feedly
88
+ licenses:
89
+ - Apache2
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.0.14
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Feedly Cloud API wrapper library.
111
+ test_files: []