kanoko 0.1.3 → 0.2.0

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: 2bb14e5d991054049e19110d50de0645f8e5e4e2
4
- data.tar.gz: 9d937dbe7cb9d93183130f7f4dc1b5e30f5c9054
3
+ metadata.gz: c3e0d030893084af61384d4d8b6348a42ccc9a80
4
+ data.tar.gz: 826a04fc42395cf02695038c8af3be399fa2de09
5
5
  SHA512:
6
- metadata.gz: 744b4e38f86f5d12ea30a82d169ce0c7808acb2afb7cf515ab638fd3265caebb0594cac9fe6e32fb92a32933e60a2e66d8606db5146c5606162b8c59a7d7a6f6
7
- data.tar.gz: 9d19cfeca0bdef8ded0195ba00bdccc7abc297f148c00db1ad00295f253a8bba00bff6665be96d4e3b7e4084c38efe4d043197ba215e58f43b1ab0f2c832b3a1
6
+ metadata.gz: f4c817ced22e73cc3f6bfbaea398a27e7aaf2ae3c09bedb3f972e642340adaf7ab5a61bbd68b38ff26149f766904dc14603697e1bde79f2b3ef839a582e95c97
7
+ data.tar.gz: b39a548d60bac3f6abd22af3ab7a987c067245679c7f90ebd84c4c6a62e27d36f866e0b8b8073c17cb6d0f8eb2361bb8933abf911289b2c8c15d65307549db74
@@ -12,9 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = "https://github.com/spice-life/kanoko"
13
13
  spec.license = "MIT"
14
14
 
15
- spec.files = `git ls-files`.split($/)
16
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
16
  spec.require_paths = ["lib"]
19
17
 
20
18
  spec.add_dependency "sinatra"
@@ -31,32 +31,45 @@ require 'kanoko'
31
31
  module Kanoko
32
32
  module Application
33
33
  class Convert < Sinatra::Application
34
+ require 'kanoko/application/convert/function'
34
35
 
35
36
  # /123abc456def=/resize/200x200/crop/100x100/path/to/src
36
37
  get '/:hash/*' do
37
- request_uri = URI.parse(env["REQUEST_URI"] || "/#{params[:captures].join('/')}")
38
- hash = params[:hash]
39
- unless params[:splat]
38
+ # REQUEST_URI dependent on unicorn.
39
+ # request.path should be use only testing
40
+ raw_request_uri = env["REQUEST_URI"] || request.path
41
+ request_params = raw_request_uri.split('/').tap(&:shift)
42
+ hash = request_params.shift
43
+ unless 0 < request_params.length
40
44
  logger.error "invalid url #{request_uri}"
41
45
  return 400
42
46
  end
43
47
 
44
- splat = params[:splat][0]
45
- argument = ArgumentParser.new splat
48
+ list = Kanoko::Application::Convert::Function.list
49
+ convert_options = []
50
+ arguments = []
46
51
 
47
- hint_src = splat[argument.path.length..-1]
48
- unless hint_src
49
- logger.error "invalid url #{request_uri}"
50
- return 400
52
+ while id = request_params.shift.to_sym
53
+ if list.include?(id)
54
+ arguments << id
55
+ method = Function.new.method(id)
56
+ arg = request_params.shift(method.arity)
57
+ arg.map!{|i| URI.decode_www_form_component i}
58
+ arguments.concat arg if 0 < arg.length
59
+ convert_options.concat method.call(*arg)
60
+ else
61
+ request_params.unshift(id.to_s)
62
+ break
63
+ end
51
64
  end
52
- hint_index = request_uri.to_s.index(argument.path) + argument.path.length + 1
53
- src_path = request_uri.to_s[hint_index..-1]
54
- src_path_unescaped = URI.decode_www_form_component(src_path).force_encoding('UTF-8')
55
- unless hash == Kanoko.make_hash(*(argument.to_a.flatten), src_path_unescaped)
56
- logger.error "hash check failed #{[*(argument.to_a.flatten), src_path]}"
65
+
66
+ check_path = request_params.map{ |i| URI.decode_www_form_component(i) }.join('/')
67
+ unless hash == Kanoko.make_hash(*arguments, check_path)
68
+ logger.error "hash check failed #{[*arguments, check_path]}"
57
69
  return 400
58
70
  end
59
71
 
72
+ src_path = request_params.join('/')
60
73
  res = http_get(URI.parse("#{(request.secure? ? 'https' : 'http')}://#{src_path}"))
61
74
  if res.nil?
62
75
  return 404
@@ -72,7 +85,7 @@ module Kanoko
72
85
  {"OMP_NUM_THREADS" => "1"},
73
86
  'convert',
74
87
  '-depth', '8',
75
- argument.options,
88
+ convert_options,
76
89
  src_file.path,
77
90
  dst_file.path
78
91
  ].flatten
@@ -130,5 +143,3 @@ module Kanoko
130
143
  end
131
144
  end
132
145
  end
133
-
134
- require 'kanoko/application/convert/argument_parser'
@@ -1,3 +1,3 @@
1
1
  module Kanoko
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kanoko
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
@@ -110,20 +110,11 @@ files:
110
110
  - kanoko.gemspec
111
111
  - lib/kanoko.rb
112
112
  - lib/kanoko/application/convert.rb
113
- - lib/kanoko/application/convert/argument_parser.rb
114
113
  - lib/kanoko/application/convert/function.rb
115
114
  - lib/kanoko/configure.rb
116
115
  - lib/kanoko/errors.rb
117
116
  - lib/kanoko/version.rb
118
117
  - logo.png
119
- - test/helper.rb
120
- - test/resize.jpg
121
- - test/resize_and_crop.jpg
122
- - test/src.jpg
123
- - test/test_application_convert.rb
124
- - test/test_application_convert_argumentparser.rb
125
- - test/test_configure.rb
126
- - test/test_kanoko.rb
127
118
  homepage: https://github.com/spice-life/kanoko
128
119
  licenses:
129
120
  - MIT
@@ -148,12 +139,4 @@ rubygems_version: 2.4.5
148
139
  signing_key:
149
140
  specification_version: 4
150
141
  summary: kanoko is a active image generater library.
151
- test_files:
152
- - test/helper.rb
153
- - test/resize.jpg
154
- - test/resize_and_crop.jpg
155
- - test/src.jpg
156
- - test/test_application_convert.rb
157
- - test/test_application_convert_argumentparser.rb
158
- - test/test_configure.rb
159
- - test/test_kanoko.rb
142
+ test_files: []
@@ -1,45 +0,0 @@
1
- require 'kanoko/application/convert/function'
2
-
3
- module Kanoko
4
- module Application
5
- class Convert
6
- class ArgumentParser
7
- include Enumerable
8
- extend Forwardable
9
- def_delegators :@args, :each, :to_a
10
-
11
- attr_reader :options
12
-
13
- def initialize(args)
14
- @args, @options = ArgumentParser.parse args
15
- end
16
-
17
- def to_path
18
- map { |i| "/#{i.join('/')}" }.join
19
- end
20
- alias path to_path
21
-
22
- private
23
-
24
- class << self
25
- def parse(path)
26
- args = []
27
- options = []
28
- items = path.split('/')
29
- while item = items.shift
30
- id = item.to_sym
31
- if Function.list.include?(id)
32
- function = Function.new
33
- method = function.method(id)
34
- arg = items.shift(method.arity)
35
- options.concat method.call(*arg)
36
- args.push [id, *arg]
37
- end
38
- end
39
- [args, options]
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,7 +0,0 @@
1
- ENV['RACK_ENV'] = 'test'
2
-
3
- require 'minitest/autorun'
4
- require 'stringio'
5
- require "rack/test"
6
- require "exifr"
7
- require "kanoko/application/convert"
Binary file
Binary file
Binary file
@@ -1,99 +0,0 @@
1
- require 'helper'
2
-
3
- class TestKanokoApplicationConvert < Minitest::Test
4
- include Rack::Test::Methods
5
-
6
- class TestApp < Kanoko::Application::Convert
7
- class ResponseMock < Struct.new(:body)
8
- end
9
- def http_get(uri)
10
- ResponseMock.new(File.read "test/src.jpg")
11
- end
12
- def after_response(res)
13
- end
14
- end
15
-
16
- def app
17
- TestApp.new
18
- end
19
-
20
- def setup
21
- Kanoko.configure.digest_func = "sha1"
22
- Kanoko.configure.secret_key = "test"
23
- end
24
-
25
- def assert_jpeg(expected, actual)
26
- expected_exif = EXIFR::JPEG.new(StringIO.new(expected))
27
- actual_exif = EXIFR::JPEG.new(StringIO.new(actual))
28
- assert_equal expected_exif.to_hash, actual_exif.to_hash
29
- end
30
-
31
- def test_resize
32
- path = Kanoko.path_for(:resize, "10x10", "src.jpg")
33
- get path
34
- assert last_response.ok?
35
- assert 0 < last_response.body.length
36
- assert_jpeg File.read("test/resize.jpg"), last_response.body
37
- end
38
-
39
- def test_resize_and_crop
40
- path = Kanoko.path_for(:resize, "10x10", :crop, "5x5+1+1", "src.jpg")
41
- get path
42
- assert last_response.ok?
43
- assert 0 < last_response.body.length
44
- assert_jpeg File.read("test/resize_and_crop.jpg"), last_response.body
45
- end
46
-
47
- def test_auto_orient
48
- path = Kanoko.path_for(:auto_orient, "src.jpg")
49
- get path
50
- assert last_response.ok?
51
- assert 0 < last_response.body.length
52
- assert_jpeg File.read("test/src.jpg"), last_response.body
53
- end
54
-
55
- def test_resize_and_auto_orient
56
- path = Kanoko.path_for(:resize, "10x10", :auto_orient, "src.jpg")
57
- get path
58
- assert last_response.ok?
59
- assert 0 < last_response.body.length
60
- assert_jpeg File.read("test/resize.jpg"), last_response.body
61
- end
62
-
63
- def test_undefined_func
64
- path = Kanoko.path_for(:undefined, "10x10", "src.jpg")
65
- get path
66
- assert_equal 400, last_response.status
67
- assert_equal "", last_response.body
68
- end
69
-
70
- def test_root_not_found
71
- path = "/"
72
- get path
73
- assert_equal 404, last_response.status
74
- assert_equal "", last_response.body
75
- end
76
-
77
- def test_invalid_path
78
- path = "/invalid/path/to/src"
79
- get path
80
- assert_equal 400, last_response.status
81
- assert_equal "", last_response.body
82
- end
83
-
84
- class Kanoko::Application::Convert::Function
85
- def method_for_500
86
- ['-undefined-imagemagick-option']
87
- end
88
- end
89
-
90
- def test_500
91
- path = Kanoko.path_for(:method_for_500, "src.jpg")
92
- out, err = capture_subprocess_io do
93
- get path
94
- end
95
- assert_equal 500, last_response.status
96
- assert_equal "", last_response.body
97
- assert_match /convert: unrecognized option `-undefined-imagemagick-option'/, err
98
- end
99
- end
@@ -1,58 +0,0 @@
1
- require 'helper'
2
-
3
- class TestKanokoApplicationConvertArgumentParser < Minitest::Test
4
- include Kanoko::Application
5
- class Kanoko::Application::Convert::Function
6
- def empty_option
7
- []
8
- end
9
- def one_option
10
- ['func1']
11
- end
12
- def one_arg_and_one_option(arg)
13
- ['func2', arg]
14
- end
15
- end
16
-
17
- def test_empty
18
- a = Convert::ArgumentParser.new("")
19
- assert_equal [], a.to_a
20
- assert_equal [], a.options
21
- assert_equal "", a.path
22
- end
23
-
24
- def test_empty_option
25
- a = Convert::ArgumentParser.new("empty_option/10x10")
26
- assert_equal [[:empty_option]], a.to_a
27
- assert_equal [], a.options
28
- assert_equal "/empty_option", a.path
29
- end
30
-
31
- def test_one_option
32
- a = Convert::ArgumentParser.new("one_option/10x10")
33
- assert_equal [[:one_option]], a.to_a
34
- assert_equal "/one_option", a.path
35
- assert_equal ['func1'], a.options
36
- end
37
-
38
- def test_one_arg_and_one_option
39
- a = Convert::ArgumentParser.new("one_arg_and_one_option/10x10")
40
- assert_equal [[:one_arg_and_one_option, '10x10']], a.to_a
41
- assert_equal "/one_arg_and_one_option/10x10", a.path
42
- assert_equal ['func2', '10x10'], a.options
43
- end
44
-
45
- def test_one_option_and_one_arg_and_one_option
46
- a = Convert::ArgumentParser.new("one_option/one_arg_and_one_option/10x10")
47
- assert_equal [[:one_option], [:one_arg_and_one_option, '10x10']], a.to_a
48
- assert_equal "/one_option/one_arg_and_one_option/10x10", a.path
49
- assert_equal ['func1', 'func2', '10x10'], a.options
50
- end
51
-
52
- def test_nothing
53
- a = Convert::ArgumentParser.new("nothing/10x10")
54
- assert_equal [], a.to_a
55
- assert_equal "", a.path
56
- assert_equal [], a.options
57
- end
58
- end
@@ -1,27 +0,0 @@
1
- require 'helper'
2
-
3
- class TestKanokoConfigure < Minitest::Test
4
- def setup
5
- @config = Kanoko::Configure.new
6
- end
7
-
8
- def test_hash_proc_by_default_error
9
- @config.digest_func = nil
10
- @config.secret_key = nil
11
- assert_raises(Kanoko::ConfigureError){ @config.hash_proc.call }
12
-
13
- @config.digest_func = "sha1"
14
- @config.secret_key = nil
15
- assert_raises(Kanoko::ConfigureError){ @config.hash_proc.call }
16
-
17
- @config.digest_func = nil
18
- @config.secret_key = "test"
19
- assert_raises(Kanoko::ConfigureError){ @config.hash_proc.call }
20
- end
21
-
22
- def test_hash_proc_by_default
23
- @config.digest_func = "sha1"
24
- @config.secret_key = "test"
25
- assert_equal "yrYrwA2D_XJwEyaWOr3S8GPWtd8=", @config.hash_proc.call("aaa")
26
- end
27
- end
@@ -1,50 +0,0 @@
1
- require 'helper'
2
-
3
- class TestKanoko < Minitest::Test
4
- def setup
5
- Kanoko.configure.digest_func = "sha1"
6
- Kanoko.configure.secret_key = "test"
7
- end
8
-
9
- def change_hash_proc(hash_proc)
10
- before = Kanoko.configure.hash_proc
11
- Kanoko.configure.hash_proc = hash_proc
12
- yield
13
- Kanoko.configure.hash_proc = before
14
- end
15
-
16
- def test_configure
17
- assert_kind_of Kanoko::Configure, Kanoko.configure
18
- end
19
-
20
- def test_configure_with_block
21
- assert_equal "sha1", Kanoko.configure.digest_func
22
- Kanoko.configure.digest_func = "ok"
23
- assert_equal "ok", Kanoko.configure.digest_func
24
- end
25
-
26
- def test_path_for_with_default_hash_proc
27
- change_hash_proc(proc{ "aaa" }) do
28
- path = Kanoko.path_for(:test_func, "test_args", "test_path")
29
- assert_equal "/aaa/test_func/test_args/test_path", path
30
-
31
- path = Kanoko.path_for(:test_func, "/?-_=!@#<>\\", "/?-_=!@#<>\\")
32
- assert_equal "/aaa/test_func/%2F%3F-_%3D%21%40%23%3C%3E%5C//?-_=!@#<>\\", path
33
-
34
- path = Kanoko.path_for(:test_func, "test_args", :test_func2, "test_args2", "test_path")
35
- assert_equal "/aaa/test_func/test_args/test_func2/test_args2/test_path", path
36
- end
37
- end
38
-
39
- def test_make_hash
40
- change_hash_proc(proc{ "bbb" }) do
41
- assert_equal "bbb", Kanoko.make_hash(:test_func, "test_args", "test_path")
42
- end
43
- end
44
-
45
- def test_make_hash_custom_hash_proc
46
- change_hash_proc(proc{ "ccc" }) do
47
- assert_equal "ccc", Kanoko.make_hash(:test_func, "test_args", "test_path")
48
- end
49
- end
50
- end