dm-serializer 1.1.0.rc2 → 1.1.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/dm-serializer.gemspec +13 -13
- data/lib/dm-serializer.rb +10 -0
- data/lib/dm-serializer/common.rb +10 -17
- data/lib/dm-serializer/to_csv.rb +18 -10
- data/lib/dm-serializer/to_json.rb +17 -11
- data/lib/dm-serializer/to_xml.rb +50 -22
- data/lib/dm-serializer/to_yaml.rb +14 -11
- data/lib/dm-serializer/xml.rb +56 -0
- data/lib/dm-serializer/{xml_serializers → xml}/libxml.rb +8 -2
- data/lib/dm-serializer/{xml_serializers → xml}/nokogiri.rb +11 -3
- data/lib/dm-serializer/{xml_serializers → xml}/rexml.rb +9 -3
- data/spec/public/to_json_spec.rb +2 -2
- data/spec/public/to_xml_spec.rb +10 -17
- data/spec/public/to_yaml_spec.rb +1 -1
- data/spec/spec_helper.rb +6 -0
- metadata +9 -9
- data/lib/dm-serializer/xml_serializers.rb +0 -17
data/Gemfile
CHANGED
@@ -5,7 +5,7 @@ source 'http://rubygems.org'
|
|
5
5
|
SOURCE = ENV.fetch('SOURCE', :git).to_sym
|
6
6
|
REPO_POSTFIX = SOURCE == :path ? '' : '.git'
|
7
7
|
DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/datamapper'
|
8
|
-
DM_VERSION = '~> 1.1.0.
|
8
|
+
DM_VERSION = '~> 1.1.0.rc3'
|
9
9
|
DO_VERSION = '~> 0.10.2'
|
10
10
|
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
11
11
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.0.
|
1
|
+
1.1.0.rc3
|
data/dm-serializer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-serializer}
|
8
|
-
s.version = "1.1.0.
|
8
|
+
s.version = "1.1.0.rc3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Guy van den Berg"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-10}
|
13
13
|
s.description = %q{DataMapper plugin for serializing Resources and Collections}
|
14
14
|
s.email = %q{vandenberg.guy [a] gmail [d] com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -33,10 +33,10 @@ Gem::Specification.new do |s|
|
|
33
33
|
"lib/dm-serializer/to_json.rb",
|
34
34
|
"lib/dm-serializer/to_xml.rb",
|
35
35
|
"lib/dm-serializer/to_yaml.rb",
|
36
|
-
"lib/dm-serializer/
|
37
|
-
"lib/dm-serializer/
|
38
|
-
"lib/dm-serializer/
|
39
|
-
"lib/dm-serializer/
|
36
|
+
"lib/dm-serializer/xml.rb",
|
37
|
+
"lib/dm-serializer/xml/libxml.rb",
|
38
|
+
"lib/dm-serializer/xml/nokogiri.rb",
|
39
|
+
"lib/dm-serializer/xml/rexml.rb",
|
40
40
|
"spec/fixtures/cow.rb",
|
41
41
|
"spec/fixtures/planet.rb",
|
42
42
|
"spec/fixtures/quan_tum_cat.rb",
|
@@ -57,7 +57,7 @@ Gem::Specification.new do |s|
|
|
57
57
|
s.homepage = %q{http://github.com/datamapper/dm-serializer}
|
58
58
|
s.require_paths = ["lib"]
|
59
59
|
s.rubyforge_project = %q{datamapper}
|
60
|
-
s.rubygems_version = %q{1.
|
60
|
+
s.rubygems_version = %q{1.6.2}
|
61
61
|
s.summary = %q{DataMapper plugin for serializing Resources and Collections}
|
62
62
|
s.test_files = [
|
63
63
|
"spec/fixtures/cow.rb",
|
@@ -77,27 +77,27 @@ Gem::Specification.new do |s|
|
|
77
77
|
s.specification_version = 3
|
78
78
|
|
79
79
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
80
|
-
s.add_runtime_dependency(%q<dm-core>, ["~> 1.1.0.
|
80
|
+
s.add_runtime_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
|
81
81
|
s.add_runtime_dependency(%q<fastercsv>, ["~> 1.5.4"])
|
82
82
|
s.add_runtime_dependency(%q<json>, ["~> 1.4.6"])
|
83
|
-
s.add_development_dependency(%q<dm-validations>, ["~> 1.1.0.
|
83
|
+
s.add_development_dependency(%q<dm-validations>, ["~> 1.1.0.rc3"])
|
84
84
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
85
85
|
s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
|
86
86
|
s.add_development_dependency(%q<rspec>, ["~> 1.3.1"])
|
87
87
|
else
|
88
|
-
s.add_dependency(%q<dm-core>, ["~> 1.1.0.
|
88
|
+
s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
|
89
89
|
s.add_dependency(%q<fastercsv>, ["~> 1.5.4"])
|
90
90
|
s.add_dependency(%q<json>, ["~> 1.4.6"])
|
91
|
-
s.add_dependency(%q<dm-validations>, ["~> 1.1.0.
|
91
|
+
s.add_dependency(%q<dm-validations>, ["~> 1.1.0.rc3"])
|
92
92
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
93
93
|
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
94
94
|
s.add_dependency(%q<rspec>, ["~> 1.3.1"])
|
95
95
|
end
|
96
96
|
else
|
97
|
-
s.add_dependency(%q<dm-core>, ["~> 1.1.0.
|
97
|
+
s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
|
98
98
|
s.add_dependency(%q<fastercsv>, ["~> 1.5.4"])
|
99
99
|
s.add_dependency(%q<json>, ["~> 1.4.6"])
|
100
|
-
s.add_dependency(%q<dm-validations>, ["~> 1.1.0.
|
100
|
+
s.add_dependency(%q<dm-validations>, ["~> 1.1.0.rc3"])
|
101
101
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
102
102
|
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
103
103
|
s.add_dependency(%q<rspec>, ["~> 1.3.1"])
|
data/lib/dm-serializer.rb
CHANGED
@@ -2,3 +2,13 @@ require 'dm-serializer/to_json'
|
|
2
2
|
require 'dm-serializer/to_xml'
|
3
3
|
require 'dm-serializer/to_yaml'
|
4
4
|
require 'dm-serializer/to_csv'
|
5
|
+
|
6
|
+
module DataMapper
|
7
|
+
# Define the `Serialize` constant for backwards compatibility.
|
8
|
+
#
|
9
|
+
# @note
|
10
|
+
# The `Serialize` constant will be removed soon, please use
|
11
|
+
# {Serializer} instead.
|
12
|
+
#
|
13
|
+
Serialize = Serializer
|
14
|
+
end
|
data/lib/dm-serializer/common.rb
CHANGED
@@ -1,25 +1,16 @@
|
|
1
|
-
begin
|
2
|
-
require 'active_support/ordered_hash'
|
3
|
-
rescue LoadError
|
4
|
-
require 'extlib/dictionary'
|
5
|
-
module ActiveSupport
|
6
|
-
OrderedHash = Dictionary unless defined?(OrderedHash)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
1
|
require 'dm-core'
|
11
2
|
|
12
3
|
module DataMapper
|
13
|
-
module
|
14
|
-
|
4
|
+
module Serializer
|
15
5
|
def self.dm_validations_loaded?
|
16
6
|
DataMapper.const_defined?("Validations")
|
17
7
|
end
|
18
8
|
|
19
|
-
# Returns propreties to serialize based on :only or :exclude arrays,
|
20
|
-
# :only takes precendence over :exclude
|
9
|
+
# Returns propreties to serialize based on :only or :exclude arrays,
|
10
|
+
# if provided :only takes precendence over :exclude
|
21
11
|
#
|
22
|
-
# @return
|
12
|
+
# @return [Array]
|
13
|
+
# Properties that need to be serialized.
|
23
14
|
def properties_to_serialize(options)
|
24
15
|
only_properties = Array(options[:only])
|
25
16
|
excluded_properties = Array(options[:exclude])
|
@@ -28,11 +19,13 @@ module DataMapper
|
|
28
19
|
if only_properties.include? p.name
|
29
20
|
false
|
30
21
|
else
|
31
|
-
excluded_properties.include?(p.name) ||
|
22
|
+
excluded_properties.include?(p.name) ||
|
23
|
+
!(only_properties.empty? ||
|
24
|
+
only_properties.include?(p.name))
|
32
25
|
end
|
33
26
|
end
|
34
27
|
end
|
35
|
-
|
36
28
|
end
|
37
|
-
|
29
|
+
|
30
|
+
Model.append_inclusions(Serializer)
|
38
31
|
end
|
data/lib/dm-serializer/to_csv.rb
CHANGED
@@ -13,13 +13,17 @@ else
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module DataMapper
|
16
|
-
module
|
16
|
+
module Serializer
|
17
17
|
# Serialize a Resource to comma-separated values (CSV).
|
18
18
|
#
|
19
19
|
# @return <String> a CSV representation of the Resource
|
20
|
-
def to_csv(
|
21
|
-
|
22
|
-
|
20
|
+
def to_csv(*args)
|
21
|
+
options = args.first || {}
|
22
|
+
options = options.to_h if options.respond_to?(:to_h)
|
23
|
+
options[:writer] = '' unless options.has_key? :writer
|
24
|
+
|
25
|
+
CSV.generate(options[:writer]) do |csv|
|
26
|
+
row = properties_to_serialize(options).map do |property|
|
23
27
|
__send__(property.name).to_s
|
24
28
|
end
|
25
29
|
csv << row
|
@@ -28,8 +32,12 @@ module DataMapper
|
|
28
32
|
|
29
33
|
module ValidationErrors
|
30
34
|
module ToCsv
|
31
|
-
def to_csv(
|
32
|
-
|
35
|
+
def to_csv(*args)
|
36
|
+
options = args.first || {}
|
37
|
+
options = options.to_h if options.respond_to?(:to_h)
|
38
|
+
options[:writer] = '' unless options.has_key? :writer
|
39
|
+
|
40
|
+
CSV.generate(options[:writer]) do |csv|
|
33
41
|
errors.each do |key, value|
|
34
42
|
value.each do |error|
|
35
43
|
row = []
|
@@ -45,20 +53,20 @@ module DataMapper
|
|
45
53
|
end
|
46
54
|
|
47
55
|
class Collection
|
48
|
-
def to_csv
|
56
|
+
def to_csv(*args)
|
49
57
|
result = ''
|
50
58
|
each do |item|
|
51
|
-
result << item.to_csv + "\n"
|
59
|
+
result << item.to_csv(args.first) + "\n"
|
52
60
|
end
|
53
61
|
result
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
|
-
if
|
65
|
+
if Serializer.dm_validations_loaded?
|
58
66
|
|
59
67
|
module Validations
|
60
68
|
class ValidationErrors
|
61
|
-
include DataMapper::
|
69
|
+
include DataMapper::Serializer::ValidationErrors::ToCsv
|
62
70
|
end
|
63
71
|
end
|
64
72
|
|
@@ -3,7 +3,7 @@ require 'dm-serializer/common'
|
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module DataMapper
|
6
|
-
module
|
6
|
+
module Serializer
|
7
7
|
#
|
8
8
|
# Converts the resource into a hash of properties.
|
9
9
|
#
|
@@ -31,13 +31,19 @@ module DataMapper
|
|
31
31
|
result[method] = __send__(method)
|
32
32
|
end
|
33
33
|
|
34
|
-
# Note: if you want to include a whole other model via relation, use
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
# Note: if you want to include a whole other model via relation, use
|
35
|
+
# :methods:
|
36
|
+
#
|
37
|
+
# comments.to_json(:relationships=>{:user=>{:include=>[:first_name],:methods=>[:age]}})
|
38
|
+
#
|
39
|
+
# TODO: This needs tests and also needs to be ported to #to_xml and
|
40
|
+
# #to_yaml
|
41
|
+
if options[:relationships]
|
42
|
+
options[:relationships].each do |relationship_name, opts|
|
43
|
+
if respond_to?(relationship_name)
|
44
|
+
result[relationship_name] = __send__(relationship_name).to_json(opts.merge(:to_json => false))
|
45
|
+
end
|
46
|
+
end
|
41
47
|
end
|
42
48
|
|
43
49
|
result
|
@@ -63,7 +69,7 @@ module DataMapper
|
|
63
69
|
module ValidationErrors
|
64
70
|
module ToJson
|
65
71
|
def to_json(*args)
|
66
|
-
|
72
|
+
DataMapper::Ext::Array.to_hash(errors).to_json
|
67
73
|
end
|
68
74
|
end
|
69
75
|
end
|
@@ -87,11 +93,11 @@ module DataMapper
|
|
87
93
|
end
|
88
94
|
end
|
89
95
|
|
90
|
-
if
|
96
|
+
if Serializer.dm_validations_loaded?
|
91
97
|
|
92
98
|
module Validations
|
93
99
|
class ValidationErrors
|
94
|
-
include DataMapper::
|
100
|
+
include DataMapper::Serializer::ValidationErrors::ToJson
|
95
101
|
end
|
96
102
|
end
|
97
103
|
|
data/lib/dm-serializer/to_xml.rb
CHANGED
@@ -1,31 +1,46 @@
|
|
1
1
|
require 'dm-serializer/common'
|
2
|
-
require 'dm-serializer/
|
3
|
-
require 'rexml/document'
|
2
|
+
require 'dm-serializer/xml'
|
4
3
|
|
5
4
|
module DataMapper
|
6
|
-
module
|
7
|
-
# Serialize a Resource to XML
|
5
|
+
module Serializer
|
6
|
+
# Serialize a Resource to XML.
|
7
|
+
#
|
8
|
+
# @return [LibXML::Document, Nokogiri::Document, REXML::Document]
|
9
|
+
# An XML representation of this Resource.
|
8
10
|
#
|
9
|
-
# @return <REXML::Document> an XML representation of this Resource
|
10
11
|
def to_xml(opts = {})
|
11
|
-
xml =
|
12
|
+
xml = XML.serializer
|
12
13
|
xml.output(to_xml_document(opts)).to_s
|
13
14
|
end
|
14
15
|
|
15
|
-
# This method requires certain methods to be implemented in the
|
16
|
-
# serializer library subclasses:
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
16
|
+
# This method requires certain methods to be implemented in the
|
17
|
+
# individual serializer library subclasses:
|
18
|
+
#
|
19
|
+
# * new_document
|
20
|
+
# * root_node
|
21
|
+
# * add_property_node
|
22
|
+
# * add_node
|
21
23
|
def to_xml_document(opts={}, doc = nil)
|
22
|
-
xml =
|
24
|
+
xml = XML.serializer
|
23
25
|
doc ||= xml.new_document
|
24
|
-
|
25
|
-
|
26
|
+
|
27
|
+
default_xml_element_name = lambda {
|
28
|
+
DataMapper::Inflector.underscore(model.name).tr("/", "-")
|
29
|
+
}
|
30
|
+
|
31
|
+
root = xml.root_node(
|
32
|
+
doc,
|
33
|
+
(opts[:element_name] || default_xml_element_name[])
|
34
|
+
)
|
35
|
+
|
26
36
|
properties_to_serialize(opts).each do |property|
|
27
37
|
value = __send__(property.name)
|
28
|
-
attrs =
|
38
|
+
attrs = {}
|
39
|
+
|
40
|
+
unless property.primitive == String
|
41
|
+
attrs['type'] = property.primitive.to_s.downcase
|
42
|
+
end
|
43
|
+
|
29
44
|
xml.add_node(root, property.name.to_s, value, attrs)
|
30
45
|
end
|
31
46
|
|
@@ -33,6 +48,7 @@ module DataMapper
|
|
33
48
|
if self.respond_to?(meth)
|
34
49
|
xml_name = meth.to_s.gsub(/[^a-z0-9_]/, '')
|
35
50
|
value = __send__(meth)
|
51
|
+
|
36
52
|
unless value.nil?
|
37
53
|
if value.respond_to?(:to_xml_document)
|
38
54
|
xml.add_xml(root, value.to_xml_document)
|
@@ -42,6 +58,7 @@ module DataMapper
|
|
42
58
|
end
|
43
59
|
end
|
44
60
|
end
|
61
|
+
|
45
62
|
doc
|
46
63
|
end
|
47
64
|
|
@@ -52,13 +69,14 @@ module DataMapper
|
|
52
69
|
end
|
53
70
|
|
54
71
|
def to_xml_document(opts = {})
|
55
|
-
xml = DataMapper::
|
72
|
+
xml = DataMapper::Serializer::XML.serializer
|
56
73
|
doc = xml.new_document
|
57
74
|
root = xml.root_node(doc, "errors", {'type' => 'hash'})
|
58
75
|
|
59
76
|
errors.each do |key, value|
|
60
77
|
property = xml.add_node(root, key.to_s, nil, {'type' => 'array'})
|
61
78
|
property.attributes["type"] = 'array'
|
79
|
+
|
62
80
|
value.each do |error|
|
63
81
|
xml.add_node(property, "error", error)
|
64
82
|
end
|
@@ -77,22 +95,32 @@ module DataMapper
|
|
77
95
|
end
|
78
96
|
|
79
97
|
def to_xml_document(opts = {})
|
80
|
-
xml = DataMapper::
|
98
|
+
xml = DataMapper::Serializer::XML.serializer
|
81
99
|
doc = xml.new_document
|
82
|
-
|
83
|
-
|
100
|
+
|
101
|
+
default_collection_element_name = lambda {
|
102
|
+
DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(self.model.to_s)).tr("/", "-")
|
103
|
+
}
|
104
|
+
|
105
|
+
root = xml.root_node(
|
106
|
+
doc,
|
107
|
+
opts[:collection_element_name] || default_collection_element_name[],
|
108
|
+
{'type' => 'array'}
|
109
|
+
)
|
110
|
+
|
84
111
|
self.each do |item|
|
85
112
|
item.to_xml_document(opts, doc)
|
86
113
|
end
|
114
|
+
|
87
115
|
doc
|
88
116
|
end
|
89
117
|
end
|
90
118
|
|
91
|
-
if
|
119
|
+
if Serializer.dm_validations_loaded?
|
92
120
|
|
93
121
|
module Validations
|
94
122
|
class ValidationErrors
|
95
|
-
include DataMapper::
|
123
|
+
include DataMapper::Serializer::ValidationErrors::ToXml
|
96
124
|
end
|
97
125
|
end
|
98
126
|
|
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'dm-serializer/common'
|
2
2
|
|
3
3
|
module DataMapper
|
4
|
-
module
|
4
|
+
module Serializer
|
5
5
|
# Serialize a Resource to YAML
|
6
6
|
#
|
7
|
-
# @return
|
7
|
+
# @return [YAML]
|
8
|
+
# A YAML representation of this Resource.
|
8
9
|
def to_yaml(opts_or_emitter = {})
|
9
|
-
|
10
|
+
unless opts_or_emitter.is_a?(Hash)
|
10
11
|
emitter = opts_or_emitter
|
11
12
|
opts = {}
|
12
13
|
else
|
@@ -14,20 +15,22 @@ module DataMapper
|
|
14
15
|
opts = opts_or_emitter
|
15
16
|
end
|
16
17
|
|
17
|
-
YAML
|
18
|
+
YAML.quick_emit(object_id,emitter) do |out|
|
18
19
|
out.map(nil,to_yaml_style) do |map|
|
19
20
|
properties_to_serialize(opts).each do |property|
|
20
21
|
value = __send__(property.name.to_sym)
|
21
22
|
map.add(property.name, value.is_a?(Class) ? value.to_s : value)
|
22
23
|
end
|
24
|
+
|
23
25
|
# add methods
|
24
26
|
Array(opts[:methods]).each do |meth|
|
25
27
|
if respond_to?(meth)
|
26
28
|
map.add(meth.to_sym, __send__(meth))
|
27
29
|
end
|
28
30
|
end
|
29
|
-
|
30
|
-
|
31
|
+
|
32
|
+
if (additions = instance_variable_get("@yaml_addes"))
|
33
|
+
additions.each { |k,v| map.add(k.to_s,v) }
|
31
34
|
end
|
32
35
|
end
|
33
36
|
end
|
@@ -36,7 +39,7 @@ module DataMapper
|
|
36
39
|
module ValidationErrors
|
37
40
|
module ToYaml
|
38
41
|
def to_yaml(*args)
|
39
|
-
|
42
|
+
DataMapper::Ext::Array.to_hash(errors).to_yaml(*args)
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
@@ -45,20 +48,20 @@ module DataMapper
|
|
45
48
|
|
46
49
|
class Collection
|
47
50
|
def to_yaml(opts_or_emitter = {})
|
48
|
-
|
51
|
+
unless opts_or_emitter.is_a?(Hash)
|
49
52
|
to_a.to_yaml(opts_or_emitter)
|
50
53
|
else
|
51
54
|
# FIXME: Don't double handle the YAML (remove the YAML.load)
|
52
|
-
to_a.collect {|x| YAML.load(x.to_yaml(opts_or_emitter)) }.to_yaml
|
55
|
+
to_a.collect { |x| YAML.load(x.to_yaml(opts_or_emitter)) }.to_yaml
|
53
56
|
end
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
|
-
if
|
60
|
+
if Serializer.dm_validations_loaded?
|
58
61
|
|
59
62
|
module Validations
|
60
63
|
class ValidationErrors
|
61
|
-
include DataMapper::
|
64
|
+
include DataMapper::Serializer::ValidationErrors::ToYaml
|
62
65
|
end
|
63
66
|
end
|
64
67
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Serializer
|
3
|
+
module XML
|
4
|
+
# The supported XML Serializers
|
5
|
+
SERIALIZERS = {
|
6
|
+
:libxml => 'LibXML',
|
7
|
+
:nokogiri => 'Nokogiri',
|
8
|
+
:rexml => 'REXML'
|
9
|
+
}
|
10
|
+
|
11
|
+
#
|
12
|
+
# The current XML Serializer.
|
13
|
+
#
|
14
|
+
# @return [Module]
|
15
|
+
# The module within {DataMapper::Serialize::XML}.
|
16
|
+
#
|
17
|
+
# @since 1.1.0
|
18
|
+
#
|
19
|
+
def self.serializer
|
20
|
+
@serializer
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# Sets the XML Serializer to use.
|
25
|
+
#
|
26
|
+
# @param [Symbol] name
|
27
|
+
# The name of the serializer to use. Must be either `:libxml`,
|
28
|
+
# `:nokogiri` or `:rexml`.
|
29
|
+
#
|
30
|
+
# @return [Module]
|
31
|
+
# The module within {DataMapper::Serialize::XML}.
|
32
|
+
#
|
33
|
+
# @since 1.1.0
|
34
|
+
#
|
35
|
+
def self.serializer=(name)
|
36
|
+
serializer_const = SERIALIZERS[name]
|
37
|
+
|
38
|
+
unless serializer_const
|
39
|
+
raise(ArgumentError,"unsupported XML Serializer #{name}")
|
40
|
+
end
|
41
|
+
|
42
|
+
require "dm-serializer/xml/#{name}"
|
43
|
+
@serializer = const_get(serializer_const)
|
44
|
+
end
|
45
|
+
|
46
|
+
[:nokogiri, :libxml, :rexml].each do |name|
|
47
|
+
# attempt to load the first available XML Serializer
|
48
|
+
begin
|
49
|
+
self.serializer = name
|
50
|
+
break
|
51
|
+
rescue LoadError
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'libxml'
|
2
|
+
|
1
3
|
module DataMapper
|
2
|
-
module
|
3
|
-
module
|
4
|
+
module Serializer
|
5
|
+
module XML
|
4
6
|
module LibXML
|
5
7
|
def self.new_document
|
6
8
|
::LibXML::XML::Document.new
|
@@ -8,9 +10,11 @@ module DataMapper
|
|
8
10
|
|
9
11
|
def self.root_node(doc, name, attrs = {})
|
10
12
|
root = ::LibXML::XML::Node.new(name)
|
13
|
+
|
11
14
|
attrs.each do |attr_name, attr_val|
|
12
15
|
root[attr_name] = attr_val
|
13
16
|
end
|
17
|
+
|
14
18
|
doc.root.nil? ? doc.root = root : doc.root << root
|
15
19
|
root
|
16
20
|
end
|
@@ -18,9 +22,11 @@ module DataMapper
|
|
18
22
|
def self.add_node(parent, name, value, attrs = {})
|
19
23
|
value_str = value.to_s unless value.nil?
|
20
24
|
node = ::LibXML::XML::Node.new(name, value_str)
|
25
|
+
|
21
26
|
attrs.each do |attr_name, attr_val|
|
22
27
|
node[attr_name] = attr_val
|
23
28
|
end
|
29
|
+
|
24
30
|
parent << node
|
25
31
|
node
|
26
32
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
1
3
|
module DataMapper
|
2
|
-
module
|
3
|
-
module
|
4
|
+
module Serializer
|
5
|
+
module XML
|
4
6
|
module Nokogiri
|
5
7
|
def self.new_document
|
6
8
|
::Nokogiri::XML::Document.new
|
@@ -8,9 +10,11 @@ module DataMapper
|
|
8
10
|
|
9
11
|
def self.root_node(doc, name, attrs = {})
|
10
12
|
root = ::Nokogiri::XML::Node.new(name, doc)
|
13
|
+
|
11
14
|
attrs.each do |attr_name, attr_val|
|
12
15
|
root[attr_name] = attr_val
|
13
16
|
end
|
17
|
+
|
14
18
|
doc.root.nil? ? doc.root = root : doc.root << root
|
15
19
|
root
|
16
20
|
end
|
@@ -18,7 +22,11 @@ module DataMapper
|
|
18
22
|
def self.add_node(parent, name, value, attrs = {})
|
19
23
|
node = ::Nokogiri::XML::Node.new(name, parent.document)
|
20
24
|
node << ::Nokogiri::XML::Text.new(value.to_s, parent.document) unless value.nil?
|
21
|
-
|
25
|
+
|
26
|
+
attrs.each do |attr_name, attr_val|
|
27
|
+
node[attr_name] = attr_val
|
28
|
+
end
|
29
|
+
|
22
30
|
parent << node
|
23
31
|
node
|
24
32
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
1
3
|
module DataMapper
|
2
|
-
module
|
3
|
-
module
|
4
|
+
module Serializer
|
5
|
+
module XML
|
4
6
|
module REXML
|
5
7
|
def self.new_document
|
6
8
|
::REXML::Document.new
|
@@ -12,7 +14,11 @@ module DataMapper
|
|
12
14
|
|
13
15
|
def self.add_node(parent, name, value, attrs = {})
|
14
16
|
node = parent.add_element(name)
|
15
|
-
|
17
|
+
|
18
|
+
attrs.each do |attr_name, attr_val|
|
19
|
+
node.attributes[attr_name] = attr_val
|
20
|
+
end
|
21
|
+
|
16
22
|
node << ::REXML::Text.new(value.to_s) unless value.nil?
|
17
23
|
node
|
18
24
|
end
|
data/spec/public/to_json_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe DataMapper::
|
3
|
+
describe DataMapper::Serializer, '#to_json' do
|
4
4
|
#
|
5
5
|
# ==== ajaxy JSON
|
6
6
|
#
|
@@ -64,7 +64,7 @@ describe DataMapper::Serialize, '#to_json' do
|
|
64
64
|
|
65
65
|
end
|
66
66
|
|
67
|
-
describe DataMapper::
|
67
|
+
describe DataMapper::Serializer, '#as_json' do
|
68
68
|
it "handles nil for options" do
|
69
69
|
expect { Cow.new.as_json(nil) }.to_not raise_error
|
70
70
|
end
|
data/spec/public/to_xml_spec.rb
CHANGED
@@ -1,25 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'rexml/document'
|
2
3
|
|
3
|
-
|
4
|
-
'REXML' => [],
|
5
|
-
'LibXML' => [ 'libxml-ruby', 'libxml' ],
|
6
|
-
'Nokogiri' => [ 'nokogiri', 'nokogiri' ],
|
7
|
-
}.each do |lib, (gem_name, file_to_require)|
|
4
|
+
[:rexml, :libxml, :nokogiri].each do |lib|
|
8
5
|
begin
|
9
|
-
|
10
|
-
rescue LoadError
|
11
|
-
warn "[WARNING]
|
6
|
+
DataMapper::Serializer::XML.serializer = lib
|
7
|
+
rescue LoadError => e
|
8
|
+
warn "[WARNING] #{e.message}"
|
9
|
+
warn "[WARNING] Not running #to_xml specs for #{lib}"
|
12
10
|
next
|
13
11
|
end
|
14
12
|
|
15
|
-
describe DataMapper::
|
16
|
-
#
|
17
|
-
# ==== enterprisey XML
|
18
|
-
#
|
19
|
-
|
13
|
+
describe DataMapper::Serializer, "#to_xml using #{lib}" do
|
20
14
|
before(:all) do
|
21
15
|
DataMapper.finalize
|
22
|
-
|
16
|
+
|
17
|
+
@harness = Class.new(SerializerTestHarness) {
|
23
18
|
def method_name
|
24
19
|
:to_xml
|
25
20
|
end
|
@@ -58,9 +53,7 @@ require 'spec_helper'
|
|
58
53
|
value = value.to_i if value && ["integer", "datamapper::types::serial"].include?(type)
|
59
54
|
value
|
60
55
|
end
|
61
|
-
|
62
|
-
DataMapper::Serialize::XMLSerializers.instance_eval { remove_const('SERIALIZER') }
|
63
|
-
DataMapper::Serialize::XMLSerializers::SERIALIZER = DataMapper::Serialize::XMLSerializers::const_get(lib)
|
56
|
+
}.new
|
64
57
|
end
|
65
58
|
|
66
59
|
it_should_behave_like "A serialization method"
|
data/spec/public/to_yaml_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -7,6 +7,12 @@ require 'dm-migrations'
|
|
7
7
|
|
8
8
|
require File.expand_path('spec/lib/serialization_method_shared_spec')
|
9
9
|
|
10
|
+
class Array
|
11
|
+
def to_hash
|
12
|
+
DataMapper::Ext::Array.to_hash(self)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
10
16
|
# require fixture resources
|
11
17
|
SPEC_ROOT = Pathname(__FILE__).dirname.expand_path
|
12
18
|
Pathname.glob((SPEC_ROOT + 'fixtures/**/*.rb').to_s).each { |file| require file }
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: dm-serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 6
|
5
|
-
version: 1.1.0.
|
5
|
+
version: 1.1.0.rc3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Guy van den Berg
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-10 00:00:00 -08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.1.0.
|
23
|
+
version: 1.1.0.rc3
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: *id001
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
requirements:
|
54
54
|
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 1.1.0.
|
56
|
+
version: 1.1.0.rc3
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: *id004
|
@@ -116,10 +116,10 @@ files:
|
|
116
116
|
- lib/dm-serializer/to_json.rb
|
117
117
|
- lib/dm-serializer/to_xml.rb
|
118
118
|
- lib/dm-serializer/to_yaml.rb
|
119
|
-
- lib/dm-serializer/
|
120
|
-
- lib/dm-serializer/
|
121
|
-
- lib/dm-serializer/
|
122
|
-
- lib/dm-serializer/
|
119
|
+
- lib/dm-serializer/xml.rb
|
120
|
+
- lib/dm-serializer/xml/libxml.rb
|
121
|
+
- lib/dm-serializer/xml/nokogiri.rb
|
122
|
+
- lib/dm-serializer/xml/rexml.rb
|
123
123
|
- spec/fixtures/cow.rb
|
124
124
|
- spec/fixtures/planet.rb
|
125
125
|
- spec/fixtures/quan_tum_cat.rb
|
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
160
|
requirements: []
|
161
161
|
|
162
162
|
rubyforge_project: datamapper
|
163
|
-
rubygems_version: 1.
|
163
|
+
rubygems_version: 1.6.2
|
164
164
|
signing_key:
|
165
165
|
specification_version: 3
|
166
166
|
summary: DataMapper plugin for serializing Resources and Collections
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'dm-serializer/xml_serializers/rexml'
|
2
|
-
require 'dm-serializer/xml_serializers/nokogiri'
|
3
|
-
require 'dm-serializer/xml_serializers/libxml'
|
4
|
-
|
5
|
-
module DataMapper
|
6
|
-
module Serialize
|
7
|
-
module XMLSerializers
|
8
|
-
SERIALIZER = if defined?(::LibXML)
|
9
|
-
LibXML
|
10
|
-
elsif defined?(::Nokogiri)
|
11
|
-
Nokogiri
|
12
|
-
else
|
13
|
-
REXML
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|