qoobaa-to_hash 0.1.0
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/README.rdoc +13 -0
- data/VERSION.yml +4 -0
- data/lib/to_hash.rb +37 -0
- data/test/to_hash_test.rb +51 -0
- metadata +56 -0
data/README.rdoc
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
= to_hash
|
|
2
|
+
|
|
3
|
+
Easy and powerful object to hash serialization tool. It may be used together with to_json/to_xml/to_yaml standard methods.
|
|
4
|
+
|
|
5
|
+
== Usage
|
|
6
|
+
|
|
7
|
+
hash = employee.to_hash(:firstName => :first_name, :lastName => :last_name, :projects => [:projects, :title])
|
|
8
|
+
# => { :firstName => "John", :lastName => "Doe", :projects => [{ :title => "Project 1" }, { :title => "Project 2" }] }
|
|
9
|
+
{ :employee => hash }.to_json
|
|
10
|
+
|
|
11
|
+
= License
|
|
12
|
+
|
|
13
|
+
Copyright (c) 2009 Jakub Kuźma, released under the MIT license
|
data/VERSION.yml
ADDED
data/lib/to_hash.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module ToHash
|
|
2
|
+
def self.eval_object(object, attributes)
|
|
3
|
+
if object.kind_of?(Array)
|
|
4
|
+
object.map { |o| eval_attributes(o, attributes) }
|
|
5
|
+
else
|
|
6
|
+
eval_attributes(object, attributes)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.eval_attributes(object, attributes)
|
|
11
|
+
result = {}
|
|
12
|
+
attributes = attributes.first if attributes.first.kind_of?(Hash)
|
|
13
|
+
case attributes
|
|
14
|
+
when Array
|
|
15
|
+
attributes.each do |attribute|
|
|
16
|
+
if attribute.kind_of?(Array)
|
|
17
|
+
result[attribute.first] = eval_object(object.send(attribute.first), attribute[1..-1])
|
|
18
|
+
else
|
|
19
|
+
result[attribute] = object.send(attribute)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
when Hash
|
|
23
|
+
attributes.each do |key, attribute|
|
|
24
|
+
if attribute.kind_of?(Array)
|
|
25
|
+
result[key] = eval_object(object.send(attribute.first), attribute[1..-1])
|
|
26
|
+
else
|
|
27
|
+
result[key] = object.send(attribute)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
result
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def to_hash(*attributes)
|
|
35
|
+
ToHash.eval_attributes(self, attributes)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "shoulda"
|
|
3
|
+
require "ostruct"
|
|
4
|
+
|
|
5
|
+
require File.join(File.dirname(__FILE__), "..", "lib", "to_hash")
|
|
6
|
+
|
|
7
|
+
class ToHashTest < Test::Unit::TestCase
|
|
8
|
+
context "project structures serialization" do
|
|
9
|
+
setup do
|
|
10
|
+
@project1 = OpenStruct.new(:title => "Project 1", :description => "Project 1 description")
|
|
11
|
+
@project2 = OpenStruct.new(:title => "Project 2")
|
|
12
|
+
@project3 = OpenStruct.new(:title => "Project 3")
|
|
13
|
+
|
|
14
|
+
@project1.authors = []
|
|
15
|
+
@project1.authors << OpenStruct.new(:first_name => "John", :last_name => "Doe", :projects => [@project1])
|
|
16
|
+
@project1.authors << OpenStruct.new(:first_name => "Michael", :last_name => "Smith", :projects => [@project1, @project2])
|
|
17
|
+
@project1.authors << OpenStruct.new(:first_name => "Jimmy", :last_name => "Parker", :projects => [@project1, @project2, @project3])
|
|
18
|
+
@project1.company = OpenStruct.new(:name => "HAL")
|
|
19
|
+
|
|
20
|
+
@project1.extend(ToHash)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "return empty hash when no arguments given" do
|
|
24
|
+
hash = @project1.to_hash
|
|
25
|
+
assert_equal hash, {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "serialize data using title symbol" do
|
|
29
|
+
hash = @project1.to_hash(:title)
|
|
30
|
+
assert_equal hash, { :title => "Project 1" }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
should "serialize data using title and description" do
|
|
34
|
+
hash = @project1.to_hash(:title, :description)
|
|
35
|
+
assert_equal hash, { :title => "Project 1", :description => "Project 1 description" }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "allow to change one key in hash" do
|
|
39
|
+
hash = @project1.to_hash(:myTitle => :title)
|
|
40
|
+
assert_equal hash, { :myTitle => "Project 1" }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
should "allow to change multiple keys in hash" do
|
|
44
|
+
hash = @project1.to_hash(:myTitle => :title, :myDesc => :description)
|
|
45
|
+
assert_equal hash, { :myTitle => "Project 1", :myDesc => "Project 1 description" }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# TODO: more test (no time right now)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
metadata
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: qoobaa-to_hash
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- "Jakub Ku\xC5\xBAma"
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
|
|
12
|
+
date: 2009-05-10 00:00:00 -07:00
|
|
13
|
+
default_executable:
|
|
14
|
+
dependencies: []
|
|
15
|
+
|
|
16
|
+
description: Use to_hash(...) together with default to_json/to_xml/to_yaml methods to get quick and powerful object serialization.
|
|
17
|
+
email: qoobaa@gmail.com
|
|
18
|
+
executables: []
|
|
19
|
+
|
|
20
|
+
extensions: []
|
|
21
|
+
|
|
22
|
+
extra_rdoc_files: []
|
|
23
|
+
|
|
24
|
+
files:
|
|
25
|
+
- README.rdoc
|
|
26
|
+
- VERSION.yml
|
|
27
|
+
- lib/to_hash.rb
|
|
28
|
+
- test/to_hash_test.rb
|
|
29
|
+
has_rdoc: false
|
|
30
|
+
homepage: http://github.com/qoobaa/to_hash
|
|
31
|
+
post_install_message:
|
|
32
|
+
rdoc_options: []
|
|
33
|
+
|
|
34
|
+
require_paths:
|
|
35
|
+
- lib
|
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: "0"
|
|
41
|
+
version:
|
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: "0"
|
|
47
|
+
version:
|
|
48
|
+
requirements: []
|
|
49
|
+
|
|
50
|
+
rubyforge_project:
|
|
51
|
+
rubygems_version: 1.2.0
|
|
52
|
+
signing_key:
|
|
53
|
+
specification_version: 2
|
|
54
|
+
summary: ToHash module for easy object serialization to JSON, XML, YAML, etc.
|
|
55
|
+
test_files: []
|
|
56
|
+
|