closync 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Changelog.md ADDED
@@ -0,0 +1,4 @@
1
+ ## 0.1.0 (2012-10-23)
2
+
3
+ * new feature: files that do not appear in the origin bucket are now automatically deleted from the destination bucket
4
+ * enhancement: to save bandwidth and reduce the number of PUT requests, only stale files are copied from origin to destination bucket
data/lib/closync/sync.rb CHANGED
@@ -12,43 +12,42 @@ module Closync
12
12
  end
13
13
 
14
14
  def push!
15
- push_new_data!
16
- delete_old_data!
15
+ @local.directory.files.each do |local_file|
16
+ upload!(local_file) if stale_on_remote?(local_file)
17
+ end
18
+ @remote.directory.files.each do |remote_file|
19
+ remote_file.destroy unless exists_locally?(remote_file)
20
+ end
17
21
  end
18
22
 
19
23
  private
20
24
 
21
- def push_new_data!
22
- @local.directory.files.each do |file|
23
- upload!(file) if upload?(file)
24
- end
25
- end
26
25
 
27
- def delete_old_data!
28
- # @remote.directory.files.each do |file|
29
- # file.delete unless @local.directory.files.head(file)
30
- # end
26
+ def exists_locally?(remote_file)
27
+ return true if @local.directory.files.head(remote_file.key)
28
+ false
31
29
  end
32
30
 
33
- def upload?(file)
34
- # TODO(wenzowski): check if file already exists
35
- #
36
- # upload = false
37
- # if ( remote_file = @remote.directory.files.head(file.key) )
38
- # # TODO(wenzowski): check etag to see if file has changed
39
- # else
40
- # upload = true
41
- # end
42
- # upload
43
- true
31
+ # TODO(wenzowski): local_file.should.respond_to?(:content_md5)
32
+ def stale_on_remote?(local_file)
33
+ remote_file = @remote.directory.files.head(local_file.key)
34
+ return true unless remote_file # file is missing from remote, therefore stale
35
+ if remote_file.respond_to?(:content_md5) && local_file.respond_to?(:content_md5)
36
+ (
37
+ ( remote_file.content_length != local_file.content_length ) &&
38
+ ( remote_file.content_md5 != local_file.content_md5 )
39
+ )
40
+ else
41
+ ( remote_file.content_length != local_file.content_length )
42
+ end
44
43
  end
45
44
 
46
45
  # If file already exists on remote it will be overwritten.
47
- def upload!(file)
46
+ def upload!(local_file)
48
47
  @remote.directory.files.create(
49
- key: file.key,
50
- body: file.body,
51
- cache_control: "public, max-age=#{max_age(file)}",
48
+ key: local_file.key,
49
+ body: local_file.body,
50
+ cache_control: "public, max-age=#{max_age(local_file)}",
52
51
  public: true
53
52
  )
54
53
  end
@@ -1,3 +1,3 @@
1
1
  module Closync
2
- VERSION = "0.0.3"
2
+ VERSION = '0.1.0'
3
3
  end
@@ -15,27 +15,61 @@ describe Closync::Storage do
15
15
  config
16
16
  }
17
17
 
18
- context 'local sync' do
19
- before(:each) do
20
- FileUtils.mkdir_p local_dir
21
- FileUtils.mkdir_p remote_dir
22
- FileUtils.touch "#{local_dir}/index.html"
23
- FileUtils.touch "#{local_dir}/pic.jpg"
24
- end
25
- after(:each) do
26
- FileUtils.rm_rf local_dir
27
- FileUtils.rm_rf remote_dir
28
- end
18
+ before(:each) do
19
+ FileUtils.mkdir_p local_dir
20
+ FileUtils.mkdir_p remote_dir
21
+ FileUtils.touch "#{remote_dir}/missing.html"
22
+ FileUtils.touch "#{remote_dir}/stale.html"
23
+ FileUtils.touch "#{local_dir}/index.html"
24
+ FileUtils.touch "#{local_dir}/pic.jpg"
25
+ File.open("#{local_dir}/stale.html", 'w') {|f| f.write('new data') }
26
+ end
27
+ after(:each) do
28
+ FileUtils.rm_rf local_dir
29
+ FileUtils.rm_rf remote_dir
30
+ end
29
31
 
30
- it { lambda {Closync::Sync.new(config)}.should_not raise_error }
32
+ it { lambda {Closync::Sync.new(config)}.should_not raise_error }
31
33
 
32
- it 'pushes files to remote' do
34
+ context 'before sync' do
35
+ its 'new files exist locally' do
36
+ File.exists?("#{local_dir}/index.html").should be_true
37
+ File.exists?("#{local_dir}/pic.jpg").should be_true
38
+ end
39
+ its 'new files do not exist on remote' do
33
40
  File.exists?("#{remote_dir}/index.html").should be_false
34
41
  File.exists?("#{remote_dir}/pic.jpg").should be_false
35
- Closync::Sync.new(config).push!
42
+ end
43
+ its 'missing files do not exist locally' do
44
+ File.exists?("#{local_dir}/missing.html").should be_false
45
+ end
46
+ its 'missing files exist on remote' do
47
+ File.exists?("#{remote_dir}/missing.html").should be_true
48
+ end
49
+ its 'stale files are a different size on remote' do
50
+ File.size("#{remote_dir}/stale.html").should_not == File.size("#{local_dir}/stale.html")
51
+ end
52
+ end
53
+
54
+ context 'after sync' do
55
+ before(:each) { Closync::Sync.new(config).push! }
56
+ its 'new files exist locally' do
57
+ File.exists?("#{local_dir}/index.html").should be_true
58
+ File.exists?("#{local_dir}/pic.jpg").should be_true
59
+ end
60
+ its 'new files exist on remote' do
36
61
  File.exists?("#{remote_dir}/index.html").should be_true
37
62
  File.exists?("#{remote_dir}/pic.jpg").should be_true
38
63
  end
64
+ its 'missing files do not exist locally' do
65
+ File.exists?("#{local_dir}/missing.html").should be_false
66
+ end
67
+ its 'missing files do not exist on remote' do
68
+ File.exists?("#{remote_dir}/missing.html").should be_false
69
+ end
70
+ its 'stale files are the same size on remote' do
71
+ File.size("#{remote_dir}/stale.html").should == File.size("#{local_dir}/stale.html")
72
+ end
39
73
  end
40
74
 
41
75
  end
@@ -2,5 +2,5 @@ require 'spec_helper'
2
2
  require 'closync/version'
3
3
 
4
4
  describe Closync do
5
- it { Closync::VERSION.should eq('0.0.2'), "Please don't bump the version." }
5
+ it { Closync::VERSION.should eq('0.1.0'), "Please don't bump the version." }
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: closync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-13 00:00:00.000000000 Z
12
+ date: 2012-10-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -39,6 +39,7 @@ files:
39
39
  - .gitignore
40
40
  - .rspec
41
41
  - .travis.yml
42
+ - Changelog.md
42
43
  - Gemfile
43
44
  - Guardfile
44
45
  - LICENSE
@@ -71,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
72
  version: '0'
72
73
  segments:
73
74
  - 0
74
- hash: 932699495062180289
75
+ hash: 12197200572235269
75
76
  required_rubygems_version: !ruby/object:Gem::Requirement
76
77
  none: false
77
78
  requirements:
@@ -80,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  version: '0'
81
82
  segments:
82
83
  - 0
83
- hash: 932699495062180289
84
+ hash: 12197200572235269
84
85
  requirements: []
85
86
  rubyforge_project:
86
87
  rubygems_version: 1.8.24