twitter-cache 0.1.1 → 0.2.0

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: 67e756e9a5226e0a5993f3659270a04034ccae3d
4
- data.tar.gz: 82f7eadc1bac46efc939d79ab6d84264cc248603
3
+ metadata.gz: b33820ed5e0c4c0de73bc2d7d9e5bd66e25ebb42
4
+ data.tar.gz: 6d1004ae84dc7b09acb2cd6c251dc141fae73f12
5
5
  SHA512:
6
- metadata.gz: 0139115cd127a1f20f29317487f5b84ad6489b85f1e1e96cfe651a92b9351a073aa264fbd157792f127d6a426f9f3d78add41b868500be3c9f1a605f8208b00d
7
- data.tar.gz: 42f8ae1c30b9b24357c502c847642ea0779f1ea9b9c309ad362b2269d9d537052c6535b321a207a44f9c0ceda2bed7e99a38e04c204b4e87635d0ecdfc0ab074
6
+ metadata.gz: 66522d777898e8a9744f613c3ee813e88ae7afc09cb0871279ec376e5d220479464af1034fe827a55d16c3a0f9ea74682762183f1d2b5ec74c58f98409a64b00
7
+ data.tar.gz: ace040c32cb309cc327948b3ae558fe05a96772da881fcc5fb8b2f30119e4716730033c8bb42fc80b5d5139481f21608510b66e2bdbf96c2c6df94e5fb4c5a73
data/README.md CHANGED
@@ -24,12 +24,9 @@ Or install it yourself as:
24
24
 
25
25
  ```ruby
26
26
  TwitterCache.configure do |config|
27
- config.twitter = {
28
- consumer_key: 'CONSUMER_KEY',
29
- consumer_secret: 'CONSUMER_SECRET'
30
- }
31
- config.redis = 'redis://127.0.0.1:6379/' # default ENV['REDIS_URL']
27
+ config.redis = 'redis://127.0.0.1:6379/' # default: ENV['REDIS_URL']
32
28
  config.ttl = 60 * 30 # sec
29
+ config.namespace = 'myapp' # default: twitter-cache-gem
33
30
  config.user_instance do |raw|
34
31
  User.new(id: raw.id, nickname: raw.screen_name,
35
32
  image: raw.profile_image_url_https.to_s)
@@ -39,35 +36,24 @@ end
39
36
 
40
37
  ### Usage
41
38
 
42
- Unauthorized client:
39
+ create cache client
43
40
 
44
41
  ```ruby
45
- twitter = TwitterCache::Client.new
46
- ```
47
-
48
- Authorized client:
49
-
50
- ```ruby
51
- twitter = TwitterCache::Client.new(access_token: 'token', access_token_secret: 'secret')
52
-
53
- # or with block
54
-
55
- twitter = TwitterCache::Client.new do |c|
56
- c.access_token = 'token'
57
- c.access_token_secret = 'secret'
58
- end
42
+ twitter = Twitter::REST::Client.new(consumer_key: 'key', ...)
43
+ cache = Twitter::Cache.new(twitter)
59
44
  ```
60
45
 
61
46
  Get friends:
62
47
 
63
48
  ```ruby
49
+
64
50
  # for authorized user
65
- twitter.friends(per: 200, page: 1)
66
- twitter.friends(per: 200, page: :randam)
51
+ cache.friends(per: 200, page: 1)
52
+ cache.friends(per: 200, page: :randam)
67
53
 
68
54
  # for other user
69
- twitter.friends(123456, per: 200, page: 1)
70
- twitter.friends(123456, per: 200, page: :random)
55
+ cache.friends(123456, per: 200, page: 1)
56
+ cache.friends(123456, per: 200, page: :random)
71
57
  ```
72
58
 
73
59
  ## Development
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,20 @@
1
+ module Twitter
2
+ module Cache
3
+ class Config
4
+ attr_accessor :redis, :ttl, :namespace
5
+
6
+ def namespace
7
+ @namespace ||= 'twitter-cache-gem'
8
+ end
9
+
10
+ def user_instance(&block)
11
+ @user_instance = block
12
+ end
13
+
14
+ def convert_user(raw)
15
+ return raw unless @user_instance
16
+ @user_instance.call(raw)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module Twitter
2
+ module Cache
3
+ module Helpers
4
+ def config
5
+ Twitter::Cache.config
6
+ end
7
+
8
+ def cache
9
+ @cache ||= Twitter::Cache::Redis.new
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,36 @@
1
+ require 'redis-namespace'
2
+ require 'oj'
3
+
4
+ module Twitter
5
+ module Cache
6
+ class Redis
7
+ include Twitter::Cache::Helpers
8
+ attr_reader :client
9
+
10
+ def initialize
11
+ redis_url = ENV['REDIS_URL'] || config.redis
12
+ redis = ::Redis.new(url: redis_url)
13
+ @client = ::Redis::Namespace.new(config.namespace, redis: redis)
14
+ end
15
+
16
+ def method_missing(name, *args)
17
+ client.send(name, *args)
18
+ end
19
+
20
+ def get(key, ttl: nil)
21
+ stored = client.get(key)
22
+ return Oj.load(stored, symbolize_keys: true) if stored
23
+ return nil unless block_given?
24
+
25
+ value = yield
26
+ set(key, value, ttl: ttl)
27
+ value
28
+ end
29
+
30
+ def set(key, value, ttl: nil)
31
+ client.set(key, Oj.dump(value))
32
+ client.expire(key, ttl) if ttl
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,5 @@
1
+ module Twitter
2
+ module Cache
3
+ VERSION = '0.2.0'
4
+ end
5
+ end
@@ -0,0 +1,67 @@
1
+ module Twitter
2
+ module Cache
3
+ class Wrapper
4
+ include Twitter::Cache::Helpers
5
+ attr_reader :twitter
6
+
7
+ def initialize(twitter)
8
+ @twitter = twitter
9
+ end
10
+
11
+ def user(id = current_id)
12
+ cache.get(user_key(id), ttl: config.ttl) do
13
+ config.convert_user(twitter.user(id))
14
+ end
15
+ end
16
+
17
+ def friend_ids(id = current_id)
18
+ cache.get(friends_key(id), ttl: config.ttl) do
19
+ twitter.friend_ids(id).to_a
20
+ end
21
+ end
22
+
23
+ def friends(id = current_id, per: 100, page: 0)
24
+ ids = friend_ids(id)
25
+ case page
26
+ when :rand, :random
27
+ users(ids.sample(per))
28
+ else
29
+ start = per * page
30
+ users(ids[start, per])
31
+ end
32
+ end
33
+
34
+ def users(ids)
35
+ users = ids.map { |id| cache.get(user_key(id)) }.compact
36
+ return users if ids.count == users.count
37
+ fetch_users(ids)
38
+ end
39
+
40
+ def current_user
41
+ @current_user ||= twitter.current_user
42
+ end
43
+
44
+ def current_id
45
+ current_user.id
46
+ end
47
+
48
+ protected
49
+
50
+ def user_key(id)
51
+ "user:#{id}"
52
+ end
53
+
54
+ def friends_key(id)
55
+ "friends:#{id}"
56
+ end
57
+
58
+ def fetch_users(ids)
59
+ users = twitter.users(ids).map { |raw| config.convert_user(raw) }
60
+ users.each do |user|
61
+ cache.set(user_key(user.id), user, ttl: config.ttl)
62
+ end
63
+ users
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,22 @@
1
+ require 'twitter/cache/version'
2
+ require 'twitter/cache/helpers'
3
+ require 'twitter/cache/config'
4
+ require 'twitter/cache/redis'
5
+ require 'twitter/cache/wrapper'
6
+
7
+ module Twitter
8
+ module Cache
9
+ def self.configure
10
+ yield(config)
11
+ config.freeze
12
+ end
13
+
14
+ def self.config
15
+ @config ||= Config.new
16
+ end
17
+
18
+ def self.new(twitter)
19
+ Twitter::Cache::Wrapper.new(twitter)
20
+ end
21
+ end
22
+ end
data/lib/twitter-cache.rb CHANGED
@@ -1 +1 @@
1
- require 'twitter_cache'
1
+ require 'twitter/cache'
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'twitter_cache/version'
4
+ require 'twitter/cache/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'twitter-cache'
8
- spec.version = TwitterCache::VERSION
8
+ spec.version = Twitter::Cache::VERSION
9
9
  spec.authors = ['masarakki']
10
10
  spec.email = ['masaki@hisme.net']
11
11
 
@@ -21,11 +21,11 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_development_dependency 'bundler', '~> 1.7'
23
23
  spec.add_development_dependency 'rake', '~> 10.0'
24
- %w(rspec rubocop guard guard-rspec guard-rubocop rspec-its activemodel coveralls webmock pry dotenv).each do |gem|
24
+ %w(rspec rubocop guard guard-rspec guard-rubocop rspec-its activemodel coveralls pry).each do |gem|
25
25
  spec.add_development_dependency gem
26
26
  end
27
27
 
28
- %w(twitter redis-namespace oj).each do |gem|
28
+ %w(redis-namespace oj).each do |gem|
29
29
  spec.add_dependency gem
30
30
  end
31
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - masarakki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-07-14 00:00:00.000000000 Z
11
+ date: 2015-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,20 +150,6 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: webmock
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: pry
169
155
  requirement: !ruby/object:Gem::Requirement
@@ -178,34 +164,6 @@ dependencies:
178
164
  - - ">="
179
165
  - !ruby/object:Gem::Version
180
166
  version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: dotenv
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
- - !ruby/object:Gem::Dependency
196
- name: twitter
197
- requirement: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- version: '0'
202
- type: :runtime
203
- prerelease: false
204
- version_requirements: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - ">="
207
- - !ruby/object:Gem::Version
208
- version: '0'
209
167
  - !ruby/object:Gem::Dependency
210
168
  name: redis-namespace
211
169
  requirement: !ruby/object:Gem::Requirement
@@ -253,12 +211,12 @@ files:
253
211
  - bin/console
254
212
  - bin/setup
255
213
  - lib/twitter-cache.rb
256
- - lib/twitter_cache.rb
257
- - lib/twitter_cache/client.rb
258
- - lib/twitter_cache/config.rb
259
- - lib/twitter_cache/helpers.rb
260
- - lib/twitter_cache/redis.rb
261
- - lib/twitter_cache/version.rb
214
+ - lib/twitter/cache.rb
215
+ - lib/twitter/cache/config.rb
216
+ - lib/twitter/cache/helpers.rb
217
+ - lib/twitter/cache/redis.rb
218
+ - lib/twitter/cache/version.rb
219
+ - lib/twitter/cache/wrapper.rb
262
220
  - twitter-cache.gemspec
263
221
  homepage: https://github.com/masarakki/twitter-cache
264
222
  licenses:
@@ -1,82 +0,0 @@
1
- require 'twitter'
2
-
3
- module TwitterCache
4
- class Client
5
- include TwitterCache::Helpers
6
- attr_accessor :access_token, :access_token_secret
7
-
8
- def initialize(access_token: nil, access_token_secret: nil)
9
- @access_token = access_token
10
- @access_token_secret = access_token_secret
11
- yield(self) if block_given?
12
- end
13
-
14
- def user(id = current_id)
15
- cache.get(user_key(id), ttl: config.ttl) do
16
- config.convert_user(twitter.user(id))
17
- end
18
- end
19
-
20
- def friend_ids(id = current_id)
21
- cache.get(friends_key(id), ttl: config.ttl) do
22
- twitter.friend_ids(id).to_a
23
- end
24
- end
25
-
26
- def friends(id = current_id, per: 100, page: 0)
27
- ids = friend_ids(id)
28
- case page
29
- when :rand, :random
30
- users(ids.sample(per))
31
- else
32
- start = per * page
33
- users(ids[start, per])
34
- end
35
- end
36
-
37
- def users(ids)
38
- users = ids.map { |id| cache.get(user_key(id)) }.compact
39
- return users if ids.count == users.count
40
- fetch_users(ids)
41
- end
42
-
43
- def current_user
44
- @current_user ||= twitter.current_user
45
- end
46
-
47
- def current_id
48
- current_user.id
49
- end
50
-
51
- def twitter
52
- @twitter ||= ::Twitter::REST::Client.new(config.twitter) do |conf|
53
- if token_given?
54
- conf.access_token = access_token
55
- conf.access_token_secret = access_token_secret
56
- end
57
- end
58
- end
59
-
60
- protected
61
-
62
- def token_given?
63
- access_token && access_token_secret
64
- end
65
-
66
- def user_key(id)
67
- "user:#{id}"
68
- end
69
-
70
- def friends_key(id)
71
- "friends:#{id}"
72
- end
73
-
74
- def fetch_users(ids)
75
- users = twitter.users(ids).map { |raw| config.convert_user(raw) }
76
- users.each do |user|
77
- cache.set(user_key(user.id), user, ttl: config.ttl)
78
- end
79
- users
80
- end
81
- end
82
- end
@@ -1,14 +0,0 @@
1
- module TwitterCache
2
- class Config
3
- attr_accessor :twitter, :redis, :ttl
4
-
5
- def user_instance(&block)
6
- @user_instance = block
7
- end
8
-
9
- def convert_user(raw)
10
- return raw unless @user_instance
11
- @user_instance.call(raw)
12
- end
13
- end
14
- end
@@ -1,11 +0,0 @@
1
- module TwitterCache
2
- module Helpers
3
- def config
4
- TwitterCache.config
5
- end
6
-
7
- def cache
8
- @cache ||= TwitterCache::Redis.new
9
- end
10
- end
11
- end
@@ -1,34 +0,0 @@
1
- require 'redis-namespace'
2
- require 'oj'
3
-
4
- module TwitterCache
5
- class Redis
6
- include TwitterCache::Helpers
7
- attr_reader :client
8
-
9
- def initialize
10
- redis_url = ENV['REDIS_URL'] || config.redis
11
- redis = ::Redis.new(url: redis_url)
12
- @client = ::Redis::Namespace.new(:twitter_cache_gem, redis: redis)
13
- end
14
-
15
- def method_missing(name, *args)
16
- client.send(name, *args)
17
- end
18
-
19
- def get(key, ttl: nil)
20
- stored = client.get(key)
21
- return Oj.load(stored, symbolize_keys: true) if stored
22
- return nil unless block_given?
23
-
24
- value = yield
25
- set(key, value, ttl: ttl)
26
- value
27
- end
28
-
29
- def set(key, value, ttl: nil)
30
- client.set(key, Oj.dump(value))
31
- client.expire(ttl) if ttl
32
- end
33
- end
34
- end
@@ -1,3 +0,0 @@
1
- module TwitterCache
2
- VERSION = '0.1.1'
3
- end
data/lib/twitter_cache.rb DELETED
@@ -1,16 +0,0 @@
1
- require 'twitter_cache/version'
2
- require 'twitter_cache/helpers'
3
- require 'twitter_cache/config'
4
- require 'twitter_cache/redis'
5
- require 'twitter_cache/client'
6
-
7
- module TwitterCache
8
- def self.configure
9
- yield(config)
10
- config.freeze
11
- end
12
-
13
- def self.config
14
- @config ||= Config.new
15
- end
16
- end