kanoko 0.1.3 → 0.2.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 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