rediscord 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6e4f8b4173dbd78fac11d9b062b5eed27320c2f5
4
+ data.tar.gz: fcf18d91a253bcd1445e1fd708563c3f261d324a
5
+ SHA512:
6
+ metadata.gz: a4f2a097d073cad6e3f36e91a6414b12fef1bcf6ea3596f8462cabc382f1bd479f0eb55d46216fea83c01a2551a950aa1fcb409802629e7614a65d0bc359d932
7
+ data.tar.gz: 6c978952b2ba391679a1f5b5c83d32a60e73aa7318ae146b3e39027d147cd7085338695be6beb13d1fe4730118503aa1fb56e700b2dd588b83d2455ea79474de
@@ -0,0 +1,44 @@
1
+ # Rediscord
2
+ keep record id sync with dynamic redis set or zset
3
+
4
+ ## Install
5
+
6
+ add `gem 'rediscord'` to Gemfile, and run `bundle install`
7
+
8
+ ## Example
9
+ * set
10
+ ```ruby
11
+ class Post < ApplicationRecord
12
+ enum level: [ :one, :two, :there ]
13
+
14
+ include Rediscord
15
+ redis_set key: ->(m){ "level_#{m.level}_post_set" }, redis: Redis.new
16
+ end
17
+ ```
18
+ ```ruby
19
+ Post.create(level: :one) # id: 1
20
+ Post.create(level: :one) # id: 2
21
+ Post.create(level: :two) # id: 3
22
+ Post.create(level: :there) # id: 4
23
+ ```
24
+ > what's in redis?
25
+
26
+ ![](http://ww1.sinaimg.cn/large/006tKfTcjw1f6gc1feycqj31hc0vsdix.jpg)
27
+
28
+ * zset
29
+
30
+ ```ruby
31
+ class Post < ApplicationRecord
32
+ enum level: [ :one, :two, :there ]
33
+
34
+ include Rediscord
35
+ redis_zset key: ->(m){ "level_#{m.level}_post_zset" }, score: ->(m){ m.updated_at.to_i }, redis: Redis.new
36
+ end
37
+ ```
38
+ ```ruby
39
+ Post.create(level: :one)
40
+ Post.create(level: :one)
41
+ Post.create(level: :two)
42
+ Post.create(level: :there)
43
+ ```
44
+ ![](http://ww1.sinaimg.cn/large/006tKfTcjw1f6gc6mmk9sj31hc0vsgov.jpg)
@@ -0,0 +1,62 @@
1
+ require 'active_support/concern'
2
+ require 'rediscord/record_set'
3
+ require 'rediscord/record_zset'
4
+
5
+ module Rediscord
6
+ extend ActiveSupport::Concern
7
+ class_methods do
8
+ attr_reader :force_update, :record_sets
9
+ def init_sets
10
+ unless @record_sets
11
+ @record_sets = []
12
+
13
+ after_create :_update_ids_after_create
14
+ after_update :_update_ids_after_update
15
+ after_destroy :_update_ids_after_destroy
16
+ end
17
+ end
18
+
19
+ def redis_zset(options)
20
+ init_sets
21
+ @record_sets << RecordZset.new(options)
22
+ end
23
+
24
+ def redis_set(options)
25
+ init_sets
26
+ @record_sets << RecordSet.new(options)
27
+ end
28
+
29
+ def redis_refresh
30
+ @force_update = true
31
+ find_each do |m|
32
+ m.save
33
+ end
34
+ end
35
+ def previous_model(obj)
36
+ prev = obj.dup
37
+ obj.changed_attributes.each do |key, value|
38
+ prev.send("#{key}=", value)
39
+ end
40
+ prev
41
+ end
42
+ end
43
+
44
+ def _update_ids_after_create
45
+ self.class.record_sets.each do |s|
46
+ s.after_create(self)
47
+ end
48
+ end
49
+
50
+ def _update_ids_after_destroy
51
+ self.class.record_sets.each do |s|
52
+ s.after_destroy(self)
53
+ end
54
+ end
55
+
56
+ def _update_ids_after_update
57
+ prev_record = self.class.previous_model(self)
58
+ self.class.record_sets.each do |s|
59
+ s.after_update(self, prev_record)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,31 @@
1
+ module Rediscord
2
+ class RecordSet
3
+ attr_reader :key, :redis, :force_update
4
+
5
+ def initialize(options)
6
+ @key = options[:key]
7
+ @redis = options[:redis]
8
+ end
9
+
10
+ def key_for(record)
11
+ key.call(record)
12
+ end
13
+
14
+ def after_create(record)
15
+ redis.sadd(key_for(record), record.id)
16
+ end
17
+
18
+ def after_destroy(record)
19
+ redis.srem(key_for(record), record.id)
20
+ end
21
+
22
+ def after_update(record, prev_record)
23
+ _key_was = key_for(prev_record)
24
+ _key = key_for(record)
25
+ if force_update || _key_was != _key
26
+ redis.srem(_key_was, record.id)
27
+ redis.sadd(_key, record.id)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ module Rediscord
2
+ class RecordZset < RecordSet
3
+ attr_reader :score
4
+
5
+ def initialize(options)
6
+ super
7
+ @score = options[:score]
8
+ end
9
+
10
+ def score_for(record)
11
+ score.call(record)
12
+ end
13
+
14
+ def after_create(record)
15
+ redis.zadd(key_for(record), score_for(record), record.id)
16
+ end
17
+
18
+ def after_destroy(record)
19
+ redis.zrem(key_for(record), record.id)
20
+ end
21
+
22
+ def after_update(record, prev_record)
23
+ _key_was = key_for(prev_record)
24
+ _key = key_for(record)
25
+
26
+ _score = score_for(record)
27
+ _score_was = score_for(prev_record)
28
+
29
+ if force_update || _key_was != _key || _score != _score_was
30
+ redis.zrem(_key_was, record.id)
31
+ redis.zadd(_key, score_for(record), record.id)
32
+ end
33
+ end
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rediscord
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - kikyous
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: keep record id sync with dynamic redis set or zset
14
+ email: kikyous@163.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files:
18
+ - README.md
19
+ files:
20
+ - README.md
21
+ - lib/rediscord.rb
22
+ - lib/rediscord/record_set.rb
23
+ - lib/rediscord/record_zset.rb
24
+ homepage: http://rubyonrails.org
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: keep record id sync with redis set/zset
48
+ test_files: []