virtus-dirty 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'virtus', '~> 0.0.1'
4
+
5
+ group :development do
6
+ gem "jeweler"
7
+ gem "rspec"
8
+ gem "simplecov", :platforms => [ :mri_19 ]
9
+ end
10
+
11
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Jingwen Owen Ou
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.
@@ -0,0 +1,42 @@
1
+ = Virtus - Dirty Tracking
2
+
3
+ Support for dirty tracking of virtus attributes.
4
+
5
+ == Usage
6
+
7
+ class Post
8
+ include Virtus
9
+ include Virtus::DirtyTracking
10
+
11
+ attribute :title, String
12
+ attribute, :content, String
13
+ attribute, :meta, Hash
14
+ end
15
+
16
+ post = Post.new(:title => 'Foo', :meta => { :tags => ['red', 'green'] })
17
+
18
+ post.title = 'Bar'
19
+
20
+ post.dirty? # => true
21
+
22
+ post.attribute_dirty?(:title) # => true
23
+
24
+ post.meta[:tags] << 'blue'
25
+
26
+ post.attribute_dirty?(:meta) # => true
27
+
28
+ post.dirty_attributes # => {:title => 'Bar', :meta=>{:tags=>["red", "green", "blue"]}}
29
+
30
+ == Note on Patches/Pull Requests
31
+
32
+ * Fork the project.
33
+ * Make your feature addition or bug fix.
34
+ * Add tests for it. This is important so I don't break it in a
35
+ future version unintentionally.
36
+ * Commit, do not mess with rakefile, version, or history.
37
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
38
+ * Send me a pull request. Bonus points for topic branches.
39
+
40
+ == Copyright
41
+
42
+ Copyright (c) 2011 Jingwen Owen Ou. See LICENSE for details.
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'jeweler'
4
+ require 'rspec/core/rake_task'
5
+
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "virtus-dirty"
8
+ gem.platform = Gem::Platform::RUBY
9
+ gem.authors = ["Jingwen Owen Ou"]
10
+ gem.email = ["jingweno@gmail.com"]
11
+ gem.homepage = "https://github.com/jingweno/virtus-dirty"
12
+ gem.summary = %q{Add dirty tracking of attributes to your ruby objects}
13
+ gem.description = gem.summary
14
+
15
+ gem.files = `git ls-files`.split("\n")
16
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_runtime_dependency 'virtus'
21
+ end
22
+
23
+ Jeweler::GemcutterTasks.new
24
+
25
+ desc "Run specs"
26
+ RSpec::Core::RakeTask.new
27
+
28
+ desc 'Default: run specs.'
29
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,124 @@
1
+ require 'virtus'
2
+ require 'virtus/dirty_tracking/session'
3
+
4
+ module Virtus
5
+ # == Dirty Tracking
6
+ #
7
+ # Dirty Tracking is an optional module that you include only if you need it.
8
+ module DirtyTracking
9
+ # Extends a class with DirtyTracking::Attribute module
10
+ #
11
+ # @param [Class] base
12
+ #
13
+ # @api private
14
+ def self.included(base)
15
+ base.extend(DirtyTracking::Attribute)
16
+ end
17
+
18
+ # Returns if an object is dirty
19
+ #
20
+ # @return [TrueClass, FalseClass]
21
+ #
22
+ # @api public
23
+ def dirty?
24
+ dirty_session.dirty?
25
+ end
26
+
27
+ # Returns if an attribute with the given name is dirty.
28
+ #
29
+ # @param [Symbol] name
30
+ #
31
+ # @return [TrueClass, FalseClass]
32
+ #
33
+ # @api public
34
+ def attribute_dirty?(name)
35
+ dirty_session.dirty?(name)
36
+ end
37
+
38
+ # Explicitly sets an attribute as dirty.
39
+ #
40
+ # @param [Symbol] name
41
+ # the name of an attribute
42
+ #
43
+ # @param [Object] value
44
+ # a value of an attribute
45
+ #
46
+ # @api public
47
+ def attribute_dirty!(name, value)
48
+ dirty_session.dirty!(name, value)
49
+ end
50
+
51
+ # Returns all dirty attributes
52
+ #
53
+ # @return [Hash]
54
+ # a hash indexed with attribute names
55
+ #
56
+ # @api public
57
+ def dirty_attributes
58
+ dirty_session.dirty_attributes
59
+ end
60
+
61
+ # Returns original attributes
62
+ #
63
+ # @return [Hash]
64
+ # a hash indexed with attribute names
65
+ #
66
+ # @api public
67
+ def original_attributes
68
+ dirty_session.original_attributes
69
+ end
70
+
71
+ # Returns the current dirty tracking session
72
+ #
73
+ # @return [Virtus::DirtyTracking::Session]
74
+ #
75
+ # @api private
76
+ def dirty_session
77
+ @_dirty_session ||= Session.new(self)
78
+ end
79
+
80
+ module Attribute
81
+ # Creates an attribute writer with dirty tracking
82
+ #
83
+ # @see Virtus::Attribute.attribute
84
+ #
85
+ # @return [Virtus::Attribute::Object]
86
+ #
87
+ # @api public
88
+ def attribute(name, type, options = {})
89
+ _create_writer_with_dirty_tracking(name, attribute = super)
90
+ attribute
91
+ end
92
+
93
+ private
94
+
95
+ # Creates an attribute writer method with dirty tracking
96
+ #
97
+ # @param [Symbol] name
98
+ # the name of an attribute
99
+ #
100
+ # @param [Virtus::Attribute::Object] attribute
101
+ # an attribute instance
102
+ #
103
+ # @api private
104
+ def _create_writer_with_dirty_tracking(name, attribute)
105
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
106
+ def #{name}=(value)
107
+ prev_value = #{name}
108
+ new_value = super
109
+
110
+ if prev_value != new_value
111
+ unless original_attributes.key?(:#{name})
112
+ original_attributes[:#{name}] = prev_value
113
+ end
114
+
115
+ attribute_dirty!(:#{name}, new_value)
116
+ end
117
+
118
+ new_value
119
+ end
120
+ RUBY
121
+ end
122
+ end # Attribute
123
+ end # DirtyTracking
124
+ end # Virtus
@@ -0,0 +1,58 @@
1
+ module Virtus
2
+ module DirtyTracking
3
+ class Session
4
+ attr_reader :subject
5
+
6
+ # @api semipublic
7
+ def initialize(subject)
8
+ @subject = subject
9
+ end
10
+
11
+ # Returns original attributes of the subject
12
+ #
13
+ # @return [Hash]
14
+ # a hash of attributes indexed by attribute names
15
+ #
16
+ # @api semipublic
17
+ def original_attributes
18
+ @_original_attributes ||= subject.attributes.dup
19
+ end
20
+
21
+ # Returns dirty attributes of the subject
22
+ #
23
+ # @return [Hash]
24
+ # a hash of attributes indexed by attribute names
25
+ #
26
+ # @api semipublic
27
+ def dirty_attributes
28
+ @_dirty_attributes ||= {}
29
+ end
30
+
31
+ # Sets an attribute as dirty
32
+ #
33
+ # @param [Symbol] name
34
+ # the name of an attribute
35
+ #
36
+ # @param [Object] value
37
+ # the value of an attribute
38
+ #
39
+ # @api semipublic
40
+ def dirty!(name, value)
41
+ dirty_attributes[name] = value
42
+ end
43
+
44
+ # Returns if an object is dirty or if an attribute with the given name is
45
+ # dirty.
46
+ #
47
+ # @param [Symbol] name
48
+ # the name of an attribute
49
+ #
50
+ # @return [TrueClass, FalseClass]
51
+ #
52
+ # @api semipublic
53
+ def dirty?(name = nil)
54
+ name ? dirty_attributes.key?(name) : dirty_attributes.any?
55
+ end
56
+ end # Session
57
+ end # DirtyTracking
58
+ end # Virtus
@@ -0,0 +1,5 @@
1
+ module Virtus
2
+ module DirtyTracking
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Array do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :colors }
6
+ let(:attribute_value) { [ 'red', 'green', 'blue' ] }
7
+ let(:attribute_value_other) { [ 'orange', 'yellow', 'gray' ] }
8
+ end
9
+
10
+ describe 'dirty tracking' do
11
+ let(:model) do
12
+ Class.new do
13
+ include Virtus
14
+ include Virtus::DirtyTracking
15
+
16
+ attribute :colors, Array
17
+ end
18
+ end
19
+
20
+ let(:object) do
21
+ model.new(:colors => [])
22
+ end
23
+
24
+ context "when value is set implicitly" do
25
+ before do
26
+ object.colors << 'gray'
27
+ end
28
+
29
+ it "marks the attribute as dirty" do
30
+ object.attribute_dirty?(:colors).should be(true)
31
+ end
32
+
33
+ it "sets dirty attributes hash" do
34
+ object.dirty_attributes.should == { :colors => ['gray'] }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Boolean do
4
+ it_should_behave_like "Dirty Trackable Attribute" do
5
+ let(:attribute_name) { :is_admin }
6
+ let(:attribute_value) { true }
7
+ let(:attribute_value_other) { '1' }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Date do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :created_on }
6
+ let(:attribute_value) { Date.today }
7
+ let(:attribute_value_other) { (Date.today+1).to_s }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::DateTime do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :created_at }
6
+ let(:attribute_value) { DateTime.now }
7
+ let(:attribute_value_other) { DateTime.now.to_s }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Decimal do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :price }
6
+ let(:attribute_value) { BigDecimal("12.3456789") }
7
+ let(:attribute_value_other) { "12.3456789" }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Float do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :score }
6
+ let(:attribute_value) { 12.34 }
7
+ let(:attribute_value_other) { "12.34" }
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Hash do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :settings }
6
+ let(:attribute_value) { Hash[:one => 1] }
7
+ let(:attribute_value_other) { Hash[:two => 2] }
8
+ end
9
+
10
+ describe 'dirty tracking' do
11
+ let(:model) do
12
+ Class.new do
13
+ include Virtus
14
+ include Virtus::DirtyTracking
15
+
16
+ attribute :settings, Hash
17
+ end
18
+ end
19
+
20
+ let(:object) do
21
+ model.new(:settings => {})
22
+ end
23
+
24
+ context "when value is set implicitly" do
25
+ before do
26
+ object.settings[:one] = '1'
27
+ end
28
+
29
+ it "marks the attribute as dirty" do
30
+ object.attribute_dirty?(:settings).should be(true)
31
+ end
32
+
33
+ it "sets dirty attributes hash" do
34
+ object.dirty_attributes.should == { :settings => { :one => '1' } }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Integer do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :age }
6
+ let(:attribute_value) { 28 }
7
+ let(:attribute_value_other) { "28" }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::String do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :email }
6
+ let(:attribute_value) { 'red john' }
7
+ let(:attribute_value_other) { :'red john' }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Time do
4
+ it_should_behave_like 'Dirty Trackable Attribute' do
5
+ let(:attribute_name) { :birthday }
6
+ let(:attribute_value) { Time.now }
7
+ let(:attribute_value_other) { Time.now.to_s }
8
+ end
9
+ end
@@ -0,0 +1,72 @@
1
+ shared_examples_for "Dirty Trackable Attribute" do
2
+ let(:model) do
3
+ model = Class.new do
4
+ include Virtus
5
+ include Virtus::DirtyTracking
6
+ end
7
+ model.attribute attribute_name, described_class
8
+ model
9
+ end
10
+
11
+ context "when object is clean" do
12
+ let(:object) do
13
+ model.new
14
+ end
15
+
16
+ it "doesn't mark it as dirty" do
17
+ object.dirty?.should be(false)
18
+ end
19
+ end
20
+
21
+ context "when value is set on a new object" do
22
+ let(:object) do
23
+ model.new
24
+ end
25
+
26
+ before do
27
+ object[attribute_name] = attribute_value
28
+ end
29
+
30
+ it "marks the object as dirty" do
31
+ object.dirty?.should be(true)
32
+ end
33
+
34
+ it "marks the attribute as dirty" do
35
+ object.attribute_dirty?(attribute_name).should be(true)
36
+ end
37
+
38
+ it "sets new value in dirty_attributes hash" do
39
+ object.dirty_attributes[attribute_name].should == attribute_value
40
+ end
41
+ end
42
+
43
+ context "when other value is set on a new object with attribute already set" do
44
+ let(:object) do
45
+ model.new(attribute_name => attribute_value)
46
+ end
47
+
48
+ let(:new_value) do
49
+ model.attributes[attribute_name].coerce(attribute_value_other)
50
+ end
51
+
52
+ before do
53
+ object[attribute_name] = new_value
54
+ end
55
+
56
+ it "marks the object as dirty" do
57
+ object.dirty?.should be(true)
58
+ end
59
+
60
+ it "marks the attribute as dirty" do
61
+ object.attribute_dirty?(attribute_name).should be(true)
62
+ end
63
+
64
+ it "sets new value in dirty_attributes hash" do
65
+ object.dirty_attributes[attribute_name].should == new_value
66
+ end
67
+
68
+ it "sets original value" do
69
+ object.original_attributes[attribute_name].should == attribute_value
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,6 @@
1
+ unless defined? Virtus::DirtyTracking
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'virtus/dirty_tracking'
4
+ end
5
+
6
+ Dir[File.expand_path("**/shared/**/*.rb", File.dirname(__FILE__))].each {|f| require f}
@@ -0,0 +1,125 @@
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 = "virtus-dirty"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jingwen Owen Ou"]
12
+ s.date = "2012-01-10"
13
+ s.description = "Add dirty tracking of attributes to your ruby objects"
14
+ s.email = ["jingweno@gmail.com"]
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/virtus/dirty_tracking.rb",
28
+ "lib/virtus/dirty_tracking/session.rb",
29
+ "lib/virtus/dirty_tracking/version.rb",
30
+ "spec/integration/attributes/array_spec.rb",
31
+ "spec/integration/attributes/boolean_spec.rb",
32
+ "spec/integration/attributes/date_spec.rb",
33
+ "spec/integration/attributes/date_time_spec.rb",
34
+ "spec/integration/attributes/decimal_spec.rb",
35
+ "spec/integration/attributes/float_spec.rb",
36
+ "spec/integration/attributes/hash_spec.rb",
37
+ "spec/integration/attributes/integer_spec.rb",
38
+ "spec/integration/attributes/string_spec.rb",
39
+ "spec/integration/attributes/time_spec.rb",
40
+ "spec/integration/shared/dirty_trackable_attribute.rb",
41
+ "spec/spec_helper.rb",
42
+ "virtus-dirty.gemspec"
43
+ ]
44
+ s.homepage = "https://github.com/jingweno/virtus-dirty"
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = "1.8.10"
47
+ s.summary = "Add dirty tracking of attributes to your ruby objects"
48
+ s.test_files = ["spec/integration/attributes/array_spec.rb", "spec/integration/attributes/boolean_spec.rb", "spec/integration/attributes/date_spec.rb", "spec/integration/attributes/date_time_spec.rb", "spec/integration/attributes/decimal_spec.rb", "spec/integration/attributes/float_spec.rb", "spec/integration/attributes/hash_spec.rb", "spec/integration/attributes/integer_spec.rb", "spec/integration/attributes/string_spec.rb", "spec/integration/attributes/time_spec.rb", "spec/integration/shared/dirty_trackable_attribute.rb", "spec/spec_helper.rb"]
49
+
50
+ if s.respond_to? :specification_version then
51
+ s.specification_version = 3
52
+
53
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
+ s.add_runtime_dependency(%q<virtus>, ["~> 0.0.1"])
55
+ s.add_runtime_dependency(%q<virtus-dirty>, [">= 0"])
56
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
57
+ s.add_development_dependency(%q<rspec>, [">= 0"])
58
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
59
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
60
+ s.add_development_dependency(%q<rspec>, [">= 0"])
61
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
62
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
63
+ s.add_development_dependency(%q<rspec>, [">= 0"])
64
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
65
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
66
+ s.add_development_dependency(%q<rspec>, [">= 0"])
67
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
68
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
69
+ s.add_development_dependency(%q<rspec>, [">= 0"])
70
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
71
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
72
+ s.add_development_dependency(%q<rspec>, [">= 0"])
73
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
74
+ s.add_development_dependency(%q<rspec>, [">= 0"])
75
+ s.add_runtime_dependency(%q<virtus>, [">= 0"])
76
+ else
77
+ s.add_dependency(%q<virtus>, ["~> 0.0.1"])
78
+ s.add_dependency(%q<virtus-dirty>, [">= 0"])
79
+ s.add_dependency(%q<jeweler>, [">= 0"])
80
+ s.add_dependency(%q<rspec>, [">= 0"])
81
+ s.add_dependency(%q<simplecov>, [">= 0"])
82
+ s.add_dependency(%q<jeweler>, [">= 0"])
83
+ s.add_dependency(%q<rspec>, [">= 0"])
84
+ s.add_dependency(%q<simplecov>, [">= 0"])
85
+ s.add_dependency(%q<jeweler>, [">= 0"])
86
+ s.add_dependency(%q<rspec>, [">= 0"])
87
+ s.add_dependency(%q<simplecov>, [">= 0"])
88
+ s.add_dependency(%q<jeweler>, [">= 0"])
89
+ s.add_dependency(%q<rspec>, [">= 0"])
90
+ s.add_dependency(%q<simplecov>, [">= 0"])
91
+ s.add_dependency(%q<jeweler>, [">= 0"])
92
+ s.add_dependency(%q<rspec>, [">= 0"])
93
+ s.add_dependency(%q<simplecov>, [">= 0"])
94
+ s.add_dependency(%q<jeweler>, [">= 0"])
95
+ s.add_dependency(%q<rspec>, [">= 0"])
96
+ s.add_dependency(%q<simplecov>, [">= 0"])
97
+ s.add_dependency(%q<rspec>, [">= 0"])
98
+ s.add_dependency(%q<virtus>, [">= 0"])
99
+ end
100
+ else
101
+ s.add_dependency(%q<virtus>, ["~> 0.0.1"])
102
+ s.add_dependency(%q<virtus-dirty>, [">= 0"])
103
+ s.add_dependency(%q<jeweler>, [">= 0"])
104
+ s.add_dependency(%q<rspec>, [">= 0"])
105
+ s.add_dependency(%q<simplecov>, [">= 0"])
106
+ s.add_dependency(%q<jeweler>, [">= 0"])
107
+ s.add_dependency(%q<rspec>, [">= 0"])
108
+ s.add_dependency(%q<simplecov>, [">= 0"])
109
+ s.add_dependency(%q<jeweler>, [">= 0"])
110
+ s.add_dependency(%q<rspec>, [">= 0"])
111
+ s.add_dependency(%q<simplecov>, [">= 0"])
112
+ s.add_dependency(%q<jeweler>, [">= 0"])
113
+ s.add_dependency(%q<rspec>, [">= 0"])
114
+ s.add_dependency(%q<simplecov>, [">= 0"])
115
+ s.add_dependency(%q<jeweler>, [">= 0"])
116
+ s.add_dependency(%q<rspec>, [">= 0"])
117
+ s.add_dependency(%q<simplecov>, [">= 0"])
118
+ s.add_dependency(%q<jeweler>, [">= 0"])
119
+ s.add_dependency(%q<rspec>, [">= 0"])
120
+ s.add_dependency(%q<simplecov>, [">= 0"])
121
+ s.add_dependency(%q<rspec>, [">= 0"])
122
+ s.add_dependency(%q<virtus>, [">= 0"])
123
+ end
124
+ end
125
+
metadata ADDED
@@ -0,0 +1,327 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: virtus-dirty
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jingwen Owen Ou
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: virtus
16
+ requirement: &70235571853940 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70235571853940
25
+ - !ruby/object:Gem::Dependency
26
+ name: virtus-dirty
27
+ requirement: &70235571853440 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70235571853440
36
+ - !ruby/object:Gem::Dependency
37
+ name: jeweler
38
+ requirement: &70235571852780 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70235571852780
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70235571666640 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70235571666640
58
+ - !ruby/object:Gem::Dependency
59
+ name: simplecov
60
+ requirement: &70235571666160 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70235571666160
69
+ - !ruby/object:Gem::Dependency
70
+ name: jeweler
71
+ requirement: &70235571665660 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70235571665660
80
+ - !ruby/object:Gem::Dependency
81
+ name: rspec
82
+ requirement: &70235571664940 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70235571664940
91
+ - !ruby/object:Gem::Dependency
92
+ name: simplecov
93
+ requirement: &70235571664180 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70235571664180
102
+ - !ruby/object:Gem::Dependency
103
+ name: jeweler
104
+ requirement: &70235571663520 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70235571663520
113
+ - !ruby/object:Gem::Dependency
114
+ name: rspec
115
+ requirement: &70235571662680 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *70235571662680
124
+ - !ruby/object:Gem::Dependency
125
+ name: simplecov
126
+ requirement: &70235571662160 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *70235571662160
135
+ - !ruby/object:Gem::Dependency
136
+ name: jeweler
137
+ requirement: &70235571661420 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *70235571661420
146
+ - !ruby/object:Gem::Dependency
147
+ name: rspec
148
+ requirement: &70235571660600 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *70235571660600
157
+ - !ruby/object:Gem::Dependency
158
+ name: simplecov
159
+ requirement: &70235571660080 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *70235571660080
168
+ - !ruby/object:Gem::Dependency
169
+ name: jeweler
170
+ requirement: &70235571659580 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *70235571659580
179
+ - !ruby/object:Gem::Dependency
180
+ name: rspec
181
+ requirement: &70235571658940 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *70235571658940
190
+ - !ruby/object:Gem::Dependency
191
+ name: simplecov
192
+ requirement: &70235571693260 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: *70235571693260
201
+ - !ruby/object:Gem::Dependency
202
+ name: jeweler
203
+ requirement: &70235571692420 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: *70235571692420
212
+ - !ruby/object:Gem::Dependency
213
+ name: rspec
214
+ requirement: &70235571691680 !ruby/object:Gem::Requirement
215
+ none: false
216
+ requirements:
217
+ - - ! '>='
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ type: :development
221
+ prerelease: false
222
+ version_requirements: *70235571691680
223
+ - !ruby/object:Gem::Dependency
224
+ name: simplecov
225
+ requirement: &70235571690420 !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: *70235571690420
234
+ - !ruby/object:Gem::Dependency
235
+ name: rspec
236
+ requirement: &70235571689660 !ruby/object:Gem::Requirement
237
+ none: false
238
+ requirements:
239
+ - - ! '>='
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: *70235571689660
245
+ - !ruby/object:Gem::Dependency
246
+ name: virtus
247
+ requirement: &70235571688900 !ruby/object:Gem::Requirement
248
+ none: false
249
+ requirements:
250
+ - - ! '>='
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ type: :runtime
254
+ prerelease: false
255
+ version_requirements: *70235571688900
256
+ description: Add dirty tracking of attributes to your ruby objects
257
+ email:
258
+ - jingweno@gmail.com
259
+ executables: []
260
+ extensions: []
261
+ extra_rdoc_files:
262
+ - LICENSE
263
+ - README.rdoc
264
+ files:
265
+ - .gitignore
266
+ - .rspec
267
+ - Gemfile
268
+ - LICENSE
269
+ - README.rdoc
270
+ - Rakefile
271
+ - VERSION
272
+ - lib/virtus/dirty_tracking.rb
273
+ - lib/virtus/dirty_tracking/session.rb
274
+ - lib/virtus/dirty_tracking/version.rb
275
+ - spec/integration/attributes/array_spec.rb
276
+ - spec/integration/attributes/boolean_spec.rb
277
+ - spec/integration/attributes/date_spec.rb
278
+ - spec/integration/attributes/date_time_spec.rb
279
+ - spec/integration/attributes/decimal_spec.rb
280
+ - spec/integration/attributes/float_spec.rb
281
+ - spec/integration/attributes/hash_spec.rb
282
+ - spec/integration/attributes/integer_spec.rb
283
+ - spec/integration/attributes/string_spec.rb
284
+ - spec/integration/attributes/time_spec.rb
285
+ - spec/integration/shared/dirty_trackable_attribute.rb
286
+ - spec/spec_helper.rb
287
+ - virtus-dirty.gemspec
288
+ homepage: https://github.com/jingweno/virtus-dirty
289
+ licenses: []
290
+ post_install_message:
291
+ rdoc_options: []
292
+ require_paths:
293
+ - lib
294
+ required_ruby_version: !ruby/object:Gem::Requirement
295
+ none: false
296
+ requirements:
297
+ - - ! '>='
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ segments:
301
+ - 0
302
+ hash: 1569428612875056916
303
+ required_rubygems_version: !ruby/object:Gem::Requirement
304
+ none: false
305
+ requirements:
306
+ - - ! '>='
307
+ - !ruby/object:Gem::Version
308
+ version: '0'
309
+ requirements: []
310
+ rubyforge_project:
311
+ rubygems_version: 1.8.10
312
+ signing_key:
313
+ specification_version: 3
314
+ summary: Add dirty tracking of attributes to your ruby objects
315
+ test_files:
316
+ - spec/integration/attributes/array_spec.rb
317
+ - spec/integration/attributes/boolean_spec.rb
318
+ - spec/integration/attributes/date_spec.rb
319
+ - spec/integration/attributes/date_time_spec.rb
320
+ - spec/integration/attributes/decimal_spec.rb
321
+ - spec/integration/attributes/float_spec.rb
322
+ - spec/integration/attributes/hash_spec.rb
323
+ - spec/integration/attributes/integer_spec.rb
324
+ - spec/integration/attributes/string_spec.rb
325
+ - spec/integration/attributes/time_spec.rb
326
+ - spec/integration/shared/dirty_trackable_attribute.rb
327
+ - spec/spec_helper.rb