redis_assist 0.3.0 → 0.4.0

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: aa85c951b1af2427edd4810a0f66a741d105d09e
4
- data.tar.gz: 7ed0c449fc3dbfe11e3a033ad4ca78eb03857b0f
3
+ metadata.gz: dfb1cde901db1c06163e7aaab7f8eec71007f8e8
4
+ data.tar.gz: ffd1186e43e0e85ed936ab08ce0cc264fde1cd76
5
5
  SHA512:
6
- metadata.gz: 3525dbfaefc4d333297400e9852cab71a959a499cf6e58f5d1d8ae8efab896758fb36effe1aebbb8d1e88a782386119bc732ce8961ef23dd52129504e863aa0c
7
- data.tar.gz: d3839bb4921a10d891847cd76789f96e3d40a6df49938c6aa70b3747caf709897f1414db45e13f35d31e2e5ecf3cde1f13f2658fddeb4fb50916238f02839cfb
6
+ metadata.gz: f11c0538e2b2e5825b9d04817e8f5c97ec4e31a65ecb2fed7b9eddb7d5b93402ac9014917c6e687639e9d168307e3c44b7e1c0c44647e36b4fb2e044612a6055
7
+ data.tar.gz: 5ca61fb2b41180426831e822b97a56b793a039275ca4929d7ba24228d6d1f2a22a2530927bce2e4dc674673b18041aca36ab5a0e470f44dbc1e33ffaced99b71
@@ -0,0 +1,78 @@
1
+ module RedisAssist
2
+ module Associations
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def has_many(name, opts={})
9
+ define_has_many(name, opts)
10
+ end
11
+
12
+ def belongs_to(name, opts={})
13
+ define_belongs_to(name, opts)
14
+ end
15
+
16
+ private
17
+
18
+ def define_has_many(name, opts={})
19
+ singular_name = StringHelper.singularize(name)
20
+ class_name = opts[:class_name] ? opts[:class_name] : StringHelper.camelize(singular_name)
21
+
22
+ attr_persist("#{singular_name}_ids".to_sym, as: :list, default: [])
23
+
24
+ define_method(name) do
25
+ klass = Module.const_get(class_name)
26
+ records = instance_variable_get("@_#{name}")
27
+ return records if records
28
+ record_ids = send("#{singular_name}_ids")
29
+ records = klass.find(record_ids)
30
+
31
+ instance_variable_set("@_#{name}", records)
32
+ end
33
+
34
+ define_method("#{name}=") do |records|
35
+ instance_variable_set("@_#{name}", records.collect(&:id))
36
+ end
37
+
38
+ define_method("add_#{singular_name}") do |record|
39
+ current_records = instance_variable_get("@_#{name}")
40
+
41
+ if record.respond_to?(StringHelper.underscore(self.class.name))
42
+ record.send("#{StringHelper.underscore(self.class.name)}=", self)
43
+ end
44
+
45
+ if record.new_record?
46
+ record.save
47
+ end
48
+
49
+ if current_records
50
+ current_records << record
51
+ else
52
+ current_records = [record]
53
+ end
54
+
55
+ send("#{singular_name}_ids") << record.id
56
+ end
57
+ end
58
+
59
+ def define_belongs_to(name, opts={})
60
+ class_name = opts[:class_name] ? opts[:class_name] : StringHelper.camelize(name)
61
+ attr_persist("#{name}_id".to_sym, as: :integer, default: nil)
62
+
63
+ define_method(name) do
64
+ klass = Module.const_get(class_name)
65
+ record = instance_variable_get("@_#{name}")
66
+ return record if record
67
+ record = klass.find(send("#{name}_id"))
68
+ instance_variable_set("@_#{name}", record)
69
+ end
70
+
71
+ define_method("#{name}=") do |record|
72
+ send("#{name}_id=", record.id)
73
+ instance_variable_set("@_#{name}", record)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -3,11 +3,14 @@ module RedisAssist
3
3
 
4
4
  include Callbacks
5
5
  include Validations
6
+ include Associations
6
7
 
7
- before_create {|instance| instance.created_at = Time.now.to_f if instance.respond_to?(:created_at) }
8
- before_update {|instance| instance.updated_at = Time.now.to_f if instance.respond_to?(:updated_at) }
9
- after_delete {|instance| instance.deleted_at = Time.now.to_f if instance.respond_to?(:deleted_at) }
10
- after_create {|instance| instance.new_record = false }
8
+ def self.inherited(base)
9
+ base.before_create {|record| record.send(:created_at=, Time.now.to_f) if record.respond_to?(:created_at) }
10
+ base.before_update {|record| record.send(:updated_at=, Time.now.to_f) if record.respond_to?(:updated_at) }
11
+ base.after_delete {|record| record.send(:deleted_at=, Time.now.to_f) if record.respond_to?(:deleted_at) }
12
+ base.after_create {|record| record.send(:new_record=, false) }
13
+ end
11
14
 
12
15
  class << self
13
16
 
@@ -19,7 +22,7 @@ module RedisAssist
19
22
  elsif opts[:as].eql?(:hash)
20
23
  define_hash(name)
21
24
  else
22
- define_field(name)
25
+ define_attribute(name)
23
26
  end
24
27
  end
25
28
 
@@ -201,7 +204,7 @@ module RedisAssist
201
204
  end
202
205
  end
203
206
 
204
- def define_field(name)
207
+ def define_attribute(name)
205
208
  define_method(name) do
206
209
  self.class.transform(:from, name, attributes[name])
207
210
  end
@@ -216,9 +219,9 @@ module RedisAssist
216
219
  attr_reader :id
217
220
 
218
221
  def initialize(attrs={})
219
- @attributes = {}
220
- self.lists = {}
221
- self.hashes = {}
222
+ self.attributes = {}
223
+ self.lists = {}
224
+ self.hashes = {}
222
225
 
223
226
  if attrs[:id]
224
227
  self.id = attrs[:id]
@@ -236,7 +239,7 @@ module RedisAssist
236
239
  attrs.delete(name)
237
240
  end
238
241
 
239
- raise "RedisAssist: #{self.class.name} does not support fields: #{attrs.keys.join(', ')}" if attrs.length > 0
242
+ raise "RedisAssist: #{self.class.name} does not support attributes: #{attrs.keys.join(', ')}" if attrs.length > 0
240
243
  end
241
244
 
242
245
  def saved?
@@ -255,7 +258,7 @@ module RedisAssist
255
258
 
256
259
  redis.multi do
257
260
  # build the arguments to pass to redis hmset
258
- # and insure the fields are explicitely declared
261
+ # and insure the attributes are explicitely declared
259
262
  attribute_args = hash_to_redis(attributes)
260
263
 
261
264
  redis.hmset(key_for(:attributes), *attribute_args)
@@ -3,7 +3,7 @@ module RedisAssist
3
3
  class << self
4
4
  def redis_client
5
5
  return @redis_client if @redis_client
6
- redis_config = { :host => '127.0.0.1', :driver => :hiredis }
6
+ redis_config = { :host => '127.0.0.1' }
7
7
  self.redis_client = Redis.new(redis_config)
8
8
  end
9
9
 
@@ -1,3 +1,3 @@
1
1
  module RedisAssist
2
- VERSION = '0.3.0' unless defined?(::RedisAssist::VERSION)
2
+ VERSION = '0.4.0' unless defined?(::RedisAssist::VERSION)
3
3
  end
data/lib/redis_assist.rb CHANGED
@@ -2,12 +2,12 @@ $LOAD_PATH << File.dirname(__FILE__) unless $LOAD_PATH.include?(File.dirname(__F
2
2
 
3
3
  require 'time'
4
4
  require 'redis'
5
- require 'uuid'
6
5
  require 'json'
7
6
  require 'redis_assist/config'
8
7
  require 'redis_assist/transform'
9
8
  require 'redis_assist/callbacks'
10
9
  require 'redis_assist/validations'
10
+ require 'redis_assist/associations'
11
11
  require 'redis_assist/base'
12
12
 
13
13
  # == Setup & Configuration
@@ -17,12 +17,25 @@ require 'redis_assist/base'
17
17
  module RedisAssist
18
18
  module StringHelper
19
19
  def self.underscore(str)
20
- str.gsub(/::/, '/').
20
+ str.to_s.gsub(/::/, '/').
21
21
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
22
22
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
23
23
  tr("-", "_").
24
24
  downcase
25
25
  end
26
+
27
+ def self.camelize(str)
28
+ str.to_s.split('_').map{|e| e.capitalize}.join
29
+ end
30
+
31
+ # TODO: Would love to integrate a special-cases singulizer/pluralizer without adding dependencies.
32
+ def self.singularize(str)
33
+ str.to_s.gsub(/s$/, '')
34
+ end
35
+
36
+ def self.pluralize(str)
37
+ "#{str}s"
38
+ end
26
39
  end
27
40
  end
28
41
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_assist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Love
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-22 00:00:00.000000000 Z
11
+ date: 2013-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -16,56 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.1
19
+ version: 3.0.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.1
26
+ version: 3.0.3
27
27
  - !ruby/object:Gem::Dependency
28
- name: hiredis
28
+ name: inflections
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 0.4.5
33
+ version: 3.2.12.20130314
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 0.4.5
41
- - !ruby/object:Gem::Dependency
42
- name: uuid
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: 2.3.6
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: 2.3.6
55
- - !ruby/object:Gem::Dependency
56
- name: base62
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 0.1.4
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: 0.1.4
40
+ version: 3.2.12.20130314
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: bundler
71
43
  requirement: !ruby/object:Gem::Requirement
@@ -129,6 +101,7 @@ executables: []
129
101
  extensions: []
130
102
  extra_rdoc_files: []
131
103
  files:
104
+ - lib/redis_assist/associations.rb
132
105
  - lib/redis_assist/base.rb
133
106
  - lib/redis_assist/callbacks.rb
134
107
  - lib/redis_assist/config.rb