nsync 0.0.3 → 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.
- data/VERSION +1 -1
- data/lib/nsync/consumer.rb +32 -1
- data/lib/nsync/producer.rb +13 -0
- data/nsync.gemspec +2 -2
- data/test/nsync_consumer_test.rb +48 -24
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/nsync/consumer.rb
CHANGED
@@ -80,6 +80,17 @@ module Nsync
|
|
80
80
|
Nsync.config
|
81
81
|
end
|
82
82
|
|
83
|
+
def latest_changes
|
84
|
+
update_repo &&
|
85
|
+
changes(config.version_manager.version,
|
86
|
+
repo.head.commit.id)
|
87
|
+
end
|
88
|
+
|
89
|
+
def changes(a, b)
|
90
|
+
diffs = repo.diff(a,b)
|
91
|
+
changeset_from_diffs(diffs)
|
92
|
+
end
|
93
|
+
|
83
94
|
# Translates and applies the changes between commit id 'a' and commit id 'b' to
|
84
95
|
# the datastore. This is used internally by rollback and update. Don't use this
|
85
96
|
# unless you absolutely know what you are doing.
|
@@ -91,6 +102,7 @@ module Nsync
|
|
91
102
|
# @param [String] a current data version commit id
|
92
103
|
# @param [String] b new data version commit id
|
93
104
|
def apply_changes(a, b)
|
105
|
+
return false if a == b
|
94
106
|
config.lock do
|
95
107
|
config.log.info("[NSYNC] Moving Nsync::Consumer from '#{a}' to '#{b}'")
|
96
108
|
clear_queues
|
@@ -125,6 +137,19 @@ module Nsync
|
|
125
137
|
end
|
126
138
|
end
|
127
139
|
|
140
|
+
# Reprocesses all changes from the start of the repo to the current version
|
141
|
+
# for the class klass, queues will not be cleared, so you can use this to
|
142
|
+
# do powerful data reconstruction. You can also shoot your foot off. Be
|
143
|
+
# very careful
|
144
|
+
def reprocess_class!(klass)
|
145
|
+
diffs = repo.diff(first_commit, config.version_manager.version)
|
146
|
+
changeset = changeset_from_diffs(diffs)
|
147
|
+
|
148
|
+
changes = changeset[klass]
|
149
|
+
if changes
|
150
|
+
apply_changes_for_class(klass, changes)
|
151
|
+
end
|
152
|
+
end
|
128
153
|
|
129
154
|
# @private
|
130
155
|
class Change < Struct.new(:id, :diff)
|
@@ -199,6 +224,12 @@ module Nsync
|
|
199
224
|
line.split(/\s+/)
|
200
225
|
end
|
201
226
|
end
|
227
|
+
|
228
|
+
# Gets the first commit id in the repo
|
229
|
+
def first_commit
|
230
|
+
self.repo.git.rev_list({:reverse => true}, "master").split("\n").first
|
231
|
+
end
|
232
|
+
|
202
233
|
protected
|
203
234
|
def get_or_create_repo
|
204
235
|
if config.local? || File.exists?(config.repo_path)
|
@@ -209,7 +240,7 @@ module Nsync
|
|
209
240
|
git = Grit::Git.new(config.repo_path)
|
210
241
|
git.clone({:bare => true}, config.repo_url, config.repo_path)
|
211
242
|
self.repo = Grit::Repo.new(config.repo_path)
|
212
|
-
config.version_manager.version =
|
243
|
+
config.version_manager.version = first_commit
|
213
244
|
return self.repo
|
214
245
|
end
|
215
246
|
end
|
data/lib/nsync/producer.rb
CHANGED
@@ -58,6 +58,19 @@ module Nsync
|
|
58
58
|
config.log.info("[NSYNC] Removed file '#{filename}'")
|
59
59
|
end
|
60
60
|
|
61
|
+
def latest_changes
|
62
|
+
diff = repo.git.native('diff', {:full_index => true, :cached => true})
|
63
|
+
|
64
|
+
if diff =~ /diff --git a/
|
65
|
+
diff = diff.sub(/.*?(diff --git a)/m, '\1')
|
66
|
+
else
|
67
|
+
diff = ''
|
68
|
+
end
|
69
|
+
|
70
|
+
diffs = Grit::Diff.list_from_string(repo, diff)
|
71
|
+
changeset_from_diffs(diffs)
|
72
|
+
end
|
73
|
+
|
61
74
|
# Commits and pushes the current changeset
|
62
75
|
def commit(message="Friendly data update")
|
63
76
|
config.lock do
|
data/nsync.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{nsync}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Hughes"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-08}
|
13
13
|
s.description = %q{Nsync is designed to allow you to have a separate data
|
14
14
|
processing app with its own data processing optimized database and a consumer
|
15
15
|
app with its own database, while keeping the data as in sync as you want it.}
|
data/test/nsync_consumer_test.rb
CHANGED
@@ -87,32 +87,28 @@ class NsyncConsumerTest < Test::Unit::TestCase
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
|
91
|
-
|
90
|
+
context "where the origin does exist" do
|
91
|
+
setup do
|
92
|
+
@repo = TestRepo.new
|
93
|
+
FileUtils.rm_rf @repo.bare_consumer_repo_path
|
92
94
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
should "set the origin remote" do
|
110
|
-
origin = @consumer.remotes.detect{|r| r[0] == "origin" && r[2] == "(fetch)" }
|
111
|
-
assert origin
|
112
|
-
assert_equal Nsync.config.repo_url, origin[1]
|
113
|
-
end
|
95
|
+
Nsync.config.repo_url = @repo.repo_path
|
96
|
+
Nsync.config.repo_path = @repo.bare_consumer_repo_path
|
97
|
+
|
98
|
+
@consumer = Nsync::Consumer.new
|
99
|
+
end
|
100
|
+
|
101
|
+
should "assign repo to a new bare repo" do
|
102
|
+
assert @consumer.repo.is_a? Grit::Repo
|
103
|
+
assert @consumer.repo.bare
|
104
|
+
end
|
105
|
+
|
106
|
+
should "set the origin remote" do
|
107
|
+
origin = @consumer.remotes.detect{|r| r[0] == "origin" && r[2] == "(fetch)" }
|
108
|
+
assert origin
|
109
|
+
assert_equal Nsync.config.repo_url, origin[1]
|
114
110
|
end
|
115
|
-
end
|
111
|
+
end
|
116
112
|
end
|
117
113
|
end
|
118
114
|
|
@@ -301,4 +297,32 @@ class NsyncConsumerTest < Test::Unit::TestCase
|
|
301
297
|
end
|
302
298
|
end
|
303
299
|
end
|
300
|
+
|
301
|
+
context "Reprocessing all data for a class" do
|
302
|
+
setup do
|
303
|
+
@repo = TestRepo.new
|
304
|
+
Nsync.config.version_manager.stubs(:version => "current version")
|
305
|
+
FileUtils.rm_rf @repo.bare_consumer_repo_path
|
306
|
+
|
307
|
+
Nsync.config.repo_url = @repo.repo_path
|
308
|
+
Nsync.config.repo_path = @repo.bare_consumer_repo_path
|
309
|
+
|
310
|
+
@consumer = Nsync::Consumer.new
|
311
|
+
end
|
312
|
+
|
313
|
+
should "get changes from initial revision to current version and apply only for the class" do
|
314
|
+
changeset = {NsyncTestFoo => ["changes"], NsyncTestBar => ["changes"]}
|
315
|
+
|
316
|
+
@consumer.expects(:first_commit).returns("first version").once
|
317
|
+
|
318
|
+
@consumer.repo.expects(:diff).with("first version", "current version").returns(:diffs).once
|
319
|
+
@consumer.expects(:changeset_from_diffs).with(:diffs).returns(changeset).once
|
320
|
+
|
321
|
+
@consumer.expects(:apply_changes_for_class).with(NsyncTestBar, is_a(Array)).never
|
322
|
+
@consumer.expects(:apply_changes_for_class).with(NsyncTestFoo, ["changes"]).once
|
323
|
+
|
324
|
+
|
325
|
+
@consumer.reprocess_class!(NsyncTestFoo)
|
326
|
+
end
|
327
|
+
end
|
304
328
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.3
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ben Hughes
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-08 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|