tori 0.4.1 → 0.5.0
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 +4 -4
- data/README.md +5 -0
- data/lib/tori/backend/s3.rb +16 -4
- data/lib/tori/define.rb +3 -3
- data/lib/tori/file.rb +29 -14
- data/lib/tori/version.rb +1 -1
- data/test/test_tori_backend_s3.rb +13 -0
- data/test/test_tori_define.rb +20 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 804032544a779fc9014553a31b0ea5c2314a3db1
|
4
|
+
data.tar.gz: 487ba2e0af21edf8bf41b4163301f66049d27768
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7027bb399d67358423ce0feb6655843f27381773afa1f500f1e35f1cec75fc8f2435b3e211f591e98f50bed23b144dbb31718444321c17f81cb0a64f9f266361
|
7
|
+
data.tar.gz: 2d47426d4c1afb1b07458ff8ed442031995fda718ba1659723cc6ed630ce64b1a7adfc61fa56f94fae3ee261c265b126241a0578cb9dbb7c7efa7a1aa74eabff
|
data/README.md
CHANGED
@@ -88,6 +88,11 @@ class Photo < ActiveRecord::Base
|
|
88
88
|
tori :striped_image do |model|
|
89
89
|
"#{model.class}/striped/#{model.striped_filename}"
|
90
90
|
end
|
91
|
+
|
92
|
+
# customize backend each by `tori` method.
|
93
|
+
tori :custom, to: Tori::Backend::FileSystem.new(Pathname("custom")) do |model|
|
94
|
+
"#{__tori__}/#{id}"
|
95
|
+
end
|
91
96
|
end
|
92
97
|
|
93
98
|
class PhotoController < ApplicationController
|
data/lib/tori/backend/s3.rb
CHANGED
@@ -8,6 +8,12 @@ module Tori
|
|
8
8
|
attr_accessor :bucket
|
9
9
|
attr_reader :client
|
10
10
|
|
11
|
+
class << self
|
12
|
+
def type_for(path)
|
13
|
+
(MIME::Types.type_for(path).first || DEFAULT_CONTENT_TYPE).to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
11
17
|
# Must be set bucket name.
|
12
18
|
# And it use aws-sdk-core >= 2.0
|
13
19
|
# ENV takes precedence over credentials file and instance profile
|
@@ -47,6 +53,10 @@ module Tori
|
|
47
53
|
|
48
54
|
def write(filename, resource, opts = nil)
|
49
55
|
opts ||= {}
|
56
|
+
if from_path = opts.delete(:from_path)
|
57
|
+
opts[:content_type] = self.class.type_for(from_path)
|
58
|
+
end
|
59
|
+
|
50
60
|
case resource
|
51
61
|
when String
|
52
62
|
put_object({
|
@@ -56,7 +66,7 @@ module Tori
|
|
56
66
|
}.merge(opts))
|
57
67
|
when File, Pathname
|
58
68
|
path = resource.to_path
|
59
|
-
content_type =
|
69
|
+
content_type = self.class.type_for(path)
|
60
70
|
::File.open(path) { |f|
|
61
71
|
put_object({
|
62
72
|
key: filename,
|
@@ -91,10 +101,12 @@ module Tori
|
|
91
101
|
body(filename).read
|
92
102
|
end
|
93
103
|
|
104
|
+
def get(filename)
|
105
|
+
get_object(key: filename)
|
106
|
+
end
|
107
|
+
|
94
108
|
def body(filename)
|
95
|
-
|
96
|
-
key: filename
|
97
|
-
)[:body]
|
109
|
+
get(filename)[:body]
|
98
110
|
end
|
99
111
|
|
100
112
|
def put(filename, body, opts={})
|
data/lib/tori/define.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module Tori
|
2
2
|
module Define
|
3
|
-
def tori(name, &block)
|
3
|
+
def tori(name, to: nil, &block)
|
4
4
|
name_ivar = "@#{name}".to_sym
|
5
5
|
|
6
6
|
define_method(name) do
|
7
7
|
ivar = instance_variable_get name_ivar
|
8
|
-
ivar || instance_variable_set(name_ivar, File.new(self, title: name, &block))
|
8
|
+
ivar || instance_variable_set(name_ivar, File.new(self, title: name, to: to, &block))
|
9
9
|
end
|
10
10
|
|
11
11
|
define_method("#{name}=") do |uploader|
|
12
|
-
file = File.new(self, title: name, from: uploader, &block)
|
12
|
+
file = File.new(self, title: name, from: uploader, to: to, &block)
|
13
13
|
instance_variable_set name_ivar, file
|
14
14
|
end
|
15
15
|
end
|
data/lib/tori/file.rb
CHANGED
@@ -1,24 +1,28 @@
|
|
1
1
|
module Tori
|
2
2
|
class File
|
3
|
-
def initialize(model, title: nil, from: nil, &block)
|
3
|
+
def initialize(model, title: nil, from: nil, to: nil, &block)
|
4
4
|
@model = model
|
5
5
|
@title = title.kind_of?(String) ? title.to_sym : title
|
6
|
-
|
6
|
+
|
7
|
+
@from_path = if from.respond_to?(:path)
|
8
|
+
from.path
|
9
|
+
else
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
@backend = to
|
14
|
+
|
15
|
+
@from = if from.respond_to?(:read) and from.respond_to?(:rewind)
|
7
16
|
from.rewind
|
8
|
-
|
17
|
+
from.read
|
9
18
|
else
|
10
|
-
|
19
|
+
from
|
11
20
|
end
|
12
21
|
@filename_callback = block
|
13
22
|
end
|
14
23
|
|
15
24
|
def name
|
16
25
|
context = Context.new(@title)
|
17
|
-
filename_callback = if @filename_callback
|
18
|
-
@filename_callback
|
19
|
-
else
|
20
|
-
Tori.config.filename_callback
|
21
|
-
end
|
22
26
|
context.define_singleton_method(:__filename_callback__, filename_callback)
|
23
27
|
context.__filename_callback__(@model)
|
24
28
|
end
|
@@ -29,24 +33,35 @@ module Tori
|
|
29
33
|
end
|
30
34
|
|
31
35
|
def read
|
32
|
-
|
36
|
+
backend.read name
|
33
37
|
end
|
34
38
|
|
35
39
|
def write(opts = nil)
|
36
|
-
|
40
|
+
opts ||= {}
|
41
|
+
backend.write name, @from, opts.merge(from_path: @from_path)
|
37
42
|
end
|
38
43
|
|
39
44
|
def delete
|
40
|
-
|
45
|
+
backend.delete name if exist?
|
46
|
+
end
|
47
|
+
|
48
|
+
def filename_callback
|
49
|
+
@filename_callback || Tori.config.filename_callback
|
41
50
|
end
|
42
51
|
|
52
|
+
def backend
|
53
|
+
@backend || Tori.config.backend
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
43
58
|
def respond_to_missing?(sym, include_private)
|
44
|
-
|
59
|
+
backend.respond_to?(sym, include_private)
|
45
60
|
end
|
46
61
|
|
47
62
|
def method_missing(sym, *args)
|
48
63
|
if respond_to_missing?(sym, false)
|
49
|
-
|
64
|
+
backend.__send__ sym, name, *args
|
50
65
|
else
|
51
66
|
fail NameError, "undefined method `#{sym}' for #{Tori.config.backend.inspect}"
|
52
67
|
end
|
data/lib/tori/version.rb
CHANGED
@@ -28,6 +28,19 @@ class TestToriBackendS3 < Test::Unit::TestCase
|
|
28
28
|
@backend.delete("testfile")
|
29
29
|
end
|
30
30
|
|
31
|
+
test "auto content_type" do
|
32
|
+
Tempfile.create(["test", ".jpeg"]) do |f|
|
33
|
+
file = Tori::File.new(:dummy, from: f, to: @backend){ |model| "test-key" }
|
34
|
+
begin
|
35
|
+
file.write
|
36
|
+
content_type = file.get.content_type
|
37
|
+
assert { 'image/jpeg' == content_type }
|
38
|
+
ensure
|
39
|
+
file.delete
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
31
44
|
test "#initialize" do
|
32
45
|
assert_instance_of Tori::Backend::S3, @backend
|
33
46
|
assert { ENV["TORI_AWS_ACCESS_KEY_ID"] == @backend.client.config.access_key_id }
|
data/test/test_tori_define.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class TestToriDefine < Test::Unit::TestCase
|
4
|
+
class CustomBackend
|
5
|
+
def read(filename)
|
6
|
+
"read:#{filename}"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
4
10
|
class Dammy
|
5
11
|
extend Tori::Define
|
6
12
|
tori :test_image
|
@@ -8,6 +14,9 @@ class TestToriDefine < Test::Unit::TestCase
|
|
8
14
|
tori :def_image do |model|
|
9
15
|
"foo/#{__tori__}/bar/#{bird}"
|
10
16
|
end
|
17
|
+
tori :custom, to: CustomBackend.new do |model|
|
18
|
+
"#{__tori__}/baz"
|
19
|
+
end
|
11
20
|
end
|
12
21
|
|
13
22
|
class Uploader
|
@@ -18,6 +27,8 @@ class TestToriDefine < Test::Unit::TestCase
|
|
18
27
|
assert_respond_to Dammy.new, :test_image=
|
19
28
|
assert_respond_to Dammy.new, :def_image
|
20
29
|
assert_respond_to Dammy.new, :def_image=
|
30
|
+
assert_respond_to Dammy.new, :custom
|
31
|
+
assert_respond_to Dammy.new, :custom=
|
21
32
|
end
|
22
33
|
|
23
34
|
test "defined methods" do
|
@@ -25,11 +36,20 @@ class TestToriDefine < Test::Unit::TestCase
|
|
25
36
|
assert_instance_of Tori::File, dammy.test_image
|
26
37
|
assert_instance_of Uploader, dammy.test_image = Uploader.new
|
27
38
|
assert_instance_of Tori::File, dammy.test_image
|
39
|
+
assert_instance_of Tori::Backend::FileSystem, dammy.test_image.backend
|
40
|
+
assert_instance_of CustomBackend, dammy.custom.backend
|
41
|
+
end
|
42
|
+
|
43
|
+
test "defined method" do
|
44
|
+
dammy = Dammy.new
|
45
|
+
assert { false == dammy.def_image.exist? }
|
46
|
+
assert { "read:custom/baz" == dammy.custom.read }
|
28
47
|
end
|
29
48
|
|
30
49
|
test "define name" do
|
31
50
|
dammy = Dammy.new
|
32
51
|
assert_instance_of Tori::File, dammy.def_image
|
33
52
|
assert { "foo/def_image/bar/piyo" == dammy.def_image.name }
|
53
|
+
assert { "custom/baz" == dammy.custom.name }
|
34
54
|
end
|
35
55
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tori
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ksss
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
130
|
version: '0'
|
131
131
|
requirements: []
|
132
132
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.5.
|
133
|
+
rubygems_version: 2.4.5.1
|
134
134
|
signing_key:
|
135
135
|
specification_version: 4
|
136
136
|
summary: Simple file uploader
|