file_model 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/lib/file_model/adapter.rb +50 -0
- data/lib/file_model/file_model.rb +20 -20
- data/lib/file_model/mini_magic.rb +1 -1
- data/lib/file_model/spec.rb +11 -9
- data/lib/file_model.rb +1 -0
- data/spec/adapter_spec/bos.jpeg +0 -0
- data/spec/adapter_spec/file.txt +1 -0
- data/spec/adapter_spec.rb +37 -0
- data/spec/file_model_spec.rb +2 -13
- metadata +6 -2
@@ -0,0 +1,50 @@
|
|
1
|
+
class FileModel::Adapter
|
2
|
+
def initialize something
|
3
|
+
@something = something
|
4
|
+
end
|
5
|
+
|
6
|
+
def to_file
|
7
|
+
self.class.clear_expired_cache
|
8
|
+
|
9
|
+
if something.respond_to? :to_file
|
10
|
+
something.to_file
|
11
|
+
elsif something.is_a? Hash
|
12
|
+
data = something["tempfile"] || something[:tempfile] || raise("no file!")
|
13
|
+
name = something["filename"] || something[:filename] || raise("no filename!")
|
14
|
+
file = "#{self.class.cache_dir}/#{name}".to_file
|
15
|
+
file.write data.read
|
16
|
+
file
|
17
|
+
elsif something.is_a? File
|
18
|
+
path = something.path
|
19
|
+
name = File.basename path
|
20
|
+
file = "#{self.class.cache_dir}/#{name}".to_file
|
21
|
+
file.write something.read
|
22
|
+
file
|
23
|
+
else
|
24
|
+
raise "unknown file format!"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
EXPIRATION_TIME = 5
|
29
|
+
BASE_DIR = "/tmp/file_model_cache"
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def cache_dir
|
33
|
+
"#{BASE_DIR}/#{Time.now.min}/#{rand(1_000_000)}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def clear_expired_cache
|
37
|
+
time = Time.now.min
|
38
|
+
dir = BASE_DIR.to_dir
|
39
|
+
if dir.exist?
|
40
|
+
dir.to_dir.entries do |entry|
|
41
|
+
entry_time = entry.name.to_i
|
42
|
+
entry.destroy if (entry_time > time) or (time > (entry_time + EXPIRATION_TIME))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
attr_reader :something
|
50
|
+
end
|
@@ -8,13 +8,13 @@ module FileModel
|
|
8
8
|
|
9
9
|
attr_reader :original
|
10
10
|
def original= something
|
11
|
-
@original = something.to_file
|
12
|
-
raise "file #{original.name} not exist!"
|
11
|
+
@original = Adapter.new(something).to_file
|
12
|
+
raise "file #{original.name} not exist!" unless original.exist?
|
13
13
|
original
|
14
14
|
end
|
15
15
|
|
16
16
|
def save options = {}
|
17
|
-
return
|
17
|
+
return true unless original
|
18
18
|
|
19
19
|
# validating
|
20
20
|
return false unless options[:validate] == false or valid?
|
@@ -24,6 +24,7 @@ module FileModel
|
|
24
24
|
|
25
25
|
# saving
|
26
26
|
self.name = build_name original.name
|
27
|
+
|
27
28
|
process do |file|
|
28
29
|
path = build_path name
|
29
30
|
file.copy_to self.class.box[path]
|
@@ -41,11 +42,11 @@ module FileModel
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def save! options = {}
|
44
|
-
save(options) || raise("can't save #{self}!")
|
45
|
+
save(options) || raise("can't save #{self} (#{errors.inspect})!")
|
45
46
|
end
|
46
47
|
|
47
48
|
def destroy options = {}
|
48
|
-
return
|
49
|
+
return true unless name
|
49
50
|
|
50
51
|
return false unless options[:validate] == false or valid?
|
51
52
|
|
@@ -61,7 +62,7 @@ module FileModel
|
|
61
62
|
end
|
62
63
|
|
63
64
|
def destroy! options = {}
|
64
|
-
destroy(options) || raise("can't destroy #{self}!")
|
65
|
+
destroy(options) || raise("can't destroy #{self} (#{errors.inspect})!")
|
65
66
|
end
|
66
67
|
|
67
68
|
def url
|
@@ -76,15 +77,17 @@ module FileModel
|
|
76
77
|
block.call original if original
|
77
78
|
end
|
78
79
|
|
79
|
-
def
|
80
|
+
def build_standard_path name, version = nil
|
80
81
|
base, extension = name.rsplit('.', 2)
|
81
82
|
%(/#{base}#{".#{version}" if version}#{".#{extension}" if extension})
|
82
83
|
end
|
84
|
+
alias_method :build_path, :build_standard_path
|
83
85
|
|
84
|
-
def
|
86
|
+
def build_standard_url name, version = nil
|
85
87
|
base, extension = name.rsplit('.', 2)
|
86
88
|
%(/#{base}#{".#{version}" if version}#{".#{extension}" if extension})
|
87
89
|
end
|
90
|
+
alias_method :build_url, :build_standard_url
|
88
91
|
|
89
92
|
def build_name name
|
90
93
|
name
|
@@ -103,6 +106,10 @@ module FileModel
|
|
103
106
|
def run_validations; end
|
104
107
|
|
105
108
|
class << self
|
109
|
+
def box name
|
110
|
+
raise "Override this method to provide Your own custom box initialization."
|
111
|
+
end
|
112
|
+
|
106
113
|
attr_accessor :box
|
107
114
|
attr_required :box
|
108
115
|
end
|
@@ -127,19 +134,12 @@ module FileModel
|
|
127
134
|
end
|
128
135
|
end
|
129
136
|
|
130
|
-
inheritable_accessor :
|
131
|
-
def box=
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
def box *args, &block
|
136
|
-
if block
|
137
|
-
self.box = block
|
138
|
-
elsif !args.empty?
|
139
|
-
args.size.must == 1
|
140
|
-
self.box = args.first
|
137
|
+
inheritable_accessor :box_name, :default
|
138
|
+
def box name = nil
|
139
|
+
if name
|
140
|
+
self.box_name = name
|
141
141
|
else
|
142
|
-
|
142
|
+
FileModel.box box_name
|
143
143
|
end
|
144
144
|
end
|
145
145
|
end
|
data/lib/file_model/spec.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
require 'file_model'
|
2
2
|
require 'vos'
|
3
3
|
|
4
|
+
FileModel::ClassMethods.class_eval do
|
5
|
+
def box; FileModel.box end
|
6
|
+
end
|
7
|
+
|
8
|
+
FileModel.metaclass_eval do
|
9
|
+
attr_accessor :box
|
10
|
+
end
|
11
|
+
|
4
12
|
rspec do
|
5
13
|
def file_model_storage
|
6
|
-
'/tmp/
|
14
|
+
'/tmp/file_model_test'.to_dir
|
7
15
|
end
|
8
16
|
|
9
17
|
class << self
|
10
18
|
def with_file_model
|
11
|
-
|
12
|
-
def box
|
13
|
-
::FileModel.box
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
tmp = '/tmp/file_model'.to_dir
|
19
|
+
tmp = '/tmp/file_model_test'.to_dir
|
18
20
|
|
19
21
|
before do
|
20
22
|
tmp.destroy.create
|
21
|
-
FileModel.box = Vos::Box.new(Vos::Drivers::Local.new(tmp.path))
|
23
|
+
FileModel.box = Vos::Box.new(Vos::Drivers::Local.new(root: tmp.path))
|
22
24
|
end
|
23
25
|
|
24
26
|
after{tmp.destroy}
|
data/lib/file_model.rb
CHANGED
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
text
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe "File Model" do
|
6
|
+
with_file_model
|
7
|
+
|
8
|
+
it 'should accept different formats' do
|
9
|
+
original = FileModel::Adapter.new("#{spec_dir}/file.txt").to_file
|
10
|
+
original.name.should == 'file.txt'
|
11
|
+
original.read.should == "text"
|
12
|
+
|
13
|
+
original = FileModel::Adapter.new("#{spec_dir}/file.txt".to_file).to_file
|
14
|
+
original.name.should == 'file.txt'
|
15
|
+
original.read.should == "text"
|
16
|
+
|
17
|
+
File.open "#{spec_dir}/file.txt" do |f|
|
18
|
+
original = FileModel::Adapter.new(f).to_file
|
19
|
+
original.name.should == 'file.txt'
|
20
|
+
original.read.should == "text"
|
21
|
+
end
|
22
|
+
|
23
|
+
File.open "#{spec_dir}/file.txt" do |f|
|
24
|
+
original = FileModel::Adapter.new(filename: 'file.txt', tempfile: f).to_file
|
25
|
+
original.name.should == 'file.txt'
|
26
|
+
original.read.should == "text"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'work with binary format' do
|
31
|
+
File.open "#{spec_dir}/bos.jpeg" do |f|
|
32
|
+
original = FileModel::Adapter.new(filename: 'bos.jpeg', tempfile: f).to_file
|
33
|
+
original.name.should == 'bos.jpeg'
|
34
|
+
original.size.should > 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/file_model_spec.rb
CHANGED
@@ -20,11 +20,11 @@ describe "File Model" do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def build_path name, version = nil
|
23
|
-
'/storage/images' +
|
23
|
+
'/storage/images' + build_standard_path(name, version)
|
24
24
|
end
|
25
25
|
|
26
26
|
def build_url name, version = nil
|
27
|
-
'/images' +
|
27
|
+
'/images' + build_standard_url(name, version)
|
28
28
|
end
|
29
29
|
|
30
30
|
def build_name name
|
@@ -158,15 +158,4 @@ describe "File Model" do
|
|
158
158
|
image.save.should be_false
|
159
159
|
image.errors.should == ['invalid name']
|
160
160
|
end
|
161
|
-
|
162
|
-
it 'should accept anything responding to :to_file' do
|
163
|
-
file = "#{spec_dir}/ship.jpg".to_file
|
164
|
-
|
165
|
-
obj = mock
|
166
|
-
obj.should_receive(:to_file).and_return(file)
|
167
|
-
|
168
|
-
image = ImageFile.new
|
169
|
-
image.original = obj
|
170
|
-
image.original.should == file
|
171
|
-
end
|
172
161
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: file_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
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: 2011-09-
|
12
|
+
date: 2011-09-15 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|
@@ -19,6 +19,7 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- Rakefile
|
21
21
|
- readme.md
|
22
|
+
- lib/file_model/adapter.rb
|
22
23
|
- lib/file_model/file_model.rb
|
23
24
|
- lib/file_model/gems.rb
|
24
25
|
- lib/file_model/helper.rb
|
@@ -31,6 +32,9 @@ files:
|
|
31
32
|
- lib/file_model/version.rb
|
32
33
|
- lib/file_model.rb
|
33
34
|
- spec/abstract_model_spec.rb
|
35
|
+
- spec/adapter_spec/bos.jpeg
|
36
|
+
- spec/adapter_spec/file.txt
|
37
|
+
- spec/adapter_spec.rb
|
34
38
|
- spec/file_model_spec/file+name.txt
|
35
39
|
- spec/file_model_spec/invalid.txt
|
36
40
|
- spec/file_model_spec/ship.jpg
|