nsync 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -45,3 +45,17 @@ end
45
45
 
46
46
  require 'yard'
47
47
  YARD::Rake::YardocTask.new
48
+
49
+ require 'metric_fu'
50
+ MetricFu::Configuration.run do |config|
51
+ config.metrics -= [:rcov, :saikuro]
52
+ config.graphs -= [:rcov, :saikuro]
53
+ end
54
+
55
+ class MetricFu::Template
56
+ def file_url(name, line)
57
+ @commit ||= `git rev-parse --verify HEAD`.chomp
58
+ "http://github.com/schleyfox/nsync/blob/#{@commit}/#{name}#{(line)? "#L#{line}" : ""}"
59
+ end
60
+ end
61
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -3,9 +3,7 @@ module Nsync
3
3
  module Producer
4
4
  module InstanceMethods
5
5
  def self.included(base)
6
- puts "foo"
7
6
  base.class_eval do
8
- p base
9
7
  after_save :nsync_write
10
8
  before_destroy :nsync_destroy
11
9
  end
@@ -101,14 +101,17 @@ module Nsync
101
101
 
102
102
  if config.ordering
103
103
  config.ordering.each do |klass|
104
- begin
105
- klass = klass.constantize
104
+ klass = begin
105
+ klass.constantize
106
+ rescue NameError => e
107
+ config.log.warn("[NSYNC] Could not find class '#{klass}' from ordering; skipping")
108
+ false
109
+ end
110
+ if klass
106
111
  changes = changeset[klass]
107
112
  if changes
108
113
  apply_changes_for_class(klass, changes)
109
114
  end
110
- rescue NameError
111
- config.log.warn("[NSYNC] Could not find class '#{klass}' from ordering; skipping")
112
115
  end
113
116
  end
114
117
  else
@@ -164,6 +167,7 @@ module Nsync
164
167
  # @param [Class] klass
165
168
  # @param [Proc] l
166
169
  def after_class_finished(klass, l)
170
+ config.log.info("[NSYNC] Added callback to run after class '#{klass}'")
167
171
  @after_class_finished_queues[klass] ||= []
168
172
  @after_class_finished_queues[klass] << l
169
173
  end
@@ -184,10 +188,17 @@ module Nsync
184
188
  #
185
189
  # @param [Proc] l
186
190
  def after_finished(l)
191
+ config.log.info("[NSYNC] Added callback to run at the end of the update")
187
192
  @after_finished_queue ||= []
188
193
  @after_finished_queue << l
189
194
  end
190
195
 
196
+ # Lists the configured data remotes in the repo
197
+ def remotes
198
+ repo.git.remote({:v => true}).split("\n").map do |line|
199
+ line.split(/\s+/)
200
+ end
201
+ end
191
202
  protected
192
203
  def get_or_create_repo
193
204
  if config.local? || File.exists?(config.repo_path)
@@ -245,11 +256,13 @@ module Nsync
245
256
  end
246
257
 
247
258
  def clear_queues
259
+ config.log.info("[NSYNC] Callback queues cleared")
248
260
  @after_class_finished_queues = {}
249
261
  @after_finished_queue = []
250
262
  end
251
263
 
252
264
  def run_after_class_finished(klass)
265
+ config.log.info("[NSYNC] Running callbacks for after class '#{klass}'")
253
266
  queue = @after_class_finished_queues[klass]
254
267
  if queue
255
268
  queue.each do |l|
@@ -259,6 +272,7 @@ module Nsync
259
272
  end
260
273
 
261
274
  def run_after_finished
275
+ config.log.info("[NSYNC] Running callbacks for the end of the update")
262
276
  if @after_finished_queue
263
277
  @after_finished_queue.each do |l|
264
278
  l.call
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.2"
8
+ s.version = "0.0.3"
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{2010-12-06}
12
+ s.date = %q{2011-01-05}
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/helper.rb CHANGED
@@ -6,6 +6,15 @@ require 'mocha'
6
6
  require 'shoulda'
7
7
  require 'redgreen'
8
8
 
9
+ #hack for Mac OS X
10
+ if File.directory?("/private/tmp")
11
+ TMP_DIR = "/private/tmp"
12
+ elsif File.directory?("/tmp")
13
+ TMP_DIR = "/tmp"
14
+ else
15
+ raise "Couldn't find a valid tmp dir"
16
+ end
17
+
9
18
  require File.join(File.dirname(__FILE__), "repo")
10
19
  require File.join(File.dirname(__FILE__), "classes")
11
20
 
@@ -73,7 +73,7 @@ class NsyncConfigTest < Test::Unit::TestCase
73
73
 
74
74
  context "Lock" do
75
75
  setup do
76
- @lock_file = "/private/tmp/nsync_test_#{Process.pid}.lock"
76
+ @lock_file = "#{TMP_DIR}/nsync_test_#{Process.pid}.lock"
77
77
  FileUtils.rm @lock_file, :force => true
78
78
  Nsync.config.lock_file = @lock_file
79
79
  end
@@ -4,7 +4,7 @@ class NsyncConsumerTest < Test::Unit::TestCase
4
4
  def setup
5
5
  Nsync.reset_config
6
6
  #Grit.debug = true
7
- @lock_file = "/private/tmp/nsync_test_#{Process.pid}.lock"
7
+ @lock_file = "#{TMP_DIR}/nsync_test_#{Process.pid}.lock"
8
8
  FileUtils.rm @lock_file, :force => true
9
9
  Nsync.config.lock_file = @lock_file
10
10
 
@@ -42,7 +42,7 @@ class NsyncConsumerTest < Test::Unit::TestCase
42
42
 
43
43
  context "that doesn't exist" do
44
44
  setup do
45
- @repo_path = "/private/tmp/nsync_non_existent_test_repo"
45
+ @repo_path = "#{TMP_DIR}/nsync_non_existent_test_repo"
46
46
  FileUtils.rm_rf @repo_path
47
47
 
48
48
  Nsync.config.repo_path = @repo_path
@@ -71,8 +71,8 @@ class NsyncConsumerTest < Test::Unit::TestCase
71
71
  context "for a remote repo" do
72
72
  context "where the origin does not exist" do
73
73
  setup do
74
- @repo_url = "/private/tmp/nsync_non_existent_test_repo"
75
- @repo_path = "/private/tmp/nsync_non_existent_test_repo_consumer.git"
74
+ @repo_url = "#{TMP_DIR}/nsync_non_existent_test_repo"
75
+ @repo_path = "#{TMP_DIR}/nsync_non_existent_test_repo_consumer.git"
76
76
  FileUtils.rm_rf @repo_url
77
77
  FileUtils.rm_rf @repo_path
78
78
 
@@ -87,23 +87,33 @@ class NsyncConsumerTest < Test::Unit::TestCase
87
87
  end
88
88
  end
89
89
 
90
- context "where the origin does exist" do
91
- setup do
92
- @repo = TestRepo.new
93
- FileUtils.rm_rf @repo.bare_consumer_repo_path
94
-
95
- Nsync.config.repo_url = @repo.repo_path
96
- Nsync.config.repo_path = @repo.bare_consumer_repo_path
90
+ [['local disk', nil],
91
+ ['github', 'git://github.com/schleyfox/test_repo.git']].each do |name, url|
97
92
 
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
93
+ context "where the origin does exist on #{name}" do
94
+ setup do
95
+ @repo = TestRepo.new
96
+ FileUtils.rm_rf @repo.bare_consumer_repo_path
97
+
98
+ Nsync.config.repo_url = url || @repo.repo_path
99
+ Nsync.config.repo_path = @repo.bare_consumer_repo_path
100
+
101
+ @consumer = Nsync::Consumer.new
102
+ end
103
+
104
+ should "assign repo to a new bare repo" do
105
+ assert @consumer.repo.is_a? Grit::Repo
106
+ assert @consumer.repo.bare
107
+ end
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
104
114
  end
105
- end
106
- end
115
+ end
116
+ end
107
117
  end
108
118
 
109
119
  context "Updating the Consumer side" do
@@ -147,21 +157,55 @@ class NsyncConsumerTest < Test::Unit::TestCase
147
157
  end
148
158
 
149
159
  context "with ordering" do
150
- setup do
151
- changeset = {NsyncTestFoo => ["changes"], NsyncTestBar => ["changes"]}
152
-
153
- order = states('order').starts_as('bar')
160
+ context "the changes" do
161
+ setup do
162
+ changeset = {NsyncTestFoo => ["changes"], NsyncTestBar => ["changes"]}
163
+
164
+ order = states('order').starts_as('bar')
165
+
166
+ Nsync.config.ordering = ["NsyncTestBar", "NsyncTestFoo"]
167
+ @consumer.repo.expects(:diff).returns(:diffs).once
168
+ @consumer.expects(:changeset_from_diffs).with(:diffs).returns(changeset).once
169
+
170
+ @consumer.expects(:apply_changes_for_class).when(order.is('bar')).with(NsyncTestBar, ["changes"]).then(order.is('foo')).once
171
+ @consumer.expects(:apply_changes_for_class).when(order.is('foo')).with(NsyncTestFoo, ["changes"]).then(order.is('final')).once
172
+ end
173
+
174
+ should "execute in specified order" do
175
+ @consumer.update
176
+ end
177
+ end
154
178
 
155
- Nsync.config.ordering = ["NsyncTestBar", "NsyncTestFoo"]
156
- @consumer.repo.expects(:diff).returns(:diffs).once
157
- @consumer.expects(:changeset_from_diffs).with(:diffs).returns(changeset).once
179
+ context "when the class in ordering is not found" do
180
+ setup do
181
+ Nsync.config.ordering = ["NsyncTestBlahBlah"]
182
+ @consumer.repo.expects(:diff).returns(:diffs).once
183
+ @consumer.expects(:changeset_from_diffs).with(:diffs).returns({}).once
184
+ @consumer.expects(:apply_changes_for_class).never
185
+ end
158
186
 
159
- @consumer.expects(:apply_changes_for_class).when(order.is('bar')).with(NsyncTestBar, ["changes"]).then(order.is('foo')).once
160
- @consumer.expects(:apply_changes_for_class).when(order.is('foo')).with(NsyncTestFoo, ["changes"]).then(order.is('final')).once
187
+ should "not error out" do
188
+ assert_nothing_raised do
189
+ @consumer.update
190
+ end
191
+ end
161
192
  end
162
193
 
163
- should "execute in specified order" do
164
- @consumer.update
194
+ context "when a NameError occurs for something other than the class" do
195
+ setup do
196
+ changeset = {NsyncTestFoo => ["changes"], NsyncTestBar => ["changes"]}
197
+ Nsync.config.ordering = ["NsyncTestBar", "NsyncTestFoo"]
198
+ @consumer.repo.expects(:diff).returns(:diffs).once
199
+ @consumer.expects(:changeset_from_diffs).with(:diffs).returns(changeset).once
200
+ @consumer.expects(:apply_changes_for_class).
201
+ raises(NoMethodError, "undefined method `foo' for nil:NilClass")
202
+ end
203
+
204
+ should "raise the error" do
205
+ assert_raise NoMethodError do
206
+ @consumer.update
207
+ end
208
+ end
165
209
  end
166
210
  end
167
211
 
@@ -4,7 +4,7 @@ class NsyncProducerTest < Test::Unit::TestCase
4
4
  def setup
5
5
  #Grit.debug = true
6
6
  Nsync.reset_config
7
- @lock_file = "/private/tmp/nsync_test_#{Process.pid}.lock"
7
+ @lock_file = "#{TMP_DIR}/nsync_test_#{Process.pid}.lock"
8
8
  FileUtils.rm @lock_file, :force => true
9
9
  Nsync.config.lock_file = @lock_file
10
10
  end
data/test/repo.rb CHANGED
@@ -23,7 +23,7 @@ class TestRepo
23
23
  end
24
24
 
25
25
  def self.repo_path
26
- "/private/tmp/nsync_test_repo_#{Process.pid}"
26
+ "#{TMP_DIR}/nsync_test_repo_#{Process.pid}"
27
27
  end
28
28
 
29
29
  def bare_consumer_repo_path
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
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: 2010-12-06 00:00:00 -05:00
17
+ date: 2011-01-05 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency