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.
- data/.autotest +12 -0
- data/.document +5 -0
- data/.gitignore +42 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +63 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +29 -0
- data/features/has_versions.feature +9 -0
- data/features/step_definitions/has_versions_steps.rb +0 -0
- data/features/support/env.rb +13 -0
- data/has_versions.gemspec +40 -0
- data/lib/has_versions/apply/simple.rb +34 -0
- data/lib/has_versions/apply.rb +9 -0
- data/lib/has_versions/attributes.rb +34 -0
- data/lib/has_versions/configuration.rb +28 -0
- data/lib/has_versions/diff/simple.rb +24 -0
- data/lib/has_versions/diff.rb +7 -0
- data/lib/has_versions/merge/stupid.rb +44 -0
- data/lib/has_versions/merge.rb +61 -0
- data/lib/has_versions/reset/simple.rb +19 -0
- data/lib/has_versions/reset.rb +15 -0
- data/lib/has_versions/stage.rb +121 -0
- data/lib/has_versions/version.rb +4 -0
- data/lib/has_versions/versioned.rb +34 -0
- data/lib/has_versions/versioning_key/uuid.rb +23 -0
- data/lib/has_versions/versioning_key.rb +8 -0
- data/lib/has_versions.rb +21 -0
- data/spec/has_versions/apply_spec.rb +33 -0
- data/spec/has_versions/configuration_spec.rb +33 -0
- data/spec/has_versions/diff_spec.rb +28 -0
- data/spec/has_versions/merge_spec.rb +67 -0
- data/spec/has_versions/reset_spec.rb +41 -0
- data/spec/has_versions/stage_spec.rb +18 -0
- data/spec/has_versions/versioned_spec.rb +59 -0
- data/spec/has_versions/versioning_key_spec.rb +31 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/matchers/be_a_uuid.rb +8 -0
- data/spec/support/matchers/have_key.rb +25 -0
- data/spec/support/version.rb +7 -0
- 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
|
data/lib/has_versions.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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,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
|
+
|
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
|