activeobject 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/CHANGE +10 -0
  2. data/Interface_desc +21 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README +72 -0
  5. data/Rakefile.rb +9 -0
  6. data/active-object.gemspec +50 -0
  7. data/examples/account.rb +69 -0
  8. data/examples/data.tch +0 -0
  9. data/examples/light_cloud.yml +18 -0
  10. data/examples/test.rb +3 -0
  11. data/examples/user.rb +112 -0
  12. data/init.rb +4 -0
  13. data/lib/active-object.rb +23 -0
  14. data/lib/active_object/adapters/light_cloud.rb +40 -0
  15. data/lib/active_object/adapters/tokyo_cabinet.rb +48 -0
  16. data/lib/active_object/adapters/tokyo_tyrant.rb +14 -0
  17. data/lib/active_object/associations.rb +200 -0
  18. data/lib/active_object/base.rb +415 -0
  19. data/lib/active_object/callbacks.rb +180 -0
  20. data/lib/active_object/observer.rb +180 -0
  21. data/lib/active_object/serialization.rb +99 -0
  22. data/lib/active_object/serializers/json_serializer.rb +75 -0
  23. data/lib/active_object/serializers/xml_serializer.rb +325 -0
  24. data/lib/active_object/validations.rb +687 -0
  25. data/lib/active_support/callbacks.rb +303 -0
  26. data/lib/active_support/core_ext/array/access.rb +53 -0
  27. data/lib/active_support/core_ext/array/conversions.rb +183 -0
  28. data/lib/active_support/core_ext/array/extract_options.rb +20 -0
  29. data/lib/active_support/core_ext/array/grouping.rb +106 -0
  30. data/lib/active_support/core_ext/array/random_access.rb +12 -0
  31. data/lib/active_support/core_ext/array.rb +13 -0
  32. data/lib/active_support/core_ext/blank.rb +58 -0
  33. data/lib/active_support/core_ext/class/attribute_accessors.rb +54 -0
  34. data/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  35. data/lib/active_support/core_ext/class/removal.rb +50 -0
  36. data/lib/active_support/core_ext/class.rb +3 -0
  37. data/lib/active_support/core_ext/duplicable.rb +43 -0
  38. data/lib/active_support/core_ext/enumerable.rb +72 -0
  39. data/lib/active_support/core_ext/hash/conversions.rb +259 -0
  40. data/lib/active_support/core_ext/hash/keys.rb +52 -0
  41. data/lib/active_support/core_ext/hash.rb +8 -0
  42. data/lib/active_support/core_ext/module/aliasing.rb +74 -0
  43. data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  44. data/lib/active_support/core_ext/module/attribute_accessors.rb +58 -0
  45. data/lib/active_support/core_ext/module.rb +16 -0
  46. data/lib/active_support/core_ext/object/conversions.rb +14 -0
  47. data/lib/active_support/core_ext/object/extending.rb +80 -0
  48. data/lib/active_support/core_ext/object/instance_variables.rb +74 -0
  49. data/lib/active_support/core_ext/object/metaclass.rb +13 -0
  50. data/lib/active_support/core_ext/object/misc.rb +43 -0
  51. data/lib/active_support/core_ext/object.rb +5 -0
  52. data/lib/active_support/core_ext/string/inflections.rb +167 -0
  53. data/lib/active_support/core_ext/string.rb +7 -0
  54. data/lib/active_support/core_ext.rb +4 -0
  55. data/lib/active_support/inflections.rb +55 -0
  56. data/lib/active_support/inflector.rb +348 -0
  57. data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +113 -0
  58. data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +20 -0
  59. data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +250 -0
  60. data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +115 -0
  61. data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +139 -0
  62. data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +63 -0
  63. data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +328 -0
  64. data/lib/active_support/vendor/builder-2.1.2/builder.rb +13 -0
  65. data/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb +1021 -0
  66. data/lib/active_support/vendor.rb +14 -0
  67. data/lib/active_support.rb +6 -0
  68. data/spec/case/association_test.rb +97 -0
  69. data/spec/case/base_test.rb +74 -0
  70. data/spec/case/callbacks_observers_test.rb +38 -0
  71. data/spec/case/callbacks_test.rb +424 -0
  72. data/spec/case/serialization_test.rb +87 -0
  73. data/spec/case/validations_test.rb +1482 -0
  74. data/spec/data.tch +0 -0
  75. data/spec/helper.rb +15 -0
  76. data/spec/light_cloud.yml +18 -0
  77. data/spec/model/account.rb +4 -0
  78. data/spec/model/topic.rb +26 -0
  79. data/spec/model/user.rb +8 -0
  80. metadata +173 -0
data/CHANGE ADDED
@@ -0,0 +1,10 @@
1
+ v0.0.1 2009-9-21
2
+ - initial release
3
+
4
+ v0.0.2 2009-9-24
5
+ - 针对TC和TT数据库新增all类方法,方便获取类的所有对象
6
+ - ActiveObject对象添加to_json方法
7
+ - ActiveObject对象添加to_xml方法
8
+
9
+ v0.0.3 2009-9-25
10
+ - 修复对象to_json时没有包含对象id
data/Interface_desc ADDED
@@ -0,0 +1,21 @@
1
+ ActiveRecord的功能分析:
2
+
3
+ 1、 CRUD --> 序列化 --> 跟踪变更
4
+ 2、 验证
5
+ 3、 回调 --> 观察器
6
+ 4、 关联
7
+ 5、 集合
8
+ 6、 事务
9
+
10
+
11
+ OKM(对象-key/value映射)要完成的事项:
12
+ 1、实现对象的持久化。这里面包含以下几部分:
13
+ * 对象的序列化与反序列化: 通过序列化和反序列化,使得对象能作为value被保存。
14
+ * 对象的CRUD: 通过CRUD能将序列化的对象保存、读取序列化的对象以及删除已经保存的对象。
15
+ * 对象的变更跟踪: 通过对对象的变更跟踪,在save时能确定是否需要进行保存操作。对于没有变更的对象不需要执行保存操作。
16
+
17
+ 2、实现对象的验证。
18
+
19
+ 2、实现对象的回调和观察器模式。
20
+
21
+ 3、实现对象的关联。
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Aaron Zhang
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,72 @@
1
+ = Active Object -- 基于Ruby的对象-key/value映射
2
+
3
+ Active Object是用来访问LightCloud/TokyoCabinet/TokyoTyrant的工具,实现了持久化数据与对象的映射。
4
+
5
+ == 主要特性
6
+
7
+ * 自定义持久化属性.
8
+
9
+ class User < ActiveObject::Base
10
+ attribute :name,:email
11
+ end
12
+
13
+ * 建立对象引用,消除冗余.
14
+
15
+ class User < ActiveObject::Base
16
+ attribute :name,:email
17
+
18
+ has_one :icon #=> 表示每个人有一张肖像
19
+ has_many :friends #=> 表示每个人可以有多个朋友
20
+ end
21
+
22
+ class Icon < ActiveObject::Base
23
+ attribute :content
24
+ end
25
+
26
+ class Friend < ActiveObject::Base
27
+ attribute :friend_name,:remark,:created_at
28
+ has_one :user
29
+ end
30
+
31
+ * 可以对对象应用验证规则,而且对新对象或存在的对象应用不同的验证规则.
32
+
33
+ class User < ActiveObject::Base
34
+ attribute :name,:email
35
+
36
+ validates_presence_of :name,:email
37
+ end
38
+
39
+ * 回调.
40
+
41
+ class User < ActiveObject::Base
42
+ before_destroy do |object|
43
+ puts object
44
+ end
45
+ end
46
+
47
+ * 观察器.
48
+ class UserObserver < ActiveObject::Observer
49
+ def after_create(user)
50
+ puts user
51
+ end
52
+ end
53
+
54
+ * 多级继承
55
+ class User < ActiveObject::Base;end
56
+ class Account < User;end
57
+
58
+
59
+ == 示例
60
+
61
+ 在Rails中应用Active Object
62
+
63
+ 在环境文件的最后加入下列代码(假设LightCloud配置文件与环境文件在同一个目录下):
64
+
65
+ require 'activeobject'
66
+ ActiveObject::Base.configure :LC,File.join(File.dirname(__FILE__),'light_cloud.yml')
67
+
68
+ 在项目中使用观察器
69
+
70
+ 在环境文件的最后加入下列代码:
71
+ ActiveObject::Base.observers = :account_observer
72
+ ActiveObject::Base.instantiate_observers
data/Rakefile.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "spec"
7
+ t.test_files = FileList['spec/case/*_test.rb']
8
+ t.verbose = true
9
+ end
@@ -0,0 +1,50 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module DirExt
3
+ # 根据指定的目录获取该目录下所有的文件路径(不包含隐藏文件)
4
+ # 例如:
5
+ # files_path_to_s('/home/Aaron/sample') => 会列出sample目录下所有文件的路径
6
+ #
7
+ def files_path_to_s(dirname)
8
+ path_array = files_path(dirname)
9
+ path_array.flatten!
10
+ end
11
+
12
+ protected
13
+ def files_path(dirname,path_array=[])
14
+ files = Dir.entries(dirname)
15
+ files.delete('.')
16
+ files.delete('..')
17
+ files.delete_if{|file| file =~ /^\./}
18
+ files.each do |f|
19
+ if File.directory?(File.join(dirname,f))
20
+ path_array << files_path(File.join(dirname,f))
21
+ else
22
+ path_array << File.join(dirname,f)
23
+ end
24
+ end
25
+ path_array
26
+ end
27
+ end
28
+
29
+ Gem::Specification::Class.send :include,DirExt
30
+
31
+ Gem::Specification.new do |s|
32
+ s.name = %{activeobject}
33
+ s.version = '0.0.3'
34
+ s.description = 'Active Object是用来访问LightCloud/TokyoCabinet/TokyoTyrant的工具,实现了持久化数据与对象的映射。 它类似于ActiveRecord,提供一组访问LightCloud/TokyoCabinet/TokyoTyrant的方法以及验证规则、回调函数和观察器。'
35
+ s.homepage = "http://www.tokyocabinet.com"
36
+ s.rubyforge_project = %q{activeobject}
37
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
38
+ s.summary = 'Active Object是用来访问LightCloud/TokyoCabinet/TokyoTyrant的工具,实现了持久化数据与对象的映射。 它类似于ActiveRecord,提供一组访问LightCloud/TokyoCabinet/TokyoTyrant的方法以及验证规则、回调函数和观察器。'
39
+
40
+ s.email = ["yalong1976@gmail.com"]
41
+ s.authors = ["yalong zhang"]
42
+ s.files = files_path_to_s(File.dirname(__FILE__)).delete_if{|path| path =~ /.gem$/}
43
+ s.require_paths = ["lib"]
44
+ s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
45
+ s.rubygems_version = %q{1.3.4}
46
+ s.add_dependency(%q<lightcloud>)
47
+ s.add_dependency(%q<rufus-tokyo>)
48
+ s.add_dependency(%q<uuid>)
49
+ s.add_dependency(%q<json>)
50
+ end
@@ -0,0 +1,69 @@
1
+ class Account < ActiveObject::Base
2
+
3
+ set_attributes :email,:name,:encrypted_password,:salt
4
+
5
+ attr_accessor :password
6
+
7
+ validates_presence_of :email, :message=>'电子邮箱不能为空!'
8
+ validates_format_of :email, :with => /(\A(\s*)\Z)|(\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z)/i, :message => '无效的电子邮件格式'
9
+ validates_presence_of :password,:message =>'密码不能为空'
10
+ validates_length_of :password, :within => 6..40, :too_short => '密码太短', :too_long =>'密码过长'
11
+ validates_confirmation_of :password, :message => '两次输入的密码不匹配!'
12
+
13
+
14
+ before_save :encrypt_password
15
+ before_save :default_name
16
+
17
+ # 通过账号和未加密的密码验证用户. 返回用户或者nil.
18
+ def self.authenticate(email, password)
19
+ u = find(email)
20
+ u && u.authenticated?(password) ? u : nil
21
+ end
22
+
23
+ # 根据salt加密数据.
24
+ def self.encrypt(password, salt)
25
+ Digest::SHA1.hexdigest("--#{salt}--#{password}--")
26
+ end
27
+
28
+ # 根据用户salt加密用户的密码
29
+ def encrypt(password)
30
+ self.class.encrypt(password, salt)
31
+ end
32
+
33
+ # 校验密码认证是否通过
34
+ def authenticated?(password)
35
+ encrypted_password == encrypt(password)
36
+ end
37
+
38
+ def change_password(password,password_confirmation)
39
+ self.password= password
40
+ self.password_confirmation = password_confirmation
41
+ self.save
42
+ end
43
+
44
+ # 让系统记住当前账号,使下次登录是不需要输入账号和密码。
45
+ def remember_me
46
+ remember_me_for 2.weeks
47
+ end
48
+
49
+ def remember_me_for(time)
50
+ remember_me_until time.from_now.utc
51
+ end
52
+
53
+ def remember_me_until(time)
54
+ Token.create(:email=>self.email,:token=>encrypt("#{email}--#{time}"),:expires_at=>time)
55
+ end
56
+
57
+ protected
58
+ # before filter
59
+ def encrypt_password
60
+ return if password.blank?
61
+ self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new_record?
62
+ self.encrypted_password = encrypt(password)
63
+ end
64
+
65
+ def default_name
66
+ return if email.blank?
67
+ self.name = email[0,email.index('@')] if self.name.blank? && email.index('@')
68
+ end
69
+ end
data/examples/data.tch ADDED
Binary file
@@ -0,0 +1,18 @@
1
+ # LightCloud的配置文件,用于初始化LightCloud
2
+ # 示例
3
+ # user:
4
+ # lookup_one:
5
+ # - 127.0.0.1:41401
6
+ # - 127.0.0.1:41402
7
+ # storage_one:
8
+ # - 127.0.0.1:44401
9
+ # - 127.0.0.1:44402
10
+ #
11
+
12
+ user:
13
+ lookup_one:
14
+ - 127.0.0.1:30001
15
+ - 127.0.0.1:33001
16
+ storage_one:
17
+ - 127.0.0.1:20001
18
+ - 127.0.0.1:24001
data/examples/test.rb ADDED
@@ -0,0 +1,3 @@
1
+ require '/home/Aaron/railsspace/tools/activeobject/lib/active_support'
2
+
3
+ puts [].to_json
data/examples/user.rb ADDED
@@ -0,0 +1,112 @@
1
+ require 'pathname'
2
+ require File.join(File.dirname(__FILE__),'..','lib','active-object')
3
+
4
+ #ActiveObject::Base.configurations = File.join(File.dirname(__FILE__),'light_cloud.yml')
5
+ ActiveObject::Base.configure :TC,File.join(File.dirname(Pathname.new(__FILE__).realpath),'data.tch')
6
+ #ActiveObject::Base.configure :LC,File.join(File.dirname(Pathname.new(__FILE__).realpath),'light_cloud.yml')
7
+ #ActiveObject::Base.configure :TT,'http://127.0.0.1:55555'
8
+
9
+ class Icon < ActiveObject::Base
10
+ attribute :path
11
+ end
12
+
13
+ class Friend < ActiveObject::Base
14
+ attribute :name
15
+ end
16
+
17
+
18
+ class Account < ActiveObject::Base
19
+ primary_key :email
20
+ attribute :email,:name,:encrypted_password,:salt
21
+
22
+ has_one :icon
23
+
24
+ has_many :friends
25
+
26
+ attr_accessor :password
27
+
28
+ validates_presence_of :email, :message=>'电子邮箱不能为空!'
29
+ validates_format_of :email, :with => /(\A(\s*)\Z)|(\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z)/i, :message => '无效的电子邮件格式'
30
+ validates_presence_of :password,:message =>'密码不能为空'
31
+ validates_length_of :password, :within => 6..40, :too_short => '密码太短', :too_long =>'密码过长'
32
+ validates_confirmation_of :password, :message => '两次输入的密码不匹配!'
33
+
34
+
35
+ before_save :encrypt_password
36
+ before_save :default_name
37
+
38
+ # 通过账号和未加密的密码验证用户. 返回用户或者nil.
39
+ def self.authenticate(email, password)
40
+ u = find(email)
41
+ u && u.authenticated?(password) ? u : nil
42
+ end
43
+
44
+ # 根据salt加密数据.
45
+ def self.encrypt(password, salt)
46
+ Digest::SHA1.hexdigest("--#{salt}--#{password}--")
47
+ end
48
+
49
+ # 根据用户salt加密用户的密码
50
+ def encrypt(password)
51
+ self.class.encrypt(password, salt)
52
+ end
53
+
54
+ # 校验密码认证是否通过
55
+ def authenticated?(password)
56
+ encrypted_password == encrypt(password)
57
+ end
58
+
59
+ def change_password(password,password_confirmation)
60
+ self.password= password
61
+ self.password_confirmation = password_confirmation
62
+ self.save
63
+ end
64
+
65
+ # 让系统记住当前账号,使下次登录是不需要输入账号和密码。
66
+ def remember_me
67
+ remember_me_for 2.weeks
68
+ end
69
+
70
+ def remember_me_for(time)
71
+ remember_me_until time.from_now.utc
72
+ end
73
+
74
+ def remember_me_until(time)
75
+ Token.create(:email=>self.email,:token=>encrypt("#{email}--#{time}"),:expires_at=>time)
76
+ end
77
+
78
+ protected
79
+ # before filter
80
+ def encrypt_password
81
+ return if password.blank?
82
+ self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{email}--") if new_record?
83
+ self.encrypted_password = encrypt(password)
84
+ end
85
+
86
+ def default_name
87
+ return if email.blank?
88
+ self.name = email[0,email.index('@')] if self.name.blank? && email.index('@')
89
+ end
90
+ end
91
+
92
+ u = Account.new(:email=>'aaron@nonobo.com',:password=>'111111',:password_confirmation=>'111111')
93
+
94
+
95
+
96
+ icon = Icon.create(:path=>"/home/Aaron")
97
+
98
+
99
+ u.icon = icon
100
+
101
+ friend = Friend.create(:name=>'kame')
102
+
103
+ u.friends.append(friend)
104
+
105
+ u.friends.append(Friend.create(:name=>'jim'))
106
+
107
+ u.save
108
+
109
+
110
+ a = Account.find(u.id)
111
+
112
+ p a
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'active-object'
@@ -0,0 +1,23 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+
5
+
6
+ require 'rubygems'
7
+ require 'lightcloud'
8
+ require 'active_support'
9
+ require 'active_object/base'
10
+ require 'active_object/validations'
11
+ require 'active_object/callbacks'
12
+ require 'active_object/observer'
13
+ require 'active_object/associations'
14
+ require 'active_object/serialization'
15
+
16
+
17
+ ActiveObject::Base.class_eval do
18
+ include ActiveObject::Validations
19
+ include ActiveObject::Callbacks
20
+ include ActiveObject::Observing
21
+ include ActiveObject::Associations
22
+ include ActiveObject::Serialization
23
+ end
@@ -0,0 +1,40 @@
1
+ # 访问LightCloud的加载模块
2
+ module ActiveObjectLightCloud
3
+
4
+ def self.included(base)
5
+ require 'lightcloud'
6
+ base.send "configurations=", YAML.load_file(base.configurations) if base.configurations.is_a?(String)
7
+ base.configurations.each do |key,value|
8
+ lookup_nodes, storage_nodes = LightCloud.generate_nodes(value)
9
+ LightCloud.init(lookup_nodes, storage_nodes,key)
10
+ end
11
+
12
+ base.extend ClassMethods
13
+ base.send :include, InstanceMethods
14
+ end
15
+
16
+ module ClassMethods
17
+ def delete(id)
18
+ LightCloud.delete(self.id_to_key(id))
19
+ end
20
+
21
+ private
22
+ def load(id)
23
+ raw_record = LightCloud.get(self.id_to_key(id)) || raise(ActiveObject::ObjectNotFound)
24
+ deserialize_attributes(raw_record)
25
+ end
26
+ end
27
+
28
+ module InstanceMethods
29
+ private
30
+ def set
31
+ begin
32
+ LightCloud.set(@key,serialize_attributes)
33
+ true
34
+ rescue
35
+ false
36
+ end
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,48 @@
1
+
2
+ # 访问TokyoCabinet的加载模块
3
+ module ActiveObjectTokyoCabinet
4
+ def self.included(base)
5
+ require 'rufus/tokyo'
6
+
7
+ base.extend ClassMethods
8
+ base.send :include, InstanceMethods
9
+
10
+ base.send :adb=, Rufus::Tokyo::Cabinet.new(base.configurations)
11
+ end
12
+
13
+ module ClassMethods
14
+ mattr_accessor :adb
15
+ def delete(id)
16
+ adb.delete(self.id_to_key(id))
17
+ end
18
+
19
+ def all
20
+ keys = adb.keys(:prefix=>"#{self.to_s}_")
21
+ records = []
22
+ keys.each do |key|
23
+ records << find(key_to_id(key))
24
+ end
25
+ records
26
+ end
27
+
28
+ private
29
+
30
+ def load(id)
31
+ raw_record = adb[self.id_to_key(id)] || raise(ActiveObject::ObjectNotFound)
32
+ deserialize_attributes(raw_record)
33
+ end
34
+ end
35
+
36
+ module InstanceMethods
37
+ private
38
+ def set
39
+ begin
40
+ self.class.adb[@key]= serialize_attributes
41
+ true
42
+ rescue
43
+
44
+ false
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ # 访问TokyoTyrant的加载模块
2
+ module ActiveObjectTokyoTyrant
3
+
4
+ def self.included(base)
5
+ require 'uri'
6
+ require 'rufus/tokyo'
7
+ uri = URI.parse(base.configurations)
8
+
9
+ base.extend ActiveObjectTokyoCabinet::ClassMethods
10
+ base.send :include, ActiveObjectTokyoCabinet::InstanceMethods
11
+
12
+ base.send :adb=, Rufus::Tokyo::Tyrant.new(uri.host,uri.port)
13
+ end
14
+ end