simplemapper 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|