ssdb-attr 0.1.2 → 0.1.3

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: dab5dc911606b9a78c5aa08bb0286befa3d41dec
4
- data.tar.gz: d9565247664146d3f8085731cd95a3ca9a947180
3
+ metadata.gz: 42862ff9c47b1a76de97dad8d083f9f600f59899
4
+ data.tar.gz: 29d3a85d0b87e99d2b392d571a705c8c0bf31b9b
5
5
  SHA512:
6
- metadata.gz: d8d060517bede443c4f825d0d6562b924f81922769454a744c87ef12baeee5b6dbf9c6cc77b2108b8721efded04850fac661d068ccf1710b52326d1ebce0976f
7
- data.tar.gz: 291e03dc49cabfdba7a1cd1ae92b58efae73a4f08a7fa47d5e7920cbb578b1b178ffbfa1ec0797d1e277fe8a1341a9a74f1e4055e6f6ee6337e0becd669669a6
6
+ metadata.gz: 015184c70c5f94521c89f9e25f7a6d3c1d4c695b96ffbc70d239b8a706ccd87b968cf7f0240af359066eed9c86983fae5d5c3db20c7f6a0b8d86e605cf3bea65
7
+ data.tar.gz: bcf2ca89d68a6fe73ff897b8300e825ac2de3973c08a85a270e64a89ea8d22239304167004ce0398a3471d6a014df15bc3f96056641cf4abccc97a113fcd73e2
@@ -0,0 +1,22 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.3.0
5
+
6
+ before_install:
7
+ - git clone -b stable-1.9.2 git://github.com/ideawu/ssdb.git
8
+ - cd ssdb
9
+ - make
10
+ - cd ..
11
+
12
+ before_script:
13
+ - ./ssdb/ssdb-server -d ./ssdb/ssdb.conf
14
+
15
+ after_script:
16
+ - killall -w ssdb-server
17
+
18
+ script:
19
+ - bundle exec rake
20
+
21
+ notifications:
22
+ email: false
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ssdb-attr (0.1.1)
4
+ ssdb-attr (0.1.3)
5
5
  activesupport (~> 4.2.1)
6
6
  connection_pool (~> 2.2.0)
7
7
  redis (~> 3.2.1)
@@ -72,4 +72,4 @@ DEPENDENCIES
72
72
  ssdb-attr!
73
73
 
74
74
  BUNDLED WITH
75
- 1.14.5
75
+ 1.15.3
data/README.md CHANGED
@@ -1,3 +1,11 @@
1
1
  # SSDB Attr
2
2
 
3
+ [![Build Status](https://travis-ci.org/jianshucom/ssdb-attr.svg?branch=master)](https://travis-ci.org/jianshucom/ssdb-attr)
4
+
3
5
  This gem provides an intuitive interface to define attributes on your ActiveModel class and save them in SSDB server.
6
+
7
+ # Changelog
8
+
9
+ ### 0.1.3
10
+
11
+ - Add `load_ssdb_attrs` to get multiple values from SSDB once to avoid multiple SSDB calls.
@@ -1,3 +1,3 @@
1
1
  module SSDBAttr
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -3,14 +3,14 @@ module SSDB
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- instance_variable_set(:@ssdb_attr_names, [])
6
+ instance_variable_set(:@ssdb_attr_definition, {})
7
7
 
8
8
  after_commit :save_ssdb_attrs, on: %i(create update)
9
9
  after_commit :clear_ssdb_attrs, on: :destroy
10
10
  end
11
11
 
12
12
  module ClassMethods
13
- attr_reader :ssdb_attr_names
13
+ attr_reader :ssdb_attr_definition
14
14
  attr_reader :ssdb_attr_id_field
15
15
  attr_reader :ssdb_attr_pool_name
16
16
 
@@ -37,6 +37,10 @@ module SSDB
37
37
  @ssdb_attr_pool_name = pool_name
38
38
  end
39
39
 
40
+ def ssdb_attr_names
41
+ @ssdb_attr_definition.keys
42
+ end
43
+
40
44
  #
41
45
  # Method to define a SSDB attribute in a Ruby Class
42
46
  #
@@ -51,14 +55,13 @@ module SSDB
51
55
  raise "Type not supported, only `:string` and `:integer` are supported now."
52
56
  end
53
57
 
54
- @ssdb_attr_names << name.to_s
58
+ @ssdb_attr_definition[name.to_s] = type.to_s
55
59
 
56
60
  define_method(name) do
57
61
  instance_variable_get("@#{name}") || begin
58
62
  val = ssdb_attr_pool.with { |conn| conn.get(ssdb_attr_key(name)) } || options[:default]
59
- instance_variable_set("@#{name}", val)
63
+ instance_variable_set("@#{name}", typecaster(val, type))
60
64
  end
61
- typecaster(instance_variable_get("@#{name}"), type)
62
65
  end
63
66
 
64
67
  define_method("#{name}=") do |val|
@@ -91,6 +94,25 @@ module SSDB
91
94
  end
92
95
  end
93
96
 
97
+ #
98
+ # Load the values of all specified attrs.
99
+ #
100
+ #
101
+ # @return [void]
102
+ #
103
+ def load_ssdb_attrs(*fields)
104
+ fields = (fields.map(&:to_s) & self.class.ssdb_attr_names)
105
+
106
+ values = ssdb_attr_pool.with do |conn|
107
+ conn.mget(fields.map { |name| ssdb_attr_key(name) })
108
+ end
109
+
110
+ fields.each_with_index do |attr, index|
111
+ value = typecaster(values[index], self.class.ssdb_attr_definition[attr])
112
+ instance_variable_set("@#{attr}", value)
113
+ end
114
+ end
115
+
94
116
  private
95
117
 
96
118
  #
@@ -173,10 +195,11 @@ module SSDB
173
195
  # @return [void]
174
196
  #
175
197
  def reload_ssdb_attrs
176
- values = ssdb_attr_pool.with { |conn| conn.mget(*self.class.ssdb_attr_names) }
198
+ keys = self.class.ssdb_attr_names.map { |name| ssdb_attr_key(name) }
199
+ values = ssdb_attr_pool.with { |conn| conn.mget(keys) }
177
200
 
178
201
  self.class.ssdb_attr_names.each_with_index do |attr, index|
179
- instance_variable_set("@#{attr}", values[index])
202
+ instance_variable_set("@#{attr}", typecaster(values[index], self.class.ssdb_attr_definition[attr]))
180
203
  end
181
204
  end
182
205
  end
@@ -54,11 +54,18 @@ describe SSDB::Attr do
54
54
  let(:post) { Post.create(updated_at: 1.day.ago, saved_at: 1.day.ago, changed_at: 1.day.ago) }
55
55
  let(:redis) { Redis.new(:url => 'redis://localhost:8888') }
56
56
 
57
- describe "@ssdb_attr_names" do
58
- it "should set `@ssdb_attr_names` correctly" do
59
- ssdb_attr_names = Post.instance_variable_get(:@ssdb_attr_names)
60
- expect(ssdb_attr_names).to match_array(["name", "int_version", "default_title", "title",
61
- "content", "version", "default_version", "field_with_validation"])
57
+ describe "@ssdb_attr_definition" do
58
+ it "should set `@ssdb_attr_definition` correctly" do
59
+ ssdb_attr_definition = Post.instance_variable_get(:@ssdb_attr_definition)
60
+
61
+ expect(ssdb_attr_definition["name"]).to eq("string")
62
+ expect(ssdb_attr_definition["int_version"]).to eq("integer")
63
+ expect(ssdb_attr_definition["default_title"]).to eq("string")
64
+ expect(ssdb_attr_definition["title"]).to eq("string")
65
+ expect(ssdb_attr_definition["content"]).to eq("string")
66
+ expect(ssdb_attr_definition["version"]).to eq("integer")
67
+ expect(ssdb_attr_definition["default_version"]).to eq("integer")
68
+ expect(ssdb_attr_definition["field_with_validation"]).to eq("string")
62
69
  end
63
70
  end
64
71
 
@@ -101,8 +108,8 @@ describe SSDB::Attr do
101
108
  post.version = 3
102
109
 
103
110
  post.send(:reload_ssdb_attrs)
104
- expect(post.title).to eq("foobar")
105
- expect(post.version).to eq(4)
111
+ expect(post.instance_variable_get(:@title)).to eq("foobar")
112
+ expect(post.instance_variable_get(:@version)).to eq(4)
106
113
  end
107
114
  end
108
115
 
@@ -125,6 +132,18 @@ describe SSDB::Attr do
125
132
  end
126
133
  end
127
134
 
135
+ describe "#load_ssdb_attrs" do
136
+ it "loads the values of all specified attrs" do
137
+ post = Post.create(title: "foobar", version: 4)
138
+ post = Post.find(post.id)
139
+ expect(post.instance_variable_get(:@title)).to be_nil
140
+
141
+ post.load_ssdb_attrs(:title, :version)
142
+ expect(post.instance_variable_get(:@title)).to eq("foobar")
143
+ expect(post.instance_variable_get(:@version)).to eq(4)
144
+ end
145
+ end
146
+
128
147
  describe "#ssdb_attr_key" do
129
148
  it "should return correct key" do
130
149
  expect(post.send(:ssdb_attr_key, "name")).to eq("posts:#{post.id}:name")
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.1.2
4
+ version: 0.1.3
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-03-14 00:00:00.000000000 Z
11
+ date: 2017-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -161,6 +161,7 @@ files:
161
161
  - ".rspec"
162
162
  - ".ruby-gemset"
163
163
  - ".ruby-version"
164
+ - ".travis.yml"
164
165
  - Gemfile
165
166
  - Gemfile.lock
166
167
  - README.md
@@ -192,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
193
  version: '0'
193
194
  requirements: []
194
195
  rubyforge_project:
195
- rubygems_version: 2.6.10
196
+ rubygems_version: 2.6.11
196
197
  signing_key:
197
198
  specification_version: 4
198
199
  summary: Provide simple helpers on persist values in redis for performance. Works