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.
Files changed (151) hide show
  1. data/Rakefile +1 -1
  2. data/lib/simple_mapper/adapters/http_adapter.rb +36 -5
  3. data/lib/simple_mapper/base.rb +5 -175
  4. data/lib/simple_mapper/default_plugins/associations.rb +374 -0
  5. data/lib/simple_mapper/default_plugins/properties.rb +70 -0
  6. data/lib/simple_mapper/persistence.rb +169 -0
  7. data/lib/simple_mapper/plugin_support.rb +19 -0
  8. data/lib/simple_mapper/support.rb +2 -2
  9. data/lib/simple_mapper/support/bliss_serializer.rb +43 -12
  10. data/lib/simple_mapper/support/core_ext.rb +23 -2
  11. metadata +6 -179
  12. data/doc/classes/Array.html +0 -158
  13. data/doc/classes/Array.src/M000005.html +0 -18
  14. data/doc/classes/Array.src/M000006.html +0 -34
  15. data/doc/classes/Enumerable.html +0 -131
  16. data/doc/classes/Enumerable.src/M000040.html +0 -21
  17. data/doc/classes/Hash.html +0 -173
  18. data/doc/classes/Hash.src/M000002.html +0 -20
  19. data/doc/classes/Hash.src/M000003.html +0 -18
  20. data/doc/classes/Hash.src/M000004.html +0 -34
  21. data/doc/classes/Inflector.html +0 -516
  22. data/doc/classes/Inflector.src/M000020.html +0 -22
  23. data/doc/classes/Inflector.src/M000021.html +0 -25
  24. data/doc/classes/Inflector.src/M000022.html +0 -25
  25. data/doc/classes/Inflector.src/M000023.html +0 -22
  26. data/doc/classes/Inflector.src/M000024.html +0 -18
  27. data/doc/classes/Inflector.src/M000025.html +0 -22
  28. data/doc/classes/Inflector.src/M000026.html +0 -18
  29. data/doc/classes/Inflector.src/M000027.html +0 -18
  30. data/doc/classes/Inflector.src/M000028.html +0 -18
  31. data/doc/classes/Inflector.src/M000029.html +0 -18
  32. data/doc/classes/Inflector.src/M000030.html +0 -19
  33. data/doc/classes/Inflector.src/M000031.html +0 -18
  34. data/doc/classes/Inflector.src/M000032.html +0 -22
  35. data/doc/classes/Inflector.src/M000033.html +0 -27
  36. data/doc/classes/Inflector/Inflections.html +0 -323
  37. data/doc/classes/Inflector/Inflections.src/M000034.html +0 -18
  38. data/doc/classes/Inflector/Inflections.src/M000035.html +0 -18
  39. data/doc/classes/Inflector/Inflections.src/M000036.html +0 -18
  40. data/doc/classes/Inflector/Inflections.src/M000037.html +0 -19
  41. data/doc/classes/Inflector/Inflections.src/M000038.html +0 -18
  42. data/doc/classes/Inflector/Inflections.src/M000039.html +0 -23
  43. data/doc/classes/Merb.html +0 -111
  44. data/doc/classes/Merb/Request.html +0 -139
  45. data/doc/classes/Merb/Request.src/M000041.html +0 -22
  46. data/doc/classes/OAuth.html +0 -112
  47. data/doc/classes/OAuth/RequestProxy.html +0 -111
  48. data/doc/classes/OAuth/RequestProxy/Base.html +0 -139
  49. data/doc/classes/OAuth/RequestProxy/Base.src/M000015.html +0 -18
  50. data/doc/classes/OAuth/Signature.html +0 -111
  51. data/doc/classes/OAuth/Signature/Base.html +0 -139
  52. data/doc/classes/OAuth/Signature/Base.src/M000014.html +0 -25
  53. data/doc/classes/OAuthController.html +0 -243
  54. data/doc/classes/OAuthController.src/M000008.html +0 -22
  55. data/doc/classes/OAuthController.src/M000009.html +0 -18
  56. data/doc/classes/OAuthController.src/M000010.html +0 -18
  57. data/doc/classes/OAuthController.src/M000011.html +0 -25
  58. data/doc/classes/OAuthController.src/M000012.html +0 -19
  59. data/doc/classes/Object.html +0 -154
  60. data/doc/classes/Object.src/M000013.html +0 -19
  61. data/doc/classes/Proc.html +0 -143
  62. data/doc/classes/Proc.src/M000007.html +0 -18
  63. data/doc/classes/Serialize.html +0 -189
  64. data/doc/classes/Serialize.src/M000016.html +0 -21
  65. data/doc/classes/Serialize.src/M000017.html +0 -39
  66. data/doc/classes/Serialize.src/M000018.html +0 -16
  67. data/doc/classes/Serialize.src/M000019.html +0 -18
  68. data/doc/classes/SimpleMapper.html +0 -151
  69. data/doc/classes/SimpleMapper/Base.html +0 -621
  70. data/doc/classes/SimpleMapper/Base.src/M000067.html +0 -16
  71. data/doc/classes/SimpleMapper/Base.src/M000068.html +0 -16
  72. data/doc/classes/SimpleMapper/Base.src/M000069.html +0 -18
  73. data/doc/classes/SimpleMapper/Base.src/M000070.html +0 -29
  74. data/doc/classes/SimpleMapper/Base.src/M000071.html +0 -18
  75. data/doc/classes/SimpleMapper/Base.src/M000072.html +0 -21
  76. data/doc/classes/SimpleMapper/Base.src/M000073.html +0 -18
  77. data/doc/classes/SimpleMapper/Base.src/M000074.html +0 -27
  78. data/doc/classes/SimpleMapper/Base.src/M000075.html +0 -21
  79. data/doc/classes/SimpleMapper/Base.src/M000076.html +0 -18
  80. data/doc/classes/SimpleMapper/Base.src/M000077.html +0 -18
  81. data/doc/classes/SimpleMapper/Base.src/M000078.html +0 -19
  82. data/doc/classes/SimpleMapper/Base.src/M000079.html +0 -23
  83. data/doc/classes/SimpleMapper/Base.src/M000080.html +0 -21
  84. data/doc/classes/SimpleMapper/Base.src/M000081.html +0 -18
  85. data/doc/classes/SimpleMapper/Base.src/M000082.html +0 -19
  86. data/doc/classes/SimpleMapper/Base.src/M000083.html +0 -18
  87. data/doc/classes/SimpleMapper/Base.src/M000085.html +0 -18
  88. data/doc/classes/SimpleMapper/Base.src/M000086.html +0 -19
  89. data/doc/classes/SimpleMapper/Base.src/M000087.html +0 -18
  90. data/doc/classes/SimpleMapper/Base.src/M000088.html +0 -18
  91. data/doc/classes/SimpleMapper/Base.src/M000089.html +0 -18
  92. data/doc/classes/SimpleMapper/Base.src/M000090.html +0 -19
  93. data/doc/classes/SimpleMapper/Base.src/M000091.html +0 -20
  94. data/doc/classes/SimpleMapper/Base.src/M000092.html +0 -24
  95. data/doc/classes/SimpleMapper/Base.src/M000093.html +0 -18
  96. data/doc/classes/SimpleMapper/CallbacksExtension.html +0 -161
  97. data/doc/classes/SimpleMapper/CallbacksExtension.src/M000056.html +0 -18
  98. data/doc/classes/SimpleMapper/CallbacksExtension.src/M000057.html +0 -18
  99. data/doc/classes/SimpleMapper/CallbacksExtension.src/M000058.html +0 -19
  100. data/doc/classes/SimpleMapper/HttpAdapter.html +0 -289
  101. data/doc/classes/SimpleMapper/HttpAdapter.src/M000059.html +0 -18
  102. data/doc/classes/SimpleMapper/HttpAdapter.src/M000060.html +0 -18
  103. data/doc/classes/SimpleMapper/HttpAdapter.src/M000061.html +0 -19
  104. data/doc/classes/SimpleMapper/HttpAdapter.src/M000063.html +0 -19
  105. data/doc/classes/SimpleMapper/HttpAdapter.src/M000064.html +0 -18
  106. data/doc/classes/SimpleMapper/HttpAdapter.src/M000065.html +0 -18
  107. data/doc/classes/SimpleMapper/HttpAdapter.src/M000066.html +0 -18
  108. data/doc/classes/SimpleMapper/HttpOAuthExtension.html +0 -188
  109. data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000048.html +0 -47
  110. data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000049.html +0 -21
  111. data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000050.html +0 -18
  112. data/doc/classes/SimpleMapper/HttpOAuthExtension.src/M000051.html +0 -24
  113. data/doc/classes/SimpleMapper/SimpleModel.html +0 -184
  114. data/doc/classes/SimpleMapper/SimpleModel.src/M000042.html +0 -18
  115. data/doc/classes/SimpleMapper/SimpleModel.src/M000043.html +0 -18
  116. data/doc/classes/SimpleMapper/SimpleModel.src/M000044.html +0 -18
  117. data/doc/classes/SimpleMapper/SimpleModel.src/M000045.html +0 -24
  118. data/doc/classes/SimpleMapper/SimpleModel/ClassMethods.html +0 -146
  119. data/doc/classes/SimpleMapper/SimpleModel/ClassMethods.src/M000046.html +0 -19
  120. data/doc/classes/SimpleMapper/SimpleModel/ClassMethods.src/M000047.html +0 -19
  121. data/doc/classes/SimpleMapper/XmlFormat.html +0 -169
  122. data/doc/classes/SimpleMapper/XmlFormat.src/M000052.html +0 -18
  123. data/doc/classes/SimpleMapper/XmlFormat.src/M000053.html +0 -18
  124. data/doc/classes/SimpleMapper/XmlFormat.src/M000054.html +0 -20
  125. data/doc/classes/SimpleMapper/XmlFormat/ClassMethods.html +0 -152
  126. data/doc/classes/SimpleMapper/XmlFormat/ClassMethods.src/M000055.html +0 -32
  127. data/doc/classes/String.html +0 -120
  128. data/doc/classes/Time.html +0 -139
  129. data/doc/classes/Time.src/M000001.html +0 -18
  130. data/doc/created.rid +0 -1
  131. data/doc/files/LICENSE.html +0 -129
  132. data/doc/files/README.html +0 -130
  133. data/doc/files/lib/simple_mapper/adapters/http_adapter_rb.html +0 -111
  134. data/doc/files/lib/simple_mapper/base_rb.html +0 -108
  135. data/doc/files/lib/simple_mapper/default_plugins/callbacks_rb.html +0 -101
  136. data/doc/files/lib/simple_mapper/default_plugins/oauth_rb.html +0 -110
  137. data/doc/files/lib/simple_mapper/default_plugins/options_to_query_rb.html +0 -116
  138. data/doc/files/lib/simple_mapper/default_plugins/simple_model_rb.html +0 -101
  139. data/doc/files/lib/simple_mapper/formats/xml_format_rb.html +0 -110
  140. data/doc/files/lib/simple_mapper/support/bliss_serializer_rb.html +0 -110
  141. data/doc/files/lib/simple_mapper/support/core_ext_rb.html +0 -108
  142. data/doc/files/lib/simple_mapper/support/inflections_rb.html +0 -101
  143. data/doc/files/lib/simple_mapper/support/inflector_rb.html +0 -108
  144. data/doc/files/lib/simple_mapper/support_rb.html +0 -109
  145. data/doc/files/lib/simple_mapper_rb.html +0 -137
  146. data/doc/fr_class_index.html +0 -53
  147. data/doc/fr_file_index.html +0 -41
  148. data/doc/fr_method_index.html +0 -119
  149. data/doc/index.html +0 -24
  150. data/doc/rdoc-style.css +0 -208
  151. 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 'simple_mapper/support/core_ext'
2
- require 'simple_mapper/support/inflector'
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 => :attribute, # Can be false, :element, or :attribute
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 => 'id', # Default 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
- to_xml(obj.class.name.underscore, obj.to_hash(options), options)
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(root, attributes={}, options={})
25
+ def self.to_xml(attributes={}, options={})
19
26
  options = XML_OPTIONS.merge(options)
20
- attributes = attributes.dup.stringify_keys!
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(/"/, '&quot;')}"] 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
- node = root_element.add_element(key)
36
- node << REXML::Text.new(value.to_s) unless value.nil?
37
- node.add_attribute('nil', 'true') if value.nil? && options[:report_nil]
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.each_key {|k| self[k.to_s] = self.delete(k)}
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
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-03-20 00:00:00 -04:00
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/simple_model.rb
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: