thirtythirty 0.0.1 → 0.0.2

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/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ spec/reports
data/README.rdoc ADDED
@@ -0,0 +1,25 @@
1
+ = thirty-thirty
2
+
3
+ the right hand of Marshall BraveStarr
4
+
5
+ Selectively marshal objects without the fancy ruby 1.9 marshalling:
6
+
7
+ class Marshalled
8
+ extend Thirtythirty
9
+
10
+ marshalled_accessor :attr1, :attr2
11
+ attr_accessor :volatile_attr
12
+ end
13
+
14
+ original = Marshalled.new
15
+ original.attr1 = "value1"
16
+ original.volatile_attr = "non-marshalled"
17
+
18
+ marshalled = Marshal.dump(original)
19
+
20
+ reloaded = Marshal.load(marshalled)
21
+
22
+ reloaded.attr1 # => "value1"
23
+ reloaded.volatile_attr # => nil
24
+
25
+ Note: Custom marshalling will only be activated by calling one of the marshalling methods (marshal, marshalled_reader, marshalled_writer, marshalled_accessor), not by extending Thirtythirty alone.
data/Rakefile CHANGED
@@ -2,4 +2,7 @@ require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
3
 
4
4
  require 'rspec/core/rake_task'
5
+ require 'ci/reporter/rake/rspec'
6
+
5
7
  RSpec::Core::RakeTask.new :spec
8
+ task :default => %w(ci:setup:rspec spec)
data/lib/thirtythirty.rb CHANGED
@@ -2,10 +2,37 @@ require "json"
2
2
 
3
3
  module Thirtythirty
4
4
 
5
+ # Activates marshalling for the given attributes - you have to implement getters/setters yourself!
5
6
  def marshal(*attributes)
6
- extend ClassMethods
7
- send :include, InstanceMethods
8
- @marshalled_attributes = attributes
7
+ configure_marshalling(attributes)
8
+ end
9
+
10
+ # Activates marshalling for the given attributes and generates getters - you have to implement setters yourself!
11
+ def marshalled_reader(*attributes)
12
+ attr_reader *configure_marshalling(attributes)
13
+ end
14
+
15
+ # Activates marshalling for the given attributes and generates setters - you have to implement getters yourself!
16
+ def marshalled_writer(*attributes)
17
+ attr_writer *configure_marshalling(attributes)
18
+ end
19
+
20
+ # Activates marshalling for the given attributes and generates getters/setters.
21
+ def marshalled_accessor(*attributes)
22
+ attr_accessor *configure_marshalling(attributes)
23
+ end
24
+
25
+ private
26
+
27
+ def configure_marshalling(attributes)
28
+ unless defined?(@marshalled_attributes)
29
+ extend ClassMethods
30
+ send :include, InstanceMethods
31
+ @marshalled_attributes = []
32
+ end
33
+ attributes = attributes.flatten.map(&:to_s).uniq
34
+ @marshalled_attributes = (@marshalled_attributes | attributes).sort.freeze
35
+ attributes.map(&:to_sym)
9
36
  end
10
37
 
11
38
  module ClassMethods
@@ -18,7 +45,7 @@ module Thirtythirty
18
45
  data = JSON.parse(dumped)
19
46
  obj = new
20
47
  marshalled_attributes.each do |attr|
21
- obj.send(:"#{attr}=", Marshal.load(data[attr.to_s]))
48
+ obj.send(:"#{attr}=", Marshal.load(data[attr]))
22
49
  end
23
50
  obj
24
51
  end
data/spec/spec_helper.rb CHANGED
@@ -5,13 +5,12 @@ Bundler.require(:default, :development)
5
5
  Dir[File.expand_path '../support/*.rb', __FILE__].each {|f| require f}
6
6
 
7
7
 
8
- class Base
8
+ class ThirtythirtyBase
9
9
  extend Thirtythirty
10
10
  end
11
11
 
12
- class BlogPost < Base
12
+ class BlogPost < ThirtythirtyBase
13
13
  marshal :title, :description, :comments
14
-
15
14
  attr_accessor :title, :description, :comments, :secret_password
16
15
  def initialize(attributes={})
17
16
  self.title = attributes[:title] || 'My first blog post'
@@ -21,7 +20,7 @@ class BlogPost < Base
21
20
  end
22
21
  end
23
22
 
24
- class Comment < Base
23
+ class Comment < ThirtythirtyBase
25
24
  marshal :author, :body, :date
26
25
  attr_accessor :author, :body, :date
27
26
  def initialize(attributes={})
@@ -0,0 +1,144 @@
1
+ require 'spec_helper'
2
+
3
+ describe Thirtythirty do
4
+
5
+ describe ".marshal" do
6
+
7
+ subject do
8
+ cls = Class.new(ThirtythirtyBase) do
9
+ marshal :attr1, :attr3
10
+ marshal [:attr1, :attr2]
11
+ end
12
+ end
13
+
14
+ it "should add given attributes to marshalled attributes (stringified, unique, sorted, frozen)" do
15
+ subject.marshalled_attributes.should == %w(attr1 attr2 attr3)
16
+ subject.marshalled_attributes.should be_frozen
17
+ end
18
+
19
+ end
20
+
21
+ describe ".marshalled_reader" do
22
+
23
+ subject do
24
+ Class.new(ThirtythirtyBase) do
25
+ marshalled_reader :attr1, :attr3
26
+ marshalled_reader [:attr1, :attr2]
27
+ end
28
+ end
29
+
30
+ it "should add given attributes to marshalled attributes (stringified, unique, sorted, frozen)" do
31
+ subject.marshalled_attributes.should == %w(attr1 attr2 attr3)
32
+ subject.marshalled_attributes.should be_frozen
33
+ end
34
+
35
+ %w(attr1 attr2 attr3).each do |attr|
36
+
37
+ it "should generate a reader for attribute #{attr} (but no writer)" do
38
+ obj = subject.new
39
+ obj.should respond_to(attr.to_sym)
40
+ obj.should_not respond_to(:"#{attr}=")
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ describe ".marshalled_writer" do
48
+
49
+ subject do
50
+ Class.new(ThirtythirtyBase) do
51
+ marshalled_writer :attr1, :attr3
52
+ marshalled_writer [:attr1, :attr2]
53
+ end
54
+ end
55
+
56
+ it "should add given attributes to marshalled attributes (stringified, unique, sorted, frozen)" do
57
+ subject.marshalled_attributes.should == %w(attr1 attr2 attr3)
58
+ subject.marshalled_attributes.should be_frozen
59
+ end
60
+
61
+ %w(attr1 attr2 attr3).each do |attr|
62
+
63
+ it "should generate a writer for attribute #{attr} (but no reader)" do
64
+ obj = subject.new
65
+ obj.should_not respond_to(attr.to_sym)
66
+ obj.should respond_to(:"#{attr}=")
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ describe ".marshalled_accessor" do
74
+
75
+ subject do
76
+ Class.new(ThirtythirtyBase) do
77
+ marshalled_accessor :attr1, :attr3
78
+ marshalled_accessor :attr1, :attr2
79
+ end
80
+ end
81
+
82
+ it "should add given attributes to marshalled attributes (stringified, unique, sorted, frozen)" do
83
+ subject.marshalled_attributes.should == %w(attr1 attr2 attr3)
84
+ subject.marshalled_attributes.should be_frozen
85
+ end
86
+
87
+ %w(attr1 attr2 attr3).each do |attr|
88
+
89
+ it "should generate a reader and a writer for attribute #{attr}" do
90
+ obj = subject.new
91
+ obj.should respond_to(attr.to_sym)
92
+ obj.should respond_to(:"#{attr}=")
93
+ end
94
+
95
+ end
96
+
97
+ end
98
+
99
+ describe "marshalling" do
100
+
101
+ describe "#_dump" do
102
+
103
+ it "should only dump attributes that should be exposed" do
104
+ password = "VERY SECRET!"
105
+ blog_post = BlogPost.new(:secret_password => password)
106
+ marshalled_blog_post = Marshal.dump(blog_post)
107
+ marshalled_blog_post.should_not match(Regexp.new(password))
108
+ end
109
+
110
+ it "should also serialize nested objects so that these objects can also be retrieved by loading the main object" do
111
+ blog_post = BlogPost.new(:comments => [Comment.new(:author => 'tomj'), Comment.new(:author => 'bennyb')])
112
+ marshalled_blog_post = Marshal.dump(blog_post)
113
+ marshalled_blog_post.should match(/bennyb/)
114
+ marshalled_blog_post.should match(/tomj/)
115
+ end
116
+
117
+ end
118
+
119
+ describe "._load" do
120
+
121
+ it "should return a fully deserialized object" do
122
+ blog_post = BlogPost.new(:comments => [], :title => 'blau is happy')
123
+ marshalled_blog_post = Marshal.dump(blog_post)
124
+ deserialized_blog_post = Marshal.load(marshalled_blog_post)
125
+ deserialized_blog_post.should be_kind_of(BlogPost)
126
+ deserialized_blog_post.title.should == 'blau is happy'
127
+ end
128
+
129
+ it "should return a fully deserialized object and nested objects" do
130
+ nice_comment = Comment.new(:author => 'tomj', :body => 'nice article, dude!')
131
+ blog_post = BlogPost.new(:comments => [nice_comment])
132
+ marshalled_blog_post = Marshal.dump(blog_post)
133
+ deserialized_blog_post = Marshal.load(marshalled_blog_post)
134
+ retrieved_comment = deserialized_blog_post.comments.first
135
+ retrieved_comment.should be_kind_of(Comment)
136
+ retrieved_comment.author.should == 'tomj'
137
+ retrieved_comment.body.should == 'nice article, dude!'
138
+ end
139
+
140
+ end
141
+
142
+ end
143
+
144
+ end
data/thirtythirty.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "thirtythirty"
4
- s.version = "0.0.1"
4
+ s.version = "0.0.2"
5
5
  s.date = Time.now
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ["Benjamin Behr", "Thomas Jachmann"]
@@ -12,6 +12,7 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.rubyforge_project = "thirtythirty"
14
14
 
15
+ s.add_development_dependency "ci_reporter", "~> 1.6.3"
15
16
  s.add_development_dependency "rspec", "~> 2.4.0"
16
17
  s.add_runtime_dependency "json", "~> 1.5.1"
17
18
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thirtythirty
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Benjamin Behr
@@ -16,13 +16,29 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-02-03 00:00:00 +01:00
19
+ date: 2011-02-04 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
- name: rspec
23
+ name: ci_reporter
24
24
  prerelease: false
25
25
  requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ hash: 9
31
+ segments:
32
+ - 1
33
+ - 6
34
+ - 3
35
+ version: 1.6.3
36
+ type: :development
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
26
42
  none: false
27
43
  requirements:
28
44
  - - ~>
@@ -34,11 +50,11 @@ dependencies:
34
50
  - 0
35
51
  version: 2.4.0
36
52
  type: :development
37
- version_requirements: *id001
53
+ version_requirements: *id002
38
54
  - !ruby/object:Gem::Dependency
39
55
  name: json
40
56
  prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
57
+ requirement: &id003 !ruby/object:Gem::Requirement
42
58
  none: false
43
59
  requirements:
44
60
  - - ~>
@@ -50,7 +66,7 @@ dependencies:
50
66
  - 1
51
67
  version: 1.5.1
52
68
  type: :runtime
53
- version_requirements: *id002
69
+ version_requirements: *id003
54
70
  description: This gem allows for customization of which data to marshal, especially useful for selective session data serialization.
55
71
  email:
56
72
  - benny@digitalbehr.de
@@ -65,10 +81,11 @@ files:
65
81
  - .gitignore
66
82
  - .rspec
67
83
  - Gemfile
84
+ - README.rdoc
68
85
  - Rakefile
69
86
  - lib/thirtythirty.rb
70
87
  - spec/spec_helper.rb
71
- - spec/thirtythirty/thirtythirty_spec.rb
88
+ - spec/thirtythirty_spec.rb
72
89
  - thirtythirty.gemspec
73
90
  has_rdoc: true
74
91
  homepage: http://github.com/blaulabs/thirtythirty
@@ -100,10 +117,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
117
  requirements: []
101
118
 
102
119
  rubyforge_project: thirtythirty
103
- rubygems_version: 1.4.2
120
+ rubygems_version: 1.5.0
104
121
  signing_key:
105
122
  specification_version: 3
106
123
  summary: Marshalling customization
107
124
  test_files:
108
125
  - spec/spec_helper.rb
109
- - spec/thirtythirty/thirtythirty_spec.rb
126
+ - spec/thirtythirty_spec.rb
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Thirtythirty do
4
-
5
- describe "trying to dump an object" do
6
-
7
- it "should only dump attributes that should be exposed" do
8
- password = "VERY SECRET!"
9
- blog_post = BlogPost.new(:secret_password => password)
10
- marshalled_blog_post = Marshal.dump(blog_post)
11
- marshalled_blog_post.should_not match(Regexp.new(password))
12
- end
13
-
14
- it "should also serialize nested objects so that these objects can also be retrieved by loading the main object" do
15
- blog_post = BlogPost.new(:comments => [Comment.new(:author => 'tomj'), Comment.new(:author => 'bennyb')])
16
- marshalled_blog_post = Marshal.dump(blog_post)
17
- marshalled_blog_post.should match(/bennyb/)
18
- marshalled_blog_post.should match(/tomj/)
19
- end
20
-
21
- end
22
-
23
- describe "trying to load an object" do
24
-
25
- it "should return a fully deserialized object" do
26
- blog_post = BlogPost.new(:comments => [], :title => 'blau is happy')
27
- marshalled_blog_post = Marshal.dump(blog_post)
28
- deserialized_blog_post = Marshal.load(marshalled_blog_post)
29
- deserialized_blog_post.should be_kind_of(BlogPost)
30
- deserialized_blog_post.title.should == 'blau is happy'
31
- end
32
-
33
- it "should return a fully deserialized object and nested objects" do
34
- nice_comment = Comment.new(:author => 'tomj', :body => 'nice article, dude!')
35
- blog_post = BlogPost.new(:comments => [nice_comment])
36
- marshalled_blog_post = Marshal.dump(blog_post)
37
- deserialized_blog_post = Marshal.load(marshalled_blog_post)
38
- retrieved_comment = deserialized_blog_post.comments.first
39
- retrieved_comment.should be_kind_of(Comment)
40
- retrieved_comment.author.should == 'tomj'
41
- retrieved_comment.body.should == 'nice article, dude!'
42
- end
43
-
44
- end
45
-
46
- end