hash-serializer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .idea/*
6
+ hash-serializer.iml
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in hash-serializer.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem "rspec-core", ">=2.5.0"
8
+ gem "rspec-mocks", ">=2.5.0"
9
+ gem "rspec-expectations", ">=2.5.0"
10
+
11
+ end
@@ -0,0 +1,42 @@
1
+
2
+ # INTRODUCTION
3
+
4
+ The aim of this gem is to enable an easy way to serialize an object in a Hash object or a JSON data structure using
5
+ the attributes name as keys.
6
+
7
+ This can be useful if you need to work with XSD schemas while using code generators that convert an schema in
8
+ ruby objects but still you haven't a way to convert to JSON or any other format.
9
+
10
+ # INSTALLATION
11
+ gem install hash-serializer
12
+
13
+ # HOW TO USE
14
+
15
+ require 'hash-serializer'
16
+
17
+ class User
18
+ attr_accessor :nickname
19
+ attr_accessor :email
20
+ attr_accessor :password
21
+
22
+ def initialize(nickname = nil, email = nil, password = nil)
23
+ @nickname = nickname
24
+ @email = email
25
+ @password = password
26
+ end
27
+ end
28
+
29
+ u = User.new("juandebravo", "juan at pollinimini dot net", "*******")
30
+
31
+ u.serialize_to_hash
32
+ => {"nickname"=>"juandebravo", "email"=>"juan at pollinimini dot net", "password"=>"*******"}
33
+
34
+ u.serialize_to_hash(u.nickname)
35
+ => {"juandebravo"=>{"nickname"=>"juandebravo", "email"=>"juan at pollinimini dot net", "password"=>"*******"}}
36
+
37
+ puts u.serialize_to_json
38
+ => {"nickname":"juandebravo","email":"juan at pollinimini dot net","password":"*******"}
39
+
40
+ puts u.serialize_to_json("user")
41
+ => {"user":{"nickname":"juandebravo","email":"juan at pollinimini dot net","password":"*******"}}
42
+
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ require "hash-serializer/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "hash-serializer"
8
+ s.version = HashSerializer::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Juan de Bravo"]
11
+ s.email = ["juandebravo@gmail.com"]
12
+ s.homepage = ""
13
+ s.summary = %q{This gem provides an easy way to wrap a class attributes in a key-value representation (Hash object in ruby)}
14
+ s.description = <<END
15
+ Some months ago I worked in a project that defined the data serialization using a XSD schema. I used soap4r gem to create
16
+ ruby objects from the XSD schema, but later I needed to serialize the object value in JSON format. So I defined this
17
+ this extension that enables an easy way to encode an object attributes in Hash and in JSON format.
18
+ END
19
+
20
+ s.rubyforge_project = "hash-serializer"
21
+
22
+ s.files = `git ls-files`.split("\n")
23
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
+ s.require_paths = ["lib"]
26
+
27
+ s.add_dependency("json_pure", ">= 1.4.3")
28
+ end
@@ -0,0 +1,4 @@
1
+ require 'hash-serializer/extensions/object'
2
+ module HashSerializer
3
+ # Your code goes here...
4
+ end
@@ -0,0 +1,63 @@
1
+ require 'json'
2
+
3
+ class Object
4
+
5
+ #
6
+ # Instance method to parse an object to an equivalent Hash format
7
+ # Used to serialize body data
8
+ #
9
+ def serialize_to_hash(root_name = nil)
10
+ result = Hash.new
11
+ self.instance_variables.each do |column|
12
+ aux = self.instance_variable_get(column)
13
+ unless aux.nil?
14
+ if aux.instance_of?(String) or aux.kind_of?(String)
15
+ # It's required to erase any '_' character because
16
+ # soap4r has included it (not idea about the reason)
17
+ result[self.class.get_column_value(column)] = aux.to_s
18
+ else
19
+ if aux.is_a?(Array)
20
+ result_aux = Array.new
21
+ aux.each do |elem|
22
+ result_aux << elem.serialize_to_hash
23
+ end
24
+ else
25
+ result_aux = aux.serialize_to_hash
26
+ end
27
+ result[self.class.get_column_value(column)] = result_aux
28
+ end
29
+ end
30
+ end
31
+ unless root_name.nil?
32
+ temp = result
33
+ result = {}
34
+ result[root_name] = temp
35
+ end
36
+ result
37
+ end
38
+
39
+ #
40
+ # Convert the Hashed object to a String containing the object JSON format
41
+ #
42
+ def serialize_to_json(root_name = nil)
43
+ serialize_to_hash(root_name).to_json
44
+ end
45
+
46
+ private
47
+
48
+ class << self
49
+ #
50
+ # Retrieves the attribute name
51
+ #
52
+ def get_column_value(column)
53
+ column = column.to_s.sub(/@/, '')
54
+ unless column.index('_').nil?
55
+ column = column.split('_')[1]
56
+ end
57
+ column
58
+ end
59
+
60
+ end
61
+
62
+
63
+ end
@@ -0,0 +1,4 @@
1
+ module HashSerializer
2
+ VERSION = "0.1.0"
3
+ end
4
+
@@ -0,0 +1,161 @@
1
+ require 'hash-serializer'
2
+
3
+ describe "hash-serializer" do
4
+
5
+ # Generates a method whose return value is memoized after the first call.
6
+ let(:obj) {
7
+ obj = Object.new
8
+ obj.instance_variable_set("@foo".to_sym, "bar")
9
+ obj.instance_variable_set("@bar".to_sym, "bazz")
10
+ obj
11
+ }
12
+
13
+ # Generates a method whose return value is memoized after the first call.
14
+ let(:complex_obj) {
15
+ complex_obj = Object.new
16
+ complex_obj.instance_variable_set("@foo".to_sym, "bar")
17
+ complex_obj.instance_variable_set("@bar".to_sym, "bazz")
18
+ complex_obj.instance_variable_set("@bazz".to_sym, obj)
19
+ complex_obj.instance_variable_set("@array".to_sym, [obj, obj])
20
+ complex_obj
21
+ }
22
+
23
+ describe "basic object" do
24
+
25
+ describe "object to json extension" do
26
+ it "converts properly a basic object with root name" do
27
+ json_obj = obj.serialize_to_json("object")
28
+ json_obj.should be_a_kind_of(String)
29
+ json_obj = JSON.parse(json_obj)
30
+ json_obj.should be_a_kind_of(Hash)
31
+
32
+ json_obj.should have_key("object")
33
+ json_obj = json_obj["object"]
34
+ json_obj.should have_key("foo")
35
+ json_obj.should have_key("bar")
36
+ end
37
+
38
+
39
+ it "converts properly a basic object without root name" do
40
+ json_obj = obj.serialize_to_json
41
+ json_obj.should be_a_kind_of(String)
42
+ json_obj = JSON.parse(json_obj)
43
+ json_obj.should be_a_kind_of(Hash)
44
+
45
+ json_obj.should have_key("foo")
46
+ json_obj.should have_key("bar")
47
+ end
48
+
49
+ end
50
+
51
+ describe "object to hash extension" do
52
+ it "converts properly a basic object without root name" do
53
+ json_obj = obj.serialize_to_hash
54
+
55
+ json_obj.should be_a_kind_of(Hash)
56
+ json_obj.should have_key("foo")
57
+ json_obj.should have_key("bar")
58
+ end
59
+
60
+ it "converts properly a basic object with root name" do
61
+ json_obj = obj.serialize_to_hash("foo")
62
+ json_obj.should be_a_kind_of(Hash)
63
+ json_obj.should have_key("foo")
64
+
65
+ json_obj = json_obj["foo"]
66
+ json_obj.should have_key("foo")
67
+ json_obj.should have_key("bar")
68
+ end
69
+
70
+ it "converts properly a basic object with a symbol as root name" do
71
+ json_obj = obj.serialize_to_hash(:foo)
72
+ json_obj.should be_a_kind_of(Hash)
73
+ json_obj.should have_key(:foo)
74
+
75
+ json_obj = json_obj[:foo]
76
+ json_obj.should have_key("foo")
77
+ json_obj.should have_key("bar")
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "object with another object as attribute" do
83
+
84
+ describe "object to hash extension" do
85
+ it "converts properly a complex object without root name" do
86
+
87
+ json_obj = complex_obj.serialize_to_hash
88
+
89
+ ["foo", "bar", "bazz"].each { |key|
90
+ json_obj.should have_key(key)
91
+ }
92
+
93
+ bazz = json_obj["bazz"]
94
+ ["foo", "bar"].each { |key|
95
+ bazz.should have_key(key)
96
+ }
97
+ end
98
+
99
+ it "converts properly a complex object wit root name" do
100
+
101
+ json_obj = complex_obj.serialize_to_hash(:object)
102
+
103
+ json_obj.should be_a_kind_of(Hash)
104
+ json_obj.should have_key(:object)
105
+ json_obj = json_obj[:object]
106
+
107
+ ["foo", "bar", "bazz"].each { |key|
108
+ json_obj.should have_key(key)
109
+ }
110
+
111
+ bazz = json_obj["bazz"]
112
+ ["foo", "bar"].each { |key|
113
+ bazz.should have_key(key)
114
+ }
115
+ end
116
+
117
+ end
118
+
119
+ end
120
+
121
+ describe "object with an array as attribute" do
122
+ describe "object to hash extension" do
123
+ it "converts properly a complex object without root name" do
124
+
125
+ json_obj = complex_obj.serialize_to_hash
126
+
127
+ ["foo", "bar", "bazz", "array"].each { |key|
128
+ json_obj.should have_key(key)
129
+ }
130
+
131
+ array = json_obj["array"]
132
+ array.length.should be 2
133
+ elem = array[0]
134
+ ["foo", "bar"].each { |key|
135
+ elem.should have_key(key)
136
+ }
137
+ end
138
+ end
139
+
140
+ describe "object to json extension" do
141
+
142
+ it "converts properly a basic object with root name" do
143
+ json_obj = complex_obj.serialize_to_json
144
+ json_obj.should be_a_kind_of(String)
145
+ json_obj = JSON.parse(json_obj)
146
+ json_obj.should be_a_kind_of(Hash)
147
+ ["foo", "bar", "bazz", "array"].each { |key|
148
+ json_obj.should have_key(key)
149
+ }
150
+ array = json_obj["array"]
151
+ array.length.should be 2
152
+ elem = array[0]
153
+ ["foo", "bar"].each { |key|
154
+ elem.should have_key(key)
155
+ }
156
+ end
157
+ end
158
+
159
+ end
160
+
161
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hash-serializer
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Juan de Bravo
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-04-05 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: json_pure
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 4
31
+ - 3
32
+ version: 1.4.3
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: " Some months ago I worked in a project that defined the data serialization using a XSD schema. I used soap4r gem to create\n ruby objects from the XSD schema, but later I needed to serialize the object value in JSON format. So I defined this\n this extension that enables an easy way to encode an object attributes in Hash and in JSON format.\n"
36
+ email:
37
+ - juandebravo@gmail.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - .gitignore
46
+ - Gemfile
47
+ - README.md
48
+ - Rakefile
49
+ - hash-serializer.gemspec
50
+ - lib/hash-serializer.rb
51
+ - lib/hash-serializer/extensions/object.rb
52
+ - lib/hash-serializer/version.rb
53
+ - spec/hash-serializer-spec.rb
54
+ has_rdoc: true
55
+ homepage: ""
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options: []
60
+
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ requirements: []
80
+
81
+ rubyforge_project: hash-serializer
82
+ rubygems_version: 1.3.7
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: This gem provides an easy way to wrap a class attributes in a key-value representation (Hash object in ruby)
86
+ test_files:
87
+ - spec/hash-serializer-spec.rb