dm-is-serialized 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jakub Stastny aka Botanicus
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.textile ADDED
@@ -0,0 +1,29 @@
1
+ h1. About
2
+
3
+ This plugin helps you to serialize your records into very short strings for storing in cookies.
4
+
5
+ h1. Initialization
6
+
7
+ <pre>
8
+ class Product
9
+ include DataMapper::Resource
10
+ property :id, Serial
11
+ property :name, String
12
+ end
13
+
14
+ class OrderItem
15
+ include DataMapper::Resource
16
+ is :serialized
17
+ has 1, :product
18
+ property :id, Serial
19
+ property :name, String
20
+ property :count, Integer, :default => 1
21
+ property :used, Boolean, :default => false
22
+ property :note, Text
23
+ serialize_properties :count, :note # GeneralSerializeFilter is default value
24
+ serialize_property :product, ModelSerializeFilter
25
+ serialize_property :used, BooleanSerializeFilter
26
+ end
27
+ </pre>
28
+
29
+ h1. Filters
data/Rakefile ADDED
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'lib/dm-is-serialized/is/version'
4
+
5
+ GEM_NAME = "dm-is-serialized"
6
+ AUTHOR = "Jakub Stastny aka Botanicus"
7
+ EMAIL = "knava.bestvinensis@gmail.com"
8
+ HOMEPAGE = "http://101Ideas.cz/"
9
+ SUMMARY = "This plugin helps you to serialize your records into very short strings for storing in cookies"
10
+ GEM_VERSION = DataMapper::Is::Serialized::VERSION
11
+
12
+ spec = Gem::Specification.new do |s|
13
+ s.name = GEM_NAME
14
+ s.version = GEM_VERSION
15
+ s.platform = Gem::Platform::RUBY
16
+ s.has_rdoc = true
17
+ s.extra_rdoc_files = ["README.textile", "LICENSE"]
18
+ s.summary = SUMMARY
19
+ s.description = s.summary
20
+ s.author = AUTHOR
21
+ s.email = EMAIL
22
+ s.homepage = HOMEPAGE
23
+ s.require_path = 'lib'
24
+ s.files = %w(LICENSE README.textile Rakefile) + Dir.glob("{lib,spec,app,public,stubs}/**/*")
25
+ end
26
+
27
+ Rake::GemPackageTask.new(spec) do |pkg|
28
+ pkg.gem_spec = spec
29
+ end
30
+
31
+ desc "Create a gemspec file"
32
+ task :gemspec do
33
+ File.open("#{GEM_NAME}.gemspec", "w") do |file|
34
+ file.puts spec.to_ruby
35
+ end
36
+ end
37
+
38
+ def sudo_gem(cmd)
39
+ sh "#{SUDO} #{RUBY} -S gem #{cmd}", :verbose => false
40
+ end
41
+
42
+ desc "Install #{GEM_NAME} #{GEM_VERSION}"
43
+ task :install => [ :package ] do
44
+ sudo_gem "install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources"
45
+ end
46
+
47
+ desc "Uninstall #{GEM_NAME} #{GEM_VERSION}"
48
+ task :uninstall => [ :clobber ] do
49
+ sudo_gem "uninstall #{GEM_NAME} -v#{GEM_VERSION} -Ix"
50
+ end
51
+
52
+ require 'spec/rake/spectask'
53
+ desc 'Default: run spec examples'
54
+ task :default => 'spec'
data/TODO ADDED
@@ -0,0 +1,8 @@
1
+ - the best will be hook properties and has methods:
2
+
3
+ class OrderItem
4
+ include DataMapper::Resource
5
+ is :serialized
6
+ has 1, :product, :serialized => true
7
+ property :count, Integer, :serialized => true
8
+ end
@@ -0,0 +1,22 @@
1
+ begin
2
+ require "rubygems/specification"
3
+ rescue SecurityError
4
+ # http://gems.github.com
5
+ end
6
+
7
+ VERSION = "0.9.10"
8
+ SPECIFICATION = ::Gem::Specification.new do |s|
9
+ s.name = "dm-is-serialized"
10
+ s.version = VERSION
11
+ s.authors = ["Jakub Šťastný aka Botanicus"]
12
+ s.homepage = "http://github.com/botanicus/dm-is-serialized"
13
+ s.summary = "This plugin helps you to serialize your records into very short strings for storing in cookies."
14
+ # s.description = "" # TODO: long description
15
+ s.cert_chain = nil
16
+ s.email = ["knava.bestvinensis", "gmail.com"].join("@")
17
+ s.files = Dir.glob("**/*") - Dir.glob("pkg/*")
18
+ s.add_dependency "dm-core"
19
+ s.require_paths = ["lib"]
20
+ # s.required_ruby_version = ::Gem::Requirement.new(">= 1.9.1")
21
+ # s.rubyforge_project = "rango"
22
+ end
@@ -0,0 +1,17 @@
1
+ # Needed to import datamapper and other gems
2
+ require 'rubygems'
3
+ require 'pathname'
4
+
5
+ # Add all external dependencies for the plugin here
6
+ gem 'dm-core'
7
+ require 'dm-core'
8
+
9
+ # Require plugin-files
10
+ require Pathname(__FILE__).dirname.expand_path/'dm-is-serialized'/'is'/'serialized'
11
+
12
+ # Include the plugin in Resource
13
+ module DataMapper
14
+ module Model
15
+ include DataMapper::Is::Serialized
16
+ end
17
+ end
@@ -0,0 +1,66 @@
1
+ module DataMapper
2
+ module Is
3
+ module Serialized
4
+ module Filters
5
+ # superclass for all filter
6
+ class SerializeFilter
7
+ # record: object of model (just in serialize)
8
+ # name: symbol with property name
9
+ attr_accessor :record, :name
10
+ def property
11
+ @record.class.properties[@name]
12
+ end
13
+
14
+ def relationship(name)
15
+ @record.class.relationships[@name]
16
+ end
17
+ end
18
+
19
+ # serialize: true => 1, false => 0
20
+ class BooleanSerializeFilter < SerializeFilter
21
+ def serialize(data)
22
+ data ? 1 : 0
23
+ end
24
+
25
+ def deserialize(data)
26
+ data.to_i == 1
27
+ end
28
+ end
29
+
30
+ # serialize: :product => product_id
31
+ class ModelSerializeFilter < SerializeFilter
32
+ # serialize(:product)
33
+ def serialize(record)
34
+ keys = model.key.map { |property| property.name }
35
+ raise "Record can't be nil (#{model} with keys #{keys})" if record.nil?
36
+ values = keys.map { |key| record.send(key) }
37
+ values.length.eql?(1) ? values.first : values.join("|")
38
+ end
39
+
40
+ # product_id => id
41
+ def deserialize(id)
42
+ ids = id.split("|")
43
+ model.get(*ids)
44
+ end
45
+
46
+ def model
47
+ Object.const_get(@name.to_s.camel_case)
48
+ end
49
+ end
50
+
51
+ # called when any filter found
52
+ class GeneralSerializeFilter < SerializeFilter
53
+ def serialize(data)
54
+ raise "Data too long" if data.to_s.length > 20
55
+ return data
56
+ end
57
+
58
+ def deserialize(data)
59
+ # "" => nil
60
+ data.empty? ? nil : data
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,68 @@
1
+ require Pathname(__FILE__).dirname.expand_path/'filters'
2
+
3
+ module DataMapper
4
+ module Is
5
+ module Serialized
6
+ def self.included(base)
7
+ end
8
+
9
+ def is_serialized(options = Hash.new)
10
+ # Add class-methods
11
+ extend DataMapper::Is::Serialized::ClassMethods
12
+ # Add instance-methods
13
+ include DataMapper::Is::Serialized::InstanceMethods
14
+ include DataMapper::Is::Serialized::Filters
15
+ self.serialized_properties = Array.new # otherwise it will be nil and it will cause NoMethodError
16
+ end
17
+
18
+ module ClassMethods
19
+ include DataMapper::Is::Serialized::Filters
20
+ attr_accessor :serialized_properties
21
+
22
+ # serialize_property :size, BooleanSerializedFilter
23
+ def serialize_property(property, filter = GeneralSerializeFilter)
24
+ self.serialized_properties ||= Array.new
25
+ self.serialized_properties.push([property, filter])
26
+ self.serialized_properties.uniq!
27
+ end
28
+
29
+ # serialize_properties :product, :count
30
+ # serialize_properties :product, :count, GeneralSerializeFilter
31
+ def serialize_properties(*properties)
32
+ self.serialized_properties ||= Array.new
33
+ filter = properties.last.class.eql?(Class) ? properties.pop : GeneralSerializeFilter
34
+ properties.each do |property|
35
+ self.serialized_properties.push([property, filter])
36
+ end
37
+ self.serialized_properties.uniq!
38
+ end
39
+
40
+ def deserialize(data)
41
+ params = Hash.new
42
+ data.split(",").each_with_index do |data, index|
43
+ property_name, filter_class = self.serialized_properties[index]
44
+ filter = filter_class.new
45
+ filter.name = property_name
46
+ value = filter.deserialize(data)
47
+ #value.nil? ? raise(TypeError) : value
48
+ params[property_name] = value
49
+ end
50
+ return self.new(params)
51
+ end
52
+ end
53
+
54
+ module InstanceMethods
55
+ # @product.serialize => #<Product ...>
56
+ def serialize
57
+ self.class.serialized_properties.map do |property_name, filter_class|
58
+ filter = filter_class.new
59
+ filter.record = self
60
+ filter.name = property_name
61
+ data = self.send(property_name)
62
+ data.nil? ? String.new : filter.serialize(data)
63
+ end.join(",")
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,7 @@
1
+ module DataMapper
2
+ module Is
3
+ module Serialized
4
+ VERSION = '0.9.10'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,120 @@
1
+ require File.join(File.dirname(__FILE__), '..', "spec_helper")
2
+ require "dm-is-serialized"
3
+
4
+ include DataMapper::Is::Serialized::Filters
5
+
6
+ class Product
7
+ include DataMapper::Resource
8
+ property :id, Serial
9
+ property :name, String
10
+ end
11
+
12
+ class OrderItem
13
+ include DataMapper::Resource
14
+ is :serialized
15
+ has 1, :product
16
+ property :id, Serial
17
+ property :name, String
18
+ property :count, Integer, :default => 1
19
+ property :used, Boolean, :default => false
20
+ property :note, Text
21
+ end
22
+
23
+ describe DataMapper::Is::Serialized do
24
+ def serialize_property(property, filter)
25
+ OrderItem.serialized_properties.clear if OrderItem.serialized_properties
26
+ OrderItem.serialize_property property, filter
27
+ end
28
+
29
+ before do
30
+ # Do not save it, it is the reason why all the required
31
+ # properties are saved in cookies - that the record
32
+ # isn't saved yet. In shopping cart for example.
33
+ @item = OrderItem.new
34
+ end
35
+
36
+ describe BooleanSerializeFilter do
37
+ before do
38
+ serialize_property :used, BooleanSerializeFilter
39
+ end
40
+
41
+ describe "false" do
42
+ it "should serialize false value" do
43
+ @item.used = false
44
+ @item.serialize.should eql("0")
45
+ end
46
+
47
+ it "should deserialize false value" do
48
+ item = OrderItem.deserialize("0")
49
+ item.used.should be_false
50
+ end
51
+ end
52
+
53
+ describe "true" do
54
+ it "should serialize true value" do
55
+ @item.used = true
56
+ @item.serialize.should eql("1")
57
+ end
58
+
59
+ it "should deserialize true value" do
60
+ item = OrderItem.deserialize("1")
61
+ item.used.should be_true
62
+ end
63
+ end
64
+ end
65
+
66
+ describe GeneralSerializeFilter do
67
+ describe "integers" do
68
+ before do
69
+ @item.count = 5
70
+ serialize_property :count, GeneralSerializeFilter
71
+ end
72
+
73
+ it "should serialize integers" do
74
+ @item.serialize.should eql("5")
75
+ end
76
+
77
+ it "should deserialize integers" do
78
+ item = OrderItem.deserialize("5")
79
+ item.count.should eql(5)
80
+ end
81
+ end
82
+
83
+ describe "strings" do
84
+ before do
85
+ @item.note = "quickly pls!"
86
+ serialize_property :note, GeneralSerializeFilter
87
+ end
88
+
89
+ it "should serialize strings" do
90
+ @item.serialize.should eql("quickly pls!")
91
+ end
92
+
93
+ it "should raise exception if string is too long" do
94
+ lambda { @item.serialize.should eql("too much long string") }.should raise_error
95
+ end
96
+
97
+ it "should deserialize strings" do
98
+ item = OrderItem.deserialize("quickly pls!")
99
+ item.note.should eql("quickly pls!")
100
+ end
101
+ end
102
+ end
103
+
104
+ describe ModelSerializeFilter do
105
+ before do
106
+ @product = Product.create
107
+ @item.product = @product
108
+ serialize_property :product, ModelSerializeFilter
109
+ end
110
+
111
+ it "should serialize boolean values" do
112
+ @item.serialize.should eql(@product.id.to_s)
113
+ end
114
+
115
+ it "should deserialize boolean values" do
116
+ item = OrderItem.deserialize(@product.id.to_s)
117
+ item.product.should eql(@product)
118
+ end
119
+ end
120
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,5 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
@@ -0,0 +1,10 @@
1
+ $: << File.dirname(__FILE__) + "/../lib"
2
+
3
+ require "dm-core"
4
+ DataMapper.setup(:default, "sqlite3::memory")
5
+
6
+ Spec::Runner.configure do |config|
7
+ config.before(:each) do
8
+ DataMapper.auto_migrate!
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm-is-serialized
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.10
5
+ platform: ruby
6
+ authors:
7
+ - "Jakub \xC5\xA0\xC5\xA5astn\xC3\xBD aka Botanicus"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ date: 2009-11-26 00:00:00 +00:00
12
+ default_executable:
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: dm-core
16
+ type: :runtime
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ description:
25
+ email: knava.bestvinensis@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files: []
31
+
32
+ files:
33
+ - dm-is-serialized.gemspec
34
+ - lib/dm-is-serialized/is/filters.rb
35
+ - lib/dm-is-serialized/is/serialized.rb
36
+ - lib/dm-is-serialized/is/version.rb
37
+ - lib/dm-is-serialized.rb
38
+ - LICENSE
39
+ - Rakefile
40
+ - README.textile
41
+ - spec/dm-is-serialized/serialized_spec.rb
42
+ - spec/spec.opts
43
+ - spec/spec_helper.rb
44
+ - TODO
45
+ has_rdoc: true
46
+ homepage: http://github.com/botanicus/dm-is-serialized
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.3.5
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: This plugin helps you to serialize your records into very short strings for storing in cookies.
73
+ test_files: []
74
+