simplemapper 0.0.5 → 0.0.6
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.rb +1 -1
- data/lib/simple_mapper/adapters/http_adapter.rb +2 -1
- data/lib/simple_mapper/base.rb +2 -4
- data/lib/simple_mapper/default_plugins/oauth.rb +4 -2
- data/lib/simple_mapper/default_plugins/properties.rb +1 -1
- data/lib/simple_mapper/formats/json_format.rb +50 -0
- data/lib/simple_mapper/formats/xml_format.rb +14 -10
- data/lib/simple_mapper/persistence.rb +9 -5
- data/lib/simple_mapper/support/bliss_serializer.rb +38 -5
- metadata +3 -2
data/Rakefile
CHANGED
data/lib/simple_mapper.rb
CHANGED
@@ -13,4 +13,4 @@
|
|
13
13
|
# "finder" options, like converting an options hash to a sql SELECT request, or mapping an options hash to an HTTP request.
|
14
14
|
# It is purposed to make it as light and simple as possible to plug these in.
|
15
15
|
|
16
|
-
require 'simple_mapper/base'
|
16
|
+
require File.expand_path(File.dirname(__FILE__) + '/simple_mapper/base')
|
@@ -87,7 +87,8 @@ module SimpleMapper
|
|
87
87
|
request.body = body
|
88
88
|
request.initialize_http_header headers.merge(options[:headers] || {})
|
89
89
|
# - - - after_request_instantiate callback
|
90
|
-
|
90
|
+
res = run_callback('initialize_request', request)
|
91
|
+
request = res if res.is_a?(request.class)
|
91
92
|
# - - -
|
92
93
|
request
|
93
94
|
end
|
data/lib/simple_mapper/base.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
require File.expand_path('
|
2
|
-
require File.expand_path('simple_mapper/plugin_support')
|
3
|
-
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/persistence')
|
4
2
|
module SimpleMapper
|
5
3
|
class Base
|
6
4
|
def self.inherited(klass)
|
7
|
-
klass.send(:include, SimpleMapper::Persistence)
|
8
5
|
SimpleMapper::Persistence::prepare_for_inheritance(klass)
|
6
|
+
klass.send(:include, SimpleMapper::Persistence)
|
9
7
|
end
|
10
8
|
end
|
11
9
|
end
|
@@ -2,6 +2,8 @@ gem 'oauth'
|
|
2
2
|
require 'oauth'
|
3
3
|
require 'oauth/consumer'
|
4
4
|
require 'oauth/client/net_http'
|
5
|
+
|
6
|
+
# First some fixes...
|
5
7
|
module OAuth
|
6
8
|
module Signature
|
7
9
|
class Base
|
@@ -28,7 +30,7 @@ module OAuth
|
|
28
30
|
end
|
29
31
|
|
30
32
|
module SimpleMapper
|
31
|
-
module
|
33
|
+
module Oauth
|
32
34
|
def requires_oauth(consumer_key, consumer_secret, options={})
|
33
35
|
@consumer_key = consumer_key
|
34
36
|
@consumer_secret = consumer_secret
|
@@ -64,7 +66,7 @@ module SimpleMapper
|
|
64
66
|
end
|
65
67
|
|
66
68
|
class HttpAdapter
|
67
|
-
include
|
69
|
+
include Oauth
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
@@ -43,7 +43,7 @@ module SimpleMapper
|
|
43
43
|
# way you want. For example, you could set the data to some other object type, or to a Marshalled storage.
|
44
44
|
# The type of data you receive will depend on the format and parser you use. Of course you could make up
|
45
45
|
# your own spin-off of one of those, too.
|
46
|
-
def data=(
|
46
|
+
def data=(data)
|
47
47
|
raise TypeError, "data must be a hash" unless data.is_a?(Hash)
|
48
48
|
data.each {|k,v| instance_variable_set("@#{k}", v)}
|
49
49
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'simple_mapper/support/bliss_serializer'
|
2
|
+
require 'rubygems'
|
3
|
+
gem 'formattedstring'
|
4
|
+
require 'formatted_string'
|
5
|
+
|
6
|
+
module SimpleMapper
|
7
|
+
module JsonFormat
|
8
|
+
def self.included(base)
|
9
|
+
base.extend ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.mime_type_headers
|
13
|
+
{'Accept' => 'application/json', 'Content-type' => 'application/json'}
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json
|
17
|
+
json = Serialize.object_to_json(self, :key_name => 'self').to_s
|
18
|
+
# puts "POST JSON: #{json}"
|
19
|
+
json
|
20
|
+
end
|
21
|
+
|
22
|
+
module ClassMethods
|
23
|
+
# This assumes a standard json format:
|
24
|
+
# {'person':{'attribute':'','another_att':'value'}}
|
25
|
+
# And for a collection of objects:
|
26
|
+
# {'people':[{'person':{'attribute':'','another_att':'value 1'}},{'person':{'attribute':'','another_att':'value'}}]}
|
27
|
+
def from_json(json)
|
28
|
+
doc = Serialize.hash_from_json(json)
|
29
|
+
# doc could include a single 'model' element, or a 'models' wrapper around several.
|
30
|
+
puts "Top-level JSON key(s): #{doc.keys.inspect}" if @debug
|
31
|
+
if doc.is_a?(Hash)
|
32
|
+
key = doc.keys.first
|
33
|
+
if doc[key] && doc[key].keys.uniq == [key.singularize] && doc[key][key.singularize].is_a?(Array)
|
34
|
+
puts "Several objects returned under key '#{key}'/'#{key.singularize}':" if @debug
|
35
|
+
doc[key][key.singularize].collect do |e|
|
36
|
+
puts "Obj: #{e.inspect}" if @debug
|
37
|
+
Object.module_eval("::#{key.singularize.camelize}", __FILE__, __LINE__).load(e)
|
38
|
+
end
|
39
|
+
elsif doc[key] # top-level must be single object
|
40
|
+
Object.module_eval("::#{key.singularize.camelize}", __FILE__, __LINE__).load(doc[self.name.underscore])
|
41
|
+
else
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
else # doc isn't a hash, probably nil
|
45
|
+
doc
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -37,17 +37,21 @@ module SimpleMapper
|
|
37
37
|
doc = Serialize.hash_from_xml(xml)
|
38
38
|
# doc could include a single 'model' element, or a 'models' wrapper around several.
|
39
39
|
puts "Top-level XML key(s): #{doc.keys.inspect}" if @debug
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
if doc.is_a?(Hash)
|
41
|
+
key = doc.keys.first
|
42
|
+
if doc[key] && doc[key].keys.uniq == [key.singularize] && doc[key][key.singularize].is_a?(Array)
|
43
|
+
puts "Several objects returned under key '#{key}'/'#{key.singularize}':" if @debug
|
44
|
+
doc[key][key.singularize].collect do |e|
|
45
|
+
puts "Obj: #{e.inspect}" if @debug
|
46
|
+
Object.module_eval("::#{key.singularize.camelize}", __FILE__, __LINE__).load(e)
|
47
|
+
end
|
48
|
+
elsif doc[key] # top-level must be single object
|
49
|
+
Object.module_eval("::#{key.singularize.camelize}", __FILE__, __LINE__).load(doc[self.name.underscore])
|
50
|
+
else
|
51
|
+
nil
|
46
52
|
end
|
47
|
-
|
48
|
-
|
49
|
-
else
|
50
|
-
nil
|
53
|
+
else # doc isn't a hash, probably nil
|
54
|
+
doc
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
@@ -1,10 +1,14 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/support')
|
1
2
|
module SimpleMapper
|
2
3
|
module Persistence
|
3
|
-
include PluginSupport
|
4
|
-
|
5
4
|
# TODO: Write in inheritability for models. Should this instead be a place that plugins can plug in a callback?
|
6
5
|
def self.prepare_for_inheritance(klass)
|
7
|
-
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.included(klass)
|
9
|
+
klass.extend ClassMethods
|
10
|
+
require File.expand_path(File.dirname(__FILE__) + '/plugin_support')
|
11
|
+
klass.send(:include, SimpleMapper::PluginSupport)
|
8
12
|
end
|
9
13
|
|
10
14
|
module ClassMethods
|
@@ -83,7 +87,7 @@ module SimpleMapper
|
|
83
87
|
end
|
84
88
|
|
85
89
|
def extract_from(formatted_data)
|
86
|
-
objs = send("from_#{format_name}"
|
90
|
+
objs = send(:"from_#{format_name}", formatted_data)
|
87
91
|
objs.is_a?(Array) ? objs.collect {|e| e.extended {@persisted = true}} : objs.extended {@persisted = true}
|
88
92
|
end
|
89
93
|
|
@@ -98,8 +102,8 @@ module SimpleMapper
|
|
98
102
|
|
99
103
|
def load(data=nil)
|
100
104
|
obj = allocate
|
101
|
-
obj.original_data = data
|
102
105
|
obj.send(:initialize, data)
|
106
|
+
obj.original_data = data
|
103
107
|
obj
|
104
108
|
end
|
105
109
|
|
@@ -48,7 +48,7 @@ module Serialize
|
|
48
48
|
if value.respond_to?(:to_xml)
|
49
49
|
assoc_options = {}
|
50
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))
|
51
|
+
root_element.add_element(REXML::Document.new(value.to_xml(assoc_options.merge(:root => key.to_s)).to_s))
|
52
52
|
else
|
53
53
|
root_element.add_element(key.to_s) << REXML::Text.new(value.to_s.dup)
|
54
54
|
end
|
@@ -57,16 +57,43 @@ module Serialize
|
|
57
57
|
|
58
58
|
root ? doc.to_s : doc.children[0].children.to_s
|
59
59
|
end
|
60
|
-
|
61
60
|
def self.hash_from_xml(xml,options={})
|
62
|
-
xml.formatted(:xml).to_hash
|
61
|
+
xml.to_s.formatted(:xml).to_hash
|
62
|
+
end
|
63
|
+
|
64
|
+
JSON_OPTIONS = {
|
65
|
+
:include_key => false, # Can be true or false
|
66
|
+
:key_name => :id, # Default key name
|
67
|
+
:instance_columns => :visible_properties,
|
68
|
+
:class_columns => :visible_properties,
|
69
|
+
}
|
70
|
+
def self.object_to_json(obj, options={})
|
71
|
+
# Automatically set the key_name for DataMapper objects
|
72
|
+
options.merge!(:key_name => obj.class.table.key.name) if obj.class.respond_to?(:table) && obj.class.respond_to?(:persistent?) && obj.class.persistent?
|
73
|
+
# Should do the above also for ActiveRecord...
|
74
|
+
options = options.reverse_merge!(obj.class.json_options) if obj.class.respond_to?(:json_options)
|
75
|
+
options = options.reverse_merge!(obj.json_options) if obj.respond_to?(:json_options)
|
76
|
+
to_json(obj.to_hash(options), {:root => Inflector.underscore(obj.class.name)}.merge(options))
|
77
|
+
end
|
78
|
+
def self.to_json(attributes={}, options={})
|
79
|
+
# max-results=25 || limit=25
|
80
|
+
# start-index=26 || offset=26
|
81
|
+
raise NotImplemented
|
82
|
+
options = JSON_OPTIONS.merge(options)
|
83
|
+
root = options[:root]
|
84
|
+
options[:exclude] = [options[:exclude]].flatten.compact.collect {|e| e.to_s}
|
85
|
+
attributes.reject! {|k,v| options[:exclude].include?(k)}
|
86
|
+
end
|
87
|
+
def self.hash_from_json(json,options={})
|
88
|
+
json.to_s.formatted(:json).to_hash
|
63
89
|
end
|
64
90
|
end
|
65
91
|
|
66
92
|
class Hash
|
67
93
|
def to_xml(options={})
|
68
|
-
options[:root] = keys.length == 1
|
69
|
-
|
94
|
+
options[:root] = keys[0] if keys.length == 1 && (!options.has_key?(:root) || options[:root].to_s == '')
|
95
|
+
options[:root] = 'xml' if options[:root].to_s == ''
|
96
|
+
Serialize.to_xml(self.slashed, options)
|
70
97
|
end
|
71
98
|
end
|
72
99
|
|
@@ -76,6 +103,12 @@ class Array
|
|
76
103
|
end
|
77
104
|
end
|
78
105
|
|
106
|
+
class Time
|
107
|
+
def to_xml
|
108
|
+
xmlschema
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
79
112
|
module Merb
|
80
113
|
class Request
|
81
114
|
def xml_params
|
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.6
|
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-05-09 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib/simple_mapper/default_plugins/options_to_query.rb
|
35
35
|
- lib/simple_mapper/default_plugins/properties.rb
|
36
36
|
- lib/simple_mapper/formats
|
37
|
+
- lib/simple_mapper/formats/json_format.rb
|
37
38
|
- lib/simple_mapper/formats/xml_format.rb
|
38
39
|
- lib/simple_mapper/persistence.rb
|
39
40
|
- lib/simple_mapper/plugin_support.rb
|