ssdb-attr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f609d83fc281ed41ebaf150fc563c2fc2765d723
4
+ data.tar.gz: 2b7f96c9059b545c2e4b46caac560be81909bb9c
5
+ SHA512:
6
+ metadata.gz: 1e4c8954935b1b88d7e5131b43428b1bc7691f813cf7f070f1a71478a87bda18c58889139d42a93b95ef8a5cc481f6476c872b18c20d651a26dbc67219de5389
7
+ data.tar.gz: 75039c0bd35b77c3012aaaf8e9f085dc634a3ff4522681df26eb0270460866c0aa05edf4404eba323b3c31ed98ccf65026d7cb72d9a2be0673e33bc0010e2821
data/.gitignore ADDED
@@ -0,0 +1,35 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /vendor/bundle
26
+ /lib/bundler/man/
27
+
28
+ # for a library or gem, you might want to ignore these files since the code is
29
+ # intended to run in multiple environments; otherwise, check them in:
30
+ # Gemfile.lock
31
+ # .ruby-version
32
+ # .ruby-gemset
33
+
34
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
+ .rvmrc
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ ssdb-attr
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.2
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # source 'https://rubygems.org'
2
+ source 'http://ruby.taobao.org'
3
+
4
+ # Specify your gem's dependencies in ssdb-attr.gemspec
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,59 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ssdb-attr (0.0.1)
5
+ activesupport (~> 4.1.8)
6
+ connection_pool (~> 2.1.0)
7
+ redis (~> 3.1.0)
8
+
9
+ GEM
10
+ remote: http://ruby.taobao.org/
11
+ specs:
12
+ activemodel (4.1.10)
13
+ activesupport (= 4.1.10)
14
+ builder (~> 3.1)
15
+ activerecord (4.1.10)
16
+ activemodel (= 4.1.10)
17
+ activesupport (= 4.1.10)
18
+ arel (~> 5.0.0)
19
+ activerecord-nulldb-adapter (0.3.1)
20
+ activerecord (>= 2.0.0)
21
+ activesupport (4.1.10)
22
+ i18n (~> 0.6, >= 0.6.9)
23
+ json (~> 1.7, >= 1.7.7)
24
+ minitest (~> 5.1)
25
+ thread_safe (~> 0.1)
26
+ tzinfo (~> 1.1)
27
+ arel (5.0.1.20140414130214)
28
+ builder (3.2.2)
29
+ coderay (1.1.0)
30
+ connection_pool (2.1.3)
31
+ i18n (0.7.0)
32
+ json (1.8.2)
33
+ method_source (0.8.2)
34
+ 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
+ rake (10.4.2)
42
+ redis (3.1.0)
43
+ slop (3.5.0)
44
+ thread_safe (0.3.5)
45
+ tzinfo (1.2.2)
46
+ thread_safe (~> 0.1)
47
+
48
+ PLATFORMS
49
+ ruby
50
+
51
+ DEPENDENCIES
52
+ activerecord (~> 4.1.8)
53
+ activerecord-nulldb-adapter
54
+ bundler (~> 1.5)
55
+ minitest (~> 5.5.1)
56
+ pry
57
+ pry-nav
58
+ rake
59
+ ssdb-attr!
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # ssdb-attr
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'spec'
6
+ t.pattern = "spec/**/*_spec.rb"
7
+ end
data/lib/ssdb-attr.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "redis"
2
+ require "connection_pool"
3
+ require "active_support/concern"
4
+ require "active_support/inflector"
5
+ require "ssdb-attr/version"
6
+ require "ssdb/attr"
7
+
8
+ module SSDBAttr
9
+ class << self
10
+ attr_accessor :pool
11
+
12
+ def setup(options={})
13
+ pool_size = (options[:pool] || 1).to_i
14
+ timeout = (options[:timeout] || 2).to_i
15
+
16
+ SSDBAttr.pool = ConnectionPool.new(size: pool_size, timeout: timeout) do
17
+ Redis.new(url: options[:url])
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module SSDBAttr
2
+ VERSION = "0.0.1"
3
+ end
data/lib/ssdb/attr.rb ADDED
@@ -0,0 +1,59 @@
1
+ module SSDB
2
+ module Attr
3
+ extend ActiveSupport::Concern
4
+
5
+ def to_ssdb_attr_key(name)
6
+ "#{self.class.to_s.underscore.pluralize}:#{self.id}:#{name}"
7
+ end
8
+
9
+ module ClassMethods
10
+ # ssdb_attr :content, :string, default: 0, touch: true
11
+ # ssdb_attr :writer_version, :integer, default: 0, touch: [:field1, :field2, :field3]
12
+ #
13
+ # [counter description]
14
+ # @param name [type] [description]
15
+ # @param name [type] [description]
16
+ # @param options={} [type] [description]
17
+ # @param block [description]
18
+ #
19
+ # @return [type] [description]
20
+ def ssdb_attr(name, type, options={})
21
+
22
+ if ![:string, :integer].include?(type)
23
+ raise "Type not supported, only `:string` and `:integer` are supported now."
24
+ end
25
+
26
+ define_method(name) do
27
+ conversion = type == :string ? :to_s : :to_i
28
+
29
+ value = SSDBAttr.pool.with do |conn|
30
+ conn.get("#{self.to_ssdb_attr_key(name)}")
31
+ end
32
+
33
+ value.try(conversion) || options[:default]
34
+ end
35
+
36
+ define_method("#{name}=") do |v|
37
+ SSDBAttr.pool.with do |conn|
38
+ 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
+ end
41
+ end
42
+
43
+ if options[:touch].present?
44
+ define_method("touch_ssdb_attr_#{name}") do
45
+ t = Time.now
46
+
47
+ if options[:touch].kind_of?(Array)
48
+ options[:touch].each do |field|
49
+ self.update(field.to_sym, t) if ActiveRecord::Base.connection.column_exists?(self.class.table_name, field.to_sym, :datetime)
50
+ end
51
+ else
52
+ self.update(:updated_at, t) if ActiveRecord::Base.connection.column_exists?(self.class.table_name, :updated_at, :datetime)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_record'
2
+ require 'nulldb'
3
+ require 'ssdb-attr'
4
+ require 'minitest/spec'
5
+ require 'minitest/autorun'
6
+ require 'minitest/mock'
7
+ require 'minitest/pride'
8
+
9
+ SSDBAttr.setup url: 'http://localhost:8888'
10
+
11
+ ActiveRecord::Base.establish_connection :adapter => :nulldb
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe SSDBAttr do
4
+ describe "#setup" do
5
+ it "should setup a ssdb connection pool" do
6
+ SSDBAttr.pool.wont_be_nil
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ class Dummy
4
+ include SSDB::Attr
5
+
6
+ attr_accessor :id
7
+
8
+ ssdb_attr :title, :string
9
+ ssdb_attr :version, :integer, default: 22
10
+ ssdb_attr :content, :string, touch: true
11
+
12
+ def initialize
13
+ @id = Random.rand(10000)
14
+ end
15
+
16
+ def candies
17
+ 15
18
+ end
19
+ end
20
+
21
+ describe SSDB::Attr do
22
+ describe "method definition" do
23
+
24
+ end
25
+
26
+ describe "default value" do
27
+ it 'should set default value correctly' do
28
+ dummy = Dummy.new
29
+
30
+ dummy.version.must_equal 22
31
+ end
32
+ end
33
+
34
+ describe "Type conversion" do
35
+ it "should convert to string correctly" do
36
+ dummy = Dummy.new
37
+
38
+ dummy.title = 120
39
+ dummy.title.must_equal '120'
40
+ end
41
+
42
+ it "should convert to integer correctly" do
43
+ dummy = Dummy.new
44
+
45
+ dummy.version = '120'
46
+ dummy.version.must_equal 120
47
+ end
48
+ end
49
+ end
data/ssdb-attr.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ssdb-attr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ssdb-attr"
8
+ spec.version = SSDBAttr::VERSION
9
+ spec.authors = ["Larry Zhao"]
10
+ spec.email = ["thehiddendepth@gmail.com"]
11
+ spec.summary = %q{Provide simple helpers on persist values in redis for performance. Works with ActiveRecord.}
12
+ spec.description = %q{}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "redis", "~> 3.1.0"
22
+ spec.add_dependency "connection_pool", "~> 2.1.0"
23
+ spec.add_dependency "activesupport", "~> 4.1.8"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.5"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "pry"
28
+ spec.add_development_dependency "pry-nav"
29
+ spec.add_development_dependency "minitest", "~> 5.5.1"
30
+ spec.add_development_dependency "activerecord", "~> 4.1.8"
31
+ spec.add_development_dependency "activerecord-nulldb-adapter"
32
+ end
metadata ADDED
@@ -0,0 +1,202 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssdb-attr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Larry Zhao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redis
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: connection_pool
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 4.1.8
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 4.1.8
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
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
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 5.5.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 5.5.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: activerecord
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 4.1.8
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 4.1.8
139
+ - !ruby/object:Gem::Dependency
140
+ name: activerecord-nulldb-adapter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: ''
154
+ email:
155
+ - thehiddendepth@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".ruby-gemset"
162
+ - ".ruby-version"
163
+ - Gemfile
164
+ - Gemfile.lock
165
+ - README.md
166
+ - Rakefile
167
+ - lib/ssdb-attr.rb
168
+ - lib/ssdb-attr/version.rb
169
+ - lib/ssdb/attr.rb
170
+ - spec/spec_helper.rb
171
+ - spec/ssdb-attr_spec.rb
172
+ - spec/ssdb/attr_spec.rb
173
+ - ssdb-attr.gemspec
174
+ homepage: ''
175
+ licenses:
176
+ - MIT
177
+ metadata: {}
178
+ post_install_message:
179
+ rdoc_options: []
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements: []
193
+ rubyforge_project:
194
+ rubygems_version: 2.2.2
195
+ signing_key:
196
+ specification_version: 4
197
+ summary: Provide simple helpers on persist values in redis for performance. Works
198
+ with ActiveRecord.
199
+ test_files:
200
+ - spec/spec_helper.rb
201
+ - spec/ssdb-attr_spec.rb
202
+ - spec/ssdb/attr_spec.rb