dm-serializer 1.1.0 → 1.2.0.rc1
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.
- data/Gemfile +13 -11
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/dm-serializer.gemspec +34 -43
- data/lib/dm-serializer/common.rb +0 -3
- data/lib/dm-serializer/to_csv.rb +1 -5
- data/lib/dm-serializer/to_json.rb +4 -7
- data/lib/dm-serializer/to_xml.rb +1 -3
- data/lib/dm-serializer/to_yaml.rb +137 -46
- data/spec/lib/serialization_method_shared_spec.rb +69 -55
- data/spec/public/to_json_spec.rb +2 -2
- data/spec/public/to_yaml_spec.rb +3 -0
- data/spec/spec_helper.rb +2 -6
- metadata +126 -54
- data/autotest/discover.rb +0 -3
- data/autotest/dmserializer_rspec.rb +0 -108
data/Gemfile
CHANGED
@@ -5,20 +5,22 @@ 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.
|
9
|
-
DO_VERSION = '~> 0.10.
|
8
|
+
DM_VERSION = '~> 1.2.0.rc1'
|
9
|
+
DO_VERSION = '~> 0.10.6'
|
10
10
|
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
11
11
|
|
12
|
-
gem 'dm-core',
|
13
|
-
gem 'fastercsv',
|
14
|
-
gem '
|
12
|
+
gem 'dm-core', DM_VERSION, SOURCE => "#{DATAMAPPER}/dm-core#{REPO_POSTFIX}"
|
13
|
+
gem 'fastercsv', '~> 1.5.4'
|
14
|
+
gem 'multi_json', '~> 1.0.3'
|
15
|
+
gem 'json', '~> 1.5.4', :platforms => [ :ruby_18, :jruby ]
|
16
|
+
gem 'json_pure', '~> 1.5.4', :platforms => [ :mswin ]
|
15
17
|
|
16
18
|
group :development do
|
17
19
|
|
18
20
|
gem 'dm-validations', DM_VERSION, SOURCE => "#{DATAMAPPER}/dm-validations#{REPO_POSTFIX}"
|
19
|
-
gem 'jeweler', '~> 1.
|
20
|
-
gem 'rake', '~> 0.
|
21
|
-
gem 'rspec', '~> 1.3.
|
21
|
+
gem 'jeweler', '~> 1.6.4'
|
22
|
+
gem 'rake', '~> 0.9.2'
|
23
|
+
gem 'rspec', '~> 1.3.2'
|
22
24
|
|
23
25
|
end
|
24
26
|
|
@@ -32,9 +34,9 @@ end
|
|
32
34
|
platforms :mri_18 do
|
33
35
|
group :quality do
|
34
36
|
|
35
|
-
gem 'rcov', '~> 0.9.
|
36
|
-
gem 'yard', '~> 0.
|
37
|
-
gem 'yardstick', '~> 0.
|
37
|
+
gem 'rcov', '~> 0.9.10'
|
38
|
+
gem 'yard', '~> 0.7.2'
|
39
|
+
gem 'yardstick', '~> 0.4'
|
38
40
|
|
39
41
|
end
|
40
42
|
end
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
|
4
4
|
begin
|
5
|
-
gem 'jeweler', '~> 1.
|
5
|
+
gem 'jeweler', '~> 1.6.4'
|
6
6
|
require 'jeweler'
|
7
7
|
|
8
8
|
Jeweler::Tasks.new do |gem|
|
@@ -21,5 +21,5 @@ begin
|
|
21
21
|
|
22
22
|
FileList['tasks/**/*.rake'].each { |task| import task }
|
23
23
|
rescue LoadError
|
24
|
-
puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.
|
24
|
+
puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler -v 1.6.4'
|
25
25
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0.rc1
|
data/dm-serializer.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "1.
|
7
|
+
s.name = "dm-serializer"
|
8
|
+
s.version = "1.2.0.rc1"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
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 =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2011-09-09"
|
13
|
+
s.description = "DataMapper plugin for serializing Resources and Collections"
|
14
|
+
s.email = "vandenberg.guy [a] gmail [d] com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
@@ -22,8 +22,6 @@ Gem::Specification.new do |s|
|
|
22
22
|
"README.rdoc",
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
|
-
"autotest/discover.rb",
|
26
|
-
"autotest/dmserializer_rspec.rb",
|
27
25
|
"benchmarks/to_json.rb",
|
28
26
|
"benchmarks/to_xml.rb",
|
29
27
|
"dm-serializer.gemspec",
|
@@ -54,53 +52,46 @@ Gem::Specification.new do |s|
|
|
54
52
|
"tasks/yard.rake",
|
55
53
|
"tasks/yardstick.rake"
|
56
54
|
]
|
57
|
-
s.homepage =
|
55
|
+
s.homepage = "http://github.com/datamapper/dm-serializer"
|
58
56
|
s.require_paths = ["lib"]
|
59
|
-
s.rubyforge_project =
|
60
|
-
s.rubygems_version =
|
61
|
-
s.summary =
|
62
|
-
s.test_files = [
|
63
|
-
"spec/fixtures/cow.rb",
|
64
|
-
"spec/fixtures/planet.rb",
|
65
|
-
"spec/fixtures/quan_tum_cat.rb",
|
66
|
-
"spec/fixtures/vehicle.rb",
|
67
|
-
"spec/lib/serialization_method_shared_spec.rb",
|
68
|
-
"spec/public/serializer_spec.rb",
|
69
|
-
"spec/public/to_csv_spec.rb",
|
70
|
-
"spec/public/to_json_spec.rb",
|
71
|
-
"spec/public/to_xml_spec.rb",
|
72
|
-
"spec/public/to_yaml_spec.rb",
|
73
|
-
"spec/spec_helper.rb"
|
74
|
-
]
|
57
|
+
s.rubyforge_project = "datamapper"
|
58
|
+
s.rubygems_version = "1.8.10"
|
59
|
+
s.summary = "DataMapper plugin for serializing Resources and Collections"
|
75
60
|
|
76
61
|
if s.respond_to? :specification_version then
|
77
62
|
s.specification_version = 3
|
78
63
|
|
79
64
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
80
|
-
s.add_runtime_dependency(%q<dm-core>, ["~> 1.
|
65
|
+
s.add_runtime_dependency(%q<dm-core>, ["~> 1.2.0.rc1"])
|
81
66
|
s.add_runtime_dependency(%q<fastercsv>, ["~> 1.5.4"])
|
82
|
-
s.add_runtime_dependency(%q<
|
83
|
-
s.
|
84
|
-
s.
|
85
|
-
s.add_development_dependency(%q<
|
86
|
-
s.add_development_dependency(%q<
|
67
|
+
s.add_runtime_dependency(%q<multi_json>, ["~> 1.0.3"])
|
68
|
+
s.add_runtime_dependency(%q<json>, ["~> 1.5.4"])
|
69
|
+
s.add_runtime_dependency(%q<json_pure>, ["~> 1.5.4"])
|
70
|
+
s.add_development_dependency(%q<dm-validations>, ["~> 1.2.0.rc1"])
|
71
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
72
|
+
s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
|
73
|
+
s.add_development_dependency(%q<rspec>, ["~> 1.3.2"])
|
87
74
|
else
|
88
|
-
s.add_dependency(%q<dm-core>, ["~> 1.
|
75
|
+
s.add_dependency(%q<dm-core>, ["~> 1.2.0.rc1"])
|
89
76
|
s.add_dependency(%q<fastercsv>, ["~> 1.5.4"])
|
90
|
-
s.add_dependency(%q<
|
91
|
-
s.add_dependency(%q<
|
92
|
-
s.add_dependency(%q<
|
93
|
-
s.add_dependency(%q<
|
94
|
-
s.add_dependency(%q<
|
77
|
+
s.add_dependency(%q<multi_json>, ["~> 1.0.3"])
|
78
|
+
s.add_dependency(%q<json>, ["~> 1.5.4"])
|
79
|
+
s.add_dependency(%q<json_pure>, ["~> 1.5.4"])
|
80
|
+
s.add_dependency(%q<dm-validations>, ["~> 1.2.0.rc1"])
|
81
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
82
|
+
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
83
|
+
s.add_dependency(%q<rspec>, ["~> 1.3.2"])
|
95
84
|
end
|
96
85
|
else
|
97
|
-
s.add_dependency(%q<dm-core>, ["~> 1.
|
86
|
+
s.add_dependency(%q<dm-core>, ["~> 1.2.0.rc1"])
|
98
87
|
s.add_dependency(%q<fastercsv>, ["~> 1.5.4"])
|
99
|
-
s.add_dependency(%q<
|
100
|
-
s.add_dependency(%q<
|
101
|
-
s.add_dependency(%q<
|
102
|
-
s.add_dependency(%q<
|
103
|
-
s.add_dependency(%q<
|
88
|
+
s.add_dependency(%q<multi_json>, ["~> 1.0.3"])
|
89
|
+
s.add_dependency(%q<json>, ["~> 1.5.4"])
|
90
|
+
s.add_dependency(%q<json_pure>, ["~> 1.5.4"])
|
91
|
+
s.add_dependency(%q<dm-validations>, ["~> 1.2.0.rc1"])
|
92
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
93
|
+
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
94
|
+
s.add_dependency(%q<rspec>, ["~> 1.3.2"])
|
104
95
|
end
|
105
96
|
end
|
106
97
|
|
data/lib/dm-serializer/common.rb
CHANGED
@@ -2,9 +2,6 @@ require 'dm-core'
|
|
2
2
|
|
3
3
|
module DataMapper
|
4
4
|
module Serializer
|
5
|
-
def self.dm_validations_loaded?
|
6
|
-
DataMapper.const_defined?("Validations")
|
7
|
-
end
|
8
5
|
|
9
6
|
# Returns propreties to serialize based on :only or :exclude arrays,
|
10
7
|
# if provided :only takes precendence over :exclude
|
data/lib/dm-serializer/to_csv.rb
CHANGED
@@ -4,7 +4,6 @@ if RUBY_VERSION >= '1.9.0'
|
|
4
4
|
require 'csv'
|
5
5
|
else
|
6
6
|
begin
|
7
|
-
gem 'fastercsv', '~>1.5.0'
|
8
7
|
require 'fastercsv'
|
9
8
|
CSV = FasterCSV
|
10
9
|
rescue LoadError
|
@@ -62,14 +61,11 @@ module DataMapper
|
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
65
|
-
if
|
66
|
-
|
64
|
+
if const_defined?(:Validations)
|
67
65
|
module Validations
|
68
66
|
class ValidationErrors
|
69
67
|
include DataMapper::Serializer::ValidationErrors::ToCsv
|
70
68
|
end
|
71
69
|
end
|
72
|
-
|
73
70
|
end
|
74
|
-
|
75
71
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'dm-serializer/common'
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'multi_json'
|
4
4
|
|
5
5
|
module DataMapper
|
6
6
|
module Serializer
|
@@ -60,7 +60,7 @@ module DataMapper
|
|
60
60
|
|
61
61
|
# default to making JSON
|
62
62
|
if options.fetch(:to_json, true)
|
63
|
-
result
|
63
|
+
MultiJson.encode(result)
|
64
64
|
else
|
65
65
|
result
|
66
66
|
end
|
@@ -69,7 +69,7 @@ module DataMapper
|
|
69
69
|
module ValidationErrors
|
70
70
|
module ToJson
|
71
71
|
def to_json(*args)
|
72
|
-
|
72
|
+
MultiJson.encode(Hash[ errors ])
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -93,14 +93,11 @@ module DataMapper
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
if
|
97
|
-
|
96
|
+
if const_defined?(:Validations)
|
98
97
|
module Validations
|
99
98
|
class ValidationErrors
|
100
99
|
include DataMapper::Serializer::ValidationErrors::ToJson
|
101
100
|
end
|
102
101
|
end
|
103
|
-
|
104
102
|
end
|
105
|
-
|
106
103
|
end
|
data/lib/dm-serializer/to_xml.rb
CHANGED
@@ -116,13 +116,11 @@ module DataMapper
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
if
|
120
|
-
|
119
|
+
if const_defined?(:Validations)
|
121
120
|
module Validations
|
122
121
|
class ValidationErrors
|
123
122
|
include DataMapper::Serializer::ValidationErrors::ToXml
|
124
123
|
end
|
125
124
|
end
|
126
|
-
|
127
125
|
end
|
128
126
|
end
|
@@ -2,68 +2,159 @@ require 'dm-serializer/common'
|
|
2
2
|
|
3
3
|
module DataMapper
|
4
4
|
module Serializer
|
5
|
-
|
5
|
+
TAG_NAME = "ruby/DataMapper,#{DataMapper::VERSION}".freeze
|
6
|
+
|
7
|
+
# Include a callback to register the YAML output
|
8
|
+
#
|
9
|
+
# @param [DataMapper::Model] descendant
|
10
|
+
#
|
11
|
+
# @return [undefined]
|
6
12
|
#
|
7
|
-
# @
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
emitter = opts_or_emitter
|
12
|
-
opts = {}
|
13
|
-
else
|
14
|
-
emitter = {}
|
15
|
-
opts = opts_or_emitter
|
13
|
+
# @api private
|
14
|
+
def self.included(descendant)
|
15
|
+
YAML.add_domain_type(TAG_NAME, descendant.name) do |_tag, values|
|
16
|
+
values
|
16
17
|
end
|
18
|
+
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
if (additions = instance_variable_get("@yaml_addes"))
|
33
|
-
additions.each { |k,v| map.add(k.to_s,v) }
|
34
|
-
end
|
20
|
+
# Serialize a Resource to YAML
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# yaml = resource.to_yaml # => a valid YAML string
|
24
|
+
#
|
25
|
+
# @param [Hash] options
|
26
|
+
#
|
27
|
+
# @return [String]
|
28
|
+
#
|
29
|
+
# @api public
|
30
|
+
def to_yaml(options = {})
|
31
|
+
YAML.quick_emit(object_id, options) do |out|
|
32
|
+
out.map(to_yaml_type, to_yaml_style) do |map|
|
33
|
+
encode_with(map, options.kind_of?(Hash) ? options : {})
|
35
34
|
end
|
36
35
|
end
|
36
|
+
end unless YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck?
|
37
|
+
|
38
|
+
# A callback to encode the resource in the YAML stream
|
39
|
+
#
|
40
|
+
# @param [#add] coder
|
41
|
+
# handles adding the values to the output
|
42
|
+
#
|
43
|
+
# @param [Hash] options
|
44
|
+
# optional Hash configuring the output
|
45
|
+
#
|
46
|
+
# @return [undefined]
|
47
|
+
#
|
48
|
+
# @api public
|
49
|
+
def encode_with(coder, options = {})
|
50
|
+
coder.tag = to_yaml_type if coder.respond_to?(:tag=)
|
51
|
+
coder.style = to_yaml_style if coder.respond_to?(:style=)
|
52
|
+
|
53
|
+
methods = []
|
54
|
+
|
55
|
+
methods.concat properties_to_serialize(options).map { |property| property.name }
|
56
|
+
methods.concat Array(options[:methods])
|
57
|
+
|
58
|
+
methods.each do |method|
|
59
|
+
coder.add(method.to_s, __send__(method))
|
60
|
+
end
|
37
61
|
end
|
38
62
|
|
63
|
+
private
|
64
|
+
|
65
|
+
# Return the YAML type to use for the output
|
66
|
+
#
|
67
|
+
# @return [String]
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
def to_yaml_type
|
71
|
+
"!#{TAG_NAME}:#{model.name}"
|
72
|
+
end
|
73
|
+
|
74
|
+
# Return the YAML style to use for the output
|
75
|
+
#
|
76
|
+
# @return [Integer]
|
77
|
+
#
|
78
|
+
# @api private
|
79
|
+
def to_yaml_style
|
80
|
+
Psych::Nodes::Mapping::ANY
|
81
|
+
end if YAML.const_defined?(:ENGINE) && YAML::ENGINE.yamler == 'psych'
|
82
|
+
|
39
83
|
module ValidationErrors
|
40
84
|
module ToYaml
|
85
|
+
|
86
|
+
# Serialize the errors to YAML
|
87
|
+
#
|
88
|
+
# @example
|
89
|
+
# yaml = errors.to_yaml # => a valid YAML string
|
90
|
+
#
|
91
|
+
# @param [Hash] options
|
92
|
+
#
|
93
|
+
# @return [String]
|
94
|
+
#
|
95
|
+
# @api public
|
41
96
|
def to_yaml(*args)
|
42
|
-
|
97
|
+
Hash[errors].to_yaml(*args)
|
43
98
|
end
|
44
|
-
end
|
45
|
-
end
|
46
99
|
|
47
|
-
|
100
|
+
# A callback to encode the errors in the YAML stream
|
101
|
+
#
|
102
|
+
# @param [#add] coder
|
103
|
+
# handles adding the values to the output
|
104
|
+
#
|
105
|
+
# @return [undefined]
|
106
|
+
#
|
107
|
+
# @api public
|
108
|
+
def encode_with(coder)
|
109
|
+
coder.map = Hash[errors]
|
110
|
+
end
|
48
111
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
112
|
+
end # module ToYaml
|
113
|
+
end # module ValidationErrors
|
114
|
+
|
115
|
+
module Collection
|
116
|
+
module ToYaml
|
117
|
+
|
118
|
+
# Serialize the collection to YAML
|
119
|
+
#
|
120
|
+
# @example
|
121
|
+
# yaml = collection.to_yaml # => a valid YAML string
|
122
|
+
#
|
123
|
+
# @param [Hash] options
|
124
|
+
#
|
125
|
+
# @return [String]
|
126
|
+
#
|
127
|
+
# @api public
|
128
|
+
def to_yaml(*args)
|
129
|
+
to_a.to_yaml(*args)
|
130
|
+
end
|
131
|
+
|
132
|
+
# A callback to encode the collection in the YAML stream
|
133
|
+
#
|
134
|
+
# @param [#add] coder
|
135
|
+
# handles adding the values to the output
|
136
|
+
#
|
137
|
+
# @return [undefined]
|
138
|
+
#
|
139
|
+
# @api public
|
140
|
+
def encode_with(coder)
|
141
|
+
coder.seq = to_a
|
142
|
+
end
|
59
143
|
|
60
|
-
|
144
|
+
end # module ToYaml
|
145
|
+
end # module Collection
|
146
|
+
end # module Serializer
|
61
147
|
|
148
|
+
class Collection
|
149
|
+
include Serializer::Collection::ToYaml
|
150
|
+
end # class Collection
|
151
|
+
|
152
|
+
if const_defined?(:Validations)
|
62
153
|
module Validations
|
63
154
|
class ValidationErrors
|
64
155
|
include DataMapper::Serializer::ValidationErrors::ToYaml
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
156
|
+
end # class ValidationErrors
|
157
|
+
end # module Validations
|
68
158
|
end
|
69
|
-
|
159
|
+
|
160
|
+
end # module DataMapper
|
@@ -31,8 +31,8 @@ share_examples_for 'A serialization method that also serializes core classes' do
|
|
31
31
|
keys = %w[ id composite name breed ]
|
32
32
|
|
33
33
|
resources = [
|
34
|
-
keys.zip([ 1, 2, 'Betsy', 'Jersey' ])
|
35
|
-
keys.zip([ 89, 34, 'Berta', 'Guernsey' ])
|
34
|
+
Hash[ keys.zip([ 1, 2, 'Betsy', 'Jersey' ]) ],
|
35
|
+
Hash[ keys.zip([ 89, 34, 'Berta', 'Guernsey' ]) ],
|
36
36
|
]
|
37
37
|
|
38
38
|
collection = DataMapper::Collection.new(query, query.model.load(resources, query))
|
@@ -93,73 +93,87 @@ share_examples_for 'A serialization method' do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should only includes properties given to :only option" do
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
96
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
97
|
+
planet = Planet.new(
|
98
|
+
:name => "Mars",
|
99
|
+
:aphelion => 249_209_300.4
|
100
|
+
)
|
101
|
+
|
102
|
+
result = @harness.test(planet, :only => [:name])
|
103
|
+
result.values_at("name", "aphelion").should == ["Mars", nil]
|
104
|
+
end
|
103
105
|
end
|
104
106
|
|
105
107
|
it "should serialize values returned by an array of methods given to :methods option" do
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
108
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
109
|
+
planet = Planet.new(
|
110
|
+
:name => "Mars",
|
111
|
+
:aphelion => 249_209_300.4
|
112
|
+
)
|
113
|
+
|
114
|
+
result = @harness.test(planet, :methods => [:category, :has_known_form_of_life?])
|
115
|
+
# XML currently can't serialize ? at the end of method names
|
116
|
+
boolean_method_name = @harness.method_name == :to_xml ? "has_known_form_of_life" : "has_known_form_of_life?"
|
117
|
+
result.values_at("category", boolean_method_name).should == ["terrestrial", false]
|
118
|
+
end
|
115
119
|
end
|
116
120
|
|
117
121
|
it "should serialize values returned by a single method given to :methods option" do
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
122
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
123
|
+
planet = Planet.new(
|
124
|
+
:name => "Mars",
|
125
|
+
:aphelion => 249_209_300.4
|
126
|
+
)
|
127
|
+
|
128
|
+
result = @harness.test(planet, :methods => :category)
|
129
|
+
result.values_at("category").should == ["terrestrial"]
|
130
|
+
end
|
125
131
|
end
|
126
132
|
|
127
133
|
it "should only include properties given to :only option" do
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
134
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
135
|
+
planet = Planet.new(
|
136
|
+
:name => "Mars",
|
137
|
+
:aphelion => 249_209_300.4
|
138
|
+
)
|
139
|
+
|
140
|
+
result = @harness.test(planet, :only => [:name])
|
141
|
+
result.values_at("name", "aphelion").should == ["Mars", nil]
|
142
|
+
end
|
135
143
|
end
|
136
144
|
|
137
145
|
it "should exclude properties given to :exclude option" do
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
146
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
147
|
+
planet = Planet.new(
|
148
|
+
:name => "Mars",
|
149
|
+
:aphelion => 249_209_300.4
|
150
|
+
)
|
151
|
+
|
152
|
+
result = @harness.test(planet, :exclude => [:aphelion])
|
153
|
+
result.values_at("name", "aphelion").should == ["Mars", nil]
|
154
|
+
end
|
145
155
|
end
|
146
156
|
|
147
157
|
it "should give higher precendence to :only option over :exclude" do
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
158
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
159
|
+
planet = Planet.new(
|
160
|
+
:name => "Mars",
|
161
|
+
:aphelion => 249_209_300.4
|
162
|
+
)
|
163
|
+
|
164
|
+
result = @harness.test(planet, :only => [:name], :exclude => [:name])
|
165
|
+
result.values_at("name", "aphelion").should == ["Mars", nil]
|
166
|
+
end
|
155
167
|
end
|
156
168
|
|
157
169
|
it 'should support child associations included via the :methods parameter' do
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
170
|
+
pending_if 'Psych provides no way to pass in parameters', @ruby_192 && @to_yaml do
|
171
|
+
solar_system = SolarSystem.create(:name => "one")
|
172
|
+
planet = Planet.new(:name => "earth")
|
173
|
+
planet.solar_system = solar_system
|
174
|
+
result = @harness.test(planet, :methods => [:solar_system])
|
175
|
+
result['solar_system'].values_at('name', 'id').should == ['one', 1]
|
176
|
+
end
|
163
177
|
end
|
164
178
|
end
|
165
179
|
|
@@ -183,8 +197,8 @@ share_examples_for 'A serialization method' do
|
|
183
197
|
keys = %w[ id composite name breed ]
|
184
198
|
|
185
199
|
resources = [
|
186
|
-
keys.zip([ 1, 2, 'Betsy', 'Jersey' ])
|
187
|
-
keys.zip([ 10, 20, 'Berta', 'Guernsey' ])
|
200
|
+
Hash[ keys.zip([ 1, 2, 'Betsy', 'Jersey' ]) ],
|
201
|
+
Hash[ keys.zip([ 10, 20, 'Berta', 'Guernsey' ]) ],
|
188
202
|
]
|
189
203
|
|
190
204
|
collection = DataMapper::Collection.new(query, query.model.load(resources, query))
|
@@ -269,8 +283,8 @@ share_examples_for 'A serialization method' do
|
|
269
283
|
planet = Planet.create(:name => 'a')
|
270
284
|
results = @harness.test(planet.errors)
|
271
285
|
results.should == {
|
272
|
-
"name" => planet.errors[:name],
|
273
|
-
"solar_system_id" => planet.errors[:solar_system_id]
|
286
|
+
"name" => planet.errors[:name].map { |e| e.to_s },
|
287
|
+
"solar_system_id" => planet.errors[:solar_system_id].map { |e| e.to_s }
|
274
288
|
}
|
275
289
|
end
|
276
290
|
end
|
data/spec/public/to_json_spec.rb
CHANGED
@@ -13,8 +13,8 @@ describe DataMapper::Serializer, '#to_json' do
|
|
13
13
|
keys = %w[ id composite name breed ]
|
14
14
|
|
15
15
|
resources = [
|
16
|
-
keys.zip([ 1, 2, 'Betsy', 'Jersey' ])
|
17
|
-
keys.zip([ 10, 20, 'Berta', 'Guernsey' ])
|
16
|
+
Hash[ keys.zip([ 1, 2, 'Betsy', 'Jersey' ]) ],
|
17
|
+
Hash[ keys.zip([ 10, 20, 'Berta', 'Guernsey' ]) ],
|
18
18
|
]
|
19
19
|
|
20
20
|
@collection = DataMapper::Collection.new(query, query.model.load(resources, query))
|
data/spec/public/to_yaml_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'dm-core/spec/setup'
|
2
2
|
require 'dm-core/spec/lib/adapter_helpers'
|
3
|
+
require 'dm-core/spec/lib/pending_helpers'
|
3
4
|
|
4
5
|
require 'dm-validations' # FIXME: must be required before dm-serializer
|
5
6
|
require 'dm-serializer'
|
@@ -7,12 +8,6 @@ require 'dm-migrations'
|
|
7
8
|
|
8
9
|
require File.expand_path('spec/lib/serialization_method_shared_spec')
|
9
10
|
|
10
|
-
class Array
|
11
|
-
def to_hash
|
12
|
-
DataMapper::Ext::Array.to_hash(self)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
11
|
# require fixture resources
|
17
12
|
SPEC_ROOT = Pathname(__FILE__).dirname.expand_path
|
18
13
|
Pathname.glob((SPEC_ROOT + 'fixtures/**/*.rb').to_s).each { |file| require file }
|
@@ -27,4 +22,5 @@ DataMapper::Spec.setup
|
|
27
22
|
|
28
23
|
Spec::Runner.configure do |config|
|
29
24
|
config.extend(DataMapper::Spec::Adapters::Helpers)
|
25
|
+
config.include(DataMapper::Spec::PendingHelpers)
|
30
26
|
end
|
metadata
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 15424023
|
5
|
+
prerelease: 6
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
- rc
|
11
|
+
- 1
|
12
|
+
version: 1.2.0.rc1
|
6
13
|
platform: ruby
|
7
14
|
authors:
|
8
15
|
- Guy van den Berg
|
@@ -10,86 +17,156 @@ autorequire:
|
|
10
17
|
bindir: bin
|
11
18
|
cert_chain: []
|
12
19
|
|
13
|
-
date: 2011-
|
14
|
-
default_executable:
|
20
|
+
date: 2011-09-09 00:00:00 Z
|
15
21
|
dependencies:
|
16
22
|
- !ruby/object:Gem::Dependency
|
17
|
-
|
18
|
-
|
23
|
+
type: :runtime
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
19
25
|
none: false
|
20
26
|
requirements:
|
21
27
|
- - ~>
|
22
28
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
29
|
+
hash: 15424023
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 2
|
33
|
+
- 0
|
34
|
+
- rc
|
35
|
+
- 1
|
36
|
+
version: 1.2.0.rc1
|
25
37
|
prerelease: false
|
26
|
-
|
38
|
+
requirement: *id001
|
39
|
+
name: dm-core
|
27
40
|
- !ruby/object:Gem::Dependency
|
28
|
-
|
29
|
-
|
41
|
+
type: :runtime
|
42
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
30
43
|
none: false
|
31
44
|
requirements:
|
32
45
|
- - ~>
|
33
46
|
- !ruby/object:Gem::Version
|
47
|
+
hash: 11
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 5
|
51
|
+
- 4
|
34
52
|
version: 1.5.4
|
35
|
-
type: :runtime
|
36
53
|
prerelease: false
|
37
|
-
|
54
|
+
requirement: *id002
|
55
|
+
name: fastercsv
|
38
56
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
40
|
-
|
57
|
+
type: :runtime
|
58
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
41
59
|
none: false
|
42
60
|
requirements:
|
43
61
|
- - ~>
|
44
62
|
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
|
63
|
+
hash: 17
|
64
|
+
segments:
|
65
|
+
- 1
|
66
|
+
- 0
|
67
|
+
- 3
|
68
|
+
version: 1.0.3
|
47
69
|
prerelease: false
|
48
|
-
|
70
|
+
requirement: *id003
|
71
|
+
name: multi_json
|
49
72
|
- !ruby/object:Gem::Dependency
|
50
|
-
|
51
|
-
|
73
|
+
type: :runtime
|
74
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
52
75
|
none: false
|
53
76
|
requirements:
|
54
77
|
- - ~>
|
55
78
|
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
79
|
+
hash: 11
|
80
|
+
segments:
|
81
|
+
- 1
|
82
|
+
- 5
|
83
|
+
- 4
|
84
|
+
version: 1.5.4
|
58
85
|
prerelease: false
|
59
|
-
|
86
|
+
requirement: *id004
|
87
|
+
name: json
|
60
88
|
- !ruby/object:Gem::Dependency
|
61
|
-
|
62
|
-
|
89
|
+
type: :runtime
|
90
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
63
91
|
none: false
|
64
92
|
requirements:
|
65
93
|
- - ~>
|
66
94
|
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
|
95
|
+
hash: 11
|
96
|
+
segments:
|
97
|
+
- 1
|
98
|
+
- 5
|
99
|
+
- 4
|
100
|
+
version: 1.5.4
|
69
101
|
prerelease: false
|
70
|
-
|
102
|
+
requirement: *id005
|
103
|
+
name: json_pure
|
71
104
|
- !ruby/object:Gem::Dependency
|
72
|
-
|
73
|
-
|
105
|
+
type: :development
|
106
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
74
107
|
none: false
|
75
108
|
requirements:
|
76
109
|
- - ~>
|
77
110
|
- !ruby/object:Gem::Version
|
78
|
-
|
111
|
+
hash: 15424023
|
112
|
+
segments:
|
113
|
+
- 1
|
114
|
+
- 2
|
115
|
+
- 0
|
116
|
+
- rc
|
117
|
+
- 1
|
118
|
+
version: 1.2.0.rc1
|
119
|
+
prerelease: false
|
120
|
+
requirement: *id006
|
121
|
+
name: dm-validations
|
122
|
+
- !ruby/object:Gem::Dependency
|
79
123
|
type: :development
|
124
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - ~>
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
hash: 7
|
130
|
+
segments:
|
131
|
+
- 1
|
132
|
+
- 6
|
133
|
+
- 4
|
134
|
+
version: 1.6.4
|
80
135
|
prerelease: false
|
81
|
-
|
136
|
+
requirement: *id007
|
137
|
+
name: jeweler
|
82
138
|
- !ruby/object:Gem::Dependency
|
83
|
-
|
84
|
-
|
139
|
+
type: :development
|
140
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
85
141
|
none: false
|
86
142
|
requirements:
|
87
143
|
- - ~>
|
88
144
|
- !ruby/object:Gem::Version
|
89
|
-
|
145
|
+
hash: 63
|
146
|
+
segments:
|
147
|
+
- 0
|
148
|
+
- 9
|
149
|
+
- 2
|
150
|
+
version: 0.9.2
|
151
|
+
prerelease: false
|
152
|
+
requirement: *id008
|
153
|
+
name: rake
|
154
|
+
- !ruby/object:Gem::Dependency
|
90
155
|
type: :development
|
156
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
157
|
+
none: false
|
158
|
+
requirements:
|
159
|
+
- - ~>
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
hash: 31
|
162
|
+
segments:
|
163
|
+
- 1
|
164
|
+
- 3
|
165
|
+
- 2
|
166
|
+
version: 1.3.2
|
91
167
|
prerelease: false
|
92
|
-
|
168
|
+
requirement: *id009
|
169
|
+
name: rspec
|
93
170
|
description: DataMapper plugin for serializing Resources and Collections
|
94
171
|
email: vandenberg.guy [a] gmail [d] com
|
95
172
|
executables: []
|
@@ -105,8 +182,6 @@ files:
|
|
105
182
|
- README.rdoc
|
106
183
|
- Rakefile
|
107
184
|
- VERSION
|
108
|
-
- autotest/discover.rb
|
109
|
-
- autotest/dmserializer_rspec.rb
|
110
185
|
- benchmarks/to_json.rb
|
111
186
|
- benchmarks/to_xml.rb
|
112
187
|
- dm-serializer.gemspec
|
@@ -136,7 +211,6 @@ files:
|
|
136
211
|
- tasks/spec.rake
|
137
212
|
- tasks/yard.rake
|
138
213
|
- tasks/yardstick.rake
|
139
|
-
has_rdoc: true
|
140
214
|
homepage: http://github.com/datamapper/dm-serializer
|
141
215
|
licenses: []
|
142
216
|
|
@@ -150,29 +224,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
224
|
requirements:
|
151
225
|
- - ">="
|
152
226
|
- !ruby/object:Gem::Version
|
227
|
+
hash: 3
|
228
|
+
segments:
|
229
|
+
- 0
|
153
230
|
version: "0"
|
154
231
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
232
|
none: false
|
156
233
|
requirements:
|
157
|
-
- - "
|
234
|
+
- - ">"
|
158
235
|
- !ruby/object:Gem::Version
|
159
|
-
|
236
|
+
hash: 25
|
237
|
+
segments:
|
238
|
+
- 1
|
239
|
+
- 3
|
240
|
+
- 1
|
241
|
+
version: 1.3.1
|
160
242
|
requirements: []
|
161
243
|
|
162
244
|
rubyforge_project: datamapper
|
163
|
-
rubygems_version: 1.
|
245
|
+
rubygems_version: 1.8.10
|
164
246
|
signing_key:
|
165
247
|
specification_version: 3
|
166
248
|
summary: DataMapper plugin for serializing Resources and Collections
|
167
|
-
test_files:
|
168
|
-
|
169
|
-
- spec/fixtures/planet.rb
|
170
|
-
- spec/fixtures/quan_tum_cat.rb
|
171
|
-
- spec/fixtures/vehicle.rb
|
172
|
-
- spec/lib/serialization_method_shared_spec.rb
|
173
|
-
- spec/public/serializer_spec.rb
|
174
|
-
- spec/public/to_csv_spec.rb
|
175
|
-
- spec/public/to_json_spec.rb
|
176
|
-
- spec/public/to_xml_spec.rb
|
177
|
-
- spec/public/to_yaml_spec.rb
|
178
|
-
- spec/spec_helper.rb
|
249
|
+
test_files: []
|
250
|
+
|
data/autotest/discover.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
require 'autotest'
|
2
|
-
|
3
|
-
$VERBOSE = false
|
4
|
-
|
5
|
-
class RspecCommandError < StandardError; end
|
6
|
-
|
7
|
-
# Autotest has no full-blown snake_case to CamelCase
|
8
|
-
class Autotest::DmserializerRspec < Autotest
|
9
|
-
WHOLE_SUITE_REGEXP = %r{^spec/(unit|integration)/.*_spec\.rb}
|
10
|
-
|
11
|
-
Autotest.add_hook :initialize do |at|
|
12
|
-
at.clear_mappings
|
13
|
-
at.add_exception(/\.git|TAGS/)
|
14
|
-
|
15
|
-
# Updating a spec runs that spec.
|
16
|
-
at.add_mapping(%r{^spec/.*_spec\.rb$}) do |filename, _|
|
17
|
-
filename
|
18
|
-
end
|
19
|
-
|
20
|
-
# Updating spec helper runs the whole suite.
|
21
|
-
at.add_mapping(%r{^spec/spec_helper\.rb}) do |_, m|
|
22
|
-
at.files_matching WHOLE_SUITE_REGEXP
|
23
|
-
end
|
24
|
-
|
25
|
-
# Updating of library file runs the whole suite.
|
26
|
-
at.add_mapping(%r{^lib/.*\.rb}) do |_, m|
|
27
|
-
at.files_matching WHOLE_SUITE_REGEXP
|
28
|
-
end
|
29
|
-
|
30
|
-
# Updating of fixture resources runs the whole suite.
|
31
|
-
at.add_mapping(%r{^spec/fixtures/.*\.rb}) do |_, m|
|
32
|
-
at.files_matching WHOLE_SUITE_REGEXP
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
def initialize(kernel = Kernel, separator = File::SEPARATOR, alt_separator = File::ALT_SEPARATOR) # :nodoc:
|
38
|
-
super() # need parens so that Ruby doesn't pass our args
|
39
|
-
# to the superclass version which takes none..
|
40
|
-
|
41
|
-
@kernel, @separator, @alt_separator = kernel, separator, alt_separator
|
42
|
-
@spec_command = spec_command
|
43
|
-
end
|
44
|
-
|
45
|
-
attr_accessor :failures
|
46
|
-
|
47
|
-
def failed_results(results)
|
48
|
-
results.scan(/^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m)
|
49
|
-
end
|
50
|
-
|
51
|
-
def handle_results(results)
|
52
|
-
@failures = failed_results(results)
|
53
|
-
@files_to_test = consolidate_failures @failures
|
54
|
-
unless $TESTING
|
55
|
-
if @files_to_test.empty?
|
56
|
-
hook :green
|
57
|
-
else
|
58
|
-
hook :red
|
59
|
-
end
|
60
|
-
end
|
61
|
-
@tainted = true unless @files_to_test.empty?
|
62
|
-
end
|
63
|
-
|
64
|
-
def consolidate_failures(failed)
|
65
|
-
filters = Hash.new { |h,k| h[k] = [] }
|
66
|
-
failed.each do |spec, failed_trace|
|
67
|
-
find_files.keys.select { |f| f =~ /spec\// }.each do |f|
|
68
|
-
if failed_trace =~ Regexp.new(f)
|
69
|
-
filters[f] << spec
|
70
|
-
break
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
filters
|
75
|
-
end
|
76
|
-
|
77
|
-
def make_test_cmd(files_to_test)
|
78
|
-
"#{ruby} -S #{@spec_command} #{test_cmd_options} #{files_to_test.keys.flatten.join(' ')}"
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_cmd_options
|
82
|
-
# '-O specs/spec.opts' if File.exist?('specs/spec.opts')
|
83
|
-
end
|
84
|
-
|
85
|
-
# Finds the proper spec command to use. Precendence is set in the
|
86
|
-
# lazily-evaluated method spec_commands. Alias + Override that in
|
87
|
-
# ~/.autotest to provide a different spec command then the default
|
88
|
-
# paths provided.
|
89
|
-
def spec_command(separator=File::ALT_SEPARATOR)
|
90
|
-
unless defined?(@spec_command)
|
91
|
-
@spec_command = spec_commands.find { |cmd| File.exists?(cmd) }
|
92
|
-
|
93
|
-
raise RspecCommandError, "No spec command could be found" unless @spec_command
|
94
|
-
|
95
|
-
@spec_command.gsub!(File::SEPARATOR, separator) if separator
|
96
|
-
end
|
97
|
-
@spec_command
|
98
|
-
end
|
99
|
-
|
100
|
-
# Autotest will look for spec commands in the following
|
101
|
-
# locations, in this order:
|
102
|
-
#
|
103
|
-
# * default spec bin/loader installed in Rubygems
|
104
|
-
# * any spec command found in PATH
|
105
|
-
def spec_commands
|
106
|
-
[File.join(Config::CONFIG['bindir'], 'spec'), 'spec']
|
107
|
-
end
|
108
|
-
end
|