simplemapper 0.0.4 → 0.0.5
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.
- data/Rakefile +1 -1
- data/lib/simple_mapper/adapters/http_adapter.rb +36 -5
- data/lib/simple_mapper/base.rb +5 -175
- data/lib/simple_mapper/default_plugins/associations.rb +374 -0
- data/lib/simple_mapper/default_plugins/properties.rb +70 -0
- data/lib/simple_mapper/persistence.rb +169 -0
- data/lib/simple_mapper/plugin_support.rb +19 -0
- data/lib/simple_mapper/support.rb +2 -2
- data/lib/simple_mapper/support/bliss_serializer.rb +43 -12
- data/lib/simple_mapper/support/core_ext.rb +23 -2
- metadata +6 -179
- data/doc/classes/Array.html +0 -158
- data/doc/classes/Array.src/M000005.html +0 -18
- data/doc/classes/Array.src/M000006.html +0 -34
- data/doc/classes/Enumerable.html +0 -131
- data/doc/classes/Enumerable.src/M000040.html +0 -21
- data/doc/classes/Hash.html +0 -173
- data/doc/classes/Hash.src/M000002.html +0 -20
- data/doc/classes/Hash.src/M000003.html +0 -18
- data/doc/classes/Hash.src/M000004.html +0 -34
- data/doc/classes/Inflector.html +0 -516
- data/doc/classes/Inflector.src/M000020.html +0 -22
- data/doc/classes/Inflector.src/M000021.html +0 -25
- data/doc/classes/Inflector.src/M000022.html +0 -25
- data/doc/classes/Inflector.src/M000023.html +0 -22
- data/doc/classes/Inflector.src/M000024.html +0 -18
- data/doc/classes/Inflector.src/M000025.html +0 -22
- data/doc/classes/Inflector.src/M000026.html +0 -18
- data/doc/classes/Inflector.src/M000027.html +0 -18
- data/doc/classes/Inflector.src/M000028.html +0 -18
- data/doc/classes/Inflector.src/M000029.html +0 -18
- data/doc/classes/Inflector.src/M000030.html +0 -19
- data/doc/classes/Inflector.src/M000031.html +0 -18
- data/doc/classes/Inflector.src/M000032.html +0 -22
- data/doc/classes/Inflector.src/M000033.html +0 -27
- data/doc/classes/Inflector/Inflections.html +0 -323
- data/doc/classes/Inflector/Inflections.src/M000034.html +0 -18
- data/doc/classes/Inflector/Inflections.src/M000035.html +0 -18
- data/doc/classes/Inflector/Inflections.src/M000036.html +0 -18
- data/doc/classes/Inflector/Inflections.src/M000037.html +0 -19
- data/doc/classes/Inflector/Inflections.src/M000038.html +0 -18
- data/doc/classes/Inflector/Inflections.src/M000039.html +0 -23
- data/doc/classes/Merb.html +0 -111
- data/doc/classes/Merb/Request.html +0 -139
- data/doc/classes/Merb/Request.src/M000041.html +0 -22
- data/doc/classes/OAuth.html +0 -112
- data/doc/classes/OAuth/RequestProxy.html +0 -111
- data/doc/classes/OAuth/RequestProxy/Base.html +0 -139
- data/doc/classes/OAuth/RequestProxy/Base.src/M000015.html +0 -18
- data/doc/classes/OAuth/Signature.html +0 -111
- data/doc/classes/OAuth/Signature/Base.html +0 -139
- data/doc/classes/OAuth/Signature/Base.src/M000014.html +0 -25
- data/doc/classes/OAuthController.html +0 -243
- data/doc/classes/OAuthController.src/M000008.html +0 -22
- data/doc/classes/OAuthController.src/M000009.html +0 -18
- data/doc/classes/OAuthController.src/M000010.html +0 -18
- data/doc/classes/OAuthController.src/M000011.html +0 -25
- data/doc/classes/OAuthController.src/M000012.html +0 -19
- data/doc/classes/Object.html +0 -154
- data/doc/classes/Object.src/M000013.html +0 -19
- data/doc/classes/Proc.html +0 -143
- data/doc/classes/Proc.src/M000007.html +0 -18
- data/doc/classes/Serialize.html +0 -189
- data/doc/classes/Serialize.src/M000016.html +0 -21
- data/doc/classes/Serialize.src/M000017.html +0 -39
- data/doc/classes/Serialize.src/M000018.html +0 -16
- data/doc/classes/Serialize.src/M000019.html +0 -18
- data/doc/classes/SimpleMapper.html +0 -151
- data/doc/classes/SimpleMapper/Base.html +0 -621
- data/doc/classes/SimpleMapper/Base.src/M000067.html +0 -16
- data/doc/classes/SimpleMapper/Base.src/M000068.html +0 -16
- data/doc/classes/SimpleMapper/Base.src/M000069.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000070.html +0 -29
- data/doc/classes/SimpleMapper/Base.src/M000071.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000072.html +0 -21
- data/doc/classes/SimpleMapper/Base.src/M000073.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000074.html +0 -27
- data/doc/classes/SimpleMapper/Base.src/M000075.html +0 -21
- data/doc/classes/SimpleMapper/Base.src/M000076.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000077.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000078.html +0 -19
- data/doc/classes/SimpleMapper/Base.src/M000079.html +0 -23
- data/doc/classes/SimpleMapper/Base.src/M000080.html +0 -21
- data/doc/classes/SimpleMapper/Base.src/M000081.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000082.html +0 -19
- data/doc/classes/SimpleMapper/Base.src/M000083.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000085.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000086.html +0 -19
- data/doc/classes/SimpleMapper/Base.src/M000087.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000088.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000089.html +0 -18
- data/doc/classes/SimpleMapper/Base.src/M000090.html +0 -19
- data/doc/classes/SimpleMapper/Base.src/M000091.html +0 -20
- data/doc/classes/SimpleMapper/Base.src/M000092.html +0 -24
- data/doc/classes/SimpleMapper/Base.src/M000093.html +0 -18
- data/doc/classes/SimpleMapper/CallbacksExtension.html +0 -161
- data/doc/classes/SimpleMapper/CallbacksExtension.src/M000056.html +0 -18
- data/doc/classes/SimpleMapper/CallbacksExtension.src/M000057.html +0 -18
- data/doc/classes/SimpleMapper/CallbacksExtension.src/M000058.html +0 -19
- data/doc/classes/SimpleMapper/HttpAdapter.html +0 -289
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000059.html +0 -18
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000060.html +0 -18
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000061.html +0 -19
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000063.html +0 -19
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000064.html +0 -18
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000065.html +0 -18
- data/doc/classes/SimpleMapper/HttpAdapter.src/M000066.html +0 -18
- data/doc/classes/SimpleMapper/HttpOAuthExtension.html +0 -188
- data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000048.html +0 -47
- data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000049.html +0 -21
- data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000050.html +0 -18
- data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000051.html +0 -24
- data/doc/classes/SimpleMapper/SimpleModel.html +0 -184
- data/doc/classes/SimpleMapper/SimpleModel.src/M000042.html +0 -18
- data/doc/classes/SimpleMapper/SimpleModel.src/M000043.html +0 -18
- data/doc/classes/SimpleMapper/SimpleModel.src/M000044.html +0 -18
- data/doc/classes/SimpleMapper/SimpleModel.src/M000045.html +0 -24
- data/doc/classes/SimpleMapper/SimpleModel/ClassMethods.html +0 -146
- data/doc/classes/SimpleMapper/SimpleModel/ClassMethods.src/M000046.html +0 -19
- data/doc/classes/SimpleMapper/SimpleModel/ClassMethods.src/M000047.html +0 -19
- data/doc/classes/SimpleMapper/XmlFormat.html +0 -169
- data/doc/classes/SimpleMapper/XmlFormat.src/M000052.html +0 -18
- data/doc/classes/SimpleMapper/XmlFormat.src/M000053.html +0 -18
- data/doc/classes/SimpleMapper/XmlFormat.src/M000054.html +0 -20
- data/doc/classes/SimpleMapper/XmlFormat/ClassMethods.html +0 -152
- data/doc/classes/SimpleMapper/XmlFormat/ClassMethods.src/M000055.html +0 -32
- data/doc/classes/String.html +0 -120
- data/doc/classes/Time.html +0 -139
- data/doc/classes/Time.src/M000001.html +0 -18
- data/doc/created.rid +0 -1
- data/doc/files/LICENSE.html +0 -129
- data/doc/files/README.html +0 -130
- data/doc/files/lib/simple_mapper/adapters/http_adapter_rb.html +0 -111
- data/doc/files/lib/simple_mapper/base_rb.html +0 -108
- data/doc/files/lib/simple_mapper/default_plugins/callbacks_rb.html +0 -101
- data/doc/files/lib/simple_mapper/default_plugins/oauth_rb.html +0 -110
- data/doc/files/lib/simple_mapper/default_plugins/options_to_query_rb.html +0 -116
- data/doc/files/lib/simple_mapper/default_plugins/simple_model_rb.html +0 -101
- data/doc/files/lib/simple_mapper/formats/xml_format_rb.html +0 -110
- data/doc/files/lib/simple_mapper/support/bliss_serializer_rb.html +0 -110
- data/doc/files/lib/simple_mapper/support/core_ext_rb.html +0 -108
- data/doc/files/lib/simple_mapper/support/inflections_rb.html +0 -101
- data/doc/files/lib/simple_mapper/support/inflector_rb.html +0 -108
- data/doc/files/lib/simple_mapper/support_rb.html +0 -109
- data/doc/files/lib/simple_mapper_rb.html +0 -137
- data/doc/fr_class_index.html +0 -53
- data/doc/fr_file_index.html +0 -41
- data/doc/fr_method_index.html +0 -119
- data/doc/index.html +0 -24
- data/doc/rdoc-style.css +0 -208
- data/lib/simple_mapper/default_plugins/simple_model.rb +0 -36
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module SimpleMapper
|
|
2
|
+
# Properties sets up a structure of properties such that:
|
|
3
|
+
# 1. You name an identifier and several properties that will be used in your model, and
|
|
4
|
+
# 2. properties do not include the identifier
|
|
5
|
+
# Properties are accessed and set through method_missing, simply using instance variables to
|
|
6
|
+
# store each property value. If you wish, you can define your own accessor method for any
|
|
7
|
+
# property and it will be used instead.
|
|
8
|
+
#
|
|
9
|
+
# The methods data and data= are provided and perform the usual logical behavior for a model that
|
|
10
|
+
# has properties == it receives a hash and calls the appropriate methods on the object according
|
|
11
|
+
# to the keys in that hash, when they match up with a defined property. data simply calls to_hash,
|
|
12
|
+
# which performs the opposite, simply collecting the properties into a hash by calling the appropriate
|
|
13
|
+
# accessor methods.
|
|
14
|
+
module Properties
|
|
15
|
+
def self.included(base)
|
|
16
|
+
base.extend ClassMethods
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module ClassMethods
|
|
20
|
+
def properties(*property_names)
|
|
21
|
+
if property_names.length > 0
|
|
22
|
+
property_names.each {|e| property e.to_s}
|
|
23
|
+
else
|
|
24
|
+
@properties ||= []
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def property(property_name)
|
|
29
|
+
properties << property_name.to_sym
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def identifier(id=nil)
|
|
33
|
+
@identifier = id.to_s unless id.nil?
|
|
34
|
+
@identifier
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def data(options={})
|
|
39
|
+
to_hash(options)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Sets the data into the object. This is provided as a default method, but your model can overwrite it any
|
|
43
|
+
# way you want. For example, you could set the data to some other object type, or to a Marshalled storage.
|
|
44
|
+
# The type of data you receive will depend on the format and parser you use. Of course you could make up
|
|
45
|
+
# your own spin-off of one of those, too.
|
|
46
|
+
def data=(hash)
|
|
47
|
+
raise TypeError, "data must be a hash" unless data.is_a?(Hash)
|
|
48
|
+
data.each {|k,v| instance_variable_set("@#{k}", v)}
|
|
49
|
+
end
|
|
50
|
+
alias :update_data :data=
|
|
51
|
+
|
|
52
|
+
def to_hash(options={})
|
|
53
|
+
self.class.properties.inject({}) {|h,k| h[k] = instance_variable_get("@#{k}"); h}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def identifier
|
|
57
|
+
instance_variable_get("@#{self.class.identifier}")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def method_missing(method, *args)
|
|
61
|
+
if self.class.properties.include?(method)
|
|
62
|
+
instance_variable_get("@#{method}")
|
|
63
|
+
elsif method.to_s =~ /=$/ && self.class.properties.include?(method.to_s.gsub(/=/, '').to_sym)
|
|
64
|
+
instance_variable_set("@#{method.to_s.gsub(/=/, '')}", *args)
|
|
65
|
+
else
|
|
66
|
+
super
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
module SimpleMapper
|
|
2
|
+
module Persistence
|
|
3
|
+
include PluginSupport
|
|
4
|
+
|
|
5
|
+
# TODO: Write in inheritability for models. Should this instead be a place that plugins can plug in a callback?
|
|
6
|
+
def self.prepare_for_inheritance(klass)
|
|
7
|
+
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module ClassMethods
|
|
11
|
+
attr_reader :format
|
|
12
|
+
def debug?; @debug end
|
|
13
|
+
def debug!; @debug = true end
|
|
14
|
+
|
|
15
|
+
def connection_adapters
|
|
16
|
+
@connection_adapters ||= Hash.new {|h,k| h[k] = {}}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add_connection_adapter(name_or_adapter,adapter=nil,&block)
|
|
20
|
+
if adapter.nil?
|
|
21
|
+
adapter = name_or_adapter
|
|
22
|
+
name = :default
|
|
23
|
+
else
|
|
24
|
+
name = name_or_adapter.to_sym
|
|
25
|
+
end
|
|
26
|
+
# Should complain if the adapter doesn't exist.
|
|
27
|
+
connection_adapters[name][:adapter] = adapter
|
|
28
|
+
require "#{File.dirname(__FILE__)}/adapters/#{adapter}_adapter"
|
|
29
|
+
connection_adapters[name][:init_block] = block if block_given?
|
|
30
|
+
connection_adapters[name][:debug] = @debug
|
|
31
|
+
[name, adapter]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# This is only here to show you in the docs how to clone a connection
|
|
35
|
+
# connection_adapters[adapter_name] = connection_adapters[adapter_name]
|
|
36
|
+
# connections[adapter_name] = klass.connection(adapter_name)
|
|
37
|
+
def clone_connection(klass,adapter_name=nil)
|
|
38
|
+
raise 'Not Implemented!'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# set_format :xml
|
|
42
|
+
# self.format = :json
|
|
43
|
+
def format=(format)
|
|
44
|
+
@format_name = format.to_s
|
|
45
|
+
require "#{File.dirname(__FILE__)}/formats/#{@format_name}_format"
|
|
46
|
+
@format = Object.module_eval("::SimpleMapper::#{@format_name.camelize}Format", __FILE__, __LINE__)
|
|
47
|
+
include @format
|
|
48
|
+
end
|
|
49
|
+
alias :set_format :format=
|
|
50
|
+
attr_reader :format_name
|
|
51
|
+
|
|
52
|
+
def connections
|
|
53
|
+
@connections ||= {}
|
|
54
|
+
end
|
|
55
|
+
def connection(name=:default,refresh=false)
|
|
56
|
+
connections[name] = begin
|
|
57
|
+
# Initialize the connection with the connection adapter.
|
|
58
|
+
raise ArgumentError, "Must include :adapter!" unless connection_adapters[name][:adapter].to_s.camelize.length > 0
|
|
59
|
+
adapter = Object.module_eval("::SimpleMapper::#{connection_adapters[name][:adapter].to_s.camelize}Adapter", __FILE__, __LINE__).new
|
|
60
|
+
connection_adapters[name][:init_block].in_context(adapter).call if connection_adapters[name][:init_block].is_a?(Proc)
|
|
61
|
+
adapter.set_headers format.mime_type_headers
|
|
62
|
+
adapter.debug! if connection_adapters[name][:debug]
|
|
63
|
+
adapter
|
|
64
|
+
end if !connections[name] || refresh
|
|
65
|
+
connections[name]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# get
|
|
69
|
+
def get(*args)
|
|
70
|
+
adapter = adapter_from_args(*args)
|
|
71
|
+
objs = extract_from(connection(adapter || :default).get(*args))
|
|
72
|
+
objs.is_a?(Array) ? objs.each {|e| e.instance_variable_set(:@adapter, adapter)} : objs.instance_variable_set(:@adapter, adapter) if adapter
|
|
73
|
+
objs
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# new.save
|
|
77
|
+
def create(*args)
|
|
78
|
+
new(*args).save
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def persistent?
|
|
82
|
+
true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def extract_from(formatted_data)
|
|
86
|
+
objs = send("from_#{format_name}".to_sym, formatted_data)
|
|
87
|
+
objs.is_a?(Array) ? objs.collect {|e| e.extended {@persisted = true}} : objs.extended {@persisted = true}
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def extract_one(formatted_data, identifier=nil)
|
|
91
|
+
objs = extract_from(formatted_data)
|
|
92
|
+
if objs.is_a?(Array)
|
|
93
|
+
identifier.nil? ? objs.first : objs.reject {|e| e.identifier != identifier}[0]
|
|
94
|
+
else
|
|
95
|
+
identifier.nil? ? objs : (objs.identifier == identifier ? objs : nil)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def load(data=nil)
|
|
100
|
+
obj = allocate
|
|
101
|
+
obj.original_data = data
|
|
102
|
+
obj.send(:initialize, data)
|
|
103
|
+
obj
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
def adapter_from_args(*args)
|
|
108
|
+
adapter = nil
|
|
109
|
+
adapter = args.first.delete(:adapter) if args.first.is_a?(Hash)
|
|
110
|
+
adapter
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def initialize(data=nil)
|
|
115
|
+
self.data = data unless data.nil?
|
|
116
|
+
end
|
|
117
|
+
attr_reader :identifier
|
|
118
|
+
|
|
119
|
+
def original_data=(data)
|
|
120
|
+
@original_data = data.freeze
|
|
121
|
+
@original_attributes = data.keys
|
|
122
|
+
end
|
|
123
|
+
attr_reader :original_data
|
|
124
|
+
attr_reader :original_attributes
|
|
125
|
+
|
|
126
|
+
# Reads the data from the object for saving back to the persisted store. This is provided as a default
|
|
127
|
+
# method, but you can overwrite it in your model.
|
|
128
|
+
def formatted_data
|
|
129
|
+
send("to_#{self.class.format_name}".to_sym)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def dirty?
|
|
133
|
+
data != original_data
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# persisted? ? put : post
|
|
137
|
+
def save
|
|
138
|
+
persisted? ? put : post
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# sends a put request with self.data
|
|
142
|
+
def put(*args)
|
|
143
|
+
self.data = self.class.extract_one(self.class.connection(@adapter || :default).put(identifier, formatted_data), identifier).to_hash
|
|
144
|
+
self
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# sends a post request with self.data
|
|
148
|
+
def post(*args)
|
|
149
|
+
self.data = self.class.extract_one(self.class.connection(@adapter || :default).post(formatted_data)).to_hash
|
|
150
|
+
@persisted = true
|
|
151
|
+
self
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# delete
|
|
155
|
+
def delete
|
|
156
|
+
if self.class.connection(@adapter || :default).delete(identifier)
|
|
157
|
+
@persisted = false
|
|
158
|
+
instance_variable_set('@'+self.class.identifier, nil)
|
|
159
|
+
true
|
|
160
|
+
else
|
|
161
|
+
false
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def persisted?
|
|
166
|
+
!!@persisted && !self.class.identifier.nil? && !self.send(self.class.identifier).nil?
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module SimpleMapper
|
|
2
|
+
module PluginSupport
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.extend(ClassMethods)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
# Requires the plugin mentioned, then includes it in the calling class or module.
|
|
9
|
+
# The require step is rescued, so if you have your own plugin you can still use this to include your plugin after you've required it.
|
|
10
|
+
def include_plugin(plugin_name)
|
|
11
|
+
require "simple_mapper/default_plugins/#{plugin_name.to_s}" rescue nil
|
|
12
|
+
include Object.module_eval("::SimpleMapper::#{plugin_name.to_s.camelize}", __FILE__, __LINE__)
|
|
13
|
+
end
|
|
14
|
+
alias :has :include_plugin
|
|
15
|
+
alias :uses :include_plugin
|
|
16
|
+
alias :acts_as :include_plugin
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require '
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/support/core_ext')
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/support/inflector')
|
|
@@ -2,42 +2,60 @@ require 'rexml/light/node'
|
|
|
2
2
|
require 'rexml/document'
|
|
3
3
|
gem 'formattedstring'
|
|
4
4
|
require 'formatted_string'
|
|
5
|
+
gem 'hash_magic'
|
|
6
|
+
require 'hash_magic'
|
|
5
7
|
|
|
6
8
|
module Serialize
|
|
7
9
|
XML_OPTIONS = {
|
|
8
|
-
:include_key =>
|
|
10
|
+
:include_key => false, # Can be false, :element, or :attribute
|
|
9
11
|
:report_nil => true, # Sets an attribute nil="true" on elements that are nil, so that the reader doesn't read as an empty string
|
|
10
|
-
:key_name =>
|
|
12
|
+
:key_name => :id, # Default key name
|
|
13
|
+
:instance_columns => :visible_properties,
|
|
14
|
+
:class_columns => :visible_properties,
|
|
15
|
+
:default_root => 'xml',
|
|
11
16
|
}
|
|
12
17
|
def self.object_to_xml(obj, options={})
|
|
13
18
|
# Automatically set the key_name for DataMapper objects
|
|
14
19
|
options.merge!(:key_name => obj.class.table.key.name) if obj.class.respond_to?(:table) && obj.class.respond_to?(:persistent?) && obj.class.persistent?
|
|
15
20
|
# Should do the above also for ActiveRecord...
|
|
16
|
-
|
|
21
|
+
options = options.reverse_merge!(obj.class.xml_options) if obj.class.respond_to?(:xml_options)
|
|
22
|
+
options = options.reverse_merge!(obj.xml_options) if obj.respond_to?(:xml_options)
|
|
23
|
+
to_xml(obj.to_hash(options), {:root => Inflector.underscore(obj.class.name)}.merge(options))
|
|
17
24
|
end
|
|
18
|
-
def self.to_xml(
|
|
25
|
+
def self.to_xml(attributes={}, options={})
|
|
19
26
|
options = XML_OPTIONS.merge(options)
|
|
20
|
-
|
|
27
|
+
root = options[:root]
|
|
28
|
+
options[:exclude] = [options[:exclude]].flatten.compact.collect {|e| e.to_s}
|
|
29
|
+
attributes.reject! {|k,v| options[:exclude].include?(k)}
|
|
21
30
|
|
|
22
31
|
doc = REXML::Document.new
|
|
23
|
-
root_element = doc.add_element(root)
|
|
32
|
+
root_element = doc.add_element(root || 'xml')
|
|
24
33
|
|
|
25
34
|
case options[:include_key]
|
|
26
35
|
when :attribute
|
|
27
|
-
root_element.add_attribute(options[:key_name], attributes.delete(options[:key_name].to_s).to_s).extended do
|
|
36
|
+
root_element.add_attribute(options[:key_name].to_s, attributes.delete(options[:key_name].to_s).to_s).extended do
|
|
28
37
|
def self.to_string; %Q[#@expanded_name="#{to_s().gsub(/"/, '"')}"] end
|
|
29
38
|
end
|
|
30
39
|
when :element
|
|
31
|
-
root_element.add_element(options[:key_name]) << REXML::Text.new(attributes.delete(options[:key_name].to_s).to_s)
|
|
40
|
+
root_element.add_element(options[:key_name].to_s) << REXML::Text.new(attributes.delete(options[:key_name].to_s).to_s)
|
|
32
41
|
end
|
|
33
42
|
|
|
34
43
|
attributes.each do |key,value|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
if value.nil?
|
|
45
|
+
node = root_element.add_element(key.to_s)
|
|
46
|
+
node.add_attribute('nil', 'true') if options[:report_nil]
|
|
47
|
+
else
|
|
48
|
+
if value.respond_to?(:to_xml)
|
|
49
|
+
assoc_options = {}
|
|
50
|
+
assoc_options = {:exclude => value.association.foreign_key_column.name} if value.respond_to?(:association)
|
|
51
|
+
root_element.add_element(REXML::Document.new(value.to_xml(assoc_options.merge(:root => key)).to_s))
|
|
52
|
+
else
|
|
53
|
+
root_element.add_element(key.to_s) << REXML::Text.new(value.to_s.dup)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
38
56
|
end
|
|
39
57
|
|
|
40
|
-
doc
|
|
58
|
+
root ? doc.to_s : doc.children[0].children.to_s
|
|
41
59
|
end
|
|
42
60
|
|
|
43
61
|
def self.hash_from_xml(xml,options={})
|
|
@@ -45,6 +63,19 @@ module Serialize
|
|
|
45
63
|
end
|
|
46
64
|
end
|
|
47
65
|
|
|
66
|
+
class Hash
|
|
67
|
+
def to_xml(options={})
|
|
68
|
+
options[:root] = keys.length == 1 ? keys[0] : nil if !options.has_key?(:root)
|
|
69
|
+
Serialize.to_xml(self.slashed, options.merge(:root => (options.has_key?(:root) ? options[:root] : 'xml')))
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class Array
|
|
74
|
+
def to_xml(options={})
|
|
75
|
+
collect {|e| e.to_xml(options)}.join('')
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
48
79
|
module Merb
|
|
49
80
|
class Request
|
|
50
81
|
def xml_params
|
|
@@ -16,8 +16,29 @@ class Proc
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
class Hash
|
|
19
|
-
def stringify_keys
|
|
20
|
-
self.
|
|
19
|
+
def stringify_keys(specials={})
|
|
20
|
+
self.dup.stringify_keys!(specials)
|
|
21
|
+
end
|
|
22
|
+
def stringify_keys!(specials={})
|
|
23
|
+
self.each_key do |k|
|
|
24
|
+
self[specials.has_key?(k) ? specials[k] : k.to_s] = self.delete(k)
|
|
25
|
+
end
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Symbolize keys
|
|
30
|
+
def symbolize_keys!
|
|
31
|
+
self.each_key do |k|
|
|
32
|
+
self[k.to_sym] = self.delete(k)
|
|
33
|
+
end
|
|
34
|
+
self
|
|
35
|
+
end
|
|
36
|
+
def symbolize_keys
|
|
37
|
+
{}.merge(self).symbolize_keys!
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def except(*keys)
|
|
41
|
+
reject {|k,v| keys.flatten.include?(k) }
|
|
21
42
|
end
|
|
22
43
|
|
|
23
44
|
def crawl(&block)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: simplemapper
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Parker
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2008-
|
|
12
|
+
date: 2008-04-15 00:00:00 -04:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|
|
@@ -28,12 +28,15 @@ files:
|
|
|
28
28
|
- lib/simple_mapper/adapters/http_adapter.rb
|
|
29
29
|
- lib/simple_mapper/base.rb
|
|
30
30
|
- lib/simple_mapper/default_plugins
|
|
31
|
+
- lib/simple_mapper/default_plugins/associations.rb
|
|
31
32
|
- lib/simple_mapper/default_plugins/callbacks.rb
|
|
32
33
|
- lib/simple_mapper/default_plugins/oauth.rb
|
|
33
34
|
- lib/simple_mapper/default_plugins/options_to_query.rb
|
|
34
|
-
- lib/simple_mapper/default_plugins/
|
|
35
|
+
- lib/simple_mapper/default_plugins/properties.rb
|
|
35
36
|
- lib/simple_mapper/formats
|
|
36
37
|
- lib/simple_mapper/formats/xml_format.rb
|
|
38
|
+
- lib/simple_mapper/persistence.rb
|
|
39
|
+
- lib/simple_mapper/plugin_support.rb
|
|
37
40
|
- lib/simple_mapper/support
|
|
38
41
|
- lib/simple_mapper/support/bliss_serializer.rb
|
|
39
42
|
- lib/simple_mapper/support/core_ext.rb
|
|
@@ -44,182 +47,6 @@ files:
|
|
|
44
47
|
- LICENSE
|
|
45
48
|
- Rakefile
|
|
46
49
|
- README
|
|
47
|
-
- doc/classes
|
|
48
|
-
- doc/classes/Array.html
|
|
49
|
-
- doc/classes/Array.src
|
|
50
|
-
- doc/classes/Array.src/M000005.html
|
|
51
|
-
- doc/classes/Array.src/M000006.html
|
|
52
|
-
- doc/classes/Enumerable.html
|
|
53
|
-
- doc/classes/Enumerable.src
|
|
54
|
-
- doc/classes/Enumerable.src/M000040.html
|
|
55
|
-
- doc/classes/Hash.html
|
|
56
|
-
- doc/classes/Hash.src
|
|
57
|
-
- doc/classes/Hash.src/M000002.html
|
|
58
|
-
- doc/classes/Hash.src/M000003.html
|
|
59
|
-
- doc/classes/Hash.src/M000004.html
|
|
60
|
-
- doc/classes/Inflector
|
|
61
|
-
- doc/classes/Inflector/Inflections.html
|
|
62
|
-
- doc/classes/Inflector/Inflections.src
|
|
63
|
-
- doc/classes/Inflector/Inflections.src/M000034.html
|
|
64
|
-
- doc/classes/Inflector/Inflections.src/M000035.html
|
|
65
|
-
- doc/classes/Inflector/Inflections.src/M000036.html
|
|
66
|
-
- doc/classes/Inflector/Inflections.src/M000037.html
|
|
67
|
-
- doc/classes/Inflector/Inflections.src/M000038.html
|
|
68
|
-
- doc/classes/Inflector/Inflections.src/M000039.html
|
|
69
|
-
- doc/classes/Inflector.html
|
|
70
|
-
- doc/classes/Inflector.src
|
|
71
|
-
- doc/classes/Inflector.src/M000020.html
|
|
72
|
-
- doc/classes/Inflector.src/M000021.html
|
|
73
|
-
- doc/classes/Inflector.src/M000022.html
|
|
74
|
-
- doc/classes/Inflector.src/M000023.html
|
|
75
|
-
- doc/classes/Inflector.src/M000024.html
|
|
76
|
-
- doc/classes/Inflector.src/M000025.html
|
|
77
|
-
- doc/classes/Inflector.src/M000026.html
|
|
78
|
-
- doc/classes/Inflector.src/M000027.html
|
|
79
|
-
- doc/classes/Inflector.src/M000028.html
|
|
80
|
-
- doc/classes/Inflector.src/M000029.html
|
|
81
|
-
- doc/classes/Inflector.src/M000030.html
|
|
82
|
-
- doc/classes/Inflector.src/M000031.html
|
|
83
|
-
- doc/classes/Inflector.src/M000032.html
|
|
84
|
-
- doc/classes/Inflector.src/M000033.html
|
|
85
|
-
- doc/classes/Merb
|
|
86
|
-
- doc/classes/Merb/Request.html
|
|
87
|
-
- doc/classes/Merb/Request.src
|
|
88
|
-
- doc/classes/Merb/Request.src/M000041.html
|
|
89
|
-
- doc/classes/Merb.html
|
|
90
|
-
- doc/classes/OAuth
|
|
91
|
-
- doc/classes/OAuth/RequestProxy
|
|
92
|
-
- doc/classes/OAuth/RequestProxy/Base.html
|
|
93
|
-
- doc/classes/OAuth/RequestProxy/Base.src
|
|
94
|
-
- doc/classes/OAuth/RequestProxy/Base.src/M000015.html
|
|
95
|
-
- doc/classes/OAuth/RequestProxy.html
|
|
96
|
-
- doc/classes/OAuth/Signature
|
|
97
|
-
- doc/classes/OAuth/Signature/Base.html
|
|
98
|
-
- doc/classes/OAuth/Signature/Base.src
|
|
99
|
-
- doc/classes/OAuth/Signature/Base.src/M000014.html
|
|
100
|
-
- doc/classes/OAuth/Signature.html
|
|
101
|
-
- doc/classes/OAuth.html
|
|
102
|
-
- doc/classes/OAuthController.html
|
|
103
|
-
- doc/classes/OAuthController.src
|
|
104
|
-
- doc/classes/OAuthController.src/M000008.html
|
|
105
|
-
- doc/classes/OAuthController.src/M000009.html
|
|
106
|
-
- doc/classes/OAuthController.src/M000010.html
|
|
107
|
-
- doc/classes/OAuthController.src/M000011.html
|
|
108
|
-
- doc/classes/OAuthController.src/M000012.html
|
|
109
|
-
- doc/classes/Object.html
|
|
110
|
-
- doc/classes/Object.src
|
|
111
|
-
- doc/classes/Object.src/M000013.html
|
|
112
|
-
- doc/classes/Proc.html
|
|
113
|
-
- doc/classes/Proc.src
|
|
114
|
-
- doc/classes/Proc.src/M000007.html
|
|
115
|
-
- doc/classes/Serialize.html
|
|
116
|
-
- doc/classes/Serialize.src
|
|
117
|
-
- doc/classes/Serialize.src/M000016.html
|
|
118
|
-
- doc/classes/Serialize.src/M000017.html
|
|
119
|
-
- doc/classes/Serialize.src/M000018.html
|
|
120
|
-
- doc/classes/Serialize.src/M000019.html
|
|
121
|
-
- doc/classes/SimpleMapper
|
|
122
|
-
- doc/classes/SimpleMapper/Base.html
|
|
123
|
-
- doc/classes/SimpleMapper/Base.src
|
|
124
|
-
- doc/classes/SimpleMapper/Base.src/M000067.html
|
|
125
|
-
- doc/classes/SimpleMapper/Base.src/M000068.html
|
|
126
|
-
- doc/classes/SimpleMapper/Base.src/M000069.html
|
|
127
|
-
- doc/classes/SimpleMapper/Base.src/M000070.html
|
|
128
|
-
- doc/classes/SimpleMapper/Base.src/M000071.html
|
|
129
|
-
- doc/classes/SimpleMapper/Base.src/M000072.html
|
|
130
|
-
- doc/classes/SimpleMapper/Base.src/M000073.html
|
|
131
|
-
- doc/classes/SimpleMapper/Base.src/M000074.html
|
|
132
|
-
- doc/classes/SimpleMapper/Base.src/M000075.html
|
|
133
|
-
- doc/classes/SimpleMapper/Base.src/M000076.html
|
|
134
|
-
- doc/classes/SimpleMapper/Base.src/M000077.html
|
|
135
|
-
- doc/classes/SimpleMapper/Base.src/M000078.html
|
|
136
|
-
- doc/classes/SimpleMapper/Base.src/M000079.html
|
|
137
|
-
- doc/classes/SimpleMapper/Base.src/M000080.html
|
|
138
|
-
- doc/classes/SimpleMapper/Base.src/M000081.html
|
|
139
|
-
- doc/classes/SimpleMapper/Base.src/M000082.html
|
|
140
|
-
- doc/classes/SimpleMapper/Base.src/M000083.html
|
|
141
|
-
- doc/classes/SimpleMapper/Base.src/M000085.html
|
|
142
|
-
- doc/classes/SimpleMapper/Base.src/M000086.html
|
|
143
|
-
- doc/classes/SimpleMapper/Base.src/M000087.html
|
|
144
|
-
- doc/classes/SimpleMapper/Base.src/M000088.html
|
|
145
|
-
- doc/classes/SimpleMapper/Base.src/M000089.html
|
|
146
|
-
- doc/classes/SimpleMapper/Base.src/M000090.html
|
|
147
|
-
- doc/classes/SimpleMapper/Base.src/M000091.html
|
|
148
|
-
- doc/classes/SimpleMapper/Base.src/M000092.html
|
|
149
|
-
- doc/classes/SimpleMapper/Base.src/M000093.html
|
|
150
|
-
- doc/classes/SimpleMapper/CallbacksExtension.html
|
|
151
|
-
- doc/classes/SimpleMapper/CallbacksExtension.src
|
|
152
|
-
- doc/classes/SimpleMapper/CallbacksExtension.src/M000056.html
|
|
153
|
-
- doc/classes/SimpleMapper/CallbacksExtension.src/M000057.html
|
|
154
|
-
- doc/classes/SimpleMapper/CallbacksExtension.src/M000058.html
|
|
155
|
-
- doc/classes/SimpleMapper/HttpAdapter.html
|
|
156
|
-
- doc/classes/SimpleMapper/HttpAdapter.src
|
|
157
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000059.html
|
|
158
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000060.html
|
|
159
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000061.html
|
|
160
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000063.html
|
|
161
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000064.html
|
|
162
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000065.html
|
|
163
|
-
- doc/classes/SimpleMapper/HttpAdapter.src/M000066.html
|
|
164
|
-
- doc/classes/SimpleMapper/HttpOAuthExtension.html
|
|
165
|
-
- doc/classes/SimpleMapper/HttpOAuthExtension.src
|
|
166
|
-
- doc/classes/SimpleMapper/HttpOAuthExtension.src/M000048.html
|
|
167
|
-
- doc/classes/SimpleMapper/HttpOAuthExtension.src/M000049.html
|
|
168
|
-
- doc/classes/SimpleMapper/HttpOAuthExtension.src/M000050.html
|
|
169
|
-
- doc/classes/SimpleMapper/HttpOAuthExtension.src/M000051.html
|
|
170
|
-
- doc/classes/SimpleMapper/SimpleModel
|
|
171
|
-
- doc/classes/SimpleMapper/SimpleModel/ClassMethods.html
|
|
172
|
-
- doc/classes/SimpleMapper/SimpleModel/ClassMethods.src
|
|
173
|
-
- doc/classes/SimpleMapper/SimpleModel/ClassMethods.src/M000046.html
|
|
174
|
-
- doc/classes/SimpleMapper/SimpleModel/ClassMethods.src/M000047.html
|
|
175
|
-
- doc/classes/SimpleMapper/SimpleModel.html
|
|
176
|
-
- doc/classes/SimpleMapper/SimpleModel.src
|
|
177
|
-
- doc/classes/SimpleMapper/SimpleModel.src/M000042.html
|
|
178
|
-
- doc/classes/SimpleMapper/SimpleModel.src/M000043.html
|
|
179
|
-
- doc/classes/SimpleMapper/SimpleModel.src/M000044.html
|
|
180
|
-
- doc/classes/SimpleMapper/SimpleModel.src/M000045.html
|
|
181
|
-
- doc/classes/SimpleMapper/XmlFormat
|
|
182
|
-
- doc/classes/SimpleMapper/XmlFormat/ClassMethods.html
|
|
183
|
-
- doc/classes/SimpleMapper/XmlFormat/ClassMethods.src
|
|
184
|
-
- doc/classes/SimpleMapper/XmlFormat/ClassMethods.src/M000055.html
|
|
185
|
-
- doc/classes/SimpleMapper/XmlFormat.html
|
|
186
|
-
- doc/classes/SimpleMapper/XmlFormat.src
|
|
187
|
-
- doc/classes/SimpleMapper/XmlFormat.src/M000052.html
|
|
188
|
-
- doc/classes/SimpleMapper/XmlFormat.src/M000053.html
|
|
189
|
-
- doc/classes/SimpleMapper/XmlFormat.src/M000054.html
|
|
190
|
-
- doc/classes/SimpleMapper.html
|
|
191
|
-
- doc/classes/String.html
|
|
192
|
-
- doc/classes/Time.html
|
|
193
|
-
- doc/classes/Time.src
|
|
194
|
-
- doc/classes/Time.src/M000001.html
|
|
195
|
-
- doc/created.rid
|
|
196
|
-
- doc/files
|
|
197
|
-
- doc/files/lib
|
|
198
|
-
- doc/files/lib/simple_mapper
|
|
199
|
-
- doc/files/lib/simple_mapper/adapters
|
|
200
|
-
- doc/files/lib/simple_mapper/adapters/http_adapter_rb.html
|
|
201
|
-
- doc/files/lib/simple_mapper/base_rb.html
|
|
202
|
-
- doc/files/lib/simple_mapper/default_plugins
|
|
203
|
-
- doc/files/lib/simple_mapper/default_plugins/callbacks_rb.html
|
|
204
|
-
- doc/files/lib/simple_mapper/default_plugins/oauth_rb.html
|
|
205
|
-
- doc/files/lib/simple_mapper/default_plugins/options_to_query_rb.html
|
|
206
|
-
- doc/files/lib/simple_mapper/default_plugins/simple_model_rb.html
|
|
207
|
-
- doc/files/lib/simple_mapper/formats
|
|
208
|
-
- doc/files/lib/simple_mapper/formats/xml_format_rb.html
|
|
209
|
-
- doc/files/lib/simple_mapper/support
|
|
210
|
-
- doc/files/lib/simple_mapper/support/bliss_serializer_rb.html
|
|
211
|
-
- doc/files/lib/simple_mapper/support/core_ext_rb.html
|
|
212
|
-
- doc/files/lib/simple_mapper/support/inflections_rb.html
|
|
213
|
-
- doc/files/lib/simple_mapper/support/inflector_rb.html
|
|
214
|
-
- doc/files/lib/simple_mapper/support_rb.html
|
|
215
|
-
- doc/files/lib/simple_mapper_rb.html
|
|
216
|
-
- doc/files/LICENSE.html
|
|
217
|
-
- doc/files/README.html
|
|
218
|
-
- doc/fr_class_index.html
|
|
219
|
-
- doc/fr_file_index.html
|
|
220
|
-
- doc/fr_method_index.html
|
|
221
|
-
- doc/index.html
|
|
222
|
-
- doc/rdoc-style.css
|
|
223
50
|
has_rdoc: true
|
|
224
51
|
homepage: http://simplemapper.rubyforge.org
|
|
225
52
|
post_install_message:
|