tori 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0767923af262a5dce13b472e5634d2a9d0bfffde
4
- data.tar.gz: dc11c7a9aa7c1c6404f87423971b273aaf22df8b
3
+ metadata.gz: 7b89b585791768dfdcae240e4f4901c8f047983e
4
+ data.tar.gz: d7dd7fae6890630c058c31a80d8318bd7fe66b3f
5
5
  SHA512:
6
- metadata.gz: bc9a89e774b0e2749a2f285895f40800dbbd89f7a193a6ff96838e2ec791d639ba3a8cee45b0cf1ee8fa3903cb28bcef8d16acbf344da1559a4fea4001e55c5e
7
- data.tar.gz: 1b206a55b212aa7a415f9feb696eb1c5d79cf8cbd72777e25cbb309f81cdb6eef240512e92864593b8b307e040a638efebc95f89ebd7c377038ad2b1aeb062bd
6
+ metadata.gz: af4ec806666e726efcd93367ad5a566621d7018eebce285f74d37c0807371df9b9301e78f8c30bd477307c0ce0c11998eaa345cba13e7f290d06692b4a596d90
7
+ data.tar.gz: c7864d0df3928c94ff43df756c822df1c424d4b76effbc68ef73d688c4ccd946c9ce4f1b4d2041c054f2291f2addab37e2a024c03c2df95dc0b0485cdad21027
data/README.md CHANGED
@@ -56,7 +56,28 @@ app/views/photos/new.html.slim
56
56
  = f.button 'Upload'
57
57
  ```
58
58
 
59
- # default configure
59
+ You can read file.
60
+
61
+ ```ruby
62
+ photo.image.read #=> image bin
63
+ photo.image.exist? #=> exist check
64
+ photo.image.to_s #=> filename
65
+ ```
66
+
67
+ # Custom configure example
68
+
69
+ ```ruby
70
+ # Save to S3 bucket.
71
+ require 'tori/backend/s3'
72
+ Tori.config.backend = Tori::Backend::S3.new('tori_bucket')
73
+
74
+ # Filename decided by model.class.name,id and hidden words.
75
+ Tori.config.filename_callback do |model|
76
+ "#{model.class.name}/#{Digest::SHA1.hexdigest "#{ENV["TORI_MAGICKWORD"]}/#{model.id}"}"
77
+ end
78
+ ```
79
+
80
+ # Default configure
60
81
 
61
82
  [https://github.com/ksss/tori/blob/master/lib/tori.rb](https://github.com/ksss/tori/blob/master/lib/tori.rb)
62
83
 
@@ -4,23 +4,28 @@ module Tori
4
4
  attr_accessor :root
5
5
  def initialize(root)
6
6
  @root = root
7
- FileUtils.mkdir_p(@root.to_s)
7
+ FileUtils.mkdir_p @root.to_s
8
8
  end
9
9
 
10
10
  def copy(form_path, to_filename)
11
- IO.copy_stream(form_path.to_s, @root.join(to_filename.to_s))
11
+ IO.copy_stream form_path.to_s, path(to_filename)
12
12
  end
13
13
 
14
14
  def delete(filename)
15
- ::File.unlink @root.join(filename.to_s)
15
+ ::File.unlink path(filename)
16
16
  end
17
17
 
18
18
  def exist?(filename)
19
- ::File.exist? @root.join(filename.to_s)
19
+ ::File.exist? path(filename)
20
20
  end
21
+ alias exists? exist?
21
22
 
22
23
  def read(filename)
23
- ::File.read @root.join(filename.to_s)
24
+ ::File.read path(filename)
25
+ end
26
+
27
+ def path(filename)
28
+ @root.join filename.to_s
24
29
  end
25
30
  end
26
31
  end
@@ -0,0 +1,47 @@
1
+ require 'aws-sdk'
2
+
3
+ module Tori
4
+ module Backend
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()
9
+ #
10
+ # 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]
19
+ end
20
+
21
+ def copy(form_path, filename)
22
+ object(filename).write(file: form_path)
23
+ end
24
+
25
+ def delete(filename)
26
+ object(filename).delete
27
+ end
28
+
29
+ def exist?(filename)
30
+ object(filename).exists?
31
+ end
32
+ alias exists? exist?
33
+
34
+ def read(filename)
35
+ object(filename).read
36
+ end
37
+
38
+ def url(filename)
39
+ object(filename).url_for(:read)
40
+ end
41
+
42
+ def object(filename)
43
+ @bucket.objects[filename]
44
+ end
45
+ end
46
+ end
47
+ end
data/lib/tori/config.rb CHANGED
@@ -1,9 +1,17 @@
1
1
  module Tori
2
2
  class Config
3
- attr_accessor :backend, :filename_callback
3
+ attr_accessor :backend
4
4
  def initialize
5
5
  @backend = nil
6
6
  @filename_callback = nil
7
7
  end
8
+
9
+ def filename_callback(&block)
10
+ if block_given?
11
+ @filename_callback = block
12
+ else
13
+ @filename_callback
14
+ end
15
+ end
8
16
  end
9
17
  end
data/lib/tori/define.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  module Tori
2
2
  module Define
3
3
  def tori(name)
4
- name_file_ivar = "@#{name}_file".to_sym
4
+ name_ivar = "@#{name}".to_sym
5
5
 
6
6
  define_method(name) do
7
- ivar = instance_variable_get name_file_ivar
8
- instance_variable_set name_file_ivar, ivar || File.new(self)
7
+ ivar = instance_variable_get name_ivar
8
+ instance_variable_set name_ivar, ivar || File.new(self)
9
9
  end
10
10
 
11
11
  define_method("#{name}=") do |uploader|
12
- file = File.new(self, uploader)
13
- instance_variable_set name_file_ivar, file
12
+ file = File.new(self, from: uploader)
13
+ instance_variable_set name_ivar, file
14
14
  end
15
15
  end
16
16
  end
data/lib/tori/file.rb CHANGED
@@ -1,28 +1,39 @@
1
1
  module Tori
2
2
  class File
3
- attr_accessor :from
4
-
5
- def initialize(model, from = nil)
3
+ def initialize(model, from: nil)
6
4
  @model = model
7
5
  @from = from
8
6
  end
9
7
 
10
- def to_s
8
+ def name
11
9
  Tori.config.filename_callback.call(@model)
12
10
  end
13
-
14
- def exist?
15
- Tori.config.backend.exist?(to_s)
16
- end
11
+ alias to_s name
17
12
 
18
13
  def copy?
19
- !@model.nil? && !@from.nil? && @from.respond_to?(:path) && 0 < to_s.length
14
+ !@model.nil? && !@from.nil? && @from.respond_to?(:path) && 0 < name.length
20
15
  rescue NameError => e
21
16
  false
22
17
  end
23
18
 
24
- def read
25
- Tori.config.backend.read(to_s)
19
+ def copy
20
+ Tori.config.backend.copy @from.path, name if copy?
21
+ end
22
+
23
+ def delete
24
+ Tori.config.backend.delete name if exist?
25
+ end
26
+
27
+ def respond_to_missing?(sym, include_private)
28
+ Tori.config.backend.respond_to?(sym, include_private)
29
+ end
30
+
31
+ def method_missing(sym)
32
+ if respond_to_missing?(sym, false)
33
+ Tori.config.backend.__send__ sym, name
34
+ else
35
+ fail NameError, "undefined local variable or method `#{sym}' for #{Tori.config.backend.inspect}"
36
+ end
26
37
  end
27
38
  end
28
39
  end
data/lib/tori/rails.rb CHANGED
@@ -16,12 +16,12 @@ module Tori
16
16
 
17
17
  after_save do
18
18
  file = __send__ name
19
- Tori.config.backend.copy(file.from.path, file.to_s) if file.from && file.copy?
19
+ file.copy
20
20
  end
21
21
 
22
22
  after_destroy do
23
23
  file = __send__ name
24
- Tori.config.backend.delete(file.to_s) if file.exist?
24
+ file.delete
25
25
  end
26
26
  end
27
27
  end
data/lib/tori/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tori
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/tori.rb CHANGED
@@ -18,10 +18,15 @@ module Tori
18
18
  # Configure for file store backend instance.
19
19
  config.backend = Tori::Backend::FileSystem.new(Pathname("tmp/tori"))
20
20
 
21
+ # You can also use S3 backend.
22
+ # It take 'aws-sdk' gem.
23
+ # S3 example
24
+ # require 'tori/backend/s3'
25
+ # config.backend = Tori::Backend::S3.new('tori_bucket')
26
+
21
27
  # Filename hashing method
22
28
  # It's call when decide filename hash.
23
- # `filename_callback` must be have `call` method.
24
- config.filename_callback = ->(model) do
29
+ config.filename_callback do |model|
25
30
  Digest::SHA1.hexdigest "#{model.class.name}/#{model.id}"
26
31
  end
27
32
  end
@@ -4,9 +4,5 @@ class TestToriConfig < Test::Unit::TestCase
4
4
  test "#initialize" do
5
5
  i = Tori::Config.new
6
6
  assert_instance_of Tori::Config, i
7
- assert_respond_to i, :backend
8
- assert_respond_to i, :backend=
9
- assert_respond_to i, :filename_callback
10
- assert_respond_to i, :filename_callback=
11
7
  end
12
8
  end
@@ -6,8 +6,16 @@ class TestToriDefine < Test::Unit::TestCase
6
6
  tori :test_image
7
7
  end
8
8
 
9
+ class Uploader
10
+ end
11
+
9
12
  test "#tori" do
10
13
  assert_respond_to Dammy.new, :test_image
11
14
  assert_respond_to Dammy.new, :test_image=
12
15
  end
16
+
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
20
+ end
13
21
  end
@@ -3,38 +3,50 @@ require 'test_helper'
3
3
  class TestToriDefine < Test::Unit::TestCase
4
4
  setup do
5
5
  @orig = Tori.config.filename_callback
6
- Tori.config.filename_callback = ->(model){
6
+ Tori.config.filename_callback do |model|
7
7
  model
8
- }
8
+ end
9
9
  Tori.config.backend = Tori::Backend::FileSystem.new Pathname("test").join("tmp")
10
10
  end
11
11
 
12
12
  teardown do
13
- Tori.config.filename_callback = @orig
13
+ Tori.config.filename_callback &@orig
14
14
  FileUtils.rm_rf("test/tmp")
15
15
  end
16
16
 
17
- class Dammy
17
+ class From
18
18
  def path
19
- "path"
19
+ __FILE__
20
20
  end
21
21
  end
22
22
 
23
23
  test "#initialize" do
24
- assert_instance_of Tori::File, Tori::File.new(nil, nil)
24
+ assert_instance_of Tori::File, Tori::File.new(nil)
25
+ assert_instance_of Tori::File, Tori::File.new(nil, from: nil)
25
26
  end
26
27
 
27
- test "#to_s" do
28
- assert { "test" == Tori::File.new("test", nil).to_s }
28
+ test "#name" do
29
+ assert { "test" == Tori::File.new("test").name }
29
30
  end
30
31
 
31
32
  test "#exist?" do
32
- assert { true == Tori::File.new(__FILE__, nil).exist? }
33
- assert { false == Tori::File.new("nothing_file", nil).exist? }
33
+ assert { true == Tori::File.new(__FILE__).exist? }
34
+ assert { false == Tori::File.new("nothing_file").exist? }
34
35
  end
35
36
 
36
37
  test "#copy?" do
37
- assert { false == Tori::File.new(__FILE__, nil).copy? }
38
- assert { true == Tori::File.new(__FILE__, Dammy.new).copy? }
38
+ assert { false == Tori::File.new(__FILE__).copy? }
39
+ assert { true == Tori::File.new(__FILE__, from: From.new).copy? }
40
+ end
41
+
42
+ test "copy" do
43
+ assert { false == File.exist?("test/tmp/copy") }
44
+ Tori::File.new("copy", from: From.new).copy
45
+ assert { true == File.exist?("test/tmp/copy") }
46
+ end
47
+
48
+ test "#method_missing" do
49
+ assert { true == Tori::File.new(nil).respond_to?(:read) }
50
+ assert_raise(NameError) { Tori::File.new(nil).undefined }
39
51
  end
40
52
  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.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-25 00:00:00.000000000 Z
11
+ date: 2015-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,7 @@ files:
66
66
  - Rakefile
67
67
  - lib/tori.rb
68
68
  - lib/tori/backend/filesystem.rb
69
+ - lib/tori/backend/s3.rb
69
70
  - lib/tori/config.rb
70
71
  - lib/tori/define.rb
71
72
  - lib/tori/file.rb
@@ -75,8 +76,8 @@ files:
75
76
  - test/test_tori.rb
76
77
  - test/test_tori_backend_filesystem.rb
77
78
  - test/test_tori_config.rb
79
+ - test/test_tori_define.rb
78
80
  - test/test_tori_file.rb
79
- - test/test_tori_method_definition.rb
80
81
  - tori.gemspec
81
82
  homepage: https://github.com/ksss/tori
82
83
  licenses:
@@ -107,5 +108,5 @@ test_files:
107
108
  - test/test_tori.rb
108
109
  - test/test_tori_backend_filesystem.rb
109
110
  - test/test_tori_config.rb
111
+ - test/test_tori_define.rb
110
112
  - test/test_tori_file.rb
111
- - test/test_tori_method_definition.rb