tori 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b89b585791768dfdcae240e4f4901c8f047983e
4
- data.tar.gz: d7dd7fae6890630c058c31a80d8318bd7fe66b3f
3
+ metadata.gz: 59a3b8e9df440e4db765dc69951b55887020ef62
4
+ data.tar.gz: 0bd333e1b30fc39dec35d15978474617c375f920
5
5
  SHA512:
6
- metadata.gz: af4ec806666e726efcd93367ad5a566621d7018eebce285f74d37c0807371df9b9301e78f8c30bd477307c0ce0c11998eaa345cba13e7f290d06692b4a596d90
7
- data.tar.gz: c7864d0df3928c94ff43df756c822df1c424d4b76effbc68ef73d688c4ccd946c9ce4f1b4d2041c054f2291f2addab37e2a024c03c2df95dc0b0485cdad21027
6
+ metadata.gz: b536f7ab3b27b688618990d810dfc75a8c06e6f4bb4e4fabc5f6f60c04c60503926f5b834027a6d0bbe35e95a506ee946008fc38b5a45a1ddfb272a2f87cdc95
7
+ data.tar.gz: 54772f385b31c5d82878758951746738cc94b84d7df984f29179f0c8b3f8ac3edc26ba32045fc688eabf1a1d0a3b7658f0debb90e68290d6593c7c906b9b3166
data/README.md CHANGED
@@ -24,6 +24,14 @@ app/models/photo.rb
24
24
  ```ruby
25
25
  class Photo < ActiveRecord::Base
26
26
  tori :image
27
+
28
+ after_save do
29
+ image.write if image.from?
30
+ end
31
+
32
+ after_destroy do
33
+ image.delete
34
+ end
27
35
  end
28
36
  ```
29
37
 
@@ -61,7 +69,7 @@ You can read file.
61
69
  ```ruby
62
70
  photo.image.read #=> image bin
63
71
  photo.image.exist? #=> exist check
64
- photo.image.to_s #=> filename
72
+ photo.image.name #=> filename
65
73
  ```
66
74
 
67
75
  # Custom configure example
@@ -69,7 +77,7 @@ photo.image.to_s #=> filename
69
77
  ```ruby
70
78
  # Save to S3 bucket.
71
79
  require 'tori/backend/s3'
72
- Tori.config.backend = Tori::Backend::S3.new('tori_bucket')
80
+ Tori.config.backend = Tori::Backend::S3.new(bucket: 'tori_bucket')
73
81
 
74
82
  # Filename decided by model.class.name,id and hidden words.
75
83
  Tori.config.filename_callback do |model|
@@ -82,7 +90,3 @@ end
82
90
  [https://github.com/ksss/tori/blob/master/lib/tori.rb](https://github.com/ksss/tori/blob/master/lib/tori.rb)
83
91
 
84
92
  You can change configure any time.
85
-
86
- # future TODO
87
-
88
- - support background S3 Storage
@@ -7,8 +7,13 @@ module Tori
7
7
  FileUtils.mkdir_p @root.to_s
8
8
  end
9
9
 
10
- def copy(form_path, to_filename)
11
- IO.copy_stream form_path.to_s, path(to_filename)
10
+ def write(filename, resource)
11
+ case resource
12
+ when String
13
+ ::File.open(path(filename), 'w'){ |f| f.write resource }
14
+ else
15
+ ::IO.copy_stream resource, path(filename)
16
+ end
12
17
  end
13
18
 
14
19
  def delete(filename)
@@ -1,46 +1,89 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-core'
2
2
 
3
3
  module Tori
4
4
  module Backend
5
5
  class S3
6
- # You must be set bucket name.
7
- # And you can configurate to S3
8
- # But, you can also configurate by AWS.config()
6
+ attr_accessor :bucket, :client
7
+ # Must be set bucket name.
8
+ # And it use aws-sdk-core >= 2.0
9
+ # ENV["TORI_ACCESS_KEY"] > aws-sdk credentials
9
10
  #
10
11
  # example:
11
- # Tori.config.backend = Tori::Backend::S3.new(
12
- # bucket: 'photos',
13
- # region: '...',
14
- # s3_encryption_key: '...'
15
- # )
16
- def initialize(bucket:, **s3_config)
17
- s3 = AWS::S3.new(s3_config)
18
- @bucket = s3.buckets[bucket]
12
+ # Tori.config.backend = Tori::Backend::S3.new(bucket: 'tori_bucket')
13
+ def initialize(bucket:)
14
+ @bucket = bucket
15
+ @client = if ENV["TORI_AWS_ACCESS_KEY_ID"] && ENV["TORI_AWS_SECRET_ACCESS_KEY"]
16
+ Aws::S3::Client.new(
17
+ access_key_id: ENV["TORI_AWS_ACCESS_KEY_ID"],
18
+ secret_access_key: ENV["TORI_AWS_SECRET_ACCESS_KEY"],
19
+ region: ENV["TORI_AWS_REGION"] || ENV['AWS_REGION'] || Aws.config[:region],
20
+ )
21
+ else
22
+ Aws::S3::Client.new(
23
+ region: ENV["TORI_AWS_REGION"] || ENV['AWS_REGION'] || Aws.config[:region]
24
+ )
25
+ end
19
26
  end
20
27
 
21
- def copy(form_path, filename)
22
- object(filename).write(file: form_path)
28
+ def write(filename, resource)
29
+ case resource
30
+ when IO
31
+ put filename, f
32
+ when String
33
+ put filename, resource
34
+ else
35
+ ::File.open(resource.to_path) { |f| put filename, f }
36
+ end
23
37
  end
24
38
 
25
39
  def delete(filename)
26
- object(filename).delete
40
+ @client.delete_object(
41
+ bucket: @bucket,
42
+ key: filename
43
+ )
27
44
  end
28
45
 
29
- def exist?(filename)
30
- object(filename).exists?
46
+ def exist?(filename = nil)
47
+ head filename
48
+ rescue Aws::S3::Errors::NoSuchKey, Aws::S3::Errors::NotFound
49
+ false
50
+ else
51
+ true
31
52
  end
32
53
  alias exists? exist?
33
54
 
34
55
  def read(filename)
35
- object(filename).read
56
+ @client.get_object(
57
+ bucket: @bucket,
58
+ key: filename
59
+ )[:body].read
36
60
  end
37
61
 
38
- def url(filename)
39
- object(filename).url_for(:read)
62
+ def public_url(filename, params={})
63
+ "#{@client.config.endpoint}/#{@bucket}/#{filename}"
40
64
  end
41
65
 
42
- def object(filename)
43
- @bucket.objects[filename]
66
+ def url_for(filename, method)
67
+ signer = Aws::S3::Presigner.new(client: @client)
68
+ signer.presigned_url(method, bucket: @bucket, key: filename)
69
+ end
70
+
71
+ private
72
+
73
+ def put(filename, body)
74
+ @client.put_object(
75
+ bucket: @bucket,
76
+ key: filename,
77
+ body: body
78
+ )
79
+ end
80
+
81
+ def head(filename = nil)
82
+ if filename
83
+ @client.head_object bucket: @bucket, key: filename
84
+ else
85
+ @client.head_bucket bucket: @bucket
86
+ end
44
87
  end
45
88
  end
46
89
  end
data/lib/tori/define.rb CHANGED
@@ -5,7 +5,7 @@ module Tori
5
5
 
6
6
  define_method(name) do
7
7
  ivar = instance_variable_get name_ivar
8
- instance_variable_set name_ivar, ivar || File.new(self)
8
+ ivar || instance_variable_set(name_ivar, File.new(self))
9
9
  end
10
10
 
11
11
  define_method("#{name}=") do |uploader|
data/lib/tori/file.rb CHANGED
@@ -10,14 +10,14 @@ module Tori
10
10
  end
11
11
  alias to_s name
12
12
 
13
- def copy?
14
- !@model.nil? && !@from.nil? && @from.respond_to?(:path) && 0 < name.length
15
- rescue NameError => e
16
- false
13
+ def from?
14
+ !@from.nil? && @from.respond_to?(:path)
17
15
  end
18
16
 
19
- def copy
20
- Tori.config.backend.copy @from.path, name if copy?
17
+ def write
18
+ path = @from.path
19
+ path = Pathname.new(path) if path.kind_of?(String)
20
+ Tori.config.backend.write name, path
21
21
  end
22
22
 
23
23
  def delete
@@ -28,11 +28,11 @@ module Tori
28
28
  Tori.config.backend.respond_to?(sym, include_private)
29
29
  end
30
30
 
31
- def method_missing(sym)
31
+ def method_missing(sym, *args)
32
32
  if respond_to_missing?(sym, false)
33
- Tori.config.backend.__send__ sym, name
33
+ Tori.config.backend.__send__ sym, name, *args
34
34
  else
35
- fail NameError, "undefined local variable or method `#{sym}' for #{Tori.config.backend.inspect}"
35
+ fail NameError, "undefined method `#{sym}' for #{Tori.config.backend.inspect}"
36
36
  end
37
37
  end
38
38
  end
data/lib/tori/rails.rb CHANGED
@@ -1,29 +1,2 @@
1
1
  require 'tori'
2
-
3
- module Tori
4
- module ActiveRecord
5
- include Define
6
-
7
- # Filename hash usgin `id` attribute by default.
8
- # And you can change this attribute, But it's should be record unique.
9
- #
10
- # @example:
11
- # class Photo < ActiveRecord::Base
12
- # tori :image
13
- # end
14
- def tori(name)
15
- super
16
-
17
- after_save do
18
- file = __send__ name
19
- file.copy
20
- end
21
-
22
- after_destroy do
23
- file = __send__ name
24
- file.delete
25
- end
26
- end
27
- end
28
- end
29
- ::ActiveRecord::Base.extend(Tori::ActiveRecord)
2
+ ::ActiveRecord::Base.extend(Tori::Define)
data/lib/tori/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tori
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/tori.rb CHANGED
@@ -19,10 +19,10 @@ module Tori
19
19
  config.backend = Tori::Backend::FileSystem.new(Pathname("tmp/tori"))
20
20
 
21
21
  # You can also use S3 backend.
22
- # It take 'aws-sdk' gem.
22
+ # It take 'aws-sdk-core' gem.
23
23
  # S3 example
24
24
  # require 'tori/backend/s3'
25
- # config.backend = Tori::Backend::S3.new('tori_bucket')
25
+ # config.backend = Tori::Backend::S3.new(bucket: 'tori_bucket')
26
26
 
27
27
  # Filename hashing method
28
28
  # It's call when decide filename hash.
@@ -1,15 +1,10 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class TestToriBackendFileSystem < Test::Unit::TestCase
4
- class Uploader
5
- def path
6
- "test/tmp/uploader"
7
- end
8
- end
9
-
10
4
  setup do
11
5
  path = Pathname("test/tmp/tori/store")
12
6
  @filesystem = Tori::Backend::FileSystem.new(path)
7
+ File.open(@filesystem.root.join("testfile"), 'w+'){ |f| f.write('text') }
13
8
  end
14
9
 
15
10
  teardown do
@@ -27,9 +22,24 @@ class TestToriBackendFileSystem < Test::Unit::TestCase
27
22
  end
28
23
 
29
24
  test "#read" do
30
- FileUtils.touch @filesystem.root.join("readfile")
31
- assert { "" == @filesystem.read("readfile") }
32
- File.unlink @filesystem.root.join("readfile")
25
+ assert { "text" == @filesystem.read("testfile") }
33
26
  assert_raise(Errno::ENOENT){ @filesystem.read("nothing_file") }
34
27
  end
28
+
29
+ test "#path" do
30
+ assert { Pathname.new("test/tmp/tori/store/testfile") == @filesystem.path("testfile") }
31
+ end
32
+
33
+ test "#write" do
34
+ @filesystem.write("copyfile", @filesystem.path("testfile"))
35
+ assert { "text" == @filesystem.read("copyfile") }
36
+
37
+ File.open(@filesystem.path("testfile")) do |f|
38
+ @filesystem.write("copyfile", f)
39
+ end
40
+ assert { "text" == @filesystem.read("copyfile") }
41
+
42
+ @filesystem.write("copyfile", "string")
43
+ assert { "string" == @filesystem.read("copyfile") }
44
+ end
35
45
  end
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+ require 'tori/backend/s3'
3
+
4
+ if ENV["TORI_TEST_BUCKET"]
5
+
6
+ class TestToriBackendS3 < Test::Unit::TestCase
7
+ BucketNotFoundError = Class.new(StandardError)
8
+ setup do
9
+ @backend = Tori::Backend::S3.new(bucket: ENV["TORI_TEST_BUCKET"])
10
+ fail BucketNotFoundError, "S3 test need make s3 bucket '#{@backend.bucket}'" unless @backend.exists?
11
+
12
+ @testfile_path = Pathname.new("test/tmp/testfile")
13
+ FileUtils.mkdir_p "test/tmp"
14
+ File.open(@testfile_path.to_s, 'w+'){ |f| f.write('text') }
15
+ @backend.write("testfile", @testfile_path)
16
+ end
17
+
18
+ teardown do
19
+ FileUtils.rm_rf("test/tmp")
20
+ @backend.delete("testfile")
21
+ end
22
+
23
+ test "#initialize" do
24
+ assert_instance_of Tori::Backend::S3, @backend
25
+ assert_raise(ArgumentError){ Tori::Backend::S3.new }
26
+ end
27
+
28
+ test "#respond_to_missing?" do
29
+ %i(exists? read delete).each do |m|
30
+ assert { true == @backend.respond_to?(m) }
31
+ end
32
+ end
33
+
34
+ test "#write" do
35
+ assert_nothing_raised { @backend.write("testfile", @testfile_path) }
36
+ end
37
+
38
+ test "#read" do
39
+ assert { "test" == @backend.read("testfile") }
40
+ end
41
+
42
+ test "#exists?" do
43
+ assert_nothing_raised { @backend.exists?("nothingfile") }
44
+ assert { true == @backend.exists?("testfile") }
45
+ end
46
+
47
+ test "#delete" do
48
+ assert_nothing_raised { @backend.delete("testfile") }
49
+ assert { false == @backend.exists?("testfile") }
50
+ end
51
+
52
+ test "#public_url" do
53
+ assert_match %r!https?://s3-!, @backend.public_url("testfile")
54
+ assert_match @backend.bucket, @backend.public_url("testfile")
55
+ assert_match "testfile", @backend.public_url("testfile")
56
+ end
57
+ end
58
+
59
+ end
@@ -15,7 +15,9 @@ class TestToriDefine < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  test "defined methods" do
18
- assert_instance_of Uploader, Dammy.new.test_image = Uploader.new
19
- assert_instance_of Tori::File, Dammy.new.test_image
18
+ dammy = Dammy.new
19
+ assert_instance_of Tori::File, dammy.test_image
20
+ assert_instance_of Uploader, dammy.test_image = Uploader.new
21
+ assert_instance_of Tori::File, dammy.test_image
20
22
  end
21
23
  end
@@ -34,14 +34,14 @@ class TestToriDefine < Test::Unit::TestCase
34
34
  assert { false == Tori::File.new("nothing_file").exist? }
35
35
  end
36
36
 
37
- test "#copy?" do
38
- assert { false == Tori::File.new(__FILE__).copy? }
39
- assert { true == Tori::File.new(__FILE__, from: From.new).copy? }
37
+ test "#from?" do
38
+ assert { false == Tori::File.new(__FILE__).from? }
39
+ assert { true == Tori::File.new(__FILE__, from: From.new).from? }
40
40
  end
41
41
 
42
- test "copy" do
42
+ test "write" do
43
43
  assert { false == File.exist?("test/tmp/copy") }
44
- Tori::File.new("copy", from: From.new).copy
44
+ Tori::File.new("copy", from: From.new).write
45
45
  assert { true == File.exist?("test/tmp/copy") }
46
46
  end
47
47
 
data/tori.gemspec CHANGED
@@ -19,5 +19,6 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.add_development_dependency "bundler"
21
21
  spec.add_development_dependency "rake"
22
- spec.add_development_dependency 'test-unit'
22
+ spec.add_development_dependency "test-unit"
23
+ spec.add_development_dependency "aws-sdk-core", ">= 2.0"
23
24
  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.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-03 00:00:00.000000000 Z
11
+ date: 2015-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-core
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
55
69
  description: Simple file uploader
56
70
  email:
57
71
  - co000ri@gmail.com
@@ -75,6 +89,7 @@ files:
75
89
  - test/test_helper.rb
76
90
  - test/test_tori.rb
77
91
  - test/test_tori_backend_filesystem.rb
92
+ - test/test_tori_backend_s3.rb
78
93
  - test/test_tori_config.rb
79
94
  - test/test_tori_define.rb
80
95
  - test/test_tori_file.rb
@@ -107,6 +122,7 @@ test_files:
107
122
  - test/test_helper.rb
108
123
  - test/test_tori.rb
109
124
  - test/test_tori_backend_filesystem.rb
125
+ - test/test_tori_backend_s3.rb
110
126
  - test/test_tori_config.rb
111
127
  - test/test_tori_define.rb
112
128
  - test/test_tori_file.rb