nsync 0.0.2 → 0.0.3

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/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