paperbin 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/lib/paperbin/check_worker.rb +1 -0
- data/lib/paperbin/handler.rb +74 -28
- data/lib/paperbin/version.rb +1 -1
- data/lib/paperbin/write_worker.rb +1 -0
- data/lib/paperbin.rb +3 -1
- data/paperbin.gemspec +2 -0
- data/spec/paperbin_handler_spec.rb +58 -11
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd1734e70bdbdbb87410b3620a0d73bbc89e520a
|
4
|
+
data.tar.gz: db80f4440568848b7009025c23d3caaa472f8ad2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ef75f0bcb767a1047f0c5ea506b8467722f25fb10328e14a95435121e3c64c04e8e5a4f356d4ccc112a309c052c6f5220d9d556a533f92ba84f07b2eecbf6d0
|
7
|
+
data.tar.gz: af7f8fdb2076f5457457b5700ed7291c4023e7b0ec760aa044d2cfe7da22dcdcf944b3394a48b07ae1d87e22910cf052d7f8fd97141148bce55cdd261f27120f
|
data/README.md
CHANGED
@@ -17,9 +17,10 @@ Or install it yourself as:
|
|
17
17
|
|
18
18
|
$ gem install paperbin
|
19
19
|
|
20
|
-
|
20
|
+
### Queues
|
21
21
|
|
22
|
-
|
22
|
+
check worker - ENV['PAPERBIN_CHECK_QUEUE'] || 'default'
|
23
|
+
write worker - ENV['PAPERBIN_WRITE_QUEUE'] || 'default'
|
23
24
|
|
24
25
|
## Contributing
|
25
26
|
|
data/lib/paperbin/handler.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
class Paperbin::Handler < Struct.new(:id, :type)
|
2
|
-
|
3
2
|
require 'zlib'
|
4
3
|
require 'tempfile'
|
5
4
|
|
@@ -7,11 +6,16 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
7
6
|
"%012d" % id
|
8
7
|
end
|
9
8
|
|
10
|
-
def
|
9
|
+
def split
|
11
10
|
formatted_id.scan(/.{4}/)
|
12
11
|
end
|
13
12
|
|
14
|
-
def
|
13
|
+
def dir_split_id
|
14
|
+
split[0...-1]
|
15
|
+
end
|
16
|
+
|
17
|
+
def archive_split_id
|
18
|
+
split.last
|
15
19
|
end
|
16
20
|
|
17
21
|
def options
|
@@ -29,10 +33,39 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
29
33
|
dirs << options[:path]
|
30
34
|
dirs << item.send(options[:base_scope])
|
31
35
|
dirs << type
|
32
|
-
dirs +=
|
36
|
+
dirs += dir_split_id
|
33
37
|
File.join(dirs.map(&:to_s))
|
34
38
|
end
|
35
39
|
|
40
|
+
def old_directory_path
|
41
|
+
File.join(directory_path, archive_split_id)
|
42
|
+
end
|
43
|
+
|
44
|
+
def archive_path
|
45
|
+
File.join(directory_path, "#{archive_split_id}.zip")
|
46
|
+
end
|
47
|
+
|
48
|
+
def create_archive_file
|
49
|
+
unless File.exists?(archive_path)
|
50
|
+
Zippy.create archive_path do |z|
|
51
|
+
z["created_at.txt"] = Date.today.to_s
|
52
|
+
handle_old_files(z)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def handle_old_files(z)
|
58
|
+
if File.directory?(old_directory_path)
|
59
|
+
Dir.new(old_directory_path).each do |file|
|
60
|
+
if file =~ /\.gz/
|
61
|
+
name = file.split(".").first
|
62
|
+
z["#{name}.json"] = Zlib::GzipReader.open(File.join(old_directory_path, file)) {|gz| gz.read }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
FileUtils.remove_dir(old_directory_path)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
36
69
|
def versions
|
37
70
|
Version.where(item_type: type, item_id: id)
|
38
71
|
end
|
@@ -40,6 +73,7 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
40
73
|
def save_versions
|
41
74
|
return true unless item
|
42
75
|
create_directory
|
76
|
+
create_archive_file
|
43
77
|
generate_files
|
44
78
|
Paperbin::CheckWorker.perform_async(id, type)
|
45
79
|
end
|
@@ -49,11 +83,19 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
49
83
|
end
|
50
84
|
|
51
85
|
def md5_file(version)
|
52
|
-
|
86
|
+
"#{version.id}.md5"
|
87
|
+
end
|
88
|
+
|
89
|
+
def md5_file_path(version)
|
90
|
+
File.join(directory_path, "#{md5_file(version)}")
|
91
|
+
end
|
92
|
+
|
93
|
+
def json_file(version)
|
94
|
+
"#{version.id}.json"
|
53
95
|
end
|
54
96
|
|
55
|
-
def
|
56
|
-
File.join(directory_path, "#{version
|
97
|
+
def json_file_path(version, checked = false)
|
98
|
+
File.join(directory_path, "#{json_file(version)}#{checked ? '' : '.unchecked'}")
|
57
99
|
end
|
58
100
|
|
59
101
|
def files_exist?(*args)
|
@@ -61,8 +103,8 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
61
103
|
end
|
62
104
|
|
63
105
|
def md5_valid?(version)
|
64
|
-
record_md5 = File.read(
|
65
|
-
data =
|
106
|
+
record_md5 = File.read(md5_file_path(version))
|
107
|
+
data = File.open(json_file_path(version), "r") { |f| f.read }
|
66
108
|
check_md5 = Digest::MD5.hexdigest(data)
|
67
109
|
record_md5 == check_md5
|
68
110
|
end
|
@@ -71,29 +113,33 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
71
113
|
# remove records from db expcet the lastest one
|
72
114
|
version.delete unless version == last_item
|
73
115
|
# rename file extension
|
74
|
-
File.rename(
|
75
|
-
|
116
|
+
File.rename(json_file_path(version), json_file_path(version, true))
|
117
|
+
Zippy.open(archive_path) do |z|
|
118
|
+
z["#{json_file(version).to_s}"] = File.open(json_file_path(version, true)) { |f| f.read }
|
119
|
+
end
|
120
|
+
File.delete(md5_file_path(version))
|
121
|
+
File.delete(json_file_path(version, true))
|
122
|
+
options[:callback].call(json_file_path(version, true)) if options[:callback]
|
76
123
|
end
|
77
124
|
|
78
125
|
def generate_files
|
79
126
|
versions.each do |version|
|
80
|
-
|
127
|
+
write_json_file version
|
81
128
|
write_md5_file version
|
82
129
|
end
|
83
130
|
end
|
84
131
|
|
85
|
-
def
|
86
|
-
path =
|
132
|
+
def write_json_file(version)
|
133
|
+
path = json_file_path version
|
87
134
|
unless files_exist?(path)
|
88
|
-
|
89
|
-
|
135
|
+
File.open(path, "w") { |f| f.write(string_data(version)) }
|
90
136
|
timestamp = version.created_at.to_time
|
91
137
|
File.utime timestamp, timestamp, path
|
92
138
|
end
|
93
139
|
end
|
94
140
|
|
95
141
|
def write_md5_file(version)
|
96
|
-
File.open(
|
142
|
+
File.open(md5_file_path(version), "w") do |file|
|
97
143
|
md5 = Digest::MD5.hexdigest(string_data(version))
|
98
144
|
file.write md5
|
99
145
|
end
|
@@ -105,18 +151,18 @@ class Paperbin::Handler < Struct.new(:id, :type)
|
|
105
151
|
|
106
152
|
def check_versions
|
107
153
|
versions.each_with_index do |version, index|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
end
|
118
|
-
raise Errno::ENOENT
|
154
|
+
# check both file exist or not
|
155
|
+
next unless files_exist?(md5_file_path(version), json_file_path(version))
|
156
|
+
|
157
|
+
if md5_valid?(version)
|
158
|
+
process_valid_records(version, versions.last)
|
159
|
+
else
|
160
|
+
# remove both files
|
161
|
+
[json_file_path(version), md5_file_path(version)].each do |f|
|
162
|
+
File.delete(f)
|
119
163
|
end
|
164
|
+
raise Errno::ENOENT
|
165
|
+
end
|
120
166
|
end
|
121
167
|
rescue Errno::ENOENT
|
122
168
|
# lodge worker unless valid
|
data/lib/paperbin/version.rb
CHANGED
data/lib/paperbin.rb
CHANGED
data/paperbin.gemspec
CHANGED
@@ -26,4 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_runtime_dependency "paper_trail"
|
27
27
|
spec.add_runtime_dependency "railties", "~> 3.2"
|
28
28
|
spec.add_runtime_dependency "activesupport", "~> 3.2"
|
29
|
+
spec.add_runtime_dependency "zippy"
|
30
|
+
spec.add_runtime_dependency "zip"
|
29
31
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require "spec_helper"
|
1
|
+
require "./spec_helper"
|
2
2
|
|
3
3
|
describe Paperbin::Handler do
|
4
|
-
|
5
4
|
let(:item) { double(organisation_id: "org1") }
|
6
5
|
let(:target_id) { '123456789' }
|
7
6
|
let(:target_type) { 'Client' }
|
@@ -17,19 +16,26 @@ describe Paperbin::Handler do
|
|
17
16
|
handler.formatted_id.should == "000123456789"
|
18
17
|
end
|
19
18
|
|
20
|
-
it "split formatted_id into
|
21
|
-
handler.
|
19
|
+
it "split formatted_id into 2 sections" do
|
20
|
+
handler.dir_split_id.should == ['0001', '2345']
|
22
21
|
end
|
23
22
|
|
24
|
-
it
|
25
|
-
handler.
|
23
|
+
it "give proper file name" do
|
24
|
+
handler.archive_split_id.should == '6789'
|
26
25
|
end
|
27
26
|
|
28
|
-
it
|
29
|
-
handler.
|
27
|
+
it 'return options' do
|
28
|
+
handler.options.should == {path: '/path', base_scope: 'organisation_id'}
|
30
29
|
end
|
31
30
|
|
32
31
|
context 'directories' do
|
32
|
+
it "return directory" do
|
33
|
+
handler.directory_path.should == "/path/org1/Client/0001/2345"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "return old directory" do
|
37
|
+
handler.old_directory_path.should == "/path/org1/Client/0001/2345/6789"
|
38
|
+
end
|
33
39
|
|
34
40
|
it 'generate directory when no exists' do
|
35
41
|
Dir.stub(exists?: false)
|
@@ -42,7 +48,6 @@ describe Paperbin::Handler do
|
|
42
48
|
FileUtils.should_not_receive(:mkdir_p)
|
43
49
|
handler.create_directory
|
44
50
|
end
|
45
|
-
|
46
51
|
end
|
47
52
|
|
48
53
|
context 'generate_files' do
|
@@ -57,7 +62,7 @@ describe Paperbin::Handler do
|
|
57
62
|
end
|
58
63
|
|
59
64
|
it 'create correct Gzip files' do
|
60
|
-
|
65
|
+
File.should_receive(:open).exactly(4).times
|
61
66
|
expect(File).to receive(:utime).twice.with(
|
62
67
|
timestamp, timestamp, an_instance_of(String)
|
63
68
|
)
|
@@ -76,6 +81,7 @@ describe Paperbin::Handler do
|
|
76
81
|
handler.stub files_exist?: true
|
77
82
|
File.stub rename: true, delete: true
|
78
83
|
Paperbin::WriteWorker.stub perform_async: true
|
84
|
+
Zippy.stub :open
|
79
85
|
end
|
80
86
|
|
81
87
|
subject(:check_versions) { handler.check_versions }
|
@@ -109,7 +115,48 @@ describe Paperbin::Handler do
|
|
109
115
|
check_versions
|
110
116
|
end
|
111
117
|
end
|
112
|
-
|
113
118
|
end
|
114
119
|
|
120
|
+
context 'old folders' do
|
121
|
+
let(:timestamp) { Time.now }
|
122
|
+
let(:version_1) { double(id: 1, to_json: "json", created_at: timestamp) }
|
123
|
+
let(:version_2) { double(id: 2, to_json: "json", created_at: timestamp) }
|
124
|
+
let(:file) { double(write: true) }
|
125
|
+
|
126
|
+
before(:each) do
|
127
|
+
handler.stub(versions: [version_1, version_2])
|
128
|
+
handler.stub(:old_directory_path).and_return("./tmp1")
|
129
|
+
handler.stub(:directory_path).and_return("./tmp2")
|
130
|
+
FileUtils.mkdir_p(handler.old_directory_path)
|
131
|
+
FileUtils.mkdir_p(handler.directory_path)
|
132
|
+
Zlib::GzipWriter.open(File.join(handler.old_directory_path, "12.gz")) { |gz| gz.write "Very important json" }
|
133
|
+
handler.create_directory
|
134
|
+
handler.create_archive_file
|
135
|
+
end
|
136
|
+
|
137
|
+
after(:each) do
|
138
|
+
FileUtils.remove_dir(handler.old_directory_path) if File.directory?(handler.old_directory_path)
|
139
|
+
FileUtils.remove_dir(handler.directory_path) if File.directory?(handler.directory_path)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should create archive file' do
|
143
|
+
File.exists?(handler.archive_path).should be_true
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'archive should not be empty' do
|
147
|
+
Zippy.list(handler.archive_path).detect { |f| f == "12.json" }.should be_true
|
148
|
+
end
|
149
|
+
|
150
|
+
it "json file should be correct" do
|
151
|
+
data = ""
|
152
|
+
Zippy.open(handler.archive_path) do |z|
|
153
|
+
data = z["12.json"]
|
154
|
+
end
|
155
|
+
data.should == "Very important json"
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should remove old directory" do
|
159
|
+
File.directory?(handler.old_directory_path).should be_false
|
160
|
+
end
|
161
|
+
end
|
115
162
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paperbin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- morhekil
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2014-
|
16
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: bundler
|
@@ -113,6 +113,34 @@ dependencies:
|
|
113
113
|
- - ~>
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '3.2'
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: zippy
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
type: :runtime
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - '>='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
- !ruby/object:Gem::Dependency
|
131
|
+
name: zip
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
type: :runtime
|
138
|
+
prerelease: false
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
116
144
|
description: Paperbin removes paper_trail versions and move them to filesystem
|
117
145
|
email:
|
118
146
|
- kotlarek.krzysztof@gmail.com
|