activeobject 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGE +4 -0
- data/active-object.gemspec +1 -1
- data/lib/active_object/base.rb +14 -5
- data/lib/active_support/base64.rb +33 -0
- data/lib/active_support/core_ext/array/conversions.rb +1 -68
- data/lib/active_support/core_ext/hash/conversions.rb +3 -17
- data/lib/active_support/core_ext/string/inflections.rb +6 -17
- data/spec/case/base_test.rb +6 -0
- data/spec/case/serialization_test.rb +0 -3
- data/spec/case/validations_test.rb +2 -1
- data/spec/data.tch +0 -0
- metadata +3 -2
data/CHANGE
CHANGED
data/active-object.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification::Class.send :include,DirExt
|
|
30
30
|
|
31
31
|
Gem::Specification.new do |s|
|
32
32
|
s.name = %{activeobject}
|
33
|
-
s.version = '0.0.
|
33
|
+
s.version = '0.0.4'
|
34
34
|
s.description = 'Active Object是用来访问LightCloud/TokyoCabinet/TokyoTyrant的工具,实现了持久化数据与对象的映射。 它类似于ActiveRecord,提供一组访问LightCloud/TokyoCabinet/TokyoTyrant的方法以及验证规则、回调函数和观察器。'
|
35
35
|
s.homepage = "http://www.tokyocabinet.com"
|
36
36
|
s.rubyforge_project = %q{activeobject}
|
data/lib/active_object/base.rb
CHANGED
@@ -288,7 +288,7 @@ module ActiveObject
|
|
288
288
|
|
289
289
|
end
|
290
290
|
|
291
|
-
def initialize(attributes =
|
291
|
+
def initialize(attributes = {})
|
292
292
|
self.id = UUID.new.generate
|
293
293
|
@new_record = true
|
294
294
|
assign_attributes(attributes)
|
@@ -327,6 +327,14 @@ module ActiveObject
|
|
327
327
|
@destroyed = true
|
328
328
|
end
|
329
329
|
|
330
|
+
# 更新对象属性
|
331
|
+
# <tt>options</tt>是需要更新的一组Hash
|
332
|
+
def update_attributes(options={})
|
333
|
+
options.each do |key,value|
|
334
|
+
self.send("#{key}=",value) if self.respond_to?("#{key}=")
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
330
338
|
def destroy
|
331
339
|
delete
|
332
340
|
end
|
@@ -377,10 +385,11 @@ module ActiveObject
|
|
377
385
|
!value.blank?
|
378
386
|
end
|
379
387
|
|
380
|
-
def assign_attributes(
|
381
|
-
|
382
|
-
|
383
|
-
|
388
|
+
def assign_attributes(attrs={})
|
389
|
+
return if attrs.nil? || attrs.size==0
|
390
|
+
attrs.each do |key,value|
|
391
|
+
self.send("#{key}=",value) if self.respond_to?("#{key}=")
|
392
|
+
end unless attrs.empty?
|
384
393
|
end
|
385
394
|
|
386
395
|
def create_or_update
|
@@ -0,0 +1,33 @@
|
|
1
|
+
begin
|
2
|
+
require 'base64'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
|
6
|
+
module ActiveSupport
|
7
|
+
if defined? ::Base64
|
8
|
+
Base64 = ::Base64
|
9
|
+
else
|
10
|
+
# Base64 provides utility methods for encoding and de-coding binary data
|
11
|
+
# using a base 64 representation. A base 64 representation of binary data
|
12
|
+
# consists entirely of printable US-ASCII characters. The Base64 module
|
13
|
+
# is included in Ruby 1.8, but has been removed in Ruby 1.9.
|
14
|
+
module Base64
|
15
|
+
# Encodes a string to its base 64 representation. Each 60 characters of
|
16
|
+
# output is separated by a newline character.
|
17
|
+
#
|
18
|
+
# ActiveSupport::Base64.encode64("Original unencoded string")
|
19
|
+
# # => "T3JpZ2luYWwgdW5lbmNvZGVkIHN0cmluZw==\n"
|
20
|
+
def self.encode64(data)
|
21
|
+
[data].pack("m")
|
22
|
+
end
|
23
|
+
|
24
|
+
# Decodes a base 64 encoded string to its original representation.
|
25
|
+
#
|
26
|
+
# ActiveSupport::Base64.decode64("T3JpZ2luYWwgdW5lbmNvZGVkIHN0cmluZw==")
|
27
|
+
# # => "Original unencoded string"
|
28
|
+
def self.decode64(data)
|
29
|
+
data.unpack("m").first
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -4,73 +4,6 @@ module ActiveSupport #:nodoc:
|
|
4
4
|
module CoreExtensions #:nodoc:
|
5
5
|
module Array #:nodoc:
|
6
6
|
module Conversions
|
7
|
-
# Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options:
|
8
|
-
# * <tt>:connector</tt> - The word used to join the last element in arrays with two or more elements (default: "and")
|
9
|
-
# * <tt>:skip_last_comma</tt> - Set to true to return "a, b and c" instead of "a, b, and c".
|
10
|
-
def to_sentence(options = {})
|
11
|
-
options.assert_valid_keys(:connector, :skip_last_comma, :locale)
|
12
|
-
|
13
|
-
default = I18n.translate(:'support.array.sentence_connector', :locale => options[:locale])
|
14
|
-
default_skip_last_comma = I18n.translate(:'support.array.skip_last_comma', :locale => options[:locale])
|
15
|
-
options.reverse_merge! :connector => default, :skip_last_comma => default_skip_last_comma
|
16
|
-
options[:connector] = "#{options[:connector]} " unless options[:connector].nil? || options[:connector].strip == ''
|
17
|
-
|
18
|
-
case length
|
19
|
-
when 0
|
20
|
-
""
|
21
|
-
when 1
|
22
|
-
self[0].to_s
|
23
|
-
when 2
|
24
|
-
"#{self[0]} #{options[:connector]}#{self[1]}"
|
25
|
-
else
|
26
|
-
"#{self[0...-1].join(', ')}#{options[:skip_last_comma] ? '' : ','} #{options[:connector]}#{self[-1]}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
# Calls <tt>to_param</tt> on all its elements and joins the result with
|
32
|
-
# slashes. This is used by <tt>url_for</tt> in Action Pack.
|
33
|
-
def to_param
|
34
|
-
collect { |e| e.to_param }.join '/'
|
35
|
-
end
|
36
|
-
|
37
|
-
# Converts an array into a string suitable for use as a URL query string,
|
38
|
-
# using the given +key+ as the param name.
|
39
|
-
#
|
40
|
-
# ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding"
|
41
|
-
def to_query(key)
|
42
|
-
prefix = "#{key}[]"
|
43
|
-
collect { |value| value.to_query(prefix) }.join '&'
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.included(base) #:nodoc:
|
47
|
-
base.class_eval do
|
48
|
-
alias_method :to_default_s, :to_s
|
49
|
-
alias_method :to_s, :to_formatted_s
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Converts a collection of elements into a formatted string by calling
|
54
|
-
# <tt>to_s</tt> on all elements and joining them:
|
55
|
-
#
|
56
|
-
# Blog.find(:all).to_formatted_s # => "First PostSecond PostThird Post"
|
57
|
-
#
|
58
|
-
# Adding in the <tt>:db</tt> argument as the format yields a prettier
|
59
|
-
# output:
|
60
|
-
#
|
61
|
-
# Blog.find(:all).to_formatted_s(:db) # => "First Post,Second Post,Third Post"
|
62
|
-
def to_formatted_s(format = :default)
|
63
|
-
case format
|
64
|
-
when :db
|
65
|
-
if respond_to?(:empty?) && self.empty?
|
66
|
-
"null"
|
67
|
-
else
|
68
|
-
collect { |element| element.id }.join(",")
|
69
|
-
end
|
70
|
-
else
|
71
|
-
to_default_s
|
72
|
-
end
|
73
|
-
end
|
74
7
|
|
75
8
|
# Returns a string that represents this array in XML by sending +to_xml+
|
76
9
|
# to each element. Active Record collections delegate their representation
|
@@ -150,7 +83,7 @@ module ActiveSupport #:nodoc:
|
|
150
83
|
def to_xml(options = {})
|
151
84
|
raise "Not all elements respond to to_xml" unless all? { |e| e.respond_to? :to_xml }
|
152
85
|
|
153
|
-
options[:root] ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? first.class.to_s.underscore.pluralize : "
|
86
|
+
options[:root] ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? first.class.to_s.underscore.pluralize : "objects"
|
154
87
|
options[:children] ||= options[:root].singularize
|
155
88
|
options[:indent] ||= 2
|
156
89
|
options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
|
@@ -97,20 +97,6 @@ module ActiveSupport #:nodoc:
|
|
97
97
|
klass.extend(ClassMethods)
|
98
98
|
end
|
99
99
|
|
100
|
-
# Converts a hash into a string suitable for use as a URL query string. An optional <tt>namespace</tt> can be
|
101
|
-
# passed to enclose the param names (see example below).
|
102
|
-
#
|
103
|
-
# ==== Example:
|
104
|
-
# { :name => 'David', :nationality => 'Danish' }.to_query # => "name=David&nationality=Danish"
|
105
|
-
#
|
106
|
-
# { :name => 'David', :nationality => 'Danish' }.to_query('user') # => "user%5Bname%5D=David&user%5Bnationality%5D=Danish"
|
107
|
-
def to_query(namespace = nil)
|
108
|
-
collect do |key, value|
|
109
|
-
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
110
|
-
end.sort * '&'
|
111
|
-
end
|
112
|
-
|
113
|
-
alias_method :to_param, :to_query
|
114
100
|
|
115
101
|
def to_xml(options = {})
|
116
102
|
options[:indent] ||= 2
|
@@ -159,7 +145,7 @@ module ActiveSupport #:nodoc:
|
|
159
145
|
end
|
160
146
|
end
|
161
147
|
end
|
162
|
-
|
148
|
+
|
163
149
|
yield options[:builder] if block_given?
|
164
150
|
end
|
165
151
|
|
@@ -210,7 +196,7 @@ module ActiveSupport #:nodoc:
|
|
210
196
|
# blank or nil parsed values are represented by nil
|
211
197
|
elsif value.blank? || value['nil'] == 'true'
|
212
198
|
nil
|
213
|
-
# If the type is the only element which makes it then
|
199
|
+
# If the type is the only element which makes it then
|
214
200
|
# this still makes the value nil, except if type is
|
215
201
|
# a XML node(where type['value'] is a Hash)
|
216
202
|
elsif value['type'] && value.size == 1 && !value['type'].is_a?(::Hash)
|
@@ -220,7 +206,7 @@ module ActiveSupport #:nodoc:
|
|
220
206
|
h[k] = typecast_xml_value(v)
|
221
207
|
h
|
222
208
|
end
|
223
|
-
|
209
|
+
|
224
210
|
# Turn { :files => { :file => #<StringIO> } into { :files => #<StringIO> } so it is compatible with
|
225
211
|
# how multipart uploaded files from HTML appear
|
226
212
|
xml_value["file"].is_a?(StringIO) ? xml_value["file"] : xml_value
|
@@ -63,7 +63,7 @@ module ActiveSupport #:nodoc:
|
|
63
63
|
alias_method :titlecase, :titleize
|
64
64
|
|
65
65
|
# The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
|
66
|
-
#
|
66
|
+
#
|
67
67
|
# +underscore+ will also change '::' to '/' to convert namespaces to paths.
|
68
68
|
#
|
69
69
|
# "ActiveRecord".underscore # => "active_record"
|
@@ -88,7 +88,7 @@ module ActiveSupport #:nodoc:
|
|
88
88
|
end
|
89
89
|
|
90
90
|
# Replaces special characters in a string so that it may be used as part of a 'pretty' URL.
|
91
|
-
#
|
91
|
+
#
|
92
92
|
# ==== Examples
|
93
93
|
#
|
94
94
|
# class Person
|
@@ -96,10 +96,10 @@ module ActiveSupport #:nodoc:
|
|
96
96
|
# "#{id}-#{name.parameterize}"
|
97
97
|
# end
|
98
98
|
# end
|
99
|
-
#
|
99
|
+
#
|
100
100
|
# @person = Person.find(1)
|
101
101
|
# # => #<Person id: 1, name: "Donald E. Knuth">
|
102
|
-
#
|
102
|
+
#
|
103
103
|
# <%= link_to(@person.name, person_path %>
|
104
104
|
# # => <a href="/person/1-donald-e-knuth">Donald E. Knuth</a>
|
105
105
|
def parameterize
|
@@ -129,27 +129,16 @@ module ActiveSupport #:nodoc:
|
|
129
129
|
def classify
|
130
130
|
Inflector.classify(self)
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
# Capitalizes the first word, turns underscores into spaces, and strips '_id'.
|
134
134
|
# Like +titleize+, this is meant for creating pretty output.
|
135
135
|
#
|
136
|
-
# "employee_salary" # => "Employee salary"
|
136
|
+
# "employee_salary" # => "Employee salary"
|
137
137
|
# "author_id" # => "Author"
|
138
138
|
def humanize
|
139
139
|
Inflector.humanize(self)
|
140
140
|
end
|
141
141
|
|
142
|
-
# Creates a foreign key name from a class name.
|
143
|
-
# +separate_class_name_and_id_with_underscore+ sets whether
|
144
|
-
# the method should put '_' between the name and 'id'.
|
145
|
-
#
|
146
|
-
# Examples
|
147
|
-
# "Message".foreign_key # => "message_id"
|
148
|
-
# "Message".foreign_key(false) # => "messageid"
|
149
|
-
# "Admin::Post".foreign_key # => "post_id"
|
150
|
-
def foreign_key(separate_class_name_and_id_with_underscore = true)
|
151
|
-
Inflector.foreign_key(self, separate_class_name_and_id_with_underscore)
|
152
|
-
end
|
153
142
|
|
154
143
|
# +constantize+ tries to find a declared constant with the name specified
|
155
144
|
# in the string. It raises a NameError when the name is not in CamelCase
|
data/spec/case/base_test.rb
CHANGED
@@ -163,10 +163,11 @@ class ValidationsTest < Test::Unit::TestCase
|
|
163
163
|
hits += 1
|
164
164
|
end
|
165
165
|
end
|
166
|
-
t = Topic.new(
|
166
|
+
t = Topic.new(:title=> "valid", :content=>"whatever")
|
167
167
|
assert !t.save
|
168
168
|
assert_equal 4, hits
|
169
169
|
assert_equal %w(gotcha gotcha), t.errors.on(:title)
|
170
|
+
|
170
171
|
assert_equal %w(gotcha gotcha), t.errors.on(:content)
|
171
172
|
ensure
|
172
173
|
perform = false
|
data/spec/data.tch
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeobject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yalong zhang
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-27 00:00:00 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- ./lib/active_support/core_ext/class/inheritable_attributes.rb
|
124
124
|
- ./lib/active_support/core_ext/class/removal.rb
|
125
125
|
- ./lib/active_support/callbacks.rb
|
126
|
+
- ./lib/active_support/base64.rb
|
126
127
|
- ./MIT-LICENSE
|
127
128
|
- ./spec/helper.rb
|
128
129
|
- ./spec/model/account.rb
|