ar_serialize 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/Gemfile +10 -0
- data/Gemfile.lock +43 -0
- data/Rakefile +18 -0
- data/Readme.md +23 -0
- data/VERSION +1 -0
- data/ar_serialize.gemspec +43 -0
- data/lib/ar_serialize.rb +39 -0
- data/spec/ar_serialize_spec.rb +43 -0
- data/spec/setup_test_model.rb +16 -0
- data/spec/spec_helper.rb +4 -0
- metadata +89 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activemodel (3.0.9)
|
5
|
+
activesupport (= 3.0.9)
|
6
|
+
builder (~> 2.1.2)
|
7
|
+
i18n (~> 0.5.0)
|
8
|
+
activerecord (3.0.9)
|
9
|
+
activemodel (= 3.0.9)
|
10
|
+
activesupport (= 3.0.9)
|
11
|
+
arel (~> 2.0.10)
|
12
|
+
tzinfo (~> 0.3.23)
|
13
|
+
activesupport (3.0.9)
|
14
|
+
arel (2.0.10)
|
15
|
+
builder (2.1.2)
|
16
|
+
diff-lcs (1.1.2)
|
17
|
+
git (1.2.5)
|
18
|
+
i18n (0.5.0)
|
19
|
+
jeweler (1.6.2)
|
20
|
+
bundler (~> 1.0)
|
21
|
+
git (>= 1.2.5)
|
22
|
+
rake
|
23
|
+
rake (0.9.2)
|
24
|
+
rspec (2.6.0)
|
25
|
+
rspec-core (~> 2.6.0)
|
26
|
+
rspec-expectations (~> 2.6.0)
|
27
|
+
rspec-mocks (~> 2.6.0)
|
28
|
+
rspec-core (2.6.4)
|
29
|
+
rspec-expectations (2.6.0)
|
30
|
+
diff-lcs (~> 1.1.2)
|
31
|
+
rspec-mocks (2.6.0)
|
32
|
+
sqlite3 (1.3.3)
|
33
|
+
tzinfo (0.3.28)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
activerecord
|
40
|
+
jeweler
|
41
|
+
rake
|
42
|
+
rspec (~> 2)
|
43
|
+
sqlite3
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
task :default do
|
2
|
+
sh "rspec spec/"
|
3
|
+
end
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = 'ar_serialize'
|
9
|
+
gem.summary = "Efficient serialize/deserialize of nested Hashes/Arrays including ActiveRecords "
|
10
|
+
gem.email = "michael@grosser.it"
|
11
|
+
gem.homepage = "http://github.com/grosser/#{gem.name}"
|
12
|
+
gem.authors = ["Michael Grosser"]
|
13
|
+
end
|
14
|
+
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: gem install jeweler"
|
18
|
+
end
|
data/Readme.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Efficient serialize/deserialize of nested Hashes/Arrays with ActiveRecords.
|
2
|
+
|
3
|
+
Strips unnecessary info like attributes/associations from infinetly deep Hashes/Arrays.
|
4
|
+
|
5
|
+
Install
|
6
|
+
=======
|
7
|
+
sudo gem install ar_serialize
|
8
|
+
Or
|
9
|
+
rails plugin install git://github.com/grosser/ar_serialize.git
|
10
|
+
|
11
|
+
Usage
|
12
|
+
=====
|
13
|
+
|
14
|
+
{:foo => <User>}.to_yaml --> tons of stuff including asociations and attriutes
|
15
|
+
ArSerialize.seriazlize(:foo => <User>) --> {:foo => "ActiveRecord:User:15"}
|
16
|
+
ArSerialize.deseriazlize(:foo => 'ActiveRecord:User:15') --> {:foo => <User>}
|
17
|
+
|
18
|
+
|
19
|
+
Author
|
20
|
+
======
|
21
|
+
[Michael Grosser](http://grosser.it)<br/>
|
22
|
+
michael@grosser.it<br/>
|
23
|
+
Hereby placed under public domain, do what you want, just do not hold me accountable...
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ar_serialize}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Michael Grosser"]
|
12
|
+
s.date = %q{2011-06-19}
|
13
|
+
s.email = %q{michael@grosser.it}
|
14
|
+
s.files = [
|
15
|
+
"Gemfile",
|
16
|
+
"Gemfile.lock",
|
17
|
+
"Rakefile",
|
18
|
+
"Readme.md",
|
19
|
+
"VERSION",
|
20
|
+
"ar_serialize.gemspec",
|
21
|
+
"lib/ar_serialize.rb",
|
22
|
+
"spec/ar_serialize_spec.rb",
|
23
|
+
"spec/setup_test_model.rb",
|
24
|
+
"spec/spec_helper.rb"
|
25
|
+
]
|
26
|
+
s.homepage = %q{http://github.com/grosser/ar_serialize}
|
27
|
+
s.require_paths = ["lib"]
|
28
|
+
s.rubygems_version = %q{1.6.2}
|
29
|
+
s.summary = %q{Efficient serialize/deserialize of nested Hashes/Arrays including ActiveRecords}
|
30
|
+
|
31
|
+
if s.respond_to? :specification_version then
|
32
|
+
s.specification_version = 3
|
33
|
+
|
34
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
35
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
38
|
+
end
|
39
|
+
else
|
40
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
data/lib/ar_serialize.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module ARSerialize
|
4
|
+
VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
|
5
|
+
|
6
|
+
def self.serialize(v)
|
7
|
+
if v.is_a?(ActiveRecord::Base)
|
8
|
+
"ActiveRecord:#{v.class}:#{v.id}"
|
9
|
+
elsif v.is_a?(Hash)
|
10
|
+
Hash[v.map do |k,value|
|
11
|
+
[k, serialize(value)]
|
12
|
+
end]
|
13
|
+
elsif v.is_a?(Array)
|
14
|
+
v.map do |value|
|
15
|
+
serialize(value)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
v
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.deserialize(v)
|
23
|
+
if v.is_a?(String) and v =~ /^ActiveRecord:(\w+):(\d+)$/
|
24
|
+
$1.constantize.find($2)
|
25
|
+
elsif v.is_a?(Hash)
|
26
|
+
result = Hash[v.map do |k,value|
|
27
|
+
[k, deserialize(value)]
|
28
|
+
end]
|
29
|
+
|
30
|
+
v.is_a?(HashWithIndifferentAccess) ? result.with_indifferent_access : result
|
31
|
+
elsif v.is_a?(Array)
|
32
|
+
v.map do |value|
|
33
|
+
deserialize(value)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
v
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe ARSerialize do
|
4
|
+
describe :serialize do
|
5
|
+
it "does not change normal values" do
|
6
|
+
ARSerialize.serialize('x').should == 'x'
|
7
|
+
ARSerialize.serialize([1,2,[3,4]]).should == [1,2,[3,4]]
|
8
|
+
ARSerialize.serialize({:x => {:y => 1}}).should == {:x => {:y => 1}}
|
9
|
+
end
|
10
|
+
|
11
|
+
it "serializes ar" do
|
12
|
+
user = User.create!(:title => 'foo')
|
13
|
+
serialized = "ActiveRecord:User:#{user.id}"
|
14
|
+
ARSerialize.serialize(user).should == serialized
|
15
|
+
ARSerialize.serialize([1,2,[3,user]]).should == [1,2,[3,serialized]]
|
16
|
+
ARSerialize.serialize({:x => {:y => user}}).should == {:x => {:y => serialized}}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe :deserialize do
|
21
|
+
it "does not change normal values" do
|
22
|
+
ARSerialize.deserialize('x').should == 'x'
|
23
|
+
ARSerialize.deserialize([1,2,[3,4]]).should == [1,2,[3,4]]
|
24
|
+
ARSerialize.deserialize({:x => {:y => 1}}).should == {:x => {:y => 1}}
|
25
|
+
end
|
26
|
+
|
27
|
+
it "deserializes ar" do
|
28
|
+
user = User.create!(:title => 'foo')
|
29
|
+
serialized = "ActiveRecord:User:#{user.id}"
|
30
|
+
ARSerialize.deserialize(serialized).should == user
|
31
|
+
ARSerialize.deserialize([1,2,[3,serialized]]).should == [1,2,[3,user]]
|
32
|
+
ARSerialize.deserialize([1,2,[serialized,3]]).should == [1,2,[user,3]]
|
33
|
+
ARSerialize.deserialize({:x => {:y => serialized}}).should == {:x => {:y => user}}
|
34
|
+
end
|
35
|
+
|
36
|
+
it "deserializes with indifferent access" do
|
37
|
+
result = ARSerialize.deserialize({:x => {:y => 1}}.with_indifferent_access)
|
38
|
+
result['x']['y'].should == 1
|
39
|
+
result = ARSerialize.deserialize({:x => {:y => 1}})
|
40
|
+
result['x'].should == nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# connect
|
2
|
+
ActiveRecord::Base.establish_connection(
|
3
|
+
:adapter => "sqlite3",
|
4
|
+
:database => ":memory:"
|
5
|
+
)
|
6
|
+
|
7
|
+
# create tables
|
8
|
+
ActiveRecord::Schema.define(:version => 1) do
|
9
|
+
create_table :users do |t|
|
10
|
+
t.string :title
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# create models
|
15
|
+
class User < ActiveRecord::Base
|
16
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ar_serialize
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Michael Grosser
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-19 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
name: activerecord
|
33
|
+
version_requirements: *id001
|
34
|
+
prerelease: false
|
35
|
+
description:
|
36
|
+
email: michael@grosser.it
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- Gemfile
|
45
|
+
- Gemfile.lock
|
46
|
+
- Rakefile
|
47
|
+
- Readme.md
|
48
|
+
- VERSION
|
49
|
+
- ar_serialize.gemspec
|
50
|
+
- lib/ar_serialize.rb
|
51
|
+
- spec/ar_serialize_spec.rb
|
52
|
+
- spec/setup_test_model.rb
|
53
|
+
- spec/spec_helper.rb
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://github.com/grosser/ar_serialize
|
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
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
requirements: []
|
82
|
+
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 1.6.2
|
85
|
+
signing_key:
|
86
|
+
specification_version: 3
|
87
|
+
summary: Efficient serialize/deserialize of nested Hashes/Arrays including ActiveRecords
|
88
|
+
test_files: []
|
89
|
+
|