nsync 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,8 +5,6 @@ gem "schleyfox-grit", ">= 2.3.0.1"
5
5
  require 'grit'
6
6
 
7
7
  require 'jeweler'
8
- $:.unshift(".")
9
- require 'jeweler_monkey_patch'
10
8
 
11
9
 
12
10
  Jeweler::Tasks.new do |gem|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -36,7 +36,9 @@ module Nsync
36
36
  #
37
37
  # @param [String] filename path in the working tree to write to
38
38
  # @param [Hash] hash a hash that can be converted to json to be written
39
- def write_file(filename, hash)
39
+ # @param [Boolean] add tells whether to git add the file.
40
+ # This is for internal bookkeeping files only
41
+ def write_file(filename, hash, add=false)
40
42
  config.cd do
41
43
  dir = File.dirname(filename)
42
44
  unless [".", "/"].include?(dir) || File.directory?(dir)
@@ -46,7 +48,7 @@ module Nsync
46
48
  File.open(File.join(config.repo_path, filename), "w") do |f|
47
49
  f.write( (hash.is_a?(Hash))? hash.to_json : hash )
48
50
  end
49
- repo.add(File.join(config.repo_path, filename))
51
+ repo.add(File.join(config.repo_path, filename)) if add
50
52
  config.log.info("[NSYNC] Updated file '#{filename}'")
51
53
  end
52
54
  true
@@ -59,7 +61,8 @@ module Nsync
59
61
  end
60
62
 
61
63
  def latest_changes
62
- diff = repo.git.native('diff', {:full_index => true, :cached => true})
64
+ diff = repo.git.native('diff', {:full_index => true})
65
+ diff += diff_untracked_files
63
66
 
64
67
  if diff =~ /diff --git a/
65
68
  diff = diff.sub(/.*?(diff --git a)/m, '\1')
@@ -71,11 +74,42 @@ module Nsync
71
74
  changeset_from_diffs(diffs)
72
75
  end
73
76
 
77
+ # gets untracked files into the diff output
78
+ # hack from http://stackoverflow.com/questions/855767/can-i-use-git-diff-on-untracked-files
79
+ def diff_untracked_files
80
+ response, err = repo.git.sh(<<-CMD)
81
+ git --git-dir='#{repo.git.git_dir}' ls-files -d --others --exclude-standard |
82
+ while read -r i; do git --git-dir='#{repo.git.git_dir}' diff -- /dev/null "$i"; done
83
+ CMD
84
+ response
85
+ end
86
+
87
+
74
88
  # Commits and pushes the current changeset
75
- def commit(message="Friendly data update")
89
+ #
90
+ # By default all changes in working dir are committed.
91
+ #
92
+ # Alternatively, specific changes can be specified in the
93
+ # which_changes parameter. The format for this is {"klass" => [id,...]}
94
+ def commit(message="Friendly data update", which_changes=:all)
76
95
  config.lock do
77
96
  config.cd do
78
- repo.commit_all(message)
97
+
98
+ files_to_commit = []
99
+ latest_changes.each do |klass, changes|
100
+ which_of_class = which_changes[klass.to_s] if which_changes.is_a?(Hash)
101
+ changes.each do |change|
102
+ if which_changes == :all ||
103
+ (which_of_class && which_of_class.include?(change.id))
104
+
105
+ files_to_commit <<
106
+ File.join(config.repo_path, diff_path(change.diff))
107
+ end
108
+ end
109
+ end
110
+ repo.git.update_index({:add => true, :remove => true}, '--', *files_to_commit)
111
+
112
+ repo.commit_index(message)
79
113
  config.log.info("[NSYNC] Committed '#{message}' to repo")
80
114
  end
81
115
  end
@@ -122,7 +156,7 @@ module Nsync
122
156
 
123
157
  config.lock do
124
158
  self.repo = Grit::Repo.init(config.repo_path)
125
- write_file(".gitignore", "")
159
+ write_file(".gitignore", "", true)
126
160
  end
127
161
  commit("Initial Commit")
128
162
  end
@@ -134,7 +168,7 @@ module Nsync
134
168
 
135
169
  # refinement to allow the producer to consume itself
136
170
  if classes.empty?
137
- classes = [CoreExtensions.constantize(producer_class_name)].compact
171
+ classes = [(CoreExtensions.constantize(producer_class_name) rescue nil)].compact
138
172
  end
139
173
  [classes, id]
140
174
  end
@@ -1,6 +1,6 @@
1
1
  # Generated by jeweler
2
- # DO NOT EDIT THIS FILE
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
@@ -9,52 +9,51 @@ Gem::Specification.new do |s|
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-06-30}
12
+ s.date = %q{2011-10-28}
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.}
16
16
  s.email = %q{ben@pixelmachine.org}
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
19
- "README.md"
19
+ "README.md"
20
20
  ]
21
21
  s.files = [
22
22
  "LICENSE",
23
- "README.md",
24
- "Rakefile",
25
- "VERSION",
26
- "jeweler_monkey_patch.rb",
27
- "lib/nsync.rb",
28
- "lib/nsync/active_record/consumer/methods.rb",
29
- "lib/nsync/active_record/methods.rb",
30
- "lib/nsync/active_record/producer/methods.rb",
31
- "lib/nsync/class_methods.rb",
32
- "lib/nsync/config.rb",
33
- "lib/nsync/consumer.rb",
34
- "lib/nsync/core_extensions.rb",
35
- "lib/nsync/git_version_manager.rb",
36
- "lib/nsync/producer.rb",
37
- "lib/nsync/producer/methods.rb",
38
- "nsync.gemspec"
23
+ "README.md",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "jeweler_monkey_patch.rb",
27
+ "lib/nsync.rb",
28
+ "lib/nsync/active_record/consumer/methods.rb",
29
+ "lib/nsync/active_record/methods.rb",
30
+ "lib/nsync/active_record/producer/methods.rb",
31
+ "lib/nsync/class_methods.rb",
32
+ "lib/nsync/config.rb",
33
+ "lib/nsync/consumer.rb",
34
+ "lib/nsync/core_extensions.rb",
35
+ "lib/nsync/git_version_manager.rb",
36
+ "lib/nsync/producer.rb",
37
+ "lib/nsync/producer/methods.rb",
38
+ "nsync.gemspec",
39
+ "test/active_record_test.rb",
40
+ "test/classes.rb",
41
+ "test/helper.rb",
42
+ "test/nsync_config_test.rb",
43
+ "test/nsync_consumer_test.rb",
44
+ "test/nsync_producer_test.rb",
45
+ "test/repo.rb"
39
46
  ]
40
47
  s.homepage = %q{http://github.com/schleyfox/nsync}
41
48
  s.require_paths = ["lib"]
42
- s.rubygems_version = %q{1.4.1}
49
+ s.rubygems_version = %q{1.3.6}
43
50
  s.summary = %q{Keep your data processors and apps in sync}
44
- s.test_files = [
45
- "test/active_record_test.rb",
46
- "test/classes.rb",
47
- "test/helper.rb",
48
- "test/nsync_config_test.rb",
49
- "test/nsync_consumer_test.rb",
50
- "test/nsync_producer_test.rb",
51
- "test/repo.rb"
52
- ]
53
51
 
54
52
  if s.respond_to? :specification_version then
53
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
55
54
  s.specification_version = 3
56
55
 
57
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
58
57
  s.add_runtime_dependency(%q<json>, [">= 0"])
59
58
  s.add_runtime_dependency(%q<schleyfox-grit>, [">= 2.3.0.1"])
60
59
  s.add_runtime_dependency(%q<schleyfox-lockfile>, [">= 1.0.0"])
@@ -75,3 +74,4 @@ Gem::Specification.new do |s|
75
74
  s.add_dependency(%q<mocha>, [">= 0"])
76
75
  end
77
76
  end
77
+
@@ -32,7 +32,7 @@ class NsyncProducerTest < Test::Unit::TestCase
32
32
 
33
33
  should "initialize it and make a base commit" do
34
34
  Grit::Repo.expects(:init).with(@repo_path).once
35
- Nsync::Producer.any_instance.expects(:write_file).with(".gitignore", "").once
35
+ Nsync::Producer.any_instance.expects(:write_file).with(".gitignore", "", true).once
36
36
  Nsync::Producer.any_instance.expects(:commit).returns(true).once
37
37
  Nsync::Producer.new
38
38
  end
@@ -74,9 +74,8 @@ class NsyncProducerTest < Test::Unit::TestCase
74
74
  end
75
75
 
76
76
  should "write the file to disk, add it to the index, but not commit" do
77
- @producer.repo.expects(:add).with(File.join(@repo.repo_path, @file)).once
78
77
  @producer.expects(:commit).never
79
- @producer.repo.expects(:commit_all).never
78
+ @producer.repo.expects(:commit_index).never
80
79
  @producer.write_file(@file, @hash)
81
80
 
82
81
  assert_equal JSON.load(File.read(File.join(@repo.repo_path, @file))), @hash
@@ -92,7 +91,6 @@ class NsyncProducerTest < Test::Unit::TestCase
92
91
 
93
92
  should "behave just like a create" do
94
93
  new_hash = {"id" => 1, "val" => "Kaboom"}
95
- @producer.repo.expects(:add).with(File.join(@repo.repo_path, @file)).once
96
94
  @producer.expects(:commit).never
97
95
  @producer.write_file(@file, new_hash)
98
96
 
@@ -121,7 +119,8 @@ class NsyncProducerTest < Test::Unit::TestCase
121
119
 
122
120
  should "commit all changes as well as push" do
123
121
  @msg = "Test Update"
124
- @producer.repo.expects(:commit_all).with(@msg).once
122
+ @producer.repo.git.expects(:update_index).once
123
+ @producer.repo.expects(:commit_index).with(@msg).once
125
124
  @producer.expects(:push).once
126
125
  @producer.commit(@msg)
127
126
  end
@@ -256,6 +255,11 @@ class NsyncProducerTest < Test::Unit::TestCase
256
255
 
257
256
  assert_equal 4, @repo.commits.size
258
257
  assert_equal 4, @remote_repo.commits.size
258
+
259
+ @producer.write_file("nsync_test_bar/5.json", {:id => 5, :val => "Changed"})
260
+ @producer.write_file("nsync_test_bar/6.json", {:id => 6, :val => "Added file"})
261
+ @repo.git.expects(:update_index).with({:add => true, :remove => true}, '--', File.join(@repo_path, 'nsync_test_bar/6.json')).once
262
+ @producer.commit("Partial commit", {'NsyncTestBar' => ['6']})
259
263
  end
260
264
  end
261
265
  end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nsync
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 3
7
+ - 4
9
8
  - 0
10
- version: 0.3.0
9
+ version: 0.4.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Ben Hughes
@@ -15,18 +14,16 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-06-30 00:00:00 -04:00
17
+ date: 2011-10-28 00:00:00 -04:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: json
23
22
  prerelease: false
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
25
  - - ">="
28
26
  - !ruby/object:Gem::Version
29
- hash: 3
30
27
  segments:
31
28
  - 0
32
29
  version: "0"
@@ -36,11 +33,9 @@ dependencies:
36
33
  name: schleyfox-grit
37
34
  prerelease: false
38
35
  requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
36
  requirements:
41
37
  - - ">="
42
38
  - !ruby/object:Gem::Version
43
- hash: 117
44
39
  segments:
45
40
  - 2
46
41
  - 3
@@ -53,11 +48,9 @@ dependencies:
53
48
  name: schleyfox-lockfile
54
49
  prerelease: false
55
50
  requirement: &id003 !ruby/object:Gem::Requirement
56
- none: false
57
51
  requirements:
58
52
  - - ">="
59
53
  - !ruby/object:Gem::Version
60
- hash: 23
61
54
  segments:
62
55
  - 1
63
56
  - 0
@@ -69,11 +62,9 @@ dependencies:
69
62
  name: shoulda
70
63
  prerelease: false
71
64
  requirement: &id004 !ruby/object:Gem::Requirement
72
- none: false
73
65
  requirements:
74
66
  - - ">="
75
67
  - !ruby/object:Gem::Version
76
- hash: 3
77
68
  segments:
78
69
  - 0
79
70
  version: "0"
@@ -83,11 +74,9 @@ dependencies:
83
74
  name: mocha
84
75
  prerelease: false
85
76
  requirement: &id005 !ruby/object:Gem::Requirement
86
- none: false
87
77
  requirements:
88
78
  - - ">="
89
79
  - !ruby/object:Gem::Version
90
- hash: 3
91
80
  segments:
92
81
  - 0
93
82
  version: "0"
@@ -140,35 +129,25 @@ rdoc_options: []
140
129
  require_paths:
141
130
  - lib
142
131
  required_ruby_version: !ruby/object:Gem::Requirement
143
- none: false
144
132
  requirements:
145
133
  - - ">="
146
134
  - !ruby/object:Gem::Version
147
- hash: 3
148
135
  segments:
149
136
  - 0
150
137
  version: "0"
151
138
  required_rubygems_version: !ruby/object:Gem::Requirement
152
- none: false
153
139
  requirements:
154
140
  - - ">="
155
141
  - !ruby/object:Gem::Version
156
- hash: 3
157
142
  segments:
158
143
  - 0
159
144
  version: "0"
160
145
  requirements: []
161
146
 
162
147
  rubyforge_project:
163
- rubygems_version: 1.4.1
148
+ rubygems_version: 1.3.6
164
149
  signing_key:
165
150
  specification_version: 3
166
151
  summary: Keep your data processors and apps in sync
167
- test_files:
168
- - test/active_record_test.rb
169
- - test/classes.rb
170
- - test/helper.rb
171
- - test/nsync_config_test.rb
172
- - test/nsync_consumer_test.rb
173
- - test/nsync_producer_test.rb
174
- - test/repo.rb
152
+ test_files: []
153
+