delta_changes 0.0.1
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/.travis.yml +4 -0
- data/Appraisals +15 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +49 -0
- data/Rakefile +27 -0
- data/Readme.md +34 -0
- data/delta_changes.gemspec +13 -0
- data/gemfiles/rails2.gemfile +11 -0
- data/gemfiles/rails2.gemfile.lock +37 -0
- data/gemfiles/rails30.gemfile +11 -0
- data/gemfiles/rails30.gemfile.lock +50 -0
- data/gemfiles/rails32.gemfile +11 -0
- data/gemfiles/rails32.gemfile.lock +50 -0
- data/lib/delta_changes/version.rb +3 -0
- data/lib/delta_changes.rb +109 -0
- data/spec/delta_changes_spec.rb +99 -0
- data/spec/spec_helper.rb +31 -0
- metadata +84 -0
data/.travis.yml
ADDED
data/Appraisals
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
delta_changes (0.0.1)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.8)
|
11
|
+
activesupport (= 3.2.8)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activerecord (3.2.8)
|
14
|
+
activemodel (= 3.2.8)
|
15
|
+
activesupport (= 3.2.8)
|
16
|
+
arel (~> 3.0.2)
|
17
|
+
tzinfo (~> 0.3.29)
|
18
|
+
activesupport (3.2.8)
|
19
|
+
i18n (~> 0.6)
|
20
|
+
multi_json (~> 1.0)
|
21
|
+
appraisal (0.4.1)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
arel (3.0.2)
|
25
|
+
builder (3.0.3)
|
26
|
+
diff-lcs (1.1.3)
|
27
|
+
i18n (0.6.1)
|
28
|
+
multi_json (1.3.6)
|
29
|
+
rake (0.9.2)
|
30
|
+
rspec (2.6.0)
|
31
|
+
rspec-core (~> 2.6.0)
|
32
|
+
rspec-expectations (~> 2.6.0)
|
33
|
+
rspec-mocks (~> 2.6.0)
|
34
|
+
rspec-core (2.6.4)
|
35
|
+
rspec-expectations (2.6.0)
|
36
|
+
diff-lcs (~> 1.1.2)
|
37
|
+
rspec-mocks (2.6.0)
|
38
|
+
sqlite3 (1.3.6)
|
39
|
+
tzinfo (0.3.33)
|
40
|
+
|
41
|
+
PLATFORMS
|
42
|
+
ruby
|
43
|
+
|
44
|
+
DEPENDENCIES
|
45
|
+
appraisal
|
46
|
+
delta_changes!
|
47
|
+
rake
|
48
|
+
rspec (~> 2)
|
49
|
+
sqlite3
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "appraisal"
|
3
|
+
|
4
|
+
task :spec do
|
5
|
+
sh "rspec spec/"
|
6
|
+
end
|
7
|
+
|
8
|
+
task :default do
|
9
|
+
sh "bundle exec rake appraisal:install && bundle exec rake appraisal spec"
|
10
|
+
end
|
11
|
+
|
12
|
+
# extracted from https://github.com/grosser/project_template
|
13
|
+
rule /^version:bump:.*/ do |t|
|
14
|
+
file = "lib/delta_changes/version.rb"
|
15
|
+
|
16
|
+
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
17
|
+
index = ["major", "minor", "patch"].index(t.name.split(':').last)
|
18
|
+
version_file = File.read(file)
|
19
|
+
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
20
|
+
version_parts[index] = version_parts[index].to_i + 1
|
21
|
+
version_parts[2] = 0 if index < 2 # remove patch for minor
|
22
|
+
version_parts[1] = 0 if index < 1 # remove minor for major
|
23
|
+
new_version = version_parts * '.'
|
24
|
+
|
25
|
+
File.open(file,"w"){|f| f.write(version_file.sub(old_version, new_version)) }
|
26
|
+
sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
|
27
|
+
end
|
data/Readme.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Additional real/virtual attribute change tracking independent of ActiveRecords
|
2
|
+
|
3
|
+
|
4
|
+
Install
|
5
|
+
=======
|
6
|
+
|
7
|
+
gem install delta_changes
|
8
|
+
|
9
|
+
Usage
|
10
|
+
=====
|
11
|
+
|
12
|
+
class User < ActiveRecord::Base
|
13
|
+
include DeltaChanges::Extension
|
14
|
+
delta_changes :columns => [:name], :attributes => [:full_name]
|
15
|
+
end
|
16
|
+
|
17
|
+
user.name = "bar"
|
18
|
+
user.delta_changes # => {"name" => [nil, "bar"]}
|
19
|
+
|
20
|
+
user.full_name_will_change!
|
21
|
+
user.delta_changes # => {"name" => [nil, "bar"], "full_name" => [nil, "Mr. Bar"]}
|
22
|
+
|
23
|
+
user.save!
|
24
|
+
user.delta_changes # => {"name" => [nil, "bar"], "full_name" => [nil, "Mr. Bar"]}
|
25
|
+
|
26
|
+
user.reset_delta_changes!
|
27
|
+
user.delta_changes # => {}
|
28
|
+
|
29
|
+
Author
|
30
|
+
======
|
31
|
+
[Michael Grosser](http://grosser.it)<br/>
|
32
|
+
michael@grosser.it<br/>
|
33
|
+
License: MIT<br/>
|
34
|
+
[](http://travis-ci.org/grosser/delta_changes)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
2
|
+
name = "delta_changes"
|
3
|
+
require "#{name}/version"
|
4
|
+
|
5
|
+
Gem::Specification.new name, DeltaChanges::VERSION do |s|
|
6
|
+
s.summary = "Additional real/virtual attribute change tracking independent of ActiveRecords"
|
7
|
+
s.authors = ["Michael Grosser"]
|
8
|
+
s.email = "michael@grosser.it"
|
9
|
+
s.homepage = "http://github.com/grosser/#{name}"
|
10
|
+
s.files = `git ls-files`.split("\n")
|
11
|
+
s.add_runtime_dependency "activerecord"
|
12
|
+
s.license = "MIT"
|
13
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/delta_changes
|
3
|
+
specs:
|
4
|
+
delta_changes (0.0.0)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.14)
|
11
|
+
activesupport (= 2.3.14)
|
12
|
+
activesupport (2.3.14)
|
13
|
+
appraisal (0.4.1)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
diff-lcs (1.1.3)
|
17
|
+
rake (0.9.2.2)
|
18
|
+
rspec (2.11.0)
|
19
|
+
rspec-core (~> 2.11.0)
|
20
|
+
rspec-expectations (~> 2.11.0)
|
21
|
+
rspec-mocks (~> 2.11.0)
|
22
|
+
rspec-core (2.11.1)
|
23
|
+
rspec-expectations (2.11.3)
|
24
|
+
diff-lcs (~> 1.1.3)
|
25
|
+
rspec-mocks (2.11.2)
|
26
|
+
sqlite3 (1.3.6)
|
27
|
+
|
28
|
+
PLATFORMS
|
29
|
+
ruby
|
30
|
+
|
31
|
+
DEPENDENCIES
|
32
|
+
activerecord (= 2.3.14)
|
33
|
+
appraisal
|
34
|
+
delta_changes!
|
35
|
+
rake
|
36
|
+
rspec (~> 2)
|
37
|
+
sqlite3
|
@@ -0,0 +1,50 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/delta_changes
|
3
|
+
specs:
|
4
|
+
delta_changes (0.0.0)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.3)
|
11
|
+
activesupport (= 3.2.3)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activerecord (3.2.3)
|
14
|
+
activemodel (= 3.2.3)
|
15
|
+
activesupport (= 3.2.3)
|
16
|
+
arel (~> 3.0.2)
|
17
|
+
tzinfo (~> 0.3.29)
|
18
|
+
activesupport (3.2.3)
|
19
|
+
i18n (~> 0.6)
|
20
|
+
multi_json (~> 1.0)
|
21
|
+
appraisal (0.4.1)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
arel (3.0.2)
|
25
|
+
builder (3.0.3)
|
26
|
+
diff-lcs (1.1.3)
|
27
|
+
i18n (0.6.1)
|
28
|
+
multi_json (1.3.6)
|
29
|
+
rake (0.9.2.2)
|
30
|
+
rspec (2.11.0)
|
31
|
+
rspec-core (~> 2.11.0)
|
32
|
+
rspec-expectations (~> 2.11.0)
|
33
|
+
rspec-mocks (~> 2.11.0)
|
34
|
+
rspec-core (2.11.1)
|
35
|
+
rspec-expectations (2.11.3)
|
36
|
+
diff-lcs (~> 1.1.3)
|
37
|
+
rspec-mocks (2.11.2)
|
38
|
+
sqlite3 (1.3.6)
|
39
|
+
tzinfo (0.3.33)
|
40
|
+
|
41
|
+
PLATFORMS
|
42
|
+
ruby
|
43
|
+
|
44
|
+
DEPENDENCIES
|
45
|
+
activerecord (= 3.2.3)
|
46
|
+
appraisal
|
47
|
+
delta_changes!
|
48
|
+
rake
|
49
|
+
rspec (~> 2)
|
50
|
+
sqlite3
|
@@ -0,0 +1,50 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/delta_changes
|
3
|
+
specs:
|
4
|
+
delta_changes (0.0.0)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.3)
|
11
|
+
activesupport (= 3.2.3)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activerecord (3.2.3)
|
14
|
+
activemodel (= 3.2.3)
|
15
|
+
activesupport (= 3.2.3)
|
16
|
+
arel (~> 3.0.2)
|
17
|
+
tzinfo (~> 0.3.29)
|
18
|
+
activesupport (3.2.3)
|
19
|
+
i18n (~> 0.6)
|
20
|
+
multi_json (~> 1.0)
|
21
|
+
appraisal (0.4.1)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
arel (3.0.2)
|
25
|
+
builder (3.0.3)
|
26
|
+
diff-lcs (1.1.3)
|
27
|
+
i18n (0.6.1)
|
28
|
+
multi_json (1.3.6)
|
29
|
+
rake (0.9.2.2)
|
30
|
+
rspec (2.11.0)
|
31
|
+
rspec-core (~> 2.11.0)
|
32
|
+
rspec-expectations (~> 2.11.0)
|
33
|
+
rspec-mocks (~> 2.11.0)
|
34
|
+
rspec-core (2.11.1)
|
35
|
+
rspec-expectations (2.11.3)
|
36
|
+
diff-lcs (~> 1.1.3)
|
37
|
+
rspec-mocks (2.11.2)
|
38
|
+
sqlite3 (1.3.6)
|
39
|
+
tzinfo (0.3.33)
|
40
|
+
|
41
|
+
PLATFORMS
|
42
|
+
ruby
|
43
|
+
|
44
|
+
DEPENDENCIES
|
45
|
+
activerecord (= 3.2.3)
|
46
|
+
appraisal
|
47
|
+
delta_changes!
|
48
|
+
rake
|
49
|
+
rspec (~> 2)
|
50
|
+
sqlite3
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "delta_changes/version"
|
2
|
+
|
3
|
+
module DeltaChanges
|
4
|
+
module Extension
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
base.cattr_accessor :delta_changes_options
|
8
|
+
base.attribute_method_suffix '_delta_changed?', '_delta_change', '_delta_was', '_delta_will_change!'
|
9
|
+
base.alias_method_chain :write_attribute, :delta_changes
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def delta_changes(options)
|
14
|
+
self.delta_changes_options = options
|
15
|
+
define_virtual_attribute_delta_methods
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Provide for delta tracking of virtual (non-column) attributes.
|
20
|
+
#
|
21
|
+
def define_virtual_attribute_delta_methods
|
22
|
+
delta_changes_options[:attributes].each do |tracked_attribute|
|
23
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
24
|
+
def #{tracked_attribute}_delta_changed?
|
25
|
+
attribute_delta_changed?('#{tracked_attribute}')
|
26
|
+
end
|
27
|
+
|
28
|
+
def #{tracked_attribute}_delta_change
|
29
|
+
attribute_delta_change('#{tracked_attribute}')
|
30
|
+
end
|
31
|
+
|
32
|
+
def #{tracked_attribute}_delta_was
|
33
|
+
attribute_delta_was('#{tracked_attribute}')
|
34
|
+
end
|
35
|
+
|
36
|
+
def #{tracked_attribute}_delta_will_change!
|
37
|
+
attribute_delta_will_change!('#{tracked_attribute}')
|
38
|
+
end
|
39
|
+
RUBY
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def delta_changes
|
45
|
+
delta_changed_attributes.keys.inject({}) { |h, attr| h[attr] = attribute_delta_change(attr); h }
|
46
|
+
end
|
47
|
+
|
48
|
+
def delta_changes?
|
49
|
+
delta_changed_attributes.keys.present?
|
50
|
+
end
|
51
|
+
|
52
|
+
####################################
|
53
|
+
|
54
|
+
def reset_delta_changes!
|
55
|
+
delta_changed_attributes.clear
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
# Map of change attr => original value.
|
61
|
+
def delta_changed_attributes
|
62
|
+
@delta_changed_attributes ||= {}
|
63
|
+
end
|
64
|
+
|
65
|
+
# Handle *_delta_changed? for method_missing.
|
66
|
+
def attribute_delta_changed?(attr)
|
67
|
+
delta_changed_attributes.include?(attr)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Handle *_delta_change for method_missing.
|
71
|
+
def attribute_delta_change(attr)
|
72
|
+
[delta_changed_attributes[attr], __send__(attr)] if attribute_delta_changed?(attr)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Handle *_delta_was for method_missing.
|
76
|
+
def attribute_delta_was(attr)
|
77
|
+
attribute_delta_changed?(attr) ? delta_changed_attributes[attr] : __send__(attr)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Handle <tt>*_will_change!</tt> for +method_missing+.
|
81
|
+
def attribute_delta_will_change!(attr, options = {})
|
82
|
+
attribute_value = if self.class.delta_changes_options[:attributes].include?(attr)
|
83
|
+
value = send(attr)
|
84
|
+
value.duplicable? ? value.clone : value
|
85
|
+
else
|
86
|
+
options[:from] || clone_attribute_value(:read_attribute, attr)
|
87
|
+
end
|
88
|
+
delta_changed_attributes[attr] = attribute_value
|
89
|
+
end
|
90
|
+
|
91
|
+
# Wrap write_attribute to remember original attribute value.
|
92
|
+
def write_attribute_with_delta_changes(attr, value)
|
93
|
+
attr = attr.to_s
|
94
|
+
|
95
|
+
if self.class.delta_changes_options[:columns].include?(attr)
|
96
|
+
# The attribute already has an unsaved change.
|
97
|
+
if delta_changed_attributes.include?(attr)
|
98
|
+
old = delta_changed_attributes[attr]
|
99
|
+
delta_changed_attributes.delete(attr) unless field_changed?(attr, old, value)
|
100
|
+
else
|
101
|
+
old = clone_attribute_value(:read_attribute, attr)
|
102
|
+
delta_changed_attributes[attr] = old if field_changed?(attr, old, value)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
write_attribute_without_delta_changes(attr, value)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe DeltaChanges do
|
4
|
+
it "has a VERSION" do
|
5
|
+
DeltaChanges::VERSION.should =~ /^[\.\da-z]+$/
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should not create methods on unspecified attributes" do
|
9
|
+
# TODO broken, but that might be rails 2 ...
|
10
|
+
#expect{
|
11
|
+
# User.new.email_delta_will_change!
|
12
|
+
#}.to raise_error
|
13
|
+
|
14
|
+
expect{
|
15
|
+
User.new.bar_delta_will_change!
|
16
|
+
}.to raise_error
|
17
|
+
|
18
|
+
expect{
|
19
|
+
User.new.does_not_exist_delta_will_change!
|
20
|
+
}.to raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#delta_changes" do
|
24
|
+
it "should be empty on unchanged" do
|
25
|
+
User.new.delta_changes.should == {}
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be filled by tracked column changes" do
|
29
|
+
User.new(:name => "Peter").delta_changes.should == {"name"=>[nil, "Peter"]}
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be filled by tracked number column change" do
|
33
|
+
User.new(:score => 5).delta_changes.should == {"score"=>[nil, 5]}
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be filled by tracked number column change that have the wrong type" do
|
37
|
+
User.new(:score => "5").delta_changes.should == {"score"=>[nil, 5]}
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not be filled by untracked column changes" do
|
41
|
+
User.new(:email => "Peter").delta_changes.should == {}
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not be filled implicit tracked attribute changes" do
|
45
|
+
user = User.new(:foo => 1)
|
46
|
+
user.delta_changes.should == {}
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be filled by explicit tracked attribute changes" do
|
50
|
+
user = User.new(:foo => 1)
|
51
|
+
user.foo_delta_will_change!
|
52
|
+
user.foo = 2
|
53
|
+
user.delta_changes.should == {"foo"=>[1, 2]}
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should not mess with normal changes" do
|
57
|
+
User.new(:email => "EMAIL", :name => "NAME", :foo => "FOO").changes.should ==
|
58
|
+
{"email"=>[nil, "EMAIL"], "name"=>[nil, "NAME"]}
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should not reset columns on save" do
|
62
|
+
user = User.create!(:name => "NAME", :foo => "FOO", :bar => "BAR")
|
63
|
+
user.delta_changes.should == {"name"=>[nil, "NAME"]}
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not reset columns on update" do
|
67
|
+
user = User.create!(:name => "NAME", :foo => "FOO", :bar => "BAR")
|
68
|
+
user.update_attributes(:name => "NAME-2")
|
69
|
+
user.delta_changes.should == {"name"=>[nil, "NAME-2"]}
|
70
|
+
end
|
71
|
+
|
72
|
+
# that might change, I'd consider this a bug ... but just documenting for now
|
73
|
+
it "should not reset columns on reload" do
|
74
|
+
user = User.create!(:name => "NAME", :foo => "FOO", :bar => "BAR")
|
75
|
+
user.reload
|
76
|
+
user.delta_changes.should == {"name"=>[nil, "NAME"]}
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should have previouse value from db" do
|
80
|
+
user = User.create!(:name => "NAME", :foo => "FOO", :bar => "BAR")
|
81
|
+
user = User.find(user)
|
82
|
+
user.name = "NAME-2"
|
83
|
+
user.delta_changes.should == {"name"=>["NAME", "NAME-2"]}
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should not track non-changes on tracked columns" do
|
87
|
+
user = User.create!(:score => 5).reload
|
88
|
+
user.reset_delta_changes!
|
89
|
+
|
90
|
+
user.delta_changes.should == {}
|
91
|
+
|
92
|
+
user.score = 5
|
93
|
+
user.delta_changes.should == {}
|
94
|
+
|
95
|
+
user.score = "5"
|
96
|
+
user.delta_changes.should == {}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "delta_changes"
|
3
|
+
require "active_record"
|
4
|
+
|
5
|
+
# connect
|
6
|
+
ActiveRecord::Base.establish_connection(
|
7
|
+
:adapter => "sqlite3",
|
8
|
+
:database => ":memory:"
|
9
|
+
)
|
10
|
+
|
11
|
+
# create tables
|
12
|
+
ActiveRecord::Schema.define(:version => 1) do
|
13
|
+
create_table :users do |t|
|
14
|
+
t.string :name
|
15
|
+
t.string :email
|
16
|
+
t.integer :score
|
17
|
+
t.timestamps
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# create models
|
22
|
+
class User < ActiveRecord::Base
|
23
|
+
include DeltaChanges::Extension
|
24
|
+
attr_accessor :foo, :bar
|
25
|
+
|
26
|
+
delta_changes :columns => ["name", "score"], :attributes => ["foo"]
|
27
|
+
|
28
|
+
def full_name
|
29
|
+
"Mr. #{name}"
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: delta_changes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Grosser
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description:
|
31
|
+
email: michael@grosser.it
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- .travis.yml
|
37
|
+
- Appraisals
|
38
|
+
- Gemfile
|
39
|
+
- Gemfile.lock
|
40
|
+
- Rakefile
|
41
|
+
- Readme.md
|
42
|
+
- delta_changes.gemspec
|
43
|
+
- gemfiles/rails2.gemfile
|
44
|
+
- gemfiles/rails2.gemfile.lock
|
45
|
+
- gemfiles/rails30.gemfile
|
46
|
+
- gemfiles/rails30.gemfile.lock
|
47
|
+
- gemfiles/rails32.gemfile
|
48
|
+
- gemfiles/rails32.gemfile.lock
|
49
|
+
- lib/delta_changes.rb
|
50
|
+
- lib/delta_changes/version.rb
|
51
|
+
- spec/delta_changes_spec.rb
|
52
|
+
- spec/spec_helper.rb
|
53
|
+
homepage: http://github.com/grosser/delta_changes
|
54
|
+
licenses:
|
55
|
+
- MIT
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
hash: 3940600882562868341
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
hash: 3940600882562868341
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.8.24
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Additional real/virtual attribute change tracking independent of ActiveRecords
|
84
|
+
test_files: []
|