ssdb-attr 0.0.4 → 0.0.5

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: dedea1c81f2baa61f35d107b89e9e88494c96f40
4
- data.tar.gz: 8777a84c9a061a041a93deb7e5dc2dce4a742836
3
+ metadata.gz: 12d34fe49dea6f34f53f02d705685b0b378624b3
4
+ data.tar.gz: 971ad112430c9f856ec117b8492f39f0384ac504
5
5
  SHA512:
6
- metadata.gz: b6c1f09802b2a1a9efe05f8efc51f853806a554240740baf7f4a33628245889936e5afe485b4879201baed7fe65cc2f5fc1b2dc57112c633918bc7958da31831
7
- data.tar.gz: 9f1c8f50009b59d7727531dc0c354e259f825df0967ad68f265b39c3d5d32da2f351eed6e719148bd48006b195ad6148fa3c3a48318c6cf4d7966d47560d3b06
6
+ metadata.gz: 4403f533f66cae6458d5ee9c8c6b8cc5146efb4eb07587e893f70ad345d2b6a0f7ca7252b4b58e604c38eb8156f636c995485001b0b9ac830fa1d8493e4a0e0a
7
+ data.tar.gz: 80e4d601f98c269d45b2438788544b6e79927f0e5ca604162aabf55789245af11db31a997a294dc02b79ca9b5c257ce33c364eb7274c25fffe1c3f894f06fa39
data/Rakefile CHANGED
@@ -2,6 +2,6 @@ require "bundler/gem_tasks"
2
2
  require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new do |t|
5
- t.libs << 'spec'
6
- t.pattern = "spec/**/*_spec.rb"
5
+ t.libs << 'test'
6
+ t.pattern = "test/**/*_test.rb"
7
7
  end
@@ -1,3 +1,3 @@
1
1
  module SSDBAttr
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -3,52 +3,65 @@ module SSDB
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- # puts 'called'
7
6
  define_model_callbacks :update_ssdb_attrs, only: [:before, :after]
7
+ after_create :init_ssdb_attrs
8
+ after_destroy :clear_ssdb_attrs
8
9
  end
9
10
 
10
- def to_ssdb_attr_key(name)
11
- "#{self.class.to_s.underscore.pluralize}:#{self.id}:#{name}"
12
- end
13
-
14
- def update_ssdb_attrs(data={})
15
-
11
+ def update_ssdb_attrs(attributes)
16
12
  # 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
13
+ attributes = attributes.symbolize_keys
14
+ attr_names = attributes.keys & self.class.ssdb_attr_names
21
15
 
22
16
  # Determine dirty fields
23
17
  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
18
+ send("#{name}_will_change!") unless attributes[name] == send(name)
27
19
  end
28
20
 
29
- # trigger_ssdb_attr_before_callbacks if self.respond_to? :trigger_ssdb_attr_before_callbacks
30
21
  run_callbacks :update_ssdb_attrs do
31
22
  SSDBAttr.pool.with do |conn|
32
- attr_names.each do |name|
33
- conn.set("#{self.to_ssdb_attr_key(name)}", data[name])
34
- end
23
+ attr_names.each { |name| send("#{name}=", attributes[name]) }
35
24
  end
36
25
  end
37
26
 
38
- # trigger_ssdb_attr_after_callbacks if self.respond_to? :trigger_ssdb_attr_after_callbacks
39
-
40
27
  # Clear dirty fields
41
- attr_names.each do |name|
42
- clear_attribute_changes name.to_sym
28
+ clear_attribute_changes(attr_names)
29
+
30
+ true # always return true
31
+ end
32
+
33
+ def init_ssdb_attrs
34
+ self.class.ssdb_attr_names.each do |attribute|
35
+ SSDBAttr.pool.with { |conn| conn.set(to_ssdb_attr_key(attribute), self.send(attribute)) }
43
36
  end
44
37
  end
45
38
 
39
+ def clear_ssdb_attrs
40
+ self.class.ssdb_attr_names.each do |attribute|
41
+ SSDBAttr.pool.with { |conn| conn.del(to_ssdb_attr_key(attribute)) }
42
+ end
43
+ end
44
+
45
+ def to_ssdb_attr_key(name)
46
+ self.class.to_ssdb_attr_key(name, id)
47
+ end
48
+
49
+ private
50
+
51
+ def touch_db_column(names)
52
+ names == true ? touch : touch(*names)
53
+ end
54
+
46
55
  module ClassMethods
47
56
  def ssdb_attr_names
48
- @ssdb_attr_names = [] if @ssdb_attr_names.nil?
49
- @ssdb_attr_names
57
+ @ssdb_attr_names ||= []
58
+ end
59
+
60
+ def to_ssdb_attr_key(name, id)
61
+ "#{self.name.tableize}:#{id}:#{name}"
50
62
  end
51
63
 
64
+
52
65
  # ssdb_attr :content, :string, default: 0, touch: true
53
66
  # ssdb_attr :writer_version, :integer, default: 0, touch: [:field1, :field2, :field3]
54
67
  #
@@ -60,62 +73,31 @@ module SSDB
60
73
  #
61
74
  # @return [type] [description]
62
75
  def ssdb_attr(name, type, options={})
63
-
64
- if ![:string, :integer].include?(type)
76
+ unless %i(string integer).include?(type)
65
77
  raise "Type not supported, only `:string` and `:integer` are supported now."
66
78
  end
67
79
 
68
- self.ssdb_attr_names ||= []
69
80
  self.ssdb_attr_names << name
70
81
 
71
82
  define_method(name) do
72
83
  conversion = type == :string ? :to_s : :to_i
73
-
74
- value = SSDBAttr.pool.with do |conn|
75
- conn.get("#{self.to_ssdb_attr_key(name)}")
76
- end
77
-
78
- value.try(conversion) || options[:default]
84
+ value = SSDBAttr.pool.with { |conn| conn.get("#{to_ssdb_attr_key(name)}") }
85
+ (value || options[:default]).send(conversion)
79
86
  end
80
87
 
81
- define_method("#{name}=") do |v|
82
- SSDBAttr.pool.with do |conn|
83
- conn.set("#{self.to_ssdb_attr_key(name)}", v)
84
- end
85
-
86
- self.send("touch_ssdb_attr_#{name}".to_sym) if self.respond_to?("touch_ssdb_attr_#{name}".to_sym)
88
+ define_method("#{name}=") do |val|
89
+ SSDBAttr.pool.with { |conn| conn.set("#{to_ssdb_attr_key(name)}", val) }
90
+ touch_db_column(options[:touch]) if options[:touch].present?
87
91
  end
88
92
 
89
- if options[:touch].present?
90
- define_method("touch_ssdb_attr_#{name}") do
91
- if options[:touch].kind_of?(Array)
92
- touch(*options[:touch])
93
- else
94
- touch(:updated_at)
95
- end
96
- end
93
+ define_method("#{name}_will_change!") do
94
+ attribute_will_change!(name)
97
95
  end
98
96
 
99
97
  define_method("#{name}_changed?") do
100
- attribute_changed?(name.to_sym)
98
+ attribute_changed?(name)
101
99
  end
102
100
  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
119
101
  end
120
102
  end
121
103
  end
@@ -0,0 +1,145 @@
1
+ require 'ssdb-attr'
2
+ require 'active_record'
3
+ ActiveRecord::Base.raise_in_transactional_callbacks = true if ActiveRecord::VERSION::STRING >= '4.2'
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+ require 'minitest/pride'
8
+ test_framework = defined?(MiniTest::Test) ? MiniTest::Test : MiniTest::Unit::TestCase
9
+
10
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/ssdb/attr")
11
+
12
+ def connect!
13
+ SSDBAttr.setup(url: 'redis://localhost:6379/15')
14
+ ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
15
+ end
16
+
17
+ def setup!
18
+ connect!
19
+ { 'posts' => 'updated_at DATETIME, saved_at DATETIME, changed_at DATETIME' }.each do |table_name, columns_as_sql_string|
20
+ ActiveRecord::Base.connection.execute "CREATE TABLE #{table_name} (id INTEGER NOT NULL PRIMARY KEY, #{columns_as_sql_string})"
21
+ end
22
+ end
23
+
24
+ setup!
25
+
26
+ class Post < ActiveRecord::Base
27
+ include SSDB::Attr
28
+
29
+ ssdb_attr :name, :string
30
+ ssdb_attr :int_version, :integer
31
+ ssdb_attr :default_title, :string, default: "Untitled"
32
+ ssdb_attr :plain_touch, :string, touch: true
33
+ ssdb_attr :custom_touch_single_column, :string, touch: :saved_at
34
+ ssdb_attr :custom_touch_multiple_columns, :string, touch: [:saved_at, :changed_at]
35
+ ssdb_attr :title, :string
36
+ ssdb_attr :content, :string
37
+ ssdb_attr :version, :integer, default: 1
38
+
39
+ before_update_ssdb_attrs :before1, :before2
40
+ after_update_ssdb_attrs :after1, :after2
41
+
42
+ def callback_out
43
+ @callback_out ||= []
44
+ end
45
+
46
+ %i(before1 before2 after1 after2).each do |name|
47
+ define_method(name) do
48
+ callback_out << name
49
+ end
50
+ end
51
+ end
52
+
53
+ class SsdbAttrTest < test_framework
54
+ def setup
55
+ SSDBAttr.pool.with { |conn| conn.flushdb }
56
+ ActiveRecord::Base.connection.tables.each do |table|
57
+ ActiveRecord::Base.connection.execute "DELETE FROM #{table}"
58
+ end
59
+ @post = Post.create(updated_at: 1.day.ago, saved_at: 1.day.ago, changed_at: 1.day.ago)
60
+ end
61
+
62
+ def test_respond_to_methods
63
+ assert_equal true, @post.respond_to?(:name)
64
+ assert_equal true, @post.respond_to?(:name=)
65
+ assert_equal true, @post.respond_to?(:name_changed?)
66
+ assert_equal true, @post.respond_to?(:name_will_change!)
67
+ end
68
+
69
+ def test_integer_attribute
70
+ @post.int_version = "4"
71
+ assert_equal 4, @post.int_version
72
+ end
73
+
74
+ def test_with_default_value
75
+ assert_equal "Untitled", @post.default_title
76
+ end
77
+
78
+ def test_with_plain_touch
79
+ original_updated_at = @post.updated_at
80
+ @post.plain_touch = "something"
81
+ refute_equal original_updated_at, @post.updated_at
82
+ end
83
+
84
+ def test_with_custom_touch_signle_column
85
+ original_saved_at = @post.saved_at
86
+ @post.custom_touch_single_column = "something"
87
+ refute_equal original_saved_at, @post.saved_at
88
+ end
89
+
90
+ def test_with_custom_touch_multiple_columns
91
+ original_saved_at, original_changed_at = @post.saved_at, @post.changed_at
92
+ @post.custom_touch_multiple_columns = "something"
93
+ refute_equal original_saved_at, @post.saved_at
94
+ refute_equal original_changed_at, @post.changed_at
95
+ end
96
+
97
+ def test_to_ssdb_attr_key
98
+ assert_equal "posts:#{@post.id}:name", Post.to_ssdb_attr_key("name", @post.id)
99
+ end
100
+
101
+ def test_update_ssdb_attrs_with_symbolize_keys
102
+ @post.update_ssdb_attrs(title: "note one", content: "testing!!!", version: 1)
103
+ assert_equal "note one", @post.title
104
+ assert_equal "testing!!!", @post.content
105
+ assert_equal 1, @post.version
106
+ end
107
+
108
+ def test_update_ssdb_attrs_with_string_keys
109
+ @post.update_ssdb_attrs("title" => "note one", "content" => "testing!!!", "version" => 1)
110
+ assert_equal "note one", @post.title
111
+ assert_equal "testing!!!", @post.content
112
+ assert_equal 1, @post.version
113
+ end
114
+
115
+ def test_update_ssdb_attrs_on_object_return_true
116
+ assert_equal true, @post.update_ssdb_attrs(title: "note one", content: "testing!!!", version: 1)
117
+ end
118
+
119
+ def test_update_ssdb_attrs_callbacks
120
+ @post.update_ssdb_attrs(title: "something")
121
+ assert_equal [:before1, :before2, :after1, :after2], @post.callback_out
122
+ end
123
+
124
+ def test_object_destroy_callbacks
125
+ @post.update_ssdb_attrs(title: "note one", content: "nice job!")
126
+ ssdb_title_key = @post.to_ssdb_attr_key(:title)
127
+ ssdb_content_key = @post.to_ssdb_attr_key(:content)
128
+ assert_equal true, SSDBAttr.pool.with { |conn| conn.exists(ssdb_title_key) }
129
+ assert_equal true, SSDBAttr.pool.with { |conn| conn.exists(ssdb_content_key) }
130
+ @post.destroy
131
+ assert_equal false, SSDBAttr.pool.with { |conn| conn.exists(ssdb_title_key) }
132
+ assert_equal false, SSDBAttr.pool.with { |conn| conn.exists(ssdb_content_key) }
133
+ end
134
+
135
+ def test_object_create_callbacks
136
+ title_key = @post.to_ssdb_attr_key(:title)
137
+ default_title_key = @post.to_ssdb_attr_key(:default_title)
138
+ version_key = @post.to_ssdb_attr_key(:version)
139
+
140
+ assert_equal 9, SSDBAttr.pool.with { |conn| conn.keys.count }
141
+ assert_equal true, SSDBAttr.pool.with { |conn| conn.exists(title_key) }
142
+ assert_equal "Untitled", SSDBAttr.pool.with { |conn| conn.get(default_title_key) }
143
+ assert_equal "1", SSDBAttr.pool.with { |conn| conn.get(version_key) }
144
+ end
145
+ 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.4
4
+ version: 0.0.5
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-14 00:00:00.000000000 Z
11
+ date: 2015-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -157,6 +157,7 @@ files:
157
157
  - spec/ssdb-attr_spec.rb
158
158
  - spec/ssdb/attr_spec.rb
159
159
  - ssdb-attr.gemspec
160
+ - test/ssdb_attr_test.rb
160
161
  homepage: ''
161
162
  licenses:
162
163
  - MIT
@@ -186,3 +187,4 @@ test_files:
186
187
  - spec/spec_helper.rb
187
188
  - spec/ssdb-attr_spec.rb
188
189
  - spec/ssdb/attr_spec.rb
190
+ - test/ssdb_attr_test.rb