simplemapper 0.0.4 → 0.0.5

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