has_versions 0.3.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.
Files changed (42) hide show
  1. data/.autotest +12 -0
  2. data/.document +5 -0
  3. data/.gitignore +42 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +63 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.rdoc +19 -0
  9. data/Rakefile +29 -0
  10. data/features/has_versions.feature +9 -0
  11. data/features/step_definitions/has_versions_steps.rb +0 -0
  12. data/features/support/env.rb +13 -0
  13. data/has_versions.gemspec +40 -0
  14. data/lib/has_versions/apply/simple.rb +34 -0
  15. data/lib/has_versions/apply.rb +9 -0
  16. data/lib/has_versions/attributes.rb +34 -0
  17. data/lib/has_versions/configuration.rb +28 -0
  18. data/lib/has_versions/diff/simple.rb +24 -0
  19. data/lib/has_versions/diff.rb +7 -0
  20. data/lib/has_versions/merge/stupid.rb +44 -0
  21. data/lib/has_versions/merge.rb +61 -0
  22. data/lib/has_versions/reset/simple.rb +19 -0
  23. data/lib/has_versions/reset.rb +15 -0
  24. data/lib/has_versions/stage.rb +121 -0
  25. data/lib/has_versions/version.rb +4 -0
  26. data/lib/has_versions/versioned.rb +34 -0
  27. data/lib/has_versions/versioning_key/uuid.rb +23 -0
  28. data/lib/has_versions/versioning_key.rb +8 -0
  29. data/lib/has_versions.rb +21 -0
  30. data/spec/has_versions/apply_spec.rb +33 -0
  31. data/spec/has_versions/configuration_spec.rb +33 -0
  32. data/spec/has_versions/diff_spec.rb +28 -0
  33. data/spec/has_versions/merge_spec.rb +67 -0
  34. data/spec/has_versions/reset_spec.rb +41 -0
  35. data/spec/has_versions/stage_spec.rb +18 -0
  36. data/spec/has_versions/versioned_spec.rb +59 -0
  37. data/spec/has_versions/versioning_key_spec.rb +31 -0
  38. data/spec/spec_helper.rb +18 -0
  39. data/spec/support/matchers/be_a_uuid.rb +8 -0
  40. data/spec/support/matchers/have_key.rb +25 -0
  41. data/spec/support/version.rb +7 -0
  42. metadata +216 -0
@@ -0,0 +1,34 @@
1
+ module HasVersions
2
+
3
+ module Versioned
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ class_attribute :versioning_configuration
8
+ class_attribute :version_class
9
+
10
+ include Attributes
11
+ end
12
+
13
+ module ClassMethods
14
+ def has_versions(version_class, &block)
15
+
16
+ self.versioning_configuration = HasVersions::Configuration.new(&block)
17
+ self.version_class = version_class
18
+ end
19
+
20
+ def is_versioned?
21
+ !versioning_configuration.blank?
22
+ end
23
+ end
24
+
25
+ # generates a version from the current object
26
+ def to_version
27
+ self.class.version_class.new.tap do |version|
28
+ version.snapshot = versioned_attributes
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,23 @@
1
+ require 'simple_uuid'
2
+
3
+ module HasVersions
4
+ module VersioningKey
5
+ module UUID
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def next_versioning_key(object=nil)
10
+ SimpleUUID::UUID.new.to_guid
11
+ end
12
+ end
13
+
14
+ def versioning_key
15
+ @versioning_key ||= self.class.next_versioning_key(self)
16
+ end
17
+
18
+ def versioning_key=(key)
19
+ @versioning_key = key
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ module HasVersions
2
+ module VersioningKey
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :UUID
6
+ end
7
+ end
8
+
@@ -0,0 +1,21 @@
1
+ require 'active_support/all'
2
+
3
+ module HasVersions
4
+ extend ActiveSupport::Autoload
5
+
6
+ autoload :Version
7
+
8
+ autoload :Configuration
9
+ autoload :Versioned
10
+ autoload :Attributes
11
+
12
+ autoload :Stage
13
+
14
+ autoload :Apply
15
+ autoload :Diff
16
+ autoload :Merge
17
+ autoload :Reset
18
+ autoload :VersioningKey
19
+
20
+ class VersioningError < StandardError; end
21
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class ApplyingVersion < Version; end
4
+
5
+ describe ApplyingVersion do
6
+ class ApplyingVersion
7
+ include HasVersions::Apply::Simple
8
+ end
9
+
10
+ let (:foo1) { described_class.new(name: 'foo1') }
11
+ let (:foo2) { described_class.new(name: 'foo2') }
12
+
13
+ let (:patch1) { {name: ['foo1', 'foo2']}.with_indifferent_access }
14
+ let (:patch2) { {name: ['foo2', 'foo1'], stripey: [nil, 'socks']}.with_indifferent_access }
15
+ let (:patch3) { {name: ['foo2', 'foo3']}.with_indifferent_access }
16
+
17
+ it 'should patch the snapshot' do
18
+ foo1.apply(patch1).snapshot.should have_key(:name).with_value('foo2')
19
+ end
20
+
21
+ it 'should raise on non-applying patch' do
22
+ expect { foo1.apply(patch2) }.to raise_error(HasVersions::ApplyFailed)
23
+ end
24
+
25
+ it 'should apply patches adding attributes', :focus => true do
26
+ foo2.apply(patch2).snapshot.should have_key(:name).with_value('foo1')
27
+ foo2.apply(patch2).snapshot.should have_key(:stripey).with_value('socks')
28
+ end
29
+
30
+ it 'should apply multiple patches' do
31
+ foo1.apply(patch1, patch3).snapshot.should have_key(:name).with_value('foo3')
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'Configuration' do
4
+ subject do
5
+ HasVersions::Configuration.new do
6
+ type :baz, expected: Hash
7
+ attribute :foo
8
+ attribute :bar
9
+ attribute :baz, type: :baz
10
+ end
11
+ end
12
+
13
+ it 'should include specified attributes' do
14
+ subject.attributes.should have_key(:foo)
15
+ subject.attributes.should have_key(:bar)
16
+ end
17
+
18
+ it 'should set options on attributes' do
19
+ subject.attributes[:baz].should have_key(:type).with_value(:baz)
20
+ end
21
+
22
+ it 'should allow indifferent access to attributes' do
23
+ subject.attributes.should have_key("foo")
24
+ end
25
+
26
+ it 'should include specified types' do
27
+ subject.types.should have_key(:baz)
28
+ end
29
+
30
+ it 'should propagate type options to typed attributes' do
31
+ subject.attributes[:baz].should have_key(:expected).with_value(Hash)
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class DiffingVersion < Version; end
4
+
5
+ describe DiffingVersion do
6
+ class DiffingVersion
7
+ include HasVersions::Diff::Simple
8
+ end
9
+
10
+ let (:foo) { described_class.new(name: 'foo', argyle: 'socks') }
11
+ let (:foo2) { described_class.new(name: 'foo2', stripey: 'socks') }
12
+
13
+ it 'should return empty when diffed with itself' do
14
+ foo.diff(foo).should be_empty
15
+ end
16
+
17
+ it 'should return a patch when diffed with another version' do
18
+ foo.diff(foo2).should have_key(:name).with_value(['foo', 'foo2'])
19
+ end
20
+
21
+ it 'should include patches for attributes added' do
22
+ foo.diff(foo2).should have_key(:stripey).with_value([nil, 'socks'])
23
+ end
24
+
25
+ it 'should include patches for attributes deleted' do
26
+ foo.diff(foo2).should have_key(:argyle).with_value(['socks', nil])
27
+ end
28
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class MergingVersion < Version; end
4
+
5
+ describe "Merge" do
6
+ describe "Diff3" do
7
+
8
+ it 'should behave like a 3-way merge' do
9
+ extend HasVersions::Merge::Diff3
10
+
11
+ diff3('A','A','A').should == [true, 'A']
12
+ diff3('A','B','A').should == [true, 'B']
13
+ diff3('A','A','B').should == [true, 'B']
14
+ diff3('B','A','A').should == [true, 'A']
15
+ diff3('B','A','C').should == [false, ['A', 'C']]
16
+ end
17
+
18
+ it 'should take multiple theirs' do
19
+ extend HasVersions::Merge::Diff3
20
+
21
+ diff3('A','A',*['A','A']).should == [true, 'A']
22
+ diff3('A','A',*['B','B']).should == [true, 'B']
23
+ diff3('A','A',*['B','B']).should == [true, 'B']
24
+ diff3('A','A',*['A','B']).should == [false, ['A','B']]
25
+ diff3('A','A',*['B','C']).should == [false, ['B','C']]
26
+ diff3('A','B',*['C','D']).should == [false, ['C','D','B']]
27
+ end
28
+ end
29
+
30
+ describe "Stupid" do
31
+ class MergingVersion
32
+ include HasVersions::Merge::Stupid
33
+ end
34
+
35
+ let (:foo1) { MergingVersion.new(name: 'foo1') }
36
+ let (:foo2) { MergingVersion.new(name: 'foo2') }
37
+ let (:foo3) { MergingVersion.new(name: 'foo3') }
38
+ let (:socks) { MergingVersion.new(stripey: 'socks') }
39
+
40
+ it 'should merge a version into another' do
41
+ foo1.merge(foo2).snapshot.should have_key(:name).with_value('foo2')
42
+ end
43
+
44
+ it 'should merge non-conflicting versions' # but it doesn't, because it can't merge more than one version (when ours == base)
45
+
46
+ it 'should raise when versions conflict' do
47
+ expect { foo1.merge(foo2, foo3) }.to raise_error(HasVersions::MergeConflict)
48
+ end
49
+
50
+ it 'should put the conflicts in the MergeConflict exception' do
51
+ begin
52
+ foo1.merge(foo2, foo3)
53
+ rescue HasVersions::MergeConflict => e
54
+ e.conflicts.should have_key(:name).with_value(['foo2', 'foo3'])
55
+ end
56
+ end
57
+
58
+ it 'should put the merge result in the MergeConflict exception' do
59
+ begin
60
+ foo1.merge(foo2, foo3)
61
+ rescue HasVersions::MergeConflict => e
62
+ e.result.snapshot.should have_key(:name).with_value('foo1')
63
+ end
64
+ end
65
+ end
66
+ end
67
+
@@ -0,0 +1,41 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class ResetObjectVersion < Version; end
4
+
5
+ class ResetObject
6
+ include HasVersions::Versioned
7
+
8
+ include HasVersions::Reset::Simple
9
+
10
+ attr_accessor :name
11
+ attr_accessor :set
12
+
13
+ has_versions(ResetObjectVersion) do
14
+ attribute :name
15
+ attribute :set, expected: Set, decoder: lambda { |value| Set.new(value) }
16
+ end
17
+ end
18
+
19
+ describe "Reset" do
20
+ describe "Simple" do
21
+ subject do
22
+ ResetObject.new.reset!(ResetObjectVersion.new(set: [1,2,3]))
23
+ end
24
+
25
+ its(:set) { should be_a(Set) }
26
+ end
27
+
28
+ describe "FromVersion" do
29
+ class ResetObject
30
+ extend HasVersions::Reset::FromVersion
31
+ end
32
+
33
+ subject do
34
+ ResetObject.from_version(ResetObjectVersion.new(name: 'foo'))
35
+ end
36
+
37
+ it { should be_a(ResetObject) }
38
+
39
+ its(:name) { should == 'foo' }
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class StagingObjectVersion < Version; end
4
+
5
+ class StagingObject
6
+ include HasVersions::Versioned
7
+ include HasVersions::Stage
8
+
9
+ attr_accessor :name
10
+
11
+ has_versions(StagingObjectVersion) do
12
+ attribute :name
13
+ end
14
+ end
15
+
16
+ describe StagingObject do
17
+ end
18
+
@@ -0,0 +1,59 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class VersionedObject
4
+ include HasVersions::Versioned
5
+
6
+ attr_accessor :name
7
+ attr_accessor :time
8
+ end
9
+
10
+ class VersionedObjectVersion < Version; end
11
+
12
+ describe VersionedObject do
13
+
14
+ it { should respond_to(:versioning_configuration) }
15
+ it { should respond_to(:version_class) }
16
+
17
+ it 'should not be versioned' do
18
+ described_class.is_versioned?.should be_false
19
+ end
20
+
21
+ context "configured" do
22
+ subject do
23
+ described_class.has_versions(VersionedObjectVersion) do
24
+ attribute :name
25
+ attribute :time, encoder: lambda { |value| value.strftime("%I:%M%p") }
26
+ end
27
+ described_class
28
+ end
29
+
30
+ it 'should be versioned' do
31
+ subject.is_versioned?.should be_true
32
+ end
33
+
34
+ its(:version_class) { should be(VersionedObjectVersion) }
35
+ its(:versioning_configuration) { should be_a(HasVersions::Configuration) }
36
+
37
+ end
38
+
39
+ describe "configured instance" do
40
+ subject do
41
+ v = VersionedObject.new
42
+ v.name = 'foo'
43
+ v.time = Time.parse("1970-01-01 2:43")
44
+ v
45
+ end
46
+
47
+ its(:versioned_attributes) { should have_key(:name).with_value('foo') }
48
+
49
+ its(:to_version) { should be_a(VersionedObjectVersion) }
50
+
51
+ it 'should set attributes in to_version' do
52
+ subject.to_version.snapshot.should have_key(:name).with_value('foo')
53
+ end
54
+
55
+ it 'should encode attributes' do
56
+ subject.to_version.snapshot.should have_key(:time).with_value("02:43AM")
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe 'VersioningKey' do
4
+ describe 'UUID' do
5
+ class VersionedObject
6
+ include HasVersions::VersioningKey::UUID
7
+ end
8
+
9
+ describe 'including class' do
10
+ subject { VersionedObject }
11
+
12
+ its(:next_versioning_key) { should be_a_uuid }
13
+
14
+ it 'should not return the same uuid twice' do
15
+ subject.next_versioning_key.should_not equal(subject.next_versioning_key)
16
+ end
17
+ end
18
+
19
+ describe 'instance of including class' do
20
+ subject { VersionedObject.new }
21
+
22
+ its(:versioning_key) { should be_a_uuid }
23
+
24
+ it 'should allow versioning_key to be set' do
25
+ key = VersionedObject.next_versioning_key
26
+ subject.versioning_key = key
27
+ subject.versioning_key.should equal(key)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,18 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/spec/'
4
+ add_filter '/features/'
5
+ end
6
+
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
9
+ require 'rspec'
10
+ require 'has_versions'
11
+
12
+ # Requires supporting files with custom matchers and macros, etc,
13
+ # in ./support/ and its subdirectories.
14
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
15
+
16
+ RSpec.configure do |config|
17
+ config.mock_with :rspec
18
+ end
@@ -0,0 +1,8 @@
1
+ require 'rspec/expectations'
2
+
3
+ RSpec::Matchers.define :be_a_uuid do |expected|
4
+ match do |actual|
5
+ actual =~ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/ # c14ba018-2f15-11e0-9a06-b6e5e5c60f13
6
+ end
7
+ end
8
+
@@ -0,0 +1,25 @@
1
+ require 'rspec/expectations'
2
+
3
+ RSpec::Matchers.define :have_key do |first|
4
+ match do |actual|
5
+ if @second
6
+ actual.has_key?(first) && actual[first] == @second
7
+ else
8
+ actual.has_key?(first)
9
+ end
10
+ end
11
+
12
+ chain :with_value do |second|
13
+ @second = second
14
+ end
15
+
16
+ failure_message_for_should do |actual|
17
+ if @second
18
+ %(expected #{actual.inspect} to have key "#{first.inspect}" with value #{@second.inspect})
19
+ else
20
+ %(expected #{actual.inspect} to have key "#{first.inspect}")
21
+ end
22
+ end
23
+
24
+ end
25
+
@@ -0,0 +1,7 @@
1
+ class Version
2
+ attr_accessor :snapshot
3
+
4
+ def initialize(snapshot=nil)
5
+ @snapshot = (snapshot || {}).with_indifferent_access
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,216 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: has_versions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Grant Rodgers
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-03-16 00:00:00.000000000 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: i18n
17
+ requirement: &17221640 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *17221640
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: &17220920 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *17220920
37
+ - !ruby/object:Gem::Dependency
38
+ name: simple_uuid
39
+ requirement: &17220260 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *17220260
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ requirement: &17219620 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '2'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *17219620
59
+ - !ruby/object:Gem::Dependency
60
+ name: yard
61
+ requirement: &17219060 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: 0.6.0
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *17219060
70
+ - !ruby/object:Gem::Dependency
71
+ name: cucumber
72
+ requirement: &17218360 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *17218360
81
+ - !ruby/object:Gem::Dependency
82
+ name: bundler
83
+ requirement: &17217740 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: 1.0.0
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *17217740
92
+ - !ruby/object:Gem::Dependency
93
+ name: simplecov
94
+ requirement: &17217060 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: 0.3.8
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *17217060
103
+ - !ruby/object:Gem::Dependency
104
+ name: reek
105
+ requirement: &17216340 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 1.2.8
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *17216340
114
+ - !ruby/object:Gem::Dependency
115
+ name: roodi
116
+ requirement: &17215620 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ~>
120
+ - !ruby/object:Gem::Version
121
+ version: 2.1.0
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *17215620
125
+ description: ActiveModel versioning
126
+ email:
127
+ - grantr@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files:
131
+ - LICENSE.txt
132
+ - README.rdoc
133
+ files:
134
+ - .autotest
135
+ - .document
136
+ - .gitignore
137
+ - .rspec
138
+ - Gemfile
139
+ - Gemfile.lock
140
+ - LICENSE.txt
141
+ - README.rdoc
142
+ - Rakefile
143
+ - features/has_versions.feature
144
+ - features/step_definitions/has_versions_steps.rb
145
+ - features/support/env.rb
146
+ - has_versions.gemspec
147
+ - lib/has_versions.rb
148
+ - lib/has_versions/apply.rb
149
+ - lib/has_versions/apply/simple.rb
150
+ - lib/has_versions/attributes.rb
151
+ - lib/has_versions/configuration.rb
152
+ - lib/has_versions/diff.rb
153
+ - lib/has_versions/diff/simple.rb
154
+ - lib/has_versions/merge.rb
155
+ - lib/has_versions/merge/stupid.rb
156
+ - lib/has_versions/reset.rb
157
+ - lib/has_versions/reset/simple.rb
158
+ - lib/has_versions/stage.rb
159
+ - lib/has_versions/version.rb
160
+ - lib/has_versions/versioned.rb
161
+ - lib/has_versions/versioning_key.rb
162
+ - lib/has_versions/versioning_key/uuid.rb
163
+ - spec/has_versions/apply_spec.rb
164
+ - spec/has_versions/configuration_spec.rb
165
+ - spec/has_versions/diff_spec.rb
166
+ - spec/has_versions/merge_spec.rb
167
+ - spec/has_versions/reset_spec.rb
168
+ - spec/has_versions/stage_spec.rb
169
+ - spec/has_versions/versioned_spec.rb
170
+ - spec/has_versions/versioning_key_spec.rb
171
+ - spec/spec_helper.rb
172
+ - spec/support/matchers/be_a_uuid.rb
173
+ - spec/support/matchers/have_key.rb
174
+ - spec/support/version.rb
175
+ has_rdoc: true
176
+ homepage: ''
177
+ licenses:
178
+ - MIT
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ none: false
185
+ requirements:
186
+ - - ! '>='
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ none: false
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project: has_versions
197
+ rubygems_version: 1.6.0
198
+ signing_key:
199
+ specification_version: 3
200
+ summary: ActiveModel versioning
201
+ test_files:
202
+ - features/has_versions.feature
203
+ - features/step_definitions/has_versions_steps.rb
204
+ - features/support/env.rb
205
+ - spec/has_versions/apply_spec.rb
206
+ - spec/has_versions/configuration_spec.rb
207
+ - spec/has_versions/diff_spec.rb
208
+ - spec/has_versions/merge_spec.rb
209
+ - spec/has_versions/reset_spec.rb
210
+ - spec/has_versions/stage_spec.rb
211
+ - spec/has_versions/versioned_spec.rb
212
+ - spec/has_versions/versioning_key_spec.rb
213
+ - spec/spec_helper.rb
214
+ - spec/support/matchers/be_a_uuid.rb
215
+ - spec/support/matchers/have_key.rb
216
+ - spec/support/version.rb