redis_assist 0.3.0 → 0.4.0

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: 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