activeobject 0.0.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.
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