cereal_eyes 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ module CerealEyes
2
+
3
+ autoload :Document, File.dirname(__FILE__) + '/cereal_eyes/document'
4
+
5
+ autoload :AttributeError, File.dirname(__FILE__) + '/cereal_eyes/attribute_error'
6
+
7
+ end
@@ -0,0 +1,8 @@
1
+ module CerealEyes
2
+
3
+ # An error class representing an error in an attribute configuration
4
+ # message gives more details on what the cause is
5
+ class AttributeError < StandardError
6
+ end
7
+
8
+ end
@@ -0,0 +1,104 @@
1
+ require File.dirname(__FILE__) + '/attribute_error'
2
+
3
+ module CerealEyes
4
+
5
+ module Document
6
+
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ base.send :include, InstanceMethods
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ # Details of the serialized attributes on this class
15
+ # @return Array the serialized attributes
16
+ def serialized_attributes
17
+ @serialized_attributes ||= []
18
+ end
19
+
20
+ # Define an attribute on this model
21
+ # @param name [String] - the name of this field
22
+ # @option options [Object] :default - A default value for this attribute if it not given
23
+ # @option options [Boolean] :deserialize - Whether or not to deserialize this field (default: true)
24
+ # @option options [Boolean] :serialize - Whether or not to serialize this field (default: true)
25
+ # @option options [String|Symbol] :name - An alternate name for the serialized form of this field
26
+ # @option options [Class] :type - A nested type for this segment
27
+ # @option options [Boolean] :squash_nil - Whether or not to output nil values (default: true)
28
+ def attribute(field, options = {})
29
+ # set defaults
30
+ options[:deserialize] = true unless options.has_key?(:deserialize)
31
+ options[:serialize] = true unless options.has_key?(:serialize)
32
+ options[:squash_nil] = true unless options.has_key?(:squash_nil)
33
+ options[:name] ||= field
34
+ options[:name] = options[:name].to_sym unless Symbol === options[:name]
35
+ options[:field] = field
36
+ # make sure we're not breaking the serialization rule
37
+ if serialized_attributes.any? { |o| o[:serialize] && options[:serialize] && o[:name] == options[:name] }
38
+ raise CerealEyes::AttributeError.new "Unable to set duplicate attribute for serialization with name: #{options[:name]}"
39
+ end
40
+ if serialized_attributes.any? { |o| o[:deserialize] && options[:deserialize] && o[:field] == options[:field] }
41
+ raise CerealEyes::AttributeError.new "Unable to set duplicate attribute for deserialization on field: #{options[:field]}"
42
+ end
43
+ # add to hash
44
+ key = options[:name].is_a?(Symbol) ? options[:name] : options[:name].to_sym
45
+ serialized_attributes << options
46
+ # create the reader if deserializable
47
+ attr_reader(field) if options[:deserialize]
48
+ attr_writer(field) if options[:serialize]
49
+ nil
50
+ end
51
+
52
+ # Perform the deserialization on a hash, returning the resultant object
53
+ def deserialize(data)
54
+ return nil if data.nil?
55
+ obj = new
56
+ # go through what we have and use it
57
+ serialized_attributes.each do |options|
58
+ next unless options[:deserialize]
59
+ name = options[:name]
60
+ value = data[name]
61
+ value ||= data[name.to_s] unless String === name
62
+ if value && options[:type] # nesting
63
+ if value.is_a?(Array)
64
+ value = value.map { |v| puts v.inspect; options[:type].deserialize(v) }
65
+ else
66
+ value = options[:type].deserialize(value)
67
+ end
68
+ end
69
+ obj.instance_variable_set(:"@#{options[:field]}", value || options[:default])
70
+ end
71
+ obj
72
+ end
73
+
74
+ end
75
+
76
+ module InstanceMethods
77
+
78
+ # Serialize the given document
79
+ # @return Hash representing the serialized format of the document
80
+ def serialize
81
+ data = {}
82
+ self.class.serialized_attributes.each do |options|
83
+ next unless options[:serialize]
84
+ value = instance_variable_get(:"@#{options[:field]}") || options[:default]
85
+ if value && options[:type]
86
+ if value.kind_of?(CerealEyes::Document)
87
+ value = value.serialize
88
+ elsif value.is_a?(Array)
89
+ value = value.map(&:serialize)
90
+ else
91
+ raise ArgumentError.new("Don't know how to serialize type: #{options[:type]}")
92
+ end
93
+ end
94
+ value = value.serialize if value.kind_of?(CerealEyes::Document)
95
+ data[options[:name]] = value if value || !options[:squash_nil]
96
+ end
97
+ data
98
+ end
99
+
100
+ end
101
+
102
+ end
103
+
104
+ end
@@ -0,0 +1,5 @@
1
+ module CerealEyes
2
+
3
+ VERSION = '0.0.1'
4
+
5
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/../lib/cereal_eyes'
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cereal_eyes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - John Crepezzi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-13 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70342542869680 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70342542869680
25
+ description: a proof of concept serialization format based on GSON
26
+ email: john.crepezzi@gmail.com
27
+ executables: []
28
+ extensions: []
29
+ extra_rdoc_files: []
30
+ files:
31
+ - lib/cereal_eyes/attribute_error.rb
32
+ - lib/cereal_eyes/document.rb
33
+ - lib/cereal_eyes/version.rb
34
+ - lib/cereal_eyes.rb
35
+ - spec/spec_helper.rb
36
+ homepage: http://seejohnrun.github.com/cereal_eyes
37
+ licenses: []
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 1.8.17
57
+ signing_key:
58
+ specification_version: 3
59
+ summary: GSON-like Serialization
60
+ test_files:
61
+ - spec/spec_helper.rb