paperbin 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4ab37ed5abe9f64b0012d4ecdb5fe84ec604e124
4
+ data.tar.gz: 5fcf761a96a85066ae001471764abbfe86d199f3
5
+ SHA512:
6
+ metadata.gz: d0dc66a0a125025a854697a089dddd6dcb4f04e122876851719ef3e43274cb5ff9b3df9a09a7c926584329b23ecc8b2209186ae270d3d58dd54c8e13ace92c57
7
+ data.tar.gz: 29e6765658c20f2086fee30fd1ca2e09e01561d2acf73ffff8d8bcc9b1a8ff4346aedcaf1ef7c3957a178788f37ebf12fe4c390857bf391afc931df95983bbd8
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
19
+ .ruby-version
20
+ .ruby-gemset
21
+ .*.swp
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in paperbin.gemspec
4
+ gemspec
5
+ gem 'rspec'
6
+
7
+ group :development do
8
+ gem 'guard'
9
+ gem 'guard-rspec'
10
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Krzysztof Kotlarek
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Paperbin
2
+
3
+ TODO:
4
+ To move papertrail's version records to file system as JSON format.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'paperbin'
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install paperbin
19
+
20
+ ## Usage
21
+
22
+ TODO: Write usage instructions here
23
+
24
+ ## Contributing
25
+
26
+ 1. Fork it
27
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
28
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
29
+ 4. Push to the branch (`git push origin my-new-feature`)
30
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,8 @@
1
+ class Paperbin::CheckWorker
2
+ include Sidekiq::Worker
3
+
4
+ def perform(item_id, item_type)
5
+ paperbin_handler = Paperbin::Handler.new(item_id, item_type)
6
+ paperbin_handler.check_versions
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class Paperbin::Config < Struct.new(:options)
2
+ def self.default_options
3
+ @default_options ||= {}
4
+ end
5
+ end
@@ -0,0 +1,120 @@
1
+ class Paperbin::Handler < Struct.new(:id, :type)
2
+
3
+ require 'zlib'
4
+ require 'tempfile'
5
+
6
+ def formatted_id
7
+ "%012d" % id
8
+ end
9
+
10
+ def split_id
11
+ formatted_id.scan(/.{4}/)
12
+ end
13
+
14
+ def current_path
15
+ end
16
+
17
+ def options
18
+ Paperbin::Config.default_options
19
+ end
20
+
21
+ def item
22
+ scope = type.constantize
23
+ scope = scope.with_deleted if scope.respond_to?(:with_deleted)
24
+ scope.where(id: id).first
25
+ end
26
+
27
+ def directory_path
28
+ dirs = []
29
+ dirs << options[:path]
30
+ dirs << item.send(options[:base_scope])
31
+ dirs << type
32
+ dirs += split_id
33
+ File.join(dirs.map(&:to_s))
34
+ end
35
+
36
+ def versions
37
+ Version.where(item_type: type, item_id: id)
38
+ end
39
+
40
+ def save_versions
41
+ return true unless item
42
+ create_directory
43
+ generate_files
44
+ Paperbin::CheckWorker.perform_async(id, type)
45
+ end
46
+
47
+ def create_directory
48
+ FileUtils.mkdir_p(directory_path) unless Dir.exists?(directory_path)
49
+ end
50
+
51
+ def md5_file(version)
52
+ File.join(directory_path, "#{version.id}.md5")
53
+ end
54
+
55
+ def gz_file(version, checked = false)
56
+ File.join(directory_path, "#{version.id}.gz#{checked ? '' : '.unchecked'}")
57
+ end
58
+
59
+ def files_exist?(*args)
60
+ Array(args).map{|file| File.exist?(file)}.all?
61
+ end
62
+
63
+ def md5_valid?(version)
64
+ record_md5 = File.read(md5_file(version))
65
+ data = Zlib::GzipReader.open(gz_file(version)) {|gz| gz.read }
66
+ check_md5 = Digest::MD5.hexdigest(data)
67
+ record_md5 == check_md5
68
+ end
69
+
70
+ def process_valid_records(version, last_item)
71
+ # remove records from db expcet the lastest one
72
+ unless version == last_item
73
+ version.delete
74
+ options[:callback].call(gz_file(version, true)) if options[:callback]
75
+ end
76
+ # rename file extension
77
+ File.rename(gz_file(version), gz_file(version, true))
78
+
79
+ end
80
+
81
+ def generate_files
82
+ versions.each do |version|
83
+ data = version.to_json
84
+ unless files_exist?(gz_file(version))
85
+ Zlib::GzipWriter.open(gz_file(version)) do |gz|
86
+ gz.write data
87
+ end
88
+ end
89
+
90
+ File.open(md5_file(version), "w") do |file|
91
+ file.write(Digest::MD5.hexdigest(data))
92
+ end
93
+
94
+ end
95
+ end
96
+
97
+ def check_versions
98
+ valid = true
99
+ versions.each_with_index do |version, index|
100
+ # check both file exist or not
101
+ next unless files_exist?(md5_file(version), gz_file(version))
102
+
103
+ if md5_valid?(version)
104
+ process_valid_records(version, versions.last)
105
+ else
106
+ valid = false
107
+ # remove both files
108
+ [gz_file(version), md5_file(version)].each do |f|
109
+ File.delete(f)
110
+ end
111
+ end
112
+ end
113
+
114
+ # lodge worker unless valid
115
+ Paperbin::WriteWorker.perform_async(version.item_id, version.item_type) unless valid
116
+
117
+ end
118
+ end
119
+
120
+
@@ -0,0 +1,3 @@
1
+ module Paperbin
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,15 @@
1
+ require "active_support/concern"
2
+
3
+ module Paperbin::VersionMixin
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ after_create :perform_worker
8
+ end
9
+
10
+ def perform_worker
11
+ Paperbin::WriteWorker.perform_async(item_id, item_type)
12
+ end
13
+
14
+ end
15
+
@@ -0,0 +1,8 @@
1
+ class Paperbin::WriteWorker
2
+ include Sidekiq::Worker
3
+
4
+ def perform(item_id, item_type)
5
+ paperbin_handler = Paperbin::Handler.new(item_id, item_type)
6
+ paperbin_handler.save_versions
7
+ end
8
+ end
data/lib/paperbin.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'rails'
2
+ require 'sidekiq/worker'
3
+
4
+ module Paperbin
5
+ class Railtie < Rails::Railtie
6
+ config.after_initialize do
7
+ Version.send(:include, Paperbin::VersionMixin)
8
+ end
9
+ end
10
+ end
11
+
12
+ require 'paperbin/version'
13
+ require 'paperbin/handler'
14
+ require 'paperbin/check_worker'
15
+ require 'paperbin/write_worker'
16
+ require 'paperbin/version_mixin'
17
+ require 'paperbin/config'
data/paperbin.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'paperbin/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "paperbin"
8
+ spec.version = Paperbin::VERSION
9
+ spec.authors = ["morhekil","sameera207", "noma4i", "lis2", "halhenke", "gzzengwei"]
10
+ spec.email = ["kotlarek.krzysztof@gmail.com"]
11
+ spec.description = %q{Paperbin removes paper_trail versions and move them to filesystem}
12
+ spec.summary = %q{,Paperbin removes paper_trail versions and move them to filesyste}
13
+ spec.homepage = "https://github.com/jnsolutions/paperbin"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+
25
+ spec.add_runtime_dependency "sidekiq"
26
+ spec.add_runtime_dependency "paper_trail"
27
+ spec.add_runtime_dependency "railties", "~> 3.2"
28
+ spec.add_runtime_dependency "activesupport", "~> 3.2"
29
+ end
@@ -0,0 +1,64 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperbin::Handler do
4
+
5
+ let(:item) { double(organisation_id: "org1") }
6
+
7
+ subject { Paperbin::Handler.new("123456789", "client") }
8
+ before(:each) do
9
+ Paperbin::Config.default_options[:path] = '/path'
10
+ Paperbin::Config.default_options[:base_scope] = 'organisation_id'
11
+ subject.stub(item: item)
12
+ end
13
+
14
+ it "return correct formatted_id" do
15
+ subject.formatted_id.should == "000123456789"
16
+ end
17
+
18
+ it "split formatted_id into 3 sections" do
19
+ subject.split_id.should == ['0001', '2345', '6789']
20
+ end
21
+
22
+ it 'return options', focus: true do
23
+ subject.options.should == {path: '/path', base_scope: 'organisation_id'}
24
+ end
25
+
26
+ it "return directory" do
27
+ subject.directory_path.should == "/path/org1/client/0001/2345/6789"
28
+ end
29
+
30
+ context 'directories' do
31
+
32
+ it 'generate directory when no exists' do
33
+ Dir.stub(exists?: false)
34
+ FileUtils.should_receive(:mkdir_p)
35
+ subject.create_directory
36
+ end
37
+
38
+ it 'dont generate directory when exists' do
39
+ Dir.stub(exists?: true)
40
+ FileUtils.should_not_receive(:mkdir_p)
41
+ subject.create_directory
42
+ end
43
+
44
+ end
45
+
46
+ context 'generate_files' do
47
+
48
+ let(:version_1) { double(id: 1, to_json: "json") }
49
+ let(:version_2) { double(id: 2, to_json: "json") }
50
+ let(:file) { double(write: true) }
51
+
52
+ before do
53
+ subject.stub(versions: [version_1, version_2])
54
+ File.stub(open: file)
55
+ end
56
+
57
+ it 'create correct Gzip files' do
58
+ Zlib::GzipWriter.should_receive(:open).twice
59
+ subject.generate_files
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,2 @@
1
+ require 'paperbin'
2
+
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: paperbin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - morhekil
8
+ - sameera207
9
+ - noma4i
10
+ - lis2
11
+ - halhenke
12
+ - gzzengwei
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+ date: 2014-01-16 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: bundler
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: '1.3'
25
+ type: :development
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ version: '1.3'
32
+ - !ruby/object:Gem::Dependency
33
+ name: rake
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: sidekiq
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: paper_trail
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: railties
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: '3.2'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '3.2'
102
+ - !ruby/object:Gem::Dependency
103
+ name: activesupport
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ version: '3.2'
109
+ type: :runtime
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ~>
114
+ - !ruby/object:Gem::Version
115
+ version: '3.2'
116
+ description: Paperbin removes paper_trail versions and move them to filesystem
117
+ email:
118
+ - kotlarek.krzysztof@gmail.com
119
+ executables: []
120
+ extensions: []
121
+ extra_rdoc_files: []
122
+ files:
123
+ - .gitignore
124
+ - Gemfile
125
+ - LICENSE.txt
126
+ - README.md
127
+ - Rakefile
128
+ - lib/paperbin.rb
129
+ - lib/paperbin/check_worker.rb
130
+ - lib/paperbin/config.rb
131
+ - lib/paperbin/handler.rb
132
+ - lib/paperbin/version.rb
133
+ - lib/paperbin/version_mixin.rb
134
+ - lib/paperbin/write_worker.rb
135
+ - paperbin.gemspec
136
+ - spec/paperbin_handler_spec.rb
137
+ - spec/spec_helper.rb
138
+ homepage: https://github.com/jnsolutions/paperbin
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.1.11
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: ',Paperbin removes paper_trail versions and move them to filesyste'
162
+ test_files:
163
+ - spec/paperbin_handler_spec.rb
164
+ - spec/spec_helper.rb