ssdb-attr 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0af0af4f71bf1a2334ba60e48f6dea9ecc54eed
4
- data.tar.gz: 6a3961ede70cc7c2c206220f3e85ea4ca427a764
3
+ metadata.gz: dedea1c81f2baa61f35d107b89e9e88494c96f40
4
+ data.tar.gz: 8777a84c9a061a041a93deb7e5dc2dce4a742836
5
5
  SHA512:
6
- metadata.gz: 9d86ccf61150eaaa6f3037742168d0f5798b62091621447846002285797cc540a22c19b283b2163b43fa53cfaed7014290382a2be47ccb9237ab8996b93c0ded
7
- data.tar.gz: eb0a242d995163bce6d8595458f5e6e8f2a678bdeae92494899144f9e534c238758fd830be825071375f5c68b56948a0524909448ff8c52d46aebe08184e8c83
6
+ metadata.gz: b6c1f09802b2a1a9efe05f8efc51f853806a554240740baf7f4a33628245889936e5afe485b4879201baed7fe65cc2f5fc1b2dc57112c633918bc7958da31831
7
+ data.tar.gz: 9f1c8f50009b59d7727531dc0c354e259f825df0967ad68f265b39c3d5d32da2f351eed6e719148bd48006b195ad6148fa3c3a48318c6cf4d7966d47560d3b06
data/Gemfile.lock CHANGED
@@ -1,46 +1,38 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ssdb-attr (0.0.1)
5
- activesupport (~> 4.1.8)
4
+ ssdb-attr (0.0.3)
5
+ activesupport (~> 4.2.1)
6
6
  connection_pool (~> 2.1.0)
7
7
  redis (~> 3.1.0)
8
8
 
9
9
  GEM
10
10
  remote: http://ruby.taobao.org/
11
11
  specs:
12
- activemodel (4.1.10)
13
- activesupport (= 4.1.10)
12
+ activemodel (4.2.1)
13
+ activesupport (= 4.2.1)
14
14
  builder (~> 3.1)
15
- activerecord (4.1.10)
16
- activemodel (= 4.1.10)
17
- activesupport (= 4.1.10)
18
- arel (~> 5.0.0)
15
+ activerecord (4.2.1)
16
+ activemodel (= 4.2.1)
17
+ activesupport (= 4.2.1)
18
+ arel (~> 6.0)
19
19
  activerecord-nulldb-adapter (0.3.1)
20
20
  activerecord (>= 2.0.0)
21
- activesupport (4.1.10)
22
- i18n (~> 0.6, >= 0.6.9)
21
+ activesupport (4.2.1)
22
+ i18n (~> 0.7)
23
23
  json (~> 1.7, >= 1.7.7)
24
24
  minitest (~> 5.1)
25
- thread_safe (~> 0.1)
25
+ thread_safe (~> 0.3, >= 0.3.4)
26
26
  tzinfo (~> 1.1)
27
- arel (5.0.1.20140414130214)
27
+ arel (6.0.0)
28
28
  builder (3.2.2)
29
- coderay (1.1.0)
30
29
  connection_pool (2.1.3)
31
30
  i18n (0.7.0)
32
31
  json (1.8.2)
33
- method_source (0.8.2)
34
32
  minitest (5.5.1)
35
- pry (0.9.12.6)
36
- coderay (~> 1.0)
37
- method_source (~> 0.8)
38
- slop (~> 3.4)
39
- pry-nav (0.2.3)
40
- pry (~> 0.9.10)
41
33
  rake (10.4.2)
42
34
  redis (3.1.0)
43
- slop (3.5.0)
35
+ sqlite3 (1.3.10)
44
36
  thread_safe (0.3.5)
45
37
  tzinfo (1.2.2)
46
38
  thread_safe (~> 0.1)
@@ -49,11 +41,10 @@ PLATFORMS
49
41
  ruby
50
42
 
51
43
  DEPENDENCIES
52
- activerecord (~> 4.1.8)
44
+ activerecord (~> 4.2.1)
53
45
  activerecord-nulldb-adapter
54
46
  bundler (~> 1.5)
55
47
  minitest (~> 5.5.1)
56
- pry
57
- pry-nav
58
48
  rake
49
+ sqlite3
59
50
  ssdb-attr!
@@ -1,3 +1,3 @@
1
1
  module SSDBAttr
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/ssdb/attr.rb CHANGED
@@ -2,11 +2,53 @@ module SSDB
2
2
  module Attr
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ included do
6
+ # puts 'called'
7
+ define_model_callbacks :update_ssdb_attrs, only: [:before, :after]
8
+ end
9
+
5
10
  def to_ssdb_attr_key(name)
6
11
  "#{self.class.to_s.underscore.pluralize}:#{self.id}:#{name}"
7
12
  end
8
13
 
14
+ def update_ssdb_attrs(data={})
15
+
16
+ # Determine what attrs are requested to be updated
17
+ attr_names = data.keys & self.class.ssdb_attr_names
18
+ if attr_names.empty?
19
+ return
20
+ end
21
+
22
+ # Determine dirty fields
23
+ attr_names.each do |name|
24
+ if self.send(name.to_sym) != data[name].to_s
25
+ attribute_will_change! name.to_sym
26
+ end
27
+ end
28
+
29
+ # trigger_ssdb_attr_before_callbacks if self.respond_to? :trigger_ssdb_attr_before_callbacks
30
+ run_callbacks :update_ssdb_attrs do
31
+ SSDBAttr.pool.with do |conn|
32
+ attr_names.each do |name|
33
+ conn.set("#{self.to_ssdb_attr_key(name)}", data[name])
34
+ end
35
+ end
36
+ end
37
+
38
+ # trigger_ssdb_attr_after_callbacks if self.respond_to? :trigger_ssdb_attr_after_callbacks
39
+
40
+ # Clear dirty fields
41
+ attr_names.each do |name|
42
+ clear_attribute_changes name.to_sym
43
+ end
44
+ end
45
+
9
46
  module ClassMethods
47
+ def ssdb_attr_names
48
+ @ssdb_attr_names = [] if @ssdb_attr_names.nil?
49
+ @ssdb_attr_names
50
+ end
51
+
10
52
  # ssdb_attr :content, :string, default: 0, touch: true
11
53
  # ssdb_attr :writer_version, :integer, default: 0, touch: [:field1, :field2, :field3]
12
54
  #
@@ -23,6 +65,9 @@ module SSDB
23
65
  raise "Type not supported, only `:string` and `:integer` are supported now."
24
66
  end
25
67
 
68
+ self.ssdb_attr_names ||= []
69
+ self.ssdb_attr_names << name
70
+
26
71
  define_method(name) do
27
72
  conversion = type == :string ? :to_s : :to_i
28
73
 
@@ -36,28 +81,41 @@ module SSDB
36
81
  define_method("#{name}=") do |v|
37
82
  SSDBAttr.pool.with do |conn|
38
83
  conn.set("#{self.to_ssdb_attr_key(name)}", v)
39
- self.send("touch_ssdb_attr_#{name}".to_sym) if self.respond_to?("touch_ssdb_attr_#{name}".to_sym)
40
84
  end
85
+
86
+ self.send("touch_ssdb_attr_#{name}".to_sym) if self.respond_to?("touch_ssdb_attr_#{name}".to_sym)
41
87
  end
42
88
 
43
89
  if options[:touch].present?
44
90
  define_method("touch_ssdb_attr_#{name}") do
45
- t = Time.now
46
-
47
91
  if options[:touch].kind_of?(Array)
48
- data = {}
49
-
50
- options[:touch].each do |field|
51
- data[field.to_sym] = t if ActiveRecord::Base.connection.column_exists?(self.class.table_name, field.to_sym, :datetime)
52
- end
53
-
54
- self.update(data) if !data.empty?
92
+ touch(*options[:touch])
55
93
  else
56
- self.update(updated_at: t) if ActiveRecord::Base.connection.column_exists?(self.class.table_name, :updated_at, :datetime)
94
+ touch(:updated_at)
57
95
  end
58
96
  end
59
97
  end
98
+
99
+ define_method("#{name}_changed?") do
100
+ attribute_changed?(name.to_sym)
101
+ end
60
102
  end
103
+
104
+ # def after_update_ssdb_attrs(*args)
105
+ # define_method("trigger_ssdb_attr_after_callbacks") do
106
+ # args.each do |arg|
107
+ # self.send(arg.to_sym)
108
+ # end
109
+ # end
110
+ # end
111
+ #
112
+ # def before_update_ssdb_attrs(*args)
113
+ # define_method("trigger_ssdb_attr_before_callbacks") do
114
+ # args.each do |arg|
115
+ # self.send(arg.to_sym)
116
+ # end
117
+ # end
118
+ # end
61
119
  end
62
120
  end
63
121
  end
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,11 @@ require 'minitest/autorun'
6
6
  require 'minitest/mock'
7
7
  require 'minitest/pride'
8
8
 
9
- SSDBAttr.setup url: 'http://localhost:8888'
9
+ SSDBAttr.setup url: 'redis://localhost:6379/15'
10
10
 
11
- ActiveRecord::Base.establish_connection :adapter => :nulldb
11
+ # Setup activerecord
12
+ ActiveRecord::Base.raise_in_transactional_callbacks = true if ActiveRecord::VERSION::STRING >= '4.2'
13
+
14
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', database: ':memory:'
15
+
16
+ ActiveRecord::Base.connection.execute "CREATE TABLE posts (id INTEGER NOT NULL PRIMARY KEY, updated_at DATETIME, content_updated_at DATETIME, title_updated_at DATETIME)"
@@ -1,49 +1,86 @@
1
1
  require 'spec_helper'
2
2
 
3
- class Dummy
3
+ class Post < ActiveRecord::Base
4
4
  include SSDB::Attr
5
5
 
6
- attr_accessor :id
6
+ ssdb_attr :title, :string, touch: [:content_updated_at]
7
+ ssdb_attr :content, :string, touch: true
8
+ ssdb_attr :version, :integer, default: 22
9
+ ssdb_attr :counter, :integer, default: 4
7
10
 
8
- ssdb_attr :title, :string
9
- ssdb_attr :version, :integer, default: 22
10
- ssdb_attr :content, :string, touch: true
11
+ before_update_ssdb_attrs :before_callback1, :before_callback2
12
+ after_update_ssdb_attrs :after_callback1, :after_callback2
11
13
 
12
- def initialize
13
- @id = Random.rand(10000)
14
+ def before_callback1
15
+ puts "before callback 1"
16
+
17
+ if title_changed?
18
+ puts "title changed detected."
19
+ end
20
+ end
21
+
22
+ def before_callback2
23
+ puts "before callback 2"
14
24
  end
15
25
 
16
- def candies
17
- 15
26
+ def after_callback1
27
+ puts "after callback 1"
18
28
  end
29
+
30
+ def after_callback2
31
+ puts "after callback 2"
32
+ end
33
+
34
+ # touch_ssdb_attr [:title, :content], touch: [:content_at]
35
+ #
36
+ # dummy.update_ssdb_attrs(title: 'abc', content: 'cbd')
37
+ #
38
+ # before_update_ssdb_attributes args*
39
+ # after_update_ssdb_attributes :touch_updated_at
19
40
  end
20
41
 
21
42
  describe SSDB::Attr do
22
- describe "method definition" do
23
43
 
44
+ describe "method created" do
24
45
  end
25
46
 
26
- describe "default value" do
27
- it 'should set default value correctly' do
28
- dummy = Dummy.new
47
+ describe "#update_ssdb_attrs" do
48
+ if 'should correctly set values'
49
+ post = Post.create
50
+
51
+ post.update_ssdb_attrs(title: 'bar2')
52
+ post.update_ssdb_attrs(title: 'bar2')
29
53
 
30
- dummy.version.must_equal 22
54
+ # title = 'foo'
55
+ # content = 'bar'
56
+ #
57
+ # title.must_equal 'foo'
58
+ # content.must_equal 'bar'
59
+ #
60
+ #post.title.must_equal 'foo'
61
+ #post.content.must_equal 'bar'
31
62
  end
32
63
  end
33
64
 
34
- describe "Type conversion" do
65
+ describe "#ssdb_attr" do
66
+ it 'should set default value correctly' do
67
+ post = Post.create
68
+
69
+ post.counter.must_equal 4
70
+ end
71
+
35
72
  it "should convert to string correctly" do
36
- dummy = Dummy.new
73
+ post = Post.create
37
74
 
38
- dummy.title = 120
39
- dummy.title.must_equal '120'
75
+ post.title = 120
76
+ post.title.must_equal '120'
40
77
  end
41
78
 
42
79
  it "should convert to integer correctly" do
43
- dummy = Dummy.new
80
+ post = Post.create
44
81
 
45
- dummy.version = '120'
46
- dummy.version.must_equal 120
82
+ post.version = '120'
83
+ post.version.must_equal 120
47
84
  end
48
85
  end
49
86
  end
data/ssdb-attr.gemspec CHANGED
@@ -24,9 +24,8 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.5"
26
26
  spec.add_development_dependency "rake"
27
- spec.add_development_dependency "pry"
28
- spec.add_development_dependency "pry-nav"
27
+ spec.add_development_dependency "sqlite3"
29
28
  spec.add_development_dependency "minitest", "~> 5.5.1"
30
- spec.add_development_dependency "activerecord", "~> 4.1.8"
29
+ spec.add_development_dependency "activerecord", "~> 4.2.1"
31
30
  spec.add_development_dependency "activerecord-nulldb-adapter"
32
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ssdb-attr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Larry Zhao
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-11 00:00:00.000000000 Z
11
+ date: 2015-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -81,21 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: pry
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: pry-nav
84
+ name: sqlite3
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
@@ -128,14 +114,14 @@ dependencies:
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: 4.1.8
117
+ version: 4.2.1
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: 4.1.8
124
+ version: 4.2.1
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: activerecord-nulldb-adapter
141
127
  requirement: !ruby/object:Gem::Requirement