norton 0.0.22 → 0.0.24

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: 0b5906f15562fcd49ad8fcd7a1328a12758984b5
4
- data.tar.gz: bd7baed316f3532ece1c2567959ea1f7e408d7ee
3
+ metadata.gz: 47f5a6a213e297cec27645a41ff453ae1b7d4bfd
4
+ data.tar.gz: 37b3492ec453174d6bb8993ddf835ae2af2a43b4
5
5
  SHA512:
6
- metadata.gz: 0ae278996ed1de62b9a54024ea6fb26c7a823c0a1eeb8afa61ba6807153b7812aeef1903193c77033df6e9a8c4edeb59816c7857d63e563225e4fbf262b69638
7
- data.tar.gz: 3ae1acec911911dc8943814071bfd0c8f845e0139e2897b523a67f461c60ec90bb3367b651b621bdb2db0a2f1910650fdb9969c3cb3cfc7883ebafc3a660aee6
6
+ metadata.gz: cd5c343f935788a653d31e65b8f94107353df0121ced3610cc65613782fdc462450b05437a06c613f1dfd6c84dc6941dcf90119ccb66f0e1dbd81ce12ce6ca47
7
+ data.tar.gz: 12969d600acc46904a4680e49cf62f3acaff0243970449358d98619a9cf4e9e08f441f6c4cb86ddb057c81b56312f9cea06780e7b51bfa8ebde631cd5ce29a7f
@@ -1,6 +1,10 @@
1
1
  module Norton
2
2
  module Counter
3
- extend ActiveSupport::Concern
3
+ extend ::ActiveSupport::Concern
4
+
5
+ included do
6
+ include Norton::Helper
7
+ end
4
8
 
5
9
  module ClassMethods
6
10
  #
@@ -13,37 +17,37 @@ module Norton
13
17
  def counter(name, options={}, &blk)
14
18
  define_method(name) do
15
19
  Norton.redis.with do |conn|
16
- conn.get("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}").try(:to_i) || 0
20
+ conn.get(self.norton_redis_key(name)).try(:to_i) || 0
17
21
  end
18
22
  end
19
23
 
20
24
  define_method("incr_#{name}") do
21
25
  Norton.redis.with do |conn|
22
- conn.incr("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}")
26
+ conn.incr(self.norton_redis_key(name))
23
27
  end
24
28
  end
25
29
 
26
30
  define_method("decr_#{name}") do
27
31
  Norton.redis.with do |conn|
28
- conn.decr("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}")
32
+ conn.decr(self.norton_redis_key(name))
29
33
  end
30
34
  end
31
35
 
32
36
  define_method("incr_#{name}_by") do |increment|
33
37
  Norton.redis.with do |conn|
34
- conn.incrby("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", increment)
38
+ conn.incrby(self.norton_redis_key(name), increment)
35
39
  end
36
40
  end
37
41
 
38
42
  define_method("decr_#{name}_by") do |decrement|
39
43
  Norton.redis.with do |conn|
40
- conn.decrby("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", decrement)
44
+ conn.decrby(self.norton_redis_key(name), decrement)
41
45
  end
42
46
  end
43
47
 
44
48
  define_method("#{name}=") do |v|
45
49
  Norton.redis.with do |conn|
46
- conn.set("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", v)
50
+ conn.set(self.norton_redis_key(name), v)
47
51
  end
48
52
  end
49
53
 
@@ -51,13 +55,13 @@ module Norton
51
55
  count = instance_eval(&blk)
52
56
 
53
57
  Norton.redis.with do |conn|
54
- conn.set("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", count)
58
+ conn.set(self.norton_redis_key(name), count)
55
59
  end
56
60
  end
57
61
 
58
62
  define_method("remove_#{name}") do
59
63
  Norton.redis.with do |conn|
60
- conn.del("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}")
64
+ conn.del(self.norton_redis_key(name))
61
65
  end
62
66
  end
63
67
  send(:after_destroy, "remove_#{name}".to_sym) if respond_to? :after_destroy
@@ -2,26 +2,21 @@ module Norton
2
2
  module HashMap
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ included do
6
+ include Norton::Helper
7
+ end
8
+
5
9
  module ClassMethods
6
10
  def hash_map(name)
7
11
  define_method(name) do
8
12
  instance_variable_get("@#{name}") ||
9
13
  instance_variable_set("@#{name}",
10
- Norton::Objects::Hash.new(norton_field_key(name))
14
+ Norton::Objects::Hash.new(self.norton_redis_key(name))
11
15
  )
12
16
  end
13
17
 
14
18
  after_destroy { send(name).clear } if respond_to?(:after_destroy)
15
19
  end
16
20
  end
17
-
18
- def norton_field_key(name)
19
- if id.nil?
20
- raise NilObjectId,
21
- "Attempt to address norton field :#{name} on class #{self.class.name} with nil id"
22
- end
23
-
24
- "#{self.class.name.tableize}:#{id}:#{name}"
25
- end
26
21
  end
27
22
  end
data/lib/norton/helper.rb CHANGED
@@ -2,6 +2,42 @@ module Norton
2
2
  module Helper
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ #
6
+ # Prefix of Redis Key of Norton value, consists with Class name string in plural form
7
+ # and Instance id.
8
+ #
9
+ # Example:
10
+ #
11
+ # a User instance with id = 1 -> `users:1`
12
+ # a HolyLight::Spammer instance with id = 5 -> `holy_light/spammers:5`
13
+ #
14
+ #
15
+ # @return [String]
16
+ #
17
+ def norton_prefix
18
+ id = self.id
19
+ raise Norton::NilObjectId if id.nil?
20
+ klass = self.class.to_s.pluralize.underscore
21
+ "#{klass}:#{self.id}"
22
+ end
23
+
24
+ #
25
+ # Returns the final Redis Key of a certain Norton value, teh value will be saved in redis with
26
+ # this value.
27
+ #
28
+ # Example:
29
+ #
30
+ # a User instance with id = 1 defines a counter named `likes_count` -> users:1:likes_count
31
+ #
32
+ #
33
+ # @param [String] name
34
+ #
35
+ # @return [String]
36
+ #
37
+ def norton_redis_key(name)
38
+ "#{self.norton_prefix}:#{name}"
39
+ end
40
+
5
41
  #
6
42
  # 批量取出当前对象的多个 Norton value
7
43
  #
@@ -9,21 +45,20 @@ module Norton
9
45
  #
10
46
  # @return [Hash]
11
47
  #
12
- def norton_values(*keys)
48
+ def norton_vals(*names)
13
49
  ret = {}
14
50
 
15
- redis_keys = keys.map { |k| "#{self.class.to_s.pluralize.underscore}:#{self.id}:#{k}" }
51
+ redis_keys = names.map { |n| self.norton_redis_key(n) }
16
52
 
17
53
  redis_values = Norton.redis.with do |conn|
18
54
  conn.mget(redis_keys)
19
55
  end
20
56
 
21
- keys.each_with_index do |key, index|
22
- ret[key] = redis_values[index].try(:to_i)
57
+ names.each_with_index do |n, index|
58
+ ret[n] = redis_values[index].try(:to_i)
23
59
  end
24
60
 
25
61
  ret
26
62
  end
27
-
28
63
  end
29
64
  end
@@ -16,11 +16,11 @@ module Norton
16
16
  # Define getter
17
17
  define_method(name) do
18
18
  Norton.redis.with do |conn|
19
- v = conn.get("#{self.class.to_s.tableize}:#{self.id}:#{name}")
19
+ v = conn.get(self.norton_redis_key(name))
20
20
 
21
21
  if v.nil?
22
22
  v = instance_eval(&blk)
23
- conn.setex("#{self.class.to_s.tableize}:#{self.id}:#{name}", options[:ttl], v)
23
+ conn.setex(self.norton_redis_key(name), options[:ttl], v)
24
24
  end
25
25
 
26
26
  v
@@ -30,11 +30,11 @@ module Norton
30
30
  define_method("reset_#{name}") do
31
31
  Norton.redis.with do |conn|
32
32
  v = instance_eval(&blk)
33
- conn.setex("#{self.class.to_s.tableize}:#{self.id}:#{name}", options[:ttl], v)
33
+ conn.setex(self.norton_redis_key(name), options[:ttl], v)
34
34
  v
35
35
  end
36
36
  end
37
37
  end
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -2,6 +2,10 @@ module Norton
2
2
  module Timestamp
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ included do
6
+ include Norton::Helper
7
+ end
8
+
5
9
  module ClassMethods
6
10
  #
7
11
  # [timestamp Define a timestamp]
@@ -14,11 +18,11 @@ module Norton
14
18
  ts = nil
15
19
 
16
20
  Norton.redis.with do |conn|
17
- ts = conn.get("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}").try(:to_i)
21
+ ts = conn.get(self.norton_redis_key(name)).try(:to_i)
18
22
 
19
23
  if !options[:allow_nil] && ts.nil?
20
24
  ts = Time.now.to_i
21
- conn.set("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", ts)
25
+ conn.set(self.norton_redis_key(name), ts)
22
26
  end
23
27
 
24
28
  ts
@@ -28,13 +32,20 @@ module Norton
28
32
  define_method("touch_#{name}") do
29
33
  Norton.redis.with do |conn|
30
34
  if options[:digits].present? && options[:digits] == 13
31
- conn.set("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", (Time.now.to_f * 1000).to_i)
35
+ conn.set(self.norton_redis_key(name), (Time.now.to_f * 1000).to_i)
32
36
  else
33
- conn.set("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}", Time.now.to_i)
37
+ conn.set(self.norton_redis_key(name), Time.now.to_i)
34
38
  end
35
39
  end
36
40
  end
37
41
 
42
+ define_method("remove_#{name}") do
43
+ Norton.redis.with do |conn|
44
+ conn.del("#{self.class.to_s.pluralize.underscore}:#{self.id}:#{name}")
45
+ end
46
+ end
47
+ send(:after_destroy, "remove_#{name}".to_sym) if respond_to? :after_destroy
48
+
38
49
  # Add callback
39
50
  if options[:touch_on].present?
40
51
  options[:touch_on].each do |callback, condition|
@@ -1,3 +1,3 @@
1
1
  module Norton
2
- VERSION = "0.0.22"
2
+ VERSION = "0.0.24"
3
3
  end
data/lib/norton.rb CHANGED
@@ -3,10 +3,10 @@ require "connection_pool"
3
3
  require "active_support/concern"
4
4
  require "active_support/inflector"
5
5
  require "norton/version"
6
+ require "norton/helper"
6
7
  require "norton/timestamp"
7
8
  require "norton/counter"
8
9
  require "norton/timed_value"
9
- require "norton/helper"
10
10
  require "norton/objects/hash"
11
11
  require "norton/hash_map"
12
12
 
@@ -11,17 +11,10 @@ class HashMapObject
11
11
  end
12
12
 
13
13
  describe Norton::HashMap do
14
- describe "#norton_field_key" do
14
+ describe "#norton_redis_key" do
15
15
  it "generates the correct field key" do
16
16
  object = HashMapObject.new
17
- expect(object.norton_field_key(:profile)).to eq("hash_map_objects:99:profile")
18
- end
19
-
20
- it "raises NilObjectId if the object id is nil" do
21
- object = HashMapObject.new
22
- allow(object).to receive(:id) { nil }
23
-
24
- expect { object.norton_field_key(:profile) }.to raise_error(Norton::NilObjectId)
17
+ expect(object.norton_redis_key(:profile)).to eq("hash_map_objects:99:profile")
25
18
  end
26
19
  end
27
20
 
@@ -3,7 +3,6 @@ require 'spec_helper'
3
3
  class Dummy
4
4
  include Norton::Counter
5
5
  include Norton::Timestamp
6
- include Norton::Helper
7
6
 
8
7
  counter :counter1
9
8
  counter :counter2
@@ -16,12 +15,50 @@ class Dummy
16
15
  end
17
16
  end
18
17
 
18
+ module HolyLight
19
+ class Spammer
20
+ include Norton::Counter
21
+
22
+ def id
23
+ @id ||= Random.rand(10000)
24
+ end
25
+ end
26
+ end
27
+
19
28
  describe Norton::Helper do
20
- describe ".norton_values" do
21
- it "should respond to `:norton_values`" do
29
+ describe "#norton_redis_key" do
30
+ it do
31
+ n = SecureRandom.hex(3)
32
+
33
+ dummy = Dummy.new
34
+ expect(dummy.norton_redis_key(n)).to eq("dummies:#{dummy.id}:#{n}")
35
+ end
36
+
37
+ it "should raise `Norton::NilObjectId` if id returns nil" do
38
+ dummy = Dummy.new
39
+ allow(dummy).to receive(:id) { nil }
40
+
41
+ expect { dummy.norton_prefix }.to raise_error(Norton::NilObjectId)
42
+ end
43
+ end
44
+
45
+ describe "#norton_prefix" do
46
+ it "should return correctly for `Dummy`" do
47
+ dummy = Dummy.new
48
+ expect(dummy.norton_prefix).to eq("dummies:#{dummy.id}")
49
+ end
50
+
51
+ it "should return correctly for `HolyLight::Spammer`" do
52
+ spammer = HolyLight::Spammer.new
53
+ expect(spammer.norton_prefix).to eq("holy_light/spammers:#{spammer.id}")
54
+ end
55
+ end
56
+
57
+ describe "#norton_vals" do
58
+ it "should respond to `:norton_vals`" do
22
59
  dummy = Dummy.new
23
60
 
24
- expect(dummy).to respond_to(:norton_values)
61
+ expect(dummy).to respond_to(:norton_vals)
25
62
  end
26
63
 
27
64
  it "should return the specific values" do
@@ -33,7 +70,7 @@ describe Norton::Helper do
33
70
 
34
71
  dummy.touch_time1
35
72
 
36
- values = dummy.norton_values(:counter1, :time1)
73
+ values = dummy.norton_vals(:counter1, :time1)
37
74
 
38
75
  expect(values).to include(:counter1, :time1)
39
76
  expect(values.size).to eq(2)
@@ -50,7 +87,7 @@ describe Norton::Helper do
50
87
 
51
88
  dummy.touch_time1
52
89
 
53
- values = dummy.norton_values(:counter1, :counter2, :time2)
90
+ values = dummy.norton_vals(:counter1, :counter2, :time2)
54
91
 
55
92
  expect(values).to include(:counter1, :counter2, :time2)
56
93
  expect(values.size).to eq(3)
@@ -24,6 +24,11 @@ describe Norton::Timestamp do
24
24
  expect(dummy).to respond_to(:born_at)
25
25
  expect(dummy).to respond_to(:touch_born_at)
26
26
  end
27
+
28
+ it "should create remove method" do
29
+ dummy = Dummy.new
30
+ expect(dummy).to respond_to(:remove_born_at)
31
+ end
27
32
  end
28
33
 
29
34
  describe "#touch_born_at" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: norton
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.22
4
+ version: 0.0.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - Larry Zhao
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-05 00:00:00.000000000 Z
11
+ date: 2017-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis