eternity 0.0.5 → 0.1.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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/eternity.gemspec +3 -3
- data/lib/eternity.rb +7 -8
- data/lib/eternity/blob.rb +5 -5
- data/lib/eternity/branch.rb +1 -1
- data/lib/eternity/collection_tracker.rb +1 -1
- data/lib/eternity/commit.rb +15 -3
- data/lib/eternity/index.rb +14 -3
- data/lib/eternity/object_tracker.rb +1 -1
- data/lib/eternity/repository.rb +12 -4
- data/lib/eternity/tracker.rb +1 -1
- data/lib/eternity/version.rb +1 -1
- data/spec/blob_spec.rb +3 -3
- data/spec/commit_spec.rb +63 -2
- data/spec/index_spec.rb +12 -0
- data/spec/locking_spec.rb +35 -32
- data/spec/minitest_helper.rb +3 -2
- data/spec/repository_spec.rb +13 -0
- metadata +50 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7844d5b55ae3bf3ee53f5ffebe730e65c586071
|
4
|
+
data.tar.gz: 44489d244b55008ab3a484290e5f9e261ee77c2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a478d2902be86a627498d81fa69b6191cb45c9574d26c520be0142b0ac051a533bb6e8a38772eda97d6579b1d987afeca7febc3cf21240b6ff40f5bba9ad8b33
|
7
|
+
data.tar.gz: 335f532289063578604144fde234b8ec2a62d91fb8ee1a205e9b5aa957f674d987e6307b7f58a614bcbc050d0b0351034350e09baa2cfed224b99432e6be6648
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 2.
|
1
|
+
ruby 2.0
|
data/eternity.gemspec
CHANGED
@@ -18,10 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency 'redic', '~> 1.
|
22
|
-
spec.add_dependency 'restruct', '~> 0.0
|
21
|
+
spec.add_dependency 'redic', '~> 1.5.0'
|
22
|
+
spec.add_dependency 'restruct', '~> 0.1.0'
|
23
23
|
spec.add_dependency 'class_config', '~> 0.0.2'
|
24
|
-
spec.add_dependency 'locky', '~> 0.0.3'
|
25
24
|
spec.add_dependency 'transparent_proxy', '~> 0.0.4'
|
26
25
|
|
27
26
|
if RUBY_PLATFORM == 'java'
|
@@ -33,6 +32,7 @@ Gem::Specification.new do |spec|
|
|
33
32
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
34
33
|
spec.add_development_dependency 'rake'
|
35
34
|
spec.add_development_dependency 'minitest', '~> 4.7'
|
35
|
+
spec.add_development_dependency "minitest-great_expectations"
|
36
36
|
spec.add_development_dependency 'turn', '~> 0.9'
|
37
37
|
spec.add_development_dependency 'simplecov'
|
38
38
|
spec.add_development_dependency 'pry-nav'
|
data/lib/eternity.rb
CHANGED
@@ -7,7 +7,6 @@ require 'fileutils'
|
|
7
7
|
require 'forwardable'
|
8
8
|
require 'restruct'
|
9
9
|
require 'base64'
|
10
|
-
require 'locky'
|
11
10
|
require 'transparent_proxy'
|
12
11
|
|
13
12
|
module Eternity
|
@@ -20,24 +19,24 @@ module Eternity
|
|
20
19
|
|
21
20
|
extend ClassConfig
|
22
21
|
|
23
|
-
attr_config :
|
22
|
+
attr_config :connection, Restruct::Connection.new
|
24
23
|
attr_config :keyspace, Restruct::Id.new(:eternity)
|
25
24
|
attr_config :blob_cache_expiration, 24 * 60 * 60 # 1 day in seconds
|
26
25
|
attr_config :blob_path, File.join(Dir.home, '.eternity')
|
27
26
|
attr_config :logger, Logger.new(STDOUT)
|
28
27
|
|
29
|
-
def self.
|
30
|
-
|
31
|
-
|
28
|
+
def self.locker_for(repository_name)
|
29
|
+
Restruct::Locker.new connection: connection,
|
30
|
+
id: keyspace[:locker][:repository][repository_name]
|
32
31
|
end
|
33
|
-
|
32
|
+
|
34
33
|
def self.redis_keys
|
35
|
-
|
34
|
+
connection.call 'KEYS', keyspace['*']
|
36
35
|
end
|
37
36
|
|
38
37
|
def self.clear_redis
|
39
38
|
redis_keys.each do |key|
|
40
|
-
|
39
|
+
connection.call 'DEL', key
|
41
40
|
end
|
42
41
|
end
|
43
42
|
|
data/lib/eternity/blob.rb
CHANGED
@@ -53,24 +53,24 @@ module Eternity
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def clear_cache
|
56
|
-
Eternity.
|
57
|
-
Eternity.
|
56
|
+
Eternity.connection.call('KEYS', Eternity.keyspace[:blob]['*']).each_slice(1000) do |keys|
|
57
|
+
Eternity.connection.call 'DEL', *keys
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
def count
|
62
|
-
Eternity.
|
62
|
+
Eternity.connection.call('KEYS', Eternity.keyspace[:blob]['*']).count
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
66
66
|
|
67
67
|
def write_redis(type, sha1, serialization)
|
68
|
-
Eternity.
|
68
|
+
Eternity.connection.call 'SET', Eternity.keyspace[:blob][type][sha1], serialization,
|
69
69
|
'EX', Eternity.blob_cache_expiration
|
70
70
|
end
|
71
71
|
|
72
72
|
def read_redis(type, sha1)
|
73
|
-
Eternity.
|
73
|
+
Eternity.connection.call 'GET', Eternity.keyspace[:blob][type][sha1]
|
74
74
|
end
|
75
75
|
|
76
76
|
def write_file(type, sha1, serialization)
|
data/lib/eternity/branch.rb
CHANGED
data/lib/eternity/commit.rb
CHANGED
@@ -47,12 +47,13 @@ module Eternity
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def history_ids
|
50
|
+
return [] if nil?
|
50
51
|
if data['history']
|
51
52
|
Blob.read :history, data['history']
|
52
53
|
else
|
53
54
|
# Backward compatibility
|
54
|
-
cache_key =
|
55
|
-
return Eternity.
|
55
|
+
cache_key = self.class.history_cache_key[id]
|
56
|
+
return Eternity.connection.call 'LRANGE', cache_key, 0, -1 if Eternity.connection.call('EXISTS', cache_key) == 1
|
56
57
|
|
57
58
|
commit_ids =
|
58
59
|
if parent_ids.count == 2
|
@@ -64,7 +65,7 @@ module Eternity
|
|
64
65
|
parent_id ? [parent_id] + Commit.new(parent_id).history_ids : []
|
65
66
|
end
|
66
67
|
|
67
|
-
Eternity.
|
68
|
+
Eternity.connection.call 'RPUSH', cache_key, *commit_ids
|
68
69
|
|
69
70
|
commit_ids
|
70
71
|
end
|
@@ -75,6 +76,7 @@ module Eternity
|
|
75
76
|
end
|
76
77
|
|
77
78
|
def fast_forward?(commit)
|
79
|
+
return false if nil?
|
78
80
|
return true if commit.nil?
|
79
81
|
history_ids.include? commit.id
|
80
82
|
end
|
@@ -159,6 +161,16 @@ module Eternity
|
|
159
161
|
false
|
160
162
|
end
|
161
163
|
|
164
|
+
def self.history_cache_key
|
165
|
+
Eternity.keyspace[:cache][:history]
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.clear_history_cache
|
169
|
+
Eternity.connection.call('KEYS', history_cache_key['*']).each_slice(1000) do |keys|
|
170
|
+
Eternity.connection.call 'DEL', *keys
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
162
174
|
private
|
163
175
|
|
164
176
|
def data
|
data/lib/eternity/index.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
module Eternity
|
2
2
|
class Index < Restruct::NestedHash.new(CollectionIndex)
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
attr_reader :name
|
5
|
+
|
6
|
+
def initialize(name=nil)
|
7
|
+
@name = name ? name.to_s : SecureRandom.uuid
|
8
|
+
super connection: Eternity.connection,
|
9
|
+
id: Eternity.keyspace[:index][@name]
|
7
10
|
end
|
8
11
|
|
9
12
|
def apply(delta)
|
@@ -25,5 +28,13 @@ module Eternity
|
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
31
|
+
def self.all
|
32
|
+
sections_count = Eternity.keyspace[:index].sections.count
|
33
|
+
names = Eternity.connection.call('KEYS', Eternity.keyspace[:index]['*']).map do |key|
|
34
|
+
Restruct::Id.new(key).sections[sections_count]
|
35
|
+
end.uniq
|
36
|
+
names.map { |name| new name }
|
37
|
+
end
|
38
|
+
|
28
39
|
end
|
29
40
|
end
|
data/lib/eternity/repository.rb
CHANGED
@@ -7,10 +7,10 @@ module Eternity
|
|
7
7
|
@name = name.to_s
|
8
8
|
@id = Eternity.keyspace[:repository][@name]
|
9
9
|
@tracker = Tracker.new self
|
10
|
-
@current = Restruct::Hash.new
|
11
|
-
@branches = Restruct::Hash.new
|
12
|
-
@locker =
|
13
|
-
@default_branch = options.fetch(:default_branch
|
10
|
+
@current = Restruct::Hash.new connection: Eternity.connection, id: id[:current]
|
11
|
+
@branches = Restruct::Hash.new connection: Eternity.connection, id: id[:branches]
|
12
|
+
@locker = Eternity.locker_for @name
|
13
|
+
@default_branch = options.fetch(:default_branch, 'master').to_s
|
14
14
|
end
|
15
15
|
|
16
16
|
def [](collection)
|
@@ -171,6 +171,14 @@ module Eternity
|
|
171
171
|
self.delta = dump['delta']
|
172
172
|
end
|
173
173
|
|
174
|
+
def self.all
|
175
|
+
sections_count = Eternity.keyspace[:repository].sections.count
|
176
|
+
names = Eternity.connection.call('KEYS', Eternity.keyspace[:repository]['*']).map do |key|
|
177
|
+
Restruct::Id.new(key).sections[sections_count]
|
178
|
+
end.uniq
|
179
|
+
names.map { |name| new name }
|
180
|
+
end
|
181
|
+
|
174
182
|
private
|
175
183
|
|
176
184
|
attr_reader :tracker, :current, :locker
|
data/lib/eternity/tracker.rb
CHANGED
data/lib/eternity/version.rb
CHANGED
data/spec/blob_spec.rb
CHANGED
@@ -30,14 +30,14 @@ describe Blob do
|
|
30
30
|
it 'Write in redis and file system' do
|
31
31
|
sha1 = Blob.write :xyz, data
|
32
32
|
|
33
|
-
redis_data =
|
33
|
+
redis_data = connection.call 'GET', key
|
34
34
|
file_data = wait_and_read_file filename
|
35
35
|
|
36
36
|
[redis_data, decode(file_data)].each { |d| MessagePack.unpack(d).must_equal data }
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'Read from redis' do
|
40
|
-
|
40
|
+
connection.call 'SET', key, serialization
|
41
41
|
|
42
42
|
refute File.exists?(filename)
|
43
43
|
Blob.read(:xyz, sha1).must_equal data
|
@@ -47,7 +47,7 @@ describe Blob do
|
|
47
47
|
FileUtils.mkpath File.dirname(filename)
|
48
48
|
File.write filename, encode(serialization)
|
49
49
|
|
50
|
-
|
50
|
+
connection.call('GET', key).must_be_nil
|
51
51
|
Blob.read(:xyz, sha1).must_equal data
|
52
52
|
end
|
53
53
|
|
data/spec/commit_spec.rb
CHANGED
@@ -72,10 +72,22 @@ describe Repository, 'Commit' do
|
|
72
72
|
error.message.must_equal 'Message must be present'
|
73
73
|
end
|
74
74
|
|
75
|
+
it 'Clear history cache' do
|
76
|
+
3.times do
|
77
|
+
connection.call 'RPUSH', Commit.history_cache_key[SecureRandom.uuid], SecureRandom.uuid
|
78
|
+
end
|
79
|
+
|
80
|
+
connection.call('KEYS', Commit.history_cache_key['*']).count.must_equal 3
|
81
|
+
|
82
|
+
Commit.clear_history_cache
|
83
|
+
|
84
|
+
connection.call('KEYS', Commit.history_cache_key['*']).count.must_equal 0
|
85
|
+
end
|
86
|
+
|
75
87
|
describe 'With index' do
|
76
88
|
|
77
89
|
def assert_transeint_index
|
78
|
-
|
90
|
+
connection.call('KEYS', Eternity.keyspace[:index]['*']).must_be_empty
|
79
91
|
end
|
80
92
|
|
81
93
|
it 'Transient' do
|
@@ -102,5 +114,54 @@ describe Repository, 'Commit' do
|
|
102
114
|
end
|
103
115
|
|
104
116
|
end
|
105
|
-
|
117
|
+
|
118
|
+
describe 'Fast Forward' do
|
119
|
+
|
120
|
+
it 'Both commits nil' do
|
121
|
+
current_commit = Commit.new(nil)
|
122
|
+
target_commit = Commit.new(nil)
|
123
|
+
|
124
|
+
target_commit.wont_be :fast_forward?, current_commit
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'Current commit nil' do
|
128
|
+
repository[:countries].insert 'AR', name: 'Argentina'
|
129
|
+
target_commit = repository.commit author: 'User', message: 'Commit 1'
|
130
|
+
|
131
|
+
current_commit = Commit.new nil
|
132
|
+
|
133
|
+
target_commit.must_be :fast_forward?, current_commit
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'Target commit nil' do
|
137
|
+
repository[:countries].insert 'AR', name: 'Argentina'
|
138
|
+
current_commit = repository.commit author: 'User', message: 'Commit 1'
|
139
|
+
|
140
|
+
target_commit = Commit.new nil
|
141
|
+
|
142
|
+
target_commit.wont_be :fast_forward?, current_commit
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'Target commit is not fast forward of current commit' do
|
146
|
+
repository[:countries].insert 'AR', name: 'Argentina'
|
147
|
+
target_commit = repository.commit author: 'User', message: 'Commit 1'
|
148
|
+
|
149
|
+
repository[:countries].insert 'BR', name: 'Brasil'
|
150
|
+
current_commit = repository.commit author: 'User', message: 'Commit 2'
|
151
|
+
|
152
|
+
target_commit.wont_be :fast_forward?, current_commit
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'Target commit is fast forward of current commit' do
|
156
|
+
repository[:countries].insert 'AR', name: 'Argentina'
|
157
|
+
current_commit = repository.commit author: 'User', message: 'Commit 1'
|
158
|
+
|
159
|
+
repository[:countries].insert 'BR', name: 'Brasil'
|
160
|
+
target_commit = repository.commit author: 'User', message: 'Commit 2'
|
161
|
+
|
162
|
+
target_commit.must_be :fast_forward?, current_commit
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
106
167
|
end
|
data/spec/index_spec.rb
CHANGED
@@ -73,4 +73,16 @@ describe Index do
|
|
73
73
|
index.to_h.must_equal index_2.to_h
|
74
74
|
end
|
75
75
|
|
76
|
+
it 'In memory instances' do
|
77
|
+
Index.all.must_be_empty
|
78
|
+
|
79
|
+
index_1 = Index.new 'index_1'
|
80
|
+
index_1[:countries].insert 'AR', name: 'Argentina'
|
81
|
+
|
82
|
+
index_2 = Index.new 'index_2'
|
83
|
+
index_2[:countries].insert 'UY', name: 'Uruguay'
|
84
|
+
|
85
|
+
Index.all.map(&:name).sort.must_equal %w(index_1 index_2)
|
86
|
+
end
|
87
|
+
|
76
88
|
end
|
data/spec/locking_spec.rb
CHANGED
@@ -4,20 +4,23 @@ describe 'Locking' do
|
|
4
4
|
|
5
5
|
let(:repository) { Repository.new :test }
|
6
6
|
|
7
|
-
def
|
8
|
-
Eternity.
|
7
|
+
def with_locked(repository, key=:test_process)
|
8
|
+
locker = Eternity.locker_for repository.name
|
9
|
+
locker.lock key do
|
10
|
+
yield
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
14
|
def assert_locked
|
12
|
-
|
13
|
-
error.message.must_equal 'test already locked by test_process'
|
15
|
+
proc { yield }.must_raise Restruct::LockerError
|
14
16
|
end
|
15
17
|
|
16
18
|
it 'Commit' do
|
17
19
|
repository[:countries].insert 'AR', name: 'Argentina'
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
|
21
|
+
with_locked repository, :commit do
|
22
|
+
assert_locked { repository.commit author: 'User', message: 'Commit Message' }
|
23
|
+
end
|
21
24
|
|
22
25
|
repository.current_commit.must_be_nil
|
23
26
|
repository.changes_count.must_equal 1
|
@@ -30,9 +33,9 @@ describe 'Locking' do
|
|
30
33
|
repository[:countries].insert 'UY', name: 'Uruguay'
|
31
34
|
commit_2 = repository.commit author: 'User', message: 'Commit 2'
|
32
35
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
+
with_locked repository, :checkout do
|
37
|
+
assert_locked { repository.checkout commit: commit_1.id }
|
38
|
+
end
|
36
39
|
|
37
40
|
repository.current_commit.must_equal commit_2
|
38
41
|
end
|
@@ -46,9 +49,9 @@ describe 'Locking' do
|
|
46
49
|
|
47
50
|
repository.checkout commit: commit_1.id
|
48
51
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
with_locked repository, :merge do
|
53
|
+
assert_locked { repository.merge commit: commit_2.id }
|
54
|
+
end
|
52
55
|
|
53
56
|
repository.current_commit.must_equal commit_1
|
54
57
|
end
|
@@ -58,9 +61,9 @@ describe 'Locking' do
|
|
58
61
|
repository[:countries].insert 'UY', name: 'Uruguay'
|
59
62
|
repository[:cities].insert 'CABA', name: 'Ciudad Autonoma de Buenos Aires'
|
60
63
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
+
with_locked repository, :revert_all do
|
65
|
+
assert_locked { repository.revert }
|
66
|
+
end
|
64
67
|
|
65
68
|
repository.changes_count.must_equal 3
|
66
69
|
repository[:countries].count.must_equal 2
|
@@ -72,9 +75,9 @@ describe 'Locking' do
|
|
72
75
|
repository[:countries].insert 'UY', name: 'Uruguay'
|
73
76
|
repository[:cities].insert 'CABA', name: 'Ciudad Autonoma de Buenos Aires'
|
74
77
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
+
with_locked repository, :revert do
|
79
|
+
assert_locked { repository[:countries].revert_all }
|
80
|
+
end
|
78
81
|
|
79
82
|
repository.changes_count.must_equal 3
|
80
83
|
repository[:countries].count.must_equal 2
|
@@ -82,19 +85,19 @@ describe 'Locking' do
|
|
82
85
|
end
|
83
86
|
|
84
87
|
it 'Insert' do
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
with_locked repository do
|
89
|
+
assert_locked { repository[:countries].insert 'AR', name: 'Argentina' }
|
90
|
+
end
|
88
91
|
|
89
92
|
repository.changes_count.must_equal 0
|
90
93
|
end
|
91
94
|
|
92
95
|
it 'Update' do
|
93
96
|
repository[:countries].insert 'AR', name: 'Argentina'
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
97
|
+
|
98
|
+
with_locked repository do
|
99
|
+
assert_locked { repository[:countries].update 'AR', name: 'Republica Argentina' }
|
100
|
+
end
|
98
101
|
|
99
102
|
repository.delta.must_equal 'countries' => {'AR' => {'action' => 'insert', 'data' => {'name' => 'Argentina'}}}
|
100
103
|
end
|
@@ -102,9 +105,9 @@ describe 'Locking' do
|
|
102
105
|
it 'Delete' do
|
103
106
|
repository[:countries].insert 'AR', name: 'Argentina'
|
104
107
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
+
with_locked repository do
|
109
|
+
assert_locked { repository[:countries].delete 'AR' }
|
110
|
+
end
|
108
111
|
|
109
112
|
repository.delta.must_equal 'countries' => {'AR' => {'action' => 'insert', 'data' => {'name' => 'Argentina'}}}
|
110
113
|
end
|
@@ -112,9 +115,9 @@ describe 'Locking' do
|
|
112
115
|
it 'Revert' do
|
113
116
|
repository[:countries].insert 'AR', name: 'Argentina'
|
114
117
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
+
with_locked repository, :revert do
|
119
|
+
assert_locked { repository[:countries].revert 'AR' }
|
120
|
+
end
|
118
121
|
|
119
122
|
repository.delta.must_equal 'countries' => {'AR' => {'action' => 'insert', 'data' => {'name' => 'Argentina'}}}
|
120
123
|
end
|
data/spec/minitest_helper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'coverage_helper'
|
2
2
|
require 'eternity'
|
3
3
|
require 'minitest/autorun'
|
4
|
+
require 'minitest/great_expectations'
|
4
5
|
require 'timeout'
|
5
6
|
require 'turn'
|
6
7
|
require 'pry-nav'
|
@@ -21,8 +22,8 @@ Eternity.configure do |config|
|
|
21
22
|
end
|
22
23
|
|
23
24
|
class Minitest::Spec
|
24
|
-
def
|
25
|
-
Eternity.
|
25
|
+
def connection
|
26
|
+
Eternity.connection
|
26
27
|
end
|
27
28
|
|
28
29
|
def digest(data)
|
data/spec/repository_spec.rb
CHANGED
@@ -70,4 +70,17 @@ describe Repository do
|
|
70
70
|
repository.delta.must_equal 'countries' => {'UY' => {'action' => 'insert', 'data' => {'name' => 'Uruguay'}}}
|
71
71
|
end
|
72
72
|
|
73
|
+
it 'In memory instances' do
|
74
|
+
Repository.all.must_be_empty
|
75
|
+
|
76
|
+
repository_1 = Repository.new 'repository_1'
|
77
|
+
repository_1[:countries].insert 'AR', name: 'Argentina'
|
78
|
+
|
79
|
+
repository_2 = Repository.new 'repository_2'
|
80
|
+
repository_2[:countries].insert 'UY', name: 'Uruguay'
|
81
|
+
|
82
|
+
Repository.all.map(&:name).sort.must_equal %w(repository_1 repository_2)
|
83
|
+
end
|
84
|
+
|
85
|
+
|
73
86
|
end
|
metadata
CHANGED
@@ -1,181 +1,181 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eternity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Naiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redic
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.5.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.5.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: restruct
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.0
|
33
|
+
version: 0.1.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.0
|
40
|
+
version: 0.1.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: class_config
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.0.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.0.2
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: locky
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.0.3
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 0.0.3
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: transparent_proxy
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- -
|
59
|
+
- - ~>
|
74
60
|
- !ruby/object:Gem::Version
|
75
61
|
version: 0.0.4
|
76
62
|
type: :runtime
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- -
|
66
|
+
- - ~>
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: 0.0.4
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: msgpack
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- -
|
73
|
+
- - ~>
|
88
74
|
- !ruby/object:Gem::Version
|
89
75
|
version: 0.5.9
|
90
76
|
type: :runtime
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- -
|
80
|
+
- - ~>
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: 0.5.9
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: bundler
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- -
|
87
|
+
- - ~>
|
102
88
|
- !ruby/object:Gem::Version
|
103
89
|
version: '1.5'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- -
|
94
|
+
- - ~>
|
109
95
|
- !ruby/object:Gem::Version
|
110
96
|
version: '1.5'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: rake
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - '>='
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
|
-
- -
|
108
|
+
- - '>='
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: minitest
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
|
-
- -
|
115
|
+
- - ~>
|
130
116
|
- !ruby/object:Gem::Version
|
131
117
|
version: '4.7'
|
132
118
|
type: :development
|
133
119
|
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
|
-
- -
|
122
|
+
- - ~>
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '4.7'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: minitest-great_expectations
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: turn
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - ~>
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0.9'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - ~>
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0.9'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: simplecov
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- -
|
157
|
+
- - '>='
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - '>='
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: pry-nav
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- -
|
171
|
+
- - '>='
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: '0'
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
|
-
- -
|
178
|
+
- - '>='
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
181
|
description: Distributed database version control system
|
@@ -185,11 +185,11 @@ executables: []
|
|
185
185
|
extensions: []
|
186
186
|
extra_rdoc_files: []
|
187
187
|
files:
|
188
|
-
-
|
189
|
-
-
|
190
|
-
-
|
191
|
-
-
|
192
|
-
-
|
188
|
+
- .coveralls.yml
|
189
|
+
- .gitignore
|
190
|
+
- .ruby-gemset
|
191
|
+
- .ruby-version
|
192
|
+
- .travis.yml
|
193
193
|
- Gemfile
|
194
194
|
- LICENSE.txt
|
195
195
|
- README.md
|
@@ -238,17 +238,17 @@ require_paths:
|
|
238
238
|
- lib
|
239
239
|
required_ruby_version: !ruby/object:Gem::Requirement
|
240
240
|
requirements:
|
241
|
-
- -
|
241
|
+
- - '>='
|
242
242
|
- !ruby/object:Gem::Version
|
243
243
|
version: '0'
|
244
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
245
|
requirements:
|
246
|
-
- -
|
246
|
+
- - '>='
|
247
247
|
- !ruby/object:Gem::Version
|
248
248
|
version: '0'
|
249
249
|
requirements: []
|
250
250
|
rubyforge_project:
|
251
|
-
rubygems_version: 2.
|
251
|
+
rubygems_version: 2.4.7
|
252
252
|
signing_key:
|
253
253
|
specification_version: 4
|
254
254
|
summary: Distributed database version control system
|